CharlySHOMAN Posted June 11, 2017 Share Posted June 11, 2017 В серверном ресурсе по требованию игрока в переменную A записывается таблица из MySQL, а затем с ней производятся какие-то операции. Если несколько игроков будут использовать этот ресурс одновременно, то переменная А постоянно будет перезаписываться? Как это избежать? (т.е. чтобы для каждого игрока определенная функция на серверном ресурсе выполнялась отдельно и не влияла на других игроков) Link to comment
Kenix Posted June 11, 2017 Share Posted June 11, 2017 (edited) Данные можете хранить в таблицах, где ключ = игрок. Либо в элемент дате. set/getElementData. (Но только без функций) После выхода из сервера не забудьте обнулять таблицу. Пример псевдо-кода: -- Таблица данных g_pPlayersData = {}; function Add( pPlayer ) -- Функция содержащая что-то. local function vFunction() return math.random( 1, 100 ); end; -- Добавляем в таблицу по индексу ключ = игрок, значение = функция. g_pPlayersData[ pPlayer ] = vFunction; end function Call( pPlayer ) -- Получаем из таблицы функцию. local vFunction = g_pPlayersData[ pPlayer ]; -- Вызываем её. Выведет число в рандоме от 1 до 100. outputDebugString( vFunction() ); end -- Добавляем при вводе команды. addCommandHandler( "test_add", function( pPlayer ) Add( pPlayer ); end ); -- Вызываем при вводе команды. addCommandHandler( "test_call", function( pPlayer ) Call( pPlayer ); end ); addEventHandler( "onPlayerQuit", root, function() -- Удаляем при выходе из сервера. g_pPlayersData[ source ] = nil; end ); По данному примеру вы можете добавлять что угодно таблицы/числа/строки/.... Вообщем не совсем понятно о чем идет речь, что вы конкретно хотите сделать? Edited June 11, 2017 by Kenix Link to comment
CharlySHOMAN Posted June 12, 2017 Author Share Posted June 12, 2017 15 hours ago, Kenix said: Вообщем не совсем понятно о чем идет речь, что вы конкретно хотите сделать? 1 часть кода: local query = dbQuery(sql, "SELECT `column` FROM `table`") local result, code, mess = dbPoll(query, -1) 2 часть кода: for key1, value1 in pairs (result) do for key2, value2 in pairs (value1) do outputChatBox(value2, player) end end И вот я думаю, если 2 игрока заставят выполняться этот код одновременно, не получится ли ошибки? Ну, типо, сервер выполнил 1-ю часть кода, и перед тем как приступить ко 2-й части кода, сервер снова выполнит 1-ю часть (по требованию уже другого игрока). Надеюсь понятно объяснил. Я кстати исправил код в соответствии с твоими рекомендациями, работает как и прежний. Так наверное правильней. 1 часть кода: local query = {} local result = {} query [player] = dbQuery(sql, "SELECT `column` FROM `table`") result [player], code, mess = dbPoll(query [player], -1) 2 часть кода: for key1, value1 in pairs (result [player]) do for key2, value2 in pairs (value1) do outputChatBox(value2, player) end end Link to comment
Kenix Posted June 12, 2017 Share Posted June 12, 2017 (edited) Вы создаете каждый раз локальную переменную в функции, где она хранит уникальные данные для каждого игрока. Ничего не будет. У вас есть один просчет, вы вызываете dbPoll используя аргумент ожидания ( - 1 ), сервер в этот момент ожидает. Используйте каллбэк в функции dbQuery, тогда когда запрос будет получен, то вызовется каллбек функции и потом обрабатывайте его через dbPoll. Есть примеры, советую вам внимательно прочитать все, чтобы понять как работать с базами в MTA. UPD: Вот ещё ссылка, изучите Edited June 12, 2017 by Kenix Link to comment
CharlySHOMAN Posted June 12, 2017 Author Share Posted June 12, 2017 1 hour ago, Kenix said: Вы создаете каждый раз локальную переменную в функции, где она хранит уникальные данные для каждого игрока. Ооо, большое спасибо) 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