Search in sources :

Example 6 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project Denizen-For-Bukkit by DenizenScript.

the class EntityHelperImpl method getDamageTo.

@Override
public double getDamageTo(LivingEntity attacker, Entity target) {
    MobType monsterType;
    if (target instanceof LivingEntity) {
        monsterType = ((CraftLivingEntity) target).getHandle().getMobType();
    } else {
        monsterType = MobType.UNDEFINED;
    }
    double damage = 0;
    AttributeInstance attrib = attacker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE);
    if (attrib != null) {
        damage = attrib.getValue();
    }
    if (attacker.getEquipment() != null && attacker.getEquipment().getItemInMainHand() != null) {
        damage += EnchantmentHelper.getDamageBonus(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), monsterType);
    }
    if (damage <= 0) {
        return 0;
    }
    if (target != null) {
        DamageSource source;
        if (attacker instanceof Player) {
            source = DamageSource.playerAttack(((CraftPlayer) attacker).getHandle());
        } else {
            source = DamageSource.mobAttack(((CraftLivingEntity) attacker).getHandle());
        }
        net.minecraft.world.entity.Entity nmsTarget = ((CraftEntity) target).getHandle();
        if (nmsTarget.isInvulnerableTo(source)) {
            return 0;
        }
        if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity)) {
            return damage;
        }
        net.minecraft.world.entity.LivingEntity livingTarget = (net.minecraft.world.entity.LivingEntity) nmsTarget;
        damage = CombatRules.getDamageAfterAbsorb((float) damage, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS));
        int enchantDamageModifier = EnchantmentHelper.getDamageProtection(livingTarget.getArmorSlots(), source);
        if (enchantDamageModifier > 0) {
            damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, (float) enchantDamageModifier);
        }
    }
    return damage;
}
Also used : ServerPlayer(net.minecraft.server.level.ServerPlayer) DamageSource(net.minecraft.world.damagesource.DamageSource) LivingEntity(org.bukkit.entity.LivingEntity) AttributeInstance(org.bukkit.attribute.AttributeInstance) org.bukkit.entity(org.bukkit.entity) org.bukkit.craftbukkit.v1_18_R1.entity(org.bukkit.craftbukkit.v1_18_R1.entity) net.minecraft.world.entity(net.minecraft.world.entity)

Example 7 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project MagicPlugin by elBukkit.

the class CompatibilityUtils method magicDamage.

