Search in sources :

Example 11 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_R2.entity.CraftEntity) EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) CraftLivingEntity(org.bukkit.craftbukkit.v1_18_R2.entity.CraftLivingEntity) LivingEntity(org.bukkit.entity.LivingEntity) ArmorStand(org.bukkit.entity.ArmorStand) CraftArmorStand(org.bukkit.craftbukkit.v1_18_R2.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 12 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project SpongeCommon by SpongePowered.

the class EntityPerformingDropsTransaction method captureState.

@Override
protected void captureState() {
    super.captureState();
    final Entity entity = this.destroyingEntity;
    this.worldSupplier = VolumeStreamUtils.createWeaklyReferencedSupplier((ServerLevel) entity.level, "ServerLevel");
    final CompoundTag tag = new CompoundTag();
    entity.saveWithoutId(tag);
    this.entityTag = tag;
    @Nullable final DamageSource lastAttacker;
    if (entity instanceof LivingEntity) {
        final CombatEntry entry = ((CombatTrackerAccessor) ((LivingEntity) entity).getCombatTracker()).invoker$getMostSignificantFall();
        if (entry != null) {
            lastAttacker = ((CombatEntryAccessor) entry).accessor$source();
        } else {
            lastAttacker = null;
        }
    } else {
        lastAttacker = null;
    }
    final WeakReference<@Nullable DamageSource> ref = new WeakReference<>(lastAttacker);
    this.lastAttacker = () -> {
        @Nullable final DamageSource damageSource = ref.get();
        // Yes, I know, we're effectively
        if (damageSource == null) {
            return Optional.empty();
        }
        return Optional.of(damageSource);
    };
}
Also used : LivingEntity(net.minecraft.world.entity.LivingEntity) LivingEntity(net.minecraft.world.entity.LivingEntity) Entity(net.minecraft.world.entity.Entity) ServerLevel(net.minecraft.server.level.ServerLevel) DamageSource(net.minecraft.world.damagesource.DamageSource) CombatTrackerAccessor(org.spongepowered.common.accessor.world.damagesource.CombatTrackerAccessor) WeakReference(java.lang.ref.WeakReference) CombatEntry(net.minecraft.world.damagesource.CombatEntry) CompoundTag(net.minecraft.nbt.CompoundTag) Nullable(org.checkerframework.checker.nullness.qual.Nullable)

Example 13 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project SpongeCommon by SpongePowered.

the class DamageEventUtil method generateCauseFor.

/**
 * This applies various contexts based on the type of {@link DamageSource}, whether
 * it's provided by sponge or vanilla. This is not stack neutral, which is why it requires
 * a {@link CauseStackManager.StackFrame} reference to push onto the stack.
 */
public static void generateCauseFor(final DamageSource damageSource, final CauseStackManager.StackFrame frame) {
    if (damageSource instanceof EntityDamageSource) {
        final net.minecraft.world.entity.Entity source = damageSource.getEntity();
        if (!(source instanceof Player) && source instanceof CreatorTrackedBridge) {
            final CreatorTrackedBridge creatorBridge = (CreatorTrackedBridge) source;
            creatorBridge.tracker$getCreatorUUID().ifPresent(creator -> frame.addContext(EventContextKeys.CREATOR, creator));
            creatorBridge.tracker$getNotifierUUID().ifPresent(notifier -> frame.addContext(EventContextKeys.NOTIFIER, notifier));
        }
    } else if (damageSource instanceof BlockDamageSource) {
        final ServerLocation location = ((BlockDamageSource) damageSource).location();
        final BlockPos blockPos = VecHelper.toBlockPos(location);
        final LevelChunkBridge chunkBridge = (LevelChunkBridge) ((net.minecraft.world.level.Level) location.world()).getChunkAt(blockPos);
        chunkBridge.bridge$getBlockCreatorUUID(blockPos).ifPresent(creator -> frame.addContext(EventContextKeys.CREATOR, creator));
        chunkBridge.bridge$getBlockNotifierUUID(blockPos).ifPresent(notifier -> frame.addContext(EventContextKeys.NOTIFIER, notifier));
    }
    frame.pushCause(damageSource);
}
Also used : ResourceLocation(net.minecraft.resources.ResourceLocation) LivingEntity(net.minecraft.world.entity.LivingEntity) AABB(net.minecraft.world.phys.AABB) LivingEntityAccessor(org.spongepowered.common.accessor.world.entity.LivingEntityAccessor) ItemStackSnapshot(org.spongepowered.api.item.inventory.ItemStackSnapshot) MobType(net.minecraft.world.entity.MobType) EventContext(org.spongepowered.api.event.EventContext) Registry(net.minecraft.core.Registry) ChunkSource(net.minecraft.world.level.chunk.ChunkSource) CreatorTrackedBridge(org.spongepowered.common.bridge.CreatorTrackedBridge) ItemStack(org.spongepowered.api.item.inventory.ItemStack) Map(java.util.Map) PotionEffect(org.spongepowered.api.effect.potion.PotionEffect) Predicate(java.util.function.Predicate) Collection(java.util.Collection) Player(net.minecraft.world.entity.player.Player) List(java.util.List) BlockPos(net.minecraft.core.BlockPos) BlockDamageSource(org.spongepowered.api.event.cause.entity.damage.source.BlockDamageSource) Optional(java.util.Optional) ServerLocation(org.spongepowered.api.world.server.ServerLocation) Enchantment(net.minecraft.world.item.enchantment.Enchantment) LevelChunk(net.minecraft.world.level.chunk.LevelChunk) LevelChunkBridge(org.spongepowered.common.bridge.world.level.chunk.LevelChunkBridge) EventContextKeys(org.spongepowered.api.event.EventContextKeys) ServerWorld(org.spongepowered.api.world.server.ServerWorld) BlockState(net.minecraft.world.level.block.state.BlockState) HashMap(java.util.HashMap) DamageModifierTypes(org.spongepowered.api.event.cause.entity.damage.DamageModifierTypes) MobEffects(net.minecraft.world.effect.MobEffects) DoubleUnaryOperator(java.util.function.DoubleUnaryOperator) ArrayList(java.util.ArrayList) EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) ItemStackUtil(org.spongepowered.common.item.util.ItemStackUtil) DamageSource(net.minecraft.world.damagesource.DamageSource) EnchantmentHelper(net.minecraft.world.item.enchantment.EnchantmentHelper) CombatRules(net.minecraft.world.damagesource.CombatRules) Server(org.spongepowered.api.Server) CauseStackManager(org.spongepowered.api.event.CauseStackManager) FallingBlockDamageSource(org.spongepowered.api.event.cause.entity.damage.source.FallingBlockDamageSource) Cause(org.spongepowered.api.event.Cause) Entity(net.minecraft.world.entity.Entity) DamageFunction(org.spongepowered.api.event.cause.entity.damage.DamageFunction) DamageModifier(org.spongepowered.api.event.cause.entity.damage.DamageModifier) EquipmentSlot(net.minecraft.world.entity.EquipmentSlot) Attributes(net.minecraft.world.entity.ai.attributes.Attributes) Mth(net.minecraft.util.Mth) Collections(java.util.Collections) ListTag(net.minecraft.nbt.ListTag) Player(net.minecraft.world.entity.player.Player) CreatorTrackedBridge(org.spongepowered.common.bridge.CreatorTrackedBridge) ServerLocation(org.spongepowered.api.world.server.ServerLocation) EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) Entity(net.minecraft.world.entity.Entity) BlockDamageSource(org.spongepowered.api.event.cause.entity.damage.source.BlockDamageSource) FallingBlockDamageSource(org.spongepowered.api.event.cause.entity.damage.source.FallingBlockDamageSource) BlockPos(net.minecraft.core.BlockPos) LevelChunkBridge(org.spongepowered.common.bridge.world.level.chunk.LevelChunkBridge)

