瀏覽代碼

New player condition "instanceId". Allows some items and skills be used only inside (or only outside) of the instances.
Please remember: instance template ids (from instancenames.xml) should be used as argument !

Example: restriction for Dark Cloud Mansion and Crystal Caverns only:
<player instanceId="9, 10"/>
restriction for Pailaka (Varka Silenos):
<player instanceId="45"/>

_DS_ 15 年之前
父節點
當前提交
aba4db090b

+ 11 - 0
L2_GameServer/java/net/sf/l2j/gameserver/skills/DocumentBase.java

@@ -609,6 +609,17 @@ abstract class DocumentBase
 				boolean val = Boolean.valueOf(a.getNodeValue());
 				cond = joinAnd(cond, new ConditionPlayerSubclass(val));
 			}
+			else if ("instanceid".equalsIgnoreCase(a.getNodeName()))
+			{
+            	FastList<Integer> array = new FastList<Integer>();
+            	StringTokenizer st = new StringTokenizer(a.getNodeValue(), ",");
+            	while (st.hasMoreTokens())
+                {
+                    String item = st.nextToken().trim();
+                    array.add(Integer.decode(getValue(item, null)));
+                }
+            	cond = joinAnd(cond, new ConditionPlayerInstanceId(array));
+			}
         }
 
         if(forces[0] + forces[1] > 0)

+ 48 - 0
L2_GameServer/java/net/sf/l2j/gameserver/skills/conditions/ConditionPlayerInstanceId.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 net.sf.l2j.gameserver.skills.conditions;
+
+import net.sf.l2j.gameserver.instancemanager.InstanceManager;
+import net.sf.l2j.gameserver.instancemanager.InstanceManager.InstanceWorld;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.skills.Env;
+import javolution.util.FastList;
+
+public class ConditionPlayerInstanceId extends Condition
+{
+	private final FastList<Integer> _instanceIds;
+
+	public ConditionPlayerInstanceId(FastList<Integer> instanceIds)
+	{
+		_instanceIds = instanceIds;
+	}
+
+	@Override
+	public boolean testImpl(Env env)
+	{
+		if (!(env.player instanceof L2PcInstance))
+			return false;
+
+		final int instanceId = env.player.getInstanceId();
+		if (instanceId <= 0)
+			return false; // player not in instance
+
+		final InstanceWorld world = InstanceManager.getInstance().getPlayerWorld((L2PcInstance)env.player);
+		if (world == null || world.instanceId != instanceId)
+			return false; // player in the different instance
+
+		return _instanceIds.contains(world.templateId);
+	}
+}