Search in sources :

Example 21 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.craftbukkit.v1_17_R1.entity(org.bukkit.craftbukkit.v1_17_R1.entity) org.bukkit.entity(org.bukkit.entity) net.minecraft.world.entity(net.minecraft.world.entity)

Example 22 with DamageSource

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

the class EnchantmentHelperImpl method registerFakeEnchantment.

@Override
public org.bukkit.enchantments.Enchantment registerFakeEnchantment(EnchantmentScriptContainer.EnchantmentReference script) {
    try {
        EquipmentSlot[] slots = new EquipmentSlot[script.script.slots.size()];
        for (int i = 0; i < slots.length; i++) {
            slots[i] = EquipmentSlot.valueOf(script.script.slots.get(i).toUpperCase());
        }
        net.minecraft.world.item.enchantment.Enchantment nmsEnchant = new net.minecraft.world.item.enchantment.Enchantment(net.minecraft.world.item.enchantment.Enchantment.Rarity.valueOf(script.script.rarity), EnchantmentCategory.valueOf(script.script.category), slots) {

            @Override
            public int getMinLevel() {
                return script.script.minLevel;
            }

            @Override
            public int getMaxLevel() {
                return script.script.maxLevel;
            }

            @Override
            public int getMinCost(int level) {
                return script.script.getMinCost(level);
            }

            @Override
            public int getMaxCost(int level) {
                return script.script.getMaxCost(level);
            }

            @Override
            public int getDamageProtection(int level, DamageSource src) {
                return script.script.getDamageProtection(level, src.msgId, src.getEntity() == null ? null : src.getEntity().getBukkitEntity());
            }

            @Override
            public float getDamageBonus(int level, MobType type) {
                String typeName = "UNDEFINED";
                if (type == MobType.ARTHROPOD) {
                    typeName = "ARTHROPOD";
                } else if (type == MobType.ILLAGER) {
                    typeName = "ILLAGER";
                } else if (type == MobType.UNDEAD) {
                    typeName = "UNDEAD";
                } else if (type == MobType.WATER) {
                    typeName = "WATER";
                }
                return script.script.getDamageBonus(level, typeName);
            }

            @Override
            protected boolean checkCompatibility(net.minecraft.world.item.enchantment.Enchantment nmsEnchantment) {
                ResourceLocation nmsKey = Registry.ENCHANTMENT.getKey(nmsEnchantment);
                NamespacedKey bukkitKey = CraftNamespacedKey.fromMinecraft(nmsKey);
                org.bukkit.enchantments.Enchantment bukkitEnchant = CraftEnchantment.getByKey(bukkitKey);
                return script.script.isCompatible(bukkitEnchant);
            }

            @Override
            protected String getOrCreateDescriptionId() {
                return script.script.descriptionId;
            }

            @Override
            public String getDescriptionId() {
                return script.script.descriptionId;
            }

            @Override
            public Component getFullname(int level) {
                return Handler.componentToNMS(script.script.getFullName(level));
            }

            @Override
            public boolean canEnchant(net.minecraft.world.item.ItemStack var0) {
                return super.canEnchant(var0) && script.script.canEnchant(CraftItemStack.asBukkitCopy(var0));
            }

            @Override
            public void doPostAttack(LivingEntity attacker, Entity victim, int level) {
                script.script.doPostAttack(attacker.getBukkitEntity(), victim.getBukkitEntity(), level);
            }

            @Override
            public void doPostHurt(LivingEntity victim, Entity attacker, int level) {
                script.script.doPostHurt(victim.getBukkitEntity(), attacker.getBukkitEntity(), level);
            }

            @Override
            public boolean isTreasureOnly() {
                return script.script.isTreasureOnly;
            }

            @Override
            public boolean isCurse() {
                return script.script.isCurse;
            }

            @Override
            public boolean isTradeable() {
                return script.script.isTradable;
            }

            @Override
            public boolean isDiscoverable() {
                return script.script.isDiscoverable;
            }
        };
        String enchName = script.script.id.toUpperCase();
        Registry.register(Registry.ENCHANTMENT, "denizen:" + script.script.id, nmsEnchant);
        CraftEnchantment ench = new CraftEnchantment(nmsEnchant) {

            @Override
            public String getName() {
                return enchName;
            }
        };
        ENCHANTMENTS_BY_KEY.put(ench.getKey(), ench);
        ENCHANTMENTS_BY_NAME.put(enchName, ench);
        return ench;
    } catch (Throwable ex) {
        Debug.echoError("Failed to register enchantment " + script.script.id);
        Debug.echoError(ex);
        return null;
    }
}
Also used : LivingEntity(net.minecraft.world.entity.LivingEntity) CraftEntity(org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity) Entity(net.minecraft.world.entity.Entity) DamageSource(net.minecraft.world.damagesource.DamageSource) Enchantment(org.bukkit.enchantments.Enchantment) EquipmentSlot(net.minecraft.world.entity.EquipmentSlot) MobType(net.minecraft.world.entity.MobType) LivingEntity(net.minecraft.world.entity.LivingEntity) NamespacedKey(org.bukkit.NamespacedKey) CraftNamespacedKey(org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey) ResourceLocation(net.minecraft.resources.ResourceLocation) Enchantment(org.bukkit.enchantments.Enchantment) CraftEnchantment(org.bukkit.craftbukkit.v1_17_R1.enchantments.CraftEnchantment) CraftItemStack(org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack) CraftEnchantment(org.bukkit.craftbukkit.v1_17_R1.enchantments.CraftEnchantment)