@Override
public void magicDamage(Damageable target, double amount, Entity source) {
    try {
        if (target == null || target.isDead())
            return;
        // Might need to config-drive this, or just go back to defaulting to normal damage
        if (!USE_MAGIC_DAMAGE || target instanceof Witch || target instanceof Enderman || target instanceof ArmorStand || !(target instanceof LivingEntity)) {
            damage(target, amount, source);
            return;
        }
        net.minecraft.world.entity.Entity targetHandle = ((CraftEntity) target).getHandle();
        if (targetHandle == null)
            return;
        net.minecraft.world.entity.Entity sourceHandle = source == null ? null : ((CraftEntity) source).getHandle();
        // Bukkit won't allow magic damage from anything but a potion..
        if (sourceHandle != null && source instanceof LivingEntity) {
            Location location = target.getLocation();
            ThrownPotion potion = getOrCreatePotionEntity(location);
            net.minecraft.world.entity.Entity potionHandle = ((CraftEntity) potion).getHandle();
            potion.setShooter((LivingEntity) source);
            DamageSource magicSource = DamageSource.indirectMagic(potionHandle, sourceHandle);
            // This is a bit of hack that lets us damage the ender dragon, who is a weird and annoying collection
            // of various non-living entity pieces.
            ((EntityDamageSource) magicSource).setThorns();
            try (EnteredStateTracker.Touchable damaging = isDamaging.enter()) {
                damaging.touch();
                targetHandle.hurt(magicSource, (float) amount);
            }
        } else {
            try (EnteredStateTracker.Touchable damaging = isDamaging.enter()) {
                damaging.touch();
                targetHandle.hurt(DamageSource.MAGIC, (float) amount);
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Also used : EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) DamageSource(net.minecraft.world.damagesource.DamageSource) CraftEntity(org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity) EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) CraftLivingEntity(org.bukkit.craftbukkit.v1_17_R1.entity.CraftLivingEntity) LivingEntity(org.bukkit.entity.LivingEntity) ArmorStand(org.bukkit.entity.ArmorStand) CraftArmorStand(org.bukkit.craftbukkit.v1_17_R1.entity.CraftArmorStand) Enderman(org.bukkit.entity.Enderman) ThrownPotion(org.bukkit.entity.ThrownPotion) EnteredStateTracker(com.elmakers.mine.bukkit.utility.EnteredStateTracker) Witch(org.bukkit.entity.Witch) Location(org.bukkit.Location)

Example 8 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project MagicPlugin by elBukkit.

the class CompatibilityUtils method damage.

@Override
public void damage(Damageable target, double amount, Entity source, String damageType) {
    if (target == null || target.isDead())
        return;
    if (damageType.equalsIgnoreCase("direct")) {
        double health = target.getHealth() - amount;
        target.setHealth(Math.max(health, 0));
        return;
    }
    if (damageType.equalsIgnoreCase("magic")) {
        magicDamage(target, amount, source);
        return;
    }
    DamageSource damageSource = getDamageSource(damageType);
    if (damageSource == null) {
        magicDamage(target, amount, source);
        return;
    }
    net.minecraft.world.entity.Entity targetHandle = ((CraftEntity) target).getHandle();
    if (targetHandle == null)
        return;
    try (EnteredStateTracker.Touchable damaging = isDamaging.enter()) {
        damaging.touch();
        targetHandle.hurt(damageSource, (float) amount);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Also used : EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) DamageSource(net.minecraft.world.damagesource.DamageSource) CraftEntity(org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity) EnteredStateTracker(com.elmakers.mine.bukkit.utility.EnteredStateTracker)

Example 9 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project MagicPlugin by elBukkit.

the class CompatibilityUtils method magicDamage.

@Override
public void magicDamage(Damageable target, double amount, Entity source) {
    try {
        if (target == null || target.isDead())
            return;
        // Might need to config-drive this, or just go back to defaulting to normal damage
        if (!USE_MAGIC_DAMAGE || target instanceof Witch || target instanceof Enderman || target instanceof ArmorStand || !(target instanceof LivingEntity)) {
            damage(target, amount, source);
            return;
        }
        net.minecraft.world.entity.Entity targetHandle = ((CraftEntity) target).getHandle();
        if (targetHandle == null)
            return;
        net.minecraft.world.entity.Entity sourceHandle = source == null ? null : ((CraftEntity) source).getHandle();
        // Bukkit won't allow magic damage from anything but a potion..
        if (sourceHandle != null && source instanceof LivingEntity) {
            Location location = target.getLocation();
            ThrownPotion potion = getOrCreatePotionEntity(location);
            net.minecraft.world.entity.Entity potionHandle = ((CraftEntity) potion).getHandle();
            potion.setShooter((LivingEntity) source);
            DamageSource magicSource = DamageSource.indirectMagic(potionHandle, sourceHandle);
            // This is a bit of hack that lets us damage the ender dragon, who is a weird and annoying collection
            // of various non-living entity pieces.
            ((EntityDamageSource) magicSource).setThorns();
            try (EnteredStateTracker.Touchable damaging = isDamaging.enter()) {
                damaging.touch();
                targetHandle.hurt(magicSource, (float) amount);
            }
        } else {
            try (EnteredStateTracker.Touchable damaging = isDamaging.enter()) {
                damaging.touch();
                targetHandle.hurt(DamageSource.MAGIC, (float) amount);
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Also used : EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) DamageSource(net.minecraft.world.damagesource.DamageSource) CraftEntity(org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity) EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) LivingEntity(org.bukkit.entity.LivingEntity) CraftLivingEntity(org.bukkit.craftbukkit.v1_18_R1.entity.CraftLivingEntity) CraftArmorStand(org.bukkit.craftbukkit.v1_18_R1.entity.CraftArmorStand) ArmorStand(org.bukkit.entity.ArmorStand) Enderman(org.bukkit.entity.Enderman) ThrownPotion(org.bukkit.entity.ThrownPotion) EnteredStateTracker(com.elmakers.mine.bukkit.utility.EnteredStateTracker) Witch(org.bukkit.entity.Witch) Location(org.bukkit.Location)

Example 10 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project MagicPlugin by elBukkit.

the class CompatibilityUtils method damage.

@Override
public void damage(Damageable target, double amount, Entity source, String damageType) {
    if (target == null || target.isDead())
        return;
    if (damageType.equalsIgnoreCase("direct")) {
        double health = target.getHealth() - amount;
        target.setHealth(Math.max(health, 0));
        return;
    }
    if (damageType.equalsIgnoreCase("magic")) {
        magicDamage(target, amount, source);
        return;
    }
    DamageSource damageSource = getDamageSource(damageType);
    if (damageSource == null) {
        magicDamage(target, amount, source);
        return;
    }
    net.minecraft.world.entity.Entity targetHandle = ((CraftEntity) target).getHandle();
    if (targetHandle == null)
        return;
    try (EnteredStateTracker.Touchable damaging = isDamaging.enter()) {
        damaging.touch();
        targetHandle.hurt(damageSource, (float) amount);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Also used : EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) DamageSource(net.minecraft.world.damagesource.DamageSource) CraftEntity(org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity) EnteredStateTracker(com.elmakers.mine.bukkit.utility.EnteredStateTracker)

Aggregations

DamageSource (net.minecraft.world.damagesource.DamageSource)29 EntityDamageSource (net.minecraft.world.damagesource.EntityDamageSource)14 LivingEntity (net.minecraft.world.entity.LivingEntity)11 EnteredStateTracker (com.elmakers.mine.bukkit.utility.EnteredStateTracker)10 Entity (net.minecraft.world.entity.Entity)9 ServerLocation (org.spongepowered.api.world.server.ServerLocation)8 LivingEntity (org.bukkit.entity.LivingEntity)7 ArrayList (java.util.ArrayList)6 EquipmentSlot (net.minecraft.world.entity.EquipmentSlot)6 Player (net.minecraft.world.entity.player.Player)6 DamageFunction (org.spongepowered.api.event.cause.entity.damage.DamageFunction)6 ItemStackUtil (org.spongepowered.common.item.util.ItemStackUtil)6 Collection (java.util.Collection)5 List (java.util.List)5 ResourceLocation (net.minecraft.resources.ResourceLocation)5 MobType (net.minecraft.world.entity.MobType)5 Attributes (net.minecraft.world.entity.ai.attributes.Attributes)5 CraftEntity (org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity)5 CraftEntity (org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity)5 Cause (org.spongepowered.api.event.Cause)5