فهرست منبع

BETA: DP-Part for [L6552]

Rumen Nikiforov 11 سال پیش
والد
کامیت
795a39a7a0
32فایلهای تغییر یافته به همراه378 افزوده شده و 702 حذف شده
  1. 3 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/AltarsOfSacrifice.java
  2. 2 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/BeastFarm.java
  3. 2 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DenOfEvil.java
  4. 2 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FeedableBeasts.java
  5. 6 7
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/L2AttackableAIScript.java
  6. 2 3
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MonasteryOfSilence.java
  7. 1 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java
  8. 2 3
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java
  9. 2 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SummonMinions.java
  10. 4 4
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/TurekOrcs.java
  11. 2 3
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/VarkaKetra.java
  12. 3 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DarkWaterDragon.java
  13. 3 2
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/QueenAnt.java
  14. 27 39
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Venom/Venom.java
  15. 2 27
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/AbstractNpcAI.java
  16. 81 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/ListenerTest.java
  17. 14 6
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java
  18. 0 453
      L2J_DataPack_BETA/dist/game/data/scripts/custom/Listeners/Listeners.java
  19. 8 8
      L2J_DataPack_BETA/dist/game/data/scripts/features/SkillTransfer/SkillTransfer.java
  20. 6 9
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2NpcAction.java
  21. 4 4
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminCamera.java
  22. 32 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminQuest.java
  23. 5 7
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/ChatLink.java
  24. 14 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java
  25. 15 9
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java
  26. 4 9
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TrapRemove.java
  27. 20 12
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java
  28. 13 4
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/punishmenthandlers/JailHandler.java
  29. 2 5
      L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00464_Oath/Q00464_Oath.java
  30. 45 3
      L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00551_OlympiadStarter/Q00551_OlympiadStarter.java
  31. 25 17
      L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00552_OlympiadVeteran/Q00552_OlympiadVeteran.java
  32. 27 18
      L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00553_OlympiadUndefeated/Q00553_OlympiadUndefeated.java

+ 3 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/AltarsOfSacrifice.java

@@ -20,6 +20,8 @@ package ai.group_template;
 
 import java.util.logging.Level;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.datatables.NpcData;
 import com.l2jserver.gameserver.model.L2Spawn;
@@ -27,13 +29,12 @@ import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.interfaces.ILocational;
-import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script;
 import com.l2jserver.util.Rnd;
 
 /**
  * @author FBIagent, janiko, FinalDestination, lion
  */
-public final class AltarsOfSacrifice extends L2Script
+public final class AltarsOfSacrifice extends AbstractNpcAI
 {
 	private final class Altar
 	{

+ 2 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/BeastFarm.java

@@ -29,7 +29,6 @@ import ai.npc.AbstractNpcAI;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcData;
 import com.l2jserver.gameserver.datatables.SkillData;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
@@ -115,7 +114,8 @@ public class BeastFarm extends AbstractNpcAI
 	private BeastFarm()
 	{
 		super(BeastFarm.class.getSimpleName(), "ai/group_template");
-		registerMobs(FEEDABLE_BEASTS, QuestEventType.ON_KILL, QuestEventType.ON_SKILL_SEE);
+		addSkillSeeId(FEEDABLE_BEASTS);
+		addKillId(FEEDABLE_BEASTS);
 		
 		GrowthCapableMob temp;
 		

+ 2 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DenOfEvil.java

@@ -22,7 +22,6 @@ import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.SkillData;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Character;
@@ -100,7 +99,8 @@ public class DenOfEvil extends AbstractNpcAI
 	private DenOfEvil()
 	{
 		super(DenOfEvil.class.getSimpleName(), "ai/group_template");
-		registerMobs(EYE_IDS, QuestEventType.ON_KILL, QuestEventType.ON_SPAWN);
+		addKillId(EYE_IDS);
+		addSpawnId(EYE_IDS);
 		spawnEyes();
 	}
 	

+ 2 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FeedableBeasts.java

@@ -26,7 +26,6 @@ import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcData;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
@@ -174,7 +173,8 @@ public class FeedableBeasts extends AbstractNpcAI
 	private FeedableBeasts()
 	{
 		super(FeedableBeasts.class.getSimpleName(), "ai/group_template");
-		registerMobs(FEEDABLE_BEASTS, QuestEventType.ON_KILL, QuestEventType.ON_SKILL_SEE);
+		addKillId(FEEDABLE_BEASTS);
+		addSkillSeeId(FEEDABLE_BEASTS);
 		
 		// TODO: no grendels?
 		GrowthCapableMob temp;

+ 6 - 7
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/L2AttackableAIScript.java

@@ -26,7 +26,6 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlEvent;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcData;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
@@ -206,12 +205,12 @@ public final class L2AttackableAIScript extends Quest
 				{
 					if (L2Attackable.class.isAssignableFrom(Class.forName("com.l2jserver.gameserver.model.actor.instance." + t.getType() + "Instance")))
 					{
-						ai.addEventId(QuestEventType.ON_ATTACK, t.getId());
-						ai.addEventId(QuestEventType.ON_KILL, t.getId());
-						ai.addEventId(QuestEventType.ON_SPAWN, t.getId());
-						ai.addEventId(QuestEventType.ON_SKILL_SEE, t.getId());
-						ai.addEventId(QuestEventType.ON_FACTION_CALL, t.getId());
-						ai.addEventId(QuestEventType.ON_AGGRO_RANGE_ENTER, t.getId());
+						ai.addAttackId(t.getId());
+						ai.addKillId(t.getId());
+						ai.addSkillSeeId(t.getId());
+						ai.addSpawnId(t.getId());
+						ai.addFactionCallId(t.getId());
+						ai.addAggroRangeEnterId(t.getId());
 					}
 				}
 				catch (ClassNotFoundException ex)

+ 2 - 3
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MonasteryOfSilence.java

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
@@ -209,9 +208,9 @@ public final class MonasteryOfSilence extends AbstractNpcAI
 	}
 	
 	@Override
-	public boolean onNpcHate(L2Attackable mob, L2Playable playable)
+	public boolean onNpcHate(L2Attackable mob, L2PcInstance player, boolean isSummon)
 	{
-		return playable.getActiveWeaponInstance() != null;
+		return player.getActiveWeaponInstance() != null;
 	}
 	
 	@Override

+ 1 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java

@@ -26,7 +26,6 @@ import java.util.Map;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -83,7 +82,7 @@ public class PolymorphingOnAttack extends AbstractNpcAI
 	private PolymorphingOnAttack()
 	{
 		super(PolymorphingOnAttack.class.getSimpleName(), "ai/group_template");
-		registerMobs(MOBSPAWNS.keySet(), QuestEventType.ON_ATTACK);
+		addAttackId(MOBSPAWNS.keySet());
 	}
 	
 	@Override

+ 2 - 3
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java

@@ -25,7 +25,6 @@ import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.skills.Skill;
@@ -145,9 +144,9 @@ public final class PrisonGuards extends AbstractNpcAI
 	}
 	
 	@Override
-	public boolean onNpcHate(L2Attackable mob, L2Playable playable)
+	public boolean onNpcHate(L2Attackable mob, L2PcInstance player, boolean isSummon)
 	{
-		return playable.isAffectedBySkill(TIMER);
+		return player.isAffectedBySkill(TIMER);
 	}
 	
 	@Override

+ 2 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SummonMinions.java

@@ -30,7 +30,6 @@ import javolution.util.FastSet;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -104,7 +103,8 @@ public class SummonMinions extends AbstractNpcAI
 	private SummonMinions()
 	{
 		super(SummonMinions.class.getSimpleName(), "ai/group_template");
-		registerMobs(MINIONS.keySet(), QuestEventType.ON_ATTACK, QuestEventType.ON_KILL);
+		addAttackId(MINIONS.keySet());
+		addKillId(MINIONS.keySet());
 	}
 	
 	@Override

+ 4 - 4
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/TurekOrcs.java

@@ -21,7 +21,6 @@ package ai.group_template;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.Location;
@@ -45,14 +44,15 @@ public final class TurekOrcs extends AbstractNpcAI
 		20497, // Turek Orc Skirmisher
 		20498, // Turek Orc Supplier
 		20499, // Turek Orc Footman
-		20500
-	// Turek Orc Sentinel
+		20500, // Turek Orc Sentinel
 	};
 	
 	private TurekOrcs()
 	{
 		super(TurekOrcs.class.getSimpleName(), "ai/group_template");
-		registerMobs(MOBS, QuestEventType.ON_ATTACK, QuestEventType.ON_EVENT_RECEIVED, QuestEventType.ON_MOVE_FINISHED);
+		addAttackId(MOBS);
+		addEventReceivedId(MOBS);
+		addMoveFinishedId(MOBS);
 	}
 	
 	@Override

+ 2 - 3
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/VarkaKetra.java

@@ -35,7 +35,6 @@ import ai.npc.AbstractNpcAI;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.util.Util;
@@ -202,9 +201,9 @@ public class VarkaKetra extends AbstractNpcAI
 	}
 	
 	@Override
