From ce337667dcefbe4d687ef022110bbd85eac5213e Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Fri, 22 Nov 2024 17:50:55 +0800 Subject: [PATCH] =?UTF-8?q?2024/11/22=20=E5=A5=BD=E7=8E=A9=EF=BC=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leashedplayer/ClientEventHandler.java | 23 ++++ .../leashedplayer/CommonEventHandler.java | 6 - .../entities/ChestItemFeatureRenderer.java | 115 ++++++++++++++++++ .../items/repcipe/ModRecipeRegister.java | 2 - .../content/items/type/LeadBreakerItem.java | 5 +- .../mixin/item/MixinArmorSlotMixin.java | 16 +++ .../resources/META-INF/accesstransformer.cfg | 4 +- src/main/resources/leashedplayer.mixins.json | 1 + 8 files changed, 162 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/renders/entities/ChestItemFeatureRenderer.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinArmorSlotMixin.java diff --git a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java index 22b22e3..310d186 100644 --- a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java @@ -1,15 +1,23 @@ package com.r3944realms.leashedplayer; +import com.r3944realms.leashedplayer.client.renders.entities.ChestItemFeatureRenderer; import com.r3944realms.leashedplayer.client.renders.entities.KidPlayerRenderer; import com.r3944realms.leashedplayer.client.renders.entities.LeashRopeArrowRenderer; import com.r3944realms.leashedplayer.client.renders.entities.SpectralLeashRopeArrowRenderer; import com.r3944realms.leashedplayer.content.entities.ModEntityRegister; import com.r3944realms.leashedplayer.content.items.ModItemRegister; import com.r3944realms.leashedplayer.content.items.type.ILeashRopeArrow; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.client.resources.PlayerSkin; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.component.ChargedProjectiles; @@ -43,6 +51,21 @@ public class ClientEventHandler { event.registerEntityRenderer(ModEntityRegister.SPECTRAL_LEASH_ROPE_ARROW.get(), SpectralLeashRopeArrowRenderer::new); event.registerEntityRenderer(ModEntityRegister.KID.get(), KidPlayerRenderer::create); } + + @SubscribeEvent + public static void onAddLayers(EntityRenderersEvent.AddLayers event) { + + PlayerRenderer renderer = event.getSkin(PlayerSkin.Model.WIDE); + if (renderer instanceof PlayerRenderer playerRenderer) { + playerRenderer.addLayer(new ChestItemFeatureRenderer<>(playerRenderer, event.getContext().getItemInHandRenderer())); + } + + PlayerRenderer slimRenderer = event.getSkin(PlayerSkin.Model.SLIM); + if (slimRenderer instanceof PlayerRenderer slimPlayerRenderer) { + slimPlayerRenderer.addLayer(new ChestItemFeatureRenderer<>(slimPlayerRenderer, event.getContext().getItemInHandRenderer())); + } + } + @SubscribeEvent public static void onRegisterItemColorHandlers(RegisterColorHandlersEvent.Item event) { event.register( diff --git a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java index 1ad3a00..d2406a6 100644 --- a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java @@ -11,14 +11,12 @@ import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow; import com.r3944realms.leashedplayer.content.entities.LittlePlayer; import com.r3944realms.leashedplayer.content.entities.ModEntityRegister; import com.r3944realms.leashedplayer.content.items.ModItemRegister; -import com.r3944realms.leashedplayer.content.items.repcipe.TippedLeashRopeArrowRecipe; import com.r3944realms.leashedplayer.content.misc.LeadBreakItemBehavior; import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; import com.r3944realms.leashedplayer.utils.Util; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.tags.ItemTags; import net.minecraft.world.effect.MobEffectInstance; @@ -27,13 +25,10 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.Leashable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Fox; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.PotionBrewing; import net.minecraft.world.item.alchemy.Potions; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.DispenserBlock; import net.neoforged.bus.api.SubscribeEvent; @@ -44,7 +39,6 @@ import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.event.tick.EntityTickEvent; -import net.neoforged.neoforge.registries.RegisterEvent; public class CommonEventHandler { diff --git a/src/main/java/com/r3944realms/leashedplayer/client/renders/entities/ChestItemFeatureRenderer.java b/src/main/java/com/r3944realms/leashedplayer/client/renders/entities/ChestItemFeatureRenderer.java new file mode 100644 index 0000000..a6b1507 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/renders/entities/ChestItemFeatureRenderer.java @@ -0,0 +1,115 @@ +package com.r3944realms.leashedplayer.client.renders.entities; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class ChestItemFeatureRenderer> extends RenderLayer { + + private final ItemInHandRenderer heldItemRenderer; + + public ChestItemFeatureRenderer(RenderLayerParent context, ItemInHandRenderer heldItemRenderer) { + super(context); + this.heldItemRenderer = heldItemRenderer; + } + + @Override + public void render(@NotNull PoseStack matrices, @NotNull MultiBufferSource vertexConsumers, int light, @NotNull T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + ItemDisplayContext mode = ItemDisplayContext.FIXED; + ItemStack chestStack = entity.getItemBySlot(EquipmentSlot.CHEST); + if (!chestStack.isEmpty()) { + if (!(entity.getEquipmentSlotForItem(chestStack).equals(EquipmentSlot.CHEST))) { + matrices.pushPose(); + ((PlayerModel) this.getParentModel()).body.translateAndRotate(matrices); + matrices.mulPose(Axis.XP.rotationDegrees(180)); + matrices.translate(0, -1 / 4f, 0); + matrices.mulPose(Axis.YP.rotationDegrees(180)); + this.heldItemRenderer.renderItem((LivingEntity) entity, chestStack, mode, false, matrices, vertexConsumers, light); + matrices.scale(1.01f, 1.01f, 1.01f); + matrices.translate(0, -1 / 4f, 0); + this.heldItemRenderer.renderItem((LivingEntity) entity, chestStack, mode, false, matrices, vertexConsumers, light); + matrices.popPose(); + matrices.pushPose(); + ((PlayerModel) this.getParentModel()).rightArm.translateAndRotate(matrices); + matrices.mulPose(Axis.XP.rotationDegrees(180)); + matrices.scale(2/3f, 2/3f, 2/3f); + matrices.translate(-1/12f, 0, 0); + matrices.mulPose(Axis.YP.rotationDegrees(180)); + this.heldItemRenderer.renderItem((LivingEntity) entity, chestStack, mode, false, matrices, vertexConsumers, light); + matrices.scale(0.99f, 0.99f, 0.99f); + matrices.translate(0, -1/2f, 0); + this.heldItemRenderer.renderItem((LivingEntity) entity, chestStack, mode, false, matrices, vertexConsumers, light); + matrices.popPose(); + matrices.pushPose(); + ((PlayerModel) this.getParentModel()).leftArm.translateAndRotate(matrices); + matrices.mulPose(Axis.XP.rotationDegrees(180)); + matrices.scale(2/3f, 2/3f, 2/3f); + matrices.translate(1/12f, 0, 0); + matrices.mulPose(Axis.YP.rotationDegrees(180)); + this.heldItemRenderer.renderItem((LivingEntity) entity, chestStack, mode, false, matrices, vertexConsumers, light); + matrices.scale(0.99f, 0.99f, 0.99f); + matrices.translate(0, -1/2f, 0); + this.heldItemRenderer.renderItem((LivingEntity) entity, chestStack, mode, false, matrices, vertexConsumers, light); + matrices.popPose(); + } + } + ItemStack legsStack = ((LivingEntity) entity).getItemBySlot(EquipmentSlot.LEGS); + if (!legsStack.isEmpty()) { + if (!(entity.getEquipmentSlotForItem(legsStack).equals(EquipmentSlot.LEGS))) { + matrices.pushPose(); + ((PlayerModel) this.getParentModel()).rightLeg.translateAndRotate(matrices); + matrices.mulPose(Axis.XP.rotationDegrees(180)); + matrices.scale(2/3f, 2/3f, 2/3f); + matrices.translate(0, -1/6f, 0); + matrices.mulPose(Axis.YP.rotationDegrees(180)); + this.heldItemRenderer.renderItem((LivingEntity) entity, legsStack, mode, false, matrices, vertexConsumers, light); + matrices.scale(1.01f, 1.01f, 1.01f); + matrices.translate(0, -1/3f, 0); + this.heldItemRenderer.renderItem((LivingEntity) entity, legsStack, mode, false, matrices, vertexConsumers, light); + matrices.popPose(); + matrices.pushPose(); + ((PlayerModel) this.getParentModel()).leftLeg.translateAndRotate(matrices); + matrices.mulPose(Axis.XP.rotationDegrees(180)); + matrices.scale(2/3f, 2/3f, 2/3f); + matrices.translate(0, -1/6f, 0); + matrices.mulPose(Axis.YP.rotationDegrees(180)); + this.heldItemRenderer.renderItem((LivingEntity) entity, legsStack, mode, false, matrices, vertexConsumers, light); + matrices.scale(1.01f, 1.01f, 1.01f); + matrices.translate(0, -1/3f, 0); + this.heldItemRenderer.renderItem((LivingEntity) entity, legsStack, mode, false, matrices, vertexConsumers, light); + matrices.popPose(); + } + } + ItemStack feetStack = ((LivingEntity) entity).getItemBySlot(EquipmentSlot.FEET); + if (!feetStack.isEmpty()) { + if (!(entity.getEquipmentSlotForItem(feetStack).equals(EquipmentSlot.FEET))) { + matrices.pushPose(); + ((PlayerModel) this.getParentModel()).rightLeg.translateAndRotate(matrices); + matrices.mulPose(Axis.XP.rotationDegrees(180)); + matrices.scale(0.75f, 0.75f, 0.75f); + matrices.translate(0, -0.8f, 0); + matrices.mulPose(Axis.YP.rotationDegrees(180)); + this.heldItemRenderer.renderItem((LivingEntity) entity, feetStack, mode, false, matrices, vertexConsumers, light); + matrices.popPose(); + matrices.pushPose(); + ((PlayerModel) this.getParentModel()).leftLeg.translateAndRotate(matrices); + matrices.mulPose(Axis.XP.rotationDegrees(180)); + matrices.scale(0.75f, 0.75f, 0.75f); + matrices.translate(0, -0.8f, 0); + matrices.mulPose(Axis.YP.rotationDegrees(180)); + this.heldItemRenderer.renderItem((LivingEntity) entity, feetStack, mode, false, matrices, vertexConsumers, light); + matrices.popPose(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/repcipe/ModRecipeRegister.java b/src/main/java/com/r3944realms/leashedplayer/content/items/repcipe/ModRecipeRegister.java index b5b0fcb..4439324 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/items/repcipe/ModRecipeRegister.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/repcipe/ModRecipeRegister.java @@ -8,8 +8,6 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import java.util.function.Supplier; - public class ModRecipeRegister { public static final DeferredRegister> RECIPE_SERIALIZER = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, LeashedPlayer.MOD_ID); diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/type/LeadBreakerItem.java b/src/main/java/com/r3944realms/leashedplayer/content/items/type/LeadBreakerItem.java index 3472d5d..2bcc7a8 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/items/type/LeadBreakerItem.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/type/LeadBreakerItem.java @@ -11,7 +11,10 @@ import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.Leashable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.*; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShearsItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.Tool; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinArmorSlotMixin.java b/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinArmorSlotMixin.java new file mode 100644 index 0000000..ce9d211 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinArmorSlotMixin.java @@ -0,0 +1,16 @@ +package com.r3944realms.leashedplayer.mixin.item; + +import net.minecraft.world.inventory.ArmorSlot; +import net.minecraft.world.item.ItemStack; +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.CallbackInfoReturnable; + +@Mixin(ArmorSlot.class) +public class MixinArmorSlotMixin { + @Inject(method = "mayPlace", at = @At("RETURN"), cancellable = true) + public void allowItemEquipping(ItemStack stack, CallbackInfoReturnable cir) { + cir.setReturnValue(true); + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index c8f2077..13d0ff5 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -20,4 +20,6 @@ public net.minecraft.world.effect.MobEffect (Lnet/minecraft/world/effect/M protected net.minecraft.world.entity.projectile.Projectile cachedOwner # cachedOwner protected net.minecraft.world.entity.projectile.Projectile ownerUUID # ownerUUID #private -> public -public net.minecraft.world.item.alchemy.Potion name # name \ No newline at end of file +public net.minecraft.world.item.alchemy.Potion name # name +#packge-private -> public +public net.minecraft.world.inventory.ArmorSlot #ArmorSlot \ No newline at end of file diff --git a/src/main/resources/leashedplayer.mixins.json b/src/main/resources/leashedplayer.mixins.json index 5579e47..3632864 100644 --- a/src/main/resources/leashedplayer.mixins.json +++ b/src/main/resources/leashedplayer.mixins.json @@ -4,6 +4,7 @@ "both.MixinEntity", "both.MixinLivingEntity", "both.MixinPlayer", + "item.MixinArmorSlotMixin", "item.MixinLeadItem", "registry.MixinJukeboxSongs", "registry.MixinPaintingVariants",