PDA

Просмотр полной версии : [Вопрос] Что лучше для обработки актёров: один глобальный таймер или индивидуальные?



Сергей
19.08.2019, 22:25
Доброго времени суток, хочу узнать, как лучше всего сделать таймер для каждого NPC на сервере.
У меня есть 1 очень интересная мысль, и для этого мне нужен таймер, только вот какой, 1 глобальный, или для каждого NPC свой..

Сергей
24.08.2019, 18:50
Подыму

DeimoS
24.08.2019, 19:28
Опиши хотя бы вкратце свою интересную мысль и тогда станет понятно какой в твоей ситуации таймер будет лучше.

Сергей
24.08.2019, 19:43
Опиши хотя бы вкратце свою интересную мысль и тогда станет понятно какой в твоей ситуации таймер будет лучше.

Если быть точным, я хочу дать боту мысли, допустим 1 раз в 50 секунд, он должен показывать мысль, или выполнять какую-то анимацию

И ещё такой вопрос, не будет ли тут лишним использование: Streamer_SetIntData

Ибо я его использую в команде, допустим /setbottext id_bot text


Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, Actor3DtextId[Actor_Serv[bot_id]] , E_STREAMER_WORLD_ID, GetDynamicActorVirtualWorld(Actor_Serv[bot_id]));

DeimoS
24.08.2019, 19:50
Если мысли будут появляться всегда и у всех ботов сразу - можно один таймер на всех.
Если в определённое время у нескольких ботов сразу, а все остальные просто должны стоять - один таймер + foreach или индивидуальные таймеры.
А если может быть так, что из всех ботов нужно показать только для одного мысли - индивидуальный таймер.
Хотя, на самом деле, если в таймере будет простецкий код, то особой разницы не будет тут.

Касаемо Streamer_SetIntData не совсем понял. Что именно ты тут делаешь и почему использование функции может быть вдруг лишней?

Сергей
24.08.2019, 20:09
Если мысли будут появляться всегда и у всех ботов сразу - можно один таймер на всех.
Если в определённое время у нескольких ботов сразу, а все остальные просто должны стоять - один таймер + foreach или индивидуальные таймеры.
А если может быть так, что из всех ботов нужно показать только для одного мысли - индивидуальный таймер.
Хотя, на самом деле, если в таймере будет простецкий код, то особой разницы не будет тут.

Касаемо Streamer_SetIntData не совсем понял. Что именно ты тут делаешь и почему использование функции может быть вдруг лишней?

Вообщем, планирую некоторых одарить мыслями, других и мыслями и действиями, теперь вопрос третий, лучше через стример делать Npc или стандартно?

- - - Добавлено - - -

Попробовал сделать функцию для создания ботов, но, она работает криво, кривость в том, что неправильно указывается
ActorID
Т.е допустим использую:


Actor_Serv[0] = CreateDynamicActor_Server(150, -1424.1647,-1125.9562,1521.9900,91.6332, 0, 100.0, 10, 1);

На конце bot_id выдается вообще неправильно... проблема в том, что если использовать таймер, bot_id оказывается неверным
т.е, в таймере я намерен использовать то что я хочу сделать, допустим дать боту мысль, по итогу чтобы применить к указанному боту, а именно Id: 0, у меня ничего не получится... ибо всё перепутано


stock CreateDynamicActor_Server(model, Float:x,Float:y, Float:z, Float:a,invulnerable = 1, Float:health = 100.0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_ACTOR_SD, areaid = -1, priority = 0)
{
new id_actor = CreateDynamicActor(model, x,y,z,a,invulnerable,health, worldid, interiorid, playerid,streamdistance, areaid, priority);
if(id_actor != INVALID_ACTOR_ID)
{
// создать 3дтекст для разговора
Actor3DtextId[id_actor] = CreateDynamic3DTextLabel("-",COLOR_ALOGIN,x,y,z+ACTOR_CHAT_TEXT_OFFSET_HEIGHT,5.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1, worldid, interiorid, -1, 10.0);
Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, Actor3DtextId[id_actor] , E_STREAMER_WORLD_ID, MAX_ACTORS);
}
return id_actor;
}

DeimoS
24.08.2019, 21:26
1) Что за bot_id?
2) Что ты пытаешься сделать вот этим:

Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, Actor3DtextId[id_actor] , E_STREAMER_WORLD_ID, MAX_ACTORS);

