From 628759e2e558e995d8d31d309742ae7e74582cf6 Mon Sep 17 00:00:00 2001
From: St3eT <St3eT@users.noreply.github.com>
Date: Sat, 21 Jun 2014 15:21:42 +0000
Subject: [PATCH] BETA: Implementing  '''Sin Eater''' AI, also dp-part for
 [L6567].

---
 L2J_DataPack_BETA/dist/game/data/scripts.cfg  |   1 +
 .../scripts/ai/individual/DivineBeast.java    |   4 +-
 .../data/scripts/ai/individual/SinEater.java  | 178 ++++++++++++++++++
 .../scripts/ai/npc/Minigame/Minigame.java     |   9 +-
 .../actionhandlers/L2PetInstanceAction.java   |   6 +
 .../actionhandlers/L2SummonAction.java        |   5 +
 .../handlers/effecthandlers/SoulEating.java   |  12 +-
 .../effecthandlers/TriggerSkillByDamage.java  |  15 +-
 8 files changed, 199 insertions(+), 31 deletions(-)
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java

diff --git a/L2J_DataPack_BETA/dist/game/data/scripts.cfg b/L2J_DataPack_BETA/dist/game/data/scripts.cfg
index 637e134b63..f0f42cdab3 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts.cfg
+++ b/L2J_DataPack_BETA/dist/game/data/scripts.cfg
@@ -156,6 +156,7 @@ ai/individual/Maguen.java
 ai/individual/Orfen.java
 ai/individual/QueenAnt.java
 ai/individual/QueenShyeed.java
+ai/individual/SinEater.java
 ai/individual/SinWardens.java
 ai/individual/Valakas.java
 
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java
index 52955d8e37..a23aa77b30 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java
@@ -37,11 +37,11 @@ public final class DivineBeast extends AbstractNpcAI
 	private DivineBeast()
 	{
 		super(DivineBeast.class.getSimpleName(), "ai");
-		addSummonId(DIVINE_BEAST);
+		addSummonSpawnId(DIVINE_BEAST);
 	}
 	
 	@Override
-	public void onSummon(L2Summon summon)
+	public void onSummonSpawn(L2Summon summon)
 	{
 		startQuestTimer("VALIDATE_TRANSFORMATION", CHECK_TIME, null, summon.getActingPlayer(), true);
 	}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java