Example 14 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project SpongeCommon by SpongePowered.

the class DamageEventUtil method createEnchantmentModifiers.

public static Optional<List<DamageFunction>> createEnchantmentModifiers(final LivingEntity living, final DamageSource damageSource) {
    if (damageSource.isBypassMagic()) {
        return Optional.empty();
    }
    final Iterable<net.minecraft.world.item.ItemStack> inventory = living.getArmorSlots();
    final int damageProtection = EnchantmentHelper.getDamageProtection(inventory, damageSource);
    if (damageProtection <= 0) {
        return Optional.empty();
    }
    final List<DamageFunction> modifiers = new ArrayList<>();
    final DoubleUnaryOperator enchantmentFunction = incomingDamage -> -(incomingDamage - CombatRules.getDamageAfterMagicAbsorb((float) incomingDamage, damageProtection));
    try (final CauseStackManager.StackFrame frame = ((Server) living.getServer()).causeStackManager().pushCauseFrame()) {
        frame.pushCause(living);
        final DamageModifier enchantmentModifier = DamageModifier.builder().cause(frame.currentCause()).type(DamageModifierTypes.ARMOR_ENCHANTMENT).build();
        modifiers.add(new DamageFunction(enchantmentModifier, enchantmentFunction));
    }
    return Optional.of(modifiers);
}
Also used : ResourceLocation(net.minecraft.resources.ResourceLocation) LivingEntity(net.minecraft.world.entity.LivingEntity) AABB(net.minecraft.world.phys.AABB) LivingEntityAccessor(org.spongepowered.common.accessor.world.entity.LivingEntityAccessor) ItemStackSnapshot(org.spongepowered.api.item.inventory.ItemStackSnapshot) MobType(net.minecraft.world.entity.MobType) EventContext(org.spongepowered.api.event.EventContext) Registry(net.minecraft.core.Registry) ChunkSource(net.minecraft.world.level.chunk.ChunkSource) CreatorTrackedBridge(org.spongepowered.common.bridge.CreatorTrackedBridge) ItemStack(org.spongepowered.api.item.inventory.ItemStack) Map(java.util.Map) PotionEffect(org.spongepowered.api.effect.potion.PotionEffect) Predicate(java.util.function.Predicate) Collection(java.util.Collection) Player(net.minecraft.world.entity.player.Player) List(java.util.List) BlockPos(net.minecraft.core.BlockPos) BlockDamageSource(org.spongepowered.api.event.cause.entity.damage.source.BlockDamageSource) Optional(java.util.Optional) ServerLocation(org.spongepowered.api.world.server.ServerLocation) Enchantment(net.minecraft.world.item.enchantment.Enchantment) LevelChunk(net.minecraft.world.level.chunk.LevelChunk) LevelChunkBridge(org.spongepowered.common.bridge.world.level.chunk.LevelChunkBridge) EventContextKeys(org.spongepowered.api.event.EventContextKeys) ServerWorld(org.spongepowered.api.world.server.ServerWorld) BlockState(net.minecraft.world.level.block.state.BlockState) HashMap(java.util.HashMap) DamageModifierTypes(org.spongepowered.api.event.cause.entity.damage.DamageModifierTypes) MobEffects(net.minecraft.world.effect.MobEffects) DoubleUnaryOperator(java.util.function.DoubleUnaryOperator) ArrayList(java.util.ArrayList) EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) ItemStackUtil(org.spongepowered.common.item.util.ItemStackUtil) DamageSource(net.minecraft.world.damagesource.DamageSource) EnchantmentHelper(net.minecraft.world.item.enchantment.EnchantmentHelper) CombatRules(net.minecraft.world.damagesource.CombatRules) Server(org.spongepowered.api.Server) CauseStackManager(org.spongepowered.api.event.CauseStackManager) FallingBlockDamageSource(org.spongepowered.api.event.cause.entity.damage.source.FallingBlockDamageSource) Cause(org.spongepowered.api.event.Cause) Entity(net.minecraft.world.entity.Entity) DamageFunction(org.spongepowered.api.event.cause.entity.damage.DamageFunction) DamageModifier(org.spongepowered.api.event.cause.entity.damage.DamageModifier) EquipmentSlot(net.minecraft.world.entity.EquipmentSlot) Attributes(net.minecraft.world.entity.ai.attributes.Attributes) Mth(net.minecraft.util.Mth) Collections(java.util.Collections) ListTag(net.minecraft.nbt.ListTag) ArrayList(java.util.ArrayList) CauseStackManager(org.spongepowered.api.event.CauseStackManager) DamageModifier(org.spongepowered.api.event.cause.entity.damage.DamageModifier) DamageFunction(org.spongepowered.api.event.cause.entity.damage.DamageFunction) ItemStack(org.spongepowered.api.item.inventory.ItemStack) DoubleUnaryOperator(java.util.function.DoubleUnaryOperator)

