Improve storage block breaking

This commit is contained in:
raoulvdberge
2019-10-13 15:16:43 +02:00
parent 3d7a1f5881
commit 0fdb9b68a2
12 changed files with 195 additions and 50 deletions

View File

@@ -28,6 +28,7 @@ import com.raoulvdberge.refinedstorage.item.*;
import com.raoulvdberge.refinedstorage.item.blockitem.ControllerBlockItem; import com.raoulvdberge.refinedstorage.item.blockitem.ControllerBlockItem;
import com.raoulvdberge.refinedstorage.item.blockitem.StorageBlockItem; import com.raoulvdberge.refinedstorage.item.blockitem.StorageBlockItem;
import com.raoulvdberge.refinedstorage.item.group.MainItemGroup; import com.raoulvdberge.refinedstorage.item.group.MainItemGroup;
import com.raoulvdberge.refinedstorage.loottable.StorageBlockLootFunctionSerializer;
import com.raoulvdberge.refinedstorage.network.NetworkHandler; import com.raoulvdberge.refinedstorage.network.NetworkHandler;
import com.raoulvdberge.refinedstorage.recipe.UpgradeWithEnchantedBookRecipeSerializer; import com.raoulvdberge.refinedstorage.recipe.UpgradeWithEnchantedBookRecipeSerializer;
import com.raoulvdberge.refinedstorage.tile.*; import com.raoulvdberge.refinedstorage.tile.*;
@@ -42,6 +43,7 @@ import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.world.storage.loot.functions.LootFunctionManager;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.extensions.IForgeContainerType; 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().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()); API.instance().getGridManager().add(GridBlockGridFactory.ID, new GridBlockGridFactory());
LootFunctionManager.registerFunction(new StorageBlockLootFunctionSerializer());
} }
private INetworkNode readAndReturn(CompoundNBT tag, NetworkNode node) { private INetworkNode readAndReturn(CompoundNBT tag, NetworkNode node) {

View File

@@ -9,6 +9,10 @@ import javax.annotation.Nonnull;
*/ */
public interface INetworkNodeProxy<T extends INetworkNode> { public interface INetworkNodeProxy<T extends INetworkNode> {
/** /**
* 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 * @return the node
*/ */
@Nonnull @Nonnull

View File

@@ -1,9 +1,5 @@
package com.raoulvdberge.refinedstorage.block; 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 com.raoulvdberge.refinedstorage.tile.NetworkNodeTile;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@@ -14,9 +10,7 @@ import net.minecraft.state.StateContainer;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
public abstract class NodeBlock extends BaseBlock { 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 @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {

View File

@@ -12,13 +12,9 @@ import net.minecraft.block.BlockState;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
@@ -58,26 +54,6 @@ public class StorageBlock extends NodeBlock {
super.onBlockPlacedBy(world, pos, state, entity, stack); 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 @Override
public boolean hasTileEntity(BlockState state) { public boolean hasTileEntity(BlockState state) {
return true; return true;

View File

@@ -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;
}
}

View File

@@ -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<StorageBlockLootFunction> {
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();
}
}

View File

@@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.tile;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; 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.API;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable; import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
@@ -32,6 +33,8 @@ public abstract class NetworkNodeTile<N extends NetworkNode> extends BaseTile im
private LazyOptional<INetworkNodeProxy<N>> networkNodeProxy = LazyOptional.of(() -> this); private LazyOptional<INetworkNodeProxy<N>> networkNodeProxy = LazyOptional.of(() -> this);
private N removedNode;
public NetworkNodeTile(TileEntityType<?> tileType) { public NetworkNodeTile(TileEntityType<?> tileType) {
super(tileType); super(tileType);
@@ -83,13 +86,52 @@ public abstract class NetworkNodeTile<N extends NetworkNode> extends BaseTile im
INetworkNode node = manager.getNode(pos); INetworkNode node = manager.getNode(pos);
if (node == null) { if (node == null) {
manager.setNode(pos, node = createNode(world, pos)); throw new RuntimeException("No network node present at " + pos.toString());
manager.markForSaving();
} }
return (N) node; 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); public abstract N createNode(World world, BlockPos pos);
@Nonnull @Nonnull

View File

@@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "refinedstorage:16k_storage_block",
"functions": [
{
"function": "refinedstorage:storage_block"
}
]
}
]
}
]
}

View File

@@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "refinedstorage:1k_storage_block",
"functions": [
{
"function": "refinedstorage:storage_block"
}
]
}
]
}
]
}

View File

@@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "refinedstorage:4k_storage_block",
"functions": [
{
"function": "refinedstorage:storage_block"
}
]
}
]
}
]
}

View File

@@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "refinedstorage:64k_storage_block",
"functions": [
{
"function": "refinedstorage:storage_block"
}
]
}
]
}
]
}

View File

@@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "refinedstorage:creative_storage_block",
"functions": [
{
"function": "refinedstorage:storage_block"
}
]
}
]
}
]
}