Add Pehkui compatibility. Closes #88

This commit is contained in:
Sollace 2023-08-08 01:35:05 +01:00
parent c62fe7564a
commit ed3c0f9609
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
7 changed files with 95 additions and 13 deletions

View file

@ -6,6 +6,7 @@ import com.minelittlepony.client.util.render.RenderLayerUtil;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.SpellPredicate; 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.Creature;
import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.Equine;
import com.minelittlepony.unicopia.entity.ItemImpl; 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.BlockState;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.model.Model;
import net.minecraft.client.render.*; import net.minecraft.client.render.*;
import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.entity.EntityRenderDispatcher; 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.LivingEntityRenderer;
import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.render.entity.model.BipedEntityModel;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
@ -155,13 +154,22 @@ public class WorldRenderDelegate {
Entity e = ve.getAppearance(); Entity e = ve.getAppearance();
if (e != null) { 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); renderDisguise(dispatcher, ve, e, x, y, z, fireTicks, tickDelta, matrices, vertexConsumers, light);
ve.getAttachments().forEach(ee -> { ve.getAttachments().forEach(ee -> {
PehkUtil.copyScale(pony.asEntity(), ee);
Vec3d difference = ee.getPos().subtract(e.getPos()); 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); renderDisguise(dispatcher, ve, ee, x + difference.x, y + difference.y, z + difference.z, fireTicks, tickDelta, matrices, vertexConsumers, light);
PehkUtil.clearScale(ee);
}); });
afterEntityRender(pony, matrices); afterEntityRender(pony, matrices);
PehkUtil.clearScale(e);
return true; return true;
} }
return false; return false;
@ -241,12 +249,9 @@ public class WorldRenderDelegate {
@Nullable @Nullable
private BipedEntityModel<?> getBipedModel(EntityRenderDispatcher dispatcher, Entity entity) { private BipedEntityModel<?> getBipedModel(EntityRenderDispatcher dispatcher, Entity entity) {
EntityRenderer<?> renderer = dispatcher.getRenderer(entity); if (dispatcher.getRenderer(entity) instanceof LivingEntityRenderer livingRenderer
if (renderer instanceof LivingEntityRenderer) { && livingRenderer.getModel() instanceof BipedEntityModel<?> biped) {
Model m = ((LivingEntityRenderer<?, ?>) renderer).getModel(); return biped;
if (m instanceof BipedEntityModel<?>) {
return (BipedEntityModel<?>)m;
}
} }
return null; return null;
} }

View file

@ -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> T ignoreScaleFor(@Nullable Entity entity, Function<Entity, T> 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);
}
}
}

View file

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

View file

@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.FlightType;
import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.Owned; import com.minelittlepony.unicopia.Owned;
import com.minelittlepony.unicopia.ability.magic.Caster; 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.ButterflyEntity;
import com.minelittlepony.unicopia.entity.UEntityAttributes; import com.minelittlepony.unicopia.entity.UEntityAttributes;
import com.minelittlepony.unicopia.entity.collision.EntityCollisions; import com.minelittlepony.unicopia.entity.collision.EntityCollisions;
@ -245,7 +246,8 @@ public class EntityAppearance implements NbtSerialisable, PlayerDimensions.Provi
if (entity instanceof FallingBlockEntity) { if (entity instanceof FallingBlockEntity) {
return BLOCK_HEIGHT; return BLOCK_HEIGHT;
} }
return Optional.of(entity.getStandingEyeHeight());
return Optional.of(PehkUtil.ignoreScaleFor(entity, Entity::getStandingEyeHeight));
} }
return Optional.empty(); return Optional.empty();
} }
@ -255,18 +257,19 @@ public class EntityAppearance implements NbtSerialisable, PlayerDimensions.Provi
if (entity instanceof FallingBlockEntity) { if (entity instanceof FallingBlockEntity) {
return 0.9F; return 0.9F;
} }
return entity.getHeight() - 0.1F;
return PehkUtil.ignoreScaleFor(entity, Entity::getHeight) - 0.1F;
} }
return -1; return -1;
} }
public Optional<Double> getDistance(Pony player) { public Optional<Double> getDistance(Pony player) {
return EntityBehaviour.forEntity(entity).getCameraDistance(entity, player); return PehkUtil.ignoreScaleFor(entity, e -> EntityBehaviour.forEntity(e).getCameraDistance(e, player));
} }
@Override @Override
public Optional<EntityDimensions> getTargetDimensions(Pony player) { public Optional<EntityDimensions> 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() { public boolean skipsUpdate() {

View file

@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.magic.Caster; 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.duck.LivingEntityDuck;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.duck.EntityDuck; import com.minelittlepony.unicopia.entity.duck.EntityDuck;
@ -63,6 +64,7 @@ public class EntityBehaviour<T extends Entity> {
public T onCreate(T entity, EntityAppearance context, boolean wasNew) { public T onCreate(T entity, EntityAppearance context, boolean wasNew) {
entity.extinguish(); entity.extinguish();
PehkUtil.clearScale(entity);
return entity; return entity;
} }

View file

@ -1,9 +1,11 @@
package com.minelittlepony.unicopia.entity.duck; package com.minelittlepony.unicopia.entity.duck;
import com.minelittlepony.unicopia.compat.pehkui.PehkuiEntityExtensions;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.Entity.RemovalReason; import net.minecraft.entity.Entity.RemovalReason;
public interface EntityDuck extends LavaAffine { public interface EntityDuck extends LavaAffine, PehkuiEntityExtensions {
void setRemovalReason(RemovalReason reason); void setRemovalReason(RemovalReason reason);
void setVehicle(Entity vehicle); void setVehicle(Entity vehicle);

View file

@ -1,10 +1,13 @@
package com.minelittlepony.unicopia.mixin; package com.minelittlepony.unicopia.mixin;
import java.util.Map;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.minelittlepony.unicopia.entity.duck.PlayerEntityDuck; 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); get().getMotion().getDimensions().calculateActiveEyeHeight(dimensions).ifPresent(info::setReturnValue);
} }
/*
@Inject(method = "getDimensions(Lnet/minecraft/entity/EntityPose;)Lnet/minecraft/entity/EntityDimensions;", @Inject(method = "getDimensions(Lnet/minecraft/entity/EntityPose;)Lnet/minecraft/entity/EntityDimensions;",
at = @At("RETURN"), at = @At("RETURN"),
cancellable = true) cancellable = true)
private void onGetDimensions(EntityPose pose, CallbackInfoReturnable<EntityDimensions> info) { private void onGetDimensions(EntityPose pose, CallbackInfoReturnable<EntityDimensions> info) {
get().getMotion().getDimensions().calculateDimensions().ifPresent(info::setReturnValue); 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<EntityPose, EntityDimensions> 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", @Inject(method = "getBlockBreakingSpeed(Lnet/minecraft/block/BlockState;)F",