tobaJK

aCis Plagueseeker Raid

Aug 20th, 2018 (edited)
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.09 KB | None | 0 0
  1. package net.sf.l2j.gameserver.scripting.scripts.ai.group;
  2.  
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.concurrent.CopyOnWriteArrayList;
  6.  
  7. import net.sf.l2j.commons.concurrent.ThreadPool;
  8. import net.sf.l2j.commons.random.Rnd;
  9.  
  10. import net.sf.l2j.gameserver.data.SkillTable;
  11. import net.sf.l2j.gameserver.instancemanager.ZoneManager;
  12. import net.sf.l2j.gameserver.model.L2Skill;
  13. import net.sf.l2j.gameserver.model.actor.Attackable;
  14. import net.sf.l2j.gameserver.model.actor.Creature;
  15. import net.sf.l2j.gameserver.model.actor.Npc;
  16. import net.sf.l2j.gameserver.model.actor.instance.Player;
  17. import net.sf.l2j.gameserver.model.zone.type.L2BossZone;
  18. import net.sf.l2j.gameserver.network.serverpackets.Earthquake;
  19. import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
  20. import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
  21. import net.sf.l2j.gameserver.network.serverpackets.SpecialCamera;
  22. import net.sf.l2j.gameserver.network.serverpackets.StopMove;
  23. import net.sf.l2j.gameserver.scripting.EventType;
  24. import net.sf.l2j.gameserver.scripting.scripts.ai.L2AttackableAIScript;
  25.  
  26. /**
  27.  * @author Melron
  28.  */
  29. public final class Plagueseeker extends L2AttackableAIScript
  30. {
  31.     private static final L2BossZone PLAGUESEEKER_LAIR = ZoneManager.getInstance().getZoneById(150000, L2BossZone.class);
  32.     private static Npc Plagueseeker = null;
  33.     private long _lastAttack = 0L;
  34.     private static final int PLAGUESEEKER = 20798;
  35.     private static final int[] helpersIds = new int[]
  36.     {
  37.         21083,
  38.         21088,
  39.         21649
  40.     };
  41.     private static final List<Integer> healerClassIds = Arrays.asList(15, 16, 29, 30, 42, 43, 97, 105, 112, 115, 136, 116);
  42.     private static List<Npc> helpers = new CopyOnWriteArrayList<>();
  43.    
  44.     public Plagueseeker()
  45.     {
  46.         super("ai/group");
  47.     }
  48.    
  49.     @Override
  50.     protected void registerNpcs()
  51.     {
  52.         addEventIds(PLAGUESEEKER, EventType.ON_ATTACK, EventType.ON_SPAWN, EventType.ON_KILL);
  53.         addEventIds(helpersIds, EventType.ON_KILL);
  54.     }
  55.    
  56.     @Override
  57.     public String onAttack(Npc npc, Player player, int damage, boolean isPet, L2Skill skill)
  58.     {
  59.         if (Plagueseeker != null && !Plagueseeker.isInvul())
  60.             _lastAttack = System.currentTimeMillis();
  61.        
  62.         return super.onAttack(npc, player, damage, isPet, skill);
  63.     }
  64.    
  65.     @Override
  66.     public String onSpawn(Npc npc)
  67.     {
  68.         Plagueseeker = npc;
  69.         Plagueseeker.setIsInvul(true);
  70.         paralyzeAll(true);
  71.         startSpecialCamera(false);
  72.         return super.onSpawn(npc);
  73.     }
  74.    
  75.     @Override
  76.     public String onKill(Npc npc, Player killer, boolean isPet)
  77.     {
  78.         // raid killed
  79.         if (npc.getNpcId() == PLAGUESEEKER)
  80.             clear();
  81.        
  82.         // minion killed
  83.         else
  84.         {
  85.             cancelQuestTimer("self_destruct", npc, null);
  86.             helpers.remove(npc);
  87.         }
  88.         return super.onKill(npc, killer, isPet);
  89.     }
  90.    
  91.     private void clear()
  92.     {
  93.         // cancel tasks
  94.         cancelQuestTimer("action_task", Plagueseeker, null);
  95.         cancelQuestTimer("inactivity_task", Plagueseeker, null);
  96.         cancelQuestTimer("mass_kill_cin", Plagueseeker, null);
  97.         cancelQuestTimer("mass_kill", Plagueseeker, null);
  98.        
  99.         // clear data
  100.         helpers.clear();
  101.         _lastAttack = 0L;
  102.        
  103.     }
  104.    
  105.     @Override
  106.     public String onAdvEvent(String event, Npc npc, Player player)
  107.     {
  108.         if (event.contains("camera"))
  109.             broadcastCamera(event);
  110.        
  111.         else if (event.equalsIgnoreCase("self_destruct"))
  112.             // suicide skill, damage nearby units
  113.             npc.doCast(SkillTable.getInstance().getInfo(4143, 10));
  114.        
  115.         else if (event.equalsIgnoreCase("mass_kill_cin"))
  116.         {
  117.             paralyzeAll(true);
  118.             startSpecialCamera(true);
  119.         }
  120.        
  121.         else if (event.equalsIgnoreCase("mass_kill"))
  122.         {
  123.             int killed = 0;
  124.             for (Creature creature : PLAGUESEEKER_LAIR.getCharactersInside())
  125.             {
  126.                 // stop if 10 players killed
  127.                 if (killed == 10)
  128.                     break;
  129.                
  130.                 if (!(creature instanceof Player) || creature.isDead())
  131.                     continue;
  132.                
  133.                 creature.doDie(Plagueseeker);
  134.                 killed++;
  135.             }
  136.         }
  137.         else if (event.equalsIgnoreCase("action_task"))
  138.         {
  139.             final int rnd = Rnd.get(100);
  140.             // checking if boss have lower than 50% hp and mass kill never happened. if not, kill 10 players instant
  141.             if (Plagueseeker.isScriptValue(0) && bossHp() < 0.5)
  142.             {
  143.                 startQuestTimer("mass_kill_cin", 1000, npc, null, false);
  144.                 Plagueseeker.setScriptValue(1);
  145.             }
  146.            
  147.             // 20% chance to debuff 1 healer
  148.             else if (rnd <= 20)
  149.             {
  150.                
  151.                 final Player healer = getAvailableHealer();
  152.                 if (healer != null)
  153.                 {
  154.                     final L2Skill effect = getRandomEffect();
  155.                     if (effect != null)
  156.                         effect.getEffects(healer, healer);
  157.                 }
  158.             }
  159.             // 5% chance
  160.             else if (rnd <= 25)
  161.             {
  162.                 // if boss have lower than 40% hp spawn 10 mobs for help
  163.                 if (bossHp() < 0.4)
  164.                     spawnHelpers();
  165.                
  166.             }
  167.             // 5% chance
  168.             else if (rnd <= 30)
  169.             {
  170.                 // instant kill
  171.                 final Player pl = getRandomPlayerInRadius(700);
  172.                 if (pl != null)
  173.                     pl.doDie(Plagueseeker);
  174.             }
  175.         }
  176.         else if (event.equalsIgnoreCase("inactivity_task"))
  177.         {
  178.             if (_lastAttack + 900000 < System.currentTimeMillis())
  179.             {
  180.                 PLAGUESEEKER_LAIR.oustAllPlayers();
  181.                 clear();
  182.                 Plagueseeker.deleteMe();
  183.             }
  184.         }
  185.         return super.onAdvEvent(event, npc, player);
  186.     }
  187.    
  188.     /**
  189.      * @return the percentage of the current hp
  190.      */
  191.     private static float bossHp()
  192.     {
  193.         return ((float) Plagueseeker.getCurrentHp()) / Plagueseeker.getMaxHp();
  194.     }
  195.    
  196.     private void spawnHelpers()
  197.     {
  198.         for (int i = 0; i < 10; i++)
  199.         {
  200.             if (helpers.size() > 9)
  201.                 break;
  202.            
  203.             final int npcId = helpersIds[Rnd.get(helpersIds.length)];
  204.             final Npc npc = addSpawn(npcId, Plagueseeker.getX() + Rnd.get(-200, 200), Plagueseeker.getY() + Rnd.get(-200, 200), Plagueseeker.getZ(), 0, false, 0, true);
  205.             ((Attackable) npc).setIsRaidMinion(true);
  206.            
  207.             helpers.add(npc);
  208.            
  209.             final Player victim = getRandomPlayer(npc);
  210.             if (victim != null)
  211.                 attack(((Attackable) npc), victim);
  212.            
  213.             // suicide after 10 sec
  214.             startQuestTimer("self_destruct", 10000, npc, null, false);
  215.         }
  216.        
  217.     }
  218.    
  219.     /**
  220.      * @param radius
  221.      * @return random player
  222.      */
  223.     private static Player getRandomPlayerInRadius(int radius)
  224.     {
  225.         return Plagueseeker.getKnownTypeInRadius(Player.class, radius).stream().filter(player -> !player.isDead()).findFirst().orElse(null);
  226.     }
  227.    
  228.     private static L2Skill getRandomEffect()
  229.     {
  230.         final int rnd = Rnd.get(100);
  231.         // Curse of Doom
  232.         if (rnd < 20)
  233.             return SkillTable.getInstance().getInfo(1336, 1);
  234.         // Curse Fear
  235.         else if (rnd < 35)
  236.             return SkillTable.getInstance().getInfo(1169, 14);
  237.         // Cancel
  238.         else if (rnd < 45)
  239.             return SkillTable.getInstance().getInfo(1056, 12);
  240.         // stun (Armor Crush) 50%
  241.         else
  242.             return SkillTable.getInstance().getInfo(362, 1);
  243.        
  244.     }
  245.    
  246.     private static Player getAvailableHealer()
  247.     {
  248.         return (Player) PLAGUESEEKER_LAIR.getCharactersInside().stream().filter(creature -> creature instanceof Player && isHealer((Player) creature) && !creature.isDead()).findFirst().orElse(null);
  249.     }
  250.    
  251.     /**
  252.      * @param player
  253.      * @return true if the player is healer
  254.      */
  255.     private static boolean isHealer(Player player)
  256.     {
  257.         return healerClassIds.contains(player.getClassId().getId());
  258.     }
  259.    
  260.     private void runTasks()
  261.     {
  262.         paralyzeAll(false);
  263.         Plagueseeker.setIsInvul(false);
  264.         startQuestTimer("action_task", 2000, Plagueseeker, null, true);
  265.         // every 15 minutes check for nearby players. if no one found unspawn.
  266.         startQuestTimer("inactivity_task", 900000, Plagueseeker, null, true);
  267.     }
  268.    
  269.     private static void paralyzeAll(boolean val)
  270.     {
  271.         for (Creature creature : PLAGUESEEKER_LAIR.getCharactersInside())
  272.         {
  273.             creature.setIsParalyzed(val);
  274.             if (val)
  275.                 creature.broadcastPacket(new StopMove(creature));
  276.         }
  277.        
  278.     }
  279.    
  280.     private void startSpecialCamera(boolean halfHp)
  281.     {
  282.         if (halfHp)
  283.         {
  284.             startQuestTimer("mass_kill_camera_1", 1000, Plagueseeker, null, false);
  285.             startQuestTimer("mass_kill_camera_2", 5900, Plagueseeker, null, false);
  286.             startQuestTimer("mass_kill_camera_3", 10800, Plagueseeker, null, false);
  287.             startQuestTimer("mass_kill_camera_4", 11700, Plagueseeker, null, false);
  288.             startQuestTimer("mass_kill_camera_5", 12600, Plagueseeker, null, false);
  289.            
  290.             // kill them
  291.             startQuestTimer("mass_kill", 13500, Plagueseeker, null, false);
  292.            
  293.             startQuestTimer("mass_kill_camera_6", 13500, Plagueseeker, null, false);
  294.             startQuestTimer("mass_kill_camera_7", 14400, Plagueseeker, null, false);
  295.             startQuestTimer("mass_kill_camera_8", 15300, Plagueseeker, null, false);
  296.         }
  297.         else
  298.         {
  299.             startQuestTimer("camera_1", 1000, Plagueseeker, null, false);
  300.             startQuestTimer("camera_2", 3400, Plagueseeker, null, false);
  301.             startQuestTimer("camera_3", 5800, Plagueseeker, null, false);
  302.             startQuestTimer("camera_4", 8200, Plagueseeker, null, false);
  303.             startQuestTimer("camera_5", 10600, Plagueseeker, null, false);
  304.             startQuestTimer("camera_6", 12200, Plagueseeker, null, false);
  305.             startQuestTimer("camera_7", 13800, Plagueseeker, null, false);
  306.             startQuestTimer("camera_8", 15400, Plagueseeker, null, false);
  307.             startQuestTimer("camera_9", 17000, Plagueseeker, null, false);
  308.             startQuestTimer("camera_10", 18600, Plagueseeker, null, false);
  309.             startQuestTimer("camera_11", 20200, Plagueseeker, null, false);
  310.             startQuestTimer("camera_12", 21800, Plagueseeker, null, false);
  311.         }
  312.     }
  313.    
  314.     private void broadcastCamera(String event)
  315.     {
  316.         if (event.equalsIgnoreCase("camera_1"))
  317.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 400, 0, 25, 2500, 2500, 0, 0, 0, 0));
  318.         else if (event.equalsIgnoreCase("camera_2"))
  319.         {
  320.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 400, 0, 15, 2500, 2500, 0, 0, 0, 0));
  321.             PLAGUESEEKER_LAIR.broadcastPacket(new ExShowScreenMessage("Your text here", 2500, SMPOS.TOP_CENTER, false));
  322.         }
  323.         else if (event.equalsIgnoreCase("camera_3"))
  324.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 400, 0, 10, 2500, 2500, 0, 0, 0, 0));
  325.         else if (event.equalsIgnoreCase("camera_4"))
  326.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 0, 20, 2500, 2500, 0, 0, 0, 0));
  327.         else if (event.equalsIgnoreCase("camera_5"))
  328.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 50, 20, 1700, 1700, 0, 0, 1, 0));
  329.         else if (event.equalsIgnoreCase("camera_6"))
  330.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 100, 20, 1700, 1700, 0, 0, 1, 0));
  331.         else if (event.equalsIgnoreCase("camera_7"))
  332.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 150, 20, 1700, 1700, 0, 0, 1, 0));
  333.         else if (event.equalsIgnoreCase("camera_8"))
  334.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 200, 20, 1700, 1700, 0, 0, 1, 0));
  335.         else if (event.equalsIgnoreCase("camera_9"))
  336.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 250, 20, 1700, 1700, 0, 0, 1, 0));
  337.         else if (event.equalsIgnoreCase("camera_10"))
  338.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 300, 20, 1700, 1700, 0, 0, 1, 0));
  339.         else if (event.equalsIgnoreCase("camera_11"))
  340.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 350, 20, 1700, 1700, 0, 0, 1, 0));
  341.         else if (event.equalsIgnoreCase("camera_12"))
  342.         {
  343.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 0, 20, 1700, 1700, 0, 0, 0, 0));
  344.             ThreadPool.schedule(() -> runTasks(), 1700);
  345.         }
  346.        
  347.         else if (event.equalsIgnoreCase("mass_kill_camera_1"))
  348.         {
  349.             Plagueseeker.setIsInvul(true);
  350.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 450, 0, 20, 5000, 5000, 0, 0, 1, 0));
  351.         }
  352.        
  353.         else if (event.equalsIgnoreCase("mass_kill_camera_2"))
  354.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 750, 0, 50, 5000, 5000, 0, 0, 1, 0));
  355.        
  356.         else if (event.equalsIgnoreCase("mass_kill_camera_3"))
  357.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 1100, 50, 50, 1000, 1000, 0, 0, 0, 0));
  358.        
  359.         else if (event.equalsIgnoreCase("mass_kill_camera_4"))
  360.         {
  361.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 700, 100, 50, 1000, 1000, 0, 0, 0, 0));
  362.             PLAGUESEEKER_LAIR.broadcastPacket(new Earthquake(Plagueseeker.getX(), Plagueseeker.getY(), Plagueseeker.getZ(), 50, 4));
  363.         }
  364.        
  365.         else if (event.equalsIgnoreCase("mass_kill_camera_5"))
  366.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 700, 150, 50, 1000, 1000, 0, 0, 0, 0));
  367.        
  368.         else if (event.equalsIgnoreCase("mass_kill_camera_6"))
  369.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 700, 200, 50, 1000, 1000, 0, 0, 0, 0));
  370.        
  371.         else if (event.equalsIgnoreCase("mass_kill_camera_7"))
  372.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 700, 250, 50, 1000, 1000, 0, 0, 0, 0));
  373.        
  374.         else if (event.equalsIgnoreCase("mass_kill_camera_8"))
  375.         {
  376.             PLAGUESEEKER_LAIR.broadcastPacket(new SpecialCamera(Plagueseeker.getObjectId(), 700, 300, 50, 1000, 1000, 0, 0, 0, 0));
  377.             paralyzeAll(false);
  378.             Plagueseeker.setIsInvul(false);
  379.         }
  380.     }
  381. }
Add Comment
Please, Sign In to add comment