Changeling disguised as anvils will now do that anvil thing when they fall

This commit is contained in:
Sollace 2020-10-10 17:09:49 +02:00
parent d29cc60d01
commit 0ddd43c39a
6 changed files with 62 additions and 8 deletions

View file

@ -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();

View file

@ -46,6 +46,10 @@ public class EntityBehaviour<T extends Entity> {
}
public void onImpact(Caster<?> source, T entity, float distance, float damageMultiplier) {
}
public T onCreate(T entity, Disguise context, boolean wasNew) {
entity.extinguish();
return entity;

View file

@ -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<FallingBlockEntity> {
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<FallingBlockEntity> {
context.addBlockEntity(b);
}
return entity;
return configure(entity, block);
}
@Override

View file

@ -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<PlayerEntity>, Equine<PlayerEntity>, 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();
}

View file

@ -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);
}

View file

@ -7,6 +7,7 @@
"mixins": [
"MixinBlockEntity",
"MixinBlockItem",
"MixinFallingBlock",
"MixinItem",
"MixinItemEntity",
"MixinItems",