"Next action" для скиллов.

Теги:
 
+
-
edit
 

Balancer

администратор
★★★★★
Charge:

Первое что бросается в глаза при переходе с офф на L2J это отсутствие "Next action". Те кто хоть не много играл на офф меня поймут, а для остальных - как это должно выглядеть: игрок должен иметь возможность определить действия его персонажа на шаг вперёд и персонаж должен перейти к выполнению этого действия по окончании текущего. Хатя это пожалуй касается всех НПСей, а то ведь грустно наблюдать как монстряжки после сбития им каста тупо стоят и ждут пока оттикает время, которое должно было на каст затратиться :( А так бы следующим действием у них было к примеру "Attack target".


// Error: Not Found – L2J Fortress




Самое смешное, что эту возможность я уже вводил прошлой весной :) Но потом где-то при введение нынешнего механизма обработки событий опять потеряли. Этот механизм лучше целиком переделать.

В общем, предстоит снова делать...
 
+
-
edit
 

yobzhik

новичок
Эммм... поидее эти действия забитые в скриптах непосредственно (покрайней мере так на офф).
Попросту стоит в конце скрипта строка - некст экшен...
Думаю такое несложно сделать...
Я попробую.
 

Murkt

Pythoneer

yobzhik
Нет, имеется в виду, что если ты нажал на каст Might, и во время его каста наал на каст Shield, то на оффе он у тебя скастанётся, а на Л2ж - нет.

Попробую сделать - если найду, где идут все эти вызывания...

А те next action непосредственно в описании - это другое.
[team Їжачки - сумні падлюки]  

Murkt

Pythoneer

Что-то я нигде не могу найти проверку на то, выполняется ли какой-то скилл в данный момент... В смысле, найти-то я нашёл, и не одно место, но только это всё не то вроде :(
[team Їжачки - сумні падлюки]  

Murkt

Pythoneer

Я так понимаю, оно должно чекаться функцией isCastingNow()? Тогда должно быть в L2Character, но я тогда не пойму где - а там буквально три или четыре места использования.

Или другой какой функцией? Но вроде на все action игра забивает и начинает кастовать...

now playing: Rammstein - Te Quiero Puta! рулёз :)
[team Їжачки - сумні падлюки]  
+
-
edit
 

Balancer

администратор
★★★★★
Murkt:
Что-то я нигде не могу найти проверку на то, выполняется ли какой-то скилл в данный момент... В смысле, найти-то я нашёл, и не одно место, но только это всё не то вроде :(
 


Смотри в сторону isAllSkillsDisabled() и isSkillDisabled(int skillId)

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

Murkt

Pythoneer

О, спасибо :)

Я почему-то думал, что IsAllSkillsDisabled() показывает, отключены ли ВСЕ скилы на сервере :)

PS можно перекидывать тему в "Назначенные задания" ;)
PPS ты прописал мне доступ в SVN, А то пытался с утреца - не получилось, может у меня просто руки кривые? :)
[team Їжачки - сумні падлюки]  
+
-
edit
 

Balancer

администратор
★★★★★
>PS можно перекидывать тему в "Назначенные задания" ;)

Переношу

>PPS ты прописал мне доступ в SVN, А то пытался с утреца - не получилось, может у меня просто руки кривые? :)

А я просто ЛС не видел :) Прописал.
 
+
-
edit
 

Balancer

администратор
★★★★★
Если полезно, кстати, то в моей весенней сборке это было так реализовано (L2Character.java):