-	public boolean onNpcHate(L2Attackable mob, L2Playable playable)
+	public boolean onNpcHate(L2Attackable mob, L2PcInstance player, boolean isSummon)
 	{
-		return stopAttack(playable.getActingPlayer(), mob) ? false : super.onNpcHate(mob, playable);
+		return stopAttack(player, mob) ? false : super.onNpcHate(mob, player, isSummon);
 	}
 	
 	private final boolean stopAttack(L2PcInstance player, L2Character monster)

+ 3 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DarkWaterDragon.java

@@ -27,7 +27,6 @@ import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcData;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -60,7 +59,9 @@ public final class DarkWaterDragon extends AbstractNpcAI
 			DETRACTOR1,
 			DETRACTOR2
 		};
-		registerMobs(mobs, QuestEventType.ON_KILL, QuestEventType.ON_SPAWN, QuestEventType.ON_ATTACK);
+		addKillId(mobs);
+		addAttackId(mobs);
+		addSpawnId(mobs);
 		MY_TRACKING_SET.clear();
 		SECOND_SPAWN.clear();
 	}

+ 3 - 2
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/QueenAnt.java

@@ -25,7 +25,6 @@ import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.StatsSet;
@@ -87,7 +86,9 @@ public final class QueenAnt extends AbstractNpcAI
 	private QueenAnt()
 	{
 		super(QueenAnt.class.getSimpleName(), "ai/individual");
-		registerMobs(MOBS, QuestEventType.ON_SPAWN, QuestEventType.ON_KILL, QuestEventType.ON_AGGRO_RANGE_ENTER);
+		addSpawnId(MOBS);
+		addKillId(MOBS);
+		addAggroRangeEnterId(MOBS);
 		addFactionCallId(NURSE);
 		
 		_zone = GrandBossManager.getInstance().getZone(QUEEN_X, QUEEN_Y, QUEEN_Z);

+ 27 - 39
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Venom/Venom.java

@@ -32,12 +32,13 @@ import com.l2jserver.gameserver.model.TeleportWhereType;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.events.impl.sieges.castle.OnCastleSiegeFinish;
+import com.l2jserver.gameserver.model.events.impl.sieges.castle.OnCastleSiegeStart;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.skills.Skill;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
-import com.l2jserver.gameserver.scripting.scriptengine.events.SiegeEvent;
 
 /**
  * Venom AI on Rune Castle.
@@ -110,7 +111,8 @@ public final class Venom extends AbstractNpcAI
 		addAttackId(VENOM);
 		addKillId(VENOM);
 		addAggroRangeEnterId(VENOM);
-		addSiegeNotify();
+		setCastleSiegeStartId(this::onSiegeStart, CASTLE);
+		setCastleSiegeFinishId(this::onSiegeFinish, CASTLE);
 		
 		_massymore = SpawnTable.getInstance().getFirstSpawn(DUNGEON_KEEPER).getLastSpawn();
 		_venom = SpawnTable.getInstance().getFirstSpawn(VENOM).getLastSpawn();
@@ -204,46 +206,32 @@ public final class Venom extends AbstractNpcAI
 		return super.onAggroRangeEnter(npc, player, isSummon);
 	}
 	
-	@Override
-	public boolean onSiegeEvent(SiegeEvent event)
+	public void onSiegeStart(OnCastleSiegeStart event)
 	{
-		if (event.getSiege().getCastle().getResidenceId() == CASTLE)
+		_aggroMode = true;
+		_prisonIsOpen = false;
+		if ((_venom != null) && !_venom.isDead())
 		{
-			if (event.getSiege().getCastle().getIsTimeRegistrationOver() && !event.getSiege().getAttackerClans().isEmpty())
-			{
-				_prisonIsOpen = true;
-				changeLocation(MoveTo.PRISON);
-			}
-			
-			switch (event.getStage())
-			{
-				case START:
-					_aggroMode = true;
-					_prisonIsOpen = false;
-					if ((_venom != null) && !_venom.isDead())
-					{
-						_venom.setCurrentHp(_venom.getMaxHp());
-						_venom.setCurrentMp(_venom.getMaxMp());
-						_venom.enableSkill(VENOM_TELEPORT.getSkill());
-						_venom.enableSkill(RANGE_TELEPORT.getSkill());
-						startQuestTimer("tower_check", 30000, _venom, null, true);
-					}
-					break;
-				case END:
-					_aggroMode = false;
-					if ((_venom != null) && !_venom.isDead())
-					{
-						changeLocation(MoveTo.PRISON);
-						_venom.disableSkill(VENOM_TELEPORT.getSkill(), -1);
-						_venom.disableSkill(RANGE_TELEPORT.getSkill(), -1);
-					}
-					updateStatus(ALIVE);
-					cancelQuestTimer("tower_check", _venom, null);
-					cancelQuestTimer("raid_check", _venom, null);
-					break;
-			}
+			_venom.setCurrentHp(_venom.getMaxHp());
+			_venom.setCurrentMp(_venom.getMaxMp());
+			_venom.enableSkill(VENOM_TELEPORT.getSkill());
+			_venom.enableSkill(RANGE_TELEPORT.getSkill());
+			startQuestTimer("tower_check", 30000, _venom, null, true);
+		}
+	}
+	
+	public void onSiegeFinish(OnCastleSiegeFinish event)
+	{
+		_aggroMode = false;
+		if ((_venom != null) && !_venom.isDead())
+		{
+			changeLocation(MoveTo.PRISON);
+			_venom.disableSkill(VENOM_TELEPORT.getSkill(), -1);
+			_venom.disableSkill(RANGE_TELEPORT.getSkill(), -1);
 		}
-		return true;
+		updateStatus(ALIVE);
+		cancelQuestTimer("tower_check", _venom, null);
+		cancelQuestTimer("raid_check", _venom, null);
 	}
 	
 	@Override

+ 2 - 27
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/AbstractNpcAI.java

@@ -21,23 +21,22 @@ package ai.npc;
 import java.util.logging.Logger;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.serverpackets.NpcSay;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
-import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script;
 import com.l2jserver.gameserver.util.Broadcast;
 
 /**
  * Abstract NPC AI class for datapack based AIs.
  * @author UnAfraid, Zoey76
  */
-public abstract class AbstractNpcAI extends L2Script
+public abstract class AbstractNpcAI extends Quest
 {
 	public Logger _log = Logger.getLogger(getClass().getSimpleName());
 	
@@ -79,30 +78,6 @@ public abstract class AbstractNpcAI extends L2Script
 		addFactionCallId(mobs);
 	}
 	
-	/**
-	 * This is used to register all monsters contained in mobs for a particular script event types defined in types.
-	 * @param mobs
-	 * @param types
-	 */
-	public void registerMobs(int[] mobs, QuestEventType... types)
-	{
-		for (QuestEventType type : types)
-		{
-			addEventId(type, mobs);
-		}
-	}
-	
-	public void registerMobs(Iterable<Integer> mobs, QuestEventType... types)
-	{
-		for (int id : mobs)
-		{
-			for (QuestEventType type : types)
-			{
-				addEventId(type, id);
-			}
-		}
-	}
-	
 	/**
 	 * Broadcasts NpcSay packet to all known players with custom string.
 	 * @param npc

+ 81 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/ListenerTest.java

@@ -0,0 +1,81 @@
+/*
+ * 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.npc;
+
+import java.util.logging.Level;
+
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.annotations.Npc;
+import com.l2jserver.gameserver.model.events.annotations.RegisterEvent;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureKill;
+import com.l2jserver.gameserver.model.events.impl.character.npc.attackable.OnAttackableAttack;
+
+/**
+ * An example usage of Listeners.
+ * @author UnAfraid
+ */
+public class ListenerTest extends AbstractNpcAI
+{
+	private static final int[] ELPIES =
+	{
+		20432,
+		22228
+	};
+	
+	private ListenerTest()
+	{
+		super(ListenerTest.class.getSimpleName(), "ai/npc");
+		
+		// An set function which is a Consumer it has one parameter and doesn't returns anything!
+		setAttackableAttackId(this::onAttackableAttack, ELPIES);
+		
+		// An Add function which is Function it has one parameter and returns either null or a class that extends {@link com.l2jserver.gameserver.model.events.returns.AbstractEventReturn}
+		addCreatureKillId(event ->
+		{
+			System.out.println("on " + event.getClass().getSimpleName() + " executed");
+			return null;
+		}, ELPIES);
+	}
+	
+	/**
+	 * This method will be invoked as soon as an L2Attackable (Rabbits 20432 and 22228) is being attacked from L2PcInstance (a player)
+	 * @param event
+	 */
+	public void onAttackableAttack(OnAttackableAttack event)
+	{
+		_log.log(Level.INFO, getClass().getSimpleName() + ": " + event.getClass().getSimpleName() + " invoked attacker: " + event.getAttacker() + " target: " + event.getTarget() + " damage: " + event.getDamage() + " skill: " + event.getSkill());
+	}
+	
+	/**
+	 * This method will be invoked as soon as L2Attackable (Rabbits 20432 and 22228) are being killed by L2PcInstance (a player)
+	 * @param event
+	 */
+	@RegisterEvent(EventType.ON_CREATURE_KILL)
+	@Npc(20432)
+	@Npc(22228)
+	public void onCreatureKill(OnCreatureKill event)
+	{
+		_log.log(Level.INFO, getClass().getSimpleName() + ": " + event.getClass().getSimpleName() + " invoked attacker: " + event.getAttacker() + " target: " + event.getTarget());
+	}
+	
+	public static void main(String[] args)
+	{
+		new ListenerTest();
+	}
+}

+ 14 - 6
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java

@@ -26,10 +26,13 @@ import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.Location;
 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;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
-import com.l2jserver.gameserver.scripting.scriptengine.events.SkillUseEvent;
 import com.l2jserver.gameserver.util.Util;
 
 /**
@@ -159,7 +162,8 @@ public final class Minigame extends AbstractNpcAI
 					broadcastNpcSay(room.getManager(), Say2.NPC_ALL, NpcStringId.NOW_LIGHT_THE_FURNACES_FIRE);
 					room.burnThemAll();
 					startQuestTimer("off", 2000, npc, null);
-					addSkillUseNotify(room.getParticipant());
+					final ConsumerEventListener listener = new ConsumerEventListener(room.getParticipant(), EventType.ON_CREATURE_SKILL_USE, (OnCreatureSkillUse listenerEvent) -> onSkillUse(listenerEvent), room);
+					room.getParticipant().addListener(listener);
 					room.setCurrentPot(0);
 				}
 				break;
@@ -248,8 +252,7 @@ public final class Minigame extends AbstractNpcAI
 		return super.onSpawn(npc);
 	}
 	
-	@Override
-	public boolean onSkillUse(SkillUseEvent event)
+	public void onSkillUse(OnCreatureSkillUse event)
 	{
 		final MinigameRoom room = getRoomByParticipant((L2PcInstance) event.getCaster());
 		final boolean miniGameStarted = room.getStarted();
@@ -290,7 +293,13 @@ 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);
-								removeSkillUseNotify(room.getParticipant());
+								for (AbstractEventListener listener : room.getParticipant().getListeners(EventType.ON_CREATURE_SKILL_USE))
+								{
+									if (listener.getOwner() == room)
+									{
+										listener.unregisterMe();
+									}
+								}
 								startQuestTimer("end", 4000, room.getManager(), null);
 							}
 							else if (room.getAttemptNumber() < MAX_ATTEMPTS)
@@ -306,7 +315,6 @@ public final class Minigame extends AbstractNpcAI
 				}
 			}
 		}
-		return true;
 	}
 	
 	/**

+ 0 - 453
L2J_DataPack_BETA/dist/game/data/scripts/custom/Listeners/Listeners.java

@@ -1,453 +0,0 @@
-/*
- * 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 custom.Listeners;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.l2jserver.gameserver.datatables.CharNameTable;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.scripting.scriptengine.events.AttackEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.AugmentEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanCreationEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanJoinEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLeaderChangeEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLeaveEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLevelUpEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarehouseAddItemEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarehouseDeleteItemEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarehouseTransferEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.DlgAnswerEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.FortSiegeEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.HennaEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ItemCreateEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ItemDropEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ItemPickupEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.PlayerEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.RequestBypassToServerEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.SiegeEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.SkillUseEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.TransformEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.TvtKillEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.impl.L2Event;
-import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script;
-
-/**
- * An example class of using Listeners.
- * @author UnAfraid
- */
-public final class Listeners extends L2Script
-{
-	private static final Logger _log = Logger.getLogger(Listeners.class.getName());
-	
-	private Listeners()
-	{
-		super(Listeners.class.getSimpleName(), "custom");
-		addLoginLogoutNotify();
-		addClanCreationLevelUpNotify();
-		addFortSiegeNotify();
-		addSiegeNotify();
-		addTvTNotify();
-		addItemAugmentNotify();
-		addItemDropPickupNotify();
-		addHennaNotify();
-		addRequestBypassToServerNotify();
-		addPlayerNotify();
-	}
-	
-	/**
-	 * Fired when a player logs in
-	 * @param player
-	 */
-	@Override
-	public void onPlayerLogin(L2PcInstance player)
-	{
-		_log.log(Level.INFO, "Player " + player.getName() + " just logged in!");
-		List<Integer> items = new ArrayList<>();
-		for (L2ItemInstance item : player.getInventory().getItems())
-		{
-			items.add(item.getId());
-		}
-		addItemTracker(items);
-		addTransformNotify(player);
-		addSkillUseNotify(player);
-		addAttackNotify(player);
-		addDlgAnswerNotify(player);
-	}
-	
-	/**
-	 * Fired when a player logs out
-	 * @param player
-	 */
-	@Override
-	public void onPlayerLogout(L2PcInstance player)
-	{
-		_log.log(Level.INFO, "Player " + player.getName() + " just logged out!");
-		removeTransformNotify(player);
-		removeSkillUseNotify(player);
-		removeAttackNotify(player);
-		removeDlgAnswerNotify(player);
-	}
-	
-	/**
-	 * Fired when a clan is created Register the listener using addClanCreationLevelUpNotify()
-	 * @param event
-	 */
-	@Override
-	public void onClanCreated(ClanCreationEvent event)
-	{
-		_log.log(Level.INFO, "Clan " + event.getClan().getName() + " has been created by " + event.getClan().getLeaderName() + "!");
-	}
-	
-	/**
-	 * Fired when a clan levels up<br>
-	 * Register the listener using addClanCreationLevelUpListener()
-	 * @param event
-	 */
-	@Override
-	public boolean onClanLeveledUp(ClanLevelUpEvent event)
-	{
-		_log.log(Level.INFO, "Clan " + event.getClan().getName() + " has leveled up!");
-		return true;
-	}
-	
-	/**
-	 * Fired when a player joins a clan<br>
-	 * Register the listener with addClanJoinLeaveNotify()<br>
-	 * @param event
-	 */
-	@Override
-	public boolean onClanJoin(ClanJoinEvent event)
-	{
-		_log.log(Level.INFO, "Player " + event.getPlayer().getName() + " has joined clan: " + event.getPlayer().getName() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when a player leaves a clan<br>
-	 * Register the listener with addClanJoinLeaveNotify()<br>
-	 * @param event
-	 */
-	@Override
-	public boolean onClanLeave(ClanLeaveEvent event)
-	{
-		String name = CharNameTable.getInstance().getNameById(event.getPlayerId());
-		_log.log(Level.INFO, "Player " + name + " has leaved clan: " + event.getClan().getName() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when a clan leader is changed for another<br>
-	 * Register the listener with addClanJoinLeaveNotify()<br>
-	 */
-	@Override
-	public boolean onClanLeaderChange(ClanLeaderChangeEvent event)
-	{
-		_log.log(Level.INFO, "Player " + event.getNewLeader().getName() + " become the new leader of clan: " + event.getClan().getName() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when an item is added to a clan warehouse<br>
-	 * Register the listener with addClanWarehouseNotify(L2Clan)
-	 * @param event
-	 */
-	@Override
-	public boolean onClanWarehouseAddItem(ClanWarehouseAddItemEvent event)
-	{
-		_log.log(Level.INFO, "Player " + event.getActor().getName() + " added an item (" + event.getItem() + ") to clan warehouse (" + event.getProcess() + ")!");
-		return true;
-	}
-	
-	/**
-	 * Fired when an item is deleted from a clan warehouse<br>
-	 * Register the listener with addClanWarehouseNotify(L2Clan)
-	 * @param event
-	 */
-	@Override
-	public boolean onClanWarehouseDeleteItem(ClanWarehouseDeleteItemEvent event)
-	{
-		_log.log(Level.INFO, "Player " + event.getActor().getName() + " removed an item (" + event.getItem() + ") from clan warehouse (" + event.getProcess() + ")!");
-		return true;
-	}
-	
-	/**
-	 * Fired when an item is transfered from/to a clan warehouse<br>
-	 * Register the listener with addClanWarehouseNotify(L2Clan)
-	 * @param event
-	 */
-	@Override
-	public boolean onClanWarehouseTransferItem(ClanWarehouseTransferEvent event)
-	{
-		_log.log(Level.INFO, "Player " + event.getActor().getName() + " transfered an item (" + event.getItem() + ") from clan warehouse to " + event.getTarget() + " (" + event.getProcess() + ")!");
-		return true;
-	}
-	
-	/**
-	 * Fired when a clan war starts or ends<br>
-	 * Register the listener witn addClanWarNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onClanWarEvent(ClanWarEvent event)
-	{
-		_log.log(Level.INFO, "Clan " + event.getClan1().getName() + " challanges " + event.getClan2().getName() + " stage: " + event.getStage().toString() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when a fort siege starts or ends<br>
-	 * Register using addFortSiegeNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onFortSiegeEvent(FortSiegeEvent event)
-	{
-		_log.log(Level.INFO, "FortSiege event: " + event.getSiege().getFort().getName() + " " + event.getSiege() + " " + event.getStage().toString() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when a castle siege starts or ends<br>
-	 * Register using addSiegeNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onSiegeEvent(SiegeEvent event)
-	{
-		_log.log(Level.INFO, "Siege event: " + event.getSiege().getCastle().getName() + " " + event.getSiege() + " " + event.getStage().toString() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when the control of a castle changes during a siege<br>
-	 * Register using addSiegeNotify()
-	 * @param event
-	 */
-	@Override
-	public void onCastleControlChange(SiegeEvent event)
-	{
-		_log.log(Level.INFO, "Castle control change: " + event.getSiege().getCastle().getName() + " " + event.getSiege() + "!");
-	}
-	
-	/**
-	 * Notifies of TvT events<br>
-	 * Register using addTvtNotify()
-	 * @param stage
-	 */
-	@Override
-	public void onTvtEvent(EventStage stage)
-	{
-		_log.log(Level.INFO, "TvT event: " + stage.toString() + "!");
-	}
-	
-	/**
-	 * Notifies that a player was killed during TvT<br>
-	 * Register using addTvtNotify()
-	 * @param event
-	 */
-	@Override
-	public void onTvtKill(TvtKillEvent event)
-	{
-		_log.log(Level.INFO, "TvT event killed " + event.getVictim().getName() + " killer " + event.getKiller().getName() + " killer team: " + event.getKillerTeam().getName() + "!");
-	}
-	
-	/**
-	 * triggered when an item is augmented or when the augmentation is removed<br>
-	 * Register using addItemAugmentNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onItemAugment(AugmentEvent event)
-	{
-		_log.log(Level.INFO, "Item (" + event.getItem().getName() + " has been augumented added = " + event.getAugmentation() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when an item is dropped by a player<br>
-	 * Register using addItemDropPickupNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onItemDrop(ItemDropEvent event)
-	{
-		_log.log(Level.INFO, "Item (" + event.getItem().getName() + " has been dropped by (" + event.getDropper().getName() + " ) at: " + event.getLocation() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when an item is picked up by a player<br>
-	 * Register using addItemDropPickupNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onItemPickup(ItemPickupEvent event)
-	{
-		_log.log(Level.INFO, "Item (" + event.getItem().getName() + " has been pickup by (" + event.getPicker().getName() + " ) from: " + event.getLocation() + "!");
-		return true;
-	}
-	
-	/**
-	 * Fired when a player's henna changes (add/remove)<br>
-	 * Register using addHennaNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onHennaModify(HennaEvent event)
-	{
-		_log.log(Level.INFO, "Henna Modify: player: " + event.getPlayer().getName() + " henna: " + event.getHenna().getDyeName() + " added: " + event.isAdd());
-		return true;
-	}
-	
-	/**
-	 * Fired when an item on the item tracker list has an event<br>
-	 * Register using addItemTracker(itemIds)
-	 * @param event
-	 */
-	@Override
-	public void onItemTrackerEvent(L2Event event)
-	{
-		// _log.log(Level.INFO, "ItemTrackerEvent: " + event.getName() + " has been " + event + " owner: " + player + " target: " + target);
-		// TODO: Fix it?
-	}
-	
-	/**
-	 * Fired when an item is created<br>
-	 * Register using addNewItemNotify(itemIds)
-	 * @param event
-	 */
-	@Override
-	public boolean onItemCreate(ItemCreateEvent event)
-	{
-		_log.log(Level.INFO, "ItemTrackerEvent: " + event.getItemId() + " has been created owner: " + event.getPlayer().getName());
-		return true;
-	}
-	
-	/**
-	 * Fired when a player transforms/untransforms<br>
-	 * Register using addTransformNotify(player)
-	 * @param event
-	 */
-	@Override
-	public boolean onPlayerTransform(TransformEvent event)
-	{
-		_log.log(Level.INFO, "Player (" + event.getPlayer() + ") has been transformed to " + event.getTransformation().toString() + " transform: " + event.isTransforming());
-		return true;
-	}
-	
-	/**
-	 * Fired when a L2Character registered with addAttackNotify is either attacked or attacks another L2Character
-	 * @param event
-	 */
-	@Override
-	public boolean onAttack(AttackEvent event)
-	{
-		_log.log(Level.INFO, event.getTarget() + " has been attacked by " + event.getAttacker());
-		return true;
-	}
-	
-	/**
-	 * Fired when a SKillUseListener gets triggered.<br>
-	 * Register using addSkillUseNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onSkillUse(SkillUseEvent event)
-	{
-		_log.log(Level.INFO, event.getSkill() + " has been used by " + event.getCaster());
-		return true;
-	}
-	
-	/**
-	 * Fired when client answer on dialog request<br>
-	 * Register using addDlgAnswerNotify()
-	 * @param event
-	 */
-	@Override
-	public boolean onDlgAnswer(DlgAnswerEvent event)
-	{
-		_log.log(Level.INFO, event.getActiveChar() + " has been answered on " + event.getMessageId() + " with " + event.getAnswer() + " requester: " + event.getRequesterId());
-		return true;
-	}
-	
-	/**
-	 * Fired when client answer on dialog request<br>
-	 * Register using addDlgAnswerNotify()
-	 * @param event
-	 */
-	@Override
-	protected void onRequestBypassToServer(RequestBypassToServerEvent event)
-	{
-		_log.log(Level.INFO, event.getActiveChar() + " has sent command to server: " + event.getCommand());
-	}
-	
-	/**
-	 * Fired when client select a player<br>
-	 * Register using addPlayerNotify()
-	 * @param event
-	 */
-	@Override
-	protected void onCharSelect(PlayerEvent event)
-	{
-		_log.log(Level.INFO, event.getClient() + " has selected char: " + event.getName());
-	}
-	
-	/**
-	 * Fired when client create a character<br>
-	 * Register using addPlayerNotify()
-	 * @param event
-	 */
-	@Override
-	protected void onCharCreate(PlayerEvent event)
-	{
-		_log.log(Level.INFO, event.getClient() + " has created char: " + event.getName());
-	}
-	
-	/**
-	 * Fired when client select a character for delete<br>
-	 * Register using addPlayerNotify()
-	 * @param event
-	 */
-	@Override
-	protected void onCharDelete(PlayerEvent event)
-	{
-		_log.log(Level.INFO, event.getClient() + " has deleted char: " + event.getName());
-	}
-	
-	/**
-	 * Fired when client select a character for restore<br>
-	 * Register using addPlayerNotify()
-	 * @param event
-	 */
-	@Override
-	protected void onCharRestore(PlayerEvent event)
-	{
-		_log.log(Level.INFO, event.getClient() + " has restored char: " + event.getName());
-	}
-	
-	public static void main(String[] args)
-	{
-		new Listeners();
-	}
-}

+ 8 - 8
L2J_DataPack_BETA/dist/game/data/scripts/features/SkillTransfer/SkillTransfer.java

@@ -18,6 +18,8 @@
  */
 package features.SkillTransfer;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ClassListData;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
@@ -25,17 +27,16 @@ import com.l2jserver.gameserver.enums.IllegalActionPunishmentType;
 import com.l2jserver.gameserver.model.L2SkillLearn;
 import com.l2jserver.gameserver.model.PcCondOverride;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.skills.Skill;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ProfessionChangeEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script;
 import com.l2jserver.gameserver.util.Util;
 
 /**
  * Skill Transfer feature.
  * @author Zoey76
  */
-public final class SkillTransfer extends L2Script
+public final class SkillTransfer extends AbstractNpcAI
 {
 	private static final String HOLY_POMANDER = "HOLY_POMANDER_";
 	private static final ItemHolder[] PORMANDERS =
@@ -50,15 +51,14 @@ public final class SkillTransfer extends L2Script
 	
 	private SkillTransfer()
 	{
-		super(-1, SkillTransfer.class.getSimpleName(), "features");
-		addProfessionChangeNotify(null);
+		super(SkillTransfer.class.getSimpleName(), "features");
+		setPlayerProfessionChangeId(this::onProfessionChange);
 		setOnEnterWorld(Config.SKILL_CHECK_ENABLE);
 	}
 	
-	@Override
-	public void onProfessionChange(ProfessionChangeEvent event)
+	public void onProfessionChange(OnPlayerProfessionChange event)
 	{
-		final L2PcInstance player = event.getPlayer();
+		final L2PcInstance player = event.getActiveChar();
 		final int index = getTransferClassIndex(player);
 		if (index < 0)
 		{

+ 6 - 9
L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2NpcAction.java

@@ -18,19 +18,18 @@
  */
 package handlers.actionhandlers;
 
-import java.util.List;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.enums.InstanceType;
-import com.l2jserver.gameserver.enums.QuestEventType;
 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.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.L2Event;
-import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.events.EventDispatcher;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcFirstTalk;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.MoveToPawn;
 import com.l2jserver.util.Rnd;
@@ -119,15 +118,13 @@ public class L2NpcAction implements IActionHandler
 					}
 					else
 					{
-						List<Quest> qlsa = npc.getTemplate().getEventQuests(QuestEventType.QUEST_START);
-						List<Quest> qlst = npc.getTemplate().getEventQuests(QuestEventType.ON_FIRST_TALK);
-						if ((qlsa != null) && !qlsa.isEmpty())
+						if (npc.hasListener(EventType.ON_NPC_QUEST_START))
 						{
 							activeChar.setLastQuestNpcObject(target.getObjectId());
 						}
-						if ((qlst != null) && (qlst.size() == 1))
+						if (npc.hasListener(EventType.ON_NPC_FIRST_TALK))
 						{
-							qlst.get(0).notifyFirstTalk(npc, activeChar);
+							EventDispatcher.getInstance().notifyEventAsync(new OnNpcFirstTalk(npc, activeChar), npc);
 						}
 						else
 						{

+ 4 - 4
L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminCamera.java

@@ -21,7 +21,7 @@ package handlers.admincommandhandlers;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.events.AbstractScript;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
 /**
@@ -57,7 +57,7 @@ public class AdminCamera implements IAdminCommandHandler
 					activeChar.sendMessage("Usage: //cam force angle1 angle2 time range duration relYaw relPitch isWide relAngle");
 					return false;
 				}
-				Quest.specialCamera(activeChar, target, Integer.parseInt(com[1]), Integer.parseInt(com[2]), Integer.parseInt(com[3]), Integer.parseInt(com[4]), Integer.parseInt(com[5]), Integer.parseInt(com[6]), Integer.parseInt(com[7]), Integer.parseInt(com[8]), Integer.parseInt(com[9]), Integer.parseInt(com[10]));
+				AbstractScript.specialCamera(activeChar, target, Integer.parseInt(com[1]), Integer.parseInt(com[2]), Integer.parseInt(com[3]), Integer.parseInt(com[4]), Integer.parseInt(com[5]), Integer.parseInt(com[6]), Integer.parseInt(com[7]), Integer.parseInt(com[8]), Integer.parseInt(com[9]), Integer.parseInt(com[10]));
 				break;
 			}
 			case "admin_camex":
@@ -67,7 +67,7 @@ public class AdminCamera implements IAdminCommandHandler
 					activeChar.sendMessage("Usage: //camex force angle1 angle2 time duration relYaw relPitch isWide relAngle");
 					return false;
 				}
-				Quest.specialCameraEx(activeChar, target, Integer.parseInt(com[1]), Integer.parseInt(com[2]), Integer.parseInt(com[3]), Integer.parseInt(com[4]), Integer.parseInt(com[5]), Integer.parseInt(com[6]), Integer.parseInt(com[7]), Integer.parseInt(com[8]), Integer.parseInt(com[9]));
+				AbstractScript.specialCameraEx(activeChar, target, Integer.parseInt(com[1]), Integer.parseInt(com[2]), Integer.parseInt(com[3]), Integer.parseInt(com[4]), Integer.parseInt(com[5]), Integer.parseInt(com[6]), Integer.parseInt(com[7]), Integer.parseInt(com[8]), Integer.parseInt(com[9]));
 				break;
 			}
 			case "admin_cam3":
@@ -77,7 +77,7 @@ public class AdminCamera implements IAdminCommandHandler
 					activeChar.sendMessage("Usage: //cam3 force angle1 angle2 time range duration relYaw relPitch isWide relAngle unk");
 					return false;
 				}
-				Quest.specialCamera3(activeChar, target, Integer.parseInt(com[1]), Integer.parseInt(com[2]), Integer.parseInt(com[3]), Integer.parseInt(com[4]), Integer.parseInt(com[5]), Integer.parseInt(com[6]), Integer.parseInt(com[7]), Integer.parseInt(com[8]), Integer.parseInt(com[9]), Integer.parseInt(com[10]), Integer.parseInt(com[11]));
+				AbstractScript.specialCamera3(activeChar, target, Integer.parseInt(com[1]), Integer.parseInt(com[2]), Integer.parseInt(com[3]), Integer.parseInt(com[4]), Integer.parseInt(com[5]), Integer.parseInt(com[6]), Integer.parseInt(com[7]), Integer.parseInt(com[8]), Integer.parseInt(com[9]), Integer.parseInt(com[10]), Integer.parseInt(com[11]));
 				break;
 			}
 		}

+ 32 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminQuest.java

@@ -21,16 +21,17 @@ package handlers.admincommandhandlers;
 import java.io.File;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Set;
 
 import javax.script.ScriptException;
 
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 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.ListenerRegisterType;
+import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestTimer;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
@@ -199,16 +200,25 @@ public class AdminQuest implements IAdminCommandHandler
 				msg.setFile(activeChar.getHtmlPrefix(), "data/html/admin/npc-quests.htm");
 				StringBuilder sb = new StringBuilder();
 				Set<String> questset = new HashSet<>();
-				for (Entry<QuestEventType, List<Quest>> quests : npc.getTemplate().getEventQuests().entrySet())
+				for (EventType type : EventType.values())
 				{
-					for (Quest quest : quests.getValue())
+					for (AbstractEventListener listener : npc.getListeners(type))
 					{
-						if (questset.contains(quest.getName()))
+						if (listener.getOwner() instanceof Quest)
 						{
-							continue;
+							final Quest quest = (Quest) listener.getOwner();
+							if (questset.contains(quest.getName()))
+							{
+								continue;
+							}
+							questset.add(quest.getName());
+							if (quest.getListeners().size() > 20)
+							{
+								sb.append("<tr><td colspan=\"4\">" + quest.getName() + " - " + quest.getListeners().size() + " listeners.</td></tr>");
+								continue;
+							}
+							sb.append("<tr><td colspan=\"4\"><font color=\"LEVEL\"><a action=\"bypass -h admin_quest_info " + quest.getName() + "\">" + quest.getName() + "</a></font></td></tr>");
 						}
-						questset.add(quest.getName());
-						sb.append("<tr><td colspan=\"4\"><font color=\"LEVEL\"><a action=\"bypass -h admin_quest_info " + quest.getName() + "\">" + quest.getName() + "</a></font></td></tr>");
 					}
 				}
 				msg.replace("%quests%", sb.toString());
@@ -237,17 +247,28 @@ public class AdminQuest implements IAdminCommandHandler
 				{
 					return false;
 				}
+				if (quest.getListeners().size() > 20)
+				{
+					return false;
+				}
 				L2Npc npc = L2Npc.class.cast(activeChar.getTarget());
 				StringBuilder sb = new StringBuilder();
 				final NpcHtmlMessage msg = new NpcHtmlMessage(0, 1);
 				msg.setFile(activeChar.getHtmlPrefix(), "data/html/admin/npc-quests.htm");
 				String events = "", npcs = "", items = "", timers = "";
 				
-				for (Entry<QuestEventType, List<Quest>> entry : npc.getTemplate().getEventQuests().entrySet())
+				for (EventType type : EventType.values())
 				{
-					if (entry.getValue().contains(quest))
+					for (AbstractEventListener listener : npc.getListeners(type))
 					{
-						events += ", " + entry.getKey().name();
+						if (listener.getOwner() == quest)
+						{
+							events += ", " + type.name();
+							for (int npcId : quest.getRegisteredIds(ListenerRegisterType.NPC))
+							{
+								npcs += ", " + npcId;
+							}
+						}
 					}
 				}
 				
@@ -256,14 +277,6 @@ public class AdminQuest implements IAdminCommandHandler
 					events = events.substring(2);
 				}
 				
-				if (quest.getQuestInvolvedNpcs().size() < 100)
-				{
-					for (int npcId : quest.getQuestInvolvedNpcs())
-					{
-						npcs += ", " + npcId;
-					}
-				}
-				
 				if (!npcs.isEmpty())
 				{
 					npcs = npcs.substring(2);

+ 5 - 7
L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/ChatLink.java

@@ -18,14 +18,13 @@
  */
 package handlers.bypasshandlers;
 
-import java.util.List;
-
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.handler.IBypassHandler;
 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.quest.Quest;
+import com.l2jserver.gameserver.model.events.EventDispatcher;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcFirstTalk;
 
 public class ChatLink implements IBypassHandler
 {
@@ -53,10 +52,9 @@ public class ChatLink implements IBypassHandler
 		}
 		
 		final L2Npc npc = (L2Npc) target;
-		final List<Quest> firstTalk = npc.getTemplate().getEventQuests(QuestEventType.ON_FIRST_TALK);
-		if ((val == 0) && (firstTalk != null) && (firstTalk.size() == 1))
+		if ((val == 0) && npc.hasListener(EventType.ON_NPC_FIRST_TALK))
 		{
-			firstTalk.get(0).notifyFirstTalk(npc, activeChar);
+			EventDispatcher.getInstance().notifyEventAsync(new OnNpcFirstTalk(npc, activeChar), npc);
 		}
 		else
 		{

+ 14 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java

@@ -24,12 +24,13 @@ import javolution.util.FastList;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.cache.HtmCache;
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.handler.IBypassHandler;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 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.events.EventType;
+import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.quest.State;
@@ -178,13 +179,12 @@ public class QuestLink implements IBypassHandler
 					}
 				}
 				// check for start point
-				List<Quest> qlst = npc.getTemplate().getEventQuests(QuestEventType.QUEST_START);
-				
-				if ((qlst != null) && !qlst.isEmpty())
+				for (AbstractEventListener listener : npc.getListeners(EventType.ON_NPC_QUEST_START))
 				{
-					for (Quest temp : qlst)
+					if (listener.getOwner() instanceof Quest)
 					{
-						if (temp == q)
+						final Quest quest = (Quest) listener.getOwner();
+						if (quest == q)
 						{
 							qs = q.newQuestState(player);
 							break;
@@ -198,15 +198,15 @@ public class QuestLink implements IBypassHandler
 			content = Quest.getNoQuestMsg(player); // no quests found
 		}
 		
-		if (qs != null)
+		if ((q != null) && (qs != null))
 		{
 			// If the quest is already started, no need to show a window
-			if (!qs.getQuest().notifyTalk(npc, qs))
+			if (!q.notifyTalk(npc, player))
 			{
 				return;
 			}
 			
-			questId = qs.getQuest().getName();
+			questId = q.getName();
 			String stateId = State.getStateName(qs.getState());
 			String path = "data/scripts/quests/" + questId + "/" + stateId + ".htm";
 			content = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), path); // TODO path for quests html
@@ -245,7 +245,6 @@ public class QuestLink implements IBypassHandler
 		List<Quest> options = new FastList<>();
 		
 		QuestState[] awaits = player.getQuestsForTalk(npc.getTemplate().getId());
-		List<Quest> starts = npc.getTemplate().getEventQuests(QuestEventType.QUEST_START);
 		
 		// Quests are limited between 1 and 999 because those are the quests that are supported by the client.
 		// By limiting them there, we are allowed to create custom quests at higher IDs without interfering
@@ -263,16 +262,14 @@ public class QuestLink implements IBypassHandler
 			}
 		}
 		
-		if (starts != null)
+		for (AbstractEventListener listener : npc.getListeners(EventType.ON_NPC_QUEST_START))
 		{
-			for (Quest x : starts)
+			if (listener.getOwner() instanceof Quest)
 			{
-				if (!options.contains(x))
+				final Quest quest = (Quest) listener.getOwner();
+				if (!options.contains(quest) && (quest.getId() > 0) && (quest.getId() < 20000))
 				{
-					if ((x.getId() > 0) && (x.getId() < 20000))
-					{
-						options.add(x);
-					}
+					options.add(quest);
 				}
 			}
 		}

+ 15 - 9
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java

@@ -21,10 +21,13 @@ package handlers.effecthandlers;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Playable;
-import com.l2jserver.gameserver.model.actor.events.listeners.IExperienceReceivedEventListener;
 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;
@@ -34,14 +37,13 @@ import com.l2jserver.gameserver.network.serverpackets.ExSpawnEmitter;
  * Soul Eating effect implementation.
  * @author UnAfraid
  */
-public final class SoulEating extends AbstractEffect implements IExperienceReceivedEventListener
+public final class SoulEating extends AbstractEffect
 {
 	private final int _expNeeded;
 	
 	public SoulEating(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
 		super(attachCond, applyCond, set, params);
-		
 		_expNeeded = params.getInt("expNeeded");
 	}
 	
@@ -50,12 +52,17 @@ public final class SoulEating extends AbstractEffect implements IExperienceRecei
 	{
 		if (info.getEffected().isPlayer())
 		{
-			info.getEffected().getEvents().unregisterListener(this);
+			for (AbstractEventListener listener : info.getEffected().getListeners(EventType.ON_PLAYABLE_EXP_CHANGED))
+			{
+				if (listener.getOwner() == this)
+				{
+					listener.unregisterMe();
+				}
+			}
 		}
 	}
 	
-	@Override
-	public boolean onExperienceReceived(L2Playable playable, long exp)
+	public void onExperienceReceived(L2Playable playable, long exp)
 	{
 		// TODO: Verify logic.
 		if (playable.isPlayer() && (exp >= _expNeeded))
@@ -65,7 +72,7 @@ public final class SoulEating extends AbstractEffect implements IExperienceRecei
 			if (player.getChargedSouls() >= maxSouls)
 			{
 				playable.sendPacket(SystemMessageId.SOUL_CANNOT_BE_ABSORBED_ANYMORE);
-				return true;
+				return;
 			}
 			
 			player.increaseSouls(1);
@@ -76,7 +83,6 @@ public final class SoulEating extends AbstractEffect implements IExperienceRecei
 				player.broadcastPacket(new ExSpawnEmitter(player, npc), 500);
 			}
 		}
-		return true;
 	}
 	
 	@Override
@@ -84,7 +90,7 @@ public final class SoulEating extends AbstractEffect implements IExperienceRecei
 	{
 		if (info.getEffected().isPlayer())
 		{
-			info.getEffected().getEvents().registerListener(this);
+			info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_PLAYABLE_EXP_CHANGED, (OnPlayableExpChanged event) -> onExperienceReceived(event.getActiveChar(), (event.getNewExp() - event.getOldExp())), this));
 		}
 	}
 }

+ 4 - 9
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TrapRemove.java

@@ -18,14 +18,14 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.enums.QuestEventType;
 import com.l2jserver.gameserver.enums.TrapAction;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
 import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.effects.AbstractEffect;
-import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.events.EventDispatcher;
+import com.l2jserver.gameserver.model.events.impl.character.trap.OnTrapAction;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
@@ -84,13 +84,8 @@ public final class TrapRemove extends AbstractEffect
 			return;
 		}
 		
-		if (trap.getTemplate().getEventQuests(QuestEventType.ON_TRAP_ACTION) != null)
-		{
-			for (Quest quest : trap.getTemplate().getEventQuests(QuestEventType.ON_TRAP_ACTION))
-			{
-				quest.notifyTrapAction(trap, info.getEffector(), TrapAction.TRAP_DISARMED);
-			}
-		}
+		// Notify to scripts
+		EventDispatcher.getInstance().notifyEventAsync(new OnTrapAction(trap, info.getEffector(), TrapAction.TRAP_DISARMED), trap);
 		
 		trap.unSummon();
 		if (info.getEffector().isPlayer())

+ 20 - 12
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java

@@ -24,9 +24,12 @@ import com.l2jserver.gameserver.handler.TargetHandler;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.actor.events.listeners.IDamageReceivedEventListener;
 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.listeners.ConsumerEventListener;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.Skill;
@@ -37,7 +40,7 @@ import com.l2jserver.util.Rnd;
  * Trigger Skill By Damage effect implementation.
  * @author UnAfraid
  */
-public final class TriggerSkillByDamage extends AbstractEffect implements IDamageReceivedEventListener
+public final class TriggerSkillByDamage extends AbstractEffect
 {
 	private final int _minAttackerLevel;
 	private final int _maxAttackerLevel;
@@ -60,10 +63,9 @@ public final class TriggerSkillByDamage extends AbstractEffect implements IDamag
 		_attackerType = params.getEnum("attackerType", InstanceType.class, InstanceType.L2Character);
 	}
 	
-	@Override
-	public void onDamageReceivedEvent(L2Character attacker, L2Character target, double damage, Skill skill, boolean crit, boolean damageOverTime)
+	public void onDamageReceivedEvent(OnCreatureDamage event)
 	{
-		if (damageOverTime || (_chance == 0) || (_skill.getSkillLvl() == 0))
+		if (event.isDamageOverTime() || (_chance == 0) || (_skill.getSkillLvl() == 0))
 		{
 			return;
 		}
@@ -75,23 +77,23 @@ public final class TriggerSkillByDamage extends AbstractEffect implements IDamag
 			return;
 		}
 		
-		if (attacker == target)
+		if (event.getAttacker() == event.getTarget())
 		{
 			return;
 		}
 		
-		if ((attacker.getLevel() < _minAttackerLevel) || (attacker.getLevel() > _maxAttackerLevel))
+		if ((event.getAttacker().getLevel() < _minAttackerLevel) || (event.getAttacker().getLevel() > _maxAttackerLevel))
 		{
 			return;
 		}
 		
-		if ((damage < _minDamage) || (Rnd.get(100) > _chance) || !attacker.getInstanceType().isType(_attackerType))
+		if ((event.getDamage() < _minDamage) || (Rnd.get(100) > _chance) || !event.getAttacker().getInstanceType().isType(_attackerType))
 		{
 			return;
 		}
 		
 		final Skill triggerSkill = _skill.getSkill();
-		final L2Object[] targets = targetHandler.getTargetList(triggerSkill, target, false, attacker);
+		final L2Object[] targets = targetHandler.getTargetList(triggerSkill, event.getTarget(), false, event.getAttacker());
 		for (L2Object triggerTarget : targets)
 		{
 			if ((triggerTarget == null) || !triggerTarget.isCharacter())
@@ -102,7 +104,7 @@ public final class TriggerSkillByDamage extends AbstractEffect implements IDamag
 			final L2Character targetChar = (L2Character) triggerTarget;
 			if (!targetChar.isInvul())
 			{
-				target.makeTriggerCast(triggerSkill, targetChar);
+				event.getTarget().makeTriggerCast(triggerSkill, targetChar);
 			}
 		}
 	}
@@ -110,12 +112,18 @@ public final class TriggerSkillByDamage extends AbstractEffect implements IDamag
 	@Override
 	public void onExit(BuffInfo info)
 	{
-		info.getEffected().getEvents().unregisterListener(this);
+		for (AbstractEventListener listener : info.getEffected().getListeners(EventType.ON_CREATURE_DAMAGE))
+		{
+			if (listener.getOwner() == this)
+			{
+				listener.unregisterMe();
+			}
+		}
 	}
 	
 	@Override
 	public void onStart(BuffInfo info)
 	{
-		info.getEffected().getEvents().registerListener(this);
+		info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_CREATURE_DAMAGE, (OnCreatureDamage event) -> onDamageReceivedEvent(event), this));
 	}
 }

