Use listener on detector to avoid race conditions
This commit is contained in:
@@ -6,14 +6,13 @@ import refinedstorage.api.storage.CompareUtils;
|
|||||||
import refinedstorage.container.ContainerDetector;
|
import refinedstorage.container.ContainerDetector;
|
||||||
import refinedstorage.gui.sidebutton.SideButtonCompare;
|
import refinedstorage.gui.sidebutton.SideButtonCompare;
|
||||||
import refinedstorage.gui.sidebutton.SideButtonDetectorMode;
|
import refinedstorage.gui.sidebutton.SideButtonDetectorMode;
|
||||||
import refinedstorage.tile.TileDestructor;
|
|
||||||
import refinedstorage.tile.TileDetector;
|
import refinedstorage.tile.TileDetector;
|
||||||
import refinedstorage.tile.data.TileDataManager;
|
import refinedstorage.tile.data.TileDataManager;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class GuiDetector extends GuiBase {
|
public class GuiDetector extends GuiBase {
|
||||||
private GuiTextField amountField;
|
public static GuiTextField AMOUNT;
|
||||||
|
|
||||||
public GuiDetector(ContainerDetector container) {
|
public GuiDetector(ContainerDetector container) {
|
||||||
super(container, 176, 137);
|
super(container, 176, 137);
|
||||||
@@ -21,19 +20,18 @@ public class GuiDetector extends GuiBase {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(int x, int y) {
|
public void init(int x, int y) {
|
||||||
addSideButton(new SideButtonCompare(TileDestructor.COMPARE, CompareUtils.COMPARE_DAMAGE));
|
addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_DAMAGE));
|
||||||
addSideButton(new SideButtonCompare(TileDestructor.COMPARE, CompareUtils.COMPARE_NBT));
|
addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_NBT));
|
||||||
|
|
||||||
addSideButton(new SideButtonDetectorMode());
|
addSideButton(new SideButtonDetectorMode());
|
||||||
|
|
||||||
amountField = new GuiTextField(0, fontRendererObj, x + 62 + 1, y + 23 + 1, 25, fontRendererObj.FONT_HEIGHT);
|
AMOUNT = new GuiTextField(0, fontRendererObj, x + 62 + 1, y + 23 + 1, 25, fontRendererObj.FONT_HEIGHT);
|
||||||
// @TODO: Change when the packet is received instead
|
AMOUNT.setText(String.valueOf(TileDetector.AMOUNT.getValue()));
|
||||||
amountField.setText(String.valueOf(TileDetector.AMOUNT.getValue()));
|
AMOUNT.setEnableBackgroundDrawing(false);
|
||||||
amountField.setEnableBackgroundDrawing(false);
|
AMOUNT.setVisible(true);
|
||||||
amountField.setVisible(true);
|
AMOUNT.setTextColor(16777215);
|
||||||
amountField.setTextColor(16777215);
|
AMOUNT.setCanLoseFocus(false);
|
||||||
amountField.setCanLoseFocus(false);
|
AMOUNT.setFocused(true);
|
||||||
amountField.setFocused(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -46,7 +44,7 @@ public class GuiDetector extends GuiBase {
|
|||||||
|
|
||||||
drawTexture(x, y, 0, 0, width, height);
|
drawTexture(x, y, 0, 0, width, height);
|
||||||
|
|
||||||
amountField.drawTextBox();
|
AMOUNT.drawTextBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -57,8 +55,8 @@ public class GuiDetector extends GuiBase {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void keyTyped(char character, int keyCode) throws IOException {
|
protected void keyTyped(char character, int keyCode) throws IOException {
|
||||||
if (!checkHotbarKeys(keyCode) && amountField.textboxKeyTyped(character, keyCode)) {
|
if (!checkHotbarKeys(keyCode) && AMOUNT.textboxKeyTyped(character, keyCode)) {
|
||||||
Integer result = Ints.tryParse(amountField.getText());
|
Integer result = Ints.tryParse(AMOUNT.getText());
|
||||||
|
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
TileDataManager.setParameter(TileDetector.AMOUNT, result);
|
TileDataManager.setParameter(TileDetector.AMOUNT, result);
|
||||||
|
|||||||
@@ -1,19 +1,21 @@
|
|||||||
package refinedstorage.tile;
|
package refinedstorage.tile;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.network.datasync.DataSerializers;
|
import net.minecraft.network.datasync.DataSerializers;
|
||||||
|
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||||
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageBlocks;
|
import refinedstorage.RefinedStorageBlocks;
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
import refinedstorage.api.network.INetworkMaster;
|
||||||
|
import refinedstorage.gui.GuiDetector;
|
||||||
import refinedstorage.inventory.ItemHandlerBasic;
|
import refinedstorage.inventory.ItemHandlerBasic;
|
||||||
import refinedstorage.tile.config.IComparable;
|
import refinedstorage.tile.config.IComparable;
|
||||||
import refinedstorage.tile.config.RedstoneMode;
|
import refinedstorage.tile.config.RedstoneMode;
|
||||||
import refinedstorage.tile.data.ITileDataConsumer;
|
import refinedstorage.tile.data.*;
|
||||||
import refinedstorage.tile.data.ITileDataProducer;
|
|
||||||
import refinedstorage.tile.data.TileDataManager;
|
|
||||||
import refinedstorage.tile.data.TileDataParameter;
|
|
||||||
|
|
||||||
public class TileDetector extends TileNode implements IComparable {
|
public class TileDetector extends TileNode implements IComparable {
|
||||||
public static final TileDataParameter COMPARE = IComparable.createParameter();
|
public static final TileDataParameter COMPARE = IComparable.createParameter();
|
||||||
@@ -34,7 +36,7 @@ public class TileDetector extends TileNode implements IComparable {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
public static final TileDataParameter AMOUNT = TileDataManager.createParameter(DataSerializers.VARINT, new ITileDataProducer<Integer, TileDetector>() {
|
public static final TileDataParameter<Integer> AMOUNT = TileDataManager.createParameter(DataSerializers.VARINT, new ITileDataProducer<Integer, TileDetector>() {
|
||||||
@Override
|
@Override
|
||||||
public Integer getValue(TileDetector tile) {
|
public Integer getValue(TileDetector tile) {
|
||||||
return tile.amount;
|
return tile.amount;
|
||||||
@@ -46,6 +48,17 @@ public class TileDetector extends TileNode implements IComparable {
|
|||||||
|
|
||||||
tile.markDirty();
|
tile.markDirty();
|
||||||
}
|
}
|
||||||
|
}, new ITileDataListener() {
|
||||||
|
@Override
|
||||||
|
public void onChanged() {
|
||||||
|
if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
|
||||||
|
GuiScreen gui = Minecraft.getMinecraft().currentScreen;
|
||||||
|
|
||||||
|
if (gui instanceof GuiDetector) {
|
||||||
|
((GuiDetector) gui).AMOUNT.setText(String.valueOf(AMOUNT.getValue()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
private static final int SPEED = 5;
|
private static final int SPEED = 5;
|
||||||
|
|||||||
5
src/main/java/refinedstorage/tile/data/ITileDataListener.java
Executable file
5
src/main/java/refinedstorage/tile/data/ITileDataListener.java
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
package refinedstorage.tile.data;
|
||||||
|
|
||||||
|
public interface ITileDataListener {
|
||||||
|
void onChanged();
|
||||||
|
}
|
||||||
@@ -29,7 +29,11 @@ public class TileDataManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static TileDataParameter createParameter(DataSerializer serializer, ITileDataProducer producer, ITileDataConsumer consumer) {
|
public static TileDataParameter createParameter(DataSerializer serializer, ITileDataProducer producer, ITileDataConsumer consumer) {
|
||||||
TileDataParameter parameter = new TileDataParameter(PARAMETER_ID++, serializer, producer, consumer);
|
return createParameter(serializer, producer, consumer, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TileDataParameter createParameter(DataSerializer serializer, ITileDataProducer producer, ITileDataConsumer consumer, ITileDataListener listener) {
|
||||||
|
TileDataParameter parameter = new TileDataParameter(PARAMETER_ID++, serializer, producer, consumer, listener);
|
||||||
|
|
||||||
PARAMETER_MAP.put(parameter.getId(), parameter);
|
PARAMETER_MAP.put(parameter.getId(), parameter);
|
||||||
|
|
||||||
|
|||||||
@@ -2,18 +2,21 @@ package refinedstorage.tile.data;
|
|||||||
|
|
||||||
import net.minecraft.network.datasync.DataSerializer;
|
import net.minecraft.network.datasync.DataSerializer;
|
||||||
|
|
||||||
|
// @TODO: Annotate me better!
|
||||||
public class TileDataParameter<T> {
|
public class TileDataParameter<T> {
|
||||||
private int id;
|
private int id;
|
||||||
private DataSerializer<T> serializer;
|
private DataSerializer<T> serializer;
|
||||||
private ITileDataProducer valueProducer;
|
private ITileDataProducer valueProducer;
|
||||||
private ITileDataConsumer valueConsumer;
|
private ITileDataConsumer valueConsumer;
|
||||||
|
private ITileDataListener listener;
|
||||||
private T value;
|
private T value;
|
||||||
|
|
||||||
public TileDataParameter(int id, DataSerializer<T> serializer, ITileDataProducer producer, ITileDataConsumer consumer) {
|
public TileDataParameter(int id, DataSerializer<T> serializer, ITileDataProducer producer, ITileDataConsumer consumer, ITileDataListener listener) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.serializer = serializer;
|
this.serializer = serializer;
|
||||||
this.valueProducer = producer;
|
this.valueProducer = producer;
|
||||||
this.valueConsumer = consumer;
|
this.valueConsumer = consumer;
|
||||||
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getId() {
|
public int getId() {
|
||||||
@@ -32,8 +35,16 @@ public class TileDataParameter<T> {
|
|||||||
return valueConsumer;
|
return valueConsumer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ITileDataListener getListener() {
|
||||||
|
return listener;
|
||||||
|
}
|
||||||
|
|
||||||
public void setValue(T value) {
|
public void setValue(T value) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
|
|
||||||
|
if (listener != null) {
|
||||||
|
listener.onChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public T getValue() {
|
public T getValue() {
|
||||||
|
|||||||
Reference in New Issue
Block a user