Browse Source

BETA: Core-part for ​​​​​[DP9748].
Reviewed by: Zoey76

Adry_85 12 năm trước cách đây
mục cha
commit
eac714c03d

+ 10 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentBase.java

@@ -54,6 +54,8 @@ import com.l2jserver.gameserver.model.conditions.ConditionPlayerAgathionId;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCallPc;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanEscape;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSweep;
+import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanTransform;
+import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanUntransform;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCharges;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerClassIdRestriction;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCloakStatus;
@@ -762,6 +764,14 @@ public abstract class DocumentBase
 			{
 				cond = joinAnd(cond, new ConditionPlayerCanSweep(Boolean.parseBoolean(a.getNodeValue())));
 			}
+			else if ("canTransform".equalsIgnoreCase(a.getNodeName()))
+			{
+				cond = joinAnd(cond, new ConditionPlayerCanTransform(Boolean.parseBoolean(a.getNodeValue())));
+			}
+			else if ("canUntransform".equalsIgnoreCase(a.getNodeName()))
+			{
+				cond = joinAnd(cond, new ConditionPlayerCanUntransform(Boolean.parseBoolean(a.getNodeValue())));
+			}
 			else if ("insideZoneId".equalsIgnoreCase(a.getNodeName()))
 			{
 				StringTokenizer st = new StringTokenizer(a.getNodeValue(), ",");

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

@@ -5815,23 +5815,19 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				removeSkill(oldSkill.getTriggeredId(), true);
 			}
 			
-			// does not abort casting of the transformation dispell
-			if (oldSkill.getSkillType() != L2SkillType.TRANSFORMDISPEL)
+			// Stop casting if this skill is used right now
+			if ((getLastSkillCast() != null) && isCastingNow())
 			{
-				// Stop casting if this skill is used right now
-				if ((getLastSkillCast() != null) && isCastingNow())
+				if (oldSkill.getId() == getLastSkillCast().getId())
 				{
-					if (oldSkill.getId() == getLastSkillCast().getId())
-					{
-						abortCast();
-					}
+					abortCast();
 				}
-				if ((getLastSimultaneousSkillCast() != null) && isCastingSimultaneouslyNow())
+			}
+			if ((getLastSimultaneousSkillCast() != null) && isCastingSimultaneouslyNow())
+			{
+				if (oldSkill.getId() == getLastSimultaneousSkillCast().getId())
 				{
-					if (oldSkill.getId() == getLastSimultaneousSkillCast().getId())
-					{
-						abortCast();
-					}
+					abortCast();
 				}
 			}
 			

+ 69 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanTransform.java

@@ -0,0 +1,69 @@
+/*
+ * 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.conditions;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.network.SystemMessageId;
+
+/**
+ * Player Can Transform condition implementation.
+ * @author Adry_85
+ */
+public class ConditionPlayerCanTransform extends Condition
+{
+	private final boolean _val;
+	
+	public ConditionPlayerCanTransform(boolean val)
+	{
+		_val = val;
+	}
+	
+	@Override
+	public boolean testImpl(Env env)
+	{
+		boolean canTransform = true;
+		final L2PcInstance player = env.getPlayer();
+		if ((player == null) || player.isAlikeDead() || player.isCursedWeaponEquipped())
+		{
+			canTransform = false;
+		}
+		else if (player.isSitting())
+		{
+			player.sendPacket(SystemMessageId.CANNOT_TRANSFORM_WHILE_SITTING);
+			canTransform = false;
+		}
+		else if (player.isTransformed() || player.isInStance())
+		{
+			player.sendPacket(SystemMessageId.YOU_ALREADY_POLYMORPHED_AND_CANNOT_POLYMORPH_AGAIN);
+			canTransform = false;
+		}
+		else if (player.isInWater())
+		{
+			player.sendPacket(SystemMessageId.YOU_CANNOT_POLYMORPH_INTO_THE_DESIRED_FORM_IN_WATER);
+			canTransform = false;
+		}
+		else if (player.isFlyingMounted() || player.isMounted() || player.isRidingStrider())
+		{
+			player.sendPacket(SystemMessageId.YOU_CANNOT_POLYMORPH_WHILE_RIDING_A_PET);
+			canTransform = false;
+		}
+		return (_val == canTransform);
+	}
+}

