/** * Manage actions when a player click on this L2PcInstance.<br> * <br> * <B><U> Actions on first click on the L2PcInstance (Select it)</U> :</B><br> * <br> * <li>Set the target of the player * <li>Send a Server->Client packet MyTargetSelected to the player (display the select window)<br> * <br> * <B><U> Actions on second click on the L2PcInstance (Follow it/Attack it/Intercat with * it)</U> :</B><br> * <br> * <li>Send a Server->Client packet MyTargetSelected to the player (display the select window) * <li>If target L2PcInstance has a Private Store, notify the player AI with AI_INTENTION_INTERACT * <li>If target L2PcInstance is autoAttackable, notify the player AI with AI_INTENTION_ATTACK<br> * <br> * <li>If target L2PcInstance is NOT autoAttackable, notify the player AI with AI_INTENTION_FOLLOW * <br> * <br> * <B><U> Example of use </U> :</B><br> * <br> * <li>Client packet : Action, AttackRequest<br> * <br> * * @param activeChar The player that start an action on target L2PcInstance */ public boolean action(L2PcInstance activeChar, L2Object target, boolean interact) { // See description in TvTEvent.java if (!TvTEvent.onAction(activeChar, target.getObjectId())) return false; // Check if the L2PcInstance is confused if (activeChar.isOutOfControl()) return false; // Aggression target lock effect if (activeChar.isLockedTarget() && activeChar.getLockedTarget() != target) { activeChar.sendPacket(new SystemMessage(SystemMessageId.FAILED_CHANGE_TARGET)); return false; } // Check if the activeChar already target this L2PcInstance if (activeChar.getTarget() != target) { // Set the target of the activeChar activeChar.setTarget(target); // Send a Server->Client packet MyTargetSelected to the activeChar // The color to display in the select window is White activeChar.sendPacket(new MyTargetSelected(target.getObjectId(), 0)); if (activeChar != target) activeChar.sendPacket(new ValidateLocation((L2Character) target)); } else if (interact) { if (activeChar != target) activeChar.sendPacket(new ValidateLocation((L2Character) target)); // Check if this L2PcInstance has a Private Store if (((L2PcInstance) target).getPrivateStoreType() != 0) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, target); } else { // Check if this L2PcInstance is autoAttackable if (target.isAutoAttackable(activeChar)) { // activeChar with lvl < 21 can't attack a cursed weapon holder // And a cursed weapon holder can't attack activeChars with lvl < 21 if ((((L2PcInstance) target).isCursedWeaponEquipped() && activeChar.getLevel() < 21) || (activeChar.isCursedWeaponEquipped() && ((L2Character) target).getLevel() < 21)) { activeChar.sendPacket(ActionFailed.STATIC_PACKET); } else { if (Config.GEODATA > 0) { if (GeoData.getInstance().canSeeTarget(activeChar, target)) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); activeChar.onActionRequest(); } } else { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); activeChar.onActionRequest(); } } } else { // This Action Failed packet avoids activeChar getting stuck when clicking three or more // times activeChar.sendPacket(ActionFailed.STATIC_PACKET); if (Config.GEODATA > 0) { if (GeoData.getInstance().canSeeTarget(activeChar, target)) activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, target); } else activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, target); } } } return true; }
@Override public boolean useBypass(String command, L2PcInstance player, L2Character bypassOrigin) { final QuestState qs = getQuestState(player, false); if ((qs != null) || (player.getLevel() < MIN_LEVEL) || (player.getLevel() > MAX_LEVEL) || (player.getRace() == Race.ERTHEIA) || !command.equals("Q10390_Teleport")) { return false; } if (player.isInParty()) { player.sendPacket( new ExShowScreenMessage("You cannot teleport when you are in party.", 5000)); } else if (player.isInCombat()) { player.sendPacket( new ExShowScreenMessage("You cannot teleport when you are in combat.", 5000)); } else if (player.isInDuel()) { player.sendPacket( new ExShowScreenMessage("You cannot teleport when you are in a duel.", 5000)); } else if (player.isInOlympiadMode()) { player.sendPacket( new ExShowScreenMessage("You cannot teleport when you are in Olympiad.", 5000)); } else if (player.isInVehicle()) { player.sendPacket( new ExShowScreenMessage( "You cannot teleport when you are in any vehicle or mount.", 5000)); } else { player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); player.teleToLocation(TP_LOCS[player.getRace().ordinal()]); } return true; }
/** @see com.l2jserver.gameserver.model.L2Effect#onActionTime() */ @Override public boolean onActionTime() { if (getCount() == getTotalCount() - 1) return true; // do nothing first time int mpConsume = getSkill().getMpConsume(); L2PcInstance caster = (L2PcInstance) getEffector(); for (L2Character cha : _actor.getKnownList().getKnownCharactersInRadius(getSkill().getSkillRadius())) { if (cha == null) continue; if (cha instanceof L2Playable) { if (caster.canAttackCharacter(cha)) { L2PcInstance owner = null; if (cha instanceof L2Summon) owner = ((L2Summon) cha).getOwner(); else owner = (L2PcInstance) cha; if (owner != null && owner.getPet() != null) { if (mpConsume > getEffector().getCurrentMp()) { getEffector() .sendPacket( SystemMessage.getSystemMessage(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP)); return false; } else getEffector().reduceCurrentMp(mpConsume); owner.getPet().unSummon(owner); owner.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, getEffector()); } } } } return true; }
@Override public void onStart(BuffInfo info) { if (info.getEffected().isPlayer()) { L2PcInstance activeChar = info.getEffected().getActingPlayer(); activeChar.setInvisible(true); if ((activeChar.getAI().getNextIntention() != null) && (activeChar.getAI().getNextIntention().getCtrlIntention() == CtrlIntention.AI_INTENTION_ATTACK)) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); } for (L2Character target : activeChar.getKnownList().getKnownCharacters()) { if ((target != null) && (target.getTarget() == activeChar)) { target.setTarget(null); target.abortAttack(); target.abortCast(); target.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); } } } }
/** * Manage actions when a player click on the L2ArtefactInstance.<br> * <br> * <B><U> Actions</U> :</B><br> * <br> * <li>Set the L2NpcInstance as target of the L2PcInstance player (if necessary) * <li>Send a Server->Client packet MyTargetSelected to the L2PcInstance player (display the * select window) * <li>Send a Server->Client packet ValidateLocation to correct the L2NpcInstance position and * heading on the client<br> * <br> * <B><U> Example of use </U> :</B><br> * <br> * <li>Client packet : Action, AttackRequest<br> * <br> */ @Override public boolean action(L2PcInstance activeChar, L2Object target, boolean interact) { if (!((L2Npc) target).canTarget(activeChar)) { return false; } if (activeChar.getTarget() != target) { activeChar.setTarget(target); } else if (interact) { // Calculate the distance between the L2PcInstance and the L2NpcInstance if (!((L2Npc) target).canInteract(activeChar)) { // Notify the L2PcInstance AI with AI_INTENTION_INTERACT activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, target); } } return true; }
@Override protected void runImpl() { final L2PcInstance activeChar = getActiveChar(); if (activeChar == null) { return; } if (Config.DEBUG) { _log.info( getType() + ": " + activeChar + " requested action use ID: " + _actionId + " Ctrl pressed:" + _ctrlPressed + " Shift pressed:" + _shiftPressed); } // Don't do anything if player is dead or confused if ((activeChar.isFakeDeath() && (_actionId != 0)) || activeChar.isDead() || activeChar.isOutOfControl()) { sendPacket(ActionFailed.STATIC_PACKET); return; } final BuffInfo info = activeChar.getEffectList().getBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY); if (info != null) { for (AbstractEffect effect : info.getEffects()) { if (!effect.checkCondition(_actionId)) { activeChar.sendPacket( SystemMessageId .YOU_HAVE_BEEN_REPORTED_AS_AN_ILLEGAL_PROGRAM_USER_SO_YOUR_ACTIONS_HAVE_BEEN_RESTRICTED); activeChar.sendPacket(ActionFailed.STATIC_PACKET); return; } } } // Don't allow to do some action if player is transformed if (activeChar.isTransformed()) { int[] allowedActions = activeChar.isTransformed() ? ExBasicActionList.ACTIONS_ON_TRANSFORM : ExBasicActionList.DEFAULT_ACTION_LIST; if (!(Arrays.binarySearch(allowedActions, _actionId) >= 0)) { sendPacket(ActionFailed.STATIC_PACKET); _log.warning( "Player " + activeChar + " used action which he does not have! Id = " + _actionId + " transform: " + activeChar.getTransformation()); return; } } final L2Summon pet = activeChar.getPet(); final L2Summon servitor = activeChar.getAnyServitor(); final L2Object target = activeChar.getTarget(); switch (_actionId) { case 0: // Sit/Stand if (activeChar.isSitting() || !activeChar.isMoving() || activeChar.isFakeDeath()) { useSit(activeChar, target); } else { // Sit when arrive using next action. // Creating next action class. final NextAction nextAction = new NextAction( CtrlEvent.EVT_ARRIVED, CtrlIntention.AI_INTENTION_MOVE_TO, () -> useSit(activeChar, target)); // Binding next action to AI. activeChar.getAI().setNextAction(nextAction); } break; case 1: // Walk/Run if (activeChar.isRunning()) { activeChar.setWalking(); } else { activeChar.setRunning(); } break; case 10: // Private Store - Sell activeChar.tryOpenPrivateSellStore(false); break; case 15: // Change Movement Mode (Pets) if (validateSummon(pet, true)) { ((L2SummonAI) pet.getAI()).notifyFollowStatusChange(); } break; case 16: // Attack (Pets) if (validateSummon(pet, true)) { if (pet.canAttack(_ctrlPressed)) { pet.doAttack(); } } break; case 17: // Stop (Pets) if (validateSummon(pet, true)) { pet.cancelAction(); } break; case 19: // Unsummon Pet if (!validateSummon(pet, true)) { break; } if (pet.isDead()) { sendPacket(SystemMessageId.DEAD_PETS_CANNOT_BE_RETURNED_TO_THEIR_SUMMONING_ITEM); break; } if (pet.isAttackingNow() || pet.isInCombat() || pet.isMovementDisabled()) { sendPacket(SystemMessageId.A_PET_CANNOT_BE_UNSUMMONED_DURING_BATTLE); break; } if (pet.isHungry()) { if (!((L2PetInstance) pet).getPetData().getFood().isEmpty()) { sendPacket(SystemMessageId.YOU_MAY_NOT_RESTORE_A_HUNGRY_PET); } else { sendPacket( SystemMessageId .THE_MINION_PET_CANNOT_BE_RETURNED_BECAUSE_THERE_IS_NOT_MUCH_TIME_REMAINING_UNTIL_IT_LEAVES); } break; } pet.unSummon(activeChar); break; case 21: // Change Movement Mode (Servitors) if (validateSummon(servitor, false)) { ((L2SummonAI) servitor.getAI()).notifyFollowStatusChange(); } break; case 22: // Attack (Servitors) if (validateSummon(servitor, false)) { if (servitor.canAttack(_ctrlPressed)) { servitor.doAttack(); } } break; case 23: // Stop (Servitors) if (validateSummon(servitor, false)) { servitor.cancelAction(); } break; case 28: // Private Store - Buy activeChar.tryOpenPrivateBuyStore(); break; case 32: // Wild Hog Cannon - Wild Cannon useSkill("DDMagic", false); break; case 36: // Soulless - Toxic Smoke useSkill("RangeDebuff", false); break; case 37: // Dwarven Manufacture if (activeChar.isAlikeDead()) { sendPacket(ActionFailed.STATIC_PACKET); return; } if (activeChar.getPrivateStoreType() != PrivateStoreType.NONE) { activeChar.setPrivateStoreType(PrivateStoreType.NONE); activeChar.broadcastUserInfo(); } if (activeChar.isSitting()) { activeChar.standUp(); } sendPacket(new RecipeShopManageList(activeChar, true)); break; case 38: // Mount/Dismount activeChar.mountPlayer(pet); break; case 39: // Soulless - Parasite Burst useSkill("RangeDD", false); break; case 41: // Wild Hog Cannon - Attack if (validateSummon(servitor, false)) { if ((target != null) && (target.isDoor() || (target instanceof L2SiegeFlagInstance))) { useSkill(4230, false); } else { sendPacket(SystemMessageId.INVALID_TARGET); } } break; case 42: // Kai the Cat - Self Damage Shield useSkill("HealMagic", false); break; case 43: // Merrow the Unicorn - Hydro Screw useSkill("DDMagic", false); break; case 44: // Big Boom - Boom Attack useSkill("DDMagic", false); break; case 45: // Boxer the Unicorn - Master Recharge useSkill("HealMagic", activeChar, false); break; case 46: // Mew the Cat - Mega Storm Strike useSkill("DDMagic", false); break; case 47: // Silhouette - Steal Blood useSkill("DDMagic", false); break; case 48: // Mechanic Golem - Mech. Cannon useSkill("DDMagic", false); break; case 51: // General Manufacture // Player shouldn't be able to set stores if he/she is alike dead (dead or fake death) if (activeChar.isAlikeDead()) { sendPacket(ActionFailed.STATIC_PACKET); return; } if (activeChar.getPrivateStoreType() != PrivateStoreType.NONE) { activeChar.setPrivateStoreType(PrivateStoreType.NONE); activeChar.broadcastUserInfo(); } if (activeChar.isSitting()) { activeChar.standUp(); } sendPacket(new RecipeShopManageList(activeChar, false)); break; case 52: // Unsummon Servitor if (validateSummon(servitor, false)) { if (servitor.isAttackingNow() || servitor.isInCombat()) { sendPacket(SystemMessageId.A_SERVITOR_WHOM_IS_ENGAGED_IN_BATTLE_CANNOT_BE_DE_ACTIVATED); break; } servitor.unSummon(activeChar); } break; case 53: // Move to target (Servitors) if (validateSummon(servitor, false)) { if ((target != null) && (servitor != target) && !servitor.isMovementDisabled()) { servitor.setFollowStatus(false); servitor.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); } } break; case 54: // Move to target (Pets) if (validateSummon(pet, true)) { if ((target != null) && (pet != target) && !pet.isMovementDisabled()) { pet.setFollowStatus(false); pet.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); } } break; case 61: // Private Store Package Sell activeChar.tryOpenPrivateSellStore(true); break; case 65: // Bot Report Button if (Config.BOTREPORT_ENABLE) { BotReportTable.getInstance().reportBot(activeChar); } else { activeChar.sendMessage("This feature is disabled."); } break; case 67: // Steer if (activeChar.isInAirShip()) { if (activeChar.getAirShip().setCaptain(activeChar)) { activeChar.broadcastUserInfo(); } } break; case 68: // Cancel Control if (activeChar.isInAirShip() && activeChar.getAirShip().isCaptain(activeChar)) { if (activeChar.getAirShip().setCaptain(null)) { activeChar.broadcastUserInfo(); } } break; case 69: // Destination Map AirShipManager.getInstance().sendAirShipTeleportList(activeChar); break; case 70: // Exit Airship if (activeChar.isInAirShip()) { if (activeChar.getAirShip().isCaptain(activeChar)) { if (activeChar.getAirShip().setCaptain(null)) { activeChar.broadcastUserInfo(); } } else if (activeChar.getAirShip().isInDock()) { activeChar.getAirShip().oustPlayer(activeChar); } } break; case 71: case 72: case 73: useCoupleSocial(_actionId - 55); break; case 78: case 79: case 80: case 81: if ((activeChar.getParty() != null) && (activeChar.getTarget() != null) && (activeChar.getTarget().isCharacter())) { activeChar .getParty() .addTacticalSign(_actionId - 77, (L2Character) activeChar.getTarget()); } else { sendPacket(ActionFailed.STATIC_PACKET); } break; case 82: case 83: case 84: case 85: if (activeChar.getParty() != null) { activeChar.getParty().setTargetBasedOnTacticalSignId(activeChar, _actionId - 81); } else { sendPacket(ActionFailed.STATIC_PACKET); } break; case 90: // /instancedzone action since Lindvior activeChar.sendPacket(new ExInzoneWaiting(activeChar)); break; case 1000: // Siege Golem - Siege Hammer if ((target != null) && target.isDoor()) { useSkill(4079, false); } break; case 1001: // Sin Eater - Ultimate Bombastic Buster if (validateSummon(pet, true) && (pet.getId() == SIN_EATER_ID)) { pet.broadcastPacket( new NpcSay( pet.getObjectId(), ChatType.NPC_GENERAL, pet.getId(), NPC_STRINGS[Rnd.get(NPC_STRINGS.length)])); } break; case 1003: // Wind Hatchling/Strider - Wild Stun useSkill("PhysicalSpecial", true); break; case 1004: // Wind Hatchling/Strider - Wild Defense useSkill("Buff", activeChar, true); break; case 1005: // Star Hatchling/Strider - Bright Burst useSkill("DDMagic", true); break; case 1006: // Star Hatchling/Strider - Bright Heal useSkill("Heal", activeChar, true); break; case 1007: // Feline Queen - Blessing of Queen useSkill("Buff1", activeChar, false); break; case 1008: // Feline Queen - Gift of Queen useSkill("Buff2", activeChar, false); break; case 1009: // Feline Queen - Cure of Queen useSkill("DDMagic", false); break; case 1010: // Unicorn Seraphim - Blessing of Seraphim useSkill("Buff1", activeChar, false); break; case 1011: // Unicorn Seraphim - Gift of Seraphim useSkill("Buff2", activeChar, false); break; case 1012: // Unicorn Seraphim - Cure of Seraphim useSkill("DDMagic", false); break; case 1013: // Nightshade - Curse of Shade useSkill("DeBuff1", false); break; case 1014: // Nightshade - Mass Curse of Shade useSkill("DeBuff2", false); break; case 1015: // Nightshade - Shade Sacrifice useSkill("Heal", false); break; case 1016: // Cursed Man - Cursed Blow useSkill("PhysicalSpecial1", false); break; case 1017: // Cursed Man - Cursed Strike useSkill("PhysicalSpecial2", false); break; case 1031: // Feline King - Slash useSkill("PhysicalSpecial1", false); break; case 1032: // Feline King - Spinning Slash useSkill("PhysicalSpecial2", false); break; case 1033: // Feline King - Hold of King useSkill("PhysicalSpecial3", false); break; case 1034: // Magnus the Unicorn - Whiplash useSkill("PhysicalSpecial1", false); break; case 1035: // Magnus the Unicorn - Tridal Wave useSkill("PhysicalSpecial2", false); break; case 1036: // Spectral Lord - Corpse Kaboom useSkill("PhysicalSpecial1", false); break; case 1037: // Spectral Lord - Dicing Death useSkill("PhysicalSpecial2", false); break; case 1038: // Spectral Lord - Dark Curse useSkill("PhysicalSpecial3", false); break; case 1039: // Swoop Cannon - Cannon Fodder useSkill(5110, false); break; case 1040: // Swoop Cannon - Big Bang useSkill(5111, false); break; case 1041: // Great Wolf - Bite Attack useSkill("Skill01", true); break; case 1042: // Great Wolf - Maul useSkill("Skill03", true); break; case 1043: // Great Wolf - Cry of the Wolf useSkill("Skill02", true); break; case 1044: // Great Wolf - Awakening useSkill("Skill04", true); break; case 1045: // Great Wolf - Howl useSkill(5584, true); break; case 1046: // Strider - Roar useSkill(5585, true); break; case 1047: // Divine Beast - Bite useSkill(5580, false); break; case 1048: // Divine Beast - Stun Attack useSkill(5581, false); break; case 1049: // Divine Beast - Fire Breath useSkill(5582, false); break; case 1050: // Divine Beast - Roar useSkill(5583, false); break; case 1051: // Feline Queen - Bless The Body useSkill("buff3", false); break; case 1052: // Feline Queen - Bless The Soul useSkill("buff4", false); break; case 1053: // Feline Queen - Haste useSkill("buff5", false); break; case 1054: // Unicorn Seraphim - Acumen useSkill("buff3", false); break; case 1055: // Unicorn Seraphim - Clarity useSkill("buff4", false); break; case 1056: // Unicorn Seraphim - Empower useSkill("buff5", false); break; case 1057: // Unicorn Seraphim - Wild Magic useSkill("buff6", false); break; case 1058: // Nightshade - Death Whisper useSkill("buff3", false); break; case 1059: // Nightshade - Focus useSkill("buff4", false); break; case 1060: // Nightshade - Guidance useSkill("buff5", false); break; case 1061: // Wild Beast Fighter, White Weasel - Death blow useSkill(5745, true); break; case 1062: // Wild Beast Fighter - Double attack useSkill(5746, true); break; case 1063: // Wild Beast Fighter - Spin attack useSkill(5747, true); break; case 1064: // Wild Beast Fighter - Meteor Shower useSkill(5748, true); break; case 1065: // Fox Shaman, Wild Beast Fighter, White Weasel, Fairy Princess - Awakening useSkill(5753, true); break; case 1066: // Fox Shaman, Spirit Shaman - Thunder Bolt useSkill(5749, true); break; case 1067: // Fox Shaman, Spirit Shaman - Flash useSkill(5750, true); break; case 1068: // Fox Shaman, Spirit Shaman - Lightning Wave useSkill(5751, true); break; case 1069: // Fox Shaman, Fairy Princess - Flare useSkill(5752, true); break; case 1070: // White Weasel, Fairy Princess, Improved Baby Buffalo, Improved Baby Kookaburra, // Improved Baby Cougar, Spirit Shaman, Toy Knight, Turtle Ascetic - Buff control useSkill(5771, true); break; case 1071: // Tigress - Power Strike useSkill("DDMagic", true); break; case 1072: // Toy Knight - Piercing attack useSkill(6046, true); break; case 1073: // Toy Knight - Whirlwind useSkill(6047, true); break; case 1074: // Toy Knight - Lance Smash useSkill(6048, true); break; case 1075: // Toy Knight - Battle Cry useSkill(6049, true); break; case 1076: // Turtle Ascetic - Power Smash useSkill(6050, true); break; case 1077: // Turtle Ascetic - Energy Burst useSkill(6051, true); break; case 1078: // Turtle Ascetic - Shockwave useSkill(6052, true); break; case 1079: // Turtle Ascetic - Howl useSkill(6053, true); break; case 1080: // Phoenix Rush useSkill(6041, false); break; case 1081: // Phoenix Cleanse useSkill(6042, false); break; case 1082: // Phoenix Flame Feather useSkill(6043, false); break; case 1083: // Phoenix Flame Beak useSkill(6044, false); break; case 1084: // Switch State if (pet instanceof L2BabyPetInstance) { useSkill(SWITCH_STANCE_ID, true); } break; case 1086: // Panther Cancel useSkill(6094, false); break; case 1087: // Panther Dark Claw useSkill(6095, false); break; case 1088: // Panther Fatal Claw useSkill(6096, false); break; case 1089: // Deinonychus - Tail Strike useSkill(6199, true); break; case 1090: // Guardian's Strider - Strider Bite useSkill(6205, true); break; case 1091: // Guardian's Strider - Strider Fear useSkill(6206, true); break; case 1092: // Guardian's Strider - Strider Dash useSkill(6207, true); break; case 1093: // Maguen - Maguen Strike useSkill(6618, true); break; case 1094: // Maguen - Maguen Wind Walk useSkill(6681, true); break; case 1095: // Elite Maguen - Maguen Power Strike useSkill(6619, true); break; case 1096: // Elite Maguen - Elite Maguen Wind Walk useSkill(6682, true); break; case 1097: // Maguen - Maguen Return useSkill(6683, true); break; case 1098: // Elite Maguen - Maguen Party Return useSkill(6684, true); break; case 1099: // All servitor attack activeChar .getServitors() .values() .forEach( s -> { if (validateSummon(s, false)) { if (s.canAttack(_ctrlPressed)) { s.doAttack(); } } }); break; case 1100: // All servitor move to activeChar .getServitors() .values() .forEach( s -> { if (validateSummon(s, false)) { if ((target != null) && (s != target) && !s.isMovementDisabled()) { s.setFollowStatus(false); s.getAI() .setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); } } }); break; case 1101: // All servitor stop activeChar .getServitors() .values() .forEach( summon -> { if (validateSummon(summon, false)) { summon.cancelAction(); } }); break; case 1102: // Unsummon all servitors boolean canUnsummon = true; OUT: for (L2Summon s : activeChar.getServitors().values()) { if (validateSummon(s, false)) { if (s.isAttackingNow() || s.isInCombat()) { sendPacket( SystemMessageId.A_SERVITOR_WHOM_IS_ENGAGED_IN_BATTLE_CANNOT_BE_DE_ACTIVATED); canUnsummon = false; break OUT; } s.unSummon(activeChar); } } if (canUnsummon) { activeChar .getServitors() .values() .stream() .forEach( s -> { s.unSummon(activeChar); }); } break; case 1103: // seems to be passive mode break; case 1104: // seems to be defend mode break; case 1106: // Cute Bear - Bear Claw useServitorsSkill(11278); break; case 1107: // Cute Bear - Bear Tumbling useServitorsSkill(11279); break; case 1108: // Saber Tooth Cougar- Cougar Bite useServitorsSkill(11280); break; case 1109: // Saber Tooth Cougar - Cougar Pounce useServitorsSkill(11281); break; case 1110: // Grim Reaper - Reaper Touch useServitorsSkill(11282); break; case 1111: // Grim Reaper - Reaper Power useServitorsSkill(11283); break; case 1113: // Golden Lion - Lion Roar useSkill(10051, false); break; case 1114: // Golden Lion - Lion Claw useSkill(10052, false); break; case 1115: // Golden Lion - Lion Dash useSkill(10053, false); break; case 1116: // Golden Lion - Lion Flame useSkill(10054, false); break; case 1117: // Thunder Hawk - Thunder Flight useSkill(10794, false); break; case 1118: // Thunder Hawk - Thunder Purity useSkill(10795, false); break; case 1120: // Thunder Hawk - Thunder Feather Blast useSkill(10797, false); break; case 1121: // Thunder Hawk - Thunder Sharp Claw useSkill(10798, false); break; case 1122: // Tree of Life - Blessing of Tree useServitorsSkill(11806); break; case 1124: // Wynn Kai the Cat - Feline Aggression useServitorsSkill(11323); break; case 1125: // Wynn Kai the Cat - Feline Stun useServitorsSkill(11324); break; case 1126: // Wynn Feline King - Feline Bite useServitorsSkill(11325); break; case 1127: // Wynn Feline King - Feline Pounce useServitorsSkill(11326); break; case 1128: // Wynn Feline Queen - Feline Touch useServitorsSkill(11327); break; case 1129: // Wynn Feline Queen - Feline Power useServitorsSkill(11328); break; case 1130: // Wynn Merrow - Unicorn's Aggression useServitorsSkill(11332); break; case 1131: // Wynn Merrow - Unicorn's Stun useServitorsSkill(11333); break; case 1132: // Wynn Magnus - Unicorn's Bite useServitorsSkill(11334); break; case 1133: // Wynn Magnus - Unicorn's Pounce useServitorsSkill(11335); break; case 1134: // Wynn Seraphim - Unicorn's Touch useServitorsSkill(11336); break; case 1135: // Wynn Seraphim - Unicorn's Power useServitorsSkill(11337); break; case 1136: // Wynn Nightshade - Phantom Aggression useServitorsSkill(11341); break; case 1137: // Wynn Nightshade - Phantom Stun useServitorsSkill(11342); break; case 1138: // Wynn Spectral Lord - Phantom Bite useServitorsSkill(11343); break; case 1139: // Wynn Spectral Lord - Phantom Pounce useServitorsSkill(11344); break; case 1140: // Wynn Soulless - Phantom Touch useServitorsSkill(11345); break; case 1141: // Wynn Soulless - Phantom Power useServitorsSkill(11346); break; case 1142: // Blood Panther - Panther Roar useServitorsSkill(10087); break; case 1143: // Blood Panther - Panther Rush useServitorsSkill(10088); break; case 5000: // Baby Rudolph - Reindeer Scratch useSkill(23155, true); break; case 5001: // Deseloph, Hyum, Rekang, Lilias, Lapham, Mafum - Rosy Seduction useSkill(23167, true); break; case 5002: // Deseloph, Hyum, Rekang, Lilias, Lapham, Mafum - Critical Seduction useSkill(23168, true); break; case 5003: // Hyum, Lapham, Hyum, Lapham - Thunder Bolt useSkill(5749, true); break; case 5004: // Hyum, Lapham, Hyum, Lapham - Flash useSkill(5750, true); break; case 5005: // Hyum, Lapham, Hyum, Lapham - Lightning Wave useSkill(5751, true); break; case 5006: // Deseloph, Hyum, Rekang, Lilias, Lapham, Mafum, Deseloph, Hyum, Rekang, Lilias, // Lapham, Mafum - Buff Control useSkill(5771, true); break; case 5007: // Deseloph, Lilias, Deseloph, Lilias - Piercing Attack useSkill(6046, true); break; case 5008: // Deseloph, Lilias, Deseloph, Lilias - Spin Attack useSkill(6047, true); break; case 5009: // Deseloph, Lilias, Deseloph, Lilias - Smash useSkill(6048, true); break; case 5010: // Deseloph, Lilias, Deseloph, Lilias - Ignite useSkill(6049, true); break; case 5011: // Rekang, Mafum, Rekang, Mafum - Power Smash useSkill(6050, true); break; case 5012: // Rekang, Mafum, Rekang, Mafum - Energy Burst useSkill(6051, true); break; case 5013: // Rekang, Mafum, Rekang, Mafum - Shockwave useSkill(6052, true); break; case 5014: // Rekang, Mafum, Rekang, Mafum - Ignite useSkill(6053, true); break; case 5015: // Deseloph, Hyum, Rekang, Lilias, Lapham, Mafum, Deseloph, Hyum, Rekang, Lilias, // Lapham, Mafum - Switch Stance useSkill(6054, true); break; // Social Packets case 12: // Greeting tryBroadcastSocial(2); break; case 13: // Victory tryBroadcastSocial(3); break; case 14: // Advance tryBroadcastSocial(4); break; case 24: // Yes tryBroadcastSocial(6); break; case 25: // No tryBroadcastSocial(5); break; case 26: // Bow tryBroadcastSocial(7); break; case 29: // Unaware tryBroadcastSocial(8); break; case 30: // Social Waiting tryBroadcastSocial(9); break; case 31: // Laugh tryBroadcastSocial(10); break; case 33: // Applaud tryBroadcastSocial(11); break; case 34: // Dance tryBroadcastSocial(12); break; case 35: // Sorrow tryBroadcastSocial(13); break; case 62: // Charm tryBroadcastSocial(14); break; case 66: // Shyness tryBroadcastSocial(15); break; case 87: // Propose tryBroadcastSocial(28); break; case 88: // Provoke tryBroadcastSocial(29); break; case 89: // Beauty Shop tryBroadcastSocial(30); activeChar.broadcastInfo(); break; default: _log.warning(activeChar.getName() + ": unhandled action type " + _actionId); break; } }
/** * Perform a couple social action. * * @param id the couple social action Id */ private void useCoupleSocial(final int id) { final L2PcInstance requester = getActiveChar(); if (requester == null) { return; } final L2Object target = requester.getTarget(); if ((target == null) || !target.isPlayer()) { sendPacket(SystemMessageId.INVALID_TARGET); return; } final int distance = (int) requester.calculateDistance(target, false, false); if ((distance > 125) || (distance < 15) || (requester.getObjectId() == target.getObjectId())) { sendPacket( SystemMessageId .THE_REQUEST_CANNOT_BE_COMPLETED_BECAUSE_THE_TARGET_DOES_NOT_MEET_LOCATION_REQUIREMENTS); return; } SystemMessage sm; if (requester.isInStoreMode() || requester.isInCraftMode()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_IN_PRIVATE_STORE_MODE_OR_IN_A_BATTLE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } if (requester.isInCombat() || requester.isInDuel() || AttackStanceTaskManager.getInstance().hasAttackStanceTask(requester)) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_IN_A_BATTLE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } if (requester.isFishing()) { sendPacket(SystemMessageId.YOU_CANNOT_DO_THAT_WHILE_FISHING); return; } if (requester.getReputation() < 0) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_IN_A_CHAOTIC_STATE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } if (requester.isInOlympiadMode()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_PARTICIPATING_IN_THE_OLYMPIAD_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } if (requester.isInSiege()) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_IN_A_CASTLE_SIEGE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } if (requester.isInHideoutSiege()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_PARTICIPATING_IN_A_CLAN_HALL_SIEGE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); } if (requester.isMounted() || requester.isFlyingMounted() || requester.isInBoat() || requester.isInAirShip()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_RIDING_A_SHIP_STEED_OR_STRIDER_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } if (requester.isTransformed()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_CURRENTLY_TRANSFORMING_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } if (requester.isAlikeDead()) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_CURRENTLY_DEAD_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(requester); sendPacket(sm); return; } // Checks for partner. final L2PcInstance partner = target.getActingPlayer(); if (partner.isInStoreMode() || partner.isInCraftMode()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_IN_PRIVATE_STORE_MODE_OR_IN_A_BATTLE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isInCombat() || partner.isInDuel() || AttackStanceTaskManager.getInstance().hasAttackStanceTask(partner)) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_IN_A_BATTLE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.getMultiSociaAction() > 0) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_ALREADY_PARTICIPATING_IN_A_COUPLE_ACTION_AND_CANNOT_BE_REQUESTED_FOR_ANOTHER_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isFishing()) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_FISHING_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.getReputation() < 0) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_IN_A_CHAOTIC_STATE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isInOlympiadMode()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_PARTICIPATING_IN_THE_OLYMPIAD_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isInHideoutSiege()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_PARTICIPATING_IN_A_CLAN_HALL_SIEGE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isInSiege()) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_IN_A_CASTLE_SIEGE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isMounted() || partner.isFlyingMounted() || partner.isInBoat() || partner.isInAirShip()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_RIDING_A_SHIP_STEED_OR_STRIDER_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isTeleporting()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_CURRENTLY_TELEPORTING_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isTransformed()) { sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_CURRENTLY_TRANSFORMING_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (partner.isAlikeDead()) { sm = SystemMessage.getSystemMessage( SystemMessageId.C1_IS_CURRENTLY_DEAD_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION); sm.addPcName(partner); sendPacket(sm); return; } if (requester.isAllSkillsDisabled() || partner.isAllSkillsDisabled()) { sendPacket(SystemMessageId.THE_COUPLE_ACTION_WAS_CANCELLED); return; } requester.setMultiSocialAction(id, partner.getObjectId()); sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_REQUESTED_A_COUPLE_ACTION_WITH_C1); sm.addPcName(partner); sendPacket(sm); if ((requester.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE) || (partner.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)) { final NextAction nextAction = new NextAction( CtrlEvent.EVT_ARRIVED, CtrlIntention.AI_INTENTION_MOVE_TO, () -> partner.sendPacket(new ExAskCoupleAction(requester.getObjectId(), id))); requester.getAI().setNextAction(nextAction); return; } if (requester.isCastingNow() || requester.isCastingSimultaneouslyNow()) { final NextAction nextAction = new NextAction( CtrlEvent.EVT_FINISH_CASTING, CtrlIntention.AI_INTENTION_CAST, () -> partner.sendPacket(new ExAskCoupleAction(requester.getObjectId(), id))); requester.getAI().setNextAction(nextAction); return; } partner.sendPacket(new ExAskCoupleAction(requester.getObjectId(), id)); }
/** Stops all players from attacking. Used for duel timeout / interrupt. */ private void stopFighting() { ActionFailed af = ActionFailed.STATIC_PACKET; if (_partyDuel) { for (L2PcInstance temp : _playerA.getParty().getMembers()) { temp.abortCast(); temp.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); temp.setTarget(null); temp.sendPacket(af); if (temp.hasSummon()) { for (L2Summon summon : temp.getServitors().values()) { if (!summon.isDead()) { summon.abortCast(); summon.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); summon.setTarget(null); summon.sendPacket(af); } } } } for (L2PcInstance temp : _playerB.getParty().getMembers()) { temp.abortCast(); temp.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); temp.setTarget(null); temp.sendPacket(af); if (temp.hasSummon()) { for (L2Summon summon : temp.getServitors().values()) { if (!summon.isDead()) { summon.abortCast(); summon.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); summon.setTarget(null); summon.sendPacket(af); } } } } } else { _playerA.abortCast(); _playerB.abortCast(); _playerA.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); _playerA.setTarget(null); _playerB.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); _playerB.setTarget(null); _playerA.sendPacket(af); _playerB.sendPacket(af); if (_playerA.hasSummon()) { for (L2Summon summon : _playerA.getServitors().values()) { if (!summon.isDead()) { summon.abortCast(); summon.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); summon.setTarget(null); summon.sendPacket(af); } } } if (_playerB.hasSummon()) { for (L2Summon summon : _playerB.getServitors().values()) { if (!summon.isDead()) { summon.abortCast(); summon.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); summon.setTarget(null); summon.sendPacket(af); } } } } }
protected static final void teleportPlayer(L2PcInstance player, int[] coords, int instanceId) { player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); player.setInstanceId(instanceId); player.teleToLocation(coords[0], coords[1], coords[2], true); }