You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
3.2 KiB
Java
74 lines
3.2 KiB
Java
package com.zivilon.cinder_loe.util;
|
|
|
|
import net.minecraft.entity.*;
|
|
import net.minecraft.entity.player.*;
|
|
import net.minecraft.util.DamageSource;
|
|
import lotr.common.item.*;
|
|
import net.minecraft.item.*;
|
|
import net.minecraft.world.World;
|
|
|
|
public class DamageEvent {
|
|
public DamageSource source;
|
|
public float damage;
|
|
public EntityLivingBase defender;
|
|
public Entity attacker;
|
|
|
|
public DamageEvent(DamageSource source, float damage, EntityLivingBase defender, Entity attacker) {
|
|
this.source = source;
|
|
this.damage = damage;
|
|
this.defender = defender;
|
|
this.attacker = attacker;
|
|
}
|
|
|
|
public static Pair<DamageEvent, Boolean> run_events(DamageEvent event) {
|
|
boolean cancel = false;
|
|
World world = event.defender.worldObj;
|
|
|
|
if (event.defender instanceof EntityPlayer && !event.source.isUnblockable()) {
|
|
EntityPlayerMP player = (EntityPlayerMP) event.defender;
|
|
ItemStack sword = player.getHeldItem();
|
|
if (!(event.attacker instanceof EntityLivingBase)) return new Pair<>(event, cancel);
|
|
EntityLivingBase attacker = (EntityLivingBase)event.attacker;
|
|
|
|
float playerYaw = player.getRotationYawHead();
|
|
float attackerYaw = attacker.getRotationYawHead();
|
|
|
|
// Normalize both angles to be within 0 - 360
|
|
playerYaw = (playerYaw + 360) % 360;
|
|
attackerYaw = (attackerYaw + 360) % 360;
|
|
|
|
// Calculate the angle difference
|
|
float angleDifference = Math.abs(playerYaw - attackerYaw);
|
|
|
|
if (angleDifference > 180) {
|
|
angleDifference = 360 - angleDifference;
|
|
}
|
|
ItemStack weapon = attacker.getHeldItem();
|
|
if (weapon != null) {
|
|
if (player.isBlocking() && angleDifference >= 135 && angleDifference <=225) {
|
|
|
|
if (weapon.getItem() instanceof ItemAxe || weapon.getItem() instanceof LOTRItemAxe || weapon.getItem() instanceof LOTRItemBattleaxe) {
|
|
sword.damageItem((int) (event.damage *1.5), player); // Axes deal 150% the Durability damage
|
|
player.clearItemInUse();
|
|
world.playSoundAtEntity(player, "random.anvil_land", 1F, 2F);
|
|
event.damage *= 0.25f; // Only 25% Passes through
|
|
} else if (weapon.getItem() instanceof LOTRItemHammer) {
|
|
sword.damageItem((int) event.damage, player); // Hammers bypass the block better, but only deal 100% of the durability damage
|
|
player.clearItemInUse();
|
|
world.playSoundAtEntity(player, "random.anvil_land", 1F, 2F);
|
|
event.damage *= 0.5f; // Only 50% Passes through
|
|
} else {
|
|
sword.damageItem((int) (event.damage/2), player); //Swords only deal 50% of durability damage
|
|
player.clearItemInUse();
|
|
world.playSoundAtEntity(player, "random.anvil_land", 1F, 2F);
|
|
event.damage = 0.0f;
|
|
cancel = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return new Pair<>(event, cancel);
|
|
}
|
|
}
|