浏览代码

BETA: Formulas rework:
* Implemented retail like formulas for all trait types.
* Implemented retail like formulas for elemental attributes.
* Patch by: Nos
* Reviewed by: UnAfraid, Zoey76, Adry_85, MELERIX
* Added new debugging visual menu that shows much more information then before.
* Initial reading of npc xmls (Soon we'll migrate to them only)
* Reading parameters, base attributes, base attack type/range, ai params.
* Tutorial bypasses will be able to use with normal bypass handlers.
* Reviewed by: Nos, Zoey76, Adry_85

Rumen Nikiforov 11 年之前
父节点
当前提交
69645f356d
共有 20 个文件被更改,包括 912 次插入1004 次删除
  1. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ItemTable.java
  2. 99 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcTable.java
  3. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentBase.java
  4. 30 70
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java
  5. 85 280
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/CharStat.java
  6. 57 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2CharTemplate.java
  7. 17 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2NpcTemplate.java
  8. 4 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2ArmorType.java
  9. 3 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2EtcItemType.java
  10. 2 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2ItemType.java
  11. 60 25
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2WeaponType.java
  12. 11 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java
  13. 318 533
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java
  14. 0 53
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Stats.java
  15. 88 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/TraitType.java
  16. 78 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/Debug.java
  17. 16 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestTutorialLinkHtml.java
  18. 14 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestTutorialPassCmdToServer.java
  19. 25 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/NpcHtmlMessage.java
  20. 1 1
      L2J_Server_BETA/java/com/l2jserver/log/filter/ItemFilter.java

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ItemTable.java

@@ -120,13 +120,13 @@ public class ItemTable
 		// weapon types
 		for (L2WeaponType type : L2WeaponType.values())
 		{
-			_weaponTypes.put(type.toString(), type);
+			_weaponTypes.put(type.getName(), type);
 		}
 		
 		// armor types
 		for (L2ArmorType type : L2ArmorType.values())
 		{
-			_armorTypes.put(type.toString(), type);
+			_armorTypes.put(type.getName(), type);
 		}
 		
 		_slots.put("shirt", L2Item.SLOT_UNDERWEAR);

+ 99 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcTable.java

@@ -31,8 +31,12 @@ import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
 import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
+import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.model.Elementals;
 import com.l2jserver.gameserver.model.L2DropData;
 import com.l2jserver.gameserver.model.L2MinionData;
@@ -40,10 +44,11 @@ import com.l2jserver.gameserver.model.L2NpcAIData;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.base.ClassId;
+import com.l2jserver.gameserver.model.items.type.L2WeaponType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.stats.BaseStats;
 
-public class NpcTable
+public class NpcTable extends DocumentParser
 {
 	private static final Logger _log = Logger.getLogger(NpcTable.class.getName());
 	
@@ -91,6 +96,99 @@ public class NpcTable
 	{
 		_npcs.clear();
 		restoreNpcData();
+		load();
+	}
+	
+	@Override
+	public synchronized void load()
+	{
+		parseDirectory("data/stats/npcs");
+	}
+	
+	@Override
+	protected void parseDocument()
+	{
+		NamedNodeMap attrs;
+		StatsSet set;
+		for (Node n = getCurrentDocument().getFirstChild(); n != null; n = n.getNextSibling())
+		{
+			if ("list".equals(n.getNodeName()))
+			{
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+				{
+					if ("npc".equals(d.getNodeName()))
+					{
+						attrs = d.getAttributes();
+						int id = parseInt(attrs, "id");
+						if (_npcs.containsKey(id))
+						{
+							L2NpcTemplate template = _npcs.get(id);
+							set = new StatsSet();
+							for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
+							{
+								if ((c.getNodeName() == null) || c.getNodeName().startsWith("#"))
+								{
+									continue;
+								}
+								attrs = c.getAttributes();
+								switch (c.getNodeName())
+								{
+									case "base_attack":
+									{
+										final String type = parseString(attrs, "type");
+										final int range = parseInt(attrs, "range");
+										final L2WeaponType weaponType = L2WeaponType.findByName(type);
+										template.setBaseAttackType(weaponType);
+										template.setBaseAttackRange(range);
+										break;
+									}
+									case "base_attribute":
+									{
+										for (Node b = c.getFirstChild(); b != null; b = b.getNextSibling())
+										{
+											attrs = b.getAttributes();
+											if ("attack".equals(b.getNodeName()))
+											{
+												template.setBaseFire(parseInt(attrs, "fire"));
+												template.setBaseWater(parseInt(attrs, "water"));
+												template.setBaseEarth(parseInt(attrs, "earth"));
+												template.setBaseWind(parseInt(attrs, "wind"));
+												template.setBaseHoly(parseInt(attrs, "holy"));
+												template.setBaseDark(parseInt(attrs, "dark"));
+											}
+											else if ("defend".equals(b.getNodeName()))
+											{
+												template.setBaseFireRes(parseInt(attrs, "fire"));
+												template.setBaseWaterRes(parseInt(attrs, "water"));
+												template.setBaseEarthRes(parseInt(attrs, "earth"));
+												template.setBaseWindRes(parseInt(attrs, "wind"));
+												template.setBaseHolyRes(parseInt(attrs, "holy"));
+												template.setBaseDarkRes(parseInt(attrs, "dark"));
+												template.setBaseElementRes(parseInt(attrs, "unknown"));
+											}
+										}
+										break;
+									}
+									case "npc_ai":
+									{
+										for (Node b = c.getFirstChild(); b != null; b = b.getNextSibling())
+										{
+											attrs = b.getAttributes();
+											if ("ai_param".equals(b.getNodeName()))
+											{
+												set.set(parseString(attrs, "name"), parseString(attrs, "val"));
+											}
+										}
+										template.setParameters(set);
+										break;
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
 	}
 	
 	/**
@@ -685,7 +783,6 @@ public class NpcTable
 					if (skillId == L2Skill.SKILL_NPC_RACE)
 					{
 						npcDat.setRace(level);
-						continue;
 					}
 					
 					npcSkill = SkillTable.getInstance().getInfo(skillId, level);

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentBase.java

@@ -919,7 +919,7 @@ public abstract class DocumentBase
 					String item = st.nextToken().trim();
 					for (L2WeaponType wt : L2WeaponType.values())
 					{
-						if (wt.toString().equals(item))
+						if (wt.getName().equals(item))
 						{
 							mask |= wt.mask();
 							break;
@@ -927,7 +927,7 @@ public abstract class DocumentBase
 					}
 					for (L2ArmorType at : L2ArmorType.values())
 					{
-						if (at.toString().equals(item))
+						if (at.getName().equals(item))
 						{
 							mask |= at.mask();
 							break;

+ 30 - 70
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -6871,76 +6871,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		return getStat().getPAtk(target);
 	}
 	
-	public double getPAtkAnimals(L2Character target)
-	{
-		return getStat().getPAtkAnimals(target);
-	}
-	
-	public double getPAtkDragons(L2Character target)
-	{
-		return getStat().getPAtkDragons(target);
-	}
-	
-	public double getPAtkInsects(L2Character target)
-	{
-		return getStat().getPAtkInsects(target);
-	}
-	
-	public double getPAtkMonsters(L2Character target)
-	{
-		return getStat().getPAtkMonsters(target);
-	}
-	
-	public double getPAtkPlants(L2Character target)
-	{
-		return getStat().getPAtkPlants(target);
-	}
-	
-	public double getPAtkGiants(L2Character target)
-	{
-		return getStat().getPAtkGiants(target);
-	}
-	
-	public double getPAtkMagicCreatures(L2Character target)
-	{
-		return getStat().getPAtkMagicCreatures(target);
-	}
-	
-	public double getPDefAnimals(L2Character target)
-	{
-		return getStat().getPDefAnimals(target);
-	}
-	
-	public double getPDefDragons(L2Character target)
-	{
-		return getStat().getPDefDragons(target);
-	}
-	
-	public double getPDefInsects(L2Character target)
-	{
-		return getStat().getPDefInsects(target);
-	}
-	
-	public double getPDefMonsters(L2Character target)
-	{
-		return getStat().getPDefMonsters(target);
-	}
-	
-	public double getPDefPlants(L2Character target)
-	{
-		return getStat().getPDefPlants(target);
-	}
-	
-	public double getPDefGiants(L2Character target)
-	{
-		return getStat().getPDefGiants(target);
-	}
-	
-	public double getPDefMagicCreatures(L2Character target)
-	{
-		return getStat().getPDefMagicCreatures(target);
-	}
-	
 	public int getPAtkSpd()
 	{
 		return getStat().getPAtkSpd();
@@ -7377,19 +7307,49 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		return false;
 	}
 	
+	/**
+	 * Dummy method overriden in {@link L2PcInstance}
+	 * @return the clan id of current character.
+	 */
 	public int getClanId()
 	{
 		return 0;
 	}
 	
+	/**
+	 * Dummy method overriden in {@link L2PcInstance}
+	 * @return the alliance id of current character.
+	 */
 	public int getAllyId()
 	{
 		return 0;
 	}
 	
+	/**
+	 * Notifies to listeners that current character received damage.
+	 * @param damage
+	 * @param attacker
+	 * @param skill
+	 * @param critical
+	 */
 	public void notifyDamageReceived(double damage, L2Character attacker, L2Skill skill, boolean critical)
 	{
 		getEvents().onDamageReceived(damage, attacker, skill, critical);
 		attacker.getEvents().onDamageDealt(damage, this, skill, critical);
 	}
+	
+	public L2WeaponType getAttackType()
+	{
+		final L2Weapon weapon = getActiveWeaponItem();
+		if (weapon != null)
+		{
+			return weapon.getItemType();
+		}
+		else if (isTransformed())
+		{
+			// TODO: implement me.
+			// return getTransform().getBaseAttackType();
+		}
+		return getTemplate().getBaseAttackType();
+	}
 }

+ 85 - 280
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/CharStat.java

@@ -18,6 +18,8 @@
  */
 package com.l2jserver.gameserver.model.actor.stat;
 
+import java.util.Arrays;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.Elementals;
 import com.l2jserver.gameserver.model.PcCondOverride;
@@ -30,6 +32,7 @@ import com.l2jserver.gameserver.model.stats.Calculator;
 import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.MoveType;
 import com.l2jserver.gameserver.model.stats.Stats;
+import com.l2jserver.gameserver.model.stats.TraitType;
 
 public class CharStat
 {
@@ -37,10 +40,17 @@ public class CharStat
 	private long _exp = 0;
 	private int _sp = 0;
 	private byte _level = 1;
+	private final float[] _attackTraits = new float[TraitType.values().length];
+	private final int[] _attackTraitsCount = new int[TraitType.values().length];
+	private final float[] _defenceTraits = new float[TraitType.values().length];
+	private final int[] _defenceTraitsCount = new int[TraitType.values().length];
+	private final int[] _traitsInvul = new int[TraitType.values().length];
 	
 	public CharStat(L2Character activeChar)
 	{
 		_activeChar = activeChar;
+		Arrays.fill(_attackTraits, 1.0f);
+		Arrays.fill(_defenceTraits, 1.0f);
 	}
 	
 	public final double calcStat(Stats stat, double init)
@@ -64,7 +74,7 @@ public class CharStat
 	 */
 	public final double calcStat(Stats stat, double init, L2Character target, L2Skill skill)
 	{
-		if ((_activeChar == null) || (stat == null))
+		if (stat == null)
 		{
 			return init;
 		}
@@ -120,10 +130,6 @@ public class CharStat
 	 */
 	public int getAccuracy()
 	{
-		if (_activeChar == null)
-		{
-			return 0;
-		}
 		return (int) Math.round(calcStat(Stats.ACCURACY_COMBAT, 0, null, null));
 	}
 	
@@ -137,11 +143,6 @@ public class CharStat
 	 */
 	public final float getAttackSpeedMultiplier()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (float) (((1.1) * getPAtkSpd()) / _activeChar.getTemplate().getBasePAtkSpd());
 	}
 	
@@ -150,11 +151,6 @@ public class CharStat
 	 */
 	public final int getCON()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.STAT_CON, _activeChar.getTemplate().getBaseCON());
 	}
 	
@@ -175,14 +171,14 @@ public class CharStat
 	 */
 	public int getCriticalHit(L2Character target, L2Skill skill)
 	{
-		if (_activeChar == null)
+		int val = (int) calcStat(Stats.CRITICAL_RATE, _activeChar.getTemplate().getBaseCritRate(), target, skill);
+		
+		if (!_activeChar.canOverrideCond(PcCondOverride.MAX_STATS_VALUE))
 		{
-			return 1;
+			val = Math.min(val, Config.MAX_PCRIT_RATE);
 		}
 		
-		int criticalHit = (int) calcStat(Stats.CRITICAL_RATE, _activeChar.getTemplate().getBaseCritRate(), target, skill);
-		// Set a cap of Critical Hit at 500
-		return Math.min(criticalHit, Config.MAX_PCRIT_RATE);
+		return val;
 	}
 	
 	/**
@@ -190,10 +186,6 @@ public class CharStat
 	 */
 	public final int getDEX()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
 		return (int) calcStat(Stats.STAT_DEX, _activeChar.getTemplate().getBaseDEX());
 	}
 	
@@ -203,16 +195,13 @@ public class CharStat
 	 */
 	public int getEvasionRate(L2Character target)
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		int val = (int) Math.round(calcStat(Stats.EVASION_RATE, 0, target, null));
-		if ((val > Config.MAX_EVASION) && !_activeChar.canOverrideCond(PcCondOverride.MAX_STATS_VALUE))
+		
+		if (!_activeChar.canOverrideCond(PcCondOverride.MAX_STATS_VALUE))
 		{
-			val = Config.MAX_EVASION;
+			val = Math.min(val, Config.MAX_EVASION);
 		}
+		
 		return val;
 	}
 	
@@ -231,11 +220,6 @@ public class CharStat
 	 */
 	public int getINT()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.STAT_INT, _activeChar.getTemplate().getBaseINT());
 	}
 	
@@ -255,76 +239,41 @@ public class CharStat
 	 */
 	public final int getMagicalAttackRange(L2Skill skill)
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		if (skill != null)
 		{
 			return (int) calcStat(Stats.MAGIC_ATTACK_RANGE, skill.getCastRange(), null, skill);
 		}
 		
-		return _activeChar.getTemplate().getBaseAtkRange();
+		return _activeChar.getTemplate().getBaseAttackRange();
 	}
 	
 	public int getMaxCp()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.MAX_CP, _activeChar.getTemplate().getBaseCpMax());
 	}
 	
 	public int getMaxRecoverableCp()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.MAX_RECOVERABLE_CP, getMaxCp());
 	}
 	
 	public int getMaxHp()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.MAX_HP, _activeChar.getTemplate().getBaseHpMax());
 	}
 	
 	public int getMaxRecoverableHp()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.MAX_RECOVERABLE_HP, getMaxHp());
 	}
 	
 	public int getMaxMp()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.MAX_MP, _activeChar.getTemplate().getBaseMpMax());
 	}
 	
 	public int getMaxRecoverableMp()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.MAX_RECOVERABLE_MP, getMaxMp());
 	}
 	
