diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java index 085c65d8..825f6e84 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java @@ -160,6 +160,10 @@ public class Disguise implements NbtSerialisable { return entity; } + public void onImpact(Pony pony, float distance, float damageMultiplier) { + EntityBehaviour.forEntity(entity).onImpact(pony, entity, distance, damageMultiplier); + } + private void onEntityLoaded(Caster source) { source.getEntity().calculateDimensions(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java index 336c42c1..289ac4ad 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java @@ -46,6 +46,10 @@ public class EntityBehaviour { } + public void onImpact(Caster source, T entity, float distance, float damageMultiplier) { + + } + public T onCreate(T entity, Disguise context, boolean wasNew) { entity.extinguish(); return entity; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java index 4fda49c2..eb35aad8 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java @@ -7,12 +7,13 @@ import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.spell.DisguiseSpell; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.mixin.MixinBlockEntity; +import com.minelittlepony.unicopia.mixin.MixinFallingBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockEntityProvider; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.block.DoorBlock; +import net.minecraft.block.FallingBlock; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.ChestBlockEntity; import net.minecraft.block.entity.EnderChestBlockEntity; @@ -37,23 +38,42 @@ public class FallingBlockBehaviour extends EntityBehaviour { return FULL_BLOCK; } + @Override + public void onImpact(Caster source, FallingBlockEntity entity, float distance, float damageMultiplier) { + if (source.getEntity().fallDistance > 3) { + entity.fallDistance = source.getEntity().fallDistance; + entity.handleFallDamage(distance, damageMultiplier); + + BlockState state = entity.getBlockState(); + if (state.getBlock() instanceof FallingBlock) { + ((FallingBlock)state.getBlock()).onLanding(entity.world, entity.getBlockPos(), state, state, entity); + } + } + } + + private FallingBlockEntity configure(FallingBlockEntity entity, Block block) { + if (block instanceof MixinFallingBlock) { + ((MixinFallingBlock)block).invokeConfigureFallingBlockEntity(entity); + } + entity.dropItem = false; + + return entity; + } + @Override public FallingBlockEntity onCreate(FallingBlockEntity entity, Disguise context, boolean replaceOld) { super.onCreate(entity, context, replaceOld); BlockState state = entity.getBlockState(); Block block = state.getBlock(); - if (block == Blocks.SAND) { - block = Blocks.BLACKSTONE; - } if (state.isIn(BlockTags.DOORS) && block instanceof DoorBlock) { BlockState lowerState = state.with(DoorBlock.HALF, DoubleBlockHalf.LOWER); BlockState upperState = state.with(DoorBlock.HALF, DoubleBlockHalf.UPPER); - context.attachExtraEntity(new FallingBlockEntity(entity.world, entity.getX(), entity.getY(), entity.getZ(), upperState)); + context.attachExtraEntity(configure(new FallingBlockEntity(entity.world, entity.getX(), entity.getY(), entity.getZ(), upperState), block)); - return new FallingBlockEntity(entity.world, entity.getX(), entity.getY() + 1, entity.getZ(), lowerState); + return configure(new FallingBlockEntity(entity.world, entity.getX(), entity.getY() + 1, entity.getZ(), lowerState), block); } if (block instanceof BlockEntityProvider) { @@ -62,7 +82,7 @@ public class FallingBlockBehaviour extends EntityBehaviour { context.addBlockEntity(b); } - return entity; + return configure(entity, block); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index ded24429..e3dcf3b4 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -13,6 +13,7 @@ import com.minelittlepony.unicopia.ability.AbilityDispatcher; import com.minelittlepony.unicopia.ability.magic.Attached; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Spell; +import com.minelittlepony.unicopia.ability.magic.spell.DisguiseSpell; import com.minelittlepony.unicopia.ability.magic.spell.ShieldSpell; import com.minelittlepony.unicopia.ability.magic.spell.SpellRegistry; import com.minelittlepony.unicopia.entity.Physics; @@ -339,10 +340,21 @@ public class Pony implements Caster, Equine, Transmi } distance *= g; + distance = Math.max(0, distance - 5); - return Optional.of(Math.max(0, distance - 5)); + float d = distance; + getSpellOrEmpty(DisguiseSpell.class, false).ifPresent(spell -> { + spell.getDisguise().onImpact(this, d, damageMultiplier); + }); + + return Optional.of(distance); } + float d = distance; + getSpellOrEmpty(DisguiseSpell.class, false).ifPresent(spell -> { + spell.getDisguise().onImpact(this, d, damageMultiplier); + }); + return Optional.empty(); } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinFallingBlock.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinFallingBlock.java new file mode 100644 index 00000000..26cbaa87 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinFallingBlock.java @@ -0,0 +1,13 @@ +package com.minelittlepony.unicopia.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.block.FallingBlock; +import net.minecraft.entity.FallingBlockEntity; + +@Mixin(FallingBlock.class) +public interface MixinFallingBlock { + @Invoker + void invokeConfigureFallingBlockEntity(FallingBlockEntity entity); +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 663a9fac..53ec08a3 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -7,6 +7,7 @@ "mixins": [ "MixinBlockEntity", "MixinBlockItem", + "MixinFallingBlock", "MixinItem", "MixinItemEntity", "MixinItems",