<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Форум администраторов игровых серверов - Клиентская часть]]></title>
		<link>https://forum.zone-game.info/</link>
		<description><![CDATA[Форум администраторов игровых серверов - https://forum.zone-game.info]]></description>
		<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=13838">Zeratyl</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[А кто такие сильверы?]]></description>
			<content:encoded><![CDATA[А кто такие сильверы?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=24069">JokerMaxi</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[ребята извините за наглость, но я в java чуток понимаю... не могли бы подсказать? вот мои формулы. <br />
[SPOILER="Formulas"]<br />
/*<br />
 * This program is free software: you can redistribute it and/or modify it under<br />
 * the terms of the GNU General Public License as published by the Free Software<br />
 * Foundation, either version 3 of the License, or (at your option) any later<br />
 * version.<br />
 * <br />
 * This program is distributed in the hope that it will be useful, but WITHOUT<br />
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS<br />
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more<br />
 * details.<br />
 * <br />
 * You should have received a copy of the GNU General Public License along with<br />
 * this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.<br />
 */<br />
package net.sf.l2j.gameserver.skills;<br />
<br />
import java.util.logging.Logger;<br />
<br />
import net.sf.l2j.Config;<br />
import net.sf.l2j.gameserver.SevenSigns;<br />
import net.sf.l2j.gameserver.SevenSignsFestival;<br />
import net.sf.l2j.gameserver.instancemanager.CastleManager;<br />
import net.sf.l2j.gameserver.instancemanager.ClanHallManager;<br />
import net.sf.l2j.gameserver.instancemanager.FortManager;<br />
import net.sf.l2j.gameserver.instancemanager.SiegeManager;<br />
import net.sf.l2j.gameserver.model.L2ItemInstance;<br />
import net.sf.l2j.gameserver.model.L2SiegeClan;<br />
import net.sf.l2j.gameserver.model.L2Skill;<br />
import net.sf.l2j.gameserver.model.actor.L2Character;<br />
import net.sf.l2j.gameserver.model.actor.L2Npc;<br />
import net.sf.l2j.gameserver.model.actor.L2Playable;<br />
import net.sf.l2j.gameserver.model.actor.L2Summon;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2CubicInstance;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;<br />
import net.sf.l2j.gameserver.model.base.PlayerState;<br />
import net.sf.l2j.gameserver.model.entity.Castle;<br />
import net.sf.l2j.gameserver.model.entity.ClanHall;<br />
import net.sf.l2j.gameserver.model.entity.Fort;<br />
import net.sf.l2j.gameserver.model.entity.Siege;<br />
import net.sf.l2j.gameserver.model.itemcontainer.Inventory;<br />
import net.sf.l2j.gameserver.network.SystemMessageId;<br />
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;<br />
import net.sf.l2j.gameserver.skills.conditions.ConditionPlayerState;<br />
import net.sf.l2j.gameserver.skills.conditions.ConditionUsingItemType;<br />
import net.sf.l2j.gameserver.skills.funcs.Func;<br />
import net.sf.l2j.gameserver.templates.chars.L2PcTemplate;<br />
import net.sf.l2j.gameserver.templates.effects.EffectTemplate;<br />
import net.sf.l2j.gameserver.templates.item.L2Item;<br />
import net.sf.l2j.gameserver.templates.item.L2Weapon;<br />
import net.sf.l2j.gameserver.templates.item.L2WeaponType;<br />
import net.sf.l2j.gameserver.templates.skills.L2SkillType;<br />
import net.sf.l2j.gameserver.util.Util;<br />
import net.sf.l2j.util.Rnd;<br />
<br />
/**<br />
 * Global calculations, can be modified by server admins<br />
 */<br />
public final class Formulas<br />
{<br />
<br />
	/** Regen Task period */<br />
	protected static final Logger _log = Logger.getLogger(L2Character.class.getName());<br />
	private static final int HP_REGENERATE_PERIOD = 3000; // 3 secs<br />
	<br />
	public static final byte SHIELD_DEFENSE_FAILED = 0; // no shield defense<br />
	public static final byte SHIELD_DEFENSE_SUCCEED = 1; // normal shield defense<br />
	public static final byte SHIELD_DEFENSE_PERFECT_BLOCK = 2; // perfect block<br />
	<br />
	public static final byte SKILL_REFLECT_FAILED = 0; // no reflect<br />
	public static final byte SKILL_REFLECT_SUCCEED = 1; // normal reflect, some damage reflected some other not<br />
	public static final byte SKILL_REFLECT_VENGEANCE = 2; // 100% of the damage affect both<br />
	<br />
	private static final byte MELEE_ATTACK_RANGE = 40;<br />
<br />
	public static final int MAX_STAT_VALUE = 100;<br />
<br />
    private static final double[] STRCompute = new double[]{1.036, 34.845}; //{1.016, 28.515}; for C1<br />
    private static final double[] INTCompute = new double[]{1.020, 31.375}; //{1.020, 31.375}; for C1<br />
    private static final double[] DEXCompute = new double[]{1.009, 19.360}; //{1.009, 19.360}; for C1<br />
    private static final double[] WITCompute = new double[]{1.050, 20.000}; //{1.050, 20.000}; for C1<br />
    private static final double[] CONCompute = new double[]{1.030, 27.632}; //{1.015, 12.488}; for C1<br />
    private static final double[] MENCompute = new double[]{1.010, -0.060}; //{1.010, -0.060}; for C1<br />
<br />
    protected static final double[] WITbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] MENbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] INTbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] STRbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] DEXbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] CONbonus = new double[MAX_STAT_VALUE];<br />
<br />
    // These values are 100% matching retail tables, no need to change and no need add<br />
    // calculation into the stat bonus when accessing (not efficient),<br />
    // better to have everything precalculated and use values directly (saves CPU)<br />
    static<br />
    {<br />
        for (int i=0; i &lt; STRbonus.length; i++)<br />
            STRbonus[i] = Math.floor(Math.pow(STRCompute[0], i - STRCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; INTbonus.length; i++)<br />
            INTbonus[i] = Math.floor(Math.pow(INTCompute[0], i - INTCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; DEXbonus.length; i++)<br />
            DEXbonus[i] = Math.floor(Math.pow(DEXCompute[0], i - DEXCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; WITbonus.length; i++)<br />
            WITbonus[i] = Math.floor(Math.pow(WITCompute[0], i - WITCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; CONbonus.length; i++)<br />
            CONbonus[i] = Math.floor(Math.pow(CONCompute[0], i - CONCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; MENbonus.length; i++)<br />
            MENbonus[i] = Math.floor(Math.pow(MENCompute[0], i - MENCompute[1]) *100 +.5d) /100;<br />
    }<br />
<br />
	static class FuncAddLevel3 extends Func<br />
	{<br />
		static final FuncAddLevel3[] _instancies = new FuncAddLevel3[Stats.NUM_STATS];<br />
<br />
		static Func getInstance(Stats stat)<br />
		{<br />
			int pos = stat.ordinal();<br />
			if (_instancies[pos] == null) _instancies[pos] = new FuncAddLevel3(stat);<br />
			return _instancies[pos];<br />
		}<br />
<br />
		private FuncAddLevel3(Stats pStat)<br />
		{<br />
			super(pStat, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			env.value += env.player.getLevel() / 3.0;<br />
		}<br />
	}<br />
<br />
	static class FuncMultLevelMod extends Func<br />
	{<br />
		static final FuncMultLevelMod[] _instancies = new FuncMultLevelMod[Stats.NUM_STATS];<br />
<br />
		static Func getInstance(Stats stat)<br />
		{<br />
			int pos = stat.ordinal();<br />
			if (_instancies[pos] == null) _instancies[pos] = new FuncMultLevelMod(stat);<br />
			return _instancies[pos];<br />
		}<br />
<br />
		private FuncMultLevelMod(Stats pStat)<br />
		{<br />
			super(pStat, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			env.value *= env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncMultRegenResting extends Func<br />
	{<br />
		static final FuncMultRegenResting[] _instancies = new FuncMultRegenResting[Stats.NUM_STATS];<br />
<br />
		/**<br />
		 * Return the Func object corresponding to the state concerned.&lt;BR&gt;&lt;BR&gt;<br />
		 */<br />
		static Func getInstance(Stats stat)<br />
		{<br />
			int pos = stat.ordinal();<br />
<br />
			if (_instancies[pos] == null) _instancies[pos] = new FuncMultRegenResting(stat);<br />
<br />
			return _instancies[pos];<br />
		}<br />
<br />
		/**<br />
		 * Constructor of the FuncMultRegenResting.&lt;BR&gt;&lt;BR&gt;<br />
		 */<br />
		private FuncMultRegenResting(Stats pStat)<br />
		{<br />
			super(pStat, 0x20, null);<br />
			setCondition(new ConditionPlayerState(PlayerState.RESTING, true));<br />
		}<br />
<br />
		/**<br />
		 * Calculate the modifier of the state concerned.&lt;BR&gt;&lt;BR&gt;<br />
		 */<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (!cond.test(env)) return;<br />
<br />
			env.value *= 1.45;<br />
		}<br />
	}<br />
<br />
	static class FuncPAtkMod extends Func<br />
	{<br />
		static final FuncPAtkMod _fpa_instance = new FuncPAtkMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fpa_instance;<br />
		}<br />
<br />
		private FuncPAtkMod()<br />
		{<br />
			super(Stats.POWER_ATTACK, 0x30, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			env.value *= STRbonus[env.player.getSTR()] * env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncMAtkMod extends Func<br />
	{<br />
		static final FuncMAtkMod _fma_instance = new FuncMAtkMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fma_instance;<br />
		}<br />
<br />
		private FuncMAtkMod()<br />
		{<br />
			super(Stats.MAGIC_ATTACK, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			double intb = INTbonus[env.player.getINT()];<br />
			double lvlb = env.player.getLevelMod();<br />
			env.value *= (lvlb * lvlb) * (intb * intb);<br />
		}<br />
	}<br />
<br />
	static class FuncMDefMod extends Func<br />
	{<br />
		static final FuncMDefMod _fmm_instance = new FuncMDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncMDefMod()<br />
		{<br />
			super(Stats.MAGIC_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
            if (env.player instanceof L2PcInstance)<br />
            {<br />
    			L2PcInstance p = (L2PcInstance) env.player;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LFINGER) != null) env.value -= 5;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RFINGER) != null) env.value -= 5;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEAR) != null) env.value -= 9;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_REAR) != null) env.value -= 9;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_NECK) != null) env.value -= 13;<br />
            }<br />
			env.value *= MENbonus[env.player.getMEN()] * env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncPDefMod extends Func<br />
	{<br />
		static final FuncPDefMod _fmm_instance = new FuncPDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncPDefMod()<br />
		{<br />
			super(Stats.POWER_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (env.player instanceof L2PcInstance)<br />
			{<br />
				L2PcInstance p = (L2PcInstance) env.player;<br />
				boolean hasMagePDef = (p.getClassId().isMage() || p.getClassId().getId() == 0x31); // orc mystics are a special case<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HEAD) != null)<br />
					env.value -= 12;<br />
				L2ItemInstance chest = p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST);<br />
				if (chest != null)<br />
					env.value -= hasMagePDef ? 15 : 31;<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS) != null || (chest != null &amp;&amp; chest.getItem().getBodyPart() == L2Item.SLOT_FULL_ARMOR))<br />
					env.value -= hasMagePDef ? 8 : 18;<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) != null)<br />
					env.value -= 8;<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET) != null)<br />
					env.value -= 7;<br />
			}<br />
			env.value *= env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncGatesPDefMod extends Func<br />
	{<br />
		static final FuncGatesPDefMod _fmm_instance = new FuncGatesPDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncGatesPDefMod()<br />
		{<br />
			super(Stats.POWER_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)<br />
				env.value *= Config.ALT_SIEGE_DAWN_GATES_PDEF_MULT; <br />
			else if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DUSK)<br />
				env.value *= Config.ALT_SIEGE_DUSK_GATES_PDEF_MULT;<br />
		}<br />
	}<br />
	<br />
	static class FuncGatesMDefMod extends Func<br />
	{<br />
		static final FuncGatesMDefMod _fmm_instance = new FuncGatesMDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncGatesMDefMod()<br />
		{<br />
			super(Stats.MAGIC_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)<br />
				env.value *= Config.ALT_SIEGE_DAWN_GATES_MDEF_MULT;<br />
			else if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DUSK)<br />
				env.value *= Config.ALT_SIEGE_DUSK_GATES_MDEF_MULT;<br />
		}<br />
	}<br />
<br />
	static class FuncBowAtkRange extends Func<br />
	{<br />
		private static final FuncBowAtkRange _fbar_instance = new FuncBowAtkRange();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fbar_instance;<br />
		}<br />
<br />
		private FuncBowAtkRange()<br />
		{<br />
			super(Stats.POWER_ATTACK_RANGE, 0x10, null);<br />
			setCondition(new ConditionUsingItemType(L2WeaponType.BOW.mask()));<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (!cond.test(env)) <br />
                return;<br />
            // default is 40 and with bow should be 500<br />
			env.value += 460;<br />
		}<br />
	}<br />
    <br />
    static class FuncCrossBowAtkRange extends Func<br />
    {<br />
        private static final FuncCrossBowAtkRange _fcb_instance = new FuncCrossBowAtkRange();<br />
<br />
        static Func getInstance()<br />
        {<br />
            return _fcb_instance;<br />
        }<br />
<br />
        private FuncCrossBowAtkRange()<br />
        {<br />
            super(Stats.POWER_ATTACK_RANGE, 0x10, null);<br />
            setCondition(new ConditionUsingItemType(L2WeaponType.CROSSBOW.mask()));<br />
        }<br />
<br />
        @Override<br />
        public void calc(Env env)<br />
        {<br />
            if (!cond.test(env)) <br />
                return;<br />
            // default is 40 and with crossbow should be 400<br />
            env.value += 360;<br />
        }<br />
    }<br />
<br />
	static class FuncAtkAccuracy extends Func<br />
	{<br />
		static final FuncAtkAccuracy _faa_instance = new FuncAtkAccuracy();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _faa_instance;<br />
		}<br />
<br />
		private FuncAtkAccuracy()<br />
		{<br />
			super(Stats.ACCURACY_COMBAT, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			//[Square(DEX)]*6 + lvl + weapon hitbonus;<br />
			env.value += Math.sqrt(p.getDEX()) * 6;<br />
			env.value += p.getLevel();<br />
			if (p.getLevel() &gt; 77) env.value += (p.getLevel() - 77);<br />
			if (p.getLevel() &gt; 69) env.value += (p.getLevel() - 69);<br />
			if( p instanceof L2Summon) env.value += (p.getLevel() &lt; 60) ? 4 : 5;<br />
		}<br />
	}<br />
<br />
	static class FuncAtkEvasion extends Func<br />
	{<br />
		static final FuncAtkEvasion _fae_instance = new FuncAtkEvasion();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fae_instance;<br />
		}<br />
<br />
		private FuncAtkEvasion()<br />
		{<br />
			super(Stats.EVASION_RATE, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			//[Square(DEX)]*6 + lvl;<br />
			env.value += Math.sqrt(p.getDEX()) * 6;<br />
			env.value += p.getLevel();<br />
			if (p.getLevel() &gt; 77) env.value += (p.getLevel() - 77);<br />
			if (p.getLevel() &gt; 69) env.value += (p.getLevel() - 69);<br />
		}<br />
	}<br />
<br />
	static class FuncAtkCritical extends Func<br />
	{<br />
		static final FuncAtkCritical _fac_instance = new FuncAtkCritical();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fac_instance;<br />
		}<br />
<br />
		private FuncAtkCritical()<br />
		{<br />
			super(Stats.CRITICAL_RATE, 0x09, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			if( p instanceof L2Summon) env.value = 40;<br />
			else if (p instanceof L2PcInstance &amp;&amp; p.getActiveWeaponInstance() == null) env.value = 40;<br />
			else<br />
			{<br />
				env.value *= DEXbonus[p.getDEX()];<br />
				env.value *= 10;<br />
<br />
			}<br />
			env.baseValue = env.value;<br />
		}<br />
	}<br />
	<br />
	static class FuncMAtkCritical extends Func<br />
	{<br />
		static final FuncMAtkCritical _fac_instance = new FuncMAtkCritical();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fac_instance;<br />
		}<br />
<br />
		private FuncMAtkCritical()<br />
		{<br />
			super(Stats.MCRITICAL_RATE, 0x30, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			if(p instanceof L2Summon)<br />
				env.value = 8; // TODO: needs retail value<br />
			else if (p instanceof L2PcInstance &amp;&amp; p.getActiveWeaponInstance() != null)<br />
				env.value *= WITbonus[p.getWIT()];<br />
		}<br />
	}<br />
<br />
	static class FuncMoveSpeed extends Func<br />
	{<br />
		static final FuncMoveSpeed _fms_instance = new FuncMoveSpeed();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fms_instance;<br />
		}<br />
<br />
		private FuncMoveSpeed()<br />
		{<br />
			super(Stats.RUN_SPEED, 0x30, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= DEXbonus[p.getDEX()];<br />
		}<br />
	}<br />
<br />
	static class FuncPAtkSpeed extends Func<br />
	{<br />
		static final FuncPAtkSpeed _fas_instance = new FuncPAtkSpeed();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fas_instance;<br />
		}<br />
<br />
		private FuncPAtkSpeed()<br />
		{<br />
			super(Stats.POWER_ATTACK_SPEED, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= DEXbonus[p.getDEX()];<br />
		}<br />
	}<br />
<br />
	static class FuncMAtkSpeed extends Func<br />
	{<br />
		static final FuncMAtkSpeed _fas_instance = new FuncMAtkSpeed();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fas_instance;<br />
		}<br />
<br />
		private FuncMAtkSpeed()<br />
		{<br />
			super(Stats.MAGIC_ATTACK_SPEED, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= WITbonus[p.getWIT()];<br />
		}<br />
	}<br />
