Execution! 50 Опубликовано 29 июля, 2013 В общем, ребят. Прошу помощи. Суть в том, что уже довольно таки долго ломаю голову над куском кода и не могу вдуплить что да как. Так вот, мне нужно сделать так, чтобы ПЕРЕД началом каста скиллов шла проверка на состояние чара (тобиш в бою он или в игре.. и тд) Перепробовал разные способы, а проверка идёт всё ровно ПОСЛЕ каста.. Пробовал сделать: abortCast(); потом ещё попробовал setIsCastingNow(false); Толку не прибавилось... Вот сам кусок кода. if (AttackStanceTaskManager.getInstance().getAttackStanceTask(activeChar)) { activePlayer.sendMessage("You can't use this skill in battle."); activePlayer.sendPacket(ActionFailed.STATIC_PACKET); return; } Кому не сложно - помогите. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 29 июля, 2013 Эм не совсем понял суть. Можно весь код, желательно с комментариями где что и для чего. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Execution! 50 Опубликовано 29 июля, 2013 @Override public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets) { if (!(activeChar instanceof L2PcInstance)) return; L2PcInstance activePlayer = (L2PcInstance) activeChar; if (!L2PcInstance.checkSummonerStatus(activePlayer)) return; for (L2Object obj : targets) { if (!(obj instanceof L2Character)) continue; final L2Character target = ((L2Character) obj); if (activeChar == target) continue; if (AttackStanceTaskManager.getInstance().getAttackStanceTask(activeChar)) { activePlayer.sendMessage("You can't use this skill in battle."); activePlayer.sendPacket(ActionFailed.STATIC_PACKET); return; } if (target instanceof L2PcInstance) { L2PcInstance targetPlayer = (L2PcInstance) target; if (!L2PcInstance.checkSummonTargetStatus(targetPlayer, activePlayer)) continue; if (!Util.checkIfInRange(50, activeChar, target, false)) { if (!targetPlayer.teleportRequest(activePlayer, skill)) { activePlayer.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_ALREADY_SUMMONED).addPcName(targetPlayer)); continue; } if (skill.getId() == 1403) // summon friend { // Send message ConfirmDlg confirm = new ConfirmDlg(SystemMessageId.S1_WISHES_TO_SUMMON_YOU_FROM_S2_DO_YOU_ACCEPT.getId()); confirm.addPcName(activePlayer); confirm.addZoneName(activeChar.getX(), activeChar.getY(), activeChar.getZ()); confirm.addTime(30000); confirm.addRequesterId(activePlayer.getObjectId()); target.sendPacket(confirm); confirm = null; } else { L2PcInstance.teleToTarget(targetPlayer, activePlayer, skill); targetPlayer.teleportRequest(null, null); } } } } } красным выделил саму проверку. вот нужно чтобы эта проверка шла ДО начала каста а не ПОСЛЕ каста.. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Execution! 50 Опубликовано 29 июля, 2013 Получается так, что игрок прокастовывает скилл, у него сжигает мп и только после этого ему пишет что действие не доступно в данном состоянии. Это не очень красиво, пытаюсь сделать чтобы писало что действие недоступно в данном состоянии и не шёл каст скилла.. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 29 июля, 2013 Я вот думаю, не от аишки ли надо отталкиваться? Или AttackStanceTaskManager заменяет аи игрока? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 29 июля, 2013 if(!isCastingNow() && getAI().getAttackTarget() == getTarget()) Ну это как пример, где условие на то что скилл еще не скастован. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Execution! 50 Опубликовано 29 июля, 2013 Это не столь важно.. Более интересная штука с вот этим: if (this instanceof L2PcInstance && (((skill.getSkillType()) == L2SkillType.BUFF) || ((skill.getSkillType()) == L2SkillType.HEAL) || ((skill.getSkillType()) == L2SkillType.HEAL_PERCENT))) { boolean karma_target = false; for (L2Object trg1 : targets) { if (trg1 instanceof L2Character) { L2Character target1 = (L2Character) trg1; if (((L2PcInstance) target1).getKarma() > 0) { karma_target = true; } else { karma_target = false; } } } if (karma_target == true && (((skill.getSkillType()) == L2SkillType.BUFF) || ((skill.getSkillType()) == L2SkillType.HEAL) || ((skill.getSkillType()) == L2SkillType.HEAL_PERCENT))) { SkillDat skilldat = ((L2PcInstance) this).getCurrentSkill(); if (skilldat.isCtrlPressed()) { } else { SystemMessage smgf = SystemMessage.getSystemMessage(SystemMessageId.INCORRECT_TARGET); sendPacket(ActionFailed.STATIC_PACKET); smgf.addSkillName(skill); sendPacket(smgf); return; } } } Это проверка на состояние ПК персонажа (тобиш если игрок ПК, то на него могут кидать баффы только через CTRL) Но и тут непонятки.. при чём те же самые. Игрок может кастовать скиллы типа Buff, Heal и HealPercent на пк, но эффект они давать не будут пока он не нажмёт CTRL. Тоже не очень красиво ведь.. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ActOne 12 Опубликовано 30 июля, 2013 L2Skill метод checkCondition Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты