Квестовые методы в ПТС ИИ

Aristo

Бессмертный
Проверенный
Победитель в номинации 2023
Сообщения
707
Розыгрыши
0
Решения
11
Репутация
670
Реакции
833
Баллы
1 658
Хроники
  1. Chaotic Throne: High Five
Сборка
Свое, на базе L2GW
Всем привет.
Сначала суть:
Сборка Java.
Портировал я как-то давно себе ПТС ИИ. Код перенесен на JAVA структурно без изменений из декомпила ХФ ai.obj
Сейчас провожу у себя ЗБТ и столкнулся с некоторой проблемой.
У корейцев, есть два основных вида проверки и переключения статуса квеста. Буду писать псевдокодом, чтобы было более понятно, в чем суть проблемы.
Пример: Для переключения квеста с 1 на 2 этап, нужно 10 итемов с ИД 9999. В рюкзаке 9 итемов, убиваем моба. У моба обработчик:
Вариант кода 1.
Код:
if (getItemCount(9999) == 9){
   giveItem(9999, 1);
   changeQuestState(2);
}
1679788928506.png
Вариант кода 2.
Код:
giveItem(9999, 1);
if(getItemCount(9999) >= 9){
  changeQuestState(2);
}
1679788882455.png
Оба варианта встречаются в ИИ примерно поровну. Первый вариант чаще в новых ИИ, от ГФ и выше, а второй преимущественно в старых.
Методы в коде вызываются одинаковые. Скорее всего, во втором варианте заложена задержка на передачу инфы туда обратно между NpcServer и Server,
но из-за этого, если я у себя на яве, обрабатываю вызов giveItem в том же потоке, то получаю ситуацию, когда у меня моб закрывает квест на 9 итемах, т.к условие выполняется. Если я выношу обработчик giveItem в отдельный поток, то иногда возникают ситуации, когда мобы выдают лишние итемы, т.е у чара получается 11/10 итемов, а т.к в тех же скриптах проверки в условиях по большей части не >=, а ==, то такие квесты не получится сдать.
Кто-то сталкивался с подобным? Править скрипты очень не хочу, т.к с датапаком ПТС работаю нативно и очень бы не хотелось его править.
Есть идеи, как это можно обойти?
 
Решение
это L2NPC.
похоже, что это Queue атомарных исполняемых операций, которая связана с CScriptEngine, которая затем вызывает функцию Process, которая выполняет операции в Queue.
Из-за того, что GiveItem должен запускаться таском RunNpcScript -> Process, он будет (почти?) всегда запускаться после OwnItemCount.

Назад
Сверху Снизу