<br />
	static class FuncHennaSTR extends Func<br />
	{<br />
		static final FuncHennaSTR _fh_instance = new FuncHennaSTR();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaSTR()<br />
		{<br />
			super(Stats.STAT_STR, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatSTR();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaDEX extends Func<br />
	{<br />
		static final FuncHennaDEX _fh_instance = new FuncHennaDEX();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaDEX()<br />
		{<br />
			super(Stats.STAT_DEX, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatDEX();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaINT extends Func<br />
	{<br />
		static final FuncHennaINT _fh_instance = new FuncHennaINT();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaINT()<br />
		{<br />
			super(Stats.STAT_INT, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatINT();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaMEN extends Func<br />
	{<br />
		static final FuncHennaMEN _fh_instance = new FuncHennaMEN();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaMEN()<br />
		{<br />
			super(Stats.STAT_MEN, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatMEN();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaCON extends Func<br />
	{<br />
		static final FuncHennaCON _fh_instance = new FuncHennaCON();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaCON()<br />
		{<br />
			super(Stats.STAT_CON, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatCON();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaWIT extends Func<br />
	{<br />
		static final FuncHennaWIT _fh_instance = new FuncHennaWIT();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaWIT()<br />
		{<br />
			super(Stats.STAT_WIT, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatWIT();<br />
		}<br />
	}<br />
<br />
	static class FuncMaxHpAdd extends Func<br />
	{<br />
		static final FuncMaxHpAdd _fmha_instance = new FuncMaxHpAdd();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmha_instance;<br />
		}<br />
<br />
		private FuncMaxHpAdd()<br />
		{<br />
			super(Stats.MAX_HP, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcTemplate t = (L2PcTemplate) env.player.getTemplate();<br />
			int lvl = env.player.getLevel() - t.classBaseLevel;<br />
			double hpmod = t.lvlHpMod * lvl;<br />
			double hpmax = (t.lvlHpAdd + hpmod) * lvl;<br />
			double hpmin = (t.lvlHpAdd * lvl) + hpmod;<br />
			env.value += (hpmax + hpmin) / 2;<br />
		}<br />
	}<br />
<br />
	static class FuncMaxHpMul extends Func<br />
	{<br />
		static final FuncMaxHpMul _fmhm_instance = new FuncMaxHpMul();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmhm_instance;<br />
		}<br />
<br />
		private FuncMaxHpMul()<br />
		{<br />
			super(Stats.MAX_HP, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= CONbonus[p.getCON()];<br />
		}<br />
	}<br />
<br />
	static class FuncMaxCpAdd extends Func<br />
	{<br />
		static final FuncMaxCpAdd _fmca_instance = new FuncMaxCpAdd();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmca_instance;<br />
		}<br />
<br />
		private FuncMaxCpAdd()<br />
		{<br />
			super(Stats.MAX_CP, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcTemplate t = (L2PcTemplate) env.player.getTemplate();<br />
			int lvl = env.player.getLevel() - t.classBaseLevel;<br />
			double cpmod = t.lvlCpMod * lvl;<br />
			double cpmax = (t.lvlCpAdd + cpmod) * lvl;<br />
			double cpmin = (t.lvlCpAdd * lvl) + cpmod;<br />
			env.value += (cpmax + cpmin) / 2;<br />
		}<br />
	}<br />
<br />
	static class FuncMaxCpMul extends Func<br />
	{<br />
		static final FuncMaxCpMul _fmcm_instance = new FuncMaxCpMul();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmcm_instance;<br />
		}<br />
<br />
		private FuncMaxCpMul()<br />
		{<br />
			super(Stats.MAX_CP, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= CONbonus[p.getCON()];<br />
		}<br />
	}<br />
<br />
	static class FuncMaxMpAdd extends Func<br />
	{<br />
		static final FuncMaxMpAdd _fmma_instance = new FuncMaxMpAdd();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmma_instance;<br />
		}<br />
<br />
		private FuncMaxMpAdd()<br />
		{<br />
			super(Stats.MAX_MP, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcTemplate t = (L2PcTemplate) env.player.getTemplate();<br />
			int lvl = env.player.getLevel() - t.classBaseLevel;<br />
			double mpmod = t.lvlMpMod * lvl;<br />
			double mpmax = (t.lvlMpAdd + mpmod) * lvl;<br />
			double mpmin = (t.lvlMpAdd * lvl) + mpmod;<br />
			env.value += (mpmax + mpmin) / 2;<br />
		}<br />
	}<br />
<br />
	static class FuncMaxMpMul extends Func<br />
	{<br />
		static final FuncMaxMpMul _fmmm_instance = new FuncMaxMpMul();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmmm_instance;<br />
		}<br />
<br />
		private FuncMaxMpMul()<br />
		{<br />
			super(Stats.MAX_MP, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= MENbonus[p.getMEN()];<br />
		}<br />
	}<br />
<br />
	/**<br />
	 * Return the period between 2 regenerations task (3s for L2Character, 5 min for L2DoorInstance).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static int getRegeneratePeriod(L2Character cha)<br />
	{<br />
		if (cha instanceof L2DoorInstance) return HP_REGENERATE_PERIOD * 100; // 5 mins<br />
<br />
		return HP_REGENERATE_PERIOD; // 3s<br />
	}<br />
<br />
	/**<br />
	 * Return the standard NPC Calculator set containing ACCURACY_COMBAT and EVASION_RATE.&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * &lt;B&gt;&lt;U&gt; Concept&lt;/U&gt; :&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;<br />
	 * A calculator is created to manage and dynamically calculate the effect of a character property (ex : MAX_HP, REGENERATE_HP_RATE...).<br />
	 * In fact, each calculator is a table of Func object in which each Func represents a mathematic function : &lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * FuncAtkAccuracy -&gt; Math.sqrt(_player.getDEX())*6+_player.getLevel()&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * To reduce cache memory use, L2NPCInstances who don't have skills share the same Calculator set called &lt;B&gt;NPC_STD_CALCULATOR&lt;/B&gt;.&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 */<br />
	public static Calculator[] getStdNPCCalculators()<br />
	{<br />
		Calculator[] std = new Calculator[Stats.NUM_STATS];<br />
<br />
		// Add the FuncAtkAccuracy to the Standard Calculator of ACCURACY_COMBAT<br />
		std[Stats.ACCURACY_COMBAT.ordinal()] = new Calculator();<br />
		std[Stats.ACCURACY_COMBAT.ordinal()].addFunc(FuncAtkAccuracy.getInstance());<br />
<br />
		// Add the FuncAtkEvasion to the Standard Calculator of EVASION_RATE<br />
		std[Stats.EVASION_RATE.ordinal()] = new Calculator();<br />
		std[Stats.EVASION_RATE.ordinal()].addFunc(FuncAtkEvasion.getInstance());<br />
<br />
		return std;<br />
	}<br />
<br />
	public static Calculator[] getStdDoorCalculators()<br />
	{<br />
		Calculator[] std = new Calculator[Stats.NUM_STATS];<br />
<br />
		// Add the FuncAtkAccuracy to the Standard Calculator of ACCURACY_COMBAT<br />
		std[Stats.ACCURACY_COMBAT.ordinal()] = new Calculator();<br />
		std[Stats.ACCURACY_COMBAT.ordinal()].addFunc(FuncAtkAccuracy.getInstance());<br />
<br />
		// Add the FuncAtkEvasion to the Standard Calculator of EVASION_RATE<br />
		std[Stats.EVASION_RATE.ordinal()] = new Calculator();<br />
		std[Stats.EVASION_RATE.ordinal()].addFunc(FuncAtkEvasion.getInstance());<br />
		<br />
		//SevenSigns PDEF Modifier<br />
		std[Stats.POWER_DEFENCE.ordinal()].addFunc(FuncGatesPDefMod.getInstance());<br />
		<br />
		//SevenSigns MDEF Modifier<br />
		std[Stats.MAGIC_DEFENCE.ordinal()].addFunc(FuncGatesMDefMod.getInstance());		<br />
		<br />
		return std;<br />
	}	<br />
<br />
	/**<br />
	 * Add basics Func objects to L2PcInstance and L2Summon.&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * &lt;B&gt;&lt;U&gt; Concept&lt;/U&gt; :&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;<br />
	 * A calculator is created to manage and dynamically calculate the effect of a character property (ex : MAX_HP, REGENERATE_HP_RATE...).<br />
	 * In fact, each calculator is a table of Func object in which each Func represents a mathematic function : &lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * FuncAtkAccuracy -&gt; Math.sqrt(_player.getDEX())*6+_player.getLevel()&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * @param cha L2PcInstance or L2Summon that must obtain basic Func objects<br />
	 */<br />
	public static void addFuncsToNewCharacter(L2Character cha)<br />
	{<br />
		if (cha instanceof L2PcInstance)<br />
		{<br />
			cha.addStatFunc(FuncMaxHpAdd.getInstance());<br />
			cha.addStatFunc(FuncMaxHpMul.getInstance());<br />
			cha.addStatFunc(FuncMaxCpAdd.getInstance());<br />
			cha.addStatFunc(FuncMaxCpMul.getInstance());<br />
			cha.addStatFunc(FuncMaxMpAdd.getInstance());<br />
			cha.addStatFunc(FuncMaxMpMul.getInstance());<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_HP_RATE));<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_CP_RATE));<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_MP_RATE));<br />
			cha.addStatFunc(FuncBowAtkRange.getInstance());<br />
            cha.addStatFunc(FuncCrossBowAtkRange.getInstance());<br />
			//cha.addStatFunc(FuncMultLevelMod.getInstance(Stats.POWER_ATTACK));<br />
			//cha.addStatFunc(FuncMultLevelMod.getInstance(Stats.POWER_DEFENCE));<br />
			//cha.addStatFunc(FuncMultLevelMod.getInstance(Stats.MAGIC_DEFENCE));<br />
			cha.addStatFunc(FuncPAtkMod.getInstance());<br />
			cha.addStatFunc(FuncMAtkMod.getInstance());<br />
            cha.addStatFunc(FuncPDefMod.getInstance());<br />
			cha.addStatFunc(FuncMDefMod.getInstance());<br />
			cha.addStatFunc(FuncAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncMAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncAtkAccuracy.getInstance());<br />
			cha.addStatFunc(FuncAtkEvasion.getInstance());<br />
			cha.addStatFunc(FuncPAtkSpeed.getInstance());<br />
			cha.addStatFunc(FuncMAtkSpeed.getInstance());<br />
			cha.addStatFunc(FuncMoveSpeed.getInstance());<br />
<br />
			cha.addStatFunc(FuncHennaSTR.getInstance());<br />
			cha.addStatFunc(FuncHennaDEX.getInstance());<br />
			cha.addStatFunc(FuncHennaINT.getInstance());<br />
			cha.addStatFunc(FuncHennaMEN.getInstance());<br />
			cha.addStatFunc(FuncHennaCON.getInstance());<br />
			cha.addStatFunc(FuncHennaWIT.getInstance());<br />
		}<br />
        else if (cha instanceof L2PetInstance)<br />
        {<br />
            cha.addStatFunc(FuncPAtkMod.getInstance());<br />
            cha.addStatFunc(FuncMAtkMod.getInstance());<br />
            cha.addStatFunc(FuncPDefMod.getInstance());<br />
            cha.addStatFunc(FuncMDefMod.getInstance());<br />
        }<br />
		else if (cha instanceof L2Summon)<br />
		{<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_HP_RATE));<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_MP_RATE));<br />
			cha.addStatFunc(FuncAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncMAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncAtkAccuracy.getInstance());<br />
			cha.addStatFunc(FuncAtkEvasion.getInstance());<br />
		}<br />
	}<br />
<br />
	/**<br />
	 * Calculate the HP regen rate (base + modifiers).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static final double calcHpRegen(L2Character cha)<br />
	{<br />
        double init = cha.getTemplate().baseHpReg;<br />
		double hpRegenMultiplier = cha.isRaid() ? Config.RAID_HP_REGEN_MULTIPLIER : Config.HP_REGEN_MULTIPLIER;<br />
		double hpRegenBonus = 0;<br />
<br />
		if (Config.L2JMOD_CHAMPION_ENABLE &amp;&amp; cha.isChampion())<br />
			hpRegenMultiplier *= Config.L2JMOD_CHAMPION_HP_REGEN;<br />
<br />
		if (cha instanceof L2PcInstance)<br />
		{<br />
            L2PcInstance player = (L2PcInstance) cha;<br />
<br />
            // Calculate correct baseHpReg value for certain level of PC<br />
            init += (player.getLevel() &gt; 10) ? ((player.getLevel()-1)/10.0) : 0.5;<br />
<br />
            // SevenSigns Festival modifier<br />
			if (SevenSignsFestival.getInstance().isFestivalInProgress() &amp;&amp; player.isFestivalParticipant())<br />
                hpRegenMultiplier *= calcFestivalRegenModifier(player);<br />
			else<br />
			{<br />
				double siegeModifier = calcSiegeRegenModifer(player);<br />
				if (siegeModifier &gt; 0) hpRegenMultiplier *= siegeModifier;<br />
			}<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CLANHALL) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int clanHallIndex = player.getClan().getHasHideout();<br />
            	if (clanHallIndex &gt; 0)<br />
            	{<br />
            		ClanHall clansHall = ClanHallManager.getInstance().getClanHallById(clanHallIndex);<br />
            		if(clansHall != null)<br />
            			if (clansHall.getFunction(ClanHall.FUNC_RESTORE_HP) != null)<br />
            				hpRegenMultiplier *= 1+ (double)clansHall.getFunction(ClanHall.FUNC_RESTORE_HP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CASTLE) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int castleIndex = player.getClan().getHasCastle();<br />
            	if (castleIndex &gt; 0)<br />
            	{<br />
            		Castle castle = CastleManager.getInstance().getCastleById(castleIndex);<br />
            		if(castle != null)<br />
            			if (castle.getFunction(Castle.FUNC_RESTORE_HP) != null)<br />
            				hpRegenMultiplier *= 1+ (double)castle.getFunction(Castle.FUNC_RESTORE_HP).getLvl()/100;<br />
            	}<br />
            }<br />
            <br />
            if (player.isInsideZone(L2Character.ZONE_FORT) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int fortIndex = player.getClan().getHasFort();<br />
            	if (fortIndex &gt; 0)<br />
            	{<br />
            		Fort fort = FortManager.getInstance().getFortById(fortIndex);<br />
            		if (fort != null)<br />
            			if (fort.getFunction(Fort.FUNC_RESTORE_HP) != null)<br />
            				hpRegenMultiplier *= 1+ (double)fort.getFunction(Fort.FUNC_RESTORE_HP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
			// Mother Tree effect is calculated at last<br />
			if (player.isInsideZone(L2Character.ZONE_MOTHERTREE)) hpRegenBonus += 2;<br />
<br />
            // Calculate Movement bonus<br />
            if (player.isSitting()) hpRegenMultiplier *= 1.5;      // Sitting<br />
            else if (!player.isMoving()) hpRegenMultiplier *= 1.1; // Staying<br />
            else if (player.isRunning()) hpRegenMultiplier *= 0.7; // Running<br />
<br />
            // Add CON bonus<br />
            init *= cha.getLevelMod() * CONbonus[cha.getCON()];<br />
		}<br />
		else if (cha instanceof L2PetInstance)<br />
			init = ((L2PetInstance) cha).getPetData().getPetRegenHP();<br />
<br />
        if (init &lt; 1) init = 1;<br />
<br />
        return cha.calcStat(Stats.REGENERATE_HP_RATE, init, null, null) * hpRegenMultiplier + hpRegenBonus;<br />
	}<br />
<br />
	/**<br />
	 * Calculate the MP regen rate (base + modifiers).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static final double calcMpRegen(L2Character cha)<br />
	{<br />
        double init = cha.getTemplate().baseMpReg;<br />
        double mpRegenMultiplier = cha.isRaid() ? Config.RAID_MP_REGEN_MULTIPLIER : Config.MP_REGEN_MULTIPLIER;<br />
		double mpRegenBonus = 0;<br />
<br />
		if (cha instanceof L2PcInstance)<br />
		{<br />
			L2PcInstance player = (L2PcInstance) cha;<br />
<br />
            // Calculate correct baseMpReg value for certain level of PC<br />
            init += 0.3*((player.getLevel()-1)/10.0);<br />
<br />
            // SevenSigns Festival modifier<br />
            if (SevenSignsFestival.getInstance().isFestivalInProgress() &amp;&amp; player.isFestivalParticipant())<br />
				mpRegenMultiplier *= calcFestivalRegenModifier(player);<br />
<br />
			// Mother Tree effect is calculated at last<br />
			if (player.isInsideZone(L2Character.ZONE_MOTHERTREE)) mpRegenBonus += 1;<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CLANHALL) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int clanHallIndex = player.getClan().getHasHideout();<br />
            	if (clanHallIndex &gt; 0)<br />
            	{<br />
            		ClanHall clansHall = ClanHallManager.getInstance().getClanHallById(clanHallIndex);<br />
            		if(clansHall != null)<br />
            			if (clansHall.getFunction(ClanHall.FUNC_RESTORE_MP) != null)<br />
            				mpRegenMultiplier *= 1+ (double)clansHall.getFunction(ClanHall.FUNC_RESTORE_MP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CASTLE) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int castleIndex = player.getClan().getHasCastle();<br />
            	if (castleIndex &gt; 0)<br />
            	{<br />
            		Castle castle = CastleManager.getInstance().getCastleById(castleIndex);<br />
            		if(castle != null)<br />
            			if (castle.getFunction(Castle.FUNC_RESTORE_MP) != null)<br />
            				mpRegenMultiplier *= 1+ (double)castle.getFunction(Castle.FUNC_RESTORE_MP).getLvl()/100;<br />
            	}<br />
            }<br />
            <br />
            if (player.isInsideZone(L2Character.ZONE_FORT) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int fortIndex = player.getClan().getHasFort();<br />
            	if (fortIndex &gt; 0)<br />
            	{<br />
            		Fort fort = FortManager.getInstance().getFortById(fortIndex);<br />
            		if(fort != null)<br />
            			if (fort.getFunction(Fort.FUNC_RESTORE_MP) != null)<br />
            				mpRegenMultiplier *= 1+ (double)fort.getFunction(Fort.FUNC_RESTORE_MP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
			// Calculate Movement bonus<br />
            if (player.isSitting()) mpRegenMultiplier *= 1.5;      // Sitting<br />
            else if (!player.isMoving()) mpRegenMultiplier *= 1.1; // Staying<br />
            else if (player.isRunning()) mpRegenMultiplier *= 0.7; // Running<br />
<br />
            // Add MEN bonus<br />
            init *= cha.getLevelMod() * MENbonus[cha.getMEN()];<br />
		}<br />
		else if (cha instanceof L2PetInstance)<br />
			init = ((L2PetInstance) cha).getPetData().getPetRegenMP();<br />
<br />
		if (init &lt; 1) init = 1;<br />
<br />
		return cha.calcStat(Stats.REGENERATE_MP_RATE, init, null, null) * mpRegenMultiplier + mpRegenBonus;<br />
	}<br />
<br />
	/**<br />
	 * Calculate the CP regen rate (base + modifiers).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static final double calcCpRegen(L2Character cha)<br />
	{<br />
        double init = cha.getTemplate().baseHpReg;<br />
        double cpRegenMultiplier = Config.CP_REGEN_MULTIPLIER;<br />
        double cpRegenBonus = 0;<br />
<br />
        if (cha instanceof L2PcInstance)<br />
        {<br />
	        L2PcInstance player = (L2PcInstance) cha;<br />
<br />
	        // Calculate correct baseHpReg value for certain level of PC<br />
	        init += (player.getLevel() &gt; 10) ? ((player.getLevel()-1)/10.0) : 0.5;<br />
<br />
	        // Calculate Movement bonus<br />
	        if (player.isSitting()) cpRegenMultiplier *= 1.5;      // Sitting<br />
	        else if (!player.isMoving()) cpRegenMultiplier *= 1.1; // Staying<br />
	        else if (player.isRunning()) cpRegenMultiplier *= 0.7; // Running<br />
        } else<br />
        {<br />
	        // Calculate Movement bonus<br />
        	if (!cha.isMoving()) cpRegenMultiplier *= 1.1; // Staying<br />
	        else if (cha.isRunning()) cpRegenMultiplier *= 0.7; // Running<br />
        }<br />
<br />
        // Apply CON bonus<br />
        init *= cha.getLevelMod() * CONbonus[cha.getCON()];<br />
        if (init &lt; 1) init = 1;<br />
<br />
        return cha.calcStat(Stats.REGENERATE_CP_RATE, init, null, null) * cpRegenMultiplier + cpRegenBonus;<br />
	}<br />
<br />
	@SuppressWarnings("deprecation")<br />
	public static final double calcFestivalRegenModifier(L2PcInstance activeChar)<br />
	{<br />
		final int[] festivalInfo = SevenSignsFestival.getInstance().getFestivalForPlayer(activeChar);<br />
		final int oracle = festivalInfo[0];<br />
		final int festivalId = festivalInfo[1];<br />
		int[] festivalCenter;<br />
<br />
		// If the player isn't found in the festival, leave the regen rate as it is.<br />
		if (festivalId &lt; 0) return 0;<br />
<br />
		// Retrieve the X and Y coords for the center of the festival arena the player is in.<br />
		if (oracle == SevenSigns.CABAL_DAWN) festivalCenter = SevenSignsFestival.FESTIVAL_DAWN_PLAYER_SPAWNS[festivalId];<br />
		else festivalCenter = SevenSignsFestival.FESTIVAL_DUSK_PLAYER_SPAWNS[festivalId];<br />
<br />
		// Check the distance between the player and the player spawn point, in the center of the arena.<br />
		double distToCenter = activeChar.getDistance(festivalCenter[0], festivalCenter[1]);<br />
<br />
		if (Config.DEBUG)<br />
			_log.info("Distance: " + distToCenter + ", RegenMulti: " + (distToCenter * 2.5) / 50);<br />
<br />
		return 1.0 - (distToCenter * 0.0005); // Maximum Decreased Regen of ~ -65%;<br />
	}<br />
<br />
	public static final double calcSiegeRegenModifer(L2PcInstance activeChar)<br />
	{<br />
		if (activeChar == null || activeChar.getClan() == null) return 0;<br />
<br />
		Siege siege = SiegeManager.getInstance().getSiege(activeChar.getPosition().getX(),<br />
															activeChar.getPosition().getY(),<br />
															activeChar.getPosition().getZ());<br />
		if (siege == null || !siege.getIsInProgress()) return 0;<br />
<br />
		L2SiegeClan siegeClan = siege.getAttackerClan(activeChar.getClan().getClanId());<br />
		if (siegeClan == null || siegeClan.getFlag().isEmpty()<br />
			|| !Util.checkIfInRange(200, activeChar, siegeClan.getFlag().get(0), true)) return 0;<br />
<br />
		return 1.5; // If all is true, then modifer will be 50% more<br />
	}<br />
	/** Calculate blow damage based on cAtk */<br />
	public static double calcBlowDamage(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss)<br />
	{<br />
		double power = skill.getPower();<br />
		double damage = attacker.getPAtk(target);<br />
		damage+=calcValakasAttribute(attacker, target, skill);<br />
		double defence = target.getPDef(attacker);<br />
<br />
		// Def bonusses in PvP fight<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);<br />
			else<br />
				defence *= target.calcStat(Stats.PVP_PHYS_SKILL_DEF, 1, null, null);	<br />
		}<br />
<br />
		if(ss)<br />
			damage *= 2.;<br />
		switch(shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				defence += target.getShldDef();<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1;<br />
		}<br />
		<br />
		if(ss &amp;&amp; skill.getSSBoost()&gt;0)<br />
			power *= skill.getSSBoost();<br />
<br />
		damage = attacker.calcStat(Stats.CRITICAL_DAMAGE, (damage+power), target, skill);<br />
		damage *= calcElemental(attacker, target, skill);<br />
		damage += attacker.calcStat(Stats.CRITICAL_DAMAGE_ADD, 0, target, skill) * 6.5;<br />
		damage *= target.calcStat(Stats.CRIT_VULN, target.getTemplate().baseCritVuln, target, skill);<br />
<br />
		// get the natural vulnerability for the template<br />
		if (target instanceof L2Npc)<br />
		{<br />
			damage *= ((L2Npc) target).getTemplate().getVulnerability(Stats.DAGGER_WPN_VULN);<br />
		}<br />
		// get the vulnerability for the instance due to skills (buffs, passives, toggles, etc)<br />
		damage = target.calcStat(Stats.DAGGER_WPN_VULN, damage, target, null);<br />
		damage *= 70. / defence;<br />
		damage += Rnd.get() * attacker.getRandomDamage(target);<br />
		<br />
		// Dmg bonusses in PvP fight<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);<br />
			else<br />
				damage *= attacker.calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);	<br />
		}<br />
		<br />
		return damage &lt; 1 ? 1. : damage;<br />
	}<br />
	/** Calculated damage caused by ATTACK of attacker on target,<br />
	 * called separatly for each weapon, if dual-weapon is used.<br />
	 *<br />
	 * @param attacker player or NPC that makes ATTACK<br />
	 * @param target player or NPC, target of ATTACK<br />
	 * @param miss one of ATTACK_XXX constants<br />
	 * @param crit if the ATTACK have critical success<br />
	 * @param dual if dual weapon is used<br />
	 * @param ss if weapon item was charged by soulshot<br />
	 * @return damage points<br />
	 */<br />
	public static final double calcPhysDam(L2Character attacker, L2Character target, L2Skill skill,<br />
									byte shld, boolean crit, boolean dual, boolean ss)<br />
	{<br />
		double damage = attacker.getPAtk(target);<br />
		double defence = target.getPDef(attacker);<br />
		damage+=calcValakasAttribute(attacker, target, skill);<br />
<br />
		// Def bonusses in PvP fight<br />
		if((attacker instanceof L2Playable) <br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);<br />
			else<br />
				defence *= target.calcStat(Stats.PVP_PHYS_SKILL_DEF, 1, null, null);	<br />
		}<br />
<br />
		switch (shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				if (!Config.ALT_GAME_SHIELD_BLOCKS)<br />
					defence += target.getShldDef();<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1.;<br />
		}<br />
		<br />
		if (ss) damage *= 2;<br />
		if (skill != null)<br />
		{<br />
			double skillpower = skill.getPower(attacker);<br />
			float ssboost = skill.getSSBoost();<br />
			if (ssboost &lt;= 0)<br />
				damage += skillpower;<br />
			else if (ssboost &gt; 0)<br />
			{<br />
				if (ss)<br />
				{<br />
					skillpower *= ssboost;<br />
					damage += skillpower;<br />
				}<br />
				else<br />
					damage += skillpower;<br />
			}<br />
		}<br />
<br />
		// defence modifier depending of the attacker weapon<br />
		L2Weapon weapon = attacker.getActiveWeaponItem();<br />
		Stats stat = null;<br />
		if (weapon != null &amp;&amp; !attacker.isTransformed())<br />
		{<br />
			switch (weapon.getItemType())<br />
			{<br />
				case BOW:<br />
					stat = Stats.BOW_WPN_VULN;<br />
					break;<br />
				case CROSSBOW:<br />
					stat = Stats.CROSSBOW_WPN_VULN;<br />
					break;<br />
				case BLUNT:<br />
					stat = Stats.BLUNT_WPN_VULN;<br />
					break;<br />
				case DAGGER:<br />
					stat = Stats.DAGGER_WPN_VULN;<br />
					break;<br />
				case DUAL:<br />
					stat = Stats.DUAL_WPN_VULN;<br />
					break;<br />
				case DUALFIST:<br />
					stat = Stats.DUALFIST_WPN_VULN;<br />
					break;<br />
				case ETC:<br />
					stat = Stats.ETC_WPN_VULN;<br />
					break;<br />
				case FIST:<br />
					stat = Stats.FIST_WPN_VULN;<br />
					break;<br />
				case POLE:<br />
					stat = Stats.POLE_WPN_VULN;<br />
					break;<br />
				case SWORD:<br />
					stat = Stats.SWORD_WPN_VULN;<br />
					break;<br />
				case BIGSWORD:<br />
					stat = Stats.BIGSWORD_WPN_VULN;<br />
					break;<br />
				case BIGBLUNT:<br />
					stat = Stats.BIGBLUNT_WPN_VULN;<br />
					break;<br />
				case DUAL_DAGGER:<br />
					stat = Stats.DUALDAGGER_WPN_VULN;<br />
					break;<br />
				case RAPIER:<br />
					stat = Stats.RAPIER_WPN_VULN;<br />
					break;<br />
				case ANCIENT_SWORD:<br />
					stat = Stats.ANCIENT_WPN_VULN;<br />
					break;<br />
				case PET:<br />
					stat = Stats.PET_WPN_VULN;<br />
					break;<br />
			}<br />
		}<br />
<br />
<br />
		/*if (shld &amp;&amp; !Config.ALT_GAME_SHIELD_BLOCKS)<br />
		{<br />
			defence += target.getShldDef();<br />
		}*/<br />
		//if (!(attacker instanceof L2RaidBossInstance) &amp;&amp;<br />
		/*<br />
		if ((attacker instanceof L2NpcInstance || attacker instanceof L2SiegeGuardInstance))<br />
		{<br />
			if (attacker instanceof L2RaidBossInstance) damage *= 1; // was 10 changed for temp fix<br />
			//			else<br />
			//			damage *= 2;<br />
			//			if (attacker instanceof L2NpcInstance || attacker instanceof L2SiegeGuardInstance){<br />
			//damage = damage * attacker.getSTR() * attacker.getAccuracy() * 0.05 / defence;<br />
			//			damage = damage * attacker.getSTR()*  (attacker.getSTR() + attacker.getLevel()) * 0.025 / defence;<br />
			//			damage += _rnd.nextDouble() * damage / 10 ;<br />
		}<br />
		*/<br />
		//		else {<br />
		//if (skill == null)<br />
		<br />
		if (crit)<br />
		{<br />
			//Finally retail like formula <br />
			damage = 2 * attacker.calcStat(Stats.CRITICAL_DAMAGE, 1, target, skill) * target.calcStat(Stats.CRIT_VULN, target.getTemplate().baseCritVuln, target, null) * (70 * damage / defence);<br />
			//Crit dmg add is almost useless in normal hits... <br />
			damage += (attacker.calcStat(Stats.CRITICAL_DAMAGE_ADD, 0, target, skill) * 70 / defence);<br />
		}<br />
		else<br />
			damage = 70 * damage / defence;<br />
		<br />
		// In C5 summons make 10 % less dmg in PvP.<br />
		if (attacker instanceof L2Summon &amp;&amp; target instanceof L2PcInstance)<br />
			damage *= 0.9;<br />
<br />
		if (stat != null)<br />
		{<br />
			// get the vulnerability due to skills (buffs, passives, toggles, etc)<br />
			damage = target.calcStat(stat, damage, target, null);<br />
			if (target instanceof L2Npc)<br />
			{<br />
				// get the natural vulnerability for the template<br />
				damage *= ((L2Npc) target).getTemplate().getVulnerability(stat);<br />
			}<br />
		}<br />
<br />
		damage += Rnd.nextDouble() * damage / 10;<br />
		//		damage += _rnd.nextDouble()* attacker.getRandomDamage(target);<br />
		//		}<br />
		if (shld &gt; 0 &amp;&amp; Config.ALT_GAME_SHIELD_BLOCKS)<br />
		{<br />
			damage -= target.getShldDef();<br />
			if (damage &lt; 0) damage = 0;<br />
		}<br />
		<br />
		if (target instanceof L2Npc)<br />
		{<br />
			switch (((L2Npc) target).getTemplate().getRace())<br />
			{<br />
				case BEAST:<br />
					damage *= attacker.getPAtkMonsters(target);<br />
					break;<br />
				case ANIMAL:<br />
					damage *= attacker.getPAtkAnimals(target);<br />
					break;<br />
				case PLANT:<br />
					damage *= attacker.getPAtkPlants(target);<br />
					break;<br />
				case DRAGON:<br />
					damage *= attacker.getPAtkDragons(target);<br />
					break;<br />
				case BUG:<br />
					damage *= attacker.getPAtkInsects(target);<br />
					break;<br />
				case GIANT:<br />
					damage *= attacker.getPAtkGiants(target);<br />
					break;					<br />
				default:<br />
					// nothing<br />
					break;<br />
			}<br />
		}<br />
		<br />
		if (damage &gt; 0 &amp;&amp; damage &lt; 1)<br />
		{<br />
			damage = 1;<br />
		}<br />
		else if (damage &lt; 0)<br />
		{<br />
			damage = 0;<br />
		}<br />
		<br />
		// Dmg bonusses in PvP fight<br />
		if((attacker instanceof L2Playable) <br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);<br />
			else<br />
				damage *= attacker.calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);	<br />
		}<br />
		<br />
		damage *= calcElemental(attacker, target, skill);<br />
<br />
		return damage;<br />
	}<br />