code java
  1.         protected L2Skill _nextSkill = null;
  2.     private boolean _nextSkillCtrlPressed;
  3.     private boolean _nextSkillShiftPressed;
  4.  
  5.         public void setNextSkill(L2Skill skill, boolean ctrlPressed, boolean shiftPressed)
  6.         {
  7.                 _nextSkill = skill;
  8.                 _nextSkillCtrlPressed  = ctrlPressed;
  9.                 _nextSkillShiftPressed = shiftPressed;
  10.         }
  11.  
  12.  
  13.         public boolean shiftNextSkill()
  14.         {
  15.             if(_nextSkill == null)
  16.                 return false;
  17.  
  18.                 _skill = _nextSkill;
  19.                 _skillCtrlPressed  = _nextSkillCtrlPressed;
  20.                 _skillShiftPressed = _nextSkillShiftPressed;
  21.  
  22.                 _nextSkill = null;
  23.         return true;
  24.         }
  25.  
  26.         public void useMagic(L2Skill skill, boolean ctrlPressed, boolean shiftPressed)
  27.         {
  28.  
  29. // ...
  30.  
  31.                 if (isDisabledAllSkills() || isSkillDisabled(skill.getId()))
  32.                 {
  33.                         setNextSkill(skill, ctrlPressed, shiftPressed);
  34.                         return;
  35.                 }
  36.  
  37. // ...
  38. // ...
  39.  
  40.         public void onMagicUseTimer(L2Object[] targets, L2Skill skill) throws IOException
  41.         {
  42. // ...
  43.                 if(getCurrentState() == STATE_CASTING)
  44.                 {
  45.                     if(!shiftNextSkill())
  46.                     {
  47.                                 setCurrentState(STATE_IDLE);
  48.                     _log.fine("Set STATE_IDLE");
  49.                         }
  50.                         else
  51.                         {
  52.                     _log.fine("Set shift. Skill");
  53.                                 useMagic(_skill, _skillCtrlPressed, _skillShiftPressed);
  54.                         }
  55.                 }


Сейчас весь файл аттачем приложу.
 
+
-
edit
 

Balancer

администратор
★★★★★
Сейчас, конечно, интерфейс очень многих вызовов изменился, но мало ли, пригодится :)
 
+
-
edit
 

Balancer

администратор
★★★★★
А, да, ну и алгоритм на словах (посмотрел, вспомнил).

При вызове useMagic не сразу вываливаемся, если использование магии запрещено, а запоминаем параметры скилла.

Когда же скилл сработал и происходит разрешение работы новых скиллов, то проверяем "заначку". Если есть запомненный скилл - активируем его вызов. Тут нужно быть осторожнее, т.к. нужно посмотреть, не сбрасывается ли к тому времени состояние атака, если да - установить заново. Если нет - не дать сброситься потом.

Вообще, раньше механизм статусов был проще и надёжнее, ИМХО :)
 

Murkt

Pythoneer

Ну, я так приблизительно и думал.

Только я думал такую вещь сделать не в L2Character, а в L2PcInstance, ведь там тоже есть проверка:
code text
  1.                 if (isAllSkillsDisabled() && (getAccessLevel() < Config.GM_PEACEATTACK))
  2.                 {
  3.                         // Send a Server->Client packet ActionFailed to the L2PcInstance
  4.             sendPacket(new ActionFailed());
  5.                         return;
  6.                 }

Но тогда эта вещь не будет работать с саммонами и петами... Или убирать из L2PcInstance, но там есть sendPacket(new ActionFailed());, а я не знаю как его убирание может подействовать на игру...
[team Їжачки - сумні падлюки]  

Murkt

Pythoneer

Хотя, можно добавить в L2Character
if (this instanceof L2PcInstance) sendPacket(new ActionFailed());
Правда, я опять же не уверен, нужно ли оно вообще, с учётом того, что мы ещё можем этот скилл задействовать.
[team Їжачки - сумні падлюки]  

Murkt

Pythoneer

Тут нужно быть осторожнее, т.к. нужно посмотреть, не сбрасывается ли к тому времени состояние атака, если да - установить заново. Если нет - не дать сброситься потом.
 


Что за состояние атаки? :) Состояние боя? Невозможность выйти из игры, итп?

Одна фишка - у тебя там есть в useMagic в параметрах шифт, контрол, в нынешнем useMagic'е ничего подобного нет. Блин, сейчас проблема - надо сервак у себя запустить тестировать это всё...
[team Їжачки - сумні падлюки]  

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru