From d941b8db316a16d0c6b5d699b1dae883c735d0f4 Mon Sep 17 00:00:00 2001
From: Maneco2 <maneco_1@hotmail.com>
Date: Sat, 9 Jan 2021 20:17:18 -0300
Subject: [PATCH] Necromancer Of The Valley must be spawn minion one time only

-- Check skill range area player
---
 .../ai/individual/NecromancerOfTheValley.java | 53 +++++++++++++------
 1 file changed, 36 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/l2jserver/datapack/ai/individual/NecromancerOfTheValley.java b/src/main/java/com/l2jserver/datapack/ai/individual/NecromancerOfTheValley.java
index db1652838f..6c3df39fd8 100644
--- a/src/main/java/com/l2jserver/datapack/ai/individual/NecromancerOfTheValley.java
+++ b/src/main/java/com/l2jserver/datapack/ai/individual/NecromancerOfTheValley.java
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2004-2020 L2J DataPack
+ * Copyright © 2004-2021 L2J DataPack
  * 
  * This file is part of L2J DataPack.
  * 
@@ -19,6 +19,7 @@
 package com.l2jserver.datapack.ai.individual;
 
 import com.l2jserver.datapack.ai.npc.AbstractNpcAI;
+import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
@@ -27,44 +28,62 @@ import com.l2jserver.gameserver.model.skills.Skill;
 /**
  * Necromancer of the Valley AI.
  * @author Adry_85
- * @since 2.6.0.0
+ * @author Maneco2
+ * @since 2.6.2.0
  */
-public class NecromancerOfTheValley extends AbstractNpcAI {
+public class NecromancerOfTheValley extends AbstractNpcAI
+{
 	// NPCs
 	private static final int EXPLODING_ORC_GHOST = 22818;
 	private static final int WRATHFUL_ORC_GHOST = 22819;
 	private static final int NECROMANCER_OF_THE_VALLEY = 22858;
 	// Skill
 	private static final SkillHolder SELF_DESTRUCTION = new SkillHolder(6850);
+	// Variable
+	private static final String MID_HP_FLAG = "MID_HP_FLAG";
 	// Misc
 	private static final double HP_PERCENTAGE = 0.60;
 	
-	public NecromancerOfTheValley() {
+	public NecromancerOfTheValley()
+	{
 		super(NecromancerOfTheValley.class.getSimpleName(), "ai/individual");
 		addAttackId(NECROMANCER_OF_THE_VALLEY);
+		addSpawnId(EXPLODING_ORC_GHOST);
 		addSpellFinishedId(EXPLODING_ORC_GHOST);
 	}
 	
 	@Override
-	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon) {
-		if ((npc.getCurrentHp() < (npc.getMaxHp() * HP_PERCENTAGE))) {
-			if (getRandom(10) < 1) {
-				if (getRandomBoolean()) {
-					final L2Npc explodingOrcGhost = addSpawn(EXPLODING_ORC_GHOST, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0, false);
-					addAttackDesire(explodingOrcGhost, attacker, 10000);
-					addSkillCastDesire(npc, attacker, SELF_DESTRUCTION, 999999999L);
-				} else {
-					final L2Npc wrathfulOrcGhost = addSpawn(WRATHFUL_ORC_GHOST, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0, false);
-					addAttackDesire(wrathfulOrcGhost, attacker, 10000);
-				}
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
+	{
+		if (npc.getCurrentHp() < (npc.getMaxHp() * HP_PERCENTAGE))
+		{
+			if ((getRandom(100) < 10) && !npc.getVariables().getBoolean(MID_HP_FLAG, false))
+			{
+				npc.getVariables().set(MID_HP_FLAG, true);
+				addAttackDesire(addSpawn((getRandomBoolean() ? EXPLODING_ORC_GHOST : WRATHFUL_ORC_GHOST), npc, true), attacker);
 			}
 		}
 		return super.onAttack(npc, attacker, damage, isSummon);
 	}
 	
 	@Override
-	public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill) {
-		if ((skill == SELF_DESTRUCTION.getSkill()) && (npc != null) && !npc.isDead()) {
+	public String onSpawn(L2Npc npc)
+	{
+		for (L2Character obj : npc.getKnownList().getKnownCharactersInRadius(200))
+		{
+			if (obj.isPlayer() && !obj.isDead())
+			{
+				addSkillCastDesire(npc, obj, SELF_DESTRUCTION, 1000000L);
+			}
+		}
+		return super.onSpawn(npc);
+	}
+	
+	@Override
+	public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
+	{
+		if ((skill == SELF_DESTRUCTION.getSkill()) && (npc != null) && !npc.isDead())
+		{
 			npc.doDie(player);
 		}
 		return super.onSpellFinished(npc, player, skill);
-- 
GitLab