<br />
	public static final double calcMagicDam(L2Character attacker, L2Character target, L2Skill skill,<br />
										byte shld, boolean ss, boolean bss, boolean mcrit)<br />
	{	<br />
		double mAtk = attacker.getMAtk(target, skill);<br />
		double mDef = target.getMDef(attacker, skill);<br />
		<br />
		// Pvp bonuses for def<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill.isMagic())<br />
				mDef *= target.calcStat(Stats.PVP_MAGICAL_DEF, 1, null, null);<br />
			else<br />
				mDef *= target.calcStat(Stats.PVP_PHYS_SKILL_DEF, 1, null, null);<br />
		}<br />
<br />
		switch (shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				mDef += target.getShldDef(); // kamael<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1;<br />
		}<br />
		<br />
		if (bss) mAtk *= 4;<br />
		else if (ss) mAtk *= 2;<br />
<br />
		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower(attacker); <br />
		<br />
		// In C5 summons make 10 % less dmg in PvP.<br />
		if(attacker instanceof L2Summon &amp;&amp; target instanceof L2PcInstance) damage *= 0.9;<br />
		<br />
		//		if(attacker instanceof L2PcInstance &amp;&amp; target instanceof L2PcInstance) damage *= 0.9; // PvP modifier (-10%)<br />
<br />
		// Failure calculation<br />
		if (Config.ALT_GAME_MAGICFAILURES &amp;&amp; !calcMagicSuccess(attacker, target, skill))<br />
		{<br />
			if (attacker instanceof L2PcInstance)<br />
			{<br />
				if (calcMagicSuccess(attacker, target, skill)<br />
					&amp;&amp; (target.getLevel() - attacker.getLevel()) &lt;= 9)<br />
				{<br />
					if (skill.getSkillType() == L2SkillType.DRAIN)<br />
						attacker.sendPacket(new SystemMessage(SystemMessageId.DRAIN_HALF_SUCCESFUL));<br />
					else<br />
						attacker.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));<br />
<br />
					damage /= 2;<br />
				}<br />
				else<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.C1_RESISTED_YOUR_S2);<br />
					sm.addCharName(target);<br />
					sm.addSkillName(skill);<br />
					attacker.sendPacket(sm);<br />
<br />
					damage = 1;<br />
				}<br />
			}<br />
<br />
			if (target instanceof L2PcInstance)<br />
			{<br />
				if (skill.getSkillType() == L2SkillType.DRAIN)<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_DRAIN);<br />
					sm.addCharName(attacker);<br />
					target.sendPacket(sm);<br />
				}<br />
				else<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_MAGIC);<br />
					sm.addCharName(attacker);<br />
					target.sendPacket(sm);<br />
				}<br />
			}<br />
		}<br />
		else if (mcrit)<br />
		{<br />
			if (attacker instanceof L2PcInstance &amp;&amp; target instanceof L2PcInstance)<br />
				damage *= 2.5;<br />
			else<br />
				damage *= 3;<br />
		}<br />
<br />
		damage += Rnd.get() * attacker.getRandomDamage(target);<br />
		// Pvp bonuses for dmg<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill.isMagic())<br />
				damage *= attacker.calcStat(Stats.PVP_MAGICAL_DMG, 1, null, null);<br />
			else<br />
				damage *= attacker.calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);<br />
		}<br />
		//random magic damage<br />
		float rnd = Rnd.get(-20,20)/100+1;<br />
		damage *= rnd;<br />
		// CT2.3 general magic vuln<br />
		damage *= target.calcStat(Stats.MAGIC_DAMAGE_VULN, 1, null, null);<br />
<br />
		damage *= calcElemental(attacker, target, skill); <br />
<br />
		return damage;<br />
	}<br />
	<br />
	public static final double calcMagicDam(L2CubicInstance attacker, L2Character target, L2Skill skill, boolean mcrit, byte shld)<br />
	{<br />
		double mAtk = attacker.getMAtk();<br />
		double mDef = target.getMDef(attacker.getOwner(), skill);<br />
		<br />
		switch (shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				mDef += target.getShldDef(); // kamael<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1;<br />
		}<br />
		<br />
		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower();<br />
		L2PcInstance owner = attacker.getOwner();<br />
		// Failure calculation<br />
		if (Config.ALT_GAME_MAGICFAILURES &amp;&amp; !calcMagicSuccess(owner, target, skill))<br />
		{			<br />
			if (calcMagicSuccess(owner, target, skill) &amp;&amp; (target.getLevel() - skill.getMagicLevel()) &lt;= 9){<br />
				if (skill.getSkillType() == L2SkillType.DRAIN)<br />
					owner.sendPacket(new SystemMessage(SystemMessageId.DRAIN_HALF_SUCCESFUL));<br />
				else<br />
					owner.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));<br />
	<br />
				damage /= 2;<br />
			}<br />
			else<br />
			{<br />
				SystemMessage sm = new SystemMessage(SystemMessageId.C1_RESISTED_YOUR_S2);<br />
				sm.addCharName(target);<br />
				sm.addSkillName(skill);<br />
				owner.sendPacket(sm);<br />
	<br />
				damage = 1;<br />
			}<br />
		<br />
			if (target instanceof L2PcInstance)<br />
			{<br />
				if (skill.getSkillType() == L2SkillType.DRAIN)<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_DRAIN);<br />
					sm.addCharName(owner);<br />
					target.sendPacket(sm);<br />
				}<br />
				else<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_MAGIC);<br />
					sm.addCharName(owner);<br />
					target.sendPacket(sm);<br />
				}<br />
			}<br />
		}<br />
		else if (mcrit) damage *= 3;<br />
		<br />
		// CT2.3 general magic vuln<br />
		damage *= target.calcStat(Stats.MAGIC_DAMAGE_VULN, 1, null, null);<br />
		<br />
		damage *= calcElemental(owner, target, skill);<br />
<br />
		return damage;<br />
	}<br />
<br />
	/** Returns true in case of critical hit */<br />
	public static final boolean calcCrit(double rate, L2Character target)<br />
	{<br />
		final boolean success = rate &gt; Rnd.get(1000);<br />
		<br />
		// support for critical damage evasion<br />
		if (success)<br />
		{<br />
			if (target == null)<br />
				return true; // no effect<br />
			<br />
			// little weird, but remember what CRIT_DAMAGE_EVASION &gt; 1 increase chances to _evade_ crit hits<br />
			return Rnd.get((int)target.getStat().calcStat(Stats.CRIT_DAMAGE_EVASION, 100, null, null)) &lt; 100;<br />
		}<br />
		return success;<br />
	}<br />
	/** Calculate value of blow success */<br />
	public static final boolean calcBlow(L2Character activeChar, L2Character target, int chance)<br />
	{<br />
		return activeChar.calcStat(Stats.BLOW_RATE, chance*(1.0+(activeChar.getDEX()-20)/100), target, null)&gt;Rnd.get(100);<br />
	}<br />
	/** Calculate value of lethal chance */<br />
	public static final double calcLethal(L2Character activeChar, L2Character target, int baseLethal, int magiclvl)<br />
	{<br />
		double chance = 0;<br />
		if (magiclvl &gt; 0)<br />
		{<br />
			int delta = ((magiclvl + activeChar.getLevel()) / 2) - 1 - target.getLevel();<br />
			<br />
			// delta [-3,infinite)<br />
			if (delta &gt;= -3)<br />
			{<br />
				chance = (baseLethal * ((double) activeChar.getLevel() / target.getLevel()));<br />
			}<br />
			// delta [-9, -3[<br />
			else if (delta &lt; -3 &amp;&amp; delta &gt;= -9)<br />
			{<br />
				//               baseLethal<br />
				// chance = -1 * ----------- <br />
				//               (delta / 3)<br />
				chance = (-3) * (baseLethal / (delta));<br />
			}<br />
			//delta [-infinite,-9[<br />
			else<br />
			{<br />
				chance = baseLethal / 15;<br />
			}<br />
		}<br />
		else<br />
		{<br />
			chance = (baseLethal * ((double) activeChar.getLevel() / target.getLevel()));<br />
		}<br />
		return 10 * activeChar.calcStat(Stats.LETHAL_RATE, chance, target, null);<br />
	}<br />
    <br />
    public static final boolean calcLethalHit(L2Character activeChar, L2Character target, L2Skill skill)<br />
    {<br />
        if (!target.isRaid()<br />
                &amp;&amp; !(target instanceof L2DoorInstance)<br />
                &amp;&amp; !(target instanceof L2Npc &amp;&amp; ((L2Npc) target).getNpcId() == 35062))<br />
        {<br />
            int chance = Rnd.get(1000);<br />
            <br />
            //activeChar.sendMessage(Double.toString(chance));<br />
            //activeChar.sendMessage(Double.toString(calcLethal(activeChar, target, skill.getLethalChance2(),skill.getMagicLevel())));<br />
            //activeChar.sendMessage(Double.toString(calcLethal(activeChar, target, skill.getLethalChance1(),skill.getMagicLevel())));<br />
            <br />
            // 2nd lethal effect activate (cp,hp to 1 or if target is npc then hp to 1)<br />
            if (skill.getLethalChance2() &gt; 0 &amp;&amp; chance &lt; calcLethal(activeChar, target, skill.getLethalChance2(),skill.getMagicLevel()))<br />
            {<br />
                if (target instanceof L2Npc)<br />
                    target.reduceCurrentHp(target.getCurrentHp() - 1, activeChar, skill);<br />
                else if (target instanceof L2PcInstance) // If is a active player set his HP and CP to 1<br />
                {<br />
                    L2PcInstance player = (L2PcInstance) target;<br />
                    if (!player.isInvul())<br />
                    {<br />
                    	if (!(activeChar instanceof L2PcInstance &amp;&amp; <br />
                        	(((L2PcInstance)activeChar).isGM() &amp;&amp; !((L2PcInstance)activeChar).getAccessLevel().canGiveDamage())))<br />
                    	{<br />
                    		player.setCurrentHp(1);<br />
                    		player.setCurrentCp(1);<br />
                    		player.sendPacket(new SystemMessage(SystemMessageId.LETHAL_STRIKE_SUCCESSFUL));<br />
                    	}<br />
                    }<br />
                }<br />
                activeChar.sendPacket(new SystemMessage(SystemMessageId.LETHAL_STRIKE));<br />
            }<br />
            else if (skill.getLethalChance1() &gt; 0 &amp;&amp; chance &lt; calcLethal(activeChar, target, skill.getLethalChance1(),skill.getMagicLevel()))<br />
            {<br />
                if (target instanceof L2PcInstance)<br />
                {<br />
                    L2PcInstance player = (L2PcInstance) target;<br />
                    if (!player.isInvul())<br />
                    {<br />
                    	if (!(activeChar instanceof L2PcInstance &amp;&amp; <br />
                            	(((L2PcInstance)activeChar).isGM() &amp;&amp; !((L2PcInstance)activeChar).getAccessLevel().canGiveDamage())))<br />
                        {<br />
                    		player.setCurrentCp(1); // Set CP to 1<br />
                    		player.sendPacket(new SystemMessage(SystemMessageId.CP_DISAPPEARS_WHEN_HIT_WITH_A_HALF_KILL_SKILL));<br />
                        }<br />
                    }<br />
                }<br />
                else if (target instanceof L2Npc) // If is a monster remove first damage and after 50% of current hp<br />
                    target.reduceCurrentHp(target.getCurrentHp() / 2, activeChar, skill);<br />
                activeChar.sendPacket(new SystemMessage(SystemMessageId.HALF_KILL));<br />
                <br />
            }<br />
            else<br />
                return false;<br />
        }<br />
        else<br />
            return false;<br />
        <br />
        return true;<br />
    }<br />
    <br />
	public static final boolean calcMCrit(double mRate)<br />
	{<br />
		return mRate &gt; Rnd.get(1000);<br />
	}<br />
