Честно говоря, я не понимаю боязни использовать цикл при нажатии на клавишу. Если проблема в микро-нагрузке, то страшно представить как бы ты написал систему секундного таймера который обрабатывает игроков, если не брать в счет индивидуальные таймеры.
Ладно когда у тебя несколько сотен тысяч динамических зон...
Или быть может когда игрок встает на пикап, то его ID возвращается каким-то чудесным образом, без цикла?
Последний раз редактировалось punkochel; 07.11.2020 в 18:18.
Pro_Coder (07.11.2020)
В том то прикол, что без цикла ни как.Сообщение от punkochel
Это я ответил execution.
- - - Добавлено - - -
Твой варинт не практичен.
if(gDynamicAreaExtraData[player_dynamic_area_id][area_bussiness_id] != INVALID_BUSINESS_ID)
player_dynamic_area_id не всегда будет равен ID бизнесу.ID бизнеса указан в структуре динамических зон
Можно сделать так, что бы динамические зоны для бизнаса создавать в OnGameModeInit первыми, да бы у них ID был равен бизнесу, т.е. с 1.
Но, за этим нужно следить, потому что, если создать динам. зону перед зоною с бизнесами то, areaid вернет уже не первый ID, а второй.
А, если создать 10 динам. зон перед, то вернем 11 ID.
Последний раз редактировалось Saibot; 08.11.2020 в 02:17.
Покажу пример из моего кода, делал для системы домов
#define TYPE_HOUSE_PICKUP_ENTER 1 // Пикапы входа
#define TYPE_HOUSE_PICKUP_EXIT 2 // Пикапы выхода
// и т.д. для бизнеса и все начиная с 3
Когда создаешь пикап, в данном случае у меня загрузка с БДPHP код:
enum e_Data_House {
h_STP,
h_House
};
PHP код:
data[e_Data_House]
Когда встаешь на пикапPHP код:
House[j][h_PickupID] = CreateDynamicPickup(1272, 23, ...
data[h_STP] = TYPE_HOUSE_PICKUP_ENTER;
data[h_House] = Ид дома;
Streamer_SetArrayData(STREAMER_TYPE_PICKUP, House[j][h_PickupID], E_STREAMER_EXTRA_ID, data);
И естественно удаляем данные перед удалением пикапаPHP код:
public OnPlayerPickUpDynamicPickup(playerid, pickupid)
{
new
data[e_Data_House];
Streamer_GetArrayData(STREAMER_TYPE_PICKUP, pickupid, E_STREAMER_EXTRA_ID, data);
if (data[h_STP] == TYPE_HOUSE_PICKUP_ENTER) {
// data[h_House] - ид дома
return 1;
}
return 1;
}
PHP код:
new
data[e_Data_House];
data[h_STP] = TYPE_HOUSE_PICKUP_ENTER;
data[h_House] = Ид дома;
Streamer_RemoveArrayData(STREAMER_TYPE_PICKUP, House[id][h_PickupID], E_STREAMER_EXTRA_ID, data);
DestroyDynamicPickup(House[id][h_PickupID]);
Последний раз редактировалось Pro_Coder; 07.11.2020 в 19:06.
Помнится я уже создавал тему с подобным вопросом, и Deimos ответил мне, что всяко лучше использовать стандартный подход со связкой цикла for и IsPlayerInRangeOfPoint, так как это создаёт лишь временную нагрузку, в то время как стример каждые N миллисекунд проходится по массиву с Dynamic Area и сверяет их координаты с координатами игрока, что создаёт постоянную нагрузку, даже когда игрок не нажимает левый ALT.
Всяко лучше смотреть при реальном онлайне и сверять нагрузку, не стоит спешить что-то оптимизировать, если в этом нет нужды.
А ты не задавался вопросом о том, как стример определяет то, в какой динамической зоне находится игрок? :)
Не поверишь, но отлавливанием пикапов занимается движок игры. Дальше SAMP перехватывает это событие и игрок отправляет серверу информацию о том, какой пикап он взял. Никаких циклов или дополнительных проверок для сервера в этот момент не происходит.
У тебя есть два варианта: либо оставить вариант с проверкой координат, так как каких-то критических нагрузок это не создаёт и особо переживать тут не о чем, либо можешь сделать вариант, при котором ты в OnPlayerPickUpDynamicPickup запоминаешь ID пикапа, на который встал игрок + время, когда он встал на него, а в OnPlayerKeyStateChange проверяешь, давно ли последний раз игрок вставал на пикап и если недавно - запускаешь цикл и проверяешь, равен ли ID сохранённого в OnPlayerPickUpDynamicPickup пикапа с одним из пикапов бизнесов. Такой цикл будет меньше загружать сервер, но для игроков кнопка, при взятии пикапа, может срабатывать с некоторой задержкой (так что лично я выбрал бы первый вариант).
Всё остальное - это просто сокрытие нагрузки, которая, подчас, будет даже больше, чем от цикла с проверкой координат.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Saibot (10.11.2020)
Понятное дело что цикл, просто мне на порядок лучше работать с зонами, нежели с пикапами, обусловлено это тем, что не нужно изобретать какие-то анти-флуды пикапов, есть возможность работать с зонами в любой точке мода, а не только в колбэке, ну, и конечно, сама динамичность создания различного рода форм и размеров.Сообщение от DeimoS
Не могу конечно утверждать, но интересно, как это движок идентифицирует пикапы, созданные мультиплеером? Ладно бы игроки качали ГТА, в которой уже созданы все пикапы по дефолту, там можно было бы перехватить его ID.Сообщение от DeimoS
Так с нажатием на кнопку тоже не нужно заморачиваться с какими-то анти-флудами. И тоже можно реализовать возможность создания таких пикапов в виде отдельных функций (правда, с учётом количества пикапов в среднестатистическом моде, особого смысла в этом нет, ибо то же самое можно сделать, просто поместив код в функцию и вызывая эту функцию в коллбэке. Это будет даже оптимизированнее).
Точно так же, как движок идентифицирует автомобили, в которые игрок садится, или объекты, которые создаёт сервер, учитывая их коллизию - всё это делается через встроенные в движок функции и SAMP лишь вызывает их, передавая в них данные так же, как ты бы это сделал, если бы, например, написал модификацию для сингла. Ну и так же, как это делает сама игра в сингле.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Про синхронизацию я читал, знаю) Просто никогда не задумывался что движок сам определяет какие-либо значения, созданные из вне.Сообщение от DeimoS
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)