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