<br />
	/** Returns true in case when ATTACK is canceled due to hit */<br />
	public static final boolean calcAtkBreak(L2Character target, double dmg)<br />
	{<br />
		if (target.getFusionSkill() != null)<br />
			return true;<br />
	    <br />
        double init = 0;<br />
<br />
		if (Config.ALT_GAME_CANCEL_CAST &amp;&amp; target.isCastingNow()) init = 15;<br />
		if (Config.ALT_GAME_CANCEL_BOW &amp;&amp; target.isAttackingNow())<br />
		{<br />
			L2Weapon wpn = target.getActiveWeaponItem();<br />
			if (wpn != null &amp;&amp; wpn.getItemType() == L2WeaponType.BOW) init = 15;<br />
		}<br />
<br />
		if (target.isRaid() || target.isInvul() || init &lt;= 0) return false; // No attack break<br />
<br />
        // Chance of break is higher with higher dmg<br />
        init += Math.sqrt(13*dmg);  <br />
<br />
        // Chance is affected by target MEN<br />
        init -= (MENbonus[target.getMEN()] * 100 - 100);<br />
<br />
        // Calculate all modifiers for ATTACK_CANCEL<br />
        double rate = target.calcStat(Stats.ATTACK_CANCEL, init, null, null); <br />
<br />
        // Adjust the rate to be between 1 and 99<br />
        if (rate &gt; 99) rate = 99;<br />
        else if (rate &lt; 1) rate = 1;<br />
<br />
        return Rnd.get(100) &lt; rate;<br />
	}<br />
<br />
	/** Calculate delay (in milliseconds) before next ATTACK */<br />
	public static final int calcPAtkSpd(L2Character attacker, L2Character target, double rate)<br />
	{<br />
		// measured Oct 2006 by Tank6585, formula by Sami<br />
		// attack speed 312 equals 1500 ms delay... (or 300 + 40 ms delay?)<br />
		if(rate &lt; 2) return 2700;<br />
	    else return (int)(470000/rate);<br />
	}<br />
<br />
	/** Calculate delay (in milliseconds) for skills cast */<br />
	public static final int calcAtkSpd(L2Character attacker, L2Skill skill, double skillTime)<br />
	{<br />
		if (skill.isMagic()) return (int) (skillTime * 333 / attacker.getMAtkSpd());<br />
		return (int) (skillTime * 333 / attacker.getPAtkSpd());<br />
	}<br />
<br />
	/** Returns true if hit missed (target evaded) <br />
	 *  Formula based on [url]http://l2p.l2wh.com/nonskillattacks.html[/url]<br />
	 **/<br />
	public static boolean calcHitMiss(L2Character attacker, L2Character target)<br />
	{<br />
		int delta = attacker.getAccuracy() - target.getEvasionRate(attacker);<br />
		int chance;<br />
		if (delta &gt;= 10) chance = 980;<br />
		else <br />
		{<br />
			switch (delta)<br />
			{<br />
				case 9: chance = 975; break; <br />
				case 8: chance = 970; break;<br />
				case 7: chance = 965; break;<br />
				case 6: chance = 960; break;<br />
				case 5: chance = 955; break;<br />
				case 4: chance = 945; break;<br />
				case 3: chance = 935; break;<br />
				case 2: chance = 925; break;<br />
				case 1: chance = 915; break;<br />
				case 0: chance = 905; break;<br />
				case -1: chance = 890; break;<br />
				case -2: chance = 875; break;<br />
				case -3: chance = 860; break;<br />
				case -4: chance = 845; break;<br />
				case -5: chance = 830; break;<br />
				case -6: chance = 815; break;<br />
				case -7: chance = 800; break;<br />
				case -8: chance = 785; break;<br />
				case -9: chance = 770; break;<br />
				case -10: chance = 755; break;<br />
				case -11: chance = 735; break;<br />
				case -12: chance = 715; break;<br />
				case -13: chance = 695; break;<br />
				case -14: chance = 675; break;<br />
				case -15: chance = 655; break;<br />
				case -16: chance = 625; break;<br />
				case -17: chance = 595; break;<br />
				case -18: chance = 565; break;<br />
				case -19: chance = 535; break;<br />
				case -20: chance = 505; break;<br />
				case -21: chance = 455; break;<br />
				case -22: chance = 405; break;<br />
				case -23: chance = 355; break;<br />
				case -24: chance = 305; break;<br />
				default: chance = 275;<br />
			}<br />
			if(!attacker.isInFrontOfTarget())<br />
			{<br />
				if(attacker.isBehindTarget())<br />
					chance *= 1.2;<br />
				else // side<br />
					chance *= 1.1;<br />
				if (chance &gt; 980)<br />
					chance = 980;<br />
			}<br />
		}<br />
		return chance &lt; Rnd.get(1000);<br />
	}<br />
<br />
	/**<br />
	 * Returns:&lt;br&gt;<br />
	 * 0 = shield defense doesn't succeed&lt;br&gt;<br />
	 * 1 = shield defense succeed&lt;br&gt;<br />
	 * 2 = perfect block&lt;br&gt;<br />
	 * <br />
	 * @param attacker<br />
	 * @param target<br />
	 * @param sendSysMsg<br />
	 * @return<br />
	 */<br />
	public static byte calcShldUse(L2Character attacker, L2Character target, L2Skill skill, boolean sendSysMsg)<br />
	{<br />
		if (skill != null &amp;&amp; skill.ignoreShield())<br />
			return 0;<br />
<br />
		double shldRate = target.calcStat(Stats.SHIELD_RATE, 0, attacker, null)<br />
			* DEXbonus[target.getDEX()];<br />
		if (shldRate == 0.0) return 0;<br />
        int degreeside = (int)target.calcStat(Stats.SHIELD_DEFENCE_ANGLE, 0, null, null) + 120;<br />
        if (degreeside &lt; 360 &amp;&amp; (!target.isFacing(attacker, degreeside)))<br />
        {<br />
            return 0;<br />
        }<br />
        <br />
        byte shldSuccess = SHIELD_DEFENSE_FAILED;<br />
        // if attacker <br />
		// if attacker use bow and target wear shield, shield block rate is multiplied by 1.3 (30%)<br />
        L2Weapon at_weapon = attacker.getActiveWeaponItem();<br />
        if (at_weapon != null &amp;&amp; at_weapon.getItemType() == L2WeaponType.BOW)<br />
			shldRate *= 1.3;<br />
        <br />
        if (shldRate &gt; 0 &amp;&amp; 100 - Config.ALT_PERFECT_SHLD_BLOCK &lt; Rnd.get(100))<br />
        {<br />
        	shldSuccess = SHIELD_DEFENSE_PERFECT_BLOCK;<br />
        }<br />
        else if (shldRate &gt; Rnd.get(100))<br />
        {<br />
        	shldSuccess = SHIELD_DEFENSE_SUCCEED;<br />
        }<br />
        <br />
        if (sendSysMsg &amp;&amp; target instanceof L2PcInstance)<br />
		{<br />
			L2PcInstance enemy = (L2PcInstance)target;<br />
			<br />
			switch (shldSuccess)<br />
			{<br />
				case SHIELD_DEFENSE_SUCCEED:<br />
					enemy.sendPacket(new SystemMessage(SystemMessageId.SHIELD_DEFENCE_SUCCESSFULL));<br />
					break;<br />
				case SHIELD_DEFENSE_PERFECT_BLOCK:<br />
					enemy.sendPacket(new SystemMessage(SystemMessageId.YOUR_EXCELLENT_SHIELD_DEFENSE_WAS_A_SUCCESS));<br />
					break;<br />
			}<br />
		}<br />
        <br />
		return shldSuccess;<br />
	}<br />
	<br />
	public static byte calcShldUse(L2Character attacker, L2Character target, L2Skill skill)<br />
	{<br />
		return calcShldUse(attacker, target, skill, true);<br />
	}<br />
<br />
	public static byte calcShldUse(L2Character attacker, L2Character target)<br />
	{<br />
		return calcShldUse(attacker, target, null, true);<br />
	}<br />
<br />
	public static boolean calcMagicAffected(L2Character actor, L2Character target, L2Skill skill)<br />
	{<br />
		// TODO: CHECK/FIX THIS FORMULA UP!!<br />
		L2SkillType type = skill.getSkillType();<br />
		double defence = 0;<br />
		if (skill.isActive() &amp;&amp; skill.isOffensive() &amp;&amp; !skill.isNeutral()) <br />
			defence = target.getMDef(actor, skill);<br />
		<br />
		double attack = 2 * actor.getMAtk(target, skill) * calcSkillVulnerability(actor, target, skill);<br />
		double d = (attack - defence)/(attack + defence);<br />
		if (target.isRaid())<br />
		{<br />
			switch (type)<br />
			{<br />
				case CONFUSION:<br />
				case MUTE:<br />
				case PARALYZE:<br />
				case ROOT:<br />
				case FEAR:<br />
				case SLEEP:<br />
				case STUN:<br />
				case DEBUFF:<br />
				case AGGDEBUFF:<br />
					if ( d &gt; 0 &amp;&amp; Rnd.get(1000) == 1)<br />
						return true;<br />
					else <br />
						return false;<br />
			}<br />
		}<br />
		<br />
		d += 0.5 * Rnd.nextGaussian();<br />
		return d &gt; 0;<br />
	}<br />
<br />
	public static double calcSkillVulnerability(L2Character attacker, L2Character target, L2Skill skill)<br />
	{<br />
		double multiplier = 1;	// initialize...<br />
<br />
		// Get the skill type to calculate its effect in function of base stats<br />
		// of the L2Character target<br />
		if (skill != null)<br />
		{<br />
			// first, get the natural template vulnerability values for the target<br />
			Stats stat = skill.getStat();<br />
			if (stat != null)<br />
			{<br />
				switch (stat)<br />
				{<br />
				case AGGRESSION:<br />
					multiplier *= target.getTemplate().baseAggressionVuln;<br />
					break;<br />
				case BLEED:<br />
					multiplier *= target.getTemplate().baseBleedVuln;<br />
					break;<br />
				case POISON:<br />
					multiplier *= target.getTemplate().basePoisonVuln;<br />
					break;<br />
				case STUN:<br />
					multiplier *= target.getTemplate().baseStunVuln;<br />
					break;<br />
				case ROOT:<br />
					multiplier *= target.getTemplate().baseRootVuln;<br />
					break;<br />
				case MOVEMENT:<br />
					multiplier *= target.getTemplate().baseMovementVuln;<br />
					break;<br />
				case CONFUSION:<br />
					multiplier *= target.getTemplate().baseConfusionVuln;<br />
					break;<br />
				case SLEEP:<br />
					multiplier *= target.getTemplate().baseSleepVuln;<br />
					break;<br />
				}<br />
			}<br />
			if (skill.getElement() &gt; 0)<br />
				multiplier *= Math.sqrt(calcElemental(attacker, target, skill));<br />
<br />
			// Finally, calculate skilltype vulnerabilities<br />
			L2SkillType type = skill.getSkillType();<br />
			<br />
			// For additional effects on PDAM and MDAM skills (like STUN, SHOCK, PARALYZE...)<br />
			if (type != null &amp;&amp; (type == L2SkillType.PDAM || type == L2SkillType.MDAM))<br />
				type = skill.getEffectType();<br />
			<br />
			multiplier = calcSkillTypeVulnerability(multiplier, target, type);<br />
			<br />
		}<br />
		return multiplier;<br />
	}<br />
	<br />
	public static double calcSkillTypeVulnerability(double multiplier, L2Character target, L2SkillType type)<br />
	{<br />
		if (type != null)<br />
		{<br />
			switch (type)<br />
			{<br />
				case BLEED:<br />
					multiplier = target.calcStat(Stats.BLEED_VULN, multiplier, target, null);<br />
					break;<br />
				case POISON:<br />
					multiplier = target.calcStat(Stats.POISON_VULN, multiplier, target, null);<br />
					break;<br />
				case STUN:<br />
					multiplier = target.calcStat(Stats.STUN_VULN, multiplier, target, null);<br />
					break;<br />
				case PARALYZE:<br />
					multiplier = target.calcStat(Stats.PARALYZE_VULN, multiplier, target, null);<br />
					break;<br />
				case ROOT:<br />
					multiplier = target.calcStat(Stats.ROOT_VULN, multiplier, target, null);<br />
					break;<br />
				case SLEEP:<br />
					multiplier = target.calcStat(...]]></description>
			<content:encoded><![CDATA[ребята извините за наглость, но я в java чуток понимаю... не могли бы подсказать? вот мои формулы. <br />
[SPOILER="Formulas"]<br />
/*<br />
 * This program is free software: you can redistribute it and/or modify it under<br />
 * the terms of the GNU General Public License as published by the Free Software<br />
 * Foundation, either version 3 of the License, or (at your option) any later<br />
 * version.<br />
 * <br />
 * This program is distributed in the hope that it will be useful, but WITHOUT<br />
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS<br />
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more<br />
 * details.<br />
 * <br />
 * You should have received a copy of the GNU General Public License along with<br />
 * this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.<br />
 */<br />
package net.sf.l2j.gameserver.skills;<br />
<br />
import java.util.logging.Logger;<br />
<br />
import net.sf.l2j.Config;<br />
import net.sf.l2j.gameserver.SevenSigns;<br />
import net.sf.l2j.gameserver.SevenSignsFestival;<br />
import net.sf.l2j.gameserver.instancemanager.CastleManager;<br />
import net.sf.l2j.gameserver.instancemanager.ClanHallManager;<br />
import net.sf.l2j.gameserver.instancemanager.FortManager;<br />
import net.sf.l2j.gameserver.instancemanager.SiegeManager;<br />
import net.sf.l2j.gameserver.model.L2ItemInstance;<br />
import net.sf.l2j.gameserver.model.L2SiegeClan;<br />
import net.sf.l2j.gameserver.model.L2Skill;<br />
import net.sf.l2j.gameserver.model.actor.L2Character;<br />
import net.sf.l2j.gameserver.model.actor.L2Npc;<br />
import net.sf.l2j.gameserver.model.actor.L2Playable;<br />
import net.sf.l2j.gameserver.model.actor.L2Summon;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2CubicInstance;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;<br />
import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;<br />
import net.sf.l2j.gameserver.model.base.PlayerState;<br />
import net.sf.l2j.gameserver.model.entity.Castle;<br />
import net.sf.l2j.gameserver.model.entity.ClanHall;<br />
import net.sf.l2j.gameserver.model.entity.Fort;<br />
import net.sf.l2j.gameserver.model.entity.Siege;<br />
import net.sf.l2j.gameserver.model.itemcontainer.Inventory;<br />
import net.sf.l2j.gameserver.network.SystemMessageId;<br />
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;<br />
import net.sf.l2j.gameserver.skills.conditions.ConditionPlayerState;<br />
import net.sf.l2j.gameserver.skills.conditions.ConditionUsingItemType;<br />
import net.sf.l2j.gameserver.skills.funcs.Func;<br />
import net.sf.l2j.gameserver.templates.chars.L2PcTemplate;<br />
import net.sf.l2j.gameserver.templates.effects.EffectTemplate;<br />
import net.sf.l2j.gameserver.templates.item.L2Item;<br />
import net.sf.l2j.gameserver.templates.item.L2Weapon;<br />
import net.sf.l2j.gameserver.templates.item.L2WeaponType;<br />
import net.sf.l2j.gameserver.templates.skills.L2SkillType;<br />
import net.sf.l2j.gameserver.util.Util;<br />
import net.sf.l2j.util.Rnd;<br />
<br />
/**<br />
 * Global calculations, can be modified by server admins<br />
 */<br />
public final class Formulas<br />
{<br />
<br />
	/** Regen Task period */<br />
	protected static final Logger _log = Logger.getLogger(L2Character.class.getName());<br />
	private static final int HP_REGENERATE_PERIOD = 3000; // 3 secs<br />
	<br />
	public static final byte SHIELD_DEFENSE_FAILED = 0; // no shield defense<br />
	public static final byte SHIELD_DEFENSE_SUCCEED = 1; // normal shield defense<br />
	public static final byte SHIELD_DEFENSE_PERFECT_BLOCK = 2; // perfect block<br />
	<br />
	public static final byte SKILL_REFLECT_FAILED = 0; // no reflect<br />
	public static final byte SKILL_REFLECT_SUCCEED = 1; // normal reflect, some damage reflected some other not<br />
	public static final byte SKILL_REFLECT_VENGEANCE = 2; // 100% of the damage affect both<br />
	<br />
	private static final byte MELEE_ATTACK_RANGE = 40;<br />
<br />
	public static final int MAX_STAT_VALUE = 100;<br />
<br />
    private static final double[] STRCompute = new double[]{1.036, 34.845}; //{1.016, 28.515}; for C1<br />
    private static final double[] INTCompute = new double[]{1.020, 31.375}; //{1.020, 31.375}; for C1<br />
    private static final double[] DEXCompute = new double[]{1.009, 19.360}; //{1.009, 19.360}; for C1<br />
    private static final double[] WITCompute = new double[]{1.050, 20.000}; //{1.050, 20.000}; for C1<br />
    private static final double[] CONCompute = new double[]{1.030, 27.632}; //{1.015, 12.488}; for C1<br />
    private static final double[] MENCompute = new double[]{1.010, -0.060}; //{1.010, -0.060}; for C1<br />
<br />
    protected static final double[] WITbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] MENbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] INTbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] STRbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] DEXbonus = new double[MAX_STAT_VALUE];<br />
    protected static final double[] CONbonus = new double[MAX_STAT_VALUE];<br />
<br />
    // These values are 100% matching retail tables, no need to change and no need add<br />
    // calculation into the stat bonus when accessing (not efficient),<br />
    // better to have everything precalculated and use values directly (saves CPU)<br />
    static<br />
    {<br />
        for (int i=0; i &lt; STRbonus.length; i++)<br />
            STRbonus[i] = Math.floor(Math.pow(STRCompute[0], i - STRCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; INTbonus.length; i++)<br />
            INTbonus[i] = Math.floor(Math.pow(INTCompute[0], i - INTCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; DEXbonus.length; i++)<br />
            DEXbonus[i] = Math.floor(Math.pow(DEXCompute[0], i - DEXCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; WITbonus.length; i++)<br />
            WITbonus[i] = Math.floor(Math.pow(WITCompute[0], i - WITCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; CONbonus.length; i++)<br />
            CONbonus[i] = Math.floor(Math.pow(CONCompute[0], i - CONCompute[1]) *100 +.5d) /100;<br />
        for (int i=0; i &lt; MENbonus.length; i++)<br />
            MENbonus[i] = Math.floor(Math.pow(MENCompute[0], i - MENCompute[1]) *100 +.5d) /100;<br />
    }<br />
<br />
	static class FuncAddLevel3 extends Func<br />
	{<br />
		static final FuncAddLevel3[] _instancies = new FuncAddLevel3[Stats.NUM_STATS];<br />
<br />
		static Func getInstance(Stats stat)<br />
		{<br />
			int pos = stat.ordinal();<br />
			if (_instancies[pos] == null) _instancies[pos] = new FuncAddLevel3(stat);<br />
			return _instancies[pos];<br />
		}<br />
<br />
		private FuncAddLevel3(Stats pStat)<br />
		{<br />
			super(pStat, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			env.value += env.player.getLevel() / 3.0;<br />
		}<br />
	}<br />
<br />
	static class FuncMultLevelMod extends Func<br />
	{<br />
		static final FuncMultLevelMod[] _instancies = new FuncMultLevelMod[Stats.NUM_STATS];<br />
<br />
		static Func getInstance(Stats stat)<br />
		{<br />
			int pos = stat.ordinal();<br />
			if (_instancies[pos] == null) _instancies[pos] = new FuncMultLevelMod(stat);<br />
			return _instancies[pos];<br />
		}<br />
<br />
		private FuncMultLevelMod(Stats pStat)<br />
		{<br />
			super(pStat, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			env.value *= env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncMultRegenResting extends Func<br />
	{<br />
		static final FuncMultRegenResting[] _instancies = new FuncMultRegenResting[Stats.NUM_STATS];<br />
<br />
		/**<br />
		 * Return the Func object corresponding to the state concerned.&lt;BR&gt;&lt;BR&gt;<br />
		 */<br />
		static Func getInstance(Stats stat)<br />
		{<br />
			int pos = stat.ordinal();<br />
<br />
			if (_instancies[pos] == null) _instancies[pos] = new FuncMultRegenResting(stat);<br />
<br />
			return _instancies[pos];<br />
		}<br />
<br />
		/**<br />
		 * Constructor of the FuncMultRegenResting.&lt;BR&gt;&lt;BR&gt;<br />
		 */<br />
		private FuncMultRegenResting(Stats pStat)<br />
		{<br />
			super(pStat, 0x20, null);<br />
			setCondition(new ConditionPlayerState(PlayerState.RESTING, true));<br />
		}<br />
<br />
		/**<br />
		 * Calculate the modifier of the state concerned.&lt;BR&gt;&lt;BR&gt;<br />
		 */<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (!cond.test(env)) return;<br />
<br />
			env.value *= 1.45;<br />
		}<br />
	}<br />
<br />
	static class FuncPAtkMod extends Func<br />
	{<br />
		static final FuncPAtkMod _fpa_instance = new FuncPAtkMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fpa_instance;<br />
		}<br />
<br />
		private FuncPAtkMod()<br />
		{<br />
			super(Stats.POWER_ATTACK, 0x30, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			env.value *= STRbonus[env.player.getSTR()] * env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncMAtkMod extends Func<br />
	{<br />
		static final FuncMAtkMod _fma_instance = new FuncMAtkMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fma_instance;<br />
		}<br />
<br />
		private FuncMAtkMod()<br />
		{<br />
			super(Stats.MAGIC_ATTACK, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			double intb = INTbonus[env.player.getINT()];<br />
			double lvlb = env.player.getLevelMod();<br />
			env.value *= (lvlb * lvlb) * (intb * intb);<br />
		}<br />
	}<br />
<br />
	static class FuncMDefMod extends Func<br />
	{<br />
		static final FuncMDefMod _fmm_instance = new FuncMDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncMDefMod()<br />
		{<br />
			super(Stats.MAGIC_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
            if (env.player instanceof L2PcInstance)<br />
            {<br />
    			L2PcInstance p = (L2PcInstance) env.player;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LFINGER) != null) env.value -= 5;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RFINGER) != null) env.value -= 5;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEAR) != null) env.value -= 9;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_REAR) != null) env.value -= 9;<br />
    			if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_NECK) != null) env.value -= 13;<br />
            }<br />
			env.value *= MENbonus[env.player.getMEN()] * env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncPDefMod extends Func<br />
	{<br />
		static final FuncPDefMod _fmm_instance = new FuncPDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncPDefMod()<br />
		{<br />
			super(Stats.POWER_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (env.player instanceof L2PcInstance)<br />
			{<br />
				L2PcInstance p = (L2PcInstance) env.player;<br />
				boolean hasMagePDef = (p.getClassId().isMage() || p.getClassId().getId() == 0x31); // orc mystics are a special case<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HEAD) != null)<br />
					env.value -= 12;<br />
				L2ItemInstance chest = p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST);<br />
				if (chest != null)<br />
					env.value -= hasMagePDef ? 15 : 31;<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS) != null || (chest != null &amp;&amp; chest.getItem().getBodyPart() == L2Item.SLOT_FULL_ARMOR))<br />
					env.value -= hasMagePDef ? 8 : 18;<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) != null)<br />
					env.value -= 8;<br />
				if (p.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET) != null)<br />
					env.value -= 7;<br />
			}<br />
			env.value *= env.player.getLevelMod();<br />
		}<br />
	}<br />
