[Fix] MixinArmorFeatureRenderer stability improvements (#36)

This commit is contained in:
Frank 2022-07-11 17:30:29 +02:00
parent 9360da1518
commit 03773ccc3f

View file

@ -63,12 +63,12 @@ public abstract class MixinArmorFeatureRenderer extends RenderLayer {
} }
@Unique @Unique
private LivingEntity storedEntity; private LivingEntity be_storedEntity;
@Unique @Unique
private EquipmentSlot storedSlot; private EquipmentSlot be_storedSlot;
@Inject(method = "render", at = @At("HEAD")) @Inject(method = "render", at = @At("HEAD"))
private void storeEntity( private void be_storeEntity(
PoseStack matrixStack, PoseStack matrixStack,
MultiBufferSource vertexConsumerProvider, MultiBufferSource vertexConsumerProvider,
int i, int i,
@ -82,11 +82,11 @@ public abstract class MixinArmorFeatureRenderer extends RenderLayer {
CallbackInfo ci CallbackInfo ci
) { ) {
// We store the living entity wearing the armor before we render // We store the living entity wearing the armor before we render
this.storedEntity = livingEntity; this.be_storedEntity = livingEntity;
} }
@Inject(method = "renderArmorPiece", at = @At("HEAD")) @Inject(method = "renderArmorPiece", at = @At("HEAD"))
private void storeSlot( private void be_storeSlot(
PoseStack matrices, PoseStack matrices,
MultiBufferSource vertexConsumers, MultiBufferSource vertexConsumers,
LivingEntity livingEntity, LivingEntity livingEntity,
@ -96,11 +96,11 @@ public abstract class MixinArmorFeatureRenderer extends RenderLayer {
CallbackInfo ci CallbackInfo ci
) { ) {
// We store the current armor slot that is rendering before we render each armor piece // We store the current armor slot that is rendering before we render each armor piece
this.storedSlot = slot; this.be_storedSlot = slot;
} }
@Inject(method = "render", at = @At("RETURN")) @Inject(method = "render", at = @At("RETURN"))
private void removeStored( private void be_removeStored(
PoseStack matrixStack, PoseStack matrixStack,
MultiBufferSource vertexConsumerProvider, MultiBufferSource vertexConsumerProvider,
int i, int i,
@ -114,29 +114,31 @@ public abstract class MixinArmorFeatureRenderer extends RenderLayer {
CallbackInfo ci CallbackInfo ci
) { ) {
// We remove the stored data after we render // We remove the stored data after we render
this.storedEntity = null; this.be_storedEntity = null;
this.storedSlot = null; this.be_storedSlot = null;
} }
@Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true) @Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true)
private void selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable<HumanoidModel<LivingEntity>> cir) { private void be_selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable<HumanoidModel<LivingEntity>> cir) {
ItemStack stack = storedEntity.getItemBySlot(slot); if (be_storedEntity != null) {
ItemStack stack = be_storedEntity.getItemBySlot(slot);
HumanoidModel<LivingEntity> defaultModel = cir.getReturnValue(); HumanoidModel<LivingEntity> defaultModel = cir.getReturnValue();
HumanoidModel<LivingEntity> model = ArmorRenderingRegistry.getArmorModel( HumanoidModel<LivingEntity> model = ArmorRenderingRegistry.getArmorModel(
storedEntity, be_storedEntity,
stack, stack,
slot, slot,
defaultModel defaultModel
); );
if (model != defaultModel) { if (model != defaultModel) {
cir.setReturnValue(model); cir.setReturnValue(model);
}
} }
} }
@Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) @Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD)
private void getArmorTexture( private void be_getArmorTexture(
ArmorItem armorItem, ArmorItem armorItem,
boolean secondLayer, /* @Nullable */ boolean secondLayer, /* @Nullable */
String suffix, String suffix,
@ -144,9 +146,9 @@ public abstract class MixinArmorFeatureRenderer extends RenderLayer {
String vanillaIdentifier String vanillaIdentifier
) { ) {
String texture = ArmorRenderingRegistry.getArmorTexture( String texture = ArmorRenderingRegistry.getArmorTexture(
storedEntity, be_storedEntity,
storedEntity.getItemBySlot(storedSlot), be_storedEntity.getItemBySlot(be_storedSlot),
storedSlot, be_storedSlot,
secondLayer, secondLayer,
suffix, suffix,
new ResourceLocation(vanillaIdentifier) new ResourceLocation(vanillaIdentifier)