trickerer / Trinity-Bots

NPCBots for TrinityCore and AzerothCore 3.3.5
https://github.com/trickerer/TrinityCore-3.3.5-with-NPCBots/
472 stars 156 forks source link

[AC] [Question] [Core] Question about bot rental timer / Вопрос по таймеру аренды ботов #868

Closed Bogir closed 4 weeks ago

Bogir commented 2 months ago

DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

Description

в bot_ai::GlobalUpdate есть 2 проверки:

if (IAmFree())        - если я свободен
{
    if (npcBotData->owner != 0)       - если я не свободен
       CheckOwnerExpiry(); 
   ...
}

Не могу понять логику IAmFree(). Логично предположить по коду, что бот свободен. Но тут же проверка есть ли у свободного бота хозяин, чего быть не может. Или я неправильно понимаю логику IAmFree() ?

Просто таймер не срабатывает. Просто не попадаем в CheckOwnerExpiry(); По дебагу таймер, заданный в конфиге, считает интервал гораздо быстрее. Там, возможно, не секунды нужно указывать, а миллисекунды?

https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/blob/ee76ff6128b56559cf5ff519ff69ee3190dc2178/src/server/game/AI/NpcBots/bot_ai.cpp#L17303

TrinityCore or AzerothCore

AzerothCore

Core rev. hash/commit

No response

Operating system

No response

Bogir commented 2 months ago

Может, Вы какой-то канал в Дискорде заведёте для таких вопросов? Им не место тут)

trickerer commented 2 months ago

Может, Вы какой-то канал в Дискорде заведёте для таких вопросов? Им не место тут)

Своего сервера не имею ибо на это нет времени, а так меня можно найти на серверах Wor Repacks Community и Wow Modding Community. Если нужны ссылки напишу отдельно.

Условия в приведённом куске кода разные, очевидно и проверяют они разное.

Из конфига: NPCBot ownership may only expire after player goes offline Это и есть проверка что у бота есть владелец, но он оффлайн. Что касается самого таймера, то его длительность выбирается, конечно, не оптимально - проверка хотя бы раз в час, лучше тогда я ничего не придумал.

Таймер в конфиге указывается в секундах. Возможно возникла путаница из-за _checkOwnershipTimer - так вот это другой таймер, время владения ботом проверяется только внутри CheckOwnerExpiry()

Bogir commented 2 months ago

Ситуация патовая. NpcBot.OwnershipExpireMode = 1 - timer never resets NpcBot.OwnershipExpireTime = 60 -Time (in seconds)

Нанял бота. Время прошло, бот не освобождается Бот исчез только когда я перезашел в игру

upd: если перезаходить в течение установленного времени OwnershipExpireTime, бот появляется снова. Перезашел через 70 сек - бот уже не появился.

Если в конфиге поменять режим 1 на 0 NpcBot.OwnershipExpireMode = 0 то таймер начинает считать время, проведенное в оффлайне, как и задумано. Если оставаться в оффлайне дольше заданного интервала - бот исчезает.

trickerer commented 1 month ago

Ситуация патовая. NpcBot.OwnershipExpireMode = 1 - timer never resets NpcBot.OwnershipExpireTime = 60 -Time (in seconds)

Нанял бота. Время прошло, бот не освобождается Бот исчез только когда я перезашел в игру

upd: если перезаходить в течение установленного времени OwnershipExpireTime, бот появляется снова. Перезашел через 70 сек - бот уже не появился.

Если в конфиге поменять режим 1 на 0 NpcBot.OwnershipExpireMode = 0 то таймер начинает считать время, проведенное в оффлайне, как и задумано. Если оставаться в оффлайне дольше заданного интервала - бот исчезает.

Так и должно быть. В режиме 1, если игрок успеет перезайти до того как таймер выйдет, бот останется при нём. Владение ботом может быть окончено только после логаута. Например: таймер 1 минута - если выйти из игры через 55 секунд, то через 5 секунд бот освободится

P.S. похоже в вычислении таймера межде проверками есть мелкая ошибка (таймер почти всегда минимален) но это на вышеописанный алгоритм не влияет

trickerer commented 1 month ago

https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/commit/e58d6a2eb28b51fa45ed531a3b0e53a1768e9f4a