<br />
	static class FuncGatesPDefMod extends Func<br />
	{<br />
		static final FuncGatesPDefMod _fmm_instance = new FuncGatesPDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncGatesPDefMod()<br />
		{<br />
			super(Stats.POWER_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)<br />
				env.value *= Config.ALT_SIEGE_DAWN_GATES_PDEF_MULT; <br />
			else if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DUSK)<br />
				env.value *= Config.ALT_SIEGE_DUSK_GATES_PDEF_MULT;<br />
		}<br />
	}<br />
	<br />
	static class FuncGatesMDefMod extends Func<br />
	{<br />
		static final FuncGatesMDefMod _fmm_instance = new FuncGatesMDefMod();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmm_instance;<br />
		}<br />
<br />
		private FuncGatesMDefMod()<br />
		{<br />
			super(Stats.MAGIC_DEFENCE, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)<br />
				env.value *= Config.ALT_SIEGE_DAWN_GATES_MDEF_MULT;<br />
			else if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DUSK)<br />
				env.value *= Config.ALT_SIEGE_DUSK_GATES_MDEF_MULT;<br />
		}<br />
	}<br />
<br />
	static class FuncBowAtkRange extends Func<br />
	{<br />
		private static final FuncBowAtkRange _fbar_instance = new FuncBowAtkRange();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fbar_instance;<br />
		}<br />
<br />
		private FuncBowAtkRange()<br />
		{<br />
			super(Stats.POWER_ATTACK_RANGE, 0x10, null);<br />
			setCondition(new ConditionUsingItemType(L2WeaponType.BOW.mask()));<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			if (!cond.test(env)) <br />
                return;<br />
            // default is 40 and with bow should be 500<br />
			env.value += 460;<br />
		}<br />
	}<br />
    <br />
    static class FuncCrossBowAtkRange extends Func<br />
    {<br />
        private static final FuncCrossBowAtkRange _fcb_instance = new FuncCrossBowAtkRange();<br />
<br />
        static Func getInstance()<br />
        {<br />
            return _fcb_instance;<br />
        }<br />
<br />
        private FuncCrossBowAtkRange()<br />
        {<br />
            super(Stats.POWER_ATTACK_RANGE, 0x10, null);<br />
            setCondition(new ConditionUsingItemType(L2WeaponType.CROSSBOW.mask()));<br />
        }<br />
<br />
        @Override<br />
        public void calc(Env env)<br />
        {<br />
            if (!cond.test(env)) <br />
                return;<br />
            // default is 40 and with crossbow should be 400<br />
            env.value += 360;<br />
        }<br />
    }<br />
<br />
	static class FuncAtkAccuracy extends Func<br />
	{<br />
		static final FuncAtkAccuracy _faa_instance = new FuncAtkAccuracy();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _faa_instance;<br />
		}<br />
<br />
		private FuncAtkAccuracy()<br />
		{<br />
			super(Stats.ACCURACY_COMBAT, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			//[Square(DEX)]*6 + lvl + weapon hitbonus;<br />
			env.value += Math.sqrt(p.getDEX()) * 6;<br />
			env.value += p.getLevel();<br />
			if (p.getLevel() &gt; 77) env.value += (p.getLevel() - 77);<br />
			if (p.getLevel() &gt; 69) env.value += (p.getLevel() - 69);<br />
			if( p instanceof L2Summon) env.value += (p.getLevel() &lt; 60) ? 4 : 5;<br />
		}<br />
	}<br />
<br />
	static class FuncAtkEvasion extends Func<br />
	{<br />
		static final FuncAtkEvasion _fae_instance = new FuncAtkEvasion();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fae_instance;<br />
		}<br />
<br />
		private FuncAtkEvasion()<br />
		{<br />
			super(Stats.EVASION_RATE, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			//[Square(DEX)]*6 + lvl;<br />
			env.value += Math.sqrt(p.getDEX()) * 6;<br />
			env.value += p.getLevel();<br />
			if (p.getLevel() &gt; 77) env.value += (p.getLevel() - 77);<br />
			if (p.getLevel() &gt; 69) env.value += (p.getLevel() - 69);<br />
		}<br />
	}<br />
<br />
	static class FuncAtkCritical extends Func<br />
	{<br />
		static final FuncAtkCritical _fac_instance = new FuncAtkCritical();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fac_instance;<br />
		}<br />
<br />
		private FuncAtkCritical()<br />
		{<br />
			super(Stats.CRITICAL_RATE, 0x09, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			if( p instanceof L2Summon) env.value = 40;<br />
			else if (p instanceof L2PcInstance &amp;&amp; p.getActiveWeaponInstance() == null) env.value = 40;<br />
			else<br />
			{<br />
				env.value *= DEXbonus[p.getDEX()];<br />
				env.value *= 10;<br />
<br />
			}<br />
			env.baseValue = env.value;<br />
		}<br />
	}<br />
	<br />
	static class FuncMAtkCritical extends Func<br />
	{<br />
		static final FuncMAtkCritical _fac_instance = new FuncMAtkCritical();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fac_instance;<br />
		}<br />
<br />
		private FuncMAtkCritical()<br />
		{<br />
			super(Stats.MCRITICAL_RATE, 0x30, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2Character p = env.player;<br />
			if(p instanceof L2Summon)<br />
				env.value = 8; // TODO: needs retail value<br />
			else if (p instanceof L2PcInstance &amp;&amp; p.getActiveWeaponInstance() != null)<br />
				env.value *= WITbonus[p.getWIT()];<br />
		}<br />
	}<br />
<br />
	static class FuncMoveSpeed extends Func<br />
	{<br />
		static final FuncMoveSpeed _fms_instance = new FuncMoveSpeed();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fms_instance;<br />
		}<br />
<br />
		private FuncMoveSpeed()<br />
		{<br />
			super(Stats.RUN_SPEED, 0x30, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= DEXbonus[p.getDEX()];<br />
		}<br />
	}<br />
<br />
	static class FuncPAtkSpeed extends Func<br />
	{<br />
		static final FuncPAtkSpeed _fas_instance = new FuncPAtkSpeed();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fas_instance;<br />
		}<br />
<br />
		private FuncPAtkSpeed()<br />
		{<br />
			super(Stats.POWER_ATTACK_SPEED, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= DEXbonus[p.getDEX()];<br />
		}<br />
	}<br />
<br />
	static class FuncMAtkSpeed extends Func<br />
	{<br />
		static final FuncMAtkSpeed _fas_instance = new FuncMAtkSpeed();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fas_instance;<br />
		}<br />
<br />
		private FuncMAtkSpeed()<br />
		{<br />
			super(Stats.MAGIC_ATTACK_SPEED, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= WITbonus[p.getWIT()];<br />
		}<br />
	}<br />
