package minefantasy.mf2.mechanics; import minefantasy.mf2.api.helpers.ArmourCalculator; import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.api.stamina.IStaminaWeapon; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.config.ConfigClient; import minefantasy.mf2.config.ConfigStamina; import minefantasy.mf2.network.packet.StaminaPacket; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.item.ItemTool; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.world.WorldServer; public class StaminaMechanics { private static boolean hurtAdreneline = true; private static int bowSeconds = 30; public static void tickEntity(EntityLivingBase entity) { if(entity.ticksExisted % 20 == 0) { ArmourCalculator.setTotalWeightOfWorn(entity, true); ArmourCalculator.setTotalWeightOfWorn(entity, false); } float[] packet = new float[]{StaminaBar.getStaminaValue(entity), StaminaBar.getBaseMaxStamina(entity), StaminaBar.getFlashTime(entity), StaminaBar.getBonusStamina(entity)}; float[] values = new float[]{StaminaBar.getStaminaValue(entity), StaminaBar.getTotalMaxStamina(entity)}; if(entity.worldObj.isRemote && ConfigClient.playBreath) { if(!StaminaBar.isPercentStamAvailable(entity, 0.2F, false) && !entity.isInsideOfMaterial(Material.water)) { if(entity.ticksExisted % 20 == 0) { entity.playSound("mob.blaze.breathe", 0.1F, 1.8F); } if(entity.ticksExisted+5 % 20 == 0) { entity.playSound("mob.blaze.breathe", 0.15F, 1.5F); } } return; } float decay = getConstantDecay(entity); //Decay if(decay > 0) { if(values[0] > 0) { StaminaBar.modifyStaminaValue(entity, -decay); } StaminaBar.setIdleTime(entity, 60F * getIdleRate(entity)); } //Regen if(decay <= 0 && StaminaBar.getIdleTime(entity) <= 0) { float regen = getRegenRate(entity); if(values[0] < values[1]) { StaminaBar.modifyStaminaValue(entity, regen); } } //Bonus Regen if(decay <= 0) { float regen = StaminaBar.getRegenBonus(entity); if(values[0] < values[1]) { StaminaBar.modifyStaminaValue(entity, regen); } } //float[] stam = new float[]{StaminaBar.getStaminaValue(player), StaminaBar.getMaxStamina(player)}; //out of stamina if(values[0] <= 0) { if(ConfigStamina.affectSpeed) { entity.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 2)); } entity.addPotionEffect(new PotionEffect(Potion.hunger.id, 2)); //Drain air when exhausted, you will drown faster if(isInWater(entity) && entity.getAir() > -20 && entity.ticksExisted % 20 == 0) { entity.setAir(entity.getAir() -1); } if(entity instanceof EntityPlayer && TacticalManager.shouldStaminaBlock) { if(((EntityPlayer) entity).isUsingItem() && (entity.getHeldItem() != null && entity.getHeldItem().getItemUseAction() == EnumAction.block)) { ((EntityPlayer) entity).stopUsingItem(); } } } //This phase decreases the cooldown if(StaminaBar.getIdleTime(entity) > 0) { StaminaBar.ModifyIdleTime(entity, -1); } if(StaminaBar.getFlashTime(entity) > 0) { StaminaBar.ModifyFlashTime(entity, -1); } //REFRESH StaminaBar.refreshSystem(entity); StaminaBar.tickBonus(entity); StaminaBar.tickBonusRegen(entity); //if changed, resync //if((StaminaBar.getStaminaValue(player) != stam[0] || StaminaBar.getMaxStamina(player) != stam[1]) || player.ticksExisted % 20 == 0) if(entity instanceof EntityPlayer) { syncStamina((EntityPlayer) entity, packet); } } private static void syncStamina(EntityPlayer player, float[]stam) { if(!player.worldObj.isRemote) { ((WorldServer)player.worldObj).getEntityTracker().func_151248_b(player, new StaminaPacket(stam, player).generatePacket()); } } public static float getConstantDecay(EntityLivingBase user) { if(user instanceof EntityPlayer && ((EntityPlayer)user).capabilities.isCreativeMode) { return 0F; } float value = 0.0F; boolean countArmour = false; if(user.isSprinting() && ConfigStamina.sprintModifier > 0 && user.ridingEntity == null) { float sprintingSeconds = 60F; countArmour = true;//Armour gets factored in with sprinting value += value += (5F / sprintingSeconds)*ConfigStamina.sprintModifier; } if(user instanceof EntityPlayer) { if(user.getHeldItem() != null && ((EntityPlayer) user).isUsingItem() && ConfigStamina.bowModifier > 0) { if(user.getHeldItem().getItemUseAction() == EnumAction.bow) { //Item gets factored in with bow value += StaminaBar.getDefaultMax(user) / 20F / bowSeconds * ConfigStamina.bowModifier; } } } return value * StaminaBar.getBaseDecayModifier(user, countArmour, true); } public static float getRegenRate(EntityLivingBase user) { if(user instanceof EntityPlayer && ((EntityPlayer)user).capabilities.isCreativeMode) { return 100F; } if(StaminaBar.getIdleTime(user) > 0) { return 0; } if(isInWater(user) && user.getActivePotionEffect(Potion.waterBreathing) == null) { return 0;//can't catch your breath when underwater } //The base time it takes to regen float value = StaminaBar.getTotalMaxStamina(user) / 20 / ConfigStamina.fullRegenSeconds; if(hurtAdreneline && user.getHealth() <= 2F) { value *= 1.5F; } return value * StaminaBar.getBaseRegenModifier(user, true, true); } private static boolean isInWater(EntityLivingBase user) { return user.isInsideOfMaterial(Material.water); } public static float getIdleRate(EntityLivingBase user) { float value = 1.0F; if(hurtAdreneline && user.getHealth() <= 4F) { value *= 0.2F; } return value * StaminaBar.getBaseIdleModifier(user, true, true); } public static void onJump(EntityLivingBase user) { if(user.worldObj.isRemote) { return; } float stam = StaminaBar.getStaminaValue(user); if(stam > 0) { StaminaBar.modifyStaminaValue(user, -getJumpDecay(user)); } StaminaBar.setIdleTime(user, 40F * getIdleRate(user)); //syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); } public static float getJumpDecay(EntityLivingBase user) { float value = 2.0F; if(user.isSprinting()) { value = 3.0F; } return value * StaminaBar.getBaseDecayModifier(user, true, false); } public static void onAttack(EntityLivingBase user, Entity target) { applyHitFatigue(user, 1.0F * TacticalManager.getHighgroundModifier(target, user, 1.5F)); } public static void applyHitFatigue(EntityLivingBase user, float modifier) { float stam = StaminaBar.getStaminaValue(user); if(stam > 0) { StaminaBar.modifyStaminaValue(user, -getWeaponModifier(user)*modifier); } StaminaBar.setIdleTime(user, 50F * getIdleRate(user)); //syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); } public static float getWeaponModifier(EntityLivingBase user) { ItemStack weapon = user.getHeldItem(); float value = 0.0F; if(weapon != null) { value = 2F; if(weapon.getItem() instanceof IStaminaWeapon) { value = ((IStaminaWeapon)weapon.getItem()).getStaminaDrainOnHit(user, weapon); } else { if(weapon.getItem() instanceof ItemSword) { value = 5; } if(weapon.getItem() instanceof ItemTool) { value = 10; } } } return value * ConfigStamina.weaponModifier * StaminaBar.getBaseDecayModifier(user, true, true); } }