+ 13 - 4
L2J_DataPack_BETA/dist/game/data/scripts/handlers/punishmenthandlers/JailHandler.java

@@ -26,6 +26,10 @@ import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.tasks.player.TeleportTask;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
+import com.l2jserver.gameserver.model.events.EventDispatcher;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogin;
+import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener;
 import com.l2jserver.gameserver.model.olympiad.OlympiadManager;
 import com.l2jserver.gameserver.model.punishment.PunishmentTask;
 import com.l2jserver.gameserver.model.punishment.PunishmentType;
@@ -33,17 +37,22 @@ import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.model.zone.type.L2JailZone;
 import com.l2jserver.gameserver.network.L2GameClient;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
-import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerSpawnListener;
 
 /**
  * This class handles jail punishment.
  * @author UnAfraid
  */
-public class JailHandler extends PlayerSpawnListener implements IPunishmentHandler
+public class JailHandler implements IPunishmentHandler
 {
-	@Override
-	public void onPlayerLogin(L2PcInstance activeChar)
+	public JailHandler()
+	{
+		// Register global listener
+		EventDispatcher.getInstance().addListener(new ConsumerEventListener(EventDispatcher.getInstance(), EventType.ON_PLAYER_LOGIN, (OnPlayerLogin event) -> onPlayerLogin(event), this));
+	}
+	
+	public void onPlayerLogin(OnPlayerLogin event)
 	{
+		final L2PcInstance activeChar = event.getActiveChar();
 		if (activeChar.isJailed() && !activeChar.isInsideZone(ZoneId.JAIL))
 		{
 			applyToPlayer(null, activeChar);

+ 2 - 5
L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00464_Oath/Q00464_Oath.java

@@ -85,6 +85,7 @@ public class Q00464_Oath extends Quest
 			addTalkId(npc[0]);
 		}
 		addKillId(MOBS.keySet());
+		addItemTalkId(STRONGBOX);
 		registerQuestItems(BOOK, BOOK2);
 	}
 	
@@ -165,11 +166,7 @@ public class Q00464_Oath extends Quest
 	public String onItemTalk(L2ItemInstance item, L2PcInstance player)
 	{
 		String htmltext = getNoQuestMsg(player);
-		final QuestState st = player.getQuestState(getName());
-		if (st == null)
-		{
-			return htmltext;
-		}
+		final QuestState st = getQuestState(player, true);
 		
 		boolean startQuest = false;
 		switch (st.getState())

+ 45 - 3
L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00551_OlympiadStarter/Q00551_OlympiadStarter.java

@@ -22,6 +22,7 @@ import com.l2jserver.gameserver.enums.QuestType;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.olympiad.CompetitionType;
+import com.l2jserver.gameserver.model.olympiad.Participant;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.quest.State;
@@ -49,7 +50,7 @@ public class Q00551_OlympiadStarter extends Quest
 		addStartNpc(MANAGER);
 		addTalkId(MANAGER);
 		registerQuestItems(CERT_3, CERT_5, CERT_10);
-		setOlympiadUse(true);
+		addOlympiadMatchFinishId();
 	}
 	
 	@Override
@@ -122,11 +123,52 @@ public class Q00551_OlympiadStarter extends Quest
 	}
 	
 	@Override
