From c0cff599638dd14390313ef1c0b320c3c086e3a7 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 14 Feb 2024 23:57:01 +0000 Subject: [PATCH] Fix issues disguising as crystal shards and prevent disguises from dropping items --- .../unicopia/entity/behaviour/Guest.java | 6 +++++ .../unicopia/entity/duck/EntityDuck.java | 3 ++- .../entity/duck/LivingEntityDuck.java | 4 +-- .../entity/mob/CrystalShardsEntity.java | 9 ++++--- .../entity/mob/StationaryObjectEntity.java | 1 - .../unicopia/mixin/MixinEntity.java | 25 +++++++++++++++++++ .../unicopia/mixin/MixinLivingEntity.java | 14 ----------- 7 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Guest.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Guest.java index 3615b589..2fd67cd2 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Guest.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Guest.java @@ -2,8 +2,14 @@ package com.minelittlepony.unicopia.entity.behaviour; import com.minelittlepony.unicopia.ability.magic.Caster; +import net.minecraft.entity.Entity; + public interface Guest { void setHost(Caster host); Caster getHost(); + + static boolean hasHost(Entity entity) { + return ((Guest)entity).getHost() != null; + } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java b/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java index 659a3a24..fbe95209 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java @@ -3,13 +3,14 @@ package com.minelittlepony.unicopia.entity.duck; import java.util.Set; import com.minelittlepony.unicopia.compat.pehkui.PehkuiEntityExtensions; +import com.minelittlepony.unicopia.entity.behaviour.Guest; import net.minecraft.entity.Entity; import net.minecraft.entity.Entity.RemovalReason; import net.minecraft.fluid.Fluid; import net.minecraft.registry.tag.TagKey; -public interface EntityDuck extends LavaAffine, PehkuiEntityExtensions { +public interface EntityDuck extends LavaAffine, PehkuiEntityExtensions, Guest { Set> getSubmergedFluidTags(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/duck/LivingEntityDuck.java b/src/main/java/com/minelittlepony/unicopia/entity/duck/LivingEntityDuck.java index f126df85..a65c2a25 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/duck/LivingEntityDuck.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/duck/LivingEntityDuck.java @@ -1,13 +1,11 @@ package com.minelittlepony.unicopia.entity.duck; -import com.minelittlepony.unicopia.entity.behaviour.Guest; - import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.util.math.Vec3d; -public interface LivingEntityDuck extends Guest { +public interface LivingEntityDuck extends EntityDuck { void updateItemUsage(Hand hand, ItemStack stack, int time); boolean isJumping(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/CrystalShardsEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/CrystalShardsEntity.java index c23327d5..7a87feed 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/CrystalShardsEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/CrystalShardsEntity.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.entity.behaviour.Guest; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.particle.ParticleUtils; @@ -172,9 +173,11 @@ public class CrystalShardsEntity extends StationaryObjectEntity { } } - if (isDead() || isInvalid(getWorld(), getBlockPos(), getAttachmentFace())) { - kill(); - ParticleUtils.spawnParticles(ParticleTypes.CLOUD, this, 10); + if (!Guest.hasHost(this)) { + if (isDead() || isInvalid(getWorld(), getBlockPos(), getAttachmentFace())) { + kill(); + ParticleUtils.spawnParticles(ParticleTypes.CLOUD, this, 10); + } } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/StationaryObjectEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/StationaryObjectEntity.java index 3e89f204..8b0c61e8 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/StationaryObjectEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/StationaryObjectEntity.java @@ -59,7 +59,6 @@ public abstract class StationaryObjectEntity extends Entity implements UDamageSo } protected void onHurt() { - } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java index 90febf2d..986e9bf5 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java @@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.mixin; import java.util.Set; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; @@ -12,18 +13,35 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.entity.duck.LavaAffine; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.duck.EntityDuck; import net.minecraft.entity.Entity; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.Entity.PositionUpdater; import net.minecraft.entity.Entity.RemovalReason; import net.minecraft.fluid.Fluid; +import net.minecraft.item.ItemStack; import net.minecraft.registry.tag.TagKey; @Mixin(Entity.class) abstract class MixinEntity implements EntityDuck { + @Nullable + private transient Caster host; + + @Override + @Nullable + public Caster getHost() { + return host; + } + + @Override + public void setHost(Caster host) { + this.host = host; + } + @Override @Accessor("submergedFluidTag") public abstract Set> getSubmergedFluidTags(); @@ -83,4 +101,11 @@ abstract class MixinEntity implements EntityDuck { info.cancel(); } } + + @Inject(method = "dropStack(Lnet/minecraft/item/ItemStack;F)Lnet/minecraft/entity/ItemEntity;", at = @At("HEAD"), cancellable = true) + private void onDropStack(ItemStack stack, float yOffset, CallbackInfoReturnable info) { + if (getHost() != null) { + info.setReturnValue(null); + } + } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java index 2fb6a58d..f71ef863 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java @@ -2,7 +2,6 @@ package com.minelittlepony.unicopia.mixin; import java.util.Optional; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; @@ -41,8 +40,6 @@ abstract class MixinLivingEntity extends Entity implements LivingEntityDuck, Equ private Optional climbingPos; private Equine caster; - @Nullable - private transient Caster host; private MixinLivingEntity() { super(null, null); } @@ -62,17 +59,6 @@ abstract class MixinLivingEntity extends Entity implements LivingEntityDuck, Equ return (Living)caster; } - @Override - @Nullable - public Caster getHost() { - return host; - } - - @Override - public void setHost(Caster host) { - this.host = host; - } - @Override @Accessor("jumping") public abstract boolean isJumping();