Example 23 with DamageSource

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

the class EntityHelperImpl method damage.

@Override
public void damage(LivingEntity target, float amount, Entity source, EntityDamageEvent.DamageCause cause) {
    if (target == null) {
        return;
    }
    net.minecraft.world.entity.LivingEntity nmsTarget = ((CraftLivingEntity) target).getHandle();
    net.minecraft.world.entity.Entity nmsSource = source == null ? null : ((CraftEntity) source).getHandle();
    CraftEventFactory.entityDamage = nmsSource;
    try {
        DamageSource src = getSourceFor(nmsSource, cause);
        if (src instanceof FakeDamageSrc) {
            src = ((FakeDamageSrc) src).real;
            EntityDamageEvent ede = fireFakeDamageEvent(target, source, cause, amount);
            if (ede.isCancelled()) {
                return;
            }
        }
        nmsTarget.hurt(src, amount);
    } finally {
        CraftEventFactory.entityDamage = null;
    }
}
Also used : DamageSource(net.minecraft.world.damagesource.DamageSource) 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) EntityDamageEvent(org.bukkit.event.entity.EntityDamageEvent)

Example 24 with DamageSource

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

the class EnchantmentHelperImpl method registerFakeEnchantment.

@Override
public org.bukkit.enchantments.Enchantment registerFakeEnchantment(EnchantmentScriptContainer.EnchantmentReference script) {
    try {
        EquipmentSlot[] slots = new EquipmentSlot[script.script.slots.size()];
        for (int i = 0; i < slots.length; i++) {
            slots[i] = EquipmentSlot.valueOf(script.script.slots.get(i).toUpperCase());
        }
        net.minecraft.world.item.enchantment.Enchantment nmsEnchant = new net.minecraft.world.item.enchantment.Enchantment(net.minecraft.world.item.enchantment.Enchantment.Rarity.valueOf(script.script.rarity), EnchantmentCategory.valueOf(script.script.category), slots) {

            @Override
            public int getMinLevel() {
                return script.script.minLevel;
            }

            @Override
            public int getMaxLevel() {
                return script.script.maxLevel;
            }

            @Override
            public int getMinCost(int level) {
                return script.script.getMinCost(level);
            }

            @Override
            public int getMaxCost(int level) {
                return script.script.getMaxCost(level);
            }

            @Override
            public int getDamageProtection(int level, DamageSource src) {
                return script.script.getDamageProtection(level, src.msgId, src.getEntity() == null ? null : src.getEntity().getBukkitEntity());
            }

            @Override
            public float getDamageBonus(int level, MobType type) {
                String typeName = "UNDEFINED";
                if (type == MobType.ARTHROPOD) {
                    typeName = "ARTHROPOD";
                } else if (type == MobType.ILLAGER) {
                    typeName = "ILLAGER";
                } else if (type == MobType.UNDEAD) {
                    typeName = "UNDEAD";
                } else if (type == MobType.WATER) {
                    typeName = "WATER";
                }
                return script.script.getDamageBonus(level, typeName);
            }

            @Override
            protected boolean checkCompatibility(net.minecraft.world.item.enchantment.Enchantment nmsEnchantment) {
                ResourceLocation nmsKey = Registry.ENCHANTMENT.getKey(nmsEnchantment);
                NamespacedKey bukkitKey = CraftNamespacedKey.fromMinecraft(nmsKey);
                org.bukkit.enchantments.Enchantment bukkitEnchant = CraftEnchantment.getByKey(bukkitKey);
                return script.script.isCompatible(bukkitEnchant);
            }

            @Override
            protected String getOrCreateDescriptionId() {
                return script.script.descriptionId;
            }

            @Override
            public String getDescriptionId() {
                return script.script.descriptionId;
            }

            @Override
            public Component getFullname(int level) {
                return Handler.componentToNMS(script.script.getFullName(level));
            }

            @Override
            public boolean canEnchant(net.minecraft.world.item.ItemStack var0) {
                return super.canEnchant(var0) && script.script.canEnchant(CraftItemStack.asBukkitCopy(var0));
            }

            @Override
            public void doPostAttack(LivingEntity attacker, Entity victim, int level) {
                script.script.doPostAttack(attacker.getBukkitEntity(), victim.getBukkitEntity(), level);
            }

            @Override
            public void doPostHurt(LivingEntity victim, Entity attacker, int level) {
                script.script.doPostHurt(victim.getBukkitEntity(), attacker.getBukkitEntity(), level);
            }

            @Override
            public boolean isTreasureOnly() {
                return script.script.isTreasureOnly;
            }

            @Override
            public boolean isCurse() {
                return script.script.isCurse;
            }

            @Override
            public boolean isTradeable() {
                return script.script.isTradable;
            }

            @Override
            public boolean isDiscoverable() {
                return script.script.isDiscoverable;
            }
        };
        String enchName = script.script.id.toUpperCase();
        Registry.register(Registry.ENCHANTMENT, "denizen:" + script.script.id, nmsEnchant);
        CraftEnchantment ench = new CraftEnchantment(nmsEnchant) {

            @Override
            public String getName() {
                return enchName;
            }
        };
        ENCHANTMENTS_BY_KEY.put(ench.getKey(), ench);
        ENCHANTMENTS_BY_NAME.put(enchName, ench);
        return ench;
    } catch (Throwable ex) {
        Debug.echoError("Failed to register enchantment " + script.script.id);
        Debug.echoError(ex);
        return null;
    }
}
Also used : LivingEntity(net.minecraft.world.entity.LivingEntity) Entity(net.minecraft.world.entity.Entity) CraftEntity(org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity) DamageSource(net.minecraft.world.damagesource.DamageSource) Enchantment(org.bukkit.enchantments.Enchantment) EquipmentSlot(net.minecraft.world.entity.EquipmentSlot) MobType(net.minecraft.world.entity.MobType) LivingEntity(net.minecraft.world.entity.LivingEntity) NamespacedKey(org.bukkit.NamespacedKey) CraftNamespacedKey(org.bukkit.craftbukkit.v1_18_R1.util.CraftNamespacedKey) ResourceLocation(net.minecraft.resources.ResourceLocation) Enchantment(org.bukkit.enchantments.Enchantment) CraftEnchantment(org.bukkit.craftbukkit.v1_18_R1.enchantments.CraftEnchantment) CraftItemStack(org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack) CraftEnchantment(org.bukkit.craftbukkit.v1_18_R1.enchantments.CraftEnchantment)

Example 25 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)

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