@@ -337,11 +286,6 @@ public class CharStat
 	 */
 	public int getMAtk(L2Character target, L2Skill skill)
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		float bonusAtk = 1;
 		if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
 		{
@@ -361,20 +305,19 @@ public class CharStat
 	 */
 	public int getMAtkSpd()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
 		float bonusSpdAtk = 1;
 		if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
 		{
 			bonusSpdAtk = Config.L2JMOD_CHAMPION_SPD_ATK;
 		}
+		
 		double val = calcStat(Stats.MAGIC_ATTACK_SPEED, _activeChar.getTemplate().getBaseMAtkSpd() * bonusSpdAtk);
-		if ((val > Config.MAX_MATK_SPEED) && !_activeChar.canOverrideCond(PcCondOverride.MAX_STATS_VALUE))
+		
+		if (!_activeChar.canOverrideCond(PcCondOverride.MAX_STATS_VALUE))
 		{
-			val = Config.MAX_MATK_SPEED;
+			val = Math.min(val, Config.MAX_MATK_SPEED);
 		}
+		
 		return (int) val;
 	}
 	
@@ -385,14 +328,14 @@ public class CharStat
 	 */
 	public final int getMCriticalHit(L2Character target, L2Skill skill)
 	{
-		if (_activeChar == null)
+		int val = (int) calcStat(Stats.MCRITICAL_RATE, 1, target, skill) * 10;
+		
+		if (!_activeChar.canOverrideCond(PcCondOverride.MAX_STATS_VALUE))
 		{
-			return 1;
+			val = Math.min(val, Config.MAX_MCRIT_RATE);
 		}
 		
-		double mrate = calcStat(Stats.MCRITICAL_RATE, 1, target, skill) * 10;
-		// Set a cap of Magical Critical Hit at 200
-		return (int) Math.min(mrate, Config.MAX_MCRIT_RATE);
+		return val;
 	}
 	
 	/**
@@ -403,11 +346,6 @@ public class CharStat
 	 */
 	public int getMDef(L2Character target, L2Skill skill)
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		// Get the base MDef of the L2Character
 		double defence = _activeChar.getTemplate().getBaseMDef();
 		
