Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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.*;

Expand All @@ -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());
}

Expand Down Expand Up @@ -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<ModelResourceLocation, BakedModel> 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));
// }
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -23,4 +28,7 @@ public class EnumParameters
public static final EnumProxy<RecipeBookCategories> PROXY_COOKING_MISC = new EnumProxy<>(
RecipeBookCategories.class, (Supplier<List<ItemStack>>) () -> List.of(new ItemStack(ModItems.DUMPLINGS.get()), new ItemStack(ModItems.TOMATO_SAUCE.get()))
);
public static final EnumProxy<HumanoidModel.ArmPose> PROXY_SKILLET_FLIP = new EnumProxy<>(
HumanoidModel.ArmPose.class, false, new SkilletItemRenderer.ArmPoseTransformer()
);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -37,13 +39,15 @@
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;
import vectorwing.farmersdelight.common.registry.ModDataComponents;
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;
Expand All @@ -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");

Expand All @@ -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)
Expand Down Expand Up @@ -166,12 +186,21 @@ public InteractionResultHolder<ItemStack> 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);
}
}
}
Expand All @@ -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());
}
}
}
Expand All @@ -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<RecipeHolder<CampfireCookingRecipe>> getCookingRecipe(ItemStack stack, Level level) {
if (stack.isEmpty()) {
return Optional.empty();
Expand Down
Loading