Add key inputs

This commit is contained in:
Linnea Gräf 2024-07-16 20:05:42 +02:00
parent a86c1086b7
commit d1abbeec7b
No known key found for this signature in database
GPG key ID: AA563E93EB628D91
5 changed files with 114 additions and 2 deletions

View file

@ -1,5 +1,6 @@
package dev.exhq.ajarc;
import dev.exhq.ajarc.network.ComputerCommandSent;
import dev.exhq.ajarc.network.ComputerScreenUpdate;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
@ -11,6 +12,7 @@ public class ModEvents {
public static void register(RegisterPayloadHandlersEvent event) {
var registrar = event.registrar("1");
registrar.playToClient(ComputerScreenUpdate.TYPE, ComputerScreenUpdate.STREAM_CODEC, ComputerScreenUpdate::handle);
registrar.playToServer(ComputerCommandSent.TYPE, ComputerCommandSent.STREAM_CODEC, ComputerCommandSent::handle);
}
}

View file

@ -15,7 +15,9 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ComputerBlockEntity extends BlockEntity {
public ComputerBlockEntity(BlockPos pPos, BlockState pBlockState) {
@ -32,6 +34,8 @@ public class ComputerBlockEntity extends BlockEntity {
.fieldOf("screen")
.setPartial(() -> ComputerTerminal.ofSize(20, 30));
private List<String> lines = new ArrayList<>();
@Override
protected void loadAdditional(@NotNull CompoundTag pTag, @NotNull HolderLookup.Provider pRegistries) {
super.loadAdditional(pTag, pRegistries);
@ -65,7 +69,26 @@ public class ComputerBlockEntity extends BlockEntity {
return screen;
}
public void executeCommand(String line) {
lines.add("$ " + line);
if (line.equals("small")) {
screen = ComputerTerminal.ofSize(10, 20);
lines.add("Made small!");
} else if (line.equals("big")) {
screen = ComputerTerminal.ofSize(20, 30);
lines.add("Made big!");
} else {
lines.add("Made unknown!");
}
while (lines.size() > screen.dimensions().rows() - 1 && !lines.isEmpty()) {
lines.removeFirst();
}
}
public ComputerScreenUpdate getSyncPacket(int windowId) {
return new ComputerScreenUpdate(windowId, Arrays.asList("Hiii", "Hello"), screen.dimensions().rows(), screen.dimensions().columns());
return new ComputerScreenUpdate(windowId,
lines,
screen.dimensions().rows(),
screen.dimensions().columns());
}
}

View file

@ -1,11 +1,15 @@
package dev.exhq.ajarc.computer;
import dev.exhq.ajarc.network.ComputerCommandSent;
import dev.exhq.ajarc.network.ComputerScreenUpdate;
import dev.exhq.ajarc.register.Register;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.network.PacketDistributor;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@ -67,5 +71,21 @@ public class ComputerMenu extends AbstractContainerMenu {
this.columns = computerScreenUpdate.columns();
this.rows = computerScreenUpdate.rows();
this.lines = computerScreenUpdate.lines();
if (Minecraft.getInstance().screen instanceof ComputerScreen computerScreen) {
computerScreen.reinitDimensions();
}
}
public void onClientInput(ComputerCommandSent computerCommandSent, ServerPlayer player) {
computer.executeCommand(computerCommandSent.line());
syncToClient(player);
}
public void sendLineToServer(String toSend) {
PacketDistributor.sendToServer(new ComputerCommandSent(containerId, toSend));
lines.add("$ " + toSend);
while (lines.size() > rows - 1 && !lines.isEmpty()) {
lines.removeFirst();
}
}
}

View file

@ -1,19 +1,28 @@
package dev.exhq.ajarc.computer;
import dev.exhq.ajarc.network.ComputerCommandSent;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.neoforged.neoforge.network.PacketDistributor;
import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW;
public class ComputerScreen extends AbstractContainerScreen<ComputerMenu> {
public ComputerScreen(ComputerMenu pMenu, Inventory pPlayerInventory, Component pTitle) {
super(pMenu, pPlayerInventory, pTitle);
}
String editingLine = "";
public void reinitDimensions() {
init();
}
@Override
protected void init() {
imageHeight = menu.getRows() * 11;
imageHeight = menu.getRows() * 11 - 1;
imageWidth = menu.getColumns() * 10;
super.init();
}
@ -25,6 +34,25 @@ public class ComputerScreen extends AbstractContainerScreen<ComputerMenu> {
}
@Override
public boolean charTyped(char pCodePoint, int pModifiers) {
editingLine += pCodePoint;
return true;
}
@Override
public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) {
if (super.keyPressed(pKeyCode, pScanCode, pModifiers))
return true;
if (pKeyCode == GLFW.GLFW_KEY_ENTER) {
var toSend = editingLine;
editingLine = "";
menu.sendLineToServer(toSend);
return true;
}
return false;
}
@Override
protected void renderLabels(@NotNull GuiGraphics graphics, int pMouseX, int pMouseY) {
int offsetY = 0;
@ -32,5 +60,6 @@ public class ComputerScreen extends AbstractContainerScreen<ComputerMenu> {
graphics.drawString(font, line, 0, offsetY, 0xFFFFFFFF);
offsetY += 11;
}
graphics.drawString(font, "$ " + editingLine, 0, offsetY, 0xFFFFFFFF);
}
}

View file

@ -0,0 +1,38 @@
package dev.exhq.ajarc.network;
import dev.exhq.ajarc.Ajar;
import dev.exhq.ajarc.computer.ComputerMenu;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import org.jetbrains.annotations.NotNull;
public record ComputerCommandSent(
int containerId,
String line
) implements CustomPacketPayload {
public static final Type<ComputerCommandSent> TYPE = new Type<>(Ajar.identifier("command_sent"));
public static final StreamCodec<ByteBuf, ComputerCommandSent> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.VAR_INT,
ComputerCommandSent::containerId,
ByteBufCodecs.STRING_UTF8,
ComputerCommandSent::line,
ComputerCommandSent::new
);
@Override
public @NotNull Type<? extends CustomPacketPayload> type() {
return TYPE;
}
public void handle(IPayloadContext iPayloadContext) {
var containerMenu = iPayloadContext.player().containerMenu;
if (containerMenu instanceof ComputerMenu computerMenu && computerMenu.containerId == this.containerId) {
computerMenu.onClientInput(this, (ServerPlayer) iPayloadContext.player());
}
}
}