From 8bc766d13e13bceb72932ad861f8c9f782f9dee5 Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 23 Sep 2024 17:32:08 +0200 Subject: [PATCH 01/24] [IntelligenceModding/Advanced-Peripherals-Features#59] Keyboard item and simple screen to unlock the mouse --- .../client/ClientRegistry.java | 2 + .../client/screens/KeyboardScreen.java | 46 +++++++++++++++++++ .../common/container/KeyboardContainer.java | 24 ++++++++++ .../common/items/KeyboardItem.java | 40 ++++++++++++++++ .../common/items/base/BaseItem.java | 6 ++- .../common/setup/APContainerTypes.java | 7 +++ .../common/setup/APItems.java | 1 + 7 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index 27c1f9e51..9aad89936 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -5,6 +5,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.renderer.DistanceDetectorRenderer; import de.srendi.advancedperipherals.client.screens.InventoryManagerScreen; +import de.srendi.advancedperipherals.client.screens.KeyboardScreen; import de.srendi.advancedperipherals.client.screens.SaddleTurtleScreen; import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen; import de.srendi.advancedperipherals.client.smartglasses.OverlayModuleOverlay; @@ -43,6 +44,7 @@ public static void registerModels(ModelEvent.RegisterAdditional event) { public static void onClientSetup(FMLClientSetupEvent event) { MenuScreens.register(APContainerTypes.INVENTORY_MANAGER_CONTAINER.get(), InventoryManagerScreen::new); MenuScreens.register(APContainerTypes.SMART_GLASSES_CONTAINER.get(), SmartGlassesScreen::new); + MenuScreens.register(APContainerTypes.KEYBOARD_CONTAINER.get(), KeyboardScreen::new); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.CHUNKY_TURTLE.get(), TurtleUpgradeModeller.flatItem()); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.COMPASS_TURTLE.get(), TurtleUpgradeModeller.flatItem()); diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java new file mode 100644 index 000000000..8c44430c5 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -0,0 +1,46 @@ +package de.srendi.advancedperipherals.client.screens; + +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.client.screens.base.BaseScreen; +import de.srendi.advancedperipherals.common.container.KeyboardContainer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import org.jetbrains.annotations.NotNull; + +/** + * A simple screen but without any rendering calls. Used to unlock the mouse so we can freely write stuff + */ +public class KeyboardScreen extends BaseScreen { + + public KeyboardScreen(KeyboardContainer screenContainer, Inventory inv, Component titleIn) { + super(screenContainer, inv, titleIn); + } + + @Override + public void render(@NotNull PoseStack matrixStack, int x, int y, float partialTicks) { + } + + @Override + protected void renderBg(@NotNull PoseStack matrixStack, float partialTicks, int x, int y) { + } + + @Override + public void renderBackground(@NotNull PoseStack pPoseStack) { + } + + @Override + public int getSizeX() { + return 256; + } + + @Override + public int getSizeY() { + return 256; + } + + @Override + public ResourceLocation getTexture() { + return null; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java new file mode 100644 index 000000000..53f98bc5c --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java @@ -0,0 +1,24 @@ +package de.srendi.advancedperipherals.common.container; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.container.base.BaseContainer; +import de.srendi.advancedperipherals.common.setup.APContainerTypes; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +public class KeyboardContainer extends BaseContainer { + + public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level) { + super(APContainerTypes.KEYBOARD_CONTAINER.get(), id, inventory, pos, level); + AdvancedPeripherals.debug("test"); + } + + @Override + public boolean stillValid(@NotNull Player playerIn) { + return true; + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java new file mode 100644 index 000000000..1708096c2 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -0,0 +1,40 @@ +package de.srendi.advancedperipherals.common.items; + +import de.srendi.advancedperipherals.common.container.KeyboardContainer; +import de.srendi.advancedperipherals.common.items.base.BaseItem; +import de.srendi.advancedperipherals.common.items.base.IInventoryItem; +import net.minecraft.network.chat.Component; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class KeyboardItem extends BaseItem implements IInventoryItem { + + public KeyboardItem() { + super(new Properties().stacksTo(1)); + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public MenuProvider createContainer(Player playerEntity, ItemStack itemStack) { + return new MenuProvider() { + @NotNull + @Override + public Component getDisplayName() { + return Component.literal(""); + } + + @Override + public AbstractContainerMenu createMenu(int pContainerId, @NotNull Inventory playerInv, @NotNull Player player) { + return new KeyboardContainer(pContainerId, playerInv, player.blockPosition(), player.getLevel()); + } + }; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java index bc95f02d1..1645898f4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java @@ -39,7 +39,11 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (this instanceof IInventoryItem inventoryItem) { ServerPlayer serverPlayerEntity = (ServerPlayer) playerIn; ItemStack stack = playerIn.getItemInHand(handIn); - NetworkHooks.openScreen(serverPlayerEntity, inventoryItem.createContainer(playerIn, stack), buf -> buf.writeItem(stack)); + NetworkHooks.openScreen(serverPlayerEntity, inventoryItem.createContainer(playerIn, stack), buf -> { + buf.writeBlockPos(playerIn.blockPosition()); + buf.writeItem(stack); + } + ); } return super.use(worldIn, playerIn, handIn); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java index b51d363b3..e50f7a866 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java @@ -3,6 +3,7 @@ import dan200.computercraft.shared.network.container.ComputerContainerData; import dan200.computercraft.shared.network.container.ContainerData; import de.srendi.advancedperipherals.common.container.InventoryManagerContainer; +import de.srendi.advancedperipherals.common.container.KeyboardContainer; import de.srendi.advancedperipherals.common.container.SmartGlassesContainer; import net.minecraft.core.BlockPos; import net.minecraft.world.inventory.MenuType; @@ -18,6 +19,12 @@ public class APContainerTypes { return new InventoryManagerContainer(windowId, inv, pos, level); })); + public static final RegistryObject> KEYBOARD_CONTAINER = APRegistration.CONTAINER_TYPES.register("keyboard_container", () -> IForgeMenuType.create((windowId, inv, data) -> { + BlockPos pos = data.readBlockPos(); + Level level = inv.player.getCommandSenderWorld(); + return new KeyboardContainer(windowId, inv, pos, level); + })); + public static final RegistryObject> SMART_GLASSES_CONTAINER = APRegistration.CONTAINER_TYPES.register("smart_glasses_container", () -> ContainerData.toType(ComputerContainerData::new, (id, inv, data) -> new SmartGlassesContainer(id, player -> true, null, data, inv, data.displayStack()) )); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java index 23ba2dc15..77347e515 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java @@ -18,6 +18,7 @@ public class APItems { public static final RegistryObject OVERLAY_MODULE = APRegistration.ITEMS.register("overlay_module", OverlayGlassesItem::new); public static final RegistryObject HOTKEY_MODULE = APRegistration.ITEMS.register("hotkey_module", HotkeyModuleItem::new); public static final RegistryObject NIGHT_VISION_MODULE = APRegistration.ITEMS.register("nightvision_module", NightVisionModuleItem::new); + public static final RegistryObject KEYBOARD = APRegistration.ITEMS.register("keyboard", KeyboardItem::new); public static final RegistryObject COMPUTER_TOOL = APRegistration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), () -> true)); public static final RegistryObject MEMORY_CARD = APRegistration.ITEMS.register("memory_card", MemoryCardItem::new); public static final RegistryObject END_AUTOMATA_CORE = APRegistration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); From 6695fda9f108ae20c4068eb8174f367524104be1 Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 23 Sep 2024 17:39:17 +0200 Subject: [PATCH 02/24] Remove custom indentation --- .../advancedperipherals/common/items/base/BaseItem.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java index 1645898f4..e2a7018c0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java @@ -40,10 +40,9 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In ServerPlayer serverPlayerEntity = (ServerPlayer) playerIn; ItemStack stack = playerIn.getItemInHand(handIn); NetworkHooks.openScreen(serverPlayerEntity, inventoryItem.createContainer(playerIn, stack), buf -> { - buf.writeBlockPos(playerIn.blockPosition()); - buf.writeItem(stack); - } - ); + buf.writeBlockPos(playerIn.blockPosition()); + buf.writeItem(stack); + }); } return super.use(worldIn, playerIn, handIn); } From 027787b14537f12686118b7e9c90fd80cba6d19a Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 23 Sep 2024 21:21:40 +0200 Subject: [PATCH 03/24] Binding/Unbinding for the keyboard --- .../common/items/KeyboardItem.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index 1708096c2..b836fb4b1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -1,18 +1,31 @@ package de.srendi.advancedperipherals.common.items; +import dan200.computercraft.shared.computer.blocks.TileComputerBase; import de.srendi.advancedperipherals.common.container.KeyboardContainer; import de.srendi.advancedperipherals.common.items.base.BaseItem; import de.srendi.advancedperipherals.common.items.base.IInventoryItem; +import de.srendi.advancedperipherals.common.util.NBTUtil; +import de.srendi.advancedperipherals.common.util.SideHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; public class KeyboardItem extends BaseItem implements IInventoryItem { + private static final String BIND_TAG = "bind"; + public KeyboardItem() { super(new Properties().stacksTo(1)); } @@ -22,6 +35,49 @@ public boolean isEnabled() { return true; } + @NotNull + @Override + public InteractionResult useOn(UseOnContext context) { + if (context.getPlayer() == null) + return InteractionResult.PASS; + + if (SideHelper.isClientPlayer(context.getPlayer())) + return InteractionResult.PASS; + + if (!context.getPlayer().isShiftKeyDown()) + return InteractionResult.PASS; + + BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); + if (entity instanceof TileComputerBase) { + bind(context.getPlayer(), context.getItemInHand(), context.getClickedPos()); + } else { + clear(context.getPlayer(), context.getItemInHand()); + } + return super.useOn(context); + } + + @Override + public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + // Used to prevent the menu from opening when we just want to bind/unbind the keyboard + if (!playerIn.isShiftKeyDown()) + return super.use(worldIn, playerIn, handIn); + + return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); + } + + private void bind(Player player, ItemStack itemStack, BlockPos pos) { + CompoundTag tag = NBTUtil.toNBT(pos); + + itemStack.getOrCreateTag().put(BIND_TAG, tag); + player.sendSystemMessage(Component.literal("Bound to " + pos.toShortString())); + } + + private void clear(Player player, ItemStack itemStack) { + itemStack.getOrCreateTag().remove(BIND_TAG); + + player.sendSystemMessage(Component.literal("Unbound")); + } + @Override public MenuProvider createContainer(Player playerEntity, ItemStack itemStack) { return new MenuProvider() { From 19f4de9dc15575e5710bd67780f2d1b29ed32fb8 Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 23 Sep 2024 21:43:47 +0200 Subject: [PATCH 04/24] Use translatable components and add name and description for the keyboard Also fixed colored messages for the memory card and cleaned up the translation keys --- build.gradle | 3 +- .../67cce32b1c3cbbcb1f646605f4914e3f196986c2 | 34 +++++++++---------- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +-- .../advancedperipherals/lang/en_us.json | 12 ++++--- .../loot_tables/blocks/distance_detector.json | 6 ++++ .../loot_tables/blocks/fluid_detector.json | 6 ++++ .../loot_tables/blocks/gas_detector.json | 6 ++++ .../common/data/EnUsLanguageProvider.java | 13 ++++--- .../common/items/KeyboardItem.java | 18 ++++++++-- .../common/items/MemoryCardItem.java | 6 ++-- 10 files changed, 74 insertions(+), 34 deletions(-) diff --git a/build.gradle b/build.gradle index b176a7695..945deb8f1 100644 --- a/build.gradle +++ b/build.gradle @@ -314,11 +314,12 @@ dependencies { compileOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") compileOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") // IMPORTANT. This should be removed/commented when running `runData` - runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") + /*runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}") runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") + */ // Patchouli compileOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}") diff --git a/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 index fe9b9c502..27846ef32 100644 --- a/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 +++ b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 @@ -1,17 +1,17 @@ -// 1.19.2 2024-05-28T14:53:16.656615 LootTables -d865e8ac35302c486faf5c7122569c554186186d data/advancedperipherals/loot_tables/blocks/block_reader.json -a6f896cc3dbd8da12737825ec71e32970f54025c data/advancedperipherals/loot_tables/blocks/chat_box.json -f50f506ae1987537f76be4c05a81689b25798f91 data/advancedperipherals/loot_tables/blocks/colony_integrator.json -4dcad851450e4ddd8d28a0017a417bf6e5579bda data/advancedperipherals/loot_tables/blocks/distance_detector.json -1d1b858d09538dc66bab2c33a2f9c58361a9c472 data/advancedperipherals/loot_tables/blocks/energy_detector.json -317004b1358ef9bf83957d2d6796529a226161c7 data/advancedperipherals/loot_tables/blocks/environment_detector.json -df6186990887f77b7db37ebb8ee50a7e7f096b0a data/advancedperipherals/loot_tables/blocks/fluid_detector.json -cea5a036d4ccdcc6ef026d1a226b5e13f1060676 data/advancedperipherals/loot_tables/blocks/gas_detector.json -d5a3964f518b138cbd7305c819a36af3d9340e4a data/advancedperipherals/loot_tables/blocks/geo_scanner.json -8aa1deea908fd02f049e047c8ca16679bbef68a2 data/advancedperipherals/loot_tables/blocks/inventory_manager.json -9a2898a63e2e0c087ce8eba211c63d1c8b9fd4aa data/advancedperipherals/loot_tables/blocks/me_bridge.json -973770040bacb61482adb9739fd1d977f16c107f data/advancedperipherals/loot_tables/blocks/nbt_storage.json -b4b80e8c9d62b53d9252cdfc5918c077d3a01f6e data/advancedperipherals/loot_tables/blocks/peripheral_casing.json -58b6adbea5d4ae43ed9af0b627df2b8a4907acde data/advancedperipherals/loot_tables/blocks/player_detector.json -a58aebcc52684302968e7af4f50a12aff93aaf2d data/advancedperipherals/loot_tables/blocks/redstone_integrator.json -0ef1678f88b8fcb744bfd95261f66745340be8f4 data/advancedperipherals/loot_tables/blocks/rs_bridge.json +// 1.19.2 2024-09-23T21:28:44.4809605 LootTables +618b63c020ab64890c8a2d2506dd61cd30259a44 data/advancedperipherals/loot_tables/blocks/block_reader.json +0923665563d05307a7fa7d711a2d7a994a31eb6e data/advancedperipherals/loot_tables/blocks/chat_box.json +bf2a80256cfba0bd8c0283d493882e5816882f1f data/advancedperipherals/loot_tables/blocks/colony_integrator.json +cff4b81aa381bc0d1172b0a4c8bb35c1b954a018 data/advancedperipherals/loot_tables/blocks/distance_detector.json +1c5dbe1a8e07e040a3c2893a002cd535ee41dc20 data/advancedperipherals/loot_tables/blocks/energy_detector.json +8cc03eca1d191f725bc558836f26a85a466cb127 data/advancedperipherals/loot_tables/blocks/environment_detector.json +12589e7642b383029457d97a64637494ea8507a3 data/advancedperipherals/loot_tables/blocks/fluid_detector.json +421a3ece56485bd46374844639bfd606ce4665ec data/advancedperipherals/loot_tables/blocks/gas_detector.json +a2ae352dce564b878daecf47026f268dd432fbcf data/advancedperipherals/loot_tables/blocks/geo_scanner.json +807d449d02c0af701f84d3e806ebac20d3a1f91c data/advancedperipherals/loot_tables/blocks/inventory_manager.json +bb9b442dfad1d5f31397585c8394c85243fa169a data/advancedperipherals/loot_tables/blocks/me_bridge.json +52b1fe2e265be456ebf48d7e0d9ebcc8c994176f data/advancedperipherals/loot_tables/blocks/nbt_storage.json +2651e6053857a31f5bccc360969924848a197ad5 data/advancedperipherals/loot_tables/blocks/peripheral_casing.json +6b5058b6bc49689bf2b858b89f3981a4bb681750 data/advancedperipherals/loot_tables/blocks/player_detector.json +6af6542c7b64aa22dbfcdb01299daf4911827a49 data/advancedperipherals/loot_tables/blocks/redstone_integrator.json +b221c6a82da0875264a112b54f847ac6a1f36797 data/advancedperipherals/loot_tables/blocks/rs_bridge.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index ea5891f84..8cf74a4f3 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2024-05-28T14:53:16.658014 Languages: en_us -2580077212426421e05822910bde2edff88e2346 assets/advancedperipherals/lang/en_us.json +// 1.19.2 2024-09-23T21:38:21.973108 Languages: en_us +03b7b20272b605dc01218ad17a0f8259e91ad45d assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index 4533665e0..89596b232 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -39,6 +39,7 @@ "item.advancedperipherals.end_automata_core": "End Automata Core", "item.advancedperipherals.hotkey_module": "Hotkey Module", "item.advancedperipherals.husbandry_automata_core": "Husbandry Automata Core", + "item.advancedperipherals.keyboard": "Keyboard", "item.advancedperipherals.memory_card": "Memory Card", "item.advancedperipherals.nightvision_module": "Night Vision Module", "item.advancedperipherals.overlay_module": "Overlay Module", @@ -48,6 +49,7 @@ "item.advancedperipherals.smart_glasses": "Smart Glasses", "item.advancedperipherals.smart_glasses_interface": "Smart Glasses Interface", "item.advancedperipherals.smart_glasses_netherite": "Netherite reinforced Smart Glasses", + "item.advancedperipherals.tooltip.binding.boundto": "&7Bound to &b%s&7.", "item.advancedperipherals.tooltip.block_reader": "&7Reads nbt data of blocks to interact with blocks which do not have computer support.", "item.advancedperipherals.tooltip.chat_box": "&7Interacts with the ingame chat, can read and write messages.", "item.advancedperipherals.tooltip.chunk_controller": "&7A crafting ingredient for the Chunky Turtle.", @@ -60,14 +62,14 @@ "item.advancedperipherals.tooltip.geo_scanner": "&7Scans the area around it to find some shiny ores.", "item.advancedperipherals.tooltip.husbandry_automata_core": "&7Upgrade for turtles, that allows basic and advanced interactions with animals.", "item.advancedperipherals.tooltip.inventory_manager": "&7This block is able to send or receive specific items from a player inventory.", + "item.advancedperipherals.tooltip.keyboard": "&7Can be bound to a computer, used to type something on a computer without the need to open the computer.", "item.advancedperipherals.tooltip.me_bridge": "&7The ME Bridge interacts with Applied Energistics to manage your items.", "item.advancedperipherals.tooltip.memory_card": "&7Can save the rights of a player to use it in an inventory manager.", - "item.advancedperipherals.tooltip.memory_card.bound": "&7Bound to &b%s&7.", "item.advancedperipherals.tooltip.nbt_storage": "&7Acts like a storage disk. Can store nbt based data.", "item.advancedperipherals.tooltip.overpowered_end_automata_core": "&7Improved version of the end automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", "item.advancedperipherals.tooltip.overpowered_husbandry_automata_core": "&7Improved version of the husbandry automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", "item.advancedperipherals.tooltip.overpowered_weak_automata_core": "&7Improved version of the weak automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", - "item.advancedperipherals.tooltip.peripheral_casing": "&7An empty hull without the love it deserves. Used as crafting ingredient", + "item.advancedperipherals.tooltip.peripheral_casing": "&7An empty hull without the love it deserves. Used as crafting ingredient.", "item.advancedperipherals.tooltip.player_detector": "&7This peripheral can be used to interact with players, but don't be a stalker.", "item.advancedperipherals.tooltip.redstone_integrator": "&7This block is able to interact with redstone. Works exactly like the redstone api of an computer.", "item.advancedperipherals.tooltip.rs_bridge": "&7The RS Bridge interacts with Refined Storage to manage your items.", @@ -82,9 +84,11 @@ "pocket.advancedperipherals.environment_pocket": "Environment", "pocket.advancedperipherals.geoscanner_pocket": "Geo", "pocket.advancedperipherals.player_pocket": "Player Detector", - "text.advancedperipherals.added_player": "Added you to the memory card", "text.advancedperipherals.automata_core_feed_by_player": "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?", - "text.advancedperipherals.removed_player": "Cleared the memory card", + "text.advancedperipherals.bind_keyboard": "&7Bound to &b%s&7", + "text.advancedperipherals.bind_memorycard": "&7Added you to the memory card", + "text.advancedperipherals.cleared_keyboard": "&7Bind removed", + "text.advancedperipherals.cleared_memorycard": "&7Cleared the memory card", "text.advancedperipherals.saddle_turtle_dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", "text.advancedperipherals.smart_glasses.modules": "Modules", "text.advancedperipherals.smart_glasses.peripherals": "Peripherals", diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json index 21855bf71..4da55fb18 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:distance_detector" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json index 731bc1f02..a57de0eab 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:fluid_detector" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json index dadeb8bc5..be3a1af68 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:gas_detector" } ], diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 53cb3a4bc..7503077d5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -56,6 +56,7 @@ private void addItems() { addItem(APItems.OVERLAY_MODULE, "Overlay Module"); addItem(APItems.NIGHT_VISION_MODULE, "Night Vision Module"); addItem(APItems.HOTKEY_MODULE, "Hotkey Module"); + addItem(APItems.KEYBOARD, "Keyboard"); } private void addBlocks() { @@ -80,7 +81,6 @@ private void addBlocks() { private void addTurtles() { addTurtle(CCRegistration.ID.CHATTY_TURTLE, "Chatty"); addTurtle(CCRegistration.ID.CHUNKY_TURTLE, "Chunky"); - addTurtle(CCRegistration.ID.COMPASS_TURTLE, "Compass"); addTurtle(CCRegistration.ID.SADDLE_TURTLE, "Saddle"); addTurtle(CCRegistration.ID.ENVIRONMENT_TURTLE, "Environment"); addTurtle(CCRegistration.ID.PLAYER_TURTLE, "Player Detector"); @@ -124,9 +124,10 @@ private void addTooltips() { addTooltip(APBlocks.RS_BRIDGE.get(), "&7The RS Bridge interacts with Refined Storage to manage your items."); addTooltip(APBlocks.ME_BRIDGE.get(), "&7The ME Bridge interacts with Applied Energistics to manage your items."); addTooltip(APBlocks.CHAT_BOX.get(), "&7Interacts with the ingame chat, can read and write messages."); - addTooltip(APBlocks.PERIPHERAL_CASING.get(), "&7An empty hull without the love it deserves. Used as crafting ingredient"); + addTooltip(APBlocks.PERIPHERAL_CASING.get(), "&7An empty hull without the love it deserves. Used as crafting ingredient."); addTooltip(APItems.MEMORY_CARD.get(), "&7Can save the rights of a player to use it in an inventory manager."); - addTooltip("memory_card.bound", "&7Bound to &b%s&7."); + addTooltip(APItems.KEYBOARD.get(), "&7Can be bound to a computer, used to type something on a computer without the need to open the computer."); + addTooltip("binding.boundto", "&7Bound to &b%s&7."); addTooltip(APBlocks.INVENTORY_MANAGER.get(), "&7This block is able to send or receive specific items from a player inventory."); addTooltip(APBlocks.REDSTONE_INTEGRATOR.get(), "&7This block is able to interact with redstone. Works exactly like the redstone api of an computer."); addTooltip(APBlocks.BLOCK_READER.get(), "&7Reads nbt data of blocks to interact with blocks which do not have computer support."); @@ -142,8 +143,10 @@ private void addTooltips() { } private void addTexts() { - addText("removed_player", "Cleared the memory card"); - addText("added_player", "Added you to the memory card"); + addText("bind_memorycard", "&7Added you to the memory card"); + addText("cleared_memorycard", "&7Cleared the memory card"); + addText("bind_keyboard", "&7Bound to &b%s&7"); + addText("cleared_keyboard", "&7Bind removed"); addText("automata_core_feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); addText("smart_glasses.peripherals", "Peripherals"); addText("smart_glasses.modules", "Modules"); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index b836fb4b1..47ac8d3b4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -4,6 +4,7 @@ import de.srendi.advancedperipherals.common.container.KeyboardContainer; import de.srendi.advancedperipherals.common.items.base.BaseItem; import de.srendi.advancedperipherals.common.items.base.IInventoryItem; +import de.srendi.advancedperipherals.common.util.EnumColor; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.SideHelper; import net.minecraft.core.BlockPos; @@ -17,10 +18,14 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; public class KeyboardItem extends BaseItem implements IInventoryItem { @@ -65,17 +70,26 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); } + @Override + public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List tooltip, TooltipFlag flagIn) { + super.appendHoverText(stack, levelIn, tooltip, flagIn); + CompoundTag data = stack.getOrCreateTag(); + if (data.contains("bind")) { + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.boundto", NBTUtil.blockPosFromNBT(data.getCompound("bind")).toShortString()))); + } + } + private void bind(Player player, ItemStack itemStack, BlockPos pos) { CompoundTag tag = NBTUtil.toNBT(pos); itemStack.getOrCreateTag().put(BIND_TAG, tag); - player.sendSystemMessage(Component.literal("Bound to " + pos.toShortString())); + player.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.bind_keyboard", pos.toShortString())), true); } private void clear(Player player, ItemStack itemStack) { itemStack.getOrCreateTag().remove(BIND_TAG); - player.sendSystemMessage(Component.literal("Unbound")); + player.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.cleared_keyboard")), true); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java index 0bd126d4b..74815882a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java @@ -32,7 +32,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List: remove the owner name field if (data.contains("ownerId") && data.contains("owner")) { - tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.memory_card.bound", data.getString("owner")))); + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.boundto", data.getString("owner")))); } } @@ -43,11 +43,11 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In CompoundTag data = stack.getOrCreateTag(); // TODO <0.8>: remove the owner name field if (data.contains("ownerId") || data.contains("owner")) { - playerIn.displayClientMessage(Component.translatable("text.advancedperipherals.removed_player"), true); + playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.cleared_memorycard")), true); data.remove("ownerId"); data.remove("owner"); } else { - playerIn.displayClientMessage(Component.translatable("text.advancedperipherals.added_player"), true); + playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.bind_memorycard")), true); data.putUUID("ownerId", playerIn.getUUID()); data.putString("owner", playerIn.getName().getString()); } From c507f0a3cd10b671d4fc49828c853ad427bb4032 Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 23 Sep 2024 21:44:21 +0200 Subject: [PATCH 05/24] Removed owner tag from the memory card --- .../common/items/MemoryCardItem.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java index 74815882a..558f240ee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java @@ -30,9 +30,8 @@ public boolean isEnabled() { public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, levelIn, tooltip, flagIn); CompoundTag data = stack.getOrCreateTag(); - // TODO <0.8>: remove the owner name field - if (data.contains("ownerId") && data.contains("owner")) { - tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.boundto", data.getString("owner")))); + if (data.contains("ownerId")) { + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.boundto", data.getString("ownerId")))); } } @@ -41,15 +40,12 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (!worldIn.isClientSide) { ItemStack stack = playerIn.getItemInHand(handIn); CompoundTag data = stack.getOrCreateTag(); - // TODO <0.8>: remove the owner name field - if (data.contains("ownerId") || data.contains("owner")) { + if (data.contains("ownerId")) { playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.cleared_memorycard")), true); data.remove("ownerId"); - data.remove("owner"); } else { playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.bind_memorycard")), true); data.putUUID("ownerId", playerIn.getUUID()); - data.putString("owner", playerIn.getName().getString()); } } return super.use(worldIn, playerIn, handIn); From ab6a8cdfd2ac59121449a4900e31c9e305f0743d Mon Sep 17 00:00:00 2001 From: endi Date: Tue, 24 Sep 2024 14:31:08 +0200 Subject: [PATCH 06/24] Key press/Char typed sync to the computer logic --- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../advancedperipherals/lang/en_us.json | 1 + .../client/screens/KeyboardScreen.java | 127 ++++++++++++++++++ .../common/container/KeyboardContainer.java | 48 ++++++- .../common/data/EnUsLanguageProvider.java | 1 + .../common/items/KeyboardItem.java | 18 ++- .../common/setup/APContainerTypes.java | 4 +- .../models/item/keyboard.json | 6 + .../textures/item/keyboard.png | Bin 0 -> 101 bytes 9 files changed, 197 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/assets/advancedperipherals/models/item/keyboard.json create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/keyboard.png diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 8cf74a4f3..902c19769 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2024-09-23T21:38:21.973108 Languages: en_us -03b7b20272b605dc01218ad17a0f8259e91ad45d assets/advancedperipherals/lang/en_us.json +// 1.19.2 2024-09-24T12:35:48.4625121 Languages: en_us +324712d2a78b7f5276fc1bd1c69925939ea0b1b1 assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index 89596b232..09f02ea8f 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -89,6 +89,7 @@ "text.advancedperipherals.bind_memorycard": "&7Added you to the memory card", "text.advancedperipherals.cleared_keyboard": "&7Bind removed", "text.advancedperipherals.cleared_memorycard": "&7Cleared the memory card", + "text.advancedperipherals.keyboard_notbound": "&7Keyboard not bound", "text.advancedperipherals.saddle_turtle_dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", "text.advancedperipherals.smart_glasses.modules": "Modules", "text.advancedperipherals.smart_glasses.peripherals": "Peripherals", diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index 8c44430c5..224a0b02f 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -1,20 +1,37 @@ package de.srendi.advancedperipherals.client.screens; import com.mojang.blaze3d.vertex.PoseStack; +import dan200.computercraft.client.gui.ClientInputHandler; +import dan200.computercraft.shared.computer.core.InputHandler; import de.srendi.advancedperipherals.client.screens.base.BaseScreen; import de.srendi.advancedperipherals.common.container.KeyboardContainer; +import net.minecraft.SharedConstants; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import org.jetbrains.annotations.NotNull; +import org.lwjgl.glfw.GLFW; + +import java.util.BitSet; /** * A simple screen but without any rendering calls. Used to unlock the mouse so we can freely write stuff + *

+ * Char/key logic stolen from CC's WidgetTerminal */ public class KeyboardScreen extends BaseScreen { + protected final InputHandler input; + private final BitSet keysDown = new BitSet( 256 ); + + private float terminateTimer = -1; + private float rebootTimer = -1; + private float shutdownTimer = -1; + public KeyboardScreen(KeyboardContainer screenContainer, Inventory inv, Component titleIn) { super(screenContainer, inv, titleIn); + input = new ClientInputHandler( menu ); } @Override @@ -29,6 +46,116 @@ protected void renderBg(@NotNull PoseStack matrixStack, float partialTicks, int public void renderBackground(@NotNull PoseStack pPoseStack) { } + @Override + public boolean charTyped( char ch, int modifiers ) + { + if( ch >= 32 && ch <= 126 || ch >= 160 && ch <= 255 ) // printable chars in byte range + { + // Queue the "char" event + input.queueEvent( "char", new Object[] { Character.toString( ch ) } ); + } + + return true; + } + + @Override + public boolean keyPressed( int key, int scancode, int modifiers ) + { + if( key == GLFW.GLFW_KEY_ESCAPE ) { + onClose(); + return true; + } + if( (modifiers & GLFW.GLFW_MOD_CONTROL) != 0 ) + { + switch( key ) + { + case GLFW.GLFW_KEY_T: + if( terminateTimer < 0 ) terminateTimer = 0; + return true; + case GLFW.GLFW_KEY_S: + if( shutdownTimer < 0 ) shutdownTimer = 0; + return true; + case GLFW.GLFW_KEY_R: + if( rebootTimer < 0 ) rebootTimer = 0; + return true; + + case GLFW.GLFW_KEY_V: + // Ctrl+V for paste + String clipboard = Minecraft.getInstance().keyboardHandler.getClipboard(); + if( clipboard != null ) + { + // Clip to the first occurrence of \r or \n + int newLineIndex1 = clipboard.indexOf( "\r" ); + int newLineIndex2 = clipboard.indexOf( "\n" ); + if( newLineIndex1 >= 0 && newLineIndex2 >= 0 ) + { + clipboard = clipboard.substring( 0, Math.min( newLineIndex1, newLineIndex2 ) ); + } + else if( newLineIndex1 >= 0 ) + { + clipboard = clipboard.substring( 0, newLineIndex1 ); + } + else if( newLineIndex2 >= 0 ) + { + clipboard = clipboard.substring( 0, newLineIndex2 ); + } + + // Filter the string + clipboard = SharedConstants.filterText( clipboard ); + if( !clipboard.isEmpty() ) + { + // Clip to 512 characters and queue the event + if( clipboard.length() > 512 ) clipboard = clipboard.substring( 0, 512 ); + input.queueEvent( "paste", new Object[] { clipboard } ); + } + + return true; + } + } + } + + if( key >= 0 && terminateTimer < 0 && rebootTimer < 0 && shutdownTimer < 0 ) + { + // Queue the "key" event and add to the down set + boolean repeat = keysDown.get( key ); + keysDown.set( key ); + input.keyDown( key, repeat ); + } + + return true; + } + + @Override + public boolean keyReleased( int key, int scancode, int modifiers ) + { + // Queue the "key_up" event and remove from the down set + if( key >= 0 && keysDown.get( key ) ) + { + keysDown.set( key, false ); + input.keyUp( key ); + } + + switch( key ) + { + case GLFW.GLFW_KEY_T: + terminateTimer = -1; + break; + case GLFW.GLFW_KEY_R: + rebootTimer = -1; + break; + case GLFW.GLFW_KEY_S: + shutdownTimer = -1; + break; + case GLFW.GLFW_KEY_LEFT_CONTROL: + case GLFW.GLFW_KEY_RIGHT_CONTROL: + terminateTimer = rebootTimer = shutdownTimer = -1; + break; + } + + return true; + } + + @Override public int getSizeX() { return 256; diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java index 53f98bc5c..9f6ca1404 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java @@ -1,19 +1,36 @@ package de.srendi.advancedperipherals.common.container; -import de.srendi.advancedperipherals.AdvancedPeripherals; +import dan200.computercraft.shared.computer.core.ServerComputer; +import dan200.computercraft.shared.computer.core.ServerContext; +import dan200.computercraft.shared.computer.menu.ComputerMenu; +import dan200.computercraft.shared.computer.menu.ServerInputHandler; +import dan200.computercraft.shared.computer.menu.ServerInputState; +import dan200.computercraft.shared.computer.terminal.TerminalState; import de.srendi.advancedperipherals.common.container.base.BaseContainer; +import de.srendi.advancedperipherals.common.items.KeyboardItem; import de.srendi.advancedperipherals.common.setup.APContainerTypes; +import de.srendi.advancedperipherals.common.util.NBTUtil; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraftforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; -public class KeyboardContainer extends BaseContainer { +import javax.annotation.Nullable; - public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level) { +public class KeyboardContainer extends BaseContainer implements ComputerMenu { + + private final ServerInputState input; + private final BlockPos computerPos; + @Nullable + private ServerComputer computer = null; + + public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level, ItemStack keyboardItem) { super(APContainerTypes.KEYBOARD_CONTAINER.get(), id, inventory, pos, level); - AdvancedPeripherals.debug("test"); + this.input = new ServerInputState<>( this ); + this.computerPos = NBTUtil.blockPosFromNBT(keyboardItem.getOrCreateTag().getCompound(KeyboardItem.BIND_TAG)); } @Override @@ -21,4 +38,27 @@ public boolean stillValid(@NotNull Player playerIn) { return true; } + @Override + public ServerComputer getComputer() { + if (computer != null) + return computer; + + for (ServerComputer computer : ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().getComputers()) { + if (computer.getPosition().equals(computerPos)) { + this.computer = computer; + } + } + + return computer; + } + + @Override + public ServerInputHandler getInput() { + return input; + } + + @Override + public void updateTerminal(TerminalState state) { + + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 7503077d5..b638dde57 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -147,6 +147,7 @@ private void addTexts() { addText("cleared_memorycard", "&7Cleared the memory card"); addText("bind_keyboard", "&7Bound to &b%s&7"); addText("cleared_keyboard", "&7Bind removed"); + addText("keyboard_notbound", "&7Keyboard not bound"); addText("automata_core_feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); addText("smart_glasses.peripherals", "Peripherals"); addText("smart_glasses.modules", "Modules"); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index 47ac8d3b4..9557bba22 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -29,7 +29,7 @@ public class KeyboardItem extends BaseItem implements IInventoryItem { - private static final String BIND_TAG = "bind"; + public static final String BIND_TAG = "bind"; public KeyboardItem() { super(new Properties().stacksTo(1)); @@ -63,9 +63,17 @@ public InteractionResult useOn(UseOnContext context) { @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + if (playerIn.level.isClientSide()) + return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); // Used to prevent the menu from opening when we just want to bind/unbind the keyboard - if (!playerIn.isShiftKeyDown()) + if (!playerIn.isShiftKeyDown()) { + if (!playerIn.getItemInHand(handIn).getOrCreateTag().contains(BIND_TAG)) { + playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.keyboard_notbound")), false); + return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); + } + // Run the super use which handles the IInventoryItem stuff to actually open the container return super.use(worldIn, playerIn, handIn); + } return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); } @@ -74,8 +82,8 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, levelIn, tooltip, flagIn); CompoundTag data = stack.getOrCreateTag(); - if (data.contains("bind")) { - tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.boundto", NBTUtil.blockPosFromNBT(data.getCompound("bind")).toShortString()))); + if (data.contains(BIND_TAG)) { + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.boundto", NBTUtil.blockPosFromNBT(data.getCompound(BIND_TAG)).toShortString()))); } } @@ -103,7 +111,7 @@ public Component getDisplayName() { @Override public AbstractContainerMenu createMenu(int pContainerId, @NotNull Inventory playerInv, @NotNull Player player) { - return new KeyboardContainer(pContainerId, playerInv, player.blockPosition(), player.getLevel()); + return new KeyboardContainer(pContainerId, playerInv, player.blockPosition(), player.getLevel(), itemStack); } }; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java index e50f7a866..dee082a61 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java @@ -7,6 +7,7 @@ import de.srendi.advancedperipherals.common.container.SmartGlassesContainer; import net.minecraft.core.BlockPos; import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraftforge.common.extensions.IForgeMenuType; import net.minecraftforge.registries.RegistryObject; @@ -21,8 +22,9 @@ public class APContainerTypes { public static final RegistryObject> KEYBOARD_CONTAINER = APRegistration.CONTAINER_TYPES.register("keyboard_container", () -> IForgeMenuType.create((windowId, inv, data) -> { BlockPos pos = data.readBlockPos(); + ItemStack keyboardItem = data.readItem(); Level level = inv.player.getCommandSenderWorld(); - return new KeyboardContainer(windowId, inv, pos, level); + return new KeyboardContainer(windowId, inv, pos, level, keyboardItem); })); public static final RegistryObject> SMART_GLASSES_CONTAINER = APRegistration.CONTAINER_TYPES.register("smart_glasses_container", () -> ContainerData.toType(ComputerContainerData::new, diff --git a/src/main/resources/assets/advancedperipherals/models/item/keyboard.json b/src/main/resources/assets/advancedperipherals/models/item/keyboard.json new file mode 100644 index 000000000..ec94c3cb6 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/models/item/keyboard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "advancedperipherals:item/keyboard" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/textures/item/keyboard.png b/src/main/resources/assets/advancedperipherals/textures/item/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2bf5a818ffc5cdef86771906de05e09d7eb473 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D%KdAc};So9_* wNU%0b|2cke+5Wc`u?Ibx6n|XlYhq+&a5>2G?}^0hA3&uHp00i_>zopr0P33_lK=n! literal 0 HcmV?d00001 From 5af40a8d29a736976cc01f76eac68132f3076a39 Mon Sep 17 00:00:00 2001 From: endi Date: Wed, 25 Sep 2024 22:10:51 +0200 Subject: [PATCH 07/24] The keyboard is now a working module, it currently uses the hotkey module keybind. I will see what I will do with the hotkey module or if I will create a new Keybind I've created two new nbt tags to bind the module to the glasses to sync that to the container, I am not sure if there is maybe a better way, but it works --- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../advancedperipherals/lang/en_us.json | 4 +- .../common/container/KeyboardContainer.java | 31 ++++++----- .../common/data/EnUsLanguageProvider.java | 4 +- .../common/items/KeyboardItem.java | 55 ++++++++++++++++++- .../modules/IModuleFunctions.java | 2 - .../modules/keyboard/KeyboardModule.java | 22 ++++++++ 7 files changed, 100 insertions(+), 22 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 902c19769..8a10f7b4c 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2024-09-24T12:35:48.4625121 Languages: en_us -324712d2a78b7f5276fc1bd1c69925939ea0b1b1 assets/advancedperipherals/lang/en_us.json +// 1.19.2 2024-09-25T15:15:12.3008086 Languages: en_us +c5dde7701295d5ad506663dba947865df73d753c assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index 09f02ea8f..c4b739f5b 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -49,7 +49,8 @@ "item.advancedperipherals.smart_glasses": "Smart Glasses", "item.advancedperipherals.smart_glasses_interface": "Smart Glasses Interface", "item.advancedperipherals.smart_glasses_netherite": "Netherite reinforced Smart Glasses", - "item.advancedperipherals.tooltip.binding.boundto": "&7Bound to &b%s&7.", + "item.advancedperipherals.tooltip.binding.bound_to": "&7Bound to &b%s&7.", + "item.advancedperipherals.tooltip.binding.bound_to_glasses": "&7Bound to Smart Glasses with Id &b%s&7.", "item.advancedperipherals.tooltip.block_reader": "&7Reads nbt data of blocks to interact with blocks which do not have computer support.", "item.advancedperipherals.tooltip.chat_box": "&7Interacts with the ingame chat, can read and write messages.", "item.advancedperipherals.tooltip.chunk_controller": "&7A crafting ingredient for the Chunky Turtle.", @@ -89,6 +90,7 @@ "text.advancedperipherals.bind_memorycard": "&7Added you to the memory card", "text.advancedperipherals.cleared_keyboard": "&7Bind removed", "text.advancedperipherals.cleared_memorycard": "&7Cleared the memory card", + "text.advancedperipherals.could_not_bind_keyboard": "&cCould not bind the keyboard to the computer located at &c%s", "text.advancedperipherals.keyboard_notbound": "&7Keyboard not bound", "text.advancedperipherals.saddle_turtle_dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", "text.advancedperipherals.smart_glasses.modules": "Modules", diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java index 9f6ca1404..03838407a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java @@ -11,26 +11,39 @@ import de.srendi.advancedperipherals.common.setup.APContainerTypes; import de.srendi.advancedperipherals.common.util.NBTUtil; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraftforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class KeyboardContainer extends BaseContainer implements ComputerMenu { private final ServerInputState input; - private final BlockPos computerPos; @Nullable private ServerComputer computer = null; public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level, ItemStack keyboardItem) { super(APContainerTypes.KEYBOARD_CONTAINER.get(), id, inventory, pos, level); this.input = new ServerInputState<>( this ); - this.computerPos = NBTUtil.blockPosFromNBT(keyboardItem.getOrCreateTag().getCompound(KeyboardItem.BIND_TAG)); + + CompoundTag data = keyboardItem.getOrCreateTag(); + + if (!data.getBoolean(KeyboardItem.BOUND_TYPE_TAG)) { + BlockPos computerPos = NBTUtil.blockPosFromNBT(keyboardItem.getOrCreateTag().getCompound(KeyboardItem.BIND_TAG)); + + for (ServerComputer computer : ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().getComputers()) { + if (computer.getPosition() != null && computer.getPosition().equals(computerPos)) { + this.computer = computer; + } + } + } else if (data.contains(KeyboardItem.GLASSES_BIND_TAG)) { + computer = ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().get(data.getInt(KeyboardItem.GLASSES_BIND_TAG)); + } + } @Override @@ -38,17 +51,9 @@ public boolean stillValid(@NotNull Player playerIn) { return true; } + @Nullable @Override public ServerComputer getComputer() { - if (computer != null) - return computer; - - for (ServerComputer computer : ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().getComputers()) { - if (computer.getPosition().equals(computerPos)) { - this.computer = computer; - } - } - return computer; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index b638dde57..5758887cf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -127,7 +127,8 @@ private void addTooltips() { addTooltip(APBlocks.PERIPHERAL_CASING.get(), "&7An empty hull without the love it deserves. Used as crafting ingredient."); addTooltip(APItems.MEMORY_CARD.get(), "&7Can save the rights of a player to use it in an inventory manager."); addTooltip(APItems.KEYBOARD.get(), "&7Can be bound to a computer, used to type something on a computer without the need to open the computer."); - addTooltip("binding.boundto", "&7Bound to &b%s&7."); + addTooltip("binding.bound_to", "&7Bound to &b%s&7."); + addTooltip("binding.bound_to_glasses", "&7Bound to Smart Glasses with Id &b%s&7."); addTooltip(APBlocks.INVENTORY_MANAGER.get(), "&7This block is able to send or receive specific items from a player inventory."); addTooltip(APBlocks.REDSTONE_INTEGRATOR.get(), "&7This block is able to interact with redstone. Works exactly like the redstone api of an computer."); addTooltip(APBlocks.BLOCK_READER.get(), "&7Reads nbt data of blocks to interact with blocks which do not have computer support."); @@ -148,6 +149,7 @@ private void addTexts() { addText("bind_keyboard", "&7Bound to &b%s&7"); addText("cleared_keyboard", "&7Bind removed"); addText("keyboard_notbound", "&7Keyboard not bound"); + addText("could_not_bind_keyboard", "&cCould not bind the keyboard to the computer located at &c%s"); addText("automata_core_feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); addText("smart_glasses.peripherals", "Peripherals"); addText("smart_glasses.modules", "Modules"); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index 9557bba22..907c4455d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -1,19 +1,27 @@ package de.srendi.advancedperipherals.common.items; import dan200.computercraft.shared.computer.blocks.TileComputerBase; +import de.srendi.advancedperipherals.client.KeyBindings; import de.srendi.advancedperipherals.common.container.KeyboardContainer; import de.srendi.advancedperipherals.common.items.base.BaseItem; import de.srendi.advancedperipherals.common.items.base.IInventoryItem; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; +import de.srendi.advancedperipherals.common.smartglasses.modules.keyboard.KeyboardModule; import de.srendi.advancedperipherals.common.util.EnumColor; +import de.srendi.advancedperipherals.common.util.KeybindUtil; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.SideHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -22,14 +30,17 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -public class KeyboardItem extends BaseItem implements IInventoryItem { +public class KeyboardItem extends BaseItem implements IInventoryItem, IModuleItem { public static final String BIND_TAG = "bind"; + public static final String GLASSES_BIND_TAG = "glasses_id"; + public static final String BOUND_TYPE_TAG = "bind_type"; public KeyboardItem() { super(new Properties().stacksTo(1)); @@ -61,6 +72,30 @@ public InteractionResult useOn(UseOnContext context) { return super.useOn(context); } + @Override + public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int inventorySlot, boolean isCurrentItem, @Nullable SmartGlassesAccess access, @Nullable IModule module) { + if (level.isClientSide()) + return; + + CompoundTag data = itemStack.getOrCreateTag(); + if (data.contains(BOUND_TYPE_TAG) && !data.getBoolean(BOUND_TYPE_TAG)) { + if (access != null) { + data.putBoolean(BOUND_TYPE_TAG, true); + data.putInt(GLASSES_BIND_TAG, access.getComputer().getInstanceID()); + data.remove(BIND_TAG); + } + } + + if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { + if (entity instanceof ServerPlayer serverPlayer) { + NetworkHooks.openScreen(serverPlayer, ((IInventoryItem) this).createContainer(serverPlayer, itemStack), buf -> { + buf.writeBlockPos(serverPlayer.blockPosition()); + buf.writeItem(itemStack); + }); + } + } + } + @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { if (playerIn.level.isClientSide()) @@ -82,20 +117,29 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, levelIn, tooltip, flagIn); CompoundTag data = stack.getOrCreateTag(); - if (data.contains(BIND_TAG)) { - tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.boundto", NBTUtil.blockPosFromNBT(data.getCompound(BIND_TAG)).toShortString()))); + if (data.contains(BOUND_TYPE_TAG) && !data.getBoolean(BOUND_TYPE_TAG)) { + if (data.contains(BIND_TAG)) { + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.bound_to", NBTUtil.blockPosFromNBT(data.getCompound(BIND_TAG)).toShortString()))); + } + } else { + if (data.contains(GLASSES_BIND_TAG)) { + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.bound_to_glasses", data.getInt(GLASSES_BIND_TAG)))); + + } } } private void bind(Player player, ItemStack itemStack, BlockPos pos) { CompoundTag tag = NBTUtil.toNBT(pos); + itemStack.getOrCreateTag().putBoolean(BOUND_TYPE_TAG, false); itemStack.getOrCreateTag().put(BIND_TAG, tag); player.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.bind_keyboard", pos.toShortString())), true); } private void clear(Player player, ItemStack itemStack) { itemStack.getOrCreateTag().remove(BIND_TAG); + itemStack.getOrCreateTag().putBoolean(BOUND_TYPE_TAG, false); player.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.cleared_keyboard")), true); } @@ -115,4 +159,9 @@ public AbstractContainerMenu createMenu(int pContainerId, @NotNull Inventory pla } }; } + + @Override + public IModule createModule(SmartGlassesAccess access) { + return new KeyboardModule(); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java index 3656500eb..1433b5938 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java @@ -8,6 +8,4 @@ */ public interface IModuleFunctions extends IPeripheralPlugin { - IModuleFunctions EMPTY = new IModuleFunctions() {}; - } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java new file mode 100644 index 000000000..9031e0fae --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java @@ -0,0 +1,22 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.keyboard; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +public class KeyboardModule implements IModule { + + @Override + public ResourceLocation getName() { + return AdvancedPeripherals.getRL("keyboard"); + } + + @Nullable + @Override + public IModuleFunctions getFunctions(SmartGlassesAccess smartGlassesAccess) { + return null; + } +} From b94b8becbe08f2d887c4ed5586dbd78ed9ac094b Mon Sep 17 00:00:00 2001 From: endi Date: Thu, 26 Sep 2024 15:17:29 +0200 Subject: [PATCH 08/24] Mouse events for the keyboard module --- .../client/screens/KeyboardScreen.java | 131 +++++++++++------- 1 file changed, 81 insertions(+), 50 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index 224a0b02f..5aebbb2a6 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -23,15 +23,19 @@ public class KeyboardScreen extends BaseScreen { protected final InputHandler input; - private final BitSet keysDown = new BitSet( 256 ); + private final BitSet keysDown = new BitSet(256); private float terminateTimer = -1; private float rebootTimer = -1; private float shutdownTimer = -1; + private int lastMouseButton = -1; + private int lastMouseX = -1; + private int lastMouseY = -1; + public KeyboardScreen(KeyboardContainer screenContainer, Inventory inv, Component titleIn) { super(screenContainer, inv, titleIn); - input = new ClientInputHandler( menu ); + input = new ClientInputHandler(menu); } @Override @@ -47,66 +51,54 @@ public void renderBackground(@NotNull PoseStack pPoseStack) { } @Override - public boolean charTyped( char ch, int modifiers ) - { - if( ch >= 32 && ch <= 126 || ch >= 160 && ch <= 255 ) // printable chars in byte range - { + public boolean charTyped(char ch, int modifiers) { + if (ch >= 32 && ch <= 126 || ch >= 160 && ch <= 255) { // printable chars in byte range // Queue the "char" event - input.queueEvent( "char", new Object[] { Character.toString( ch ) } ); + input.queueEvent("char", new Object[]{Character.toString(ch)}); } return true; } @Override - public boolean keyPressed( int key, int scancode, int modifiers ) - { - if( key == GLFW.GLFW_KEY_ESCAPE ) { + public boolean keyPressed(int key, int scancode, int modifiers) { + if (key == GLFW.GLFW_KEY_ESCAPE) { onClose(); return true; } - if( (modifiers & GLFW.GLFW_MOD_CONTROL) != 0 ) - { - switch( key ) - { + if ((modifiers & GLFW.GLFW_MOD_CONTROL) != 0) { + switch (key) { case GLFW.GLFW_KEY_T: - if( terminateTimer < 0 ) terminateTimer = 0; + if (terminateTimer < 0) terminateTimer = 0; return true; case GLFW.GLFW_KEY_S: - if( shutdownTimer < 0 ) shutdownTimer = 0; + if (shutdownTimer < 0) shutdownTimer = 0; return true; case GLFW.GLFW_KEY_R: - if( rebootTimer < 0 ) rebootTimer = 0; + if (rebootTimer < 0) rebootTimer = 0; return true; case GLFW.GLFW_KEY_V: // Ctrl+V for paste String clipboard = Minecraft.getInstance().keyboardHandler.getClipboard(); - if( clipboard != null ) - { + if (clipboard != null) { // Clip to the first occurrence of \r or \n - int newLineIndex1 = clipboard.indexOf( "\r" ); - int newLineIndex2 = clipboard.indexOf( "\n" ); - if( newLineIndex1 >= 0 && newLineIndex2 >= 0 ) - { - clipboard = clipboard.substring( 0, Math.min( newLineIndex1, newLineIndex2 ) ); - } - else if( newLineIndex1 >= 0 ) - { - clipboard = clipboard.substring( 0, newLineIndex1 ); - } - else if( newLineIndex2 >= 0 ) - { - clipboard = clipboard.substring( 0, newLineIndex2 ); + int newLineIndex1 = clipboard.indexOf("\r"); + int newLineIndex2 = clipboard.indexOf("\n"); + if (newLineIndex1 >= 0 && newLineIndex2 >= 0) { + clipboard = clipboard.substring(0, Math.min(newLineIndex1, newLineIndex2)); + } else if (newLineIndex1 >= 0) { + clipboard = clipboard.substring(0, newLineIndex1); + } else if (newLineIndex2 >= 0) { + clipboard = clipboard.substring(0, newLineIndex2); } // Filter the string - clipboard = SharedConstants.filterText( clipboard ); - if( !clipboard.isEmpty() ) - { + clipboard = SharedConstants.filterText(clipboard); + if (!clipboard.isEmpty()) { // Clip to 512 characters and queue the event - if( clipboard.length() > 512 ) clipboard = clipboard.substring( 0, 512 ); - input.queueEvent( "paste", new Object[] { clipboard } ); + if (clipboard.length() > 512) clipboard = clipboard.substring(0, 512); + input.queueEvent("paste", new Object[]{clipboard}); } return true; @@ -114,29 +106,25 @@ else if( newLineIndex2 >= 0 ) } } - if( key >= 0 && terminateTimer < 0 && rebootTimer < 0 && shutdownTimer < 0 ) - { + if (key >= 0 && terminateTimer < 0 && rebootTimer < 0 && shutdownTimer < 0) { // Queue the "key" event and add to the down set - boolean repeat = keysDown.get( key ); - keysDown.set( key ); - input.keyDown( key, repeat ); + boolean repeat = keysDown.get(key); + keysDown.set(key); + input.keyDown(key, repeat); } return true; } @Override - public boolean keyReleased( int key, int scancode, int modifiers ) - { + public boolean keyReleased(int key, int scancode, int modifiers) { // Queue the "key_up" event and remove from the down set - if( key >= 0 && keysDown.get( key ) ) - { - keysDown.set( key, false ); - input.keyUp( key ); + if (key >= 0 && keysDown.get(key)) { + keysDown.set(key, false); + input.keyUp(key); } - switch( key ) - { + switch (key) { case GLFW.GLFW_KEY_T: terminateTimer = -1; break; @@ -155,6 +143,49 @@ public boolean keyReleased( int key, int scancode, int modifiers ) return true; } + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + input.mouseClick(button + 1, (int) mouseX, (int) mouseY); + + lastMouseButton = button; + lastMouseX = (int) mouseX; + lastMouseY = (int) mouseY; + + return true; + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (lastMouseButton == button) { + input.mouseUp(lastMouseButton + 1, (int) mouseX, (int) mouseY); + lastMouseButton = -1; + } + + return false; + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double v2, double v3) { + + if (button == lastMouseButton && (mouseX != lastMouseX || mouseY != lastMouseY)) { + input.mouseDrag(button + 1, (int) mouseX, (int) mouseY); + lastMouseX = (int) mouseX; + lastMouseY = (int) mouseY; + } + + return false; + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + + input.mouseScroll(delta < 0 ? 1 : -1, (int) mouseX, (int) mouseY); + + lastMouseX = (int) mouseX; + lastMouseY = (int) mouseY; + + return true; + } @Override public int getSizeX() { From 9ba12141e2d0fd4a3631dd8fbf6c613d4c40ea9c Mon Sep 17 00:00:00 2001 From: endi Date: Thu, 26 Sep 2024 15:26:07 +0200 Subject: [PATCH 09/24] Fixed an issue where the keyboard does not bound to the glasses when it was bound to different glasses before --- .../common/items/KeyboardItem.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index 907c4455d..e5bb629ac 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -54,14 +54,11 @@ public boolean isEnabled() { @NotNull @Override public InteractionResult useOn(UseOnContext context) { - if (context.getPlayer() == null) - return InteractionResult.PASS; + if (context.getPlayer() == null) return InteractionResult.PASS; - if (SideHelper.isClientPlayer(context.getPlayer())) - return InteractionResult.PASS; + if (SideHelper.isClientPlayer(context.getPlayer())) return InteractionResult.PASS; - if (!context.getPlayer().isShiftKeyDown()) - return InteractionResult.PASS; + if (!context.getPlayer().isShiftKeyDown()) return InteractionResult.PASS; BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); if (entity instanceof TileComputerBase) { @@ -74,16 +71,21 @@ public InteractionResult useOn(UseOnContext context) { @Override public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int inventorySlot, boolean isCurrentItem, @Nullable SmartGlassesAccess access, @Nullable IModule module) { - if (level.isClientSide()) - return; + if (level.isClientSide()) return; + + if (access == null) return; CompoundTag data = itemStack.getOrCreateTag(); - if (data.contains(BOUND_TYPE_TAG) && !data.getBoolean(BOUND_TYPE_TAG)) { - if (access != null) { - data.putBoolean(BOUND_TYPE_TAG, true); - data.putInt(GLASSES_BIND_TAG, access.getComputer().getInstanceID()); - data.remove(BIND_TAG); - } + int instanceId = access.getComputer().getInstanceID(); + int oldInstanceId = -1; + + if (data.contains(GLASSES_BIND_TAG)) oldInstanceId = data.getInt(GLASSES_BIND_TAG); + + if (!data.contains(BOUND_TYPE_TAG) || ((oldInstanceId != -1 && oldInstanceId != instanceId)) || !data.getBoolean(BOUND_TYPE_TAG)) { + data.putBoolean(BOUND_TYPE_TAG, true); + data.putInt(GLASSES_BIND_TAG, access.getComputer().getInstanceID()); + data.remove(BIND_TAG); + } if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { From e8f70d720b9fb67a48ded2d68dea648360787cd9 Mon Sep 17 00:00:00 2001 From: endi Date: Sat, 28 Sep 2024 22:49:15 +0200 Subject: [PATCH 10/24] Render a little info text when the player is using the keyboard --- .../client/screens/KeyboardScreen.java | 13 +++++++++++-- .../common/items/KeyboardItem.java | 16 ++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index 5aebbb2a6..825002b57 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -40,6 +40,17 @@ public KeyboardScreen(KeyboardContainer screenContainer, Inventory inv, Componen @Override public void render(@NotNull PoseStack matrixStack, int x, int y, float partialTicks) { + Minecraft minecraft = Minecraft.getInstance(); + float scale = 2f; + int screenWidth = minecraft.getWindow().getGuiScaledWidth(); + // Make the text a bit smaller on small screens + if (screenWidth <= 1080) + scale = 1f; + + matrixStack.scale(scale, scale, 1); + String text = "Press ESC to close the Keyboard Screen."; + float textX = (screenWidth / 2f - minecraft.font.width(text) * scale / 2f) / scale; + minecraft.font.drawShadow(matrixStack, text, textX, 1, 0xFFFFFF); } @Override @@ -166,7 +177,6 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { @Override public boolean mouseDragged(double mouseX, double mouseY, int button, double v2, double v3) { - if (button == lastMouseButton && (mouseX != lastMouseX || mouseY != lastMouseY)) { input.mouseDrag(button + 1, (int) mouseX, (int) mouseY); lastMouseX = (int) mouseX; @@ -178,7 +188,6 @@ public boolean mouseDragged(double mouseX, double mouseY, int button, double v2, @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - input.mouseScroll(delta < 0 ? 1 : -1, (int) mouseX, (int) mouseY); lastMouseX = (int) mouseX; diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index e5bb629ac..abf96b453 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -54,11 +54,14 @@ public boolean isEnabled() { @NotNull @Override public InteractionResult useOn(UseOnContext context) { - if (context.getPlayer() == null) return InteractionResult.PASS; + if (context.getPlayer() == null) + return InteractionResult.PASS; - if (SideHelper.isClientPlayer(context.getPlayer())) return InteractionResult.PASS; + if (SideHelper.isClientPlayer(context.getPlayer())) + return InteractionResult.PASS; - if (!context.getPlayer().isShiftKeyDown()) return InteractionResult.PASS; + if (!context.getPlayer().isShiftKeyDown()) + return InteractionResult.PASS; BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); if (entity instanceof TileComputerBase) { @@ -71,9 +74,11 @@ public InteractionResult useOn(UseOnContext context) { @Override public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int inventorySlot, boolean isCurrentItem, @Nullable SmartGlassesAccess access, @Nullable IModule module) { - if (level.isClientSide()) return; + if (level.isClientSide()) + return; - if (access == null) return; + if (access == null) + return; CompoundTag data = itemStack.getOrCreateTag(); int instanceId = access.getComputer().getInstanceID(); @@ -85,7 +90,6 @@ public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int i data.putBoolean(BOUND_TYPE_TAG, true); data.putInt(GLASSES_BIND_TAG, access.getComputer().getInstanceID()); data.remove(BIND_TAG); - } if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { From 1b147a30ea370a9b590e6f6dedf93cfa738a9769 Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 30 Sep 2024 12:16:17 +0200 Subject: [PATCH 11/24] Preven JEI/REI/EMI from rendering in the keyboard screen --- .../client/screens/KeyboardScreen.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index 825002b57..9302deff7 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -39,18 +39,23 @@ public KeyboardScreen(KeyboardContainer screenContainer, Inventory inv, Componen } @Override - public void render(@NotNull PoseStack matrixStack, int x, int y, float partialTicks) { + public void render(@NotNull PoseStack poseStack, int x, int y, float partialTicks) { Minecraft minecraft = Minecraft.getInstance(); float scale = 2f; int screenWidth = minecraft.getWindow().getGuiScaledWidth(); + int screenHeight = minecraft.getWindow().getGuiScaledHeight(); // Make the text a bit smaller on small screens if (screenWidth <= 1080) scale = 1f; - matrixStack.scale(scale, scale, 1); + poseStack.scale(scale, scale, 1); String text = "Press ESC to close the Keyboard Screen."; float textX = (screenWidth / 2f - minecraft.font.width(text) * scale / 2f) / scale; - minecraft.font.drawShadow(matrixStack, text, textX, 1, 0xFFFFFF); + minecraft.font.drawShadow(poseStack, text, textX, 1, 0xFFFFFF); + + // Prevents JEI/REI/EMI from rendering. Maybe not the best way, but it works for now. + poseStack.scale(4f, 4f, 1); + minecraft.font.draw(poseStack, "", screenWidth, screenHeight, 0xFFFFFF); } @Override From b689497289142ea0a18a071aa9bfd972f7a97aa0 Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 03:43:39 +0100 Subject: [PATCH 12/24] checkstyle --- .../java/de/srendi/advancedperipherals/common/setup/APItems.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java index e91a587d9..148579a1c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.items.APItem; +import de.srendi.advancedperipherals.common.items.KeyboardItem; import de.srendi.advancedperipherals.common.items.MemoryCardItem; import de.srendi.advancedperipherals.common.items.SmartGlassesInterfaceItem; import de.srendi.advancedperipherals.common.items.SmartGlassesItem; From 36193be109ad0e17b8ca1da69040f6725fd1aab3 Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 04:07:29 +0100 Subject: [PATCH 13/24] Simplify KeyboardScreen --- .../client/screens/KeyboardScreen.java | 176 +++++------------- .../common/container/base/BaseContainer.java | 13 +- 2 files changed, 53 insertions(+), 136 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index 9302deff7..bb5f4c2f4 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -2,10 +2,12 @@ import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.client.gui.ClientInputHandler; +import dan200.computercraft.client.gui.widgets.WidgetTerminal; +import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.computer.core.InputHandler; import de.srendi.advancedperipherals.client.screens.base.BaseScreen; import de.srendi.advancedperipherals.common.container.KeyboardContainer; -import net.minecraft.SharedConstants; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -13,29 +15,22 @@ import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; -import java.util.BitSet; - /** * A simple screen but without any rendering calls. Used to unlock the mouse so we can freely write stuff *

- * Char/key logic stolen from CC's WidgetTerminal + * We just create a terminal which is used to forward all the key presses and mouse clicks but we don't render it. */ public class KeyboardScreen extends BaseScreen { protected final InputHandler input; - private final BitSet keysDown = new BitSet(256); - - private float terminateTimer = -1; - private float rebootTimer = -1; - private float shutdownTimer = -1; + private final Terminal terminalData; - private int lastMouseButton = -1; - private int lastMouseX = -1; - private int lastMouseY = -1; + private WidgetTerminal terminal; public KeyboardScreen(KeyboardContainer screenContainer, Inventory inv, Component titleIn) { super(screenContainer, inv, titleIn); input = new ClientInputHandler(menu); + terminalData = new Terminal(0, 0, false); } @Override @@ -43,7 +38,6 @@ public void render(@NotNull PoseStack poseStack, int x, int y, float partialTick Minecraft minecraft = Minecraft.getInstance(); float scale = 2f; int screenWidth = minecraft.getWindow().getGuiScaledWidth(); - int screenHeight = minecraft.getWindow().getGuiScaledHeight(); // Make the text a bit smaller on small screens if (screenWidth <= 1080) scale = 1f; @@ -52,12 +46,23 @@ public void render(@NotNull PoseStack poseStack, int x, int y, float partialTick String text = "Press ESC to close the Keyboard Screen."; float textX = (screenWidth / 2f - minecraft.font.width(text) * scale / 2f) / scale; minecraft.font.drawShadow(poseStack, text, textX, 1, 0xFFFFFF); + } + + @Override + protected void init() { + passEvents = true; + KeyMapping.releaseAll(); - // Prevents JEI/REI/EMI from rendering. Maybe not the best way, but it works for now. - poseStack.scale(4f, 4f, 1); - minecraft.font.draw(poseStack, "", screenWidth, screenHeight, 0xFFFFFF); + super.init(); + minecraft.keyboardHandler.setSendRepeatsToGui(true); + + terminal = addWidget(new WidgetTerminal(terminalData, new ClientInputHandler(menu), 0, 0)); + terminal.visible = false; + terminal.active = false; + setFocused(terminal); } + @Override protected void renderBg(@NotNull PoseStack matrixStack, float partialTicks, int x, int y) { } @@ -66,149 +71,52 @@ protected void renderBg(@NotNull PoseStack matrixStack, float partialTicks, int public void renderBackground(@NotNull PoseStack pPoseStack) { } - @Override - public boolean charTyped(char ch, int modifiers) { - if (ch >= 32 && ch <= 126 || ch >= 160 && ch <= 255) { // printable chars in byte range - // Queue the "char" event - input.queueEvent("char", new Object[]{Character.toString(ch)}); - } - - return true; - } @Override - public boolean keyPressed(int key, int scancode, int modifiers) { - if (key == GLFW.GLFW_KEY_ESCAPE) { - onClose(); - return true; - } - if ((modifiers & GLFW.GLFW_MOD_CONTROL) != 0) { - switch (key) { - case GLFW.GLFW_KEY_T: - if (terminateTimer < 0) terminateTimer = 0; - return true; - case GLFW.GLFW_KEY_S: - if (shutdownTimer < 0) shutdownTimer = 0; - return true; - case GLFW.GLFW_KEY_R: - if (rebootTimer < 0) rebootTimer = 0; - return true; - - case GLFW.GLFW_KEY_V: - // Ctrl+V for paste - String clipboard = Minecraft.getInstance().keyboardHandler.getClipboard(); - if (clipboard != null) { - // Clip to the first occurrence of \r or \n - int newLineIndex1 = clipboard.indexOf("\r"); - int newLineIndex2 = clipboard.indexOf("\n"); - if (newLineIndex1 >= 0 && newLineIndex2 >= 0) { - clipboard = clipboard.substring(0, Math.min(newLineIndex1, newLineIndex2)); - } else if (newLineIndex1 >= 0) { - clipboard = clipboard.substring(0, newLineIndex1); - } else if (newLineIndex2 >= 0) { - clipboard = clipboard.substring(0, newLineIndex2); - } - - // Filter the string - clipboard = SharedConstants.filterText(clipboard); - if (!clipboard.isEmpty()) { - // Clip to 512 characters and queue the event - if (clipboard.length() > 512) clipboard = clipboard.substring(0, 512); - input.queueEvent("paste", new Object[]{clipboard}); - } - - return true; - } - } - } - - if (key >= 0 && terminateTimer < 0 && rebootTimer < 0 && shutdownTimer < 0) { - // Queue the "key" event and add to the down set - boolean repeat = keysDown.get(key); - keysDown.set(key); - input.keyDown(key, repeat); - } - - return true; + public final void removed() { + super.removed(); + minecraft.keyboardHandler.setSendRepeatsToGui(false); } @Override - public boolean keyReleased(int key, int scancode, int modifiers) { - // Queue the "key_up" event and remove from the down set - if (key >= 0 && keysDown.get(key)) { - keysDown.set(key, false); - input.keyUp(key); - } - - switch (key) { - case GLFW.GLFW_KEY_T: - terminateTimer = -1; - break; - case GLFW.GLFW_KEY_R: - rebootTimer = -1; - break; - case GLFW.GLFW_KEY_S: - shutdownTimer = -1; - break; - case GLFW.GLFW_KEY_LEFT_CONTROL: - case GLFW.GLFW_KEY_RIGHT_CONTROL: - terminateTimer = rebootTimer = shutdownTimer = -1; - break; - } - - return true; + public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { + minecraft.player.getInventory().swapPaint(pDelta); + return super.mouseScrolled(pMouseX, pMouseY, pDelta); } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - input.mouseClick(button + 1, (int) mouseX, (int) mouseY); - - lastMouseButton = button; - lastMouseX = (int) mouseX; - lastMouseY = (int) mouseY; - - return true; + public void onClose() { + // Don't allow closing using standard keys like E. Closing using ESCAPE is still possible due to the keyPressed method } @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { - if (lastMouseButton == button) { - input.mouseUp(lastMouseButton + 1, (int) mouseX, (int) mouseY); - lastMouseButton = -1; - } - + public boolean isPauseScreen() { return false; } @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double v2, double v3) { - if (button == lastMouseButton && (mouseX != lastMouseX || mouseY != lastMouseY)) { - input.mouseDrag(button + 1, (int) mouseX, (int) mouseY); - lastMouseX = (int) mouseX; - lastMouseY = (int) mouseY; + public final boolean keyPressed(int key, int scancode, int modifiers) { + if (key == GLFW.GLFW_KEY_ESCAPE) { + super.onClose(); + return true; + } + // Forward the tab key to the terminal, rather than moving between controls. + if (key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminal) { + return getFocused().keyPressed(key, scancode, modifiers); } - return false; - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - input.mouseScroll(delta < 0 ? 1 : -1, (int) mouseX, (int) mouseY); - - lastMouseX = (int) mouseX; - lastMouseY = (int) mouseY; - - return true; + return super.keyPressed(key, scancode, modifiers); } + // We prevent jei by increasing the image size, even if we don't render it @Override public int getSizeX() { - return 256; + return 4096; } @Override public int getSizeY() { - return 256; + return 4096; } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java index 9d11ca901..bbf106b4e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java @@ -10,6 +10,7 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.wrapper.InvWrapper; @@ -23,8 +24,16 @@ public abstract class BaseContainer extends AbstractContainerMenu { protected BaseContainer(@Nullable MenuType type, int id, Inventory inventory, BlockPos pos, Level world) { super(type, id); this.inventory = new InvWrapper(inventory); - if (world != null) - this.tileEntity = (PeripheralBlockEntity) world.getBlockEntity(pos); + if (world != null) { + BlockEntity blockEntity = world.getBlockEntity(pos); + // for player containers, pos is the position of the player + // We don't actual need a block entity for player containers + // But if a player stands for example on a mekanism cable, setting the tileEntity by casting and without a check + // would prevent opening the screen + if (blockEntity instanceof PeripheralBlockEntity peripheralBlockEntity) { + tileEntity = peripheralBlockEntity; + } + } } @Override From 5e439b90fd26b6a6ead17ac9ec5d8d4c06c3dbc8 Mon Sep 17 00:00:00 2001 From: Srendi Date: Fri, 17 Jan 2025 22:48:10 +0100 Subject: [PATCH 14/24] Sort ClientRegistry.java Co-authored-by: Kevin Z Signed-off-by: Srendi --- .../de/srendi/advancedperipherals/client/ClientRegistry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index 9aad89936..313cfc884 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -43,8 +43,8 @@ public static void registerModels(ModelEvent.RegisterAdditional event) { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { MenuScreens.register(APContainerTypes.INVENTORY_MANAGER_CONTAINER.get(), InventoryManagerScreen::new); - MenuScreens.register(APContainerTypes.SMART_GLASSES_CONTAINER.get(), SmartGlassesScreen::new); MenuScreens.register(APContainerTypes.KEYBOARD_CONTAINER.get(), KeyboardScreen::new); + MenuScreens.register(APContainerTypes.SMART_GLASSES_CONTAINER.get(), SmartGlassesScreen::new); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.CHUNKY_TURTLE.get(), TurtleUpgradeModeller.flatItem()); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.COMPASS_TURTLE.get(), TurtleUpgradeModeller.flatItem()); From f5efd862337ba5bff98d7e6ce9c6e2b19500bdc4 Mon Sep 17 00:00:00 2001 From: Srendi Date: Sat, 18 Jan 2025 00:08:41 +0100 Subject: [PATCH 15/24] Add language entries --- .../.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 ++-- .../assets/advancedperipherals/lang/en_us.json | 12 +++++++++--- .../client/screens/KeyboardScreen.java | 2 +- .../common/data/EnUsLanguageProvider.java | 13 ++++++++++--- .../common/items/MemoryCardItem.java | 2 +- .../advancedperipherals/common/setup/APItems.java | 2 ++ 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index e9f92dc08..752d0ed46 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2025-01-16T15:59:34.693839 Languages: en_us -d0fe3ab5a88d6b925369860038c76f23d9910143 assets/advancedperipherals/lang/en_us.json +// 1.19.2 2025-01-18T00:08:46.0946621 Languages: en_us +d4cb5d2a7d78fc44e503663eb08d67a0fb981deb assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index 014212826..6f3d51a81 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -39,6 +39,7 @@ "item.advancedperipherals.end_automata_core": "End Automata Core", "item.advancedperipherals.hotkey_module": "Hotkey Module", "item.advancedperipherals.husbandry_automata_core": "Husbandry Automata Core", + "item.advancedperipherals.keyboard": "Wireless Keyboard", "item.advancedperipherals.memory_card": "Memory Card", "item.advancedperipherals.nightvision_module": "Night Vision Module", "item.advancedperipherals.overlay_module": "Overlay Module", @@ -48,6 +49,8 @@ "item.advancedperipherals.smart_glasses": "Smart Glasses", "item.advancedperipherals.smart_glasses_interface": "Smart Glasses Interface", "item.advancedperipherals.smart_glasses_netherite": "Netherite reinforced Smart Glasses", + "item.advancedperipherals.tooltip.binding.bound_to": "&7Bound to &b%s&7.", + "item.advancedperipherals.tooltip.binding.bound_to_glasses": "&7Bound to Glasses with id &b%s&7.", "item.advancedperipherals.tooltip.block_reader": "&7Reads nbt data of blocks to interact with blocks which do not have computer support.", "item.advancedperipherals.tooltip.chat_box": "&7Interacts with the ingame chat, can read and write messages.", "item.advancedperipherals.tooltip.chunk_controller": "&7A crafting ingredient for the Chunky Turtle.", @@ -62,7 +65,6 @@ "item.advancedperipherals.tooltip.inventory_manager": "&7This block is able to send or receive specific items from a player inventory.", "item.advancedperipherals.tooltip.me_bridge": "&7The ME Bridge interacts with Applied Energistics to manage your items.", "item.advancedperipherals.tooltip.memory_card": "&7Can save the rights of a player to use it in an inventory manager.", - "item.advancedperipherals.tooltip.memory_card.bound": "&7Bound to &b%s&7.", "item.advancedperipherals.tooltip.nbt_storage": "&7Acts like a storage disk. Can store nbt based data.", "item.advancedperipherals.tooltip.overpowered_end_automata_core": "&7Improved version of the end automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", "item.advancedperipherals.tooltip.overpowered_husbandry_automata_core": "&7Improved version of the husbandry automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", @@ -82,9 +84,13 @@ "pocket.advancedperipherals.environment_pocket": "Environment", "pocket.advancedperipherals.geoscanner_pocket": "Geo", "pocket.advancedperipherals.player_pocket": "Player Detector", - "text.advancedperipherals.added_player": "Added you to the memory card", "text.advancedperipherals.automata_core.feed_by_player": "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?", - "text.advancedperipherals.removed_player": "Cleared the memory card", + "text.advancedperipherals.bind_keyboard": "Bounded the keyboard to %s", + "text.advancedperipherals.bind_memorycard": "Bounded the memory card to you", + "text.advancedperipherals.cleared_keyboard": "Cleared the keyboard", + "text.advancedperipherals.cleared_memorycard": "Cleared the memory card", + "text.advancedperipherals.keyboard.close": "Press ESC to close the Keyboard Screen", + "text.advancedperipherals.keyboard_notbound": "The keyboard it not bound", "text.advancedperipherals.saddle_turtle.dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", "text.advancedperipherals.smart_glasses.modules": "Modules", "text.advancedperipherals.smart_glasses.peripherals": "Peripherals", diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index bb5f4c2f4..ff0fea7f5 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -43,7 +43,7 @@ public void render(@NotNull PoseStack poseStack, int x, int y, float partialTick scale = 1f; poseStack.scale(scale, scale, 1); - String text = "Press ESC to close the Keyboard Screen."; + Component text = Component.translatable("text.advancedperipherals.keyboard.close"); float textX = (screenWidth / 2f - minecraft.font.width(text) * scale / 2f) / scale; minecraft.font.drawShadow(poseStack, text, textX, 1, 0xFFFFFF); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 9627a4912..59c4308e1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -44,6 +44,7 @@ private void addItems() { addItem(APItems.CHUNK_CONTROLLER, "Chunk Controller"); addItem(APItems.COMPUTER_TOOL, "Computer Tool"); addItem(APItems.HOTKEY_MODULE, "Hotkey Module"); + addItem(APItems.KEYBOARD, "Wireless Keyboard"); addItem(APItems.MEMORY_CARD, "Memory Card"); addItem(APItems.NIGHT_VISION_MODULE, "Night Vision Module"); addItem(APItems.OVERLAY_MODULE, "Overlay Module"); @@ -144,13 +145,19 @@ private void addTooltips() { addTooltip(APItems.COMPUTER_TOOL.get(), "&7This tool was made to tune our blocks. But for now, it's just a blue useless wrench."); addTooltip(APItems.MEMORY_CARD.get(), "&7Can save the rights of a player to use it in an inventory manager."); - addTooltip("memory_card.bound", "&7Bound to &b%s&7."); + addTooltip("binding.bound_to", "&7Bound to &b%s&7."); + addTooltip("binding.bound_to_glasses", "&7Bound to Glasses with id &b%s&7."); + } private void addTexts() { - addText("removed_player", "Cleared the memory card"); - addText("added_player", "Added you to the memory card"); addText("automata_core.feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); + addText("keyboard.close", "Press ESC to close the Keyboard Screen"); + addText("cleared_memorycard", "Cleared the memory card"); + addText("bind_memorycard", "Bounded the memory card to you"); + addText("keyboard_notbound", "The keyboard it not bound"); + addText("bind_keyboard", "Bounded the keyboard to %s"); + addText("cleared_keyboard", "Cleared the keyboard"); addText("smart_glasses.peripherals", "Peripherals"); addText("smart_glasses.modules", "Modules"); addText("saddle_turtle.dismount_hint", "Controlling %1$s. Press %2$s and %3$s to dismount."); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java index 558f240ee..469fd24bf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java @@ -31,7 +31,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List END_AUTOMATA_CORE = APRegistration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); public static final RegistryObject HOTKEY_MODULE = APRegistration.ITEMS.register("hotkey_module", HotkeyModuleItem::new); public static final RegistryObject HUSBANDRY_AUTOMATA_CORE = APRegistration.ITEMS.register("husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore)); + public static final RegistryObject KEYBOARD = APRegistration.ITEMS.register("keyboard", KeyboardItem::new); public static final RegistryObject MEMORY_CARD = APRegistration.ITEMS.register("memory_card", MemoryCardItem::new); public static final RegistryObject NIGHT_VISION_MODULE = APRegistration.ITEMS.register("nightvision_module", NightVisionModuleItem::new); public static final RegistryObject OVERLAY_MODULE = APRegistration.ITEMS.register("overlay_module", OverlayGlassesItem::new); From 256cf0ee61886b2f31c1df3af54cc9590834e319 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 15 Mar 2025 15:02:15 -0600 Subject: [PATCH 16/24] make keyboard based on computer ID instead of position --- .../common/items/KeyboardItem.java | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index abf96b453..20803deb5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -54,20 +54,21 @@ public boolean isEnabled() { @NotNull @Override public InteractionResult useOn(UseOnContext context) { - if (context.getPlayer() == null) + Player player = context.getPlayer(); + if (player == null) return InteractionResult.PASS; - if (SideHelper.isClientPlayer(context.getPlayer())) + if (SideHelper.isClientPlayer(player)) return InteractionResult.PASS; - if (!context.getPlayer().isShiftKeyDown()) + if (!player.isShiftKeyDown()) return InteractionResult.PASS; BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); if (entity instanceof TileComputerBase) { - bind(context.getPlayer(), context.getItemInHand(), context.getClickedPos()); + bind(player, context.getItemInHand(), context.getLevel(), context.getClickedPos()); } else { - clear(context.getPlayer(), context.getItemInHand()); + clear(player, context.getItemInHand()); } return super.useOn(context); } @@ -92,9 +93,9 @@ public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int i data.remove(BIND_TAG); } - if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { - if (entity instanceof ServerPlayer serverPlayer) { - NetworkHooks.openScreen(serverPlayer, ((IInventoryItem) this).createContainer(serverPlayer, itemStack), buf -> { + if (entity instanceof ServerPlayer serverPlayer) { + if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { + NetworkHooks.openScreen(serverPlayer, this.createContainer(serverPlayer, itemStack), buf -> { buf.writeBlockPos(serverPlayer.blockPosition()); buf.writeItem(itemStack); }); @@ -104,19 +105,19 @@ public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int i @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { - if (playerIn.level.isClientSide()) + if (playerIn.level.isClientSide()) { return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); + } // Used to prevent the menu from opening when we just want to bind/unbind the keyboard - if (!playerIn.isShiftKeyDown()) { - if (!playerIn.getItemInHand(handIn).getOrCreateTag().contains(BIND_TAG)) { - playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.keyboard_notbound")), false); - return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); - } - // Run the super use which handles the IInventoryItem stuff to actually open the container - return super.use(worldIn, playerIn, handIn); + if (playerIn.isShiftKeyDown()) { + return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); } - - return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); + if (!playerIn.getItemInHand(handIn).getOrCreateTag().contains(BIND_TAG)) { + playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.keyboard_notbound")), false); + return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); + } + // Run the super use which handles the IInventoryItem stuff to actually open the container + return super.use(worldIn, playerIn, handIn); } @Override @@ -125,27 +126,38 @@ public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List Date: Sat, 15 Mar 2025 16:19:44 -0600 Subject: [PATCH 17/24] run runData --- .../03e4de26f1265135874f8cdcaebc09d9c08eb42b | 3 + .../2db41954e490230d51b10affff25ee2ee27b8d5b | 2 + .../5a761efb7472ef97566e41e81451930a004134bf | 14 +++ .../67cce32b1c3cbbcb1f646605f4914e3f196986c2 | 17 +++ .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 40 +++++++ .../ae219fa7c7d3297c14e454863eac3998a4eab78c | 7 ++ .../b8526e444ae7356037f3a813274f6835d1f3dd16 | 33 ++++++ .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 2 + .../f95c7003282837dabaa33e3ffceec4e6865b5218 | 4 + .../blockstates/block_reader.json | 57 +++++++++ .../blockstates/chat_box.json | 57 +++++++++ .../blockstates/colony_integrator.json | 57 +++++++++ .../blockstates/distance_detector.json | 57 +++++++++ .../blockstates/energy_detector.json | 57 +++++++++ .../blockstates/environment_detector.json | 57 +++++++++ .../blockstates/fluid_detector.json | 57 +++++++++ .../blockstates/gas_detector.json | 57 +++++++++ .../blockstates/geo_scanner.json | 57 +++++++++ .../blockstates/inventory_manager.json | 57 +++++++++ .../blockstates/me_bridge.json | 57 +++++++++ .../blockstates/nbt_storage.json | 57 +++++++++ .../blockstates/peripheral_casing.json | 57 +++++++++ .../blockstates/player_detector.json | 57 +++++++++ .../blockstates/redstone_integrator.json | 57 +++++++++ .../blockstates/rs_bridge.json | 57 +++++++++ .../advancedperipherals/lang/en_us.json | 112 ++++++++++++++++++ .../models/block/block_reader.json | 12 ++ .../models/block/chat_box.json | 10 ++ .../models/block/colony_integrator.json | 10 ++ .../models/block/distance_detector.json | 12 ++ .../models/block/energy_detector.json | 12 ++ .../models/block/environment_detector.json | 10 ++ .../models/block/fluid_detector.json | 12 ++ .../models/block/gas_detector.json | 12 ++ .../models/block/geo_scanner.json | 10 ++ .../models/block/inventory_manager.json | 10 ++ .../models/block/me_bridge.json | 10 ++ .../models/block/nbt_storage.json | 10 ++ .../models/block/peripheral_casing.json | 8 ++ .../models/block/player_detector.json | 13 ++ .../models/block/redstone_integrator.json | 13 ++ .../models/block/rs_bridge.json | 10 ++ .../armor/smart_glasses_netherite.json | 34 ++++++ .../advancedperipheralstab/block_reader.json | 34 ++++++ .../advancedperipheralstab/chat_box.json | 34 ++++++ .../chunk_controller.json | 34 ++++++ .../advancedperipheralstab/computer_tool.json | 34 ++++++ .../energy_detector.json | 34 ++++++ .../environment_detector.json | 34 ++++++ .../advancedperipheralstab/geo_scanner.json | 34 ++++++ .../inventory_manager.json | 34 ++++++ .../advancedperipheralstab/memory_card.json | 34 ++++++ .../advancedperipheralstab/nbt_storage.json | 34 ++++++ .../overpowered_end_automata_core.json | 34 ++++++ .../overpowered_husbandry_automata_core.json | 34 ++++++ .../overpowered_weak_automata_core.json | 34 ++++++ .../peripheral_casing.json | 34 ++++++ .../player_detector.json | 34 ++++++ .../redstone_integrator.json | 34 ++++++ .../weak_automata_core.json | 34 ++++++ .../pocket_upgrades/chatty_pocket.json | 4 + .../pocket_upgrades/colony_pocket.json | 4 + .../pocket_upgrades/distance_pocket.json | 4 + .../pocket_upgrades/environment_pocket.json | 4 + .../pocket_upgrades/geoscanner_pocket.json | 4 + .../pocket_upgrades/player_pocket.json | 4 + .../turtle_upgrades/chatty_turtle.json | 4 + .../turtle_upgrades/chunky_turtle.json | 4 + .../turtle_upgrades/compass_turtle.json | 4 + .../turtle_upgrades/end_automata.json | 4 + .../turtle_upgrades/environment_turtle.json | 4 + .../turtle_upgrades/geoscanner_turtle.json | 4 + .../turtle_upgrades/husbandry_automata.json | 4 + .../overpowered_end_automata.json | 4 + .../overpowered_husbandry_automata.json | 4 + .../overpowered_weak_automata.json | 4 + .../turtle_upgrades/player_turtle.json | 4 + .../turtle_upgrades/saddle_turtle.json | 4 + .../turtle_upgrades/weak_automata.json | 4 + .../loot_tables/blocks/block_reader.json | 26 ++++ .../loot_tables/blocks/chat_box.json | 26 ++++ .../loot_tables/blocks/colony_integrator.json | 26 ++++ .../loot_tables/blocks/distance_detector.json | 26 ++++ .../loot_tables/blocks/energy_detector.json | 26 ++++ .../blocks/environment_detector.json | 26 ++++ .../loot_tables/blocks/fluid_detector.json | 26 ++++ .../loot_tables/blocks/gas_detector.json | 26 ++++ .../loot_tables/blocks/geo_scanner.json | 26 ++++ .../loot_tables/blocks/inventory_manager.json | 26 ++++ .../loot_tables/blocks/me_bridge.json | 26 ++++ .../loot_tables/blocks/nbt_storage.json | 26 ++++ .../loot_tables/blocks/peripheral_casing.json | 26 ++++ .../loot_tables/blocks/player_detector.json | 26 ++++ .../blocks/redstone_integrator.json | 26 ++++ .../loot_tables/blocks/rs_bridge.json | 26 ++++ .../armor/smart_glasses_netherite.json | 12 ++ .../recipes/block_reader.json | 28 +++++ .../advancedperipherals/recipes/chat_box.json | 22 ++++ .../recipes/chunk_controller.json | 22 ++++ .../recipes/colony_integrator.json | 35 ++++++ .../recipes/computer_tool.json | 19 +++ .../recipes/energy_detector.json | 28 +++++ .../recipes/environment_detector.json | 28 +++++ .../recipes/geo_scanner.json | 28 +++++ .../recipes/inventory_manager.json | 22 ++++ .../recipes/me_bridge.json | 35 ++++++ .../recipes/memory_card.json | 25 ++++ .../recipes/nbt_storage.json | 25 ++++ .../overpowered_end_automata_core.json | 14 +++ .../overpowered_husbandry_automata_core.json | 14 +++ .../overpowered_weak_automata_core.json | 14 +++ .../recipes/peripheral_casing.json | 22 ++++ .../recipes/player_detector.json | 22 ++++ .../recipes/redstone_integrator.json | 22 ++++ .../recipes/rs_bridge.json | 35 ++++++ .../recipes/weak_automata_core.json | 31 +++++ .../p2p_attunements/cable_p2p_tunnel.json | 7 ++ .../tags/items/smart_glasses.json | 6 + .../forge/tags/blocks/needs_wood_tool.json | 5 + .../tags/blocks/mineable/pickaxe.json | 20 ++++ .../tags/blocks/needs_iron_tool.json | 19 +++ .../acquirable_job_site.json | 5 + 122 files changed, 2989 insertions(+) create mode 100644 src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b create mode 100644 src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b create mode 100644 src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf create mode 100644 src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 create mode 100644 src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e create mode 100644 src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c create mode 100644 src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 create mode 100644 src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 create mode 100644 src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/block_reader.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/chat_box.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/colony_integrator.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/energy_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/environment_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/geo_scanner.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/inventory_manager.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/me_bridge.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/nbt_storage.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/peripheral_casing.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/player_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/redstone_integrator.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/rs_bridge.json create mode 100644 src/generated/resources/assets/advancedperipherals/lang/en_us.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/block_reader.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/chat_box.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/player_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/block_reader.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chat_box.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chunk_controller.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/computer_tool.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/energy_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/environment_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/geo_scanner.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/inventory_manager.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/memory_card.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/nbt_storage.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_end_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_husbandry_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_weak_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/peripheral_casing.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/player_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/redstone_integrator.json create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/weak_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/geoscanner_pocket.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/player_pocket.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/end_automata.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/environment_turtle.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/geoscanner_turtle.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/husbandry_automata.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_end_automata.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_husbandry_automata.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_weak_automata.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/player_turtle.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/weak_automata.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/colony_integrator.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/block_reader.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/chat_box.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/colony_integrator.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/computer_tool.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/energy_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/environment_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/me_bridge.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/memory_card.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/overpowered_end_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/overpowered_husbandry_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/overpowered_weak_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/player_detector.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json create mode 100644 src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json create mode 100644 src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json create mode 100644 src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json create mode 100644 src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json diff --git a/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b b/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b new file mode 100644 index 000000000..9c274278b --- /dev/null +++ b/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b @@ -0,0 +1,3 @@ +// 1.19.2 2025-03-15T16:18:50.46663 Tags for minecraft:item +de4b4f45ec18b2b1f0db1c36882981042e20ee23 data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json +72eba3b11f69e16c87488f7c4ba7cfdad42c378e data/advancedperipherals/tags/items/smart_glasses.json diff --git a/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b b/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b new file mode 100644 index 000000000..8e30d22ee --- /dev/null +++ b/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b @@ -0,0 +1,2 @@ +// 1.19.2 2025-03-15T16:18:50.465796 AP POI Type Tags +d3d6b837660a4e213f287ad9d11e12368b90cd8e data/minecraft/tags/point_of_interest_type/acquirable_job_site.json diff --git a/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf new file mode 100644 index 000000000..5483d6bb3 --- /dev/null +++ b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf @@ -0,0 +1,14 @@ +// 1.19.2 2025-03-15T16:18:50.466321 Turtle Upgrades +b8f19ae0fb5bb898facc08e3787e0f96c8211881 data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json +fe98c60e7d61139aacf2d0872873e610aac8a37b data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json +ae619da638ad89d7302d832d6c09e2c87401c539 data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json +a25b955d6db4ad48d43255d48d05c7f3acd60ea3 data/advancedperipherals/computercraft/turtle_upgrades/end_automata.json +98d71a2e17f3d30bbb76c1ba2f94a1cd610c2cd2 data/advancedperipherals/computercraft/turtle_upgrades/environment_turtle.json +d16f77b8c8c50dfefd757439802a13568cdcd5ec data/advancedperipherals/computercraft/turtle_upgrades/geoscanner_turtle.json +522bb2a1afb9f2be97af7cf65cd9aa159d76d13a data/advancedperipherals/computercraft/turtle_upgrades/husbandry_automata.json +c9b2df2d4fed11f60a8e6f8da77b2fa53dd13572 data/advancedperipherals/computercraft/turtle_upgrades/overpowered_end_automata.json +42fc2b9a2601ef44d617cb18302c2c4fff31d282 data/advancedperipherals/computercraft/turtle_upgrades/overpowered_husbandry_automata.json +fa7743922ef6b4dd3e633f2857e4047d533f13b5 data/advancedperipherals/computercraft/turtle_upgrades/overpowered_weak_automata.json +4054c59ceb099f17c4555fd5f36b2f8b4109f624 data/advancedperipherals/computercraft/turtle_upgrades/player_turtle.json +fa6624d0dab03bd26c2cccecad51848d5071ecd3 data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json +c8059a2717cfac5b02898658c4d2d52fbd5710d4 data/advancedperipherals/computercraft/turtle_upgrades/weak_automata.json diff --git a/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 new file mode 100644 index 000000000..ca3f6253d --- /dev/null +++ b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 @@ -0,0 +1,17 @@ +// 1.19.2 2025-03-15T16:18:50.465594 LootTables +618b63c020ab64890c8a2d2506dd61cd30259a44 data/advancedperipherals/loot_tables/blocks/block_reader.json +0923665563d05307a7fa7d711a2d7a994a31eb6e data/advancedperipherals/loot_tables/blocks/chat_box.json +bf2a80256cfba0bd8c0283d493882e5816882f1f data/advancedperipherals/loot_tables/blocks/colony_integrator.json +cff4b81aa381bc0d1172b0a4c8bb35c1b954a018 data/advancedperipherals/loot_tables/blocks/distance_detector.json +1c5dbe1a8e07e040a3c2893a002cd535ee41dc20 data/advancedperipherals/loot_tables/blocks/energy_detector.json +8cc03eca1d191f725bc558836f26a85a466cb127 data/advancedperipherals/loot_tables/blocks/environment_detector.json +12589e7642b383029457d97a64637494ea8507a3 data/advancedperipherals/loot_tables/blocks/fluid_detector.json +421a3ece56485bd46374844639bfd606ce4665ec data/advancedperipherals/loot_tables/blocks/gas_detector.json +a2ae352dce564b878daecf47026f268dd432fbcf data/advancedperipherals/loot_tables/blocks/geo_scanner.json +807d449d02c0af701f84d3e806ebac20d3a1f91c data/advancedperipherals/loot_tables/blocks/inventory_manager.json +bb9b442dfad1d5f31397585c8394c85243fa169a data/advancedperipherals/loot_tables/blocks/me_bridge.json +52b1fe2e265be456ebf48d7e0d9ebcc8c994176f data/advancedperipherals/loot_tables/blocks/nbt_storage.json +2651e6053857a31f5bccc360969924848a197ad5 data/advancedperipherals/loot_tables/blocks/peripheral_casing.json +6b5058b6bc49689bf2b858b89f3981a4bb681750 data/advancedperipherals/loot_tables/blocks/player_detector.json +6af6542c7b64aa22dbfcdb01299daf4911827a49 data/advancedperipherals/loot_tables/blocks/redstone_integrator.json +b221c6a82da0875264a112b54f847ac6a1f36797 data/advancedperipherals/loot_tables/blocks/rs_bridge.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e new file mode 100644 index 000000000..5b054c33c --- /dev/null +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -0,0 +1,40 @@ +// 1.19.2 2025-03-15T16:18:50.466743 Recipes +045608027e4a5ea2d7dee7f402346b8e69f21675 data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json +db2dada2fdf42ca1bbf47f1eb075d1f9de89dfa8 data/advancedperipherals/advancements/recipes/advancedperipheralstab/block_reader.json +77c55e8500be4a344ca563a8bf7642257cdc7b8b data/advancedperipherals/advancements/recipes/advancedperipheralstab/chat_box.json +96208b06b0c3c125762cd517506a5ffb6b1d55ac data/advancedperipherals/advancements/recipes/advancedperipheralstab/chunk_controller.json +eb1d84b0b82fd6671876d0885746f9e3e15803e3 data/advancedperipherals/advancements/recipes/advancedperipheralstab/computer_tool.json +5a1e92ee63dce1cb74c56b7e70587a0c54132de4 data/advancedperipherals/advancements/recipes/advancedperipheralstab/energy_detector.json +34d04b885af7947279752129f1f6e107cdf3cf05 data/advancedperipherals/advancements/recipes/advancedperipheralstab/environment_detector.json +91af310c4f272e800172a7f7e717fa29fc35dc62 data/advancedperipherals/advancements/recipes/advancedperipheralstab/geo_scanner.json +65184f82a2fe743edc4db31c0c362c74d1e4df84 data/advancedperipherals/advancements/recipes/advancedperipheralstab/inventory_manager.json +e575414582eb367f0689a3a90fc75aca2d6cd2fc data/advancedperipherals/advancements/recipes/advancedperipheralstab/memory_card.json +cb79be6d0ee7890abb2238b53edd55fd2338ed81 data/advancedperipherals/advancements/recipes/advancedperipheralstab/nbt_storage.json +e2d8bd0a887eb42d05f460d6fee007b7bb4c533c data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_end_automata_core.json +1db7ed04f8af5413308160b03f5b21d5932195f5 data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_husbandry_automata_core.json +d3d8709f4fdb3d68613d751bba5b9a94b8842046 data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_weak_automata_core.json +d27c1267208fd9036c5c45f7f6cbd4f6f67b3845 data/advancedperipherals/advancements/recipes/advancedperipheralstab/peripheral_casing.json +d8870644bb7d48c5ae33dcea2afbcfa106729d7b data/advancedperipherals/advancements/recipes/advancedperipheralstab/player_detector.json +7acff70533792bd089a655f8f24cdea6995aac0c data/advancedperipherals/advancements/recipes/advancedperipheralstab/redstone_integrator.json +fc0c3d99bec43318802f357083c7d98fde92567f data/advancedperipherals/advancements/recipes/advancedperipheralstab/weak_automata_core.json +66999fea36aa4113567753f104630f6490dda6ba data/advancedperipherals/recipes/armor/smart_glasses_netherite.json +b10b5cbcc668438001744d5b90d9838ab4d293cb data/advancedperipherals/recipes/block_reader.json +3c9618832fe0ac32cac0f04fbc5afad225418239 data/advancedperipherals/recipes/chat_box.json +a78adfcca4c7579b143aac5648a7eca9085c0dba data/advancedperipherals/recipes/chunk_controller.json +d4c090dc64185fab9b123fffeda6966308b6c3d0 data/advancedperipherals/recipes/colony_integrator.json +f1f468c732f8c802c27776d3fd7aac432bcac8e3 data/advancedperipherals/recipes/computer_tool.json +4f0d0427d8c8774e350e7cfd1767a9e4802f4ca1 data/advancedperipherals/recipes/energy_detector.json +55c257e4e8548d1453a7ab96c547d64c22b3e1d6 data/advancedperipherals/recipes/environment_detector.json +2ddf64c122165bcd3a277db8a1c7e96b4d510c67 data/advancedperipherals/recipes/geo_scanner.json +ebe70aa9fe80c5b962c13aa1fbadc32269ba81b9 data/advancedperipherals/recipes/inventory_manager.json +82895838af6c6aea0c60e3a3fbf71073ab684167 data/advancedperipherals/recipes/me_bridge.json +809bc6929cf5eab72648e8f1fb565b58749fec12 data/advancedperipherals/recipes/memory_card.json +8a73c4eb66e7a1cdc8e51d33466cf5a30da9270e data/advancedperipherals/recipes/nbt_storage.json +360432f30d61291066aa8c54692629f7a92e178d data/advancedperipherals/recipes/overpowered_end_automata_core.json +4ea6e90d13a61d90ad245539d20020ff9cb843e1 data/advancedperipherals/recipes/overpowered_husbandry_automata_core.json +6c4b197e7579a8868668be231ba36487a0e3626d data/advancedperipherals/recipes/overpowered_weak_automata_core.json +a91556eb09a2a8c57b323928a76095a4b17241b7 data/advancedperipherals/recipes/peripheral_casing.json +1d476bfb11dcf490cefa9916695d91aec0cc8a19 data/advancedperipherals/recipes/player_detector.json +110983bae78f033dc8b12fd04ba3b7edcf035237 data/advancedperipherals/recipes/redstone_integrator.json +4ba2670271ef2b7c8be861f6277ae24c307dac5b data/advancedperipherals/recipes/rs_bridge.json +7c783b341e783b22be4e40efbe3c88947e1902ec data/advancedperipherals/recipes/weak_automata_core.json diff --git a/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c new file mode 100644 index 000000000..4a3bf0dbb --- /dev/null +++ b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c @@ -0,0 +1,7 @@ +// 1.19.2 2025-03-15T16:18:50.46512 Pocket Computer Upgrades +b672635324c0df354e587efc81d0b19a581eae2f data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json +30b8f663613c7ce77048fd69631afcc11a682276 data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json +661dc77bd0442bfb2a5ed80cff271071817bb22d data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json +d4647159c2f2693a9c5e8d12bf740635751d29a8 data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json +8216a0a7d8ebe3ae738c8fc3626df25eb0a2e07a data/advancedperipherals/computercraft/pocket_upgrades/geoscanner_pocket.json +a38aa83593f7ad0ace98e01bb3b5f06f272ef734 data/advancedperipherals/computercraft/pocket_upgrades/player_pocket.json diff --git a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 new file mode 100644 index 000000000..005d0e248 --- /dev/null +++ b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 @@ -0,0 +1,33 @@ +// 1.19.2 2025-03-15T16:18:50.466039 Block States: advancedperipherals +5e28ce1be9a6996d982641e5df1fa7162090b8cc assets/advancedperipherals/blockstates/block_reader.json +f42bdde60f84fdb312f7cf3b2be461d9c11ebdc8 assets/advancedperipherals/blockstates/chat_box.json +1227aa092fcf1327547ace6ccc9db230e45891b0 assets/advancedperipherals/blockstates/colony_integrator.json +83144ea6122b3abe70777458ac913b6f217c27cc assets/advancedperipherals/blockstates/distance_detector.json +67420f28031606ca03db9a044141bb22b0fa78b7 assets/advancedperipherals/blockstates/energy_detector.json +340b5baa62e5e6a2c35a05b4411be5937ac2bbb8 assets/advancedperipherals/blockstates/environment_detector.json +f40e0ac205d0473908fd957d035dd747dc64e26a assets/advancedperipherals/blockstates/fluid_detector.json +bbefa012be11f3735da4d9deb1f0d2402c761cd8 assets/advancedperipherals/blockstates/gas_detector.json +57c00996bcf1d783116a9210842f246612089555 assets/advancedperipherals/blockstates/geo_scanner.json +d1fe6188b0b0ce8779cb9795a746177858cbaa41 assets/advancedperipherals/blockstates/inventory_manager.json +7f82e776900e3d120cb1a06ec975731905dcaff7 assets/advancedperipherals/blockstates/me_bridge.json +18d64343fda510aa2abf2fb1a07bc635100ff6e8 assets/advancedperipherals/blockstates/nbt_storage.json +51d1ce8b8772773acc82895ff6314370138c9d5a assets/advancedperipherals/blockstates/peripheral_casing.json +ff12c7217911184266589813a2c8f9b0d46cfd65 assets/advancedperipherals/blockstates/player_detector.json +726cf2599b0c765bcfacda88a1943be74f985877 assets/advancedperipherals/blockstates/redstone_integrator.json +6b176e8fdb048f7b6678bfbc1c4baf2bcfa67a1f assets/advancedperipherals/blockstates/rs_bridge.json +544ff1ecb58622350b58940036b4b1908e1146da assets/advancedperipherals/models/block/block_reader.json +fbaa69d6c98549d3f2d4a1c7bebd9b6b80d56621 assets/advancedperipherals/models/block/chat_box.json +68f9d37bd85649937150ba0bb8f4496bb2ef218d assets/advancedperipherals/models/block/colony_integrator.json +80b30400b6ebac490a1abaad965f33c1b62c19e9 assets/advancedperipherals/models/block/distance_detector.json +b4c6645fda79d960e9201e2a60eb1c8063a07d18 assets/advancedperipherals/models/block/energy_detector.json +eca505b2bd8db5f1d13f1e28093db329b70af978 assets/advancedperipherals/models/block/environment_detector.json +f6ab51bcfc829c7db490f691e8eb491e5e7028f3 assets/advancedperipherals/models/block/fluid_detector.json +35bbc0e2edf74f6e27029cc23465e203d459f234 assets/advancedperipherals/models/block/gas_detector.json +46ebb4c9a31e224bac13ad20334469c0b55d285c assets/advancedperipherals/models/block/geo_scanner.json +2142aaccd0a0bc56aaa2091128466d2c9a733aab assets/advancedperipherals/models/block/inventory_manager.json +f089dda9e6ac12d638707fd24d099ccd56a54ccc assets/advancedperipherals/models/block/me_bridge.json +65afcae128339b244508dc66620c6c00729fce8e assets/advancedperipherals/models/block/nbt_storage.json +f6cb0dda1ce8217563903d2dfaf5ef0297939750 assets/advancedperipherals/models/block/peripheral_casing.json +5a1679b4dcc8da2d8c67674216d242456bb51366 assets/advancedperipherals/models/block/player_detector.json +d08b8946e1eb01cc9c8af4fa297b582614d1034b assets/advancedperipherals/models/block/redstone_integrator.json +41cf7d22016a995aeda9df9d9cbf1d4069b99f9e assets/advancedperipherals/models/block/rs_bridge.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 new file mode 100644 index 000000000..577e18447 --- /dev/null +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -0,0 +1,2 @@ +// 1.19.2 2025-03-15T16:18:50.465918 Languages: en_us +fe52123263b91f49093d74278e8709484e4dfe59 assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 new file mode 100644 index 000000000..032d093dc --- /dev/null +++ b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 @@ -0,0 +1,4 @@ +// 1.19.2 2025-03-15T16:18:50.466493 Block tags +e1f71dcb4f9e7e36e29b0ad09d6520dc3adfa4a6 data/forge/tags/blocks/needs_wood_tool.json +03322cd493601129eaad6ba7c2a6d808023dfac1 data/minecraft/tags/blocks/mineable/pickaxe.json +277fe59db076a3eab3c97080531ad345f8ca5f3d data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/block_reader.json b/src/generated/resources/assets/advancedperipherals/blockstates/block_reader.json new file mode 100644 index 000000000..e69e7e473 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/block_reader.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/block_reader", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/block_reader", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/block_reader", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/block_reader", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/block_reader", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/block_reader" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/block_reader", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/block_reader", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/block_reader", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/block_reader", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/block_reader", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/block_reader", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/chat_box.json b/src/generated/resources/assets/advancedperipherals/blockstates/chat_box.json new file mode 100644 index 000000000..2af9bd73b --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/chat_box.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/chat_box", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/chat_box", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/chat_box", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/chat_box", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/chat_box", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/chat_box" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/chat_box", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/chat_box", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/chat_box", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/chat_box", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/chat_box", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/chat_box", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/colony_integrator.json b/src/generated/resources/assets/advancedperipherals/blockstates/colony_integrator.json new file mode 100644 index 000000000..22543544e --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/colony_integrator.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/colony_integrator", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/colony_integrator", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/colony_integrator", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/colony_integrator", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/colony_integrator", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/colony_integrator" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/colony_integrator", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/colony_integrator", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/colony_integrator", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/colony_integrator", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/colony_integrator", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/colony_integrator", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json new file mode 100644 index 000000000..4201dd6d7 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/distance_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/distance_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/distance_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/distance_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/distance_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/distance_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/distance_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/distance_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/distance_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/distance_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/distance_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/distance_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/energy_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/energy_detector.json new file mode 100644 index 000000000..bd5d03c83 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/energy_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/energy_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/energy_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/energy_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/energy_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/energy_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/energy_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/energy_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/energy_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/energy_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/energy_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/energy_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/energy_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/environment_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/environment_detector.json new file mode 100644 index 000000000..5fd1b7c01 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/environment_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/environment_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/environment_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/environment_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/environment_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/environment_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/environment_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/environment_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/environment_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/environment_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/environment_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/environment_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/environment_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json new file mode 100644 index 000000000..6641af423 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/fluid_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/fluid_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/fluid_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/fluid_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json new file mode 100644 index 000000000..aee9fc55d --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/gas_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/gas_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/gas_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/gas_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/gas_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/gas_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/gas_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/gas_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/gas_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/gas_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/gas_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/gas_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/geo_scanner.json b/src/generated/resources/assets/advancedperipherals/blockstates/geo_scanner.json new file mode 100644 index 000000000..0d82f0062 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/geo_scanner.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/geo_scanner", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/geo_scanner", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/geo_scanner", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/geo_scanner", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/geo_scanner", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/geo_scanner" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/geo_scanner", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/geo_scanner", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/geo_scanner", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/geo_scanner", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/geo_scanner", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/geo_scanner", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/inventory_manager.json b/src/generated/resources/assets/advancedperipherals/blockstates/inventory_manager.json new file mode 100644 index 000000000..7e9607135 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/inventory_manager.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/inventory_manager", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/inventory_manager", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/inventory_manager", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/inventory_manager", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/inventory_manager", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/inventory_manager" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/inventory_manager", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/inventory_manager", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/inventory_manager", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/inventory_manager", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/inventory_manager", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/inventory_manager", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/me_bridge.json b/src/generated/resources/assets/advancedperipherals/blockstates/me_bridge.json new file mode 100644 index 000000000..02a1549c5 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/me_bridge.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/me_bridge", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/me_bridge", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/me_bridge", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/me_bridge", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/me_bridge", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/me_bridge" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/me_bridge", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/me_bridge", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/me_bridge", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/me_bridge", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/me_bridge", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/me_bridge", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/nbt_storage.json b/src/generated/resources/assets/advancedperipherals/blockstates/nbt_storage.json new file mode 100644 index 000000000..a4550cb3b --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/nbt_storage.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/nbt_storage", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/nbt_storage", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/nbt_storage", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/nbt_storage", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/nbt_storage", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/nbt_storage" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/nbt_storage", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/nbt_storage", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/nbt_storage", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/nbt_storage", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/nbt_storage", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/nbt_storage", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/peripheral_casing.json b/src/generated/resources/assets/advancedperipherals/blockstates/peripheral_casing.json new file mode 100644 index 000000000..c656bd204 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/peripheral_casing.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/peripheral_casing", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/peripheral_casing" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/peripheral_casing", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/peripheral_casing", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/peripheral_casing", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/player_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/player_detector.json new file mode 100644 index 000000000..6df55ae24 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/player_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/player_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/player_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/player_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/player_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/player_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/player_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/player_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/player_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/player_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/player_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/player_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/player_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/redstone_integrator.json b/src/generated/resources/assets/advancedperipherals/blockstates/redstone_integrator.json new file mode 100644 index 000000000..adb8eb248 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/redstone_integrator.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/redstone_integrator", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/redstone_integrator" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/redstone_integrator", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/redstone_integrator", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/redstone_integrator", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/rs_bridge.json b/src/generated/resources/assets/advancedperipherals/blockstates/rs_bridge.json new file mode 100644 index 000000000..a1b1d565a --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/rs_bridge.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/rs_bridge", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/rs_bridge", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/rs_bridge", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/rs_bridge", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/rs_bridge", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/rs_bridge" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/rs_bridge", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/rs_bridge", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/rs_bridge", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/rs_bridge", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/rs_bridge", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/rs_bridge", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json new file mode 100644 index 000000000..9a61a7d44 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -0,0 +1,112 @@ +{ + "advancedperipherals.name": "Advanced Peripherals", + "advancements.advancedperipherals.base_toolkit": "Gentleman's set!", + "advancements.advancedperipherals.base_toolkit.description": "Collect a redstone integrator, inventory manager and energy detector. How did you even play without this?", + "advancements.advancedperipherals.end_automata_core": "End Automata Core", + "advancements.advancedperipherals.end_automata_core.description": "If you can code gps-free position location with this, you're a powerful human being", + "advancements.advancedperipherals.husbandry_automata_core": "Husbandry Automata Core", + "advancements.advancedperipherals.husbandry_automata_core.description": "Is this core gluten-free?", + "advancements.advancedperipherals.nbt_toolkit": "No secrets", + "advancements.advancedperipherals.nbt_toolkit.description": "Collect a NBT storage and block reader. Now, all the world's secrets are open to you!", + "advancements.advancedperipherals.overpowered_automata_core": "Overpowered Automata Core", + "advancements.advancedperipherals.overpowered_automata_core.description": "Can you handle so much power?", + "advancements.advancedperipherals.root": "Advanced Peripherals", + "advancements.advancedperipherals.root.description": "Every journey starts with the first block", + "advancements.advancedperipherals.sense_toolkit": "The truth can't hide forever", + "advancements.advancedperipherals.sense_toolkit.description": "Collect a geo scanner and environmental detector. There are no limits for observability!", + "advancements.advancedperipherals.weak_automata_core": "First Automata Core", + "advancements.advancedperipherals.weak_automata_core.description": "Does the afterlife exist in minecraft?", + "block.advancedperipherals.block_reader": "Block Reader", + "block.advancedperipherals.chat_box": "Chat Box", + "block.advancedperipherals.colony_integrator": "Colony Integrator", + "block.advancedperipherals.distance_detector": "Distance Detector", + "block.advancedperipherals.energy_detector": "Energy Detector", + "block.advancedperipherals.environment_detector": "Environment Detector", + "block.advancedperipherals.fluid_detector": "Fluid Detector", + "block.advancedperipherals.gas_detector": "Gas Detector", + "block.advancedperipherals.geo_scanner": "Geo Scanner", + "block.advancedperipherals.inventory_manager": "Inventory Manager", + "block.advancedperipherals.me_bridge": "ME Bridge", + "block.advancedperipherals.nbt_storage": "NBT Storage", + "block.advancedperipherals.peripheral_casing": "Peripheral Casing", + "block.advancedperipherals.player_detector": "Player Detector", + "block.advancedperipherals.redstone_integrator": "Redstone Integrator", + "block.advancedperipherals.rs_bridge": "RS Bridge", + "curios.identifier.glasses": "Glasses", + "entity.minecraft.villager.advancedperipherals.computer_scientist": "Computer Scientist", + "item.advancedperipherals.cable_p2p_tunnel": "Cable P2P Tunnel", + "item.advancedperipherals.chunk_controller": "Chunk Controller", + "item.advancedperipherals.computer_tool": "Computer Tool", + "item.advancedperipherals.end_automata_core": "End Automata Core", + "item.advancedperipherals.hotkey_module": "Hotkey Module", + "item.advancedperipherals.husbandry_automata_core": "Husbandry Automata Core", + "item.advancedperipherals.keyboard": "Wireless Keyboard", + "item.advancedperipherals.memory_card": "Memory Card", + "item.advancedperipherals.nightvision_module": "Night Vision Module", + "item.advancedperipherals.overlay_module": "Overlay Module", + "item.advancedperipherals.overpowered_end_automata_core": "Overpowered End Automata Core", + "item.advancedperipherals.overpowered_husbandry_automata_core": "Overpowered Husbandry Automata Core", + "item.advancedperipherals.overpowered_weak_automata_core": "Overpowered Weak Automata Core", + "item.advancedperipherals.smart_glasses": "Smart Glasses", + "item.advancedperipherals.smart_glasses_interface": "Smart Glasses Interface", + "item.advancedperipherals.smart_glasses_netherite": "Netherite reinforced Smart Glasses", + "item.advancedperipherals.tooltip.binding.bound_to": "&7Bound to &b%s&7.", + "item.advancedperipherals.tooltip.binding.bound_to_glasses": "&7Bound to Glasses with id &b%s&7.", + "item.advancedperipherals.tooltip.block_reader": "&7Reads nbt data of blocks to interact with blocks which do not have computer support.", + "item.advancedperipherals.tooltip.chat_box": "&7Interacts with the ingame chat, can read and write messages.", + "item.advancedperipherals.tooltip.chunk_controller": "&7A crafting ingredient for the Chunky Turtle.", + "item.advancedperipherals.tooltip.colony_integrator": "&7Interacts with Minecolonies to read data about your colony and citizens.", + "item.advancedperipherals.tooltip.computer_tool": "&7This tool was made to tune our blocks. But for now, it's just a blue useless wrench.", + "item.advancedperipherals.tooltip.disabled": "&cThis item is disabled in config, so you can craft it, but it'll not have any functionality.", + "item.advancedperipherals.tooltip.end_automata_core": "&7Upgrade for turtles, that allows basic interaction with the world and teleportation in one dimension.", + "item.advancedperipherals.tooltip.energy_detector": "&7Can detect energy flow and acts as a resistor.", + "item.advancedperipherals.tooltip.environment_detector": "&7This peripheral interacts with the minecraft world.", + "item.advancedperipherals.tooltip.geo_scanner": "&7Scans the area around it to find some shiny ores.", + "item.advancedperipherals.tooltip.husbandry_automata_core": "&7Upgrade for turtles, that allows basic and advanced interactions with animals.", + "item.advancedperipherals.tooltip.inventory_manager": "&7This block is able to send or receive specific items from a player inventory.", + "item.advancedperipherals.tooltip.me_bridge": "&7The ME Bridge interacts with Applied Energistics to manage your items.", + "item.advancedperipherals.tooltip.memory_card": "&7Can save the rights of a player to use it in an inventory manager.", + "item.advancedperipherals.tooltip.nbt_storage": "&7Acts like a storage disk. Can store nbt based data.", + "item.advancedperipherals.tooltip.overpowered_end_automata_core": "&7Improved version of the end automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", + "item.advancedperipherals.tooltip.overpowered_husbandry_automata_core": "&7Improved version of the husbandry automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", + "item.advancedperipherals.tooltip.overpowered_weak_automata_core": "&7Improved version of the weak automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile.", + "item.advancedperipherals.tooltip.peripheral_casing": "&7An empty hull without the love it deserves. Used as crafting ingredient", + "item.advancedperipherals.tooltip.player_detector": "&7This peripheral can be used to interact with players, but don't be a stalker.", + "item.advancedperipherals.tooltip.redstone_integrator": "&7This block is able to interact with redstone. Works exactly like the redstone api of an computer.", + "item.advancedperipherals.tooltip.rs_bridge": "&7The RS Bridge interacts with Refined Storage to manage your items.", + "item.advancedperipherals.tooltip.show_desc": "&b[&7%s&b] &7For Description", + "item.advancedperipherals.tooltip.weak_automata_core": "&7Upgrade for turtles, which makes turtles more useful.", + "item.advancedperipherals.weak_automata_core": "Weak Automata Core", + "itemGroup.advancedperipheralstab": "Advanced Peripherals", + "keybind.advancedperipherals.category": "Advanced Peripherals", + "keybind.advancedperipherals.description": "Show Description", + "pocket.advancedperipherals.chatty_pocket": "Chatty", + "pocket.advancedperipherals.colony_pocket": "Colony", + "pocket.advancedperipherals.distance_pocket": "Distance Detector", + "pocket.advancedperipherals.environment_pocket": "Environment", + "pocket.advancedperipherals.geoscanner_pocket": "Geo", + "pocket.advancedperipherals.player_pocket": "Player Detector", + "text.advancedperipherals.automata_core.feed_by_player": "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?", + "text.advancedperipherals.bind_keyboard": "Bounded the keyboard to %s", + "text.advancedperipherals.bind_memorycard": "Bounded the memory card to you", + "text.advancedperipherals.cleared_keyboard": "Cleared the keyboard", + "text.advancedperipherals.cleared_memorycard": "Cleared the memory card", + "text.advancedperipherals.keyboard.close": "Press ESC to close the Keyboard Screen", + "text.advancedperipherals.keyboard_notbound": "The keyboard it not bound", + "text.advancedperipherals.saddle_turtle.dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", + "text.advancedperipherals.smart_glasses.modules": "Modules", + "text.advancedperipherals.smart_glasses.peripherals": "Peripherals", + "turtle.advancedperipherals.chatty_turtle": "Chatty", + "turtle.advancedperipherals.chunky_turtle": "Chunky", + "turtle.advancedperipherals.compass_turtle": "Compass", + "turtle.advancedperipherals.end_automata": "End Automata", + "turtle.advancedperipherals.environment_turtle": "Environment", + "turtle.advancedperipherals.geoscanner_turtle": "Geo", + "turtle.advancedperipherals.husbandry_automata": "Husbandry Automata", + "turtle.advancedperipherals.overpowered_end_automata": "Overpowered End Automata", + "turtle.advancedperipherals.overpowered_husbandry_automata": "Overpowered Husbandry Automata", + "turtle.advancedperipherals.overpowered_weak_automata": "Overpowered Weak Automata", + "turtle.advancedperipherals.player_turtle": "Player Detector", + "turtle.advancedperipherals.saddle_turtle": "Saddle", + "turtle.advancedperipherals.weak_automata": "Weak Automata" +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/block_reader.json b/src/generated/resources/assets/advancedperipherals/models/block/block_reader.json new file mode 100644 index 000000000..a66a033a2 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/block_reader.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "down": "advancedperipherals:block/block_reader_down", + "east": "advancedperipherals:block/block_reader_east", + "north": "advancedperipherals:block/block_reader_north", + "particle": "advancedperipherals:block/block_reader_north", + "south": "advancedperipherals:block/block_reader_south", + "up": "advancedperipherals:block/block_reader_up", + "west": "advancedperipherals:block/block_reader_west" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json b/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json new file mode 100644 index 000000000..ba89671f2 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/chat_box", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/chat_box_front", + "particle": "advancedperipherals:block/chat_box_front", + "up": "advancedperipherals:block/chat_box_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json b/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json new file mode 100644 index 000000000..7f52aebb0 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/colony_integrator", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/colony_integrator_front", + "particle": "advancedperipherals:block/colony_integrator_front", + "up": "advancedperipherals:block/colony_integrator_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json new file mode 100644 index 000000000..0cee7c371 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "down": "advancedperipherals:block/distance_detector_down", + "east": "advancedperipherals:block/distance_detector_east", + "north": "advancedperipherals:block/distance_detector_north", + "particle": "advancedperipherals:block/distance_detector_north", + "south": "advancedperipherals:block/distance_detector_south", + "up": "advancedperipherals:block/distance_detector_up", + "west": "advancedperipherals:block/distance_detector_west" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json new file mode 100644 index 000000000..ebb28dd2e --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/energy_detector", + "down": "advancedperipherals:block/bottom", + "east": "advancedperipherals:block/energy_detector_east", + "north": "advancedperipherals:block/energy_detector_front", + "particle": "advancedperipherals:block/energy_detector_front", + "south": "advancedperipherals:block/energy_detector_back", + "up": "advancedperipherals:block/energy_detector_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json new file mode 100644 index 000000000..ce251a7af --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/environment_detector", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/environment_detector_front", + "particle": "advancedperipherals:block/environment_detector_front", + "up": "advancedperipherals:block/environment_detector_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json new file mode 100644 index 000000000..6460c20e7 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/fluid_detector", + "down": "advancedperipherals:block/bottom", + "east": "advancedperipherals:block/fluid_detector_east", + "north": "advancedperipherals:block/fluid_detector_front", + "particle": "advancedperipherals:block/fluid_detector_front", + "south": "advancedperipherals:block/fluid_detector_back", + "up": "advancedperipherals:block/fluid_detector_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json new file mode 100644 index 000000000..c03bc40ae --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/gas_detector", + "down": "advancedperipherals:block/bottom", + "east": "advancedperipherals:block/gas_detector_east", + "north": "advancedperipherals:block/gas_detector_front", + "particle": "advancedperipherals:block/gas_detector_front", + "south": "advancedperipherals:block/gas_detector_back", + "up": "advancedperipherals:block/gas_detector_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json b/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json new file mode 100644 index 000000000..4870d8a6b --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/geo_scanner", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/geo_scanner_front", + "particle": "advancedperipherals:block/geo_scanner_front", + "up": "advancedperipherals:block/geo_scanner_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json b/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json new file mode 100644 index 000000000..8431aaece --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/inventory_manager", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/inventory_manager_front", + "particle": "advancedperipherals:block/inventory_manager_front", + "up": "advancedperipherals:block/inventory_manager_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json b/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json new file mode 100644 index 000000000..ab8392272 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/me_bridge", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/me_bridge_front", + "particle": "advancedperipherals:block/me_bridge_front", + "up": "advancedperipherals:block/me_bridge_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json b/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json new file mode 100644 index 000000000..8545dbe6a --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/nbt_storage", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/nbt_storage_front", + "particle": "advancedperipherals:block/nbt_storage_front", + "up": "advancedperipherals:block/nbt_storage_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json b/src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json new file mode 100644 index 000000000..598971334 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/peripheral_casing", + "down": "advancedperipherals:block/bottom", + "particle": "advancedperipherals:block/peripheral_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json new file mode 100644 index 000000000..c658c96c7 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json @@ -0,0 +1,13 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "down": "advancedperipherals:block/bottom", + "east": "advancedperipherals:block/player_detector_side", + "north": "advancedperipherals:block/player_detector_front", + "particle": "advancedperipherals:block/player_detector_front", + "side": "advancedperipherals:block/player_detector_side", + "south": "advancedperipherals:block/player_detector_side", + "up": "advancedperipherals:block/player_detector_top", + "west": "advancedperipherals:block/player_detector_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json b/src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json new file mode 100644 index 000000000..038dd8561 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json @@ -0,0 +1,13 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "down": "advancedperipherals:block/redstone_integrator_bottom", + "east": "advancedperipherals:block/redstone_integrator_side", + "north": "advancedperipherals:block/redstone_integrator_front", + "particle": "advancedperipherals:block/redstone_integrator_front", + "side": "advancedperipherals:block/redstone_integrator_side", + "south": "advancedperipherals:block/redstone_integrator_side", + "up": "advancedperipherals:block/redstone_integrator_top", + "west": "advancedperipherals:block/redstone_integrator_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json b/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json new file mode 100644 index 000000000..b7e3d476b --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/rs_bridge", + "down": "advancedperipherals:block/bottom", + "north": "advancedperipherals:block/rs_bridge_front", + "particle": "advancedperipherals:block/rs_bridge_front", + "up": "advancedperipherals:block/rs_bridge_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json new file mode 100644 index 000000000..bb6e067ec --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:armor/smart_glasses_netherite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:armor/smart_glasses_netherite" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/block_reader.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/block_reader.json new file mode 100644 index 000000000..2549690d9 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/block_reader.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:block_reader" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:block_reader" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chat_box.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chat_box.json new file mode 100644 index 000000000..6878292e4 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chat_box.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:chat_box" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:chat_box" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chunk_controller.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chunk_controller.json new file mode 100644 index 000000000..04d0cbac2 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/chunk_controller.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:respawn_anchor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:chunk_controller" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:chunk_controller" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/computer_tool.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/computer_tool.json new file mode 100644 index 000000000..20ece2dc5 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/computer_tool.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:blue_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:computer_tool" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:computer_tool" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/energy_detector.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/energy_detector.json new file mode 100644 index 000000000..acccd0909 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/energy_detector.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:energy_detector" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:energy_detector" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/environment_detector.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/environment_detector.json new file mode 100644 index 000000000..4cba1f782 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/environment_detector.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:environment_detector" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:environment_detector" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/geo_scanner.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/geo_scanner.json new file mode 100644 index 000000000..f541774db --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/geo_scanner.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:geo_scanner" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:geo_scanner" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/inventory_manager.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/inventory_manager.json new file mode 100644 index 000000000..31c2e5727 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/inventory_manager.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:inventory_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:inventory_manager" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/memory_card.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/memory_card.json new file mode 100644 index 000000000..2f6278441 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/memory_card.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:observer" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:memory_card" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:memory_card" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/nbt_storage.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/nbt_storage.json new file mode 100644 index 000000000..ba2b1f5dd --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/nbt_storage.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:nbt_storage" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:nbt_storage" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_end_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_end_automata_core.json new file mode 100644 index 000000000..747842705 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_end_automata_core.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:end_automata_core" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:overpowered_end_automata_core" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:overpowered_end_automata_core" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_husbandry_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_husbandry_automata_core.json new file mode 100644 index 000000000..b26c08c8f --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_husbandry_automata_core.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:husbandry_automata_core" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:overpowered_husbandry_automata_core" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:overpowered_husbandry_automata_core" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_weak_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_weak_automata_core.json new file mode 100644 index 000000000..e4a76ffec --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/overpowered_weak_automata_core.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:weak_automata_core" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:overpowered_weak_automata_core" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:overpowered_weak_automata_core" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/peripheral_casing.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/peripheral_casing.json new file mode 100644 index 000000000..635cb4552 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/peripheral_casing.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:redstone_block" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:peripheral_casing" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:peripheral_casing" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/player_detector.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/player_detector.json new file mode 100644 index 000000000..12f5ff6fe --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/player_detector.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:player_detector" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:player_detector" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/redstone_integrator.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/redstone_integrator.json new file mode 100644 index 000000000..16c17b469 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/redstone_integrator.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:redstone_integrator" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:redstone_integrator" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/weak_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/weak_automata_core.json new file mode 100644 index 000000000..3a59e9f95 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/weak_automata_core.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:weak_automata_core" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:weak_automata_core" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json new file mode 100644 index 000000000..5b739eab0 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:chatty_pocket", + "item": "advancedperipherals:chat_box" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json new file mode 100644 index 000000000..7bc588c1d --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:colony_pocket", + "item": "advancedperipherals:colony_integrator" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json new file mode 100644 index 000000000..0d83ccc1d --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:distance_pocket", + "item": "advancedperipherals:distance_detector" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json new file mode 100644 index 000000000..6196caa16 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:environment_pocket", + "item": "advancedperipherals:environment_detector" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/geoscanner_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/geoscanner_pocket.json new file mode 100644 index 000000000..dffc722c6 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/geoscanner_pocket.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:geoscanner_pocket", + "item": "advancedperipherals:geo_scanner" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/player_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/player_pocket.json new file mode 100644 index 000000000..0c307cb95 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/player_pocket.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:player_pocket", + "item": "advancedperipherals:player_detector" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json new file mode 100644 index 000000000..1007abd28 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:chatty_turtle", + "item": "advancedperipherals:chat_box" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json new file mode 100644 index 000000000..aa42b6472 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:chunky_turtle", + "item": "advancedperipherals:chunk_controller" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json new file mode 100644 index 000000000..063c2782b --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:compass_turtle", + "item": "minecraft:compass" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/end_automata.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/end_automata.json new file mode 100644 index 000000000..aa31d51a0 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/end_automata.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:end_automata", + "item": "advancedperipherals:end_automata_core" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/environment_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/environment_turtle.json new file mode 100644 index 000000000..5b2f6bc36 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/environment_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:environment_turtle", + "item": "advancedperipherals:environment_detector" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/geoscanner_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/geoscanner_turtle.json new file mode 100644 index 000000000..18daf30be --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/geoscanner_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:geoscanner_turtle", + "item": "advancedperipherals:geo_scanner" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/husbandry_automata.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/husbandry_automata.json new file mode 100644 index 000000000..f2c1d7335 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/husbandry_automata.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:husbandry_automata", + "item": "advancedperipherals:husbandry_automata_core" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_end_automata.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_end_automata.json new file mode 100644 index 000000000..9b3e20a95 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_end_automata.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:overpowered_end_automata", + "item": "advancedperipherals:overpowered_end_automata_core" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_husbandry_automata.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_husbandry_automata.json new file mode 100644 index 000000000..00d04d109 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_husbandry_automata.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:overpowered_husbandry_automata", + "item": "advancedperipherals:overpowered_husbandry_automata_core" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_weak_automata.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_weak_automata.json new file mode 100644 index 000000000..884786db2 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/overpowered_weak_automata.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:overpowered_weak_automata", + "item": "advancedperipherals:overpowered_weak_automata_core" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/player_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/player_turtle.json new file mode 100644 index 000000000..6d112f972 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/player_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:player_turtle", + "item": "advancedperipherals:player_detector" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json new file mode 100644 index 000000000..0670d5c0b --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:saddle_turtle", + "item": "minecraft:saddle" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/weak_automata.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/weak_automata.json new file mode 100644 index 000000000..b27508c4f --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/weak_automata.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:weak_automata", + "item": "advancedperipherals:weak_automata_core" +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json new file mode 100644 index 000000000..c161fb4a1 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:block_reader" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json new file mode 100644 index 000000000..72f11452f --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:chat_box" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/colony_integrator.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/colony_integrator.json new file mode 100644 index 000000000..b3c8367b4 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/colony_integrator.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:colony_integrator" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json new file mode 100644 index 000000000..4da55fb18 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:distance_detector" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json new file mode 100644 index 000000000..157f6af93 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:energy_detector" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json new file mode 100644 index 000000000..a82320156 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:environment_detector" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json new file mode 100644 index 000000000..a57de0eab --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:fluid_detector" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json new file mode 100644 index 000000000..be3a1af68 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:gas_detector" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json new file mode 100644 index 000000000..4b8b701d5 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:geo_scanner" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json new file mode 100644 index 000000000..729cddc1d --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:inventory_manager" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json new file mode 100644 index 000000000..1e3756ca4 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:me_bridge" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json new file mode 100644 index 000000000..af33f6fa2 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:nbt_storage" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json new file mode 100644 index 000000000..1d3a2f360 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:peripheral_casing" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json new file mode 100644 index 000000000..9cc314ca4 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:player_detector" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json new file mode 100644 index 000000000..a9fb17e50 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:redstone_integrator" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json new file mode 100644 index 000000000..0b8f4f6d7 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "advancedperipherals:rs_bridge" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json b/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json new file mode 100644 index 000000000..e46b01d51 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "addition": { + "item": "minecraft:netherite_ingot" + }, + "base": { + "item": "advancedperipherals:smart_glasses" + }, + "result": { + "item": "advancedperipherals:smart_glasses_netherite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/block_reader.json b/src/generated/resources/data/advancedperipherals/recipes/block_reader.json new file mode 100644 index 000000000..e6850a3ba --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/block_reader.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "M": { + "item": "computercraft:wired_modem_full" + }, + "O": { + "item": "minecraft:observer" + }, + "R": { + "tag": "forge:storage_blocks/redstone" + } + }, + "pattern": [ + "IRI", + "MAO", + "IRI" + ], + "result": { + "item": "advancedperipherals:block_reader" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/chat_box.json b/src/generated/resources/data/advancedperipherals/recipes/chat_box.json new file mode 100644 index 000000000..18669b16a --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/chat_box.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "G": { + "tag": "forge:ingots/gold" + }, + "P": { + "tag": "minecraft:logs" + } + }, + "pattern": [ + "PPP", + "PAP", + "PGP" + ], + "result": { + "item": "advancedperipherals:chat_box" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json b/src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json new file mode 100644 index 000000000..474ff935c --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "minecraft:ender_eye" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "R": { + "tag": "forge:dusts/redstone" + } + }, + "pattern": [ + "IRI", + "RAR", + "IRI" + ], + "result": { + "item": "advancedperipherals:chunk_controller" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/colony_integrator.json b/src/generated/resources/data/advancedperipherals/recipes/colony_integrator.json new file mode 100644 index 000000000..ee200a21d --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/colony_integrator.json @@ -0,0 +1,35 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "minecolonies" + } + ], + "recipe": { + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "O": { + "tag": "minecraft:logs" + }, + "R": { + "item": "minecolonies:blockminecoloniesrack" + } + }, + "pattern": [ + "ORO", + " A ", + "ORO" + ], + "result": { + "item": "advancedperipherals:colony_integrator" + } + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/computer_tool.json b/src/generated/resources/data/advancedperipherals/recipes/computer_tool.json new file mode 100644 index 000000000..3430e7961 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/computer_tool.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "B": { + "item": "minecraft:blue_terracotta" + }, + "I": { + "tag": "forge:ingots/iron" + } + }, + "pattern": [ + "I I", + "IBI", + " B " + ], + "result": { + "item": "advancedperipherals:computer_tool" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/energy_detector.json b/src/generated/resources/data/advancedperipherals/recipes/energy_detector.json new file mode 100644 index 000000000..da436b905 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/energy_detector.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "B": { + "tag": "forge:storage_blocks/redstone" + }, + "C": { + "item": "minecraft:comparator" + }, + "G": { + "tag": "forge:ingots/gold" + }, + "R": { + "item": "minecraft:redstone_torch" + } + }, + "pattern": [ + "BRB", + "CAC", + "BGB" + ], + "result": { + "item": "advancedperipherals:energy_detector" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/environment_detector.json b/src/generated/resources/data/advancedperipherals/recipes/environment_detector.json new file mode 100644 index 000000000..622edce34 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/environment_detector.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "C": { + "tag": "forge:crops" + }, + "L": { + "tag": "minecraft:leaves" + }, + "S": { + "tag": "minecraft:saplings" + }, + "W": { + "tag": "minecraft:wool" + } + }, + "pattern": [ + "WSW", + "LAL", + "WCW" + ], + "result": { + "item": "advancedperipherals:environment_detector" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json b/src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json new file mode 100644 index 000000000..5da17ecef --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "item": "advancedperipherals:peripheral_casing" + }, + "D": { + "tag": "forge:gems/diamond" + }, + "M": { + "item": "computercraft:wired_modem_full" + }, + "O": { + "item": "minecraft:observer" + }, + "R": { + "tag": "forge:storage_blocks/redstone" + } + }, + "pattern": [ + "DMD", + "DCD", + "ROR" + ], + "result": { + "item": "advancedperipherals:geo_scanner" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json b/src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json new file mode 100644 index 000000000..04233359b --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "C": { + "tag": "forge:chests" + }, + "I": { + "tag": "forge:ingots/iron" + } + }, + "pattern": [ + "ICI", + "CAC", + "ICI" + ], + "result": { + "item": "advancedperipherals:inventory_manager" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/me_bridge.json b/src/generated/resources/data/advancedperipherals/recipes/me_bridge.json new file mode 100644 index 000000000..0e0946063 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/me_bridge.json @@ -0,0 +1,35 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "ae2" + } + ], + "recipe": { + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "F": { + "item": "ae2:fluix_block" + }, + "I": { + "item": "ae2:interface" + } + }, + "pattern": [ + "FIF", + "IAI", + "FIF" + ], + "result": { + "item": "advancedperipherals:me_bridge" + } + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/memory_card.json b/src/generated/resources/data/advancedperipherals/recipes/memory_card.json new file mode 100644 index 000000000..e00c50b0b --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/memory_card.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "G": { + "tag": "forge:ingots/gold" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "O": { + "item": "minecraft:observer" + }, + "W": { + "tag": "forge:glass/white" + } + }, + "pattern": [ + "IWI", + "IOI", + " G " + ], + "result": { + "item": "advancedperipherals:memory_card" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json b/src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json new file mode 100644 index 000000000..b0d80dac8 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "C": { + "tag": "forge:chests" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "R": { + "tag": "forge:storage_blocks/redstone" + } + }, + "pattern": [ + "ICI", + "CAC", + "RCR" + ], + "result": { + "item": "advancedperipherals:nbt_storage" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/overpowered_end_automata_core.json b/src/generated/resources/data/advancedperipherals/recipes/overpowered_end_automata_core.json new file mode 100644 index 000000000..631a1790c --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/overpowered_end_automata_core.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "advancedperipherals:end_automata_core" + }, + { + "item": "minecraft:nether_star" + } + ], + "result": { + "item": "advancedperipherals:overpowered_end_automata_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/overpowered_husbandry_automata_core.json b/src/generated/resources/data/advancedperipherals/recipes/overpowered_husbandry_automata_core.json new file mode 100644 index 000000000..6df0def3f --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/overpowered_husbandry_automata_core.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "advancedperipherals:husbandry_automata_core" + }, + { + "item": "minecraft:nether_star" + } + ], + "result": { + "item": "advancedperipherals:overpowered_husbandry_automata_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/overpowered_weak_automata_core.json b/src/generated/resources/data/advancedperipherals/recipes/overpowered_weak_automata_core.json new file mode 100644 index 000000000..28b3f0528 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/overpowered_weak_automata_core.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "advancedperipherals:weak_automata_core" + }, + { + "item": "minecraft:nether_star" + } + ], + "result": { + "item": "advancedperipherals:overpowered_weak_automata_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json b/src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json new file mode 100644 index 000000000..2c9616751 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "I": { + "tag": "forge:ingots/iron" + }, + "R": { + "tag": "forge:storage_blocks/redstone" + }, + "i": { + "item": "minecraft:iron_bars" + } + }, + "pattern": [ + "IiI", + "iRi", + "IiI" + ], + "result": { + "item": "advancedperipherals:peripheral_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/player_detector.json b/src/generated/resources/data/advancedperipherals/recipes/player_detector.json new file mode 100644 index 000000000..faeccd09a --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/player_detector.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "R": { + "tag": "forge:storage_blocks/redstone" + }, + "S": { + "item": "minecraft:smooth_stone" + } + }, + "pattern": [ + "SSS", + "SAS", + "SRS" + ], + "result": { + "item": "advancedperipherals:player_detector" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json b/src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json new file mode 100644 index 000000000..c6e837d02 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "C": { + "item": "minecraft:comparator" + }, + "R": { + "tag": "forge:storage_blocks/redstone" + } + }, + "pattern": [ + "RCR", + "CAC", + "RCR" + ], + "result": { + "item": "advancedperipherals:redstone_integrator" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json b/src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json new file mode 100644 index 000000000..f8c233104 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json @@ -0,0 +1,35 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "refinedstorage" + } + ], + "recipe": { + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "I": { + "item": "refinedstorage:interface" + }, + "Q": { + "item": "refinedstorage:quartz_enriched_iron" + } + }, + "pattern": [ + "QIQ", + "IAI", + "QIQ" + ], + "result": { + "item": "advancedperipherals:rs_bridge" + } + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json b/src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json new file mode 100644 index 000000000..51851c0cb --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "D": { + "tag": "forge:gems/diamond" + }, + "L": { + "type": "forge:nbt", + "count": 1, + "item": "minecraft:potion", + "nbt": "{Potion:\"minecraft:long_regeneration\"}" + }, + "R": { + "tag": "forge:storage_blocks/redstone" + }, + "S": { + "item": "minecraft:soul_lantern" + } + }, + "pattern": [ + "RAR", + "DSD", + "RLR" + ], + "result": { + "item": "advancedperipherals:weak_automata_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json b/src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json new file mode 100644 index 000000000..7fc8269c3 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json @@ -0,0 +1,7 @@ +{ + "values": [ + "computercraft:cable", + "computercraft:wired_modem", + "computercraft:wired_modem_full" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json b/src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json new file mode 100644 index 000000000..1f793687e --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json @@ -0,0 +1,6 @@ +{ + "values": [ + "advancedperipherals:smart_glasses", + "advancedperipherals:smart_glasses_netherite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json new file mode 100644 index 000000000..ffd23c4b9 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json @@ -0,0 +1,5 @@ +{ + "values": [ + "advancedperipherals:peripheral_casing" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 000000000..67218e709 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,20 @@ +{ + "values": [ + "advancedperipherals:block_reader", + "advancedperipherals:chat_box", + "advancedperipherals:colony_integrator", + "advancedperipherals:distance_detector", + "advancedperipherals:energy_detector", + "advancedperipherals:environment_detector", + "advancedperipherals:fluid_detector", + "advancedperipherals:gas_detector", + "advancedperipherals:geo_scanner", + "advancedperipherals:inventory_manager", + "advancedperipherals:me_bridge", + "advancedperipherals:nbt_storage", + "advancedperipherals:peripheral_casing", + "advancedperipherals:player_detector", + "advancedperipherals:redstone_integrator", + "advancedperipherals:rs_bridge" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json new file mode 100644 index 000000000..5a4f0e2b8 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -0,0 +1,19 @@ +{ + "values": [ + "advancedperipherals:block_reader", + "advancedperipherals:chat_box", + "advancedperipherals:colony_integrator", + "advancedperipherals:distance_detector", + "advancedperipherals:energy_detector", + "advancedperipherals:environment_detector", + "advancedperipherals:fluid_detector", + "advancedperipherals:gas_detector", + "advancedperipherals:geo_scanner", + "advancedperipherals:inventory_manager", + "advancedperipherals:me_bridge", + "advancedperipherals:nbt_storage", + "advancedperipherals:player_detector", + "advancedperipherals:redstone_integrator", + "advancedperipherals:rs_bridge" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json b/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json new file mode 100644 index 000000000..92b1ef0d9 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json @@ -0,0 +1,5 @@ +{ + "values": [ + "advancedperipherals:computer_scientist" + ] +} \ No newline at end of file From 3549dd9174e16835ab01f8bfa572621773d0f6bf Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 15 Mar 2025 17:23:58 -0600 Subject: [PATCH 18/24] implement keyboard mouse capture mode - fix keyboard container will keep reopen whenever holding G - rename glassesKeyPressed event to glasses_key_pressed - fix JEI will shown on keyboad container screen --- .../client/ClientWorker.java | 34 ++++ .../client/screens/KeyboardScreen.java | 186 ++++++++++++++---- .../common/container/KeyboardContainer.java | 23 ++- .../common/items/KeyboardItem.java | 38 +++- .../common/network/APNetworking.java | 17 +- .../toclient/KeyboardMouseCapturePacket.java | 42 ++++ .../network/toserver/GlassesHotkeyPacket.java | 21 +- .../toserver/KeyboardMouseClickPacket.java | 52 +++++ .../toserver/KeyboardMouseMovePacket.java | 52 +++++ .../toserver/KeyboardMouseScrollPacket.java | 49 +++++ .../common/setup/APContainerTypes.java | 15 +- .../modules/hotkey/HotkeyModuleItem.java | 6 +- .../modules/keyboard/KeyboardFunctions.java | 23 +++ .../modules/keyboard/KeyboardModule.java | 31 ++- .../nightvision/NightVisionModule.java | 3 +- .../nightvision/NightVisionModuleItem.java | 13 +- .../common/util/ServerWorker.java | 2 +- 17 files changed, 522 insertions(+), 85 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/ClientWorker.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseClickPacket.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseMovePacket.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseScrollPacket.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardFunctions.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientWorker.java b/src/main/java/de/srendi/advancedperipherals/client/ClientWorker.java new file mode 100644 index 000000000..f29e94db7 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientWorker.java @@ -0,0 +1,34 @@ +package de.srendi.advancedperipherals.client; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = AdvancedPeripherals.MOD_ID) +public class ClientWorker { + + private static final Map tasks = new ConcurrentHashMap<>(); + + /** + * This method will put a task to current tick's end. + * If a task with given identifier is already exists, the task will be replaced. + */ + public static void put(final String id, final Runnable task) { + tasks.put(id, task); + } + + @SubscribeEvent + public static void clientTick(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + tasks.forEach((id, runnable) -> { + tasks.remove(id, runnable); + runnable.run(); + }); + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index ff0fea7f5..e18b7fc6c 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -1,14 +1,22 @@ package de.srendi.advancedperipherals.client.screens; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.client.gui.ClientInputHandler; import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.computer.core.InputHandler; -import de.srendi.advancedperipherals.client.screens.base.BaseScreen; +import de.srendi.advancedperipherals.client.ClientWorker; import de.srendi.advancedperipherals.common.container.KeyboardContainer; +import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.toserver.KeyboardMouseClickPacket; +import de.srendi.advancedperipherals.common.network.toserver.KeyboardMouseMovePacket; +import de.srendi.advancedperipherals.common.network.toserver.KeyboardMouseScrollPacket; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; @@ -20,21 +28,36 @@ *

* We just create a terminal which is used to forward all the key presses and mouse clicks but we don't render it. */ -public class KeyboardScreen extends BaseScreen { +public class KeyboardScreen extends Screen implements MenuAccess { + protected final KeyboardContainer keyboardContainer; protected final InputHandler input; private final Terminal terminalData; - private WidgetTerminal terminal; + private MouseState mouseState = MouseState.RELEASED; + private boolean captureMouse; + private boolean regrabingMouse; + private byte[] lastPosLock = new byte[0]; + private double lastX = 0; + private double lastY = 0; + private double lastScroll = 0; + + public KeyboardScreen(KeyboardContainer keyboardContainer, Inventory inv, Component titleIn) { + super(titleIn); + this.keyboardContainer = keyboardContainer; + this.input = new ClientInputHandler(keyboardContainer); + this.terminalData = new Terminal(0, 0, false); + } - public KeyboardScreen(KeyboardContainer screenContainer, Inventory inv, Component titleIn) { - super(screenContainer, inv, titleIn); - input = new ClientInputHandler(menu); - terminalData = new Terminal(0, 0, false); + @Override + public KeyboardContainer getMenu() { + return this.keyboardContainer; } @Override public void render(@NotNull PoseStack poseStack, int x, int y, float partialTicks) { + super.render(poseStack, x, y, partialTicks); + Minecraft minecraft = Minecraft.getInstance(); float scale = 2f; int screenWidth = minecraft.getWindow().getGuiScaledWidth(); @@ -50,48 +73,96 @@ public void render(@NotNull PoseStack poseStack, int x, int y, float partialTick @Override protected void init() { - passEvents = true; + if (this.isCapturingMouse()) { + this.grabMouse(); + } else { + this.grabMouseWithControl(); + } + this.passEvents = true; KeyMapping.releaseAll(); super.init(); - minecraft.keyboardHandler.setSendRepeatsToGui(true); + this.minecraft.keyboardHandler.setSendRepeatsToGui(true); - terminal = addWidget(new WidgetTerminal(terminalData, new ClientInputHandler(menu), 0, 0)); - terminal.visible = false; - terminal.active = false; - setFocused(terminal); + this.terminal = addWidget(new WidgetTerminal(terminalData, new ClientInputHandler(this.keyboardContainer), 0, 0)); + this.terminal.visible = false; + this.terminal.active = false; + setFocused(this.terminal); } - @Override - protected void renderBg(@NotNull PoseStack matrixStack, float partialTicks, int x, int y) { + public final void removed() { + if (this.regrabingMouse) { + return; + } + super.removed(); + this.minecraft.keyboardHandler.setSendRepeatsToGui(false); } @Override - public void renderBackground(@NotNull PoseStack pPoseStack) { + public void onClose() { + // Don't allow closing using standard keys like E. Closing using ESCAPE is still possible due to the keyPressed method } + @Override + public boolean isPauseScreen() { + return false; + } @Override - public final void removed() { - super.removed(); - minecraft.keyboardHandler.setSendRepeatsToGui(false); + public void mouseMoved(double x, double y) { + if (this.mouseState != MouseState.CAPTURE) { + return; + } + ClientWorker.put("mouse_move", () -> { + synchronized (this.lastPosLock) { + double dx = x - this.lastX; + double dy = y - this.lastY; + APNetworking.sendToServer(new KeyboardMouseMovePacket(dx, dy)); + this.lastX = x; + this.lastY = y; + } + }); } @Override - public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { - minecraft.player.getInventory().swapPaint(pDelta); - return super.mouseScrolled(pMouseX, pMouseY, pDelta); + public boolean mouseClicked(double x, double y, int button) { + if (this.mouseState != MouseState.CAPTURE) { + return false; + } + APNetworking.sendToServer(new KeyboardMouseClickPacket(button, false)); + return true; } @Override - public void onClose() { - // Don't allow closing using standard keys like E. Closing using ESCAPE is still possible due to the keyPressed method + public boolean mouseReleased(double x, double y, int button) { + if (this.mouseState != MouseState.CAPTURE) { + return false; + } + APNetworking.sendToServer(new KeyboardMouseClickPacket(button, true)); + return true; } @Override - public boolean isPauseScreen() { - return false; + public boolean mouseScrolled(double x, double y, double direction) { + this.lastScroll += direction; + int scrolled = (int) this.lastScroll; + if (scrolled == 0) { + return true; + } + if (this.mouseState == MouseState.CAPTURE) { + ClientWorker.put("mouse_scroll", () -> { + if (this.mouseState != MouseState.CAPTURE) { + return; + } + this.lastScroll -= scrolled; + APNetworking.sendToServer(new KeyboardMouseScrollPacket(scrolled)); + }); + } else { + this.lastScroll -= scrolled; + minecraft.player.getInventory().swapPaint(scrolled); + } + return true; } @Override @@ -108,19 +179,62 @@ public final boolean keyPressed(int key, int scancode, int modifiers) { return super.keyPressed(key, scancode, modifiers); } - // We prevent jei by increasing the image size, even if we don't render it - @Override - public int getSizeX() { - return 4096; + public boolean isCapturingMouse() { + return this.captureMouse; } - @Override - public int getSizeY() { - return 4096; + public void setCaptureMouse(boolean enable) { + this.captureMouse = enable; + if (enable) { + this.grabMouse(); + } else { + this.grabMouseWithControl(); + } } - @Override - public ResourceLocation getTexture() { - return null; + private void grabMouseWithControl() { + if (this.mouseState == MouseState.NORMAL) { + return; + } + this.releaseMouse(); + this.regrabingMouse = true; + this.minecraft.mouseHandler.grabMouse(); + this.regrabingMouse = false; + this.minecraft.screen = this; + this.mouseState = MouseState.NORMAL; + } + + private void grabMouse() { + if (this.minecraft.mouseHandler.isMouseGrabbed()) { + this.minecraft.mouseHandler.releaseMouse(); + } + Window window = this.minecraft.getWindow(); + synchronized (this.lastPosLock) { + this.lastX = window.getScreenWidth() / 2; + this.lastY = window.getScreenHeight() / 2; + InputConstants.grabOrReleaseMouse(window.getWindow(), InputConstants.CURSOR_DISABLED, this.lastX, this.lastY); + } + this.mouseState = MouseState.CAPTURE; + } + + private void releaseMouse() { + if (this.mouseState == MouseState.RELEASED) { + return; + } + if (this.minecraft.mouseHandler.isMouseGrabbed()) { + this.minecraft.mouseHandler.releaseMouse(); + return; + } + Window window = this.minecraft.getWindow(); + synchronized (this.lastPosLock) { + this.lastX = window.getScreenWidth() / 2; + this.lastY = window.getScreenHeight() / 2; + InputConstants.grabOrReleaseMouse(window.getWindow(), InputConstants.CURSOR_NORMAL, this.lastX, this.lastY); + } + this.mouseState = MouseState.RELEASED; + } + + private static enum MouseState { + RELEASED, NORMAL, CAPTURE; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java index 03838407a..a085c3e18 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java @@ -12,6 +12,7 @@ import de.srendi.advancedperipherals.common.util.NBTUtil; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -23,21 +24,25 @@ public class KeyboardContainer extends BaseContainer implements ComputerMenu { private final ServerInputState input; + private final ItemStack keyboardItem; @Nullable private ServerComputer computer = null; public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level, ItemStack keyboardItem) { super(APContainerTypes.KEYBOARD_CONTAINER.get(), id, inventory, pos, level); - this.input = new ServerInputState<>( this ); + this.input = new ServerInputState<>(this); + this.keyboardItem = keyboardItem; CompoundTag data = keyboardItem.getOrCreateTag(); if (!data.getBoolean(KeyboardItem.BOUND_TYPE_TAG)) { - BlockPos computerPos = NBTUtil.blockPosFromNBT(keyboardItem.getOrCreateTag().getCompound(KeyboardItem.BIND_TAG)); + // Cannot use instance ID here since they will change after reload the block + int computerId = keyboardItem.getOrCreateTag().getInt(KeyboardItem.BIND_TAG); for (ServerComputer computer : ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().getComputers()) { - if (computer.getPosition() != null && computer.getPosition().equals(computerPos)) { + if (computer.getID() == computerId) { this.computer = computer; + break; } } } else if (data.contains(KeyboardItem.GLASSES_BIND_TAG)) { @@ -46,11 +51,23 @@ public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level, } + public ItemStack getKeyboardItem() { + return this.keyboardItem; + } + @Override public boolean stillValid(@NotNull Player playerIn) { return true; } + @Override + public void removed(Player player) { + super.removed(player); + if (player instanceof ServerPlayer) { + computer.queueEvent("keyboard_closed"); + } + } + @Nullable @Override public ServerComputer getComputer() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index 20803deb5..f766a3d59 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -5,6 +5,8 @@ import de.srendi.advancedperipherals.common.container.KeyboardContainer; import de.srendi.advancedperipherals.common.items.base.BaseItem; import de.srendi.advancedperipherals.common.items.base.IInventoryItem; +import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.toclient.KeyboardMouseCapturePacket; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; @@ -75,17 +77,21 @@ public InteractionResult useOn(UseOnContext context) { @Override public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int inventorySlot, boolean isCurrentItem, @Nullable SmartGlassesAccess access, @Nullable IModule module) { - if (level.isClientSide()) + if (level.isClientSide()) { return; + } - if (access == null) + if (access == null || !(module instanceof KeyboardModule keyboadModule)) { return; + } CompoundTag data = itemStack.getOrCreateTag(); int instanceId = access.getComputer().getInstanceID(); int oldInstanceId = -1; - if (data.contains(GLASSES_BIND_TAG)) oldInstanceId = data.getInt(GLASSES_BIND_TAG); + if (data.contains(GLASSES_BIND_TAG)) { + oldInstanceId = data.getInt(GLASSES_BIND_TAG); + } if (!data.contains(BOUND_TYPE_TAG) || ((oldInstanceId != -1 && oldInstanceId != instanceId)) || !data.getBoolean(BOUND_TYPE_TAG)) { data.putBoolean(BOUND_TYPE_TAG, true); @@ -93,13 +99,25 @@ public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int i data.remove(BIND_TAG); } - if (entity instanceof ServerPlayer serverPlayer) { - if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { - NetworkHooks.openScreen(serverPlayer, this.createContainer(serverPlayer, itemStack), buf -> { - buf.writeBlockPos(serverPlayer.blockPosition()); - buf.writeItem(itemStack); - }); - } + if (!(entity instanceof ServerPlayer serverPlayer)) { + return; + } + // TODO: this for sure won't work on dedicated server + if (!KeyBindings.GLASSES_HOTKEY_KEYBINDING.isDown()) { + return; + } + + access.getComputer().queueEvent("keyboard_open"); + if (serverPlayer.containerMenu instanceof KeyboardContainer openedKeyboard && openedKeyboard.getKeyboardItem() == itemStack) { + return; + } + + NetworkHooks.openScreen(serverPlayer, this.createContainer(serverPlayer, itemStack), buf -> { + buf.writeBlockPos(serverPlayer.blockPosition()); + buf.writeItem(itemStack); + }); + if (keyboadModule.isCapturingMouse()) { + APNetworking.sendTo(new KeyboardMouseCapturePacket(true), serverPlayer); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java index d007a4b1d..5738f2553 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.network.toclient.KeyboardMouseCapturePacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; @@ -9,6 +10,9 @@ import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket; import de.srendi.advancedperipherals.common.network.toclient.ToastToClientPacket; import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; +import de.srendi.advancedperipherals.common.network.toserver.KeyboardMouseClickPacket; +import de.srendi.advancedperipherals.common.network.toserver.KeyboardMouseMovePacket; +import de.srendi.advancedperipherals.common.network.toserver.KeyboardMouseScrollPacket; import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; @@ -38,13 +42,18 @@ public class APNetworking { private static int index = 0; public static void init() { + registerServerToClient(KeyboardMouseCapturePacket.class, KeyboardMouseCapturePacket::decode); + registerServerToClient(RenderableObjectBulkSyncPacket.class, RenderableObjectBulkSyncPacket::decode); + registerServerToClient(RenderableObjectClearPacket.class, RenderableObjectClearPacket::decode); + registerServerToClient(RenderableObjectDeletePacket.class, RenderableObjectDeletePacket::decode); + registerServerToClient(RenderableObjectSyncPacket.class, RenderableObjectSyncPacket::decode); registerServerToClient(SaddleTurtleInfoPacket.class, SaddleTurtleInfoPacket::decode); registerServerToClient(ToastToClientPacket.class, ToastToClientPacket::decode); - registerServerToClient(RenderableObjectSyncPacket.class, RenderableObjectSyncPacket::decode); - registerServerToClient(RenderableObjectDeletePacket.class, RenderableObjectDeletePacket::decode); - registerServerToClient(RenderableObjectClearPacket.class, RenderableObjectClearPacket::decode); - registerServerToClient(RenderableObjectBulkSyncPacket.class, RenderableObjectBulkSyncPacket::decode); + registerClientToServer(GlassesHotkeyPacket.class, GlassesHotkeyPacket::decode); + registerClientToServer(KeyboardMouseClickPacket.class, KeyboardMouseClickPacket::decode); + registerClientToServer(KeyboardMouseMovePacket.class, KeyboardMouseMovePacket::decode); + registerClientToServer(KeyboardMouseScrollPacket.class, KeyboardMouseScrollPacket::decode); registerClientToServer(SaddleTurtleControlPacket.class, SaddleTurtleControlPacket::decode); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java new file mode 100644 index 000000000..aefa4daa7 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java @@ -0,0 +1,42 @@ +package de.srendi.advancedperipherals.common.network.toclient; + +import de.srendi.advancedperipherals.client.screens.KeyboardScreen; +import de.srendi.advancedperipherals.common.items.SmartGlassesItem; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.server.ServerLifecycleHooks; + +public class KeyboardMouseCapturePacket implements IPacket { + + private final boolean enable; + + public KeyboardMouseCapturePacket(boolean enable) { + this.enable = enable; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handle(NetworkEvent.Context context) { + if (!(Minecraft.getInstance().screen instanceof KeyboardScreen screen)) { + return; + } + screen.setCaptureMouse(this.enable); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeBoolean(this.enable); + } + + public static KeyboardMouseCapturePacket decode(FriendlyByteBuf buffer) { + return new KeyboardMouseCapturePacket(buffer.readBoolean()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java index c6f5506ed..0f31cd4ea 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java @@ -10,16 +10,12 @@ import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.server.ServerLifecycleHooks; -import java.util.UUID; - public class GlassesHotkeyPacket implements IPacket { - private final UUID player; private final String keyBind; private final int keyPressDuration; - public GlassesHotkeyPacket(UUID player, String keyBind, int keyPressDuration) { - this.player = player; + public GlassesHotkeyPacket(String keyBind, int keyPressDuration) { this.keyBind = keyBind; this.keyPressDuration = keyPressDuration; } @@ -28,28 +24,29 @@ public GlassesHotkeyPacket(UUID player, String keyBind, int keyPressDuration) { public void handle(NetworkEvent.Context context) { MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); - ServerPlayer serverPlayer = server.getPlayerList().getPlayer(player); - if (serverPlayer == null) + ServerPlayer serverPlayer = context.getSender(); + if (serverPlayer == null) { return; + } for (ItemStack stack : serverPlayer.getAllSlots()) { if (stack.getItem() instanceof SmartGlassesItem) { SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack); - - if (computer != null) - computer.queueEvent("glassesKeyPressed", new Object[]{keyBind, keyPressDuration}); + if (computer != null) { + computer.queueEvent("glasses_key_pressed", new Object[]{keyBind, keyPressDuration}); + break; + } } } } @Override public void encode(FriendlyByteBuf buffer) { - buffer.writeUUID(player); buffer.writeUtf(keyBind); buffer.writeInt(keyPressDuration); } public static GlassesHotkeyPacket decode(FriendlyByteBuf buffer) { - return new GlassesHotkeyPacket(buffer.readUUID(), buffer.readUtf(), buffer.readInt()); + return new GlassesHotkeyPacket(buffer.readUtf(), buffer.readInt()); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseClickPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseClickPacket.java new file mode 100644 index 000000000..9c6acb829 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseClickPacket.java @@ -0,0 +1,52 @@ +package de.srendi.advancedperipherals.common.network.toserver; + +import de.srendi.advancedperipherals.common.items.SmartGlassesItem; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.server.ServerLifecycleHooks; + +public class KeyboardMouseClickPacket implements IPacket { + + private final int button; + private final boolean isRelease; + + public KeyboardMouseClickPacket(int button, boolean isRelease) { + this.button = button; + this.isRelease = isRelease; + } + + @Override + public void handle(NetworkEvent.Context context) { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + + ServerPlayer serverPlayer = context.getSender(); + if (serverPlayer == null) { + return; + } + + for (ItemStack stack : serverPlayer.getAllSlots()) { + if (stack.getItem() instanceof SmartGlassesItem) { + SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack); + if (computer != null) { + computer.queueEvent(isRelease ? "player_mouse_up" : "player_mouse_click", new Object[]{button}); + break; + } + } + } + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeVarInt(button); + buffer.writeBoolean(isRelease); + } + + public static KeyboardMouseClickPacket decode(FriendlyByteBuf buffer) { + return new KeyboardMouseClickPacket(buffer.readVarInt(), buffer.readBoolean()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseMovePacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseMovePacket.java new file mode 100644 index 000000000..27e8783fd --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseMovePacket.java @@ -0,0 +1,52 @@ +package de.srendi.advancedperipherals.common.network.toserver; + +import de.srendi.advancedperipherals.common.items.SmartGlassesItem; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.server.ServerLifecycleHooks; + +public class KeyboardMouseMovePacket implements IPacket { + + private final double dx; + private final double dy; + + public KeyboardMouseMovePacket(double dx, double dy) { + this.dx = dx; + this.dy = dy; + } + + @Override + public void handle(NetworkEvent.Context context) { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + + ServerPlayer serverPlayer = context.getSender(); + if (serverPlayer == null) { + return; + } + + for (ItemStack stack : serverPlayer.getAllSlots()) { + if (stack.getItem() instanceof SmartGlassesItem) { + SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack); + if (computer != null) { + computer.queueEvent("player_mouse_move", new Object[]{dx, dy}); + break; + } + } + } + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeDouble(dx); + buffer.writeDouble(dy); + } + + public static KeyboardMouseMovePacket decode(FriendlyByteBuf buffer) { + return new KeyboardMouseMovePacket(buffer.readDouble(), buffer.readDouble()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseScrollPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseScrollPacket.java new file mode 100644 index 000000000..9f8752532 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/KeyboardMouseScrollPacket.java @@ -0,0 +1,49 @@ +package de.srendi.advancedperipherals.common.network.toserver; + +import de.srendi.advancedperipherals.common.items.SmartGlassesItem; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.server.ServerLifecycleHooks; + +public class KeyboardMouseScrollPacket implements IPacket { + + private final int delta; + + public KeyboardMouseScrollPacket(int delta) { + this.delta = delta; + } + + @Override + public void handle(NetworkEvent.Context context) { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + + ServerPlayer serverPlayer = context.getSender(); + if (serverPlayer == null) { + return; + } + + for (ItemStack stack : serverPlayer.getAllSlots()) { + if (stack.getItem() instanceof SmartGlassesItem) { + SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack); + if (computer != null) { + computer.queueEvent("player_mouse_scroll", new Object[]{delta}); + break; + } + } + } + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeVarInt(delta); + } + + public static KeyboardMouseScrollPacket decode(FriendlyByteBuf buffer) { + return new KeyboardMouseScrollPacket(buffer.readVarInt()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java index dee082a61..cdbc4f94d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java @@ -14,21 +14,22 @@ public class APContainerTypes { - public static final RegistryObject> INVENTORY_MANAGER_CONTAINER = APRegistration.CONTAINER_TYPES.register("memory_card_container", () -> IForgeMenuType.create((windowId, inv, data) -> { - BlockPos pos = data.readBlockPos(); + public static final RegistryObject> INVENTORY_MANAGER_CONTAINER = APRegistration.CONTAINER_TYPES.register("memory_card_container", () -> IForgeMenuType.create((windowId, inv, buf) -> { + BlockPos pos = buf.readBlockPos(); Level level = inv.player.getCommandSenderWorld(); return new InventoryManagerContainer(windowId, inv, pos, level); })); - public static final RegistryObject> KEYBOARD_CONTAINER = APRegistration.CONTAINER_TYPES.register("keyboard_container", () -> IForgeMenuType.create((windowId, inv, data) -> { - BlockPos pos = data.readBlockPos(); - ItemStack keyboardItem = data.readItem(); + public static final RegistryObject> KEYBOARD_CONTAINER = APRegistration.CONTAINER_TYPES.register("keyboard_container", () -> IForgeMenuType.create((windowId, inv, buf) -> { + BlockPos pos = buf.readBlockPos(); + ItemStack keyboardItem = buf.readItem(); Level level = inv.player.getCommandSenderWorld(); return new KeyboardContainer(windowId, inv, pos, level, keyboardItem); })); - public static final RegistryObject> SMART_GLASSES_CONTAINER = APRegistration.CONTAINER_TYPES.register("smart_glasses_container", () -> ContainerData.toType(ComputerContainerData::new, - (id, inv, data) -> new SmartGlassesContainer(id, player -> true, null, data, inv, data.displayStack()) + public static final RegistryObject> SMART_GLASSES_CONTAINER = APRegistration.CONTAINER_TYPES.register("smart_glasses_container", () -> ContainerData.toType( + ComputerContainerData::new, + (id, inv, buf) -> new SmartGlassesContainer(id, player -> true, null, buf, inv, buf.displayStack()) )); protected static void register() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java index 9dd8594a6..ad0169382 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java @@ -36,7 +36,7 @@ public void inventoryTick(@NotNull ItemStack stack, @NotNull Level level, @NotNu if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { // Add another 50ms to the duration, one tick setKeyPressDuration(stack, getKeyPressDuration(stack) + 50); - } else if(getKeyPressDuration(stack) > 0) { + } else if (getKeyPressDuration(stack) > 0) { // If the key is not pressed, but the duration is greater than 0, we can assume that the key was pressed // We can now post the event @@ -44,12 +44,12 @@ public void inventoryTick(@NotNull ItemStack stack, @NotNull Level level, @NotNu setKeyPressDuration(stack, 0); String keyBind = KeyBindings.GLASSES_HOTKEY_KEYBINDING.getKey().getName(); - APNetworking.sendToServer(new GlassesHotkeyPacket(player.getUUID(), keyBind, duration)); + APNetworking.sendToServer(new GlassesHotkeyPacket(keyBind, duration)); } } public static int getKeyPressDuration(ItemStack stack) { - return stack.copy().getOrCreateTag().getInt(KEY_PRESS_DURATION_NBT); + return stack.hasTag() ? stack.getTag().getInt(KEY_PRESS_DURATION_NBT) : 0; } public static void setKeyPressDuration(ItemStack stack, int keyPressDuration) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardFunctions.java new file mode 100644 index 000000000..8c5a7f138 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardFunctions.java @@ -0,0 +1,23 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.keyboard; + +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; + +public class KeyboardFunctions implements IModuleFunctions { + + private final KeyboardModule keyboardModule; + + public KeyboardFunctions(KeyboardModule keyboardModule) { + this.keyboardModule = keyboardModule; + } + + @LuaFunction + public final boolean isCapturingMouse() { + return keyboardModule.isCapturingMouse(); + } + + @LuaFunction + public final void setCaptureMouse(boolean enable) { + keyboardModule.setCaptureMouse(enable); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java index 9031e0fae..b7a02ea6b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java @@ -1,14 +1,20 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.keyboard; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.toclient.KeyboardMouseCapturePacket; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.Nullable; public class KeyboardModule implements IModule { + private boolean lastCaptureMouse = false; + private volatile boolean captureMouse = false; + @Override public ResourceLocation getName() { return AdvancedPeripherals.getRL("keyboard"); @@ -17,6 +23,29 @@ public ResourceLocation getName() { @Nullable @Override public IModuleFunctions getFunctions(SmartGlassesAccess smartGlassesAccess) { - return null; + return new KeyboardFunctions(this); + } + + public boolean isCapturingMouse() { + return captureMouse; + } + + public void setCaptureMouse(boolean enable) { + if (captureMouse == enable) { + return; + } + captureMouse = enable; + } + + @Override + public void tick(SmartGlassesAccess glasses) { + if (!(glasses.getEntity() instanceof ServerPlayer player)) { + return; + } + boolean captureMouse = this.captureMouse; + if (captureMouse != lastCaptureMouse) { + lastCaptureMouse = captureMouse; + APNetworking.sendTo(new KeyboardMouseCapturePacket(captureMouse), player); + } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java index f1333b273..5c938b289 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java @@ -11,7 +11,7 @@ public class NightVisionModule implements IModule { - public boolean nightVisionEnabled = true; + private boolean nightVisionEnabled = true; public NightVisionModule() { @@ -35,7 +35,6 @@ public void onUnequipped(SmartGlassesAccess smartGlassesAccess) { player.removeEffect(MobEffects.NIGHT_VISION); } } - } /** diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java index 44da3ee90..47f5bdc23 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java @@ -30,12 +30,13 @@ public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int i return; } - if (module instanceof NightVisionModule nightVisionModule) { - if (nightVisionModule.nightVisionEnabled) { - player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 20 * 13 - 1 /* minus 1 tick then the client timing won't flash */)); - } else { - player.removeEffect(MobEffects.NIGHT_VISION); - } + if (!(module instanceof NightVisionModule nightVisionModule)) { + return; + } + if (nightVisionModule.isNightVisionEnabled()) { + player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 20 * 13 - 1 /* minus 1 tick then the client timing won't flash */)); + } else { + player.removeEffect(MobEffects.NIGHT_VISION); } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java b/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java index cbde6790b..fc9dced5a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java @@ -33,7 +33,7 @@ public static void addToNextTick(final Runnable task) { @SubscribeEvent public static void serverTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.END) { - while (!callQueue.isEmpty()) { + for (int remain = callQueue.size(); remain > 0; remain--) { final Runnable runnable = callQueue.poll(); tasksRan++; AdvancedPeripherals.debug("Running task #" + tasksRan + ". Running " + runnable.getClass()); From d6dd79ba89422eb086238380db82ae01f35965e1 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 15 Mar 2025 17:54:44 -0600 Subject: [PATCH 19/24] fix styles --- .../advancedperipherals/client/screens/KeyboardScreen.java | 5 ++--- .../common/container/KeyboardContainer.java | 1 - .../advancedperipherals/common/items/KeyboardItem.java | 2 -- .../common/network/toclient/KeyboardMouseCapturePacket.java | 6 ------ 4 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index e18b7fc6c..fb6cd7ad1 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -18,7 +18,6 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; @@ -234,7 +233,7 @@ private void releaseMouse() { this.mouseState = MouseState.RELEASED; } - private static enum MouseState { - RELEASED, NORMAL, CAPTURE; + private enum MouseState { + RELEASED, NORMAL, CAPTURE } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java index a085c3e18..7a098c5b3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java @@ -9,7 +9,6 @@ import de.srendi.advancedperipherals.common.container.base.BaseContainer; import de.srendi.advancedperipherals.common.items.KeyboardItem; import de.srendi.advancedperipherals.common.setup.APContainerTypes; -import de.srendi.advancedperipherals.common.util.NBTUtil; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index f766a3d59..2a875f1f7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -12,8 +12,6 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; import de.srendi.advancedperipherals.common.smartglasses.modules.keyboard.KeyboardModule; import de.srendi.advancedperipherals.common.util.EnumColor; -import de.srendi.advancedperipherals.common.util.KeybindUtil; -import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.SideHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java index aefa4daa7..f6e0d53ee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java @@ -1,18 +1,12 @@ package de.srendi.advancedperipherals.common.network.toclient; import de.srendi.advancedperipherals.client.screens.KeyboardScreen; -import de.srendi.advancedperipherals.common.items.SmartGlassesItem; import de.srendi.advancedperipherals.common.network.base.IPacket; -import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.server.ServerLifecycleHooks; public class KeyboardMouseCapturePacket implements IPacket { From 58a92cd1102707e55324b841db6af5521f5aafc4 Mon Sep 17 00:00:00 2001 From: Kevin Z Date: Wed, 19 Mar 2025 17:49:43 -0600 Subject: [PATCH 20/24] make lock final Signed-off-by: Kevin Z --- .../advancedperipherals/client/screens/KeyboardScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index fb6cd7ad1..58204bbe2 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -36,7 +36,7 @@ public class KeyboardScreen extends Screen implements MenuAccess Date: Wed, 18 Jun 2025 21:15:57 -0600 Subject: [PATCH 21/24] fix keyboard does not work in multiplayer --- .../common/container/KeyboardContainer.java | 43 +++++---- .../common/data/EnUsLanguageProvider.java | 1 - .../common/items/KeyboardItem.java | 93 +++++++++---------- .../common/items/base/BaseItem.java | 13 ++- .../common/items/base/IInventoryItem.java | 5 +- .../toclient/KeyboardMouseCapturePacket.java | 3 - .../network/toserver/GlassesHotkeyPacket.java | 24 ++++- .../smartglasses/SmartGlassesComputer.java | 13 ++- .../smartglasses/modules/IModuleItem.java | 2 +- .../modules/hotkey/HotkeyModuleItem.java | 18 ++-- .../modules/keyboard/KeyboardModule.java | 44 +++++++++ .../nightvision/NightVisionModuleItem.java | 11 ++- .../modules/overlay/OverlayGlassesItem.java | 3 +- 13 files changed, 176 insertions(+), 97 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java index 7a098c5b3..06adb95e5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/KeyboardContainer.java @@ -22,32 +22,42 @@ public class KeyboardContainer extends BaseContainer implements ComputerMenu { + @Nullable private final ServerInputState input; private final ItemStack keyboardItem; @Nullable - private ServerComputer computer = null; + private ServerComputer computer; public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level, ItemStack keyboardItem) { + this(id, inventory, pos, level, keyboardItem, null); + } + + public KeyboardContainer(int id, Inventory inventory, BlockPos pos, Level level, ItemStack keyboardItem, ServerComputer computer) { super(APContainerTypes.KEYBOARD_CONTAINER.get(), id, inventory, pos, level); - this.input = new ServerInputState<>(this); this.keyboardItem = keyboardItem; + if (level.isClientSide) { + this.input = null; + this.computer = null; + return; + } + this.input = new ServerInputState<>(this); + this.computer = computer; + if (computer != null) { + return; + } CompoundTag data = keyboardItem.getOrCreateTag(); - - if (!data.getBoolean(KeyboardItem.BOUND_TYPE_TAG)) { - // Cannot use instance ID here since they will change after reload the block - int computerId = keyboardItem.getOrCreateTag().getInt(KeyboardItem.BIND_TAG); - - for (ServerComputer computer : ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().getComputers()) { - if (computer.getID() == computerId) { - this.computer = computer; - break; - } + if (!data.contains(KeyboardItem.BIND_TAG)) { + return; + } + // Cannot use instance ID here since they will change after reload the block + int computerId = data.getInt(KeyboardItem.BIND_TAG); + for (ServerComputer computr : ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().getComputers()) { + if (computr.getID() == computerId) { + this.computer = computr; + break; } - } else if (data.contains(KeyboardItem.GLASSES_BIND_TAG)) { - computer = ServerContext.get(ServerLifecycleHooks.getCurrentServer()).registry().get(data.getInt(KeyboardItem.GLASSES_BIND_TAG)); } - } public ItemStack getKeyboardItem() { @@ -55,7 +65,7 @@ public ItemStack getKeyboardItem() { } @Override - public boolean stillValid(@NotNull Player playerIn) { + public boolean stillValid(@NotNull Player player) { return true; } @@ -73,6 +83,7 @@ public ServerComputer getComputer() { return computer; } + @Nullable @Override public ServerInputHandler getInput() { return input; diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index ab443c42c..4b69cd179 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -149,7 +149,6 @@ private void addTooltips() { addTooltip(APItems.COMPUTER_TOOL.get(), "&7This tool was made to tune our blocks. But for now, it's just a blue useless wrench."); addTooltip(APItems.MEMORY_CARD.get(), "&7Can save the rights of a player to use it in an inventory manager."); addTooltip("binding.bound_to", "&7Bound to &b%s&7."); - addTooltip("binding.bound_to_glasses", "&7Bound to Glasses with id &b%s&7."); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index 2a875f1f7..f1ec4340a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -1,20 +1,23 @@ package de.srendi.advancedperipherals.common.items; import dan200.computercraft.shared.computer.blocks.TileComputerBase; +import dan200.computercraft.shared.computer.core.ServerComputer; import de.srendi.advancedperipherals.client.KeyBindings; import de.srendi.advancedperipherals.common.container.KeyboardContainer; import de.srendi.advancedperipherals.common.items.base.BaseItem; import de.srendi.advancedperipherals.common.items.base.IInventoryItem; import de.srendi.advancedperipherals.common.network.APNetworking; -import de.srendi.advancedperipherals.common.network.toclient.KeyboardMouseCapturePacket; +import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; import de.srendi.advancedperipherals.common.smartglasses.modules.keyboard.KeyboardModule; import de.srendi.advancedperipherals.common.util.EnumColor; import de.srendi.advancedperipherals.common.util.SideHelper; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -30,7 +33,6 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,8 +41,7 @@ public class KeyboardItem extends BaseItem implements IInventoryItem, IModuleItem { public static final String BIND_TAG = "bind"; - public static final String GLASSES_BIND_TAG = "glasses_id"; - public static final String BOUND_TYPE_TAG = "bind_type"; + public static final String OPENING_TAG = "KeyboardOpening"; public KeyboardItem() { super(new Properties().stacksTo(1)); @@ -75,48 +76,27 @@ public InteractionResult useOn(UseOnContext context) { @Override public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int inventorySlot, boolean isCurrentItem, @Nullable SmartGlassesAccess access, @Nullable IModule module) { - if (level.isClientSide()) { + if (!level.isClientSide()) { + itemStack.removeTagKey(BIND_TAG); return; } - - if (access == null || !(module instanceof KeyboardModule keyboadModule)) { + if (!(entity instanceof LocalPlayer player)) { return; } - + boolean pressed = KeyBindings.GLASSES_HOTKEY_KEYBINDING.isDown(); CompoundTag data = itemStack.getOrCreateTag(); - int instanceId = access.getComputer().getInstanceID(); - int oldInstanceId = -1; - - if (data.contains(GLASSES_BIND_TAG)) { - oldInstanceId = data.getInt(GLASSES_BIND_TAG); - } - - if (!data.contains(BOUND_TYPE_TAG) || ((oldInstanceId != -1 && oldInstanceId != instanceId)) || !data.getBoolean(BOUND_TYPE_TAG)) { - data.putBoolean(BOUND_TYPE_TAG, true); - data.putInt(GLASSES_BIND_TAG, access.getComputer().getInstanceID()); - data.remove(BIND_TAG); - } - - if (!(entity instanceof ServerPlayer serverPlayer)) { + if (data.getBoolean(OPENING_TAG) == pressed) { return; } - // TODO: this for sure won't work on dedicated server - if (!KeyBindings.GLASSES_HOTKEY_KEYBINDING.isDown()) { + data.putBoolean(OPENING_TAG, pressed); + if (!pressed) { return; } - - access.getComputer().queueEvent("keyboard_open"); - if (serverPlayer.containerMenu instanceof KeyboardContainer openedKeyboard && openedKeyboard.getKeyboardItem() == itemStack) { + if (player.containerMenu instanceof KeyboardContainer openedKeyboard && openedKeyboard.getKeyboardItem().equals(itemStack)) { return; } - - NetworkHooks.openScreen(serverPlayer, this.createContainer(serverPlayer, itemStack), buf -> { - buf.writeBlockPos(serverPlayer.blockPosition()); - buf.writeItem(itemStack); - }); - if (keyboadModule.isCapturingMouse()) { - APNetworking.sendTo(new KeyboardMouseCapturePacket(true), serverPlayer); - } + APNetworking.sendToServer(new GlassesHotkeyPacket("", -1)); + return; } @Override @@ -128,7 +108,8 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (playerIn.isShiftKeyDown()) { return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); } - if (!playerIn.getItemInHand(handIn).getOrCreateTag().contains(BIND_TAG)) { + CompoundTag data = playerIn.getItemInHand(handIn).getTag(); + if (data == null || !data.contains(BIND_TAG)) { playerIn.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.keyboard_notbound")), false); return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); } @@ -140,20 +121,14 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, levelIn, tooltip, flagIn); CompoundTag data = stack.getOrCreateTag(); - if (data.contains(BOUND_TYPE_TAG) && !data.getBoolean(BOUND_TYPE_TAG)) { - if (data.contains(BIND_TAG)) { - tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.bound_to", data.getInt(BIND_TAG)))); - } - } else { - if (data.contains(GLASSES_BIND_TAG)) { - tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.bound_to_glasses", data.getInt(GLASSES_BIND_TAG)))); - } + if (data.contains(BIND_TAG)) { + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.binding.bound_to", data.getInt(BIND_TAG)))); } } private void bind(Player player, ItemStack itemStack, Level world, BlockPos pos) { CompoundTag data = itemStack.getOrCreateTag(); - data.putBoolean(BOUND_TYPE_TAG, false); + data.remove(BIND_TAG); if (!(world.getBlockEntity(pos) instanceof TileComputerBase computer)) { // TODO: should it show bind failed message? @@ -173,7 +148,6 @@ private void bind(Player player, ItemStack itemStack, Level world, BlockPos pos) private void clear(Player player, ItemStack itemStack) { CompoundTag data = itemStack.getOrCreateTag(); data.remove(BIND_TAG); - data.putBoolean(BOUND_TYPE_TAG, false); player.displayClientMessage(EnumColor.buildTextComponent(Component.translatable("text.advancedperipherals.cleared_keyboard")), true); } @@ -184,7 +158,7 @@ public MenuProvider createContainer(Player playerEntity, ItemStack itemStack) { @NotNull @Override public Component getDisplayName() { - return Component.literal(""); + return Component.empty(); } @Override @@ -194,8 +168,29 @@ public AbstractContainerMenu createMenu(int pContainerId, @NotNull Inventory pla }; } + public MenuProvider createContainerWithComputer(Player playerEntity, ItemStack itemStack, ServerComputer computer) { + return new MenuProvider() { + @NotNull + @Override + public Component getDisplayName() { + return Component.empty(); + } + + @Override + public AbstractContainerMenu createMenu(int pContainerId, @NotNull Inventory playerInv, @NotNull Player player) { + return new KeyboardContainer(pContainerId, playerInv, player.blockPosition(), player.getLevel(), itemStack, computer); + } + }; + } + + @Override + public void writeContainerData(Player player, ItemStack stack, FriendlyByteBuf buf) { + buf.writeBlockPos(player.blockPosition()); + buf.writeItem(stack); + } + @Override - public IModule createModule(SmartGlassesAccess access) { - return new KeyboardModule(); + public IModule createModule(SmartGlassesAccess access, ItemStack stack) { + return new KeyboardModule(this, stack); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java index e2a7018c0..7f3743614 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java @@ -34,15 +34,14 @@ public BaseItem() { @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { - if (worldIn.isClientSide) - return new InteractionResultHolder<>(InteractionResult.PASS, playerIn.getItemInHand(handIn)); + ItemStack stack = playerIn.getItemInHand(handIn); + if (worldIn.isClientSide) { + return new InteractionResultHolder<>(InteractionResult.PASS, stack); + } if (this instanceof IInventoryItem inventoryItem) { ServerPlayer serverPlayerEntity = (ServerPlayer) playerIn; - ItemStack stack = playerIn.getItemInHand(handIn); - NetworkHooks.openScreen(serverPlayerEntity, inventoryItem.createContainer(playerIn, stack), buf -> { - buf.writeBlockPos(playerIn.blockPosition()); - buf.writeItem(stack); - }); + NetworkHooks.openScreen(serverPlayerEntity, inventoryItem.createContainer(playerIn, stack), buf -> inventoryItem.writeContainerData(playerIn, stack, buf)); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); } return super.use(worldIn, playerIn, handIn); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/base/IInventoryItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/base/IInventoryItem.java index 7d4ff67f6..1897596e9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/base/IInventoryItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/base/IInventoryItem.java @@ -1,11 +1,12 @@ package de.srendi.advancedperipherals.common.items.base; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; public interface IInventoryItem { + MenuProvider createContainer(Player player, ItemStack itemStack); - MenuProvider createContainer(Player playerEntity, ItemStack itemStack); - + void writeContainerData(Player player, ItemStack itemStack, FriendlyByteBuf buf); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java index f6e0d53ee..026f24151 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/KeyboardMouseCapturePacket.java @@ -4,8 +4,6 @@ import de.srendi.advancedperipherals.common.network.base.IPacket; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent; public class KeyboardMouseCapturePacket implements IPacket { @@ -16,7 +14,6 @@ public KeyboardMouseCapturePacket(boolean enable) { this.enable = enable; } - @OnlyIn(Dist.CLIENT) @Override public void handle(NetworkEvent.Context context) { if (!(Minecraft.getInstance().screen instanceof KeyboardScreen screen)) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java index 0f31cd4ea..6892e9eee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java @@ -2,7 +2,9 @@ import de.srendi.advancedperipherals.common.items.SmartGlassesItem; import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import de.srendi.advancedperipherals.common.smartglasses.modules.keyboard.KeyboardModule; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -29,15 +31,33 @@ public void handle(NetworkEvent.Context context) { return; } + ItemStack smartGlasses = null; + SmartGlassesComputer computer = null; for (ItemStack stack : serverPlayer.getAllSlots()) { if (stack.getItem() instanceof SmartGlassesItem) { - SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack); + computer = SmartGlassesItem.getServerComputer(server, stack); if (computer != null) { - computer.queueEvent("glasses_key_pressed", new Object[]{keyBind, keyPressDuration}); + smartGlasses = stack; break; } } } + if (computer == null) { + return; + } + if (keyPressDuration >= 0) { + computer.queueEvent("glasses_key_pressed", new Object[]{keyBind, keyPressDuration}); + return; + } + SmartGlassesAccess glasses = computer.getSmartGlassesAccess(); + computer.getModules().values() + .stream() + .filter(KeyboardModule.class::isInstance) + .map(KeyboardModule.class::cast) + .findFirst() + .ifPresent((keyboardModule) -> { + keyboardModule.openKeyboard(glasses); + }); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 2880f55f4..cf817da89 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -187,12 +187,15 @@ private void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { } this.upgrades = upgradesBuilder.build(); for (int slot = SmartGlassesItemHandler.PERIPHERAL_SLOTS; slot < SmartGlassesItemHandler.SLOTS; slot++) { - ItemStack peripheralItem = itemHandler.getStackInSlot(slot); + ItemStack moduleItem = itemHandler.getStackInSlot(slot); IModule oldModule = modules.get(slot); - if (!peripheralItem.isEmpty() && peripheralItem.getItem() instanceof IModuleItem module) { - IModule newModule = module.createModule(smartGlassesAccess); - if (oldModule != null && oldModule.getName().equals(newModule.getName())) { - continue; + if (!moduleItem.isEmpty() && moduleItem.getItem() instanceof IModuleItem module) { + IModule newModule = module.createModule(smartGlassesAccess, moduleItem); + if (oldModule != null) { + if (oldModule.getName().equals(newModule.getName())) { + continue; + } + oldModule.onUnequipped(smartGlassesAccess); } modules.put(slot, newModule); } else if (oldModule != null) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java index bed3560a2..b0d4975f6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java @@ -8,7 +8,7 @@ public interface IModuleItem { - IModule createModule(SmartGlassesAccess access); + IModule createModule(SmartGlassesAccess access, ItemStack stack); /** * This method is called every tick the item is in the inventory of the smart glasses diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java index ad0169382..6763be02e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java @@ -8,8 +8,8 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; import de.srendi.advancedperipherals.common.util.KeybindUtil; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; @@ -24,23 +24,25 @@ public boolean isEnabled() { } @Override - public IModule createModule(SmartGlassesAccess access) { + public IModule createModule(SmartGlassesAccess access, ItemStack stack) { return new HotkeyModule(); } @Override public void inventoryTick(@NotNull ItemStack stack, @NotNull Level level, @NotNull Entity entity, int slot, boolean isSelected) { - if (!level.isClientSide() || !(entity instanceof Player player)) + if (!level.isClientSide() || !(entity instanceof LocalPlayer)) { return; + } if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { // Add another 50ms to the duration, one tick setKeyPressDuration(stack, getKeyPressDuration(stack) + 50); - } else if (getKeyPressDuration(stack) > 0) { - // If the key is not pressed, but the duration is greater than 0, we can assume that the key was pressed - // We can now post the event - - int duration = getKeyPressDuration(stack); + return; + } + int duration = getKeyPressDuration(stack); + // If the key is not pressed, but the duration is greater than 0, we can assume that the key was pressed + // We can now post the event + if (duration > 0) { setKeyPressDuration(stack, 0); String keyBind = KeyBindings.GLASSES_HOTKEY_KEYBINDING.getKey().getName(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java index b7a02ea6b..a839c046e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/keyboard/KeyboardModule.java @@ -1,20 +1,32 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.keyboard; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.container.KeyboardContainer; +import de.srendi.advancedperipherals.common.items.KeyboardItem; import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.network.toclient.KeyboardMouseCapturePacket; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.Nullable; public class KeyboardModule implements IModule { + private final KeyboardItem keyboardItem; + private final ItemStack keyboardItemStack; private boolean lastCaptureMouse = false; private volatile boolean captureMouse = false; + public KeyboardModule(KeyboardItem keyboardItem, ItemStack stack) { + this.keyboardItem = keyboardItem; + this.keyboardItemStack = stack; + } + @Override public ResourceLocation getName() { return AdvancedPeripherals.getRL("keyboard"); @@ -48,4 +60,36 @@ public void tick(SmartGlassesAccess glasses) { APNetworking.sendTo(new KeyboardMouseCapturePacket(captureMouse), player); } } + + @Override + public void onUnequipped(SmartGlassesAccess glasses) { + if (!(glasses.getEntity() instanceof ServerPlayer player)) { + return; + } + if (!(player.containerMenu instanceof KeyboardContainer keyboard)) { + return; + } + if (keyboard.getKeyboardItem() == this.keyboardItemStack) { + player.closeContainer(); + } + } + + public void openKeyboard(SmartGlassesAccess glasses) { + if (!(glasses.getEntity() instanceof ServerPlayer player)) { + return; + } + SmartGlassesComputer computer = glasses.getComputer(); + ItemStack stack = computer.getStack(); + + stack.getOrCreateTag().putBoolean(KeyboardItem.OPENING_TAG, true); + computer.queueEvent("keyboard_open"); + + KeyboardItem keyboardItem = this.keyboardItem; + NetworkHooks.openScreen(player, keyboardItem.createContainerWithComputer(player, stack, computer), buf -> keyboardItem.writeContainerData(player, stack, buf)); + boolean captureMouse = this.captureMouse; + this.lastCaptureMouse = captureMouse; + if (captureMouse) { + APNetworking.sendTo(new KeyboardMouseCapturePacket(true), player); + } + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java index 47f5bdc23..825bab885 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java @@ -20,7 +20,7 @@ public boolean isEnabled() { } @Override - public IModule createModule(SmartGlassesAccess access) { + public IModule createModule(SmartGlassesAccess access, ItemStack stack) { return new NightVisionModule(); } @@ -34,7 +34,14 @@ public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int i return; } if (nightVisionModule.isNightVisionEnabled()) { - player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 20 * 13 - 1 /* minus 1 tick then the client timing won't flash */)); + player.addEffect(new MobEffectInstance( + MobEffects.NIGHT_VISION, + 20 * 13 - 1, /* minus 1 tick then the client timing won't flash */ + 0, + false, + false, + true + )); } else { player.removeEffect(MobEffects.NIGHT_VISION); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java index 20a3bd78b..46126c53f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java @@ -4,6 +4,7 @@ import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; +import net.minecraft.world.item.ItemStack; public class OverlayGlassesItem extends BaseItem implements IModuleItem { @@ -13,7 +14,7 @@ public boolean isEnabled() { } @Override - public IModule createModule(SmartGlassesAccess smartGlassesAccess) { + public IModule createModule(SmartGlassesAccess smartGlassesAccess, ItemStack stack) { return new OverlayModule(smartGlassesAccess); } } From 0e9029442d07d77003e28c836630b9f1d8b29bad Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Jun 2025 21:16:17 -0600 Subject: [PATCH 22/24] fix keyboard_close fires with delay --- .../client/screens/KeyboardScreen.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index 58204bbe2..669a3e068 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -95,6 +95,9 @@ public final void removed() { return; } super.removed(); + if (this.minecraft.player != null) { + this.keyboardContainer.removed(this.minecraft.player); + } this.minecraft.keyboardHandler.setSendRepeatsToGui(false); } @@ -167,7 +170,11 @@ public boolean mouseScrolled(double x, double y, double direction) { @Override public final boolean keyPressed(int key, int scancode, int modifiers) { if (key == GLFW.GLFW_KEY_ESCAPE) { - super.onClose(); + if (this.minecraft.player != null) { + this.minecraft.player.closeContainer(); + } else { + super.onClose(); + } return true; } // Forward the tab key to the terminal, rather than moving between controls. From b471dd375037905bdf1ef4c1badb5b1982b0cde1 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Jun 2025 21:35:18 -0600 Subject: [PATCH 23/24] remove unused import --- .../de/srendi/advancedperipherals/common/items/KeyboardItem.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java index f1ec4340a..cb5045a06 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/KeyboardItem.java @@ -19,7 +19,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; From 9b0f17aa86d767c38ae602615d4039c18491548e Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 28 Oct 2025 17:39:07 -0600 Subject: [PATCH 24/24] add license to KeyboardScreen and some code cleanup --- .../client/ClientRegistry.java | 6 +- .../client/screens/KeyboardScreen.java | 5 ++ ...leScreen.java => SaddleTurtleOverlay.java} | 14 ++--- .../common/entity/TurtleSeatEntity.java | 54 ++++++------------ .../toserver/SaddleTurtleControlPacket.java | 56 +++---------------- .../common/util/InputKeySet.java | 56 +++++++++++++++++++ 6 files changed, 96 insertions(+), 95 deletions(-) rename src/main/java/de/srendi/advancedperipherals/client/screens/{SaddleTurtleScreen.java => SaddleTurtleOverlay.java} (93%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/InputKeySet.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index 313cfc884..d53ceb2b8 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -6,7 +6,7 @@ import de.srendi.advancedperipherals.client.renderer.DistanceDetectorRenderer; import de.srendi.advancedperipherals.client.screens.InventoryManagerScreen; import de.srendi.advancedperipherals.client.screens.KeyboardScreen; -import de.srendi.advancedperipherals.client.screens.SaddleTurtleScreen; +import de.srendi.advancedperipherals.client.screens.SaddleTurtleOverlay; import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen; import de.srendi.advancedperipherals.client.smartglasses.OverlayModuleOverlay; import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; @@ -30,7 +30,7 @@ public class ClientRegistry { private static final String[] TURTLE_MODELS = new String[]{"turtle_chat_box_upgrade_left", "turtle_chat_box_upgrade_right", "turtle_environment_upgrade_left", "turtle_environment_upgrade_right", "turtle_player_upgrade_left", "turtle_player_upgrade_right", "turtle_geoscanner_upgrade_left", "turtle_geoscanner_upgrade_right"}; - public static final SaddleTurtleScreen SADDLE_TURTLE_OVERLAY = new SaddleTurtleScreen(); + public static final SaddleTurtleOverlay SADDLE_TURTLE_OVERLAY = new SaddleTurtleOverlay(); public static final OverlayModuleOverlay OVERLAY_MODULE_OVERLAY = new OverlayModuleOverlay(); @SubscribeEvent @@ -76,7 +76,7 @@ public static void registeringRenderers(EntityRenderersEvent.RegisterRenderers e @SubscribeEvent public static void registeringOverlays(RegisterGuiOverlaysEvent event) { - event.registerAboveAll(SaddleTurtleScreen.ID, SADDLE_TURTLE_OVERLAY); + event.registerAboveAll(SaddleTurtleOverlay.ID, SADDLE_TURTLE_OVERLAY); event.registerAboveAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java index 669a3e068..e4898b1e4 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/KeyboardScreen.java @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2021 The CC: Tweaked Developers +// SPDX-FileCopyrightText: 2025 The AdvancedPeripheral Developers +// +// SPDX-License-Identifier: MPL-2.0 + package de.srendi.advancedperipherals.client.screens; import com.mojang.blaze3d.platform.InputConstants; diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleOverlay.java similarity index 93% rename from src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java rename to src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleOverlay.java index 7dc79a758..60bb4cccf 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleOverlay.java @@ -13,7 +13,7 @@ import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; -public class SaddleTurtleScreen extends GuiComponent implements IGuiOverlay { +public class SaddleTurtleOverlay extends GuiComponent implements IGuiOverlay { public static final String ID = "saddle_turtle_overlay"; private static final long ACTIVE_TIMEOUT = 5000; @@ -27,7 +27,7 @@ public class SaddleTurtleScreen extends GuiComponent implements IGuiOverlay { private int barColor = 0; private long lastActived = 0; - public SaddleTurtleScreen() {} + public SaddleTurtleOverlay() {} protected Font getFont() { return this.gui.getMinecraft().font; @@ -45,12 +45,12 @@ protected int textWidth(FormattedCharSequence text) { return getFont().width(text); } - public static boolean isPlayerControllingTurtle() { + public boolean isPlayerControllingTurtle() { LocalPlayer player = Minecraft.getInstance().player; return player != null && player.getVehicle() instanceof TurtleSeatEntity; } - public static boolean isPlayerMountedOnTurtle() { + public boolean isPlayerMountedOnTurtle() { LocalPlayer player = Minecraft.getInstance().player; return player != null && player.getRootVehicle() instanceof TurtleSeatEntity; } @@ -59,7 +59,7 @@ public boolean shouldRenderFuelBar() { if (this.lastActived == 0) { return false; } - if (!isPlayerMountedOnTurtle()) { + if (!this.isPlayerMountedOnTurtle()) { this.hide(); return false; } @@ -138,7 +138,7 @@ private void renderDismountHint(PoseStack stack) { @Override public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { - if (!isPlayerMountedOnTurtle()) { + if (!this.isPlayerMountedOnTurtle()) { return; } @@ -149,7 +149,7 @@ public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int scr if (this.shouldRenderFuelBar()) { this.renderFuelBar(poseStack); } - if (isPlayerControllingTurtle()) { + if (this.isPlayerControllingTurtle()) { this.renderDismountHint(poseStack); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 340bd3cc1..5c5a8314f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -39,18 +39,8 @@ public class TurtleSeatEntity extends Entity implements HasCustomInventoryScreen private ITurtleAccess turtle = null; private int life = 0; - private boolean forwardKey = false; - private boolean backKey = false; - private boolean leftKey = false; - private boolean rightKey = false; - private boolean upKey = false; - private boolean downKey = false; - private boolean forwardKeyOld = false; - private boolean backKeyOld = false; - private boolean leftKeyOld = false; - private boolean rightKeyOld = false; - private boolean upKeyOld = false; - private boolean downKeyOld = false; + private InputKeySet inputs = InputKeySet.NONE; + private InputKeySet oldInputs = InputKeySet.NONE; public TurtleSeatEntity(EntityType type, Level world) { super(type, world); @@ -158,41 +148,31 @@ public void tick() { return; } ServerComputer computer = this.getServerComputer(); - if (computer != null) { - if (this.forwardKey != this.forwardKeyOld) { - this.forwardKeyOld = this.forwardKey; - computer.queueEvent("saddle_control", new Object[]{"forward", this.forwardKey}); + if (computer != null && this.inputs != this.oldInputs) { + if (this.inputs.forward() != this.oldInputs.forward()) { + computer.queueEvent("saddle_control", new Object[]{"forward", this.inputs.forward()}); } - if (this.backKey != this.backKeyOld) { - this.backKeyOld = this.backKey; - computer.queueEvent("saddle_control", new Object[]{"back", this.backKey}); + if (this.inputs.back() != this.oldInputs.back()) { + computer.queueEvent("saddle_control", new Object[]{"back", this.inputs.back()}); } - if (this.leftKey != this.leftKeyOld) { - this.leftKeyOld = this.leftKey; - computer.queueEvent("saddle_control", new Object[]{"left", this.leftKey}); + if (this.inputs.left() != this.oldInputs.left()) { + computer.queueEvent("saddle_control", new Object[]{"left", this.inputs.left()}); } - if (this.rightKey != this.rightKeyOld) { - this.rightKeyOld = this.rightKey; - computer.queueEvent("saddle_control", new Object[]{"right", this.rightKey}); + if (this.inputs.right() != this.oldInputs.right()) { + computer.queueEvent("saddle_control", new Object[]{"right", this.inputs.right()}); } - if (this.upKey != this.upKeyOld) { - this.upKeyOld = this.upKey; - computer.queueEvent("saddle_control", new Object[]{"up", this.upKey}); + if (this.inputs.up() != this.oldInputs.up()) { + computer.queueEvent("saddle_control", new Object[]{"up", this.inputs.up()}); } - if (this.downKey != this.downKeyOld) { - this.downKeyOld = this.downKey; - computer.queueEvent("saddle_control", new Object[]{"down", this.downKey}); + if (this.inputs.down() != this.oldInputs.down()) { + computer.queueEvent("saddle_control", new Object[]{"down", this.inputs.down()}); } + this.oldInputs = this.inputs; } } public void handleSaddleTurtleControlPacket(SaddleTurtleControlPacket packet) { - this.forwardKey = packet.forward; - this.backKey = packet.back; - this.leftKey = packet.left; - this.rightKey = packet.right; - this.upKey = packet.up; - this.downKey = packet.down; + this.inputs = packet.inputs; } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java index e9fca5ba5..10a06d7ee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java @@ -2,37 +2,20 @@ import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.util.InputKeySet; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; public class SaddleTurtleControlPacket implements IPacket { + public final InputKeySet inputs; - public final boolean forward; - public final boolean back; - public final boolean left; - public final boolean right; - public final boolean up; - public final boolean down; - - private static final byte FORWARD_BIT = 1 << 0; - private static final byte BACK_BIT = 1 << 1; - private static final byte LEFT_BIT = 1 << 2; - private static final byte RIGHT_BIT = 1 << 3; - private static final byte UP_BIT = 1 << 4; - private static final byte DOWN_BIT = 1 << 5; - - public SaddleTurtleControlPacket(boolean forward, boolean back, boolean left, boolean right, boolean up, boolean down) { - this.forward = forward; - this.back = back; - this.left = left; - this.right = right; - this.up = up; - this.down = down; + public SaddleTurtleControlPacket(InputKeySet inputs) { + this.inputs = inputs; } - private SaddleTurtleControlPacket(byte bits) { - this((bits & FORWARD_BIT) != 0, (bits & BACK_BIT) != 0, (bits & LEFT_BIT) != 0, (bits & RIGHT_BIT) != 0, (bits & UP_BIT) != 0, (bits & DOWN_BIT) != 0); + public SaddleTurtleControlPacket(boolean forward, boolean back, boolean left, boolean right, boolean up, boolean down) { + this(new InputKeySet(forward, back, left, right, up, down)); } @Override @@ -43,35 +26,12 @@ public void handle(NetworkEvent.Context context) { } } - private byte encodeToBits() { - byte b = 0; - if (this.forward) { - b |= FORWARD_BIT; - } - if (this.back) { - b |= BACK_BIT; - } - if (this.left) { - b |= LEFT_BIT; - } - if (this.right) { - b |= RIGHT_BIT; - } - if (this.up) { - b |= UP_BIT; - } - if (this.down) { - b |= DOWN_BIT; - } - return b; - } - @Override public void encode(FriendlyByteBuf buffer) { - buffer.writeByte(this.encodeToBits()); + buffer.writeByte(this.inputs.toBits()); } public static SaddleTurtleControlPacket decode(FriendlyByteBuf buffer) { - return new SaddleTurtleControlPacket(buffer.readByte()); + return new SaddleTurtleControlPacket(InputKeySet.fromByte(buffer.readByte())); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/InputKeySet.java b/src/main/java/de/srendi/advancedperipherals/common/util/InputKeySet.java new file mode 100644 index 000000000..33cdc1ded --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/InputKeySet.java @@ -0,0 +1,56 @@ +package de.srendi.advancedperipherals.common.util; + +public record InputKeySet( + boolean forward, + boolean back, + boolean left, + boolean right, + boolean up, + boolean down +) { + public static final InputKeySet NONE = new InputKeySet(false, false, false, false, false, false); + + private static final byte FORWARD_BIT = 1 << 0; + private static final byte BACK_BIT = 1 << 1; + private static final byte LEFT_BIT = 1 << 2; + private static final byte RIGHT_BIT = 1 << 3; + private static final byte UP_BIT = 1 << 4; + private static final byte DOWN_BIT = 1 << 5; + + public byte toByte() { + byte b = 0; + if (this.forward) { + b |= FORWARD_BIT; + } + if (this.back) { + b |= BACK_BIT; + } + if (this.left) { + b |= LEFT_BIT; + } + if (this.right) { + b |= RIGHT_BIT; + } + if (this.up) { + b |= UP_BIT; + } + if (this.down) { + b |= DOWN_BIT; + } + return b; + } + + public static InputKeySet fromByte(final byte bits) { + if (bits == 0) { + return InputKeySet.NONE; + } + return new InputKeySet( + (bits & FORWARD_BIT) != 0, + (bits & BACK_BIT) != 0, + (bits & LEFT_BIT) != 0, + (bits & RIGHT_BIT) != 0, + (bits & UP_BIT) != 0, + (bits & DOWN_BIT) != 0 + ); + } +}