diff --git a/src/main/java/net/anawesomguy/carnivalfoods/block/CottonCandyMachineBlock.java b/src/main/java/net/anawesomguy/carnivalfoods/block/CottonCandyMachineBlock.java index c9f0d00..4046f7f 100644 --- a/src/main/java/net/anawesomguy/carnivalfoods/block/CottonCandyMachineBlock.java +++ b/src/main/java/net/anawesomguy/carnivalfoods/block/CottonCandyMachineBlock.java @@ -7,15 +7,15 @@ import net.minecraft.block.BlockWithEntity; import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.ChestBlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandler; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.ItemActionResult; +import net.minecraft.util.ItemScatterer; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.ArrayVoxelShape; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; @@ -23,16 +23,24 @@ import org.jetbrains.annotations.Nullable; public class CottonCandyMachineBlock extends BlockWithEntity { + public static final int START_SPIN_TIME = 22; + public static final int TIME_TO_MAKE_ONE_LAYER = 28; + public static final int TOTAL_TIME = START_SPIN_TIME + 3 * TIME_TO_MAKE_ONE_LAYER; + protected static final VoxelShape SHAPE = VoxelShapes.union( - createCuboidShape(1, 0, 1, 15, 1, 15), // base - createCuboidShape(0.5, 0, 1, 1.5, 2.5, 15), // outer lower - createCuboidShape(13.5, 0, 1, 15.5, 2.5, 15), - createCuboidShape(1, 0, 0.5, 15, 2.5, 1.5), - createCuboidShape(1, 0, 13.5, 15, 2.5, 15.5), - createCuboidShape(0.1, 2.5, 1, 1.1, 5, 15), // outer upper - createCuboidShape(14.9, 2.5, 1, 15.9, 5, 15), - createCuboidShape(0.1, 2.5, 1, 1.1, 5, 15), - createCuboidShape(1, 2.5, 14.9, 15, 5, 15.9) + createCuboidShape(1, 1, 1, 15, 2, 15), // base + createCuboidShape(2, 0, 2, 4, 2, 4), // feet + createCuboidShape(2, 0, 12, 4, 2, 14), + createCuboidShape(12, 0, 2, 14, 2, 4), + createCuboidShape(12, 0, 12, 14, 2, 14), + createCuboidShape(0.8, 1, 1, 1.8, 3.5, 15), // outer lower + createCuboidShape(14.2, 1, 1, 15.2, 3.5, 15), + createCuboidShape(1, 1, 0.8, 15, 3.5, 1.8), + createCuboidShape(1, 1, 14.2, 15, 3.5, 15.2), + createCuboidShape(0.2 , 3.5, 1, 1.2, 6, 15), // outer upper + createCuboidShape(14.8, 3.5, 1, 15.8, 6, 15), + createCuboidShape(1, 3.5, 0.2, 15, 6, 1.2), + createCuboidShape(1, 3.5, 14.8, 15, 6, 15.8) ); public CottonCandyMachineBlock(Settings settings) { @@ -56,21 +64,31 @@ protected BlockRenderType getRenderType(BlockState state) { @Override protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { - if (world.isClient) + if (world.isClient || !player.getMainHandStack().isEmpty()) return ActionResult.PASS; - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof CottonCandyMachineBlockEntity machine) { - for (int i = 0; i < 17; i++) { - } - } + if (world.getBlockEntity(pos) instanceof CottonCandyMachineBlockEntity machine) + for (int i = 0; i < 17; i++) + if (!machine.getStack(i).isEmpty()) + player.getInventory().offerOrDrop(machine.removeStack(i)); return ActionResult.SUCCESS; } @Override - protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - return super.onUseWithItem(stack, state, world, pos, player, hand, hit); + protected void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { + ItemScatterer.onStateReplaced(state, newState, world, pos); + super.onStateReplaced(state, world, pos, newState, moved); + } + + @Override + protected boolean hasComparatorOutput(BlockState state) { + return true; + } + + @Override + protected int getComparatorOutput(BlockState state, World world, BlockPos pos) { + return ScreenHandler.calculateComparatorOutput(world.getBlockEntity(pos)); } @Override diff --git a/src/main/java/net/anawesomguy/carnivalfoods/block/entity/CottonCandyMachineBlockEntity.java b/src/main/java/net/anawesomguy/carnivalfoods/block/entity/CottonCandyMachineBlockEntity.java index 9fac015..b54dda7 100644 --- a/src/main/java/net/anawesomguy/carnivalfoods/block/entity/CottonCandyMachineBlockEntity.java +++ b/src/main/java/net/anawesomguy/carnivalfoods/block/entity/CottonCandyMachineBlockEntity.java @@ -1,20 +1,22 @@ package net.anawesomguy.carnivalfoods.block.entity; import net.anawesomguy.carnivalfoods.CarnivalFoods; -import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.DyedColorComponent; +import net.minecraft.inventory.Inventories; import net.minecraft.item.DyeItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ColorHelper.Argb; -import net.minecraft.util.math.MathHelper; import org.apache.commons.lang3.math.NumberUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,7 +29,6 @@ public class CottonCandyMachineBlockEntity extends BlockEntity implements BasicI protected final DefaultedList items = DefaultedList.ofSize(17, ItemStack.EMPTY); // 0-15 is dyes, 16 is sugar - public final InventoryStorage inventoryWrapper = InventoryStorage.of(this, null); public CottonCandyMachineBlockEntity(BlockPos pos, BlockState state) { super(TYPE, pos, state); @@ -49,6 +50,22 @@ public boolean isValid(int slot, ItemStack stack) { return item instanceof DyeItem || (item == Items.SUGAR && slot == 16); } + @Override + protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { + super.readNbt(nbt, registryLookup); + Inventories.readNbt(nbt, items, registryLookup); + } + + @Override + protected void writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { + super.writeNbt(nbt, registryLookup); + Inventories.writeNbt(nbt, items, registryLookup); + } + + @Override protected void addComponents(ComponentMap.Builder componentMapBuilder) { + super.addComponents(componentMapBuilder); + } + @Nullable public ItemStack craft(ItemStack stack) { int reds = 0, greens = 0, blues = 0, i = 0, count = 0; @@ -79,14 +96,14 @@ public ItemStack craft(ItemStack stack) { green = (int)((float)green * f / g); blue = (int)((float)blue * f / g); stack = stack.copyComponentsToNewStack(CarnivalFoods.COTTON_CANDY, 1); - stack.setDamage(3 - MathHelper.clamp(sugars, 1, 3)); + stack.setDamage(3 - Math.clamp(sugars, 1, 3)); stack.set(DataComponentTypes.DYED_COLOR, new DyedColorComponent(Argb.getArgb(red, green, blue), false)); return stack; } private ItemStack setCottonCandy(ItemStack stack, int sugars) { stack = stack.copyComponentsToNewStack(CarnivalFoods.COTTON_CANDY, 1); - stack.setDamage(3 - MathHelper.clamp(sugars, 1, 3)); + stack.setDamage(3 - Math.clamp(sugars, 1, 3)); return stack; } } diff --git a/src/main/java/net/anawesomguy/carnivalfoods/client/CarnivalFoodsClient.java b/src/main/java/net/anawesomguy/carnivalfoods/client/CarnivalFoodsClient.java index d92dfb0..fc5f3c0 100644 --- a/src/main/java/net/anawesomguy/carnivalfoods/client/CarnivalFoodsClient.java +++ b/src/main/java/net/anawesomguy/carnivalfoods/client/CarnivalFoodsClient.java @@ -9,7 +9,6 @@ import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; import net.minecraft.client.item.ModelPredicateProviderRegistry; import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; -import net.minecraft.client.util.ModelIdentifier; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.DyedColorComponent; import net.minecraft.item.Item; @@ -22,11 +21,10 @@ import java.util.WeakHashMap; public final class CarnivalFoodsClient implements ClientModInitializer { - private static final Map HELD_ITEMS_PRIVATE = new WeakHashMap<>(); - public static final Map HELD_ITEM_MODELS = Collections.unmodifiableMap(HELD_ITEMS_PRIVATE); - public static final Identifier COTTON_CANDY_HELD = CarnivalFoods.id("item/cotton_candy_held"); + private static final Map HELD_ITEMS_PRIVATE = new WeakHashMap<>(); + public static final Map HELD_ITEM_MODELS = Collections.unmodifiableMap(HELD_ITEMS_PRIVATE); - public static void addHeldItemModel(Item item, ModelIdentifier modelIdentifier) { + public static void addHeldItemModel(Item item, Identifier modelIdentifier) { HELD_ITEMS_PRIVATE.put(Objects.requireNonNull(item), modelIdentifier); } @@ -41,10 +39,10 @@ public void onInitializeClient() { return ColorHelper.Argb.withAlpha(99, color.rgb()); return -1; }, CarnivalFoods.COTTON_CANDY); - ModelLoadingPlugin.register(pluginContext -> pluginContext.addModels(COTTON_CANDY_HELD)); + ModelLoadingPlugin.register(pluginContext -> pluginContext.addModels(HELD_ITEMS_PRIVATE.values())); } static { - addHeldItemModel(CarnivalFoods.COTTON_CANDY, ModelIdentifier.ofInventoryVariant(COTTON_CANDY_HELD)); + addHeldItemModel(CarnivalFoods.COTTON_CANDY, CarnivalFoods.id("item/cotton_candy_held")); } } diff --git a/src/main/java/net/anawesomguy/carnivalfoods/client/render/CottonCandyMachineRenderer.java b/src/main/java/net/anawesomguy/carnivalfoods/client/render/CottonCandyMachineRenderer.java index 8d1b610..689b148 100644 --- a/src/main/java/net/anawesomguy/carnivalfoods/client/render/CottonCandyMachineRenderer.java +++ b/src/main/java/net/anawesomguy/carnivalfoods/client/render/CottonCandyMachineRenderer.java @@ -20,8 +20,8 @@ import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.world.World; +import static net.minecraft.client.model.ModelPartBuilder.create; import static net.minecraft.util.math.MathHelper.HALF_PI; import static net.minecraft.util.math.MathHelper.PI; @@ -43,38 +43,44 @@ public CottonCandyMachineRenderer(BlockEntityRendererFactory.Context ctx) { public static TexturedModelData createBodyLayer() { ModelData modelData = new ModelData(); ModelPartData data = modelData.getRoot(); - Dilation dilation = new Dilation(-0.25F); - ModelPartBuilder outer = ModelPartBuilder.create().uv(0, 8).cuboid(-7, -6.2F, -6.89F, 14, 5F, 1F); - ModelPartBuilder inner1 = ModelPartBuilder.create().uv(14, 0).cuboid(-1.5F, -3.8F, 3F, 3F, 5F, 1F, new Dilation(-0.2F)); - ModelPartBuilder inner2 = ModelPartBuilder.create().cuboid(-4, -4.1F, -1.5F, 1F, 5F, 3F, dilation); - ModelPartBuilder inner3 = ModelPartBuilder.create().cuboid(3, -4.1F, -1.5F, 1F, 5F, 3F, dilation); + Dilation dilation1 = new Dilation(-0.01F); + Dilation dilation2 = new Dilation(-0.25F); + ModelPartBuilder + outer = create().uv(0, 8).cuboid(-7F, 2F, -6.8F, 14F, 5F, 1F), // north, east, west + inner1 = create().uv(14, 0).cuboid(-1.5F, -0.2F, 3.3F, 3F, 5F, 1F, new Dilation(-0.2F)), // nesw + inner2 = create().cuboid(-4.2F, 0.1F, -1.35F, 1F, 5F, 3F, dilation2).mirrored(), // northeast, southeast + inner3 = create().cuboid(3.2F, 0.1F, -1.65F, 1F, 5F, 3F, dilation2); // northwest, southwest - ModelPartData base = data.addChild("base", ModelPartBuilder.create().uv(-14, 14).cuboid(-7F, -1F, -7F, 14F, 1F, 14F), ModelTransform.pivot(0F, 24F, 0F)); - base.addChild("outerN", outer, ModelTransform.rotation(PI / 18, 0F, 0F)); - base.addChild("outerS", ModelPartBuilder.create().uv(0, 8).cuboid(-7, -6.2F, 5.89F, 14, 5F, 1F), ModelTransform.rotation(-PI / 18, 0F, 0F)); - base.addChild("outerE", outer, ModelTransform.rotation(PI / 18, HALF_PI, 0F)); - base.addChild("outerW", outer, ModelTransform.rotation(PI / 18, -HALF_PI, 0F)); - base.addChild("innerN", inner1, ModelTransform.rotation(-PI / 1.125F, PI / 180F * 35F, PI)); - base.addChild("innerS", inner1, ModelTransform.rotation(PI / 9, -PI / 36F * 7F, 0F)); + ModelPartData base = data.addChild("base", + create().uv(-14, 14).cuboid(-7F, 1F, -7F, 14F, 1F, 14F, new Dilation(0.01F)) + .uv(19, 4).cuboid(-6F, 0F, -6F, 2F, 2F, 2F, dilation1) + .uv(19, 4).cuboid(-6F, 0F, 4F, 2F, 2F, 2F, dilation1) + .uv(19, 4).cuboid(4F, 0F, 4F, 2F, 2F, 2F, dilation1) + .uv(19, 4).cuboid(4F, 0F, -6F, 2F, 2F, 2F, dilation1), + ModelTransform.NONE); + base.addChild("outerN", outer, ModelTransform.rotation(PI / 180 * 7.8F, 0F, 0F)); + base.addChild("outerS", create().uv(0, 8).cuboid(-7F, 2F, 5.8F, 14F, 5F, 1F), ModelTransform.rotation(-PI / 180 * 7.8F, 0F, 0F)); + base.addChild("outerE", outer.mirrored(), ModelTransform.rotation(PI / 180 * 7.8F, HALF_PI, 0F)); + base.addChild("outerW", outer, ModelTransform.rotation(PI / 180 * 7.8F, -HALF_PI, 0F)); base.addChild("innerE", inner1, ModelTransform.rotation(-PI / 1.125F, -PI / 36F * 11F, PI)); base.addChild("innerW", inner1, ModelTransform.rotation(PI / 9, PI / 36F * 11F, 0F)); - base.addChild("innerNE", inner2, ModelTransform.rotation(-0.9727F, -1.2573F, 0.9958F)); - base.addChild("innerSE", inner2, ModelTransform.rotation(0.0456F, 0.1685F, 0.2657F)); - base.addChild("innerNW", inner3, ModelTransform.rotation(-0.0456F, 0.1685F, -0.2657F)); - base.addChild("innerSW", inner3, ModelTransform.rotation(0.9727F, -1.2573F, -0.9958F)); + base.addChild("innerN", inner1.mirrored(), ModelTransform.rotation(-PI / 1.125F, PI / 36F * 7F, PI)); + base.addChild("innerS", inner1, ModelTransform.rotation(PI / 9, -PI / 36F * 7F, 0F)); + base.addChild("innerNE", inner2, ModelTransform.rotation(-1.0601F, -1.2728F, 1.0791F)); + base.addChild("innerSE", inner2, ModelTransform.rotation(0.0375F, 0.1391F, 0.2644F)); + base.addChild("innerNW", inner3, ModelTransform.rotation(-0.0364F, 0.1348F, -0.2643F)); + base.addChild("innerSW", inner3, ModelTransform.rotation(1.0601F, -1.2728F, -1.0791F)); - data.addChild("spinning", ModelPartBuilder.create().uv(8, 0).cuboid(-1, -4.3F, -0.5F, 2F, 4F, 1), ModelTransform.rotation(0F, -PI / 8.6F, 0F)); + data.addChild("spinning", create().uv(8, 0).cuboid(-1F, 1.3F, -0.5F, 2F, 4F, 1F), ModelTransform.rotation(0F, -PI / 7.9F, 0F)); return TexturedModelData.of(modelData, 32, 32); } @Override public void render(CottonCandyMachineBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { - World world = entity.getWorld(); - if (world != null) { - spinning.yaw = Math.clamp(spinning.yaw + tickDelta, 0, PI); - VertexConsumer consumer = TEXTURE.getVertexConsumer(vertexConsumers, RenderLayer::getEntityCutout); - base.render(matrices, consumer, light, overlay); - } + spinning.yaw = Math.clamp(spinning.yaw + tickDelta, 0, PI); + VertexConsumer consumer = TEXTURE.getVertexConsumer(vertexConsumers, RenderLayer::getEntityCutout); + base.render(matrices, consumer, light, overlay); + spinning.render(matrices, consumer, light, overlay); } } diff --git a/src/main/java/net/anawesomguy/carnivalfoods/item/CottonCandyItem.java b/src/main/java/net/anawesomguy/carnivalfoods/item/CottonCandyItem.java index a2c5971..aeb8c71 100644 --- a/src/main/java/net/anawesomguy/carnivalfoods/item/CottonCandyItem.java +++ b/src/main/java/net/anawesomguy/carnivalfoods/item/CottonCandyItem.java @@ -1,5 +1,6 @@ package net.anawesomguy.carnivalfoods.item; +import net.anawesomguy.carnivalfoods.block.CottonCandyMachineBlock; import net.minecraft.entity.LivingEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -9,6 +10,9 @@ import net.minecraft.util.UseAction; import net.minecraft.world.World; +import static net.anawesomguy.carnivalfoods.block.CottonCandyMachineBlock.START_SPIN_TIME; +import static net.anawesomguy.carnivalfoods.block.CottonCandyMachineBlock.TIME_TO_MAKE_ONE_LAYER; + public class CottonCandyItem extends Item { public CottonCandyItem(Settings settings) { super(settings); @@ -33,4 +37,12 @@ public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) { public boolean isItemBarVisible(ItemStack stack) { return true; } + + @Override + public int getMaxUseTime(ItemStack stack, LivingEntity user) { + int damage = stack.getDamage(); + return damage == 0 ? + super.getMaxUseTime(stack, user) : + START_SPIN_TIME + TIME_TO_MAKE_ONE_LAYER * stack.getDamage(); + } } diff --git a/src/main/java/net/anawesomguy/carnivalfoods/item/ModifiedStickItem.java b/src/main/java/net/anawesomguy/carnivalfoods/item/ModifiedStickItem.java new file mode 100644 index 0000000..ce4c44d --- /dev/null +++ b/src/main/java/net/anawesomguy/carnivalfoods/item/ModifiedStickItem.java @@ -0,0 +1,44 @@ +package net.anawesomguy.carnivalfoods.item; + +import net.anawesomguy.carnivalfoods.block.CottonCandyMachineBlock; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.RaycastContext; +import net.minecraft.world.World; + +public class ModifiedStickItem extends Item { + public ModifiedStickItem(Settings settings) { + super(settings); + } + + @Override + public int getMaxUseTime(ItemStack stack, LivingEntity user) { + return CottonCandyMachineBlock.TOTAL_TIME; + } + + @Override + public void usageTick(World world, LivingEntity user, ItemStack stack, int remainingUseTicks) { + super.usageTick(world, user, stack, remainingUseTicks); + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + return ActionResult.SUCCESS; + } + + @Override + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + ItemStack stack = user.getStackInHand(hand); + user.setCurrentHand(hand); + return new TypedActionResult<>( + useOnBlock(new ItemUsageContext(world, user, hand, stack, + raycast(world, user, RaycastContext.FluidHandling.NONE) + )), stack); + } +} diff --git a/src/main/java/net/anawesomguy/carnivalfoods/mixin/ItemRendererMixin.java b/src/main/java/net/anawesomguy/carnivalfoods/mixin/ItemRendererMixin.java index 3843610..8eba952 100644 --- a/src/main/java/net/anawesomguy/carnivalfoods/mixin/ItemRendererMixin.java +++ b/src/main/java/net/anawesomguy/carnivalfoods/mixin/ItemRendererMixin.java @@ -6,8 +6,8 @@ import net.minecraft.client.render.item.ItemModels; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.util.ModelIdentifier; import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -15,9 +15,9 @@ public abstract class ItemRendererMixin { @WrapOperation(method = "getModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/ItemModels;getModel(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/client/render/model/BakedModel;")) private BakedModel renderHeldItem(ItemModels models, ItemStack stack, Operation original) { - ModelIdentifier model = CarnivalFoodsClient.HELD_ITEM_MODELS.get(stack.getItem()); - if (model != null) - return models.getModelManager().getModel(model); + Identifier modelId = CarnivalFoodsClient.HELD_ITEM_MODELS.get(stack.getItem()); + if (modelId != null) + return models.getModelManager().getModel(modelId); return original.call(models, stack); } } diff --git a/src/main/java/net/anawesomguy/carnivalfoods/mixin/ItemsMixin.java b/src/main/java/net/anawesomguy/carnivalfoods/mixin/ItemsMixin.java new file mode 100644 index 0000000..6486014 --- /dev/null +++ b/src/main/java/net/anawesomguy/carnivalfoods/mixin/ItemsMixin.java @@ -0,0 +1,30 @@ +package net.anawesomguy.carnivalfoods.mixin; + +import net.anawesomguy.carnivalfoods.item.ModifiedStickItem; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; + +@Mixin(Items.class) +public abstract class ItemsMixin { + @Redirect( + method = "", + at = @At( + value = "NEW", + target = "(Lnet/minecraft/item/Item$Settings;)Lnet/minecraft/item/Item;", + ordinal = 0 + ), + slice = @Slice( + from = @At( + value = "CONSTANT", + args = "stringValue=stick" + ) + ) + ) + private static Item replaceStick(Item.Settings settings) { + return new ModifiedStickItem(settings); + } +} diff --git a/src/main/resources/assets/carnival-foods/blockstates/cotton_candy_machine.json b/src/main/resources/assets/carnival-foods/blockstates/cotton_candy_machine.json new file mode 100644 index 0000000..1ccc6a6 --- /dev/null +++ b/src/main/resources/assets/carnival-foods/blockstates/cotton_candy_machine.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "carnival-foods:block/cotton_candy_machine" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/carnival-foods/models/block/cotton_candy_machine.json b/src/main/resources/assets/carnival-foods/models/block/cotton_candy_machine.json new file mode 100644 index 0000000..a6f469e --- /dev/null +++ b/src/main/resources/assets/carnival-foods/models/block/cotton_candy_machine.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "block/cauldron_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/carnival-foods/textures/entity/cotton_candy_machine.png b/src/main/resources/assets/carnival-foods/textures/entity/cotton_candy_machine.png new file mode 100644 index 0000000..866644f Binary files /dev/null and b/src/main/resources/assets/carnival-foods/textures/entity/cotton_candy_machine.png differ diff --git a/src/main/resources/carnival-foods.mixins.json b/src/main/resources/carnival-foods.mixins.json index 4a45fcb..52a4638 100644 --- a/src/main/resources/carnival-foods.mixins.json +++ b/src/main/resources/carnival-foods.mixins.json @@ -3,6 +3,7 @@ "package": "net.anawesomguy.carnivalfoods.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "ItemsMixin" ], "injectors": { "defaultRequire": 1