public class PacketHandler
{
private static int id = 0;
private static final String PROTOCOL_VERSION = "1.0";
public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
new ResourceLocation(WirelessRedstone.MODID, "main_channel"),
() -> PROTOCOL_VERSION,
PROTOCOL_VERSION::equals,
PROTOCOL_VERSION::equals
);
public static void registerMessages()
{
registerMessage(PacketFrequencyBlock.class, PacketFrequencyBlock::new);
registerMessage(PacketFrequencyItem.class, PacketFrequencyItem::new);
}
public static <P extends Packet> void registerMessage(Class<P> packetType, Function<PacketBuffer, P> decoder)
{
INSTANCE.registerMessage(id++, packetType, Packet::toBytes, decoder, Packet::handle);
}
}
public abstract class Packet
{
public Packet() {}
public Packet(PacketBuffer buffer) {}
public abstract void toBytes(PacketBuffer buffer);
public abstract void handle(Supplier<NetworkEvent.Context> ctx);
}
public abstract class PacketFrequency extends Packet
{
private int frequency;
public PacketFrequency(int frequency)
{
this.frequency = frequency;
}
public PacketFrequency(PacketBuffer buffer)
{
super(buffer);
frequency = buffer.readInt();
}
@Override
public void toBytes(PacketBuffer buffer)
{
buffer.writeInt(frequency);
}
public void setFrequency(int frequency)
{
this.frequency = frequency;
}
public int getFrequency()
{
return frequency;
}
}
public class PacketFrequencyBlock extends PacketFrequency
{
private final BlockPos pos;
public PacketFrequencyBlock(BlockPos pos)
{
super(-1);
this.pos = pos;
}
public PacketFrequencyBlock(PacketBuffer buffer)
{
super(buffer);
pos = BlockPos.fromLong(buffer.readLong());
}
@Override
public void toBytes(PacketBuffer buffer)
{
super.toBytes(buffer);
buffer.writeLong(pos.toLong());
}
@Override
public void handle(Supplier<NetworkEvent.Context> ctx)
{
ctx.get().enqueueWork(() ->
{
ServerPlayerEntity player = ctx.get().getSender();
ServerWorld world = player != null ? player.getServerWorld() : null;
if (world != null && world.isAreaLoaded(pos, 0))
WorldUtils.ifTilePresent(world, pos, TileFrequency.class, tile -> tile.setFrequency(getFrequency()));
});
ctx.get().setPacketHandled(true);
}
}
@OnlyIn(Dist.CLIENT)
public class GuiFrequency extends Screen
{
public static final ResourceLocation GUI_TEXTURE_NORMAL = new ResourceLocation(WirelessRedstone.MODID, "textures/gui/frequency.png");
public static final ResourceLocation GUI_TEXTURE_EXTENDED = new ResourceLocation(WirelessRedstone.MODID, "textures/gui/frequency_extended.png");
private ResourceLocation gui_texture = GUI_TEXTURE_NORMAL;
private int guiLeft;
private int guiTop;
private int xSize;
private int ySize;
private int frequency;
private PacketFrequency frequencyPacket;
// Standard GUI
private Button close;
private TextFieldWidget frequencyField;
private Button buttonSubtract_1;
private Button buttonSubtract_10;
private Button buttonAdd_1;
private Button buttonAdd_10;
private Button done;
// Extended GUI
private boolean extended;
private Button buttonExtend;
private TextFieldWidget frequencyName;
private Button buttonAddName;
private TextFieldWidget searchbar;
public GuiFrequency(int frequency, PacketFrequency frequencyPacket)
{
super(new TranslationTextComponent(LangKeys.Gui.FREQUENCY));
this.frequency = frequency;
this.frequencyPacket = frequencyPacket;
}
@Override
protected void init()
{
xSize = 192;
ySize = 96;
guiLeft = (width - xSize) / 2;
guiTop = (height - ySize) / 2 - 40;
// Standard GUI
addButton(close = new SizedButton(guiLeft + xSize - 18, guiTop + 6, 12, 12, new StringTextComponent("x"), 0, -1, button -> minecraft.player.closeScreen()));
addButton(buttonSubtract_1 = new SizedButton(guiLeft + 28, guiTop + 24, 36, 16, new StringTextComponent("-1"), this::buttonPressed));
addButton(buttonSubtract_10 = new SizedButton(guiLeft + 28, guiTop + 44, 36, 16, new StringTextComponent("-10"), this::buttonPressed));
addButton(buttonAdd_1 = new SizedButton(guiLeft + 128, guiTop + 24, 36, 16, new StringTextComponent("+1"), this::buttonPressed));
addButton(buttonAdd_10 = new SizedButton(guiLeft + 128, guiTop + 44, 36, 16, new StringTextComponent("+10"), this::buttonPressed));
addButton(done = new SizedButton(guiLeft + 78, guiTop + 64, 36, 18, new TranslationTextComponent(LangKeys.Gui.DONE), onPress -> sendPacket()));
frequencyField = new TextFieldWidget(font, guiLeft + 76, guiTop + 35, 38, 14, new TranslationTextComponent(LangKeys.Gui.FREQUENCY))
{
@Override
public void writeText(String textToWrite)
{
StringBuilder stringbuilder = new StringBuilder();
for (char c0 : textToWrite.toCharArray())
if (c0 >= 48 && c0 <= 57)
stringbuilder.append(c0);
super.writeText(stringbuilder.toString());
}
};
frequencyField.setMaxStringLength(5);
frequencyField.setText(String.valueOf(frequency));
frequencyField.setResponder(text ->
{
if (text == null || text.isEmpty())
{
done.active = false;
setFrequency(0);
}
else
{
done.active = true;
setFrequency(Integer.parseInt(text));
}
});
children.add(frequencyField);
// Extended GUI
addButton(buttonExtend = new SizedButton(guiLeft + xSize - 48, guiTop + ySize - 22, 42, 16, new TranslationTextComponent(LangKeys.Gui.EXTEND), this::extend));
frequencyName = new TextFieldWidget(font, guiLeft + 7, guiTop + 100, 144, 14, new TranslationTextComponent(LangKeys.Gui.FREQUENCY_NAME));
addButton(buttonAddName = new SizedButton(guiLeft + 154, guiTop + 99, 32, 16, new TranslationTextComponent(LangKeys.Gui.ADD), onPress -> System.out.println("add to list")));
buttonAddName.visible = extended;
searchbar = new TextFieldWidget(font, guiLeft + 7, guiTop + 130, 178, 14, new TranslationTextComponent(LangKeys.Gui.SEARCHBAR));
children.add(frequencyName);
children.add(searchbar);
}
private void setFrequency(int frequency)
{
this.frequency = MathUtils.constrain(frequency, 0, 99999);
}
private void buttonPressed(Button button)
{
setFrequency(frequency + Integer.parseInt(button.getMessage().getString()));
frequencyField.setText(String.valueOf(frequency));
}
private void extend(Button button)
{
extended = !extended;
if (extended)
{
ySize = 176;
buttonExtend.setMessage(new TranslationTextComponent(LangKeys.Gui.REDUCE));
gui_texture = GUI_TEXTURE_EXTENDED;
}
else
{
ySize = 96;
buttonExtend.setMessage(new TranslationTextComponent(LangKeys.Gui.EXTEND));
gui_texture = GUI_TEXTURE_NORMAL;
}
buttonAddName.visible = extended;
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers)
{
switch (keyCode)
{
case GLFW.GLFW_KEY_LEFT_SHIFT:
case GLFW.GLFW_KEY_RIGHT_SHIFT:
buttonSubtract_1.setMessage(new StringTextComponent("-100"));
buttonSubtract_10.setMessage(new StringTextComponent("-1000"));
buttonAdd_1.setMessage(new StringTextComponent("+100"));
buttonAdd_10.setMessage(new StringTextComponent("+1000"));
break;
}
return frequencyField.keyPressed(keyCode, scanCode, modifiers) || frequencyField.canWrite() || super.keyPressed(keyCode, scanCode, modifiers);
}
@Override
public boolean keyReleased(int keyCode, int scanCode, int modifiers)
{
switch (keyCode)
{
case GLFW.GLFW_KEY_LEFT_SHIFT:
case GLFW.GLFW_KEY_RIGHT_SHIFT:
buttonSubtract_1.setMessage(new StringTextComponent("-1"));
buttonSubtract_10.setMessage(new StringTextComponent("-10"));
buttonAdd_1.setMessage(new StringTextComponent("+1"));
buttonAdd_10.setMessage(new StringTextComponent("+10"));
break;
}
return super.keyReleased(keyCode, scanCode, modifiers);
}
@Override
public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks)
{
renderBackground(matrixStack);
drawGuiBackgroundTexture(matrixStack, mouseX, mouseY, partialTicks);
font.drawString(matrixStack, title.getString(), guiLeft + (xSize - font.getStringWidth(title.getString())) / 2, guiTop + 7, 0x404040);
frequencyField.render(matrixStack, mouseX, mouseY, partialTicks);
if (extended)
{
font.drawString(matrixStack, new TranslationTextComponent(LangKeys.Gui.FREQUENCY_NAME).getString(), guiLeft + 6, guiTop + 80, 0x404040);
frequencyName.render(matrixStack, mouseX, mouseY, partialTicks);
searchbar.render(matrixStack, mouseX, mouseY, partialTicks);
}
super.render(matrixStack, mouseX, mouseY, partialTicks);
}
private void drawGuiBackgroundTexture(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks)
{
RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
minecraft.getTextureManager().bindTexture(gui_texture);
blit(matrixStack, guiLeft, guiTop, 0, 0, xSize, ySize);
}
private void sendPacket()
{
frequencyPacket.setFrequency(frequency);
PacketHandler.INSTANCE.sendToServer(frequencyPacket);
minecraft.player.closeScreen();
}
@Override
public boolean isPauseScreen()
{
return false;
}
}