<br />
	static class FuncHennaSTR extends Func<br />
	{<br />
		static final FuncHennaSTR _fh_instance = new FuncHennaSTR();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaSTR()<br />
		{<br />
			super(Stats.STAT_STR, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatSTR();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaDEX extends Func<br />
	{<br />
		static final FuncHennaDEX _fh_instance = new FuncHennaDEX();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaDEX()<br />
		{<br />
			super(Stats.STAT_DEX, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatDEX();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaINT extends Func<br />
	{<br />
		static final FuncHennaINT _fh_instance = new FuncHennaINT();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaINT()<br />
		{<br />
			super(Stats.STAT_INT, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatINT();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaMEN extends Func<br />
	{<br />
		static final FuncHennaMEN _fh_instance = new FuncHennaMEN();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaMEN()<br />
		{<br />
			super(Stats.STAT_MEN, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatMEN();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaCON extends Func<br />
	{<br />
		static final FuncHennaCON _fh_instance = new FuncHennaCON();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaCON()<br />
		{<br />
			super(Stats.STAT_CON, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatCON();<br />
		}<br />
	}<br />
<br />
	static class FuncHennaWIT extends Func<br />
	{<br />
		static final FuncHennaWIT _fh_instance = new FuncHennaWIT();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fh_instance;<br />
		}<br />
<br />
		private FuncHennaWIT()<br />
		{<br />
			super(Stats.STAT_WIT, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			//			L2PcTemplate t = (L2PcTemplate)env._player.getTemplate();<br />
			L2PcInstance pc = (L2PcInstance) env.player;<br />
			if (pc != null) env.value += pc.getHennaStatWIT();<br />
		}<br />
	}<br />
<br />
	static class FuncMaxHpAdd extends Func<br />
	{<br />
		static final FuncMaxHpAdd _fmha_instance = new FuncMaxHpAdd();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmha_instance;<br />
		}<br />
<br />
		private FuncMaxHpAdd()<br />
		{<br />
			super(Stats.MAX_HP, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcTemplate t = (L2PcTemplate) env.player.getTemplate();<br />
			int lvl = env.player.getLevel() - t.classBaseLevel;<br />
			double hpmod = t.lvlHpMod * lvl;<br />
			double hpmax = (t.lvlHpAdd + hpmod) * lvl;<br />
			double hpmin = (t.lvlHpAdd * lvl) + hpmod;<br />
			env.value += (hpmax + hpmin) / 2;<br />
		}<br />
	}<br />
<br />
	static class FuncMaxHpMul extends Func<br />
	{<br />
		static final FuncMaxHpMul _fmhm_instance = new FuncMaxHpMul();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmhm_instance;<br />
		}<br />
<br />
		private FuncMaxHpMul()<br />
		{<br />
			super(Stats.MAX_HP, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= CONbonus[p.getCON()];<br />
		}<br />
	}<br />
<br />
	static class FuncMaxCpAdd extends Func<br />
	{<br />
		static final FuncMaxCpAdd _fmca_instance = new FuncMaxCpAdd();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmca_instance;<br />
		}<br />
<br />
		private FuncMaxCpAdd()<br />
		{<br />
			super(Stats.MAX_CP, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcTemplate t = (L2PcTemplate) env.player.getTemplate();<br />
			int lvl = env.player.getLevel() - t.classBaseLevel;<br />
			double cpmod = t.lvlCpMod * lvl;<br />
			double cpmax = (t.lvlCpAdd + cpmod) * lvl;<br />
			double cpmin = (t.lvlCpAdd * lvl) + cpmod;<br />
			env.value += (cpmax + cpmin) / 2;<br />
		}<br />
	}<br />
<br />
	static class FuncMaxCpMul extends Func<br />
	{<br />
		static final FuncMaxCpMul _fmcm_instance = new FuncMaxCpMul();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmcm_instance;<br />
		}<br />
<br />
		private FuncMaxCpMul()<br />
		{<br />
			super(Stats.MAX_CP, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= CONbonus[p.getCON()];<br />
		}<br />
	}<br />
<br />
	static class FuncMaxMpAdd extends Func<br />
	{<br />
		static final FuncMaxMpAdd _fmma_instance = new FuncMaxMpAdd();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmma_instance;<br />
		}<br />
<br />
		private FuncMaxMpAdd()<br />
		{<br />
			super(Stats.MAX_MP, 0x10, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcTemplate t = (L2PcTemplate) env.player.getTemplate();<br />
			int lvl = env.player.getLevel() - t.classBaseLevel;<br />
			double mpmod = t.lvlMpMod * lvl;<br />
			double mpmax = (t.lvlMpAdd + mpmod) * lvl;<br />
			double mpmin = (t.lvlMpAdd * lvl) + mpmod;<br />
			env.value += (mpmax + mpmin) / 2;<br />
		}<br />
	}<br />
<br />
	static class FuncMaxMpMul extends Func<br />
	{<br />
		static final FuncMaxMpMul _fmmm_instance = new FuncMaxMpMul();<br />
<br />
		static Func getInstance()<br />
		{<br />
			return _fmmm_instance;<br />
		}<br />
<br />
		private FuncMaxMpMul()<br />
		{<br />
			super(Stats.MAX_MP, 0x20, null);<br />
		}<br />
<br />
		@Override<br />
		public void calc(Env env)<br />
		{<br />
			L2PcInstance p = (L2PcInstance) env.player;<br />
			env.value *= MENbonus[p.getMEN()];<br />
		}<br />
	}<br />
<br />
	/**<br />
	 * Return the period between 2 regenerations task (3s for L2Character, 5 min for L2DoorInstance).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static int getRegeneratePeriod(L2Character cha)<br />
	{<br />
		if (cha instanceof L2DoorInstance) return HP_REGENERATE_PERIOD * 100; // 5 mins<br />
<br />
		return HP_REGENERATE_PERIOD; // 3s<br />
	}<br />
<br />
	/**<br />
	 * Return the standard NPC Calculator set containing ACCURACY_COMBAT and EVASION_RATE.&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * &lt;B&gt;&lt;U&gt; Concept&lt;/U&gt; :&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;<br />
	 * A calculator is created to manage and dynamically calculate the effect of a character property (ex : MAX_HP, REGENERATE_HP_RATE...).<br />
	 * In fact, each calculator is a table of Func object in which each Func represents a mathematic function : &lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * FuncAtkAccuracy -&gt; Math.sqrt(_player.getDEX())*6+_player.getLevel()&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * To reduce cache memory use, L2NPCInstances who don't have skills share the same Calculator set called &lt;B&gt;NPC_STD_CALCULATOR&lt;/B&gt;.&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 */<br />
	public static Calculator[] getStdNPCCalculators()<br />
	{<br />
		Calculator[] std = new Calculator[Stats.NUM_STATS];<br />
<br />
		// Add the FuncAtkAccuracy to the Standard Calculator of ACCURACY_COMBAT<br />
		std[Stats.ACCURACY_COMBAT.ordinal()] = new Calculator();<br />
		std[Stats.ACCURACY_COMBAT.ordinal()].addFunc(FuncAtkAccuracy.getInstance());<br />
<br />
		// Add the FuncAtkEvasion to the Standard Calculator of EVASION_RATE<br />
		std[Stats.EVASION_RATE.ordinal()] = new Calculator();<br />
		std[Stats.EVASION_RATE.ordinal()].addFunc(FuncAtkEvasion.getInstance());<br />
<br />
		return std;<br />
	}<br />
<br />
	public static Calculator[] getStdDoorCalculators()<br />
	{<br />
		Calculator[] std = new Calculator[Stats.NUM_STATS];<br />
<br />
		// Add the FuncAtkAccuracy to the Standard Calculator of ACCURACY_COMBAT<br />
		std[Stats.ACCURACY_COMBAT.ordinal()] = new Calculator();<br />
		std[Stats.ACCURACY_COMBAT.ordinal()].addFunc(FuncAtkAccuracy.getInstance());<br />
<br />
		// Add the FuncAtkEvasion to the Standard Calculator of EVASION_RATE<br />
		std[Stats.EVASION_RATE.ordinal()] = new Calculator();<br />
		std[Stats.EVASION_RATE.ordinal()].addFunc(FuncAtkEvasion.getInstance());<br />
		<br />
		//SevenSigns PDEF Modifier<br />
		std[Stats.POWER_DEFENCE.ordinal()].addFunc(FuncGatesPDefMod.getInstance());<br />
		<br />
		//SevenSigns MDEF Modifier<br />
		std[Stats.MAGIC_DEFENCE.ordinal()].addFunc(FuncGatesMDefMod.getInstance());		<br />
		<br />
		return std;<br />
	}	<br />
<br />
	/**<br />
	 * Add basics Func objects to L2PcInstance and L2Summon.&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * &lt;B&gt;&lt;U&gt; Concept&lt;/U&gt; :&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;<br />
	 * A calculator is created to manage and dynamically calculate the effect of a character property (ex : MAX_HP, REGENERATE_HP_RATE...).<br />
	 * In fact, each calculator is a table of Func object in which each Func represents a mathematic function : &lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * FuncAtkAccuracy -&gt; Math.sqrt(_player.getDEX())*6+_player.getLevel()&lt;BR&gt;&lt;BR&gt;<br />
	 *<br />
	 * @param cha L2PcInstance or L2Summon that must obtain basic Func objects<br />
	 */<br />
	public static void addFuncsToNewCharacter(L2Character cha)<br />
	{<br />
		if (cha instanceof L2PcInstance)<br />
		{<br />
			cha.addStatFunc(FuncMaxHpAdd.getInstance());<br />
			cha.addStatFunc(FuncMaxHpMul.getInstance());<br />
			cha.addStatFunc(FuncMaxCpAdd.getInstance());<br />
			cha.addStatFunc(FuncMaxCpMul.getInstance());<br />
			cha.addStatFunc(FuncMaxMpAdd.getInstance());<br />
			cha.addStatFunc(FuncMaxMpMul.getInstance());<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_HP_RATE));<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_CP_RATE));<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_MP_RATE));<br />
			cha.addStatFunc(FuncBowAtkRange.getInstance());<br />
            cha.addStatFunc(FuncCrossBowAtkRange.getInstance());<br />
			//cha.addStatFunc(FuncMultLevelMod.getInstance(Stats.POWER_ATTACK));<br />
			//cha.addStatFunc(FuncMultLevelMod.getInstance(Stats.POWER_DEFENCE));<br />
			//cha.addStatFunc(FuncMultLevelMod.getInstance(Stats.MAGIC_DEFENCE));<br />
			cha.addStatFunc(FuncPAtkMod.getInstance());<br />
			cha.addStatFunc(FuncMAtkMod.getInstance());<br />
            cha.addStatFunc(FuncPDefMod.getInstance());<br />
			cha.addStatFunc(FuncMDefMod.getInstance());<br />
			cha.addStatFunc(FuncAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncMAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncAtkAccuracy.getInstance());<br />
			cha.addStatFunc(FuncAtkEvasion.getInstance());<br />
			cha.addStatFunc(FuncPAtkSpeed.getInstance());<br />
			cha.addStatFunc(FuncMAtkSpeed.getInstance());<br />
			cha.addStatFunc(FuncMoveSpeed.getInstance());<br />
<br />
			cha.addStatFunc(FuncHennaSTR.getInstance());<br />
			cha.addStatFunc(FuncHennaDEX.getInstance());<br />
			cha.addStatFunc(FuncHennaINT.getInstance());<br />
			cha.addStatFunc(FuncHennaMEN.getInstance());<br />
			cha.addStatFunc(FuncHennaCON.getInstance());<br />
			cha.addStatFunc(FuncHennaWIT.getInstance());<br />
		}<br />
        else if (cha instanceof L2PetInstance)<br />
        {<br />
            cha.addStatFunc(FuncPAtkMod.getInstance());<br />
            cha.addStatFunc(FuncMAtkMod.getInstance());<br />
            cha.addStatFunc(FuncPDefMod.getInstance());<br />
            cha.addStatFunc(FuncMDefMod.getInstance());<br />
        }<br />
		else if (cha instanceof L2Summon)<br />
		{<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_HP_RATE));<br />
			//cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_MP_RATE));<br />
			cha.addStatFunc(FuncAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncMAtkCritical.getInstance());<br />
			cha.addStatFunc(FuncAtkAccuracy.getInstance());<br />
			cha.addStatFunc(FuncAtkEvasion.getInstance());<br />
		}<br />
	}<br />
<br />
	/**<br />
	 * Calculate the HP regen rate (base + modifiers).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static final double calcHpRegen(L2Character cha)<br />
	{<br />
        double init = cha.getTemplate().baseHpReg;<br />
		double hpRegenMultiplier = cha.isRaid() ? Config.RAID_HP_REGEN_MULTIPLIER : Config.HP_REGEN_MULTIPLIER;<br />
		double hpRegenBonus = 0;<br />
<br />
		if (Config.L2JMOD_CHAMPION_ENABLE &amp;&amp; cha.isChampion())<br />
			hpRegenMultiplier *= Config.L2JMOD_CHAMPION_HP_REGEN;<br />
<br />
		if (cha instanceof L2PcInstance)<br />
		{<br />
            L2PcInstance player = (L2PcInstance) cha;<br />
<br />
            // Calculate correct baseHpReg value for certain level of PC<br />
            init += (player.getLevel() &gt; 10) ? ((player.getLevel()-1)/10.0) : 0.5;<br />
<br />
            // SevenSigns Festival modifier<br />
			if (SevenSignsFestival.getInstance().isFestivalInProgress() &amp;&amp; player.isFestivalParticipant())<br />
                hpRegenMultiplier *= calcFestivalRegenModifier(player);<br />
			else<br />
			{<br />
				double siegeModifier = calcSiegeRegenModifer(player);<br />
				if (siegeModifier &gt; 0) hpRegenMultiplier *= siegeModifier;<br />
			}<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CLANHALL) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int clanHallIndex = player.getClan().getHasHideout();<br />
            	if (clanHallIndex &gt; 0)<br />
            	{<br />
            		ClanHall clansHall = ClanHallManager.getInstance().getClanHallById(clanHallIndex);<br />
            		if(clansHall != null)<br />
            			if (clansHall.getFunction(ClanHall.FUNC_RESTORE_HP) != null)<br />
            				hpRegenMultiplier *= 1+ (double)clansHall.getFunction(ClanHall.FUNC_RESTORE_HP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CASTLE) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int castleIndex = player.getClan().getHasCastle();<br />
            	if (castleIndex &gt; 0)<br />
            	{<br />
            		Castle castle = CastleManager.getInstance().getCastleById(castleIndex);<br />
            		if(castle != null)<br />
            			if (castle.getFunction(Castle.FUNC_RESTORE_HP) != null)<br />
            				hpRegenMultiplier *= 1+ (double)castle.getFunction(Castle.FUNC_RESTORE_HP).getLvl()/100;<br />
            	}<br />
            }<br />
            <br />
            if (player.isInsideZone(L2Character.ZONE_FORT) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int fortIndex = player.getClan().getHasFort();<br />
            	if (fortIndex &gt; 0)<br />
            	{<br />
            		Fort fort = FortManager.getInstance().getFortById(fortIndex);<br />
            		if (fort != null)<br />
            			if (fort.getFunction(Fort.FUNC_RESTORE_HP) != null)<br />
            				hpRegenMultiplier *= 1+ (double)fort.getFunction(Fort.FUNC_RESTORE_HP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
			// Mother Tree effect is calculated at last<br />
			if (player.isInsideZone(L2Character.ZONE_MOTHERTREE)) hpRegenBonus += 2;<br />
<br />
            // Calculate Movement bonus<br />
            if (player.isSitting()) hpRegenMultiplier *= 1.5;      // Sitting<br />
            else if (!player.isMoving()) hpRegenMultiplier *= 1.1; // Staying<br />
            else if (player.isRunning()) hpRegenMultiplier *= 0.7; // Running<br />
<br />
            // Add CON bonus<br />
            init *= cha.getLevelMod() * CONbonus[cha.getCON()];<br />
		}<br />
		else if (cha instanceof L2PetInstance)<br />
			init = ((L2PetInstance) cha).getPetData().getPetRegenHP();<br />
<br />
        if (init &lt; 1) init = 1;<br />
<br />
        return cha.calcStat(Stats.REGENERATE_HP_RATE, init, null, null) * hpRegenMultiplier + hpRegenBonus;<br />
	}<br />
<br />
	/**<br />
	 * Calculate the MP regen rate (base + modifiers).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static final double calcMpRegen(L2Character cha)<br />
	{<br />
        double init = cha.getTemplate().baseMpReg;<br />
        double mpRegenMultiplier = cha.isRaid() ? Config.RAID_MP_REGEN_MULTIPLIER : Config.MP_REGEN_MULTIPLIER;<br />
		double mpRegenBonus = 0;<br />
<br />
		if (cha instanceof L2PcInstance)<br />
		{<br />
			L2PcInstance player = (L2PcInstance) cha;<br />
<br />
            // Calculate correct baseMpReg value for certain level of PC<br />
            init += 0.3*((player.getLevel()-1)/10.0);<br />
<br />
            // SevenSigns Festival modifier<br />
            if (SevenSignsFestival.getInstance().isFestivalInProgress() &amp;&amp; player.isFestivalParticipant())<br />
				mpRegenMultiplier *= calcFestivalRegenModifier(player);<br />
<br />
			// Mother Tree effect is calculated at last<br />
			if (player.isInsideZone(L2Character.ZONE_MOTHERTREE)) mpRegenBonus += 1;<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CLANHALL) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int clanHallIndex = player.getClan().getHasHideout();<br />
            	if (clanHallIndex &gt; 0)<br />
            	{<br />
            		ClanHall clansHall = ClanHallManager.getInstance().getClanHallById(clanHallIndex);<br />
            		if(clansHall != null)<br />
            			if (clansHall.getFunction(ClanHall.FUNC_RESTORE_MP) != null)<br />
            				mpRegenMultiplier *= 1+ (double)clansHall.getFunction(ClanHall.FUNC_RESTORE_MP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
            if (player.isInsideZone(L2Character.ZONE_CASTLE) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int castleIndex = player.getClan().getHasCastle();<br />
            	if (castleIndex &gt; 0)<br />
            	{<br />
            		Castle castle = CastleManager.getInstance().getCastleById(castleIndex);<br />
            		if(castle != null)<br />
            			if (castle.getFunction(Castle.FUNC_RESTORE_MP) != null)<br />
            				mpRegenMultiplier *= 1+ (double)castle.getFunction(Castle.FUNC_RESTORE_MP).getLvl()/100;<br />
            	}<br />
            }<br />
            <br />
            if (player.isInsideZone(L2Character.ZONE_FORT) &amp;&amp; player.getClan() != null)<br />
            {<br />
            	int fortIndex = player.getClan().getHasFort();<br />
            	if (fortIndex &gt; 0)<br />
            	{<br />
            		Fort fort = FortManager.getInstance().getFortById(fortIndex);<br />
            		if(fort != null)<br />
            			if (fort.getFunction(Fort.FUNC_RESTORE_MP) != null)<br />
            				mpRegenMultiplier *= 1+ (double)fort.getFunction(Fort.FUNC_RESTORE_MP).getLvl()/100;<br />
            	}<br />
            }<br />
<br />
			// Calculate Movement bonus<br />
            if (player.isSitting()) mpRegenMultiplier *= 1.5;      // Sitting<br />
            else if (!player.isMoving()) mpRegenMultiplier *= 1.1; // Staying<br />
            else if (player.isRunning()) mpRegenMultiplier *= 0.7; // Running<br />
<br />
            // Add MEN bonus<br />
            init *= cha.getLevelMod() * MENbonus[cha.getMEN()];<br />
		}<br />
		else if (cha instanceof L2PetInstance)<br />
			init = ((L2PetInstance) cha).getPetData().getPetRegenMP();<br />
<br />
		if (init &lt; 1) init = 1;<br />
<br />
		return cha.calcStat(Stats.REGENERATE_MP_RATE, init, null, null) * mpRegenMultiplier + mpRegenBonus;<br />
	}<br />
<br />
	/**<br />
	 * Calculate the CP regen rate (base + modifiers).&lt;BR&gt;&lt;BR&gt;<br />
	 */<br />
	public static final double calcCpRegen(L2Character cha)<br />
	{<br />
        double init = cha.getTemplate().baseHpReg;<br />
        double cpRegenMultiplier = Config.CP_REGEN_MULTIPLIER;<br />
        double cpRegenBonus = 0;<br />
<br />
        if (cha instanceof L2PcInstance)<br />
        {<br />
	        L2PcInstance player = (L2PcInstance) cha;<br />
<br />
	        // Calculate correct baseHpReg value for certain level of PC<br />
	        init += (player.getLevel() &gt; 10) ? ((player.getLevel()-1)/10.0) : 0.5;<br />
<br />
	        // Calculate Movement bonus<br />
	        if (player.isSitting()) cpRegenMultiplier *= 1.5;      // Sitting<br />
	        else if (!player.isMoving()) cpRegenMultiplier *= 1.1; // Staying<br />
	        else if (player.isRunning()) cpRegenMultiplier *= 0.7; // Running<br />
        } else<br />
        {<br />
	        // Calculate Movement bonus<br />
        	if (!cha.isMoving()) cpRegenMultiplier *= 1.1; // Staying<br />
	        else if (cha.isRunning()) cpRegenMultiplier *= 0.7; // Running<br />
        }<br />
<br />
        // Apply CON bonus<br />
        init *= cha.getLevelMod() * CONbonus[cha.getCON()];<br />
        if (init &lt; 1) init = 1;<br />
<br />
        return cha.calcStat(Stats.REGENERATE_CP_RATE, init, null, null) * cpRegenMultiplier + cpRegenBonus;<br />
	}<br />
<br />
	@SuppressWarnings("deprecation")<br />
	public static final double calcFestivalRegenModifier(L2PcInstance activeChar)<br />
	{<br />
		final int[] festivalInfo = SevenSignsFestival.getInstance().getFestivalForPlayer(activeChar);<br />
		final int oracle = festivalInfo[0];<br />
		final int festivalId = festivalInfo[1];<br />
		int[] festivalCenter;<br />
<br />
		// If the player isn't found in the festival, leave the regen rate as it is.<br />
		if (festivalId &lt; 0) return 0;<br />
<br />
		// Retrieve the X and Y coords for the center of the festival arena the player is in.<br />
		if (oracle == SevenSigns.CABAL_DAWN) festivalCenter = SevenSignsFestival.FESTIVAL_DAWN_PLAYER_SPAWNS[festivalId];<br />
		else festivalCenter = SevenSignsFestival.FESTIVAL_DUSK_PLAYER_SPAWNS[festivalId];<br />
<br />
		// Check the distance between the player and the player spawn point, in the center of the arena.<br />
		double distToCenter = activeChar.getDistance(festivalCenter[0], festivalCenter[1]);<br />
<br />
		if (Config.DEBUG)<br />
			_log.info("Distance: " + distToCenter + ", RegenMulti: " + (distToCenter * 2.5) / 50);<br />
<br />
		return 1.0 - (distToCenter * 0.0005); // Maximum Decreased Regen of ~ -65%;<br />
	}<br />
<br />
	public static final double calcSiegeRegenModifer(L2PcInstance activeChar)<br />
	{<br />
		if (activeChar == null || activeChar.getClan() == null) return 0;<br />
<br />
		Siege siege = SiegeManager.getInstance().getSiege(activeChar.getPosition().getX(),<br />
															activeChar.getPosition().getY(),<br />
															activeChar.getPosition().getZ());<br />
		if (siege == null || !siege.getIsInProgress()) return 0;<br />
<br />
		L2SiegeClan siegeClan = siege.getAttackerClan(activeChar.getClan().getClanId());<br />
		if (siegeClan == null || siegeClan.getFlag().isEmpty()<br />
			|| !Util.checkIfInRange(200, activeChar, siegeClan.getFlag().get(0), true)) return 0;<br />
<br />
		return 1.5; // If all is true, then modifer will be 50% more<br />
	}<br />
	/** Calculate blow damage based on cAtk */<br />
	public static double calcBlowDamage(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss)<br />
	{<br />
		double power = skill.getPower();<br />
		double damage = attacker.getPAtk(target);<br />
		damage+=calcValakasAttribute(attacker, target, skill);<br />
		double defence = target.getPDef(attacker);<br />
<br />
		// Def bonusses in PvP fight<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);<br />
			else<br />
				defence *= target.calcStat(Stats.PVP_PHYS_SKILL_DEF, 1, null, null);	<br />
		}<br />
<br />
		if(ss)<br />
			damage *= 2.;<br />
		switch(shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				defence += target.getShldDef();<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1;<br />
		}<br />
		<br />
		if(ss &amp;&amp; skill.getSSBoost()&gt;0)<br />
			power *= skill.getSSBoost();<br />
<br />
		damage = attacker.calcStat(Stats.CRITICAL_DAMAGE, (damage+power), target, skill);<br />
		damage *= calcElemental(attacker, target, skill);<br />
		damage += attacker.calcStat(Stats.CRITICAL_DAMAGE_ADD, 0, target, skill) * 6.5;<br />
		damage *= target.calcStat(Stats.CRIT_VULN, target.getTemplate().baseCritVuln, target, skill);<br />
<br />
		// get the natural vulnerability for the template<br />
		if (target instanceof L2Npc)<br />
		{<br />
			damage *= ((L2Npc) target).getTemplate().getVulnerability(Stats.DAGGER_WPN_VULN);<br />
		}<br />
		// get the vulnerability for the instance due to skills (buffs, passives, toggles, etc)<br />
		damage = target.calcStat(Stats.DAGGER_WPN_VULN, damage, target, null);<br />
		damage *= 70. / defence;<br />
		damage += Rnd.get() * attacker.getRandomDamage(target);<br />
		<br />
		// Dmg bonusses in PvP fight<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);<br />
			else<br />
				damage *= attacker.calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);	<br />
		}<br />
		<br />
		return damage &lt; 1 ? 1. : damage;<br />
	}<br />
	/** Calculated damage caused by ATTACK of attacker on target,<br />
	 * called separatly for each weapon, if dual-weapon is used.<br />
	 *<br />
	 * @param attacker player or NPC that makes ATTACK<br />
	 * @param target player or NPC, target of ATTACK<br />
	 * @param miss one of ATTACK_XXX constants<br />
	 * @param crit if the ATTACK have critical success<br />
	 * @param dual if dual weapon is used<br />
	 * @param ss if weapon item was charged by soulshot<br />
	 * @return damage points<br />
	 */<br />
	public static final double calcPhysDam(L2Character attacker, L2Character target, L2Skill skill,<br />
									byte shld, boolean crit, boolean dual, boolean ss)<br />
	{<br />
		double damage = attacker.getPAtk(target);<br />
		double defence = target.getPDef(attacker);<br />
		damage+=calcValakasAttribute(attacker, target, skill);<br />
<br />
		// Def bonusses in PvP fight<br />
		if((attacker instanceof L2Playable) <br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);<br />
			else<br />
				defence *= target.calcStat(Stats.PVP_PHYS_SKILL_DEF, 1, null, null);	<br />
		}<br />
<br />
		switch (shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				if (!Config.ALT_GAME_SHIELD_BLOCKS)<br />
					defence += target.getShldDef();<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1.;<br />
		}<br />
		<br />
		if (ss) damage *= 2;<br />
		if (skill != null)<br />
		{<br />
			double skillpower = skill.getPower(attacker);<br />
			float ssboost = skill.getSSBoost();<br />
			if (ssboost &lt;= 0)<br />
				damage += skillpower;<br />
			else if (ssboost &gt; 0)<br />
			{<br />
				if (ss)<br />
				{<br />
					skillpower *= ssboost;<br />
					damage += skillpower;<br />
				}<br />
				else<br />
					damage += skillpower;<br />
			}<br />
		}<br />
<br />
		// defence modifier depending of the attacker weapon<br />
		L2Weapon weapon = attacker.getActiveWeaponItem();<br />
		Stats stat = null;<br />
		if (weapon != null &amp;&amp; !attacker.isTransformed())<br />
		{<br />
			switch (weapon.getItemType())<br />
			{<br />
				case BOW:<br />
					stat = Stats.BOW_WPN_VULN;<br />
					break;<br />
				case CROSSBOW:<br />
					stat = Stats.CROSSBOW_WPN_VULN;<br />
					break;<br />
				case BLUNT:<br />
					stat = Stats.BLUNT_WPN_VULN;<br />
					break;<br />
				case DAGGER:<br />
					stat = Stats.DAGGER_WPN_VULN;<br />
					break;<br />
				case DUAL:<br />
					stat = Stats.DUAL_WPN_VULN;<br />
					break;<br />
				case DUALFIST:<br />
					stat = Stats.DUALFIST_WPN_VULN;<br />
					break;<br />
				case ETC:<br />
					stat = Stats.ETC_WPN_VULN;<br />
					break;<br />
				case FIST:<br />
					stat = Stats.FIST_WPN_VULN;<br />
					break;<br />
				case POLE:<br />
					stat = Stats.POLE_WPN_VULN;<br />
					break;<br />
				case SWORD:<br />
					stat = Stats.SWORD_WPN_VULN;<br />
					break;<br />
				case BIGSWORD:<br />
					stat = Stats.BIGSWORD_WPN_VULN;<br />
					break;<br />
				case BIGBLUNT:<br />
					stat = Stats.BIGBLUNT_WPN_VULN;<br />
					break;<br />
				case DUAL_DAGGER:<br />
					stat = Stats.DUALDAGGER_WPN_VULN;<br />
					break;<br />
				case RAPIER:<br />
					stat = Stats.RAPIER_WPN_VULN;<br />
					break;<br />
				case ANCIENT_SWORD:<br />
					stat = Stats.ANCIENT_WPN_VULN;<br />
					break;<br />
				case PET:<br />
					stat = Stats.PET_WPN_VULN;<br />
					break;<br />
			}<br />
		}<br />
<br />
<br />
		/*if (shld &amp;&amp; !Config.ALT_GAME_SHIELD_BLOCKS)<br />
		{<br />
			defence += target.getShldDef();<br />
		}*/<br />
		//if (!(attacker instanceof L2RaidBossInstance) &amp;&amp;<br />
		/*<br />
		if ((attacker instanceof L2NpcInstance || attacker instanceof L2SiegeGuardInstance))<br />
		{<br />
			if (attacker instanceof L2RaidBossInstance) damage *= 1; // was 10 changed for temp fix<br />
			//			else<br />
			//			damage *= 2;<br />
			//			if (attacker instanceof L2NpcInstance || attacker instanceof L2SiegeGuardInstance){<br />
			//damage = damage * attacker.getSTR() * attacker.getAccuracy() * 0.05 / defence;<br />
			//			damage = damage * attacker.getSTR()*  (attacker.getSTR() + attacker.getLevel()) * 0.025 / defence;<br />
			//			damage += _rnd.nextDouble() * damage / 10 ;<br />
		}<br />
		*/<br />
		//		else {<br />
		//if (skill == null)<br />
		<br />
		if (crit)<br />
		{<br />
			//Finally retail like formula <br />
			damage = 2 * attacker.calcStat(Stats.CRITICAL_DAMAGE, 1, target, skill) * target.calcStat(Stats.CRIT_VULN, target.getTemplate().baseCritVuln, target, null) * (70 * damage / defence);<br />
			//Crit dmg add is almost useless in normal hits... <br />
			damage += (attacker.calcStat(Stats.CRITICAL_DAMAGE_ADD, 0, target, skill) * 70 / defence);<br />
		}<br />
		else<br />
			damage = 70 * damage / defence;<br />
		<br />
		// In C5 summons make 10 % less dmg in PvP.<br />
		if (attacker instanceof L2Summon &amp;&amp; target instanceof L2PcInstance)<br />
			damage *= 0.9;<br />
<br />
		if (stat != null)<br />
		{<br />
			// get the vulnerability due to skills (buffs, passives, toggles, etc)<br />
			damage = target.calcStat(stat, damage, target, null);<br />
			if (target instanceof L2Npc)<br />
			{<br />
				// get the natural vulnerability for the template<br />
				damage *= ((L2Npc) target).getTemplate().getVulnerability(stat);<br />
			}<br />
		}<br />
<br />
		damage += Rnd.nextDouble() * damage / 10;<br />
		//		damage += _rnd.nextDouble()* attacker.getRandomDamage(target);<br />
		//		}<br />
		if (shld &gt; 0 &amp;&amp; Config.ALT_GAME_SHIELD_BLOCKS)<br />
		{<br />
			damage -= target.getShldDef();<br />
			if (damage &lt; 0) damage = 0;<br />
		}<br />
		<br />
		if (target instanceof L2Npc)<br />
		{<br />
			switch (((L2Npc) target).getTemplate().getRace())<br />
			{<br />
				case BEAST:<br />
					damage *= attacker.getPAtkMonsters(target);<br />
					break;<br />
				case ANIMAL:<br />
					damage *= attacker.getPAtkAnimals(target);<br />
					break;<br />
				case PLANT:<br />
					damage *= attacker.getPAtkPlants(target);<br />
					break;<br />
				case DRAGON:<br />
					damage *= attacker.getPAtkDragons(target);<br />
					break;<br />
				case BUG:<br />
					damage *= attacker.getPAtkInsects(target);<br />
					break;<br />
				case GIANT:<br />
					damage *= attacker.getPAtkGiants(target);<br />
					break;					<br />
				default:<br />
					// nothing<br />
					break;<br />
			}<br />
		}<br />
		<br />
		if (damage &gt; 0 &amp;&amp; damage &lt; 1)<br />
		{<br />
			damage = 1;<br />
		}<br />
		else if (damage &lt; 0)<br />
		{<br />
			damage = 0;<br />
		}<br />
		<br />
		// Dmg bonusses in PvP fight<br />
		if((attacker instanceof L2Playable) <br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill == null)<br />
				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);<br />
			else<br />
				damage *= attacker.calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);	<br />
		}<br />
		<br />
		damage *= calcElemental(attacker, target, skill);<br />
