Sfoglia il codice sorgente

BETA: Some base stats formula reworks.
- Fixed Magical Critical Rate with retail formula (WIT modifier * 10).
- Fixed Critical Rate with retail formula.
- Improved some code and cleanup.
- Moved getLevelMod() in L2Character.java and deleted in some other files.
- Fixed Magical Critical Rate values in Skills.
- Added pDef on FuncPDefMod.java when Underwear and Cloak Slots are empty.
- Fixed mAtk/pAtkSpd formula for skills ((time in milliseconds / current pAtk/mAtkSpd) * base pAtk/mAtkSpd).
- Cleanup char_templates.sql.

Thanks '''MELERIX''', '''UnAfraid''' and '''Zoey76''' for help.

Adry_85 13 anni fa
parent
commit
585bc65356

+ 3 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/CharTemplateTable.java

@@ -70,16 +70,13 @@ public final class CharTemplateTable
 				set.set("lvlCpMod", rset.getFloat("defaultCpMod"));
 				set.set("lvlMpAdd", rset.getFloat("defaultMpAdd"));
 				set.set("lvlMpMod", rset.getFloat("defaultMpMod"));
-				set.set("baseHpReg", 1.5);
+				set.set("baseHpReg", 2);
 				set.set("baseMpReg", 0.9);
 				set.set("basePAtk", rset.getInt("p_atk"));
-				set.set("basePDef", /* classId.isMage()? 77 : 129 */rset.getInt("p_def"));
+				set.set("basePDef", rset.getInt("p_def"));
 				set.set("baseMAtk", rset.getInt("m_atk"));
-				set.set("baseMDef", rset.getInt("char_templates.m_def"));
+				set.set("baseMDef", rset.getInt("m_def"));
 				set.set("classBaseLevel", rset.getInt("class_lvl"));
-				set.set("basePAtkSpd", rset.getInt("p_spd"));
-				set.set("baseMAtkSpd", /* classId.isMage()? 166 : 333 */rset.getInt("char_templates.m_spd"));
-				set.set("baseCritRate", rset.getInt("char_templates.critical") / 10);
 				set.set("baseRunSpd", rset.getInt("move_spd"));
 				set.set("baseWalkSpd", 0);
 				set.set("baseShldDef", 0);

+ 3 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java

@@ -39,6 +39,7 @@ import com.l2jserver.gameserver.model.entity.TvTEventTeam;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillDrain;
+import com.l2jserver.gameserver.model.stats.BaseStats;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
@@ -261,8 +262,8 @@ public class L2CubicInstance
 	
 	public final int getMCriticalHit(L2Character target, L2Skill skill)
 	{
-		// TODO: Temporary now mcrit for cubics is the baseMCritRate of its owner
-		return _owner.getTemplate().getBaseMCritRate();
+		// Magical Critical Rate for cubics is the base Magical Critical Rate of its owner
+		return (int) (BaseStats.WIT.calcBonus(_owner) * 10);
 	}
 	
 	public int getMAtk()

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

@@ -7092,12 +7092,6 @@ public final class L2PcInstance extends L2Playable
 		return _accessLevel;
 	}
 	
