From 9063b285278736ce9af49b2deeb252647e591e9a Mon Sep 17 00:00:00 2001 From: P3pp3rF1y Date: Fri, 27 Dec 2024 21:59:33 +0100 Subject: [PATCH] Add dispensing minecarts with dispenser --- .../SophisticatedStorageInMotion.java | 6 ++ .../init/ModItems.java | 7 ++- .../item/StorageMinecartItem.java | 62 +++++++++++++++++-- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/SophisticatedStorageInMotion.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/SophisticatedStorageInMotion.java index 8fbda9e..534f97d 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/SophisticatedStorageInMotion.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/SophisticatedStorageInMotion.java @@ -5,6 +5,7 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.p3pp3rf1y.sophisticatedstorageinmotion.client.ClientEventHandler; import net.p3pp3rf1y.sophisticatedstorageinmotion.common.CommonEventHandler; import net.p3pp3rf1y.sophisticatedstorageinmotion.data.DataGenerators; @@ -29,6 +30,7 @@ public SophisticatedStorageInMotion(IEventBus modBus, Dist dist, ModContainer co } modBus.addListener(ModPayloads::registerPayloads); modBus.addListener(DataGenerators::gatherData); + modBus.addListener(SophisticatedStorageInMotion::setup); } public static ResourceLocation getRL(String regName) { @@ -38,4 +40,8 @@ public static ResourceLocation getRL(String regName) { public static String getRegistryName(String regName) { return MOD_ID + ":" + regName; } + + private static void setup(FMLCommonSetupEvent event) { + event.enqueueWork(ModItems::registerDispenseBehavior); + } } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/init/ModItems.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/init/ModItems.java index 131d9c0..97bb6d7 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/init/ModItems.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/init/ModItems.java @@ -8,6 +8,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; +import net.minecraft.world.level.block.DispenserBlock; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.attachment.AttachmentType; import net.neoforged.neoforge.registries.DeferredRegister; @@ -33,7 +34,7 @@ private ModItems() { private static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, SophisticatedStorageInMotion.MOD_ID); public static final Supplier> MOVING_STORAGE_FROM_STORAGE_SERIALIZER = RECIPE_SERIALIZERS.register("moving_storage_from_storage", MovingStorageFromStorageRecipe.Serializer::new); - public static final Supplier> UNCRAFT_MOVING_STORAGE_SERIALIZER = RECIPE_SERIALIZERS.register("uncraft_moving_storage",() -> new SimpleCraftingRecipeSerializer<>(UncraftMovingStorageRecipe::new)); + public static final Supplier> UNCRAFT_MOVING_STORAGE_SERIALIZER = RECIPE_SERIALIZERS.register("uncraft_moving_storage", () -> new SimpleCraftingRecipeSerializer<>(UncraftMovingStorageRecipe::new)); public static Supplier CREATIVE_TAB = CREATIVE_MODE_TABS.register("main", () -> CreativeModeTab.builder().icon(() -> new ItemStack(STORAGE_MINECART.get())) @@ -49,4 +50,8 @@ public static void registerHandlers(IEventBus modBus) { ATTACHMENT_TYPES.register(modBus); RECIPE_SERIALIZERS.register(modBus); } + + public static void registerDispenseBehavior() { + DispenserBlock.registerBehavior(STORAGE_MINECART.get(), StorageMinecartItem.DISPENSE_ITEM_BEHAVIOR); + } } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java index 9acccc0..6c5aa77 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java @@ -1,21 +1,68 @@ package net.p3pp3rf1y.sophisticatedstorageinmotion.item; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.core.dispenser.DispenseItemBehavior; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseRailBlock; +import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.RailShape; import net.minecraft.world.level.gameevent.GameEvent; import net.p3pp3rf1y.sophisticatedstorageinmotion.entity.StorageMinecart; +import org.jetbrains.annotations.Nullable; public class StorageMinecartItem extends MovingStorageItem { + public static final DispenseItemBehavior DISPENSE_ITEM_BEHAVIOR = new DefaultDispenseItemBehavior() { + private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior(); + + public ItemStack execute(BlockSource blockSource, ItemStack stack) { + Direction direction = blockSource.state().getValue(DispenserBlock.FACING); + ServerLevel serverlevel = blockSource.level(); + BlockPos blockpos = blockSource.pos().relative(direction); + BlockState blockstate = serverlevel.getBlockState(blockpos); + RailShape railshape = blockstate.getBlock() instanceof BaseRailBlock baseRailBlock ? baseRailBlock.getRailDirection(blockstate, serverlevel, blockpos, null) : RailShape.NORTH_SOUTH; + double slopeOffset; + if (blockstate.is(BlockTags.RAILS)) { + if (railshape.isAscending()) { + slopeOffset = 0.6; + } else { + slopeOffset = 0.1; + } + } else { + if (!blockstate.isAir() || !serverlevel.getBlockState(blockpos.below()).is(BlockTags.RAILS)) { + return this.defaultDispenseItemBehavior.dispense(blockSource, stack); + } + + BlockState stateBelow = serverlevel.getBlockState(blockpos.below()); + RailShape railShapeBelow = stateBelow.getBlock() instanceof BaseRailBlock baseRailBlock ? baseRailBlock.getRailDirection(stateBelow, serverlevel, blockpos.below(), null) : RailShape.NORTH_SOUTH; + if (direction != Direction.DOWN && railShapeBelow.isAscending()) { + slopeOffset = -0.4; + } else { + slopeOffset = -0.9; + } + } + + serverlevel.addFreshEntity(createMinecart(serverlevel, blockpos, slopeOffset, stack, null)); + stack.shrink(1); + return stack; + } + + protected void playSound(BlockSource blockSource) { + blockSource.level().levelEvent(1000, blockSource.pos(), 0); + } + }; + public StorageMinecartItem() { super(new Properties().stacksTo(1)); } @@ -36,12 +83,10 @@ public InteractionResult useOn(UseOnContext context) { ascendingOffset = 0.5; } - StorageMinecart minecart = new StorageMinecart(level, blockpos.getX() + 0.5, blockpos.getY() + 0.0625 + ascendingOffset, blockpos.getZ() + 0.5); - minecart.getStorageHolder().setStorageItemFrom(stack); - EntityType.createDefaultStackConfig(serverlevel, stack, context.getPlayer()).accept(minecart); + Player player = context.getPlayer(); - serverlevel.addFreshEntity(minecart); - serverlevel.gameEvent(GameEvent.ENTITY_PLACE, blockpos, GameEvent.Context.of(context.getPlayer(), serverlevel.getBlockState(blockpos.below()))); + serverlevel.addFreshEntity(createMinecart(serverlevel, blockpos, ascendingOffset, stack, player)); + serverlevel.gameEvent(GameEvent.ENTITY_PLACE, blockpos, GameEvent.Context.of(player, serverlevel.getBlockState(blockpos.below()))); } stack.shrink(1); @@ -49,6 +94,13 @@ public InteractionResult useOn(UseOnContext context) { } } + private static StorageMinecart createMinecart(ServerLevel serverlevel, BlockPos blockpos, double ascendingOffset, ItemStack stack, @Nullable Player player) { + StorageMinecart minecart = new StorageMinecart(serverlevel, blockpos.getX() + 0.5, blockpos.getY() + 0.0625 + ascendingOffset, blockpos.getZ() + 0.5); + minecart.getStorageHolder().setStorageItemFrom(stack); + EntityType.createDefaultStackConfig(serverlevel, stack, player).accept(minecart); + return minecart; + } + @Override public ItemStack getUncraftRemainingItem() { return new ItemStack(Items.MINECART);