Skip to content

Commit

Permalink
Fix client / server desync between tile parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
raoulvdberge committed Aug 9, 2016
1 parent 95be3b8 commit 796a654
Show file tree
Hide file tree
Showing 16 changed files with 81 additions and 78 deletions.
55 changes: 33 additions & 22 deletions src/main/java/refinedstorage/proxy/CommonProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,13 @@
import refinedstorage.network.*;
import refinedstorage.tile.*;
import refinedstorage.tile.data.ContainerListener;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.externalstorage.TileExternalStorage;
import refinedstorage.tile.grid.TileGrid;

import java.util.ArrayList;
import java.util.List;

import static refinedstorage.RefinedStorage.ID;

public class CommonProxy {
protected List<BlockCable> cables = new ArrayList<>();

Expand Down Expand Up @@ -62,26 +61,26 @@ public void preInit(FMLPreInitializationEvent e) {

MinecraftForge.EVENT_BUS.register(new ContainerListener());

GameRegistry.registerTileEntity(TileController.class, ID + ":controller");
GameRegistry.registerTileEntity(TileGrid.class, ID + ":grid");
GameRegistry.registerTileEntity(TileDiskDrive.class, ID + ":disk_drive");
GameRegistry.registerTileEntity(TileExternalStorage.class, ID + ":external_storage");
GameRegistry.registerTileEntity(TileImporter.class, ID + ":importer");
GameRegistry.registerTileEntity(TileExporter.class, ID + ":exporter");
GameRegistry.registerTileEntity(TileDetector.class, ID + ":detector");
GameRegistry.registerTileEntity(TileSolderer.class, ID + ":solderer");
GameRegistry.registerTileEntity(TileDestructor.class, ID + ":destructor");
GameRegistry.registerTileEntity(TileConstructor.class, ID + ":constructor");
GameRegistry.registerTileEntity(TileStorage.class, ID + ":storage");
GameRegistry.registerTileEntity(TileRelay.class, ID + ":relay");
GameRegistry.registerTileEntity(TileInterface.class, ID + ":interface");
GameRegistry.registerTileEntity(TileCraftingMonitor.class, ID + ":crafting_monitor");
GameRegistry.registerTileEntity(TileWirelessTransmitter.class, ID + ":wireless_transmitter");
GameRegistry.registerTileEntity(TileCrafter.class, ID + ":crafter");
GameRegistry.registerTileEntity(TileProcessingPatternEncoder.class, ID + ":processing_pattern_encoder");
GameRegistry.registerTileEntity(TileCable.class, ID + ":cable");
GameRegistry.registerTileEntity(TileNetworkReceiver.class, ID + ":network_receiver");
GameRegistry.registerTileEntity(TileNetworkTransmitter.class, ID + ":network_transmitter");
registerTile(TileController.class, "controller");
registerTile(TileGrid.class, "grid");
registerTile(TileDiskDrive.class, "disk_drive");
registerTile(TileExternalStorage.class, "external_storage");
registerTile(TileImporter.class, "importer");
registerTile(TileExporter.class, "exporter");
registerTile(TileDetector.class, "detector");
registerTile(TileSolderer.class, "solderer");
registerTile(TileDestructor.class, "destructor");
registerTile(TileConstructor.class, "constructor");
registerTile(TileStorage.class, "storage");
registerTile(TileRelay.class, "relay");
registerTile(TileInterface.class, "interface");
registerTile(TileCraftingMonitor.class, "crafting_monitor");
registerTile(TileWirelessTransmitter.class, "wireless_transmitter");
registerTile(TileCrafter.class, "crafter");
registerTile(TileProcessingPatternEncoder.class, "processing_pattern_encoder");
registerTile(TileCable.class, "cable");
registerTile(TileNetworkReceiver.class, "network_receiver");
registerTile(TileNetworkTransmitter.class, "network_transmitter");

registerBlock(RefinedStorageBlocks.CONTROLLER);
registerBlock(RefinedStorageBlocks.GRID);
Expand Down Expand Up @@ -538,6 +537,18 @@ private void registerBlock(BlockCable cable) {
cables.add(cable);
}

private void registerTile(Class<? extends TileBase> tile, String id) {
GameRegistry.registerTileEntity(tile, RefinedStorage.ID + ":" + id);

try {
TileBase tileInstance = tile.newInstance();

tileInstance.getDataManager().getParameters().forEach(TileDataManager::registerParameter);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}

private void registerItem(Item item) {
GameRegistry.register(item);
}
Expand Down
9 changes: 4 additions & 5 deletions src/main/java/refinedstorage/tile/TileController.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.RefinedStorageSerializers;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;
import refinedstorage.tile.externalstorage.ExternalStorage;

Expand All @@ -56,28 +55,28 @@
public class TileController extends TileBase implements INetworkMaster, IEnergyReceiver, IRedstoneConfigurable {
public static final TileDataParameter<Integer> REDSTONE_MODE = RedstoneMode.createParameter();

public static final TileDataParameter<Integer> ENERGY_USAGE = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileController>() {
public static final TileDataParameter<Integer> ENERGY_USAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileController>() {
@Override
public Integer getValue(TileController tile) {
return tile.getEnergyUsage();
}
});

public static final TileDataParameter<Integer> ENERGY_STORED = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileController>() {
public static final TileDataParameter<Integer> ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileController>() {
@Override
public Integer getValue(TileController tile) {
return tile.getEnergy().getEnergyStored();
}
});

public static final TileDataParameter<Integer> ENERGY_CAPACITY = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileController>() {
public static final TileDataParameter<Integer> ENERGY_CAPACITY = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileController>() {
@Override
public Integer getValue(TileController tile) {
return tile.getEnergy().getMaxEnergyStored();
}
});

public static final TileDataParameter<List<ClientNode>> NODES = TileDataManager.createParameter(RefinedStorageSerializers.CLIENT_NODE_SERIALIZER, new ArrayList<>(), new ITileDataProducer<List<ClientNode>, TileController>() {
public static final TileDataParameter<List<ClientNode>> NODES = new TileDataParameter<>(RefinedStorageSerializers.CLIENT_NODE_SERIALIZER, new ArrayList<>(), new ITileDataProducer<List<ClientNode>, TileController>() {
@Override
public List<ClientNode> getValue(TileController tile) {
List<ClientNode> nodes = new ArrayList<>();
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/refinedstorage/tile/TileCraftingMonitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import refinedstorage.RefinedStorage;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.RefinedStorageSerializers;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

import java.util.ArrayList;
Expand All @@ -12,7 +11,7 @@
import java.util.stream.Collectors;

public class TileCraftingMonitor extends TileNode {
public static final TileDataParameter<List<ClientCraftingTask>> TASKS = TileDataManager.createParameter(RefinedStorageSerializers.CLIENT_CRAFTING_TASK_SERIALIZER, new ArrayList<>(), new ITileDataProducer<List<ClientCraftingTask>, TileCraftingMonitor>() {
public static final TileDataParameter<List<ClientCraftingTask>> TASKS = new TileDataParameter<>(RefinedStorageSerializers.CLIENT_CRAFTING_TASK_SERIALIZER, new ArrayList<>(), new ITileDataProducer<List<ClientCraftingTask>, TileCraftingMonitor>() {
@Override
public List<ClientCraftingTask> getValue(TileCraftingMonitor tile) {
if (tile.connected) {
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/refinedstorage/tile/TileDetector.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@
import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.data.ITileDataConsumer;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public class TileDetector extends TileNode implements IComparable {
public static final TileDataParameter<Integer> COMPARE = IComparable.createParameter();

public static final TileDataParameter<Integer> MODE = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileDetector>() {
public static final TileDataParameter<Integer> MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileDetector>() {
@Override
public Integer getValue(TileDetector tile) {
return tile.mode;
Expand All @@ -39,7 +38,7 @@ public void setValue(TileDetector tile, Integer value) {
}
});

public static final TileDataParameter<Integer> AMOUNT = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileDetector>() {
public static final TileDataParameter<Integer> AMOUNT = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileDetector>() {
@Override
public Integer getValue(TileDetector tile) {
return tile.amount;
Expand Down
7 changes: 3 additions & 4 deletions src/main/java/refinedstorage/tile/TileNetworkTransmitter.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,24 @@
import refinedstorage.item.ItemNetworkCard;
import refinedstorage.item.ItemUpgrade;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public class TileNetworkTransmitter extends TileNode {
public static final TileDataParameter<Integer> DISTANCE = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileNetworkTransmitter>() {
public static final TileDataParameter<Integer> DISTANCE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileNetworkTransmitter>() {
@Override
public Integer getValue(TileNetworkTransmitter tile) {
return (tile.receiver != null && tile.isSameDimension()) ? tile.getDistance() : -1;
}
});

public static final TileDataParameter<Integer> RECEIVER_DIMENSION = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileNetworkTransmitter>() {
public static final TileDataParameter<Integer> RECEIVER_DIMENSION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileNetworkTransmitter>() {
@Override
public Integer getValue(TileNetworkTransmitter tile) {
return tile.receiverDimension;
}
});

public static final TileDataParameter<Boolean> RECEIVER_DIMENSION_SUPPORTED = TileDataManager.createParameter(DataSerializers.BOOLEAN, false, new ITileDataProducer<Boolean, TileNetworkTransmitter>() {
public static final TileDataParameter<Boolean> RECEIVER_DIMENSION_SUPPORTED = new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer<Boolean, TileNetworkTransmitter>() {
@Override
public Boolean getValue(TileNetworkTransmitter tile) {
return tile.isDimensionSupported();
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/refinedstorage/tile/TileSolderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,17 @@
import refinedstorage.inventory.ItemHandlerUpgrade;
import refinedstorage.item.ItemUpgrade;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public class TileSolderer extends TileNode {
public static final TileDataParameter<Integer> DURATION = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileSolderer>() {
public static final TileDataParameter<Integer> DURATION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileSolderer>() {
@Override
public Integer getValue(TileSolderer tile) {
return tile.recipe != null ? tile.recipe.getDuration() : 0;
}
});

public static final TileDataParameter<Integer> PROGRESS = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileSolderer>() {
public static final TileDataParameter<Integer> PROGRESS = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileSolderer>() {
@Override
public Integer getValue(TileSolderer tile) {
return tile.progress;
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/refinedstorage/tile/TileStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import refinedstorage.tile.config.IFilterable;
import refinedstorage.tile.config.IPrioritizable;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

import java.util.List;
Expand All @@ -27,7 +26,7 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG
public static final TileDataParameter<Integer> PRIORITY = IPrioritizable.createParameter();
public static final TileDataParameter<Integer> COMPARE = IComparable.createParameter();
public static final TileDataParameter<Integer> MODE = IFilterable.createParameter();
public static final TileDataParameter<Integer> STORED = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileStorage>() {
public static final TileDataParameter<Integer> STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileStorage>() {
@Override
public Integer getValue(TileStorage tile) {
return NBTStorage.getStoredFromNBT(tile.storageTag);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@
import refinedstorage.inventory.ItemHandlerUpgrade;
import refinedstorage.item.ItemUpgrade;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public class TileWirelessTransmitter extends TileNode implements IWirelessTransmitter {
public static final TileDataParameter<Integer> RANGE = TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileWirelessTransmitter>() {
public static final TileDataParameter<Integer> RANGE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileWirelessTransmitter>() {
@Override
public Integer getValue(TileWirelessTransmitter tile) {
return tile.getRange();
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/refinedstorage/tile/config/IComparable.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
import net.minecraft.tileentity.TileEntity;
import refinedstorage.tile.data.ITileDataConsumer;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public interface IComparable {
static <T extends TileEntity> TileDataParameter<Integer> createParameter() {
return TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
@Override
public Integer getValue(T tile) {
return ((IComparable) tile).getCompare();
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/refinedstorage/tile/config/IFilterable.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.tile.data.ITileDataConsumer;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public interface IFilterable {
int WHITELIST = 0;
int BLACKLIST = 1;

static <T extends TileEntity> TileDataParameter<Integer> createParameter() {
return TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
@Override
public Integer getValue(T tile) {
return ((IFilterable) tile).getMode();
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/refinedstorage/tile/config/IPrioritizable.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@
import refinedstorage.gui.GuiStorage;
import refinedstorage.tile.data.ITileDataConsumer;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public interface IPrioritizable {
static <T extends TileEntity> TileDataParameter<Integer> createParameter() {
return TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
@Override
public Integer getValue(T tile) {
return ((IPrioritizable) tile).getPriority();
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/refinedstorage/tile/config/RedstoneMode.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import net.minecraft.world.World;
import refinedstorage.tile.data.ITileDataConsumer;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;

public enum RedstoneMode {
Expand All @@ -32,7 +31,7 @@ public static RedstoneMode getById(int id) {
}

public static <T extends TileEntity> TileDataParameter<Integer> createParameter() {
return TileDataManager.createParameter(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, T>() {
@Override
public Integer getValue(T tile) {
return ((IRedstoneConfigurable) tile).getRedstoneMode().ordinal();
Expand Down
29 changes: 11 additions & 18 deletions src/main/java/refinedstorage/tile/data/TileDataManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.network.datasync.DataSerializer;
import net.minecraft.tileentity.TileEntity;
import refinedstorage.RefinedStorage;
import refinedstorage.container.ContainerBase;
Expand All @@ -17,32 +16,22 @@
import java.util.Map;

public class TileDataManager {
private static int PARAMETER_ID = 0;
private static Map<Integer, TileDataParameter> PARAMETER_MAP = new HashMap<>();
private static int LAST_ID = 0;
private static Map<Integer, TileDataParameter> REGISTRY = new HashMap<>();

private List<TileDataParameter> parameters = new ArrayList<>();

private List<TileDataParameter> watchedParameters = new ArrayList<>();
private List<Object> watchedParametersCache = new ArrayList<>();

public static <T> TileDataParameter<T> createParameter(DataSerializer<T> serializer, T defaultValue, ITileDataProducer producer) {
return createParameter(serializer, defaultValue, producer, null);
}
public static void registerParameter(TileDataParameter<?> parameter) {
parameter.setId(LAST_ID);

public static <T> TileDataParameter<T> createParameter(DataSerializer<T> serializer, T defaultValue, ITileDataProducer producer, ITileDataConsumer consumer) {
return createParameter(serializer, defaultValue, producer, consumer, null);
REGISTRY.put(LAST_ID++, parameter);
}

public static <T> TileDataParameter<T> createParameter(DataSerializer<T> serializer, T defaultValue, ITileDataProducer producer, ITileDataConsumer consumer, ITileDataListener<T> listener) {
TileDataParameter<T> parameter = new TileDataParameter<>(PARAMETER_ID++, defaultValue, serializer, producer, consumer, listener);

PARAMETER_MAP.put(parameter.getId(), parameter);

return parameter;
}

public static TileDataParameter getParameter(int id) {
return PARAMETER_MAP.get(id);
public static TileDataParameter<?> getParameter(int id) {
return REGISTRY.get(id);
}

public static <T> void setParameter(TileDataParameter<T> parameter, T value) {
Expand All @@ -59,6 +48,10 @@ public void addParameter(TileDataParameter<?> parameter) {
parameters.add(parameter);
}

public List<TileDataParameter> getParameters() {
return parameters;
}

public void addWatchedParameter(TileDataParameter<?> parameter) {
addParameter(parameter);

Expand Down

0 comments on commit 796a654

Please sign in to comment.