Example 15 with DamageSource

use of net.minecraft.world.damagesource.DamageSource in project SpongeCommon by SpongePowered.

the class EntityMixin method impl$createLavaBlockDamageSource.

/*
    @Inject(method = "move",
        at = @At("HEAD"),
        cancellable = true)
    private void impl$onSpongeMoveEntity(final MoverType type, final Vec3d vec3d, final CallbackInfo ci) {
        if (!this.world.isClientSide && !SpongeHooks.checkEntitySpeed(((Entity) (Object) this), vec3d.x(), vec3d.y(), vec3d.z())) {
            ci.cancel();
        }
    }
*/
@Redirect(method = "lavaHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z"))
private boolean impl$createLavaBlockDamageSource(final Entity entity, final DamageSource source, final float damage) {
    if (this.level.isClientSide) {
        // Short circuit
        return entity.hurt(source, damage);
    }
    try {
        final AABB bb = this.shadow$getBoundingBox().inflate(-0.10000000149011612D, -0.4000000059604645D, -0.10000000149011612D);
        final ServerLocation location = DamageEventUtil.findFirstMatchingBlock((Entity) (Object) this, bb, block -> block.getMaterial() == Material.LAVA);
        final DamageSource lava = MinecraftBlockDamageSource.ofFire("lava", location, false);
        // Bridge to bypass issue with using accessor mixins within mixins
        ((DamageSourceBridge) lava).bridge$setLava();
        return entity.hurt(DamageSource.LAVA, damage);
    } finally {
        // Since "source" is already the DamageSource.LAVA object, we can simply re-use it here.
        ((DamageSourceBridge) source).bridge$setLava();
    }
}
Also used : MinecraftBlockDamageSource(org.spongepowered.common.util.MinecraftBlockDamageSource) EntityDamageSource(net.minecraft.world.damagesource.EntityDamageSource) DamageSource(net.minecraft.world.damagesource.DamageSource) DamageSourceBridge(org.spongepowered.common.bridge.world.damagesource.DamageSourceBridge) ServerLocation(org.spongepowered.api.world.server.ServerLocation) AABB(net.minecraft.world.phys.AABB) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

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