diff --git a/src/main/java/vectorwing/farmersdelight/client/event/ClientSetupEvents.java b/src/main/java/vectorwing/farmersdelight/client/event/ClientSetupEvents.java index 044fef8fa..00a4315e2 100644 --- a/src/main/java/vectorwing/farmersdelight/client/event/ClientSetupEvents.java +++ b/src/main/java/vectorwing/farmersdelight/client/event/ClientSetupEvents.java @@ -1,10 +1,14 @@ package vectorwing.farmersdelight.client.event; import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; @@ -14,6 +18,7 @@ import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import vectorwing.farmersdelight.FarmersDelight; import vectorwing.farmersdelight.client.gui.CookingPotScreen; import vectorwing.farmersdelight.client.gui.CookingPotTooltip; @@ -22,6 +27,7 @@ import vectorwing.farmersdelight.client.particle.SteamParticle; import vectorwing.farmersdelight.client.recipebook.RecipeCategories; import vectorwing.farmersdelight.client.renderer.*; +import vectorwing.farmersdelight.common.EnumParameters; import vectorwing.farmersdelight.common.item.component.ItemStackWrapper; import vectorwing.farmersdelight.common.registry.*; @@ -44,6 +50,11 @@ public static void registerClientExtensions(RegisterClientExtensionsEvent event) public @NotNull BlockEntityWithoutLevelRenderer getCustomRenderer() { return renderer; } + + @Override + public HumanoidModel.@Nullable ArmPose getArmPose(LivingEntity living, InteractionHand hand, ItemStack stack) { + return stack.has(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()) ? EnumParameters.PROXY_SKILLET_FLIP.getValue() : null; + } }, ModItems.SKILLET.get()); } @@ -82,21 +93,4 @@ public static void registerParticles(RegisterParticleProvidersEvent event) { Minecraft.getInstance().particleEngine.register(ModParticleTypes.STAR.get(), StarParticle.Factory::new); Minecraft.getInstance().particleEngine.register(ModParticleTypes.STEAM.get(), SteamParticle.Factory::new); } - -// @SubscribeEvent -// public static void onModelRegister(ModelEvent.RegisterAdditional event) { -// event.register(new ModelResourceLocation(ResourceLocation.fromNamespaceAndPath(FarmersDelight.MODID, "skillet_cooking"), "inventory")); -// } - - // TODO: I hate the skillet model so much... -// @SubscribeEvent -// public static void onModelBake(ModelEvent.ModifyBakingResult event) { -// Map modelRegistry = event.getModels(); -// -// ModelResourceLocation skilletLocation = new ModelResourceLocation(ResourceLocation.fromNamespaceAndPath(FarmersDelight.MODID, "skillet"), "inventory"); -// BakedModel skilletModel = modelRegistry.get(skilletLocation); -// ModelResourceLocation skilletCookingLocation = new ModelResourceLocation(ResourceLocation.fromNamespaceAndPath(FarmersDelight.MODID, "skillet_cooking"), "inventory"); -// BakedModel skilletCookingModel = modelRegistry.get(skilletCookingLocation); -// modelRegistry.put(skilletLocation, new SkilletModel(event.getModelBakery(), skilletModel, skilletCookingModel)); -// } } diff --git a/src/main/java/vectorwing/farmersdelight/client/event/KeybindEvents.java b/src/main/java/vectorwing/farmersdelight/client/event/KeybindEvents.java new file mode 100644 index 000000000..189bab29f --- /dev/null +++ b/src/main/java/vectorwing/farmersdelight/client/event/KeybindEvents.java @@ -0,0 +1,32 @@ +package vectorwing.farmersdelight.client.event; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.network.PacketDistributor; +import vectorwing.farmersdelight.FarmersDelight; +import vectorwing.farmersdelight.common.item.SkilletItem; +import vectorwing.farmersdelight.common.networking.ModNetworking; +import vectorwing.farmersdelight.common.registry.ModDataComponents; +import vectorwing.farmersdelight.common.registry.ModItems; + +@EventBusSubscriber(modid = FarmersDelight.MODID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) +public class KeybindEvents { + @SubscribeEvent + public static void preClientTick(ClientTickEvent.Pre event) { // Run this on pre so inputs don't get eaten up. + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player != null && player.isUsingItem()) { + ItemStack useItem = player.getUseItem(); + if (useItem.getItem() instanceof SkilletItem && !useItem.has(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get())) { + while (mc.options.keyAttack.consumeClick()) { + PacketDistributor.sendToServer(ModNetworking.FlipSkilletMessage.INSTANCE); + } + } + } + } +} diff --git a/src/main/java/vectorwing/farmersdelight/client/renderer/SkilletItemRenderer.java b/src/main/java/vectorwing/farmersdelight/client/renderer/SkilletItemRenderer.java index adcf92d54..26bbd4345 100644 --- a/src/main/java/vectorwing/farmersdelight/client/renderer/SkilletItemRenderer.java +++ b/src/main/java/vectorwing/farmersdelight/client/renderer/SkilletItemRenderer.java @@ -3,12 +3,20 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.client.IArmPoseTransformer; +import vectorwing.farmersdelight.common.item.SkilletItem; import vectorwing.farmersdelight.common.item.component.ItemStackWrapper; import vectorwing.farmersdelight.common.registry.ModDataComponents; @@ -21,37 +29,76 @@ public SkilletItemRenderer() { @Override public void renderByItem(ItemStack stack, ItemDisplayContext displayContext, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) { //render block - poseStack.pushPose(); BlockItem item = ((BlockItem) stack.getItem()); BlockState state = item.getBlock().defaultBlockState(); - Minecraft.getInstance().getBlockRenderer().renderSingleBlock(state, poseStack, buffer, packedLight, packedOverlay); - poseStack.popPose(); - ItemStackWrapper stackWrapper = stack.getOrDefault(ModDataComponents.SKILLET_INGREDIENT, ItemStackWrapper.EMPTY); + + Minecraft mc = Minecraft.getInstance(); + + ItemStackWrapper stackWrapper = stack.getOrDefault(ModDataComponents.SKILLET_INGREDIENT.get(), ItemStackWrapper.EMPTY); ItemStack ingredientStack = stackWrapper.getStack(); + float animation = 0; + if (!ingredientStack.isEmpty()) { poseStack.pushPose(); poseStack.translate(0.5, 1 / 16f, 0.5); -// long gameTime = Minecraft.getInstance().level.getGameTime(); -// long time = stack.getOrCreateTag().getLong("FlipTimeStamp"); -// if (time != 0) { -// float partialTicks = Minecraft.getInstance().getFrameTime(); -// float animation = ((gameTime - time) + partialTicks) / SkilletItem.FLIP_TIME; -// float maxH = 1; -// poseStack.translate(0, maxH * Mth.sin(animation * Mth.PI), 0); -// poseStack.mulPose(Axis.XP.rotationDegrees(360 * animation)); -// } + long gameTime = mc.level.getGameTime(); + if (stack.has(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()) && displayContext != ItemDisplayContext.GUI) { + long time = stack.get(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()); + float partialTicks = mc.getTimer().getGameTimeDeltaPartialTick(false); + animation = ((gameTime - time) + partialTicks) / SkilletItem.FLIP_TIME; + animation = Mth.clamp(animation, 0, 1); + float maxH = 0.4F; + poseStack.translate(0, maxH * Mth.sin(animation * Mth.PI), 0); + float rotationAnimation = stack.getOrDefault(ModDataComponents.SKILLET_FLIPPED.get(), false) ? animation + 1.0F : animation; + poseStack.mulPose(Axis.XP.rotationDegrees(180 * rotationAnimation)); + } else { + poseStack.mulPose(Axis.XP.rotationDegrees(stack.getOrDefault(ModDataComponents.SKILLET_FLIPPED.get(), false) ? 180 : 0)); + } poseStack.mulPose(Axis.XP.rotationDegrees(90)); poseStack.scale(0.5F, 0.5F, 0.5F); - var itemRenderer = Minecraft.getInstance().getItemRenderer(); - itemRenderer.renderStatic(ingredientStack, ItemDisplayContext.FIXED, packedLight, - packedOverlay, poseStack, buffer, null, 0); + if (displayContext != ItemDisplayContext.GUI) { + var itemRenderer = mc.getItemRenderer(); + itemRenderer.renderStatic(ingredientStack, ItemDisplayContext.FIXED, packedLight, + packedOverlay, poseStack, buffer, null, 0); + } poseStack.popPose(); } + + poseStack.pushPose(); + + if (animation != 0 && displayContext.firstPerson()) { + poseStack.translate(0, 0, 1); + poseStack.mulPose(Axis.XN.rotationDegrees(Mth.sin(animation * Mth.TWO_PI) * 15)); + poseStack.translate(0F, 0, -1); + poseStack.translate(0, 0, -Mth.sin(animation * Mth.PI) * 0.2); + } + mc.getBlockRenderer().renderSingleBlock(state, poseStack, buffer, packedLight, packedOverlay); + + poseStack.popPose(); + } + + public static class ArmPoseTransformer implements IArmPoseTransformer { + @Override + public void applyTransform(HumanoidModel model, LivingEntity entity, HumanoidArm arm) { + ItemStack stack = entity.getUseItem(); + if (stack.has(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get())) { + long time = stack.get(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()); + float partialTicks = Minecraft.getInstance().getTimer().getGameTimeDeltaPartialTick(false); + float animation = ((entity.level().getGameTime() - time) + partialTicks) / SkilletItem.FLIP_TIME; + animation = Mth.clamp(animation, 0, 1); + + if (arm == HumanoidArm.LEFT) { + model.leftArm.xRot = (-Mth.sin(animation * Mth.TWO_PI) * 15 - 20) * (float) (Math.PI / 180.0); + } else { + model.rightArm.xRot = (-Mth.sin(animation * Mth.TWO_PI) * 15 - 20) * (float) (Math.PI / 180.0); + } + } + } } } diff --git a/src/main/java/vectorwing/farmersdelight/common/EnumParameters.java b/src/main/java/vectorwing/farmersdelight/common/EnumParameters.java index 3f8ca1068..ec8c2f0dc 100644 --- a/src/main/java/vectorwing/farmersdelight/common/EnumParameters.java +++ b/src/main/java/vectorwing/farmersdelight/common/EnumParameters.java @@ -1,9 +1,14 @@ package vectorwing.farmersdelight.common; import net.minecraft.client.RecipeBookCategories; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.neoforged.fml.common.asm.enumextension.EnumProxy; +import net.neoforged.neoforge.client.IArmPoseTransformer; +import vectorwing.farmersdelight.client.renderer.SkilletItemRenderer; import vectorwing.farmersdelight.common.registry.ModItems; import java.util.List; @@ -23,4 +28,7 @@ public class EnumParameters public static final EnumProxy PROXY_COOKING_MISC = new EnumProxy<>( RecipeBookCategories.class, (Supplier>) () -> List.of(new ItemStack(ModItems.DUMPLINGS.get()), new ItemStack(ModItems.TOMATO_SAUCE.get())) ); + public static final EnumProxy PROXY_SKILLET_FLIP = new EnumProxy<>( + HumanoidModel.ArmPose.class, false, new SkilletItemRenderer.ArmPoseTransformer() + ); } diff --git a/src/main/java/vectorwing/farmersdelight/common/item/SkilletItem.java b/src/main/java/vectorwing/farmersdelight/common/item/SkilletItem.java index b9c221572..d7e07f778 100644 --- a/src/main/java/vectorwing/farmersdelight/common/item/SkilletItem.java +++ b/src/main/java/vectorwing/farmersdelight/common/item/SkilletItem.java @@ -1,8 +1,10 @@ package vectorwing.farmersdelight.common.item; import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -37,6 +39,7 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; import vectorwing.farmersdelight.FarmersDelight; +import vectorwing.farmersdelight.common.EnumParameters; import vectorwing.farmersdelight.common.block.SkilletBlock; import vectorwing.farmersdelight.common.block.entity.SkilletBlockEntity; import vectorwing.farmersdelight.common.item.component.ItemStackWrapper; @@ -44,6 +47,7 @@ import vectorwing.farmersdelight.common.registry.ModItems; import vectorwing.farmersdelight.common.registry.ModSounds; import vectorwing.farmersdelight.common.tag.ModTags; +import vectorwing.farmersdelight.common.utility.ClientRenderUtils; import vectorwing.farmersdelight.common.utility.TextUtils; import javax.annotation.Nullable; @@ -52,6 +56,8 @@ @SuppressWarnings({"deprecation", "unused"}) public class SkilletItem extends BlockItem { + public static final float FLIP_TIME = 12; + public static final Tiers SKILLET_TIER = Tiers.IRON; protected static final ResourceLocation FD_ATTACK_KNOCKBACK_UUID = ResourceLocation.fromNamespaceAndPath(FarmersDelight.MODID, "base_attack_knockback"); @@ -60,6 +66,20 @@ public SkilletItem(Block block, Item.Properties properties) { float attackDamage = 5.0F + SKILLET_TIER.getAttackDamageBonus(); } + @Override + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + if (oldStack.get(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()) + != newStack.get(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()) || + oldStack.get(ModDataComponents.COOKING_TIME_LENGTH.get()) + != newStack.get(ModDataComponents.COOKING_TIME_LENGTH.get()) || + oldStack.get(ModDataComponents.SKILLET_INGREDIENT.get()) != + newStack.get(ModDataComponents.SKILLET_INGREDIENT.get())) { + return false; + } + + return super.shouldCauseReequipAnimation(oldStack, newStack, slotChanged); + } + public static ItemAttributeModifiers createAttributes(Tier tier, float attackDamage, float attackSpeed) { return ItemAttributeModifiers.builder() .add(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_ID, attackDamage + tier.getAttackDamageBonus(), AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) @@ -166,12 +186,21 @@ public InteractionResultHolder use(Level level, Player player, Intera @Override public void onUseTick(Level level, LivingEntity entity, ItemStack stack, int count) { if (entity instanceof Player player) { - Vec3 pos = player.position(); - double x = pos.x() + 0.5D; - double y = pos.y(); - double z = pos.z() + 0.5D; - if (level.random.nextInt(50) == 0) { - level.playLocalSound(x, y, z, ModSounds.BLOCK_SKILLET_SIZZLE.get(), SoundSource.BLOCKS, 0.4F, level.random.nextFloat() * 0.2F + 0.9F, false); + if (stack.has(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get())) { + long flipTimeStamp = stack.get(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()); + long l = level.getGameTime() - flipTimeStamp; + if (l > FLIP_TIME) { + stack.remove(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()); + stack.set(ModDataComponents.SKILLET_FLIPPED.get(), !stack.getOrDefault(ModDataComponents.SKILLET_FLIPPED.get(), false)); + } else if (level.isClientSide && l == FLIP_TIME - 8) { + //why does it need to play early? idk + //plays instantly right before it lands & on client only so its instant. cant be done in statement above as that might not run fo player as stack is sent when updated + level.playSound(player, entity, ModSounds.BLOCK_SKILLET_ADD_FOOD.get(), SoundSource.PLAYERS, 0.4F, level.random.nextFloat() * 0.2F + 0.9F); + } else if (level.isClientSide && level.random.nextInt(50) == 0 && l < FLIP_TIME - 8 || l > FLIP_TIME - 3) { + level.playSound(null, entity, ModSounds.BLOCK_SKILLET_SIZZLE.get(), SoundSource.PLAYERS, 0.4F, level.random.nextFloat() * 0.2F + 0.9F); + } + } else if (level.isClientSide && level.random.nextInt(50) == 0) { + level.playSound(null, entity, ModSounds.BLOCK_SKILLET_SIZZLE.get(), SoundSource.PLAYERS, 0.4F, level.random.nextFloat() * 0.2F + 0.9F); } } } @@ -185,6 +214,8 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity entity, int player.getInventory().placeItemBackInInventory(cookingStack); stack.remove(ModDataComponents.SKILLET_INGREDIENT); stack.remove(ModDataComponents.COOKING_TIME_LENGTH); + stack.remove(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()); + stack.remove(ModDataComponents.SKILLET_FLIPPED.get()); } } } @@ -208,12 +239,35 @@ public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity enti }); stack.remove(ModDataComponents.SKILLET_INGREDIENT); stack.remove(ModDataComponents.COOKING_TIME_LENGTH); + stack.remove(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get()); + stack.remove(ModDataComponents.SKILLET_FLIPPED.get()); } } return stack; } + @Override + public int getBarWidth(ItemStack stack) { + if (stack.has(ModDataComponents.COOKING_TIME_LENGTH.get())) { + return Math.round(13.0F - (float) ClientRenderUtils.getClientPlayerHack().getUseItemRemainingTicks() * 13.0F / (float) this.getUseDuration(stack, ClientRenderUtils.getClientPlayerHack())); + } else { + return super.getBarWidth(stack); + } + } + + @Override + public int getBarColor(ItemStack stack) { + if (stack.has(ModDataComponents.COOKING_TIME_LENGTH.get())) { + return 0xFF8B4F; + } else return super.getBarColor(stack); + } + + @Override + public boolean isBarVisible(ItemStack stack) { + return super.isBarVisible(stack) || stack.has(ModDataComponents.COOKING_TIME_LENGTH.get()); + } + public static Optional> getCookingRecipe(ItemStack stack, Level level) { if (stack.isEmpty()) { return Optional.empty(); diff --git a/src/main/java/vectorwing/farmersdelight/common/networking/ModNetworking.java b/src/main/java/vectorwing/farmersdelight/common/networking/ModNetworking.java new file mode 100644 index 000000000..cb3dc8ce0 --- /dev/null +++ b/src/main/java/vectorwing/farmersdelight/common/networking/ModNetworking.java @@ -0,0 +1,48 @@ +package vectorwing.farmersdelight.common.networking; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import vectorwing.farmersdelight.FarmersDelight; +import vectorwing.farmersdelight.common.item.SkilletItem; +import vectorwing.farmersdelight.common.registry.ModDataComponents; + +@EventBusSubscriber(modid = FarmersDelight.MODID, bus = EventBusSubscriber.Bus.MOD) +public class ModNetworking { + + @SubscribeEvent + public static void registerPayloadHandlers(RegisterPayloadHandlersEvent event) { + event.registrar("1") + .playToServer(FlipSkilletMessage.TYPE, FlipSkilletMessage.STREAM_CODEC, (msg, ctx) -> msg.handle(ctx.player().getServer(), ((ServerPlayer)ctx.player()))); + } + + + public static class FlipSkilletMessage implements CustomPacketPayload { + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(FarmersDelight.MODID, "flip_skillet"); + public static final FlipSkilletMessage INSTANCE = new FlipSkilletMessage(); + public static final Type TYPE = new Type<>(ID); + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); + + public FlipSkilletMessage() { + } + + @Override + public Type type() { + return TYPE; + } + + public void handle(MinecraftServer server, ServerPlayer player) { + ItemStack stack = player.getUseItem(); + if (stack.getItem() instanceof SkilletItem) { + stack.set(ModDataComponents.SKILLET_FLIP_TIMESTAMP.get(), player.level().getGameTime()); + } + } + } +} diff --git a/src/main/java/vectorwing/farmersdelight/common/registry/ModDataComponents.java b/src/main/java/vectorwing/farmersdelight/common/registry/ModDataComponents.java index 21a61334c..052d5bcbc 100644 --- a/src/main/java/vectorwing/farmersdelight/common/registry/ModDataComponents.java +++ b/src/main/java/vectorwing/farmersdelight/common/registry/ModDataComponents.java @@ -36,6 +36,14 @@ public class ModDataComponents "skillet_ingredient", (builder) -> builder.persistent(ItemStackWrapper.CODEC).networkSynchronized(ItemStackWrapper.STREAM_CODEC).cacheEncoding() ); + public static final DeferredHolder, DataComponentType> SKILLET_FLIP_TIMESTAMP = DATA_COMPONENTS.registerComponentType( + "skillet_flip_timestamp", (builder) -> builder.persistent(Codec.LONG).networkSynchronized(ByteBufCodecs.VAR_LONG).cacheEncoding() + ); + + public static final DeferredHolder, DataComponentType> SKILLET_FLIPPED = DATA_COMPONENTS.registerComponentType( + "skillet_flipped", (builder) -> builder.persistent(Codec.BOOL).networkSynchronized(ByteBufCodecs.BOOL).cacheEncoding() + ); + // Enchantment Effects public static final DeferredHolder, DataComponentType>>> BACKSTABBING = ENCHANTMENT_EFFECT_COMPONENTS.registerComponentType( "backstabbing", builder -> builder.persistent(ConditionalEffect.codec(EnchantmentValueEffect.CODEC, LootContextParamSets.ENCHANTED_DAMAGE).listOf() diff --git a/src/main/java/vectorwing/farmersdelight/common/utility/ClientRenderUtils.java b/src/main/java/vectorwing/farmersdelight/common/utility/ClientRenderUtils.java index 925c8df77..29d7ede2b 100644 --- a/src/main/java/vectorwing/farmersdelight/common/utility/ClientRenderUtils.java +++ b/src/main/java/vectorwing/farmersdelight/common/utility/ClientRenderUtils.java @@ -1,18 +1,7 @@ package vectorwing.farmersdelight.common.utility; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.platform.Lighting; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.ItemRenderer; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.entity.player.Player; /** * Util for helping with rendering elements across the mod. @@ -22,4 +11,9 @@ public class ClientRenderUtils public static boolean isCursorInsideBounds(int iconX, int iconY, int iconWidth, int iconHeight, double cursorX, double cursorY) { return iconX <= cursorX && cursorX < iconX + iconWidth && iconY <= cursorY && cursorY < iconY + iconHeight; } + + // Necessary to make sure that the server won't load this value whilst it is in a server loaded class. + public static Player getClientPlayerHack() { + return Minecraft.getInstance().player; + } } diff --git a/src/main/resources/META-INF/enumextensions.json b/src/main/resources/META-INF/enumextensions.json index fa4ef1660..4aa7eed99 100644 --- a/src/main/resources/META-INF/enumextensions.json +++ b/src/main/resources/META-INF/enumextensions.json @@ -41,6 +41,15 @@ "class": "vectorwing/farmersdelight/common/EnumParameters", "field": "PROXY_COOKING_MISC" } + }, + { + "enum": "net/minecraft/client/model/HumanoidModel$ArmPose", + "name": "FARMERSDELIGHT_SKILLET_FLIP", + "constructor": "(ZLnet/neoforged/neoforge/client/IArmPoseTransformer;)V", + "parameters": { + "class": "vectorwing/farmersdelight/common/EnumParameters", + "field": "PROXY_SKILLET_FLIP" + } } ] } \ No newline at end of file