Сергей
24.08.2019, 21:31
Покопавшись, переделал функцию:



stock CreateDynamicActor_Server(id_actor,model, Float:x,Float:y, Float:z, Float:a,invulnerable = 1, Float:health = 100.0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_ACTOR_SD, areaid = -1, priority = 0)
{
new bot_id = CreateDynamicActor(model, x,y,z,a,invulnerable,health, worldid, interiorid, playerid,streamdistance, areaid, priority);
if(bot_id != INVALID_ACTOR_ID)
{
Actor3DtextId[bot_id] = CreateDynamic3DTextLabel("-",COLOR_ALOGIN,x,y,z+ACTOR_CHAT_TEXT_OFFSET_HEIGHT,5.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1, worldid, interiorid, -1, 10.0);
ActorFirstPos[bot_id][0] = x;
ActorFirstPos[bot_id][1] = y;
ActorFirstPos[bot_id][2] = z;
ActorFirstPos[bot_id][3] = a;
new control_summ = random(123123)+random(123);
if(Actor_Timer[id_actor] == 0)
{
Actor_Timer[id_actor] = SetTimerEx("OnActorTimer", 2000, true, "dd",id_actor,control_summ);
Actor_ControlSumm[id_actor] = control_summ;
}
}
return bot_id;
}
В итоге таймер не реагирует на NPC с идом 0, через принт показывает, что таймер для этого ида npc есть, а вот реакции не поступает

По поводу
Streamer_SetIntData, я и спросил, она будет лишней, или нет...
Заменить 3d text в виртуальном мире хотел, в котором находиться бот, не стоит этого делать?

DeimoS
24.08.2019, 22:07
Использовать Streamer_SetIntData прямо после создания 3d-текста - странно, ибо виртуальный мир можно задать и в CreateDynamic3dText.

И почему с одними переменными ты работаешь через "bot_id", а с другими через "id_actor"?

Сергей
24.08.2019, 22:11
Использовать Streamer_SetIntData прямо после создания 3d-текста - странно, ибо виртуальный мир можно задать и в CreateDynamic3dText.

И почему с одними переменными ты работаешь через "bot_id", а с другими через "id_actor"?

Сейчас я пользуюсь логикой, создаю бота, и работаю с конкретным его ид т.е допустим Actor_Serv[17], создаю для него таймер, и там уже дальше продолжаю делать различные вещи

- Вопрос, как же по другому это всё реализовать? Есть ли конкретные предложения по поводу этого всего?

DeimoS
24.08.2019, 22:45
Ты не понял. В одних массивах ты записываешь данные в ячейки, равные bot_id, а в других - в id_actor. Из-за этого, скорее всего, и путаница.

И что за контрольная сумма? Зачем?

Сергей
24.08.2019, 22:55
Если не совпадает, удаляем бота, такая мини проверка можно её назвать

DeimoS
24.08.2019, 23:16
Если не совпадает, удаляем бота, такая мини проверка можно её назвать

Так а зачем она? В какой ситуации может случиться так, что она вдруг перестанет совпадать? Игрок взломает память сервера и подменит ID бота, который ты передал в таймер?

Сергей
24.08.2019, 23:18
Так а зачем она? В какой ситуации может случиться так, что она вдруг перестанет совпадать? Игрок взломает память сервера и подменит ID бота, который ты передал в таймер?

Хорошо, от проверки можно избавиться в любой момент, что делать с остальным?

DeimoS
24.08.2019, 23:54
Хорошо, от проверки можно избавиться в любой момент, что делать с остальным?

Так я уже написал

Ты не понял. В одних массивах ты записываешь данные в ячейки, равные bot_id, а в других - в id_actor. Из-за этого, скорее всего, и путаница.

Ты координаты и прочее записываешь в ячейку, равную ID актёра, а в таймер передаёшь один из параметров твоей функции, который, вероятнее всего, содержит число, не равное ID актёра. Отсюда и путаница.
Убери "id_actor", заменив его на "bot_id" в таймере/массивах.

Сергей
25.08.2019, 12:29
Кр4, вообще теперь всё переделал, записал всё в массив а не в переменные, и получилось именно так как я хочу, только в 10 раз проще чем было до этого. Тему можно закрывать. И желательно переименовать. Спасибо.