Răsfoiți Sursa

BETA: More event listeners:
* Re-implemented events:
* onDlgAnswer (Fired whenever player answer on a dialog request)
* onPlayerLogin (Fired whenever player logs in)
* onPlayerLogout (Fired whenever player is removed from the world)
* onLevelChange (Fired whenever player's level has been changed)
* Implemented new annotations giving ability to filter a bit event listeners (For now they can't be used with L2Script)
* Message (Can be used with onDlgAnswer to filter by message id)
* PlayerOnly (Can be used with most of event listeners to listen only for player actions)
* SkillId (Can be used with onSkillUse to filter by skill id)
* SkillLevel (Can be used with onSkillUse to filter by skill level)
* Cleaned up Base64 class from useless try/catch using StandardCharsets.UTF8
* Cleaned up EnterWorld packet.
* Fixed wrong default type of getLong method in StatsSet it must be long not int.
* Reworking a little old listeners no more public access of player variable.
* Reviewed by: Zoey76, BiggBoss, Nos

Rumen Nikiforov 12 ani în urmă
părinte
comite
a7e0a659d1
30 a modificat fișierele cu 638 adăugiri și 528 ștergeri
  1. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/StatsSet.java
  2. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java
  3. 41 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/CharEvents.java
  4. 39 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/PlayableEvents.java
  5. 82 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/PlayerEvents.java
  6. 34 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/Message.java
  7. 33 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/PlayerOnly.java
  8. 34 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/SkillId.java
  9. 34 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/SkillLevel.java
  10. 29 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/IDlgAnswerEventListener.java
  11. 29 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/ILevelChangeEventListener.java
  12. 29 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/IPlayerLoginEventListener.java
  13. 29 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/IPlayerLogoutEventListener.java
  14. 25 45
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  15. 6 76
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/PcStat.java
  16. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/TvTEventListener.java
  17. 14 63
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java
  18. 18 77
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
  19. 0 32
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java
  20. 15 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/impl/L2JListener.java
  21. 38 29
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/impl/L2Script.java
  22. 7 13
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/EquipmentListener.java
  23. 6 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/EventListener.java
  24. 5 9
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/PlayerDespawnListener.java
  25. 17 25
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/PlayerLevelListener.java
  26. 5 12
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/PlayerSpawnListener.java
  27. 14 15
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/ProfessionChangeListener.java
  28. 10 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/TransformListener.java
  29. 28 17
      L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/talk/DlgAnswerListener.java
  30. 9 86
      L2J_Server_BETA/java/com/l2jserver/util/Base64.java

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/StatsSet.java

@@ -411,7 +411,7 @@ public class StatsSet
 	 * @param deflt : long designating the default value if value associated with the key is null
 	 * @return long : value associated to the key
 	 */
-	public long getLong(String name, int deflt)
+	public long getLong(String name, long deflt)
 	{
 		Object val = _set.get(name);
 		if (val == null)

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -49,7 +49,6 @@ import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.handler.ISkillHandler;
 import com.l2jserver.gameserver.handler.SkillHandler;
 import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
-import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager.TeleportWhereType;
@@ -212,8 +211,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	
 	private boolean _lethalable = true;
 	
-	protected final String COND_EXCEPTIONS = "COND_EX_" + getObjectId();
-	
 	private volatile Map<Integer, OptionsSkillHolder> _triggerSkills;
 	
 	private final CharEffectList _effectList = new CharEffectList(this);
@@ -7423,7 +7420,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		{
 			_exceptions |= exc.getMask();
 		}
-		GlobalVariablesManager.getInstance().storeVariable(COND_EXCEPTIONS, Long.toString(_exceptions));
 	}
 	
 	public void removeOverridedCond(PcCondOverride... excs)
@@ -7432,7 +7428,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		{
 			_exceptions &= ~exc.getMask();
 		}
-		GlobalVariablesManager.getInstance().storeVariable(COND_EXCEPTIONS, Long.toString(_exceptions));
 	}
 	
 	public boolean canOverrideCond(PcCondOverride excs)
@@ -7440,6 +7435,11 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		return (_exceptions & excs.getMask()) == excs.getMask();
 	}
 	