-	@Override
-	public double getLevelMod()
-	{
-		return (100.0 - 11 + getLevel()) / 100.0;
-	}
-	
 	/**
 	 * Update Stats of the L2PcInstance client side by sending Server->Client packet UserInfo/StatusUpdate to this L2PcInstance and CharInfo/StatusUpdate to all L2PcInstance in its _KnownPlayers (broadcast).<BR><BR>
 	 * @param broadcastType 

+ 0 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java

@@ -307,12 +307,6 @@ public class L2PetInstance extends L2Summon
 		setStat(new PetStat(this));
 	}
 	
-	@Override
-	public double getLevelMod()
-	{
-		return (100.0 - 11 + getLevel()) / 100.0;
-	}
-	
 	public boolean isRespawned()
 	{
 		return _respawned;

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

@@ -178,8 +178,7 @@ public class CharStat
 		if (_activeChar == null)
 			return 1;
 		
-		int criticalHit = (int) Math.round(calcStat(Stats.CRITICAL_RATE, _activeChar.getTemplate().getBaseCritRate(), target, skill)*10.0 + 0.5);
-		criticalHit /= 10;
+		int criticalHit = (int) calcStat(Stats.CRITICAL_RATE, _activeChar.getTemplate().getBaseCritRate(), target, skill);
 		// Set a cap of Critical Hit at 500
 		if (criticalHit > Config.MAX_PCRIT_RATE)
 			criticalHit = Config.MAX_PCRIT_RATE;
@@ -409,7 +408,8 @@ public class CharStat
 		if (_activeChar == null)
 			return 1;
 		
-		double mrate = calcStat(Stats.MCRITICAL_RATE, _activeChar.getTemplate().getBaseMCritRate(), target, skill);
+		double mrate = calcStat(Stats.MCRITICAL_RATE, 1, target, skill) * 10;
+		// Set a cap of Magical Critical Hit at 200
 		if(mrate > Config.MAX_MCRIT_RATE)
 			mrate = Config.MAX_MCRIT_RATE;
 		return (int) mrate;
@@ -432,7 +432,7 @@ public class CharStat
 		if (_activeChar == null)
 			return 1;
 		
-		// Get the base MAtk of the L2Character
+		// Get the base MDef of the L2Character
 		double defence = _activeChar.getTemplate().getBaseMDef();
 		
 		// Calculate modifier for Raid Bosses

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

@@ -115,14 +115,14 @@ public class L2CharTemplate
 		_baseMAtk = set.getInteger("baseMAtk", 0);
 		_basePDef = set.getInteger("basePDef", 0);
 		_baseMDef = set.getInteger("baseMDef", 0);
-		_basePAtkSpd = set.getInteger("basePAtkSpd", 0);
-		_baseMAtkSpd = set.getInteger("baseMAtkSpd", 0);
+		_basePAtkSpd = set.getInteger("basePAtkSpd", 300);
+		_baseMAtkSpd = set.getInteger("baseMAtkSpd", 333);
 		_baseMReuseRate = set.getFloat("baseMReuseDelay", 1.f);
 		_baseShldDef = set.getInteger("baseShldDef", 0);
 		_baseAtkRange = set.getInteger("baseAtkRange", 0);
 		_baseShldRate = set.getInteger("baseShldRate", 0);
-		_baseCritRate = set.getInteger("baseCritRate", 0);
-		_baseMCritRate = set.getInteger("baseMCritRate", 80); // CT2: The magic critical rate has been increased to 10 times.
+		_baseCritRate = set.getInteger("baseCritRate", 4);
+		_baseMCritRate = set.getInteger("baseMCritRate", 0);
 		_baseWalkSpd = set.getInteger("baseWalkSpd", 0);
 		_baseRunSpd = set.getInteger("baseRunSpd", 0);
 		

+ 6 - 24
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/funcs/formulas/FuncAtkAccuracy.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.model.skills.funcs.formulas;
 
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Stats;
@@ -40,32 +39,15 @@ public class FuncAtkAccuracy extends Func
 	public void calc(Env env)
 	{
 		final int level = env.getCharacter().getLevel();
-		if (env.getCharacter() instanceof L2PcInstance)
+		// [Square(DEX)] * 6 + lvl + weapon hitbonus;
+		env.addValue((Math.sqrt(env.getCharacter().getDEX()) * 6) + level);
+		if (level > 77)
 		{
-			// [Square(DEX)]*6 + lvl + weapon hitbonus;
-			env.addValue((Math.sqrt(env.getCharacter().getDEX()) * 6) + level);
-			if (level > 77)
-			{
-				env.addValue((level - 77) + 1);
-			}
-			if (level > 69)
-			{
-				env.addValue(level - 69);
-				// if (env.player instanceof L2Summon)
-				// env.value += (level < 60) ? 4 : 5;
-			}
+			env.addValue(level - 76);
 		}
-		else
+		if (level > 69)
 		{
-			env.addValue((Math.sqrt(env.getCharacter().getDEX()) * 6) + level);
-			if (level > 77)
-			{
-				env.addValue(level - 76);
-			}
-			if (level > 69)
-			{
-				env.addValue(level - 69);
-			}
+			env.addValue(level - 69);
 		}
 	}
 }

+ 3 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/funcs/formulas/FuncAtkEvasion.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.model.skills.funcs.formulas;
 
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Stats;
@@ -40,9 +39,9 @@ public class FuncAtkEvasion extends Func
 	public void calc(Env env)
 	{
 		final int level = env.getCharacter().getLevel();
-		if (env.getCharacter() instanceof L2PcInstance)
+		if (env.getCharacter().isPlayer())
 		{
-			// [Square(DEX)]*6 + lvl;
+			// [Square(DEX)] * 6 + lvl;
 			env.addValue((Math.sqrt(env.getCharacter().getDEX()) * 6) + level);
 			if (level > 77)
 			{
@@ -55,7 +54,7 @@ public class FuncAtkEvasion extends Func
 		}
 		else
 		{
-			// [Square(DEX)]*6 + lvl;
+			// [Square(DEX)] * 6 + lvl;
 			env.addValue((Math.sqrt(env.getCharacter().getDEX()) * 6) + level);
 			if (level > 69)
 			{

+ 8 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/funcs/formulas/FuncMAtkCritical.java

@@ -15,8 +15,6 @@
 package com.l2jserver.gameserver.model.skills.funcs.formulas;
 
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.actor.L2Summon;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.stats.BaseStats;
 import com.l2jserver.gameserver.model.stats.Env;
@@ -43,13 +41,17 @@ public class FuncMAtkCritical extends Func
 	public void calc(Env env)
 	{
 		L2Character p = env.getCharacter();
-		if (p instanceof L2Summon)
+		// CT2: The magic critical rate has been increased to 10 times.
+		if (p.isPlayer())
 		{
-			env.setValue(8); // TODO: needs retail value
+			if (p.getActiveWeaponInstance() != null)
+			{
+				env.mulValue(BaseStats.WIT.calcBonus(p) * 10);
+			}
 		}
-		else if ((p instanceof L2PcInstance) && (p.getActiveWeaponInstance() != null))
+		else
 		{
-			env.mulValue(BaseStats.WIT.calcBonus(p));
+			env.mulValue(BaseStats.WIT.calcBonus(p) * 10);
 		}
 	}
 }

+ 2 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/funcs/formulas/FuncMAtkMod.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.model.skills.funcs.formulas;
 
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.stats.BaseStats;
 import com.l2jserver.gameserver.model.stats.Env;
@@ -40,7 +39,7 @@ public class FuncMAtkMod extends Func
 	@Override
 	public void calc(Env env)
 	{
-		if (env.getCharacter() instanceof L2PcInstance)
+		if (env.getCharacter().isPlayer())
 		{
 			double intb = BaseStats.INT.calcBonus(env.getPlayer());
 			double lvlb = env.getPlayer().getLevelMod();
@@ -48,9 +47,8 @@ public class FuncMAtkMod extends Func
 		}
 		else
 		{
-			float level = env.getCharacter().getLevel();
 			double intb = BaseStats.INT.calcBonus(env.getCharacter());
-			float lvlb = ((level + 89) / 100);
+			double lvlb = env.getCharacter().getLevelMod();
 			env.mulValue((lvlb * lvlb) * (intb * intb));
 		}
 	}

+ 5 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/funcs/formulas/FuncMDefMod.java

@@ -14,9 +14,7 @@
  */
 package com.l2jserver.gameserver.model.skills.funcs.formulas;
 
