Prechádzať zdrojové kódy

BETA: Adding some new listeners
* Dlg Answer listener
* Notify when client sent DlgAnswer packet.
* RequestBypassToServerListener
* Notify when client sent RequestBypassToServer packet.

Rumen Nikiforov 12 rokov pred
rodič
commit
b504430054

+ 53 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java

@@ -14,12 +14,18 @@
  */
 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;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 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;
 
 /**
@@ -29,7 +35,7 @@ import com.l2jserver.gameserver.util.GMAudit;
 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;
@@ -83,6 +89,52 @@ public final class DlgAnswer extends L2GameClientPacket
 			activeChar.gatesAnswer(_answer, 1);
 		else if (_messageId == SystemMessageId.WOULD_YOU_LIKE_TO_CLOSE_THE_GATE.getId())
 			activeChar.gatesAnswer(_answer, 0);
+		
+		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);
+		}
 	}
 	
 	@Override

+ 46 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java

@@ -14,9 +14,12 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
+import java.util.List;
 import java.util.StringTokenizer;
 import java.util.logging.Level;
 
+import javolution.util.FastList;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.communitybbs.CommunityBoard;
@@ -39,6 +42,8 @@ import com.l2jserver.gameserver.network.communityserver.writepackets.RequestShow
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.ConfirmDlg;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
+import com.l2jserver.gameserver.scripting.scriptengine.events.RequestBypassToServerEvent;
+import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.RequestBypassToServerListener;
 import com.l2jserver.gameserver.util.GMAudit;
 import com.l2jserver.gameserver.util.Util;
 
@@ -49,7 +54,8 @@ import com.l2jserver.gameserver.util.Util;
 public final class RequestBypassToServer extends L2GameClientPacket
 {
 	private static final String _C__23_REQUESTBYPASSTOSERVER = "[C] 23 RequestBypassToServer";
-	
+	private static final List<RequestBypassToServerListener> _listeners = new FastList<RequestBypassToServerListener>().shared();
+
 	// S
 	private String _command;
 	
@@ -324,6 +330,8 @@ public final class RequestBypassToServer extends L2GameClientPacket
 				activeChar.sendPacket(msg);
 			}
 		}
+		
+		fireBypassListeners();
 	}
 	
 	/**
@@ -342,6 +350,43 @@ public final class RequestBypassToServer extends L2GameClientPacket
 		}
 	}
 	
+	/**
+	 *  Fires the event when packet arrived.
+	 */
+	private void fireBypassListeners()
+	{
+		RequestBypassToServerEvent event = new RequestBypassToServerEvent();
+		event.setActiveChar(getActiveChar());
+		event.setCommand(_command);
+		
+		for (RequestBypassToServerListener listener : _listeners)
+		{
+			listener.onRequestBypassToServer(event);
+		}
+	}
+
+	/**
+	 * @param listener
+	 */
+	public static void addBypassListener(RequestBypassToServerListener listener)
+	{
+		if (!_listeners.contains(listener))
+		{
+			_listeners.add(listener);
+		}
+	}
+
+	/**
+	 * @param listener
+	 */
+	public static void removeBypassListener(RequestBypassToServerListener listener)
+	{
+		if (_listeners.contains(listener))
+		{
+			_listeners.remove(listener);
+		}
+	}
+	
 	@Override
 	public String getType()
 	{

+ 75 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/events/DlgAnswerEvent.java

@@ -0,0 +1,75 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.scripting.scriptengine.events;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.scripting.scriptengine.events.impl.L2Event;
+
+/**
+ * @author UnAfraid
+ */
+public class DlgAnswerEvent implements L2Event
+{
+	private L2PcInstance _activeChar;
+	private int _messageId;
+	private int _answer;
+	private int _requesterId;
+	
+	public void setActiveChar(L2PcInstance activeChar)
+	{
+		_activeChar = activeChar;
+	}
+	
+	public L2PcInstance getActiveChar()
+	{
+		return _activeChar;
+	}
+	
+	public void setMessageId(int messageId)
+	{
+		_messageId = messageId;
+	}
+	
+	public int getMessageId()
+	{
+		return _messageId;
+	}
+	
+	public SystemMessageId getSystemMessageId()
+	{
+		return SystemMessageId.getSystemMessageId(_messageId);
+	}
+	
+	public void setAnswer(int answer)
+	{
+		_answer = answer;
+	}
+	
+	public int getAnswer()
+	{
+		return _answer;
+	}
+	
+	public void setRequesterId(int req)
+	{
+		_requesterId = req;
+	}
+	
+	public int getRequesterId()
+	{
+		return _requesterId;
+	}
+}

+ 47 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/events/RequestBypassToServerEvent.java

@@ -0,0 +1,47 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.scripting.scriptengine.events;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.scripting.scriptengine.events.impl.L2Event;
+
+/**
+ * @author UnAfraid
+ */
+public class RequestBypassToServerEvent implements L2Event
+{
+	private L2PcInstance _activeChar;
+	private String _command;
+	
+	public void setActiveChar(L2PcInstance activeChar)
+	{
+		_activeChar = activeChar;
+	}
+	
+	public L2PcInstance getActiveChar()
+	{
+		return _activeChar;
+	}
+	
+	public void setCommand(String command)
+	{
+		_command = command;
+	}
+	
+	public String getCommand()
+	{
+		return _command;
+	}
+}

+ 114 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/impl/L2Script.java

@@ -35,6 +35,7 @@ import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarehouseAddIt
 import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarehouseDeleteItemEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarehouseTransferEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.DeathEvent;
+import com.l2jserver.gameserver.scripting.scriptengine.events.DlgAnswerEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.EquipmentEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.FortSiegeEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.HennaEvent;
@@ -45,6 +46,7 @@ import com.l2jserver.gameserver.scripting.scriptengine.events.ItemPickupEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ItemTransferEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.PlayerLevelChangeEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ProfessionChangeEvent;
+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;
@@ -73,6 +75,9 @@ import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.Professi
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.TransformListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.ChatFilterListener;
 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>
@@ -80,8 +85,8 @@ import com.l2jserver.gameserver.scripting.scriptengine.listeners.talk.ChatListen
  * It is strongly recommended for the more advanced developers.<br>
  * Methods with boolean return values can be used as code blockers.<br>
  * This means that if the return is false, the action for which the listener was fired does not happen.<br>
- * New in this version: profession change + player level change.
- * TODO: pet item use listeners.
+ * New in this version: profession change + player level change.<br>
+ * TODO: pet item use listeners.<br>
  * TODO: player subclass listeners ?? (needed?)
  * @author TheOne
  */
@@ -1109,6 +1114,93 @@ public abstract class L2Script extends Quest
 		removeListeners(removeList);
 	}
 	