+ 59 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanUntransform.java

@@ -0,0 +1,59 @@
+/*
+ * 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.conditions;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.gameserver.network.SystemMessageId;
+
+/**
+ * Player Can Untransform condition implementation.
+ * @author Adry_85
+ */
+public class ConditionPlayerCanUntransform extends Condition
+{
+	private final boolean _val;
+	
+	public ConditionPlayerCanUntransform(boolean val)
+	{
+		_val = val;
+	}
+	
+	@Override
+	public boolean testImpl(Env env)
+	{
+		boolean canUntransform = true;
+		final L2PcInstance player = env.getPlayer();
+		if (player == null)
+		{
+			canUntransform = false;
+		}
+		else if (player.isAlikeDead() || player.isCursedWeaponEquipped())
+		{
+			canUntransform = false;
+		}
+		else if ((player.isTransformed() || player.isInStance()) && player.isFlyingMounted() && player.isInsideZone(ZoneId.LANDING))
+		{
+			player.sendPacket(SystemMessageId.TOO_HIGH_TO_PERFORM_THIS_ACTION); // TODO: check if message is retail like.
+			canUntransform = false;
+		}
+		return (_val == canUntransform);
+	}
+}

+ 0 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2SkillType.java

@@ -82,7 +82,6 @@ public enum L2SkillType
 	BEAST_RELEASE_ALL,
 	BEAST_SKILL,
 	BEAST_ACCOMPANY,
-	TRANSFORMDISPEL,
 	DETECT_TRAP,
 	REMOVE_TRAP,
 	SHIFT_TARGET,

+ 45 - 40
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java