-import com.l2jserver.gameserver.model.actor.instance.L2BabyPetInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.stats.BaseStats;
@@ -43,8 +41,7 @@ public class FuncMDefMod extends Func
 	@Override
 	public void calc(Env env)
 	{
-		float level = env.getCharacter().getLevel();
-		if (env.getCharacter() instanceof L2PcInstance)
+		if (env.getCharacter().isPlayer())
 		{
 			L2PcInstance p = env.getPlayer();
 			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LFINGER) != null)
@@ -69,21 +66,21 @@ public class FuncMDefMod extends Func
 			}
 			env.mulValue(BaseStats.MEN.calcBonus(env.getPlayer()) * env.getPlayer().getLevelMod());
 		}
-		else if ((env.getCharacter() instanceof L2PetInstance) || (env.getCharacter() instanceof L2BabyPetInstance))
+		else if (env.getCharacter().isPet())
 		{
 			if (env.getCharacter().getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK) != 0)
 			{
 				env.subValue(13);
-				env.mulValue(BaseStats.MEN.calcBonus(env.getCharacter()) * ((level + 89) / 100));
+				env.mulValue(BaseStats.MEN.calcBonus(env.getCharacter()) * env.getCharacter().getLevelMod());
 			}
 			else
 			{
-				env.mulValue(BaseStats.MEN.calcBonus(env.getCharacter()) * ((level + 89) / 100));
+				env.mulValue(BaseStats.MEN.calcBonus(env.getCharacter()) * env.getCharacter().getLevelMod());
 			}
 		}
 		else
 		{
-			env.mulValue(BaseStats.MEN.calcBonus(env.getCharacter()) * ((level + 89) / 100));
+			env.mulValue(BaseStats.MEN.calcBonus(env.getCharacter()) * env.getCharacter().getLevelMod());
 		}
 	}
 }

