PolymorphingOnAttack.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * Copyright (C) 2004-2015 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J DataPack is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package ai.group_template;
  20. import java.util.Arrays;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import ai.npc.AbstractNpcAI;
  25. import com.l2jserver.gameserver.ai.CtrlIntention;
  26. import com.l2jserver.gameserver.model.actor.L2Attackable;
  27. import com.l2jserver.gameserver.model.actor.L2Character;
  28. import com.l2jserver.gameserver.model.actor.L2Npc;
  29. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  30. import com.l2jserver.gameserver.network.NpcStringId;
  31. import com.l2jserver.gameserver.network.clientpackets.Say2;
  32. import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
  33. /**
  34. * Polymorphing on attack monsters AI.
  35. * @author Slyce
  36. */
  37. public final class PolymorphingOnAttack extends AbstractNpcAI
  38. {
  39. private static final Map<Integer, List<Integer>> MOBSPAWNS = new HashMap<>();
  40. static
  41. {
  42. MOBSPAWNS.put(21258, Arrays.asList(21259, 100, 100, -1)); // Fallen Orc Shaman -> Sharp Talon Tiger (always polymorphs)
  43. MOBSPAWNS.put(21261, Arrays.asList(21262, 100, 20, 0)); // Ol Mahum Transcender 1st stage
  44. MOBSPAWNS.put(21262, Arrays.asList(21263, 100, 10, 1)); // Ol Mahum Transcender 2nd stage
  45. MOBSPAWNS.put(21263, Arrays.asList(21264, 100, 5, 2)); // Ol Mahum Transcender 3rd stage
  46. MOBSPAWNS.put(21265, Arrays.asList(21271, 100, 33, 0)); // Cave Ant Larva -> Cave Ant
  47. MOBSPAWNS.put(21266, Arrays.asList(21269, 100, 100, -1)); // Cave Ant Larva -> Cave Ant (always polymorphs)
  48. MOBSPAWNS.put(21267, Arrays.asList(21270, 100, 100, -1)); // Cave Ant Larva -> Cave Ant Soldier (always polymorphs)
  49. MOBSPAWNS.put(21271, Arrays.asList(21272, 66, 10, 1)); // Cave Ant -> Cave Ant Soldier
  50. MOBSPAWNS.put(21272, Arrays.asList(21273, 33, 5, 2)); // Cave Ant Soldier -> Cave Noble Ant
  51. MOBSPAWNS.put(21521, Arrays.asList(21522, 100, 30, -1)); // Claws of Splendor
  52. MOBSPAWNS.put(21527, Arrays.asList(21528, 100, 30, -1)); // Anger of Splendor
  53. MOBSPAWNS.put(21533, Arrays.asList(21534, 100, 30, -1)); // Alliance of Splendor
  54. MOBSPAWNS.put(21537, Arrays.asList(21538, 100, 30, -1)); // Fang of Splendor
  55. }
  56. protected static final NpcStringId[][] MOBTEXTS =
  57. {
  58. new NpcStringId[]
  59. {
  60. NpcStringId.ENOUGH_FOOLING_AROUND_GET_READY_TO_DIE,
  61. NpcStringId.YOU_IDIOT_IVE_JUST_BEEN_TOYING_WITH_YOU,
  62. NpcStringId.NOW_THE_FUN_STARTS
  63. },
  64. new NpcStringId[]
  65. {
  66. NpcStringId.I_MUST_ADMIT_NO_ONE_MAKES_MY_BLOOD_BOIL_QUITE_LIKE_YOU_DO,
  67. NpcStringId.NOW_THE_BATTLE_BEGINS,
  68. NpcStringId.WITNESS_MY_TRUE_POWER
  69. },
  70. new NpcStringId[]
  71. {
  72. NpcStringId.PREPARE_TO_DIE,
  73. NpcStringId.ILL_DOUBLE_MY_STRENGTH,
  74. NpcStringId.YOU_HAVE_MORE_SKILL_THAN_I_THOUGHT
  75. }
  76. };
  77. private PolymorphingOnAttack()
  78. {
  79. super(PolymorphingOnAttack.class.getSimpleName(), "ai/group_template");
  80. addAttackId(MOBSPAWNS.keySet());
  81. }
  82. @Override
  83. public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
  84. {
  85. if (npc.isVisible() && !npc.isDead())
  86. {
  87. final List<Integer> tmp = MOBSPAWNS.get(npc.getId());
  88. if (tmp != null)
  89. {
  90. if ((npc.getCurrentHp() <= ((npc.getMaxHp() * tmp.get(1)) / 100.0)) && (getRandom(100) < tmp.get(2)))
  91. {
  92. if (tmp.get(3) >= 0)
  93. {
  94. NpcStringId npcString = MOBTEXTS[tmp.get(3)][getRandom(MOBTEXTS[tmp.get(3)].length)];
  95. npc.broadcastPacket(new CreatureSay(npc.getObjectId(), Say2.NPC_ALL, npc.getName(), npcString));
  96. }
  97. npc.deleteMe();
  98. final L2Attackable newNpc = (L2Attackable) addSpawn(tmp.get(0), npc.getX(), npc.getY(), npc.getZ() + 10, npc.getHeading(), false, 0, true);
  99. final L2Character originalAttacker = isSummon ? attacker.getSummon() : attacker;
  100. newNpc.setRunning();
  101. newNpc.addDamageHate(originalAttacker, 0, 500);
  102. newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
  103. }
  104. }
  105. }
  106. return super.onAttack(npc, attacker, damage, isSummon);
  107. }
  108. public static void main(String[] args)
  109. {
  110. new PolymorphingOnAttack();
  111. }
  112. }