mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-08 06:26:43 +01:00
Add Pehkui compatibility. Closes #88
This commit is contained in:
parent
c62fe7564a
commit
ed3c0f9609
7 changed files with 95 additions and 13 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Reference in a new issue