new file mode 100644
index 0000000000..cf46097096
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2004-2014 L2J DataPack
+ * 
+ * This file is part of L2J DataPack.
+ * 
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package ai.individual;
+
+import ai.npc.AbstractNpcAI;
+
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.L2Summon;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.ListenerRegisterType;
+import com.l2jserver.gameserver.model.events.annotations.Id;
+import com.l2jserver.gameserver.model.events.annotations.RegisterEvent;
+import com.l2jserver.gameserver.model.events.annotations.RegisterType;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureAttacked;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureKill;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.NpcSay;
+
+/**
+ * Sin Eater AI.
+ * @author St3eT.
+ */
+public final class SinEater extends AbstractNpcAI
+{
+	// NPCs
+	private static final int SIN_EATER = 12564;
+	
+	private SinEater()
+	{
+		super(SinEater.class.getSimpleName(), "ai/individual");
+		addSummonSpawnId(SIN_EATER);
+		addSummonTalkId(SIN_EATER);
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equals("2001") && (player != null) && (player.getSummon() != null))
+		{
+			if (getRandom(100) < 30)
+			{
+				final int random = getRandom(100);
+				final L2Summon summon = player.getSummon();
+				
+				if (random < 20)
+				{
+					broadcastSummonSay(summon, NpcStringId.YAWWWWN_ITS_SO_BORING_HERE_WE_SHOULD_GO_AND_FIND_SOME_ACTION);
+				}
+				else if (random < 40)
+				{
+					broadcastSummonSay(summon, NpcStringId.HEY_IF_YOU_CONTINUE_TO_WASTE_TIME_YOU_WILL_NEVER_FINISH_YOUR_PENANCE);
+				}
+				else if (random < 60)
+				{
+					broadcastSummonSay(summon, NpcStringId.I_KNOW_YOU_DONT_LIKE_ME_THE_FEELING_IS_MUTUAL);
+				}
+				else if (random < 80)
+				{
+					broadcastSummonSay(summon, NpcStringId.I_NEED_A_DRINK);
+				}
+				else
+				{
+					broadcastSummonSay(summon, NpcStringId.OH_THIS_IS_DRAGGING_ON_TOO_LONG_AT_THIS_RATE_I_WONT_MAKE_IT_HOME_BEFORE_THE_SEVEN_SEALS_ARE_BROKEN);
+				}
+			}
+			startQuestTimer("2001", 60000, null, player);
+		}
+		return super.onAdvEvent(event, npc, player);
+	}
+	
+	@RegisterEvent(EventType.ON_CREATURE_KILL)
+	@RegisterType(ListenerRegisterType.NPC)
+	@Id(SIN_EATER)
+	public void onCreatureKill(OnCreatureKill event)
+	{
+		final int random = getRandom(100);
+		final L2Summon summon = (L2Summon) event.getTarget();
+		
+		if (random < 30)
+		{
+			broadcastSummonSay(summon, NpcStringId.OH_THIS_IS_JUST_GREAT_WHAT_ARE_YOU_GOING_TO_DO_NOW);
+		}
+		else if (random < 70)
+		{
+			broadcastSummonSay(summon, NpcStringId.YOU_INCONSIDERATE_MORON_CANT_YOU_EVEN_TAKE_CARE_OF_LITTLE_OLD_ME);
+		}
+		else
+		{
+			broadcastSummonSay(summon, NpcStringId.OH_NO_THE_MAN_WHO_EATS_ONES_SINS_HAS_DIED_PENITENCE_IS_FURTHER_AWAY);
+		}
+	}
+	
+	@RegisterEvent(EventType.ON_CREATURE_ATTACKED)
+	@RegisterType(ListenerRegisterType.NPC)
+	@Id(SIN_EATER)
+	public void onCreatureAttacked(OnCreatureAttacked event)
+	{
+		if (getRandom(100) < 30)
+		{
+			final int random = getRandom(100);
+			final L2Summon summon = (L2Summon) event.getTarget();
+			
+			if (random < 35)
+			{
+				broadcastSummonSay(summon, NpcStringId.OH_THAT_SMARTS);
+			}
+			else if (random < 70)
+			{
+				broadcastSummonSay(summon, NpcStringId.HEY_MASTER_PAY_ATTENTION_IM_DYING_OVER_HERE);
+			}
+			else
+			{
+				broadcastSummonSay(summon, NpcStringId.WHAT_HAVE_I_DONE_TO_DESERVE_THIS);
+			}
+		}
+	}
+	
+	@Override
+	public void onSummonSpawn(L2Summon summon)
+	{
+		broadcastSummonSay(summon, getRandomBoolean() ? NpcStringId.HEY_IT_SEEMS_LIKE_YOU_NEED_MY_HELP_DOESNT_IT : NpcStringId.ALMOST_GOT_IT_OUCH_STOP_DAMN_THESE_BLOODY_MANACLES);
+		startQuestTimer("2001", 60000, null, summon.getOwner());
+	}
+	
+	@Override
+	public void onSummonTalk(L2Summon summon)
+	{
+		if (getRandom(100) < 10)
+		{
+			final int random = getRandom(100);
+			
+			if (random < 25)
+			{
+				broadcastSummonSay(summon, NpcStringId.USING_A_SPECIAL_SKILL_HERE_COULD_TRIGGER_A_BLOODBATH);
+			}
+			else if (random < 50)
+			{
+				broadcastSummonSay(summon, NpcStringId.HEY_WHAT_DO_YOU_EXPECT_OF_ME);
+			}
+			else if (random < 75)
+			{
+				broadcastSummonSay(summon, NpcStringId.UGGGGGH_PUSH_ITS_NOT_COMING_OUT);
+			}
+			else
+			{
+				broadcastSummonSay(summon, NpcStringId.AH_I_MISSED_THE_MARK);
+			}
+		}
+	}
+	
+	private void broadcastSummonSay(L2Summon summon, NpcStringId npcstringId)
+	{
+		summon.broadcastPacket(new NpcSay(summon.getObjectId(), Say2.NPC_ALL, summon.getId(), npcstringId));
+	}
+	
+	public static void main(String[] args)
+	{
+		new SinEater();
+	}
+}
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java
index 6e39dc8552..872b04d417 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java
@@ -28,7 +28,6 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.events.EventType;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureSkillUse;
-import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener;
 import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.network.NpcStringId;
@@ -293,13 +292,7 @@ public final class Minigame extends AbstractNpcAI
 								broadcastNpcSay(room.getManager(), Say2.NPC_ALL, NpcStringId.AH_IVE_FAILED_GOING_FURTHER_WILL_BE_DIFFICULT);
 								room.burnThemAll();
 								startQuestTimer("off", 2000, room.getManager(), null);