+ 2 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/funcs/formulas/FuncPAtkMod.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.model.skills.funcs.formulas;
 
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.stats.BaseStats;
 import com.l2jserver.gameserver.model.stats.Env;
@@ -40,14 +39,13 @@ public class FuncPAtkMod extends Func
 	@Override
 	public void calc(Env env)
 	{
-		if (env.getCharacter() instanceof L2PcInstance)
+		if (env.getCharacter().isPlayer())
 		{
 			env.mulValue(BaseStats.STR.calcBonus(env.getPlayer()) * env.getPlayer().getLevelMod());
 		}
 		else
 		{
-			float level = env.getCharacter().getLevel();
-			env.mulValue(BaseStats.STR.calcBonus(env.getCharacter()) * ((level + 89) / 100));
+			env.mulValue(BaseStats.STR.calcBonus(env.getCharacter()) * env.getCharacter().getLevelMod());
 		}
 	}
 }

+ 17 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/funcs/formulas/FuncPDefMod.java

@@ -42,14 +42,10 @@ public class FuncPDefMod extends Func
 	@Override
 	public void calc(Env env)
 	{
-		if (env.getCharacter() instanceof L2PcInstance)
+		if (env.getCharacter().isPlayer())
 		{
 			L2PcInstance p = env.getPlayer();
 			boolean hasMagePDef = (p.getClassId().isMage() || (p.getClassId().getId() == 0x31)); // orc mystics are a special case
-			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HEAD) != null)
-			{
-				env.subValue(12);
-			}
 			L2ItemInstance chest = p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST);
 			if (chest != null)
 			{
@@ -59,20 +55,32 @@ public class FuncPDefMod extends Func
 			{
 				env.subValue(hasMagePDef ? 8 : 18);
 			}
-			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) != null)
+			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HEAD) != null)
 			{
-				env.subValue(8);
+				env.subValue(12);
 			}
 			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET) != null)
 			{
 				env.subValue(7);
 			}
+			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) != null)
+			{
+				env.subValue(8);
+			}
+			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_UNDER) != null)
+			{
+				env.subValue(3);
+			}
+			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CLOAK) != null)
+			{
+				env.subValue(1);
+			}
+			env.addValue(4);
 			env.mulValue(env.getPlayer().getLevelMod());
 		}
 		else
 		{
-			float level = env.getCharacter().getLevel();
-			env.mulValue((level + 89) / 100);
+			env.mulValue(env.getCharacter().getLevelMod());
 		}
 	}
 }

+ 49 - 89
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java

@@ -28,17 +28,11 @@ import com.l2jserver.gameserver.instancemanager.SiegeManager;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.Elementals;
 import com.l2jserver.gameserver.model.L2SiegeClan;
-import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.L2Playable;
-import com.l2jserver.gameserver.model.actor.L2Summon;
-import com.l2jserver.gameserver.model.actor.instance.L2BabyPetInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2CubicInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2ServitorInstance;
 import com.l2jserver.gameserver.model.effects.EffectTemplate;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.ClanHall;
