Jump to content

Вопрос по работе ресурсов


Recommended Posts

В серверном ресурсе по требованию игрока в переменную A записывается таблица из MySQL, а затем с ней производятся какие-то операции. 

Если несколько игроков будут использовать этот ресурс одновременно, то переменная А постоянно будет перезаписываться? Как это избежать? (т.е. чтобы для каждого игрока определенная функция на серверном ресурсе выполнялась отдельно и не влияла на других игроков)

Link to comment

Данные можете хранить в таблицах, где ключ = игрок. Либо в элемент дате. 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 by Kenix
Link to comment
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

Вы создаете каждый раз локальную переменную в функции, где она хранит уникальные данные для каждого игрока.
Ничего не будет.
У вас есть один просчет, вы вызываете dbPoll используя аргумент ожидания ( - 1 ), сервер в этот момент ожидает. Используйте каллбэк в функции dbQuery, тогда когда запрос будет получен, то вызовется каллбек функции и потом обрабатывайте его через dbPoll.

Есть примеры, советую вам внимательно прочитать все, чтобы понять как работать с базами в MTA.

UPD:
Вот ещё ссылка, изучите

 

Edited by Kenix
Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...