+	/**
+	 * You can use -1 to listen for all kinds of message id's
+	 * @param messageIds
+	 */
+	public void addDlgAnswerNotify(int ...messageIds)
+	{
+		for (int messageId : messageIds)
+		{
+			DlgAnswerListener dlgAnswer = new DlgAnswerListener(messageId)
+			{
+				@Override
+				public void onDlgAnswer(DlgAnswerEvent event)
+				{
+					L2Script.this.onDlgAnswer(event);
+				}
+			};
+			
+			_listeners.add(dlgAnswer);
+		}
+	}
+	
+	/**
+	 * Removes all Dlg Answer Listeners
+	 */
+	public void removeDlgAnswerNotify()
+	{
+		List<L2JListener> removeList = new ArrayList<>();
+		for (L2JListener listener : _listeners)
+		{
+			if (listener instanceof DlgAnswerListener)
+			{
+				removeList.add(listener);
+			}
+		}
+		removeListeners(removeList);
+	}
+	
+	/**
+	 * Removes specified Dlg Answer Listeners
+	 * @param messageIds
+	 */
+	public void removeDlgAnswerNotify(int... messageIds)
+	{
+		List<L2JListener> removeList = new ArrayList<>();
+		for (L2JListener listener : _listeners)
+		{
+			if (listener instanceof DlgAnswerListener && Util.contains(messageIds, ((DlgAnswerListener) listener).getMessageId()))
+			{
+				removeList.add(listener);
+			}
+		}
+		removeListeners(removeList);
+	}
+	
+	/**
+	 * Notify when RequestBypassToServer packet is received from client.
+	 */
+	public void addRequestBypassToServerNotify()
+	{
+		RequestBypassToServerListener bypass = new RequestBypassToServerListener()
+		{
+			@Override
+			public void onRequestBypassToServer(RequestBypassToServerEvent event)
+			{
+				L2Script.this.onRequestBypassToServer(event);
+			}
+		};
+		
+		_listeners.add(bypass);
+	}
+	
+	/**
+	 * Removes all RequestBypassToServer Listeners
+	 */
+	public void removeRequestBypassToServerNotify()
+	{
+		List<L2JListener> removeList = new ArrayList<>();
+		for (L2JListener listener : _listeners)
+		{
+			if (listener instanceof DlgAnswerListener)
+			{
+				removeList.add(listener);
+			}
+		}
+		removeListeners(removeList);
+	}
+	
 	// Script notifications
 	/**
 	 * Fired when a player logs in
@@ -1437,6 +1529,26 @@ public abstract class L2Script extends Quest
 		
 	}
 	
+	/**
+	 * Fired when client answer on dialog request<br>
+	 * Register using addDlgAnswerNotify()
+	 * @param event
+	 */
+	public void onDlgAnswer(DlgAnswerEvent event)
+	{
+		
+	}
+	
+	/**
+	 * Fired when client answer on dialog request<br>
+	 * Register using addDlgAnswerNotify()
+	 * @param event
+	 */
+	protected void onRequestBypassToServer(RequestBypassToServerEvent event)
+	{
+		
+	}
+	
 	// Enums
 	
 	public enum EventStage