@@ -114,7 +108,7 @@ public final class Formulas
 	 */
 	public static int getRegeneratePeriod(L2Character cha)
 	{
-		if (cha instanceof L2DoorInstance)
+		if (cha.isDoor())
 		{
 			return HP_REGENERATE_PERIOD * 100; // 5 mins
 		}
@@ -208,7 +202,7 @@ public final class Formulas
 	 */
 	public static void addFuncsToNewCharacter(L2Character cha)
 	{
-		if (cha instanceof L2PcInstance)
+		if (cha.isPlayer())
 		{
 			cha.addStatFunc(FuncMaxHpAdd.getInstance());
 			cha.addStatFunc(FuncMaxHpMul.getInstance());
@@ -250,7 +244,7 @@ public final class Formulas
 			cha.addStatFunc(FuncArmorSet.getInstance(Stats.STAT_CON));
 			cha.addStatFunc(FuncArmorSet.getInstance(Stats.STAT_WIT));
 		}
-		else if (cha instanceof L2PetInstance)
+		else if (cha.isSummon())
 		{
 			cha.addStatFunc(FuncMaxHpMul.getInstance());
 			cha.addStatFunc(FuncMaxMpMul.getInstance());
@@ -266,40 +260,6 @@ public final class Formulas
 			cha.addStatFunc(FuncPAtkSpeed.getInstance());
 			cha.addStatFunc(FuncMAtkSpeed.getInstance());
 		}
-		else if (cha instanceof L2BabyPetInstance)
-		{
-			cha.addStatFunc(FuncMaxHpMul.getInstance());
-			cha.addStatFunc(FuncMaxMpMul.getInstance());
-			cha.addStatFunc(FuncPAtkMod.getInstance());
-			cha.addStatFunc(FuncMAtkMod.getInstance());
-			cha.addStatFunc(FuncPDefMod.getInstance());
-			cha.addStatFunc(FuncMDefMod.getInstance());
-			cha.addStatFunc(FuncAtkCritical.getInstance());
-			cha.addStatFunc(FuncMAtkCritical.getInstance());
-			cha.addStatFunc(FuncAtkAccuracy.getInstance());
-			cha.addStatFunc(FuncAtkEvasion.getInstance());
-			cha.addStatFunc(FuncMoveSpeed.getInstance());
-			cha.addStatFunc(FuncPAtkSpeed.getInstance());
-			cha.addStatFunc(FuncMAtkSpeed.getInstance());
-		}
-		else if (cha instanceof L2Summon)
-		{
-			// cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_HP_RATE));
-			// cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_MP_RATE));
-			cha.addStatFunc(FuncMaxHpMul.getInstance());
-			cha.addStatFunc(FuncMaxMpMul.getInstance());
-			cha.addStatFunc(FuncPAtkMod.getInstance());
-			cha.addStatFunc(FuncMAtkMod.getInstance());
-			cha.addStatFunc(FuncPDefMod.getInstance());
-			cha.addStatFunc(FuncMDefMod.getInstance());
-			cha.addStatFunc(FuncAtkCritical.getInstance());
-			cha.addStatFunc(FuncMAtkCritical.getInstance());
-			cha.addStatFunc(FuncAtkAccuracy.getInstance());
-			cha.addStatFunc(FuncAtkEvasion.getInstance());
-			cha.addStatFunc(FuncMoveSpeed.getInstance());
-			cha.addStatFunc(FuncPAtkSpeed.getInstance());
-			cha.addStatFunc(FuncMAtkSpeed.getInstance());
-		}
 	}
 	
 	/**
@@ -318,9 +278,9 @@ public final class Formulas
 			hpRegenMultiplier *= Config.L2JMOD_CHAMPION_HP_REGEN;
 		}
 		
-		if (cha instanceof L2PcInstance)
+		if (cha.isPlayer())
 		{
-			L2PcInstance player = (L2PcInstance) cha;
+			L2PcInstance player = cha.getActingPlayer();
 			
 			// Calculate correct baseHpReg value for certain level of PC
 			init += (player.getLevel() > 10) ? ((player.getLevel() - 1) / 10.0) : 0.5;
@@ -418,7 +378,7 @@ public final class Formulas
 			// Add CON bonus
 			init *= cha.getLevelMod() * BaseStats.CON.calcBonus(cha);
 		}
-		else if (cha instanceof L2PetInstance)
+		else if (cha.isPet())
 		{
 			init = ((L2PetInstance) cha).getPetLevelData().getPetRegenHP() * Config.PET_HP_REGEN_MULTIPLIER;
 		}
@@ -442,9 +402,9 @@ public final class Formulas
 		double mpRegenMultiplier = cha.isRaid() ? Config.RAID_MP_REGEN_MULTIPLIER : Config.MP_REGEN_MULTIPLIER;
 		double mpRegenBonus = 0;
 		
-		if (cha instanceof L2PcInstance)
+		if (cha.isPlayer())
 		{
-			L2PcInstance player = (L2PcInstance) cha;
+			L2PcInstance player = cha.getActingPlayer();
 			
 			// Calculate correct baseMpReg value for certain level of PC
 			init += 0.3 * ((player.getLevel() - 1) / 10.0);
@@ -534,7 +494,7 @@ public final class Formulas
 			// Add MEN bonus
 			init *= cha.getLevelMod() * BaseStats.MEN.calcBonus(cha);
 		}
-		else if (cha instanceof L2PetInstance)
+		else if (cha.isPet())
 		{
 			init = ((L2PetInstance) cha).getPetLevelData().getPetRegenMP() * Config.PET_MP_REGEN_MULTIPLIER;
 		}
@@ -558,9 +518,9 @@ public final class Formulas
 		double cpRegenMultiplier = Config.CP_REGEN_MULTIPLIER;
 		double cpRegenBonus = 0;
 		
-		if (cha instanceof L2PcInstance)
+		if (cha.isPlayer())
 		{
-			L2PcInstance player = (L2PcInstance) cha;
+			L2PcInstance player = cha.getActingPlayer();
 			
 			// Calculate correct baseHpReg value for certain level of PC
 			init += (player.getLevel() > 10) ? ((player.getLevel() - 1) / 10.0) : 0.5;
@@ -672,8 +632,8 @@ public final class Formulas
 				return 1;
 		}
 		
-		boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2PcInstance);
-		boolean isPvE = (attacker instanceof L2Playable) && (target instanceof L2Attackable);
+		boolean isPvP = attacker.isPlayable() && target.isPlayer();
+		boolean isPvE = attacker.isPlayable() && target.isL2Attackable();
 		double power = skill.getPower(isPvP, isPvE);
 		double damage = 0;
 		double proximityBonus = 1;
@@ -681,7 +641,7 @@ public final class Formulas
 		double ssboost = ss ? (skill.getSSBoost() > 0 ? skill.getSSBoost() : 2.04) : 1; // 104% bonus with SS
 		double pvpBonus = 1;
 		
-		if ((attacker instanceof L2Playable) && (target instanceof L2Playable))
+		if (attacker.isPlayable() && target.isPlayable())
 		{
 			// Dmg bonusses in PvP fight
 			pvpBonus *= attacker.calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);
@@ -719,7 +679,7 @@ public final class Formulas
 		// Random weapon damage
 		damage *= attacker.getRandomDamageMultiplier();
 		
-		if ((target instanceof L2Attackable) && !target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
+		if (target.isL2Attackable() && !target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
 		{
 			int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
 			if (lvlDiff > Config.NPC_SKILL_DMG_PENALTY.size())
@@ -751,12 +711,12 @@ public final class Formulas
 	 */
 	public static final double calcPhysDam(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean crit, boolean dual, boolean ss)
 	{
-		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable);
-		final boolean isPvE = (attacker instanceof L2Playable) && (target instanceof L2Attackable);
+		final boolean isPvP = attacker.isPlayable() && target.isPlayable();
+		final boolean isPvE = attacker.isPlayable() && target.isL2Attackable();
 		double damage = attacker.getPAtk(target);
 		double defence = target.getPDef(attacker);
 		damage += calcValakasTrait(attacker, target, skill);
-		if (attacker instanceof L2Npc)
+		if (attacker.isNpc())
 		{
 			if (((L2Npc) attacker)._soulshotcharged)
 			{
@@ -878,7 +838,7 @@ public final class Formulas
 		}
 		
 		// for summon use pet weapon vuln, since they cant hold weapon
-		if (attacker instanceof L2ServitorInstance)
+		if (attacker.isServitor())
 		{
 			stat = Stats.PET_WPN_VULN;
 		}
@@ -912,7 +872,7 @@ public final class Formulas
 			}
 		}
 		