@@ -426,20 +364,11 @@ public class CharStat
 	 */
 	public final int getMEN()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.STAT_MEN, _activeChar.getTemplate().getBaseMEN());
 	}
 	
 	public float getMovementSpeedMultiplier()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
 		final float baseSpeed = _activeChar.getTemplate().getBaseMoveSpd(_activeChar.isRunning() ? MoveType.RUN : MoveType.WALK);
 		return (getMoveSpeed() / baseSpeed);
 	}
@@ -458,11 +387,6 @@ public class CharStat
 	 */
 	public float getMoveSpeed()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return _activeChar.isRunning() ? getRunSpeed() : getWalkSpeed();
 	}
 	
@@ -472,11 +396,6 @@ public class CharStat
 	 */
 	public final double getMReuseRate(L2Skill skill)
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return calcStat(Stats.MAGIC_REUSE_RATE, _activeChar.getTemplate().getBaseMReuseRate(), null, skill);
 	}
 	
@@ -486,10 +405,6 @@ public class CharStat
 	 */
 	public int getPAtk(L2Character target)
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
 		float bonusAtk = 1;
 		if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
 		{
@@ -502,78 +417,11 @@ public class CharStat
 		return (int) calcStat(Stats.POWER_ATTACK, _activeChar.getTemplate().getBasePAtk() * bonusAtk, target, null);
 	}
 	
