VCXZ Posted April 4, 2014 Share Posted April 4, 2014 Всем привет. Пытаюсь создать систему инвентаря, который будет сохраняться после выхода игрока. Сначала думал использовать 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, в котором я совсем не ориентируюсь. Спасибо. Link to comment
TheNormalnij Posted April 4, 2014 Share Posted April 4, 2014 --server local playersByID = {} addEventHnadler( 'onPlayerJoin', root, function() local newPlayerID = #idtableonline + 1 setElementData( source, 'playerBaseID', newPlayerID, false ) playersByID[newPlayerID] = source end ) addEventHandler( 'onPlayerQuit', root, function() local playerID = getElementData( source, 'playerBaseID' ) playersByID[playerID] = nil end ) Для создание системы инвентаря, изучите SQL. Link to comment
VCXZ Posted April 4, 2014 Author Share Posted April 4, 2014 То есть для хранения данных на сервере в любом случае придется использовать базы данных? А возможен ли такой вариант: есть текстовый документ, в котором хранится inventar = { } (со всеми "внутренностями"), который через loadfile подгружается при старте сервера. А потом по новой записывается. Только как таблицу превратить в текст я не знаю. Просто мне очень нравится структура таблиц в lua и поэтому хотел бы использовать их. Link to comment
TheNormalnij Posted April 4, 2014 Share Posted April 4, 2014 Плохой вариант, ибо всё будет подгружаться в память и костыли сохранения. Link to comment
Arisu Posted April 5, 2014 Share Posted April 5, 2014 Для создание системы инвентаря, изучите SQL. Блаблабла, изучите SQL. Блин, серьезно, опять? На этом форуме так любят SQL, что обязательно его изучить и использовать везде, где только можно? Стоп, не надо. Как я уже писал где-то здесь, в мта есть встроенная база данных SQLite, и для хранения инвентарей, привязанных к аккаунту, вполне хватит ее возможностей. При этом язык SQL не нужно знать вообще, так как есть встроенные функции setAccountData и getAccountData, которые делают всю сложную работу за вас. Чтобы сохранить инвентарь (а это, вероятнее всего, отдельная таблица), рекомендую просто сериализовать его и записывать полученную строку в аккаунт. Для загрузки, прочитать из аккаунта и десериализовать. Не надо городить отдельных баз данных для этого, всё уже придумано для вас. Link to comment
VCXZ Posted April 5, 2014 Author Share Posted April 5, 2014 Блаблабла, изучите SQL. Блин, серьезно, опять? На этом форуме так любят SQL, что обязательно его изучить и использовать везде, где только можно? Стоп, не надо. Как я уже писал где-то здесь, в мта есть встроенная база данных SQLite, и для хранения инвентарей, привязанных к аккаунту, вполне хватит ее возможностей. При этом язык SQL не нужно знать вообще, так как есть встроенные функции setAccountData и getAccountData, которые делают всю сложную работу за вас. Чтобы сохранить инвентарь (а это, вероятнее всего, отдельная таблица), рекомендую просто сериализовать его и записывать полученную строку в аккаунт. Для загрузки, прочитать из аккаунта и десериализовать. Не надо городить отдельных баз данных для этого, всё уже придумано для вас. Это тот вариант, что я предполагал в самом начале. (осталось разобраться с (де)сериализацией) Интересно только, почему в elementData можно хранить различные типы данных, а в accountData только строки. Link to comment
CocaColaBear Posted April 5, 2014 Share Posted April 5, 2014 Блаблабла, изучите SQL. Блин, серьезно, опять? На этом форуме так любят SQL, что обязательно его изучить и использовать везде, где только можно? Стоп, не надо. Как я уже писал где-то здесь, в мта есть встроенная база данных SQLite, и для хранения инвентарей, привязанных к аккаунту, вполне хватит ее возможностей. При этом язык SQL не нужно знать вообще, так как есть встроенные функции setAccountData и getAccountData, которые делают всю сложную работу за вас. Чтобы сохранить инвентарь (а это, вероятнее всего, отдельная таблица), рекомендую просто сериализовать его и записывать полученную строку в аккаунт. Для загрузки, прочитать из аккаунта и десериализовать. Не надо городить отдельных баз данных для этого, всё уже придумано для вас. Я точно не помню, но по-моему, setAccountData не работает асинхронно. Следовательно это затрудняет некоторые задачи. Если вы все собираетесь запихнуть в стандартные аккаунты - то мне вас жаль. Стандартные аккаунты скорее подходят для небольших проектов, где хранить необходимо не столь много данных. Для больших проектов - это вообще не вариант, т.к. скорость работы будет очень медленная. Link to comment
TheNormalnij Posted April 5, 2014 Share Posted April 5, 2014 Мне очень жаль вас, Grell. Надеюсь, 255 байт хватит всем. Навыки работы с SQL нужны. По крайней мере, я не представляю, как можно сделать многофункциональную систему авто, без правильной конструкции бд. Link to comment
Arisu Posted April 5, 2014 Share Posted April 5, 2014 Мне очень жаль вас, Grell. Надеюсь, 255 байт хватит всем.Навыки работы с SQL нужны. По крайней мере, я не представляю, как можно сделать многофункциональную систему авто, без правильной конструкции бд. И мне вас жаль. Надеюсь, 85 ГБ памяти должно хватить. Навыки работы с SQL, безусловно, нужны. Но не следует применять их там, где нету на то острой необходимости. Я точно не помню, но по-моему, setAccountData не работает асинхронно. Следовательно это затрудняет некоторые задачи. Если вы все собираетесь запихнуть в стандартные аккаунты - то мне вас жаль. Стандартные аккаунты скорее подходят для небольших проектов, где хранить необходимо не столь много данных. Для больших проектов - это вообще не вариант, т.к. скорость работы будет очень медленная. С этого места поподробней. Вы осведомлены о том, какого масштаба проект делает автор топика? Если нет - то и не делайте заявлений о нецелесообразности того или иного способа. Пускай автор и решает, что ему будет нужнее. Синхронно или нет - я тоже не помню, но вы же не собираетесь дергать ее постоянно. Небольшие одноразовые блокировки можно перетерпеть, а дальше можно держать данные в памяти. Link to comment
Other Languages Moderators Disinterpreter Posted April 5, 2014 Other Languages Moderators Share Posted April 5, 2014 Блаблабла, изучите SQL. Блин, серьезно, опять? На этом форуме так любят SQL, что обязательно его изучить и использовать везде, где только можно? Стоп, не надо. Как я уже писал где-то здесь, в мта есть встроенная база данных SQLite, и для хранения инвентарей, привязанных к аккаунту, вполне хватит ее возможностей. При этом язык SQL не нужно знать вообще, так как есть встроенные функции setAccountData и getAccountData, которые делают всю сложную работу за вас. Чтобы сохранить инвентарь (а это, вероятнее всего, отдельная таблица), рекомендую просто сериализовать его и записывать полученную строку в аккаунт. Для загрузки, прочитать из аккаунта и десериализовать. Не надо городить отдельных баз данных для этого, всё уже придумано для вас. На сколько я помню setAccountData последним аргументом принимает строку, содержащую всего 255 символов. Как вы туда засунете инвентарь? Link to comment
VCXZ Posted April 9, 2014 Author Share Posted April 9, 2014 Снова всем привет. Пробую сделать инвентарь с помощью SQLite. Понял, что для точной синхронизации между таблицей аккаунтов и таблицей инвентаря нужно использовать внешний ключ (foreign key). Скажите пожалуйста, возможно ли использовать его в MTA ? И вообще как определить (кроме пробы вручную ), какие возможности есть, а какие ограничены? Спасибо. Link to comment
TheNormalnij Posted April 9, 2014 Share Posted April 9, 2014 Возможно( может даже подойти accname ) Ну возможности как возможности, ничего особенного. Можно использовать MySQL или SQLite =) Link to comment
Arisu Posted April 10, 2014 Share Posted April 10, 2014 На сколько я помню setAccountData последним аргументом принимает строку, содержащую всего 255 символов. Как вы туда засунете инвентарь? А я на сколько помню, в официальной документации об этом не говорится ничего. https://wiki.multitheftauto.com/wiki/SetAccountData Link to comment
CocaColaBear Posted April 10, 2014 Share Posted April 10, 2014 На сколько я помню setAccountData последним аргументом принимает строку, содержащую всего 255 символов. Как вы туда засунете инвентарь? А я на сколько помню, в официальной документации об этом не говорится ничего. https://wiki.multitheftauto.com/wiki/SetAccountData Походу все таки больше 255, т.к. для хранения даты используется тип TEXT Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now