mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-03-19 01:37:11 +01:00
The bangle of comradery is now visible on your arm in first person
This commit is contained in:
parent
6f034f27fc
commit
fe831f3099
5 changed files with 103 additions and 7 deletions
|
@ -3,12 +3,14 @@ package com.minelittlepony.unicopia.client.render;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.client.model.ModelPart;
|
||||||
import net.minecraft.client.render.VertexConsumerProvider;
|
import net.minecraft.client.render.VertexConsumerProvider;
|
||||||
import net.minecraft.client.render.entity.feature.FeatureRenderer;
|
import net.minecraft.client.render.entity.feature.FeatureRenderer;
|
||||||
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
|
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
|
||||||
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;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
import net.minecraft.util.Arm;
|
||||||
|
|
||||||
public class AccessoryFeatureRenderer<
|
public class AccessoryFeatureRenderer<
|
||||||
T extends LivingEntity,
|
T extends LivingEntity,
|
||||||
|
@ -30,9 +32,11 @@ public class AccessoryFeatureRenderer<
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) {
|
public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) {
|
||||||
features.forEach(feature -> {
|
features.forEach(feature -> feature.render(matrices, vertexConsumers, light, entity, limbAngle, limbDistance, tickDelta, animationProgress, headYaw, headPitch));
|
||||||
feature.render(matrices, vertexConsumers, light, entity, limbAngle, limbDistance, tickDelta, animationProgress, headYaw, headPitch);
|
}
|
||||||
});
|
|
||||||
|
public void renderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, ModelPart arm, Arm side) {
|
||||||
|
features.forEach(feature -> feature.renderArm(matrices, vertexConsumers, light, entity, arm, side));
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface FeatureFactory<T extends LivingEntity> {
|
public interface FeatureFactory<T extends LivingEntity> {
|
||||||
|
@ -41,5 +45,15 @@ public class AccessoryFeatureRenderer<
|
||||||
|
|
||||||
public interface Feature<T extends LivingEntity> {
|
public interface Feature<T extends LivingEntity> {
|
||||||
void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch);
|
void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch);
|
||||||
|
|
||||||
|
default void renderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, ModelPart arm, Arm side) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface FeatureRoot<
|
||||||
|
T extends LivingEntity,
|
||||||
|
M extends BipedEntityModel<T>> {
|
||||||
|
AccessoryFeatureRenderer<T, M> getAccessories();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.minelittlepony.unicopia.client.render;
|
package com.minelittlepony.unicopia.client.render;
|
||||||
|
|
||||||
import com.minelittlepony.common.util.Color;
|
import com.minelittlepony.common.util.Color;
|
||||||
|
import com.minelittlepony.unicopia.client.minelittlepony.MineLPConnector;
|
||||||
import com.minelittlepony.unicopia.item.FriendshipBraceletItem;
|
import com.minelittlepony.unicopia.item.FriendshipBraceletItem;
|
||||||
import com.minelittlepony.unicopia.item.GlowableItem;
|
import com.minelittlepony.unicopia.item.GlowableItem;
|
||||||
|
|
||||||
|
@ -52,8 +53,6 @@ public class BraceletFeatureRenderer<E extends LivingEntity> implements Accessor
|
||||||
ItemStack item = entity.getEquippedStack(EquipmentSlot.CHEST);
|
ItemStack item = entity.getEquippedStack(EquipmentSlot.CHEST);
|
||||||
|
|
||||||
if (item.getItem() instanceof FriendshipBraceletItem) {
|
if (item.getItem() instanceof FriendshipBraceletItem) {
|
||||||
|
|
||||||
|
|
||||||
int j = ((DyeableItem)item.getItem()).getColor(item);
|
int j = ((DyeableItem)item.getItem()).getColor(item);
|
||||||
|
|
||||||
boolean alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getModel().startsWith("slim");
|
boolean alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getModel().startsWith("slim");
|
||||||
|
@ -77,6 +76,34 @@ public class BraceletFeatureRenderer<E extends LivingEntity> implements Accessor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void renderArm(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, E entity, ModelPart armModel, Arm side) {
|
||||||
|
ItemStack item = entity.getEquippedStack(EquipmentSlot.CHEST);
|
||||||
|
|
||||||
|
if (item.getItem() instanceof FriendshipBraceletItem) {
|
||||||
|
int j = ((DyeableItem)item.getItem()).getColor(item);
|
||||||
|
|
||||||
|
boolean alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getModel().startsWith("slim");
|
||||||
|
|
||||||
|
BraceletModel model = alex ? alexModel : steveModel;
|
||||||
|
|
||||||
|
boolean glowing = ((GlowableItem)item.getItem()).isGlowing(item);
|
||||||
|
|
||||||
|
|
||||||
|
if (!MineLPConnector.getPlayerPonyRace().isDefault()) {
|
||||||
|
stack.translate(side == Arm.LEFT ? 0.06 : -0.06, 0.3, 0);
|
||||||
|
} else {
|
||||||
|
stack.translate(0, -0.1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(TEXTURE), false, false);
|
||||||
|
|
||||||
|
model.setAngles(context.getModel());
|
||||||
|
model.setVisible(side);
|
||||||
|
model.render(stack, consumer, glowing ? 0x0F00F0 : lightUv, OverlayTexture.DEFAULT_UV, Color.r(j), Color.g(j), Color.b(j), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class BraceletModel extends Model {
|
public static class BraceletModel extends Model {
|
||||||
|
|
||||||
private final ModelPart leftArm;
|
private final ModelPart leftArm;
|
||||||
|
|
|
@ -16,12 +16,21 @@ import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
|
||||||
@Mixin(ArmorFeatureRenderer.class)
|
@Mixin(ArmorFeatureRenderer.class)
|
||||||
abstract class MixinArmorFeatureRenderer<T extends LivingEntity, M extends BipedEntityModel<T>, A extends BipedEntityModel<T>> extends FeatureRenderer<T, M> {
|
abstract class MixinArmorFeatureRenderer<
|
||||||
|
T extends LivingEntity,
|
||||||
|
M extends BipedEntityModel<T>,
|
||||||
|
A extends BipedEntityModel<T>>
|
||||||
|
extends FeatureRenderer<T, M> implements AccessoryFeatureRenderer.FeatureRoot<T, M> {
|
||||||
|
|
||||||
private AccessoryFeatureRenderer<T, M> accessories;
|
private AccessoryFeatureRenderer<T, M> accessories;
|
||||||
|
|
||||||
MixinArmorFeatureRenderer() { super(null); }
|
MixinArmorFeatureRenderer() { super(null); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessoryFeatureRenderer<T, M> getAccessories() {
|
||||||
|
return accessories;
|
||||||
|
}
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
private void onInit(FeatureRendererContext<T, M> context, A inner, A outer, CallbackInfo info) {
|
private void onInit(FeatureRendererContext<T, M> context, A inner, A outer, CallbackInfo info) {
|
||||||
accessories = new AccessoryFeatureRenderer<>(context);
|
accessories = new AccessoryFeatureRenderer<>(context);
|
||||||
|
@ -29,6 +38,6 @@ abstract class MixinArmorFeatureRenderer<T extends LivingEntity, M extends Biped
|
||||||
|
|
||||||
@Inject(method = "render", at = @At("RETURN"))
|
@Inject(method = "render", at = @At("RETURN"))
|
||||||
private void onRender(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch, CallbackInfo info) {
|
private void onRender(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch, CallbackInfo info) {
|
||||||
accessories.render(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch);
|
getAccessories().render(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.minelittlepony.unicopia.mixin.client;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.client.render.AccessoryFeatureRenderer;
|
||||||
|
import com.minelittlepony.unicopia.client.render.AccessoryFeatureRenderer.FeatureRoot;
|
||||||
|
|
||||||
|
import net.minecraft.client.model.ModelPart;
|
||||||
|
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||||
|
import net.minecraft.client.render.VertexConsumerProvider;
|
||||||
|
import net.minecraft.client.render.entity.LivingEntityRenderer;
|
||||||
|
import net.minecraft.client.render.entity.PlayerEntityRenderer;
|
||||||
|
import net.minecraft.client.render.entity.model.PlayerEntityModel;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.util.Arm;
|
||||||
|
|
||||||
|
@Mixin(PlayerEntityRenderer.class)
|
||||||
|
abstract class MixinPlayerEntityRenderer extends LivingEntityRenderer<AbstractClientPlayerEntity, PlayerEntityModel<AbstractClientPlayerEntity>> {
|
||||||
|
@Nullable
|
||||||
|
private AccessoryFeatureRenderer<AbstractClientPlayerEntity, PlayerEntityModel<AbstractClientPlayerEntity>> accessories;
|
||||||
|
|
||||||
|
MixinPlayerEntityRenderer() { super(null, null, 0); }
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private AccessoryFeatureRenderer<AbstractClientPlayerEntity, PlayerEntityModel<AbstractClientPlayerEntity>> getAccessories() {
|
||||||
|
if (accessories == null) {
|
||||||
|
accessories = features.stream()
|
||||||
|
.filter(a -> a instanceof FeatureRoot)
|
||||||
|
.map(a -> ((FeatureRoot<AbstractClientPlayerEntity, PlayerEntityModel<AbstractClientPlayerEntity>>)a).getAccessories())
|
||||||
|
.findFirst()
|
||||||
|
.orElseGet(() -> new AccessoryFeatureRenderer<>(this));
|
||||||
|
}
|
||||||
|
return accessories;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "renderArm", at = @At("RETURN"))
|
||||||
|
private void onRenderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, AbstractClientPlayerEntity player, ModelPart arm, ModelPart sleeve, CallbackInfo info) {
|
||||||
|
Arm a = this.getModel().leftArm == arm ? Arm.LEFT : Arm.RIGHT;
|
||||||
|
getAccessories().renderArm(matrices, vertexConsumers, light, player, arm, a);
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,6 +43,7 @@
|
||||||
"client.MixinKeyboardInput",
|
"client.MixinKeyboardInput",
|
||||||
"client.MixinLightmapTextureManager",
|
"client.MixinLightmapTextureManager",
|
||||||
"client.MixinMouse",
|
"client.MixinMouse",
|
||||||
|
"client.MixinPlayerEntityRenderer",
|
||||||
"client.MixinTooltipComponent",
|
"client.MixinTooltipComponent",
|
||||||
"client.MixinWorldRenderer"
|
"client.MixinWorldRenderer"
|
||||||
],
|
],
|
||||||
|
|
Loading…
Add table
Reference in a new issue