forked from MagicBane/Server
				
			
				 2 changed files with 414 additions and 0 deletions
			
			
		@ -0,0 +1,405 @@ | 
				
			|||||||
 | 
					package engine.objects; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import engine.Enum; | 
				
			||||||
 | 
					import engine.powers.effectmodifiers.AbstractEffectModifier; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList; | 
				
			||||||
 | 
					import java.util.HashMap; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class PlayerCombatStats { | 
				
			||||||
 | 
					    public static HashMap<PlayerCharacter, PlayerCombatStats> combatstats = new HashMap<>(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PlayerCharacter owner; | 
				
			||||||
 | 
					    //main hand data
 | 
				
			||||||
 | 
					    public int minDamageHandOne; | 
				
			||||||
 | 
					    public int maxDamageHandOne; | 
				
			||||||
 | 
					    public float attackSpeedHandOne; | 
				
			||||||
 | 
					    public float rangeHandOne; | 
				
			||||||
 | 
					    public float atrHandOne; | 
				
			||||||
 | 
					    //off hand data
 | 
				
			||||||
 | 
					    public int minDamageHandTwo; | 
				
			||||||
 | 
					    public int maxDamageHandTwo; | 
				
			||||||
 | 
					    public float attackSpeedHandTwo; | 
				
			||||||
 | 
					    public float rangeHandTwo; | 
				
			||||||
 | 
					    public float atrHandTwo; | 
				
			||||||
 | 
					    //defense
 | 
				
			||||||
 | 
					    public int defense; | 
				
			||||||
 | 
					    //regen rates
 | 
				
			||||||
 | 
					    public float healthRegen; | 
				
			||||||
 | 
					    public float manaRegen; | 
				
			||||||
 | 
					    public float staminaRegen; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PlayerCombatStats(PlayerCharacter pc) { | 
				
			||||||
 | 
					        this.owner = pc; | 
				
			||||||
 | 
					        this.update(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void update() { | 
				
			||||||
 | 
					        this.calculateATR(true); | 
				
			||||||
 | 
					        this.calculateATR(false); | 
				
			||||||
 | 
					        this.calculateMin(true); | 
				
			||||||
 | 
					        this.calculateMin(false); | 
				
			||||||
 | 
					        this.calculateMax(true); | 
				
			||||||
 | 
					        this.calculateMax(false); | 
				
			||||||
 | 
					        this.calculateAttackSpeed(true); | 
				
			||||||
 | 
					        this.calculateAttackSpeed(false); | 
				
			||||||
 | 
					        this.calculateAttackRange(true); | 
				
			||||||
 | 
					        this.calculateAttackRange(false); | 
				
			||||||
 | 
					        this.calculateRegen(); | 
				
			||||||
 | 
					        this.calculateDefense(); | 
				
			||||||
 | 
					        combatstats.put(this.owner, this); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void calculateATR(boolean mainHand) { | 
				
			||||||
 | 
					        Item weapon; | 
				
			||||||
 | 
					        float atr; | 
				
			||||||
 | 
					        if(mainHand) { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(1); | 
				
			||||||
 | 
					        }else { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(2); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String skill = "Unarmed Combat"; | 
				
			||||||
 | 
					        String mastery = "Unarmed Combat Mastery"; | 
				
			||||||
 | 
					        int primary = this.owner.statDexCurrent; | 
				
			||||||
 | 
					        if(weapon != null) { | 
				
			||||||
 | 
					            skill= weapon.getItemBase().getSkillRequired(); | 
				
			||||||
 | 
					            mastery = weapon.getItemBase().getMastery(); | 
				
			||||||
 | 
					            if(weapon.getItemBase().isStrBased()) | 
				
			||||||
 | 
					                primary = this.owner.statStrCurrent; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float skillLevel = 0; | 
				
			||||||
 | 
					        float masteryLevel = 0; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(this.owner.skills.containsKey(skill)) | 
				
			||||||
 | 
					            skillLevel = this.owner.skills.get(skill).getModifiedAmount(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(this.owner.skills.containsKey(mastery)) | 
				
			||||||
 | 
					            masteryLevel = this.owner.skills.get(mastery).getModifiedAmount(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float primaryCalc = primary * 0.5f; | 
				
			||||||
 | 
					        float skillCalc = skillLevel * 4; | 
				
			||||||
 | 
					        float masteryCalc = masteryLevel * 3; | 
				
			||||||
 | 
					        float atrEnchants = 0; | 
				
			||||||
 | 
					        float stanceValue = 0.0f; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for(String effID : this.owner.effects.keySet()){ | 
				
			||||||
 | 
					            if(effID.contains("STC")){ | 
				
			||||||
 | 
					                for(AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()){ | 
				
			||||||
 | 
					                    if(mod.modType.equals(Enum.ModType.AttackDelay)){ | 
				
			||||||
 | 
					                        stanceValue = mod.getPercentMod() * 0.01f; // account for weapon prefix and suffix mods
 | 
				
			||||||
 | 
					                    } | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(this.owner.bonuses != null){ | 
				
			||||||
 | 
					            atrEnchants = this.owner.bonuses.getFloat(Enum.ModType.OCV, Enum.SourceType.None); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        atrEnchants -= stanceValue; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        atr = primaryCalc + skillCalc + masteryCalc + atrEnchants; | 
				
			||||||
 | 
					        atr *= 1 + stanceValue; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(mainHand){ | 
				
			||||||
 | 
					            this.atrHandOne = atr; | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					            this.atrHandTwo = atr; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void calculateMin(boolean mainHand) { | 
				
			||||||
 | 
					        Item weapon; | 
				
			||||||
 | 
					        double baseDMG = 6; | 
				
			||||||
 | 
					        int primaryStat = this.owner.statDexCurrent; | 
				
			||||||
 | 
					        int secondaryStat = this.owner.statStrCurrent; | 
				
			||||||
 | 
					        double weaponSkill = 0; | 
				
			||||||
 | 
					        double weaponMastery = 0; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mainHand) { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(1); | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(2); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String skill = "Unarmed Combat"; | 
				
			||||||
 | 
					        String mastery = "Unarmed Combat Mastery"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (weapon != null) { | 
				
			||||||
 | 
					            baseDMG = weapon.getItemBase().getMaxDamage(); | 
				
			||||||
 | 
					            skill = weapon.getItemBase().getSkillRequired(); | 
				
			||||||
 | 
					            mastery = weapon.getItemBase().getMastery(); | 
				
			||||||
 | 
					            if (weapon.getItemBase().isStrBased()) { | 
				
			||||||
 | 
					                primaryStat = this.owner.statStrCurrent; | 
				
			||||||
 | 
					                secondaryStat = this.owner.statDexCurrent; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.owner.skills.containsKey(skill)) { | 
				
			||||||
 | 
					            weaponSkill = this.owner.skills.get(skill).getModifiedAmount(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.owner.skills.containsKey(mastery)) { | 
				
			||||||
 | 
					            weaponMastery = this.owner.skills.get(mastery).getModifiedAmount(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        double minDMG = baseDMG * ( | 
				
			||||||
 | 
					                0.0048 * primaryStat + | 
				
			||||||
 | 
					                        0.049 * Math.sqrt(primaryStat - 0.75) + | 
				
			||||||
 | 
					                        0.0066 * secondaryStat + | 
				
			||||||
 | 
					                        0.064 * Math.sqrt(secondaryStat - 0.75) + | 
				
			||||||
 | 
					                        0.01 * (weaponSkill + weaponMastery) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mainHand) { | 
				
			||||||
 | 
					            this.minDamageHandOne = (int) minDMG; | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            this.minDamageHandTwo = (int) minDMG; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void calculateMax(boolean mainHand) { | 
				
			||||||
 | 
					        //Weapon Max DMG = BaseDMG * (0.0124*Primary Stat + 0.118*(Primary Stat -0.75)^0.5
 | 
				
			||||||
 | 
					        // + 0.0022*Secondary Stat + 0.028*(Secondary Stat-0.75)^0.5 + 0.0075*(Weapon Skill + Weapon Mastery))
 | 
				
			||||||
 | 
					        Item weapon; | 
				
			||||||
 | 
					        double baseDMG = 6; | 
				
			||||||
 | 
					        int primaryStat = this.owner.statDexCurrent; | 
				
			||||||
 | 
					        int secondaryStat = this.owner.statStrCurrent; | 
				
			||||||
 | 
					        double weaponSkill = 0; | 
				
			||||||
 | 
					        double weaponMastery = 0; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mainHand) { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(1); | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(2); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String skill = "Unarmed Combat"; | 
				
			||||||
 | 
					        String mastery = "Unarmed Combat Mastery"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (weapon != null) { | 
				
			||||||
 | 
					            baseDMG = weapon.getItemBase().getMaxDamage(); | 
				
			||||||
 | 
					            skill = weapon.getItemBase().getSkillRequired(); | 
				
			||||||
 | 
					            mastery = weapon.getItemBase().getMastery(); | 
				
			||||||
 | 
					            if (weapon.getItemBase().isStrBased()) { | 
				
			||||||
 | 
					                primaryStat = this.owner.statStrCurrent; | 
				
			||||||
 | 
					                secondaryStat = this.owner.statDexCurrent; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.owner.skills.containsKey(skill)) { | 
				
			||||||
 | 
					            weaponSkill = this.owner.skills.get(skill).getModifiedAmount(); | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.owner.skills.containsKey(mastery)) { | 
				
			||||||
 | 
					            weaponMastery = this.owner.skills.get(mastery).getModifiedAmount(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        double maxDMG = baseDMG * ( | 
				
			||||||
 | 
					                0.0124 * primaryStat + | 
				
			||||||
 | 
					                        0.118 * Math.sqrt(primaryStat - 0.75) + | 
				
			||||||
 | 
					                        0.0022 * secondaryStat + | 
				
			||||||
 | 
					                        0.028 * Math.sqrt(secondaryStat - 0.75) + | 
				
			||||||
 | 
					                        0.0075 * (weaponSkill + weaponMastery) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(mainHand){ | 
				
			||||||
 | 
					            this.maxDamageHandOne = (int) maxDMG; | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					            this.maxDamageHandTwo = (int) maxDMG; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void calculateAttackSpeed(boolean mainHand){ | 
				
			||||||
 | 
					        Item weapon; | 
				
			||||||
 | 
					        float speed; | 
				
			||||||
 | 
					        if(mainHand) { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(1); | 
				
			||||||
 | 
					        }else { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(2); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(weapon == null) { | 
				
			||||||
 | 
					            speed = 20.0f; | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					            speed = weapon.getItemBase().getSpeed(); | 
				
			||||||
 | 
					            for(Effect eff : weapon.effects.values()){ | 
				
			||||||
 | 
					                for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | 
				
			||||||
 | 
					                    if(mod.modType.equals(Enum.ModType.WeaponProc)){ | 
				
			||||||
 | 
					                        speed *= 1 + (mod.getPercentMod() * 0.01f); | 
				
			||||||
 | 
					                    } | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float stanceValue = 1.0f; | 
				
			||||||
 | 
					        for(String effID : this.owner.effects.keySet()){ | 
				
			||||||
 | 
					            if(effID.contains("STC")){ | 
				
			||||||
 | 
					                for(AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()){ | 
				
			||||||
 | 
					                    if(mod.modType.equals(Enum.ModType.AttackDelay)){ | 
				
			||||||
 | 
					                        stanceValue = mod.getPercentMod() * 0.01f; // account for weapon prefix and suffix mods
 | 
				
			||||||
 | 
					                    } | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float bonusValues = 1.0f; | 
				
			||||||
 | 
					        if(this.owner.bonuses != null){ | 
				
			||||||
 | 
					            for(AbstractEffectModifier mod : this.owner.bonuses.bonusFloats.keySet()){ | 
				
			||||||
 | 
					                if(mod.modType.equals(Enum.ModType.AttackDelay)){ | 
				
			||||||
 | 
					                    bonusValues += mod.getPercentMod() * 0.01f; // calculate all alac bonuses
 | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bonusValues -= stanceValue; // take away stance modifier from alac bonus values
 | 
				
			||||||
 | 
					        speed *= 1 + stanceValue; // apply stance bonus
 | 
				
			||||||
 | 
					        speed *= bonusValues; // apply alac bonuses without stance mod
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(speed < 10.0f) | 
				
			||||||
 | 
					            speed = 10.0f; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(mainHand){ | 
				
			||||||
 | 
					            this.attackSpeedHandOne = speed; | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					            this.attackSpeedHandTwo = speed; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void calculateAttackRange(boolean mainHand){ | 
				
			||||||
 | 
					        Item weapon; | 
				
			||||||
 | 
					        float range; | 
				
			||||||
 | 
					        if(mainHand) { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(1); | 
				
			||||||
 | 
					        }else { | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(2); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(weapon == null) { | 
				
			||||||
 | 
					            range = 6.0f; | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					            range = weapon.getItemBase().getRange(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        if(owner.bonuses != null){ | 
				
			||||||
 | 
					            range *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.WeaponRange, Enum.SourceType.None); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        if(mainHand){ | 
				
			||||||
 | 
					            this.rangeHandOne = range; | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					            this.rangeHandTwo = range; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void calculateRegen(){ | 
				
			||||||
 | 
					        if(owner.bonuses != null){ | 
				
			||||||
 | 
					            this.healthRegen = 1.0f + this.owner.bonuses.getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None); | 
				
			||||||
 | 
					            this.manaRegen = 1.0f + this.owner.bonuses.getFloatPercentAll(Enum.ModType.ManaRecoverRate, Enum.SourceType.None); | 
				
			||||||
 | 
					            this.staminaRegen = 1.0f + this.owner.bonuses.getFloatPercentAll(Enum.ModType.StaminaRecoverRate, Enum.SourceType.None); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					            this.healthRegen = 1.0f; | 
				
			||||||
 | 
					            this.manaRegen = 1.0f; | 
				
			||||||
 | 
					            this.staminaRegen = 1.0f; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void calculateDefense(){ | 
				
			||||||
 | 
					        int armorDefense = 0; | 
				
			||||||
 | 
					        int shieldDefense = 0; | 
				
			||||||
 | 
					        int dexterity = this.owner.statDexCurrent; | 
				
			||||||
 | 
					        double armorSkill = 0; | 
				
			||||||
 | 
					        double blockSkill = 0; | 
				
			||||||
 | 
					        double weaponSkill = 0; | 
				
			||||||
 | 
					        double weaponMastery = 0; | 
				
			||||||
 | 
					        int flatBonuses = 0; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //armor defense value need to loop all equipped items and log armor defense values
 | 
				
			||||||
 | 
					        ArrayList<String> armorTypes = new ArrayList<>(); | 
				
			||||||
 | 
					        if(this.owner.charItemManager != null){ | 
				
			||||||
 | 
					            for(Item equipped : this.owner.charItemManager.getEquippedList()){ | 
				
			||||||
 | 
					                if(equipped.getItemBase().isHeavyArmor()){ | 
				
			||||||
 | 
					                    armorDefense += equipped.getItemBase().getDefense(); | 
				
			||||||
 | 
					                    if(!armorTypes.contains(equipped.getItemBase().getSkillRequired())) | 
				
			||||||
 | 
					                        armorTypes.add(equipped.getItemBase().getSkillRequired()); | 
				
			||||||
 | 
					                } else if(equipped.getItemBase().isLightArmor()){ | 
				
			||||||
 | 
					                    armorDefense += equipped.getItemBase().getDefense(); | 
				
			||||||
 | 
					                    if(!armorTypes.contains(equipped.getItemBase().getSkillRequired())) | 
				
			||||||
 | 
					                        armorTypes.add(equipped.getItemBase().getSkillRequired()); | 
				
			||||||
 | 
					                } else if(equipped.getItemBase().isMediumArmor()){ | 
				
			||||||
 | 
					                    armorDefense += equipped.getItemBase().getDefense(); | 
				
			||||||
 | 
					                    if(!armorTypes.contains(equipped.getItemBase().getSkillRequired())) | 
				
			||||||
 | 
					                        armorTypes.add(equipped.getItemBase().getSkillRequired()); | 
				
			||||||
 | 
					                } else if(equipped.getItemBase().isClothArmor()){ | 
				
			||||||
 | 
					                    armorDefense += equipped.getItemBase().getDefense(); | 
				
			||||||
 | 
					                }else if(equipped.getItemBase().isShield()){ | 
				
			||||||
 | 
					                    shieldDefense += equipped.getItemBase().getDefense(); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //armor skill needs to calculate all trains in armor types
 | 
				
			||||||
 | 
					        for(String armorType : armorTypes){ | 
				
			||||||
 | 
					            if(this.owner.skills!= null){ | 
				
			||||||
 | 
					                if(this.owner.skills.containsKey(armorType)){ | 
				
			||||||
 | 
					                    armorSkill += this.owner.skills.get(armorType).getModifiedAmount(); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.owner.skills.containsKey("Block")) { | 
				
			||||||
 | 
					            blockSkill = this.owner.skills.get("Block").getModifiedAmount(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String primarySkillName = "Unarmed Combat"; | 
				
			||||||
 | 
					        String primaryMasteryName = "Unarmed Combat Mastery"; | 
				
			||||||
 | 
					        Item weapon = this.owner.charItemManager.getEquipped(1); | 
				
			||||||
 | 
					        if(weapon == null){ | 
				
			||||||
 | 
					            weapon = this.owner.charItemManager.getEquipped(2); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        if(weapon != null){ | 
				
			||||||
 | 
					            primarySkillName = weapon.getItemBase().getSkillRequired(); | 
				
			||||||
 | 
					            primaryMasteryName = weapon.getItemBase().getMastery(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(this.owner.skills != null){ | 
				
			||||||
 | 
					            if(this.owner.skills.containsKey(primarySkillName)){ | 
				
			||||||
 | 
					                weaponSkill = this.owner.skills.get(primarySkillName).getModifiedAmount(); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					            if(this.owner.skills.containsKey(primaryMasteryName)){ | 
				
			||||||
 | 
					                weaponMastery = this.owner.skills.get(primaryMasteryName).getModifiedAmount(); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float stanceValue = 0.0f; | 
				
			||||||
 | 
					        if(this.owner.bonuses != null){ | 
				
			||||||
 | 
					            for(String effID : this.owner.effects.keySet()){ | 
				
			||||||
 | 
					                if(effID.contains("STC")){ | 
				
			||||||
 | 
					                    for(AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()){ | 
				
			||||||
 | 
					                        if(mod.modType.equals(Enum.ModType.AttackDelay)){ | 
				
			||||||
 | 
					                            stanceValue = mod.getPercentMod() * 0.01f; // account for weapon prefix and suffix mods
 | 
				
			||||||
 | 
					                        } | 
				
			||||||
 | 
					                    } | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            float bonusValues = 1.0f + this.owner.bonuses.getFloat(Enum.ModType.DCV, Enum.SourceType.None); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            bonusValues -= stanceValue; // take away stance modifier from alac bonus values
 | 
				
			||||||
 | 
					            flatBonuses += bonusValues; // apply alac bonuses without stance mod
 | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        double defense = (1 + armorSkill / 50.0) * armorDefense + | 
				
			||||||
 | 
					                (1 + blockSkill / 100.0) * shieldDefense + | 
				
			||||||
 | 
					                (weaponSkill / 2.0) + | 
				
			||||||
 | 
					                (weaponMastery / 2.0) + | 
				
			||||||
 | 
					                dexterity * 2.0 + | 
				
			||||||
 | 
					                flatBonuses; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.defense = (int) (defense * 1.0f + stanceValue); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue