فهرست منبع

BETA: Extend Quest for ItemBypass (tnx JIV for it!)

nBd 12 سال پیش
والد
کامیت
7206d16db7

+ 87 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java

@@ -33,9 +33,11 @@ import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.instancemanager.ItemsOnGroundManager;
 import com.l2jserver.gameserver.instancemanager.MercTicketManager;
+import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.model.DropProtection;
 import com.l2jserver.gameserver.model.Elementals;
 import com.l2jserver.gameserver.model.L2Augmentation;
@@ -54,12 +56,16 @@ import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.L2Weapon;
 import com.l2jserver.gameserver.model.items.type.L2EtcItemType;
 import com.l2jserver.gameserver.model.items.type.L2ItemType;
+import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
+import com.l2jserver.gameserver.model.quest.State;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.DropItem;
 import com.l2jserver.gameserver.network.serverpackets.GetItem;
 import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
 import com.l2jserver.gameserver.network.serverpackets.SpawnItem;
 import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -2135,4 +2141,85 @@ public final class L2ItemInstance extends L2Object
 	{
 	        return _item.getEquipReuseDelay();
 	}
+	
+	/**
+	 * 
+	 * @param activeChar
+	 * @param command
+	 */
+	public void onBypassFeedback(L2PcInstance activeChar, String command)
+	{
+		if (command.startsWith("Quest"))
+		{
+			String questName = command.substring(6);
+			String content = null;
+			
+			String event = null;
+			int idx = questName.indexOf(' ');
+			if (idx > 0)
+			{
+				event = questName.substring(idx).trim();
+				questName = questName.substring(0, idx);
+			}
+			
+			Quest q = QuestManager.getInstance().getQuest(questName);
+			QuestState qs = activeChar.getQuestState(questName);
+			
+			if (q != null)
+			{
+				if ((q.getQuestIntId() >= 1 && q.getQuestIntId() < 20000) && (activeChar.getWeightPenalty() >= 3 || !activeChar.isInventoryUnder80(true)))
+				{
+					activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.INVENTORY_LESS_THAN_80_PERCENT));
+					return;
+				}
+				
+				if (qs == null)
+				{
+					if (q.getQuestIntId() >= 1 && q.getQuestIntId() < 20000)
+					{
+						if (activeChar.getAllActiveQuests().length > 40)
+						{
+							activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TOO_MANY_QUESTS));
+							return;
+						}
+					}
+					qs = q.newQuestState(activeChar);
+				}
+			}
+			else
+				content = Quest.getNoQuestMsg(activeChar);
+			
+			if (qs != null)
+			{
+				if (event != null && !qs.getQuest().notifyItemEvent(this, activeChar, event))
+					return;
+				else if (!qs.getQuest().notifyItemTalk(this, activeChar))
+					return;
+				
+				questName = qs.getQuest().getName();
+				String stateId = State.getStateName(qs.getState());
+				String path = "data/scripts/quests/" + questName + "/" + stateId + ".htm";
+				content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), path);
+			}
+			
+			if (content != null)
+				showChatWindow(activeChar, content);
+			
+			// Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet
+			activeChar.sendPacket(ActionFailed.STATIC_PACKET);
+		}
+	}
+	
+	/**
+	 * 
+	 * @param activeChar
+	 * @param content
+	 */
+	public void showChatWindow(L2PcInstance activeChar, String content)
+	{
+		NpcHtmlMessage html = new NpcHtmlMessage(0, getItemId());
+		html.setHtml(content);
+		html.replace("%itemId%", String.valueOf(getObjectId()));
+		activeChar.sendPacket(html);
+	}
 }

+ 71 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/Quest.java

@@ -745,6 +745,77 @@ public class Quest extends ManagedScript
 		return showResult(player, res);
 	}
 	
+	/**
+	 * 
+	 * @param item
+	 * @param player
+	 * @return
+	 */
+	public final boolean notifyItemTalk(L2ItemInstance item, L2PcInstance player)
+	{
+		String res = null;
+		try
+		{
+			res = onItemTalk(item, player);
+			if (res == "true")
+				return true;
+			else if (res == "false")
+				return false;
+		}
+		catch (Exception e)
+		{
+			return showError(player, e);
+		}
+		return showResult(player, res);
+	}
+	
+	/**
+	 * @param item
+	 * @param player
+	 * @return
+	 */
+	public String onItemTalk(L2ItemInstance item, L2PcInstance player)
+	{
+		return null;
+	}
+	
+	/**
+	 * 
+	 * @param item
+	 * @param player
+	 * @param event
+	 * @return
+	 */
+	public final boolean notifyItemEvent(L2ItemInstance item, L2PcInstance player, String event)
+	{
+		String res = null;
+		try
+		{
+			res = onItemEvent(item, player, event);
+			if (res == "true")
+				return true;
+			else if (res == "false")
+				return false;
+		}
+		catch (Exception e)
+		{
+			return showError(player, e);
+		}
+		return showResult(player, res);
+	}
+	
+	/**
+	 * 
+	 * @param item
+	 * @param player
+	 * @param event
+	 * @return
+	 */
+	public String onItemEvent(L2ItemInstance item, L2PcInstance player, String event)
+	{
+		return null;
+	}
+	
 	public class TmpOnSkillSee implements Runnable
 	{
 		private final L2Npc _npc;

+ 26 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java

@@ -32,6 +32,7 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MerchantSummonInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Hero;
+import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.communityserver.CommunityServerThread;
 import com.l2jserver.gameserver.network.communityserver.writepackets.RequestShowCommunityBoard;
@@ -148,6 +149,31 @@ public final class RequestBypassToServer extends L2GameClientPacket
 				
 				activeChar.sendPacket(ActionFailed.STATIC_PACKET);
 			}
+			else if (_command.startsWith("item_"))
+			{
+				if(!activeChar.validateBypass(_command))
+					return;
+				
+				int endOfId = _command.indexOf('_', 5);
+				String id;
+				if (endOfId > 0)
+					id = _command.substring(5, endOfId);
+				else
+					id = _command.substring(5);
+				try
+				{
+					L2ItemInstance item = activeChar.getInventory().getItemByObjectId(Integer.parseInt(id));
+					
+					if (item != null && endOfId > 0 )
+						item.onBypassFeedback(activeChar, _command.substring(endOfId+1));
+					
+					activeChar.sendPacket(ActionFailed.STATIC_PACKET);
+				}
+				catch (NumberFormatException nfe)
+				{
+					_log.log(Level.WARNING, "NFE for command ["+_command+"]", nfe);
+				}
+			}
 			else if (_command.startsWith("summon_"))
 			{
 				if (!activeChar.validateBypass(_command))