-								for (AbstractEventListener listener : room.getParticipant().getListeners(EventType.ON_CREATURE_SKILL_USE))
-								{
-									if (listener.getOwner() == room)
-									{
-										listener.unregisterMe();
-									}
-								}
+								room.getParticipant().removeListenerIf(EventType.ON_CREATURE_SKILL_USE, listener -> listener.getOwner() == room);
 								startQuestTimer("end", 4000, room.getManager(), null);
 							}
 							else if (room.getAttemptNumber() < MAX_ATTEMPTS)
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java
index 6c43cfa3f8..6216ee6dbe 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java
@@ -25,8 +25,11 @@ import com.l2jserver.gameserver.enums.InstanceType;
 import com.l2jserver.gameserver.handler.IActionHandler;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
+import com.l2jserver.gameserver.model.events.EventDispatcher;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.PetStatusShow;
 
@@ -94,6 +97,9 @@ public class L2PetInstanceAction implements IActionHandler
 				if (isOwner)
 				{
 					activeChar.sendPacket(new PetStatusShow((L2PetInstance) target));
+					
+					// Notify to scripts
+					EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonTalk((L2Summon) target), (L2Summon) target);
 				}
 				activeChar.updateNotMoveUntil();
 			}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java
index d7f4ee9198..0ee2e13313 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java
@@ -26,6 +26,8 @@ import com.l2jserver.gameserver.handler.IActionHandler;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.events.EventDispatcher;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.PetStatusShow;
@@ -47,6 +49,9 @@ public class L2SummonAction implements IActionHandler
 			activeChar.sendPacket(new PetStatusShow((L2Summon) target));
 			activeChar.updateNotMoveUntil();
 			activeChar.sendPacket(ActionFailed.STATIC_PACKET);
+			
+			// Notify to scripts
+			EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonTalk((L2Summon) target), (L2Summon) target);
 		}
 		else if (activeChar.getTarget() != target)
 		{
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java
index 196423296a..441a277222 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java
@@ -25,9 +25,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.events.EventType;
-import com.l2jserver.gameserver.model.events.impl.character.playable.OnPlayableExpChanged;
 import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener;
-import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -52,13 +50,7 @@ public final class SoulEating extends AbstractEffect
 	{
 		if (info.getEffected().isPlayer())
 		{
-			for (AbstractEventListener listener : info.getEffected().getListeners(EventType.ON_PLAYABLE_EXP_CHANGED))
-			{
-				if (listener.getOwner() == this)
-				{
-					listener.unregisterMe();
-				}
-			}
+			info.getEffected().getListeners(EventType.ON_PLAYABLE_EXP_CHANGED).stream().filter(listener -> listener.getOwner() == this).forEach(AbstractEventListener::unregisterMe);
 		}
 	}
 	
@@ -90,7 +82,7 @@ public final class SoulEating extends AbstractEffect
 	{
 		if (info.getEffected().isPlayer())
 		{
-			info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_PLAYABLE_EXP_CHANGED, (OnPlayableExpChanged event) -> onExperienceReceived(event.getActiveChar(), (event.getNewExp() - event.getOldExp())), this));
+			info.getEffected().removeListenerIf(EventType.ON_PLAYABLE_EXP_CHANGED, listener -> listener.getOwner() == this);
 		}
 	}
 }
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java
index b4b0a3372c..6bf9b0fe11 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java
@@ -27,8 +27,7 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.events.EventType;
-import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamage;
-import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamageReceived;
 import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
@@ -63,7 +62,7 @@ public final class TriggerSkillByDamage extends AbstractEffect
 		_attackerType = params.getEnum("attackerType", InstanceType.class, InstanceType.L2Character);
 	}
 	
-	public void onDamageReceivedEvent(OnCreatureDamage event)
+	public void onDamageReceivedEvent(OnCreatureDamageReceived event)
 	{
 		if (event.isDamageOverTime() || (_chance == 0) || (_skill.getSkillLvl() == 0))
 		{
@@ -112,18 +111,12 @@ public final class TriggerSkillByDamage extends AbstractEffect
 	@Override
 	public void onExit(BuffInfo info)
 	{
-		for (AbstractEventListener listener : info.getEffected().getListeners(EventType.ON_CREATURE_DAMAGE))
-		{
-			if (listener.getOwner() == this)
-			{
-				listener.unregisterMe();
-			}
-		}
+		info.getEffected().removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this);
 	}
 	
 	@Override
 	public void onStart(BuffInfo info)
 	{
-		info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_CREATURE_DAMAGE, (OnCreatureDamage event) -> onDamageReceivedEvent(event), this));
+		info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this));
 	}
 }
-- 
GitLab