From 3300fa8f2a484b482c6c1593f6ca8e23ac9ce95f Mon Sep 17 00:00:00 2001 From: craisinlord Date: Mon, 14 Sep 2026 19:02:18 -0500 Subject: [PATCH] a few puter fixes --- .../content/entity/OctopusBombEntity.java | 15 - .../antarchy/content/item/BigBerthaItem.java | 2 - .../com/craisinlord/antarchy/Antarchy.java | 1 + .../antarchy/content/AntarchySoundEvents.java | 3 + .../content/antmail/AntmailAddress.java | 76 ++ .../content/antmail/AntmailAttachment.java | 102 ++ .../antmail/AntmailAttachmentFiles.java | 93 ++ .../antmail/AntmailDeliveryResult.java | 28 + .../content/antmail/AntmailDraft.java | 43 + .../content/antmail/AntmailMailbox.java | 93 ++ .../content/antmail/AntmailMailboxStore.java | 54 + .../content/antmail/AntmailMessage.java | 80 ++ .../content/antmail/AntmailServerData.java | 174 +++ .../content/antmail/AntmailValidation.java | 67 + .../antarchy/content/antmail/AntmailWire.java | 55 + .../antarchy/content/block/ComputerBlock.java | 50 +- .../block/entity/ComputerBlockEntity.java | 223 +++- .../content/client/AntmailClientState.java | 22 + .../client/ComputerAccessClientState.java | 23 + .../client/ComputerFileSystemClientState.java | 60 + .../content/client/game/AntFarmGame.java | 168 +++ .../content/client/game/AntFarmInput.java | 22 + .../content/client/game/AntFarmProgram.java | 53 + .../content/client/game/AntFarmRenderer.java | 65 + .../client/renderer/ComputerRenderer.java | 6 + .../content/client/screen/ComputerScreen.java | 1104 +++++++++++++++-- .../computer/ComputerDesktopState.java | 196 +++ .../content/computer/ComputerFileSystem.java | 174 +++ .../computer/paint/AntPaintCanvas.java | 114 ++ .../content/computer/paint/AntPaintFile.java | 26 + .../computer/paint/AntPaintFileCodec.java | 86 ++ .../computer/paint/AntPaintFilename.java | 38 + .../computer/paint/AntPaintHistory.java | 47 + .../computer/paint/AntPaintRequests.java | 35 + .../computer/paint/AntPaintResults.java | 40 + .../content/computer/paint/AntPaintTool.java | 7 + .../computer/terminal/TerminalCommand.java | 11 + .../terminal/TerminalCommandParser.java | 79 ++ .../terminal/TerminalCommandService.java | 207 ++++ .../computer/terminal/TerminalFileSystem.java | 39 + .../computer/terminal/TerminalResult.java | 33 + .../content/entity/OctopusBombEntity.java | 15 - .../content/entity/ant/BaseAntEntity.java | 35 +- .../content/entity/royal/KingEntity.java | 2 +- .../content/guide/ComputerGuideData.java | 5 + .../antarchy/content/item/BigBerthaItem.java | 2 - .../antarchy/content/item/ComputerItem.java | 4 +- .../content/network/AntmailNetworking.java | 40 + .../content/network/AntmailPayloadTypes.java | 20 + .../content/network/AntmailReadPayload.java | 15 + .../content/network/AntmailResultPayload.java | 15 + .../content/network/AntmailSendPayload.java | 15 + .../content/network/AntmailServerHandler.java | 127 ++ .../content/network/AntmailSetupPayload.java | 15 + .../network/AntmailStateRequestPayload.java | 14 + .../network/ComputerAccessHandler.java | 212 ++++ .../network/ComputerAccessPayload.java | 41 + .../network/ComputerAccessResultPayload.java | 36 + .../content/network/ComputerNetworking.java | 70 ++ .../assets/antarchy/blockstates/computer.json | 10 +- .../resources/assets/antarchy/lang/en_us.json | 20 +- .../assets/antarchy/models/item/computer.json | 2 +- .../resources/assets/antarchy/sounds.json | 8 + .../assets/antarchy/sounds/mob/king/death.ogg | Bin 55025 -> 180834 bytes .../sounds/mob/king/fireball_shoot.ogg | Bin 46414 -> 41608 bytes .../antarchy/sounds/mob/king/ice_spikes.ogg | Bin 0 -> 70901 bytes .../antarchy/textures/item/computer.png | Bin 0 -> 2156 bytes .../antarchy/computer/disk/chronosphere.json | 2 +- .../antarchy/computer/disk/introduction.json | 5 - .../antarchy/computer/entry/chronosphere.json | 2 +- .../worldgen/biome/biowart_caves.json | 3 +- .../antarchy/computer/fixtures/README.md | 5 + .../built_in_introduction_protection.json | 10 + .../computer/fixtures/duplicate_disk.json | 8 + .../computer/fixtures/ejection_and_drop.json | 7 + .../computer/fixtures/newly_placed.json | 8 + .../fabric/AntarchyFabricContent.java | 1 + .../AntarchyClothConfigScreenBuilder.java | 10 - .../AntarchyFabricClientNetworking.java | 5 + .../network/AntarchyFabricNetworking.java | 20 + .../fabric/registry/AntarchyFabricItems.java | 3 - .../fabric/registry/AntarchyFabricSounds.java | 1 + .../antarchy/neoforge/AntarchyNeoforge.java | 7 + .../registry/AntarchyNeoforgeItems.java | 3 - .../AntarchyNeoforgePayloadHandlers.java | 42 + .../registry/AntarchyNeoforgeSounds.java | 1 + 86 files changed, 4480 insertions(+), 200 deletions(-) create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAddress.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachment.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachmentFiles.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDeliveryResult.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDraft.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailbox.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailboxStore.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMessage.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailServerData.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailValidation.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailWire.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntmailClientState.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerAccessClientState.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerFileSystemClientState.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmGame.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmInput.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmProgram.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmRenderer.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerDesktopState.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerFileSystem.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintCanvas.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFile.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFileCodec.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFilename.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintHistory.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintRequests.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintResults.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintTool.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommand.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandParser.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandService.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalFileSystem.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalResult.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailNetworking.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailPayloadTypes.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailReadPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailResultPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSendPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailServerHandler.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSetupPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailStateRequestPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessHandler.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessResultPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerNetworking.java create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/sounds/mob/king/ice_spikes.ogg create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/item/computer.png delete mode 100644 common-1.21.1/src/main/resources/data/antarchy/computer/disk/introduction.json create mode 100644 common-1.21.1/src/test/resources/antarchy/computer/fixtures/README.md create mode 100644 common-1.21.1/src/test/resources/antarchy/computer/fixtures/built_in_introduction_protection.json create mode 100644 common-1.21.1/src/test/resources/antarchy/computer/fixtures/duplicate_disk.json create mode 100644 common-1.21.1/src/test/resources/antarchy/computer/fixtures/ejection_and_drop.json create mode 100644 common-1.21.1/src/test/resources/antarchy/computer/fixtures/newly_placed.json diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java index b43cc09e..aa74e715 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java @@ -76,11 +76,9 @@ public class OctopusBombEntity extends Monster implements GeoEntity { private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); - // Squid-style wander private float wanderDx, wanderDy, wanderDz; private int wanderRetargetTicks; - // Combat private int attackCooldown; private int actionTicks; private int lastAttackState; @@ -89,7 +87,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { private float orbitDirection = 1.0F; private int inkSprayCooldown; - // Kraken spawn flag private boolean spawnedByKraken; // Explosive impact (fired from the R.P.O. Launcher) @@ -366,10 +363,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { this.hasImpulse = true; } - // ------------------------------------------------------------------------- - // Squid-style wander - // ------------------------------------------------------------------------- - private void tickWanderMovement() { if (--this.wanderRetargetTicks <= 0) { this.wanderRetargetTicks = 40 + this.random.nextInt(40); @@ -388,10 +381,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { this.setDeltaMovement(this.getDeltaMovement().add(this.wanderDx, dy, this.wanderDz)); } - // ------------------------------------------------------------------------- - // Ink spray - // ------------------------------------------------------------------------- - private boolean hasHitExplosiveTarget() { AABB box = this.getBoundingBox(); return !this.level().getEntitiesOfClass(LivingEntity.class, box, @@ -447,10 +436,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { serverLevel.sendParticles(OCTOPUS_BOMB_INK_PARTICLE, cx, cy, cz, 30, 3.5D, 1.8D, 3.5D, 0.02D); } - // ------------------------------------------------------------------------- - // Combat - // ------------------------------------------------------------------------- - private void tickPursuitMovement(LivingEntity target) { if (this.strafeRetargetTicks-- <= 0) { this.strafeRetargetTicks = 10 + this.random.nextInt(12); diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java index eabd0260..20480b3e 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java @@ -157,7 +157,6 @@ public class BigBerthaItem extends SwordItem implements GeoItem, com.craisinlord return; } - // Toreterror jump tracking if (isToreterrorJumping(stack) && player.getMainHandItem() == stack) { player.fallDistance = 0.0F; // prevent fall damage during the crash-down boolean launched = readInt(stack, TORETERROR_LAUNCHED_TAG) == 1; @@ -178,7 +177,6 @@ public class BigBerthaItem extends SwordItem implements GeoItem, com.craisinlord } } - // Tick client shake counter if (level.isClientSide && clientShakeTicks > 0) { clientShakeTicks--; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/Antarchy.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/Antarchy.java index ea6644dd..e62cdde1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/Antarchy.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/Antarchy.java @@ -8,6 +8,7 @@ import org.apache.logging.log4j.Logger; public class Antarchy { public static final String MODID = "antarchy"; + public static final String MOD_VERSION = "2.0.0"; public static final Logger LOGGER = LogManager.getLogger(); public static void init() { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java index 73f7bc1f..2a90521c 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java @@ -197,6 +197,7 @@ public final class AntarchySoundEvents { public static Supplier QUEEN_ROAR = (Supplier) UNBOUND; public static Supplier KING_BEAM_SHOOT = (Supplier) UNBOUND; public static Supplier KING_FIREBALL_SHOOT = (Supplier) UNBOUND; + public static Supplier KING_ICE_SPIKES = (Supplier) UNBOUND; public static Supplier KING_DECREE_CAST = (Supplier) UNBOUND; public static Supplier QUEEN_BEAM_SHOOT = (Supplier) UNBOUND; public static Supplier QUEEN_BEAM_START = (Supplier) UNBOUND; @@ -409,6 +410,7 @@ public final class AntarchySoundEvents { Supplier queenRoar, Supplier kingBeamShoot, Supplier kingFireballShoot, + Supplier kingIceSpikes, Supplier kingDecreeCast, Supplier queenBeamShoot, Supplier queenBeamStart, @@ -617,6 +619,7 @@ public final class AntarchySoundEvents { QUEEN_ROAR = queenRoar; KING_BEAM_SHOOT = kingBeamShoot; KING_FIREBALL_SHOOT = kingFireballShoot; + KING_ICE_SPIKES = kingIceSpikes; KING_DECREE_CAST = kingDecreeCast; QUEEN_BEAM_SHOOT = queenBeamShoot; QUEEN_BEAM_START = queenBeamStart; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAddress.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAddress.java new file mode 100644 index 00000000..26d6a820 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAddress.java @@ -0,0 +1,76 @@ +package com.craisinlord.antarchy.content.antmail; + +import java.util.Locale; +import java.util.Objects; +import java.util.regex.Pattern; + +public record AntmailAddress(String username) { + public static final String DOMAIN = "antmail.com"; + private static final Pattern USERNAME = Pattern.compile("[a-z0-9_]{3,16}"); + + public AntmailAddress { + username = normalizeUsername(username); + } + + public static AntmailAddress parse(String value) { + if (value == null) { + throw new IllegalArgumentException("Address is null"); + } + String normalized = value.trim().toLowerCase(Locale.ROOT); + String suffix = "@" + DOMAIN; + if (!normalized.endsWith(suffix)) { + throw new IllegalArgumentException("Invalid Antmail domain"); + } + return new AntmailAddress(normalized.substring(0, normalized.length() - suffix.length())); + } + + public static AntmailAddress ofUsername(String username) { + return new AntmailAddress(username); + } + + public String fullAddress() { + return username + "@" + DOMAIN; + } + + public static String normalizeUsername(String value) { + if (value == null) { + throw new IllegalArgumentException("Username is null"); + } + String normalized = value.trim().toLowerCase(Locale.ROOT); + if (!USERNAME.matcher(normalized).matches()) { + throw new IllegalArgumentException("Username must match [a-z0-9_]{3,16}"); + } + return normalized; + } + + public static boolean isValidUsername(String value) { + if (value == null) { + return false; + } + return USERNAME.matcher(value.trim().toLowerCase(Locale.ROOT)).matches(); + } + + public static boolean isValidAddress(String value) { + try { + parse(value); + return true; + } catch (IllegalArgumentException exception) { + return false; + } + } + + @Override + public String toString() { + return fullAddress(); + } + + @Override + public boolean equals(Object object) { + return object instanceof AntmailAddress other && username.equals(other.username); + } + + @Override + public int hashCode() { + return Objects.hash(username); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachment.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachment.java new file mode 100644 index 00000000..e6efc7a9 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachment.java @@ -0,0 +1,102 @@ +package com.craisinlord.antarchy.content.antmail; + +import net.minecraft.nbt.CompoundTag; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Objects; + +public sealed interface AntmailAttachment permits AntmailAttachment.TextFile, AntmailAttachment.PaintImage { + String TYPE_TAG = "Type"; + String NAME_TAG = "Name"; + + String fileName(); + + int byteSize(); + + CompoundTag toTag(); + + static AntmailAttachment fromTag(CompoundTag tag) { + return switch (tag.getString(TYPE_TAG)) { + case "text_file" -> TextFile.fromTag(tag); + case "paint_image" -> PaintImage.fromTag(tag); + default -> throw new IllegalArgumentException("Unknown Antmail attachment type"); + }; + } + + record TextFile(String fileName, String contents) implements AntmailAttachment { + public TextFile { + fileName = validateFileName(fileName); + contents = Objects.requireNonNull(contents, "contents"); + if (contents.length() > AntmailValidation.MAX_TEXT_ATTACHMENT_CHARACTERS) { + throw new IllegalArgumentException("Text attachment is too large"); + } + } + + @Override + public int byteSize() { + return contents.getBytes(StandardCharsets.UTF_8).length; + } + + @Override + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); + tag.putString(TYPE_TAG, "text_file"); + tag.putString(NAME_TAG, fileName); + tag.putString("Contents", contents); + return tag; + } + + static TextFile fromTag(CompoundTag tag) { + return new TextFile(tag.getString(NAME_TAG), tag.getString("Contents")); + } + } + + record PaintImage(String fileName, int width, int height, byte[] pixels) implements AntmailAttachment { + public PaintImage { + fileName = validateFileName(fileName); + if (width != AntmailValidation.MAX_PAINT_WIDTH || height != AntmailValidation.MAX_PAINT_HEIGHT) { + throw new IllegalArgumentException("Invalid Paint image dimensions"); + } + if (pixels == null || pixels.length != width * height) { + throw new IllegalArgumentException("Paint pixel data does not match dimensions"); + } + for (byte pixel : pixels) { + if (pixel != 0 && pixel != 1) throw new IllegalArgumentException("Paint pixel data must be monochrome"); + } + pixels = Arrays.copyOf(pixels, pixels.length); + } + + @Override + public byte[] pixels() { + return Arrays.copyOf(pixels, pixels.length); + } + + @Override + public int byteSize() { + return pixels.length; + } + + @Override + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); + tag.putString(TYPE_TAG, "paint_image"); + tag.putString(NAME_TAG, fileName); + tag.putInt("Width", width); + tag.putInt("Height", height); + tag.putByteArray("Pixels", pixels); + return tag; + } + + static PaintImage fromTag(CompoundTag tag) { + return new PaintImage(tag.getString(NAME_TAG), tag.getInt("Width"), tag.getInt("Height"), tag.getByteArray("Pixels")); + } + } + + private static String validateFileName(String value) { + if (value == null || value.isBlank() || value.length() > AntmailValidation.MAX_FILE_NAME_LENGTH || value.contains("/") || value.contains("\\")) { + throw new IllegalArgumentException("Invalid attachment filename"); + } + return value; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachmentFiles.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachmentFiles.java new file mode 100644 index 00000000..05e2a268 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailAttachmentFiles.java @@ -0,0 +1,93 @@ +package com.craisinlord.antarchy.content.antmail; + +import com.craisinlord.antarchy.content.computer.ComputerFileSystem; +import com.craisinlord.antarchy.content.computer.paint.AntPaintCanvas; +import com.craisinlord.antarchy.content.computer.paint.AntPaintFile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +public final class AntmailAttachmentFiles { + private AntmailAttachmentFiles() { + } + + public static Optional fromComputerFile(ComputerFileSystem.ComputerFile file) { + if (file == null || file.type() != ComputerFileSystem.ComputerFile.Type.TEXT) return Optional.empty(); + try { + return Optional.of(new AntmailAttachment.TextFile(filename(file.path()), file.contents())); + } catch (IllegalArgumentException exception) { + return Optional.empty(); + } + } + + public static AntmailAttachment.TextFile fromTextFile(String path, String contents) { + return new AntmailAttachment.TextFile(filename(path), contents); + } + + public static AntmailAttachment.PaintImage fromPaintFile(AntPaintFile file) { + if (file == null) throw new IllegalArgumentException("Paint file cannot be null"); + AntPaintCanvas canvas = file.canvas(); + if (canvas == null || canvas.copyPixels().length != AntPaintCanvas.PIXEL_COUNT) { + throw new IllegalArgumentException("Invalid AntPaint canvas"); + } + boolean[] source = canvas.copyPixels(); + byte[] pixels = new byte[source.length]; + for (int index = 0; index < source.length; index++) pixels[index] = source[index] ? (byte) 1 : (byte) 0; + return new AntmailAttachment.PaintImage(file.filename(), AntPaintCanvas.WIDTH, AntPaintCanvas.HEIGHT, pixels); + } + + public static AntPaintFile toPaintFile(AntmailAttachment.PaintImage image, String fileId, long createdTime, long modifiedTime) { + if (image == null) throw new IllegalArgumentException("Paint attachment cannot be null"); + if (image.width() != AntPaintCanvas.WIDTH || image.height() != AntPaintCanvas.HEIGHT) { + throw new IllegalArgumentException("Unsupported AntPaint canvas size"); + } + byte[] source = image.pixels(); + boolean[] pixels = new boolean[source.length]; + for (int index = 0; index < source.length; index++) { + if (source[index] != 0 && source[index] != 1) throw new IllegalArgumentException("Invalid AntPaint pixel"); + pixels[index] = source[index] == 1; + } + AntPaintCanvas canvas = new AntPaintCanvas(); + for (int index = 0; index < pixels.length; index++) { + if (pixels[index]) canvas.set(index % AntPaintCanvas.WIDTH, index / AntPaintCanvas.WIDTH, true); + } + return new AntPaintFile(fileId, image.fileName(), canvas, createdTime, modifiedTime); + } + + public static ComputerFileSystem.ComputerFile toComputerTextFile(String path, AntmailAttachment.TextFile file) { + if (file == null) throw new IllegalArgumentException("Text attachment cannot be null"); + String normalized = ComputerFileSystem.normalize(path); + if (normalized.isEmpty() || normalized.equals(ComputerFileSystem.ROOT)) throw new IllegalArgumentException("Invalid text file path"); + return ComputerFileSystem.ComputerFile.text(normalized, file.contents()); + } + + public static List selectableTextFiles(Collection files) { + if (files == null) return List.of(); + List result = new ArrayList<>(); + for (ComputerFileSystem.ComputerFile file : files) { + if (fromComputerFile(file).isPresent()) result.add(file); + } + return List.copyOf(result); + } + + public static List selectablePaintFiles(Collection files) { + if (files == null) return List.of(); + List result = new ArrayList<>(); + for (AntPaintFile file : files) { + try { + result.add(fromPaintFile(file)); + } catch (IllegalArgumentException ignored) { + } + } + return List.copyOf(result); + } + + private static String filename(String path) { + String normalized = ComputerFileSystem.normalize(path); + if (normalized.isEmpty() || normalized.equals(ComputerFileSystem.ROOT)) throw new IllegalArgumentException("Invalid file path"); + int separator = normalized.lastIndexOf('/'); + return normalized.substring(separator + 1); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDeliveryResult.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDeliveryResult.java new file mode 100644 index 00000000..7cba81c4 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDeliveryResult.java @@ -0,0 +1,28 @@ +package com.craisinlord.antarchy.content.antmail; + +import java.util.UUID; + +public record AntmailDeliveryResult(Status status, UUID messageId, AntmailAddress sender, AntmailAddress recipient, String detail) { + public enum Status { + DELIVERED, + QUEUED, + INVALID_ADDRESS, + ADDRESS_NOT_FOUND, + MAILBOX_FULL, + MESSAGE_INVALID, + DUPLICATE, + FAILED + } + + public static AntmailDeliveryResult delivered(AntmailMessage message) { + return new AntmailDeliveryResult(Status.DELIVERED, message.id(), message.sender(), message.recipient(), ""); + } + + public static AntmailDeliveryResult queued(AntmailMessage message) { + return new AntmailDeliveryResult(Status.QUEUED, message.id(), message.sender(), message.recipient(), ""); + } + + public static AntmailDeliveryResult failed(Status status, AntmailMessage message, String detail) { + return new AntmailDeliveryResult(status, message == null ? null : message.id(), message == null ? null : message.sender(), message == null ? null : message.recipient(), detail); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDraft.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDraft.java new file mode 100644 index 00000000..4fe498ab --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailDraft.java @@ -0,0 +1,43 @@ +package com.craisinlord.antarchy.content.antmail; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public record AntmailDraft(UUID id, AntmailAddress sender, AntmailAddress recipient, String subject, String body, List attachments) { + public AntmailDraft { + id = id == null ? UUID.randomUUID() : id; + subject = subject == null ? "" : subject; + body = body == null ? "" : body; + attachments = attachments == null ? List.of() : List.copyOf(attachments); + if (subject.length() > AntmailValidation.MAX_SUBJECT_LENGTH || body.length() > AntmailValidation.MAX_BODY_LENGTH || attachments.size() > AntmailValidation.MAX_ATTACHMENTS) { + throw new IllegalArgumentException("Draft exceeds Antmail limits"); + } + } + + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); + tag.putString("Id", id.toString()); + if (sender != null) tag.putString("From", sender.fullAddress()); + if (recipient != null) tag.putString("To", recipient.fullAddress()); + tag.putString("Subject", subject); + tag.putString("Body", body); + ListTag attachmentTags = new ListTag(); + for (AntmailAttachment attachment : attachments) attachmentTags.add(attachment.toTag()); + tag.put("Attachments", attachmentTags); + return tag; + } + + public static AntmailDraft fromTag(CompoundTag tag) { + List attachments = new ArrayList<>(); + ListTag attachmentTags = tag.getList("Attachments", 10); + for (int index = 0; index < attachmentTags.size(); index++) attachments.add(AntmailAttachment.fromTag(attachmentTags.getCompound(index))); + UUID id = UUID.fromString(tag.getString("Id")); + AntmailAddress sender = tag.contains("From") ? AntmailAddress.parse(tag.getString("From")) : null; + AntmailAddress recipient = tag.contains("To") ? AntmailAddress.parse(tag.getString("To")) : null; + return new AntmailDraft(id, sender, recipient, tag.getString("Subject"), tag.getString("Body"), attachments); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailbox.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailbox.java new file mode 100644 index 00000000..0b1450e4 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailbox.java @@ -0,0 +1,93 @@ +package com.craisinlord.antarchy.content.antmail; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public final class AntmailMailbox { + private final AntmailAddress address; + private final List inbox = new ArrayList<>(); + private final List sent = new ArrayList<>(); + private final List drafts = new ArrayList<>(); + + public AntmailMailbox(AntmailAddress address) { + this.address = address; + } + + public AntmailAddress address() { return address; } + public List inbox() { return List.copyOf(inbox); } + public List sent() { return List.copyOf(sent); } + public List drafts() { return List.copyOf(drafts); } + public int unreadCount() { return (int) inbox.stream().filter(message -> !message.read()).count(); } + + public boolean addIncoming(AntmailMessage message) { + if (!address.equals(message.recipient()) || inbox.size() >= AntmailValidation.MAX_MAILBOX_MESSAGES || contains(inbox, message.id())) return false; + inbox.add(message); + return true; + } + + public boolean addSent(AntmailMessage message) { + if (!address.equals(message.sender()) || sent.size() >= AntmailValidation.MAX_MAILBOX_MESSAGES || contains(sent, message.id())) return false; + sent.add(message); + return true; + } + + public boolean saveDraft(AntmailDraft draft) { + if (!address.equals(draft.sender()) || drafts.size() >= AntmailValidation.MAX_DRAFTS && findDraft(draft.id()) == null) return false; + drafts.removeIf(existing -> existing.id().equals(draft.id())); + drafts.add(draft); + return true; + } + + public boolean removeDraft(UUID id) { return drafts.removeIf(draft -> draft.id().equals(id)); } + public boolean removeInbox(UUID id) { return inbox.removeIf(message -> message.id().equals(id)); } + public boolean removeSent(UUID id) { return sent.removeIf(message -> message.id().equals(id)); } + + public boolean markRead(UUID id) { + for (AntmailMessage message : inbox) if (message.id().equals(id)) { message.markRead(); return true; } + return false; + } + + public AntmailDraft findDraft(UUID id) { return drafts.stream().filter(draft -> draft.id().equals(id)).findFirst().orElse(null); } + + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); + tag.putString("Address", address.fullAddress()); + tag.put("Inbox", messagesToTag(inbox)); + tag.put("Sent", messagesToTag(sent)); + ListTag draftTags = new ListTag(); + for (AntmailDraft draft : drafts) draftTags.add(draft.toTag()); + tag.put("Drafts", draftTags); + return tag; + } + + public static AntmailMailbox fromTag(CompoundTag tag) { + AntmailMailbox mailbox = new AntmailMailbox(AntmailAddress.parse(tag.getString("Address"))); + readMessages(tag.getList("Inbox", 10), mailbox.inbox); + readMessages(tag.getList("Sent", 10), mailbox.sent); + ListTag draftTags = tag.getList("Drafts", 10); + for (int index = 0; index < draftTags.size() && mailbox.drafts.size() < AntmailValidation.MAX_DRAFTS; index++) { + try { mailbox.drafts.add(AntmailDraft.fromTag(draftTags.getCompound(index))); } catch (RuntimeException ignored) { } + } + return mailbox; + } + + private static ListTag messagesToTag(List messages) { + ListTag tags = new ListTag(); + for (AntmailMessage message : messages) tags.add(message.toTag()); + return tags; + } + + private static void readMessages(ListTag tags, List target) { + for (int index = 0; index < tags.size() && target.size() < AntmailValidation.MAX_MAILBOX_MESSAGES; index++) { + try { target.add(AntmailMessage.fromTag(tags.getCompound(index))); } catch (RuntimeException ignored) { } + } + } + + private static boolean contains(List messages, UUID id) { + return messages.stream().anyMatch(message -> message.id().equals(id)); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailboxStore.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailboxStore.java new file mode 100644 index 00000000..5fe98546 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMailboxStore.java @@ -0,0 +1,54 @@ +package com.craisinlord.antarchy.content.antmail; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public final class AntmailMailboxStore { + private final Map mailboxes = new LinkedHashMap<>(); + + public AntmailMailbox getOrCreate(AntmailAddress address) { + return mailboxes.computeIfAbsent(address, AntmailMailbox::new); + } + + public AntmailMailbox get(AntmailAddress address) { + return mailboxes.get(address); + } + + public boolean contains(AntmailAddress address) { + return mailboxes.containsKey(address); + } + + public void put(AntmailMailbox mailbox) { + mailboxes.put(mailbox.address(), mailbox); + } + + public Collection mailboxes() { + return List.copyOf(mailboxes.values()); + } + + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); + ListTag mailboxTags = new ListTag(); + for (AntmailMailbox mailbox : mailboxes.values()) mailboxTags.add(mailbox.toTag()); + tag.put("Mailboxes", mailboxTags); + return tag; + } + + public static AntmailMailboxStore fromTag(CompoundTag tag) { + AntmailMailboxStore store = new AntmailMailboxStore(); + ListTag mailboxTags = tag.getList("Mailboxes", 10); + for (int index = 0; index < mailboxTags.size(); index++) { + try { + AntmailMailbox mailbox = AntmailMailbox.fromTag(mailboxTags.getCompound(index)); + store.mailboxes.put(mailbox.address(), mailbox); + } catch (RuntimeException ignored) { + } + } + return store; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMessage.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMessage.java new file mode 100644 index 00000000..43d375f5 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailMessage.java @@ -0,0 +1,80 @@ +package com.craisinlord.antarchy.content.antmail; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public final class AntmailMessage { + private static final String ID_TAG = "Id"; + private static final String FROM_TAG = "From"; + private static final String TO_TAG = "To"; + private static final String SUBJECT_TAG = "Subject"; + private static final String BODY_TAG = "Body"; + private static final String CREATED_TAG = "Created"; + private static final String READ_TAG = "Read"; + private static final String ATTACHMENTS_TAG = "Attachments"; + + private final UUID id; + private final AntmailAddress sender; + private final AntmailAddress recipient; + private final String subject; + private final String body; + private final long createdAt; + private final List attachments; + private boolean read; + + public AntmailMessage(UUID id, AntmailAddress sender, AntmailAddress recipient, String subject, String body, long createdAt, List attachments, boolean read) { + AntmailValidation.Result result = AntmailValidation.validateMessage(sender, recipient, subject, body, attachments); + if (!result.valid()) { + throw new IllegalArgumentException(result.reason()); + } + this.id = id == null ? UUID.randomUUID() : id; + this.sender = sender; + this.recipient = recipient; + this.subject = subject; + this.body = body; + this.createdAt = createdAt; + this.attachments = List.copyOf(attachments); + this.read = read; + } + + public static AntmailMessage create(AntmailAddress sender, AntmailAddress recipient, String subject, String body, long createdAt, List attachments) { + return new AntmailMessage(UUID.randomUUID(), sender, recipient, subject, body, createdAt, attachments, false); + } + + public UUID id() { return id; } + public AntmailAddress sender() { return sender; } + public AntmailAddress recipient() { return recipient; } + public String subject() { return subject; } + public String body() { return body; } + public long createdAt() { return createdAt; } + public List attachments() { return attachments; } + public boolean read() { return read; } + public void markRead() { read = true; } + public void markUnread() { read = false; } + + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); + tag.putString(ID_TAG, id.toString()); + tag.putString(FROM_TAG, sender.fullAddress()); + tag.putString(TO_TAG, recipient.fullAddress()); + tag.putString(SUBJECT_TAG, subject); + tag.putString(BODY_TAG, body); + tag.putLong(CREATED_TAG, createdAt); + tag.putBoolean(READ_TAG, read); + ListTag attachmentTags = new ListTag(); + for (AntmailAttachment attachment : attachments) attachmentTags.add(attachment.toTag()); + tag.put(ATTACHMENTS_TAG, attachmentTags); + return tag; + } + + public static AntmailMessage fromTag(CompoundTag tag) { + List attachments = new ArrayList<>(); + ListTag attachmentTags = tag.getList(ATTACHMENTS_TAG, 10); + for (int index = 0; index < attachmentTags.size(); index++) attachments.add(AntmailAttachment.fromTag(attachmentTags.getCompound(index))); + return new AntmailMessage(UUID.fromString(tag.getString(ID_TAG)), AntmailAddress.parse(tag.getString(FROM_TAG)), AntmailAddress.parse(tag.getString(TO_TAG)), tag.getString(SUBJECT_TAG), tag.getString(BODY_TAG), tag.getLong(CREATED_TAG), attachments, tag.getBoolean(READ_TAG)); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailServerData.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailServerData.java new file mode 100644 index 00000000..e0ce6938 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailServerData.java @@ -0,0 +1,174 @@ +package com.craisinlord.antarchy.content.antmail; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public final class AntmailServerData extends SavedData { + private static final String ID = "antarchy_antmail"; + private final Map endpoints = new LinkedHashMap<>(); + private final AntmailMailboxStore mailboxes = new AntmailMailboxStore(); + private final List pending = new ArrayList<>(); + + public static AntmailServerData create() { + return new AntmailServerData(); + } + + public static AntmailServerData load(CompoundTag tag, HolderLookup.Provider registries) { + AntmailServerData data = new AntmailServerData(); + ListTag endpointTags = tag.getList("Endpoints", 10); + for (int i = 0; i < endpointTags.size(); i++) { + try { + CompoundTag endpoint = endpointTags.getCompound(i); + AntmailAddress address = AntmailAddress.parse(endpoint.getString("Address")); + data.endpoints.put(address, new Endpoint(endpoint.getString("Dimension"), endpoint.getLong("Position"))); + } catch (RuntimeException ignored) { + } + } + AntmailServerData loaded = data; + AntmailMailboxStore restored = AntmailMailboxStore.fromTag(tag.getCompound("Mailboxes")); + for (AntmailMailbox mailbox : restored.mailboxes()) { + loaded.mailboxes.put(mailbox); + } + ListTag pendingTags = tag.getList("Pending", 10); + for (int i = 0; i < pendingTags.size(); i++) { + try { + CompoundTag pendingTag = pendingTags.getCompound(i); + loaded.pending.add(new PendingMessage(AntmailAddress.parse(pendingTag.getString("Recipient")), AntmailMessage.fromTag(pendingTag.getCompound("Message")))); + } catch (RuntimeException ignored) { + } + } + return loaded; + } + + @Override + public CompoundTag save(CompoundTag tag, HolderLookup.Provider registries) { + ListTag endpointTags = new ListTag(); + for (Map.Entry entry : endpoints.entrySet()) { + CompoundTag endpoint = new CompoundTag(); + endpoint.putString("Address", entry.getKey().fullAddress()); + endpoint.putString("Dimension", entry.getValue().dimension()); + endpoint.putLong("Position", entry.getValue().position()); + endpointTags.add(endpoint); + } + tag.put("Endpoints", endpointTags); + tag.put("Mailboxes", mailboxes.toTag()); + ListTag pendingTags = new ListTag(); + for (PendingMessage message : pending) { + CompoundTag pendingTag = new CompoundTag(); + pendingTag.putString("Recipient", message.recipient().fullAddress()); + pendingTag.put("Message", message.message().toTag()); + pendingTags.add(pendingTag); + } + tag.put("Pending", pendingTags); + return tag; + } + + private static AntmailServerData get(MinecraftServer server) { + return server.overworld().getDataStorage().computeIfAbsent( + new SavedData.Factory<>(AntmailServerData::create, AntmailServerData::load, null), ID); + } + + public static AntmailServerData access(MinecraftServer server) { + return get(server); + } + + public synchronized Registration register(MinecraftServer server, ServerLevel level, BlockPos position, String username) { + final AntmailAddress address; + try { + address = AntmailAddress.ofUsername(username); + } catch (IllegalArgumentException exception) { + return Registration.invalid("invalid_username"); + } + AntmailAddress previous = addressAt(level.dimension().location(), position); + Endpoint existing = endpoints.get(address); + if (existing != null && (!existing.dimension().equals(level.dimension().location().toString()) || existing.position() != position.asLong())) { + return Registration.invalid("username_taken"); + } + if (previous != null && !previous.equals(address)) { + endpoints.remove(previous); + } + endpoints.put(address, new Endpoint(level.dimension().location().toString(), position.asLong())); + get(server).drain(server, address); + setDirty(); + return Registration.accepted(address); + } + + public synchronized AntmailAddress addressAt(ResourceLocation dimension, BlockPos position) { + for (Map.Entry entry : endpoints.entrySet()) { + if (entry.getValue().dimension().equals(dimension.toString()) && entry.getValue().position() == position.asLong()) return entry.getKey(); + } + return null; + } + + public synchronized boolean unregister(ResourceLocation dimension, BlockPos position) { + AntmailAddress address = addressAt(dimension, position); + if (address == null) return false; + endpoints.remove(address); + setDirty(); + return true; + } + + public synchronized Endpoint endpoint(AntmailAddress address) { + return endpoints.get(address); + } + + public synchronized AntmailMailbox mailbox(AntmailAddress address) { + return mailboxes.get(address); + } + + public synchronized AntmailMailbox mailboxOrCreate(AntmailAddress address) { + AntmailMailbox mailbox = mailboxes.getOrCreate(address); + setDirty(); + return mailbox; + } + + public synchronized AntmailDeliveryResult deliver(MinecraftServer server, AntmailMessage message) { + if (endpoint(message.recipient()) == null) return AntmailDeliveryResult.failed(AntmailDeliveryResult.Status.ADDRESS_NOT_FOUND, message, "address_not_found"); + AntmailMailbox destination = mailboxes.getOrCreate(message.recipient()); + if (destination.inbox().size() >= AntmailValidation.MAX_MAILBOX_MESSAGES) return AntmailDeliveryResult.failed(AntmailDeliveryResult.Status.MAILBOX_FULL, message, "mailbox_full"); + Endpoint target = endpoint(message.recipient()); + ServerLevel level = server.getLevel(net.minecraft.resources.ResourceKey.create(net.minecraft.core.registries.Registries.DIMENSION, ResourceLocation.parse(target.dimension()))); + if (level == null || !level.hasChunkAt(BlockPos.of(target.position()))) { + pending.add(new PendingMessage(message.recipient(), message)); + mailboxes.getOrCreate(message.sender()).addSent(message); + setDirty(); + return AntmailDeliveryResult.queued(message); + } + destination.addIncoming(message); + mailboxes.getOrCreate(message.sender()).addSent(message); + setDirty(); + return AntmailDeliveryResult.delivered(message); + } + + public synchronized void drain(MinecraftServer server, AntmailAddress address) { + AntmailMailbox mailbox = mailboxes.getOrCreate(address); + pending.removeIf(pendingMessage -> { + if (!pendingMessage.recipient().equals(address) || mailbox.inbox().size() >= AntmailValidation.MAX_MAILBOX_MESSAGES) return false; + mailbox.addIncoming(pendingMessage.message()); + return true; + }); + setDirty(); + } + + public record Endpoint(String dimension, long position) { + } + + public record Registration(boolean valid, AntmailAddress address, String reason) { + static Registration accepted(AntmailAddress address) { return new Registration(true, address, ""); } + static Registration invalid(String reason) { return new Registration(false, null, reason); } + } + + private record PendingMessage(AntmailAddress recipient, AntmailMessage message) { + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailValidation.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailValidation.java new file mode 100644 index 00000000..a9676e10 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailValidation.java @@ -0,0 +1,67 @@ +package com.craisinlord.antarchy.content.antmail; + +import java.nio.charset.StandardCharsets; +import java.util.List; + +public final class AntmailValidation { + public static final int MAX_SUBJECT_LENGTH = 64; + public static final int MAX_BODY_LENGTH = 4096; + public static final int MAX_FILE_NAME_LENGTH = 32; + public static final int MAX_ATTACHMENTS = 8; + public static final int MAX_TEXT_ATTACHMENT_CHARACTERS = 16384; + public static final int MAX_PAINT_WIDTH = 32; + public static final int MAX_PAINT_HEIGHT = 24; + public static final int MAX_MESSAGE_BYTES = 65536; + public static final int MAX_ATTACHMENT_WIRE_CHARS = 65536; + public static final int MAX_MAILBOX_MESSAGES = 100; + public static final int MAX_DRAFTS = 25; + + private AntmailValidation() { + } + + public static Result validateMessage(AntmailAddress sender, AntmailAddress recipient, String subject, String body, List attachments) { + if (sender == null || recipient == null) { + return Result.invalid("missing address"); + } + if (subject == null || subject.length() > MAX_SUBJECT_LENGTH) { + return Result.invalid("subject too long"); + } + if (body == null || body.length() > MAX_BODY_LENGTH) { + return Result.invalid("body too long"); + } + Result attachmentResult = validateAttachments(attachments); + if (!attachmentResult.valid()) return attachmentResult; + int bytes = subject.getBytes(StandardCharsets.UTF_8).length + body.getBytes(StandardCharsets.UTF_8).length; + for (AntmailAttachment attachment : attachments) bytes += attachment.byteSize(); + if (bytes > MAX_MESSAGE_BYTES) { + return Result.invalid("message too large"); + } + return Result.accepted(); + } + + public static Result validateAttachments(List attachments) { + if (attachments == null || attachments.size() > MAX_ATTACHMENTS) return Result.invalid("too many attachments"); + int textCharacters = 0; + for (AntmailAttachment attachment : attachments) { + if (attachment == null) return Result.invalid("null attachment"); + if (attachment instanceof AntmailAttachment.TextFile textFile) { + if (textFile.contents().length() > MAX_TEXT_ATTACHMENT_CHARACTERS) return Result.invalid("text attachment too large"); + textCharacters += textFile.contents().length(); + } else if (attachment instanceof AntmailAttachment.PaintImage paintImage) { + if (paintImage.width() != MAX_PAINT_WIDTH || paintImage.height() != MAX_PAINT_HEIGHT) return Result.invalid("unsupported paint size"); + } + } + if (textCharacters > MAX_TEXT_ATTACHMENT_CHARACTERS) return Result.invalid("text attachments too large"); + return Result.accepted(); + } + + public record Result(boolean valid, String reason) { + public static Result accepted() { + return new Result(true, ""); + } + + public static Result invalid(String reason) { + return new Result(false, reason); + } + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailWire.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailWire.java new file mode 100644 index 00000000..858c8857 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/antmail/AntmailWire.java @@ -0,0 +1,55 @@ +package com.craisinlord.antarchy.content.antmail; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.TagParser; + +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; + +public final class AntmailWire { + private AntmailWire() { + } + + public static String encodeAttachments(List attachments) { + AntmailValidation.Result validation = AntmailValidation.validateAttachments(attachments); + if (!validation.valid()) throw new IllegalArgumentException(validation.reason()); + CompoundTag root = new CompoundTag(); + ListTag list = new ListTag(); + for (AntmailAttachment attachment : attachments) list.add(attachment.toTag()); + root.put("Attachments", list); + String encoded = Base64.getEncoder().encodeToString(root.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)); + if (encoded.length() > AntmailValidation.MAX_ATTACHMENT_WIRE_CHARS) throw new IllegalArgumentException("Attachment payload is too large"); + return encoded; + } + + public static String encodeTag(CompoundTag tag) { + return Base64.getEncoder().encodeToString(tag.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)); + } + + public static CompoundTag decodeTag(String encoded) { + try { + return TagParser.parseTag(new String(Base64.getDecoder().decode(encoded), java.nio.charset.StandardCharsets.UTF_8)); + } catch (Exception exception) { + throw new IllegalArgumentException("Invalid Antmail data", exception); + } + } + + public static List decodeAttachments(String encoded) { + if (encoded == null || encoded.isBlank()) return List.of(); + if (encoded.length() > AntmailValidation.MAX_ATTACHMENT_WIRE_CHARS) throw new IllegalArgumentException("Attachment payload is too large"); + try { + String snbt = new String(Base64.getDecoder().decode(encoded), java.nio.charset.StandardCharsets.UTF_8); + CompoundTag root = TagParser.parseTag(snbt); + ListTag list = root.getList("Attachments", 10); + List result = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) result.add(AntmailAttachment.fromTag(list.getCompound(i))); + AntmailValidation.Result validation = AntmailValidation.validateAttachments(result); + if (!validation.valid()) throw new IllegalArgumentException(validation.reason()); + return List.copyOf(result); + } catch (Exception exception) { + throw new IllegalArgumentException("Invalid attachment data", exception); + } + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/ComputerBlock.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/ComputerBlock.java index 6a8ca442..40f34539 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/ComputerBlock.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/ComputerBlock.java @@ -5,6 +5,7 @@ import com.craisinlord.antarchy.content.block.entity.ComputerBlockEntity; import com.craisinlord.antarchy.content.client.AntarchyClientHooks; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; @@ -13,7 +14,9 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -21,6 +24,8 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -28,11 +33,12 @@ import net.minecraft.world.phys.shapes.VoxelShape; public final class ComputerBlock extends BaseEntityBlock { public static final MapCodec CODEC = Block.simpleCodec(ComputerBlock::new); public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + public static final DirectionProperty FACING = net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING; private static final VoxelShape SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D); public ComputerBlock(BlockBehaviour.Properties properties) { super(properties.lightLevel(state -> state.getValue(ACTIVE) ? 7 : 0)); - registerDefaultState(stateDefinition.any().setValue(ACTIVE, false)); + registerDefaultState(stateDefinition.any().setValue(ACTIVE, false).setValue(FACING, Direction.NORTH)); } @Override @@ -42,7 +48,22 @@ public final class ComputerBlock extends BaseEntityBlock { @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(ACTIVE); + builder.add(ACTIVE, FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @Override + protected BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + protected BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); } @Override @@ -55,6 +76,25 @@ public final class ComputerBlock extends BaseEntityBlock { return SHAPE; } + @Override + public boolean isSignalSource(BlockState state) { + return true; + } + + @Override + protected int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return isAuthenticated(level, pos) ? 15 : 0; + } + + @Override + protected int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return getSignal(state, level, pos, direction); + } + + private static boolean isAuthenticated(BlockGetter level, BlockPos pos) { + return level.getBlockEntity(pos) instanceof ComputerBlockEntity computer && computer.isAuthenticated(); + } + @Override protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof ComputerBlockEntity computer) { @@ -92,12 +132,6 @@ public final class ComputerBlock extends BaseEntityBlock { protected net.minecraft.world.InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { if (level.getBlockEntity(pos) instanceof ComputerBlockEntity computer) { - if (player.isShiftKeyDown()) { - if (computer.ejectOne(player)) { - return net.minecraft.world.InteractionResult.SUCCESS; - } - return net.minecraft.world.InteractionResult.PASS; - } computer.activate(); if (level.isClientSide) { AntarchyClientHooks.openComputer(pos); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/ComputerBlockEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/ComputerBlockEntity.java index 4f330314..f4dc81f8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/ComputerBlockEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/ComputerBlockEntity.java @@ -2,6 +2,8 @@ package com.craisinlord.antarchy.content.block.entity; import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.block.ComputerBlock; +import com.craisinlord.antarchy.content.computer.ComputerFileSystem; +import com.craisinlord.antarchy.content.computer.ComputerDesktopState; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -10,12 +12,12 @@ import net.minecraft.nbt.StringTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Containers; import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -31,15 +33,27 @@ import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public final class ComputerBlockEntity extends BlockEntity implements GeoBlockEntity { + private static final ResourceLocation INTRODUCTION_DISK = ResourceLocation.fromNamespaceAndPath("antarchy", "introduction"); private static final String DISKS_TAG = "Disks"; private static final String ACTIVE_UNTIL_TAG = "ActiveUntil"; - private final Set diskIds = new LinkedHashSet<>(); + private static final String PASSWORD_TAG = "Password"; + private static final String AUTHENTICATED_TAG = "Authenticated"; + private static final String AUTHENTICATED_UNTIL_TAG = "AuthenticatedUntil"; + private static final String DESKTOP_TAG = "Desktop"; + private static final long AUTHENTICATION_TIMEOUT = 6000L; + private final Set physicalDiskIds = new LinkedHashSet<>(); + private final ComputerFileSystem fileSystem = new ComputerFileSystem(); + private final ComputerDesktopState desktopState = new ComputerDesktopState(); private final AnimatableInstanceCache animatableCache = GeckoLibUtil.createInstanceCache(this); private static final RawAnimation ON = RawAnimation.begin().thenLoop("on_state"); private static final RawAnimation OFF = RawAnimation.begin().thenLoop("off_state"); private static final RawAnimation TURN_ON = RawAnimation.begin().thenPlay("turn_on"); private static final RawAnimation TURN_OFF = RawAnimation.begin().thenPlay("turn_off"); private long activeUntil; + private String password = ""; + private boolean authenticated; + private long authenticatedUntil; + private java.util.UUID activeUser; private boolean lastActive; public ComputerBlockEntity(BlockPos pos, BlockState state, Supplier> type) { @@ -60,6 +74,11 @@ public final class ComputerBlockEntity extends BlockEntity implements GeoBlockEn computer.setChanged(); level.sendBlockUpdated(pos, state, state, 3); } + if (!level.isClientSide && computer.authenticated && (level.getGameTime() >= computer.authenticatedUntil || computer.activeUser == null || + (level instanceof net.minecraft.server.level.ServerLevel serverLevel && serverLevel.getServer().getPlayerList().getPlayer(computer.activeUser) == null))) { + computer.clearAuthentication(); + level.sendBlockUpdated(pos, state, state, 3); + } } public boolean insert(ItemStack stack, Player player) { @@ -67,12 +86,12 @@ public final class ComputerBlockEntity extends BlockEntity implements GeoBlockEn return false; } ResourceLocation diskId = stack.get(AntarchyObjects.FLOPPY_DISK_COMPONENT.get()); - if (diskId == null || this.diskIds.contains(diskId)) { + if (diskId == null || this.physicalDiskIds.contains(diskId)) { stack.shrink(1); activate(); return true; } - this.diskIds.add(diskId); + this.physicalDiskIds.add(diskId); stack.shrink(1); activate(); setChanged(); @@ -94,12 +113,7 @@ public final class ComputerBlockEntity extends BlockEntity implements GeoBlockEn } public boolean isActive() { - return level != null && (level.hasNeighborSignal(worldPosition) || level.getGameTime() < activeUntil || hasNearbyPlayer()); - } - - private boolean hasNearbyPlayer() { - Vec3 center = Vec3.atCenterOf(worldPosition); - return level.players().stream().anyMatch(player -> player.distanceToSqr(center) <= 25.0D); + return level != null && (level.hasNeighborSignal(worldPosition) || isAuthenticated()); } @Override @@ -116,15 +130,23 @@ public final class ComputerBlockEntity extends BlockEntity implements GeoBlockEn } public List diskIds() { - return List.copyOf(diskIds); + List ids = new ArrayList<>(physicalDiskIds.size() + 1); + ids.add(INTRODUCTION_DISK); + ids.addAll(physicalDiskIds); + return List.copyOf(ids); } public boolean ejectOne(Player player) { - if (level == null || level.isClientSide || diskIds.isEmpty()) { + if (physicalDiskIds.isEmpty() || !(player instanceof ServerPlayer serverPlayer)) { + return false; + } + return ejectOne(serverPlayer, physicalDiskIds.iterator().next()); + } + + public boolean ejectOne(ServerPlayer player, ResourceLocation diskId) { + if (level == null || level.isClientSide || diskId == null || !isAuthenticated() || !playerCanReach(player) || !physicalDiskIds.remove(diskId)) { return false; } - ResourceLocation diskId = diskIds.iterator().next(); - diskIds.remove(diskId); ItemStack disk = diskStack(diskId); if (!player.addItem(disk)) { player.drop(disk, false); @@ -138,10 +160,158 @@ public final class ComputerBlockEntity extends BlockEntity implements GeoBlockEn if (level.isClientSide) { return; } - for (ResourceLocation diskId : diskIds) { + for (ResourceLocation diskId : physicalDiskIds) { Containers.dropItemStack(level, pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, diskStack(diskId)); } - diskIds.clear(); + physicalDiskIds.clear(); + } + + public boolean hasPassword() { + return !password.isEmpty(); + } + + public boolean setPassword(ServerPlayer player, String newPassword) { + if (newPassword == null || newPassword.isBlank() || !isAuthenticated()) { + return false; + } + password = newPassword; + setChanged(); + return true; + } + + public boolean initializePassword(ServerPlayer player, String newPassword) { + if (hasPassword() || newPassword == null || newPassword.isBlank() || !claimUser(player)) { + return false; + } + password = newPassword; + authenticated = true; + authenticatedUntil = level.getGameTime() + AUTHENTICATION_TIMEOUT; + setChanged(); + return true; + } + + public boolean initializePassword(String newPassword) { + return false; + } + + public boolean authenticate(ServerPlayer player, String attemptedPassword) { + if (!hasPassword() || !password.equals(attemptedPassword) || !claimUser(player)) { + return false; + } + authenticated = true; + authenticatedUntil = level == null ? 0L : level.getGameTime() + AUTHENTICATION_TIMEOUT; + setChanged(); + return true; + } + + public boolean authenticate(String attemptedPassword) { + return false; + } + + public boolean isAuthenticated() { + if (!authenticated) { + return false; + } + if (level != null && level.getGameTime() >= authenticatedUntil) { + authenticated = false; + authenticatedUntil = 0L; + setChanged(); + return false; + } + return true; + } + + public boolean isAuthenticatedBy(ServerPlayer player) { + return isAuthenticated() && activeUser != null && activeUser.equals(player.getUUID()); + } + + public boolean claimUser(ServerPlayer player) { + if (level == null || level.isClientSide || !playerCanReach(player)) { + return false; + } + if (activeUser != null && !activeUser.equals(player.getUUID()) && isAuthenticated()) { + return false; + } + activeUser = player.getUUID(); + return true; + } + + public boolean playerCanReach(ServerPlayer player) { + return player.level() == level && player.distanceToSqr(worldPosition.getX() + 0.5D, worldPosition.getY() + 0.5D, worldPosition.getZ() + 0.5D) <= 64.0D; + } + + public ComputerFileSystem fileSystem() { + return fileSystem; + } + + public ComputerDesktopState desktopState() { + return desktopState; + } + + public boolean unlockWallpaper(ResourceLocation id) { + return serverDesktopMutation(() -> desktopState.unlockWallpaper(id)); + } + + public boolean installProgram(ResourceLocation id) { + return serverDesktopMutation(() -> desktopState.installProgram(id)); + } + + public boolean uninstallProgram(ResourceLocation id) { + return serverDesktopMutation(() -> desktopState.uninstallProgram(id)); + } + + public boolean selectWallpaper(ResourceLocation id) { + return serverDesktopMutation(() -> desktopState.selectWallpaper(id)); + } + + public boolean setIconPosition(ResourceLocation id, int x, int y) { + return serverDesktopMutation(() -> desktopState.setIconPosition(id, x, y)); + } + + public boolean removeIconPosition(ResourceLocation id) { + return serverDesktopMutation(() -> desktopState.removeIconPosition(id)); + } + + private boolean serverDesktopMutation(java.util.function.BooleanSupplier mutation) { + if (level == null || level.isClientSide) { + return false; + } + boolean changed = mutation.getAsBoolean(); + if (changed) { + setChanged(); + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 3); + } + return changed; + } + + public boolean canUseFileSystem(ServerPlayer player) { + return level != null && !level.isClientSide && isAuthenticated() && playerCanReach(player) && (activeUser == null || activeUser.equals(player.getUUID())); + } + + public void logout() { + clearAuthentication(); + } + + public void releaseUser(ServerPlayer player) { + if (activeUser != null && activeUser.equals(player.getUUID())) { + activeUser = null; + setChanged(); + } + } + + public void clearAuthentication() { + authenticated = false; + authenticatedUntil = 0L; + activeUser = null; + setChanged(); + } + + public long authenticationTimeout() { + return AUTHENTICATION_TIMEOUT; + } + + public boolean hasActiveUser() { + return activeUser != null && isAuthenticated(); } private static ItemStack diskStack(ResourceLocation diskId) { @@ -153,32 +323,45 @@ public final class ComputerBlockEntity extends BlockEntity implements GeoBlockEn @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { super.loadAdditional(tag, registries); - diskIds.clear(); + physicalDiskIds.clear(); ListTag disks = tag.getList(DISKS_TAG, 8); for (int index = 0; index < disks.size(); index++) { try { - diskIds.add(ResourceLocation.parse(disks.getString(index))); + ResourceLocation diskId = ResourceLocation.parse(disks.getString(index)); + if (!INTRODUCTION_DISK.equals(diskId)) { + physicalDiskIds.add(diskId); + } } catch (Exception ignored) { } } activeUntil = tag.getLong(ACTIVE_UNTIL_TAG); + password = tag.getString(PASSWORD_TAG); + fileSystem.load(tag, registries); + desktopState.load(tag.getCompound(DESKTOP_TAG)); + authenticated = false; + authenticatedUntil = 0L; + activeUser = null; } @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { super.saveAdditional(tag, registries); ListTag disks = new ListTag(); - for (ResourceLocation diskId : diskIds) { + for (ResourceLocation diskId : physicalDiskIds) { disks.add(StringTag.valueOf(diskId.toString())); } tag.put(DISKS_TAG, disks); tag.putLong(ACTIVE_UNTIL_TAG, activeUntil); + tag.putString(PASSWORD_TAG, password); + fileSystem.save(tag, registries); + tag.put(DESKTOP_TAG, desktopState.save()); } @Override public CompoundTag getUpdateTag(HolderLookup.Provider registries) { CompoundTag tag = new CompoundTag(); - saveAdditional(tag, registries); + tag.putBoolean("HasPassword", hasPassword()); + tag.putBoolean(AUTHENTICATED_TAG, isAuthenticated()); return tag; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntmailClientState.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntmailClientState.java new file mode 100644 index 00000000..2a94b7e8 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntmailClientState.java @@ -0,0 +1,22 @@ +package com.craisinlord.antarchy.content.client; + +import com.craisinlord.antarchy.content.network.AntmailResultPayload; +import net.minecraft.core.BlockPos; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public final class AntmailClientState { + private static final Map RESULTS = new ConcurrentHashMap<>(); + + private AntmailClientState() { + } + + public static void update(AntmailResultPayload payload) { + RESULTS.put(payload.pos(), payload); + } + + public static AntmailResultPayload get(BlockPos pos) { + return RESULTS.get(pos); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerAccessClientState.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerAccessClientState.java new file mode 100644 index 00000000..1c640fdb --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerAccessClientState.java @@ -0,0 +1,23 @@ +package com.craisinlord.antarchy.content.client; + +import com.craisinlord.antarchy.content.network.ComputerAccessResultPayload; +import net.minecraft.core.BlockPos; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public final class ComputerAccessClientState { + private static final Map RESULTS = new ConcurrentHashMap<>(); + + private ComputerAccessClientState() { + } + + public static void update(ComputerAccessResultPayload result) { + RESULTS.put(result.pos(), result); + ComputerFileSystemClientState.update(result); + } + + public static ComputerAccessResultPayload get(BlockPos pos) { + return RESULTS.get(pos); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerFileSystemClientState.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerFileSystemClientState.java new file mode 100644 index 00000000..73e184ef --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ComputerFileSystemClientState.java @@ -0,0 +1,60 @@ +package com.craisinlord.antarchy.content.client; + +import com.craisinlord.antarchy.content.network.ComputerAccessPayload; +import com.craisinlord.antarchy.content.network.ComputerAccessResultPayload; +import net.minecraft.core.BlockPos; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public final class ComputerFileSystemClientState { + private static final Map STATES = new ConcurrentHashMap<>(); + + private ComputerFileSystemClientState() { + } + + public static void update(ComputerAccessResultPayload payload) { + if (payload.data().isEmpty()) return; + String[] envelope = payload.data().split("\u0000", 3); + if (envelope.length < 3) return; + int action; + try { + action = Integer.parseInt(envelope[0]); + } catch (NumberFormatException ignored) { + return; + } + State state = STATES.computeIfAbsent(payload.pos(), ignored -> new State()); + state.success = payload.result() == ComputerAccessResultPayload.SUCCESS; + state.error = envelope[1]; + if (action == ComputerAccessPayload.FILE_LIST && state.success) { + state.files = new ArrayList<>(); + if (!envelope[2].isEmpty()) state.files.addAll(List.of(envelope[2].split("\\n"))); + } else if (action == ComputerAccessPayload.FILE_OPEN && state.success) { + String[] file = envelope[2].split("\u0000", 2); + if (file.length == 2) { + state.openedPath = file[0]; + state.openedContents = file[1]; + } + } + } + + public static State get(BlockPos pos) { + return STATES.computeIfAbsent(pos, ignored -> new State()); + } + + public static final class State { + private List files = List.of(); + private String openedPath = ""; + private String openedContents = ""; + private String error = ""; + private boolean success; + + public List files() { return List.copyOf(files); } + public String openedPath() { return openedPath; } + public String openedContents() { return openedContents; } + public String error() { return error; } + public boolean success() { return success; } + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmGame.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmGame.java new file mode 100644 index 00000000..19b9059b --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmGame.java @@ -0,0 +1,168 @@ +package com.craisinlord.antarchy.content.client.game; + +import java.util.ArrayList; +import java.util.List; + +public final class AntFarmGame { + public enum Phase { READY, PLAYING, WON, LOST } + public enum Direction { + UP(0, -1), DOWN(0, 1), LEFT(-1, 0), RIGHT(1, 0), NONE(0, 0); + + private final int dx; + private final int dy; + + Direction(int dx, int dy) { + this.dx = dx; + this.dy = dy; + } + } + + private static final String[] MAP = { + "###################", + "#.................#", + "#.###.#####.#####.#", + "#.................#", + "#.#####.###.#####.#", + "#.................#", + "#.#####.###.#####.#", + "#.................#", + "#.#####.###.#####.#", + "#.................#", + "###################" + }; + private static final int TICKS_PER_TILE = 4; + private static final int PLAYER_START_X = 1; + private static final int PLAYER_START_Y = 1; + private static final int ENEMY_START_X = 17; + private static final int ENEMY_START_Y = 9; + + private final boolean[][] pellets = new boolean[MAP.length][MAP[0].length()]; + private Phase phase = Phase.READY; + private Direction playerDirection = Direction.NONE; + private Direction requestedDirection = Direction.NONE; + private Direction enemyDirection = Direction.LEFT; + private int playerX; + private int playerY; + private int enemyX; + private int enemyY; + private int movementTicks; + private int score; + private int remainingFood; + + public AntFarmGame() { + reset(); + } + + public void reset() { + phase = Phase.READY; + playerDirection = Direction.NONE; + requestedDirection = Direction.NONE; + enemyDirection = Direction.LEFT; + playerX = PLAYER_START_X; + playerY = PLAYER_START_Y; + enemyX = ENEMY_START_X; + enemyY = ENEMY_START_Y; + movementTicks = 0; + score = 0; + remainingFood = 0; + for (int y = 0; y < MAP.length; y++) { + for (int x = 0; x < MAP[y].length(); x++) { + pellets[y][x] = MAP[y].charAt(x) == '.'; + if (pellets[y][x]) remainingFood++; + } + } + } + + public void start() { + if (phase == Phase.READY) phase = Phase.PLAYING; + } + + public void tick() { + if (phase != Phase.PLAYING) return; + movementTicks++; + if (movementTicks < TICKS_PER_TILE) return; + movementTicks = 0; + movePlayer(); + if (phase != Phase.PLAYING) return; + moveEnemy(); + if (playerX == enemyX && playerY == enemyY) phase = Phase.LOST; + } + + public void setRequestedDirection(Direction direction) { + if (direction != null && direction != Direction.NONE) requestedDirection = direction; + } + + public Phase phase() { return phase; } + public int score() { return score; } + public int remainingFood() { return remainingFood; } + public int width() { return MAP[0].length(); } + public int height() { return MAP.length; } + public int playerX() { return playerX; } + public int playerY() { return playerY; } + public int enemyX() { return enemyX; } + public int enemyY() { return enemyY; } + public boolean hasPellet(int x, int y) { return pellets[y][x]; } + public boolean isWall(int x, int y) { return MAP[y].charAt(x) == '#'; } + + private void movePlayer() { + if (canMove(playerX, playerY, requestedDirection)) playerDirection = requestedDirection; + if (canMove(playerX, playerY, playerDirection)) { + playerX += playerDirection.dx; + playerY += playerDirection.dy; + } + if (pellets[playerY][playerX]) { + pellets[playerY][playerX] = false; + remainingFood--; + score += 10; + if (remainingFood == 0) phase = Phase.WON; + } + } + + private void moveEnemy() { + List directions = legalDirections(enemyX, enemyY); + if (directions.isEmpty()) return; + Direction reverse = opposite(enemyDirection); + if (directions.size() > 1) directions.remove(reverse); + Direction best = directions.get(0); + int bestDistance = distanceAfter(best, playerX, playerY, enemyX, enemyY); + for (Direction direction : directions) { + int distance = distanceAfter(direction, playerX, playerY, enemyX, enemyY); + if (distance < bestDistance) { + best = direction; + bestDistance = distance; + } + } + enemyDirection = best; + enemyX += best.dx; + enemyY += best.dy; + } + + private int distanceAfter(Direction direction, int targetX, int targetY, int originX, int originY) { + return Math.abs(originX + direction.dx - targetX) + Math.abs(originY + direction.dy - targetY); + } + + private List legalDirections(int x, int y) { + List result = new ArrayList<>(4); + for (Direction direction : new Direction[]{Direction.UP, Direction.DOWN, Direction.LEFT, Direction.RIGHT}) { + if (canMove(x, y, direction)) result.add(direction); + } + return result; + } + + private boolean canMove(int x, int y, Direction direction) { + if (direction == Direction.NONE) return false; + int nextX = x + direction.dx; + int nextY = y + direction.dy; + return nextY >= 0 && nextY < MAP.length && nextX >= 0 && nextX < MAP[nextY].length() && !isWall(nextX, nextY); + } + + private Direction opposite(Direction direction) { + return switch (direction) { + case UP -> Direction.DOWN; + case DOWN -> Direction.UP; + case LEFT -> Direction.RIGHT; + case RIGHT -> Direction.LEFT; + case NONE -> Direction.NONE; + }; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmInput.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmInput.java new file mode 100644 index 00000000..1e3f47eb --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmInput.java @@ -0,0 +1,22 @@ +package com.craisinlord.antarchy.content.client.game; + +import org.lwjgl.glfw.GLFW; + +public final class AntFarmInput { + private AntFarmInput() { + } + + public static AntFarmGame.Direction directionForKey(int keyCode) { + return switch (keyCode) { + case GLFW.GLFW_KEY_W, GLFW.GLFW_KEY_UP -> AntFarmGame.Direction.UP; + case GLFW.GLFW_KEY_S, GLFW.GLFW_KEY_DOWN -> AntFarmGame.Direction.DOWN; + case GLFW.GLFW_KEY_A, GLFW.GLFW_KEY_LEFT -> AntFarmGame.Direction.LEFT; + case GLFW.GLFW_KEY_D, GLFW.GLFW_KEY_RIGHT -> AntFarmGame.Direction.RIGHT; + default -> AntFarmGame.Direction.NONE; + }; + } + + public static boolean isStartOrRetry(int keyCode) { + return keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmProgram.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmProgram.java new file mode 100644 index 00000000..1a42f278 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmProgram.java @@ -0,0 +1,53 @@ +package com.craisinlord.antarchy.content.client.game; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; + +public final class AntFarmProgram { + private final AntFarmGame game = new AntFarmGame(); + private boolean gameInstalled; + + public AntFarmProgram(boolean gameInstalled) { + this.gameInstalled = gameInstalled; + } + + public void setGameInstalled(boolean gameInstalled) { + this.gameInstalled = gameInstalled; + if (!gameInstalled) game.reset(); + } + + public boolean isGameInstalled() { return gameInstalled; } + public AntFarmGame game() { return game; } + + public void tick() { + if (gameInstalled) game.tick(); + } + + public boolean keyPressed(int keyCode) { + if (!gameInstalled) return false; + AntFarmGame.Direction direction = AntFarmInput.directionForKey(keyCode); + if (direction != AntFarmGame.Direction.NONE) { + if (game.phase() == AntFarmGame.Phase.READY) game.start(); + game.setRequestedDirection(direction); + return true; + } + if (AntFarmInput.isStartOrRetry(keyCode)) { + if (game.phase() == AntFarmGame.Phase.READY) game.start(); + else if (game.phase() == AntFarmGame.Phase.WON || game.phase() == AntFarmGame.Phase.LOST) { + game.reset(); + game.start(); + } + return true; + } + return false; + } + + public void render(GuiGraphics graphics, Font font, int x, int y, int width, int height) { + if (!gameInstalled) { + graphics.fill(x, y, x + width, y + height, 0xFF020602); + graphics.drawString(font, "ANT FARM NOT INSTALLED", x + 12, y + height / 2, 0xFF65FF65, false); + return; + } + AntFarmRenderer.render(graphics, font, game, x, y, width, height); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmRenderer.java new file mode 100644 index 00000000..b38542f1 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntFarmRenderer.java @@ -0,0 +1,65 @@ +package com.craisinlord.antarchy.content.client.game; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; + +public final class AntFarmRenderer { + private static final int BLACK = 0xFF020602; + private static final int DARK_GREEN = 0xFF123012; + private static final int GREEN = 0xFF65FF65; + private static final int PALE_GREEN = 0xFFB8FFB8; + + private AntFarmRenderer() { + } + + public static void render(GuiGraphics graphics, Font font, AntFarmGame game, int x, int y, int width, int height) { + graphics.fill(x, y, x + width, y + height, BLACK); + int hudHeight = 18; + int boardX = x + 5; + int boardY = y + hudHeight + 4; + int boardWidth = width - 10; + int boardHeight = height - hudHeight - 9; + int tileSize = Math.max(1, Math.min(boardWidth / game.width(), boardHeight / game.height())); + int mazeWidth = tileSize * game.width(); + int mazeHeight = tileSize * game.height(); + int mazeX = boardX + Math.max(0, (boardWidth - mazeWidth) / 2); + int mazeY = boardY + Math.max(0, (boardHeight - mazeHeight) / 2); + graphics.drawString(font, Component.literal("SCORE " + String.format("%06d", game.score())), x + 6, y + 4, GREEN, false); + graphics.drawString(font, Component.literal("FOOD " + String.format("%03d", game.remainingFood())), x + width - 76, y + 4, PALE_GREEN, false); + for (int gridY = 0; gridY < game.height(); gridY++) { + for (int gridX = 0; gridX < game.width(); gridX++) { + int cellX = mazeX + gridX * tileSize; + int cellY = mazeY + gridY * tileSize; + if (game.isWall(gridX, gridY)) { + graphics.fill(cellX, cellY, cellX + tileSize, cellY + tileSize, DARK_GREEN); + } else if (game.hasPellet(gridX, gridY)) { + int pelletSize = Math.max(1, tileSize / 4); + int offset = (tileSize - pelletSize) / 2; + graphics.fill(cellX + offset, cellY + offset, cellX + offset + pelletSize, cellY + offset + pelletSize, PALE_GREEN); + } + } + } + drawAnt(graphics, mazeX + game.playerX() * tileSize, mazeY + game.playerY() * tileSize, tileSize, GREEN); + drawAnt(graphics, mazeX + game.enemyX() * tileSize, mazeY + game.enemyY() * tileSize, tileSize, PALE_GREEN); + if (game.phase() != AntFarmGame.Phase.PLAYING) { + String message = switch (game.phase()) { + case READY -> "ANT FARM // PRESS ENTER TO START"; + case WON -> "COLONY FED // ENTER TO PLAY AGAIN"; + case LOST -> "COLONY COMPROMISED // ENTER TO RETRY"; + case PLAYING -> ""; + }; + int messageWidth = font.width(message); + graphics.fill(x + 8, y + height / 2 - 12, x + width - 8, y + height / 2 + 12, BLACK); + graphics.drawString(font, Component.literal(message), x + Math.max(8, (width - messageWidth) / 2), y + height / 2 - 4, GREEN, false); + } + } + + private static void drawAnt(GuiGraphics graphics, int x, int y, int tileSize, int color) { + int inset = Math.max(1, tileSize / 4); + int center = x + tileSize / 2; + graphics.fill(center - inset, y + inset, center + inset + 1, y + tileSize - inset, color); + graphics.fill(x + inset, y + tileSize / 2 - inset, x + tileSize - inset, y + tileSize / 2 + inset + 1, color); + if (tileSize >= 5) graphics.fill(center - inset, y + inset, center + inset + 1, y + inset + 1, BLACK); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ComputerRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ComputerRenderer.java index d1ffa3b0..24dd5208 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ComputerRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ComputerRenderer.java @@ -2,10 +2,16 @@ package com.craisinlord.antarchy.content.client.renderer; import com.craisinlord.antarchy.content.block.entity.ComputerBlockEntity; import com.craisinlord.antarchy.content.client.model.ComputerModel; +import net.minecraft.core.Direction; import software.bernie.geckolib.renderer.GeoBlockRenderer; public final class ComputerRenderer extends GeoBlockRenderer { public ComputerRenderer(net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context context) { super(new ComputerModel()); } + + @Override + protected Direction getFacing(ComputerBlockEntity computer) { + return computer.getBlockState().getValue(com.craisinlord.antarchy.content.block.ComputerBlock.FACING); + } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/ComputerScreen.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/ComputerScreen.java index d411944d..0b627eb5 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/ComputerScreen.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/ComputerScreen.java @@ -1,150 +1,1054 @@ package com.craisinlord.antarchy.content.client.screen; -import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.content.block.entity.ComputerBlockEntity; +import com.craisinlord.antarchy.content.client.ComputerAccessClientState; +import com.craisinlord.antarchy.content.client.ComputerFileSystemClientState; +import com.craisinlord.antarchy.content.client.AntmailClientState; +import com.craisinlord.antarchy.content.antmail.AntmailAddress; +import com.craisinlord.antarchy.content.antmail.AntmailMailbox; +import com.craisinlord.antarchy.content.antmail.AntmailMessage; +import com.craisinlord.antarchy.content.antmail.AntmailWire; +import com.craisinlord.antarchy.content.antmail.AntmailAttachment; import com.craisinlord.antarchy.content.guide.ComputerGuideData; +import com.craisinlord.antarchy.content.network.ComputerAccessResultPayload; +import com.craisinlord.antarchy.content.network.AntmailResultPayload; +import com.craisinlord.antarchy.content.network.ComputerNetworking; +import com.craisinlord.antarchy.content.network.AntmailNetworking; +import com.craisinlord.antarchy.content.computer.paint.AntPaintCanvas; +import com.craisinlord.antarchy.content.computer.paint.AntPaintHistory; +import com.craisinlord.antarchy.content.computer.paint.AntPaintTool; +import com.craisinlord.antarchy.content.computer.paint.AntPaintFile; +import com.craisinlord.antarchy.content.computer.paint.AntPaintFileCodec; +import com.craisinlord.antarchy.content.computer.ComputerFileSystem; +import com.craisinlord.antarchy.content.computer.ComputerDesktopState; +import com.craisinlord.antarchy.content.client.game.AntFarmProgram; +import com.craisinlord.antarchy.content.computer.terminal.TerminalCommandParser; +import com.craisinlord.antarchy.content.computer.terminal.TerminalResult; +import org.lwjgl.glfw.GLFW; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.util.FormattedCharSequence; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Base64; +import java.util.UUID; public final class ComputerScreen extends Screen { - private static final int WIDTH = 320; - private static final int HEIGHT = 210; - private static final String[] CATEGORIES = {"general", "elythia", "thoraxis", "cavaryn"}; - private static final int[] COLORS = {0xFF65FF65, 0xFF65FF65, 0xFFFF5A5A, 0xFFFFA044}; - private final ResourceLocation positionDimension; + private static final int WIDTH = 440; + private static final int HEIGHT = 286; + private static final int GREEN = 0xFF65FF65; + private static final int PALE_GREEN = 0xFFB8FFB8; + private static final int DARK_GREEN = 0xFF102010; + private static final int BLACK = 0xFF030603; + private static final String[] BOOT_MESSAGES = {"ANTS MARCHING...", "COMPUTER COMPUTING...", "HCFS BREWING...", "WAKING THE QUEEN..."}; + private static final long SESSION_TIMEOUT = 300_000L; + private static final Map SESSIONS = new LinkedHashMap<>(); + private static final String[] ICONS = {"ARCHIVE", "FILES", "SETTINGS", "TERMINAL", "TEXT", "PAINT", "ANTMAIL", "GAMES", "TRASH"}; + private static final Map TITLES = Map.of("ARCHIVE", "ANTARCHIVE", "FILES", "FILE EXPLORER", "SETTINGS", "SYSTEM SETTINGS", "TERMINAL", "ANTINTOSH TERMINAL", "TEXT", "ANTTEXT EDITOR", "PAINT", "ANTPAINT", "ANTMAIL", "ANTMAIL", "GAMES", "INSTALLED GAMES", "TRASH", "RECYCLE BIN"); private final net.minecraft.core.BlockPos position; - private int categoryIndex; - private int selectedIndex; - private List visibleEntries = List.of(); + private final String sessionKey; + private final Session session; + private boolean loggedIn; + private String password = ""; + private String confirmation = ""; + private boolean confirmingPassword; + private String loginMessage = ""; + private int loginMessageTicks; + private ComputerAccessResultPayload accessResult; + private int observedResult = -1; + private Window dragging; + private String draggedDisk; + private ResourceLocation selectedDisk; + private int dragX; + private int dragY; + private Window activeWindow; + private final AntFarmProgram antFarm = new AntFarmProgram(false); public ComputerScreen(net.minecraft.core.BlockPos position) { super(Component.translatable("screen.antarchy.computer")); this.position = position; - this.positionDimension = Minecraft.getInstance().level == null ? null : Minecraft.getInstance().level.dimension().location(); - } - - @Override - protected void init() { - refreshEntries(); - int left = (this.width - WIDTH) / 2; - int top = (this.height - HEIGHT) / 2; - for (int index = 0; index < CATEGORIES.length; index++) { - int buttonIndex = index; - addRenderableWidget(Button.builder(Component.translatable("guide.antarchy.category." + CATEGORIES[index]), button -> { - categoryIndex = buttonIndex; - selectedIndex = 0; - refreshEntries(); - }).bounds(left + 10 + index * 75, top + 10, 70, 20).build()); - } - } - - private void refreshEntries() { - if (Minecraft.getInstance().level != null && Minecraft.getInstance().level.getBlockEntity(position) instanceof ComputerBlockEntity computer) { - visibleEntries = ComputerGuideData.entriesFor(computer.diskIds()).stream() - .filter(entry -> entry.category().equals(CATEGORIES[categoryIndex])) - .toList(); - } else { - visibleEntries = List.of(); - } - if (selectedIndex >= visibleEntries.size()) { - selectedIndex = Math.max(0, visibleEntries.size() - 1); + String dimension = Minecraft.getInstance().level == null ? "" : Minecraft.getInstance().level.dimension().location().toString(); + this.sessionKey = dimension + ":" + position.asLong(); + this.session = SESSIONS.computeIfAbsent(sessionKey, ignored -> new Session()); + if (this.session.bootTicks < 0) this.session.bootTicks = 80; + ComputerNetworking.open(position); + AntmailNetworking.requestState(position); + this.accessResult = ComputerAccessClientState.get(position); + this.loggedIn = accessResult != null && accessResult.authenticated() && session.lastUse + SESSION_TIMEOUT > System.currentTimeMillis(); + if (!loggedIn) { + session.authenticated = false; + session.windows.clear(); } } @Override public void tick() { - refreshEntries(); + if (session.bootTicks > 0) session.bootTicks--; + if (loginMessageTicks > 0) loginMessageTicks--; + ComputerAccessResultPayload currentResult = ComputerAccessClientState.get(position); + if (currentResult != null) { + accessResult = currentResult; + if (currentResult.result() != observedResult) { + observedResult = currentResult.result(); + if (currentResult.result() == ComputerAccessResultPayload.SUCCESS) { + loginMessage = "ACCESS GRANTED // WELCOME"; + loginMessageTicks = 40; + } else if (currentResult.result() == ComputerAccessResultPayload.INVALID_PASSWORD) { + loginMessage = "ACCESS DENIED // PASSWORD REJECTED"; + loginMessageTicks = 100; + } else if (currentResult.result() == ComputerAccessResultPayload.BUSY) { + loginMessage = "TERMINAL BUSY // USER PRESENT"; + loginMessageTicks = 100; + } + } + } + if (!loggedIn && accessResult != null && accessResult.authenticated()) { + loggedIn = true; + session.authenticated = true; + session.lastUse = System.currentTimeMillis(); + } + if (loggedIn && (session.lastUse + SESSION_TIMEOUT <= System.currentTimeMillis() || accessResult == null || !accessResult.authenticated())) { + loggedIn = false; + session.authenticated = false; + session.windows.clear(); + } + if (loggedIn && !session.desktopRequested) { + ComputerNetworking.requestDesktopState(position); + session.desktopRequested = true; + } + if (currentResult != null && currentResult.data().startsWith("11\u0000")) { + String[] desktop = currentResult.data().split("\u0000", 3); + if (desktop.length == 3 && !desktop[2].isBlank()) { + try { + var state = new ComputerDesktopState(); + state.load(AntmailWire.decodeTag(desktop[2])); + session.wallpaperId = state.selectedWallpaper() == null ? ComputerDesktopState.DEFAULT_WALLPAPER.toString() : state.selectedWallpaper().toString(); + session.wallpapers = state.unlockedWallpaperIds().stream().map(ResourceLocation::toString).toList(); + } catch (RuntimeException ignored) { + } + } + } + antFarm.setGameInstalled(physicalDisks().stream().anyMatch(id -> id.getPath().equals("ant_farm"))); + if (activeWindow != null && activeWindow.type.equals("GAMES") && activeWindow.gameOpen) antFarm.tick(); } @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { - super.render(graphics, mouseX, mouseY, partialTick); - int left = (this.width - WIDTH) / 2; - int top = (this.height - HEIGHT) / 2; - graphics.fill(0, 0, this.width, this.height, 0x99000000); - graphics.fill(left, top, left + WIDTH, top + HEIGHT, 0xFF071007); - graphics.fill(left + 4, top + 4, left + WIDTH - 4, top + HEIGHT - 4, 0xFF102010); - int accent = COLORS[categoryIndex]; - graphics.fill(left + 8, top + 34, left + WIDTH - 8, top + 36, accent); - graphics.drawString(this.font, Component.translatable("screen.antarchy.computer"), left + 12, top + 45, accent, false); - graphics.drawString(this.font, Component.literal(positionDimension == null ? "ARCHIVE OFFLINE" : "ARCHIVE ONLINE"), left + WIDTH - 105, top + 45, 0xFF65FF65, false); - graphics.fill(left + 10, top + 60, left + 112, top + HEIGHT - 12, 0xFF050805); - for (int index = 0; index < visibleEntries.size() && index < 6; index++) { - ComputerGuideData.Entry entry = visibleEntries.get(index); - int y = top + 68 + index * 20; - int color = index == selectedIndex ? accent : 0xFF65FF65; - if (index == selectedIndex) { - graphics.fill(left + 12, y - 2, left + 110, y + 14, 0xFF173817); - } - graphics.drawString(this.font, Component.literal("FILE_" + (index + 1)), left + 16, y, color, false); - if (isMouseOver(left + 12, y - 2, 98, 16, mouseX, mouseY)) { - graphics.renderTooltip(this.font, Component.translatable(entry.titleKey()), mouseX, mouseY); - } + this.renderBackground(graphics, mouseX, mouseY, partialTick); + float scale = uiScale(); + graphics.pose().pushPose(); + graphics.pose().translate(width / 2.0F, height / 2.0F, 0.0F); + graphics.pose().scale(scale, scale, 1.0F); + int left = -WIDTH / 2; + int top = -HEIGHT / 2; + int localMouseX = (int) ((mouseX - width / 2.0F) / scale); + int localMouseY = (int) ((mouseY - height / 2.0F) / scale); + graphics.fill(left - 5, top - 5, left + WIDTH + 5, top + HEIGHT + 5, GREEN); + graphics.fill(left, top, left + WIDTH, top + HEIGHT, BLACK); + graphics.fill(left + 5, top + 5, left + WIDTH - 5, top + HEIGHT - 5, DARK_GREEN); + if (session.bootTicks > 0) renderBoot(graphics, left, top); else if (loggedIn) renderDesktop(graphics, left, top, localMouseX, localMouseY); else renderLogin(graphics, left, top); + graphics.pose().popPose(); + } + + private float uiScale() { + return Math.min(1.0F, Math.min((width - 24.0F) / WIDTH, (height - 24.0F) / HEIGHT)); + } + + private void renderBoot(GuiGraphics g, int l, int t) { + int progress = Math.min(100, (80 - session.bootTicks) * 100 / 80); + int message = Math.min(BOOT_MESSAGES.length - 1, progress * BOOT_MESSAGES.length / 101); + g.drawString(font, Component.literal("ANTINTOSH OS"), l + 28, t + 78, GREEN, false); + g.drawString(font, Component.literal("INITIALIZING SYSTEM..."), l + 28, t + 105, PALE_GREEN, false); + g.fill(l + 28, t + 132, l + WIDTH - 28, t + 148, BLACK); + box(g, l + 28, t + 132, l + WIDTH - 28, t + 148, GREEN); + g.fill(l + 32, t + 136, l + 32 + (WIDTH - 64) * progress / 100, t + 144, GREEN); + g.drawString(font, Component.literal(progress + "%"), l + 28, t + 164, GREEN, false); + g.drawString(font, Component.literal(BOOT_MESSAGES[message]), l + 28, t + 190, PALE_GREEN, false); + } + + private void renderLogin(GuiGraphics g, int l, int t) { + g.drawString(font, Component.literal("ANTINTOSH OS"), l + 28, t + 25, GREEN, false); + g.drawString(font, Component.literal("BOOT SEQUENCE COMPLETE"), l + 28, t + 43, PALE_GREEN, false); + g.fill(l + 28, t + 59, l + WIDTH - 28, t + 61, GREEN); + ComputerBlockEntity computer = computer(); + boolean setup = (accessResult != null && !accessResult.hasPassword()) || (computer != null && !computer.hasPassword()); + int formX = setup ? l + 110 : l + 242; + int formRight = setup ? l + 330 : l + WIDTH - 28; + g.drawString(font, Component.literal(setup ? "INITIALIZE COMPUTER" : "LOGIN REQUIRED"), formX, t + 105, GREEN, false); + g.drawString(font, Component.literal(setup ? (confirmingPassword ? "CONFIRM PASSWORD" : "CREATE PASSWORD") : "PASSWORD"), formX, t + 132, PALE_GREEN, false); + g.fill(formX, t + 150, formRight, t + 173, BLACK); + box(g, formX, t + 150, formRight, t + 173, GREEN); + g.drawString(font, Component.literal("*".repeat((confirmingPassword ? confirmation : password).length())), formX + 6, t + 157, GREEN, false); + g.drawString(font, Component.literal(setup ? (confirmingPassword ? "[ ENTER ] CONFIRM" : "[ ENTER ] CONTINUE") : "[ ENTER ] LOGIN"), formX, t + 187, GREEN, false); + g.drawString(font, Component.literal("[ ESC ] POWER DOWN"), formX, t + 205, PALE_GREEN, false); + if (loginMessageTicks > 0) wrap(g, loginMessage, formX, t + 232, setup ? 220 : 165, PALE_GREEN); + } + + private void renderDesktop(GuiGraphics g, int l, int t, int mouseX, int mouseY) { + session.lastUse = System.currentTimeMillis(); + if (session.wallpaperId.endsWith("grid_ant")) { + for (int py = t + 36; py < t + HEIGHT - 8; py += 18) for (int px = l + 8; px < l + WIDTH - 8; px += 36) g.fill(px, py, px + 2, py + 2, 0xFF173817); } - if (visibleEntries.isEmpty()) { - graphics.drawString(this.font, Component.literal("NO DATA FOUND"), left + 22, top + 86, accent, false); - graphics.drawString(this.font, Component.literal("INSERT FLOPPY DISKS"), left + 16, top + 104, 0xFF65FF65, false); - } else { - renderEntry(graphics, visibleEntries.get(selectedIndex), left + 124, top + 62, accent); + g.fill(l + 9, t + 9, l + WIDTH - 9, t + 30, BLACK); + g.drawString(font, Component.literal("ANTINTOSH OS // v" + Antarchy.MOD_VERSION), l + 18, t + 15, GREEN, false); + long dayTime = Minecraft.getInstance().level == null ? 0L : Minecraft.getInstance().level.getDayTime(); + long dayTicks = Math.floorMod(dayTime, 24000L); + int hours = (int) ((dayTicks / 1000L + 6L) % 24L); + int minutes = (int) (dayTicks % 1000L * 60L / 1000L); + g.drawString(font, Component.literal(String.format("%02d:%02d", hours, minutes)), l + WIDTH - 48, t + 15, PALE_GREEN, false); + g.fill(l + 9, t + 31, l + WIDTH - 9, t + 33, GREEN); + for (int i = 0; i < ICONS.length; i++) { + int x = l + 24 + i % 4 * 94; + int y = t + 48 + i / 4 * 76; + boolean hover = inside(x - 6, y - 6, 76, 57, mouseX, mouseY); + if (hover) g.fill(x - 7, y - 7, x + 69, y + 51, 0xFF173817); + icon(g, ICONS[i], x + 25, y + 2); + g.drawString(font, Component.literal(ICONS[i]), x, y + 35, GREEN, false); } - for (Renderable renderable : this.renderables) { - renderable.render(graphics, mouseX, mouseY, partialTick); + List disks = physicalDisks(); + for (int i = 0; i < disks.size() && i < 3; i++) { + int x = l + 24 + i % 4 * 94; + int y = t + 200 + i / 4 * 54; + icon(g, "DISK", x + 25, y + 2); + String name = disks.get(i).getPath(); + g.drawString(font, Component.literal(name.length() > 12 ? name.substring(0, 12) : name), x, y + 35, GREEN, false); + } + for (Window window : session.windows) if (!window.minimized) renderWindow(g, window, l, t, mouseX, mouseY); + } + + private void icon(GuiGraphics g, String type, int x, int y) { + g.fill(x - 10, y, x + 10, y + 18, BLACK); + g.fill(x - 8, y + 2, x + 8, y + 16, GREEN); + if (type.equals("SETTINGS")) { + g.fill(x - 12, y + 7, x + 12, y + 11, BLACK); + g.fill(x - 2, y - 2, x + 2, y + 20, BLACK); + } else if (type.equals("TRASH")) { + g.fill(x - 12, y - 3, x + 12, y, GREEN); + g.fill(x - 7, y + 4, x + 7, y + 18, BLACK); + } else if (type.equals("TERMINAL")) { + g.fill(x - 5, y + 7, x - 1, y + 11, BLACK); + g.fill(x - 1, y + 11, x + 6, y + 14, BLACK); } } - private void renderEntry(GuiGraphics graphics, ComputerGuideData.Entry entry, int x, int y, int accent) { - graphics.drawString(this.font, Component.translatable(entry.titleKey()), x, y, accent, false); - if (!entry.subtitleKey().isEmpty()) { - graphics.drawString(this.font, Component.translatable(entry.subtitleKey()), x, y + 16, 0xFF99FF99, false); + private void renderWindow(GuiGraphics g, Window window, int l, int t, int mouseX, int mouseY) { + int x = l + window.x; + int y = t + window.y; + int w = window.maximized ? WIDTH - 28 : window.width; + int h = window.maximized ? HEIGHT - 48 : window.height; + window.renderWidth = w; + window.renderHeight = h; + g.fill(x - 2, y - 2, x + w + 2, y + h + 2, GREEN); + g.fill(x, y, x + w, y + h, BLACK); + g.fill(x, y, x + w, y + 19, 0xFF173817); + g.drawString(font, Component.literal(window.title), x + 7, y + 6, GREEN, false); + g.drawString(font, Component.literal("_"), x + w - 39, y + 5, PALE_GREEN, false); + g.drawString(font, Component.literal(window.maximized ? "❐" : "□"), x + w - 27, y + 5, PALE_GREEN, false); + g.drawString(font, Component.literal("X"), x + w - 13, y + 6, GREEN, false); + int cx = x + 8; + int cy = y + 28; + if (window.type.equals("ARCHIVE")) renderArchive(g, cx, cy, w - 16, h - 34); + else if (window.type.equals("FILES")) renderFileExplorer(g, cx, cy, w, h); + else if (window.type.equals("SETTINGS")) renderSettings(g, cx, cy, h - 34); + else if (window.type.equals("TERMINAL")) renderTerminal(g, cx, cy, h); + else if (window.type.equals("TEXT")) renderTextEditor(g, cx, cy, w, h); + else if (window.type.equals("PAINT")) renderPaint(g, cx, cy, w, h); + else if (window.type.equals("ANTMAIL")) renderAntmail(g, cx, cy, h); + else if (window.type.equals("GAMES")) renderGames(g, cx, cy); + else renderTrash(g, cx, cy); + } + + private void renderArchive(GuiGraphics g, int x, int y, int w, int h) { + List entries = List.of(); + if (Minecraft.getInstance().level != null && Minecraft.getInstance().level.getBlockEntity(position) instanceof ComputerBlockEntity computer) entries = ComputerGuideData.entriesFor(computer.diskIds()); + + ComputerGuideData.Entry selected = null; + if (session.archiveEntryId != null) { + selected = entries.stream().filter(entry -> entry.id().equals(session.archiveEntryId)).findFirst().orElse(null); + if (selected == null) session.archiveEntryId = null; } + + if (selected != null) { + g.drawString(font, Component.literal("< BACK // RECOVERED FILES"), x, y, GREEN, false); + g.fill(x, y + 16, x + w, y + 18, GREEN); + g.drawString(font, Component.translatable(selected.titleKey()), x, y + 27, GREEN, false); + if (!selected.subtitleKey().isBlank()) wrap(g, Component.translatable(selected.subtitleKey()), x, y + 43, w, PALE_GREEN); + int line = y + (selected.subtitleKey().isBlank() ? 43 : 59); + g.drawString(font, Component.literal(selected.type().toUpperCase() + " // " + selected.category().toUpperCase()), x, line, PALE_GREEN, false); + line += 16; + for (String descriptionKey : selected.descriptionKeys()) { + line = wrap(g, Component.translatable(descriptionKey), x, line, w, GREEN) + 3; + if (line > y + h - 36) break; + } + if (!selected.itemId().isBlank() && line < y + h - 24) { + line = wrap(g, "ITEM // " + selected.itemId(), x, line, w, PALE_GREEN) + 2; + } + if (!selected.structureId().isBlank() && line < y + h - 24) { + line = wrap(g, "STRUCTURE // " + selected.structureId(), x, line, w, PALE_GREEN) + 2; + } + if (!selected.dimensionId().isBlank() && line < y + h - 24) { + wrap(g, "DIMENSION // " + selected.dimensionId(), x, line, w, PALE_GREEN); + } + g.drawString(font, Component.literal("[ ESC ] BACK"), x, y + h - 12, PALE_GREEN, false); + return; + } + + g.drawString(font, Component.literal("RECOVERED FILES // " + entries.size()), x, y, GREEN, false); + if (entries.isEmpty()) { + g.drawString(font, Component.literal("NO ARCHIVE DATA"), x, y + 28, PALE_GREEN, false); + return; + } + int row = y + 18; + int visible = Math.max(1, (h - 34) / 25); + for (int i = 0; i < entries.size() && i < visible; i++) { + ComputerGuideData.Entry entry = entries.get(i); + int rowTop = row + i * 25; + g.drawString(font, Component.literal(String.format("FILE_%02d", i + 1)), x + 5, rowTop, PALE_GREEN, false); + String title = trimToWidth(Component.translatable(entry.titleKey()).getString(), w - 64); + g.drawString(font, Component.literal(title), x + 57, rowTop, GREEN, false); + g.drawString(font, Component.literal(entry.type().toUpperCase() + " // " + entry.category().toUpperCase()), x + 57, rowTop + 11, PALE_GREEN, false); + } + if (entries.size() > visible) g.drawString(font, Component.literal("SCROLLING NOT AVAILABLE // FIRST FILES SHOWN"), x, y + h - 12, PALE_GREEN, false); + else g.drawString(font, Component.literal("[ CLICK FILE TO OPEN ]"), x, y + h - 12, PALE_GREEN, false); + } + + private void renderFileExplorer(GuiGraphics g, int x, int y, int w, int h) { + var files = ComputerFileSystemClientState.get(position).files(); + g.drawString(font, Component.literal("FILE EXPLORER // " + session.fileExplorerDirectory), x, y, GREEN, false); + if (!session.fileExplorerDirectory.equals("/")) g.drawString(font, Component.literal("[ UP ]"), x + w - 40, y, GREEN, false); + g.drawString(font, Component.literal("TYPE PATH SIZE"), x, y + 18, PALE_GREEN, false); int line = y + 34; - for (String descriptionKey : entry.descriptionKeys()) { - for (FormattedCharSequence wrapped : this.font.split(Component.translatable(descriptionKey), 174)) { - graphics.drawString(this.font, wrapped, x, line, 0xFFB8FFB8, false); - line += 11; - if (line > y + 125) { - return; + for (String file : files) { + String[] fields = file.split("\\t", 3); + if (fields.length < 3 || !isDirectChild(fields[1], session.fileExplorerDirectory) || line > y + h - 20) continue; + g.drawString(font, Component.literal(trimToWidth(fields[0], 36)), x, line, PALE_GREEN, false); + g.drawString(font, Component.literal(trimToWidth(fields[1], 125)), x + 42, line, GREEN, false); + g.drawString(font, Component.literal(fields[2]), x + w - 28, line, PALE_GREEN, false); + line += 14; + } + if (line == y + 34) g.drawString(font, Component.literal("NO FILES // OPEN TERMINAL TO CREATE ONE"), x, y + 38, PALE_GREEN, false); + } + + private boolean isDirectChild(String path, String directory) { + if (path.equals(directory)) return false; + String prefix = directory.equals("/") ? "/" : directory + "/"; + if (!path.startsWith(prefix)) return false; + return path.indexOf('/', prefix.length()) < 0; + } + + private String parentDirectory(String path) { + if (path.equals("/")) return "/"; + int slash = path.lastIndexOf('/'); + return slash <= 0 ? "/" : path.substring(0, slash); + } + + private String trimToWidth(String value, int width) { + if (font.width(value) <= width) return value; + String ellipsis = "..."; + int end = value.length(); + while (end > 0 && font.width(value.substring(0, end) + ellipsis) > width) end--; + return value.substring(0, end) + ellipsis; + } + + private void renderSettings(GuiGraphics g, int x, int y, int h) { + g.drawString(font, Component.literal("SYSTEM STATUS"), x, y, GREEN, false); + g.drawString(font, Component.literal("CPU " + (System.currentTimeMillis() / 100 % 87 + 12) + "%"), x, y + 18, PALE_GREEN, false); + g.drawString(font, Component.literal("MEM " + (System.currentTimeMillis() / 250 % 42 + 31) + "%"), x, y + 32, PALE_GREEN, false); + g.drawString(font, Component.literal("WALLPAPER " + session.wallpaperId.substring(session.wallpaperId.indexOf(':') + 1).toUpperCase()), x, y + 46, PALE_GREEN, false); + g.drawString(font, Component.literal("[ CLICK TO CYCLE ]"), x, y + 60, GREEN, false); + g.drawString(font, Component.literal("PASSWORD CHANGE IN FULL BUILD"), x, y + 70, GREEN, false); + g.drawString(font, Component.literal("PHYSICAL DISKS"), x, y + 91, GREEN, false); + List disks = physicalDisks(); + if (disks.isEmpty()) { + g.drawString(font, Component.literal("NONE INSTALLED"), x, y + 108, PALE_GREEN, false); + } else { + for (int i = 0; i < disks.size() && i < 3; i++) { + ResourceLocation disk = disks.get(i); + boolean active = disk.equals(selectedDisk); + if (active) g.fill(x - 3, y + 105 + i * 17, x + 205, y + 120 + i * 17, 0xFF173817); + g.drawString(font, Component.literal(disk.toString()), x, y + 108 + i * 17, active ? GREEN : PALE_GREEN, false); + } + g.drawString(font, Component.literal("[ EJECT SELECTED ]"), x, y + 162, selectedDisk == null ? 0xFF4A754A : GREEN, false); + } + g.drawString(font, Component.literal("LOG OUT"), x, y + h - 17, GREEN, false); + } + + private void renderTerminal(GuiGraphics g, int x, int y, int h) { + var fileState = ComputerFileSystemClientState.get(position); + g.drawString(font, Component.literal("ANTINTOSH TERMINAL [READY]"), x, y, GREEN, false); + int line = y + 17; + for (String output : session.terminalOutput) { + line = wrap(g, output, x, line, 208, PALE_GREEN) + 1; + if (line > y + h - 32) break; + } + if (!fileState.error().isEmpty()) g.drawString(font, Component.literal("RESPONSE: " + fileState.error()), x, y + 16, PALE_GREEN, false); + g.drawString(font, Component.literal(session.terminalDirectory + "> " + session.terminalInput + "_"), x, y + h - 48, GREEN, false); + } + + private void renderPaint(GuiGraphics g, int x, int y, int w, int h) { + var fileState = ComputerFileSystemClientState.get(position); + if (!session.paintDirty && fileState.openedPath().endsWith(".antpaint") && !fileState.openedContents().isEmpty()) { + try { + AntPaintFile file = AntPaintFileCodec.decode(Base64.getDecoder().decode(fileState.openedContents())); + session.paintName = file.filename(); + session.paintCanvas = file.canvas().copy(); + } catch (IllegalArgumentException ignored) { + } + } + g.drawString(font, Component.literal("ANTPAINT // " + session.paintName + (session.paintDirty ? " *" : "")), x, y, GREEN, false); + g.drawString(font, Component.literal("NEW PENCIL ERASER FILL CLEAR UNDO REDO SAVE"), x, y + 14, PALE_GREEN, false); + int size = Math.min((w - 16) / AntPaintCanvas.WIDTH, (h - 54) / AntPaintCanvas.HEIGHT); + int cx = x + (w - size * AntPaintCanvas.WIDTH) / 2; + int cy = y + 30; + g.fill(cx - 1, cy - 1, cx + size * AntPaintCanvas.WIDTH + 1, cy + size * AntPaintCanvas.HEIGHT + 1, BLACK); + g.fill(cx, cy, cx + size * AntPaintCanvas.WIDTH, cy + size * AntPaintCanvas.HEIGHT, GREEN); + for (int py = 0; py < AntPaintCanvas.HEIGHT; py++) for (int px = 0; px < AntPaintCanvas.WIDTH; px++) if (!session.paintCanvas.get(px, py)) g.fill(cx + px * size, cy + py * size, cx + (px + 1) * size, cy + (py + 1) * size, BLACK); + g.drawString(font, Component.literal("TOOL " + session.paintTool.name() + " " + (session.paintDirty ? "MODIFIED" : "SAVED")), x, y + h - 16, PALE_GREEN, false); + } + + private void renderTextEditor(GuiGraphics g, int x, int y, int w, int h) { + var fileState = ComputerFileSystemClientState.get(position); + if (!fileState.openedPath().isEmpty() && !session.textDirty) { + session.textPath = fileState.openedPath(); + session.textContent = fileState.openedContents(); + } + g.drawString(font, Component.literal("ANTTEXT // " + session.textPath + (session.textDirty ? " *" : "")), x, y, GREEN, false); + g.drawString(font, Component.literal("NEW OPEN WRITE SAVE"), x, y + 18, PALE_GREEN, false); + g.fill(x + 4, y + 36, x + w - 4, y + h - 4, BLACK); + if (session.textListing) { + g.drawString(font, Component.literal("SELECT FILE"), x + 10, y + 46, GREEN, false); + int line = y + 62; + for (String file : fileState.files()) { + String[] fields = file.split("\\t", 3); + if (fields.length < 2 || line > y + h - 28) continue; + g.drawString(font, Component.literal(fields[1]), x + 10, line, PALE_GREEN, false); + line += 14; + } + if (fileState.files().isEmpty()) g.drawString(font, Component.literal("NO TEXT FILES"), x + 10, y + 62, PALE_GREEN, false); + } else { + wrap(g, session.textContent.isEmpty() ? "TYPE HERE..." : session.textContent, x + 10, y + 46, w - 28, GREEN); + } + g.drawString(font, Component.literal("[ CTRL+S ] SAVE [ ESC ] CLOSE"), x, y + h - 50, PALE_GREEN, false); + } + + private void renderAntmail(GuiGraphics g, int x, int y, int h) { + var result = AntmailClientState.get(position); + g.drawString(font, Component.literal("ANTMAIL // COMPUTER ADDRESS"), x, y, GREEN, false); + boolean unconfigured = result == null || result.address().isBlank(); + if (unconfigured) { + g.drawString(font, Component.literal("NO ADDRESS CONFIGURED"), x, y + 20, PALE_GREEN, false); + g.drawString(font, Component.literal("USERNAME // 3-16 CHARACTERS"), x, y + 40, GREEN, false); + g.fill(x, y + 56, x + 206, y + 79, BLACK); + box(g, x, y + 56, x + 206, y + 79, GREEN); + g.drawString(font, Component.literal(session.antmailUsername + "@ANTMAIL.COM"), x + 6, y + 63, GREEN, false); + g.drawString(font, Component.literal("[ ENTER ] REGISTER ADDRESS"), x, y + 88, GREEN, false); + } else { + g.drawString(font, Component.literal(result.address()), x, y + 20, PALE_GREEN, false); + g.drawString(font, Component.literal("[ INBOX ] [ SENT ] [ COMPOSE ]"), x, y + 40, GREEN, false); + if (session.antmailMode.equals("compose")) { + g.drawString(font, Component.literal("TO"), x, y + 62, GREEN, false); + g.drawString(font, Component.literal(session.antmailRecipient), x + 28, y + 62, PALE_GREEN, false); + g.drawString(font, Component.literal("SUBJECT"), x, y + 78, GREEN, false); + g.drawString(font, Component.literal(session.antmailSubject), x + 52, y + 78, PALE_GREEN, false); + g.drawString(font, Component.literal("BODY"), x, y + 94, GREEN, false); + wrap(g, session.antmailBody.isEmpty() ? "TYPE MESSAGE..." : session.antmailBody, x, y + 110, 208, PALE_GREEN); + g.drawString(font, Component.literal("[ " + (session.antmailAttachText ? "X" : " ") + " ] TEXT FILE [ " + (session.antmailAttachPaint ? "X" : " ") + " ] PAINTING"), x, y + 142, PALE_GREEN, false); + g.drawString(font, Component.literal("[ ENTER ] SEND MESSAGE"), x, y + h - 30, GREEN, false); + } else if (session.antmailMode.equals("message")) { + AntmailMessage message = selectedAntmailMessage(result); + if (message != null) { + g.drawString(font, Component.literal("< BACK // INBOX"), x, y + 40, GREEN, false); + g.drawString(font, Component.literal(message.sender().fullAddress()), x, y + 62, PALE_GREEN, false); + g.drawString(font, Component.literal(message.subject()), x, y + 78, GREEN, false); + wrap(g, message.body(), x, y + 98, 208, PALE_GREEN); + } + } else { + g.drawString(font, Component.literal("INBOX // " + mailboxMessages(result, false).size()), x, y + 62, GREEN, false); + int line = y + 80; + for (AntmailMessage message : mailboxMessages(result, false)) { + if (line > y + h - 38) break; + g.drawString(font, Component.literal((message.read() ? " " : "* ") + trimToWidth(message.subject(), 28)), x, line, message.read() ? PALE_GREEN : GREEN, false); + line += 14; } } - line += 5; } - if (entry.type().equals("item") && !entry.itemId().isEmpty()) { - try { - ItemStack stack = new ItemStack(net.minecraft.core.registries.BuiltInRegistries.ITEM.get(ResourceLocation.parse(entry.itemId()))); - graphics.renderItem(stack, x + 130, y + 122); - } catch (Exception ignored) { - } + if (!session.antmailStatus.isEmpty()) g.drawString(font, Component.literal(session.antmailStatus), x, y + h - 30, PALE_GREEN, false); + g.drawString(font, Component.literal(result == null ? "WAITING FOR SERVER" : result.status() == 0 ? "DELIVERY READY" : "SERVER RESPONSE: " + result.detail()), x, y + h - 16, GREEN, false); + } + + private AntmailMailbox mailbox(AntmailResultPayload result) { + if (result == null || result.data().isBlank()) return null; + try { + return AntmailMailbox.fromTag(AntmailWire.decodeTag(result.data())); + } catch (RuntimeException ignored) { + return null; } } + private List mailboxMessages(AntmailResultPayload result, boolean sent) { + AntmailMailbox mailbox = mailbox(result); + if (mailbox == null) return List.of(); + return sent ? mailbox.sent() : mailbox.inbox(); + } + + private AntmailMessage selectedAntmailMessage(AntmailResultPayload result) { + List messages = mailboxMessages(result, session.antmailSent); + return session.antmailMessageIndex >= 0 && session.antmailMessageIndex < messages.size() ? messages.get(session.antmailMessageIndex) : null; + } + + private void renderGames(GuiGraphics g, int x, int y) { + g.drawString(font, Component.literal("INSTALLED GAMES"), x, y, GREEN, false); + if (activeWindow != null && activeWindow.gameOpen) { antFarm.render(g, font, x, y + 16, 214, 155); return; } + g.drawString(font, Component.literal(antFarm.isGameInstalled() ? "ANT FARM [ ENTER ]" : "ANT FARM [NOT INSTALLED]"), x, y + 22, PALE_GREEN, false); + g.drawString(font, Component.literal("GLIMMER MATCH"), x, y + 38, PALE_GREEN, false); + g.drawString(font, Component.literal("HFCS FACTORY"), x, y + 54, PALE_GREEN, false); + } + + private void renderTrash(GuiGraphics g, int x, int y) { + g.drawString(font, Component.literal("DROP A DISK HERE TO EJECT"), x, y, GREEN, false); + g.drawString(font, Component.literal("EJECTED FILES RETURN TO PLAYER"), x, y + 22, PALE_GREEN, false); + } + + private int wrap(GuiGraphics g, String text, int x, int y, int width, int color) { return wrap(g, Component.literal(text), x, y, width, color); } + + private int wrap(GuiGraphics g, Component text, int x, int y, int width, int color) { + for (var line : font.split(text, width)) { g.drawString(font, line, x, y, color, false); y += 11; } + return y; + } + + private void box(GuiGraphics g, int x1, int y1, int x2, int y2, int color) { + g.fill(x1, y1, x2, y1 + 2, color); + g.fill(x1, y2 - 2, x2, y2, color); + g.fill(x1, y1, x1 + 2, y2, color); + g.fill(x2 - 2, y1, x2, y2, color); + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - int left = (this.width - WIDTH) / 2; - int top = (this.height - HEIGHT) / 2; - for (int index = 0; index < visibleEntries.size() && index < 6; index++) { - if (isMouseOver(left + 12, top + 66 + index * 20, 98, 16, mouseX, mouseY)) { - selectedIndex = index; + float scale = uiScale(); + mouseX = (mouseX - width / 2.0F) / scale; + mouseY = (mouseY - height / 2.0F) / scale; + int l = -WIDTH / 2; + int t = -HEIGHT / 2; + if (!loggedIn) { + ComputerBlockEntity computer = computer(); + boolean setup = (accessResult != null && !accessResult.hasPassword()) || (computer != null && !computer.hasPassword()); + int formX = setup ? l + 110 : l + 242; + if (inside(formX, t + 181, setup ? 150 : 100, 24, mouseX, mouseY)) tryLogin(); + return true; + } + session.lastUse = System.currentTimeMillis(); + for (int i = session.windows.size() - 1; i >= 0; i--) { + Window window = session.windows.get(i); + if (window.minimized) continue; + int x = l + window.x; + int y = t + window.y; + int w = window.maximized ? WIDTH - 28 : window.width; + int h = window.maximized ? HEIGHT - 48 : window.height; + if (inside(x, y + 20, w, h - 20, mouseX, mouseY)) { + activeWindow = window; + if (window.type.equals("ARCHIVE")) { + List entries = ComputerGuideData.entriesFor(computer() == null ? List.of() : computer().diskIds()); + int archiveX = x + 8; + int archiveY = y + 28; + if (session.archiveEntryId != null) { + if (inside(archiveX, archiveY, w - 16, 20, mouseX, mouseY)) session.archiveEntryId = null; + } else { + int visible = Math.max(1, (h - 34) / 25); + int index = ((int) mouseY - (archiveY + 16)) / 25; + if (index >= 0 && index < entries.size() && index < visible && inside(archiveX, archiveY + 16 + index * 25, w - 16, 23, mouseX, mouseY)) session.archiveEntryId = entries.get(index).id(); + } + return true; + } + if (window.type.equals("FILES")) { + var files = ComputerFileSystemClientState.get(position).files(); + if (!session.fileExplorerDirectory.equals("/") && mouseY < y + 36 && mouseX > x + w - 48) { + session.fileExplorerDirectory = parentDirectory(session.fileExplorerDirectory); + return true; + } + int row = 0; + for (String file : files) { + String[] fields = file.split("\\t", 3); + if (fields.length < 3 || !isDirectChild(fields[1], session.fileExplorerDirectory)) continue; + if (row++ != ((int) mouseY - (y + 62)) / 14) continue; + if (fields[0].equals("DIRECTORY")) session.fileExplorerDirectory = fields[1]; + else if (fields[0].equals("TEXT")) { + ComputerNetworking.openFile(position, fields[1]); + open(fields[1].endsWith(".antpaint") ? "PAINT" : "TEXT"); + } + break; + } + return true; + } + if (window.type.equals("PAINT")) { + int contentX = x + 8; + int contentY = y + 48; + if (inside(contentX, contentY, w - 16, h - 54, mouseX, mouseY)) paintAt(mouseX, mouseY, contentX, contentY - 18, w - 16, h - 54, button == 1); + else if (mouseY < y + 66) { + if (mouseX > contentX + 190) savePaint(); + else paintTool((int) mouseX - contentX); + } + return true; + } + if (window.type.equals("TEXT")) { + if (mouseY < y + 66) { + int action = ((int) mouseX - (x + 8)) / 42; + if (action == 0) newText(); else if (action == 1) { session.textListing = true; ComputerNetworking.listFiles(position); } else if (action == 2) writeText(); else if (action == 3) saveText(); + } else if (session.textListing) { + var files = ComputerFileSystemClientState.get(position).files(); + int index = ((int) mouseY - (y + 62)) / 14; + if (index >= 0 && index < files.size()) { + String[] fields = files.get(index).split("\\t", 3); + if (fields.length >= 2) { + session.textListing = false; + ComputerNetworking.openFile(position, fields[1]); + } + } + } else session.textFocused = true; + return true; + } + if (window.type.equals("ANTMAIL")) { + var result = AntmailClientState.get(position); + if (result == null || result.address().isBlank()) { + if (inside(x + 8, y + 84, 214, 25, mouseX, mouseY)) { + session.antmailFocused = true; + return true; + } + if (inside(x + 8, y + 112, 214, 24, mouseX, mouseY)) { + setupAntmail(); + return true; + } + } else if (mouseY < y + 72) { + if (mouseX < x + 70) { session.antmailMode = "inbox"; session.antmailSent = false; session.antmailMessageIndex = -1; } + else if (mouseX < x + 125) { session.antmailMode = "sent"; session.antmailSent = true; session.antmailMessageIndex = -1; } + else { session.antmailMode = "compose"; session.antmailFocused = true; session.antmailField = 1; } + } else if (session.antmailMode.equals("inbox") || session.antmailMode.equals("sent")) { + int index = ((int) mouseY - (y + 108)) / 14; + List messages = mailboxMessages(result, session.antmailSent); + if (index >= 0 && index < messages.size()) { + session.antmailMessageIndex = index; + session.antmailMode = "message"; + AntmailNetworking.markRead(position, messages.get(index).id()); + } + } else if (session.antmailMode.equals("compose")) { + if (mouseY >= y + 160 && mouseY < y + 184) { + session.antmailAttachText = mouseX < x + 112; + session.antmailAttachPaint = mouseX >= x + 112; + return true; + } + if (mouseY < y + 94) { + session.antmailField = mouseY < y + 78 ? 1 : 2; + session.antmailFocused = true; + } else if (mouseY < y + 150) { + session.antmailField = 3; + session.antmailFocused = true; + } + } + return true; + } + if (window.type.equals("GAMES") && mouseY > y + 35 && !window.gameOpen && antFarm.isGameInstalled()) { window.gameOpen = true; activeWindow = window; return true; } + if (window.type.equals("TERMINAL")) { session.terminalFocused = true; return true; } + } + if (window.type.equals("SETTINGS") && inside(x + 8, y + 105, 205, 51, mouseX, mouseY)) { + List disks = physicalDisks(); + int index = ((int) mouseY - (y + 105)) / 17; + if (index >= 0 && index < disks.size() && index < 3) { + selectedDisk = disks.get(index); + return true; + } + } + if (window.type.equals("SETTINGS") && inside(x + 8, y + 70, 205, 25, mouseX, mouseY)) { + if (session.wallpapers.size() > 1) { + int current = session.wallpapers.indexOf(session.wallpaperId); + String next = session.wallpapers.get((current + 1 + session.wallpapers.size()) % session.wallpapers.size()); + session.wallpaperId = next; + ComputerNetworking.selectWallpaper(position, ResourceLocation.parse(next)); + } + return true; + } + if (window.type.equals("SETTINGS") && inside(x + 8, y + 155, 205, 25, mouseX, mouseY)) { + ejectSelected(); + return true; + } + if (inside(x, y + 20, w, h - 20, mouseX, mouseY)) return true; + if (inside(x, y, w, 20, mouseX, mouseY)) { + if (inside(x + w - 18, y, 18, 20, mouseX, mouseY)) session.windows.remove(i); + else if (inside(x + w - 48, y, 16, 20, mouseX, mouseY)) window.maximized = !window.maximized; + else if (inside(x + w - 63, y, 16, 20, mouseX, mouseY)) window.minimized = true; + else { dragging = window; dragX = (int) mouseX - x; dragY = (int) mouseY - y; session.windows.remove(i); session.windows.add(window); } return true; } } - return super.mouseClicked(mouseX, mouseY, button); - } - - private static boolean isMouseOver(int x, int y, int width, int height, double mouseX, double mouseY) { - return mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height; + for (int i = 0; i < ICONS.length; i++) { + int x = l + 24 + i % 4 * 94; + int y = t + 48 + i / 4 * 76; + if (inside(x - 6, y - 6, 76, 57, mouseX, mouseY)) { open(ICONS[i]); return true; } + } + List disks = physicalDisks(); + for (int i = 0; i < disks.size() && i < 3; i++) { + int x = l + 24 + i % 4 * 94; + int y = t + 200 + i / 4 * 54; + if (inside(x - 6, y - 6, 76, 48, mouseX, mouseY)) { + draggedDisk = disks.get(i).toString(); + selectedDisk = disks.get(i); + return true; + } + } + return true; } @Override - public boolean isPauseScreen() { - return false; + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + float scale = uiScale(); + mouseX = (mouseX - width / 2.0F) / scale; + mouseY = (mouseY - height / 2.0F) / scale; + if (dragging != null) { + int l = -WIDTH / 2; + int t = -HEIGHT / 2; + dragging.x = Math.max(12, Math.min(WIDTH - dragging.renderWidth - 12, (int) mouseX - l - this.dragX)); + dragging.y = Math.max(34, Math.min(HEIGHT - dragging.renderHeight - 12, (int) mouseY - t - this.dragY)); + } + if (activeWindow != null && activeWindow.type.equals("PAINT") && button != 0) { + int l = -WIDTH / 2; + int t = -HEIGHT / 2; + int x = l + activeWindow.x + 8; + int y = t + activeWindow.y + 48; + paintAt(mouseX, mouseY, x, y - 18, activeWindow.renderWidth - 16, activeWindow.renderHeight - 54, button == 1); + } + return true; + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + float scale = uiScale(); + mouseX = (mouseX - width / 2.0F) / scale; + mouseY = (mouseY - height / 2.0F) / scale; + if (draggedDisk != null) { + int l = -WIDTH / 2; + int t = -HEIGHT / 2; + int trashX = l + 24 + (6 % 4) * 94; + int trashY = t + 48 + (6 / 4) * 76; + if (inside(trashX - 6, trashY - 6, 76, 57, mouseX, mouseY)) ejectSelected(); + draggedDisk = null; + } + dragging = null; + return true; + } + + @Override + public boolean charTyped(char codePoint, int modifiers) { + if (!loggedIn && codePoint >= 32) { + if (confirmingPassword) { + if (confirmation.length() < 32) confirmation += Character.toUpperCase(codePoint); + } else if (password.length() < 32) { + password += Character.toUpperCase(codePoint); + } + } + if (loggedIn && activeWindow != null) { + if (activeWindow.type.equals("TEXT") && session.textFocused && codePoint >= 32) { session.textContent += codePoint; session.textDirty = true; return true; } + if (activeWindow.type.equals("TERMINAL") && session.terminalFocused && codePoint >= 32) { session.terminalInput += codePoint; return true; } + if (activeWindow.type.equals("ANTMAIL") && session.antmailFocused && codePoint >= 32) { + if (session.antmailMode.equals("compose")) { + if (session.antmailField == 1 && session.antmailRecipient.length() < 64) session.antmailRecipient += codePoint; + else if (session.antmailField == 2 && session.antmailSubject.length() < 64) session.antmailSubject += codePoint; + else if (session.antmailField == 3 && session.antmailBody.length() < 16384) session.antmailBody += codePoint; + } else if (Character.isLetterOrDigit(codePoint) || codePoint == '_') session.antmailUsername += Character.toLowerCase(codePoint); + return true; + } + } + return true; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (!loggedIn) { + if (keyCode == GLFW.GLFW_KEY_ESCAPE) { onClose(); return true; } + if (keyCode == 259) { + if (confirmingPassword && !confirmation.isEmpty()) confirmation = confirmation.substring(0, confirmation.length() - 1); + else if (!password.isEmpty()) password = password.substring(0, password.length() - 1); + } + else if (keyCode == 257 || keyCode == 335) tryLogin(); + return true; + } + if (activeWindow != null && activeWindow.type.equals("GAMES") && activeWindow.gameOpen) { + if (keyCode == GLFW.GLFW_KEY_ESCAPE) { activeWindow.gameOpen = false; return true; } + if (antFarm.keyPressed(keyCode)) return true; + } + if (activeWindow != null && activeWindow.type.equals("TERMINAL") && session.terminalFocused) { + if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { if (!session.terminalInput.isEmpty()) session.terminalInput = session.terminalInput.substring(0, session.terminalInput.length() - 1); return true; } + if (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER) { executeTerminal(); return true; } + if (keyCode == GLFW.GLFW_KEY_ESCAPE) { session.terminalFocused = false; return true; } + } + + if (activeWindow != null && activeWindow.type.equals("ANTMAIL") && session.antmailFocused) { + if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { + if (session.antmailMode.equals("compose")) { + if (session.antmailField == 1 && !session.antmailRecipient.isEmpty()) session.antmailRecipient = session.antmailRecipient.substring(0, session.antmailRecipient.length() - 1); + else if (session.antmailField == 2 && !session.antmailSubject.isEmpty()) session.antmailSubject = session.antmailSubject.substring(0, session.antmailSubject.length() - 1); + else if (session.antmailField == 3 && !session.antmailBody.isEmpty()) session.antmailBody = session.antmailBody.substring(0, session.antmailBody.length() - 1); + } else if (!session.antmailUsername.isEmpty()) session.antmailUsername = session.antmailUsername.substring(0, session.antmailUsername.length() - 1); + return true; + } + if (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER) { + if (session.antmailMode.equals("compose")) sendAntmail(); else setupAntmail(); + return true; + } + if (keyCode == GLFW.GLFW_KEY_ESCAPE) { session.antmailFocused = false; return true; } + } + if (activeWindow != null && activeWindow.type.equals("TEXT") && session.textFocused) { + if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { if (!session.textContent.isEmpty()) { session.textContent = session.textContent.substring(0, session.textContent.length() - 1); session.textDirty = true; } return true; } + if (keyCode == GLFW.GLFW_KEY_ENTER) { session.textContent += "\n"; session.textDirty = true; return true; } + if (keyCode == GLFW.GLFW_KEY_S && hasControl(modifiers)) { saveText(); return true; } + if (keyCode == GLFW.GLFW_KEY_ESCAPE) { session.textFocused = false; return true; } + } + if (activeWindow != null && activeWindow.type.equals("ARCHIVE") && session.archiveEntryId != null && keyCode == GLFW.GLFW_KEY_ESCAPE) { + session.archiveEntryId = null; + return true; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + + private void tryLogin() { + if (password.isBlank()) return; + if (accessResult != null && !accessResult.hasPassword()) { + if (!confirmingPassword) { + confirmingPassword = true; + confirmation = ""; + loginMessage = "RETYPE PASSWORD // CONFIRMATION REQUIRED"; + loginMessageTicks = 100; + return; + } + if (!password.equals(confirmation)) { + password = ""; + confirmation = ""; + confirmingPassword = false; + loginMessage = "SETUP ERROR // PASSWORDS DO NOT MATCH"; + loginMessageTicks = 100; + return; + } + ComputerNetworking.setup(position, password); + loginMessage = "INITIALIZING ACCESS // WAITING"; + } else { + ComputerNetworking.login(position, password); + loginMessage = "AUTHENTICATING // WAITING"; + } + loginMessageTicks = 40; + password = ""; + confirmation = ""; + confirmingPassword = false; + } + + private void executeTerminal() { + String input = session.terminalInput.trim(); + if (input.isEmpty()) return; + session.terminalOutput.add(session.terminalDirectory + "> " + input); + TerminalCommandParser.ParseResult parsed = TerminalCommandParser.parse(input); + if (!parsed.isSuccess()) session.terminalOutput.add(parsed.error()); + else { + String command = parsed.command().name(); + List args = parsed.command().arguments(); + if (command.equals("pwd")) session.terminalOutput.add(session.terminalDirectory); + else if (command.equals("clear")) session.terminalOutput.clear(); + else if (command.equals("ls")) ComputerNetworking.listFiles(position); + else if (command.equals("open") && args.size() == 1) ComputerNetworking.openFile(position, args.get(0)); + else if (command.equals("touch") && args.size() == 1) ComputerNetworking.createFile(position, args.get(0), ""); + else if (command.equals("write") && args.size() >= 1) ComputerNetworking.saveFile(position, args.get(0), args.size() > 1 ? args.get(1) : ""); + else if (command.equals("cd") && args.size() == 1) { + String path = args.get(0).startsWith("/") ? args.get(0) : session.terminalDirectory + "/" + args.get(0); + session.terminalDirectory = ComputerFileSystem.normalize(path); + } + else if (command.equals("help")) session.terminalOutput.add("HELP CLEAR PWD LS CD MKDIR TOUCH CAT WRITE RM RMDIR MV OPEN"); + else session.terminalOutput.add("COMMAND NOT RECOGNIZED"); + } + while (session.terminalOutput.size() > 40) session.terminalOutput.remove(0); + session.terminalInput = ""; + } + + private void setupAntmail() { + if (!AntmailAddress.isValidUsername(session.antmailUsername)) { + session.antmailStatus = "SETUP ERROR // USE 3-16 LOWERCASE LETTERS, NUMBERS, OR _"; + session.antmailFocused = true; + return; + } + AntmailNetworking.setup(position, session.antmailUsername); + session.antmailStatus = "REGISTERING ADDRESS // WAITING"; + session.antmailFocused = false; + } + + private void sendAntmail() { + if (!AntmailAddress.isValidAddress(session.antmailRecipient)) { + session.antmailStatus = "SEND ERROR // INVALID RECIPIENT"; + return; + } + if (session.antmailSubject.isBlank() || session.antmailBody.isBlank()) { + session.antmailStatus = "SEND ERROR // SUBJECT AND BODY REQUIRED"; + return; + } + List attachments = new ArrayList<>(); + if (session.antmailAttachText && !session.textContent.isEmpty()) attachments.add(new AntmailAttachment.TextFile(session.textPath.substring(session.textPath.lastIndexOf('/') + 1), session.textContent)); + if (session.antmailAttachPaint) { + byte[] pixels = new byte[AntPaintCanvas.WIDTH * AntPaintCanvas.HEIGHT]; + for (int py = 0; py < AntPaintCanvas.HEIGHT; py++) for (int px = 0; px < AntPaintCanvas.WIDTH; px++) pixels[py * AntPaintCanvas.WIDTH + px] = (byte) (session.paintCanvas.get(px, py) ? 1 : 0); + attachments.add(new AntmailAttachment.PaintImage(session.paintName, AntPaintCanvas.WIDTH, AntPaintCanvas.HEIGHT, pixels)); + } + AntmailNetworking.send(position, session.antmailRecipient, session.antmailSubject, session.antmailBody, attachments); + session.antmailStatus = "TRANSMITTING MESSAGE // WAITING"; + session.antmailMode = "inbox"; + session.antmailFocused = false; + session.antmailRecipient = ""; + session.antmailSubject = ""; + session.antmailBody = ""; + session.antmailAttachText = false; + session.antmailAttachPaint = false; + } + + private void newText() { + session.textPath = "/documents/untitled.txt"; + session.textContent = ""; + session.textDirty = true; + session.textListing = false; + session.textFocused = true; + } + + private void writeText() { + ComputerNetworking.createFile(position, session.textPath, session.textContent); + session.textDirty = false; + } + + private void saveText() { + ComputerNetworking.saveFile(position, session.textPath, session.textContent); + session.textDirty = false; + } + + private void savePaint() { + String path = "/pictures/" + session.paintName; + if (!path.endsWith(".antpaint")) path += ".antpaint"; + session.paintName = path.substring(path.lastIndexOf('/') + 1); + AntPaintFile file = new AntPaintFile(UUID.randomUUID().toString(), session.paintName, session.paintCanvas.copy(), 0L, 0L); + String encoded = Base64.getEncoder().encodeToString(AntPaintFileCodec.encode(file)); + String savedPath = path; + boolean exists = ComputerFileSystemClientState.get(position).files().stream().anyMatch(entry -> entry.contains("\t" + savedPath + "\t")); + if (exists) ComputerNetworking.saveFile(position, savedPath, encoded); else ComputerNetworking.createFile(position, savedPath, encoded); + session.paintDirty = false; + } + + private void paintTool(int offset) { + session.paintTool = offset < 52 ? AntPaintTool.PENCIL : offset < 108 ? AntPaintTool.ERASER : AntPaintTool.FILL; + } + + private void paintAt(double mouseX, double mouseY, int x, int y, int w, int h, boolean draw) { + int size = Math.min(w / AntPaintCanvas.WIDTH, h / AntPaintCanvas.HEIGHT); + if (size <= 0) return; + int canvasX = x + (w - size * AntPaintCanvas.WIDTH) / 2; + int px = (int) ((mouseX - canvasX) / size); + int py = (int) ((mouseY - y) / size); + if (px < 0 || py < 0 || px >= AntPaintCanvas.WIDTH || py >= AntPaintCanvas.HEIGHT) return; + session.paintHistory.record(session.paintCanvas); + if (session.paintTool == AntPaintTool.PENCIL) session.paintCanvas.erase(px, py); + else if (session.paintTool == AntPaintTool.ERASER) session.paintCanvas.draw(px, py); + else session.paintCanvas.floodFill(px, py, session.paintTool == AntPaintTool.ERASER); + session.paintDirty = true; + } + + private boolean hasControl(int modifiers) { + return (modifiers & GLFW.GLFW_MOD_CONTROL) != 0; + } + + private ComputerBlockEntity computer() { + if (Minecraft.getInstance().level == null) return null; + return Minecraft.getInstance().level.getBlockEntity(position) instanceof ComputerBlockEntity computer ? computer : null; + } + + private List physicalDisks() { + ComputerBlockEntity computer = computer(); + if (computer == null) return List.of(); + return computer.diskIds().stream() + .filter(id -> !id.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "introduction"))) + .toList(); + } + + private void ejectSelected() { + if (selectedDisk == null) return; + ComputerNetworking.eject(position, selectedDisk); + loginMessage = "EJECTING DISK // WAITING"; + loginMessageTicks = 100; + selectedDisk = null; + } + + private void open(String type) { + for (Window window : session.windows) if (window.type.equals(type)) { window.minimized = false; session.windows.remove(window); session.windows.add(window); return; } + session.windows.add(new Window(type, TITLES.get(type), 112 + session.windows.size() * 12, 52 + session.windows.size() * 10)); + if (type.equals("ANTMAIL")) AntmailNetworking.requestState(position); + } + + private static boolean inside(int x, int y, int w, int h, double mx, double my) { return mx >= x && mx < x + w && my >= y && my < y + h; } + + @Override + public boolean isPauseScreen() { return false; } + + @Override + public void onClose() { + ComputerNetworking.close(position); + super.onClose(); + } + + private static final class Session { + private boolean authenticated; + private long lastUse; + private final List windows = new ArrayList<>(); + private final List terminalOutput = new ArrayList<>(List.of("ANTINTOSH TERMINAL [READY]", "TYPE HELP FOR COMMANDS")); + private String terminalInput = ""; + private String terminalDirectory = "/"; + private boolean terminalFocused; + private String textPath = "/documents/untitled.txt"; + private String textContent = ""; + private boolean textDirty; + private boolean textFocused; + private boolean textListing; + private ResourceLocation archiveEntryId; + private AntPaintCanvas paintCanvas = new AntPaintCanvas(); + private final AntPaintHistory paintHistory = new AntPaintHistory(); + private AntPaintTool paintTool = AntPaintTool.PENCIL; + private String paintName = "UNTITLED.ANTPAINT"; + private boolean paintDirty; + private String antmailUsername = ""; + private String antmailStatus = ""; + private boolean antmailFocused; + private String antmailMode = "inbox"; + private String antmailRecipient = ""; + private String antmailSubject = ""; + private String antmailBody = ""; + private int antmailField; + private boolean antmailSent; + private int antmailMessageIndex = -1; + private boolean antmailAttachText; + private boolean antmailAttachPaint; + private String fileExplorerDirectory = "/"; + private String wallpaperId = ComputerDesktopState.DEFAULT_WALLPAPER.toString(); + private List wallpapers = List.of(ComputerDesktopState.DEFAULT_WALLPAPER.toString()); + private boolean desktopRequested; + private int bootTicks = -1; + } + + private static final class Window { + private final String type; + private final String title; + private final int width = 230; + private final int height = 210; + private int x; + private int y; + private int renderWidth = width; + private int renderHeight = height; + private boolean minimized; + private boolean maximized; + private boolean gameOpen; + + private Window(String type, String title, int x, int y) { this.type = type; this.title = title; this.x = x; this.y = y; } } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerDesktopState.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerDesktopState.java new file mode 100644 index 00000000..4356263a --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerDesktopState.java @@ -0,0 +1,196 @@ +package com.craisinlord.antarchy.content.computer; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.resources.ResourceLocation; + +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +public final class ComputerDesktopState { + public static final ResourceLocation DEFAULT_WALLPAPER = ResourceLocation.fromNamespaceAndPath("antarchy", "grid_ant"); + public static final int MAX_UNLOCKED_WALLPAPERS = 64; + public static final int MAX_INSTALLED_PROGRAMS = 64; + public static final int MAX_ICON_POSITIONS = 64; + public static final int MAX_ID_LENGTH = 128; + public static final int MIN_ICON_COORDINATE = 0; + public static final int MAX_ICON_COORDINATE = 4096; + private static final String SELECTED_WALLPAPER_TAG = "SelectedWallpaper"; + private static final String UNLOCKED_WALLPAPERS_TAG = "UnlockedWallpapers"; + private static final String INSTALLED_PROGRAMS_TAG = "InstalledPrograms"; + private static final String ICON_POSITIONS_TAG = "IconPositions"; + private static final String ID_TAG = "Id"; + private static final String X_TAG = "X"; + private static final String Y_TAG = "Y"; + private ResourceLocation selectedWallpaper; + private final Set unlockedWallpaperIds = new LinkedHashSet<>(); + private final Set installedProgramIds = new LinkedHashSet<>(); + private final Map iconPositions = new LinkedHashMap<>(); + + public ResourceLocation selectedWallpaper() { + return selectedWallpaper; + } + + public Set unlockedWallpaperIds() { + return Collections.unmodifiableSet(new LinkedHashSet<>(unlockedWallpaperIds)); + } + + public Set installedProgramIds() { + return Collections.unmodifiableSet(new LinkedHashSet<>(installedProgramIds)); + } + + public Map iconPositions() { + return Collections.unmodifiableMap(new LinkedHashMap<>(iconPositions)); + } + + public boolean hasWallpaper(ResourceLocation id) { + return id != null && unlockedWallpaperIds.contains(id); + } + + public boolean hasProgram(ResourceLocation id) { + return id != null && installedProgramIds.contains(id); + } + + public IconPosition iconPosition(ResourceLocation id) { + return iconPositions.get(id); + } + + public boolean unlockWallpaper(ResourceLocation id) { + if (!validId(id) || unlockedWallpaperIds.contains(id)) { + return false; + } + if (unlockedWallpaperIds.size() >= MAX_UNLOCKED_WALLPAPERS) { + return false; + } + return unlockedWallpaperIds.add(id); + } + + public boolean installProgram(ResourceLocation id) { + if (!validId(id) || installedProgramIds.size() >= MAX_INSTALLED_PROGRAMS && !installedProgramIds.contains(id)) { + return false; + } + return installedProgramIds.add(id); + } + + public boolean uninstallProgram(ResourceLocation id) { + if (id == null || !installedProgramIds.remove(id)) { + return false; + } + iconPositions.remove(id); + return true; + } + + public boolean selectWallpaper(ResourceLocation id) { + if (id != null && !unlockedWallpaperIds.contains(id)) { + return false; + } + if (id == null ? selectedWallpaper == null : id.equals(selectedWallpaper)) { + return false; + } + selectedWallpaper = id; + return true; + } + + public boolean setIconPosition(ResourceLocation id, int x, int y) { + if (!validId(id) || x < MIN_ICON_COORDINATE || x > MAX_ICON_COORDINATE || y < MIN_ICON_COORDINATE || y > MAX_ICON_COORDINATE) { + return false; + } + IconPosition position = new IconPosition(x, y); + if (position.equals(iconPositions.get(id))) { + return false; + } + if (!iconPositions.containsKey(id) && iconPositions.size() >= MAX_ICON_POSITIONS) { + return false; + } + iconPositions.put(id, position); + return true; + } + + public boolean removeIconPosition(ResourceLocation id) { + return id != null && iconPositions.remove(id) != null; + } + + public void clear() { + unlockedWallpaperIds.clear(); + installedProgramIds.clear(); + iconPositions.clear(); + unlockedWallpaperIds.add(DEFAULT_WALLPAPER); + selectedWallpaper = DEFAULT_WALLPAPER; + } + + public CompoundTag save() { + CompoundTag tag = new CompoundTag(); + if (selectedWallpaper != null) { + tag.putString(SELECTED_WALLPAPER_TAG, selectedWallpaper.toString()); + } + tag.put(UNLOCKED_WALLPAPERS_TAG, saveIds(unlockedWallpaperIds)); + tag.put(INSTALLED_PROGRAMS_TAG, saveIds(installedProgramIds)); + ListTag positions = new ListTag(); + for (Map.Entry entry : iconPositions.entrySet()) { + CompoundTag position = new CompoundTag(); + position.putString(ID_TAG, entry.getKey().toString()); + position.putInt(X_TAG, entry.getValue().x()); + position.putInt(Y_TAG, entry.getValue().y()); + positions.add(position); + } + tag.put(ICON_POSITIONS_TAG, positions); + return tag; + } + + public void load(CompoundTag tag) { + clear(); + selectedWallpaper = parseId(tag.getString(SELECTED_WALLPAPER_TAG)); + loadIds(tag.getList(UNLOCKED_WALLPAPERS_TAG, 8), unlockedWallpaperIds, MAX_UNLOCKED_WALLPAPERS); + loadIds(tag.getList(INSTALLED_PROGRAMS_TAG, 8), installedProgramIds, MAX_INSTALLED_PROGRAMS); + ListTag positions = tag.getList(ICON_POSITIONS_TAG, 10); + for (int index = 0; index < positions.size() && iconPositions.size() < MAX_ICON_POSITIONS; index++) { + CompoundTag stored = positions.getCompound(index); + ResourceLocation id = parseId(stored.getString(ID_TAG)); + int x = stored.getInt(X_TAG); + int y = stored.getInt(Y_TAG); + if (id != null && x >= MIN_ICON_COORDINATE && x <= MAX_ICON_COORDINATE && y >= MIN_ICON_COORDINATE && y <= MAX_ICON_COORDINATE) { + iconPositions.putIfAbsent(id, new IconPosition(x, y)); + } + } + } + + private static ListTag saveIds(Collection ids) { + ListTag list = new ListTag(); + for (ResourceLocation id : ids) { + list.add(StringTag.valueOf(id.toString())); + } + return list; + } + + private static void loadIds(ListTag list, Set destination, int limit) { + for (int index = 0; index < list.size() && destination.size() < limit; index++) { + ResourceLocation id = parseId(list.getString(index)); + if (id != null) { + destination.add(id); + } + } + } + + private static ResourceLocation parseId(String value) { + if (value == null || value.isBlank() || value.length() > MAX_ID_LENGTH) { + return null; + } + try { + return ResourceLocation.parse(value); + } catch (Exception ignored) { + return null; + } + } + + private static boolean validId(ResourceLocation id) { + return id != null && id.toString().length() <= MAX_ID_LENGTH; + } + + public record IconPosition(int x, int y) { + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerFileSystem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerFileSystem.java new file mode 100644 index 00000000..28683555 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/ComputerFileSystem.java @@ -0,0 +1,174 @@ +package com.craisinlord.antarchy.content.computer; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public final class ComputerFileSystem { + public static final int MAX_FILE_SIZE = 16 * 1024; + public static final int MAX_TOTAL_SIZE = 64 * 1024; + public static final int MAX_NODES = 128; + public static final int MAX_PATH_LENGTH = 64; + public static final String ROOT = "/"; + public static final String DOCUMENTS = "/documents"; + public static final String PICTURES = "/pictures"; + public static final String SYSTEM = "/system"; + private static final String FILES_TAG = "Files"; + private static final String PATH_TAG = "Path"; + private static final String TYPE_TAG = "Type"; + private static final String CONTENTS_TAG = "Contents"; + private final Map nodes = new LinkedHashMap<>(); + private int totalBytes; + + public ComputerFileSystem() { + reset(); + } + + public void reset() { + nodes.clear(); + nodes.put(ROOT, ComputerFile.directory(ROOT)); + nodes.put(DOCUMENTS, ComputerFile.directory(DOCUMENTS)); + nodes.put(PICTURES, ComputerFile.directory(PICTURES)); + nodes.put(SYSTEM, ComputerFile.directory(SYSTEM)); + totalBytes = 0; + } + + public ComputerFile get(String path) { + return nodes.get(normalize(path)); + } + + public List list() { + return List.copyOf(nodes.values()); + } + + public List listTextFiles() { + return nodes.values().stream().filter(file -> file.type() == ComputerFile.Type.TEXT).toList(); + } + + public Result createTextFile(String path, String contents) { + String normalized = normalize(path); + Result validation = validateTextPath(normalized, contents); + if (!validation.successful()) return validation; + if (nodes.containsKey(normalized)) return Result.failure("already_exists"); + if (nodes.size() >= MAX_NODES) return Result.failure("node_limit"); + int size = contents.length(); + if (totalBytes + size > MAX_TOTAL_SIZE) return Result.failure("storage_limit"); + nodes.put(normalized, ComputerFile.text(normalized, contents)); + totalBytes += size; + return Result.ok(); + } + + public Result writeTextFile(String path, String contents) { + String normalized = normalize(path); + Result validation = validateTextPath(normalized, contents); + if (!validation.successful()) return validation; + ComputerFile current = nodes.get(normalized); + if (current == null) return Result.failure("not_found"); + if (current.type() != ComputerFile.Type.TEXT) return Result.failure("not_text"); + int replacement = totalBytes - current.contents().length() + contents.length(); + if (replacement > MAX_TOTAL_SIZE) return Result.failure("storage_limit"); + nodes.put(normalized, ComputerFile.text(normalized, contents)); + totalBytes = replacement; + return Result.ok(); + } + + public Result createOrWriteTextFile(String path, String contents) { + return nodes.containsKey(normalize(path)) ? writeTextFile(path, contents) : createTextFile(path, contents); + } + + public Result delete(String path) { + String normalized = normalize(path); + if (isProtected(normalized)) return Result.failure("protected"); + ComputerFile file = nodes.get(normalized); + if (file == null) return Result.failure("not_found"); + if (file.type() == ComputerFile.Type.DIRECTORY && nodes.keySet().stream().anyMatch(key -> !key.equals(normalized) && key.startsWith(normalized + "/"))) { + return Result.failure("not_empty"); + } + nodes.remove(normalized); + totalBytes -= file.contents().length(); + return Result.ok(); + } + + public static String normalize(String path) { + if (path == null || path.isBlank()) return ""; + String value = path.trim().replace('\\', '/'); + if (!value.startsWith("/")) value = "/" + value; + while (value.contains("//")) value = value.replace("//", "/"); + if (value.length() > 1 && value.endsWith("/")) value = value.substring(0, value.length() - 1); + return value; + } + + public static boolean isProtected(String path) { + String normalized = normalize(path); + return normalized.equals(SYSTEM) || normalized.startsWith(SYSTEM + "/"); + } + + public void save(CompoundTag tag, HolderLookup.Provider registries) { + ListTag files = new ListTag(); + for (ComputerFile file : nodes.values()) { + if (ROOT.equals(file.path())) continue; + CompoundTag stored = new CompoundTag(); + stored.putString(PATH_TAG, file.path()); + stored.putString(TYPE_TAG, file.type().name()); + if (file.type() == ComputerFile.Type.TEXT) stored.putString(CONTENTS_TAG, file.contents()); + files.add(stored); + } + tag.put(FILES_TAG, files); + } + + public void load(CompoundTag tag, HolderLookup.Provider registries) { + reset(); + ListTag files = tag.getList(FILES_TAG, 10); + for (int index = 0; index < files.size(); index++) { + CompoundTag stored = files.getCompound(index); + String path = normalize(stored.getString(PATH_TAG)); + if (path.isEmpty() || nodes.containsKey(path) || path.length() > MAX_PATH_LENGTH || isProtected(path)) continue; + String type = stored.getString(TYPE_TAG); + if ("DIRECTORY".equals(type)) { + if (nodes.size() < MAX_NODES) nodes.put(path, ComputerFile.directory(path)); + } else if ("TEXT".equals(type)) { + String contents = stored.getString(CONTENTS_TAG); + if (contents.length() <= MAX_FILE_SIZE && nodes.size() < MAX_NODES && totalBytes + contents.length() <= MAX_TOTAL_SIZE) { + nodes.put(path, ComputerFile.text(path, contents)); + totalBytes += contents.length(); + } + } + } + } + + private Result validateTextPath(String path, String contents) { + if (path.isEmpty() || path.length() > MAX_PATH_LENGTH || ROOT.equals(path) || isProtected(path)) return Result.failure("invalid_path"); + if (contents == null || contents.length() > MAX_FILE_SIZE) return Result.failure("file_limit"); + if (path.contains("..") || path.indexOf('\0') >= 0 || path.indexOf('\n') >= 0 || path.indexOf('\r') >= 0) return Result.failure("invalid_path"); + int slash = path.lastIndexOf('/'); + if (slash > 0 && !nodesDirectory(path.substring(0, slash))) return Result.failure("missing_directory"); + return Result.ok(); + } + + private boolean nodesDirectory(String path) { + ComputerFile parent = nodes.get(path); + return parent != null && parent.type() == ComputerFile.Type.DIRECTORY; + } + + public int totalBytes() { + return totalBytes; + } + + public record Result(boolean successful, String error) { + public static Result ok() { return new Result(true, ""); } + public static Result failure(String error) { return new Result(false, error); } + } + + public record ComputerFile(String path, Type type, String contents) { + public static ComputerFile directory(String path) { return new ComputerFile(path, Type.DIRECTORY, ""); } + public static ComputerFile text(String path, String contents) { return new ComputerFile(path, Type.TEXT, contents); } + public enum Type { DIRECTORY, TEXT, IMAGE } + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintCanvas.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintCanvas.java new file mode 100644 index 00000000..1e1ff637 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintCanvas.java @@ -0,0 +1,114 @@ +package com.craisinlord.antarchy.content.computer.paint; + +import java.util.ArrayDeque; +import java.util.Arrays; + +public final class AntPaintCanvas { + public static final int WIDTH = 32; + public static final int HEIGHT = 24; + public static final int PIXEL_COUNT = WIDTH * HEIGHT; + public static final int PACKED_LENGTH = (PIXEL_COUNT + 7) / 8; + + private final boolean[] pixels; + + public AntPaintCanvas() { + this.pixels = new boolean[PIXEL_COUNT]; + } + + private AntPaintCanvas(boolean[] pixels) { + this.pixels = pixels; + } + + public boolean get(int x, int y) { + return pixels[index(x, y)]; + } + + public void set(int x, int y, boolean value) { + pixels[index(x, y)] = value; + } + + public boolean draw(int x, int y) { + return setIfChanged(x, y, true); + } + + public boolean erase(int x, int y) { + return setIfChanged(x, y, false); + } + + public void clear() { + Arrays.fill(pixels, false); + } + + public int floodFill(int x, int y, boolean value) { + int start = index(x, y); + boolean original = pixels[start]; + if (original == value) { + return 0; + } + ArrayDeque queue = new ArrayDeque<>(); + boolean[] visited = new boolean[PIXEL_COUNT]; + queue.add(start); + int changed = 0; + while (!queue.isEmpty()) { + int current = queue.removeFirst(); + if (visited[current] || pixels[current] != original) { + continue; + } + visited[current] = true; + pixels[current] = value; + changed++; + int px = current % WIDTH; + int py = current / WIDTH; + if (px > 0) queue.add(current - 1); + if (px + 1 < WIDTH) queue.add(current + 1); + if (py > 0) queue.add(current - WIDTH); + if (py + 1 < HEIGHT) queue.add(current + WIDTH); + } + return changed; + } + + public byte[] pack() { + byte[] packed = new byte[PACKED_LENGTH]; + for (int i = 0; i < PIXEL_COUNT; i++) { + if (pixels[i]) { + packed[i / 8] |= (byte) (1 << (i % 8)); + } + } + return packed; + } + + public static AntPaintCanvas unpack(byte[] packed) { + if (packed == null || packed.length != PACKED_LENGTH) { + throw new IllegalArgumentException("Invalid AntPaint pixel data length"); + } + boolean[] pixels = new boolean[PIXEL_COUNT]; + for (int i = 0; i < PIXEL_COUNT; i++) { + pixels[i] = (packed[i / 8] & (1 << (i % 8))) != 0; + } + return new AntPaintCanvas(pixels); + } + + public AntPaintCanvas copy() { + return new AntPaintCanvas(Arrays.copyOf(pixels, pixels.length)); + } + + public boolean[] copyPixels() { + return Arrays.copyOf(pixels, pixels.length); + } + + private boolean setIfChanged(int x, int y, boolean value) { + int index = index(x, y); + if (pixels[index] == value) { + return false; + } + pixels[index] = value; + return true; + } + + private static int index(int x, int y) { + if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) { + throw new IndexOutOfBoundsException("AntPaint pixel outside canvas"); + } + return y * WIDTH + x; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFile.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFile.java new file mode 100644 index 00000000..3c528337 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFile.java @@ -0,0 +1,26 @@ +package com.craisinlord.antarchy.content.computer.paint; + +import java.util.Objects; + +public record AntPaintFile(String fileId, String filename, AntPaintCanvas canvas, long createdTime, long modifiedTime) { + public AntPaintFile { + Objects.requireNonNull(fileId, "fileId"); + filename = AntPaintFilename.normalize(filename); + Objects.requireNonNull(canvas, "canvas"); + if (fileId.isBlank()) { + throw new IllegalArgumentException("fileId cannot be blank"); + } + } + + public AntPaintFile copy() { + return new AntPaintFile(fileId, filename, canvas.copy(), createdTime, modifiedTime); + } + + public AntPaintFile withCanvas(AntPaintCanvas value, long modified) { + return new AntPaintFile(fileId, filename, value, createdTime, modified); + } + + public AntPaintFile withFilename(String value, long modified) { + return new AntPaintFile(fileId, value, canvas, createdTime, modified); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFileCodec.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFileCodec.java new file mode 100644 index 00000000..960c1acf --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFileCodec.java @@ -0,0 +1,86 @@ +package com.craisinlord.antarchy.content.computer.paint; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +public final class AntPaintFileCodec { + public static final int VERSION = 1; + public static final int MAX_ENCODED_BYTES = 1024; + private static final int MAGIC = 0x41505431; + + private AntPaintFileCodec() { + } + + public static byte[] encode(AntPaintFile file) { + try { + ByteArrayOutputStream output = new ByteArrayOutputStream(MAX_ENCODED_BYTES); + DataOutputStream data = new DataOutputStream(output); + data.writeInt(MAGIC); + data.writeByte(VERSION); + writeString(data, file.fileId()); + writeString(data, file.filename()); + data.writeLong(file.createdTime()); + data.writeLong(file.modifiedTime()); + data.writeByte(AntPaintCanvas.WIDTH); + data.writeByte(AntPaintCanvas.HEIGHT); + data.write(file.canvas().pack()); + data.flush(); + byte[] encoded = output.toByteArray(); + if (encoded.length > MAX_ENCODED_BYTES) { + throw new IllegalArgumentException("AntPaint file exceeds encoded size limit"); + } + return encoded; + } catch (IOException exception) { + throw new IllegalStateException("Unable to encode AntPaint file", exception); + } + } + + public static AntPaintFile decode(byte[] encoded) { + if (encoded == null || encoded.length > MAX_ENCODED_BYTES) { + throw new IllegalArgumentException("Invalid AntPaint file size"); + } + try { + DataInputStream data = new DataInputStream(new ByteArrayInputStream(encoded)); + if (data.readInt() != MAGIC || data.readUnsignedByte() != VERSION) { + throw new IllegalArgumentException("Unsupported AntPaint file format"); + } + String fileId = readString(data, 128); + String filename = readString(data, AntPaintFilename.MAX_LENGTH + AntPaintFilename.EXTENSION.length()); + long created = data.readLong(); + long modified = data.readLong(); + if (data.readUnsignedByte() != AntPaintCanvas.WIDTH || data.readUnsignedByte() != AntPaintCanvas.HEIGHT) { + throw new IllegalArgumentException("Unsupported AntPaint canvas size"); + } + byte[] pixels = data.readNBytes(AntPaintCanvas.PACKED_LENGTH); + if (pixels.length != AntPaintCanvas.PACKED_LENGTH || data.available() != 0) { + throw new IllegalArgumentException("Invalid AntPaint pixel payload"); + } + return new AntPaintFile(fileId, filename, AntPaintCanvas.unpack(pixels), created, modified); + } catch (IOException exception) { + throw new IllegalArgumentException("Invalid AntPaint file data", exception); + } + } + + private static void writeString(DataOutputStream data, String value) throws IOException { + byte[] bytes = value.getBytes(StandardCharsets.UTF_8); + if (bytes.length > 128) { + throw new IllegalArgumentException("AntPaint string exceeds size limit"); + } + data.writeShort(bytes.length); + data.write(bytes); + } + + private static String readString(DataInputStream data, int maxBytes) throws IOException { + int length = data.readUnsignedShort(); + if (length > maxBytes) { + throw new IllegalArgumentException("AntPaint string exceeds size limit"); + } + byte[] bytes = new byte[length]; + data.readFully(bytes); + return new String(bytes, StandardCharsets.UTF_8); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFilename.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFilename.java new file mode 100644 index 00000000..3beefbcb --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintFilename.java @@ -0,0 +1,38 @@ +package com.craisinlord.antarchy.content.computer.paint; + +import java.util.Locale; +import java.util.regex.Pattern; + +public final class AntPaintFilename { + public static final int MAX_LENGTH = 32; + public static final String EXTENSION = ".antpaint"; + private static final Pattern SAFE_NAME = Pattern.compile("[A-Za-z0-9 _.-]+"); + + private AntPaintFilename() { + } + + public static boolean isValid(String filename) { + if (filename == null || filename.isBlank() || filename.length() > MAX_LENGTH) { + return false; + } + if (filename.equals(".") || filename.equals("..") || filename.contains("..")) { + return false; + } + return SAFE_NAME.matcher(filename).matches(); + } + + public static String normalize(String filename) { + if (filename == null) { + throw new IllegalArgumentException("Filename cannot be null"); + } + String value = filename.trim(); + if (value.toLowerCase(Locale.ROOT).endsWith(EXTENSION)) { + value = value.substring(0, value.length() - EXTENSION.length()); + } + value = value.trim(); + if (!isValid(value)) { + throw new IllegalArgumentException("Invalid AntPaint filename"); + } + return value + EXTENSION; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintHistory.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintHistory.java new file mode 100644 index 00000000..9e7b0b58 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintHistory.java @@ -0,0 +1,47 @@ +package com.craisinlord.antarchy.content.computer.paint; + +import java.util.ArrayDeque; + +public final class AntPaintHistory { + public static final int MAX_STATES = 32; + + private final ArrayDeque undo = new ArrayDeque<>(); + private final ArrayDeque redo = new ArrayDeque<>(); + + public void record(AntPaintCanvas canvas) { + undo.addLast(canvas.copy()); + while (undo.size() > MAX_STATES) { + undo.removeFirst(); + } + redo.clear(); + } + + public boolean canUndo() { + return !undo.isEmpty(); + } + + public boolean canRedo() { + return !redo.isEmpty(); + } + + public AntPaintCanvas undo(AntPaintCanvas current) { + if (undo.isEmpty()) { + return current; + } + redo.addLast(current.copy()); + return undo.removeLast().copy(); + } + + public AntPaintCanvas redo(AntPaintCanvas current) { + if (redo.isEmpty()) { + return current; + } + undo.addLast(current.copy()); + return redo.removeLast().copy(); + } + + public void clear() { + undo.clear(); + redo.clear(); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintRequests.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintRequests.java new file mode 100644 index 00000000..a2830775 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintRequests.java @@ -0,0 +1,35 @@ +package com.craisinlord.antarchy.content.computer.paint; + +import java.util.Objects; + +public final class AntPaintRequests { + private AntPaintRequests() { + } + + public record Save(String computerId, AntPaintFile file) { + public Save { + Objects.requireNonNull(computerId, "computerId"); + Objects.requireNonNull(file, "file"); + } + } + + public record Load(String computerId, String fileId) { + public Load { + Objects.requireNonNull(computerId, "computerId"); + Objects.requireNonNull(fileId, "fileId"); + } + } + + public record List(String computerId) { + public List { + Objects.requireNonNull(computerId, "computerId"); + } + } + + public record Delete(String computerId, String fileId) { + public Delete { + Objects.requireNonNull(computerId, "computerId"); + Objects.requireNonNull(fileId, "fileId"); + } + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintResults.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintResults.java new file mode 100644 index 00000000..d5ca9707 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintResults.java @@ -0,0 +1,40 @@ +package com.craisinlord.antarchy.content.computer.paint; + +import java.util.List; + +public final class AntPaintResults { + private AntPaintResults() { + } + + public enum Code { + SUCCESS, + UNAUTHENTICATED, + OUT_OF_RANGE, + INVALID_FILENAME, + INVALID_FILE, + FILE_NOT_FOUND, + DUPLICATE_FILE, + STORAGE_FULL, + PAYLOAD_TOO_LARGE, + BUSY, + UNKNOWN_ERROR + } + + public record Save(Code code, String fileId) { + } + + public record Load(Code code, AntPaintFile file) { + } + + public record List(Code code, java.util.List files) { + public List { + files = files == null ? java.util.List.of() : java.util.List.copyOf(files); + } + } + + public record Delete(Code code, String fileId) { + } + + public record AntPaintFileMetadata(String fileId, String filename, long modifiedTime) { + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintTool.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintTool.java new file mode 100644 index 00000000..68c6088e --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/paint/AntPaintTool.java @@ -0,0 +1,7 @@ +package com.craisinlord.antarchy.content.computer.paint; + +public enum AntPaintTool { + PENCIL, + ERASER, + FILL +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommand.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommand.java new file mode 100644 index 00000000..b4a79272 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommand.java @@ -0,0 +1,11 @@ +package com.craisinlord.antarchy.content.computer.terminal; + +import java.util.List; + +public record TerminalCommand(String name, List arguments, String rawInput) { + public TerminalCommand { + name = name.toLowerCase(java.util.Locale.ROOT); + arguments = List.copyOf(arguments); + rawInput = rawInput == null ? "" : rawInput; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandParser.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandParser.java new file mode 100644 index 00000000..330f82fa --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandParser.java @@ -0,0 +1,79 @@ +package com.craisinlord.antarchy.content.computer.terminal; + +import java.util.ArrayList; +import java.util.List; + +public final class TerminalCommandParser { + private static final int MAX_INPUT_LENGTH = 256; + + private TerminalCommandParser() { + } + + public static ParseResult parse(String input) { + if (input == null) { + return ParseResult.error("ERROR: EMPTY INPUT"); + } + if (input.length() > MAX_INPUT_LENGTH) { + return ParseResult.error("ERROR: COMMAND TOO LONG"); + } + String trimmed = input.trim(); + if (trimmed.isEmpty()) { + return ParseResult.error("ERROR: EMPTY INPUT"); + } + List tokens = new ArrayList<>(); + StringBuilder token = new StringBuilder(); + Character quote = null; + boolean escaped = false; + for (int index = 0; index < trimmed.length(); index++) { + char character = trimmed.charAt(index); + if (escaped) { + token.append(character); + escaped = false; + } else if (character == '\\') { + escaped = true; + } else if (quote != null) { + if (character == quote) { + quote = null; + } else { + token.append(character); + } + } else if (character == '\'' || character == '"') { + quote = character; + } else if (Character.isWhitespace(character)) { + if (!token.isEmpty()) { + tokens.add(token.toString()); + token.setLength(0); + } + } else { + token.append(character); + } + } + if (escaped) { + token.append('\\'); + } + if (quote != null) { + return ParseResult.error("ERROR: UNTERMINATED QUOTE"); + } + if (!token.isEmpty()) { + tokens.add(token.toString()); + } + if (tokens.isEmpty()) { + return ParseResult.error("ERROR: EMPTY INPUT"); + } + return ParseResult.success(new TerminalCommand(tokens.get(0), tokens.subList(1, tokens.size()), input)); + } + + public record ParseResult(TerminalCommand command, String error) { + public boolean isSuccess() { + return command != null; + } + + public static ParseResult success(TerminalCommand command) { + return new ParseResult(command, null); + } + + public static ParseResult error(String message) { + return new ParseResult(null, message); + } + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandService.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandService.java new file mode 100644 index 00000000..1fbe556b --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalCommandService.java @@ -0,0 +1,207 @@ +package com.craisinlord.antarchy.content.computer.terminal; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; +import java.util.Optional; + +public final class TerminalCommandService { + private static final int MAX_ARGUMENT_LENGTH = 128; + private static final List COMMANDS = List.of( + "help", "clear", "pwd", "ls", "cd", "mkdir", "touch", "cat", "write", "rm", "rmdir", "mv", "open" + ); + + public TerminalResult execute(TerminalFileSystem fileSystem, String workingDirectory, String input) { + String currentDirectory = normalizeWorkingDirectory(fileSystem, workingDirectory); + TerminalCommandParser.ParseResult parsed = TerminalCommandParser.parse(input); + if (!parsed.isSuccess()) { + return TerminalResult.error(currentDirectory, parsed.error()); + } + TerminalCommand command = parsed.command(); + if (command.arguments().stream().anyMatch(argument -> argument.length() > MAX_ARGUMENT_LENGTH)) { + return TerminalResult.error(currentDirectory, "ERROR: ARGUMENT TOO LONG"); + } + return switch (command.name()) { + case "help" -> help(currentDirectory, command); + case "clear" -> requireArguments(currentDirectory, command, 0, TerminalResult.clear(currentDirectory)); + case "pwd" -> requireArguments(currentDirectory, command, 0, TerminalResult.success(currentDirectory, currentDirectory)); + case "ls" -> list(fileSystem, currentDirectory, command); + case "cd" -> changeDirectory(fileSystem, currentDirectory, command); + case "mkdir" -> createDirectory(fileSystem, currentDirectory, command); + case "touch" -> createFile(fileSystem, currentDirectory, command); + case "cat" -> readFile(fileSystem, currentDirectory, command); + case "write" -> writeFile(fileSystem, currentDirectory, command); + case "rm" -> removeFile(fileSystem, currentDirectory, command); + case "rmdir" -> removeDirectory(fileSystem, currentDirectory, command); + case "mv" -> move(fileSystem, currentDirectory, command); + case "open" -> open(fileSystem, currentDirectory, command); + default -> TerminalResult.error(currentDirectory, "ERROR: INVALID COMMAND: " + command.name()); + }; + } + + private TerminalResult help(String workingDirectory, TerminalCommand command) { + if (command.arguments().isEmpty()) { + return TerminalResult.success(workingDirectory, + "AVAILABLE COMMANDS", + "HELP CLEAR PWD LS CD MKDIR TOUCH CAT WRITE RM RMDIR MV OPEN"); + } + if (command.arguments().size() != 1) { + return usage(workingDirectory, "help [command]"); + } + return switch (command.arguments().get(0).toLowerCase(Locale.ROOT)) { + case "help" -> TerminalResult.success(workingDirectory, "HELP [COMMAND] // SHOW COMMAND HELP"); + case "clear" -> TerminalResult.success(workingDirectory, "CLEAR // CLEAR TERMINAL OUTPUT"); + case "pwd" -> TerminalResult.success(workingDirectory, "PWD // PRINT WORKING DIRECTORY"); + case "ls" -> TerminalResult.success(workingDirectory, "LS [PATH] // LIST DIRECTORY CONTENTS"); + case "cd" -> TerminalResult.success(workingDirectory, "CD [PATH] // CHANGE WORKING DIRECTORY"); + case "mkdir" -> TerminalResult.success(workingDirectory, "MKDIR // CREATE DIRECTORY"); + case "touch" -> TerminalResult.success(workingDirectory, "TOUCH // CREATE EMPTY TEXT FILE"); + case "cat" -> TerminalResult.success(workingDirectory, "CAT // PRINT TEXT FILE"); + case "write" -> TerminalResult.success(workingDirectory, "WRITE [TEXT] // REPLACE TEXT FILE CONTENTS"); + case "rm" -> TerminalResult.success(workingDirectory, "RM // DELETE TEXT FILE"); + case "rmdir" -> TerminalResult.success(workingDirectory, "RMDIR // DELETE EMPTY DIRECTORY"); + case "mv" -> TerminalResult.success(workingDirectory, "MV // MOVE OR RENAME"); + case "open" -> TerminalResult.success(workingDirectory, "OPEN // OPEN TEXT FILE IN ANTTEXT"); + default -> TerminalResult.error(workingDirectory, "ERROR: NO HELP FOR " + command.arguments().get(0)); + }; + } + + private TerminalResult list(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() > 1) { + return usage(workingDirectory, "ls [path]"); + } + String path = command.arguments().isEmpty() ? workingDirectory : command.arguments().get(0); + Optional entry = find(fileSystem, path, workingDirectory); + if (entry.isEmpty()) { + return missing(workingDirectory, path); + } + if (!entry.get().isDirectory()) { + return TerminalResult.success(workingDirectory, entry.get().name()); + } + List entries = new ArrayList<>(fileSystem.list(path, workingDirectory)); + entries.sort(Comparator.comparing(TerminalFileSystem.Entry::isDirectory).reversed().thenComparing(TerminalFileSystem.Entry::name)); + if (entries.isEmpty()) { + return TerminalResult.success(workingDirectory, "DIRECTORY EMPTY"); + } + return new TerminalResult(TerminalResult.Status.SUCCESS, entries.stream() + .map(value -> (value.isDirectory() ? "[DIR] " : " ") + value.name()).toList(), workingDirectory, false, null); + } + + private TerminalResult changeDirectory(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() > 1) { + return usage(workingDirectory, "cd [path]"); + } + String path = command.arguments().isEmpty() ? TerminalFileSystem.ROOT_PATH : command.arguments().get(0); + Optional entry = find(fileSystem, path, workingDirectory); + if (entry.isEmpty() || !entry.get().isDirectory()) { + return missing(workingDirectory, path); + } + return TerminalResult.success(entry.get().path(), entry.get().path()); + } + + private TerminalResult createDirectory(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() != 1) { + return usage(workingDirectory, "mkdir "); + } + return fileSystem.createDirectory(command.arguments().get(0), workingDirectory) + ? TerminalResult.success(workingDirectory) + : TerminalResult.error(workingDirectory, "ERROR: CANNOT CREATE DIRECTORY"); + } + + private TerminalResult createFile(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() != 1) { + return usage(workingDirectory, "touch "); + } + return fileSystem.createFile(command.arguments().get(0), workingDirectory) + ? TerminalResult.success(workingDirectory) + : TerminalResult.error(workingDirectory, "ERROR: CANNOT CREATE FILE"); + } + + private TerminalResult readFile(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() != 1) { + return usage(workingDirectory, "cat "); + } + Optional contents = fileSystem.readText(command.arguments().get(0), workingDirectory); + return contents.map(value -> TerminalResult.success(workingDirectory, value.split("\\R", -1))) + .orElseGet(() -> missing(workingDirectory, command.arguments().get(0))); + } + + private TerminalResult writeFile(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() < 1 || command.arguments().size() > 2) { + return usage(workingDirectory, "write [text]"); + } + String contents = command.arguments().size() == 2 ? command.arguments().get(1) : ""; + return fileSystem.writeText(command.arguments().get(0), workingDirectory, contents) + ? TerminalResult.success(workingDirectory) + : TerminalResult.error(workingDirectory, "ERROR: CANNOT WRITE FILE"); + } + + private TerminalResult removeFile(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() != 1) { + return usage(workingDirectory, "rm "); + } + return fileSystem.deleteFile(command.arguments().get(0), workingDirectory) + ? TerminalResult.success(workingDirectory) + : TerminalResult.error(workingDirectory, "ERROR: CANNOT DELETE FILE"); + } + + private TerminalResult removeDirectory(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() != 1) { + return usage(workingDirectory, "rmdir "); + } + return fileSystem.deleteEmptyDirectory(command.arguments().get(0), workingDirectory) + ? TerminalResult.success(workingDirectory) + : TerminalResult.error(workingDirectory, "ERROR: DIRECTORY NOT EMPTY OR NOT FOUND"); + } + + private TerminalResult move(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() != 2) { + return usage(workingDirectory, "mv "); + } + return fileSystem.move(command.arguments().get(0), command.arguments().get(1), workingDirectory) + ? TerminalResult.success(workingDirectory) + : TerminalResult.error(workingDirectory, "ERROR: CANNOT MOVE PATH"); + } + + private TerminalResult open(TerminalFileSystem fileSystem, String workingDirectory, TerminalCommand command) { + if (command.arguments().size() != 1) { + return usage(workingDirectory, "open "); + } + Optional entry = find(fileSystem, command.arguments().get(0), workingDirectory); + if (entry.isEmpty() || entry.get().isDirectory()) { + return missing(workingDirectory, command.arguments().get(0)); + } + return TerminalResult.open(workingDirectory, entry.get().path()); + } + + private Optional find(TerminalFileSystem fileSystem, String path, String workingDirectory) { + try { + return fileSystem.find(path, workingDirectory); + } catch (RuntimeException ignored) { + return Optional.empty(); + } + } + + private String normalizeWorkingDirectory(TerminalFileSystem fileSystem, String workingDirectory) { + try { + String normalized = fileSystem.normalize(workingDirectory, TerminalFileSystem.ROOT_PATH); + Optional entry = fileSystem.find(normalized, TerminalFileSystem.ROOT_PATH); + return entry.filter(TerminalFileSystem.Entry::isDirectory).map(TerminalFileSystem.Entry::path).orElse(TerminalFileSystem.ROOT_PATH); + } catch (RuntimeException ignored) { + return TerminalFileSystem.ROOT_PATH; + } + } + + private TerminalResult missing(String workingDirectory, String path) { + return TerminalResult.error(workingDirectory, "ERROR: PATH NOT FOUND: " + path); + } + + private TerminalResult usage(String workingDirectory, String usage) { + return TerminalResult.error(workingDirectory, "USAGE: " + usage); + } + + private TerminalResult requireArguments(String workingDirectory, TerminalCommand command, int count, TerminalResult result) { + return command.arguments().size() == count ? result : usage(workingDirectory, command.name() + " requires " + count + " arguments"); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalFileSystem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalFileSystem.java new file mode 100644 index 00000000..c1ff3701 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalFileSystem.java @@ -0,0 +1,39 @@ +package com.craisinlord.antarchy.content.computer.terminal; + +import java.util.List; +import java.util.Optional; + +public interface TerminalFileSystem { + String ROOT_PATH = "/"; + + Optional find(String path, String workingDirectory); + + List list(String path, String workingDirectory); + + boolean createDirectory(String path, String workingDirectory); + + boolean createFile(String path, String workingDirectory); + + Optional readText(String path, String workingDirectory); + + boolean writeText(String path, String workingDirectory, String contents); + + boolean deleteFile(String path, String workingDirectory); + + boolean deleteEmptyDirectory(String path, String workingDirectory); + + boolean move(String source, String destination, String workingDirectory); + + String normalize(String path, String workingDirectory); + + record Entry(String name, String path, EntryType type) { + public boolean isDirectory() { + return type == EntryType.DIRECTORY; + } + } + + enum EntryType { + FILE, + DIRECTORY + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalResult.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalResult.java new file mode 100644 index 00000000..02304226 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/terminal/TerminalResult.java @@ -0,0 +1,33 @@ +package com.craisinlord.antarchy.content.computer.terminal; + +import java.util.List; + +public record TerminalResult(Status status, List lines, String workingDirectory, boolean clearOutput, String openPath) { + public TerminalResult { + status = status == null ? Status.ERROR : status; + lines = List.copyOf(lines); + workingDirectory = workingDirectory == null || workingDirectory.isBlank() ? TerminalFileSystem.ROOT_PATH : workingDirectory; + } + + public static TerminalResult success(String workingDirectory, String... lines) { + return new TerminalResult(Status.SUCCESS, List.of(lines), workingDirectory, false, null); + } + + public static TerminalResult error(String workingDirectory, String... lines) { + return new TerminalResult(Status.ERROR, List.of(lines), workingDirectory, false, null); + } + + public static TerminalResult clear(String workingDirectory) { + return new TerminalResult(Status.SUCCESS, List.of(), workingDirectory, true, null); + } + + public static TerminalResult open(String workingDirectory, String path) { + return new TerminalResult(Status.OPEN, List.of("OPENING " + path), workingDirectory, false, path); + } + + public enum Status { + SUCCESS, + ERROR, + OPEN + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java index 3e85e15f..94a7a9eb 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java @@ -75,11 +75,9 @@ public class OctopusBombEntity extends Monster implements GeoEntity { private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); - // Squid-style wander private float wanderDx, wanderDy, wanderDz; private int wanderRetargetTicks; - // Combat private int attackCooldown; private int actionTicks; private int lastAttackState; @@ -88,7 +86,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { private float orbitDirection = 1.0F; private int inkSprayCooldown; - // Kraken spawn flag private boolean spawnedByKraken; // Explosive impact (fired from the R.P.O. Launcher) @@ -364,10 +361,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { this.hasImpulse = true; } - // ------------------------------------------------------------------------- - // Squid-style wander - // ------------------------------------------------------------------------- - private void tickWanderMovement() { if (--this.wanderRetargetTicks <= 0) { this.wanderRetargetTicks = 40 + this.random.nextInt(40); @@ -386,10 +379,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { this.setDeltaMovement(this.getDeltaMovement().add(this.wanderDx, dy, this.wanderDz)); } - // ------------------------------------------------------------------------- - // Ink spray - // ------------------------------------------------------------------------- - private boolean hasHitExplosiveTarget() { AABB box = this.getBoundingBox(); return !this.level().getEntitiesOfClass(LivingEntity.class, box, @@ -445,10 +434,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { serverLevel.sendParticles(OCTOPUS_BOMB_INK_PARTICLE, cx, cy, cz, 30, 3.5D, 1.8D, 3.5D, 0.02D); } - // ------------------------------------------------------------------------- - // Combat - // ------------------------------------------------------------------------- - private void tickPursuitMovement(LivingEntity target) { if (this.strafeRetargetTicks-- <= 0) { this.strafeRetargetTicks = 10 + this.random.nextInt(12); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/BaseAntEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/BaseAntEntity.java index d4e01dd8..c760ab23 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/BaseAntEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/BaseAntEntity.java @@ -95,6 +95,7 @@ public abstract class BaseAntEntity extends Animal implements GeoEntity { private static final int NEST_SEARCH_INTERVAL_TICKS = 80; private static final int FOOD_NEST_SEARCH_INTERVAL_TICKS = 20; private static final int CHEST_SEARCH_INTERVAL_TICKS = 20; + private static final int CHEST_VALIDATION_INTERVAL_TICKS = 10; private static final int SHARED_CHEST_MEMORY_TICKS = 120; private static final double FOOD_CHEST_SEARCH_RADIUS = 20.0D; private static final int GROUND_FOOD_CACHE_INTERVAL_TICKS = 20; @@ -136,6 +137,10 @@ public abstract class BaseAntEntity extends Animal implements GeoEntity { private BlockPos targetFoodChestPos; private int nextFoodChestSearchTick; @Nullable + private BlockPos cachedFoodChestValidationPos; + private boolean cachedFoodChestValidationResult; + private int nextFoodChestValidationTick; + @Nullable private BlockPos recentFoodChestPos; private int recentFoodChestExpireTick; @Nullable @@ -749,17 +754,36 @@ public abstract class BaseAntEntity extends Animal implements GeoEntity { } } + if (bestPos != null) { + this.cachedFoodChestValidationPos = bestPos; + this.cachedFoodChestValidationResult = true; + this.nextFoodChestValidationTick = this.tickCount + CHEST_VALIDATION_INTERVAL_TICKS; + } return bestPos; } private boolean isValidFoodChest(BlockPos chestPos) { + if (this.cachedFoodChestValidationPos != null + && this.cachedFoodChestValidationPos.equals(chestPos) + && this.tickCount < this.nextFoodChestValidationTick) { + return this.cachedFoodChestValidationResult; + } + BlockEntity blockEntity = this.level().getBlockEntity(chestPos); - return blockEntity instanceof ChestBlockEntity chestBlockEntity && this.findStealableFoodSlot(chestBlockEntity) >= 0; + boolean valid = blockEntity instanceof ChestBlockEntity chestBlockEntity + && this.findStealableFoodSlot(chestBlockEntity) >= 0; + this.cachedFoodChestValidationPos = chestPos.immutable(); + this.cachedFoodChestValidationResult = valid; + this.nextFoodChestValidationTick = this.tickCount + CHEST_VALIDATION_INTERVAL_TICKS; + return valid; } private void clearFoodChestTarget() { this.targetFoodChestPos = null; this.nextFoodChestSearchTick = 0; + this.cachedFoodChestValidationPos = null; + this.cachedFoodChestValidationResult = false; + this.nextFoodChestValidationTick = 0; } private boolean stealFoodFromChest(BlockPos chestPos) { @@ -1390,13 +1414,16 @@ public abstract class BaseAntEntity extends Animal implements GeoEntity { return null; } - if (leader.targetFoodChestPos != null && this.isValidFoodChest(leader.targetFoodChestPos)) { + if (leader.targetFoodChestPos != null + && leader.cachedFoodChestValidationPos != null + && leader.cachedFoodChestValidationPos.equals(leader.targetFoodChestPos) + && leader.cachedFoodChestValidationResult + && leader.tickCount < leader.nextFoodChestValidationTick) { return leader.targetFoodChestPos; } if (leader.recentFoodChestPos != null - && leader.tickCount <= leader.recentFoodChestExpireTick - && this.isValidFoodChest(leader.recentFoodChestPos)) { + && leader.tickCount <= leader.recentFoodChestExpireTick) { return leader.recentFoodChestPos; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java index a5504795..850f90c2 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java @@ -994,7 +994,7 @@ public class KingEntity extends RoyalBossEntity { } @Override public void onActive(int elapsedTicks) { KingEntity.this.raiseIceSpikes(level, target); - KingEntity.this.playRoyalSound(AntarchySoundEvents.KING_BEAM_SHOOT.get(), 0.8F); + KingEntity.this.playRoyalSound(AntarchySoundEvents.KING_ICE_SPIKES.get(), 0.8F); } })) return; this.iceSpikeCooldownTicks = AntarchySettings.kingIceSpikeCooldownTicks(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/guide/ComputerGuideData.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/guide/ComputerGuideData.java index 3b5ba093..666fd006 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/guide/ComputerGuideData.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/guide/ComputerGuideData.java @@ -18,6 +18,7 @@ import java.util.Map; public final class ComputerGuideData extends SimplePreparableReloadListener { private static final ComputerGuideData INSTANCE = new ComputerGuideData(); + private static final ResourceLocation INTRODUCTION = ResourceLocation.fromNamespaceAndPath("antarchy", "introduction"); private static volatile Map entries = Map.of(); private static volatile Map disks = Map.of(); @@ -39,6 +40,10 @@ public final class ComputerGuideData extends SimplePreparableReloadListener entriesFor(List diskIds) { Map result = new LinkedHashMap<>(); for (ResourceLocation diskId : diskIds) { + if (INTRODUCTION.equals(diskId)) { + result.put(INTRODUCTION, new Entry(INTRODUCTION, "article", "general", "guide.antarchy.entry.introduction.title", "guide.antarchy.entry.introduction.subtitle", List.of("guide.antarchy.entry.introduction.description"), "", "", "")); + continue; + } Disk disk = disks.get(diskId); if (disk == null) { continue; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java index 24de9c9d..094859a7 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java @@ -176,7 +176,6 @@ public class BigBerthaItem extends SwordItem implements GeoItem { return; } - // Toreterror jump tracking if (isToreterrorJumping(stack) && player.getMainHandItem() == stack) { player.fallDistance = 0.0F; // prevent fall damage during the crash-down boolean launched = readInt(stack, TORETERROR_LAUNCHED_TAG) == 1; @@ -197,7 +196,6 @@ public class BigBerthaItem extends SwordItem implements GeoItem { } } - // Tick client shake counter if (level.isClientSide && clientShakeTicks > 0) { clientShakeTicks--; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ComputerItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ComputerItem.java index 4515573d..bbd4d438 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ComputerItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ComputerItem.java @@ -18,7 +18,7 @@ import java.util.function.Consumer; public final class ComputerItem extends BlockItem implements GeoItem { private static final ResourceLocation MODEL = ResourceLocation.fromNamespaceAndPath("antarchy", "geo/computer.geo.json"); - private static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath("antarchy", "textures/block/computer/computer.png"); + private static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath("antarchy", "textures/item/computer.png"); private static final ResourceLocation ANIMATION = ResourceLocation.fromNamespaceAndPath("antarchy", "animations/computer.animation.json"); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); @@ -29,7 +29,7 @@ public final class ComputerItem extends BlockItem implements GeoItem { @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { - controllers.add(new AnimationController<>(this, "state", state -> state.setAndContinue(RawAnimation.begin().thenLoop("off_state")))); + controllers.add(new AnimationController<>(this, "state", state -> state.setAndContinue(RawAnimation.begin().thenLoop("on_state")))); } @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailNetworking.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailNetworking.java new file mode 100644 index 00000000..83e2d6e9 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailNetworking.java @@ -0,0 +1,40 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.content.antmail.AntmailAttachment; +import com.craisinlord.antarchy.content.antmail.AntmailWire; +import net.minecraft.core.BlockPos; + +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; + +public final class AntmailNetworking { + private static Consumer sender = payload -> { }; + + private AntmailNetworking() { + } + + public static void setSender(Consumer sender) { + AntmailNetworking.sender = sender; + } + + public static void setup(BlockPos pos, String username) { + sender.accept(new AntmailSetupPayload(pos, username)); + } + + public static void requestState(BlockPos pos) { + sender.accept(new AntmailStateRequestPayload(pos)); + } + + public static void send(BlockPos pos, String recipient, String subject, String body, List attachments) { + sender.accept(new AntmailSendPayload(pos, recipient, subject, body, AntmailWire.encodeAttachments(attachments))); + } + + public static void markRead(BlockPos pos, UUID messageId) { + sender.accept(new AntmailReadPayload(pos, messageId.toString(), true)); + } + + public static void markUnread(BlockPos pos, UUID messageId) { + sender.accept(new AntmailReadPayload(pos, messageId.toString(), false)); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailPayloadTypes.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailPayloadTypes.java new file mode 100644 index 00000000..9ed63a81 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailPayloadTypes.java @@ -0,0 +1,20 @@ +package com.craisinlord.antarchy.content.network; + +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +import java.util.List; + +public final class AntmailPayloadTypes { + private AntmailPayloadTypes() { + } + + public static List> all() { + return List.of( + AntmailSetupPayload.TYPE, + AntmailStateRequestPayload.TYPE, + AntmailSendPayload.TYPE, + AntmailReadPayload.TYPE, + AntmailResultPayload.TYPE + ); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailReadPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailReadPayload.java new file mode 100644 index 00000000..017e7f6c --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailReadPayload.java @@ -0,0 +1,15 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record AntmailReadPayload(BlockPos pos, String messageId, boolean read) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "antmail_read")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, AntmailReadPayload::pos, ByteBufCodecs.stringUtf8(64), AntmailReadPayload::messageId, ByteBufCodecs.BOOL, AntmailReadPayload::read, AntmailReadPayload::new); + @Override public Type type() { return TYPE; } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailResultPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailResultPayload.java new file mode 100644 index 00000000..17c281a1 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailResultPayload.java @@ -0,0 +1,15 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record AntmailResultPayload(BlockPos pos, int status, String address, String messageId, String detail, String data) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "antmail_result")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, AntmailResultPayload::pos, ByteBufCodecs.VAR_INT, AntmailResultPayload::status, ByteBufCodecs.stringUtf8(64), AntmailResultPayload::address, ByteBufCodecs.stringUtf8(64), AntmailResultPayload::messageId, ByteBufCodecs.stringUtf8(128), AntmailResultPayload::detail, ByteBufCodecs.stringUtf8(65536), AntmailResultPayload::data, AntmailResultPayload::new); + @Override public Type type() { return TYPE; } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSendPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSendPayload.java new file mode 100644 index 00000000..a34221b2 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSendPayload.java @@ -0,0 +1,15 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record AntmailSendPayload(BlockPos pos, String recipient, String subject, String body, String attachments) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "antmail_send")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, AntmailSendPayload::pos, ByteBufCodecs.stringUtf8(64), AntmailSendPayload::recipient, ByteBufCodecs.stringUtf8(64), AntmailSendPayload::subject, ByteBufCodecs.stringUtf8(16384), AntmailSendPayload::body, ByteBufCodecs.stringUtf8(65536), AntmailSendPayload::attachments, AntmailSendPayload::new); + @Override public Type type() { return TYPE; } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailServerHandler.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailServerHandler.java new file mode 100644 index 00000000..4ce459de --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailServerHandler.java @@ -0,0 +1,127 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.content.antmail.AntmailAddress; +import com.craisinlord.antarchy.content.antmail.AntmailAttachment; +import com.craisinlord.antarchy.content.antmail.AntmailDeliveryResult; +import com.craisinlord.antarchy.content.antmail.AntmailMessage; +import com.craisinlord.antarchy.content.antmail.AntmailMailbox; +import com.craisinlord.antarchy.content.antmail.AntmailServerData; +import com.craisinlord.antarchy.content.antmail.AntmailValidation; +import com.craisinlord.antarchy.content.antmail.AntmailWire; +import com.craisinlord.antarchy.content.block.entity.ComputerBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.block.entity.BlockEntity; + +import java.util.List; +import java.util.UUID; +import java.util.function.BiConsumer; + +public final class AntmailServerHandler { + private static BiConsumer resultSender = (player, payload) -> { }; + + private AntmailServerHandler() { + } + + public static void setResultSender(BiConsumer sender) { + resultSender = sender; + } + + public static void handle(ServerPlayer player, AntmailSetupPayload payload) { + ComputerBlockEntity computer = computer(player, payload.pos()); + if (computer == null || !computer.canUseFileSystem(player)) { + result(player, payload.pos(), AntmailDeliveryResult.Status.FAILED.ordinal(), "", "", "unauthorized", ""); + return; + } + AntmailServerData data = AntmailServerData.access(player.server); + AntmailServerData.Registration registration = data.register(player.server, player.serverLevel(), payload.pos(), payload.username()); + result(player, payload.pos(), registration.valid() ? AntmailDeliveryResult.Status.DELIVERED.ordinal() : AntmailDeliveryResult.Status.FAILED.ordinal(), registration.valid() ? registration.address().fullAddress() : "", "", registration.reason(), ""); + } + + public static void handle(ServerPlayer player, AntmailStateRequestPayload payload) { + ComputerBlockEntity computer = authorizedComputer(player, payload.pos()); + if (computer == null) { + result(player, payload.pos(), AntmailDeliveryResult.Status.FAILED.ordinal(), "", "", "unauthorized", ""); + return; + } + AntmailServerData data = AntmailServerData.access(player.server); + AntmailAddress address = data.addressAt(player.serverLevel().dimension().location(), payload.pos()); + if (address == null) { + result(player, payload.pos(), AntmailDeliveryResult.Status.ADDRESS_NOT_FOUND.ordinal(), "", "", "unconfigured", ""); + return; + } + AntmailMailbox mailbox = data.mailboxOrCreate(address); + result(player, payload.pos(), AntmailDeliveryResult.Status.DELIVERED.ordinal(), address.fullAddress(), "", "", AntmailWire.encodeTag(mailbox.toTag())); + } + + public static void handle(ServerPlayer player, AntmailSendPayload payload) { + ComputerBlockEntity computer = authorizedComputer(player, payload.pos()); + if (computer == null) { + result(player, payload.pos(), AntmailDeliveryResult.Status.FAILED.ordinal(), "", "", "unauthorized", ""); + return; + } + AntmailServerData data = AntmailServerData.access(player.server); + AntmailAddress sender = data.addressAt(player.serverLevel().dimension().location(), payload.pos()); + if (sender == null) { + result(player, payload.pos(), AntmailDeliveryResult.Status.FAILED.ordinal(), "", "", "unconfigured", ""); + return; + } + try { + AntmailAddress recipient = AntmailAddress.parse(payload.recipient()); + List attachments = AntmailWire.decodeAttachments(payload.attachments()); + AntmailMessage message = AntmailMessage.create(sender, recipient, payload.subject(), payload.body(), player.serverLevel().getGameTime(), attachments); + AntmailDeliveryResult delivery = data.deliver(player.server, message); + result(player, payload.pos(), delivery.status().ordinal(), recipient.fullAddress(), message.id().toString(), delivery.detail(), ""); + } catch (RuntimeException exception) { + result(player, payload.pos(), AntmailDeliveryResult.Status.MESSAGE_INVALID.ordinal(), "", "", "invalid_message", ""); + } + } + + public static void handle(ServerPlayer player, AntmailReadPayload payload) { + ComputerBlockEntity computer = authorizedComputer(player, payload.pos()); + if (computer == null) { + result(player, payload.pos(), AntmailDeliveryResult.Status.FAILED.ordinal(), "", payload.messageId(), "unauthorized", ""); + return; + } + AntmailServerData data = AntmailServerData.access(player.server); + AntmailAddress address = data.addressAt(player.serverLevel().dimension().location(), payload.pos()); + if (address == null) { + result(player, payload.pos(), AntmailDeliveryResult.Status.ADDRESS_NOT_FOUND.ordinal(), "", payload.messageId(), "unconfigured", ""); + return; + } + try { + UUID id = UUID.fromString(payload.messageId()); + AntmailMailbox mailbox = data.mailboxOrCreate(address); + boolean changed = payload.read() ? mailbox.markRead(id) : markUnread(mailbox, id); + if (changed) data.setDirty(); + result(player, payload.pos(), changed ? AntmailDeliveryResult.Status.DELIVERED.ordinal() : AntmailDeliveryResult.Status.FAILED.ordinal(), address.fullAddress(), payload.messageId(), changed ? "" : "not_found", ""); + } catch (IllegalArgumentException exception) { + result(player, payload.pos(), AntmailDeliveryResult.Status.FAILED.ordinal(), address.fullAddress(), payload.messageId(), "invalid_id", ""); + } + } + + private static ComputerBlockEntity authorizedComputer(ServerPlayer player, BlockPos pos) { + ComputerBlockEntity computer = computer(player, pos); + return computer != null && computer.canUseFileSystem(player) ? computer : null; + } + + private static boolean markUnread(AntmailMailbox mailbox, UUID id) { + for (com.craisinlord.antarchy.content.antmail.AntmailMessage message : mailbox.inbox()) { + if (message.id().equals(id)) { + message.markUnread(); + return true; + } + } + return false; + } + + private static ComputerBlockEntity computer(ServerPlayer player, BlockPos pos) { + if (!player.serverLevel().hasChunkAt(pos) || player.distanceToSqr(pos.getX() + .5D, pos.getY() + .5D, pos.getZ() + .5D) > 64D) return null; + BlockEntity blockEntity = player.serverLevel().getBlockEntity(pos); + return blockEntity instanceof ComputerBlockEntity computer ? computer : null; + } + + private static void result(ServerPlayer player, BlockPos pos, int status, String address, String messageId, String detail, String data) { + resultSender.accept(player, new AntmailResultPayload(pos, status, address, messageId, detail, data)); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSetupPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSetupPayload.java new file mode 100644 index 00000000..8c93d6ce --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailSetupPayload.java @@ -0,0 +1,15 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record AntmailSetupPayload(BlockPos pos, String username) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "antmail_setup")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, AntmailSetupPayload::pos, ByteBufCodecs.stringUtf8(32), AntmailSetupPayload::username, AntmailSetupPayload::new); + @Override public Type type() { return TYPE; } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailStateRequestPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailStateRequestPayload.java new file mode 100644 index 00000000..ae918088 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntmailStateRequestPayload.java @@ -0,0 +1,14 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record AntmailStateRequestPayload(BlockPos pos) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "antmail_state_request")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, AntmailStateRequestPayload::pos, AntmailStateRequestPayload::new); + @Override public Type type() { return TYPE; } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessHandler.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessHandler.java new file mode 100644 index 00000000..1a2c6b9b --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessHandler.java @@ -0,0 +1,212 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.content.block.entity.ComputerBlockEntity; +import com.craisinlord.antarchy.content.computer.ComputerFileSystem; +import com.craisinlord.antarchy.content.antmail.AntmailWire; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntity; + +import java.util.function.BiConsumer; + +public final class ComputerAccessHandler { + private static BiConsumer resultSender = (player, result) -> { + }; + + private ComputerAccessHandler() { + } + + public static void setResultSender(BiConsumer sender) { + resultSender = sender; + } + + public static void handle(ServerPlayer player, ComputerAccessPayload payload) { + if (payload.value().length() > 65536 || player.level().isClientSide || !player.serverLevel().hasChunkAt(payload.pos()) || + player.distanceToSqr(payload.pos().getX() + 0.5D, payload.pos().getY() + 0.5D, payload.pos().getZ() + 0.5D) > 64.0D) { + return; + } + BlockEntity blockEntity = player.serverLevel().getBlockEntity(payload.pos()); + if (!(blockEntity instanceof ComputerBlockEntity computer)) { + send(player, payload, ComputerAccessResultPayload.INVALID); + return; + } + switch (payload.action()) { + case ComputerAccessPayload.OPEN -> open(player, computer, payload); + case ComputerAccessPayload.SETUP -> setup(player, computer, payload); + case ComputerAccessPayload.LOGIN -> login(player, computer, payload); + case ComputerAccessPayload.LOGOUT -> { + computer.logout(); + send(player, payload, ComputerAccessResultPayload.READY); + } + case ComputerAccessPayload.CLOSE -> { + computer.releaseUser(player); + send(player, payload, computer.isAuthenticated() ? ComputerAccessResultPayload.SUCCESS : ComputerAccessResultPayload.READY); + } + case ComputerAccessPayload.CHANGE_PASSWORD -> { + boolean changed = computer.setPassword(player, payload.value()); + send(player, payload, changed ? ComputerAccessResultPayload.SUCCESS : ComputerAccessResultPayload.INVALID_PASSWORD); + } + case ComputerAccessPayload.EJECT -> eject(player, computer, payload); + case ComputerAccessPayload.FILE_LIST -> fileList(player, computer, payload); + case ComputerAccessPayload.FILE_OPEN -> fileOpen(player, computer, payload); + case ComputerAccessPayload.FILE_CREATE -> fileCreate(player, computer, payload); + case ComputerAccessPayload.FILE_SAVE -> fileSave(player, computer, payload); + case ComputerAccessPayload.DESKTOP_STATE -> desktopState(player, computer, payload); + case ComputerAccessPayload.DESKTOP_WALLPAPER -> desktopWallpaper(player, computer, payload); + default -> send(player, payload, ComputerAccessResultPayload.INVALID); + } + } + + private static void open(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (computer.hasActiveUser() && !computer.isAuthenticatedBy(player)) { + send(player, payload, ComputerAccessResultPayload.BUSY); + return; + } + if (!computer.hasPassword()) { + computer.claimUser(player); + send(player, payload, ComputerAccessResultPayload.SETUP_REQUIRED); + } else if (computer.isAuthenticated()) { + computer.claimUser(player); + send(player, payload, ComputerAccessResultPayload.SUCCESS); + } else { + send(player, payload, ComputerAccessResultPayload.READY); + } + } + + private static void setup(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (!computer.hasPassword() && computer.initializePassword(player, payload.value())) { + send(player, payload, ComputerAccessResultPayload.SUCCESS); + } else { + send(player, payload, computer.hasActiveUser() ? ComputerAccessResultPayload.BUSY : ComputerAccessResultPayload.INVALID_PASSWORD); + } + } + + private static void login(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (computer.hasActiveUser() && !computer.isAuthenticatedBy(player)) { + send(player, payload, ComputerAccessResultPayload.BUSY); + } else if (computer.authenticate(player, payload.value())) { + send(player, payload, ComputerAccessResultPayload.SUCCESS); + } else { + send(player, payload, ComputerAccessResultPayload.INVALID_PASSWORD); + } + } + + private static void eject(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + try { + ResourceLocation diskId = ResourceLocation.parse(payload.value()); + boolean ejected = computer.ejectOne(player, diskId); + send(player, payload, ejected ? ComputerAccessResultPayload.SUCCESS : ComputerAccessResultPayload.INVALID); + } catch (Exception ignored) { + send(player, payload, ComputerAccessResultPayload.INVALID); + } + } + + private static void fileList(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (!computer.canUseFileSystem(player)) { + sendFile(player, payload, false, "", "unauthorized"); + return; + } + StringBuilder data = new StringBuilder(); + for (ComputerFileSystem.ComputerFile file : computer.fileSystem().list()) { + if (!data.isEmpty()) data.append('\n'); + data.append(file.type().name()).append('\t').append(file.path()).append('\t').append(file.contents().length()); + } + sendFile(player, payload, true, data.toString(), ""); + } + + private static void fileOpen(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (!computer.canUseFileSystem(player)) { + sendFile(player, payload, false, "", "unauthorized"); + return; + } + ComputerFileSystem.ComputerFile file = computer.fileSystem().get(payload.value()); + if (file == null) { + sendFile(player, payload, false, "", "not_found"); + } else if (file.type() != ComputerFileSystem.ComputerFile.Type.TEXT) { + sendFile(player, payload, false, "", "not_text"); + } else { + sendFile(player, payload, true, file.path() + "\0" + file.contents(), ""); + } + } + + private static void fileCreate(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (!computer.canUseFileSystem(player)) { + sendFile(player, payload, false, "", "unauthorized"); + return; + } + String[] request = splitFileRequest(payload.value()); + if (request == null) { + sendFile(player, payload, false, "", "invalid_request"); + return; + } + ComputerFileSystem.Result result = computer.fileSystem().createTextFile(request[0], request[1]); + if (result.successful()) computer.setChanged(); + sendFile(player, payload, result.successful(), request[0], result.error()); + } + + private static void fileSave(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (!computer.canUseFileSystem(player)) { + sendFile(player, payload, false, "", "unauthorized"); + return; + } + String[] request = splitFileRequest(payload.value()); + if (request == null) { + sendFile(player, payload, false, "", "invalid_request"); + return; + } + ComputerFileSystem.Result result = computer.fileSystem().writeTextFile(request[0], request[1]); + if (result.successful()) computer.setChanged(); + sendFile(player, payload, result.successful(), request[0], result.error()); + } + + private static void desktopState(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (!computer.canUseFileSystem(player)) { + sendDesktop(player, payload, false, "unauthorized"); + return; + } + sendDesktop(player, payload, true, AntmailWire.encodeTag(computer.desktopState().save())); + } + + private static void desktopWallpaper(ServerPlayer player, ComputerBlockEntity computer, ComputerAccessPayload payload) { + if (!computer.canUseFileSystem(player)) { + sendDesktop(player, payload, false, "unauthorized"); + return; + } + try { + boolean changed = computer.selectWallpaper(ResourceLocation.parse(payload.value())); + sendDesktop(player, payload, changed, changed ? "" : "wallpaper_locked"); + } catch (RuntimeException exception) { + sendDesktop(player, payload, false, "invalid_wallpaper"); + } + } + + private static void sendDesktop(ServerPlayer player, ComputerAccessPayload payload, boolean success, String data) { + BlockEntity blockEntity = player.serverLevel().getBlockEntity(payload.pos()); + boolean hasPassword = blockEntity instanceof ComputerBlockEntity computer && computer.hasPassword(); + boolean authenticated = blockEntity instanceof ComputerBlockEntity computer && computer.isAuthenticated(); + resultSender.accept(player, new ComputerAccessResultPayload(payload.pos(), success ? ComputerAccessResultPayload.SUCCESS : ComputerAccessResultPayload.INVALID, + hasPassword, authenticated, payload.action() + "\0\0" + data)); + } + + private static String[] splitFileRequest(String value) { + if (value == null) return null; + int separator = value.indexOf('\0'); + if (separator < 0) return null; + return new String[]{value.substring(0, separator), value.substring(separator + 1)}; + } + + private static void send(ServerPlayer player, ComputerAccessPayload payload, int result) { + BlockEntity blockEntity = player.serverLevel().getBlockEntity(payload.pos()); + boolean hasPassword = blockEntity instanceof ComputerBlockEntity computer && computer.hasPassword(); + boolean authenticated = blockEntity instanceof ComputerBlockEntity computer && computer.isAuthenticated(); + resultSender.accept(player, new ComputerAccessResultPayload(payload.pos(), result, hasPassword, authenticated)); + } + + private static void sendFile(ServerPlayer player, ComputerAccessPayload payload, boolean success, String data, String error) { + BlockEntity blockEntity = player.serverLevel().getBlockEntity(payload.pos()); + boolean hasPassword = blockEntity instanceof ComputerBlockEntity computer && computer.hasPassword(); + boolean authenticated = blockEntity instanceof ComputerBlockEntity computer && computer.isAuthenticated(); + resultSender.accept(player, new ComputerAccessResultPayload(payload.pos(), success ? ComputerAccessResultPayload.SUCCESS : ComputerAccessResultPayload.INVALID, + hasPassword, authenticated, payload.action() + "\0" + error + "\0" + data)); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessPayload.java new file mode 100644 index 00000000..bcc96371 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessPayload.java @@ -0,0 +1,41 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record ComputerAccessPayload(BlockPos pos, int action, String value) implements CustomPacketPayload { + public static final int OPEN = 0; + public static final int SETUP = 1; + public static final int LOGIN = 2; + public static final int LOGOUT = 3; + public static final int CHANGE_PASSWORD = 4; + public static final int EJECT = 5; + public static final int CLOSE = 6; + public static final int FILE_LIST = 7; + public static final int FILE_OPEN = 8; + public static final int FILE_CREATE = 9; + public static final int FILE_SAVE = 10; + public static final int DESKTOP_STATE = 11; + public static final int DESKTOP_WALLPAPER = 12; + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "computer_access")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, ComputerAccessPayload::pos, + ByteBufCodecs.VAR_INT, ComputerAccessPayload::action, + ByteBufCodecs.stringUtf8(65536), ComputerAccessPayload::value, + ComputerAccessPayload::new + ); + + public ComputerAccessPayload(BlockPos pos, int action) { + this(pos, action, ""); + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessResultPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessResultPayload.java new file mode 100644 index 00000000..10059c69 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerAccessResultPayload.java @@ -0,0 +1,36 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record ComputerAccessResultPayload(BlockPos pos, int result, boolean hasPassword, boolean authenticated, String data) implements CustomPacketPayload { + public static final int SETUP_REQUIRED = 0; + public static final int READY = 1; + public static final int SUCCESS = 2; + public static final int INVALID_PASSWORD = 3; + public static final int BUSY = 4; + public static final int INVALID = 5; + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "computer_access_result")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, ComputerAccessResultPayload::pos, + ByteBufCodecs.VAR_INT, ComputerAccessResultPayload::result, + ByteBufCodecs.BOOL, ComputerAccessResultPayload::hasPassword, + ByteBufCodecs.BOOL, ComputerAccessResultPayload::authenticated, + ByteBufCodecs.stringUtf8(65536), ComputerAccessResultPayload::data, + ComputerAccessResultPayload::new + ); + + public ComputerAccessResultPayload(BlockPos pos, int result, boolean hasPassword, boolean authenticated) { + this(pos, result, hasPassword, authenticated, ""); + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerNetworking.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerNetworking.java new file mode 100644 index 00000000..019e24db --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/ComputerNetworking.java @@ -0,0 +1,70 @@ +package com.craisinlord.antarchy.content.network; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.Consumer; + +public final class ComputerNetworking { + private static Consumer sender = payload -> { + }; + + private ComputerNetworking() { + } + + public static void setSender(Consumer sender) { + ComputerNetworking.sender = sender; + } + + public static void open(BlockPos pos) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.OPEN)); + } + + public static void setup(BlockPos pos, String password) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.SETUP, password)); + } + + public static void login(BlockPos pos, String password) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.LOGIN, password)); + } + + public static void logout(BlockPos pos) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.LOGOUT)); + } + + public static void close(BlockPos pos) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.CLOSE)); + } + + public static void changePassword(BlockPos pos, String password) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.CHANGE_PASSWORD, password)); + } + + public static void eject(BlockPos pos, ResourceLocation diskId) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.EJECT, diskId.toString())); + } + + public static void listFiles(BlockPos pos) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.FILE_LIST)); + } + + public static void openFile(BlockPos pos, String path) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.FILE_OPEN, path)); + } + + public static void createFile(BlockPos pos, String path, String contents) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.FILE_CREATE, path + "\0" + contents)); + } + + public static void saveFile(BlockPos pos, String path, String contents) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.FILE_SAVE, path + "\0" + contents)); + } + + public static void requestDesktopState(BlockPos pos) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.DESKTOP_STATE)); + } + + public static void selectWallpaper(BlockPos pos, ResourceLocation id) { + sender.accept(new ComputerAccessPayload(pos, ComputerAccessPayload.DESKTOP_WALLPAPER, id.toString())); + } +} diff --git a/common-1.21.1/src/main/resources/assets/antarchy/blockstates/computer.json b/common-1.21.1/src/main/resources/assets/antarchy/blockstates/computer.json index d05e6bdb..0cce1c7f 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/blockstates/computer.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/blockstates/computer.json @@ -1,7 +1,9 @@ { - "variants": { - "": { - "model": "antarchy:block/computer" + "multipart": [ + { + "apply": { + "model": "antarchy:block/computer" + } } - } + ] } diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json index b599b4c7..3e60ab18 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json @@ -1053,6 +1053,7 @@ "subtitles.antarchy.king_death": "The King falls", "subtitles.antarchy.king_beam_shoot": "The King fires a beam", "subtitles.antarchy.king_fireball_shoot": "The King breathes fire", + "subtitles.antarchy.king_ice_spikes": "The King summons ice spikes", "subtitles.antarchy.king_decree_cast": "The King pronounces a Decree", "subtitles.antarchy.king_decree": "The King issues a Decree", "subtitles.antarchy.king_success": "The King acknowledges compliance", @@ -1444,7 +1445,7 @@ ,"block.antarchy.computer": "Computer" ,"item.antarchy.computer": "Computer" ,"item.antarchy.floppy_disk": "Floppy Disk" - ,"screen.antarchy.computer": "ANTARCHY ARCHIVE" + ,"screen.antarchy.computer": "ANTINTOSH OS" ,"guide.antarchy.category.general": "GENERAL" ,"guide.antarchy.category.elythia": "ELYTHIA" ,"guide.antarchy.category.thoraxis": "THORAXIS" @@ -1467,4 +1468,21 @@ ,"guide.antarchy.entry.high_fructose_corn_syrup.title": "High Fructose Corn Syrup" ,"guide.antarchy.entry.high_fructose_corn_syrup.subtitle": "Nutritional and operational notes" ,"guide.antarchy.entry.high_fructose_corn_syrup.description": "A sweet substance of uncertain strategic value. Doctoral enthusiasm surrounding it is statistically suspicious." + ,"screen.antarchy.computer.first_use.title": "INITIAL PASSWORD SETUP" + ,"screen.antarchy.computer.first_use.prompt": "CREATE A PASSWORD TO CONTINUE" + ,"screen.antarchy.computer.first_use.confirm": "CONFIRM PASSWORD" + ,"screen.antarchy.computer.busy": "COMPUTER IN USE" + ,"screen.antarchy.computer.eject_denied": "ACCESS DENIED: SETTINGS REQUIRED" + ,"screen.antarchy.computer.ejected": "DISK EJECTED" + ,"antintosh.antarchy.desktop.archive": "ARCHIVE" + ,"antintosh.antarchy.desktop.settings": "SETTINGS" + ,"antintosh.antarchy.desktop.terminal": "TERMINAL" + ,"antintosh.antarchy.desktop.antpaint": "ANTPAINT" + ,"antintosh.antarchy.desktop.antmail": "ANTMAIL" + ,"antintosh.antarchy.desktop.text_editor": "TEXT EDITOR" + ,"antintosh.antarchy.antmail.compose": "COMPOSE MESSAGE" + ,"antintosh.antarchy.antmail.attach_text": "ATTACH TEXT FILE" + ,"antintosh.antarchy.antmail.attach_image": "ATTACH ANTPAINT IMAGE" + ,"antintosh.antarchy.antmail.save_attachment": "SAVE ATTACHMENT" + ,"antintosh.antarchy.antmail.address": "COMPUTER ADDRESS" } diff --git a/common-1.21.1/src/main/resources/assets/antarchy/models/item/computer.json b/common-1.21.1/src/main/resources/assets/antarchy/models/item/computer.json index 744a6940..ab467129 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/models/item/computer.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/models/item/computer.json @@ -1,3 +1,3 @@ { - "parent": "antarchy:block/computer" + "parent": "builtin/entity" } diff --git a/common-1.21.1/src/main/resources/assets/antarchy/sounds.json b/common-1.21.1/src/main/resources/assets/antarchy/sounds.json index 73086df5..dd7b67a2 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/sounds.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/sounds.json @@ -2850,6 +2850,14 @@ } ] }, + "king_ice_spikes": { + "subtitle": "subtitles.antarchy.king_ice_spikes", + "sounds": [ + { + "name": "antarchy:mob/king/ice_spikes" + } + ] + }, "king_decree_cast": { "subtitle": "subtitles.antarchy.king_decree_cast", "sounds": [ diff --git a/common-1.21.1/src/main/resources/assets/antarchy/sounds/mob/king/death.ogg b/common-1.21.1/src/main/resources/assets/antarchy/sounds/mob/king/death.ogg index d3a7526a17123ab07befe74479f699eed87519a9..fd33709873cae7f005198cd78dc23e5a0dd3f7af 100644 GIT binary patch literal 180834 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 literal 55025 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 b001z60RR910000000000001li0D7nj0}{re literal 46414 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 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/sounds/mob/king/ice_spikes.ogg b/common-1.21.1/src/main/resources/assets/antarchy/sounds/mob/king/ice_spikes.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9b027e400e17518fdddf53b662dcc5891d81ca53 GIT binary patch literal 70901 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