+	public void setOverrideCond(long masks)
+	{
+		_exceptions = masks;
+	}
+	
 	public void setLethalable(boolean val)
 	{
 		_lethalable = val;

+ 41 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/CharEvents.java

@@ -23,6 +23,9 @@ import java.util.logging.Logger;
 
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.events.annotations.PlayerOnly;
+import com.l2jserver.gameserver.model.actor.events.annotations.SkillId;
+import com.l2jserver.gameserver.model.actor.events.annotations.SkillLevel;
 import com.l2jserver.gameserver.model.actor.events.listeners.IAttackEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IDamageDealtEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IDamageReceivedEventListener;
@@ -30,6 +33,7 @@ import com.l2jserver.gameserver.model.actor.events.listeners.IDeathEventListener
 import com.l2jserver.gameserver.model.actor.events.listeners.ISkillUseEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.ITeleportedEventListener;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.util.Util;
 
 /**
  * @author UnAfraid
@@ -58,6 +62,11 @@ public class CharEvents extends AbstractCharEvents
 			{
 				try
 				{
+					if (listener.getClass().isAnnotationPresent(PlayerOnly.class) && !target.isPlayer())
+					{
+						continue;
+					}
+					
 					if (!listener.onAttack(getActingPlayer(), target))
 					{
 						return false;
@@ -88,6 +97,23 @@ public class CharEvents extends AbstractCharEvents
 			{
 				try
 				{
+					if (listener.getClass().isAnnotationPresent(PlayerOnly.class) && !target.isPlayer())
+					{
+						continue;
+					}
+					
+					final SkillId skillIdA = listener.getClass().getAnnotation(SkillId.class);
+					if ((skillIdA != null) && (!Util.contains(skillIdA.value(), skill.getId())))
+					{
+						continue;
+					}
+					
+					final SkillLevel skillLevelA = listener.getClass().getAnnotation(SkillLevel.class);
+					if ((skillLevelA != null) && (!Util.contains(skillLevelA.value(), skill.getLevel())))
+					{
+						continue;
+					}
+					
 					if (!listener.onSkillUse(getActingPlayer(), skill, simultaneously, target, targets))
 					{
 						return false;
@@ -115,6 +141,11 @@ public class CharEvents extends AbstractCharEvents
 			{
 				try
 				{
+					if (listener.getClass().isAnnotationPresent(PlayerOnly.class) && !killer.isPlayer())
+					{
+						continue;
+					}
+					
 					if (!listener.onDeath(getActingPlayer(), killer))
 					{
 						return false;
@@ -144,6 +175,11 @@ public class CharEvents extends AbstractCharEvents
 			{
 				try
 				{
+					if (listener.getClass().isAnnotationPresent(PlayerOnly.class) && !target.isPlayer())
+					{
+						continue;
+					}
+					
 					listener.onDamageDealtEvent(getActingPlayer(), target, damage, skill, crit);
 				}
 				catch (Exception e)
@@ -169,6 +205,11 @@ public class CharEvents extends AbstractCharEvents
 			{
 				try
 				{
+					if (listener.getClass().isAnnotationPresent(PlayerOnly.class) && !attacker.isPlayer())
+					{
+						continue;
+					}
+					
 					listener.onDamageReceivedEvent(attacker, getActingPlayer(), damage, skill, crit);
 				}
 				catch (Exception e)

+ 39 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/PlayableEvents.java

@@ -21,7 +21,9 @@ package com.l2jserver.gameserver.model.actor.events;
 import java.util.logging.Level;
 
 import com.l2jserver.gameserver.model.actor.L2Playable;
+import com.l2jserver.gameserver.model.actor.events.annotations.PlayerOnly;
 import com.l2jserver.gameserver.model.actor.events.listeners.IExperienceReceivedEventListener;
+import com.l2jserver.gameserver.model.actor.events.listeners.ILevelChangeEventListener;
 
 /**
  * @author UnAfraid
@@ -46,6 +48,11 @@ public class PlayableEvents extends CharEvents
 			{
 				try
 				{
+					if (listener.getClass().isAnnotationPresent(PlayerOnly.class) && !getActingPlayer().isPlayer())
+					{
+						continue;
+					}
+					
 					if (!listener.onExperienceReceived(getActingPlayer(), exp))
 					{
 						return false;
@@ -60,6 +67,38 @@ public class PlayableEvents extends CharEvents
 		return true;
 	}
 	
+	/**
+	 * Fired whenever current playable's level has change.
+	 * @param levels
+	 * @return {@code true} if level change is possible, {@code false} otherwise.
+	 */
+	public boolean onLevelChange(byte levels)
+	{
+		if (hasListeners())
+		{
+			for (ILevelChangeEventListener listener : getEventListeners(ILevelChangeEventListener.class))
+			{
+				try
+				{
+					if (listener.getClass().isAnnotationPresent(PlayerOnly.class) && !getActingPlayer().isPlayer())
+					{
+						continue;
+					}
+					
+					if (!listener.onLevelChange(getActingPlayer(), levels))
+					{
+						return false;
+					}
+				}
+				catch (Exception e)
+				{
+					_log.log(Level.WARNING, getClass().getSimpleName() + ": Exception caught: ", e);
+				}
+			}
+		}
+		return true;
+	}
+	
 	@Override
 	public L2Playable getActingPlayer()
 	{

+ 82 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/PlayerEvents.java

@@ -20,11 +20,16 @@ package com.l2jserver.gameserver.model.actor.events;
 
 import java.util.logging.Level;
 
+import com.l2jserver.gameserver.model.actor.events.annotations.Message;
+import com.l2jserver.gameserver.model.actor.events.listeners.IDlgAnswerEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IFamePointsChangeEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IKarmaChangeEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IPKPointsChangeEventListener;
+import com.l2jserver.gameserver.model.actor.events.listeners.IPlayerLoginEventListener;
+import com.l2jserver.gameserver.model.actor.events.listeners.IPlayerLogoutEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IPvPPointsEventChange;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.util.Util;
 
 /**
  * @author UnAfraid
@@ -153,4 +158,81 @@ public class PlayerEvents extends PlayableEvents
 		}
 		return true;
 	}
+	
+	/**
+	 * Fired whenever player answer on a dialog yes/no.
+	 * @param messageId
+	 * @param answer
+	 * @param requesterId
+	 * @return {@code true} if current answer is possible, {@code false} otherwise.
+	 */
+	public boolean onDlgAnswer(int messageId, int answer, int requesterId)
+	{
+		if (hasListeners())
+		{
+			for (IDlgAnswerEventListener listener : getEventListeners(IDlgAnswerEventListener.class))
+			{
+				try
+				{
+					final Message messageA = listener.getClass().getAnnotation(Message.class);
+					if ((messageA != null) && !Util.contains(messageA.value(), messageId))
+					{
+						continue;
+					}
+					
+					if (!listener.onDlgAnswer(getActingPlayer(), messageId, answer, requesterId))
+					{
+						return false;
+					}
+				}
+				catch (Exception e)
+				{
+					_log.log(Level.WARNING, getClass().getSimpleName() + ": Exception caught: ", e);
+				}
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * Fired whenever current player login.
+	 */
+	public void onPlayerLogin()
+	{
+		if (hasListeners())
+		{
+			for (IPlayerLoginEventListener listener : getEventListeners(IPlayerLoginEventListener.class))
+			{
+				try
+				{
+					listener.onPlayerLogin(getActingPlayer());
+				}
+				catch (Exception e)
+				{
+					_log.log(Level.WARNING, getClass().getSimpleName() + ": Exception caught: ", e);
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Fired whenever current player is logged out.
+	 */
+	public void onPlayerLogout()
+	{
+		if (hasListeners())
+		{
+			for (IPlayerLogoutEventListener listener : getEventListeners(IPlayerLogoutEventListener.class))
+			{
+				try
+				{
+					listener.onPlayerLogout(getActingPlayer());
+				}
+				catch (Exception e)
+				{
+					_log.log(Level.WARNING, getClass().getSimpleName() + ": Exception caught: ", e);
+				}
+			}
+		}
+	}
 }

+ 34 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/Message.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author UnAfraid
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface Message
+{
+	int[] value();
+}

+ 33 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/PlayerOnly.java

@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author UnAfraid
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface PlayerOnly
+{
+}

+ 34 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/SkillId.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author UnAfraid
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface SkillId
+{
+	int[] value();
+}

+ 34 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/SkillLevel.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author UnAfraid
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface SkillLevel
+{
+	int[] value();
+}

+ 29 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/IDlgAnswerEventListener.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.listeners;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author UnAfraid
+ */
+public interface IDlgAnswerEventListener extends IEventListener
+{
+	public boolean onDlgAnswer(L2PcInstance player, int messageId, int answer, int requesterId);
+}

+ 29 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/ILevelChangeEventListener.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.listeners;
+
+import com.l2jserver.gameserver.model.actor.L2Playable;
+
+/**
+ * @author UnAfraid
+ */
+public interface ILevelChangeEventListener extends IEventListener
+{
+	public boolean onLevelChange(L2Playable playable, byte levels);
+}

+ 29 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/IPlayerLoginEventListener.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.listeners;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author UnAfraid
+ */
+public interface IPlayerLoginEventListener extends IEventListener
+{
+	public void onPlayerLogin(L2PcInstance player);
+}

+ 29 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/IPlayerLogoutEventListener.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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 com.l2jserver.gameserver.model.actor.events.listeners;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author UnAfraid
+ */
+public interface IPlayerLogoutEventListener extends IEventListener
+{
+	public void onPlayerLogout(L2PcInstance player);
+}

+ 25 - 45
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -95,7 +95,6 @@ import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
 import com.l2jserver.gameserver.instancemanager.DuelManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
-import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
 import com.l2jserver.gameserver.instancemanager.HandysBlockCheckerManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
@@ -315,7 +314,6 @@ import com.l2jserver.gameserver.scripting.scriptengine.events.TransformEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.EquipmentListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.EventListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.HennaListener;
-import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerDespawnListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.ProfessionChangeListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.TransformListener;
 import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;
@@ -385,6 +383,8 @@ public final class L2PcInstance extends L2Playable
 	private static final String LOAD_ZONE_RESTART_LIMIT = "SELECT time_limit FROM character_norestart_zone_time WHERE charId = ?";
 	private static final String UPDATE_ZONE_RESTART_LIMIT = "REPLACE INTO character_norestart_zone_time (charId, time_limit) VALUES (?,?)";
 	
+	private static final String COND_OVERRIDE_KEY = "cond_override";
+	
 	public static final int ID_NONE = -1;
 	
 	public static final int REQUEST_TIMEOUT = 15;
@@ -394,7 +394,6 @@ public final class L2PcInstance extends L2Playable
 	public static final int STORE_PRIVATE_MANUFACTURE = 5;
 	public static final int STORE_PRIVATE_PACKAGE_SELL = 8;
 	
-	private static final List<PlayerDespawnListener> DESPAWN_LISTENERS = new FastList<PlayerDespawnListener>().shared();
 	private static final List<HennaListener> HENNA_LISTENERS = new FastList<HennaListener>().shared();
 	private static final List<EquipmentListener> GLOBAL_EQUIPMENT_LISTENERS = new FastList<EquipmentListener>().shared();
 	private static final List<ProfessionChangeListener> GLOBAL_PROFESSION_CHANGE_LISTENERS = new FastList<ProfessionChangeListener>().shared();
@@ -1306,10 +1305,6 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void logout()
 	{
-		for (PlayerDespawnListener listener : DESPAWN_LISTENERS)
-		{
-			listener.onDespawn(this);
-		}
 		logout(true);
 	}
 	
@@ -7466,6 +7461,12 @@ public final class L2PcInstance extends L2Playable
 			}
 			
 			player.restoreZoneRestartLimitTime();
+			
+			if (player.isGM())
+			{
+				final long masks = player.getVariables().getLong(COND_OVERRIDE_KEY, PcCondOverride.getAllExceptionsMask());
+				player.setOverrideCond(masks);
+			}
 		}
 		catch (Exception e)
 		{
@@ -10892,23 +10893,6 @@ public final class L2PcInstance extends L2Playable
 			{
 				sendMessage("Entering world in Silence mode.");
 			}
-			
-			if (GlobalVariablesManager.getInstance().isVariableStored(COND_EXCEPTIONS))
-			{
-				String exes = GlobalVariablesManager.getInstance().getStoredVariable(COND_EXCEPTIONS);
-				if (Util.isDigit(exes))
-				{
-					_exceptions = Long.valueOf(exes);
-				}
-				else
-				{
-					_exceptions = PcCondOverride.getAllExceptionsMask();
-				}
-			}
-			else
-			{
-				_exceptions = PcCondOverride.getAllExceptionsMask();
-			}
 		}
 		
 		revalidateZone(true);
@@ -10918,6 +10902,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			checkPlayerSkills();
 		}
+		getEvents().onPlayerLogin();
 	}
 	
 	public long getLastAccess()
@@ -11550,6 +11535,8 @@ public final class L2PcInstance extends L2Playable
 	
 	private synchronized void cleanup()
 	{
+		getEvents().onPlayerLogout();
+		
 		// Set the online Flag to True or False and update the characters table of the database with online status and lastAccess (called when login and logout)
 		try
 		{
@@ -14849,27 +14836,6 @@ public final class L2PcInstance extends L2Playable
 		return vars != null ? vars : addScript(new PlayerVariables(getObjectId()));
 	}
 	
-	/**
-	 * Adds a despawn listener
-	 * @param listener
-	 */
-	public static void addDespawnListener(PlayerDespawnListener listener)
-	{
-		if (!DESPAWN_LISTENERS.contains(listener))
-		{
-			DESPAWN_LISTENERS.add(listener);
-		}
-	}
-	
-	/**
-	 * Removes a despawn listener
-	 * @param listener
-	 */
-	public static void removeDespawnListener(PlayerDespawnListener listener)
-	{
-		DESPAWN_LISTENERS.remove(listener);
-	}
-	
 	/**
 	 * Adds a henna listener
 	 * @param listener
@@ -15047,4 +15013,18 @@ public final class L2PcInstance extends L2Playable
 		}
 		return false;
 	}
+	
+	@Override
+	public void addOverrideCond(PcCondOverride... excs)
+	{
+		super.addOverrideCond(excs);
+		getVariables().set(COND_OVERRIDE_KEY, Long.toString(_exceptions));
+	}
+	
+	@Override
+	public void removeOverridedCond(PcCondOverride... excs)
+	{
+		super.removeOverridedCond(excs);
+		getVariables().set(COND_OVERRIDE_KEY, Long.toString(_exceptions));
+	}
 }

+ 6 - 76
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/PcStat.java

@@ -18,8 +18,6 @@
  */
 package com.l2jserver.gameserver.model.actor.stat;
 
-import javolution.util.FastList;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ExperienceTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
@@ -45,8 +43,6 @@ import com.l2jserver.gameserver.network.serverpackets.SocialAction;
 import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.network.serverpackets.UserInfo;
-import com.l2jserver.gameserver.scripting.scriptengine.events.PlayerLevelChangeEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerLevelListener;
 import com.l2jserver.gameserver.util.Util;
 
 public class PcStat extends PlayableStat
@@ -65,12 +61,10 @@ public class PcStat extends PlayableStat
 		17000,
 		20000
 	};
+	
 	public static final int MAX_VITALITY_POINTS = VITALITY_LEVELS[4];
 	public static final int MIN_VITALITY_POINTS = 1;
 	
-	public FastList<PlayerLevelListener> levelListeners = new FastList<PlayerLevelListener>().shared();
-	public static FastList<PlayerLevelListener> globalLevelListeners = new FastList<PlayerLevelListener>().shared();
-	
 	public PcStat(L2PcInstance activeChar)
 	{
 		super(activeChar);
@@ -256,7 +250,11 @@ public class PcStat extends PlayableStat
 		{
 			return false;
 		}
-		fireLevelChangeListeners(value);
+		
+		if (!getActiveChar().getEvents().onLevelChange(value))
+		{
+			return false;
+		}
 		
 		boolean levelIncreased = super.addLevel(value);
 		if (levelIncreased)
@@ -915,72 +913,4 @@ public class PcStat extends PlayableStat
 		
 		return bonus;
 	}
-	
-	/**
-	 * Listeners
-	 */
-	/**
-	 * Fires all the level change listeners, if any.
-	 * @param value
-	 */
-	private void fireLevelChangeListeners(byte value)
-	{
-		if (!levelListeners.isEmpty() || !globalLevelListeners.isEmpty())
-		{
-			PlayerLevelChangeEvent event = new PlayerLevelChangeEvent();
-			event.setPlayer(getActiveChar());
-			event.setOldLevel(getLevel());
-			event.setNewLevel(getLevel() + value);
-			for (PlayerLevelListener listener : levelListeners)
-			{
-				listener.levelChanged(event);
-			}
-			for (PlayerLevelListener listener : globalLevelListeners)
-			{
-				listener.levelChanged(event);
-			}
-		}
-	}
-	
-	/**
-	 * Adds a global player level listener
-	 * @param listener
-	 */
-	public static void addGlobalLevelListener(PlayerLevelListener listener)
-	{
-		if (!globalLevelListeners.contains(listener))
-		{
-			globalLevelListeners.add(listener);
-		}
-	}
-	
-	/**
-	 * Removes a global player level listener
-	 * @param listener
-	 */
-	public static void removeGlobalLevelListener(PlayerLevelListener listener)
-	{
-		globalLevelListeners.remove(listener);
-	}
-	
-	/**
-	 * Adds a player level listener
-	 * @param listener
-	 */
-	public void addLevelListener(PlayerLevelListener listener)
-	{
-		if (!levelListeners.contains(listener))
-		{
-			levelListeners.add(listener);
-		}
-	}
-	
-	/**
-	 * Removes a player level listener
-	 * @param listener
-	 */
-	public void removeLevelListener(PlayerLevelListener listener)
-	{
-		levelListeners.remove(listener);
-	}
 }

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/TvTEventListener.java

@@ -35,13 +35,13 @@ public final class TvTEventListener extends EventListener
 	public void unregister()
 	{
 		super.unregister();
-		player.setCanRevive(true);
+		getPlayer().setCanRevive(true);
 	}
 	
 	@Override
 	public boolean isOnEvent()
 	{
-		return TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(player.getObjectId());
+		return TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(getPlayer().getObjectId());
 	}
 	
 	@Override

+ 14 - 63
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java

@@ -18,10 +18,6 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import java.util.List;
-
-import javolution.util.FastList;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.handler.AdminCommandHandler;
@@ -30,17 +26,14 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.DoorRequestHolder;
 import com.l2jserver.gameserver.model.holders.SummonRequestHolder;
 import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.scripting.scriptengine.events.DlgAnswerEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.DlgAnswerListener;
 import com.l2jserver.gameserver.util.GMAudit;
 
 /**
- * @author Dezmond_snz Format: cddd
+ * @author Dezmond_snz
  */
 public final class DlgAnswer extends L2GameClientPacket
 {
 	private static final String _C__C6_DLGANSWER = "[C] C6 DlgAnswer";
-	private static final List<DlgAnswerListener> _listeners = new FastList<DlgAnswerListener>().shared();
 	private int _messageId;
 	private int _answer;
 	private int _requesterId;
@@ -62,10 +55,15 @@ public final class DlgAnswer extends L2GameClientPacket
 			return;
 		}
 		
+		if (!activeChar.getEvents().onDlgAnswer(_messageId, _answer, _requesterId))
+		{
+			return;
+		}
+		
 		if (_messageId == SystemMessageId.S1.getId())
 		{
-			String _command = activeChar.getAdminConfirmCmd();
-			if (_command == null)
+			String cmd = activeChar.getAdminConfirmCmd();
+			if (cmd == null)
 			{
 				if (Config.L2JMOD_ALLOW_WEDDING)
 				{
@@ -79,15 +77,15 @@ public final class DlgAnswer extends L2GameClientPacket
 				{
 					return;
 				}
-				String command = _command.split(" ")[0];
+				String command = cmd.split(" ")[0];
 				IAdminCommandHandler ach = AdminCommandHandler.getInstance().getHandler(command);
 				if (AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel()))
 				{
 					if (Config.GMAUDIT)
 					{
-						GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", _command, (activeChar.getTarget() != null ? activeChar.getTarget().getName() : "no-target"));
+						GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", cmd, (activeChar.getTarget() != null ? activeChar.getTarget().getName() : "no-target"));
 					}
-					ach.useAdminCommand(_command, activeChar);
+					ach.useAdminCommand(cmd, activeChar);
 				}
 			}
 		}
@@ -97,74 +95,27 @@ public final class DlgAnswer extends L2GameClientPacket
 		}
 		else if (_messageId == SystemMessageId.C1_WISHES_TO_SUMMON_YOU_FROM_S2_DO_YOU_ACCEPT.getId())
 		{
-			final SummonRequestHolder holder = activeChar.getScript(SummonRequestHolder.class);
+			final SummonRequestHolder holder = activeChar.removeScript(SummonRequestHolder.class);
 			if ((_answer == 1) && (holder != null) && (holder.getTarget().getObjectId() == _requesterId))
 			{
 				activeChar.teleToLocation(holder.getTarget().getX(), holder.getTarget().getY(), holder.getTarget().getZ(), true);
 			}
-			activeChar.removeScript(SummonRequestHolder.class);
 		}
 		else if (_messageId == SystemMessageId.WOULD_YOU_LIKE_TO_OPEN_THE_GATE.getId())
 		{
-			final DoorRequestHolder holder = activeChar.getScript(DoorRequestHolder.class);
+			final DoorRequestHolder holder = activeChar.removeScript(DoorRequestHolder.class);
 			if ((holder != null) && (holder.getDoor() == activeChar.getTarget()) && (_answer == 1))
 			{
 				holder.getDoor().openMe();
 			}
-			activeChar.removeScript(DoorRequestHolder.class);
 		}
 		else if (_messageId == SystemMessageId.WOULD_YOU_LIKE_TO_CLOSE_THE_GATE.getId())
 		{
-			final DoorRequestHolder holder = activeChar.getScript(DoorRequestHolder.class);
+			final DoorRequestHolder holder = activeChar.removeScript(DoorRequestHolder.class);
 			if ((holder != null) && (holder.getDoor() == activeChar.getTarget()) && (_answer == 1))
 			{
 				holder.getDoor().closeMe();
 			}
-			activeChar.removeScript(DoorRequestHolder.class);
-		}
-		
-		fireDlgAnswerListener();
-	}
-	
-	/**
-	 * Fires the event when packet arrived.
-	 */
-	private void fireDlgAnswerListener()
-	{
-		DlgAnswerEvent event = new DlgAnswerEvent();
-		event.setActiveChar(getActiveChar());
-		event.setMessageId(_messageId);
-		event.setAnswer(_answer);
-		event.setRequesterId(_requesterId);
-		
-		for (DlgAnswerListener listener : _listeners)
-		{
-			if ((listener.getMessageId() == -1) || (_messageId == listener.getMessageId()))
-			{
-				listener.onDlgAnswer(event);
-			}
-		}
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public static void addDlgAnswerListener(DlgAnswerListener listener)
-	{
-		if (!_listeners.contains(listener))
-		{
-			_listeners.add(listener);
-		}
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public static void removeDlgAnswerListener(DlgAnswerListener listener)
-	{
-		if (_listeners.contains(listener))
-		{
-			_listeners.remove(listener);
 		}
 	}
 	

+ 18 - 77
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java

@@ -18,10 +18,6 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import java.io.UnsupportedEncodingException;
-
-import javolution.util.FastList;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.LoginServerThread;
@@ -92,7 +88,6 @@ import com.l2jserver.gameserver.network.serverpackets.QuestList;
 import com.l2jserver.gameserver.network.serverpackets.ShortCutInit;
 import com.l2jserver.gameserver.network.serverpackets.SkillCoolTime;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
-import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerSpawnListener;
 import com.l2jserver.util.Base64;
 
 /**
@@ -108,8 +103,6 @@ public class EnterWorld extends L2GameClientPacket
 {
 	private static final String _C__11_ENTERWORLD = "[C] 11 EnterWorld";
 	
-	private static FastList<PlayerSpawnListener> listeners = new FastList<PlayerSpawnListener>().shared();
-	
 	private final int[][] tracert = new int[5][4];
 	
 	public TaskPriority getPriority()
@@ -139,8 +132,7 @@ public class EnterWorld extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance activeChar = getClient().getActiveChar();
-		
+		final L2PcInstance activeChar = getClient().getActiveChar();
 		if (activeChar == null)
 		{
 			_log.warning("EnterWorld failed! activeChar returned 'null'.");
@@ -603,11 +595,6 @@ public class EnterWorld extends L2GameClientPacket
 		{
 			activeChar.sendPacket(ExNotifyPremiumItem.STATIC_PACKET);
 		}
-		
-		for (PlayerSpawnListener listener : listeners)
-		{
-			listener.onSpawn(activeChar);
-		}
 	}
 	
 	/**
@@ -615,11 +602,11 @@ public class EnterWorld extends L2GameClientPacket
 	 */
 	private void engage(L2PcInstance cha)
 	{
-		int _chaid = cha.getObjectId();
+		int chaId = cha.getObjectId();
 		
 		for (Couple cl : CoupleManager.getInstance().getCouples())
 		{
-			if ((cl.getPlayer1Id() == _chaid) || (cl.getPlayer2Id() == _chaid))
+			if ((cl.getPlayer1Id() == chaId) || (cl.getPlayer2Id() == chaId))
 			{
 				if (cl.getMaried())
 				{
@@ -628,7 +615,7 @@ public class EnterWorld extends L2GameClientPacket
 				
 				cha.setCoupleId(cl.getId());
 				
-				if (cl.getPlayer1Id() == _chaid)
+				if (cl.getPlayer1Id() == chaId)
 				{
 					cha.setPartnerId(cl.getPlayer2Id());
 				}
@@ -646,24 +633,13 @@ public class EnterWorld extends L2GameClientPacket
 	 */
 	private void notifyPartner(L2PcInstance cha, int partnerId)
 	{
-		if (cha.getPartnerId() != 0)
+		int objId = cha.getPartnerId();
+		if (objId != 0)
 		{
-			int objId = cha.getPartnerId();
-			
-			try
-			{
-				L2PcInstance partner = L2World.getInstance().getPlayer(objId);
-				
-				if (partner != null)
-				{
-					partner.sendMessage("Your Partner has logged in.");
-				}
-				
-				partner = null;
-			}
-			catch (ClassCastException cce)
+			final L2PcInstance partner = L2World.getInstance().getPlayer(objId);
+			if (partner != null)
 			{
-				_log.warning("Wedding Error: ID " + objId + " is now owned by a(n) " + L2World.getInstance().findObject(objId).getClass().getSimpleName());
+				partner.sendMessage("Your Partner has logged in.");
 			}
 		}
 	}
@@ -673,16 +649,14 @@ public class EnterWorld extends L2GameClientPacket
 	 */
 	private void notifyClanMembers(L2PcInstance activeChar)
 	{
-		L2Clan clan = activeChar.getClan();
-		
-		// This null check may not be needed anymore since notifyClanMembers is called from within a null check already. Please remove if we're certain it's ok to do so.
+		final L2Clan clan = activeChar.getClan();
 		if (clan != null)
 		{
 			clan.getClanMember(activeChar.getObjectId()).setPlayerInstance(activeChar);
-			SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.CLAN_MEMBER_S1_LOGGED_IN);
+			
+			final SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.CLAN_MEMBER_S1_LOGGED_IN);
 			msg.addString(activeChar.getName());
 			clan.broadcastToOtherOnlineMembers(msg, activeChar);
-			msg = null;
 			clan.broadcastToOtherOnlineMembers(new PledgeShowMemberListUpdate(activeChar), activeChar);
 		}
 	}
@@ -694,22 +668,20 @@ public class EnterWorld extends L2GameClientPacket
 	{
 		if (activeChar.getSponsor() != 0)
 		{
-			L2PcInstance sponsor = L2World.getInstance().getPlayer(activeChar.getSponsor());
-			
+			final L2PcInstance sponsor = L2World.getInstance().getPlayer(activeChar.getSponsor());
 			if (sponsor != null)
 			{
-				SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.YOUR_APPRENTICE_S1_HAS_LOGGED_IN);
+				final SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.YOUR_APPRENTICE_S1_HAS_LOGGED_IN);
 				msg.addString(activeChar.getName());
 				sponsor.sendPacket(msg);
 			}
 		}
 		else if (activeChar.getApprentice() != 0)
 		{
-			L2PcInstance apprentice = L2World.getInstance().getPlayer(activeChar.getApprentice());
-			
+			final L2PcInstance apprentice = L2World.getInstance().getPlayer(activeChar.getApprentice());
 			if (apprentice != null)
 			{
-				SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.YOUR_SPONSOR_C1_HAS_LOGGED_IN);
+				final SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.YOUR_SPONSOR_C1_HAS_LOGGED_IN);
 				msg.addString(activeChar.getName());
 				apprentice.sendPacket(msg);
 			}
@@ -722,21 +694,12 @@ public class EnterWorld extends L2GameClientPacket
 	 */
 	private String getText(String string)
 	{
-		try
-		{
-			String result = new String(Base64.decode(string), "UTF-8");
-			return result;
-		}
-		catch (UnsupportedEncodingException e)
-		{
-			return null;
-		}
+		return new String(Base64.decode(string));
 	}
 	
 	private void loadTutorial(L2PcInstance player)
 	{
-		QuestState qs = player.getQuestState("255_Tutorial");
-		
+		final QuestState qs = player.getQuestState("255_Tutorial");
 		if (qs != null)
 		{
 			qs.getQuest().notifyEvent("UC", null, player);
@@ -754,26 +717,4 @@ public class EnterWorld extends L2GameClientPacket
 	{
 		return false;
 	}
-	
-	// Player spawn listeners
-	/**
-	 * Adds a spawn listener
-	 * @param listener
-	 */
-	public static void addSpawnListener(PlayerSpawnListener listener)
-	{
-		if (!listeners.contains(listener))
-		{
-			listeners.add(listener);
-		}
-	}
-	
-	/**
-	 * Removes a spawn listener
-	 * @param listener
-	 */
-	public static void removeSpawnListener(PlayerSpawnListener listener)
-	{
-		listeners.remove(listener);
-	}
 }

+ 0 - 32
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java

@@ -18,13 +18,10 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 
-import javolution.util.FastList;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.SevenSignsFestival;
 import com.l2jserver.gameserver.instancemanager.AntiFeedManager;
@@ -35,7 +32,6 @@ import com.l2jserver.gameserver.network.L2GameClient.GameClientState;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.CharSelectionInfo;
 import com.l2jserver.gameserver.network.serverpackets.RestartResponse;
-import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerDespawnListener;
 import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;
 
 /**
@@ -46,7 +42,6 @@ public final class RequestRestart extends L2GameClientPacket
 {
 	private static final String _C__57_REQUESTRESTART = "[C] 57 RequestRestart";
 	protected static final Logger _logAccounting = Logger.getLogger("accounting");
-	private static List<PlayerDespawnListener> despawnListeners = new FastList<>();
 	
 	@Override
 	protected void readImpl()
@@ -122,11 +117,6 @@ public final class RequestRestart extends L2GameClientPacket
 			return;
 		}
 		
-		for (PlayerDespawnListener listener : despawnListeners)
-		{
-			listener.onDespawn(player);
-		}
-		
 		// Remove player from Boss Zone
 		player.removeFromBossZone();
 		
@@ -163,26 +153,4 @@ public final class RequestRestart extends L2GameClientPacket
 	{
 		return _C__57_REQUESTRESTART;
 	}
-	
-	// Listeners
-	/**
-	 * Adds a despawn listener which will get triggered when a player despawns
-	 * @param listener
-	 */
-	public static void addDespawnListener(PlayerDespawnListener listener)
-	{
-		if (!despawnListeners.contains(listener))
-		{
-			despawnListeners.add(listener);
-		}
-	}
-	
-	/**
-	 * Removes a despawn listener
-	 * @param listener
-	 */
-	public static void removeDespawnListener(PlayerDespawnListener listener)
-	{
-		despawnListeners.remove(listener);
-	}
 }

+ 15 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/impl/L2JListener.java

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.scripting.scriptengine.impl;
 
 import java.util.logging.Logger;
 
+import com.l2jserver.gameserver.model.actor.events.listeners.IEventListener;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 /**
@@ -29,15 +30,24 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  * These are 2 convenience methods to avoid having to register the listeners ourselves. This is particularly useful for our less advanced coders.
  * @author TheOne
  */
-public abstract class L2JListener
+public abstract class L2JListener implements IEventListener
 {
-	public static Logger log = Logger.getLogger(L2JListener.class.getName());
+	protected static Logger log = Logger.getLogger(L2JListener.class.getName());
 	
-	public L2PcInstance player = null;
+	private L2PcInstance _player = null;
+	
+	public L2JListener()
+	{
+	}
+	
+	public L2JListener(L2PcInstance player)
+	{
+		_player = player;
+	}
 	
 	/**
 	 * Convenience method to add this listener in its proper place.<br>
-	 * Called automatically by the superconstructor when the class is instanciated.
+	 * Called automatically by the super constructor when the class is instanciated.
 	 */
 	public abstract void register();
 	
@@ -52,6 +62,6 @@ public abstract class L2JListener
 	 */
 	public L2PcInstance getPlayer()
 	{
-		return player;
+		return _player;
 	}
 }

+ 38 - 29
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/impl/L2Script.java

@@ -24,6 +24,7 @@ import java.util.List;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Character;
+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.model.skills.L2Skill;
@@ -85,7 +86,6 @@ import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.ChatFilter
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.ChatListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.DlgAnswerListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.RequestBypassToServerListener;
-import com.l2jserver.gameserver.util.Util;
 
 /**
  * L2Script is an extension of Quest.java which makes use of the L2J listeners.<br>
@@ -203,17 +203,17 @@ public abstract class L2Script extends Quest
 		PlayerSpawnListener spawn = new PlayerSpawnListener()
 		{
 			@Override
-			public void onSpawn(L2PcInstance player)
+			public void onPlayerLogin(L2PcInstance player)
 			{
-				onPlayerLogin(player);
+				L2Script.this.onPlayerLogin(player);
 			}
 		};
 		PlayerDespawnListener despawn = new PlayerDespawnListener()
 		{
 			@Override
-			public void onDespawn(L2PcInstance player)
+			public void onPlayerLogout(L2PcInstance player)
 			{
-				onPlayerLogout(player);
+				L2Script.this.onPlayerLogout(player);
 			}
 		};
 		_listeners.add(spawn);
@@ -715,9 +715,13 @@ public abstract class L2Script extends Quest
 		PlayerLevelListener listener = new PlayerLevelListener(player)
 		{
 			@Override
-			public void levelChanged(PlayerLevelChangeEvent event)
+			public boolean onLevelChange(L2Playable playable, byte levels)
 			{
-				onPlayerLevelChange(event);
+				final PlayerLevelChangeEvent event = new PlayerLevelChangeEvent();
+				event.setPlayer(playable.getActingPlayer());
+				event.setOldLevel(playable.getLevel());
+				event.setNewLevel(playable.getLevel() + levels);
+				return L2Script.this.onLevelChange(event);
 			}
 		};
 		_listeners.add(listener);
@@ -1056,27 +1060,30 @@ public abstract class L2Script extends Quest
 	
 	/**
 	 * You can use -1 to listen for all kinds of message id's
+	 * @param player
 	 * @param messageIds
 	 */
-	public void addDlgAnswerNotify(int... messageIds)
+	public void addDlgAnswerNotify(L2PcInstance player, int... messageIds)
 	{
-		for (int messageId : messageIds)
+		DlgAnswerListener dlgAnswer = new DlgAnswerListener(player)
 		{
-			DlgAnswerListener dlgAnswer = new DlgAnswerListener(messageId)
-			{
-				@Override
-				public void onDlgAnswer(DlgAnswerEvent event)
-				{
-					L2Script.this.onDlgAnswer(event);
-				}
-			};
-			
-			_listeners.add(dlgAnswer);
-		}
+			@Override
+			public boolean onDlgAnswer(L2PcInstance player, int messageId, int answer, int requesterId)
+			{
+				final DlgAnswerEvent event = new DlgAnswerEvent();
+				event.setActiveChar(player);
+				event.setMessageId(messageId);
+				event.setAnswer(answer);
+				event.setRequesterId(requesterId);
+				return L2Script.this.onDlgAnswer(event);
+			}
+		};
+		
+		_listeners.add(dlgAnswer);
 	}
 	
 	/**
-	 * Removes all Dlg Answer Listeners
+	 * Removes all DlgAnswer listeners
 	 */
 	public void removeDlgAnswerNotify()
 	{
@@ -1092,15 +1099,15 @@ public abstract class L2Script extends Quest
 	}
 	
 	/**
-	 * Removes specified Dlg Answer Listeners
-	 * @param messageIds
+	 * Removes all DlgAnswer listeners associated with the player.
+	 * @param player
 	 */
-	public void removeDlgAnswerNotify(int... messageIds)
+	public void removeDlgAnswerNotify(L2PcInstance player)
 	{
 		List<L2JListener> removeList = new ArrayList<>();
 		for (L2JListener listener : _listeners)
 		{
-			if ((listener instanceof DlgAnswerListener) && Util.contains(messageIds, ((DlgAnswerListener) listener).getMessageId()))
+			if ((listener instanceof DlgAnswerListener) && (((DlgAnswerListener) listener).getPlayer() == player))
 			{
 				removeList.add(listener);
 			}
@@ -1440,10 +1447,11 @@ public abstract class L2Script extends Quest
 	 * Fired when a player's level changes<br>
 	 * Register using addPlayerLevelNotify(player)
 	 * @param event
+	 * @return
 	 */
-	public void onPlayerLevelChange(PlayerLevelChangeEvent event)
+	public boolean onLevelChange(PlayerLevelChangeEvent event)
 	{
-		
+		return true;
 	}
 	
 	/**
@@ -1525,10 +1533,11 @@ public abstract class L2Script extends Quest
 	 * Fired when client answer on dialog request<br>
 	 * Register using addDlgAnswerNotify()
 	 * @param event
+	 * @return
 	 */
-	public void onDlgAnswer(DlgAnswerEvent event)
+	public boolean onDlgAnswer(DlgAnswerEvent event)
 	{
-		
+		return true;
 	}
 	
 	/**

+ 7 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/EquipmentListener.java

@@ -30,19 +30,13 @@ import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
  */
 public abstract class EquipmentListener extends L2JListener
 {
-	private boolean isGlobal = false;
-	
 	/**
 	 * Constructor To set a global listener, set the L2PcInstance value to null
-	 * @param character
+	 * @param activeChar
 	 */
-	public EquipmentListener(L2PcInstance character)
+	public EquipmentListener(L2PcInstance activeChar)
 	{
-		player = character;
-		if (character == null)
-		{
-			isGlobal = true;
-		}
+		super(activeChar);
 		register();
 	}
 	
@@ -56,26 +50,26 @@ public abstract class EquipmentListener extends L2JListener
 	@Override
 	public void register()
 	{
-		if (isGlobal)
+		if (getPlayer() == null)
 		{
 			L2PcInstance.addGlobalEquipmentListener(this);
 		}
 		else
 		{
-			player.addEquipmentListener(this);
+			getPlayer().addEquipmentListener(this);
 		}
 	}
 	
 	@Override
 	public void unregister()
 	{
-		if (isGlobal)
+		if (getPlayer() == null)
 		{
 			L2PcInstance.removeGlobalEquipmentListener(this);
 		}
 		else
 		{
-			player.removeEquipmentListener(this);
+			getPlayer().removeEquipmentListener(this);
 		}
 	}
 	

+ 6 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/EventListener.java

@@ -26,9 +26,9 @@ import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
  */
 public abstract class EventListener extends L2JListener
 {
-	public EventListener(L2PcInstance player)
+	public EventListener(L2PcInstance activeChar)
 	{
-		super.player = player;
+		super(activeChar);
 		register();
 	}
 	
@@ -50,18 +50,18 @@ public abstract class EventListener extends L2JListener
 	@Override
 	public void register()
 	{
-		if (player != null)
+		if (getPlayer() != null)
 		{
-			player.addEventListener(this);
+			getPlayer().addEventListener(this);
 		}
 	}
 	
 	@Override
 	public void unregister()
 	{
-		if (player != null)
+		if (getPlayer() != null)
 		{
-			player.removeEventListener(this);
+			getPlayer().removeEventListener(this);
 		}
 	}
 }

+ 5 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/PlayerDespawnListener.java

@@ -18,33 +18,29 @@
  */
 package com.l2jserver.gameserver.scripting.scriptengine.listeners.player;
 
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.network.clientpackets.RequestRestart;
+import com.l2jserver.gameserver.model.actor.events.AbstractCharEvents;
+import com.l2jserver.gameserver.model.actor.events.listeners.IPlayerLogoutEventListener;
 import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
 
 /**
  * @author TheOne
  */
-public abstract class PlayerDespawnListener extends L2JListener
+public abstract class PlayerDespawnListener extends L2JListener implements IPlayerLogoutEventListener
 {
 	public PlayerDespawnListener()
 	{
 		register();
 	}
 	
-	public abstract void onDespawn(L2PcInstance player);
-	
 	@Override
 	public void register()
 	{
-		L2PcInstance.addDespawnListener(this);
-		RequestRestart.addDespawnListener(this);
+		AbstractCharEvents.registerStaticListener(this);
 	}
 	
 	@Override
 	public void unregister()
 	{
-		L2PcInstance.removeDespawnListener(this);
-		RequestRestart.removeDespawnListener(this);
+		AbstractCharEvents.unregisterStaticListener(this);
 	}
 }

+ 17 - 25
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/PlayerLevelListener.java

@@ -18,9 +18,9 @@
  */
 package com.l2jserver.gameserver.scripting.scriptengine.listeners.player;
 
+import com.l2jserver.gameserver.model.actor.events.AbstractCharEvents;
+import com.l2jserver.gameserver.model.actor.events.listeners.ILevelChangeEventListener;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.stat.PcStat;
-import com.l2jserver.gameserver.scripting.scriptengine.events.PlayerLevelChangeEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
 
 /**
@@ -28,45 +28,37 @@ import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
  * If you wish to have a global listener for all the players logged in, set the L2PcInstance to null.<br>
  * @author TheOne
  */
-public abstract class PlayerLevelListener extends L2JListener
+public abstract class PlayerLevelListener extends L2JListener implements ILevelChangeEventListener
 {
-	
-	/**
-	 * constructor
-	 * @param player
-	 */
-	public PlayerLevelListener(L2PcInstance player)
+	public PlayerLevelListener(L2PcInstance activeChar)
 	{
-		super.player = player;
+		super(activeChar);
 		register();
 	}
 	
-	/**
-	 * The player's level has changed
-	 * @param event
-	 */
-	public abstract void levelChanged(PlayerLevelChangeEvent event);
-	
 	@Override
 	public void register()
 	{
-		if (player == null)
+		if (getPlayer() == null)
+		{
+			AbstractCharEvents.registerStaticListener(this);
+		}
+		else
 		{
-			PcStat.addGlobalLevelListener(this);
-			return;
+			getPlayer().getEvents().registerListener(this);
 		}
-		player.getStat().addLevelListener(this);
-		
 	}
 	
 	@Override
 	public void unregister()
 	{
-		if (player == null)
+		if (getPlayer() == null)
+		{
+			AbstractCharEvents.unregisterStaticListener(this);
+		}
+		else
 		{
-			PcStat.removeGlobalLevelListener(this);
-			return;
+			getPlayer().getEvents().unregisterListener(this);
 		}
-		player.getStat().removeLevelListener(this);
 	}
 }

+ 5 - 12
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/PlayerSpawnListener.java

@@ -18,37 +18,30 @@
  */
 package com.l2jserver.gameserver.scripting.scriptengine.listeners.player;
 
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.network.clientpackets.EnterWorld;
+import com.l2jserver.gameserver.model.actor.events.AbstractCharEvents;
+import com.l2jserver.gameserver.model.actor.events.listeners.IPlayerLoginEventListener;
 import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
 
 /**
  * Gets triggered when a L2PcInstance is spawned in the world
  * @author TheOne
  */
-public abstract class PlayerSpawnListener extends L2JListener
+public abstract class PlayerSpawnListener extends L2JListener implements IPlayerLoginEventListener
 {
 	public PlayerSpawnListener()
 	{
 		register();
 	}
 	
-	/**
-	 * Triggered when a player is spawned
-	 * @param player
-	 */
-	public abstract void onSpawn(L2PcInstance player);
-	
 	@Override
 	public void register()
 	{
-		EnterWorld.addSpawnListener(this);
-		
+		AbstractCharEvents.registerStaticListener(this);
 	}
 	
 	@Override
 	public void unregister()
 	{
-		EnterWorld.removeSpawnListener(this);
+		AbstractCharEvents.unregisterStaticListener(this);
 	}
 }

+ 14 - 15
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/ProfessionChangeListener.java

@@ -29,14 +29,9 @@ import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
  */
 public abstract class ProfessionChangeListener extends L2JListener
 {
-	
-	/**
-	 * constructor
-	 * @param player
-	 */
-	public ProfessionChangeListener(L2PcInstance player)
+	public ProfessionChangeListener(L2PcInstance activeChar)
 	{
-		super.player = player;
+		super(activeChar);
 		register();
 	}
 	
@@ -49,22 +44,26 @@ public abstract class ProfessionChangeListener extends L2JListener
 	@Override
 	public void register()
 	{
-		if (player != null)
+		if (getPlayer() == null)
 		{
-			player.addProfessionChangeListener(this);
-			return;
+			L2PcInstance.addGlobalProfessionChangeListener(this);
+		}
+		else
+		{
+			getPlayer().addProfessionChangeListener(this);
 		}
-		L2PcInstance.addGlobalProfessionChangeListener(this);
 	}
 	
 	@Override
 	public void unregister()
 	{
-		if (player != null)
+		if (getPlayer() == null)
+		{
+			L2PcInstance.removeGlobalProfessionChangeListener(this);
+		}
+		else
 		{
-			player.removeProfessionChangeListener(this);
-			return;
+			getPlayer().removeProfessionChangeListener(this);
 		}
-		L2PcInstance.removeGlobalProfessionChangeListener(this);
 	}
 }

+ 10 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/TransformListener.java

@@ -27,14 +27,9 @@ import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
  */
 public abstract class TransformListener extends L2JListener
 {
-	
-	/**
-	 * constructor
-	 * @param player
-	 */
-	public TransformListener(L2PcInstance player)
+	public TransformListener(L2PcInstance activeChar)
 	{
-		this.player = player;
+		super(activeChar);
 		register();
 	}
 	
@@ -55,13 +50,18 @@ public abstract class TransformListener extends L2JListener
 	@Override
 	public void register()
 	{
-		player.addTransformListener(this);
+		if (getPlayer() != null)
+		{
+			getPlayer().addTransformListener(this);
+		}
 	}
 	
 	@Override
 	public void unregister()
 	{
-		player.removeTransformListener(this);
+		if (getPlayer() != null)
+		{
+			getPlayer().removeTransformListener(this);
+		}
 	}
-	
 }

+ 28 - 17
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/talk/DlgAnswerListener.java

@@ -18,42 +18,53 @@
  */
 package com.l2jserver.gameserver.scripting.scriptengine.listeners.talk;
 
-import com.l2jserver.gameserver.network.clientpackets.DlgAnswer;
-import com.l2jserver.gameserver.scripting.scriptengine.events.DlgAnswerEvent;
+import com.l2jserver.gameserver.model.actor.events.AbstractCharEvents;
+import com.l2jserver.gameserver.model.actor.events.listeners.IDlgAnswerEventListener;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
 
 /**
  * @author UnAfraid
  */
-public abstract class DlgAnswerListener extends L2JListener
+public abstract class DlgAnswerListener extends L2JListener implements IDlgAnswerEventListener
 {
-	private final int _messageId;
+	private final L2PcInstance _player;
 	
-	public DlgAnswerListener(int messageId)
+	public DlgAnswerListener(L2PcInstance player)
 	{
-		_messageId = messageId;
+		_player = player;
 		register();
 	}
 	
-	public int getMessageId()
+	@Override
+	public void register()
 	{
-		return _messageId;
+		if (_player == null)
+		{
+			AbstractCharEvents.registerStaticListener(this);
+		}
+		else
+		{
+			_player.getEvents().registerListener(this);
+		}
 	}
 	
-	/**
-	 * @param event
-	 */
-	public abstract void onDlgAnswer(DlgAnswerEvent event);
-	
 	@Override
-	public void register()
+	public void unregister()
 	{
-		DlgAnswer.addDlgAnswerListener(this);
+		if (_player == null)
+		{
+			AbstractCharEvents.unregisterStaticListener(this);
+		}
+		else
+		{
+			_player.getEvents().unregisterListener(this);
+		}
 	}
 	
 	@Override
-	public void unregister()
+	public L2PcInstance getPlayer()
 	{
-		DlgAnswer.removeDlgAnswerListener(this);
+		return _player;
 	}
 }

+ 9 - 86
L2J_Server_BETA/java/com/l2jserver/util/Base64.java

@@ -18,17 +18,16 @@
  */
 package com.l2jserver.util;
 
-import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.FilterInputStream;
 import java.io.FilterOutputStream;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.logging.Logger;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
@@ -67,7 +66,7 @@ public class Base64
 	/** Don't break lines when encoding (violates strict Base64 specification) */
 	public static final int DONT_BREAK_LINES = 8;
 	
-	/* P R I V A T E F I E L D S */
+	/* Private Fields */
 	
 	/** Maximum line length (76) of Base64 output. */
 	private static final int MAX_LINE_LENGTH = 76;
@@ -79,52 +78,10 @@ public class Base64
 	private static final byte NEW_LINE = (byte) '\n';
 	
 	/** Preferred encoding. */
-	private static final String PREFERRED_ENCODING = "UTF-8";
+	private static final Charset PREFERRED_ENCODING = StandardCharsets.UTF_8;
 	
 	/** The 64 valid Base64 values. */
-	private static final byte[] ALPHABET;
-	/* May be something funny like EBCDIC */
-	// @formatter:off
-	private static final byte[] _NATIVE_ALPHABET =
-	{
-		(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G',
-		(byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N',
-		(byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',
-		(byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a', (byte) 'b',
-		(byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i',
-		(byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p',
-		(byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w',
-		(byte) 'x', (byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3',
-		(byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) '+',
-		(byte) '/'
-	};
-	// @formatter:on
-	
-	public static void main(String[] args) throws IOException
-	{
-		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
-		System.out.print("Enter String to encode: ");
-		final String line = bf.readLine();
-		if (line != null)
-		{
-			System.out.println(Base64.encodeBytes(line.getBytes()));
-		}
-	}
-	
-	/** Determine which ALPHABET to use. */
-	static
-	{
-		byte[] __bytes;
-		try
-		{
-			__bytes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes(PREFERRED_ENCODING);
-		}
-		catch (UnsupportedEncodingException use)
-		{
-			__bytes = _NATIVE_ALPHABET; // Fall back to native encoding
-		}
-		ALPHABET = __bytes;
-	}
+	private static final byte[] ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes(PREFERRED_ENCODING);
 	
 	/**
 	 * Translates a Base64 value to either its 6-bit reconstruction value or a negative number indicating some other meaning.
@@ -309,19 +266,7 @@ public class Base64
 			return null;
 		}
 		
-		// Return value according to relevant encoding.
-		if (value != null)
-		{
-			try
-			{
-				return new String(value, PREFERRED_ENCODING);
-			}
-			catch (UnsupportedEncodingException uue)
-			{
-				return new String(value);
-			}
-		}
-		return null;
+		return value != null ? new String(value, PREFERRED_ENCODING) : null;
 	}
 	
 	/**
@@ -424,14 +369,7 @@ public class Base64
 			// Return value according to relevant encoding.
 			if (value != null)
 			{
-				try
-				{
-					return new String(value, PREFERRED_ENCODING);
-				}
-				catch (UnsupportedEncodingException uue)
-				{
-					return new String(value);
-				}
+				return new String(value, PREFERRED_ENCODING);
 			}
 		}
 		
@@ -466,14 +404,7 @@ public class Base64
 		}
 		
 		// Return value according to relevant encoding.
-		try
-		{
-			return new String(outBuff, 0, e, PREFERRED_ENCODING);
-		}
-		catch (UnsupportedEncodingException uue)
-		{
-			return new String(outBuff, 0, e);
-		}
+		return new String(outBuff, 0, e, PREFERRED_ENCODING);
 	}
 	
 	/* D E C O D I N G M E T H O D S */
@@ -613,15 +544,7 @@ public class Base64
 	 */
 	public static byte[] decode(String s)
 	{
-		byte[] bytes;
-		try
-		{
-			bytes = s.getBytes(PREFERRED_ENCODING);
-		}
-		catch (UnsupportedEncodingException uee)
-		{
-			bytes = s.getBytes();
-		}
+		byte[] bytes = s.getBytes(PREFERRED_ENCODING);
 		
 		// Decode
 		bytes = decode(bytes, 0, bytes.length);