2024/11/22

好玩(
This commit is contained in:
叁玖领域 2024-11-22 17:50:55 +08:00
parent 00eb0e8d68
commit ce337667dc
8 changed files with 162 additions and 10 deletions

View File

@ -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(

View File

@ -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 {

View File

@ -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<T extends LivingEntity, M extends EntityModel<T>> extends RenderLayer<T, M> {
private final ItemInHandRenderer heldItemRenderer;
public ChestItemFeatureRenderer(RenderLayerParent<T, M> 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();
}
}
}
}

View File

@ -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<RecipeSerializer<?>> RECIPE_SERIALIZER =
DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, LeashedPlayer.MOD_ID);

View File

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

View File

@ -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<Boolean> cir) {
cir.setReturnValue(true);
}
}

View File

@ -20,4 +20,6 @@ public net.minecraft.world.effect.MobEffect <init>(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
public net.minecraft.world.item.alchemy.Potion name # name
#packge-private -> public
public net.minecraft.world.inventory.ArmorSlot #ArmorSlot

View File

@ -4,6 +4,7 @@
"both.MixinEntity",
"both.MixinLivingEntity",
"both.MixinPlayer",
"item.MixinArmorSlotMixin",
"item.MixinLeadItem",
"registry.MixinJukeboxSongs",
"registry.MixinPaintingVariants",