diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RS.java b/src/main/java/com/raoulvdberge/refinedstorage/RS.java index 4b2e4c684..b8ace5fdb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RS.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RS.java @@ -28,6 +28,7 @@ import com.raoulvdberge.refinedstorage.item.*; import com.raoulvdberge.refinedstorage.item.blockitem.ControllerBlockItem; import com.raoulvdberge.refinedstorage.item.blockitem.StorageBlockItem; import com.raoulvdberge.refinedstorage.item.group.MainItemGroup; +import com.raoulvdberge.refinedstorage.loottable.StorageBlockLootFunctionSerializer; import com.raoulvdberge.refinedstorage.network.NetworkHandler; import com.raoulvdberge.refinedstorage.recipe.UpgradeWithEnchantedBookRecipeSerializer; import com.raoulvdberge.refinedstorage.tile.*; @@ -42,6 +43,7 @@ import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.world.storage.loot.functions.LootFunctionManager; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.extensions.IForgeContainerType; @@ -105,6 +107,8 @@ public final class RS { API.instance().getNetworkNodeRegistry().add(StorageNetworkNode.CREATIVE_STORAGE_BLOCK_ID, (tag, world, pos) -> readAndReturn(tag, new StorageNetworkNode(world, pos, ItemStorageType.CREATIVE))); API.instance().getGridManager().add(GridBlockGridFactory.ID, new GridBlockGridFactory()); + + LootFunctionManager.registerFunction(new StorageBlockLootFunctionSerializer()); } private INetworkNode readAndReturn(CompoundNBT tag, NetworkNode node) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNodeProxy.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNodeProxy.java index 97b8c3450..ce0e5a8dd 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNodeProxy.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNodeProxy.java @@ -9,6 +9,10 @@ import javax.annotation.Nonnull; */ public interface INetworkNodeProxy { /** + * Returns the node. + * Needs to work on the client and the server. + * If there is no node present, don't silently return null but throw an exception since the game is in a bad state if that happens. + * * @return the node */ @Nonnull diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/NodeBlock.java b/src/main/java/com/raoulvdberge/refinedstorage/block/NodeBlock.java index 536254f8a..9b2e7dfd5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/NodeBlock.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/NodeBlock.java @@ -1,9 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; -import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager; -import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.tile.NetworkNodeTile; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -14,9 +10,7 @@ import net.minecraft.state.StateContainer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IWorld; import net.minecraft.world.World; -import net.minecraft.world.server.ServerWorld; import net.minecraftforge.items.IItemHandler; public abstract class NodeBlock extends BaseBlock { @@ -30,24 +24,6 @@ public abstract class NodeBlock extends BaseBlock { } } - @Override - public void onPlayerDestroy(IWorld world, BlockPos pos, BlockState state) { - super.onPlayerDestroy(world, pos, state); - - if (!world.isRemote()) { - INetworkNodeManager manager = API.instance().getNetworkNodeManager((ServerWorld) world); - - INetworkNode node = manager.getNode(pos); - - manager.removeNode(pos); - manager.markForSaving(); - - if (node != null && node.getNetwork() != null) { - node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().world(), node.getNetwork().getPosition()); - } - } - } - @Override @SuppressWarnings("deprecation") public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/StorageBlock.java b/src/main/java/com/raoulvdberge/refinedstorage/block/StorageBlock.java index 3f8dfea39..dc1bceda8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/StorageBlock.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/StorageBlock.java @@ -12,13 +12,9 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Hand; -import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.IBlockReader; @@ -58,26 +54,6 @@ public class StorageBlock extends NodeBlock { super.onBlockPlacedBy(world, pos, state, entity, stack); } - // TODO Improve this dropping mechanism - @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { - if (state.getBlock() != newState.getBlock()) { - TileEntity tile = world.getTileEntity(pos); - - if (tile instanceof StorageTile) { - @SuppressWarnings("deprecation") - ItemStack drop = new ItemStack(Item.getItemFromBlock(this)); - - drop.setTag(new CompoundNBT()); - drop.getTag().putUniqueId(StorageNetworkNode.NBT_ID, ((StorageTile) tile).getNode().getStorageId()); - - InventoryHelper.dropItems(world, pos, NonNullList.from(ItemStack.EMPTY, drop)); - } - - super.onReplaced(state, world, pos, newState, isMoving); - } - } - @Override public boolean hasTileEntity(BlockState state) { return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/loottable/StorageBlockLootFunction.java b/src/main/java/com/raoulvdberge/refinedstorage/loottable/StorageBlockLootFunction.java new file mode 100644 index 000000000..ea4819394 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/loottable/StorageBlockLootFunction.java @@ -0,0 +1,24 @@ +package com.raoulvdberge.refinedstorage.loottable; + +import com.raoulvdberge.refinedstorage.apiimpl.network.node.storage.StorageNetworkNode; +import com.raoulvdberge.refinedstorage.tile.StorageTile; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.storage.loot.LootContext; +import net.minecraft.world.storage.loot.LootParameters; +import net.minecraft.world.storage.loot.functions.ILootFunction; + +public class StorageBlockLootFunction implements ILootFunction { + @Override + public ItemStack apply(ItemStack stack, LootContext lootContext) { + TileEntity tile = lootContext.get(LootParameters.BLOCK_ENTITY); + + if (tile != null) { + stack.setTag(new CompoundNBT()); + stack.getTag().putUniqueId(StorageNetworkNode.NBT_ID, ((StorageTile) tile).getRemovedNode().getStorageId()); + } + + return stack; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/loottable/StorageBlockLootFunctionSerializer.java b/src/main/java/com/raoulvdberge/refinedstorage/loottable/StorageBlockLootFunctionSerializer.java new file mode 100644 index 000000000..26a9696da --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/loottable/StorageBlockLootFunctionSerializer.java @@ -0,0 +1,24 @@ +package com.raoulvdberge.refinedstorage.loottable; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.raoulvdberge.refinedstorage.RS; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.storage.loot.functions.ILootFunction; + +public class StorageBlockLootFunctionSerializer extends ILootFunction.Serializer { + public StorageBlockLootFunctionSerializer() { + super(new ResourceLocation(RS.ID, "storage_block"), StorageBlockLootFunction.class); + } + + @Override + public void serialize(JsonObject jsonObject, StorageBlockLootFunction storageBlockLootFunction, JsonSerializationContext jsonSerializationContext) { + + } + + @Override + public StorageBlockLootFunction deserialize(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) { + return new StorageBlockLootFunction(); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/NetworkNodeTile.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/NetworkNodeTile.java index 0686db199..98f71a156 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/NetworkNodeTile.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/NetworkNodeTile.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; +import com.raoulvdberge.refinedstorage.api.util.Action; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; @@ -32,6 +33,8 @@ public abstract class NetworkNodeTile extends BaseTile im private LazyOptional> networkNodeProxy = LazyOptional.of(() -> this); + private N removedNode; + public NetworkNodeTile(TileEntityType tileType) { super(tileType); @@ -83,13 +86,52 @@ public abstract class NetworkNodeTile extends BaseTile im INetworkNode node = manager.getNode(pos); if (node == null) { - manager.setNode(pos, node = createNode(world, pos)); - manager.markForSaving(); + throw new RuntimeException("No network node present at " + pos.toString()); } return (N) node; } + @Override + public void validate() { + super.validate(); + + if (!world.isRemote) { + INetworkNodeManager manager = API.instance().getNetworkNodeManager((ServerWorld) world); + + if (manager.getNode(pos) == null) { + manager.setNode(pos, createNode(world, pos)); + manager.markForSaving(); + } + } + } + + @Override + public void remove() { + super.remove(); + + if (!world.isRemote) { + INetworkNodeManager manager = API.instance().getNetworkNodeManager((ServerWorld) world); + + INetworkNode node = manager.getNode(pos); + + if (node != null) { + removedNode = (N) node; + } + + manager.removeNode(pos); + manager.markForSaving(); + + if (node != null && node.getNetwork() != null) { + node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().world(), node.getNetwork().getPosition()); + } + } + } + + public N getRemovedNode() { + return removedNode; + } + public abstract N createNode(World world, BlockPos pos); @Nonnull diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/16k_storage_block.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/16k_storage_block.json new file mode 100644 index 000000000..56d5526f5 --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/16k_storage_block.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:16k_storage_block", + "functions": [ + { + "function": "refinedstorage:storage_block" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/1k_storage_block.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/1k_storage_block.json new file mode 100644 index 000000000..ed9575f9a --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/1k_storage_block.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:1k_storage_block", + "functions": [ + { + "function": "refinedstorage:storage_block" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/4k_storage_block.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/4k_storage_block.json new file mode 100644 index 000000000..51eaff977 --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/4k_storage_block.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:4k_storage_block", + "functions": [ + { + "function": "refinedstorage:storage_block" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/64k_storage_block.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/64k_storage_block.json new file mode 100644 index 000000000..239dcf8ed --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/64k_storage_block.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:64k_storage_block", + "functions": [ + { + "function": "refinedstorage:storage_block" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/creative_storage_block.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/creative_storage_block.json new file mode 100644 index 000000000..41f531691 --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/creative_storage_block.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:creative_storage_block", + "functions": [ + { + "function": "refinedstorage:storage_block" + } + ] + } + ] + } + ] +} \ No newline at end of file