-	/**
-	 * @param target
-	 * @return the PAtk Modifier against animals.
-	 */
-	public final double getPAtkAnimals(L2Character target)
-	{
-		return calcStat(Stats.PATK_ANIMALS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PAtk Modifier against dragons.
-	 */
-	public final double getPAtkDragons(L2Character target)
-	{
-		return calcStat(Stats.PATK_DRAGONS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PAtk Modifier against insects.
-	 */
-	public final double getPAtkInsects(L2Character target)
-	{
-		return calcStat(Stats.PATK_INSECTS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PAtk Modifier against monsters.
-	 */
-	public final double getPAtkMonsters(L2Character target)
-	{
-		return calcStat(Stats.PATK_MONSTERS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PAtk Modifier against plants.
-	 */
-	public final double getPAtkPlants(L2Character target)
-	{
-		return calcStat(Stats.PATK_PLANTS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PAtk Modifier against giants.
-	 */
-	public final double getPAtkGiants(L2Character target)
-	{
-		return calcStat(Stats.PATK_GIANTS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PAtk Modifier against magic creatures.
-	 */
-	public final double getPAtkMagicCreatures(L2Character target)
-	{
-		return calcStat(Stats.PATK_MCREATURES, 1, target, null);
-	}
-	
 	/**
 	 * @return the PAtk Speed (base+modifier) of the L2Character in function of the Armour Expertise Penalty.
 	 */
 	public int getPAtkSpd()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
 		float bonusAtk = 1;
 		if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
 		{
@@ -583,80 +431,12 @@ public class CharStat
 		return val;
 	}
 	
-	/**
-	 * @param target
-	 * @return the PDef Modifier against animals.
-	 */
-	public final double getPDefAnimals(L2Character target)
-	{
-		return calcStat(Stats.PDEF_ANIMALS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PDef Modifier against dragons.
-	 */
-	public final double getPDefDragons(L2Character target)
-	{
-		return calcStat(Stats.PDEF_DRAGONS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PDef Modifier against insects.
-	 */
-	public final double getPDefInsects(L2Character target)
-	{
-		return calcStat(Stats.PDEF_INSECTS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PDef Modifier against monsters.
-	 */
-	public final double getPDefMonsters(L2Character target)
-	{
-		return calcStat(Stats.PDEF_MONSTERS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PDef Modifier against plants.
-	 */
-	public final double getPDefPlants(L2Character target)
-	{
-		return calcStat(Stats.PDEF_PLANTS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PDef Modifier against giants.
-	 */
-	public final double getPDefGiants(L2Character target)
-	{
-		return calcStat(Stats.PDEF_GIANTS, 1, target, null);
-	}
-	
-	/**
-	 * @param target
-	 * @return the PDef Modifier against giants.
-	 */
-	public final double getPDefMagicCreatures(L2Character target)
-	{
-		return calcStat(Stats.PDEF_MCREATURES, 1, target, null);
-	}
-	
 	/**
 	 * @param target
 	 * @return the PDef (base+modifier) of the L2Character.
 	 */
 	public int getPDef(L2Character target)
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.POWER_DEFENCE, (_activeChar.isRaid()) ? _activeChar.getTemplate().getBasePDef() * Config.RAID_PDEFENCE_MULTIPLIER : _activeChar.getTemplate().getBasePDef(), target, null);
 	}
 	
@@ -665,24 +445,19 @@ public class CharStat
 	 */
 	public final int getPhysicalAttackRange()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		if (_activeChar.isTransformed())
 		{
-			return _activeChar.getTemplate().getBaseAtkRange();
+			return _activeChar.getTemplate().getBaseAttackRange();
 		}
 		// Polearm handled here for now. Basically L2PcInstance could have a function
 		// similar to FuncBowAtkRange and NPC are defined in DP.
-		L2Weapon weaponItem = _activeChar.getActiveWeaponItem();
+		final L2Weapon weaponItem = _activeChar.getActiveWeaponItem();
 		if ((weaponItem != null) && (weaponItem.getItemType() == L2WeaponType.POLE))
 		{
 			return (int) calcStat(Stats.POWER_ATTACK_RANGE, 66);
 		}
 		
-		return (int) calcStat(Stats.POWER_ATTACK_RANGE, _activeChar.getTemplate().getBaseAtkRange());
+		return (int) calcStat(Stats.POWER_ATTACK_RANGE, _activeChar.getTemplate().getBaseAttackRange());
 	}
 	
 	/**
@@ -699,11 +474,6 @@ public class CharStat
 	 */
 	public int getRunSpeed()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		// err we should be adding TO the persons run speed
 		// not making it a constant
 		double baseRunSpd = getBaseMoveSpeed(MoveType.RUN);
@@ -739,11 +509,6 @@ public class CharStat
 	 */
 	public final int getSTR()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.STAT_STR, _activeChar.getTemplate().getBaseSTR());
 	}
 	
@@ -752,11 +517,6 @@ public class CharStat
 	 */
 	public int getWalkSpeed()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		double baseWalkSpd = getBaseMoveSpeed(MoveType.WALK);
 		
 		if (baseWalkSpd == 0)
@@ -772,11 +532,6 @@ public class CharStat
 	 */
 	public final int getWIT()
 	{
-		if (_activeChar == null)
-		{
-			return 1;
-		}
-		
 		return (int) calcStat(Stats.STAT_WIT, _activeChar.getTemplate().getBaseWIT());
 	}
 	
@@ -926,7 +681,57 @@ public class CharStat
 			case Elementals.DARK:
 				return (int) calcStat(Stats.DARK_RES, _activeChar.getTemplate().getBaseDarkRes());
 			default:
-				return 0;
+				return (int) _activeChar.getTemplate().getBaseElementRes();
 		}
 	}
+	
+	public float getAttackTrait(TraitType traitType)
+	{
+		return _attackTraits[traitType.getId()];
+	}
+	
+	public float[] getAttackTraits()
+	{
+		return _attackTraits;
+	}
+	
+	public boolean hasAttackTrait(TraitType traitType)
+	{
+		return _attackTraitsCount[traitType.getId()] > 0;
+	}
+	
+	public int[] getAttackTraitsCount()
+	{
+		return _attackTraitsCount;
+	}
+	
+	public float getDefenceTrait(TraitType traitType)
+	{
+		return _defenceTraits[traitType.getId()];
+	}
+	
+	public float[] getDefenceTraits()
+	{
+		return _defenceTraits;
+	}
+	
+	public boolean hasDefenceTrait(TraitType traitType)
+	{
+		return _defenceTraitsCount[traitType.getId()] > 0;
+	}
+	
+	public int[] getDefenceTraitsCount()
+	{
+		return _defenceTraitsCount;
+	}
+	
+	public boolean isTraitInvul(TraitType traitType)
+	{
+		return _traitsInvul[traitType.getId()] > 0;
+	}
+	
+	public int[] getTraitsInvul()
+	{
+		return _traitsInvul;
+	}
 }

+ 57 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2CharTemplate.java

@@ -21,6 +21,7 @@ package com.l2jserver.gameserver.model.actor.templates;
 import java.util.Map;
 
 import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.items.type.L2WeaponType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.stats.MoveType;
 
@@ -48,8 +49,9 @@ public class L2CharTemplate
 	private int _basePAtkSpd;
 	private int _baseMAtkSpd;
 	private float _baseMReuseRate;
+	private int _baseAttackRange;
+	private L2WeaponType _baseAttackType;
 	private int _baseShldDef;
-	private int _baseAtkRange;
 	private int _baseShldRate;
 	private int _baseCritRate;
 	private int _baseMCritRate;
@@ -85,6 +87,7 @@ public class L2CharTemplate
 	private double _baseEarthRes;
 	private double _baseHolyRes;
 	private double _baseDarkRes;
+	private double _baseElementRes;
 	
 	private int _baseMpConsumeRate;
 	private int _baseHpConsumeRate;
@@ -129,7 +132,8 @@ public class L2CharTemplate
 		_baseMAtkSpd = set.getInteger("baseMAtkSpd", 333);
 		_baseMReuseRate = set.getFloat("baseMReuseDelay", 1.f);
 		_baseShldDef = set.getInteger("baseShldDef", 0);
-		_baseAtkRange = set.getInteger("baseAtkRange", 0);
+		_baseAttackRange = set.getInteger("baseAtkRange", 40);
+		_baseAttackType = L2WeaponType.findByName(set.getString("baseAtkType", "Fist"));
 		_baseShldRate = set.getInteger("baseShldRate", 0);
 		_baseCritRate = set.getInteger("baseCritRate", 4);
 		_baseMCritRate = set.getInteger("baseMCritRate", 0);
@@ -166,6 +170,7 @@ public class L2CharTemplate
 		_baseEarthRes = set.getInteger("baseEarthRes", 0);
 		_baseHolyRes = set.getInteger("baseHolyRes", 0);
 		_baseDarkRes = set.getInteger("baseDarkRes", 0);
+		_baseElementRes = set.getInteger("baseElementRes", 0);
 		
 		// C4 Stats
 		_baseMpConsumeRate = set.getInteger("baseMpConsumeRate", 0);
@@ -282,6 +287,14 @@ public class L2CharTemplate
 		return _baseDarkRes;
 	}
 	
+	/**
+	 * @return the _baseElementRes
+	 */
+	public double getBaseElementRes()
+	{
+		return _baseElementRes;
+	}
+	
 	/**
 	 * @return the baseSTR
 	 */
@@ -426,14 +439,6 @@ public class L2CharTemplate
 		return _baseShldDef;
 	}
 	
-	/**
-	 * @return the baseAtkRange
-	 */
-	public int getBaseAtkRange()
-	{
-		return _baseAtkRange;
-	}
-	
 	/**
 	 * @return the baseShldRate
 	 */
@@ -751,6 +756,48 @@ public class L2CharTemplate
 		_baseDarkRes = baseDarkRes;
 	}
 	
+	/**
+	 * @param baseElementRes
+	 */
+	public void setBaseElementRes(double baseElementRes)
+	{
+		_baseElementRes = baseElementRes;
+	}
+	
+	/**
+	 * @return the base attack type (Sword, Fist, Blunt, etc..)
+	 */
+	public L2WeaponType getBaseAttackType()
+	{
+		return _baseAttackType;
+	}
+	
+	/**
+	 * Sets base attack type.
+	 * @param type
+	 */
+	public void setBaseAttackType(L2WeaponType type)
+	{
+		_baseAttackType = type;
+	}
+	
+	/**
+	 * @return the baseAtkRange
+	 */
+	public int getBaseAttackRange()
+	{
+		return _baseAttackRange;
+	}
+	
+	/**
+	 * Sets base attack range.
+	 * @param val
+	 */
+	public void setBaseAttackRange(int val)
+	{
+		_baseAttackRange = val;
+	}
+	
 	/**
 	 * Overridden in L2NpcTemplate
 	 * @return the characters skills

+ 17 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2NpcTemplate.java

@@ -84,6 +84,8 @@ public final class L2NpcTemplate extends L2CharTemplate
 	
 	private L2NpcAIData _aiData;
 	
+	private StatsSet _parameters;
+	
 	public static enum AIType
 	{
 		FIGHTER,
@@ -921,4 +923,19 @@ public final class L2NpcTemplate extends L2CharTemplate
 				break;
 		}
 	}
+	
+	public boolean hasParameters()
+	{
+		return _parameters != null;
+	}
+	
+	public StatsSet getParameters()
+	{
+		return _parameters;
+	}
+	
+	public void setParameters(StatsSet set)
+	{
+		_parameters = set;
+	}
 }

+ 4 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2ArmorType.java

@@ -40,15 +40,14 @@ public enum L2ArmorType implements L2ItemType
 	 * Constructor of the L2ArmorType.
 	 * @param name : String designating the name of the ArmorType
 	 */
-	L2ArmorType(String name)
+	private L2ArmorType(String name)
 	{
 		_mask = 1 << (ordinal() + L2WeaponType.values().length);
 		_name = name;
 	}
 	
 	/**
-	 * Returns the ID of the ArmorType after applying a mask.
-	 * @return int : ID of the ArmorType after mask
+	 * @return the ID of the ArmorType after applying a mask.
 	 */
 	@Override
 	public int mask()
@@ -57,11 +56,10 @@ public enum L2ArmorType implements L2ItemType
 	}
 	
 	/**
-	 * Returns the name of the ArmorType
-	 * @return String
+	 * @return the name of the ArmorType
 	 */
 	@Override
-	public String toString()
+	public String getName()
 	{
 		return _name;
 	}

+ 3 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2EtcItemType.java

@@ -76,8 +76,7 @@ public enum L2EtcItemType implements L2ItemType
 	}
 	
 	/**
-	 * Returns the ID of the item after applying the mask.
-	 * @return int : ID of the item
+	 * @return the ID of the item after applying the mask.
 	 */
 	@Override
 	public int mask()
@@ -86,11 +85,10 @@ public enum L2EtcItemType implements L2ItemType
 	}
 	
 	/**
-	 * Returns the name of the EtcItemType
-	 * @return String
+	 * @return the name of the EtcItemType
 	 */
 	@Override
-	public String toString()
+	public String getName()
 	{
 		return _name;
 	}

+ 2 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2ItemType.java

@@ -25,4 +25,6 @@ package com.l2jserver.gameserver.model.items.type;
 public interface L2ItemType
 {
 	public int mask();
+	
+	public String getName();
 }

+ 60 - 25
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/type/L2WeaponType.java

@@ -18,50 +18,58 @@
  */
 package com.l2jserver.gameserver.model.items.type;
 
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.l2jserver.gameserver.model.stats.TraitType;
+
 /**
  * @author mkizub <BR>
  *         Description of Weapon Type
  */
 public enum L2WeaponType implements L2ItemType
 {
-	SWORD("Sword"),
-	BLUNT("Blunt"),
-	DAGGER("Dagger"),
-	BOW("Bow"),
-	POLE("Pole"),
-	NONE("None"),
-	DUAL("Dual Sword"),
-	ETC("Etc"),
-	FIST("Fist"),
-	DUALFIST("Dual Fist"),
-	FISHINGROD("Rod"),
-	RAPIER("Rapier"),
-	ANCIENTSWORD("Ancient"),
-	CROSSBOW("Crossbow"),
-	FLAG("Flag"),
-	OWNTHING("Ownthing"),
-	DUALDAGGER("Dual Dagger"),
+	SWORD("Sword", TraitType.SWORD),
+	BLUNT("Blunt", TraitType.BLUNT),
+	DAGGER("Dagger", TraitType.DAGGER),
+	BOW("Bow", TraitType.BOW),
+	POLE("Pole", TraitType.POLE),
+	NONE("None", TraitType.NONE),
+	DUAL("Dual Sword", TraitType.DUAL),
+	ETC("Etc", TraitType.ETC),
+	FIST("Fist", TraitType.FIST),
+	DUALFIST("Dual Fist", TraitType.DUALFIST),
+	FISHINGROD("Rod", TraitType.NONE),
+	RAPIER("Rapier", TraitType.RAPIER),
+	ANCIENTSWORD("Ancient", TraitType.ANCIENTSWORD),
+	CROSSBOW("Crossbow", TraitType.CROSSBOW),
+	FLAG("Flag", TraitType.NONE),
+	OWNTHING("Ownthing", TraitType.NONE),
+	DUALDAGGER("Dual Dagger", TraitType.DUALDAGGER),
 	
 	// L2J CUSTOM, BACKWARD COMPATIBILITY
-	BIGBLUNT("Big Blunt"),
-	BIGSWORD("Big Sword");
+	BIGBLUNT("Big Blunt", TraitType.BLUNT),
+	BIGSWORD("Big Sword", TraitType.SWORD);
 	
+	private static final Logger _log = Logger.getLogger(L2WeaponType.class.getName());
 	private final int _mask;
 	private final String _name;
+	private final TraitType _traitType;
 	
 	/**
 	 * Constructor of the L2WeaponType.
 	 * @param name : String designating the name of the WeaponType
+	 * @param traitType
 	 */
-	private L2WeaponType(String name)
+	private L2WeaponType(String name, TraitType traitType)
 	{
 		_mask = 1 << ordinal();
 		_name = name;
+		_traitType = traitType;
 	}
 	
 	/**
-	 * Returns the ID of the item after applying the mask.
-	 * @return int : ID of the item
+	 * @return the ID of the item after applying the mask.
 	 */
 	@Override
 	public int mask()
@@ -70,13 +78,40 @@ public enum L2WeaponType implements L2ItemType
 	}
 	
 	/**
-	 * Returns the name of the WeaponType
-	 * @return String
+	 * @return the name of the WeaponType
 	 */
 	@Override
-	public String toString()
+	public String getName()
 	{
 		return _name;
 	}
 	
+	/**
+	 * @return L2TraitType the type of the WeaponType
+	 */
+	public TraitType getTraitType()
+	{
+		return _traitType;
+	}
+	
+	public static L2WeaponType findByName(String name)
+	{
+		if (name.equals("DUAL"))
+		{
+			name = "Dual Sword";
+		}
+		else if (name.equals("DUALFIST"))
+		{
+			name = "Dual Fist";
+		}
+		for (L2WeaponType type : values())
+		{
+			if (type.getName().equalsIgnoreCase(name))
+			{
+				return type;
+			}
+		}
+		_log.log(Level.WARNING, L2WeaponType.class.getSimpleName() + ": Requested unexistent enum member: " + name, new IllegalStateException());
+		return FIST;
+	}
 }

+ 11 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -59,6 +59,7 @@ import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.model.stats.BaseStats;
 import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Formulas;
+import com.l2jserver.gameserver.model.stats.TraitType;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.util.Util;
@@ -95,7 +96,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	/** Operative type: passive, active, toggle. */
 	private final L2SkillOpType _operateType;
 	private final int _magic;
-	private final L2TraitType _traitType;
+	private final TraitType _traitType;
 	private final boolean _staticReuse;
 	/** MP consumption. */
 	private final int _mpConsume;
@@ -146,6 +147,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	private final double _pvePower;
 	private final int _magicLevel;
 	private final int _lvlBonusRate;
+	private final int _activateRate;
 	private final int _minChance;
 	private final int _maxChance;
 	private final int _blowChance;
@@ -239,7 +241,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		_name = set.getString("name", "");
 		_operateType = set.getEnum("operateType", L2SkillOpType.class);
 		_magic = set.getInteger("isMagic", 0);
-		_traitType = set.getEnum("trait", L2TraitType.class, L2TraitType.NONE);
+		_traitType = set.getEnum("trait", TraitType.class, TraitType.NONE);
 		_staticReuse = set.getBool("staticReuse", false);
 		_mpConsume = set.getInteger("mpConsume", 0);
 		_mpInitialConsume = set.getInteger("mpInitialConsume", 0);
@@ -352,6 +354,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		_pvePower = set.getFloat("pvePower", (float) getPower());
 		_magicLevel = set.getInteger("magicLvl", 0);
 		_lvlBonusRate = set.getInteger("lvlBonusRate", 0);
+		_activateRate = set.getInteger("activateRate", -1);
 		_minChance = set.getInteger("minChance", Config.MIN_ABNORMAL_STATE_SUCCESS_RATE);
 		_maxChance = set.getInteger("maxChance", Config.MAX_ABNORMAL_STATE_SUCCESS_RATE);
 		_ignoreShield = set.getBool("ignoreShld", false);
@@ -426,7 +429,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _skillType;
 	}
 	
-	public final L2TraitType getTraitType()
+	public final TraitType getTraitType()
 	{
 		return _traitType;
 	}
@@ -545,6 +548,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _lvlBonusRate;
 	}
 	
+	public final int getActivateRate()
+	{
+		return _activateRate;
+	}
+	
 	/**
 	 * Return custom minimum skill/effect chance.
 	 * @return

文件差异内容过多而无法显示
+ 318 - 533
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java


+ 0 - 53
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Stats.java

@@ -110,25 +110,14 @@ public enum Stats
 	FALL("fall"),
 	
 	// VULNERABILITIES
-	BLEED_VULN("bleedVuln"),
-	POISON_VULN("poisonVuln"),
-	STUN_VULN("stunVuln"),
-	PARALYZE_VULN("paralyzeVuln"),
-	ROOT_VULN("rootVuln"),
-	SLEEP_VULN("sleepVuln"),
-	PHYSICALBLOCKADE_VULN("physicalBlockadeVuln"),
-	BOSS_VULN("bossVuln"),
-	GUST_VULN("gustVuln"),
 	DAMAGE_ZONE_VULN("damageZoneVuln"),
 	MOVEMENT_VULN("movementVuln"),
 	CANCEL_VULN("cancelVuln"), // Resistance for cancel type skills
-	DERANGEMENT_VULN("derangementVuln"),
 	DEBUFF_VULN("debuffVuln"),
 	BUFF_VULN("buffVuln"),
 	CRIT_VULN("critVuln"), // Resistance to critical damage in percent.
 	CRIT_ADD_VULN("critAddVuln"), // Resistance to critical damage in value (Example: +100 will be 100 more critical damage, NOT 100% more).
 	MAGIC_DAMAGE_VULN("magicDamVul"),
-	VALAKAS_VULN("valakasVuln"),
 	
 	// RESISTANCES
 	FIRE_RES("fireRes"),
@@ -150,35 +139,9 @@ public enum Stats
 	DARK_POWER("darkPower"),
 	
 	// PROFICIENCY
-	BLEED_PROF("bleedProf"),
-	POISON_PROF("poisonProf"),
-	STUN_PROF("stunProf"),
-	PARALYZE_PROF("paralyzeProf"),
-	ROOT_PROF("rootProf"),
-	SLEEP_PROF("sleepProf"),
 	PROF("movementProf"),
 	CANCEL_PROF("cancelProf"),
-	DERANGEMENT_PROF("derangementProf"),
 	DEBUFF_PROF("debuffProf"),
-	VALAKAS_PROF("valakasProf"),
-	
-	// WEAPONS VULNERABILITIES
-	SWORD_WPN_VULN("swordWpnVuln"),
-	BLUNT_WPN_VULN("bluntWpnVuln"),
-	DAGGER_WPN_VULN("daggerWpnVuln"),
-	BOW_WPN_VULN("bowWpnVuln"),
-	CROSSBOW_WPN_VULN("crossbowWpnVuln"),
-	POLE_WPN_VULN("poleWpnVuln"),
-	ETC_WPN_VULN("etcWpnVuln"),
-	FIST_WPN_VULN("fistWpnVuln"),
-	DUAL_WPN_VULN("dualWpnVuln"),
-	DUALFIST_WPN_VULN("dualFistWpnVuln"),
-	BIGSWORD_WPN_VULN("bigSwordWpnVuln"),
-	BIGBLUNT_WPN_VULN("bigBluntWpnVuln"),
-	DUALDAGGER_WPN_VULN("dualDaggerWpnVuln"),
-	RAPIER_WPN_VULN("rapierWpnVuln"),
-	ANCIENT_WPN_VULN("ancientWpnVuln"),
-	PET_WPN_VULN("petWpnVuln"),
 	
 	REFLECT_DAMAGE_PERCENT("reflectDam"),
 	REFLECT_SKILL_MAGIC("reflectSkillMagic"),
@@ -194,22 +157,6 @@ public enum Stats
 	WEIGHT_LIMIT("weightLimit"),
 	WEIGHT_PENALTY("weightPenalty"),
 	
-	PATK_PLANTS("pAtk-plants"),
-	PATK_INSECTS("pAtk-insects"),
-	PATK_ANIMALS("pAtk-animals"),
-	PATK_MONSTERS("pAtk-monsters"),
-	PATK_DRAGONS("pAtk-dragons"),
-	PATK_GIANTS("pAtk-giants"),
-	PATK_MCREATURES("pAtk-magicCreature"),
-	
-	PDEF_PLANTS("pDef-plants"),
-	PDEF_INSECTS("pDef-insects"),
-	PDEF_ANIMALS("pDef-animals"),
-	PDEF_MONSTERS("pDef-monsters"),
-	PDEF_DRAGONS("pDef-dragons"),
-	PDEF_GIANTS("pDef-giants"),
-	PDEF_MCREATURES("pDef-magicCreature"),
-	
 	// ExSkill
 	INV_LIM("inventoryLimit"),
 	WH_LIM("whLimit"),

+ 88 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/TraitType.java

@@ -0,0 +1,88 @@
+/*
+ * 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.stats;
+
+/**
+ * @author UnAfraid, Nos
+ */
+public enum TraitType
+{
+	UNK_0(0, 0),
+	SWORD(1, 1),
+	BLUNT(2, 1),
+	DAGGER(3, 1),
+	POLE(4, 1),
+	FIST(5, 1),
+	BOW(6, 1),
+	ETC(7, 1),
+	UNK_8(8, 0),
+	POISON(9, 3),
+	HOLD(10, 3),
+	BLEED(11, 3),
+	SLEEP(12, 3),
+	SHOCK(13, 3),
+	DERANGEMENT(14, 3),
+	BUG_WEAKNESS(15, 2),
+	ANIMAL_WEAKNESS(16, 2),
+	PLANT_WEAKNESS(17, 2),
+	BEAST_WEAKNESS(18, 2),
+	DRAGON_WEAKNESS(19, 2),
+	PARALYZE(20, 3),
+	DUAL(21, 1),
+	DUALFIST(22, 1),
+	BOSS(23, 3),
+	GIANT_WEAKNESS(24, 2),
+	CONSTRUCT_WEAKNESS(25, 2),
+	DEATH(26, 3),
+	VALAKAS(27, 2),
+	UNK_28(28, 2),
+	UNK_29(29, 3),
+	ROOT_PHYSICALLY(30, 3),
+	UNK_31(31, 3),
+	RAPIER(32, 1),
+	CROSSBOW(33, 1),
+	ANCIENTSWORD(34, 1),
+	TURN_STONE(35, 3),
+	GUST(36, 3),
+	PHYSICAL_BLOCKADE(37, 3),
+	UNK_38(38, 3),
+	UNK_39(39, 3),
+	UNK_40(40, 3),
+	DUALDAGGER(41, 1),
+	NONE(42, 0);
+	
+	private final int _id;
+	private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance
+	
+	TraitType(int id, int type)
+	{
+		_id = id;
+		_type = type;
+	}
+	
+	public int getId()
+	{
+		return _id;
+	}
+	
+	public int getType()
+	{
+		return _type;
+	}
+}

+ 78 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/Debug.java

@@ -0,0 +1,78 @@
+/*
+ * 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.network;
+
+import java.util.Map.Entry;
+
+import com.l2jserver.gameserver.model.Elementals;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
+import com.l2jserver.gameserver.network.serverpackets.TutorialShowHtml;
+
+/**
+ * @author UnAfraid
+ */
+public class Debug
+{
+	public static void sendSkillDebug(L2Character attacker, L2Character target, L2Skill skill, StatsSet set)
+	{
+		if (!attacker.isPlayer())
+		{
+			return;
+		}
+		
+		final StringBuilder sb = new StringBuilder();
+		for (Entry<String, Object> entry : set.getSet().entrySet())
+		{
+			sb.append("<tr><td>" + entry.getKey() + "</td><td><font color=\"LEVEL\">" + entry.getValue() + "</font></td></tr>");
+		}
+		
+		final NpcHtmlMessage msg = new NpcHtmlMessage(0);
+		msg.setFile(attacker.getActingPlayer().getHtmlPrefix(), "data/html/admin/skilldebug.htm");
+		msg.replace("%patk%", target.getPAtk(target));
+		msg.replace("%matk%", target.getMAtk(target, skill));
+		msg.replace("%pdef%", target.getPDef(target));
+		msg.replace("%mdef%", target.getMDef(target, skill));
+		msg.replace("%acc%", target.getAccuracy());
+		msg.replace("%evas%", target.getEvasionRate(target));
+		msg.replace("%crit%", target.getCriticalHit(target, skill));
+		msg.replace("%speed%", target.getRunSpeed());
+		msg.replace("%pAtkSpd%", target.getPAtkSpd());
+		msg.replace("%mAtkSpd%", target.getMAtkSpd());
+		msg.replace("%str%", target.getSTR());
+		msg.replace("%dex%", target.getDEX());
+		msg.replace("%con%", target.getCON());
+		msg.replace("%int%", target.getINT());
+		msg.replace("%wit%", target.getWIT());
+		msg.replace("%men%", target.getMEN());
+		msg.replace("%atkElemType%", Elementals.getElementName(target.getAttackElement()));
+		msg.replace("%atkElemVal%", target.getAttackElementValue(target.getAttackElement()));
+		msg.replace("%fireDef%", target.getDefenseElementValue((byte) 0));
+		msg.replace("%waterDef%", target.getDefenseElementValue((byte) 1));
+		msg.replace("%windDef%", target.getDefenseElementValue((byte) 2));
+		msg.replace("%earthDef%", target.getDefenseElementValue((byte) 3));
+		msg.replace("%holyDef%", target.getDefenseElementValue((byte) 4));
+		msg.replace("%darkDef%", target.getDefenseElementValue((byte) 5));
+		msg.replace("%skill%", skill.toString());
+		msg.replace("%details%", sb.toString());
+		attacker.sendPacket(new TutorialShowHtml(msg.getHtml()));
+	}
+}

+ 16 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestTutorialLinkHtml.java

@@ -18,6 +18,8 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
+import com.l2jserver.gameserver.handler.BypassHandler;
+import com.l2jserver.gameserver.handler.IBypassHandler;
 import com.l2jserver.gameserver.model.actor.instance.L2ClassMasterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.quest.QuestState;
@@ -37,18 +39,26 @@ public class RequestTutorialLinkHtml extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance player = getClient().getActiveChar();
+		final L2PcInstance player = getClient().getActiveChar();
 		if (player == null)
 		{
 			return;
 		}
 		
-		L2ClassMasterInstance.onTutorialLink(player, _bypass);
-		
-		QuestState qs = player.getQuestState("255_Tutorial");
-		if (qs != null)
+		final IBypassHandler handler = BypassHandler.getInstance().getHandler(_bypass);
+		if (handler != null)
+		{
+			handler.useBypass(_bypass, player, null);
+		}
+		else
 		{
-			qs.getQuest().notifyEvent(_bypass, null, player);
+			L2ClassMasterInstance.onTutorialLink(player, _bypass);
+			
+			QuestState qs = player.getQuestState("255_Tutorial");
+			if (qs != null)
+			{
+				qs.getQuest().notifyEvent(_bypass, null, player);
+			}
 		}
 	}
 	

+ 14 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestTutorialPassCmdToServer.java

@@ -18,6 +18,8 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
+import com.l2jserver.gameserver.handler.BypassHandler;
+import com.l2jserver.gameserver.handler.IBypassHandler;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.quest.QuestState;
 
@@ -36,17 +38,23 @@ public class RequestTutorialPassCmdToServer extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance player = getClient().getActiveChar();
-		
+		final L2PcInstance player = getClient().getActiveChar();
 		if (player == null)
 		{
 			return;
 		}
-		
-		QuestState qs = player.getQuestState("255_Tutorial");
-		if (qs != null)
+		final IBypassHandler handler = BypassHandler.getInstance().getHandler(_bypass);
+		if (handler != null)
 		{
-			qs.getQuest().notifyEvent(_bypass, null, player);
+			handler.useBypass(_bypass, player, null);
+		}
+		else
+		{
+			QuestState qs = player.getQuestState("255_Tutorial");
+			if (qs != null)
+			{
+				qs.getQuest().notifyEvent(_bypass, null, player);
+			}
 		}
 	}
 	

+ 25 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/NpcHtmlMessage.java

@@ -222,6 +222,26 @@ public final class NpcHtmlMessage extends L2GameServerPacket
 		_html = _html.replaceAll(pattern, value.replaceAll("\\$", "\\\\\\$"));
 	}
 	
+	public void replace(String pattern, boolean val)
+	{
+		replace(pattern, String.valueOf(val));
+	}
+	
+	public void replace(String pattern, int val)
+	{
+		replace(pattern, String.valueOf(val));
+	}
+	
+	public void replace(String pattern, long val)
+	{
+		replace(pattern, String.valueOf(val));
+	}
+	
+	public void replace(String pattern, double val)
+	{
+		replace(pattern, String.valueOf(val));
+	}
+	
 	private final void buildBypassCache(L2PcInstance activeChar)
 	{
 		if (activeChar == null)
@@ -262,6 +282,11 @@ public final class NpcHtmlMessage extends L2GameServerPacket
 		}
 	}
 	
+	public String getHtml()
+	{
+		return _html;
+	}
+	
 	@Override
 	protected final void writeImpl()
 	{

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/log/filter/ItemFilter.java

@@ -55,7 +55,7 @@ public class ItemFilter implements Filter
 		{
 			// if (record.getParameters() == null || record.getParameters().length == 0 || !(record.getParameters()[0] instanceof L2ItemInstance)) return true;
 			L2ItemInstance item = ((L2ItemInstance) record.getParameters()[0]);
-			if (!_excludeItemType.contains(item.getItemType().toString()))
+			if (!_excludeItemType.contains(item.getItemType().getName()))
 			{
 				return true;
 			}

部分文件因为文件数量过多而无法显示