-		if (target instanceof L2Npc)
+		if (target.isNpc())
 		{
 			switch (((L2Npc) target).getTemplate().getRace())
 			{
@@ -972,7 +932,7 @@ public final class Formulas
 		}
 		
 		damage *= calcElemental(attacker, target, skill);
-		if (target instanceof L2Attackable)
+		if (target.isL2Attackable())
 		{
 			if (isBow)
 			{
@@ -1033,12 +993,12 @@ public final class Formulas
 	
 	public static final double calcMagicDam(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss, boolean bss, boolean mcrit)
 	{
-		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable);
-		final boolean isPvE = (attacker instanceof L2Playable) && (target instanceof L2Attackable);
+		final boolean isPvP = attacker.isPlayable() && target.isPlayable();
+		final boolean isPvE = attacker.isPlayable() && target.isL2Attackable();
 		double mAtk = attacker.getMAtk(target, skill);
 		double mDef = target.getMDef(attacker, skill);
 		// AI SpiritShot
-		if (attacker instanceof L2Npc)
+		if (attacker.isNpc())
 		{
 			if (((L2Npc) attacker)._spiritshotcharged)
 			{
@@ -1087,7 +1047,7 @@ public final class Formulas
 		// Failure calculation
 		if (Config.ALT_GAME_MAGICFAILURES && !calcMagicSuccess(attacker, target, skill))
 		{
-			if (attacker instanceof L2PcInstance)
+			if (attacker.isPlayer())
 			{
 				if (calcMagicSuccess(attacker, target, skill) && ((target.getLevel() - attacker.getLevel()) <= 9))
 				{
@@ -1113,7 +1073,7 @@ public final class Formulas
 				}
 			}
 			
-			if (target instanceof L2PcInstance)
+			if (target.isPlayer())
 			{
 				if (skill.getSkillType() == L2SkillType.DRAIN)
 				{
@@ -1131,7 +1091,7 @@ public final class Formulas
 		}
 		else if (mcrit)
 		{
-			if ((attacker instanceof L2PcInstance) && (target instanceof L2PcInstance))
+			if (attacker.isPlayer() && target.isPlayer())
 			{
 				damage *= 2.5;
 			}
@@ -1163,7 +1123,7 @@ public final class Formulas
 		
 		damage *= calcElemental(attacker, target, skill);
 		
-		if (target instanceof L2Attackable)
+		if (target.isL2Attackable())
 		{
 			damage *= attacker.calcStat(Stats.PVE_MAGICAL_DMG, 1, null, null);
 			if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
@@ -1187,8 +1147,8 @@ public final class Formulas
 	{
 		// Current info include mAtk in the skill power.
 		// double mAtk = attacker.getMAtk();
-		final boolean isPvP = (target instanceof L2Playable);
-		final boolean isPvE = (target instanceof L2Attackable);
+		final boolean isPvP = target.isPlayable();
+		final boolean isPvE = target.isL2Attackable();
 		double mDef = target.getMDef(attacker.getOwner(), skill);
 		
 		switch (shld)
@@ -1228,7 +1188,7 @@ public final class Formulas
 				damage = 1;
 			}
 			
-			if (target instanceof L2PcInstance)
+			if (target.isPlayer())
 			{
 				if (skill.getSkillType() == L2SkillType.DRAIN)
 				{
@@ -1254,7 +1214,7 @@ public final class Formulas
 		
 		damage *= calcElemental(owner, target, skill);
 		
-		if (target instanceof L2Attackable)
+		if (target.isL2Attackable())
 		{
 			damage *= attacker.getOwner().calcStat(Stats.PVE_MAGICAL_DMG, 1, null, null);
 			if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getOwner() != null) && ((target.getLevel() - attacker.getOwner().getLevel()) >= 2))
@@ -1370,7 +1330,7 @@ public final class Formulas
 				}
 				else if (target.isPlayer()) // If is a active player set his HP and CP to 1
 				{
-					L2PcInstance player = (L2PcInstance) target;
+					L2PcInstance player = target.getActingPlayer();
 					if (!player.isInvul())
 					{
 						if (!(activeChar.isPlayer() && (activeChar.isGM() && !activeChar.getAccessLevel().canGiveDamage())))
@@ -1502,9 +1462,9 @@ public final class Formulas
 	{
 		if (skill.isMagic())
 		{
-			return (int) ((skillTime * 333) / attacker.getMAtkSpd());
+			return (int) ((skillTime / attacker.getMAtkSpd()) * 333);
 		}
-		return (int) ((skillTime * 333) / attacker.getPAtkSpd());
+		return (int) ((skillTime / attacker.getPAtkSpd()) * 300);
 	}
 	
 	/**
@@ -1716,9 +1676,9 @@ public final class Formulas
 			shldSuccess = SHIELD_DEFENSE_SUCCEED;
 		}
 		
-		if (sendSysMsg && (target instanceof L2PcInstance))
+		if (sendSysMsg && target.isPlayer())
 		{
-			L2PcInstance enemy = (L2PcInstance) target;
+			L2PcInstance enemy = target.getActingPlayer();
 			
 			switch (shldSuccess)
 			{
@@ -2146,8 +2106,8 @@ public final class Formulas
 			return true;
 		}
 		
-		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable);
-		final boolean isPvE = (attacker instanceof L2Playable) && (target instanceof L2Attackable);
+		final boolean isPvP = attacker.isPlayable() && target.isPlayable();
+		final boolean isPvE = attacker.isPlayable() && target.isL2Attackable();
 		if (skill.ignoreResists())
 		{
 			if (attacker.isDebug())
@@ -2272,8 +2232,8 @@ public final class Formulas
 		{
 			return false;
 		}
-		final boolean isPvP = (target instanceof L2Playable);
-		final boolean isPvE = (target instanceof L2Attackable);
+		final boolean isPvP = target.isPlayable();
+		final boolean isPvE = target.isL2Attackable();
 		
 		if ((target.calcStat(Stats.DEBUFF_IMMUNITY, 0, null, skill) > 0) && skill.isDebuff() && !skill.ignoreResists())
 		{
@@ -2370,7 +2330,7 @@ public final class Formulas
 		int lvlDifference = (target.getLevel() - (skill.getSkillType() == L2SkillType.SPOIL ? skill.getMagicLevel() : attacker.getLevel()));
 		double lvlModifier = Math.pow(1.3, lvlDifference);
 		float targetModifier = 1;
-		if ((target instanceof L2Attackable) && !target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 3))
+		if (target.isL2Attackable() && !target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 3))
 		{
 			int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 2;
 			if (lvlDiff > Config.NPC_SKILL_CHANCE_PENALTY.size())
@@ -2416,7 +2376,7 @@ public final class Formulas
 	public static double calcManaDam(L2Character attacker, L2Character target, L2Skill skill, boolean ss, boolean bss)
 	{
 		// AI SpiritShot
-		if (attacker instanceof L2Npc)
+		if (attacker.isNpc())
 		{
 			if (((L2Npc) attacker)._spiritshotcharged)
 			{
@@ -2428,11 +2388,11 @@ public final class Formulas
 			}
 			((L2Npc) attacker)._spiritshotcharged = false;
 		}
-		// Mana Burnt = (SQR(M.Atk)*Power*(Target Max MP/97))/M.Def
+		// Mana Burn = (SQR(M.Atk)*Power*(Target Max MP/97))/M.Def
 		double mAtk = attacker.getMAtk(target, skill);
 		double mDef = target.getMDef(attacker, skill);
-		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable);
-		final boolean isPvE = (attacker instanceof L2Playable) && (target instanceof L2Attackable);
+		final boolean isPvP = attacker.isPlayable() && target.isPlayable();
+		final boolean isPvE = attacker.isPlayable() && target.isL2Attackable();
 		double mp = target.getMaxMp();
 		if (bss)
 		{
@@ -2445,7 +2405,7 @@ public final class Formulas
 		
 		double damage = (Math.sqrt(mAtk) * skill.getPower(attacker, target, isPvP, isPvE) * (mp / 97)) / mDef;
 		damage *= (1 + (calcSkillVulnerability(attacker, target, skill) / 100));
-		if (target instanceof L2Attackable)
+		if (target.isL2Attackable())
 		{
 			damage *= attacker.calcStat(Stats.PVE_MAGICAL_DMG, 1, null, null);
 			if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
@@ -2504,9 +2464,9 @@ public final class Formulas
 		
 		double val = actor.getStat().calcStat(Stats.SKILL_MASTERY, 0, null, null);
 		
-		if (actor instanceof L2PcInstance)
+		if (actor.isPlayer())
 		{
-			if (((L2PcInstance) actor).isMageClass())
+			if (actor.getActingPlayer().isMageClass())
 			{
 				val *= BaseStats.INT.calcBonus(actor);
 			}