Use listener on detector to avoid race conditions

This commit is contained in:
Raoul Van den Berge
2016-08-05 16:20:08 +02:00
parent 759361b35b
commit 20b00a0c28
5 changed files with 53 additions and 22 deletions

View File

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

View File

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

View File

@@ -0,0 +1,5 @@
package refinedstorage.tile.data;
public interface ITileDataListener {
void onChanged();
}

View File

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

View File

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