Kaynağa Gözat

BETA: Adding support for invul against specific skills and target command channel.
* Also Removing datapack root for l2jdp-version.properties file.
* Reviewed by: Nos, St3eT

Rumen Nikiforov 11 yıl önce
ebeveyn
işleme
a0e77bd459

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/Config.java

@@ -1720,7 +1720,7 @@ public final class Config
 			SERVER_BUILD_DATE = serverVersion.getString("builddate", "Undefined Date.");
 			
 			// Load L2J Datapack Version L2Properties file (if exists)
-			final PropertiesParser dpVersion = new PropertiesParser(new File(DATAPACK_ROOT, DATAPACK_VERSION_FILE));
+			final PropertiesParser dpVersion = new PropertiesParser(new File(DATAPACK_VERSION_FILE));
 			
 			DATAPACK_VERSION = dpVersion.getString("version", "Unsupported Custom Version.");
 			

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

@@ -90,6 +90,7 @@ import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.entity.Instance;
+import com.l2jserver.gameserver.model.holders.InvulSkillHolder;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.holders.SkillUseHolder;
 import com.l2jserver.gameserver.model.interfaces.IChanceSkillTrigger;
@@ -228,6 +229,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	
 	private volatile Map<Integer, OptionsSkillHolder> _triggerSkills;
 	
+	private volatile Map<Integer, InvulSkillHolder> _invulAgainst;
+	
 	private final CharEffectList _effectList = new CharEffectList(this);
 	
 	/** The character that summons this character. */
@@ -1663,6 +1666,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 			case PARTY:
 			case CLAN:
 			case PARTY_CLAN:
+			case COMMAND_CHANNEL:
 				doit = true;
 			default:
 				if (targets.length == 0)
@@ -6178,7 +6182,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 					// EVT_ATTACKED and PvPStatus
 					if (target instanceof L2Character)
 					{
-						if (skill.getEffectPoint() <= 0)
+						if (skill.isBad())
 						{
 							if (target.isPlayer() || target.isSummon() || target.isTrap())
 							{
@@ -6186,21 +6190,19 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 								if (!target.equals(this))
 								{
 									// Combat-mode check
-									if (skill.getEffectPoint() != 0)
+									if (target.isPlayer())
 									{
-										if (target.isPlayer())
-										{
-											target.getActingPlayer().getAI().clientStartAutoAttack();
-										}
-										else if (target.isSummon() && ((L2Character) target).hasAI())
+										target.getActingPlayer().getAI().clientStartAutoAttack();
+									}
+									else if (target.isSummon() && ((L2Character) target).hasAI())
+									{
+										L2PcInstance owner = ((L2Summon) target).getOwner();
+										if (owner != null)
 										{
-											L2PcInstance owner = ((L2Summon) target).getOwner();
-											if (owner != null)
-											{
-												owner.getAI().clientStartAutoAttack();
-											}
+											owner.getAI().clientStartAutoAttack();
 										}
 									}
+									
 									// attack of the own pet does not flag player
 									// triggering trap not flag trap owner
 									if ((player.getSummon() != target) && !isTrap() && !((skill.getEffectPoint() == 0) && (skill.getAffectRange() > 0)))
@@ -7131,4 +7133,49 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		}
 		return _channelized;
 	}
+	
+	public void addInvulAgainst(SkillHolder holder)
+	{
+		final InvulSkillHolder invulHolder = getInvulAgainstSkills().get(holder.getSkillId());
+		if (invulHolder != null)
+		{
+			invulHolder.increaseInstances();
+			return;
+		}
+		getInvulAgainstSkills().put(holder.getSkillId(), new InvulSkillHolder(holder));
+	}
+	
+	public void removeInvulAgainst(SkillHolder holder)
+	{
+		final InvulSkillHolder invulHolder = getInvulAgainstSkills().get(holder.getSkillId());
+		if ((invulHolder != null) && (invulHolder.decreaseInstances() < 1))
+		{
+			getInvulAgainstSkills().remove(holder.getSkillId());
+		}
+	}
+	
+	public boolean isInvulAgainst(int skillId, int skillLvl)
+	{
+		if (_invulAgainst != null)
+		{
+			final SkillHolder holder = getInvulAgainstSkills().get(skillId);
+			return ((holder != null) && ((holder.getSkillLvl() < 1) || (holder.getSkillLvl() == skillLvl)));
+		}
+		return false;
+	}
+	
+	private Map<Integer, InvulSkillHolder> getInvulAgainstSkills()
+	{
+		if (_invulAgainst == null)
+		{
+			synchronized (this)
+			{
+				if (_invulAgainst == null)
+				{
+					return _invulAgainst = new ConcurrentHashMap<>();
+				}
+			}
+		}
+		return _invulAgainst;
+	}
 }

+ 1 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Summon.java

@@ -649,6 +649,7 @@ public abstract class L2Summon extends L2Playable
 			case BEHIND_AURA:
 			case SELF:
 			case AURA_CORPSE_MOB:
+			case COMMAND_CHANNEL:
 				target = this;
 				break;
 			default:

+ 2 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -8705,6 +8705,7 @@ public final class L2PcInstance extends L2Playable
 			case GROUND:
 			case SELF:
 			case AURA_CORPSE_MOB:
+			case COMMAND_CHANNEL:
 				target = this;
 				break;
 			default:
@@ -8809,6 +8810,7 @@ public final class L2PcInstance extends L2Playable
 			case SELF:
 			case AREA_SUMMON:
 			case AURA_CORPSE_MOB:
+			case COMMAND_CHANNEL:
 				target = this;
 				break;
 			case PET:

+ 54 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/holders/InvulSkillHolder.java

@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2004-2014 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.holders;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author UnAfraid
+ */
+public class InvulSkillHolder extends SkillHolder
+{
+	private final AtomicInteger _instances = new AtomicInteger(1);
+	
+	public InvulSkillHolder(int skillId, int skillLevel)
+	{
+		super(skillId, skillLevel);
+	}
+	
+	public InvulSkillHolder(SkillHolder holder)
+	{
+		super(holder.getSkill());
+	}
+	
+	public int getInstances()
+	{
+		return _instances.get();
+	}
+	
+	public int increaseInstances()
+	{
+		return _instances.incrementAndGet();
+	}
+	
+	public int decreaseInstances()
+	{
+		return _instances.decrementAndGet();
+	}
+}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/holders/SkillHolder.java

@@ -54,7 +54,7 @@ public class SkillHolder
 	
 	public final L2Skill getSkill()
 	{
-		return SkillTable.getInstance().getInfo(_skillId, _skillLvl);
+		return SkillTable.getInstance().getInfo(_skillId, Math.max(_skillLvl, 1));
 	}
 	
 	@Override

+ 6 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -1372,6 +1372,12 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 			return;
 		}
 		
+		if (effected.isInvulAgainst(getId(), getLevel()))
+		{
+			effected.sendDebugMessage("Skill " + toString() + " has been ignored (invul against)");
+			return;
+		}
+		
 		final Env env = new Env();
 		env.setSkillMastery(Formulas.calcSkillMastery(effector, this));
 		env.setCharacter(effector);

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

@@ -34,6 +34,7 @@ public enum L2TargetType
 	BEHIND_AURA,
 	CLAN,
 	CLAN_MEMBER,
+	COMMAND_CHANNEL,
 	CORPSE,
 	CORPSE_CLAN,
 	CORPSE_MOB,