-	public void onOlympiadWin(L2PcInstance winner, CompetitionType type)
+	public void onOlympiadMatchFinish(Participant winner, Participant looser, CompetitionType type)
 	{
 		if (winner != null)
 		{
-			final QuestState st = winner.getQuestState(getName());
+			final L2PcInstance player = winner.getPlayer();
+			if (player == null)
+			{
+				return;
+			}
+			final QuestState st = player.getQuestState(getName());
+			if ((st != null) && st.isStarted())
+			{
+				final int matches = st.getInt("matches") + 1;
+				switch (matches)
+				{
+					case 3:
+						if (!st.hasQuestItems(CERT_3))
+						{
+							st.giveItems(CERT_3, 1);
+						}
+						break;
+					case 5:
+						if (!st.hasQuestItems(CERT_5))
+						{
+							st.giveItems(CERT_5, 1);
+						}
+						break;
+					case 10:
+						if (!st.hasQuestItems(CERT_10))
+						{
+							st.giveItems(CERT_10, 1);
+						}
+						break;
+				}
+				st.set("matches", String.valueOf(matches));
+			}
+		}
+		
+		if (looser != null)
+		{
+			final L2PcInstance player = looser.getPlayer();
+			if (player == null)
+			{
+				return;
+			}
+			final QuestState st = player.getQuestState(getName());
 			if ((st != null) && st.isStarted())
 			{
 				final int matches = st.getInt("matches") + 1;

+ 25 - 17
L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00552_OlympiadVeteran/Q00552_OlympiadVeteran.java

@@ -22,6 +22,7 @@ import com.l2jserver.gameserver.enums.QuestType;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.olympiad.CompetitionType;
+import com.l2jserver.gameserver.model.olympiad.Participant;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.quest.State;
@@ -48,7 +49,7 @@ public class Q00552_OlympiadVeteran extends Quest
 		addStartNpc(MANAGER);
 		addTalkId(MANAGER);
 		registerQuestItems(TEAM_EVENT_CERTIFICATE, CLASS_FREE_BATTLE_CERTIFICATE, CLASS_BATTLE_CERTIFICATE);
-		setOlympiadUse(true);
+		addOlympiadMatchFinishId();
 	}
 	
 	@Override
@@ -83,11 +84,17 @@ public class Q00552_OlympiadVeteran extends Quest
 	}
 	
 	@Override
-	public void onOlympiadLose(L2PcInstance loser, CompetitionType type)
+	public void onOlympiadMatchFinish(Participant winner, Participant looser, CompetitionType type)
 	{
-		if (loser != null)
+		if (winner != null)
 		{
-			final QuestState st = loser.getQuestState(getName());
+			final L2PcInstance player = winner.getPlayer();
+			if (player == null)
+			{
+				return;
+			}
+			
+			final QuestState st = player.getQuestState(getName());
 			if ((st != null) && st.isStarted())
 			{
 				int matches;
@@ -97,7 +104,7 @@ public class Q00552_OlympiadVeteran extends Quest
 					{
 						matches = st.getInt("classed") + 1;
 						st.set("classed", String.valueOf(matches));
-						if (matches == 5)
+						if ((matches == 5) && !st.hasQuestItems(CLASS_BATTLE_CERTIFICATE))
 						{
 							st.giveItems(CLASS_BATTLE_CERTIFICATE, 1);
 						}
@@ -107,7 +114,7 @@ public class Q00552_OlympiadVeteran extends Quest
 					{
 						matches = st.getInt("nonclassed") + 1;
 						st.set("nonclassed", String.valueOf(matches));
-						if (matches == 5)
+						if ((matches == 5) && !st.hasQuestItems(CLASS_FREE_BATTLE_CERTIFICATE))
 						{
 							st.giveItems(CLASS_FREE_BATTLE_CERTIFICATE, 1);
 						}
@@ -117,7 +124,7 @@ public class Q00552_OlympiadVeteran extends Quest
 					{
 						matches = st.getInt("teams") + 1;
 						st.set("teams", String.valueOf(matches));
-						if (matches == 5)
+						if ((matches == 5) && !st.hasQuestItems(TEAM_EVENT_CERTIFICATE))
 						{
 							st.giveItems(TEAM_EVENT_CERTIFICATE, 1);
 						}
@@ -126,14 +133,15 @@ public class Q00552_OlympiadVeteran extends Quest
 				}
 			}
 		}
-	}
-	
-	@Override
-	public void onOlympiadWin(L2PcInstance winner, CompetitionType type)
-	{
-		if (winner != null)
+		
+		if (looser != null)
 		{
-			final QuestState st = winner.getQuestState(getName());
+			final L2PcInstance player = looser.getPlayer();
+			if (player == null)
+			{
+				return;
+			}
+			final QuestState st = player.getQuestState(getName());
 			if ((st != null) && st.isStarted())
 			{
 				int matches;
@@ -143,7 +151,7 @@ public class Q00552_OlympiadVeteran extends Quest
 					{
 						matches = st.getInt("classed") + 1;
 						st.set("classed", String.valueOf(matches));
-						if ((matches == 5) && !st.hasQuestItems(CLASS_BATTLE_CERTIFICATE))
+						if (matches == 5)
 						{
 							st.giveItems(CLASS_BATTLE_CERTIFICATE, 1);
 						}
@@ -153,7 +161,7 @@ public class Q00552_OlympiadVeteran extends Quest
 					{
 						matches = st.getInt("nonclassed") + 1;
 						st.set("nonclassed", String.valueOf(matches));
-						if ((matches == 5) && !st.hasQuestItems(CLASS_FREE_BATTLE_CERTIFICATE))
+						if (matches == 5)
 						{
 							st.giveItems(CLASS_FREE_BATTLE_CERTIFICATE, 1);
 						}
@@ -163,7 +171,7 @@ public class Q00552_OlympiadVeteran extends Quest
 					{
 						matches = st.getInt("teams") + 1;
 						st.set("teams", String.valueOf(matches));
-						if ((matches == 5) && !st.hasQuestItems(TEAM_EVENT_CERTIFICATE))
+						if (matches == 5)
 						{
 							st.giveItems(TEAM_EVENT_CERTIFICATE, 1);
 						}

+ 27 - 18
L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00553_OlympiadUndefeated/Q00553_OlympiadUndefeated.java

@@ -22,6 +22,7 @@ import com.l2jserver.gameserver.enums.QuestType;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.olympiad.CompetitionType;
+import com.l2jserver.gameserver.model.olympiad.Participant;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.quest.State;
@@ -49,7 +50,7 @@ public class Q00553_OlympiadUndefeated extends Quest
 		addStartNpc(MANAGER);
 		addTalkId(MANAGER);
 		registerQuestItems(WIN_CONF_2, WIN_CONF_5, WIN_CONF_10);
-		setOlympiadUse(true);
+		addOlympiadMatchFinishId();
 	}
 	
 	@Override
@@ -88,27 +89,17 @@ public class Q00553_OlympiadUndefeated extends Quest
 	}
 	
 	@Override
-	public void onOlympiadLose(L2PcInstance loser, CompetitionType type)
+	public void onOlympiadMatchFinish(Participant winner, Participant looser, CompetitionType type)
 	{
-		if (loser != null)
+		if (winner != null)
 		{
-			final QuestState st = loser.getQuestState(getName());
-			if ((st != null) && st.isStarted() && (st.isCond(1)))
+			final L2PcInstance player = winner.getPlayer();
+			if (player == null)
 			{
-				st.unset("undefeatable");
-				st.takeItems(WIN_CONF_2, -1);
-				st.takeItems(WIN_CONF_5, -1);
-				st.takeItems(WIN_CONF_10, -1);
+				return;
 			}
-		}
-	}
-	
-	@Override
-	public void onOlympiadWin(L2PcInstance winner, CompetitionType type)
-	{
-		if (winner != null)
-		{
-			final QuestState st = winner.getQuestState(getName());
+			
+			final QuestState st = player.getQuestState(getName());
 			if ((st != null) && st.isStarted() && (st.isCond(1)))
 			{
 				final int matches = st.getInt("undefeatable") + 1;
@@ -137,6 +128,24 @@ public class Q00553_OlympiadUndefeated extends Quest
 				}
 			}
 		}
+		
+		if (looser != null)
+		{
+			final L2PcInstance player = looser.getPlayer();
+			if (player == null)
+			{
+				return;
+			}
+			
+			final QuestState st = player.getQuestState(getName());
+			if ((st != null) && st.isStarted() && (st.isCond(1)))
+			{
+				st.unset("undefeatable");
+				st.takeItems(WIN_CONF_2, -1);
+				st.takeItems(WIN_CONF_5, -1);
+				st.takeItems(WIN_CONF_10, -1);
+			}
+		}
 	}
 	
 	@Override