+ 55 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/talk/DlgAnswerListener.java

@@ -0,0 +1,55 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.scripting.scriptengine.listeners.talk;
+
+import com.l2jserver.gameserver.network.clientpackets.DlgAnswer;
+import com.l2jserver.gameserver.scripting.scriptengine.events.DlgAnswerEvent;
+import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
+
+/**
+ * @author UnAfraid
+ */
+public abstract class DlgAnswerListener extends L2JListener
+{
+	private final int _messageId;
+	
+	public DlgAnswerListener(int messageId)
+	{
+		_messageId = messageId;
+		register();
+	}
+	
+	public int getMessageId()
+	{
+		return _messageId;
+	}
+	
+	/**
+	 * @param event
+	 */
+	public abstract void onDlgAnswer(DlgAnswerEvent event);
+	
+	@Override
+	public void register()
+	{
+		DlgAnswer.addDlgAnswerListener(this);
+	}
+	
+	@Override
+	public void unregister()
+	{
+		DlgAnswer.removeDlgAnswerListener(this);
+	}
+}

+ 48 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/talk/RequestBypassToServerListener.java

@@ -0,0 +1,48 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.scripting.scriptengine.listeners.talk;
+
+import com.l2jserver.gameserver.network.clientpackets.RequestBypassToServer;
+import com.l2jserver.gameserver.scripting.scriptengine.events.RequestBypassToServerEvent;
+import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
+
+/**
+ * @author UnAfraid
+ *
+ */
+public abstract class RequestBypassToServerListener extends L2JListener
+{	
+	public RequestBypassToServerListener()
+	{
+		register();
+	}
+	
+	/**
+	 * @param event
+	 */
+	public abstract void onRequestBypassToServer(RequestBypassToServerEvent event);
+	
+	@Override
+	public void register()
+	{
+		RequestBypassToServer.addBypassListener(this);
+	}
+	
+	@Override
+	public void unregister()
+	{
+		RequestBypassToServer.removeBypassListener(this);
+	}
+}