From f68b47ec22513b57026aa6d5650dd8881864bf93 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 24 Oct 2019 17:14:42 +0200 Subject: [PATCH] Re-add the Destructor --- .../refinedstorage/ClientSetup.java | 2 + .../com/raoulvdberge/refinedstorage/RS.java | 5 + .../raoulvdberge/refinedstorage/RSBlocks.java | 5 +- .../refinedstorage/RSContainers.java | 4 +- .../refinedstorage/RSOldConfig.java | 2 - .../raoulvdberge/refinedstorage/RSTiles.java | 4 +- .../network/node/ConstructorNetworkNode.java | 25 +- .../network/node/DestructorNetworkNode.java | 357 ++++++++++++++++ .../network/node/NetworkNodeDestructor.java | 329 --------------- .../refinedstorage/block/BlockDestructor.java | 41 -- .../refinedstorage/block/DestructorBlock.java | 108 +++++ .../refinedstorage/config/ServerConfig.java | 22 + .../container/DestructorContainer.java | 4 +- ...iDestructor.java => DestructorScreen.java} | 19 +- .../DestructorPickupSideButton.java | 8 +- ...ileDestructor.java => DestructorTile.java} | 18 +- .../refinedstorage/util/WorldUtils.java | 20 + .../blockstates/destructor.json | 207 +++++++--- .../assets/refinedstorage/lang/en_us.json | 4 +- .../models/block/destructor_connected.json | 7 + .../models/block/destructor_disconnected.json | 7 + .../models/item/destructor.json | 389 ++++++++++++++++++ .../loot_tables/blocks/destructor.json | 19 + .../refinedstorage/recipes/destructor.json | 4 +- 24 files changed, 1121 insertions(+), 489 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java delete mode 100755 src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java delete mode 100755 src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/block/DestructorBlock.java rename src/main/java/com/raoulvdberge/refinedstorage/screen/{GuiDestructor.java => DestructorScreen.java} (53%) rename src/main/java/com/raoulvdberge/refinedstorage/tile/{TileDestructor.java => DestructorTile.java} (55%) mode change 100755 => 100644 create mode 100644 src/main/resources/assets/refinedstorage/models/block/destructor_connected.json create mode 100644 src/main/resources/assets/refinedstorage/models/block/destructor_disconnected.json create mode 100644 src/main/resources/assets/refinedstorage/models/item/destructor.json create mode 100644 src/main/resources/data/refinedstorage/loot_tables/blocks/destructor.json rename src/main/resources/{assets => data}/refinedstorage/recipes/destructor.json (79%) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java b/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java index 25a2c1799..f600d4f33 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java @@ -61,6 +61,7 @@ public class ClientSetup { )); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "wireless_transmitter"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/wireless_transmitter/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "constructor"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/constructor/cutouts/connected"))); + bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "destructor"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/destructor/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "disk_drive"), (base, registry) -> new FullbrightBakedModel( new DiskDriveBakedModel( @@ -134,6 +135,7 @@ public class ClientSetup { ScreenManager.registerFactory(RSContainers.WIRELESS_TRANSMITTER, WirelessTransmitterScreen::new); ScreenManager.registerFactory(RSContainers.STORAGE_MONITOR, StorageMonitorScreen::new); ScreenManager.registerFactory(RSContainers.CONSTRUCTOR, ConstructorScreen::new); + ScreenManager.registerFactory(RSContainers.DESTRUCTOR, DestructorScreen::new); ClientRegistry.registerKeyBinding(RSKeyBindings.OPEN_WIRELESS_GRID); ClientRegistry.registerKeyBinding(RSKeyBindings.OPEN_WIRELESS_FLUID_GRID); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RS.java b/src/main/java/com/raoulvdberge/refinedstorage/RS.java index dd7478719..37c24526a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RS.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RS.java @@ -131,6 +131,7 @@ public final class RS { API.instance().getNetworkNodeRegistry().add(WirelessTransmitterNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new WirelessTransmitterNetworkNode(world, pos))); API.instance().getNetworkNodeRegistry().add(StorageMonitorNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new StorageMonitorNetworkNode(world, pos))); API.instance().getNetworkNodeRegistry().add(ConstructorNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new ConstructorNetworkNode(world, pos))); + API.instance().getNetworkNodeRegistry().add(DestructorNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new DestructorNetworkNode(world, pos))); API.instance().getGridManager().add(GridBlockGridFactory.ID, new GridBlockGridFactory()); API.instance().getGridManager().add(WirelessGridGridFactory.ID, new WirelessGridGridFactory()); @@ -187,6 +188,7 @@ public final class RS { e.getRegistry().register(new WirelessTransmitterBlock()); e.getRegistry().register(new StorageMonitorBlock()); e.getRegistry().register(new ConstructorBlock()); + e.getRegistry().register(new DestructorBlock()); } @SubscribeEvent @@ -225,6 +227,7 @@ public final class RS { e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(WirelessTransmitterTile::new, RSBlocks.WIRELESS_TRANSMITTER).build(null).setRegistryName(RS.ID, "wireless_transmitter"))); e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(StorageMonitorTile::new, RSBlocks.STORAGE_MONITOR).build(null).setRegistryName(RS.ID, "storage_monitor"))); e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(ConstructorTile::new, RSBlocks.CONSTRUCTOR).build(null).setRegistryName(RS.ID, "constructor"))); + e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(DestructorTile::new, RSBlocks.DESTRUCTOR).build(null).setRegistryName(RS.ID, "destructor"))); } private TileEntityType registerTileDataParameters(TileEntityType t) { @@ -255,6 +258,7 @@ public final class RS { e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory((windowId, inv, tile) -> new WirelessTransmitterContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "wireless_transmitter")); e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory((windowId, inv, tile) -> new StorageMonitorContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "storage_monitor")); e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory((windowId, inv, tile) -> new ConstructorContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "constructor")); + e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory((windowId, inv, tile) -> new DestructorContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "destructor")); } @SubscribeEvent @@ -335,6 +339,7 @@ public final class RS { e.getRegistry().register(new WirelessTransmitterBlockItem()); e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.STORAGE_MONITOR)); e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.CONSTRUCTOR)); + e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.DESTRUCTOR)); e.getRegistry().register(new WirelessGridItem(WirelessGridItem.Type.NORMAL)); e.getRegistry().register(new WirelessGridItem(WirelessGridItem.Type.CREATIVE)); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java b/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java index 97310a101..26b00aeeb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java @@ -70,8 +70,9 @@ public final class RSBlocks { public static final StorageMonitorBlock STORAGE_MONITOR = null; @ObjectHolder(RS.ID + ":constructor") public static final ConstructorBlock CONSTRUCTOR = null; - - public static final BlockDestructor DESTRUCTOR = new BlockDestructor(); + @ObjectHolder(RS.ID + ":destructor") + public static final DestructorBlock DESTRUCTOR = null; + public static final BlockCraftingMonitor CRAFTING_MONITOR = new BlockCraftingMonitor(); public static final BlockCrafter CRAFTER = new BlockCrafter(); public static final BlockDiskManipulator DISK_MANIPULATOR = new BlockDiskManipulator(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java b/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java index 3c1117e0b..ddccfba72 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java @@ -41,6 +41,8 @@ public final class RSContainers { public static final ContainerType STORAGE_MONITOR = null; @ObjectHolder(RS.ID + ":constructor") public static final ContainerType CONSTRUCTOR = null; + @ObjectHolder(RS.ID + ":destructor") + public static final ContainerType DESTRUCTOR = null; //@ObjectHolder(RS.ID + ":crafter") public static final ContainerType CRAFTER = null; @@ -48,8 +50,6 @@ public final class RSContainers { public static final ContainerType CRAFTER_MANAGER = null; //@ObjectHolder(RS.ID + ":crafting_monitor") public static final ContainerType CRAFTING_MONITOR = null; - //@ObjectHolder(RS.ID + ":destructor") - public static final ContainerType DESTRUCTOR = null; //@ObjectHolder(RS.ID + ":disk_manipulator") public static final ContainerType DISK_MANIPULATOR = null; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java b/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java index 573ac406c..ab1dd1818 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java @@ -6,7 +6,6 @@ public class RSOldConfig { public int crafterPerPatternUsage; public int craftingMonitorUsage; public int crafterManagerUsage; - public int destructorUsage; public int diskManipulatorUsage; //endregion @@ -43,7 +42,6 @@ public class RSOldConfig { crafterPerPatternUsage = config.getInt("crafterPerPattern", ENERGY, 1, 0, Integer.MAX_VALUE, "The additional energy used per Pattern in a Crafter"); craftingMonitorUsage = config.getInt("craftingMonitor", ENERGY, 2, 0, Integer.MAX_VALUE, "The energy used by Crafting Monitors"); crafterManagerUsage = config.getInt("crafterManager", ENERGY, 4, 0, Integer.MAX_VALUE, "The energy used by Crafter Managers"); - destructorUsage = config.getInt("destructor", ENERGY, 1, 0, Integer.MAX_VALUE, "The energy used by Destructors"); diskManipulatorUsage = config.getInt("diskManipulator", ENERGY, 3, 0, Integer.MAX_VALUE, "The energy used by Disk Manipulators"); //endregion diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java b/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java index 956e727d4..f986bdbb4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java @@ -70,6 +70,8 @@ public class RSTiles { public static final TileEntityType STORAGE_MONITOR = null; @ObjectHolder(RS.ID + ":constructor") public static final TileEntityType CONSTRUCTOR = null; + @ObjectHolder(RS.ID + ":destructor") + public static final TileEntityType DESTRUCTOR = null; //@ObjectHolder(RS.ID + ":portable_grid") public static final TileEntityType PORTABLE_GRID = null; @@ -81,6 +83,4 @@ public class RSTiles { public static final TileEntityType CRAFTER_MANAGER = null; //@ObjectHolder(RS.ID + ":crafting_monitor") public static final TileEntityType CRAFTING_MONITOR = null; - //@ObjectHolder(RS.ID + ":destructor") - public static final TileEntityType DESTRUCTOR = null; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java index 0118e3044..aff82d7dc 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; -import com.mojang.authlib.GameProfile; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.util.Action; import com.raoulvdberge.refinedstorage.api.util.IComparer; @@ -14,6 +13,7 @@ import com.raoulvdberge.refinedstorage.tile.ConstructorTile; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.util.StackUtils; +import com.raoulvdberge.refinedstorage.util.WorldUtils; import net.minecraft.dispenser.DefaultDispenseItemBehavior; import net.minecraft.dispenser.Position; import net.minecraft.entity.item.FireworkRocketEntity; @@ -33,8 +33,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; @@ -45,7 +43,6 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.UUID; public class ConstructorNetworkNode extends NetworkNode implements IComparable, IType { public static final ResourceLocation ID = new ResourceLocation(RS.ID, "constructor"); @@ -105,7 +102,7 @@ public class ConstructorNetworkNode extends NetworkNode implements IComparable, if (upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { network.getCraftingManager().request(this, stack, FluidAttributes.BUCKET_VOLUME); } - } else if (world.isAirBlock(front) && FluidUtil.tryPlaceFluid(getFakePlayer(), world, Hand.MAIN_HAND, front, new NetworkFluidHandler(StackUtils.copy(stack, FluidAttributes.BUCKET_VOLUME)), stack)) { + } else if (world.isAirBlock(front) && FluidUtil.tryPlaceFluid(WorldUtils.getFakePlayer((ServerWorld) world, getOwner()), world, Hand.MAIN_HAND, front, new NetworkFluidHandler(StackUtils.copy(stack, FluidAttributes.BUCKET_VOLUME)), stack)) { // We manually have to check world.isAirBlock in the else if statement because tryPlaceFluid ignores this. network.extractFluid(stack, FluidAttributes.BUCKET_VOLUME, Action.PERFORM); } @@ -115,7 +112,7 @@ public class ConstructorNetworkNode extends NetworkNode implements IComparable, if (!network.extractItem(stack, 1, compare, Action.SIMULATE).isEmpty()) { BlockItemUseContext ctx = new ConstructorBlockItemUseContext( world, - getFakePlayer(), + WorldUtils.getFakePlayer((ServerWorld) world, getOwner()), Hand.MAIN_HAND, ItemHandlerHelper.copyStackWithSize(stack, 1), new BlockRayTraceResult(Vec3d.ZERO, getDirection(), pos, false) @@ -150,22 +147,6 @@ public class ConstructorNetworkNode extends NetworkNode implements IComparable, } } - private FakePlayer getFakePlayer() { - ServerWorld world = (ServerWorld) this.world; - - UUID owner = getOwner(); - - if (owner != null) { - GameProfile profile = world.getServer().getPlayerProfileCache().getProfileByUUID(owner); - - if (profile != null) { - return FakePlayerFactory.get(world, profile); - } - } - - return FakePlayerFactory.getMinecraft(world); - } - // @Volatile: From BlockDispenser#getDispensePosition private double getDispensePositionX() { return (double) pos.getX() + 0.5D + 0.8D * (double) getDirection().getXOffset(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java new file mode 100644 index 000000000..801057d31 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java @@ -0,0 +1,357 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network.node; + +import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.api.util.Action; +import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; +import com.raoulvdberge.refinedstorage.inventory.item.BaseItemHandler; +import com.raoulvdberge.refinedstorage.inventory.item.UpgradeItemHandler; +import com.raoulvdberge.refinedstorage.inventory.listener.NetworkNodeFluidInventoryListener; +import com.raoulvdberge.refinedstorage.inventory.listener.NetworkNodeInventoryListener; +import com.raoulvdberge.refinedstorage.item.UpgradeItem; +import com.raoulvdberge.refinedstorage.tile.DestructorTile; +import com.raoulvdberge.refinedstorage.tile.config.IComparable; +import com.raoulvdberge.refinedstorage.tile.config.IType; +import com.raoulvdberge.refinedstorage.tile.config.IWhitelistBlacklist; +import com.raoulvdberge.refinedstorage.util.StackUtils; +import com.raoulvdberge.refinedstorage.util.WorldUtils; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; + +import java.util.ArrayList; +import java.util.List; + +public class DestructorNetworkNode extends NetworkNode implements IComparable, IWhitelistBlacklist, IType { + public static final ResourceLocation ID = new ResourceLocation(RS.ID, "destructor"); + + private static final String NBT_COMPARE = "Compare"; + private static final String NBT_MODE = "Mode"; + private static final String NBT_TYPE = "Type"; + private static final String NBT_PICKUP = "Pickup"; + private static final String NBT_FLUID_FILTERS = "FluidFilters"; + + private static final int BASE_SPEED = 20; + + private BaseItemHandler itemFilters = new BaseItemHandler(9).addListener(new NetworkNodeInventoryListener(this)); + private FluidInventory fluidFilters = new FluidInventory(9).addListener(new NetworkNodeFluidInventoryListener(this)); + + private UpgradeItemHandler upgrades = (UpgradeItemHandler) new UpgradeItemHandler(4, UpgradeItem.Type.SPEED, UpgradeItem.Type.SILK_TOUCH, UpgradeItem.Type.FORTUNE_1, UpgradeItem.Type.FORTUNE_2, UpgradeItem.Type.FORTUNE_3) + .addListener(new NetworkNodeInventoryListener(this)) + .addListener((handler, slot, reading) -> { + tool = createTool(); + }); + + private int compare = IComparer.COMPARE_NBT; + private int mode = IWhitelistBlacklist.BLACKLIST; + private int type = IType.ITEMS; + private boolean pickupItem = false; + private ItemStack tool = createTool(); + + public DestructorNetworkNode(World world, BlockPos pos) { + super(world, pos); + } + + @Override + public int getEnergyUsage() { + return RS.SERVER_CONFIG.getDestructor().getUsage() + upgrades.getEnergyUsage(); + } + + @Override + public void update() { + super.update(); + + if (canUpdate() && ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { + if (type == IType.ITEMS) { + if (pickupItem) { + pickupItems(); + } else { + breakBlock(); + } + } else if (type == IType.FLUIDS) { + breakFluid(); + } + } + } + + private void pickupItems() { + BlockPos front = pos.offset(getDirection()); + + List droppedItems = new ArrayList<>(); + + Chunk chunk = world.getChunkAt(front); + chunk.getEntitiesWithinAABBForEntity(null, new AxisAlignedBB(front), droppedItems, null); + + for (Entity entity : droppedItems) { + if (entity instanceof ItemEntity) { + ItemStack droppedItem = ((ItemEntity) entity).getItem(); + + if (IWhitelistBlacklist.acceptsItem(itemFilters, mode, compare, droppedItem) && + network.insertItem(droppedItem, droppedItem.getCount(), Action.SIMULATE).isEmpty()) { + network.insertItemTracked(droppedItem.copy(), droppedItem.getCount()); + + entity.remove(); + + break; + } + } + } + } + + private void breakBlock() { + BlockPos front = pos.offset(getDirection()); + BlockState frontBlockState = world.getBlockState(front); + Block frontBlock = frontBlockState.getBlock(); + ItemStack frontStack = frontBlock.getPickBlock( + frontBlockState, + new BlockRayTraceResult(Vec3d.ZERO, getDirection().getOpposite(), front, false), + world, + front, + WorldUtils.getFakePlayer((ServerWorld) world, getOwner()) + ); + + if (!frontStack.isEmpty() && + IWhitelistBlacklist.acceptsItem(itemFilters, mode, compare, frontStack) && + frontBlockState.getBlockHardness(world, front) != -1.0) { + List drops = Block.getDrops( + frontBlockState, + (ServerWorld) world, + front, + world.getTileEntity(front), + WorldUtils.getFakePlayer((ServerWorld) world, getOwner()), + tool + ); + + for (ItemStack drop : drops) { + if (!network.insertItem(drop, drop.getCount(), Action.SIMULATE).isEmpty()) { + return; + } + } + + BlockEvent.BreakEvent e = new BlockEvent.BreakEvent(world, front, frontBlockState, WorldUtils.getFakePlayer((ServerWorld) world, getOwner())); + + if (!MinecraftForge.EVENT_BUS.post(e)) { + frontBlock.onBlockHarvested(world, front, frontBlockState, WorldUtils.getFakePlayer((ServerWorld) world, getOwner())); + + world.removeBlock(front, false); + + for (ItemStack drop : drops) { + // We check if the controller isn't null here because when a destructor faces a node and removes it + // it will essentially remove this block itself from the network without knowing + if (network == null) { + InventoryHelper.spawnItemStack(world, front.getX(), front.getY(), front.getZ(), drop); + } else { + network.insertItemTracked(drop, drop.getCount()); + } + } + } + } + } + + private void breakFluid() { + BlockPos front = pos.offset(getDirection()); + BlockState frontBlockState = world.getBlockState(front); + Block frontBlock = frontBlockState.getBlock(); + + if (frontBlock instanceof FlowingFluidBlock) { + // @Volatile: Logic from FlowingFluidBlock#pickupFluid + if (frontBlockState.get(FlowingFluidBlock.LEVEL) == 0) { + Fluid fluid = ((FlowingFluidBlock) frontBlock).getFluid(); + + FluidStack stack = new FluidStack(fluid, FluidAttributes.BUCKET_VOLUME); + + if (IWhitelistBlacklist.acceptsFluid(fluidFilters, mode, compare, stack) && + network.insertFluid(stack, stack.getAmount(), Action.SIMULATE).isEmpty()) { + network.insertFluidTracked(stack, stack.getAmount()); + + world.setBlockState(front, Blocks.AIR.getDefaultState(), 11); + } + } + } else if (frontBlock instanceof IFluidBlock) { + IFluidBlock fluidBlock = (IFluidBlock) frontBlock; + + if (fluidBlock.canDrain(world, front)) { + FluidStack simulatedDrain = fluidBlock.drain(world, front, IFluidHandler.FluidAction.SIMULATE); + + if (IWhitelistBlacklist.acceptsFluid(fluidFilters, mode, compare, simulatedDrain) && + network.insertFluid(simulatedDrain, simulatedDrain.getAmount(), Action.SIMULATE).isEmpty()) { + FluidStack drained = fluidBlock.drain(world, front, IFluidHandler.FluidAction.EXECUTE); + + network.insertFluidTracked(drained, drained.getAmount()); + } + } + } + } + + private ItemStack createTool() { + ItemStack tool = new ItemStack(Items.DIAMOND_PICKAXE); + + if (upgrades.hasUpgrade(UpgradeItem.Type.SILK_TOUCH)) { + tool.addEnchantment(Enchantments.SILK_TOUCH, 1); + } else if (upgrades.hasUpgrade(UpgradeItem.Type.FORTUNE_3)) { + tool.addEnchantment(Enchantments.FORTUNE, 3); + } else if (upgrades.hasUpgrade(UpgradeItem.Type.FORTUNE_2)) { + tool.addEnchantment(Enchantments.FORTUNE, 2); + } else if (upgrades.hasUpgrade(UpgradeItem.Type.FORTUNE_1)) { + tool.addEnchantment(Enchantments.FORTUNE, 1); + } + + return tool; + } + + @Override + public int getCompare() { + return compare; + } + + @Override + public void setCompare(int compare) { + this.compare = compare; + + markDirty(); + } + + @Override + public int getWhitelistBlacklistMode() { + return mode; + } + + @Override + public void setWhitelistBlacklistMode(int mode) { + this.mode = mode; + + markDirty(); + } + + @Override + public void read(CompoundNBT tag) { + super.read(tag); + + StackUtils.readItems(upgrades, 1, tag); + } + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + public CompoundNBT write(CompoundNBT tag) { + super.write(tag); + + StackUtils.writeItems(upgrades, 1, tag); + + return tag; + } + + @Override + public CompoundNBT writeConfiguration(CompoundNBT tag) { + super.writeConfiguration(tag); + + tag.putInt(NBT_COMPARE, compare); + tag.putInt(NBT_MODE, mode); + tag.putInt(NBT_TYPE, type); + tag.putBoolean(NBT_PICKUP, pickupItem); + + StackUtils.writeItems(itemFilters, 0, tag); + + tag.put(NBT_FLUID_FILTERS, fluidFilters.writeToNbt()); + + return tag; + } + + @Override + public void readConfiguration(CompoundNBT tag) { + super.readConfiguration(tag); + + if (tag.contains(NBT_COMPARE)) { + compare = tag.getInt(NBT_COMPARE); + } + + if (tag.contains(NBT_MODE)) { + mode = tag.getInt(NBT_MODE); + } + + if (tag.contains(NBT_TYPE)) { + type = tag.getInt(NBT_TYPE); + } + + if (tag.contains(NBT_PICKUP)) { + pickupItem = tag.getBoolean(NBT_PICKUP); + } + + StackUtils.readItems(itemFilters, 0, tag); + + if (tag.contains(NBT_FLUID_FILTERS)) { + fluidFilters.readFromNbt(tag.getCompound(NBT_FLUID_FILTERS)); + } + } + + public IItemHandler getUpgrades() { + return upgrades; + } + + public IItemHandler getInventory() { + return itemFilters; + } + + @Override + public IItemHandler getDrops() { + return upgrades; + } + + @Override + public int getType() { + return world.isRemote ? DestructorTile.TYPE.getValue() : type; + } + + @Override + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandlerModifiable getItemFilters() { + return itemFilters; + } + + @Override + public FluidInventory getFluidFilters() { + return fluidFilters; + } + + public boolean isPickupItem() { + return pickupItem; + } + + public void setPickupItem(boolean pickupItem) { + this.pickupItem = pickupItem; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java deleted file mode 100755 index 833e3d029..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java +++ /dev/null @@ -1,329 +0,0 @@ -package com.raoulvdberge.refinedstorage.apiimpl.network.node; - -import com.mojang.authlib.GameProfile; -import com.raoulvdberge.refinedstorage.RS; -import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.api.util.IComparer; -import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; -import com.raoulvdberge.refinedstorage.inventory.item.BaseItemHandler; -import com.raoulvdberge.refinedstorage.inventory.item.UpgradeItemHandler; -import com.raoulvdberge.refinedstorage.inventory.listener.NetworkNodeFluidInventoryListener; -import com.raoulvdberge.refinedstorage.inventory.listener.NetworkNodeInventoryListener; -import com.raoulvdberge.refinedstorage.tile.TileDestructor; -import com.raoulvdberge.refinedstorage.tile.config.IComparable; -import com.raoulvdberge.refinedstorage.tile.config.IType; -import com.raoulvdberge.refinedstorage.tile.config.IWhitelistBlacklist; -import com.raoulvdberge.refinedstorage.util.StackUtils; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.server.management.PlayerProfileCache; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.server.ServerWorld; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class NetworkNodeDestructor extends NetworkNode implements IComparable, IWhitelistBlacklist, IType { - public static final ResourceLocation ID = new ResourceLocation(RS.ID, "destructor"); - - private static final String NBT_COMPARE = "Compare"; - private static final String NBT_MODE = "Mode"; - private static final String NBT_TYPE = "Type"; - private static final String NBT_PICKUP = "Pickup"; - private static final String NBT_FLUID_FILTERS = "FluidFilters"; - - private static final int BASE_SPEED = 20; - - private BaseItemHandler itemFilters = new BaseItemHandler(9).addListener(new NetworkNodeInventoryListener(this)); - private FluidInventory fluidFilters = new FluidInventory(9).addListener(new NetworkNodeFluidInventoryListener(this)); - - private UpgradeItemHandler upgrades = (UpgradeItemHandler) new UpgradeItemHandler(4).addListener(new NetworkNodeInventoryListener(this)/* TODO, ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_SILK_TOUCH, ItemUpgrade.TYPE_FORTUNE_1, ItemUpgrade.TYPE_FORTUNE_2, ItemUpgrade.TYPE_FORTUNE_3*/); - - private int compare = IComparer.COMPARE_NBT; - private int mode = IWhitelistBlacklist.BLACKLIST; - private int type = IType.ITEMS; - private boolean pickupItem = false; - - public NetworkNodeDestructor(World world, BlockPos pos) { - super(world, pos); - } - - @Override - public int getEnergyUsage() { - return RS.INSTANCE.config.destructorUsage + upgrades.getEnergyUsage(); - } - - private FakePlayer getFakePlayer() { - ServerWorld world = (ServerWorld) this.world; - - UUID owner = getOwner(); - - if (owner != null) { - PlayerProfileCache profileCache = world.getServer().getPlayerProfileCache(); - - GameProfile profile = profileCache.getProfileByUUID(owner); - - if (profile != null) { - return FakePlayerFactory.get(world, profile); - } - } - - return FakePlayerFactory.getMinecraft(world); - } - - @Override - public void update() { - super.update(); - - if (canUpdate() && ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { - BlockPos front = pos.offset(getDirection()); - - if (pickupItem && type == IType.ITEMS) { - List droppedItems = new ArrayList<>(); - - Chunk chunk = world.getChunkAt(front); - chunk.getEntitiesWithinAABBForEntity(null, new AxisAlignedBB(front), droppedItems, null); - - for (Entity entity : droppedItems) { - if (entity instanceof ItemEntity) { - ItemStack droppedItem = ((ItemEntity) entity).getItem(); - - if (IWhitelistBlacklist.acceptsItem(itemFilters, mode, compare, droppedItem) && network.insertItem(droppedItem, droppedItem.getCount(), Action.SIMULATE).isEmpty()) { - network.insertItemTracked(droppedItem.copy(), droppedItem.getCount()); - - // TODO world.removeEntity(entity); - - break; - } - } - } - } else if (type == IType.ITEMS) { - BlockState frontBlockState = world.getBlockState(front); - Block frontBlock = frontBlockState.getBlock(); - - ItemStack frontStack = frontBlock.getPickBlock( - frontBlockState, - null, - // TODO new BlockRayTraceResult(new Vec3d(pos.getX(), pos.getY(), pos.getZ()), getDirection().getOpposite()), - world, - front, - getFakePlayer() - ); - - if (!frontStack.isEmpty()) { - if (IWhitelistBlacklist.acceptsItem(itemFilters, mode, compare, frontStack) && frontBlockState.getBlockHardness(world, front) != -1.0) { - NonNullList drops = NonNullList.create(); - - /* TODO if (frontBlock instanceof ShulkerBoxTileEntity) { - drops.add(((BlockShulkerBox) frontBlock).getItem(world, front, frontBlockState)); - - TileEntity shulkerBoxTile = world.getTileEntity(front); - - if (shulkerBoxTile instanceof TileEntityShulkerBox) { - // Avoid dropping the shulker box when Block#breakBlock is called - ((TileEntityShulkerBox) shulkerBoxTile).setDestroyedByCreativePlayer(true); - ((TileEntityShulkerBox) shulkerBoxTile).clear(); - } - } else if (upgrades.hasUpgrade(ItemUpgrade.TYPE_SILK_TOUCH) && frontBlock.canSilkHarvest(world, front, frontBlockState, null)) { - drops.add(frontStack); - } else { - frontBlock.getDrops(drops, world, front, frontBlockState, upgrades.getFortuneLevel()); - }*/ - - for (ItemStack drop : drops) { - if (!network.insertItem(drop, drop.getCount(), Action.SIMULATE).isEmpty()) { - return; - } - } - - BlockEvent.BreakEvent e = new BlockEvent.BreakEvent(world, front, frontBlockState, getFakePlayer()); - - if (!MinecraftForge.EVENT_BUS.post(e)) { - world.playEvent(null, 2001, front, Block.getStateId(frontBlockState)); - world.removeBlock(front, false); - - for (ItemStack drop : drops) { - // We check if the controller isn't null here because when a destructor faces a node and removes it - // it will essentially remove this block itself from the network without knowing - if (network == null) { - InventoryHelper.spawnItemStack(world, front.getX(), front.getY(), front.getZ(), drop); - } else { - network.insertItemTracked(drop, drop.getCount()); - } - } - } - } - } - } else if (type == IType.FLUIDS) { - Block frontBlock = world.getBlockState(front).getBlock(); - - IFluidHandler handler = null; -/* TODO - if (frontBlock instanceof BlockLiquid) { - handler = new BlockLiquidWrapper((BlockLiquid) frontBlock, world, front); - } else if (frontBlock instanceof IFluidBlock) { - handler = new FluidBlockWrapper((IFluidBlock) frontBlock, world, front); - } - - if (handler != null) { - FluidStack stack = handler.drain(Fluid.BUCKET_VOLUME, false); - - if (stack != null && IWhitelistBlacklist.acceptsFluid(fluidFilters, mode, compare, stack) && network.insertFluid(stack, stack.amount, Action.SIMULATE) == null) { - FluidStack drained = handler.drain(Fluid.BUCKET_VOLUME, true); - - network.insertFluidTracked(drained, drained.amount); - } - }*/ - } - } - } - - @Override - public int getCompare() { - return compare; - } - - @Override - public void setCompare(int compare) { - this.compare = compare; - - markDirty(); - } - - @Override - public int getWhitelistBlacklistMode() { - return mode; - } - - @Override - public void setWhitelistBlacklistMode(int mode) { - this.mode = mode; - - markDirty(); - } - - @Override - public void read(CompoundNBT tag) { - super.read(tag); - - StackUtils.readItems(upgrades, 1, tag); - } - - @Override - public ResourceLocation getId() { - return ID; - } - - @Override - public CompoundNBT write(CompoundNBT tag) { - super.write(tag); - - StackUtils.writeItems(upgrades, 1, tag); - - return tag; - } - - @Override - public CompoundNBT writeConfiguration(CompoundNBT tag) { - super.writeConfiguration(tag); - - tag.putInt(NBT_COMPARE, compare); - tag.putInt(NBT_MODE, mode); - tag.putInt(NBT_TYPE, type); - tag.putBoolean(NBT_PICKUP, pickupItem); - - StackUtils.writeItems(itemFilters, 0, tag); - - tag.put(NBT_FLUID_FILTERS, fluidFilters.writeToNbt()); - - return tag; - } - - @Override - public void readConfiguration(CompoundNBT tag) { - super.readConfiguration(tag); - - if (tag.contains(NBT_COMPARE)) { - compare = tag.getInt(NBT_COMPARE); - } - - if (tag.contains(NBT_MODE)) { - mode = tag.getInt(NBT_MODE); - } - - if (tag.contains(NBT_TYPE)) { - type = tag.getInt(NBT_TYPE); - } - - if (tag.contains(NBT_PICKUP)) { - pickupItem = tag.getBoolean(NBT_PICKUP); - } - - StackUtils.readItems(itemFilters, 0, tag); - - if (tag.contains(NBT_FLUID_FILTERS)) { - fluidFilters.readFromNbt(tag.getCompound(NBT_FLUID_FILTERS)); - } - } - - public IItemHandler getUpgrades() { - return upgrades; - } - - public IItemHandler getInventory() { - return itemFilters; - } - - @Override - public IItemHandler getDrops() { - return upgrades; - } - - @Override - public int getType() { - return world.isRemote ? TileDestructor.TYPE.getValue() : type; - } - - @Override - public void setType(int type) { - this.type = type; - - markDirty(); - } - - @Override - public IItemHandlerModifiable getItemFilters() { - return itemFilters; - } - - @Override - public FluidInventory getFluidFilters() { - return fluidFilters; - } - - public boolean isPickupItem() { - return pickupItem; - } - - public void setPickupItem(boolean pickupItem) { - this.pickupItem = pickupItem; - } -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java deleted file mode 100755 index bb48610b7..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.raoulvdberge.refinedstorage.block; - -public class BlockDestructor extends CableBlock { - /* TODO - public BlockDestructor() { - super(createBuilder("destructor").tileEntity(TileDestructor::new).create()); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void registerModels(IModelRegistration modelRegistration) { - modelRegistration.setModel(this, 0, new ModelResourceLocation(info.getId(), "connected=false,direction=north,down=false,east=true,north=false,south=false,up=false,west=true")); - - registerCoverAndFullbright(modelRegistration, RS.ID + ":blocks/destructor/cutouts/connected"); - } - - @Override - @Nullable - public BlockDirection getDirection() { - return BlockDirection.ANY; - } - - @Override - public List getCollisions(TileEntity tile, BlockState state) { - return RSBlocks.CONSTRUCTOR.getCollisions(tile, state); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, EnumHand hand, Direction side, float hitX, float hitY, float hitZ) { - if (!canAccessGui(state, world, pos, hitX, hitY, hitZ)) { - return false; - } - - return openNetworkGui(RSGui.DESTRUCTOR, player, world, pos, side); - } - - @Override - public boolean hasConnectedState() { - return true; - }*/ -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/DestructorBlock.java b/src/main/java/com/raoulvdberge/refinedstorage/block/DestructorBlock.java new file mode 100644 index 000000000..fe15d006e --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/DestructorBlock.java @@ -0,0 +1,108 @@ +package com.raoulvdberge.refinedstorage.block; + +import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.block.info.BlockDirection; +import com.raoulvdberge.refinedstorage.container.DestructorContainer; +import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider; +import com.raoulvdberge.refinedstorage.tile.DestructorTile; +import com.raoulvdberge.refinedstorage.util.BlockUtils; +import com.raoulvdberge.refinedstorage.util.NetworkUtils; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.fml.network.NetworkHooks; + +import javax.annotation.Nullable; + +public class DestructorBlock extends CableBlock { + private static final VoxelShape HEAD_NORTH = VoxelShapes.or(makeCuboidShape(2, 2, 0, 14, 14, 2), HOLDER_NORTH); + private static final VoxelShape HEAD_EAST = VoxelShapes.or(makeCuboidShape(14, 2, 2, 16, 14, 14), HOLDER_EAST); + private static final VoxelShape HEAD_SOUTH = VoxelShapes.or(makeCuboidShape(2, 2, 14, 14, 14, 16), HOLDER_SOUTH); + private static final VoxelShape HEAD_WEST = VoxelShapes.or(makeCuboidShape(0, 2, 2, 2, 14, 14), HOLDER_WEST); + private static final VoxelShape HEAD_DOWN = VoxelShapes.or(makeCuboidShape(2, 0, 2, 14, 2, 14), HOLDER_DOWN); + private static final VoxelShape HEAD_UP = VoxelShapes.or(makeCuboidShape(2, 14, 2, 14, 16, 14), HOLDER_UP); + + public DestructorBlock() { + super(BlockUtils.DEFAULT_GLASS_PROPERTIES); + + this.setRegistryName(RS.ID, "destructor"); + } + + @Override + public BlockDirection getDirection() { + return BlockDirection.ANY; + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return new DestructorTile(); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) { + VoxelShape shape = super.getShape(state, world, pos, ctx); + + Direction direction = state.get(getDirection().getProperty()); + + if (direction == Direction.NORTH) { + shape = VoxelShapes.or(shape, HEAD_NORTH); + } + + if (direction == Direction.EAST) { + shape = VoxelShapes.or(shape, HEAD_EAST); + } + + if (direction == Direction.SOUTH) { + shape = VoxelShapes.or(shape, HEAD_SOUTH); + } + + if (direction == Direction.WEST) { + shape = VoxelShapes.or(shape, HEAD_WEST); + } + + if (direction == Direction.UP) { + shape = VoxelShapes.or(shape, HEAD_UP); + } + + if (direction == Direction.DOWN) { + shape = VoxelShapes.or(shape, HEAD_DOWN); + } + + return shape; + } + + @Override + @SuppressWarnings("deprecation") + public boolean onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { + if (!world.isRemote) { + return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui( + (ServerPlayerEntity) player, + new PositionalTileContainerProvider( + new TranslationTextComponent("gui.refinedstorage.destructor"), + (tile, windowId, inventory, p) -> new DestructorContainer(tile, player, windowId), + pos + ), + pos + )); + } + + return true; + } + + @Override + public boolean hasConnectedState() { + return true; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java b/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java index 560fb8ab4..3c1b7d091 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java @@ -28,6 +28,7 @@ public class ServerConfig { private WirelessGrid wirelessGrid; private WirelessFluidGrid wirelessFluidGrid; private Constructor constructor; + private Destructor destructor; public ServerConfig() { upgrades = new Upgrades(); @@ -52,6 +53,7 @@ public class ServerConfig { wirelessGrid = new WirelessGrid(); wirelessFluidGrid = new WirelessFluidGrid(); constructor = new Constructor(); + destructor = new Destructor(); spec = builder.build(); } @@ -144,6 +146,10 @@ public class ServerConfig { return constructor; } + public Destructor getDestructor() { + return destructor; + } + public ForgeConfigSpec getSpec() { return spec; } @@ -697,4 +703,20 @@ public class ServerConfig { return usage.get(); } } + + public class Destructor { + private final ForgeConfigSpec.IntValue usage; + + public Destructor() { + builder.push("destructor"); + + usage = builder.comment("The energy used by the Destructor").defineInRange("usage", 3, 0, Integer.MAX_VALUE); + + builder.pop(); + } + + public int getUsage() { + return usage.get(); + } + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/DestructorContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/container/DestructorContainer.java index e4165785d..f11fa3803 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/DestructorContainer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/DestructorContainer.java @@ -3,13 +3,13 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.RSContainers; import com.raoulvdberge.refinedstorage.container.slot.filter.FilterSlot; import com.raoulvdberge.refinedstorage.container.slot.filter.FluidFilterSlot; -import com.raoulvdberge.refinedstorage.tile.TileDestructor; +import com.raoulvdberge.refinedstorage.tile.DestructorTile; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.PlayerEntity; import net.minecraftforge.items.SlotItemHandler; public class DestructorContainer extends BaseContainer { - public DestructorContainer(TileDestructor destructor, PlayerEntity player, int windowId) { + public DestructorContainer(DestructorTile destructor, PlayerEntity player, int windowId) { super(RSContainers.DESTRUCTOR, destructor, player, windowId); for (int i = 0; i < 4; ++i) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/GuiDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/DestructorScreen.java similarity index 53% rename from src/main/java/com/raoulvdberge/refinedstorage/screen/GuiDestructor.java rename to src/main/java/com/raoulvdberge/refinedstorage/screen/DestructorScreen.java index fffd67e38..8ff8ac11b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/GuiDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/DestructorScreen.java @@ -3,24 +3,25 @@ package com.raoulvdberge.refinedstorage.screen; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.container.DestructorContainer; import com.raoulvdberge.refinedstorage.screen.widget.sidebutton.*; -import com.raoulvdberge.refinedstorage.tile.TileDestructor; +import com.raoulvdberge.refinedstorage.tile.DestructorTile; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.util.text.ITextComponent; -public class GuiDestructor extends BaseScreen { - public GuiDestructor(DestructorContainer container, PlayerInventory playerInventory) { - super(container, 211, 137, playerInventory, null); +public class DestructorScreen extends BaseScreen { + public DestructorScreen(DestructorContainer container, PlayerInventory playerInventory, ITextComponent title) { + super(container, 211, 137, playerInventory, title); } @Override public void onPostInit(int x, int y) { - addSideButton(new RedstoneModeSideButton(this, TileDestructor.REDSTONE_MODE)); + addSideButton(new RedstoneModeSideButton(this, DestructorTile.REDSTONE_MODE)); - addSideButton(new TypeSideButton(this, TileDestructor.TYPE)); + addSideButton(new TypeSideButton(this, DestructorTile.TYPE)); - addSideButton(new WhitelistBlacklistSideButton(this, TileDestructor.WHITELIST_BLACKLIST)); + addSideButton(new WhitelistBlacklistSideButton(this, DestructorTile.WHITELIST_BLACKLIST)); - addSideButton(new ExactModeSideButton(this, TileDestructor.COMPARE)); + addSideButton(new ExactModeSideButton(this, DestructorTile.COMPARE)); addSideButton(new DestructorPickupSideButton(this)); } @@ -38,7 +39,7 @@ public class GuiDestructor extends BaseScreen { @Override public void renderForeground(int mouseX, int mouseY) { - renderString(7, 7, I18n.format("gui.refinedstorage:destructor")); + renderString(7, 7, title.getFormattedText()); renderString(7, 43, I18n.format("container.inventory")); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/sidebutton/DestructorPickupSideButton.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/sidebutton/DestructorPickupSideButton.java index 173c2f685..2bea0af8f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/sidebutton/DestructorPickupSideButton.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/sidebutton/DestructorPickupSideButton.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.screen.widget.sidebutton; import com.raoulvdberge.refinedstorage.screen.BaseScreen; -import com.raoulvdberge.refinedstorage.tile.TileDestructor; +import com.raoulvdberge.refinedstorage.tile.DestructorTile; import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; import net.minecraft.client.resources.I18n; import net.minecraft.util.text.TextFormatting; @@ -13,16 +13,16 @@ public class DestructorPickupSideButton extends SideButton { @Override protected void renderButtonIcon(int x, int y) { - screen.blit(x, y, 64 + (!TileDestructor.PICKUP.getValue() ? 16 : 0), 0, 16, 16); + screen.blit(x, y, 64 + (!DestructorTile.PICKUP.getValue() ? 16 : 0), 0, 16, 16); } @Override public String getTooltip() { - return I18n.format("sidebutton.refinedstorage.destructor.pickup") + "\n" + TextFormatting.GRAY + I18n.format(TileDestructor.PICKUP.getValue() ? "gui.yes" : "gui.no"); + return I18n.format("sidebutton.refinedstorage.destructor.pickup") + "\n" + TextFormatting.GRAY + I18n.format(DestructorTile.PICKUP.getValue() ? "gui.yes" : "gui.no"); } @Override public void onPress() { - TileDataManager.setParameter(TileDestructor.PICKUP, !TileDestructor.PICKUP.getValue()); + TileDataManager.setParameter(DestructorTile.PICKUP, !DestructorTile.PICKUP.getValue()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/DestructorTile.java old mode 100755 new mode 100644 similarity index 55% rename from src/main/java/com/raoulvdberge/refinedstorage/tile/TileDestructor.java rename to src/main/java/com/raoulvdberge/refinedstorage/tile/DestructorTile.java index cf69bf27a..2ece6af88 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/DestructorTile.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.RSTiles; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeDestructor; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.DestructorNetworkNode; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.tile.config.IWhitelistBlacklist; @@ -12,16 +12,16 @@ import net.minecraft.world.World; import javax.annotation.Nonnull; -public class TileDestructor extends NetworkNodeTile { - public static final TileDataParameter COMPARE = IComparable.createParameter(); - public static final TileDataParameter WHITELIST_BLACKLIST = IWhitelistBlacklist.createParameter(); - public static final TileDataParameter TYPE = IType.createParameter(); - public static final TileDataParameter PICKUP = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().isPickupItem(), (t, v) -> { +public class DestructorTile extends NetworkNodeTile { + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter WHITELIST_BLACKLIST = IWhitelistBlacklist.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); + public static final TileDataParameter PICKUP = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().isPickupItem(), (t, v) -> { t.getNode().setPickupItem(v); t.getNode().markDirty(); }); - public TileDestructor() { + public DestructorTile() { super(RSTiles.DESTRUCTOR); dataManager.addWatchedParameter(COMPARE); @@ -32,7 +32,7 @@ public class TileDestructor extends NetworkNodeTile { @Override @Nonnull - public NetworkNodeDestructor createNode(World world, BlockPos pos) { - return new NetworkNodeDestructor(world, pos); + public DestructorNetworkNode createNode(World world, BlockPos pos) { + return new DestructorNetworkNode(world, pos); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java index f90066fa8..8648251d3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java @@ -1,9 +1,11 @@ package com.raoulvdberge.refinedstorage.util; +import com.mojang.authlib.GameProfile; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; +import net.minecraft.server.management.PlayerProfileCache; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -14,6 +16,9 @@ import net.minecraft.util.text.Style; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; @@ -22,6 +27,7 @@ import net.minecraftforge.items.wrapper.InvWrapper; import net.minecraftforge.items.wrapper.SidedInvWrapper; import javax.annotation.Nullable; +import java.util.UUID; public final class WorldUtils { public static void updateBlock(@Nullable World world, BlockPos pos) { @@ -56,6 +62,20 @@ public final class WorldUtils { return null; } + public static FakePlayer getFakePlayer(ServerWorld world, @Nullable UUID owner) { + if (owner != null) { + PlayerProfileCache profileCache = world.getServer().getPlayerProfileCache(); + + GameProfile profile = profileCache.getProfileByUUID(owner); + + if (profile != null) { + return FakePlayerFactory.get(world, profile); + } + } + + return FakePlayerFactory.getMinecraft(world); + } + public static void sendNoPermissionMessage(PlayerEntity player) { player.sendMessage(new TranslationTextComponent("misc.refinedstorage:security.no_permission").setStyle(new Style().setColor(TextFormatting.RED))); } diff --git a/src/main/resources/assets/refinedstorage/blockstates/destructor.json b/src/main/resources/assets/refinedstorage/blockstates/destructor.json index 80f9e9840..22fb59288 100755 --- a/src/main/resources/assets/refinedstorage/blockstates/destructor.json +++ b/src/main/resources/assets/refinedstorage/blockstates/destructor.json @@ -1,95 +1,180 @@ { - "forge_marker": 1, - "defaults": { - "textures": { - "front": "refinedstorage:blocks/destructor/destructor", - "cutout": "refinedstorage:blocks/destructor/cutouts/disconnected" - }, - "model": "refinedstorage:cable_core", - "uvlock": true, - "transform": "forge:default-block" - }, - "variants": { - "connected": { - "true": { - "textures": { - "cutout": "refinedstorage:blocks/destructor/cutouts/connected" - } - }, - "false": { + "multipart": [ + { + "apply": { + "model": "refinedstorage:block/cable_core" } }, - "direction": { - "north": { - "submodel": "refinedstorage:constructor_destructor" + { + "when": { + "north": true }, - "east": { - "submodel": "refinedstorage:constructor_destructor", + "apply": { + "model": "refinedstorage:block/cable_extension" + } + }, + { + "when": { + "east": true + }, + "apply": { + "model": "refinedstorage:block/cable_extension", "y": 90 + } + }, + { + "when": { + "south": true }, - "south": { - "submodel": "refinedstorage:constructor_destructor", + "apply": { + "model": "refinedstorage:block/cable_extension", "x": 180 + } + }, + { + "when": { + "west": true }, - "west": { - "submodel": "refinedstorage:constructor_destructor", + "apply": { + "model": "refinedstorage:block/cable_extension", "y": 270 + } + }, + { + "when": { + "up": true }, - "up": { - "submodel": "refinedstorage:constructor_destructor", + "apply": { + "model": "refinedstorage:block/cable_extension", "x": 270 + } + }, + { + "when": { + "down": true }, - "down": { - "submodel": "refinedstorage:constructor_destructor", + "apply": { + "model": "refinedstorage:block/cable_extension", "x": 90 } }, - "north": { - "true": { - "submodel": "refinedstorage:cable_extension" + { + "when": { + "direction": "north", + "connected": true }, - "false": { + "apply": { + "model": "refinedstorage:block/destructor_connected" } }, - "east": { - "true": { - "submodel": "refinedstorage:cable_extension", + { + "when": { + "direction": "east", + "connected": true + }, + "apply": { + "model": "refinedstorage:block/destructor_connected", "y": 90 - }, - "false": { } }, - "south": { - "true": { - "submodel": "refinedstorage:cable_extension", + { + "when": { + "direction": "south", + "connected": true + }, + "apply": { + "model": "refinedstorage:block/destructor_connected", "x": 180 - }, - "false": { } }, - "west": { - "true": { - "submodel": "refinedstorage:cable_extension", + { + "when": { + "direction": "west", + "connected": true + }, + "apply": { + "model": "refinedstorage:block/destructor_connected", "y": 270 - }, - "false": { } }, - "up": { - "true": { - "submodel": "refinedstorage:cable_extension", + { + "when": { + "direction": "up", + "connected": true + }, + "apply": { + "model": "refinedstorage:block/destructor_connected", "x": 270 - }, - "false": { } }, - "down": { - "true": { - "submodel": "refinedstorage:cable_extension", - "x": 90 + { + "when": { + "direction": "down", + "connected": true }, - "false": { + "apply": { + "model": "refinedstorage:block/destructor_connected", + "x": 90 + } + }, + { + "when": { + "direction": "north", + "connected": false + }, + "apply": { + "model": "refinedstorage:block/destructor_disconnected" + } + }, + { + "when": { + "direction": "east", + "connected": false + }, + "apply": { + "model": "refinedstorage:block/destructor_disconnected", + "y": 90 + } + }, + { + "when": { + "direction": "south", + "connected": false + }, + "apply": { + "model": "refinedstorage:block/destructor_disconnected", + "x": 180 + } + }, + { + "when": { + "direction": "west", + "connected": false + }, + "apply": { + "model": "refinedstorage:block/destructor_disconnected", + "y": 270 + } + }, + { + "when": { + "direction": "up", + "connected": false + }, + "apply": { + "model": "refinedstorage:block/destructor_disconnected", + "x": 270 + } + }, + { + "when": { + "direction": "down", + "connected": false + }, + "apply": { + "model": "refinedstorage:block/destructor_disconnected", + "x": 90 } } - } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.json b/src/main/resources/assets/refinedstorage/lang/en_us.json index 1509058fd..d6e890bfb 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.json +++ b/src/main/resources/assets/refinedstorage/lang/en_us.json @@ -24,7 +24,7 @@ "gui.refinedstorage.importer": "Importer", "gui.refinedstorage.exporter": "Exporter", "gui.refinedstorage.detector": "Detector", - "gui.refinedstorage:destructor": "Destructor", + "gui.refinedstorage.destructor": "Destructor", "gui.refinedstorage.constructor": "Constructor", "gui.refinedstorage.relay": "Relay", "gui.refinedstorage.interface.import": "Interface Import", @@ -190,7 +190,7 @@ "block.refinedstorage.exporter": "Exporter", "block.refinedstorage.detector": "Detector", "block.refinedstorage.machine_casing": "Machine Casing", - "block.refinedstorage:destructor": "Destructor", + "block.refinedstorage.destructor": "Destructor", "block.refinedstorage.constructor": "Constructor", "block.refinedstorage.1k_storage_block": "1k Storage Block", "block.refinedstorage.4k_storage_block": "4k Storage Block", diff --git a/src/main/resources/assets/refinedstorage/models/block/destructor_connected.json b/src/main/resources/assets/refinedstorage/models/block/destructor_connected.json new file mode 100644 index 000000000..4ce03010a --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/destructor_connected.json @@ -0,0 +1,7 @@ +{ + "parent": "refinedstorage:block/constructor_destructor", + "textures": { + "front": "refinedstorage:block/destructor/destructor", + "cutout": "refinedstorage:block/destructor/cutouts/connected" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/models/block/destructor_disconnected.json b/src/main/resources/assets/refinedstorage/models/block/destructor_disconnected.json new file mode 100644 index 000000000..ee6535d82 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/destructor_disconnected.json @@ -0,0 +1,7 @@ +{ + "parent": "refinedstorage:block/constructor_destructor", + "textures": { + "front": "refinedstorage:block/destructor/destructor", + "cutout": "refinedstorage:block/destructor/cutouts/disconnected" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/models/item/destructor.json b/src/main/resources/assets/refinedstorage/models/item/destructor.json new file mode 100644 index 000000000..106fd4fd7 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/destructor.json @@ -0,0 +1,389 @@ +{ + "parent": "block/block", + "textures": { + "cable": "refinedstorage:block/cable", + "front": "refinedstorage:block/destructor/destructor", + "cutout": "refinedstorage:block/destructor/cutouts/disconnected", + "border": "refinedstorage:block/cable_part_border" + }, + "elements": [ + { + "name": "Core", + "from": [ + 6, + 6, + 6 + ], + "to": [ + 10, + 10, + 10 + ], + "faces": { + "north": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "east": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "south": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "west": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "up": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "down": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + } + } + }, + { + "name": "Part1", + "from": [ + 10, + 6, + 6 + ], + "to": [ + 16, + 10, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 16, + 8, + 9 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 6, + 6, + 10 + ], + "texture": "#cable" + }, + "east": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "south": { + "uv": [ + 10, + 6, + 16, + 10 + ], + "texture": "#cable" + }, + "west": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "up": { + "uv": [ + 10, + 6, + 16, + 10 + ], + "texture": "#cable" + }, + "down": { + "uv": [ + 10, + 6, + 16, + 10 + ], + "texture": "#cable" + } + } + }, + { + "name": "Part2", + "from": [ + 0, + 6, + 6 + ], + "to": [ + 6, + 10, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 6, + 8, + 9 + ] + }, + "faces": { + "north": { + "uv": [ + 10, + 6, + 16, + 10 + ], + "texture": "#cable" + }, + "east": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "south": { + "uv": [ + 0, + 6, + 6, + 10 + ], + "texture": "#cable" + }, + "west": { + "uv": [ + 6, + 6, + 10, + 10 + ], + "texture": "#cable" + }, + "up": { + "uv": [ + 0, + 6, + 6, + 10 + ], + "texture": "#cable" + }, + "down": { + "uv": [ + 0, + 6, + 6, + 10 + ], + "texture": "#cable" + } + } + }, + { + "name": "Line1", + "from": [ + 7.0, + 7.0, + 2.0 + ], + "to": [ + 9.0, + 9.0, + 6.0 + ], + "faces": { + "east": { + "texture": "#border", + "uv": [ + 0.0, + 0.0, + 4.0, + 2.0 + ] + }, + "south": { + "texture": "#border", + "uv": [ + 0.0, + 0.0, + 4.0, + 4.0 + ] + }, + "west": { + "texture": "#border", + "uv": [ + 0.0, + 0.0, + 4.0, + 2.0 + ] + }, + "up": { + "texture": "#border", + "uv": [ + 0.0, + 0.0, + 2.0, + 4.0 + ] + }, + "down": { + "texture": "#border", + "uv": [ + 0.0, + 0.0, + 2.0, + 4.0 + ] + } + } + }, + { + "name": "Line2", + "from": [ + 2.0, + 2.0, + 0.0 + ], + "to": [ + 14.0, + 14.0, + 2.0 + ], + "faces": { + "north": { + "texture": "#front", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "east": { + "texture": "#border", + "uv": [ + 14.0, + 0.0, + 16.0, + 16.0 + ] + }, + "south": { + "texture": "#border", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "west": { + "texture": "#border", + "uv": [ + 0.0, + 0.0, + 2.0, + 16.0 + ] + }, + "up": { + "texture": "#border", + "uv": [ + 2.0, + 0.0, + 14.0, + 2.0 + ] + }, + "down": { + "texture": "#border", + "uv": [ + 2.0, + 14.0, + 14.0, + 16.0 + ] + } + } + }, + { + "name": "Line3", + "from": [ + 2.0, + 2.0, + 0.0 + ], + "to": [ + 14.0, + 14.0, + 2.0 + ], + "faces": { + "north": { + "texture": "#cutout", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/destructor.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/destructor.json new file mode 100644 index 000000000..403766b45 --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/destructor.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:destructor" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/recipes/destructor.json b/src/main/resources/data/refinedstorage/recipes/destructor.json similarity index 79% rename from src/main/resources/assets/refinedstorage/recipes/destructor.json rename to src/main/resources/data/refinedstorage/recipes/destructor.json index ee4f08ad3..ce5113980 100644 --- a/src/main/resources/assets/refinedstorage/recipes/destructor.json +++ b/src/main/resources/data/refinedstorage/recipes/destructor.json @@ -10,7 +10,7 @@ "item": "refinedstorage:quartz_enriched_iron" }, "D": { - "item": "#destruction_core" + "item": "refinedstorage:destruction_core" }, "R": { "item": "minecraft:redstone" @@ -19,7 +19,7 @@ "item": "refinedstorage:cable" }, "I": { - "item": "#improved_processor" + "item": "refinedstorage:improved_processor" } }, "result": {