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.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;
}

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.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<Double> getDistance(Pony player) {
return EntityBehaviour.forEntity(entity).getCameraDistance(entity, player);
return PehkUtil.ignoreScaleFor(entity, e -> EntityBehaviour.forEntity(e).getCameraDistance(e, player));
}
@Override
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() {

View file

@ -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<T extends Entity> {
public T onCreate(T entity, EntityAppearance context, boolean wasNew) {
entity.extinguish();
PehkUtil.clearScale(entity);
return entity;
}

View file

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

View file

@ -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<EntityDimensions> 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<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",