diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java index 02eb81ba..fc907b10 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java @@ -6,6 +6,7 @@ import com.minelittlepony.client.util.render.RenderLayerUtil; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; +import com.minelittlepony.unicopia.compat.pehkui.PehkUtil; import com.minelittlepony.unicopia.entity.Creature; import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.ItemImpl; @@ -18,11 +19,9 @@ import com.minelittlepony.unicopia.entity.player.Pony; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.model.Model; import net.minecraft.client.render.*; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.util.math.MatrixStack; @@ -155,13 +154,22 @@ public class WorldRenderDelegate { Entity e = ve.getAppearance(); if (e != null) { + PehkUtil.copyScale(pony.asEntity(), e); + + if (dispatcher.shouldRenderHitboxes()) { + e.setBoundingBox(pony.asEntity().getBoundingBox()); + } + renderDisguise(dispatcher, ve, e, x, y, z, fireTicks, tickDelta, matrices, vertexConsumers, light); ve.getAttachments().forEach(ee -> { + PehkUtil.copyScale(pony.asEntity(), ee); Vec3d difference = ee.getPos().subtract(e.getPos()); renderDisguise(dispatcher, ve, ee, x + difference.x, y + difference.y, z + difference.z, fireTicks, tickDelta, matrices, vertexConsumers, light); + PehkUtil.clearScale(ee); }); afterEntityRender(pony, matrices); + PehkUtil.clearScale(e); return true; } return false; @@ -241,12 +249,9 @@ public class WorldRenderDelegate { @Nullable private BipedEntityModel getBipedModel(EntityRenderDispatcher dispatcher, Entity entity) { - EntityRenderer renderer = dispatcher.getRenderer(entity); - if (renderer instanceof LivingEntityRenderer) { - Model m = ((LivingEntityRenderer) renderer).getModel(); - if (m instanceof BipedEntityModel) { - return (BipedEntityModel)m; - } + if (dispatcher.getRenderer(entity) instanceof LivingEntityRenderer livingRenderer + && livingRenderer.getModel() instanceof BipedEntityModel biped) { + return biped; } return null; } diff --git a/src/main/java/com/minelittlepony/unicopia/compat/pehkui/PehkUtil.java b/src/main/java/com/minelittlepony/unicopia/compat/pehkui/PehkUtil.java new file mode 100644 index 00000000..c68f90f4 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/compat/pehkui/PehkUtil.java @@ -0,0 +1,46 @@ +package com.minelittlepony.unicopia.compat.pehkui; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.entity.duck.EntityDuck; + +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.entity.Entity; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public interface PehkUtil { + boolean IS_LOADED = FabricLoader.getInstance().isModLoaded("pehkui"); + + static void copyScale(Entity from, @Nullable Entity to) { + if (!IS_LOADED || to == null) { + return; + } + Map toScales = ((EntityDuck)to).pehkui_getScales(); + toScales.clear(); + toScales.putAll(((EntityDuck)from).pehkui_getScales()); + } + + static void clearScale(@Nullable Entity entity) { + if (!IS_LOADED || entity == null) { + return; + } + ((EntityDuck)entity).pehkui_getScales().clear(); + } + + static T ignoreScaleFor(@Nullable Entity entity, Function action) { + if (!IS_LOADED || entity == null) { + return action.apply(entity); + } + Map scales = ((EntityDuck)entity).pehkui_getScales(); + Map copy = new HashMap<>(scales); + //scales.clear(); + try { + return action.apply(entity); + } finally { + scales.putAll(copy); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/compat/pehkui/PehkuiEntityExtensions.java b/src/main/java/com/minelittlepony/unicopia/compat/pehkui/PehkuiEntityExtensions.java new file mode 100644 index 00000000..04fc71af --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/compat/pehkui/PehkuiEntityExtensions.java @@ -0,0 +1,10 @@ +package com.minelittlepony.unicopia.compat.pehkui; + +import java.util.Map; + +public interface PehkuiEntityExtensions { + @SuppressWarnings("rawtypes") + default Map pehkui_getScales() { + return Map.of(); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java index 7724f0c9..163f52d6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java @@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.FlightType; import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.Owned; import com.minelittlepony.unicopia.ability.magic.Caster; +import com.minelittlepony.unicopia.compat.pehkui.PehkUtil; import com.minelittlepony.unicopia.entity.ButterflyEntity; import com.minelittlepony.unicopia.entity.UEntityAttributes; import com.minelittlepony.unicopia.entity.collision.EntityCollisions; @@ -245,7 +246,8 @@ public class EntityAppearance implements NbtSerialisable, PlayerDimensions.Provi if (entity instanceof FallingBlockEntity) { return BLOCK_HEIGHT; } - return Optional.of(entity.getStandingEyeHeight()); + + return Optional.of(PehkUtil.ignoreScaleFor(entity, Entity::getStandingEyeHeight)); } return Optional.empty(); } @@ -255,18 +257,19 @@ public class EntityAppearance implements NbtSerialisable, PlayerDimensions.Provi if (entity instanceof FallingBlockEntity) { return 0.9F; } - return entity.getHeight() - 0.1F; + + return PehkUtil.ignoreScaleFor(entity, Entity::getHeight) - 0.1F; } return -1; } public Optional getDistance(Pony player) { - return EntityBehaviour.forEntity(entity).getCameraDistance(entity, player); + return PehkUtil.ignoreScaleFor(entity, e -> EntityBehaviour.forEntity(e).getCameraDistance(e, player)); } @Override public Optional getTargetDimensions(Pony player) { - return dimensions = EntityBehaviour.forEntity(entity).getDimensions(entity, dimensions); + return dimensions = PehkUtil.ignoreScaleFor(entity, e -> EntityBehaviour.forEntity(e).getDimensions(e, dimensions)); } public boolean skipsUpdate() { 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 7024f9aa..ef61951a 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.magic.Caster; +import com.minelittlepony.unicopia.compat.pehkui.PehkUtil; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.duck.EntityDuck; @@ -63,6 +64,7 @@ public class EntityBehaviour { public T onCreate(T entity, EntityAppearance context, boolean wasNew) { entity.extinguish(); + PehkUtil.clearScale(entity); return entity; } 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 a8ab9fc8..f0633cad 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java @@ -1,9 +1,11 @@ package com.minelittlepony.unicopia.entity.duck; +import com.minelittlepony.unicopia.compat.pehkui.PehkuiEntityExtensions; + import net.minecraft.entity.Entity; import net.minecraft.entity.Entity.RemovalReason; -public interface EntityDuck extends LavaAffine { +public interface EntityDuck extends LavaAffine, PehkuiEntityExtensions { void setRemovalReason(RemovalReason reason); void setVehicle(Entity vehicle); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java index 144078f2..9d96e9c1 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java @@ -1,10 +1,13 @@ package com.minelittlepony.unicopia.mixin; +import java.util.Map; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.entity.duck.PlayerEntityDuck; @@ -87,11 +90,22 @@ abstract class MixinPlayerEntity extends LivingEntity implements Equine.Containe get().getMotion().getDimensions().calculateActiveEyeHeight(dimensions).ifPresent(info::setReturnValue); } + /* @Inject(method = "getDimensions(Lnet/minecraft/entity/EntityPose;)Lnet/minecraft/entity/EntityDimensions;", at = @At("RETURN"), cancellable = true) private void onGetDimensions(EntityPose pose, CallbackInfoReturnable info) { get().getMotion().getDimensions().calculateDimensions().ifPresent(info::setReturnValue); + }*/ + + @Redirect(method = "getDimensions(Lnet/minecraft/entity/EntityPose;)Lnet/minecraft/entity/EntityDimensions;", + at = @At( + value = "INVOKE", + target = "Ljava/util/Map;getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", + remap = false + )) + private Object redirect_onGetDimensions(Map self, Object key, Object def) { + return get().getMotion().getDimensions().calculateDimensions().orElse(self.getOrDefault((EntityPose)key, (EntityDimensions)def)); } @Inject(method = "getBlockBreakingSpeed(Lnet/minecraft/block/BlockState;)F",