@@ -2153,58 +2153,63 @@ public final class Formulas
 		List<L2Effect> canceled = new ArrayList<>(max);
 		if (!effects.isEmpty())
 		{
-			if (slot.equals("buff"))
+			switch (slot)
 			{
-				int cancelMagicLvl = skill.getMagicLevel();
-				final double vuln = target.calcStat(Stats.CANCEL_VULN, 0, target, null);
-				final double prof = activeChar.calcStat(Stats.CANCEL_PROF, 0, target, null);
-				double resMod = 1 + (((vuln + prof) * -1) / 100);
-				double finalRate = rate / resMod;
-				
-				if (activeChar.isDebug() || Config.DEVELOPER)
+				case "buff":
 				{
-					final StringBuilder stat = new StringBuilder(100);
-					StringUtil.append(stat, skill.getName(), " Base Rate:", String.valueOf(rate), " Magiclvl:", String.valueOf(cancelMagicLvl), " resMod:", String.format("%1.2f", resMod), "(", String.format("%1.2f", prof), "/", String.format("%1.2f", vuln), ") Rate:", String.valueOf(rate));
-					final String result = stat.toString();
-					if (activeChar.isDebug())
-					{
-						activeChar.sendDebugMessage(result);
-					}
-					if (Config.DEVELOPER)
+					int cancelMagicLvl = skill.getMagicLevel();
+					final double vuln = target.calcStat(Stats.CANCEL_VULN, 0, target, null);
+					final double prof = activeChar.calcStat(Stats.CANCEL_PROF, 0, target, null);
+					double resMod = 1 + (((vuln + prof) * -1) / 100);
+					double finalRate = rate / resMod;
+					
+					if (activeChar.isDebug() || Config.DEVELOPER)
 					{
-						_log.info(result);
-					}
-				}
-				
-				L2Effect effect;
-				for (int i = effects.size(); --i >= 0;) // reverse order
-				{
-					effect = effects.get(i);
-					if (!effect.canBeStolen() || effect.getSkill().isDance() || (!calcCancelSuccess(effect, cancelMagicLvl, (int) finalRate, skill)))
-					{
-						continue;
+						final StringBuilder stat = new StringBuilder(100);
+						StringUtil.append(stat, skill.getName(), " Base Rate:", String.valueOf(rate), " Magiclvl:", String.valueOf(cancelMagicLvl), " resMod:", String.format("%1.2f", resMod), "(", String.format("%1.2f", prof), "/", String.format("%1.2f", vuln), ") Rate:", String.valueOf(rate));
+						final String result = stat.toString();
+						if (activeChar.isDebug())
+						{
+							activeChar.sendDebugMessage(result);
+						}
+						if (Config.DEVELOPER)
+						{
+							_log.info(result);
+						}
 					}
-					canceled.add(effect);
-					if (canceled.size() >= max)
+					
+					L2Effect effect;
+					for (int i = effects.size(); --i >= 0;) // reverse order
 					{
-						break;
+						effect = effects.get(i);
+						if (!effect.canBeStolen() || effect.getSkill().isDance() || (!calcCancelSuccess(effect, cancelMagicLvl, (int) finalRate, skill)))
+						{
+							continue;
+						}
+						canceled.add(effect);
+						if (canceled.size() >= max)
+						{
+							break;
+						}
 					}
+					break;
 				}
-			}
-			else if (slot.equals("debuff"))
-			{
-				L2Effect effect;
-				for (int i = effects.size(); --i >= 0;) // reverse order
+				case "debuff":
 				{
-					effect = effects.get(i);
-					if (effect.getSkill().isDebuff() && effect.getSkill().canBeDispeled() && (Rnd.get(100) <= rate))
+					L2Effect effect;
+					for (int i = effects.size(); --i >= 0;) // reverse order
 					{
-						canceled.add(effect);
-						if (canceled.size() >= max)
+						effect = effects.get(i);
+						if (effect.getSkill().isDebuff() && effect.getSkill().canBeDispeled() && (Rnd.get(100) <= rate))
 						{
-							break;
+							canceled.add(effect);
+							if (canceled.size() >= max)
+							{
+								break;
+							}
 						}
 					}
+					break;
 				}
 			}
 		}

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/network/SystemMessageId.java

@@ -13995,9 +13995,9 @@ public final class SystemMessageId
 	
 	/**
 	 * ID: 2721<br>
-	 * Message: Boarding or cancellation of boarding on Airships is not allowed in the current area.
+	 * Message: You are too high to perform this action. Please lower your altitude and try again.
 	 */
-	public static final SystemMessageId BOARD_OR_CANCEL_NOT_POSSIBLE_HERE;
+	public static final SystemMessageId TOO_HIGH_TO_PERFORM_THIS_ACTION;
 	
 	/**
 	 * ID: 2722<br>
@@ -17338,7 +17338,7 @@ public final class SystemMessageId
 		LOC_OUT_SEED_INFINITY_S1_S2_S3 = new SystemMessageId(2712);
 		LOC_CLEFT_S1_S2_S3 = new SystemMessageId(2716);
 		INSTANT_ZONE_S1_RESTRICTED = new SystemMessageId(2720);
-		BOARD_OR_CANCEL_NOT_POSSIBLE_HERE = new SystemMessageId(2721);
+		TOO_HIGH_TO_PERFORM_THIS_ACTION = new SystemMessageId(2721);
 		ANOTHER_AIRSHIP_ALREADY_SUMMONED = new SystemMessageId(2722);
 		YOU_CANNOT_BOARD_NOT_MEET_REQUEIREMENTS = new SystemMessageId(2727);
 		ACTION_PROHIBITED_WHILE_MOUNTED_OR_ON_AN_AIRSHIP = new SystemMessageId(2728);