From 5afc377b2bb2e68c3a8f8f2cb4a0fbeea023a006 Mon Sep 17 00:00:00 2001 From: Justin Aquadro Date: Fri, 24 Apr 2015 01:44:25 -0400 Subject: [PATCH] Rework controller network code; pass through any INetworked block. --- .../api/storage/INetworked.java | 5 + .../block/BlockCompDrawers.java | 3 +- .../storagedrawers/block/BlockController.java | 3 +- .../storagedrawers/block/BlockDrawers.java | 3 +- .../block/tile/TileEntityController.java | 137 +++++++++++++----- 5 files changed, 112 insertions(+), 39 deletions(-) create mode 100644 src/com/jaquadro/minecraft/storagedrawers/api/storage/INetworked.java diff --git a/src/com/jaquadro/minecraft/storagedrawers/api/storage/INetworked.java b/src/com/jaquadro/minecraft/storagedrawers/api/storage/INetworked.java new file mode 100644 index 0000000..fba20d4 --- /dev/null +++ b/src/com/jaquadro/minecraft/storagedrawers/api/storage/INetworked.java @@ -0,0 +1,5 @@ +package com.jaquadro.minecraft.storagedrawers.api.storage; + +public interface INetworked +{ +} diff --git a/src/com/jaquadro/minecraft/storagedrawers/block/BlockCompDrawers.java b/src/com/jaquadro/minecraft/storagedrawers/block/BlockCompDrawers.java index b66efc6..3c5fd90 100644 --- a/src/com/jaquadro/minecraft/storagedrawers/block/BlockCompDrawers.java +++ b/src/com/jaquadro/minecraft/storagedrawers/block/BlockCompDrawers.java @@ -2,6 +2,7 @@ package com.jaquadro.minecraft.storagedrawers.block; import com.jaquadro.minecraft.storagedrawers.StorageDrawers; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; +import com.jaquadro.minecraft.storagedrawers.api.storage.INetworked; import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers; import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawersComp; import cpw.mods.fml.relauncher.Side; @@ -19,7 +20,7 @@ import net.minecraft.world.World; import java.util.List; -public class BlockCompDrawers extends BlockDrawers +public class BlockCompDrawers extends BlockDrawers implements INetworked { @SideOnly(Side.CLIENT) private IIcon[] iconFront; diff --git a/src/com/jaquadro/minecraft/storagedrawers/block/BlockController.java b/src/com/jaquadro/minecraft/storagedrawers/block/BlockController.java index 9b67961..cdd3905 100644 --- a/src/com/jaquadro/minecraft/storagedrawers/block/BlockController.java +++ b/src/com/jaquadro/minecraft/storagedrawers/block/BlockController.java @@ -1,6 +1,7 @@ package com.jaquadro.minecraft.storagedrawers.block; import com.jaquadro.minecraft.storagedrawers.StorageDrawers; +import com.jaquadro.minecraft.storagedrawers.api.storage.INetworked; import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityController; import com.jaquadro.minecraft.storagedrawers.core.ModCreativeTabs; import cpw.mods.fml.relauncher.Side; @@ -21,7 +22,7 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.Random; -public class BlockController extends BlockContainer +public class BlockController extends BlockContainer implements INetworked { @SideOnly(Side.CLIENT) private IIcon iconFront; diff --git a/src/com/jaquadro/minecraft/storagedrawers/block/BlockDrawers.java b/src/com/jaquadro/minecraft/storagedrawers/block/BlockDrawers.java index 9cde5b6..fec7c5e 100644 --- a/src/com/jaquadro/minecraft/storagedrawers/block/BlockDrawers.java +++ b/src/com/jaquadro/minecraft/storagedrawers/block/BlockDrawers.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.jaquadro.minecraft.storagedrawers.StorageDrawers; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; +import com.jaquadro.minecraft.storagedrawers.api.storage.INetworked; import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers; import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawersStandard; import com.jaquadro.minecraft.storagedrawers.config.ConfigManager; @@ -44,7 +45,7 @@ import java.io.InputStreamReader; import java.util.List; import java.util.Random; -public class BlockDrawers extends BlockContainer implements IExtendedBlockClickHandler +public class BlockDrawers extends BlockContainer implements IExtendedBlockClickHandler, INetworked { private static final ResourceLocation blockConfig = new ResourceLocation(StorageDrawers.MOD_ID + ":textures/blocks/block_config.mcmeta"); diff --git a/src/com/jaquadro/minecraft/storagedrawers/block/tile/TileEntityController.java b/src/com/jaquadro/minecraft/storagedrawers/block/tile/TileEntityController.java index c396c33..630af0a 100644 --- a/src/com/jaquadro/minecraft/storagedrawers/block/tile/TileEntityController.java +++ b/src/com/jaquadro/minecraft/storagedrawers/block/tile/TileEntityController.java @@ -4,6 +4,8 @@ import com.jaquadro.minecraft.storagedrawers.api.inventory.IDrawerInventory; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroupInteractive; +import com.jaquadro.minecraft.storagedrawers.api.storage.INetworked; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -157,28 +159,21 @@ public class TileEntityController extends TileEntity implements IDrawerGroup, IS public void updateCache () { int preCount = inventorySlots.length; - for (StorageRecord record : storage.values()) + for (StorageRecord record : storage.values()) { record.mark = false; + record.distance = Integer.MAX_VALUE; + } populateNode(xCoord, yCoord, zCoord, 0); for (BlockCoord coord : storage.keySet()) { StorageRecord record = storage.get(coord); - if (!record.mark) { - record.clear(); - - for (int i = 0, n = invBlockList.size(); i < n; i++) { - if (coord.equals(invBlockList.get(i))) - invBlockList.set(i, null); - } - - for (int i = 0, n = drawerBlockList.size(); i < n; i++) { - if (coord.equals(drawerBlockList.get(i))) - drawerBlockList.set(i, null); - } - } + if (!record.mark) + clearRecordInfo(coord, record); } + flattenLists(); + inventorySlots = new int[invBlockList.size()]; for (int i = 0, j = 0, n = invBlockList.size(); i < n; i++) { inventorySlots[j++] = i; @@ -190,35 +185,79 @@ public class TileEntityController extends TileEntity implements IDrawerGroup, IS } } - private void populateNode (int x, int y, int z, int depth) { - TileEntity te = worldObj.getTileEntity(x, y, z); - if (te == null || !(te instanceof IDrawerGroup)) - return; + private boolean containsNullEntries (List list) { + int nullCount = 0; + for (int i = 0, n = list.size(); i < n; i++) { + if (list.get(i) == null) + nullCount++; + } - if (depth > DEPTH_LIMIT) - return; + return nullCount > 0; + } - BlockCoord coord = new BlockCoord(x, y, z); - StorageRecord record = storage.get(coord); + private void flattenLists () { + if (containsNullEntries(invBlockList)) { + List newInvBlockList = new ArrayList(); + List newInvSlotLit = new ArrayList(); - if (record != null) { - if (record.storage != null) { - if (!record.mark || record.distance > depth) { - record.mark = true; - record.distance = depth; - populateNeighborNodes(x, y, z, depth + 1); + for (int i = 0, n = invBlockList.size(); i < n; i++) { + BlockCoord coord = invBlockList.get(i); + if (coord != null) { + newInvBlockList.add(coord); + newInvSlotLit.add(invSlotList.get(i)); } - return; } - } - else { - record = new StorageRecord(); - storage.put(coord, record); + + invBlockList = newInvBlockList; + invSlotList = newInvSlotLit; } - record.mark = true; + if (containsNullEntries(drawerBlockList)) { + List newDrawerBlockList = new ArrayList(); + List newDrawerSlotList = new ArrayList(); + + for (int i = 0, n = drawerBlockList.size(); i < n; i++) { + BlockCoord coord = drawerBlockList.get(i); + if (coord != null) { + newDrawerBlockList.add(coord); + newDrawerSlotList.add(drawerSlotList.get(i)); + } + } + + drawerBlockList = newDrawerBlockList; + drawerSlotList = newDrawerSlotList; + } + } + + private void clearRecordInfo (BlockCoord coord, StorageRecord record) { + record.clear(); + + for (int i = 0, n = invBlockList.size(); i < n; i++) { + if (coord.equals(invBlockList.get(i))) + invBlockList.set(i, null); + } + + for (int i = 0, n = drawerBlockList.size(); i < n; i++) { + if (coord.equals(drawerBlockList.get(i))) + drawerBlockList.set(i, null); + } + } + + private void updateRecordInfo (BlockCoord coord, StorageRecord record, TileEntity te) { + if (te == null || !(te instanceof IDrawerGroup)) { + if (record.storage != null) + clearRecordInfo(coord, record); + + return; + } if (te instanceof TileEntityController) { + if (record.storage == null && record.invStorageSize > 0) + return; + + if (record.storage != null) + clearRecordInfo(coord, record); + record.storage = null; record.invStorageSize = 1; @@ -227,6 +266,12 @@ public class TileEntityController extends TileEntity implements IDrawerGroup, IS } else { IDrawerGroup group = (IDrawerGroup)te; + if (record.storage == group) + return; + + if (record.storage != null && record.storage != group) + clearRecordInfo(coord, record); + IDrawerInventory inventory = group.getDrawerInventory(); if (inventory == null) return; @@ -247,11 +292,31 @@ public class TileEntityController extends TileEntity implements IDrawerGroup, IS drawerSize += record.drawerStorageSize; } + } - if (depth == DEPTH_LIMIT) + private void populateNode (int x, int y, int z, int depth) { + if (depth > DEPTH_LIMIT) return; - populateNeighborNodes(x, y, z, depth + 1); + Block block = worldObj.getBlock(x, y, z); + if (!(block instanceof INetworked)) + return; + + BlockCoord coord = new BlockCoord(x, y, z); + StorageRecord record = storage.get(coord); + if (record == null) { + record = new StorageRecord(); + storage.put(coord, record); + } + + updateRecordInfo(coord, record, worldObj.getTileEntity(x, y, z)); + record.mark = true; + + if (record.distance > depth) { + record.mark = true; + record.distance = depth; + populateNeighborNodes(x, y, z, depth + 1); + } } private void populateNeighborNodes (int x, int y, int z, int depth) {