b 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 N4h{|u4h{|u4h}mk|H%LV literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/computer.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..8ebda321d0b0ee517f8746241a8a557b85fad2e2 GIT binary patch literal 2156 zcmb7Fc{J3E7yr_fEles)dA2i5$daEt+sqhmgor{W4Dv$^#=c}5qmm_*ts!d^BBLRO zr(x*lNt30JZ3c~H$`a#^B{Y81Iq&@b|J`%${hWL5{oHfU=bU?P`c*qianUoP004+v zTcI5INciQ#$N2Fr+>6c!fd~gnbAU7`|Bau3{E%0W06=~ycHniCpNoWAxkLbf#M@sk z&=*qc0|3GT)+nUYZI3mEr$59(L1@F1t^6+&fN5iTlwGtV*nf?HNV%I5$a$P9IVAycUu8cs?N3sFY%cpMH1l1n#lGZz66 z{~`E0X^z%9`}?*}6d2A1D+;4m1(e>~+kGTEMzo4(ArunDfsW5Q+k#+fnIJ821KOln zTwc<&cGOU@a@-Lx+uOPbI0+?#OU)tzr`(0+dVjmV-`9ubj~k=XN8oA-9oHI$z3r*s zudZZ?Inp|ez}UMWoQbY*wt#T~qFDJS#%iXjCq$8QLqo_z1QbKw1~BCCm6_V{j$A8k zu`i;Gx=)+B!VIiU%F#bsq>3gkU*9Qki^lAi!go-tBW&CGp1bHxA{;T&wy|7r@O+j& zUG*%?Mxv501%LDp^`%4hN(-qehGB$j-WsCShfi?tl$zS+cdB)@eZ-GaH`F*47sI*rrP!}~#3}>~#B>tKo|6tG4UV;{c16;QbX1J|&1vRGU zWe~6Iei#xWaMiu*%ad)D8s~DZ0&N>RcZq7374W>?29fwZoup^?SX68&27aH(vGxkX zR(aHT!VarT*3J!{ZlyL!)oPuV&g|`#{G}WRDpJrFCjv|*=0eN=I2i1vb$3tq#65}m zI_Kr>fd7U?XNvb8JpXT(z0;?P~l=5Hmf3U;!-NwHg~cz4b{ku3fW4g-xka7 z)au}uXgCFj3{y4XOm)g&7ah7k72rl!9urOPFa&pHsjrudCL^9k5-rzFy=t8{oa-&> zJw3%1ORzWPK$}2l!)FOqU^hwN9a|~oJHE<85_cSY3pm&;^2;KVk0)}kA!im|G><8( zRIZHEN$fN_*gA0k8rdYZ(2v+N8i0H6((3d+F^X#5&cH=(E->|tjh8f;2CaFy|4zGy zt~*ybUb|b!ij`&etBbldNaI>oWwIHq{l=xmqd~3b^5oRq*LN?YP}9?YCcNvE3vkkO z*V4{d#K6_cEfa#3C~+LuO5saV8g90DpJwmKIU4>`RHIGa!T-G)l9lA~Q-=9xl+DaD)VK+^ zcNP%?6Efj(hO$;3zNvRI5T+-`x_-SVJipIX>b%Yq(Mp z&wFx9UgvD%nWUd|DJG}+ZKP_FbrsXCXYz;%WrTj%Q22xTN}d+%PP^hNsARi?*r>?q z_gM_`)qoKuw#G>Y>1qC~nZqH40Ce%GOG7t}%pL(7-Z~&Nc^F`_$?nSx(e7;I)D%LA z;yq2^Q87;Imy6kRMaUasu&|6OA#nOU;Z+}KYCojwmb}SDzgt1OHxl#i`uXl4QsH|K zrc)dS;kVfxw8I}&<=Kkm7n=5?1!?y7w5r2FXQ+#2@|=D2>>vgo8Tmo4FUF>-%A2pf zvP2og3;+#JE)Ngf%3E%UnqmZL)WqRRgAIz8{w6?l%a3w3GQFQ!M0u<>q`*SiA)r3vjpm2p69``A#XnKs?#P2EBMl`~|SNAZG2>5I9e zd+G5&qk3_MZg!4ZG?j4qvcn3LBRx!qy&)!!)Q$x^)-$UW@dw>8ti-&Y;{g8rstjUA zd}Q)$l0G9B0}q}Iy5BT;+*glxa=rM}lv`t$kFEWJf5T@3&sm3ttJ?JaO_=*)IWmWi zAS8U;E%sK`X&C>y`E=H0JALG%cZ^(-?Z)NNs8VNi=km%dO)Bh!9>^>~S6n_+m>`e} z$o>LiT5_6|?~_#I&D;DsHiA3he(c1xM@qw6r7?oJQb5~L(D1iaClz$HhW5}t6sc0F zi&J}OD@T2~6lH9Dz3T;pMX{6wU#+Ry5AH{9r@Q{s5G&zCtq>xh%z)#D)4}fowP)62 zZ+ERdcO$G>Kz?H7?+H= dimension fields (see - // AntarchyConfigModuleFabric.isSupported) and are intentionally skipped here — they're - // structural dimension identity, not a tuning knob, and Cloth Config has no natural - // widget for them. Every other supported type is exactly what's already persisted to - // JSON today, so nothing shown here can drift from what the JSON files contain. } private static String displayName(ConfigSection section) { diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java index 5bfa7cf5..8151b5b8 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java @@ -36,6 +36,11 @@ public final class AntarchyFabricClientNetworking { } public static void register() { + ClientPlayNetworking.registerGlobalReceiver(AntmailResultPayload.TYPE, (payload, context) -> + context.client().execute(() -> com.craisinlord.antarchy.content.client.AntmailClientState.update(payload))); + ClientPlayNetworking.registerGlobalReceiver(ComputerAccessResultPayload.TYPE, (payload, context) -> + context.client().execute(() -> com.craisinlord.antarchy.content.client.ComputerAccessClientState.update(payload))); + com.craisinlord.antarchy.content.network.ComputerNetworking.setSender(ServerPlayNetworking::send); ClientPlayNetworking.registerGlobalReceiver(GravityStatePayload.TYPE, (payload, context) -> context.client().execute(() -> AntarchyFabricNetworking.handleGravityState(context.player(), payload))); ClientPlayNetworking.registerGlobalReceiver(BloodglassStatePayload.TYPE, (payload, context) -> diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java index 3b6af52d..97a3cf2f 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java @@ -49,6 +49,9 @@ public final class AntarchyFabricNetworking { public static void register() { registerPayloadTypes(); registerServerReceivers(); + com.craisinlord.antarchy.content.network.ComputerAccessHandler.setResultSender(ServerPlayNetworking::send); + com.craisinlord.antarchy.content.network.AntmailServerHandler.setResultSender(ServerPlayNetworking::send); + com.craisinlord.antarchy.content.network.ComputerNetworking.setSender(ServerPlayNetworking::send); } public static void bootstrapMultipartCommon() { @@ -72,6 +75,8 @@ public final class AntarchyFabricNetworking { } private static void registerPayloadTypes() { + PayloadTypeRegistry.playS2C().register(ComputerAccessResultPayload.TYPE, ComputerAccessResultPayload.STREAM_CODEC); + PayloadTypeRegistry.playS2C().register(AntmailResultPayload.TYPE, AntmailResultPayload.STREAM_CODEC); PayloadTypeRegistry.playS2C().register(GravityStatePayload.TYPE, GravityStatePayload.STREAM_CODEC); PayloadTypeRegistry.playS2C().register(BloodglassStatePayload.TYPE, BloodglassStatePayload.STREAM_CODEC); PayloadTypeRegistry.playS2C().register(TigerEyeCamouflageStatePayload.TYPE, TigerEyeCamouflageStatePayload.STREAM_CODEC); @@ -104,9 +109,24 @@ public final class AntarchyFabricNetworking { PayloadTypeRegistry.playC2S().register(HerculesBeetleMountedChargePayload.TYPE, HerculesBeetleMountedChargePayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(MultipartAttackPayload.TYPE, MultipartAttackPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(MultipartInteractPayload.TYPE, MultipartInteractPayload.STREAM_CODEC); + PayloadTypeRegistry.playC2S().register(ComputerAccessPayload.TYPE, ComputerAccessPayload.STREAM_CODEC); + PayloadTypeRegistry.playC2S().register(AntmailSetupPayload.TYPE, AntmailSetupPayload.STREAM_CODEC); + PayloadTypeRegistry.playC2S().register(AntmailStateRequestPayload.TYPE, AntmailStateRequestPayload.STREAM_CODEC); + PayloadTypeRegistry.playC2S().register(AntmailSendPayload.TYPE, AntmailSendPayload.STREAM_CODEC); + PayloadTypeRegistry.playC2S().register(AntmailReadPayload.TYPE, AntmailReadPayload.STREAM_CODEC); } private static void registerServerReceivers() { + ServerPlayNetworking.registerGlobalReceiver(ComputerAccessPayload.TYPE, (payload, context) -> + context.server().execute(() -> ComputerAccessHandler.handle(context.player(), payload))); + ServerPlayNetworking.registerGlobalReceiver(AntmailSetupPayload.TYPE, (payload, context) -> + context.server().execute(() -> AntmailServerHandler.handle(context.player(), payload))); + ServerPlayNetworking.registerGlobalReceiver(AntmailStateRequestPayload.TYPE, (payload, context) -> + context.server().execute(() -> AntmailServerHandler.handle(context.player(), payload))); + ServerPlayNetworking.registerGlobalReceiver(AntmailSendPayload.TYPE, (payload, context) -> + context.server().execute(() -> AntmailServerHandler.handle(context.player(), payload))); + ServerPlayNetworking.registerGlobalReceiver(AntmailReadPayload.TYPE, (payload, context) -> + context.server().execute(() -> AntmailServerHandler.handle(context.player(), payload))); ServerPlayNetworking.registerGlobalReceiver(GravityGunPrimaryPayload.TYPE, (payload, context) -> context.server().execute(() -> handleGravityGunPrimary(context.player(), payload))); ServerPlayNetworking.registerGlobalReceiver(PortalGunPrimaryPayload.TYPE, (payload, context) -> diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java index 80d3b06c..e3062ff3 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java @@ -1548,9 +1548,6 @@ public final class AntarchyFabricItems { () -> new EyeOfTheStormItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.EPIC))); - // Temporarily disabled: keeping the code but not registering the item for now. - // public static final DeferredItem MINERS_DREAM = ITEMS.register("miners_dream", - // () -> new MinersDreamItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); public static final DeferredItem SQUIDZOOKA = ITEMS.register("squidzooka", diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java index 9ce98be8..3a49ea45 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java @@ -542,6 +542,7 @@ public final class AntarchyFabricSounds { public static final DeferredHolder KING_DEATH = registerSoundEvent("king_death"); public static final DeferredHolder KING_BEAM_SHOOT = registerSoundEvent("king_beam_shoot"); public static final DeferredHolder KING_FIREBALL_SHOOT = registerSoundEvent("king_fireball_shoot"); + public static final DeferredHolder KING_ICE_SPIKES = registerSoundEvent("king_ice_spikes"); public static final DeferredHolder KING_DECREE_CAST = registerSoundEvent("king_decree_cast"); public static final DeferredHolder KING_DECREE = registerSoundEvent("king_decree"); public static final DeferredHolder KING_SUCCESS = registerSoundEvent("king_success"); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java index 7410a6c5..8597e4b7 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java @@ -216,6 +216,7 @@ public class AntarchyNeoforge { AntarchyNeoforgeSounds.QUEEN_ROAR, AntarchyNeoforgeSounds.KING_BEAM_SHOOT, AntarchyNeoforgeSounds.KING_FIREBALL_SHOOT, + AntarchyNeoforgeSounds.KING_ICE_SPIKES, AntarchyNeoforgeSounds.KING_DECREE_CAST, AntarchyNeoforgeSounds.QUEEN_BEAM_SHOOT, AntarchyNeoforgeSounds.QUEEN_BEAM_START, @@ -287,6 +288,12 @@ public class AntarchyNeoforge { AntarchyNeoforgeCreativeModeTabs.register(modEventBus); AntarchyNeoforgeEntityAttributes.register(modEventBus); AntarchyNeoforgePayloadHandlers.register(modEventBus); + com.craisinlord.antarchy.content.network.ComputerNetworking.setSender(payload -> + net.neoforged.neoforge.network.PacketDistributor.sendToServer(payload)); + com.craisinlord.antarchy.content.network.ComputerAccessHandler.setResultSender((player, payload) -> + net.neoforged.neoforge.network.PacketDistributor.sendToPlayer(player, payload)); + com.craisinlord.antarchy.content.network.AntmailServerHandler.setResultSender((player, payload) -> + net.neoforged.neoforge.network.PacketDistributor.sendToPlayer(player, payload)); Antarchy.init(); } diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java index 05116ff3..cfbc793b 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java @@ -1020,9 +1020,6 @@ public final class AntarchyNeoforgeItems { )); public static final DeferredItem EYE_OF_THE_STORM = ITEMS.register("eye_of_the_storm", () -> new EyeOfTheStormItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.EPIC))); - // Temporarily disabled: keeping the code but not registering the item for now. - // public static final DeferredItem MINERS_DREAM = ITEMS.register("miners_dream", - // () -> new MinersDreamItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); public static final DeferredItem SQUIDZOOKA = ITEMS.register("squidzooka", () -> new SquidzookaItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.RARE))); public static final DeferredItem RPO_LAUNCHER = ITEMS.register("rpo_launcher", diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java index a93253ee..30a52e9f 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java @@ -1,7 +1,17 @@ package com.craisinlord.antarchy.neoforge.registry; import com.craisinlord.antarchy.content.network.BloodCrystalKatanaTrailPayload; +import com.craisinlord.antarchy.content.network.ComputerAccessHandler; +import com.craisinlord.antarchy.content.network.ComputerAccessPayload; +import com.craisinlord.antarchy.content.network.ComputerAccessResultPayload; import com.craisinlord.antarchy.content.network.ToggleTigerEyeCamouflagePayload; +import com.craisinlord.antarchy.content.network.AntmailPayloadTypes; +import com.craisinlord.antarchy.content.network.AntmailSetupPayload; +import com.craisinlord.antarchy.content.network.AntmailStateRequestPayload; +import com.craisinlord.antarchy.content.network.AntmailSendPayload; +import com.craisinlord.antarchy.content.network.AntmailReadPayload; +import com.craisinlord.antarchy.content.network.AntmailResultPayload; +import com.craisinlord.antarchy.content.network.AntmailServerHandler; import com.craisinlord.antarchy.content.item.TigerEyeArmorUtil; import com.craisinlord.antarchy.content.tigereye.TigerEyeCamouflageController; import com.craisinlord.antarchy.neoforge.network.AntarchyGravityNetworking; @@ -23,6 +33,38 @@ public class AntarchyNeoforgePayloadHandlers { static void registerPayloadHandlers(RegisterPayloadHandlersEvent event) { var registrar = event.registrar("1"); + registrar.playToServer( + ComputerAccessPayload.TYPE, + ComputerAccessPayload.STREAM_CODEC, + (payload, ctx) -> ctx.enqueueWork(() -> { + if (ctx.player() instanceof net.minecraft.server.level.ServerPlayer player) { + ComputerAccessHandler.handle(player, payload); + } + }) + ); + registrar.playToServer(AntmailSetupPayload.TYPE, AntmailSetupPayload.STREAM_CODEC, + (payload, ctx) -> ctx.enqueueWork(() -> { + if (ctx.player() instanceof net.minecraft.server.level.ServerPlayer player) AntmailServerHandler.handle(player, payload); + })); + registrar.playToServer(AntmailStateRequestPayload.TYPE, AntmailStateRequestPayload.STREAM_CODEC, + (payload, ctx) -> ctx.enqueueWork(() -> { + if (ctx.player() instanceof net.minecraft.server.level.ServerPlayer player) AntmailServerHandler.handle(player, payload); + })); + registrar.playToServer(AntmailSendPayload.TYPE, AntmailSendPayload.STREAM_CODEC, + (payload, ctx) -> ctx.enqueueWork(() -> { + if (ctx.player() instanceof net.minecraft.server.level.ServerPlayer player) AntmailServerHandler.handle(player, payload); + })); + registrar.playToServer(AntmailReadPayload.TYPE, AntmailReadPayload.STREAM_CODEC, + (payload, ctx) -> ctx.enqueueWork(() -> { + if (ctx.player() instanceof net.minecraft.server.level.ServerPlayer player) AntmailServerHandler.handle(player, payload); + })); + registrar.playToClient(AntmailResultPayload.TYPE, AntmailResultPayload.STREAM_CODEC, + (payload, ctx) -> ctx.enqueueWork(() -> com.craisinlord.antarchy.content.client.AntmailClientState.update(payload))); + registrar.playToClient( + ComputerAccessResultPayload.TYPE, + ComputerAccessResultPayload.STREAM_CODEC, + (payload, ctx) -> ctx.enqueueWork(() -> com.craisinlord.antarchy.content.client.ComputerAccessClientState.update(payload)) + ); AntarchyGravityNetworking.register(registrar); AntarchyTimeDilationNetworking.register(registrar); BrutalflyElytraNetworking.register(registrar); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java index 81990f7c..9dadc728 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java @@ -225,6 +225,7 @@ public final class AntarchyNeoforgeSounds { public static final DeferredHolder KING_DEATH = registerSoundEvent("king_death"); public static final DeferredHolder KING_BEAM_SHOOT = registerSoundEvent("king_beam_shoot"); public static final DeferredHolder KING_FIREBALL_SHOOT = registerSoundEvent("king_fireball_shoot"); + public static final DeferredHolder KING_ICE_SPIKES = registerSoundEvent("king_ice_spikes"); public static final DeferredHolder KING_DECREE_CAST = registerSoundEvent("king_decree_cast"); public static final DeferredHolder KING_DECREE = registerSoundEvent("king_decree"); public static final DeferredHolder KING_SUCCESS = registerSoundEvent("king_success");