Jump to content

VCXZ

Members
  • Posts

    42
  • Joined

  • Last visited

Posts posted by VCXZ

  1. Еще побродив по интернету, пришел к выводу, что правильнее всего важные действия сразу отображать в БД, а мелкие раз в какое-то время. (думаю, к мелким можно отнести допустим количество патронов у игрока или количество бензина в машине)

  2. Всем привет :)

    Читал, что грамотнее всего подключаться к базе данных при старте ресурса, а отключаться при стопе, а не многократно подключаться/отключаться во время игры.

    Допустим, при старте ресурса мы подключаемся к БД. При заходе игрока на сервер, мы берем из БД его данные и ставим ему через setElementData. А при его выходе с сервера, обновляем данные в БД.

    Подскажите пожалуйста, будет ли безошибочно работать такой вариант:

    1. При "внезапном" отключении игрока в связи с, например, проблемами с его подключением к интернету?

    2. При не менее внезапном отключении сервера.

    Заранее большое спасибо за помощь.

  3. Снова всем привет.

    Пробую сделать инвентарь с помощью SQLite. Понял, что для точной синхронизации между таблицей аккаунтов и таблицей инвентаря нужно использовать внешний ключ (foreign key).

    Скажите пожалуйста, возможно ли использовать его в MTA ? И вообще как определить (кроме пробы вручную :) ), какие возможности есть, а какие ограничены?

    Спасибо.

  4. Не правильно. Нужно запретить изменение даты на клиенте, тогда уже делать такие триггеры. Но, если верить тому, что мне расказывали, есть особые нечестные игроки, которые могут на клиенте любой код выполнять. А если у тебя еще и скрипты буудут для всех глаз - триггернут твой ивент и ничем ты не защитишся.

    P.S. В "небезопасном" клиенте у тебя функция ?

    Спасибо.

    Ну да, функция :)

    Вот тут подробно описано, как защитить себя

    Спасибо.

    Мне кажется, ссылку на эту страницу нужно добавить на главную https://wiki.multitheftauto.com/wiki/Main_Page

    или сюда https://wiki.multitheftauto.com/wiki/Sc ... troduction

  5. Всем привет.

    Не раз на форуме видел сообщения, что нельзя разрешать изменение elementData на клиенте, т.к. в противном случае нечестные игроки будут изменять себе все данные.

    Скажите пожалуйста, я правильно понимаю, что это небезопасно:

    --client 
    function ff (data, value) 
        setElementData (localPlayer, data, value) 
    end 
    

    а это безопасно:

    --server 
    addEvent ('changeDataFromClient', true) 
    function funcchangeDataFromClient (data, value) 
        setElementData (client, data, value) 
    end 
    addEventHandler ('changeDataFromClient', root, funcchangeDataFromClient) 
      
    --client 
    function ff (data, value) 
        triggerServerEvent ('changeDataFromClient', localPlayer, data, value) 
    end 
    

    Заранее спасибо за помощь.

  6. Блаблабла, изучите SQL.

    Блин, серьезно, опять? На этом форуме так любят SQL, что обязательно его изучить и использовать везде, где только можно?

    Стоп, не надо. Как я уже писал где-то здесь, в мта есть встроенная база данных SQLite, и для хранения инвентарей, привязанных к аккаунту, вполне хватит ее возможностей. При этом язык SQL не нужно знать вообще, так как есть встроенные функции setAccountData и getAccountData, которые делают всю сложную работу за вас.

    Чтобы сохранить инвентарь (а это, вероятнее всего, отдельная таблица), рекомендую просто сериализовать его и записывать полученную строку в аккаунт. Для загрузки, прочитать из аккаунта и десериализовать. Не надо городить отдельных баз данных для этого, всё уже придумано для вас.

    Это тот вариант, что я предполагал в самом начале. :) (осталось разобраться с (де)сериализацией)

    Интересно только, почему в elementData можно хранить различные типы данных, а в accountData только строки.

  7. То есть для хранения данных на сервере в любом случае придется использовать базы данных?

    А возможен ли такой вариант: есть текстовый документ, в котором хранится inventar = { } (со всеми "внутренностями"), который через loadfile подгружается при старте сервера. А потом по новой записывается. Только как таблицу превратить в текст я не знаю.

    Просто мне очень нравится структура таблиц в lua и поэтому хотел бы использовать их.

  8. Всем привет.

    Пытаюсь создать систему инвентаря, который будет сохраняться после выхода игрока.

    Сначала думал использовать accountData. Но меня смущает, что в значениях можно хранить только строки (конечно, строки можно преобразовывать после получения, но это наверное лишняя морока, учитывая, что нужно хранить абсолютно различные данные)

    Далее отложил этот вопрос и как раз легко и просто сделал некую "систему id", используя таблицы, которая работает следующим образом(может кому пригодится, хотя за правильность ее работы не отвечаю):

    есть таблица idtableonline = { }

    при старте ресурса она заполняется следующим образом:

      
    function idtableonlineresourceStart () 
        for i = 1, 4002, 1 do 
            idtableonline[i] = false 
        end 
    end 
    addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), idtableonlineresourceStart) 
      
    

    Когда игрок логинится, проверяем по этой таблице "свободный id".

      
    for i = 1, 4002, 1 do 
        if idtableonline[i] == false then 
            setElementData (client, 'idonline', i) 
            idtableonline[i] = client 
            break 
        end 
    end 
      
    

    Когда игрок выходит, удаляем его из таблицы idtableonline.

      
    function idtableonlineOnPlayerQuit ()  
        local id = getElementData (source, 'idonline') 
        if idtableonline[id] ~= false then idtableonline[id] = false end 
    end 
    addEventHandler ('onPlayerQuit', root, idtableonlineOnPlayerQuit) 
      
    

    Это все вроде бы работает, и я подумал, почему бы не сделать на сервере одну огромную таблицу, в которой будет храниться инвентарь всех игроков. Принцип ее работы я предполагаю сделать примерно таким же, как и в примере выше, но без удаления данных при выходе игрока с сервера.

    Но я не знаю, как сделать, чтобы данные этой таблицы сохранялись при перезапуске сервера.

    Подскажите пожалуйста, как хранить таблицы на сервере и вообще разумный ли это вариант (в том числе в плане нагрузки на сервер), или нужно использовать accountData или вообще MySQL, в котором я совсем не ориентируюсь.

    Спасибо.

  9. Почему это не работает? Пишет, что massa это таблица. (выполняется на сервере)

      
    function giveGruz (player) 
        setElementData (player, "gruz", {[1] = 100, [2] = 50}) 
        local t = getElementData (player, "gruz") 
        for i, massa in pairs{ t } do  
        outputChatBox( i..' '..massa, player ) 
        end 
    end 
    addCommandHandler ('gg', giveGruz) 
      
    

  10. Возможно ли изменить максимальное количество пассажиров для транспорта? Узнать можно (getVehicleMaxPassengers) изменить не знаю как. В интернете есть пара упоминаний про setVehicleMaxPassengers, но сейчас этой функции нет.

  11. Всем привет.

    Пытаюсь сделать на сервере неровности на дороге, нашел, на мой взгляд, подходящие объекты, добавил, но машина/игрок проходят сквозь них. Вроде бы как, проблема в отсутствии коллизии (не совсем пока понимаю, что к чему). Как можно сделать эти объекты осязаемыми? Пример интересующего объекта: id 854 (CJ_urb_rub_3b)

  12. Ребят, не совсем по теме. Наткнулся на видео

    (гта сан андреас с графикой и физикой как в гта 4, или наоборот, гта 4 с картой и объектами как в gta SA).

    Представьте какой крутой был бы мультиплеер. Вот только какие нужны компы :)

  13. Ну так тем же превращением с помощью loadstring , только вместо обьявления функции делай что-то такое

    'varToServer = '..nameVar и потом уже varToServer отправляй на сервере.

    Да, получилось! Спасибо!

    Боюсь представить, что будет с вашим сервером когда клиентскую часть взломают.. Особенно с использованием loadstring, можно будет сделать не хитрую инъекцию и выполнить произвольный код, что даст полный доступ к серверу (можно будет выдать себе админку, скачать серверные скрипты и потом удалить их с сервера.. перечислять можно бесконечно)

    Спасибо за предупреждение, обязательно учту это в дальнейшем!

    Благодарю всех за помощь! :)

  14. Блин, ребят, что-то я совсем запутался :)

    Я и так, и сяк пытался применить ваши варианты - у меня ничего не выходит.

    Может быть я неправильно задал вопрос.

    Я в клиентской части пытаюсь создать функцию, которая будет принимать с сервера на клиент нужные значения переменных.

    То есть в аргумент этой функции мы передаем нужное название серверной переменной(переменных), она "находит" их в серверной части и передает в клиентскую.

    Потому я и спрашивал, как из "abv" сделать просто abv, в примере Elengar строка превращается в функцию, не получается "найти" нужное значение на сервере. Или я чересчур криворук.

  15. Существует ли какая-то функция, которая сделает из строки "abvgd" просто abvgd без кавычек? (мне это нужно для того, чтобы не создавать 100 функций для приема в клиентскую часть каждого значения с серверной части, а создать одну f(...), но чтобы передать через такую функцию название нужной переменной, его нужно передать строкой)

    Во, нашел то, что нужно (только в PHP :mrgreen: )

    Иногда бывает удобно иметь переменными имена переменных. То есть, имя переменной, которое может быть определено и изменено динамически. Обычная переменная определяется примерно таким выражением:

    <?php

    $a = 'hello';

    ?>

    Переменная переменной берет значение переменной и рассматривает его как имя переменной. В вышеприведенном примере hello может быть использовано как имя переменной при помощи двух знаков доллара. То есть:

    <?php

    $$a = 'world';

    ?>

    Теперь в дереве символов PHP определены и содержатся две переменные: $a, содержащая "hello", и $hello, содержащая "world".

  16. Я находил готовый скрипт поворотников, он работает вполне хорошо, правда на некоторых машинах кривовато стоит, но это мелочи. Проблема в том, что он работает на клиентской стороне, то есть наверное другим игрокам не будет видно. Хотя я точно не знаю.

  17. Спасибо ребят!!

    У меня получилось, и знаете, я сразу сделал все правильно за исключением одной нубской ошибки: я когда принимал на клиенте переменную, еще и в eventhandler в аргумент эту переменную включал. Ну как бы "чтоб цепочка не потерялась" :mrgreen:

  18. Всё никак не получается в клиенте использовать серверное значение. Финальный мой вариант был такой: в клиенте ставим triggerServerEvent; в сервере из функции, обрабатывающей этот event ставим triggerClientEvent, передавая в аргументе нужное значение, но дальше, как его принять, я не понимаю.

    И примера похожего найти не могу. Не могли бы вы помочь?(что и за чем нужно делать)

    Заранее большое спасибо.

  19. Блин, что-то вообще туплю..

    Как в строковую переменную уместить и текст и числовую переменную, то есть:

    если BB = 80, то AA должно быть "текст 80"

    Что за BB и AA ? Переменные ?

    AA = 'текст'

    BB = 80 ?

    Тогда просто AA = AA..' '..BB и будет у тебя AA "текст 80"

    Да, переменные. Благодарю, Elengar.

    Подскажите еще пожалуйста, "насколько глобальны" переменные (таблицы в том числе)? Просто сейчас на клиентской стороне пытаюсь использовать данные из глобальной таблицы, созданной на серверной стороне, и не получается. А trigger вроде не для этого создан. Не совсем понимаю, что делать в данном случае.

  20. Memory, блин, это просто супер круто!! Спасибо огромное! Действительно работает: пробовал взорваться гранатой, прыгать с крыш, тонуть в воде!

    Kernell, а что, было бы довольно неплохо :)

    его код сработает.

    Попробовал на всякий случай, потонул :)

    Кстати, на счет кода Memory, я въехал в заправку на машине, всё-таки умер. Но думаю можно сделать так, чтобы в таком случае игрок появлялся рядом с машиной с 1 хп, используя onClientVehicleDamage, немного позже обязательно займусь этим.

×
×
  • Create New...