<br />
		return damage;<br />
	}<br />
<br />
	public static final double calcMagicDam(L2Character attacker, L2Character target, L2Skill skill,<br />
										byte shld, boolean ss, boolean bss, boolean mcrit)<br />
	{	<br />
		double mAtk = attacker.getMAtk(target, skill);<br />
		double mDef = target.getMDef(attacker, skill);<br />
		<br />
		// Pvp bonuses for def<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill.isMagic())<br />
				mDef *= target.calcStat(Stats.PVP_MAGICAL_DEF, 1, null, null);<br />
			else<br />
				mDef *= target.calcStat(Stats.PVP_PHYS_SKILL_DEF, 1, null, null);<br />
		}<br />
<br />
		switch (shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				mDef += target.getShldDef(); // kamael<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1;<br />
		}<br />
		<br />
		if (bss) mAtk *= 4;<br />
		else if (ss) mAtk *= 2;<br />
<br />
		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower(attacker); <br />
		<br />
		// In C5 summons make 10 % less dmg in PvP.<br />
		if(attacker instanceof L2Summon &amp;&amp; target instanceof L2PcInstance) damage *= 0.9;<br />
		<br />
		//		if(attacker instanceof L2PcInstance &amp;&amp; target instanceof L2PcInstance) damage *= 0.9; // PvP modifier (-10%)<br />
<br />
		// Failure calculation<br />
		if (Config.ALT_GAME_MAGICFAILURES &amp;&amp; !calcMagicSuccess(attacker, target, skill))<br />
		{<br />
			if (attacker instanceof L2PcInstance)<br />
			{<br />
				if (calcMagicSuccess(attacker, target, skill)<br />
					&amp;&amp; (target.getLevel() - attacker.getLevel()) &lt;= 9)<br />
				{<br />
					if (skill.getSkillType() == L2SkillType.DRAIN)<br />
						attacker.sendPacket(new SystemMessage(SystemMessageId.DRAIN_HALF_SUCCESFUL));<br />
					else<br />
						attacker.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));<br />
<br />
					damage /= 2;<br />
				}<br />
				else<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.C1_RESISTED_YOUR_S2);<br />
					sm.addCharName(target);<br />
					sm.addSkillName(skill);<br />
					attacker.sendPacket(sm);<br />
<br />
					damage = 1;<br />
				}<br />
			}<br />
<br />
			if (target instanceof L2PcInstance)<br />
			{<br />
				if (skill.getSkillType() == L2SkillType.DRAIN)<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_DRAIN);<br />
					sm.addCharName(attacker);<br />
					target.sendPacket(sm);<br />
				}<br />
				else<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_MAGIC);<br />
					sm.addCharName(attacker);<br />
					target.sendPacket(sm);<br />
				}<br />
			}<br />
		}<br />
		else if (mcrit)<br />
		{<br />
			if (attacker instanceof L2PcInstance &amp;&amp; target instanceof L2PcInstance)<br />
				damage *= 2.5;<br />
			else<br />
				damage *= 3;<br />
		}<br />
<br />
		damage += Rnd.get() * attacker.getRandomDamage(target);<br />
		// Pvp bonuses for dmg<br />
		if((attacker instanceof L2Playable)<br />
				&amp;&amp; (target instanceof L2Playable))<br />
		{<br />
			if(skill.isMagic())<br />
				damage *= attacker.calcStat(Stats.PVP_MAGICAL_DMG, 1, null, null);<br />
			else<br />
				damage *= attacker.calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);<br />
		}<br />
		//random magic damage<br />
		float rnd = Rnd.get(-20,20)/100+1;<br />
		damage *= rnd;<br />
		// CT2.3 general magic vuln<br />
		damage *= target.calcStat(Stats.MAGIC_DAMAGE_VULN, 1, null, null);<br />
<br />
		damage *= calcElemental(attacker, target, skill); <br />
<br />
		return damage;<br />
	}<br />
	<br />
	public static final double calcMagicDam(L2CubicInstance attacker, L2Character target, L2Skill skill, boolean mcrit, byte shld)<br />
	{<br />
		double mAtk = attacker.getMAtk();<br />
		double mDef = target.getMDef(attacker.getOwner(), skill);<br />
		<br />
		switch (shld)<br />
		{<br />
			case SHIELD_DEFENSE_SUCCEED:<br />
				mDef += target.getShldDef(); // kamael<br />
				break;<br />
			case SHIELD_DEFENSE_PERFECT_BLOCK: // perfect block<br />
				return 1;<br />
		}<br />
		<br />
		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower();<br />
		L2PcInstance owner = attacker.getOwner();<br />
		// Failure calculation<br />
		if (Config.ALT_GAME_MAGICFAILURES &amp;&amp; !calcMagicSuccess(owner, target, skill))<br />
		{			<br />
			if (calcMagicSuccess(owner, target, skill) &amp;&amp; (target.getLevel() - skill.getMagicLevel()) &lt;= 9){<br />
				if (skill.getSkillType() == L2SkillType.DRAIN)<br />
					owner.sendPacket(new SystemMessage(SystemMessageId.DRAIN_HALF_SUCCESFUL));<br />
				else<br />
					owner.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));<br />
	<br />
				damage /= 2;<br />
			}<br />
			else<br />
			{<br />
				SystemMessage sm = new SystemMessage(SystemMessageId.C1_RESISTED_YOUR_S2);<br />
				sm.addCharName(target);<br />
				sm.addSkillName(skill);<br />
				owner.sendPacket(sm);<br />
	<br />
				damage = 1;<br />
			}<br />
		<br />
			if (target instanceof L2PcInstance)<br />
			{<br />
				if (skill.getSkillType() == L2SkillType.DRAIN)<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_DRAIN);<br />
					sm.addCharName(owner);<br />
					target.sendPacket(sm);<br />
				}<br />
				else<br />
				{<br />
					SystemMessage sm = new SystemMessage(SystemMessageId.RESISTED_C1_MAGIC);<br />
					sm.addCharName(owner);<br />
					target.sendPacket(sm);<br />
				}<br />
			}<br />
		}<br />
		else if (mcrit) damage *= 3;<br />
		<br />
		// CT2.3 general magic vuln<br />
		damage *= target.calcStat(Stats.MAGIC_DAMAGE_VULN, 1, null, null);<br />
		<br />
		damage *= calcElemental(owner, target, skill);<br />
<br />
		return damage;<br />
	}<br />
<br />
	/** Returns true in case of critical hit */<br />
	public static final boolean calcCrit(double rate, L2Character target)<br />
	{<br />
		final boolean success = rate &gt; Rnd.get(1000);<br />
		<br />
		// support for critical damage evasion<br />
		if (success)<br />
		{<br />
			if (target == null)<br />
				return true; // no effect<br />
			<br />
			// little weird, but remember what CRIT_DAMAGE_EVASION &gt; 1 increase chances to _evade_ crit hits<br />
			return Rnd.get((int)target.getStat().calcStat(Stats.CRIT_DAMAGE_EVASION, 100, null, null)) &lt; 100;<br />
		}<br />
		return success;<br />
	}<br />
	/** Calculate value of blow success */<br />
	public static final boolean calcBlow(L2Character activeChar, L2Character target, int chance)<br />
	{<br />
		return activeChar.calcStat(Stats.BLOW_RATE, chance*(1.0+(activeChar.getDEX()-20)/100), target, null)&gt;Rnd.get(100);<br />
	}<br />
	/** Calculate value of lethal chance */<br />
	public static final double calcLethal(L2Character activeChar, L2Character target, int baseLethal, int magiclvl)<br />
	{<br />
		double chance = 0;<br />
		if (magiclvl &gt; 0)<br />
		{<br />
			int delta = ((magiclvl + activeChar.getLevel()) / 2) - 1 - target.getLevel();<br />
			<br />
			// delta [-3,infinite)<br />
			if (delta &gt;= -3)<br />
			{<br />
				chance = (baseLethal * ((double) activeChar.getLevel() / target.getLevel()));<br />
			}<br />
			// delta [-9, -3[<br />
			else if (delta &lt; -3 &amp;&amp; delta &gt;= -9)<br />
			{<br />
				//               baseLethal<br />
				// chance = -1 * ----------- <br />
				//               (delta / 3)<br />
				chance = (-3) * (baseLethal / (delta));<br />
			}<br />
			//delta [-infinite,-9[<br />
			else<br />
			{<br />
				chance = baseLethal / 15;<br />
			}<br />
		}<br />
		else<br />
		{<br />
			chance = (baseLethal * ((double) activeChar.getLevel() / target.getLevel()));<br />
		}<br />
		return 10 * activeChar.calcStat(Stats.LETHAL_RATE, chance, target, null);<br />
	}<br />
    <br />
    public static final boolean calcLethalHit(L2Character activeChar, L2Character target, L2Skill skill)<br />
    {<br />
        if (!target.isRaid()<br />
                &amp;&amp; !(target instanceof L2DoorInstance)<br />
                &amp;&amp; !(target instanceof L2Npc &amp;&amp; ((L2Npc) target).getNpcId() == 35062))<br />
        {<br />
            int chance = Rnd.get(1000);<br />
            <br />
            //activeChar.sendMessage(Double.toString(chance));<br />
            //activeChar.sendMessage(Double.toString(calcLethal(activeChar, target, skill.getLethalChance2(),skill.getMagicLevel())));<br />
            //activeChar.sendMessage(Double.toString(calcLethal(activeChar, target, skill.getLethalChance1(),skill.getMagicLevel())));<br />
            <br />
            // 2nd lethal effect activate (cp,hp to 1 or if target is npc then hp to 1)<br />
            if (skill.getLethalChance2() &gt; 0 &amp;&amp; chance &lt; calcLethal(activeChar, target, skill.getLethalChance2(),skill.getMagicLevel()))<br />
            {<br />
                if (target instanceof L2Npc)<br />
                    target.reduceCurrentHp(target.getCurrentHp() - 1, activeChar, skill);<br />
                else if (target instanceof L2PcInstance) // If is a active player set his HP and CP to 1<br />
                {<br />
                    L2PcInstance player = (L2PcInstance) target;<br />
                    if (!player.isInvul())<br />
                    {<br />
                    	if (!(activeChar instanceof L2PcInstance &amp;&amp; <br />
                        	(((L2PcInstance)activeChar).isGM() &amp;&amp; !((L2PcInstance)activeChar).getAccessLevel().canGiveDamage())))<br />
                    	{<br />
                    		player.setCurrentHp(1);<br />
                    		player.setCurrentCp(1);<br />
                    		player.sendPacket(new SystemMessage(SystemMessageId.LETHAL_STRIKE_SUCCESSFUL));<br />
                    	}<br />
                    }<br />
                }<br />
                activeChar.sendPacket(new SystemMessage(SystemMessageId.LETHAL_STRIKE));<br />
            }<br />
            else if (skill.getLethalChance1() &gt; 0 &amp;&amp; chance &lt; calcLethal(activeChar, target, skill.getLethalChance1(),skill.getMagicLevel()))<br />
            {<br />
                if (target instanceof L2PcInstance)<br />
                {<br />
                    L2PcInstance player = (L2PcInstance) target;<br />
                    if (!player.isInvul())<br />
                    {<br />
                    	if (!(activeChar instanceof L2PcInstance &amp;&amp; <br />
                            	(((L2PcInstance)activeChar).isGM() &amp;&amp; !((L2PcInstance)activeChar).getAccessLevel().canGiveDamage())))<br />
                        {<br />
                    		player.setCurrentCp(1); // Set CP to 1<br />
                    		player.sendPacket(new SystemMessage(SystemMessageId.CP_DISAPPEARS_WHEN_HIT_WITH_A_HALF_KILL_SKILL));<br />
                        }<br />
                    }<br />
                }<br />
                else if (target instanceof L2Npc) // If is a monster remove first damage and after 50% of current hp<br />
                    target.reduceCurrentHp(target.getCurrentHp() / 2, activeChar, skill);<br />
                activeChar.sendPacket(new SystemMessage(SystemMessageId.HALF_KILL));<br />
                <br />
            }<br />
            else<br />
                return false;<br />
        }<br />
        else<br />
            return false;<br />
        <br />
        return true;<br />
    }<br />
    <br />
	public static final boolean calcMCrit(double mRate)<br />
	{<br />
		return mRate &gt; Rnd.get(1000);<br />
	}<br />
<br />
	/** Returns true in case when ATTACK is canceled due to hit */<br />
	public static final boolean calcAtkBreak(L2Character target, double dmg)<br />
	{<br />
		if (target.getFusionSkill() != null)<br />
			return true;<br />
	    <br />
        double init = 0;<br />
<br />
		if (Config.ALT_GAME_CANCEL_CAST &amp;&amp; target.isCastingNow()) init = 15;<br />
		if (Config.ALT_GAME_CANCEL_BOW &amp;&amp; target.isAttackingNow())<br />
		{<br />
			L2Weapon wpn = target.getActiveWeaponItem();<br />
			if (wpn != null &amp;&amp; wpn.getItemType() == L2WeaponType.BOW) init = 15;<br />
		}<br />
<br />
		if (target.isRaid() || target.isInvul() || init &lt;= 0) return false; // No attack break<br />
<br />
        // Chance of break is higher with higher dmg<br />
        init += Math.sqrt(13*dmg);  <br />
<br />
        // Chance is affected by target MEN<br />
        init -= (MENbonus[target.getMEN()] * 100 - 100);<br />
<br />
        // Calculate all modifiers for ATTACK_CANCEL<br />
        double rate = target.calcStat(Stats.ATTACK_CANCEL, init, null, null); <br />
<br />
        // Adjust the rate to be between 1 and 99<br />
        if (rate &gt; 99) rate = 99;<br />
        else if (rate &lt; 1) rate = 1;<br />
<br />
        return Rnd.get(100) &lt; rate;<br />
	}<br />
<br />
	/** Calculate delay (in milliseconds) before next ATTACK */<br />
	public static final int calcPAtkSpd(L2Character attacker, L2Character target, double rate)<br />
	{<br />
		// measured Oct 2006 by Tank6585, formula by Sami<br />
		// attack speed 312 equals 1500 ms delay... (or 300 + 40 ms delay?)<br />
		if(rate &lt; 2) return 2700;<br />
	    else return (int)(470000/rate);<br />
	}<br />
<br />
	/** Calculate delay (in milliseconds) for skills cast */<br />
	public static final int calcAtkSpd(L2Character attacker, L2Skill skill, double skillTime)<br />
	{<br />
		if (skill.isMagic()) return (int) (skillTime * 333 / attacker.getMAtkSpd());<br />
		return (int) (skillTime * 333 / attacker.getPAtkSpd());<br />
	}<br />
<br />
	/** Returns true if hit missed (target evaded) <br />
	 *  Formula based on [url]http://l2p.l2wh.com/nonskillattacks.html[/url]<br />
	 **/<br />
	public static boolean calcHitMiss(L2Character attacker, L2Character target)<br />
	{<br />
		int delta = attacker.getAccuracy() - target.getEvasionRate(attacker);<br />
		int chance;<br />
		if (delta &gt;= 10) chance = 980;<br />
		else <br />
		{<br />
			switch (delta)<br />
			{<br />
				case 9: chance = 975; break; <br />
				case 8: chance = 970; break;<br />
				case 7: chance = 965; break;<br />
				case 6: chance = 960; break;<br />
				case 5: chance = 955; break;<br />
				case 4: chance = 945; break;<br />
				case 3: chance = 935; break;<br />
				case 2: chance = 925; break;<br />
				case 1: chance = 915; break;<br />
				case 0: chance = 905; break;<br />
				case -1: chance = 890; break;<br />
				case -2: chance = 875; break;<br />
				case -3: chance = 860; break;<br />
				case -4: chance = 845; break;<br />
				case -5: chance = 830; break;<br />
				case -6: chance = 815; break;<br />
				case -7: chance = 800; break;<br />
				case -8: chance = 785; break;<br />
				case -9: chance = 770; break;<br />
				case -10: chance = 755; break;<br />
				case -11: chance = 735; break;<br />
				case -12: chance = 715; break;<br />
				case -13: chance = 695; break;<br />
				case -14: chance = 675; break;<br />
				case -15: chance = 655; break;<br />
				case -16: chance = 625; break;<br />
				case -17: chance = 595; break;<br />
				case -18: chance = 565; break;<br />
				case -19: chance = 535; break;<br />
				case -20: chance = 505; break;<br />
				case -21: chance = 455; break;<br />
				case -22: chance = 405; break;<br />
				case -23: chance = 355; break;<br />
				case -24: chance = 305; break;<br />
				default: chance = 275;<br />
			}<br />
			if(!attacker.isInFrontOfTarget())<br />
			{<br />
				if(attacker.isBehindTarget())<br />
					chance *= 1.2;<br />
				else // side<br />
					chance *= 1.1;<br />
				if (chance &gt; 980)<br />
					chance = 980;<br />
			}<br />
		}<br />
		return chance &lt; Rnd.get(1000);<br />
	}<br />
<br />
	/**<br />
	 * Returns:&lt;br&gt;<br />
	 * 0 = shield defense doesn't succeed&lt;br&gt;<br />
	 * 1 = shield defense succeed&lt;br&gt;<br />
	 * 2 = perfect block&lt;br&gt;<br />
	 * <br />
	 * @param attacker<br />
	 * @param target<br />
	 * @param sendSysMsg<br />
	 * @return<br />
	 */<br />
	public static byte calcShldUse(L2Character attacker, L2Character target, L2Skill skill, boolean sendSysMsg)<br />
	{<br />
		if (skill != null &amp;&amp; skill.ignoreShield())<br />
			return 0;<br />
<br />
		double shldRate = target.calcStat(Stats.SHIELD_RATE, 0, attacker, null)<br />
			* DEXbonus[target.getDEX()];<br />
		if (shldRate == 0.0) return 0;<br />
        int degreeside = (int)target.calcStat(Stats.SHIELD_DEFENCE_ANGLE, 0, null, null) + 120;<br />
        if (degreeside &lt; 360 &amp;&amp; (!target.isFacing(attacker, degreeside)))<br />
        {<br />
            return 0;<br />
        }<br />
        <br />
        byte shldSuccess = SHIELD_DEFENSE_FAILED;<br />
        // if attacker <br />
		// if attacker use bow and target wear shield, shield block rate is multiplied by 1.3 (30%)<br />
        L2Weapon at_weapon = attacker.getActiveWeaponItem();<br />
        if (at_weapon != null &amp;&amp; at_weapon.getItemType() == L2WeaponType.BOW)<br />
			shldRate *= 1.3;<br />
        <br />
        if (shldRate &gt; 0 &amp;&amp; 100 - Config.ALT_PERFECT_SHLD_BLOCK &lt; Rnd.get(100))<br />
        {<br />
        	shldSuccess = SHIELD_DEFENSE_PERFECT_BLOCK;<br />
        }<br />
        else if (shldRate &gt; Rnd.get(100))<br />
        {<br />
        	shldSuccess = SHIELD_DEFENSE_SUCCEED;<br />
        }<br />
        <br />
        if (sendSysMsg &amp;&amp; target instanceof L2PcInstance)<br />
		{<br />
			L2PcInstance enemy = (L2PcInstance)target;<br />
			<br />
			switch (shldSuccess)<br />
			{<br />
				case SHIELD_DEFENSE_SUCCEED:<br />
					enemy.sendPacket(new SystemMessage(SystemMessageId.SHIELD_DEFENCE_SUCCESSFULL));<br />
					break;<br />
				case SHIELD_DEFENSE_PERFECT_BLOCK:<br />
					enemy.sendPacket(new SystemMessage(SystemMessageId.YOUR_EXCELLENT_SHIELD_DEFENSE_WAS_A_SUCCESS));<br />
					break;<br />
			}<br />
		}<br />
        <br />
		return shldSuccess;<br />
	}<br />
	<br />
	public static byte calcShldUse(L2Character attacker, L2Character target, L2Skill skill)<br />
	{<br />
		return calcShldUse(attacker, target, skill, true);<br />
	}<br />
<br />
	public static byte calcShldUse(L2Character attacker, L2Character target)<br />
	{<br />
		return calcShldUse(attacker, target, null, true);<br />
	}<br />
<br />
	public static boolean calcMagicAffected(L2Character actor, L2Character target, L2Skill skill)<br />
	{<br />
		// TODO: CHECK/FIX THIS FORMULA UP!!<br />
		L2SkillType type = skill.getSkillType();<br />
		double defence = 0;<br />
		if (skill.isActive() &amp;&amp; skill.isOffensive() &amp;&amp; !skill.isNeutral()) <br />
			defence = target.getMDef(actor, skill);<br />
		<br />
		double attack = 2 * actor.getMAtk(target, skill) * calcSkillVulnerability(actor, target, skill);<br />
		double d = (attack - defence)/(attack + defence);<br />
		if (target.isRaid())<br />
		{<br />
			switch (type)<br />
			{<br />
				case CONFUSION:<br />
				case MUTE:<br />
				case PARALYZE:<br />
				case ROOT:<br />
				case FEAR:<br />
				case SLEEP:<br />
				case STUN:<br />
				case DEBUFF:<br />
				case AGGDEBUFF:<br />
					if ( d &gt; 0 &amp;&amp; Rnd.get(1000) == 1)<br />
						return true;<br />
					else <br />
						return false;<br />
			}<br />
		}<br />
		<br />
		d += 0.5 * Rnd.nextGaussian();<br />
		return d &gt; 0;<br />
	}<br />
<br />
	public static double calcSkillVulnerability(L2Character attacker, L2Character target, L2Skill skill)<br />
	{<br />
		double multiplier = 1;	// initialize...<br />
<br />
		// Get the skill type to calculate its effect in function of base stats<br />
		// of the L2Character target<br />
		if (skill != null)<br />
		{<br />
			// first, get the natural template vulnerability values for the target<br />
			Stats stat = skill.getStat();<br />
			if (stat != null)<br />
			{<br />
				switch (stat)<br />
				{<br />
				case AGGRESSION:<br />
					multiplier *= target.getTemplate().baseAggressionVuln;<br />
					break;<br />
				case BLEED:<br />
					multiplier *= target.getTemplate().baseBleedVuln;<br />
					break;<br />
				case POISON:<br />
					multiplier *= target.getTemplate().basePoisonVuln;<br />
					break;<br />
				case STUN:<br />
					multiplier *= target.getTemplate().baseStunVuln;<br />
					break;<br />
				case ROOT:<br />
					multiplier *= target.getTemplate().baseRootVuln;<br />
					break;<br />
				case MOVEMENT:<br />
					multiplier *= target.getTemplate().baseMovementVuln;<br />
					break;<br />
				case CONFUSION:<br />
					multiplier *= target.getTemplate().baseConfusionVuln;<br />
					break;<br />
				case SLEEP:<br />
					multiplier *= target.getTemplate().baseSleepVuln;<br />
					break;<br />
				}<br />
			}<br />
			if (skill.getElement() &gt; 0)<br />
				multiplier *= Math.sqrt(calcElemental(attacker, target, skill));<br />
<br />
			// Finally, calculate skilltype vulnerabilities<br />
			L2SkillType type = skill.getSkillType();<br />
			<br />
			// For additional effects on PDAM and MDAM skills (like STUN, SHOCK, PARALYZE...)<br />
			if (type != null &amp;&amp; (type == L2SkillType.PDAM || type == L2SkillType.MDAM))<br />
				type = skill.getEffectType();<br />
			<br />
			multiplier = calcSkillTypeVulnerability(multiplier, target, type);<br />
			<br />
		}<br />
		return multiplier;<br />
	}<br />
	<br />
	public static double calcSkillTypeVulnerability(double multiplier, L2Character target, L2SkillType type)<br />
	{<br />
		if (type != null)<br />
		{<br />
			switch (type)<br />
			{<br />
				case BLEED:<br />
					multiplier = target.calcStat(Stats.BLEED_VULN, multiplier, target, null);<br />
					break;<br />
				case POISON:<br />
					multiplier = target.calcStat(Stats.POISON_VULN, multiplier, target, null);<br />
					break;<br />
				case STUN:<br />
					multiplier = target.calcStat(Stats.STUN_VULN, multiplier, target, null);<br />
					break;<br />
				case PARALYZE:<br />
					multiplier = target.calcStat(Stats.PARALYZE_VULN, multiplier, target, null);<br />
					break;<br />
				case ROOT:<br />
					multiplier = target.calcStat(Stats.ROOT_VULN, multiplier, target, null);<br />
					break;<br />
				case SLEEP:<br />
					multiplier = target.calcStat(...]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=16828">Auri</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[Сообщение: [url=https://forum.zone-game.info/showthread.php?p=371524]С днём рожденья MrShyr[/url]<br />
Пользователь: [url=https://forum.zone-game.info/member.php?u=26514]Apasna[/url]<br />
Нарушение: Нарушение одного или множества пунктов правил<br />
Баллов: 10<br />
<br />
Примечание администрации: [quote][/quote]<br />
<br />
<br />
Сообщение для пользователя: [quote][/quote]<br />
<br />
<br />
Оригинал сообщения: [quote][quote=gorodetskiy]Не ВОВА, а Владимир! Более по мужски )))[/QUOTE]<br />
[IMG]http://image.zone-game.info/images/2014/08/09/wPOW.jpg[/IMG]<br />
Пачаны,минусуем в асист.<br />
Моветоша,а что на форуммакси забанили? ай-ай-яй( гавнюки да,так ты теперь всех послыешь)[/quote]]]></description>
			<content:encoded><![CDATA[Сообщение: [url=https://forum.zone-game.info/showthread.php?p=371524]С днём рожденья MrShyr[/url]<br />
Пользователь: [url=https://forum.zone-game.info/member.php?u=26514]Apasna[/url]<br />
Нарушение: Нарушение одного или множества пунктов правил<br />
Баллов: 10<br />
<br />
Примечание администрации: [quote][/quote]<br />
<br />
<br />
Сообщение для пользователя: [quote][/quote]<br />
<br />
<br />
Оригинал сообщения: [quote][quote=gorodetskiy]Не ВОВА, а Владимир! Более по мужски )))[/QUOTE]<br />
[IMG]http://image.zone-game.info/images/2014/08/09/wPOW.jpg[/IMG]<br />
Пачаны,минусуем в асист.<br />
Моветоша,а что на форуммакси забанили? ай-ай-яй( гавнюки да,так ты теперь всех послыешь)[/quote]]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=21622">L2J</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[Доброго времени суток. Появилась такая проблема, при добавлении скила через админку статы не меняются, меняются если только снять вещь или апнуть лвл, ну любое действие наверное. Я не уверен что так должно быть, как это исправить, чтобы статы обновлялись при добавлении скила?<br />
Исходы First team]]></description>
			<content:encoded><![CDATA[Доброго времени суток. Появилась такая проблема, при добавлении скила через админку статы не меняются, меняются если только снять вещь или апнуть лвл, ну любое действие наверное. Я не уверен что так должно быть, как это исправить, чтобы статы обновлялись при добавлении скила?<br />
Исходы First team]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=10603">gorodetskiy</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[<strong>Operator23rus</strong>, Сумму укажите, быстрее найдётся инвестор.<br />
<br />
<strong>Kensiro</strong>, <br />
[здесь была картика и Pointer*Rage]]]></description>
			<content:encoded><![CDATA[<strong>Operator23rus</strong>, Сумму укажите, быстрее найдётся инвестор.<br />
<br />
<strong>Kensiro</strong>, <br />
[здесь была картика и Pointer*Rage]]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=19812">NextPay</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[[quote=Asmodiel]Чувствуется в Ваших сообщениях, что Вы - истинный патриот России и вполне адекватно про себя думаете, что законодательство нашей огромной страны идеально, но нет - это не так.[/QUOTE]<br />
Законодательство не идеально, даже более того, многие вещи прямо противоречат друг другу, принимаются наспех, в угоду конкретной конъюнктуре. <br />
Однако это не отменяет необходимости выполнять эти законы, тем более в конкретной ситуации сделать это более чем реально, не сложно и без каких либо правовых последствий.]]></description>
			<content:encoded><![CDATA[[quote=Asmodiel]Чувствуется в Ваших сообщениях, что Вы - истинный патриот России и вполне адекватно про себя думаете, что законодательство нашей огромной страны идеально, но нет - это не так.[/QUOTE]<br />
Законодательство не идеально, даже более того, многие вещи прямо противоречат друг другу, принимаются наспех, в угоду конкретной конъюнктуре. <br />
Однако это не отменяет необходимости выполнять эти законы, тем более в конкретной ситуации сделать это более чем реально, не сложно и без каких либо правовых последствий.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=16828">Auri</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[Биржа Вебмоней]]></description>
			<content:encoded><![CDATA[Биржа Вебмоней]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=23525">LightIFusion</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[[quote=ANZO]Вот сказал какой-то дебил на гохе про этот "двиг" и все подхватили. Это не  двигло а всего-лишь реализация браузера Chromium для использования внутри клиента.[/QUOTE]<br />
Это помоему сами косорылые хвастались, ну и ко всему с GOD'a в La2 Pixel Shader 3.0, на сколько мне известнов UE2.5 этого по стандарту нету, хотя помоему в Bioshock есть.]]></description>
			<content:encoded><![CDATA[[quote=ANZO]Вот сказал какой-то дебил на гохе про этот "двиг" и все подхватили. Это не  двигло а всего-лишь реализация браузера Chromium для использования внутри клиента.[/QUOTE]<br />
Это помоему сами косорылые хвастались, ну и ко всему с GOD'a в La2 Pixel Shader 3.0, на сколько мне известнов UE2.5 этого по стандарту нету, хотя помоему в Bioshock есть.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=21502">Fudji</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[а если в логи сервера глянуть?]]></description>
			<content:encoded><![CDATA[а если в логи сервера глянуть?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=18696">Ashe</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[С днём рождения! Всех благ! :)]]></description>
			<content:encoded><![CDATA[С днём рождения! Всех благ! :)]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=10603">gorodetskiy</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[[quote=DiagoD]Кстати да, можно было бы и оставить реквизиты...<br />
Несколько человек скидывало бы всеравно, тем более людей здесь много и многие норм зарабатывают, думаю было бы не жалко сотку-другую, скинуть.[/QUOTE]<br />
даю 2 сотки!)))]]></description>
			<content:encoded><![CDATA[[quote=DiagoD]Кстати да, можно было бы и оставить реквизиты...<br />
Несколько человек скидывало бы всеравно, тем более людей здесь много и многие норм зарабатывают, думаю было бы не жалко сотку-другую, скинуть.[/QUOTE]<br />
даю 2 сотки!)))]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=15734">xolseg</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[Посмотрел инфу по Cisco 1602i, неплохое решение 3 антенны или одна антенна не очень понятно(4 dbi).<br />
<br />
Из cisco лучше бы взял Cisco Aironet 3602e имхо будет больший охват. 4 антенны*6dBi<br />
Цена правда кусачая для wi-fi]]></description>
			<content:encoded><![CDATA[Посмотрел инфу по Cisco 1602i, неплохое решение 3 антенны или одна антенна не очень понятно(4 dbi).<br />
<br />
Из cisco лучше бы взял Cisco Aironet 3602e имхо будет больший охват. 4 антенны*6dBi<br />
Цена правда кусачая для wi-fi]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=16152">L2-Scripts</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[Присоединяюсь к поздравлениям !]]></description>
			<content:encoded><![CDATA[Присоединяюсь к поздравлениям !]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=12717">Ro_0TT</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[Lucera разрабатывался на основе EmuRT Gracia Part II.<br />
<br />
P.s. Скория вроде тоже от туда (но не уверен, не видел их исходы), люцера никогда и ничем не связана со скорией.<br />
[IMG]http://screenshot.ru/screens/29.03.13/23:46:28_9b546114.png[/IMG]]]></description>
			<content:encoded><![CDATA[Lucera разрабатывался на основе EmuRT Gracia Part II.<br />
<br />
P.s. Скория вроде тоже от туда (но не уверен, не видел их исходы), люцера никогда и ничем не связана со скорией.<br />
[IMG]http://screenshot.ru/screens/29.03.13/23:46:28_9b546114.png[/IMG]]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[]]></title>
			<link></link>
			<pubDate>Thu, 30 Apr 2026 16:46:52 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.zone-game.info/member.php?action=profile&uid=1013">Blacksoul</a>]]></dc:creator>
			<guid isPermaLink="false"></guid>
			<description><![CDATA[[quote=DarkSkeleton]так с первый все понятно<br />
со вторым проблема остается, при использовании хоста no-ip клиент не подключается к login серверу, как будто бы его не находит...[/QUOTE]<br />
<br />
Не пробывал смотреть [url=http://forum.zone-game.info/showthread.php?t=5987]<span style="color: Blue">тут</span>[/url] или использовать [url=http://forum.zone-game.info/search.php]<span style="color: Blue">поиск</span>[/url].]]></description>
			<content:encoded><![CDATA[[quote=DarkSkeleton]так с первый все понятно<br />
со вторым проблема остается, при использовании хоста no-ip клиент не подключается к login серверу, как будто бы его не находит...[/QUOTE]<br />
<br />
Не пробывал смотреть [url=http://forum.zone-game.info/showthread.php?t=5987]<span style="color: Blue">тут</span>[/url] или использовать [url=http://forum.zone-game.info/search.php]<span style="color: Blue">поиск</span>[/url].]]></content:encoded>
		</item>
	</channel>
</rss>