From 66212d2d16e5f72728cb6a84aa15b97e5b21c797 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:54:56 -0600 Subject: [PATCH 01/15] Make gradlew executable, remove libs dir --- build.gradle | 1 - gradlew | 0 libs/mcef-2.x.jar | Bin 200767 -> 0 bytes 3 files changed, 1 deletion(-) mode change 100644 => 100755 gradlew delete mode 100644 libs/mcef-2.x.jar diff --git a/build.gradle b/build.gradle index d28a328..dedd6af 100644 --- a/build.gradle +++ b/build.gradle @@ -79,7 +79,6 @@ repositories{ name = "cursemaven" url = "https://www.cursemaven.com" } - flatDir { dirs 'libs' } maven { url 'https://mcef-download.cinemamod.com/repositories/releases/' } } diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/libs/mcef-2.x.jar b/libs/mcef-2.x.jar deleted file mode 100644 index f4316ec7d38f6c72d24a70947eabf1a591628581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200767 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 WSbrYGOqiO2|8Q!s8eR+08TWtF;umHB From 68694611247fe5e148fc3fc6a0a640fc1f0f0924 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:55:38 -0600 Subject: [PATCH 02/15] Update Specification-Title in MANIFEST --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dedd6af..10bc6d6 100644 --- a/build.gradle +++ b/build.gradle @@ -100,7 +100,7 @@ dependencies { jar { manifest { attributes([ - "Specification-Title": "Webdisplays", + "Specification-Title": "WebDisplays", "Specification-Vendor": "CinemaMod Group", "Specification-Version": "1", // We are version 1 of ourselves "Implementation-Title": project.name, From 96d7c92c3777b645cb5ccf06a199b2ee9eef81bc Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:46:18 -0600 Subject: [PATCH 03/15] MIT License, start new README, gradle.properties cleanup --- LICENSE | 22 +++++++++++++++++++++- README.md | 25 +++++++++++++++++-------- gradle.properties | 20 ++++---------------- 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/LICENSE b/LICENSE index b2669d7..49e4784 100644 --- a/LICENSE +++ b/LICENSE @@ -1 +1,21 @@ -This mod and its source code is now in public domain. Feel free to do whatever you want with it; make forks, distribute it... whatever I would appreciate it, of course, if you credited me 😊 Thank you! +MIT License + +Copyright (c) 2023 CinemaMod Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index e19d6e3..d1d640f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,19 @@ -# CinemaMod WebDisplays -This is a fork of the WebDisplays mod from 1.12, updated to work in newer versions, and with some bug fixes and reworking. - -Cinemamod WebDisplays also uses CinemaMod's [MCEF](https://github.com/CinemaMod/mcef) and [JCEF](https://github.com/CinemaMod/java-cef), which should allow for WD to be a bit more seamless than [Chromium's JCEF](https://github.com/chromiumembedded/java-cef) would allow for. - # WebDisplays -WebDisplays adds a screen block, which allows you to browse the internet in minecraft. +WebDisplays is a mod for creating and interacting with web browsers in Minecraft. You can create screens in your world and browse the internet. -### Wiki -* A Wiki which details all blocks/items can be found on [montoyo's website](https://montoyo.net/wdwiki/). However, a lot of stuff has changed since that wiki was written. +WebDisplay was originally written by montoyo. It is currently maintained by CinemaMod Group. + +Download WebDisplays from either: +- CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/webdisplays +- Modrinth: TODO + +**WebDisplays Requires MCEF!** You must install MCEF in order for WebDisplays to work. + +Download MCEF from either: +- CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/mcef +- Modrinth: https://modrinth.com/mod/mcef + +## Wiki +[Outdated Wiki from the original creator](https://montoyo.net/wdwiki/index.php?title=Main_Page) + +[Outdated Getting Started](https://montoyo.net/wdwiki/index.php?title=Screen) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index b6708a3..47c8dda 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,5 @@ # Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx3G -loom.platform=forge - -# Fabric Properties -# check these on https://fabricmc.net/develop -minecraft_version=1.19.2 -yarn_mappings=1.19.2+build.28 -loader_version=0.14.14 - -# Mod Properties -mod_version = 1.3.3 -maven_group = net.montoyo.wd -archives_base_name = webdisplays - -# Dependencies -forge_version=1.19.2-43.2.6 +org.gradle.jvmargs = -Xmx3G +mod_version = 2.0.0-1.20.1 +maven_group = com.cinemamod +archives_base_name = webdisplays \ No newline at end of file From a9d9dcfecf9b36bd631b22a636f8dd6c44402d05 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:50:06 -0500 Subject: [PATCH 04/15] format. --- src/main/java/net/montoyo/wd/WebDisplays.java | 20 +- .../montoyo/wd/block/BlockKeyboardLeft.java | 1 - .../montoyo/wd/block/BlockKeyboardRight.java | 1 - .../net/montoyo/wd/block/BlockPeripheral.java | 26 +- .../net/montoyo/wd/block/BlockScreen.java | 155 ++++------- .../montoyo/wd/block/item/KeyboardItem.java | 82 +++--- .../net/montoyo/wd/client/ClientProxy.java | 27 +- .../renderers/LaserPointerRenderer.java | 5 +- .../net/montoyo/wd/core/AdvancementIcon.java | 24 -- .../java/net/montoyo/wd/core/CCArguments.java | 1 + .../net/montoyo/wd/core/CraftComponent.java | 4 +- .../java/net/montoyo/wd/core/Criterion.java | 5 +- .../montoyo/wd/core/DefaultPeripheral.java | 11 +- .../net/montoyo/wd/core/HasAdvancement.java | 2 - .../net/montoyo/wd/core/IComputerArgs.java | 2 - .../java/net/montoyo/wd/core/IPeripheral.java | 2 - .../montoyo/wd/core/IScreenQueryHandler.java | 2 - .../java/net/montoyo/wd/core/IUpgrade.java | 2 - .../net/montoyo/wd/core/IWDDCapability.java | 2 - .../net/montoyo/wd/core/JSServerRequest.java | 2 - .../wd/core/MissingPermissionException.java | 2 - .../java/net/montoyo/wd/core/OCArguments.java | 2 - .../net/montoyo/wd/core/ScreenRights.java | 6 +- .../net/montoyo/wd/core/WDDCapability.java | 8 +- .../java/net/montoyo/wd/data/GuiData.java | 91 +++---- .../net/montoyo/wd/data/KeyboardData.java | 9 +- .../net/montoyo/wd/data/RedstoneCtrlData.java | 9 +- .../net/montoyo/wd/data/ScreenConfigData.java | 159 ++++++------ .../java/net/montoyo/wd/data/ServerData.java | 9 +- .../java/net/montoyo/wd/data/SetURLData.java | 11 +- .../wd/entity/TileEntityCCInterface.java | 2 - .../wd/entity/TileEntityInterfaceBase.java | 2 - .../montoyo/wd/entity/TileEntityKeyboard.java | 8 +- .../wd/entity/TileEntityPeripheralBase.java | 31 ++- .../montoyo/wd/entity/TileEntityRCtrl.java | 13 +- .../montoyo/wd/entity/TileEntityRedCtrl.java | 29 +-- .../montoyo/wd/entity/TileEntityScreen.java | 48 ++-- .../montoyo/wd/entity/TileEntityServer.java | 14 +- .../montoyo/wd/item/ItemCraftComponent.java | 1 - .../net/montoyo/wd/item/ItemLaserPointer.java | 5 +- .../java/net/montoyo/wd/item/ItemLinker.java | 28 +- .../net/montoyo/wd/item/ItemMinePad2.java | 168 ++++++------ .../java/net/montoyo/wd/item/ItemMulti.java | 1 - .../montoyo/wd/item/ItemOwnershipThief.java | 26 +- .../wd/item/ItemScreenConfigurator.java | 11 +- .../java/net/montoyo/wd/item/ItemUpgrade.java | 4 +- src/main/java/net/montoyo/wd/item/WDItem.java | 5 +- .../montoyo/wd/mixins/MouseHandlerMixin.java | 38 +-- .../net/montoyo/wd/mixins/OverlayMixin.java | 28 +- .../BlockRegistry.java} | 15 +- .../ItemRegistry.java} | 31 ++- .../TileRegistry.java} | 23 +- .../TabInit.java => registry/WDTabs.java} | 31 ++- .../net/montoyo/wd/utilities/BlockSide.java | 30 +-- .../java/net/montoyo/wd/utilities/Bounds.java | 2 - .../net/montoyo/wd/utilities/DistSafety.java | 12 +- .../java/net/montoyo/wd/utilities/Log.java | 14 +- .../net/montoyo/wd/utilities/Multiblock.java | 25 +- .../net/montoyo/wd/utilities/MutableAABB.java | 114 ++++----- .../montoyo/wd/utilities/NameUUIDPair.java | 4 +- .../net/montoyo/wd/utilities/NibbleArray.java | 8 +- .../net/montoyo/wd/utilities/Rotation.java | 2 - .../montoyo/wd/utilities/ScreenIterator.java | 6 +- .../java/net/montoyo/wd/utilities/Util.java | 77 +++--- .../net/montoyo/wd/utilities/Vector2i.java | 17 +- .../net/montoyo/wd/utilities/Vector3f.java | 4 +- .../net/montoyo/wd/utilities/Vector3i.java | 26 +- .../net/montoyo/wd/utilities/VideoType.java | 242 +++++++++--------- 68 files changed, 828 insertions(+), 999 deletions(-) delete mode 100644 src/main/java/net/montoyo/wd/core/AdvancementIcon.java rename src/main/java/net/montoyo/wd/{init/BlockInit.java => registry/BlockRegistry.java} (50%) rename src/main/java/net/montoyo/wd/{init/ItemInit.java => registry/ItemRegistry.java} (80%) rename src/main/java/net/montoyo/wd/{init/TileInit.java => registry/TileRegistry.java} (61%) rename src/main/java/net/montoyo/wd/{init/TabInit.java => registry/WDTabs.java} (55%) diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index 8473021..9ba905a 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -42,10 +42,10 @@ import net.montoyo.wd.config.ClientConfig; import net.montoyo.wd.config.CommonConfig; import net.montoyo.wd.controls.ScreenControlRegistry; import net.montoyo.wd.core.*; -import net.montoyo.wd.init.BlockInit; -import net.montoyo.wd.init.ItemInit; -import net.montoyo.wd.init.TabInit; -import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.registry.BlockRegistry; +import net.montoyo.wd.registry.ItemRegistry; +import net.montoyo.wd.registry.WDTabs; +import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.miniserv.server.Server; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageServerInfo; @@ -130,10 +130,10 @@ public class WebDisplays { WDNetworkRegistry.init(); SOUNDS.register(bus); onRegisterSounds(); - TabInit.init(bus); - BlockInit.init(bus); - ItemInit.init(bus); - TileInit.init(bus); + WDTabs.init(bus); + BlockRegistry.init(bus); + ItemRegistry.init(bus); + TileRegistry.init(bus); PROXY.preInit(); @@ -253,7 +253,7 @@ public class WebDisplays { if(!ev.getEntity().level().isClientSide) { ItemStack is = ev.getEntity().getItem(); - if(is.getItem() == ItemInit.MINEPAD.get()) { + if(is.getItem() == ItemRegistry.MINEPAD.get()) { CompoundTag tag = is.getTag(); if(tag == null) { @@ -271,7 +271,7 @@ public class WebDisplays { @SubscribeEvent public void onPlayerCraft(PlayerEvent.ItemCraftedEvent ev) { - if(CommonConfig.hardRecipes && ItemInit.isCompCraftItem(ev.getCrafting().getItem()) && (CraftComponent.EXTCARD.makeItemStack().is(ev.getCrafting().getItem()))) { + if(CommonConfig.hardRecipes && ItemRegistry.isCompCraftItem(ev.getCrafting().getItem()) && (CraftComponent.EXTCARD.makeItemStack().is(ev.getCrafting().getItem()))) { if((ev.getEntity() instanceof ServerPlayer && !hasPlayerAdvancement((ServerPlayer) ev.getEntity(), ADV_PAD_BREAK)) || PROXY.hasClientPlayerAdvancement(ADV_PAD_BREAK) != HasAdvancement.YES) { ev.getCrafting().setDamageValue(CraftComponent.BADEXTCARD.ordinal()); diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java b/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java index 8f5be72..d33d15f 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java +++ b/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java @@ -33,7 +33,6 @@ import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import org.jetbrains.annotations.NotNull; public class BlockKeyboardLeft extends BlockPeripheral { - public static final EnumProperty TYPE = EnumProperty.create("type", DefaultPeripheral.class); public static final DirectionProperty FACING = DirectionProperty.create("facing", Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST); // public static final DirectionProperty HALF = DirectionProperty.create("facing", Direction.EAST, Direction.WEST); diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java index b27f8b5..4498563 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java +++ b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java @@ -36,7 +36,6 @@ import static net.montoyo.wd.block.BlockPeripheral.point; // TODO: merge into KeyboardLeft public class BlockKeyboardRight extends Block implements IPeripheral { - public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public BlockKeyboardRight() { diff --git a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java index bb5b638..dd8eecb 100644 --- a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java +++ b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java @@ -49,12 +49,12 @@ public class BlockPeripheral extends WDBlockContainer { @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { BlockEntityType.BlockEntitySupplier cls = type.getTEClass(); - if(cls == null) + if (cls == null) return null; try { return cls.create(pos, state); - } catch(Throwable t) { + } catch (Throwable t) { Log.errorEx("Couldn't instantiate peripheral TileEntity:", t); } @@ -68,17 +68,17 @@ public class BlockPeripheral extends WDBlockContainer { @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - if(player.isShiftKeyDown()) + if (player.isShiftKeyDown()) return InteractionResult.FAIL; - if(player.getItemInHand(hand).getItem() instanceof ItemLinker) + if (player.getItemInHand(hand).getItem() instanceof ItemLinker) return InteractionResult.FAIL; BlockEntity te = world.getBlockEntity(pos); - if(te instanceof TileEntityPeripheralBase) + if (te instanceof TileEntityPeripheralBase) return ((TileEntityPeripheralBase) te).onRightClick(player, hand); - else if(te instanceof TileEntityServer) { + else if (te instanceof TileEntityServer) { ((TileEntityServer) te).onPlayerRightClick(player); return InteractionResult.SUCCESS; } else @@ -92,15 +92,15 @@ public class BlockPeripheral extends WDBlockContainer { @Override public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - if(world.isClientSide) + if (world.isClientSide) return; - if(placer instanceof Player) { + if (placer instanceof Player) { BlockEntity te = world.getBlockEntity(pos); - if(te instanceof TileEntityServer) + if (te instanceof TileEntityServer) ((TileEntityServer) te).setOwner((Player) placer); - else if(te instanceof TileEntityInterfaceBase) + else if (te instanceof TileEntityInterfaceBase) ((TileEntityInterfaceBase) te).setOwner((Player) placer); } } @@ -113,13 +113,13 @@ public class BlockPeripheral extends WDBlockContainer { @Override public void neighborChanged(BlockState state, Level world, BlockPos pos, Block neighborType, BlockPos neighbor, boolean isMoving) { BlockEntity te = world.getBlockEntity(pos); - if(te instanceof TileEntityPeripheralBase) + if (te instanceof TileEntityPeripheralBase) ((TileEntityPeripheralBase) te).onNeighborChange(neighborType, neighbor); } @Override public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - if(!world.isClientSide) { + if (!world.isClientSide) { WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } super.playerDestroy(world, player, pos, state, blockEntity, tool); @@ -133,7 +133,7 @@ public class BlockPeripheral extends WDBlockContainer { public static PacketDistributor.TargetPoint point(Player exclude, Level world, BlockPos bp) { return new PacketDistributor.TargetPoint((ServerPlayer) exclude, bp.getX(), bp.getY(), bp.getZ(), 64.0, world.dimension()); } - + public static PacketDistributor.TargetPoint point(Level world, BlockPos bp) { return new PacketDistributor.TargetPoint(bp.getX(), bp.getY(), bp.getZ(), 64.0, world.dimension()); } diff --git a/src/main/java/net/montoyo/wd/block/BlockScreen.java b/src/main/java/net/montoyo/wd/block/BlockScreen.java index 74818c9..a992e1c 100644 --- a/src/main/java/net/montoyo/wd/block/BlockScreen.java +++ b/src/main/java/net/montoyo/wd/block/BlockScreen.java @@ -13,10 +13,8 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RenderShape; @@ -35,13 +33,11 @@ import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.SetURLData; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.item.ItemLaserPointer; import net.montoyo.wd.utilities.*; import org.jetbrains.annotations.NotNull; public class BlockScreen extends BaseEntityBlock { - public static final BooleanProperty hasTE = BooleanProperty.create("haste"); public static final BooleanProperty emitting = BooleanProperty.create("emitting"); private static final Property[] properties = new Property[]{hasTE, emitting}; @@ -51,47 +47,11 @@ public class BlockScreen extends BaseEntityBlock { this.registerDefaultState(this.defaultBlockState().setValue(hasTE, false).setValue(emitting, false)); } - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(properties); - } - - @Override - public RenderShape getRenderShape(BlockState state) { - return RenderShape.MODEL; - } - - public static boolean isntScreenBlock(Level world, Vector3i pos) { - return world.getBlockState(pos.toBlock()).getBlock() != BlockInit.blockScreen.get(); - } - - @org.jetbrains.annotations.Nullable - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - return super.getStateForPlacement(context); - } - - @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos currentPos, BlockPos neighborPos) { - return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos); - } - - public int getMetaFromState(BlockState state) { - int ret = 0; - if (state.getValue(hasTE)) - ret |= 1; - - if (state.getValue(emitting)) - ret |= 2; - - return ret; - } - @Override public void onRemove(BlockState p_60515_, Level p_60516_, BlockPos p_60517_, BlockState p_60518_, boolean p_60519_) { // TODO: make this also get called on client? if (p_60518_.getBlock() == p_60515_.getBlock()) return; - + for (BlockSide value : BlockSide.values()) { Vector3i vec = new Vector3i(p_60517_.getX(), p_60517_.getY(), p_60517_.getZ()); Multiblock.findOrigin(p_60516_, vec, value, null); @@ -118,7 +78,7 @@ public class BlockScreen extends BaseEntityBlock { return InteractionResult.FAIL; else if (heldItem.getItem() instanceof ItemLaserPointer) return InteractionResult.FAIL; // laser pointer already handles stuff - + // handling the off hand leads to double clicking if (!isUpgrade && hand == InteractionHand.OFF_HAND) return InteractionResult.FAIL; @@ -138,7 +98,7 @@ public class BlockScreen extends BaseEntityBlock { TileEntityScreen.Screen scr = te.getScreen(side); if (sneaking) { //Right Click - if((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) + if ((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) Util.toast(player, "restrictions"); else (new SetURLData(pos, scr.side, scr.url)).sendTo((ServerPlayer) player); @@ -170,11 +130,11 @@ public class BlockScreen extends BaseEntityBlock { } Vector2i tmp = new Vector2i(); - + float hitX = ((float) hit.getLocation().x) - (float) te.getBlockPos().getX(); float hitY = ((float) hit.getLocation().y) - (float) te.getBlockPos().getY(); float hitZ = ((float) hit.getLocation().z) - (float) te.getBlockPos().getZ(); - + if (hit2pixels(side, hit.getBlockPos(), new Vector3i(hit.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) te.click(side, tmp); return InteractionResult.CONSUME; @@ -218,7 +178,7 @@ public class BlockScreen extends BaseEntityBlock { @Override public void neighborChanged(BlockState state, Level world, BlockPos pos, Block block, BlockPos source, - boolean isMoving){ + boolean isMoving) { if (block != this && !world.isClientSide && !state.getValue(emitting)) { for (BlockSide side : BlockSide.values()) { Vector3i vec = new Vector3i(pos); @@ -233,79 +193,57 @@ public class BlockScreen extends BaseEntityBlock { } } } - + public static boolean hit2pixels(BlockSide side, BlockPos bpos, Vector3i pos, TileEntityScreen.Screen scr, float hitX, float hitY, float hitZ, Vector2i dst) { - if(side.right.x < 0) - hitX -= 1.f; - - if(side.right.z < 0 || side == BlockSide.TOP || side == BlockSide.BOTTOM) - hitZ -= 1.f; - - Vector3f rel = new Vector3f(bpos.getX(), bpos.getY(), bpos.getZ()); - rel.sub((float) pos.x, (float) pos.y, (float) pos.z); - rel.add(hitX, hitY, hitZ); - - float cx = rel.dot(side.right.toFloat()) - 2.f / 16.f; - float cy = rel.dot(side.up.toFloat()) - 2.f / 16.f; - float sw = ((float) scr.size.x) - 4.f / 16.f; - float sh = ((float) scr.size.y) - 4.f / 16.f; - - cx /= sw; - cy /= sh; - - if(cx >= 0.f && cx <= 1.0 && cy >= 0.f && cy <= 1.f) { - if(side != BlockSide.BOTTOM) + Vector3f rel = new Vector3f(hitX, hitY, hitZ); + + // how these dot products come in is beyond me + float cx = rel.dot(side.horizontal.toFloat()) - 2.f / 16.f; + float cy = rel.dot(side.vertical.toFloat()) - 2.f / 16.f; + + // scale coordinate to be in the size mcef expects (0 -> 1) + cx /= ((float) scr.size.x) - 4.f / 16.f; + cy /= ((float) scr.size.y) - 4.f / 16.f; + + if (cx >= 0.f && cx <= 1.0 && cy >= 0.f && cy <= 1.f) { + if (side != BlockSide.BOTTOM) cy = 1.f - cy; - - switch(scr.rotation) { + + switch (scr.rotation) { case ROT_90: cy = 1.0f - cy; break; - + case ROT_180: cx = 1.0f - cx; cy = 1.0f - cy; break; - + case ROT_270: cx = 1.0f - cx; break; - - default: - break; } - + cx *= (float) scr.resolution.x; cy *= (float) scr.resolution.y; - - if(scr.rotation.isVertical) { + + if (scr.rotation.isVertical) { dst.x = (int) cy; dst.y = (int) cx; } else { dst.x = (int) cx; dst.y = (int) cy; } - + return true; } - + return false; } - @org.jetbrains.annotations.Nullable - @Override - public BlockEntity newBlockEntity (BlockPos pos, BlockState state){ - int meta = getMetaFromState(state); - - if ((meta & 1) == 0) - return null; - - return ((meta & 1) == 0) ? null : new TileEntityScreen(pos, state); - } - /************************************************* DESTRUCTION HANDLING *************************************************/ - private void onDestroy (Level world, BlockPos pos, Player ply){ + private void onDestroy(Level world, BlockPos pos, Player ply) { if (!world.isClientSide) { Vector3i bp = new Vector3i(pos); Multiblock.BlockOverride override = new Multiblock.BlockOverride(bp, Multiblock.OverrideAction.SIMULATE); @@ -315,8 +253,8 @@ public class BlockScreen extends BaseEntityBlock { } } - private void destroySide (Level world, Vector3i pos, BlockSide side, Multiblock.BlockOverride override, Player - source){ + private void destroySide(Level world, Vector3i pos, BlockSide side, Multiblock.BlockOverride override, Player + source) { Multiblock.findOrigin(world, pos, side, override); BlockPos bp = pos.toBlock(); BlockEntity te = world.getBlockEntity(bp); @@ -328,15 +266,15 @@ public class BlockScreen extends BaseEntityBlock { } @Override - public boolean onDestroyedByPlayer (BlockState state, Level level, BlockPos pos, Player player, - boolean willHarvest, FluidState fluid){ + public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, + boolean willHarvest, FluidState fluid) { onDestroy(level, pos, player); return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); } @Override - public void setPlacedBy (Level world, @NotNull BlockPos pos, @NotNull BlockState - state, @org.jetbrains.annotations.Nullable LivingEntity whoDidThisShit, @NotNull ItemStack stack){ + public void setPlacedBy(Level world, @NotNull BlockPos pos, @NotNull BlockState + state, @org.jetbrains.annotations.Nullable LivingEntity whoDidThisShit, @NotNull ItemStack stack) { if (world.isClientSide) return; @@ -358,18 +296,35 @@ public class BlockScreen extends BaseEntityBlock { } } + /************************************************* STUFF THAT'S UNLIKELY TO BE TOUCHED BUT NEEDS TO BE HERE *************************************************/ + @Override - public @NotNull PushReaction getPistonPushReaction (BlockState state){ + public @NotNull PushReaction getPistonPushReaction(BlockState state) { return PushReaction.IGNORE; } @Override - public int getSignal (BlockState state, BlockGetter level, BlockPos pos, Direction direction){ + public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { return state.getValue(emitting) ? 15 : 0; } @Override - public boolean isSignalSource (BlockState state){ + public boolean isSignalSource(BlockState state) { return state.getValue(emitting); } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return state.getValue(hasTE) ? new TileEntityScreen(pos, state) : null; + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(properties); + } } diff --git a/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java b/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java index 381c500..c260757 100644 --- a/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java +++ b/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java @@ -8,47 +8,47 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.block.BlockKeyboardLeft; -import net.montoyo.wd.init.BlockInit; +import net.montoyo.wd.registry.BlockRegistry; public class KeyboardItem extends BlockItem { - public KeyboardItem(Block arg, Properties arg2) { - super(arg, arg2); - } - - @Override - protected boolean placeBlock(BlockPlaceContext arg, BlockState arg2) { - Direction facing = arg.getHorizontalDirection(); - arg2 = arg2.setValue(BlockKeyboardLeft.FACING, facing); - - Direction d = BlockKeyboardLeft.mapDirection(facing); - - if (isValid(arg.getClickedPos(), arg.getLevel(), arg2, d)) { - Block kbRight = BlockInit.blockKbRight.get(); - BlockState rightState = kbRight.defaultBlockState(); - - rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing); - if (!arg.getLevel().setBlock( - arg.getClickedPos().relative(d), - rightState, - 11 - )) return false; - return arg.getLevel().setBlock(arg.getClickedPos(), arg2, 11);// 161 - } else if (isValid(arg.getClickedPos().relative(d.getOpposite(), 2), arg.getLevel(), arg2, d)) { - Block kbRight = BlockInit.blockKbRight.get(); - BlockState rightState = kbRight.defaultBlockState(); - - rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing); - if (!arg.getLevel().setBlock( - arg.getClickedPos(), - rightState, - 11 - )) return false; - return arg.getLevel().setBlock(arg.getClickedPos().relative(d.getOpposite()), arg2, 11);// 161 - } - return false; - } - - private boolean isValid(BlockPos pos, Level level, BlockState state, Direction d) { - return level.getBlockState(pos.relative(d)).isAir(); - } + public KeyboardItem(Block arg, Properties arg2) { + super(arg, arg2); + } + + @Override + protected boolean placeBlock(BlockPlaceContext arg, BlockState arg2) { + Direction facing = arg.getHorizontalDirection(); + arg2 = arg2.setValue(BlockKeyboardLeft.FACING, facing); + + Direction d = BlockKeyboardLeft.mapDirection(facing); + + if (isValid(arg.getClickedPos(), arg.getLevel(), arg2, d)) { + Block kbRight = BlockRegistry.blockKbRight.get(); + BlockState rightState = kbRight.defaultBlockState(); + + rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing); + if (!arg.getLevel().setBlock( + arg.getClickedPos().relative(d), + rightState, + 11 + )) return false; + return arg.getLevel().setBlock(arg.getClickedPos(), arg2, 11);// 161 + } else if (isValid(arg.getClickedPos().relative(d.getOpposite(), 2), arg.getLevel(), arg2, d)) { + Block kbRight = BlockRegistry.blockKbRight.get(); + BlockState rightState = kbRight.defaultBlockState(); + + rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing); + if (!arg.getLevel().setBlock( + arg.getClickedPos(), + rightState, + 11 + )) return false; + return arg.getLevel().setBlock(arg.getClickedPos().relative(d.getOpposite()), arg2, 11);// 161 + } + return false; + } + + private boolean isValid(BlockPos pos, Level level, BlockState state, Direction d) { + return level.getBlockState(pos.relative(d)).isAir(); + } } diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 6963abe..5106536 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -10,13 +10,11 @@ import com.mojang.authlib.GameProfile; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementProgress; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -24,8 +22,6 @@ import net.minecraft.client.multiplayer.ClientAdvancements; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.resources.model.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -66,14 +62,12 @@ import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.client.gui.*; import net.montoyo.wd.client.gui.loading.GuiLoader; import net.montoyo.wd.client.renderers.*; -import net.montoyo.wd.config.ClientConfig; import net.montoyo.wd.core.HasAdvancement; -import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.data.GuiData; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.init.BlockInit; -import net.montoyo.wd.init.ItemInit; -import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.registry.BlockRegistry; +import net.montoyo.wd.registry.ItemRegistry; +import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.item.ItemLaserPointer; import net.montoyo.wd.item.ItemMinePad2; import net.montoyo.wd.item.WDItem; @@ -86,7 +80,6 @@ import org.cef.browser.CefBrowser; import org.cef.browser.CefFrame; import org.cef.handler.CefDisplayHandler; import org.cef.misc.CefCursorType; -import org.cef.network.CefRequest; import org.joml.Vector3d; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -150,7 +143,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS BlockPos bpos = result.getBlockPos(); - if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockInit.blockScreen.get()) { + if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockRegistry.SCREEN_BLOCk.get()) { RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); poseStack.blit(new ResourceLocation( @@ -242,7 +235,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS /**************************************** INHERITED METHODS ****************************************/ @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { - BlockEntityRenderers.register(TileInit.SCREEN_BLOCK_ENTITY.get(), new ScreenRenderer.ScreenRendererProvider()); + BlockEntityRenderers.register(TileRegistry.SCREEN_BLOCK_ENTITY.get(), new ScreenRenderer.ScreenRendererProvider()); } @SubscribeEvent @@ -780,10 +773,10 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS Item item = ev.getItemStack().getItem(); IItemRenderer renderer; - if (ItemInit.MINEPAD.isPresent() && ItemInit.LASER_POINTER.isPresent()) { - if (item == ItemInit.MINEPAD.get()) + if (ItemRegistry.MINEPAD.isPresent() && ItemRegistry.LASER_POINTER.isPresent()) { + if (item == ItemRegistry.MINEPAD.get()) renderer = minePadRenderer; - else if (item == ItemInit.LASER_POINTER.get()) + else if (item == ItemRegistry.LASER_POINTER.get()) renderer = laserPointerRenderer; else return; @@ -823,8 +816,8 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS for (int i = 0; i < cnt; i++) { ItemStack item = inv.get(i); - if (ItemInit.MINEPAD.isPresent()) { - if (item.getItem() == ItemInit.MINEPAD.get()) { + if (ItemRegistry.MINEPAD.isPresent()) { + if (item.getItem() == ItemRegistry.MINEPAD.get()) { CompoundTag tag = item.getTag(); if (tag != null && tag.contains("PadID")) diff --git a/src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java index 244720c..3b9af81 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java @@ -16,10 +16,9 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.ClientProxy; -import net.montoyo.wd.init.ItemInit; +import net.montoyo.wd.registry.ItemRegistry; import net.montoyo.wd.item.ItemLaserPointer; import org.joml.Matrix4f; -import org.lwjgl.opengl.GL11; import static com.mojang.math.Axis.*; @@ -40,7 +39,7 @@ public final class LaserPointerRenderer implements IItemRenderer { ClientProxy.mouseOn || ItemLaserPointer.isOn() ) && - mc.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemInit.LASER_POINTER.get()) && + mc.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemRegistry.LASER_POINTER.get()) && (mc.hitResult == null || mc.hitResult.getType() == HitResult.Type.BLOCK || mc.hitResult.getType() == HitResult.Type.MISS); } diff --git a/src/main/java/net/montoyo/wd/core/AdvancementIcon.java b/src/main/java/net/montoyo/wd/core/AdvancementIcon.java deleted file mode 100644 index b81790f..0000000 --- a/src/main/java/net/montoyo/wd/core/AdvancementIcon.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.core; - -public enum AdvancementIcon { - - WEB_DISPLAYS("wd"), - BROKEN_PAD("brokenpad"), - PIGEON("pigeon"); - - private final String name; - - AdvancementIcon(String n) { - name = n; - } - - @Override - public String toString() { - return name; - } - -} diff --git a/src/main/java/net/montoyo/wd/core/CCArguments.java b/src/main/java/net/montoyo/wd/core/CCArguments.java index caab3ae..3dbaf91 100644 --- a/src/main/java/net/montoyo/wd/core/CCArguments.java +++ b/src/main/java/net/montoyo/wd/core/CCArguments.java @@ -7,6 +7,7 @@ package net.montoyo.wd.core; import java.util.List; import java.util.Map; +// TODO: bring this back when SSR is implemented public class CCArguments implements IComputerArgs { private final Object[] args; diff --git a/src/main/java/net/montoyo/wd/core/CraftComponent.java b/src/main/java/net/montoyo/wd/core/CraftComponent.java index 53544a8..0481856 100644 --- a/src/main/java/net/montoyo/wd/core/CraftComponent.java +++ b/src/main/java/net/montoyo/wd/core/CraftComponent.java @@ -5,7 +5,7 @@ package net.montoyo.wd.core; import net.minecraft.world.item.ItemStack; -import net.montoyo.wd.init.ItemInit; +import net.montoyo.wd.registry.ItemRegistry; public enum CraftComponent { STONEKEY("stonekey", "StoneKey"), @@ -32,6 +32,6 @@ public enum CraftComponent { } public ItemStack makeItemStack() { - return new ItemStack(ItemInit.getComputerCraftItem(ordinal()).get(), 1); + return new ItemStack(ItemRegistry.getComputerCraftItem(ordinal()).get(), 1); } } diff --git a/src/main/java/net/montoyo/wd/core/Criterion.java b/src/main/java/net/montoyo/wd/core/Criterion.java index 475aba6..3482c95 100644 --- a/src/main/java/net/montoyo/wd/core/Criterion.java +++ b/src/main/java/net/montoyo/wd/core/Criterion.java @@ -20,9 +20,7 @@ import java.util.Arrays; import java.util.HashMap; public class Criterion implements CriterionTrigger { - public static class Instance extends AbstractCriterionTriggerInstance { - public Instance(ResourceLocation id, ContextAwarePredicate arg2) { super(id, arg2); } @@ -67,10 +65,9 @@ public class Criterion implements CriterionTrigger { public void trigger(PlayerAdvancements ply) { ArrayList> listeners = map.get(ply); - if(listeners != null) { + if (listeners != null) { Listener[] copy = listeners.toArray(new Listener[0]); //We need to make a copy, otherwise we get a ConcurrentModificationException Arrays.stream(copy).forEach(l -> l.run(ply)); } } - } diff --git a/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java b/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java index 89b9f5c..4987c3d 100644 --- a/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java +++ b/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java @@ -12,19 +12,18 @@ import net.montoyo.wd.entity.TileEntityKeyboard; import net.montoyo.wd.entity.TileEntityRCtrl; import net.montoyo.wd.entity.TileEntityRedCtrl; import net.montoyo.wd.entity.TileEntityServer; -import net.montoyo.wd.init.BlockInit; +import net.montoyo.wd.registry.BlockRegistry; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public enum DefaultPeripheral implements StringRepresentable { - - KEYBOARD("keyboard", "Keyboard", TileEntityKeyboard::new, BlockInit.blockKeyBoard), //WITH FACING (< 3) + KEYBOARD("keyboard", "Keyboard", TileEntityKeyboard::new, BlockRegistry.KEYBOARD_BLOCK), //WITH FACING (< 3) // CC_INTERFACE("ccinterface", "ComputerCraft_Interface", TileEntityCCInterface.class), // OC_INTERFACE("cointerface", "OpenComputers_Interface", TileEntityOCInterface.class), - REMOTE_CONTROLLER("remotectrl", "Remote_Controller", TileEntityRCtrl::new ,BlockInit.blockRControl), //WITHOUT FACING (>= 3) - REDSTONE_CONTROLLER("redstonectrl", "Redstone_Controller", TileEntityRedCtrl::new ,BlockInit.blockRedControl), - SERVER("server", "Server", TileEntityServer::new, BlockInit.blockServer); + REMOTE_CONTROLLER("remotectrl", "Remote_Controller", TileEntityRCtrl::new , BlockRegistry.REMOTE_CONTROLLER_BLOCK), //WITHOUT FACING (>= 3) + REDSTONE_CONTROLLER("redstonectrl", "Redstone_Controller", TileEntityRedCtrl::new , BlockRegistry.REDSTONE_CONTROL_BLOCK), + SERVER("server", "Server", TileEntityServer::new, BlockRegistry.SERVER_BLOCK); private final String name; private final String wikiName; diff --git a/src/main/java/net/montoyo/wd/core/HasAdvancement.java b/src/main/java/net/montoyo/wd/core/HasAdvancement.java index 1e458e2..9aa7f7d 100644 --- a/src/main/java/net/montoyo/wd/core/HasAdvancement.java +++ b/src/main/java/net/montoyo/wd/core/HasAdvancement.java @@ -5,9 +5,7 @@ package net.montoyo.wd.core; public enum HasAdvancement { - DONT_KNOW, YES, NO - } diff --git a/src/main/java/net/montoyo/wd/core/IComputerArgs.java b/src/main/java/net/montoyo/wd/core/IComputerArgs.java index 366e549..a4248d4 100644 --- a/src/main/java/net/montoyo/wd/core/IComputerArgs.java +++ b/src/main/java/net/montoyo/wd/core/IComputerArgs.java @@ -7,10 +7,8 @@ package net.montoyo.wd.core; import java.util.Map; public interface IComputerArgs { - String checkString(int i); int checkInteger(int i); Map checkTable(int i); int count(); - } diff --git a/src/main/java/net/montoyo/wd/core/IPeripheral.java b/src/main/java/net/montoyo/wd/core/IPeripheral.java index f412d50..d7fe96b 100644 --- a/src/main/java/net/montoyo/wd/core/IPeripheral.java +++ b/src/main/java/net/montoyo/wd/core/IPeripheral.java @@ -11,7 +11,5 @@ import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Vector3i; public interface IPeripheral { - boolean connect(Level world, BlockPos blockPos, BlockState blockState, Vector3i screenPos, BlockSide screenSide); - } diff --git a/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java b/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java index f9b5617..97c1171 100644 --- a/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java +++ b/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java @@ -11,9 +11,7 @@ //import javax.annotation.Nonnull; // //public interface IScreenQueryHandler { -// // //args is an array of Doubles or Strings // //The screen DOES exist, so scr.getScreen(side) is never null // void handleQuery(@Nonnull IJSQueryCallback cb, @Nonnull TileEntityScreen scr, @Nonnull BlockSide side, @Nonnull Object[] args); -// //} diff --git a/src/main/java/net/montoyo/wd/core/IUpgrade.java b/src/main/java/net/montoyo/wd/core/IUpgrade.java index f2b8523..26810da 100644 --- a/src/main/java/net/montoyo/wd/core/IUpgrade.java +++ b/src/main/java/net/montoyo/wd/core/IUpgrade.java @@ -13,10 +13,8 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; public interface IUpgrade { - void onInstall(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); boolean onRemove(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); //Return true to prevent dropping boolean isSameUpgrade(@Nonnull ItemStack myStack, @Nonnull ItemStack otherStack); //myStack.getItem() is an instance of this class String getJSName(@Nonnull ItemStack is); //modname:upgradename - } diff --git a/src/main/java/net/montoyo/wd/core/IWDDCapability.java b/src/main/java/net/montoyo/wd/core/IWDDCapability.java index de2a75e..1cc5750 100644 --- a/src/main/java/net/montoyo/wd/core/IWDDCapability.java +++ b/src/main/java/net/montoyo/wd/core/IWDDCapability.java @@ -5,9 +5,7 @@ package net.montoyo.wd.core; public interface IWDDCapability { - boolean isFirstRun(); void clearFirstRun(); void cloneTo(IWDDCapability dst); - } diff --git a/src/main/java/net/montoyo/wd/core/JSServerRequest.java b/src/main/java/net/montoyo/wd/core/JSServerRequest.java index e017be3..5a67701 100644 --- a/src/main/java/net/montoyo/wd/core/JSServerRequest.java +++ b/src/main/java/net/montoyo/wd/core/JSServerRequest.java @@ -8,7 +8,6 @@ import net.minecraft.network.FriendlyByteBuf; import net.montoyo.wd.utilities.Util; public enum JSServerRequest { - CLEAR_REDSTONE, SET_REDSTONE_AT(Integer.class, Integer.class, Boolean.class); @@ -50,5 +49,4 @@ public enum JSServerRequest { return ret; } - } diff --git a/src/main/java/net/montoyo/wd/core/MissingPermissionException.java b/src/main/java/net/montoyo/wd/core/MissingPermissionException.java index be08eb5..48a9932 100644 --- a/src/main/java/net/montoyo/wd/core/MissingPermissionException.java +++ b/src/main/java/net/montoyo/wd/core/MissingPermissionException.java @@ -7,7 +7,6 @@ package net.montoyo.wd.core; import net.minecraft.server.level.ServerPlayer; public class MissingPermissionException extends Exception { - private final int permission; private final ServerPlayer player; @@ -24,5 +23,4 @@ public class MissingPermissionException extends Exception { public ServerPlayer getPlayer() { return player; } - } diff --git a/src/main/java/net/montoyo/wd/core/OCArguments.java b/src/main/java/net/montoyo/wd/core/OCArguments.java index b14370c..954cc15 100644 --- a/src/main/java/net/montoyo/wd/core/OCArguments.java +++ b/src/main/java/net/montoyo/wd/core/OCArguments.java @@ -10,7 +10,6 @@ import java.util.Optional; @Optional.Interface(iface = "net.montoyo.wd.core.IComputerArgs", modid = "opencomputers") public class OCArguments implements IComputerArgs { - //Keep this as an "Object" so that it doesn't crash if OC is absent private final Object args; @@ -41,5 +40,4 @@ public class OCArguments implements IComputerArgs { public int count() { return ((Arguments) args).count(); } - } */ diff --git a/src/main/java/net/montoyo/wd/core/ScreenRights.java b/src/main/java/net/montoyo/wd/core/ScreenRights.java index 41f7759..e67e67d 100644 --- a/src/main/java/net/montoyo/wd/core/ScreenRights.java +++ b/src/main/java/net/montoyo/wd/core/ScreenRights.java @@ -5,9 +5,10 @@ package net.montoyo.wd.core; public abstract class ScreenRights { - public static final int CHANGE_URL = 1; //Change URL AND run JavaScript - /** use {@link ScreenRights#INTERACT instead} */ + /** + * use {@link ScreenRights#INTERACT instead} + */ @Deprecated(forRemoval = true) public static final int CLICK = 2; //Click AND type public static final int INTERACT = 2; //Click AND type @@ -21,5 +22,4 @@ public abstract class ScreenRights { public static final int NONE = 0; public static final int ALL = 0xFF; public static final int DEFAULTS = CHANGE_URL | INTERACT | MANAGE_UPGRADES | MODIFY_SCREEN; - } diff --git a/src/main/java/net/montoyo/wd/core/WDDCapability.java b/src/main/java/net/montoyo/wd/core/WDDCapability.java index f049827..9f7faef 100644 --- a/src/main/java/net/montoyo/wd/core/WDDCapability.java +++ b/src/main/java/net/montoyo/wd/core/WDDCapability.java @@ -18,14 +18,11 @@ import javax.annotation.Nonnull; import java.util.concurrent.Callable; public class WDDCapability implements IWDDCapability { - public static class Factory implements Callable { - @Override public IWDDCapability call() { return new WDDCapability(); } - } public static class Provider implements ICapabilitySerializable { @@ -38,7 +35,7 @@ public class WDDCapability implements IWDDCapability { @NotNull @Override public LazyOptional getCapability(@NotNull Capability capability, @org.jetbrains.annotations.Nullable Direction arg) { - return cap == capability ? INSTANCE.cast() : LazyOptional.empty(); + return cap == capability ? INSTANCE.cast() : LazyOptional.empty(); } @Override @@ -78,8 +75,7 @@ public class WDDCapability implements IWDDCapability { @Override public void cloneTo(IWDDCapability dst) { - if(!isFirstRun()) + if (!isFirstRun()) dst.clearFirstRun(); } - } diff --git a/src/main/java/net/montoyo/wd/data/GuiData.java b/src/main/java/net/montoyo/wd/data/GuiData.java index 57d0473..8d5828a 100644 --- a/src/main/java/net/montoyo/wd/data/GuiData.java +++ b/src/main/java/net/montoyo/wd/data/GuiData.java @@ -18,53 +18,54 @@ import java.util.HashMap; import java.util.function.Supplier; public abstract class GuiData { - public static GuiData read(String name, FriendlyByteBuf buf) { - GuiType type = dataTable.get(name); - GuiData data = type.create(); - data.deserialize(buf); - return data; - } - - protected static class GuiType { - Class clazz; - Supplier constructor; - - public GuiType(Class clazz, Supplier constructor) { - this.clazz = clazz; - this.constructor = constructor; - } - - public GuiData create() { - return constructor.get(); - } - } - - private static final HashMap dataTable = new HashMap<>(); - - static { - dataTable.put("SetURL", new GuiType(SetURLData.class, SetURLData::new)); - dataTable.put("ScreenConfig", new GuiType(ScreenConfigData.class, ScreenConfigData::new)); - dataTable.put("Keyboard", new GuiType(KeyboardData.class, KeyboardData::new)); - dataTable.put("RedstoneCtrl", new GuiType(RedstoneCtrlData.class, RedstoneCtrlData::new)); - dataTable.put("Server", new GuiType(ServerData.class, ServerData::new)); - } - - public static Class classOf(String name) { - return dataTable.get(name).clazz; - } - - public GuiData() { - } + public static GuiData read(String name, FriendlyByteBuf buf) { + GuiType type = dataTable.get(name); + GuiData data = type.create(); + data.deserialize(buf); + return data; + } - @OnlyIn(Dist.CLIENT) - public abstract Screen createGui(Screen old, Level world); - - public abstract String getName(); - - public void sendTo(ServerPlayer player) { - WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new S2CMessageOpenGui(this)); - } + protected static class GuiType { + Class clazz; + Supplier constructor; + + public GuiType(Class clazz, Supplier constructor) { + this.clazz = clazz; + this.constructor = constructor; + } + + public GuiData create() { + return constructor.get(); + } + } + + private static final HashMap dataTable = new HashMap<>(); + + static { + dataTable.put("SetURL", new GuiType(SetURLData.class, SetURLData::new)); + dataTable.put("ScreenConfig", new GuiType(ScreenConfigData.class, ScreenConfigData::new)); + dataTable.put("Keyboard", new GuiType(KeyboardData.class, KeyboardData::new)); + dataTable.put("RedstoneCtrl", new GuiType(RedstoneCtrlData.class, RedstoneCtrlData::new)); + dataTable.put("Server", new GuiType(ServerData.class, ServerData::new)); + } + + public static Class classOf(String name) { + return dataTable.get(name).clazz; + } + + public GuiData() { + } + + @OnlyIn(Dist.CLIENT) + public abstract Screen createGui(Screen old, Level world); + + public abstract String getName(); + + public void sendTo(ServerPlayer player) { + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new S2CMessageOpenGui(this)); + } public abstract void serialize(FriendlyByteBuf buf); + public abstract void deserialize(FriendlyByteBuf buf); } diff --git a/src/main/java/net/montoyo/wd/data/KeyboardData.java b/src/main/java/net/montoyo/wd/data/KeyboardData.java index 969b136..a12937d 100644 --- a/src/main/java/net/montoyo/wd/data/KeyboardData.java +++ b/src/main/java/net/montoyo/wd/data/KeyboardData.java @@ -18,16 +18,15 @@ import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Vector3i; public class KeyboardData extends GuiData { - public Vector3i pos; public BlockSide side; public int kbX; public int kbY; public int kbZ; - + public KeyboardData() { } - + public KeyboardData(TileEntityScreen tes, BlockSide side, BlockPos kbPos) { pos = new Vector3i(tes.getBlockPos()); this.side = side; @@ -40,7 +39,7 @@ public class KeyboardData extends GuiData { @Override public Screen createGui(Screen old, Level world) { BlockEntity te = world.getBlockEntity(pos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof TileEntityScreen)) { Log.error("TileEntity at %s is not a screen; can't open keyboard!", pos.toString()); return null; } @@ -52,7 +51,7 @@ public class KeyboardData extends GuiData { public String getName() { return "Keyboard"; } - + @Override public void serialize(FriendlyByteBuf buf) { buf.writeInt(pos.x); diff --git a/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java b/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java index f9ee152..c8df04e 100644 --- a/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java +++ b/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java @@ -16,16 +16,15 @@ import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.utilities.Vector3i; public class RedstoneCtrlData extends GuiData { - public ResourceLocation dimension; public Vector3i pos; public String risingEdgeURL; public String fallingEdgeURL; - + public RedstoneCtrlData() { super(); } - + public RedstoneCtrlData(ResourceLocation d, BlockPos p, String r, String f) { dimension = d; pos = new Vector3i(p); @@ -43,7 +42,7 @@ public class RedstoneCtrlData extends GuiData { public String getName() { return "RedstoneCtrl"; } - + @Override public void serialize(FriendlyByteBuf buf) { buf.writeUtf(dimension.toString()); @@ -51,7 +50,7 @@ public class RedstoneCtrlData extends GuiData { buf.writeUtf(risingEdgeURL); buf.writeUtf(fallingEdgeURL); } - + @Override public void deserialize(FriendlyByteBuf buf) { dimension = new ResourceLocation(buf.readUtf()); diff --git a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java index 9c25b1a..9d53829 100644 --- a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java +++ b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java @@ -23,85 +23,84 @@ import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.Vector3i; public class ScreenConfigData extends GuiData { - - public boolean onlyUpdate; - public Vector3i pos; - public BlockSide side; - public NameUUIDPair[] friends; - public int friendRights; - public int otherRights; - - public ScreenConfigData() { - } + public boolean onlyUpdate; + public Vector3i pos; + public BlockSide side; + public NameUUIDPair[] friends; + public int friendRights; + public int otherRights; - public ScreenConfigData(Vector3i pos, BlockSide side, TileEntityScreen.Screen scr) { - this.pos = pos; - this.side = side; - friends = scr.friends.toArray(new NameUUIDPair[0]); - friendRights = scr.friendRights; - otherRights = scr.otherRights; - onlyUpdate = false; - } - - @OnlyIn(Dist.CLIENT) - @Override - public Screen createGui(Screen old, Level world) { - if (old != null && old instanceof GuiScreenConfig) { - GuiScreenConfig gsc = (GuiScreenConfig) old; - - if (gsc.isForBlock(pos.toBlock(), side)) { - gsc.updateFriends(friends); - gsc.updateFriendRights(friendRights); - gsc.updateOtherRights(otherRights); - gsc.updateMyRights(); - - return null; - } - } - - if (onlyUpdate) - return null; - - BlockEntity te = world.getBlockEntity(pos.toBlock()); - if (te == null || !(te instanceof TileEntityScreen)) { - Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString()); - return null; - } - - return new GuiScreenConfig(Component.nullToEmpty(""), (TileEntityScreen) te, side, friends, friendRights, otherRights); - } - - @Override - public String getName() { - return "ScreenConfig"; - } - - public ScreenConfigData updateOnly() { - onlyUpdate = true; - return this; - } - - public void sendTo(PacketDistributor.TargetPoint tp) { - WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> tp), new S2CMessageOpenGui(this)); - } - - @Override - public void serialize(FriendlyByteBuf buf) { - buf.writeBoolean(onlyUpdate); - BufferUtils.writeVec3i(buf, pos); - BufferUtils.writeEnum(buf, side, (byte) 1); - BufferUtils.writeArray(buf, friends, (nameUUIDPair) -> nameUUIDPair.writeTo(buf)); - buf.writeInt(friendRights); - buf.writeInt(otherRights); - } - - @Override - public void deserialize(FriendlyByteBuf buf) { - onlyUpdate = buf.readBoolean(); - pos = BufferUtils.readVec3i(buf); - side = (BlockSide) BufferUtils.readEnum(buf, (v) -> BlockSide.values()[v], (byte) 1); - friends = BufferUtils.readArray(buf, new NameUUIDPair[0], () -> new NameUUIDPair(buf)); - friendRights = buf.readInt(); - otherRights = buf.readInt(); - } + public ScreenConfigData() { + } + + public ScreenConfigData(Vector3i pos, BlockSide side, TileEntityScreen.Screen scr) { + this.pos = pos; + this.side = side; + friends = scr.friends.toArray(new NameUUIDPair[0]); + friendRights = scr.friendRights; + otherRights = scr.otherRights; + onlyUpdate = false; + } + + @OnlyIn(Dist.CLIENT) + @Override + public Screen createGui(Screen old, Level world) { + if (old != null && old instanceof GuiScreenConfig) { + GuiScreenConfig gsc = (GuiScreenConfig) old; + + if (gsc.isForBlock(pos.toBlock(), side)) { + gsc.updateFriends(friends); + gsc.updateFriendRights(friendRights); + gsc.updateOtherRights(otherRights); + gsc.updateMyRights(); + + return null; + } + } + + if (onlyUpdate) + return null; + + BlockEntity te = world.getBlockEntity(pos.toBlock()); + if (te == null || !(te instanceof TileEntityScreen)) { + Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString()); + return null; + } + + return new GuiScreenConfig(Component.nullToEmpty(""), (TileEntityScreen) te, side, friends, friendRights, otherRights); + } + + @Override + public String getName() { + return "ScreenConfig"; + } + + public ScreenConfigData updateOnly() { + onlyUpdate = true; + return this; + } + + public void sendTo(PacketDistributor.TargetPoint tp) { + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> tp), new S2CMessageOpenGui(this)); + } + + @Override + public void serialize(FriendlyByteBuf buf) { + buf.writeBoolean(onlyUpdate); + BufferUtils.writeVec3i(buf, pos); + BufferUtils.writeEnum(buf, side, (byte) 1); + BufferUtils.writeArray(buf, friends, (nameUUIDPair) -> nameUUIDPair.writeTo(buf)); + buf.writeInt(friendRights); + buf.writeInt(otherRights); + } + + @Override + public void deserialize(FriendlyByteBuf buf) { + onlyUpdate = buf.readBoolean(); + pos = BufferUtils.readVec3i(buf); + side = (BlockSide) BufferUtils.readEnum(buf, (v) -> BlockSide.values()[v], (byte) 1); + friends = BufferUtils.readArray(buf, new NameUUIDPair[0], () -> new NameUUIDPair(buf)); + friendRights = buf.readInt(); + otherRights = buf.readInt(); + } } diff --git a/src/main/java/net/montoyo/wd/data/ServerData.java b/src/main/java/net/montoyo/wd/data/ServerData.java index d0e37d6..5eedb87 100644 --- a/src/main/java/net/montoyo/wd/data/ServerData.java +++ b/src/main/java/net/montoyo/wd/data/ServerData.java @@ -16,13 +16,12 @@ import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.Vector3i; public class ServerData extends GuiData { - public Vector3i pos; public NameUUIDPair owner; - + public ServerData() { } - + public ServerData(BlockPos bp, NameUUIDPair owner) { pos = new Vector3i(bp); this.owner = owner; @@ -38,13 +37,13 @@ public class ServerData extends GuiData { public String getName() { return "Server"; } - + @Override public void serialize(FriendlyByteBuf buf) { BufferUtils.writeVec3i(buf, pos); owner.writeTo(buf); } - + @Override public void deserialize(FriendlyByteBuf buf) { pos = BufferUtils.readVec3i(buf); diff --git a/src/main/java/net/montoyo/wd/data/SetURLData.java b/src/main/java/net/montoyo/wd/data/SetURLData.java index f1b8e5f..6fc81fe 100644 --- a/src/main/java/net/montoyo/wd/data/SetURLData.java +++ b/src/main/java/net/montoyo/wd/data/SetURLData.java @@ -19,16 +19,15 @@ import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Vector3i; public class SetURLData extends GuiData { - public Vector3i pos; public BlockSide side; public String url; public boolean isRemote; public Vector3i remoteLocation; - + public SetURLData() { } - + public SetURLData(Vector3i pos, BlockSide side, String url) { this.pos = pos; this.side = side; @@ -50,7 +49,7 @@ public class SetURLData extends GuiData { @Override public Screen createGui(Screen old, Level world) { BlockEntity te = world.getBlockEntity(pos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof TileEntityScreen)) { Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString()); return null; } @@ -62,7 +61,7 @@ public class SetURLData extends GuiData { public String getName() { return "SetURL"; } - + @Override public void serialize(FriendlyByteBuf buf) { BufferUtils.writeVec3i(buf, pos); @@ -71,7 +70,7 @@ public class SetURLData extends GuiData { buf.writeBoolean(isRemote); if (isRemote) BufferUtils.writeVec3i(buf, remoteLocation); } - + @Override public void deserialize(FriendlyByteBuf buf) { pos = BufferUtils.readVec3i(buf); diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java b/src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java index 3153c53..0af19c8 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java @@ -20,7 +20,6 @@ import java.util.ArrayList; @Optional.Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "computercraft") public class TileEntityCCInterface extends TileEntityInterfaceBase implements IPeripheral { - private static final String[] METHOD_NAMES; private static final Method[] METHODS; @@ -79,5 +78,4 @@ public class TileEntityCCInterface extends TileEntityInterfaceBase implements IP public boolean equals(@Nullable IPeripheral periph) { return periph == this; } - }*/ diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java b/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java index 6ce26ea..e9ecf14 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java @@ -24,7 +24,6 @@ import java.util.ArrayList; import java.util.Map; public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { - public TileEntityInterfaceBase(BlockEntityType arg, BlockPos arg2, BlockState arg3) { super(arg, arg2, arg3); } @@ -406,5 +405,4 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { return null; } - } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java b/src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java index bfb59fb..00c114c 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java @@ -15,15 +15,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.KeyboardData; -import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.utilities.Util; public class TileEntityKeyboard extends TileEntityPeripheralBase { - private static final String RANDOM_CHARS = "AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789"; //Yes I have an AZERTY keyboard, u care? public TileEntityKeyboard(BlockPos arg2, BlockState arg3) { - super(TileInit.KEYBOARD.get(), arg2, arg3); + super(TileRegistry.KEYBOARD.get(), arg2, arg3); } @Override @@ -72,10 +71,9 @@ public class TileEntityKeyboard extends TileEntityPeripheralBase { tes.type(screenSide, "t" + rnd, getBlockPos()); Player owner = level.getPlayerByUUID(scr.owner.uuid); - if(owner != null && owner instanceof ServerPlayer && ent instanceof Ocelot) + if(owner instanceof ServerPlayer && ent instanceof Ocelot) WebDisplays.INSTANCE.criterionKeyboardCat.trigger(((ServerPlayer) owner).getAdvancements()); } } } - } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java b/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java index 1c54927..ef7c5bf 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java @@ -25,20 +25,19 @@ import javax.annotation.Nullable; import java.util.Objects; public abstract class TileEntityPeripheralBase extends BlockEntity implements IPeripheral { - protected Vector3i screenPos; protected BlockSide screenSide; public TileEntityPeripheralBase(BlockEntityType arg, BlockPos arg2, BlockState arg3) { super(arg, arg2, arg3); } - + // TODO @Override public void load(CompoundTag tag) { super.load(tag); - - if(tag.contains("WDScreen", 10)) { + + if (tag.contains("WDScreen", 10)) { CompoundTag scr = tag.getCompound("WDScreen"); screenPos = new Vector3i(scr.getInt("X"), scr.getInt("Y"), scr.getInt("Z")); screenSide = BlockSide.values()[scr.getByte("Side")]; @@ -47,28 +46,28 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP screenSide = null; } } - + @Override protected void saveAdditional(CompoundTag tag) { super.saveAdditional(tag); - - if(screenPos != null && screenSide != null) { + + if (screenPos != null && screenSide != null) { CompoundTag scr = new CompoundTag(); scr.putInt("X", screenPos.x); scr.putInt("Y", screenPos.y); scr.putInt("Z", screenPos.z); scr.putByte("Side", (byte) screenSide.ordinal()); - + tag.put("WDScreen", scr); } } - + // this is not used for loading from disk, so I'm marking it final @Override public final void deserializeNBT(CompoundTag tag) { super.deserializeNBT(tag); } - + // this is not used for writing to disk, so I'm marking it final @Override @Nonnull @@ -79,12 +78,12 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP @Override public boolean connect(Level world_, BlockPos blockPos, BlockState blockState, Vector3i pos, BlockSide side) { BlockEntity te = world_.getBlockEntity(pos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen)) { + if (!(te instanceof TileEntityScreen)) { Log.error("TileEntityPeripheralBase.connect(): Tile entity at %s is not a screen!", pos.toString()); return false; } - if(((TileEntityScreen) te).getScreen(side) == null) { + if (((TileEntityScreen) te).getScreen(side) == null) { Log.error("TileEntityPeripheralBase.connect(): There is no screen at %s on side %s!", pos.toString(), side.toString()); return false; } @@ -109,11 +108,11 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP @Nullable public TileEntityScreen getConnectedScreen() { - if(screenPos == null || screenSide == null) + if (screenPos == null || screenSide == null) return null; BlockEntity te = level.getBlockEntity(screenPos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null) { + if (!(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null) { screenPos = null; screenSide = null; setChanged(); @@ -125,11 +124,11 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP @Nullable public TileEntityScreen getConnectedScreenEx() { - if(screenPos == null || screenSide == null) + if (screenPos == null || screenSide == null) return null; BlockEntity te = level.getBlockEntity(screenPos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null) + if (!(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null) return null; return (TileEntityScreen) te; diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java b/src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java index e1dba6c..414c80c 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java @@ -12,32 +12,32 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.SetURLData; -import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.utilities.Util; public class TileEntityRCtrl extends TileEntityPeripheralBase { public TileEntityRCtrl(BlockPos arg2, BlockState arg3) { - super(TileInit.REMOTE_CONTROLLER.get(), arg2, arg3); + super(TileRegistry.REMOTE_CONTROLLER.get(), arg2, arg3); } @Override public InteractionResult onRightClick(Player player, InteractionHand hand) { - if(level.isClientSide) + if (level.isClientSide) return InteractionResult.SUCCESS; - if(!isScreenChunkLoaded()) { + if (!isScreenChunkLoaded()) { Util.toast(player, "chunkUnloaded"); return InteractionResult.SUCCESS; } TileEntityScreen tes = getConnectedScreen(); - if(tes == null) { + if (tes == null) { Util.toast(player, "notLinked"); return InteractionResult.SUCCESS; } TileEntityScreen.Screen scr = tes.getScreen(screenSide); - if((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) { + if ((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) { Util.toast(player, "restrictions"); return InteractionResult.SUCCESS; } @@ -45,5 +45,4 @@ public class TileEntityRCtrl extends TileEntityPeripheralBase { (new SetURLData(screenPos, screenSide, scr.url, getBlockPos())).sendTo((ServerPlayer) player); return InteractionResult.SUCCESS; } - } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java b/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java index e15498f..c68e454 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java @@ -14,30 +14,29 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.RedstoneCtrlData; -import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.utilities.Util; import java.io.IOException; public class TileEntityRedCtrl extends TileEntityPeripheralBase { - private String risingEdgeURL = ""; private String fallingEdgeURL = ""; private boolean state = false; public TileEntityRedCtrl(BlockPos arg2, BlockState arg3) { - super(TileInit.REDSTONE_CONTROLLER.get(), arg2, arg3); + super(TileRegistry.REDSTONE_CONTROLLER.get(), arg2, arg3); } - + @Override public void load(CompoundTag tag) { super.load(tag); - + risingEdgeURL = tag.getString("RisingEdgeURL"); fallingEdgeURL = tag.getString("FallingEdgeURL"); state = tag.getBoolean("Powered"); } - + @Override protected void saveAdditional(CompoundTag tag) { super.saveAdditional(tag); @@ -45,25 +44,25 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase { tag.putString("FallingEdgeURL", fallingEdgeURL); tag.putBoolean("Powered", state); } - + @Override public InteractionResult onRightClick(Player player, InteractionHand hand) { - if(level.isClientSide) + if (level.isClientSide) return InteractionResult.SUCCESS; - if(!isScreenChunkLoaded()) { + if (!isScreenChunkLoaded()) { Util.toast(player, "chunkUnloaded"); return InteractionResult.SUCCESS; } TileEntityScreen tes = getConnectedScreen(); - if(tes == null) { + if (tes == null) { Util.toast(player, "notLinked"); return InteractionResult.SUCCESS; } TileEntityScreen.Screen scr = tes.getScreen(screenSide); - if((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) { + if ((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) { Util.toast(player, "restrictions"); return InteractionResult.SUCCESS; } @@ -76,10 +75,10 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase { public void onNeighborChange(Block neighborType, BlockPos neighborPos) { boolean hasPower = (level.hasNeighborSignal(getBlockPos()) || level.hasNeighborSignal(getBlockPos().above())); //Same as dispenser - if(hasPower != state) { + if (hasPower != state) { state = hasPower; - if(state) //Rising edge + if (state) //Rising edge changeURL(risingEdgeURL); else //Falling edge changeURL(fallingEdgeURL); @@ -93,10 +92,10 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase { } private void changeURL(String url) { - if(level.isClientSide || url.isEmpty()) + if (level.isClientSide || url.isEmpty()) return; - if(isScreenChunkLoaded()) { + if (isScreenChunkLoaded()) { TileEntityScreen tes = getConnectedScreen(); if (tes != null) diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 2d2ced6..65cbfa4 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -31,27 +31,22 @@ import net.montoyo.wd.config.CommonConfig; import net.montoyo.wd.controls.builtin.ClickControl; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IUpgrade; -import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.ScreenConfigData; -import net.montoyo.wd.init.BlockInit; -import net.montoyo.wd.init.ItemInit; -import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.registry.BlockRegistry; +import net.montoyo.wd.registry.ItemRegistry; +import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.miniserv.SyncPlugin; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageAddScreen; -import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; -import net.montoyo.wd.net.client_bound.S2CMessageJSResponse; import net.montoyo.wd.net.client_bound.S2CMessageScreenUpdate; import net.montoyo.wd.utilities.*; import org.cef.browser.CefBrowser; -import org.lwjgl.opengl.GL11; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.function.Consumer; @@ -59,9 +54,8 @@ import java.util.function.Consumer; import static net.montoyo.wd.block.BlockPeripheral.point; public class TileEntityScreen extends BlockEntity { - public TileEntityScreen(BlockPos arg2, BlockState arg3) { - super(TileInit.SCREEN_BLOCK_ENTITY.get(), arg2, arg3); + super(TileRegistry.SCREEN_BLOCK_ENTITY.get(), arg2, arg3); } public static class Screen { @@ -277,6 +271,7 @@ public class TileEntityScreen extends BlockEntity { scr.browser = null; } } + screens.clear(); loaded = false; } @@ -289,6 +284,14 @@ public class TileEntityScreen extends BlockEntity { if (list.isEmpty()) return; + // very important to close these + for (Screen screen : screens) { + if (screen.browser != null) { + screen.browser.close(true); + screen.browser = null; + } + } + screens.clear(); for (int i = 0; i < list.size(); i++) screens.add(Screen.deserialize(list.getCompound(i))); @@ -403,17 +406,18 @@ public class TileEntityScreen extends BlockEntity { } public void clear() { + // very important that these get closed + for (Screen screen : screens) + if (screen.browser != null) { + screen.browser.close(true); + screen.browser = null; + } screens.clear(); if (!level.isClientSide) setChanged(); } - public void requestData(ServerPlayer ep) { - if (!level.isClientSide) - WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ep), new S2CMessageAddScreen(this)); - } - public static String url(String url) throws IOException { System.out.println("URL received: " + url); if (!(WebDisplays.PROXY instanceof ClientProxy)) { @@ -450,6 +454,7 @@ public class TileEntityScreen extends BlockEntity { } } + // TODO: is there a reason this is unused? public void removeScreen(BlockSide side) { int idx = -1; for (int i = 0; i < screens.size(); i++) { @@ -476,7 +481,7 @@ public class TileEntityScreen extends BlockEntity { if (!level.isClientSide) { if (screens.isEmpty()) //No more screens: remove tile entity - level.setBlockAndUpdate(getBlockPos(), BlockInit.blockScreen.get().defaultBlockState().setValue(BlockScreen.hasTE, false)); + level.setBlockAndUpdate(getBlockPos(), BlockRegistry.SCREEN_BLOCk.get().defaultBlockState().setValue(BlockScreen.hasTE, false)); else setChanged(); } @@ -512,7 +517,7 @@ public class TileEntityScreen extends BlockEntity { private static Player getLaserUser(Screen scr) { if (scr.laserUser != null) { - if (scr.laserUser.isRemoved() || !scr.laserUser.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemInit.LASER_POINTER.get())) + if (scr.laserUser.isRemoved() || !scr.laserUser.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemRegistry.LASER_POINTER.get())) scr.laserUser = null; } @@ -544,13 +549,6 @@ public class TileEntityScreen extends BlockEntity { WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, ClickControl.ControlType.CLICK, vec)); } - void clickUnsafe(BlockSide side, ClickControl.ControlType action, int x, int y) { - if (level.isClientSide) { - Vector2i vec = (action == ClickControl.ControlType.UP) ? null : new Vector2i(x, y); - WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, action, vec)); - } - } - public void handleMouseEvent(BlockSide side, ClickControl.ControlType event, @Nullable Vector2i vec, int button) { if (button > 1) return; // buttons above 1 crash the game @@ -791,6 +789,7 @@ public class TileEntityScreen extends BlockEntity { public void updateClientSideURL(CefBrowser target, String url) { for (Screen scr : screens) { if (scr.browser == target) { + // TODO: what? lol String webUrl; try { webUrl = TileEntityScreen.url(url); @@ -1255,5 +1254,4 @@ public class TileEntityScreen extends BlockEntity { // // return oldState.getValue(BlockScreen.hasTE) != newState.getValue(BlockScreen.hasTE); // } - } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityServer.java b/src/main/java/net/montoyo/wd/entity/TileEntityServer.java index b33115c..c5db695 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityServer.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityServer.java @@ -12,16 +12,15 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.data.ServerData; -import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.Util; public class TileEntityServer extends BlockEntity { - private NameUUIDPair owner; public TileEntityServer(BlockPos arg2, BlockState arg3) { - super(TileInit.SERVER.get(), arg2, arg3); + super(TileRegistry.SERVER.get(), arg2, arg3); } @Override @@ -29,7 +28,7 @@ public class TileEntityServer extends BlockEntity { super.load(tag); owner = Util.readOwnerFromNBT(tag); } - + @Override protected void saveAdditional(CompoundTag tag) { super.saveAdditional(tag); @@ -42,13 +41,12 @@ public class TileEntityServer extends BlockEntity { } public void onPlayerRightClick(Player ply) { - if(level.isClientSide) + if (level.isClientSide) return; - if( WebDisplays.INSTANCE.miniservPort == 0) + if (WebDisplays.INSTANCE.miniservPort == 0) Util.toast(ply, "noMiniserv"); - else if(owner != null && ply instanceof ServerPlayer) + else if (owner != null && ply instanceof ServerPlayer) (new ServerData(getBlockPos(), owner)).sendTo((ServerPlayer) ply); } - } diff --git a/src/main/java/net/montoyo/wd/item/ItemCraftComponent.java b/src/main/java/net/montoyo/wd/item/ItemCraftComponent.java index 367193e..5214932 100644 --- a/src/main/java/net/montoyo/wd/item/ItemCraftComponent.java +++ b/src/main/java/net/montoyo/wd/item/ItemCraftComponent.java @@ -10,7 +10,6 @@ import net.montoyo.wd.core.CraftComponent; import org.jetbrains.annotations.NotNull; public class ItemCraftComponent extends ItemMulti implements WDItem { - public ItemCraftComponent(Properties properties) { super(CraftComponent.class, properties // .tab(WebDisplays.CREATIVE_TAB) diff --git a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java index a77863c..f1b05de 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java +++ b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java @@ -11,14 +11,13 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; -import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.config.ClientConfig; import net.montoyo.wd.controls.builtin.ClickControl; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.init.BlockInit; +import net.montoyo.wd.registry.BlockRegistry; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.BlockSide; @@ -53,7 +52,7 @@ public class ItemLaserPointer extends Item implements WDItem { BlockPos bpos = result.getBlockPos(); - if (result.getType() == HitResult.Type.BLOCK && mc.level.getBlockState(bpos).getBlock() == BlockInit.blockScreen.get()) { + if (result.getType() == HitResult.Type.BLOCK && mc.level.getBlockState(bpos).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) { Vector3i pos = new Vector3i(result.getBlockPos()); BlockSide side = BlockSide.values()[result.getDirection().ordinal()]; diff --git a/src/main/java/net/montoyo/wd/item/ItemLinker.java b/src/main/java/net/montoyo/wd/item/ItemLinker.java index 6b279ca..a933266 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLinker.java +++ b/src/main/java/net/montoyo/wd/item/ItemLinker.java @@ -27,33 +27,32 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; public class ItemLinker extends Item implements WDItem { - public ItemLinker(Properties properties) { super(properties - .stacksTo(1) + .stacksTo(1) // .tab(WebDisplays.CREATIVE_TAB) ); } @Override public InteractionResult useOn(UseOnContext context) { - if(context.getLevel().isClientSide()) + if (context.getLevel().isClientSide()) return InteractionResult.SUCCESS; ItemStack stack = context.getPlayer().getItemInHand(context.getHand()); CompoundTag tag = stack.getTag(); - if(tag != null) { - if(tag.contains("ScreenX") && tag.contains("ScreenY") && tag.contains("ScreenZ") && tag.contains("ScreenSide")) { + if (tag != null) { + if (tag.contains("ScreenX") && tag.contains("ScreenY") && tag.contains("ScreenZ") && tag.contains("ScreenSide")) { BlockState state = context.getLevel().getBlockState(context.getClickedPos()); IPeripheral target; - if(state.getBlock() instanceof IPeripheral) + if (state.getBlock() instanceof IPeripheral) target = (IPeripheral) state.getBlock(); else { BlockEntity te = context.getLevel().getBlockEntity(context.getClickedPos()); - if(te == null || !(te instanceof IPeripheral)) { - if(context.getPlayer().isShiftKeyDown()) { + if (te == null || !(te instanceof IPeripheral)) { + if (context.getPlayer().isShiftKeyDown()) { Util.toast(context.getPlayer(), ChatFormatting.GOLD, "linkAbort"); stack.setTag(null); } else @@ -68,10 +67,10 @@ public class ItemLinker extends Item implements WDItem { Vector3i tePos = new Vector3i(tag.getInt("ScreenX"), tag.getInt("ScreenY"), tag.getInt("ScreenZ")); BlockSide scrSide = BlockSide.values()[tag.getByte("ScreenSide")]; - if(target.connect(context.getLevel(), context.getClickedPos(), state, tePos, scrSide)) { + if (target.connect(context.getLevel(), context.getClickedPos(), state, tePos, scrSide)) { Util.toast(context.getPlayer(), ChatFormatting.AQUA, "linked"); - if(context.getPlayer() instanceof ServerPlayer) + if (context.getPlayer() instanceof ServerPlayer) WebDisplays.INSTANCE.criterionLinkPeripheral.trigger(((ServerPlayer) context.getPlayer()).getAdvancements()); } else Util.toast(context.getPlayer(), "linkError"); @@ -81,7 +80,7 @@ public class ItemLinker extends Item implements WDItem { } } - if(!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) { + if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) { Util.toast(context.getPlayer(), "notAScreen"); return InteractionResult.SUCCESS; } @@ -91,15 +90,15 @@ public class ItemLinker extends Item implements WDItem { Multiblock.findOrigin(context.getLevel(), pos, side, null); BlockEntity te = context.getLevel().getBlockEntity(pos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof TileEntityScreen)) { Util.toast(context.getPlayer(), "turnOn"); return InteractionResult.SUCCESS; } TileEntityScreen.Screen scr = ((TileEntityScreen) te).getScreen(side); - if(scr == null) + if (scr == null) Util.toast(context.getPlayer(), "turnOn"); - else if((scr.rightsFor(context.getPlayer()) & ScreenRights.MANAGE_UPGRADES) == 0) + else if ((scr.rightsFor(context.getPlayer()) & ScreenRights.MANAGE_UPGRADES) == 0) Util.toast(context.getPlayer(), "restrictions"); else { tag = new CompoundTag(); @@ -120,5 +119,4 @@ public class ItemLinker extends Item implements WDItem { public String getWikiName(@Nonnull ItemStack is) { return is.getItem().getName(is).getString(); } - } diff --git a/src/main/java/net/montoyo/wd/item/ItemMinePad2.java b/src/main/java/net/montoyo/wd/item/ItemMinePad2.java index 8bf0caf..354a064 100644 --- a/src/main/java/net/montoyo/wd/item/ItemMinePad2.java +++ b/src/main/java/net/montoyo/wd/item/ItemMinePad2.java @@ -28,90 +28,88 @@ import javax.annotation.Nullable; import java.util.UUID; public class ItemMinePad2 extends Item implements WDItem { - - public ItemMinePad2(Properties properties) { - super(properties - .stacksTo(1) - .defaultDurability(0) + public ItemMinePad2(Properties properties) { + super(properties + .stacksTo(1) + .defaultDurability(0) // .tab(WebDisplays.CREATIVE_TAB) - ); - } - - private static String getURL(ItemStack is) { - if (is.getTag() == null || !is.getTag().contains("PadURL")) - return CommonConfig.Browser.homepage; - else - return is.getTag().getString("PadURL"); - } - - @Override - @Nonnull - public InteractionResultHolder use(Level world, Player ply, @Nonnull InteractionHand hand) { - ItemStack is = ply.getItemInHand(hand); - boolean ok; - - if (ply.isShiftKeyDown()) { - if (world.isClientSide) - WebDisplays.PROXY.displaySetPadURLGui(is, getURL(is)); - - ok = true; - } else if (is.getTag() != null && is.getTag().contains("PadID")) { - if (world.isClientSide) - WebDisplays.PROXY.openMinePadGui(is.getTag().getUUID("PadID")); - - ok = true; - } else { - UUID uuid = UUID.randomUUID(); - String url = getURL(is); - WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageMinepadUrl(uuid, url)); - is.getOrCreateTag().putUUID("PadID", uuid); - - ok = true; - } - - return new InteractionResultHolder<>(ok ? InteractionResult.SUCCESS : InteractionResult.PASS, is); - } - - - @Override - public boolean onEntityItemUpdate(ItemStack stack, ItemEntity ent) { - if (ent.onGround() && !ent.level().isClientSide) { - CompoundTag tag = ent.getItem().getTag(); - - if (tag != null && tag.contains("ThrowHeight")) { - //Delete it, it touched the ground - double height = tag.getDouble("ThrowHeight"); - UUID thrower = null; - - if (tag.contains("ThrowerMSB") && tag.contains("ThrowerLSB")) - thrower = new UUID(tag.getLong("ThrowerMSB"), tag.getLong("ThrowerLSB")); - - if (tag.contains("PadID") || tag.contains("PadURL")) { - tag.remove("ThrowerMSB"); - tag.remove("ThrowerLSB"); - tag.remove("ThrowHeight"); - } else //We can delete the whole tag - ent.getItem().setTag(null); - - if (thrower != null && height - ent.getBlockY() >= 20.0) { - ent.level().playSound(null, ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), SoundEvents.GLASS_BREAK, SoundSource.BLOCKS, 4.0f, 1.0f); - ent.level().addFreshEntity(new ItemEntity(ent.level(), ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), CraftComponent.EXTCARD.makeItemStack())); - ent.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); - - Player ply = ent.level().getPlayerByUUID(thrower); - if (ply != null && ply instanceof ServerPlayer) - WebDisplays.INSTANCE.criterionPadBreak.trigger(((ServerPlayer) ply).getAdvancements()); - } - } - } - - return false; - } - - @Nullable - @Override - public String getWikiName(@Nonnull ItemStack is) { - return is.getItem().getName(is).getString(); - } - + ); + } + + private static String getURL(ItemStack is) { + if (is.getTag() == null || !is.getTag().contains("PadURL")) + return CommonConfig.Browser.homepage; + else + return is.getTag().getString("PadURL"); + } + + @Override + @Nonnull + public InteractionResultHolder use(Level world, Player ply, @Nonnull InteractionHand hand) { + ItemStack is = ply.getItemInHand(hand); + boolean ok; + + if (ply.isShiftKeyDown()) { + if (world.isClientSide) + WebDisplays.PROXY.displaySetPadURLGui(is, getURL(is)); + + ok = true; + } else if (is.getTag() != null && is.getTag().contains("PadID")) { + if (world.isClientSide) + WebDisplays.PROXY.openMinePadGui(is.getTag().getUUID("PadID")); + + ok = true; + } else { + UUID uuid = UUID.randomUUID(); + String url = getURL(is); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageMinepadUrl(uuid, url)); + is.getOrCreateTag().putUUID("PadID", uuid); + + ok = true; + } + + return new InteractionResultHolder<>(ok ? InteractionResult.SUCCESS : InteractionResult.PASS, is); + } + + + @Override + public boolean onEntityItemUpdate(ItemStack stack, ItemEntity ent) { + if (ent.onGround() && !ent.level().isClientSide) { + CompoundTag tag = ent.getItem().getTag(); + + if (tag != null && tag.contains("ThrowHeight")) { + //Delete it, it touched the ground + double height = tag.getDouble("ThrowHeight"); + UUID thrower = null; + + if (tag.contains("ThrowerMSB") && tag.contains("ThrowerLSB")) + thrower = new UUID(tag.getLong("ThrowerMSB"), tag.getLong("ThrowerLSB")); + + if (tag.contains("PadID") || tag.contains("PadURL")) { + tag.remove("ThrowerMSB"); + tag.remove("ThrowerLSB"); + tag.remove("ThrowHeight"); + } else //We can delete the whole tag + ent.getItem().setTag(null); + + if (thrower != null && height - ent.getBlockY() >= 20.0) { + ent.level().playSound(null, ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), SoundEvents.GLASS_BREAK, SoundSource.BLOCKS, 4.0f, 1.0f); + ent.level().addFreshEntity(new ItemEntity(ent.level(), ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), CraftComponent.EXTCARD.makeItemStack())); + ent.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); + + Player ply = ent.level().getPlayerByUUID(thrower); + if (ply != null && ply instanceof ServerPlayer) + WebDisplays.INSTANCE.criterionPadBreak.trigger(((ServerPlayer) ply).getAdvancements()); + } + } + } + + return false; + } + + @Nullable + @Override + public String getWikiName(@Nonnull ItemStack is) { + return is.getItem().getName(is).getString(); + } } diff --git a/src/main/java/net/montoyo/wd/item/ItemMulti.java b/src/main/java/net/montoyo/wd/item/ItemMulti.java index 47731ea..7ab05b9 100644 --- a/src/main/java/net/montoyo/wd/item/ItemMulti.java +++ b/src/main/java/net/montoyo/wd/item/ItemMulti.java @@ -9,7 +9,6 @@ import net.minecraft.world.item.Item; import java.util.BitSet; public class ItemMulti extends Item { - protected final Enum[] values; protected final BitSet creativeTabItems; diff --git a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java index 76887cb..2601751 100644 --- a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java +++ b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java @@ -23,45 +23,44 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; public class ItemOwnershipThief extends Item implements WDItem { - public ItemOwnershipThief(Properties properties) { super(properties - .stacksTo(1) + .stacksTo(1) // .tab(WebDisplays.CREATIVE_TAB) ); } @Override public @NotNull InteractionResult useOn(UseOnContext context) { - if(context.getPlayer().isShiftKeyDown()) + if (context.getPlayer().isShiftKeyDown()) return InteractionResult.PASS; - if(context.getLevel().isClientSide) + if (context.getLevel().isClientSide) return InteractionResult.SUCCESS; - if(CommonConfig.disableOwnershipThief) { + if (CommonConfig.disableOwnershipThief) { Util.toast(context.getPlayer(), "otDisabled"); return InteractionResult.SUCCESS; } ItemStack stack = context.getPlayer().getItemInHand(context.getHand()); - if(stack.hasTag()) { + if (stack.hasTag()) { CompoundTag tag = stack.getTag(); - if(tag.contains("PosX") && tag.contains("PosY") && tag.contains("PosZ") && tag.contains("Side")) { + if (tag.contains("PosX") && tag.contains("PosY") && tag.contains("PosZ") && tag.contains("Side")) { BlockPos bp = new BlockPos(tag.getInt("PosX"), tag.getInt("PosY"), tag.getInt("PosZ")); BlockSide side = BlockSide.values()[tag.getByte("Side")]; - if(!(context.getLevel().getBlockState(bp).getBlock() instanceof BlockScreen)) + if (!(context.getLevel().getBlockState(bp).getBlock() instanceof BlockScreen)) return InteractionResult.SUCCESS; BlockEntity te = context.getLevel().getBlockEntity(bp); - if(te == null || !(te instanceof TileEntityScreen)) + if (te == null || !(te instanceof TileEntityScreen)) return InteractionResult.SUCCESS; TileEntityScreen tes = (TileEntityScreen) te; TileEntityScreen.Screen scr = tes.getScreen(side); - if(scr == null) + if (scr == null) return InteractionResult.SUCCESS; Log.warning("Owner of screen at %d %d %d, side %s was changed from %s (UUID %s) to %s (UUID %s)", bp.getX(), bp.getY(), bp.getZ(), side.toString(), scr.owner.name, scr.owner.uuid.toString(), context.getPlayer().getName(), context.getPlayer().getGameProfile().getId().toString()); @@ -72,7 +71,7 @@ public class ItemOwnershipThief extends Item implements WDItem { } } - if(!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) + if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) return InteractionResult.SUCCESS; Vector3i pos = new Vector3i(context.getClickedPos()); @@ -80,12 +79,12 @@ public class ItemOwnershipThief extends Item implements WDItem { Multiblock.findOrigin(context.getLevel(), pos, side, null); BlockEntity te = context.getLevel().getBlockEntity(pos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof TileEntityScreen)) { Util.toast(context.getPlayer(), "turnOn"); return InteractionResult.SUCCESS; } - if(((TileEntityScreen) te).getScreen(side) == null) + if (((TileEntityScreen) te).getScreen(side) == null) Util.toast(context.getPlayer(), "turnOn"); else { CompoundTag tag = new CompoundTag(); @@ -107,5 +106,4 @@ public class ItemOwnershipThief extends Item implements WDItem { public String getWikiName(@Nonnull ItemStack is) { return "Ownership_Thief"; } - } diff --git a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java index 0cacecd..83e5e4d 100644 --- a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java +++ b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java @@ -21,20 +21,19 @@ import net.montoyo.wd.utilities.Vector3i; import org.jetbrains.annotations.NotNull; public class ItemScreenConfigurator extends Item implements WDItem { - public ItemScreenConfigurator(Properties properties) { super(properties - .stacksTo(1) + .stacksTo(1) // .tab(WebDisplays.CREATIVE_TAB) ); } @Override public InteractionResult useOn(UseOnContext context) { - if(context.getPlayer().isShiftKeyDown() || !(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) + if (context.getPlayer().isShiftKeyDown() || !(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) return InteractionResult.PASS; - if(context.getLevel().isClientSide) + if (context.getLevel().isClientSide) return InteractionResult.SUCCESS; Vector3i origin = new Vector3i(context.getClickedPos()); @@ -43,13 +42,13 @@ public class ItemScreenConfigurator extends Item implements WDItem { Multiblock.findOrigin(context.getLevel(), origin, side, null); BlockEntity te = context.getLevel().getBlockEntity(origin.toBlock()); - if(te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof TileEntityScreen)) { Util.toast(context.getPlayer(), "turnOn"); return InteractionResult.SUCCESS; } TileEntityScreen.Screen scr = ((TileEntityScreen) te).getScreen(side); - if(scr == null) + if (scr == null) Util.toast(context.getPlayer(), "turnOn"); else (new ScreenConfigData(origin, side, scr)).sendTo((ServerPlayer) context.getPlayer()); diff --git a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java index 6212636..d4721f9 100644 --- a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java +++ b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java @@ -19,7 +19,7 @@ import javax.annotation.Nullable; public class ItemUpgrade extends ItemMulti implements IUpgrade, WDItem { public final DefaultUpgrade type; - + public ItemUpgrade(DefaultUpgrade type) { super(DefaultUpgrade.class, new Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/); this.type = type; @@ -31,7 +31,7 @@ public class ItemUpgrade extends ItemMulti implements IUpgrade, WDItem { @Override public boolean onRemove(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) { - if(DefaultUpgrade.LASERMOUSE.matchesLaserMouse(is)) + if (DefaultUpgrade.LASERMOUSE.matchesLaserMouse(is)) tes.clearLaserUser(screenSide); return false; diff --git a/src/main/java/net/montoyo/wd/item/WDItem.java b/src/main/java/net/montoyo/wd/item/WDItem.java index d514fa2..1c832c2 100644 --- a/src/main/java/net/montoyo/wd/item/WDItem.java +++ b/src/main/java/net/montoyo/wd/item/WDItem.java @@ -14,10 +14,9 @@ import javax.annotation.Nullable; import java.util.List; public interface WDItem { - static void addInformation(@Nullable List tt) { - if(tt != null && WebDisplays.PROXY.isShiftDown()) - tt.add("" + ChatFormatting.GRAY + I18n.get("item.webdisplays.wiki")); + if (tt != null && WebDisplays.PROXY.isShiftDown()) + tt.add(ChatFormatting.GRAY + I18n.get("item.webdisplays.wiki")); } String getWikiName(@Nonnull ItemStack is); diff --git a/src/main/java/net/montoyo/wd/mixins/MouseHandlerMixin.java b/src/main/java/net/montoyo/wd/mixins/MouseHandlerMixin.java index 7138dc6..7fadaf7 100644 --- a/src/main/java/net/montoyo/wd/mixins/MouseHandlerMixin.java +++ b/src/main/java/net/montoyo/wd/mixins/MouseHandlerMixin.java @@ -4,7 +4,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.MouseHandler; import net.minecraft.world.InteractionHand; import net.minecraft.world.phys.HitResult; -import net.montoyo.wd.init.ItemInit; +import net.montoyo.wd.registry.ItemRegistry; import net.montoyo.wd.item.ItemLaserPointer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -15,21 +15,23 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MouseHandler.class) public class MouseHandlerMixin { - @Shadow @Final private Minecraft minecraft; - - @Inject(at = @At("HEAD"), method = "onPress", cancellable = true) - public void prePress(long p_91531_, int p_91532_, int p_91533_, int p_91534_, CallbackInfo ci) { - boolean flag = p_91533_ == 1; - - if (Minecraft.getInstance().screen == null) { - if ( - minecraft.player != null && minecraft.level != null && - minecraft.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemInit.LASER_POINTER.get()) && - (minecraft.hitResult == null || minecraft.hitResult.getType() == HitResult.Type.BLOCK || minecraft.hitResult.getType() == HitResult.Type.MISS) - ) { - ItemLaserPointer.press(flag, p_91532_); - ci.cancel(); - } - } - } + @Shadow + @Final + private Minecraft minecraft; + + @Inject(at = @At("HEAD"), method = "onPress", cancellable = true) + public void prePress(long p_91531_, int p_91532_, int p_91533_, int p_91534_, CallbackInfo ci) { + boolean flag = p_91533_ == 1; + + if (Minecraft.getInstance().screen == null) { + if ( + minecraft.player != null && minecraft.level != null && + minecraft.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemRegistry.LASER_POINTER.get()) && + (minecraft.hitResult == null || minecraft.hitResult.getType() == HitResult.Type.BLOCK || minecraft.hitResult.getType() == HitResult.Type.MISS) + ) { + ItemLaserPointer.press(flag, p_91532_); + ci.cancel(); + } + } + } } diff --git a/src/main/java/net/montoyo/wd/mixins/OverlayMixin.java b/src/main/java/net/montoyo/wd/mixins/OverlayMixin.java index 84cb49e..0b7ae78 100644 --- a/src/main/java/net/montoyo/wd/mixins/OverlayMixin.java +++ b/src/main/java/net/montoyo/wd/mixins/OverlayMixin.java @@ -14,19 +14,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Gui.class) public class OverlayMixin { - @Shadow - @Final - protected Minecraft minecraft; - - @Shadow - protected int screenWidth; - - @Shadow - protected int screenHeight; - - @Inject(at = @At("HEAD"), method = "renderCrosshair", cancellable = true) - public void preDrawCrosshair(GuiGraphics pGuiGraphics, CallbackInfo ci) { + @Shadow + @Final + protected Minecraft minecraft; + + @Shadow + protected int screenWidth; + + @Shadow + protected int screenHeight; + + @Inject(at = @At("HEAD"), method = "renderCrosshair", cancellable = true) + public void preDrawCrosshair(GuiGraphics pGuiGraphics, CallbackInfo ci) { // ClientProxy.renderCrosshair(minecraft.options, screenWidth, screenHeight, ((Gui) (Object) this).getBlitOffset(), poseStack, ci); - ClientProxy.renderCrosshair(minecraft.options, screenWidth, screenHeight, 0, pGuiGraphics, ci); - } + ClientProxy.renderCrosshair(minecraft.options, screenWidth, screenHeight, 0, pGuiGraphics, ci); + } } diff --git a/src/main/java/net/montoyo/wd/init/BlockInit.java b/src/main/java/net/montoyo/wd/registry/BlockRegistry.java similarity index 50% rename from src/main/java/net/montoyo/wd/init/BlockInit.java rename to src/main/java/net/montoyo/wd/registry/BlockRegistry.java index 9ed24f9..64b3251 100644 --- a/src/main/java/net/montoyo/wd/init/BlockInit.java +++ b/src/main/java/net/montoyo/wd/registry/BlockRegistry.java @@ -1,4 +1,4 @@ -package net.montoyo.wd.init; +package net.montoyo.wd.registry; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -13,20 +13,19 @@ import net.montoyo.wd.block.BlockPeripheral; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.core.DefaultPeripheral; -public class BlockInit { - +public class BlockRegistry { public static void init(IEventBus bus) { BLOCKS.register(bus); } public static DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, "webdisplays"); - public static final RegistryObject blockScreen = BLOCKS.register("screen", () -> new BlockScreen(BlockBehaviour.Properties.copy(Blocks.STONE))); + public static final RegistryObject SCREEN_BLOCk = BLOCKS.register("screen", () -> new BlockScreen(BlockBehaviour.Properties.copy(Blocks.STONE))); - public static final RegistryObject blockKeyBoard = BlockInit.BLOCKS.register("kb_left", BlockKeyboardLeft::new); + public static final RegistryObject KEYBOARD_BLOCK = BlockRegistry.BLOCKS.register("kb_left", BlockKeyboardLeft::new); public static final RegistryObject blockKbRight = BLOCKS.register("kb_right", BlockKeyboardRight::new); - public static final RegistryObject blockRedControl = BlockInit.BLOCKS.register("redctrl", () -> new BlockPeripheral(DefaultPeripheral.REDSTONE_CONTROLLER)); - public static final RegistryObject blockRControl = BlockInit.BLOCKS.register("rctrl", () -> new BlockPeripheral(DefaultPeripheral.REMOTE_CONTROLLER)); - public static final RegistryObject blockServer = BlockInit.BLOCKS.register("server", () -> new BlockPeripheral(DefaultPeripheral.SERVER)); + public static final RegistryObject REDSTONE_CONTROL_BLOCK = BlockRegistry.BLOCKS.register("redctrl", () -> new BlockPeripheral(DefaultPeripheral.REDSTONE_CONTROLLER)); + public static final RegistryObject REMOTE_CONTROLLER_BLOCK = BlockRegistry.BLOCKS.register("rctrl", () -> new BlockPeripheral(DefaultPeripheral.REMOTE_CONTROLLER)); + public static final RegistryObject SERVER_BLOCK = BlockRegistry.BLOCKS.register("server", () -> new BlockPeripheral(DefaultPeripheral.SERVER)); } diff --git a/src/main/java/net/montoyo/wd/init/ItemInit.java b/src/main/java/net/montoyo/wd/registry/ItemRegistry.java similarity index 80% rename from src/main/java/net/montoyo/wd/init/ItemInit.java rename to src/main/java/net/montoyo/wd/registry/ItemRegistry.java index f4b9a7f..4b2aecc 100644 --- a/src/main/java/net/montoyo/wd/init/ItemInit.java +++ b/src/main/java/net/montoyo/wd/registry/ItemRegistry.java @@ -1,4 +1,4 @@ -package net.montoyo.wd.init; +package net.montoyo.wd.registry; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -6,7 +6,6 @@ import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.item.KeyboardItem; import net.montoyo.wd.core.CraftComponent; import net.montoyo.wd.core.DefaultUpgrade; @@ -15,11 +14,11 @@ import net.montoyo.wd.item.*; import java.util.Locale; @SuppressWarnings({"unchecked", "unused"}) -public class ItemInit{ +public class ItemRegistry { public static void init(IEventBus bus) { ITEMS.register(bus); } - + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, "webdisplays"); protected static final RegistryObject[] COMP_CRAFT_ITEMS = new RegistryObject[CraftComponent.values().length]; @@ -31,13 +30,13 @@ public class ItemInit{ public static final RegistryObject MINEPAD = ITEMS.register("minepad", () -> new ItemMinePad2(new Item.Properties())); public static final RegistryObject LASER_POINTER = ITEMS.register("laserpointer", () -> new ItemLaserPointer(new Item.Properties())); - static { + static { DefaultUpgrade[] defaultUpgrades = DefaultUpgrade.values(); for (int i = 0; i < defaultUpgrades.length; i++) { DefaultUpgrade upgrade = defaultUpgrades[i]; UPGRADE_ITEMS[i] = ITEMS.register("upgrade_" + upgrade.name().toLowerCase(Locale.ROOT), () -> new ItemUpgrade(upgrade)); } - + CraftComponent[] components = CraftComponent.values(); for (int i = 0; i < components.length; i++) { CraftComponent cc = components[i]; @@ -45,29 +44,29 @@ public class ItemInit{ } } - public static final RegistryObject SCREEN = ITEMS.register("screen", () -> new BlockItem(BlockInit.blockScreen.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); + public static final RegistryObject SCREEN = ITEMS.register("screen", () -> new BlockItem(BlockRegistry.SCREEN_BLOCk.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); + + public static final RegistryObject KEYBOARD = ITEMS.register("keyboard", () -> new KeyboardItem(BlockRegistry.KEYBOARD_BLOCK.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); + public static final RegistryObject REDSTONE_CONTROLLER = ITEMS.register("redctrl", () -> new BlockItem(BlockRegistry.REDSTONE_CONTROL_BLOCK.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); + public static final RegistryObject REMOTE_CONTROLLER = ITEMS.register("rctrl", () -> new BlockItem(BlockRegistry.REMOTE_CONTROLLER_BLOCK.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); + public static final RegistryObject SERVER = ITEMS.register("server", () -> new BlockItem(BlockRegistry.SERVER_BLOCK.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); - public static final RegistryObject KEYBOARD = ITEMS.register("keyboard", () -> new KeyboardItem(BlockInit.blockKeyBoard.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); - public static final RegistryObject REDSTONE_CONTROLLER = ITEMS.register("redctrl", () -> new BlockItem(BlockInit.blockRedControl.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); - public static final RegistryObject REMOTE_CONTROLLER = ITEMS.register("rctrl", () -> new BlockItem(BlockInit.blockRControl.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); - public static final RegistryObject SERVER = ITEMS.register("server", () -> new BlockItem(BlockInit.blockServer.get(), new Item.Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/)); - public static RegistryObject getComputerCraftItem(int index) { return COMP_CRAFT_ITEMS[index]; } - + public static RegistryObject getUpgradeItem(int index) { return UPGRADE_ITEMS[index]; } - + public static int countCompCraftItems() { return COMP_CRAFT_ITEMS.length; } - + public static int countUpgrades() { return UPGRADE_ITEMS.length; } - + public static boolean isCompCraftItem(Item item) { for (RegistryObject itemRegistryObject : COMP_CRAFT_ITEMS) if (item == itemRegistryObject.get()) diff --git a/src/main/java/net/montoyo/wd/init/TileInit.java b/src/main/java/net/montoyo/wd/registry/TileRegistry.java similarity index 61% rename from src/main/java/net/montoyo/wd/init/TileInit.java rename to src/main/java/net/montoyo/wd/registry/TileRegistry.java index 167d4ae..84b6b2f 100644 --- a/src/main/java/net/montoyo/wd/init/TileInit.java +++ b/src/main/java/net/montoyo/wd/registry/TileRegistry.java @@ -1,37 +1,32 @@ -package net.montoyo.wd.init; +package net.montoyo.wd.registry; -import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -import net.montoyo.wd.core.DefaultPeripheral; import net.montoyo.wd.entity.*; -import java.util.Locale; - -public class TileInit { - +public class TileRegistry { public static final DeferredRegister> TILE_TYPES = DeferredRegister .create(ForgeRegistries.BLOCK_ENTITY_TYPES, "webdisplays"); //Register tile entities public static final RegistryObject> SCREEN_BLOCK_ENTITY = TILE_TYPES .register("screen", () -> BlockEntityType.Builder - .of(TileEntityScreen::new, BlockInit.blockScreen.get()).build(null)); + .of(TileEntityScreen::new, BlockRegistry.SCREEN_BLOCk.get()).build(null)); public static final RegistryObject> KEYBOARD = TILE_TYPES.register("kb_left", () -> BlockEntityType.Builder - .of(TileEntityKeyboard::new, BlockInit.blockKeyBoard.get()).build(null)); + .of(TileEntityKeyboard::new, BlockRegistry.KEYBOARD_BLOCK.get()).build(null)); - public static final RegistryObject> REMOTE_CONTROLLER = TILE_TYPES.register("rctrl", - () -> BlockEntityType.Builder.of(TileEntityRCtrl::new, BlockInit.blockRControl.get()).build(null)); //WITHOUT FACING (>= 3) + public static final RegistryObject> REMOTE_CONTROLLER = TILE_TYPES.register("rctrl", + () -> BlockEntityType.Builder.of(TileEntityRCtrl::new, BlockRegistry.REMOTE_CONTROLLER_BLOCK.get()).build(null)); //WITHOUT FACING (>= 3) public static final RegistryObject> REDSTONE_CONTROLLER = TILE_TYPES.register("redctrl", - () -> BlockEntityType.Builder.of(TileEntityRedCtrl::new, BlockInit.blockRedControl.get()).build(null)); + () -> BlockEntityType.Builder.of(TileEntityRedCtrl::new, BlockRegistry.REDSTONE_CONTROL_BLOCK.get()).build(null)); - public static final RegistryObject> SERVER = TILE_TYPES.register("server" , - () -> BlockEntityType.Builder.of(TileEntityServer::new, BlockInit.blockServer.get()).build(null)); + public static final RegistryObject> SERVER = TILE_TYPES.register("server", + () -> BlockEntityType.Builder.of(TileEntityServer::new, BlockRegistry.SERVER_BLOCK.get()).build(null)); public static void init(IEventBus bus) { TILE_TYPES.register(bus); diff --git a/src/main/java/net/montoyo/wd/init/TabInit.java b/src/main/java/net/montoyo/wd/registry/WDTabs.java similarity index 55% rename from src/main/java/net/montoyo/wd/init/TabInit.java rename to src/main/java/net/montoyo/wd/registry/WDTabs.java index e8286e7..5b06446 100644 --- a/src/main/java/net/montoyo/wd/init/TabInit.java +++ b/src/main/java/net/montoyo/wd/registry/WDTabs.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.init; +package net.montoyo.wd.registry; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -11,38 +11,37 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; -import net.montoyo.wd.init.ItemInit; -public class TabInit { +public class WDTabs { public static final DeferredRegister TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, "webdisplays"); public static final RegistryObject EXAMPLE_TAB = TABS.register("main", () -> CreativeModeTab.builder() // Set name of tab to display .title(Component.translatable("itemGroup.webdisplays")) // Set icon of creative tab - .icon(() -> new ItemStack(ItemInit.SCREEN.get())) + .icon(() -> new ItemStack(ItemRegistry.SCREEN.get())) // Add default items to tab .displayItems((params, output) -> { // core items - output.accept(ItemInit.SCREEN.get()); - output.accept(ItemInit.KEYBOARD.get()); - output.accept(ItemInit.LINKER.get()); + output.accept(ItemRegistry.SCREEN.get()); + output.accept(ItemRegistry.KEYBOARD.get()); + output.accept(ItemRegistry.LINKER.get()); // remote control - output.accept(ItemInit.REMOTE_CONTROLLER.get()); + output.accept(ItemRegistry.REMOTE_CONTROLLER.get()); // redstone stuff - output.accept(ItemInit.REDSTONE_CONTROLLER.get()); + output.accept(ItemRegistry.REDSTONE_CONTROLLER.get()); // admin tools - output.accept(ItemInit.OWNERSHIP_THEIF.get()); + output.accept(ItemRegistry.OWNERSHIP_THEIF.get()); // tool items - output.accept(ItemInit.SERVER.get()); - output.accept(ItemInit.CONFIGURATOR.get()); - output.accept(ItemInit.MINEPAD.get()); - output.accept(ItemInit.LASER_POINTER.get()); + output.accept(ItemRegistry.SERVER.get()); + output.accept(ItemRegistry.CONFIGURATOR.get()); + output.accept(ItemRegistry.MINEPAD.get()); + output.accept(ItemRegistry.LASER_POINTER.get()); // upgrades - for (int i = 0; i < ItemInit.countUpgrades(); i++) output.accept(ItemInit.getUpgradeItem(i).get()); + for (int i = 0; i < ItemRegistry.countUpgrades(); i++) output.accept(ItemRegistry.getUpgradeItem(i).get()); // cc - for (int i = 0; i < ItemInit.countCompCraftItems(); i++) output.accept(ItemInit.getComputerCraftItem(i).get()); + for (int i = 0; i < ItemRegistry.countCompCraftItems(); i++) output.accept(ItemRegistry.getComputerCraftItem(i).get()); }) .build() ); diff --git a/src/main/java/net/montoyo/wd/utilities/BlockSide.java b/src/main/java/net/montoyo/wd/utilities/BlockSide.java index 90b602b..ce5feb0 100644 --- a/src/main/java/net/montoyo/wd/utilities/BlockSide.java +++ b/src/main/java/net/montoyo/wd/utilities/BlockSide.java @@ -5,20 +5,19 @@ package net.montoyo.wd.utilities; public enum BlockSide { + BOTTOM(new Vector3i(0, 0, -1), new Vector3i(1, 0, 0), new Vector3i(0, -1, 0)), + TOP(new Vector3i(0, 0, -1), new Vector3i(1, 0, 0), new Vector3i(0, 1, 0)), + NORTH(new Vector3i(0, 1, 0), new Vector3i(-1, 0, 0), new Vector3i(0, 0, -1)), + SOUTH(new Vector3i(0, 1, 0), new Vector3i(1, 0, 0), new Vector3i(0, 0, 1)), + WEST(new Vector3i(0, 1, 0), new Vector3i(0, 0, 1), new Vector3i(-1, 0, 0)), + EAST(new Vector3i(0, 1, 0), new Vector3i(0, 0, -1), new Vector3i(1, 0, 0)); - BOTTOM(new Vector3i( 0, 0, -1), new Vector3i( 1, 0, 0), new Vector3i( 0, -1, 0)), - TOP (new Vector3i( 0, 0, -1), new Vector3i( 1, 0, 0), new Vector3i( 0, 1, 0)), - NORTH (new Vector3i( 0, 1, 0), new Vector3i(-1, 0, 0), new Vector3i( 0, 0, -1)), - SOUTH (new Vector3i( 0, 1, 0), new Vector3i( 1, 0, 0), new Vector3i( 0, 0, 1)), - WEST (new Vector3i( 0, 1, 0), new Vector3i( 0, 0, 1), new Vector3i(-1, 0, 0)), - EAST (new Vector3i( 0, 1, 0), new Vector3i( 0, 0, -1), new Vector3i( 1, 0, 0)); + public final Vector3i up, down; + public final Vector3i left, right; + public final Vector3i forward, backward; - public final Vector3i up; - public final Vector3i right; - public final Vector3i forward; - public final Vector3i down; - public final Vector3i left; - public final Vector3i backward; + // mostly used for click coordinate calculations + public final Vector3i horizontal, vertical; BlockSide(Vector3i u, Vector3i r, Vector3i f) { up = u; @@ -27,10 +26,12 @@ public enum BlockSide { down = u.clone().neg(); left = r.clone().neg(); backward = f.clone().neg(); + + horizontal = new Vector3i(Math.abs(r.x), Math.abs(r.y), Math.abs(r.z)); + vertical = new Vector3i(Math.abs(u.x), Math.abs(u.y), Math.abs(u.z)); } - public BlockSide reverse() - { + public BlockSide reverse() { int side = ordinal(); int div = side / 2; int rest = 1 - side % 2; @@ -49,5 +50,4 @@ public enum BlockSide { BlockSide[] values = values(); return (s < 0 || s >= values.length) ? null : values[s]; } - } diff --git a/src/main/java/net/montoyo/wd/utilities/Bounds.java b/src/main/java/net/montoyo/wd/utilities/Bounds.java index f7e3b2d..85de36d 100644 --- a/src/main/java/net/montoyo/wd/utilities/Bounds.java +++ b/src/main/java/net/montoyo/wd/utilities/Bounds.java @@ -5,7 +5,6 @@ package net.montoyo.wd.utilities; public final class Bounds { - public final int minX; public final int minY; public final int maxX; @@ -25,5 +24,4 @@ public final class Bounds { public final int getHeight() { return maxY - minY; } - } diff --git a/src/main/java/net/montoyo/wd/utilities/DistSafety.java b/src/main/java/net/montoyo/wd/utilities/DistSafety.java index 3bd4064..8309a2f 100644 --- a/src/main/java/net/montoyo/wd/utilities/DistSafety.java +++ b/src/main/java/net/montoyo/wd/utilities/DistSafety.java @@ -7,10 +7,10 @@ public class DistSafety { public static ClientProxy createProxy() { return new ClientProxy(); } - - public static boolean isConnected() { - if (Minecraft.getInstance().getConnection() == null) return false; - if (Minecraft.getInstance().getConnection().getConnection().isConnecting()) return false; - return Minecraft.getInstance().getConnection().getConnection().isConnected(); - } + + public static boolean isConnected() { + if (Minecraft.getInstance().getConnection() == null) return false; + if (Minecraft.getInstance().getConnection().getConnection().isConnecting()) return false; + return Minecraft.getInstance().getConnection().getConnection().isConnected(); + } } diff --git a/src/main/java/net/montoyo/wd/utilities/Log.java b/src/main/java/net/montoyo/wd/utilities/Log.java index 82b56d6..fc1003f 100644 --- a/src/main/java/net/montoyo/wd/utilities/Log.java +++ b/src/main/java/net/montoyo/wd/utilities/Log.java @@ -8,29 +8,27 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; public abstract class Log { - - public static void info(String what, Object ... data) { + public static void info(String what, Object... data) { LogManager.getLogger("WebDisplays").log(Level.INFO, String.format(what, data)); } - public static void warning(String what, Object ... data) { + public static void warning(String what, Object... data) { LogManager.getLogger("WebDisplays").log(Level.WARN, String.format(what, data)); } - public static void error(String what, Object ... data) { + public static void error(String what, Object... data) { LogManager.getLogger("WebDisplays").log(Level.ERROR, String.format(what, data)); } - public static void infoEx(String what, Throwable e, Object ... data) { + public static void infoEx(String what, Throwable e, Object... data) { LogManager.getLogger("WebDisplays").log(Level.INFO, String.format(what, data), e); } - public static void warningEx(String what, Throwable e, Object ... data) { + public static void warningEx(String what, Throwable e, Object... data) { LogManager.getLogger("WebDisplays").log(Level.WARN, String.format(what, data), e); } - public static void errorEx(String what, Throwable e, Object ... data) { + public static void errorEx(String what, Throwable e, Object... data) { LogManager.getLogger("WebDisplays").log(Level.ERROR, String.format(what, data), e); } - } diff --git a/src/main/java/net/montoyo/wd/utilities/Multiblock.java b/src/main/java/net/montoyo/wd/utilities/Multiblock.java index 550d8e2..2fa8c94 100644 --- a/src/main/java/net/montoyo/wd/utilities/Multiblock.java +++ b/src/main/java/net/montoyo/wd/utilities/Multiblock.java @@ -6,8 +6,7 @@ package net.montoyo.wd.utilities; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.init.BlockInit; +import net.montoyo.wd.registry.BlockRegistry; public abstract class Multiblock { @@ -51,7 +50,7 @@ public abstract class Multiblock { do { pos.add(side.left); pos.toBlock(bp); - } while(override.apply(pos, world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get())); + } while(override.apply(pos, world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())); pos.add(side.right); @@ -59,7 +58,7 @@ public abstract class Multiblock { do { pos.add(side.down); pos.toBlock(bp); - } while(override.apply(pos, world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get())); + } while(override.apply(pos, world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())); pos.add(side.up); } @@ -78,7 +77,7 @@ public abstract class Multiblock { pos.add(side.up); pos.toBlock(bp); ret.y++; - } while(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()); + } while(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()); pos.add(side.down); @@ -87,7 +86,7 @@ public abstract class Multiblock { pos.add(side.right); pos.toBlock(bp); ret.x++; - } while(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()); + } while(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()); return ret; } @@ -103,17 +102,17 @@ public abstract class Multiblock { for(int y = 0; y < size.y; y++) { for(int x = 0; x < size.x; x++) { pos.toBlock(bp); - if(!(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get())) + if(!(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())) return pos; //Hole pos.add(side.forward); pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()) + if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Back should be empty pos.addMul(side.backward, 2); pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()) + if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Front should be empty pos.add(side.forward); @@ -130,7 +129,7 @@ public abstract class Multiblock { for(int y = 0; y < size.y; y++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()) + if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.up); @@ -142,7 +141,7 @@ public abstract class Multiblock { for(int y = 0; y < size.y; y++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()) + if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.up); @@ -154,7 +153,7 @@ public abstract class Multiblock { for(int x = 0; x < size.x; x++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()) + if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.right); @@ -166,7 +165,7 @@ public abstract class Multiblock { for(int x = 0; x < size.x; x++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockInit.blockScreen.get()) + if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.right); diff --git a/src/main/java/net/montoyo/wd/utilities/MutableAABB.java b/src/main/java/net/montoyo/wd/utilities/MutableAABB.java index b3acb7a..6996726 100644 --- a/src/main/java/net/montoyo/wd/utilities/MutableAABB.java +++ b/src/main/java/net/montoyo/wd/utilities/MutableAABB.java @@ -7,45 +7,45 @@ package net.montoyo.wd.utilities; import net.minecraft.world.phys.AABB; public final class MutableAABB extends AABB { - public MutableAABB() { - super(0, 0, 0, 0, 0, 0); - } - - public MutableAABB(Vector3i pos) { + public MutableAABB() { + super(0, 0, 0, 0, 0, 0); + } + + public MutableAABB(Vector3i pos) { super(pos.x, pos.y, pos.z, pos.x, pos.y, pos.z); - } - - public MutableAABB(Vector3i a, Vector3i b) { - super(a.x, a.y, a.z, b.x, b.y, b.z); - } - - public MutableAABB(net.minecraft.world.phys.AABB bb) { - super(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); - } - - public MutableAABB(double x1, double y1, double z1, double x2, double y2, double z2) { - super(x1, y1, z1, x2, y2, z2); - } - - public MutableAABB expand(Vector3i vec) { - if (vec.x > maxX) + } + + public MutableAABB(Vector3i a, Vector3i b) { + super(a.x, a.y, a.z, b.x, b.y, b.z); + } + + public MutableAABB(net.minecraft.world.phys.AABB bb) { + super(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); + } + + public MutableAABB(double x1, double y1, double z1, double x2, double y2, double z2) { + super(x1, y1, z1, x2, y2, z2); + } + + public MutableAABB expand(Vector3i vec) { + if (vec.x > maxX) maxX = vec.x; - else if (vec.x < minX) + else if (vec.x < minX) minX = vec.x; - - if (vec.y > maxY) + + if (vec.y > maxY) maxY = vec.y; - else if (vec.y < minY) - minY = vec.y; - - if (vec.z > maxZ) + else if (vec.y < minY) + minY = vec.y; + + if (vec.z > maxZ) maxZ = vec.z; - else if (vec.z < minZ) + else if (vec.z < minZ) minZ = vec.z; - - return this; - } - + + return this; + } + @Override public AABB move(double x, double y, double z) { minX += x; @@ -56,28 +56,28 @@ public final class MutableAABB extends AABB { maxZ += z; return this; } - - public net.minecraft.world.phys.AABB toMc() { - return new AABB(minX, minY, minZ, maxX, maxY, maxZ); - } - - public void setAndCheck(double x1, double y1, double z1, double x2, double y2, double z2) { - minX = Math.min(x1, x2); - minY = Math.min(y1, y2); - minZ = Math.min(z1, z2); - - maxX = Math.max(x1, x2); - maxY = Math.max(y1, y2); - maxZ = Math.max(z1, z2); - } - - public void expand(double x1, double y1, double z1, double x2, double y2, double z2) { - minX = Math.min(minX, Math.min(x1, x2)); - minY = Math.min(minY, Math.min(y1, y2)); - minZ = Math.min(minZ, Math.min(z1, z2)); - - maxX = Math.max(maxX, Math.max(x1, x2)); - maxY = Math.max(maxY, Math.max(y1, y2)); - maxZ = Math.max(maxZ, Math.max(z1, z2)); - } + + public net.minecraft.world.phys.AABB toMc() { + return new AABB(minX, minY, minZ, maxX, maxY, maxZ); + } + + public void setAndCheck(double x1, double y1, double z1, double x2, double y2, double z2) { + minX = Math.min(x1, x2); + minY = Math.min(y1, y2); + minZ = Math.min(z1, z2); + + maxX = Math.max(x1, x2); + maxY = Math.max(y1, y2); + maxZ = Math.max(z1, z2); + } + + public void expand(double x1, double y1, double z1, double x2, double y2, double z2) { + minX = Math.min(minX, Math.min(x1, x2)); + minY = Math.min(minY, Math.min(y1, y2)); + minZ = Math.min(minZ, Math.min(z1, z2)); + + maxX = Math.max(maxX, Math.max(x1, x2)); + maxY = Math.max(maxY, Math.max(y1, y2)); + maxZ = Math.max(maxZ, Math.max(z1, z2)); + } } diff --git a/src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java b/src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java index 0533841..25ecba1 100644 --- a/src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java +++ b/src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java @@ -11,7 +11,6 @@ import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; public final class NameUUIDPair { - public final String name; public final UUID uuid; @@ -48,7 +47,7 @@ public final class NameUUIDPair { @Override public boolean equals(Object obj) { - if(obj == null || !(obj instanceof NameUUIDPair)) + if (obj == null || !(obj instanceof NameUUIDPair)) return false; return ((NameUUIDPair) obj).uuid.equals(uuid); @@ -68,5 +67,4 @@ public final class NameUUIDPair { bb.writeLong(uuid.getMostSignificantBits()); bb.writeLong(uuid.getLeastSignificantBits()); } - } diff --git a/src/main/java/net/montoyo/wd/utilities/NibbleArray.java b/src/main/java/net/montoyo/wd/utilities/NibbleArray.java index b66d9b3..c6bd33d 100644 --- a/src/main/java/net/montoyo/wd/utilities/NibbleArray.java +++ b/src/main/java/net/montoyo/wd/utilities/NibbleArray.java @@ -5,11 +5,10 @@ package net.montoyo.wd.utilities; public final class NibbleArray { - private final byte[] data; public NibbleArray(int count) { - if((count & 1) != 0) + if ((count & 1) != 0) count++; data = new byte[count >> 1]; @@ -20,7 +19,7 @@ public final class NibbleArray { } public final int get(int idx) { - if((idx & 1) == 0) + if ((idx & 1) == 0) return (data[idx >> 1] >> 4) & 0x0F; //MSB else return data[idx >> 1] & 0x0F; //LSB @@ -29,7 +28,7 @@ public final class NibbleArray { public final void set(int idx, int val) { val &= 0x0F; - if((idx & 1) == 0) { + if ((idx & 1) == 0) { idx >>= 1; data[idx] = (byte) ((data[idx] & 0x0F) | (val << 4)); //MSB } else { @@ -43,5 +42,4 @@ public final class NibbleArray { System.arraycopy(data, 0, ret, 0, data.length); return ret; } - } diff --git a/src/main/java/net/montoyo/wd/utilities/Rotation.java b/src/main/java/net/montoyo/wd/utilities/Rotation.java index e098254..3447403 100644 --- a/src/main/java/net/montoyo/wd/utilities/Rotation.java +++ b/src/main/java/net/montoyo/wd/utilities/Rotation.java @@ -5,7 +5,6 @@ package net.montoyo.wd.utilities; public enum Rotation { - ROT_0(0.0f, false), ROT_90(90.0f, true), ROT_180(180.0f, false), @@ -24,5 +23,4 @@ public enum Rotation { public int getAngleAsInt() { return (int) angle; } - } diff --git a/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java b/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java index 698209c..fcedc1a 100644 --- a/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java +++ b/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java @@ -9,7 +9,6 @@ import net.minecraft.core.BlockPos; import java.util.Iterator; public final class ScreenIterator implements Iterator { - private final Vector3i vec1; private final Vector3i vec2; private final BlockSide side; @@ -36,8 +35,8 @@ public final class ScreenIterator implements Iterator { public final BlockPos next() { vec2.toBlock(blockPos); - if(++x >= size.x) { - if(++y >= size.y) + if (++x >= size.x) { + if (++y >= size.y) hasNext = false; else { x = 0; @@ -60,5 +59,4 @@ public final class ScreenIterator implements Iterator { public int getIndex() { return y * size.x + x; } - } diff --git a/src/main/java/net/montoyo/wd/utilities/Util.java b/src/main/java/net/montoyo/wd/utilities/Util.java index 32583a5..4c0d3a6 100644 --- a/src/main/java/net/montoyo/wd/utilities/Util.java +++ b/src/main/java/net/montoyo/wd/utilities/Util.java @@ -19,41 +19,40 @@ import java.util.StringJoiner; import java.util.UUID; public abstract class Util { - @Deprecated(forRemoval = true) public static void serialize(FriendlyByteBuf bb, Object f) { Class cls = f.getClass(); - if(cls == Integer.class || cls == Integer.TYPE) + if (cls == Integer.class || cls == Integer.TYPE) bb.writeInt((Integer) f); - else if(cls == Float.class || cls == Float.TYPE) + else if (cls == Float.class || cls == Float.TYPE) bb.writeFloat((Float) f); - else if(cls == Double.class || cls == Double.TYPE) + else if (cls == Double.class || cls == Double.TYPE) bb.writeDouble((Double) f); - else if(cls == Boolean.class || cls == Boolean.TYPE) + else if (cls == Boolean.class || cls == Boolean.TYPE) bb.writeBoolean((Boolean) f); - else if(cls == String.class) + else if (cls == String.class) bb.writeUtf((String) f); - else if(cls == NameUUIDPair.class) + else if (cls == NameUUIDPair.class) ((NameUUIDPair) f).writeTo(bb); - else if(cls.isEnum()) + else if (cls.isEnum()) bb.writeByte(((Enum) f).ordinal()); - else if(cls.isArray()) { + else if (cls.isArray()) { Object[] ray = (Object[]) f; bb.writeInt(ray.length); - for(Object o : ray) + for (Object o : ray) serialize(bb, o); } else if (cls == ResourceLocation.class) { bb.writeUtf(f.toString()); - } else if(!cls.isPrimitive()) { + } else if (!cls.isPrimitive()) { Field[] fields = cls.getFields(); - for(Field ff : fields) { + for (Field ff : fields) { try { - if(ff.getAnnotation(DontSerialize.class) == null && !Modifier.isStatic(ff.getModifiers())) + if (ff.getAnnotation(DontSerialize.class) == null && !Modifier.isStatic(ff.getModifiers())) serialize(bb, ff.get(f)); - } catch(IllegalAccessException e) { + } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException(String.format("Caught IllegalAccessException for %s.%s", cls.getName(), ff.getName())); } @@ -61,51 +60,51 @@ public abstract class Util { } else throw new RuntimeException(String.format("Cannot transmit class %s over network!", cls.getName())); } - + @Deprecated(forRemoval = true) public static Object unserialize(FriendlyByteBuf bb, Class cls) { - if(cls == Integer.class || cls == Integer.TYPE) + if (cls == Integer.class || cls == Integer.TYPE) return bb.readInt(); - else if(cls == Float.class || cls == Float.TYPE) + else if (cls == Float.class || cls == Float.TYPE) return bb.readFloat(); - else if(cls == Double.class || cls == Double.TYPE) + else if (cls == Double.class || cls == Double.TYPE) return bb.readDouble(); - else if(cls == Boolean.class || cls == Boolean.TYPE) + else if (cls == Boolean.class || cls == Boolean.TYPE) return bb.readBoolean(); - else if(cls == String.class) + else if (cls == String.class) return bb.readUtf(); - else if(cls == NameUUIDPair.class) + else if (cls == NameUUIDPair.class) return new NameUUIDPair(bb); - else if(cls.isEnum()) + else if (cls.isEnum()) return cls.getEnumConstants()[bb.readByte()]; - else if(cls.isArray()) { + else if (cls.isArray()) { Object[] ray = new Object[bb.readInt()]; - for(int i = 0; i < ray.length; i++) + for (int i = 0; i < ray.length; i++) ray[i] = unserialize(bb, cls.getComponentType()); return Arrays.copyOf(ray, ray.length, cls); - } else if(cls == ResourceLocation.class) { + } else if (cls == ResourceLocation.class) { return new ResourceLocation(bb.readUtf()); - } else if(!cls.isPrimitive()) { + } else if (!cls.isPrimitive()) { Object ret; Field[] fields = cls.getFields(); try { ret = cls.newInstance(); - } catch(InstantiationException e) { + } catch (InstantiationException e) { e.printStackTrace(); throw new RuntimeException(String.format("Caught InstantiationException for class %s", cls.getName())); - } catch(IllegalAccessException e) { + } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException(String.format("Caught IllegalAccessException for class %s", cls.getName())); } - for(Field ff : fields) { + for (Field ff : fields) { try { - if(ff.getAnnotation(DontSerialize.class) == null && !Modifier.isStatic(ff.getModifiers())) + if (ff.getAnnotation(DontSerialize.class) == null && !Modifier.isStatic(ff.getModifiers())) ff.set(ret, unserialize(bb, ff.getType())); - } catch(IllegalAccessException e) { + } catch (IllegalAccessException e) { throw new RuntimeException(String.format("Caught IllegalAccessException for %s.%s", cls.getName(), ff.getName())); } } @@ -117,12 +116,12 @@ public abstract class Util { public static String addSlashes(String str) { String out = ""; - for(int i = 0; i < str.length(); i++) { + for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); - if(c == '\\') + if (c == '\\') out += "\\\\"; - else if(c == '\"') + else if (c == '\"') out += "\\\""; else out += c; @@ -150,7 +149,8 @@ public abstract class Util { public static void silentClose(Object obj) { try { obj.getClass().getMethod("close").invoke(obj); - } catch(Throwable t) {} + } catch (Throwable t) { + } } public static String addProtocol(String str) { @@ -161,13 +161,13 @@ public abstract class Util { return fname.isEmpty() || fname.length() > 64 || fname.charAt(0) == '.' || fname.indexOf('/') >= 0 || fname.indexOf('\\') >= 0; } - public static final String[] SIZES = { "bytes", "KiB", "MiB", "GiB", "TiB" }; + public static final String[] SIZES = {"bytes", "KiB", "MiB", "GiB", "TiB"}; public static String sizeString(long l) { double d = (double) l; int size = 0; - while(l >= 1024L && size + 1 < SIZES.length) { + while (l >= 1024L && size + 1 < SIZES.length) { d /= 1024.0; l /= 1024L; size++; @@ -183,7 +183,7 @@ public abstract class Util { } public static CompoundTag writeOwnerToNBT(CompoundTag tag, NameUUIDPair owner) { - if(owner != null) { + if (owner != null) { tag.putLong("OwnerMSB", owner.uuid.getMostSignificantBits()); tag.putLong("OwnerLSB", owner.uuid.getLeastSignificantBits()); tag.putString("OwnerName", owner.name); @@ -199,5 +199,4 @@ public abstract class Util { return new NameUUIDPair(str, new UUID(msb, lsb)); } - } diff --git a/src/main/java/net/montoyo/wd/utilities/Vector2i.java b/src/main/java/net/montoyo/wd/utilities/Vector2i.java index 1cf0a78..f7f3171 100644 --- a/src/main/java/net/montoyo/wd/utilities/Vector2i.java +++ b/src/main/java/net/montoyo/wd/utilities/Vector2i.java @@ -7,38 +7,31 @@ package net.montoyo.wd.utilities; import io.netty.buffer.ByteBuf; public final class Vector2i { - public int x; public int y; - public Vector2i() - { + public Vector2i() { x = 0; y = 0; } - public Vector2i(int val) - { + public Vector2i(int val) { x = val; y = val; } - public Vector2i(int x, int y) - { + public Vector2i(int x, int y) { this.x = x; this.y = y; } - public Vector2i(ByteBuf bb) - { + public Vector2i(ByteBuf bb) { x = bb.readInt(); y = bb.readInt(); } - public void writeTo(ByteBuf bb) - { + public void writeTo(ByteBuf bb) { bb.writeInt(x); bb.writeInt(y); } - } diff --git a/src/main/java/net/montoyo/wd/utilities/Vector3f.java b/src/main/java/net/montoyo/wd/utilities/Vector3f.java index a31ffd2..be7d32a 100644 --- a/src/main/java/net/montoyo/wd/utilities/Vector3f.java +++ b/src/main/java/net/montoyo/wd/utilities/Vector3f.java @@ -5,7 +5,6 @@ package net.montoyo.wd.utilities; public final class Vector3f { - public float x; public float y; public float z; @@ -40,7 +39,7 @@ public final class Vector3f { @Override public boolean equals(Object o) { - if(o instanceof Vector3f) { + if (o instanceof Vector3f) { Vector3f src = (Vector3f) o; return (src.x == x && src.y == y && src.z == z); @@ -182,5 +181,4 @@ public final class Vector3f { return this; } - } diff --git a/src/main/java/net/montoyo/wd/utilities/Vector3i.java b/src/main/java/net/montoyo/wd/utilities/Vector3i.java index d9823b7..9539ea2 100644 --- a/src/main/java/net/montoyo/wd/utilities/Vector3i.java +++ b/src/main/java/net/montoyo/wd/utilities/Vector3i.java @@ -8,7 +8,6 @@ import io.netty.buffer.ByteBuf; import net.minecraft.core.BlockPos; public final class Vector3i { - public int x; public int y; public int z; @@ -55,7 +54,7 @@ public final class Vector3i { @Override public boolean equals(Object o) { - if(o instanceof Vector3i) { + if (o instanceof Vector3i) { Vector3i src = (Vector3i) o; return (src.x == x && src.y == y && src.z == z); @@ -155,48 +154,42 @@ public final class Vector3i { return this; } - public Vector3i set(int x, int y, int z) - { + public Vector3i set(int x, int y, int z) { this.x = x; this.y = y; this.z = z; return this; } - public Vector3i set(double x, double y, double z) - { + public Vector3i set(double x, double y, double z) { this.x = (int) x; this.y = (int) y; this.z = (int) z; return this; } - public Vector3i set(float x, float y, float z) - { + public Vector3i set(float x, float y, float z) { this.x = (int) x; this.y = (int) y; this.z = (int) z; return this; } - public Vector3i set(int val) - { + public Vector3i set(int val) { x = val; y = val; z = val; return this; } - public Vector3i set(Vector3i val) - { + public Vector3i set(Vector3i val) { x = val.x; y = val.y; z = val.z; return this; } - public Vector3i set(Vector3f vec) - { + public Vector3i set(Vector3f vec) { this.x = (int) vec.x; this.y = (int) vec.y; this.z = (int) vec.z; @@ -210,6 +203,7 @@ public final class Vector3i { public Vector3f toFloat() { return new Vector3f((float) x, (float) y, (float) z); } + public BlockPos toBlock() { return new BlockPos(x, y, z); } @@ -218,8 +212,7 @@ public final class Vector3i { bp.set(x, y, z); } - public int getChunkLocalPos() - { + public int getChunkLocalPos() { int lx = x & 15; int ly = y & 255; int lz = z & 15; @@ -232,5 +225,4 @@ public final class Vector3i { bb.writeInt(y); bb.writeInt(z); } - } diff --git a/src/main/java/net/montoyo/wd/utilities/VideoType.java b/src/main/java/net/montoyo/wd/utilities/VideoType.java index aaaa719..8219384 100644 --- a/src/main/java/net/montoyo/wd/utilities/VideoType.java +++ b/src/main/java/net/montoyo/wd/utilities/VideoType.java @@ -10,130 +10,128 @@ import java.net.MalformedURLException; import java.net.URL; public enum VideoType { - - YOUTUBE( - "document.getElementById(\"movie_player\").", - new Function("setVolume(", ")"), - new Function("getCurrentTime(", ")"), - new Function("seekTo(", ")") - ), - YOUTUBE_EMBED( - "document.getElementsByClassName(\"html5-video-player\")[0].", - new Function("setVolume(", ")"), - new Function("getCurrentTime(", ")"), - new Function("seekTo(", ")") - ); - - private final String base; - private final Function volume; - private final Function getTime; - private final Function setTime; - private final int volumeCap; - - VideoType( - String base, - Function volume, - Function getTime, - Function setTime - ) { - this.base = base; - this.volume = volume; - this.getTime = getTime; - this.setTime = setTime; - // lol, what? - volumeCap = volume.prefix.length() + 5 + volume.suffix.length(); - } - + YOUTUBE( + "document.getElementById(\"movie_player\").", + new Function("setVolume(", ")"), + new Function("getCurrentTime(", ")"), + new Function("seekTo(", ")") + ), + YOUTUBE_EMBED( + "document.getElementsByClassName(\"html5-video-player\")[0].", + new Function("setVolume(", ")"), + new Function("getCurrentTime(", ")"), + new Function("seekTo(", ")") + ); + + private final String base; + private final Function volume; + private final Function getTime; + private final Function setTime; + private final int volumeCap; + + VideoType( + String base, + Function volume, + Function getTime, + Function setTime + ) { + this.base = base; + this.volume = volume; + this.getTime = getTime; + this.setTime = setTime; + // lol, what? + volumeCap = volume.prefix.length() + 5 + volume.suffix.length(); + } + // public static void registerQueries(JSQueryDispatcher jsQueryDispatcher) { // // TODO: register GetTime query // } - + protected static class Function { - String prefix, suffix; - - public Function(String prefix, String suffix) { - this.prefix = prefix; - this.suffix = suffix; - } - - public String apply() { - return prefix + suffix; - } - - public String apply(String arg) { - return prefix + arg + suffix; - } - } - - @Nullable - public static VideoType getTypeFromURL(@Nonnull URL url) { - String loHost = url.getHost().toLowerCase(); - if (loHost.equals("youtu.be")) - return url.getPath().length() > 1 ? YOUTUBE : null; - else if (!loHost.equals("www.youtube.com") && !loHost.equals("youtube.com")) - return null; - - String loPath = url.getPath().toLowerCase(); - if (loPath.equals("/watch")) { - if (url.getQuery() != null && (url.getQuery().startsWith("v=") || url.getQuery().contains("&v="))) - return YOUTUBE; - } else if (loPath.startsWith("/embed/")) - return loPath.length() > 7 ? YOUTUBE_EMBED : null; - - return null; - } - - @Nullable - public static VideoType getTypeFromURL(@Nonnull String url) { - try { - return getTypeFromURL(new URL(url)); - } catch (MalformedURLException ex) { - return null; - } - } - - @Nonnull - public String getVideoIDFromURL(@Nonnull URL url) { - if (this == YOUTUBE) { - if (url.getHost().equalsIgnoreCase("youtu.be")) - return url.getPath().substring(1); - - String args[] = url.getQuery().split("&"); - for (String arg : args) { - if (arg.startsWith("v=")) - return arg.substring(2); - } - } else if (this == YOUTUBE_EMBED) - return url.getPath().substring(7); - - return ""; - } - - @Nonnull - public String getURLFromID(@Nonnull String vid, boolean autoplay) { - String format; - if (this == YOUTUBE) - format = autoplay ? "https://www.youtube.com/watch?v=%s&autoplay=1" : "https://www.youtube.com/watch?v=%s"; - else if (this == YOUTUBE_EMBED) - format = autoplay ? "https://www.youtube.com/embed/%s?autoplay=1" : "https://www.youtube.com/embed/%s"; - else - return ""; - - return String.format(format, vid); - } - - // TODO: timestamp stuff - @Nonnull - public String getVolumeJSQuery(int volInt, int volFrac) { - return volume.apply(volInt + "." + volFrac); - } - - public String getTimeStampQuery() { - return getTime.apply(); - } - - public String setTimeStampQuery(float ts) { - return setTime.apply(String.valueOf(ts)); - } - + String prefix, suffix; + + public Function(String prefix, String suffix) { + this.prefix = prefix; + this.suffix = suffix; + } + + public String apply() { + return prefix + suffix; + } + + public String apply(String arg) { + return prefix + arg + suffix; + } + } + + @Nullable + public static VideoType getTypeFromURL(@Nonnull URL url) { + String loHost = url.getHost().toLowerCase(); + if (loHost.equals("youtu.be")) + return url.getPath().length() > 1 ? YOUTUBE : null; + else if (!loHost.equals("www.youtube.com") && !loHost.equals("youtube.com")) + return null; + + String loPath = url.getPath().toLowerCase(); + if (loPath.equals("/watch")) { + if (url.getQuery() != null && (url.getQuery().startsWith("v=") || url.getQuery().contains("&v="))) + return YOUTUBE; + } else if (loPath.startsWith("/embed/")) + return loPath.length() > 7 ? YOUTUBE_EMBED : null; + + return null; + } + + @Nullable + public static VideoType getTypeFromURL(@Nonnull String url) { + try { + return getTypeFromURL(new URL(url)); + } catch (MalformedURLException ex) { + return null; + } + } + + @Nonnull + public String getVideoIDFromURL(@Nonnull URL url) { + if (this == YOUTUBE) { + if (url.getHost().equalsIgnoreCase("youtu.be")) + return url.getPath().substring(1); + + String args[] = url.getQuery().split("&"); + for (String arg : args) { + if (arg.startsWith("v=")) + return arg.substring(2); + } + } else if (this == YOUTUBE_EMBED) + return url.getPath().substring(7); + + return ""; + } + + @Nonnull + public String getURLFromID(@Nonnull String vid, boolean autoplay) { + String format; + if (this == YOUTUBE) + format = autoplay ? "https://www.youtube.com/watch?v=%s&autoplay=1" : "https://www.youtube.com/watch?v=%s"; + else if (this == YOUTUBE_EMBED) + format = autoplay ? "https://www.youtube.com/embed/%s?autoplay=1" : "https://www.youtube.com/embed/%s"; + else + return ""; + + return String.format(format, vid); + } + + // TODO: timestamp stuff + @Nonnull + public String getVolumeJSQuery(int volInt, int volFrac) { + return volume.apply(volInt + "." + volFrac); + } + + public String getTimeStampQuery() { + return getTime.apply(); + } + + public String setTimeStampQuery(float ts) { + return setTime.apply(String.valueOf(ts)); + } } From c2d6f01991a4a62538c3093096a3e492f03bab55 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:50:25 -0600 Subject: [PATCH 05/15] Add some images to README --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d1d640f..64f334a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,10 @@ Download MCEF from either: - CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/mcef - Modrinth: https://modrinth.com/mod/mcef + + + ## Wiki [Outdated Wiki from the original creator](https://montoyo.net/wdwiki/index.php?title=Main_Page) -[Outdated Getting Started](https://montoyo.net/wdwiki/index.php?title=Screen) \ No newline at end of file +[Outdated Getting Started](https://montoyo.net/wdwiki/index.php?title=Screen) From a2f81aeeac18a59def467c50c88a49e524f8f6e9 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:57:02 -0500 Subject: [PATCH 06/15] modernize naming pt0 --- src/main/java/net/montoyo/wd/SharedProxy.java | 5 ++- .../montoyo/wd/block/BlockKeyboardLeft.java | 16 ++++----- .../montoyo/wd/block/BlockKeyboardRight.java | 8 ++--- .../net/montoyo/wd/block/BlockPeripheral.java | 26 +++++++------- .../net/montoyo/wd/block/BlockScreen.java | 18 +++++----- .../net/montoyo/wd/client/ClientProxy.java | 26 +++++++------- .../montoyo/wd/client/gui/GuiKeyboard.java | 6 ++-- .../wd/client/gui/GuiScreenConfig.java | 10 +++--- .../net/montoyo/wd/client/gui/GuiSetURL2.java | 8 ++--- .../wd/client/renderers/ScreenRenderer.java | 13 ++++--- .../montoyo/wd/controls/ScreenControl.java | 6 ++-- .../wd/controls/ScreenControlRegistry.java | 4 +-- .../controls/builtin/AutoVolumeControl.java | 6 ++-- .../wd/controls/builtin/ClickControl.java | 6 ++-- .../wd/controls/builtin/JSRequestControl.java | 7 ++-- .../wd/controls/builtin/KeyTypedControl.java | 6 ++-- .../wd/controls/builtin/LaserControl.java | 6 ++-- .../ManageRightsAndUpdgradesControl.java | 10 +++--- .../builtin/ModifyFriendListControl.java | 6 ++-- .../wd/controls/builtin/OwnerControl.java | 6 ++-- .../controls/builtin/ScreenModifyControl.java | 6 ++-- .../wd/controls/builtin/SetURLControl.java | 6 ++-- .../wd/controls/builtin/TurnOffControl.java | 7 ++-- .../montoyo/wd/core/DefaultPeripheral.java | 16 ++++----- .../java/net/montoyo/wd/core/IUpgrade.java | 6 ++-- .../net/montoyo/wd/data/KeyboardData.java | 8 ++--- .../net/montoyo/wd/data/ScreenConfigData.java | 8 ++--- .../java/net/montoyo/wd/data/SetURLData.java | 6 ++-- ...java => AbstractInterfaceBlockEntity.java} | 30 ++++++++-------- ...ava => AbstractPeripheralBlockEntity.java} | 20 +++++------ ...rface.java => CCInterfaceBlockEntity.java} | 7 ++-- ...Keyboard.java => KeyboardBlockEntity.java} | 12 +++---- ...rface.java => OCInterfaceBlockEntity.java} | 4 +-- ...l.java => RedstoneControlBlockEntity.java} | 10 +++--- ...trl.java => RemoteControlBlockEntity.java} | 8 ++--- ...tityScreen.java => ScreenBlockEntity.java} | 6 ++-- ...tityServer.java => ServerBlockEntity.java} | 4 +-- .../net/montoyo/wd/item/ItemLaserPointer.java | 16 ++++----- .../java/net/montoyo/wd/item/ItemLinker.java | 6 ++-- .../montoyo/wd/item/ItemOwnershipThief.java | 13 ++++--- .../wd/item/ItemScreenConfigurator.java | 7 ++-- .../java/net/montoyo/wd/item/ItemUpgrade.java | 7 ++-- .../net/client_bound/S2CMessageAddScreen.java | 30 ++++++++-------- .../client_bound/S2CMessageScreenUpdate.java | 20 +++++------ .../server_bound/C2SMessageRedstoneCtrl.java | 10 +++--- .../server_bound/C2SMessageScreenCtrl.java | 36 +++++++++---------- .../net/montoyo/wd/registry/TileRegistry.java | 12 +++---- 47 files changed, 256 insertions(+), 264 deletions(-) rename src/main/java/net/montoyo/wd/entity/{TileEntityInterfaceBase.java => AbstractInterfaceBlockEntity.java} (92%) rename src/main/java/net/montoyo/wd/entity/{TileEntityPeripheralBase.java => AbstractPeripheralBlockEntity.java} (85%) rename src/main/java/net/montoyo/wd/entity/{TileEntityCCInterface.java => CCInterfaceBlockEntity.java} (90%) rename src/main/java/net/montoyo/wd/entity/{TileEntityKeyboard.java => KeyboardBlockEntity.java} (86%) rename src/main/java/net/montoyo/wd/entity/{TileEntityOCInterface.java => OCInterfaceBlockEntity.java} (97%) rename src/main/java/net/montoyo/wd/entity/{TileEntityRedCtrl.java => RedstoneControlBlockEntity.java} (90%) rename src/main/java/net/montoyo/wd/entity/{TileEntityRCtrl.java => RemoteControlBlockEntity.java} (83%) rename src/main/java/net/montoyo/wd/entity/{TileEntityScreen.java => ScreenBlockEntity.java} (99%) rename src/main/java/net/montoyo/wd/entity/{TileEntityServer.java => ServerBlockEntity.java} (92%) diff --git a/src/main/java/net/montoyo/wd/SharedProxy.java b/src/main/java/net/montoyo/wd/SharedProxy.java index 899f91a..b828642 100644 --- a/src/main/java/net/montoyo/wd/SharedProxy.java +++ b/src/main/java/net/montoyo/wd/SharedProxy.java @@ -14,13 +14,12 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.server.ServerLifecycleHooks; import net.montoyo.wd.core.HasAdvancement; import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.data.GuiData; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.*; import javax.annotation.Nonnull; @@ -58,7 +57,7 @@ public class SharedProxy { Log.error("Called SharedProxy.displayGui() on server side..."); } - public void trackScreen(TileEntityScreen tes, boolean track) { + public void trackScreen(ScreenBlockEntity tes, boolean track) { } public void onAutocompleteResult(NameUUIDPair pairs[]) { diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java b/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java index d33d15f..53d3f0a 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java +++ b/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java @@ -26,7 +26,7 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.PacketDistributor; import net.montoyo.wd.core.DefaultPeripheral; -import net.montoyo.wd.entity.TileEntityKeyboard; +import net.montoyo.wd.entity.KeyboardBlockEntity; import net.montoyo.wd.item.ItemLinker; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; @@ -51,11 +51,11 @@ public class BlockKeyboardLeft extends BlockPeripheral { } // TODO: make non static (for extensibility purposes) - public static TileEntityKeyboard getTileEntity(BlockState state, Level world, BlockPos pos) { + public static KeyboardBlockEntity getTileEntity(BlockState state, Level world, BlockPos pos) { if (state.getBlock() instanceof BlockKeyboardLeft) { BlockEntity te = world.getBlockEntity(pos); // TODO: check? - if (te instanceof TileEntityKeyboard) - return (TileEntityKeyboard) te; + if (te instanceof KeyboardBlockEntity) + return (KeyboardBlockEntity) te; } BlockPos relative = pos.relative(BlockKeyboardLeft.mapDirection(state.getValue(FACING).getOpposite())); @@ -63,8 +63,8 @@ public class BlockKeyboardLeft extends BlockPeripheral { if (ns.getBlock() instanceof BlockPeripheral) { BlockEntity te = world.getBlockEntity(relative); // TODO: check? - if (te instanceof TileEntityKeyboard) - return (TileEntityKeyboard) te; + if (te instanceof KeyboardBlockEntity) + return (KeyboardBlockEntity) te; } return null; @@ -89,7 +89,7 @@ public class BlockKeyboardLeft extends BlockPeripheral { public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { double rpos = (entity.getY() - ((double) pos.getY())) * 16.0; if (!world.isClientSide && rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) { - TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, world, pos); + KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, world, pos); if (tek != null) tek.simulateCat(entity); @@ -101,7 +101,7 @@ public class BlockKeyboardLeft extends BlockPeripheral { if (player.getItemInHand(hand).getItem() instanceof ItemLinker) return InteractionResult.PASS; - TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, level, pos); + KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, level, pos); if (tek != null) return tek.onRightClick(player, hand); diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java index 4498563..06b75f5 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java +++ b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java @@ -23,7 +23,7 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.PacketDistributor; import net.montoyo.wd.core.IPeripheral; -import net.montoyo.wd.entity.TileEntityKeyboard; +import net.montoyo.wd.entity.KeyboardBlockEntity; import net.montoyo.wd.item.ItemLinker; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; @@ -82,7 +82,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral { @Override public boolean connect(Level world, BlockPos pos, BlockState state, Vector3i scrPos, BlockSide scrSide) { - TileEntityKeyboard keyboard = BlockKeyboardLeft.getTileEntity(state, world, pos); + KeyboardBlockEntity keyboard = BlockKeyboardLeft.getTileEntity(state, world, pos); return keyboard != null && keyboard.connect(world, pos, state, scrPos, scrSide); } @@ -90,7 +90,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral { public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { double rpos = (entity.getY() - ((double) pos.getY())) * 16.0; if (!world.isClientSide && rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) { - TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, world, pos); + KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, world, pos); if (tek != null) tek.simulateCat(entity); @@ -102,7 +102,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral { if (player.getItemInHand(hand).getItem() instanceof ItemLinker) return InteractionResult.PASS; - TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, level, pos); + KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, level, pos); if (tek != null) return tek.onRightClick(player, hand); diff --git a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java index dd8eecb..5c7f23f 100644 --- a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java +++ b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java @@ -28,9 +28,9 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.PacketDistributor; import net.montoyo.wd.core.DefaultPeripheral; -import net.montoyo.wd.entity.TileEntityInterfaceBase; -import net.montoyo.wd.entity.TileEntityPeripheralBase; -import net.montoyo.wd.entity.TileEntityServer; +import net.montoyo.wd.entity.AbstractInterfaceBlockEntity; +import net.montoyo.wd.entity.AbstractPeripheralBlockEntity; +import net.montoyo.wd.entity.ServerBlockEntity; import net.montoyo.wd.item.ItemLinker; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; @@ -76,10 +76,10 @@ public class BlockPeripheral extends WDBlockContainer { BlockEntity te = world.getBlockEntity(pos); - if (te instanceof TileEntityPeripheralBase) - return ((TileEntityPeripheralBase) te).onRightClick(player, hand); - else if (te instanceof TileEntityServer) { - ((TileEntityServer) te).onPlayerRightClick(player); + if (te instanceof AbstractPeripheralBlockEntity) + return ((AbstractPeripheralBlockEntity) te).onRightClick(player, hand); + else if (te instanceof ServerBlockEntity) { + ((ServerBlockEntity) te).onPlayerRightClick(player); return InteractionResult.SUCCESS; } else return InteractionResult.FAIL; @@ -98,10 +98,10 @@ public class BlockPeripheral extends WDBlockContainer { if (placer instanceof Player) { BlockEntity te = world.getBlockEntity(pos); - if (te instanceof TileEntityServer) - ((TileEntityServer) te).setOwner((Player) placer); - else if (te instanceof TileEntityInterfaceBase) - ((TileEntityInterfaceBase) te).setOwner((Player) placer); + if (te instanceof ServerBlockEntity) + ((ServerBlockEntity) te).setOwner((Player) placer); + else if (te instanceof AbstractInterfaceBlockEntity) + ((AbstractInterfaceBlockEntity) te).setOwner((Player) placer); } } @@ -113,8 +113,8 @@ public class BlockPeripheral extends WDBlockContainer { @Override public void neighborChanged(BlockState state, Level world, BlockPos pos, Block neighborType, BlockPos neighbor, boolean isMoving) { BlockEntity te = world.getBlockEntity(pos); - if (te instanceof TileEntityPeripheralBase) - ((TileEntityPeripheralBase) te).onNeighborChange(neighborType, neighbor); + if (te instanceof AbstractPeripheralBlockEntity) + ((AbstractPeripheralBlockEntity) te).onNeighborChange(neighborType, neighbor); } @Override diff --git a/src/main/java/net/montoyo/wd/block/BlockScreen.java b/src/main/java/net/montoyo/wd/block/BlockScreen.java index a992e1c..8d96ff0 100644 --- a/src/main/java/net/montoyo/wd/block/BlockScreen.java +++ b/src/main/java/net/montoyo/wd/block/BlockScreen.java @@ -32,7 +32,7 @@ import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.SetURLData; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.item.ItemLaserPointer; import net.montoyo.wd.utilities.*; import org.jetbrains.annotations.NotNull; @@ -92,10 +92,10 @@ public class BlockScreen extends BaseEntityBlock { BlockSide side = BlockSide.values()[hit.getDirection().ordinal()]; Multiblock.findOrigin(world, pos, side, null); - TileEntityScreen te = (TileEntityScreen) world.getBlockEntity(pos.toBlock()); + ScreenBlockEntity te = (ScreenBlockEntity) world.getBlockEntity(pos.toBlock()); if (te != null && te.getScreen(side) != null) { - TileEntityScreen.Screen scr = te.getScreen(side); + ScreenBlockEntity.Screen scr = te.getScreen(side); if (sneaking) { //Right Click if ((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) @@ -168,7 +168,7 @@ public class BlockScreen extends BaseEntityBlock { if (te == null) { BlockPos bp = pos.toBlock(); world.setBlockAndUpdate(bp, world.getBlockState(bp).setValue(hasTE, true)); - te = (TileEntityScreen) world.getBlockEntity(bp); + te = (ScreenBlockEntity) world.getBlockEntity(bp); created = true; } @@ -184,7 +184,7 @@ public class BlockScreen extends BaseEntityBlock { Vector3i vec = new Vector3i(pos); Multiblock.findOrigin(world, vec, side, null); - TileEntityScreen tes = (TileEntityScreen) world.getBlockEntity(vec.toBlock()); + ScreenBlockEntity tes = (ScreenBlockEntity) world.getBlockEntity(vec.toBlock()); if (tes != null && tes.hasUpgrade(side, DefaultUpgrade.REDINPUT)) { Direction facing = Direction.from2DDataValue(side.reverse().ordinal()); //Opposite face vec.sub(pos.getX(), pos.getY(), pos.getZ()).neg(); @@ -194,7 +194,7 @@ public class BlockScreen extends BaseEntityBlock { } } - public static boolean hit2pixels(BlockSide side, BlockPos bpos, Vector3i pos, TileEntityScreen.Screen scr, float hitX, float hitY, float hitZ, Vector2i dst) { + public static boolean hit2pixels(BlockSide side, BlockPos bpos, Vector3i pos, ScreenBlockEntity.Screen scr, float hitX, float hitY, float hitZ, Vector2i dst) { Vector3f rel = new Vector3f(hitX, hitY, hitZ); // how these dot products come in is beyond me @@ -259,8 +259,8 @@ public class BlockScreen extends BaseEntityBlock { BlockPos bp = pos.toBlock(); BlockEntity te = world.getBlockEntity(bp); - if (te instanceof TileEntityScreen) { - ((TileEntityScreen) te).onDestroy(source); + if (te instanceof ScreenBlockEntity) { + ((ScreenBlockEntity) te).onDestroy(source); world.setBlock(bp, world.getBlockState(bp).setValue(hasTE, false), Block.UPDATE_ALL_IMMEDIATE); //Destroy tile entity. } } @@ -315,7 +315,7 @@ public class BlockScreen extends BaseEntityBlock { @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return state.getValue(hasTE) ? new TileEntityScreen(pos, state) : null; + return state.getValue(hasTE) ? new ScreenBlockEntity(pos, state) : null; } @Override diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 5106536..f35f436 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -64,7 +64,7 @@ import net.montoyo.wd.client.gui.loading.GuiLoader; import net.montoyo.wd.client.renderers.*; import net.montoyo.wd.core.HasAdvancement; import net.montoyo.wd.data.GuiData; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.registry.BlockRegistry; import net.montoyo.wd.registry.ItemRegistry; import net.montoyo.wd.registry.TileRegistry; @@ -157,9 +157,9 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS BlockSide side = BlockSide.values()[result.getDirection().ordinal()]; Multiblock.findOrigin(mc.level, pos, side, null); - TileEntityScreen te = (TileEntityScreen) mc.level.getBlockEntity(pos.toBlock()); + ScreenBlockEntity te = (ScreenBlockEntity) mc.level.getBlockEntity(pos.toBlock()); - TileEntityScreen.Screen sc = te.getScreen(side); + ScreenBlockEntity.Screen sc = te.getScreen(side); if (sc == null) return; @@ -191,7 +191,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS private PadData(String url, UUID id) { String webUrl; try { - webUrl = TileEntityScreen.url(url); + webUrl = ScreenBlockEntity.url(url); } catch (IOException e) { throw new RuntimeException(e); } @@ -224,7 +224,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS private Map advancementToProgress; //Tracking - private final ArrayList screenTracking = new ArrayList<>(); + private final ArrayList screenTracking = new ArrayList<>(); private int lastTracked = 0; //MinePads Management @@ -313,7 +313,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS } @Override - public void trackScreen(TileEntityScreen tes, boolean track) { + public void trackScreen(ScreenBlockEntity tes, boolean track) { int idx = -1; for (int i = 0; i < screenTracking.size(); i++) { if (screenTracking.get(i) == tes) { @@ -534,7 +534,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS } } - for (TileEntityScreen tes : screenTracking) + for (ScreenBlockEntity tes : screenTracking) tes.updateClientSideURL(browser, url); } } @@ -644,7 +644,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS int id = lastTracked % screenTracking.size(); - TileEntityScreen tes = screenTracking.get(id); + ScreenBlockEntity tes = screenTracking.get(id); if (!tes.getLevel().equals(ev.level)) return; @@ -658,7 +658,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS } else { double dist = Double.POSITIVE_INFINITY; for (int i = 0; i < tes.screenCount(); i++) { - TileEntityScreen.Screen scrn = tes.getScreen(i); + ScreenBlockEntity.Screen scrn = tes.getScreen(i); Vector3d pos = new Vector3d( scrn.side.right.x * scrn.size.x + scrn.size.y * scrn.side.up.x, @@ -849,15 +849,15 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS public static final class ScreenSidePair { - public TileEntityScreen tes; + public ScreenBlockEntity tes; public BlockSide side; } public boolean findScreenFromBrowser(CefBrowser browser, ScreenSidePair pair) { - for (TileEntityScreen tes : screenTracking) { + for (ScreenBlockEntity tes : screenTracking) { for (int i = 0; i < tes.screenCount(); i++) { - TileEntityScreen.Screen scr = tes.getScreen(i); + ScreenBlockEntity.Screen scr = tes.getScreen(i); if (scr.browser == browser) { pair.tes = tes; @@ -910,7 +910,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS BlockEntity be = Minecraft.getInstance().level.getBlockEntity( pos ); - if (be instanceof TileEntityScreen tes) { + if (be instanceof ScreenBlockEntity tes) { if (tes.getScreen(side) != null) { event.setCanceled(true); } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java index 04c8e95..2eff89d 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java @@ -17,7 +17,7 @@ import net.montoyo.wd.client.gui.controls.Button; import net.montoyo.wd.client.gui.controls.Control; import net.montoyo.wd.client.gui.controls.Label; import net.montoyo.wd.client.gui.loading.FillControl; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.BlockSide; @@ -40,7 +40,7 @@ public class GuiKeyboard extends WDScreen { private static final String WARNING_FNAME = "wd_keyboard_warning.txt"; - private TileEntityScreen tes; + private ScreenBlockEntity tes; private BlockSide side; private final ArrayList evStack = new ArrayList<>(); private BlockPos kbPos; @@ -56,7 +56,7 @@ public class GuiKeyboard extends WDScreen { super(Component.nullToEmpty(null)); } - public GuiKeyboard(TileEntityScreen tes, BlockSide side, BlockPos kbPos) { + public GuiKeyboard(ScreenBlockEntity tes, BlockSide side, BlockPos kbPos) { this(); this.tes = tes; this.side = side; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java index b1057b9..29cd77a 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java @@ -15,7 +15,7 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.gui.controls.*; import net.montoyo.wd.client.gui.loading.FillControl; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.item.WDItem; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; @@ -30,7 +30,7 @@ import java.util.UUID; public class GuiScreenConfig extends WDScreen { //Screen data - private final TileEntityScreen tes; + private final ScreenBlockEntity tes; private final BlockSide side; private NameUUIDPair owner; private NameUUIDPair[] friends; @@ -119,7 +119,7 @@ public class GuiScreenConfig extends WDScreen { private CheckBox[] friendBoxes; private CheckBox[] otherBoxes; - public GuiScreenConfig(Component component, TileEntityScreen tes, BlockSide side, NameUUIDPair[] friends, int fr, int or) { + public GuiScreenConfig(Component component, ScreenBlockEntity tes, BlockSide side, NameUUIDPair[] friends, int fr, int or) { super(component); this.tes = tes; this.side = side; @@ -147,7 +147,7 @@ public class GuiScreenConfig extends WDScreen { boxOClick.setUserdata(ScreenRights.INTERACT); boxOSetUrl.setUserdata(ScreenRights.CHANGE_URL); - TileEntityScreen.Screen scr = tes.getScreen(side); + ScreenBlockEntity.Screen scr = tes.getScreen(side); if(scr != null) { owner = scr.owner; rotation = scr.rotation; @@ -191,7 +191,7 @@ public class GuiScreenConfig extends WDScreen { } private void clickSetRes() { - TileEntityScreen.Screen scr = tes.getScreen(side); + ScreenBlockEntity.Screen scr = tes.getScreen(side); if(scr == null) return; //WHATDAFUQ? diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java index 96ffe4c..ce47fd9 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java @@ -15,7 +15,7 @@ import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.client.gui.controls.Button; import net.montoyo.wd.client.gui.controls.TextField; import net.montoyo.wd.client.gui.loading.FillControl; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.item.ItemMinePad2; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageMinepadUrl; @@ -32,7 +32,7 @@ import java.util.UUID; public class GuiSetURL2 extends WDScreen { //Screen data - private TileEntityScreen tileEntity; + private ScreenBlockEntity tileEntity; private BlockSide screenSide; private Vector3i remoteLocation; @@ -55,7 +55,7 @@ public class GuiSetURL2 extends WDScreen { @FillControl private Button btnOk; - public GuiSetURL2(TileEntityScreen tes, BlockSide side, String url, Vector3i rl) { + public GuiSetURL2(ScreenBlockEntity tes, BlockSide side, String url, Vector3i rl) { super(Component.nullToEmpty(null)); tileEntity = tes; screenSide = side; @@ -120,7 +120,7 @@ public class GuiSetURL2 extends WDScreen { if (!url.isEmpty()) { try { - TileEntityScreen.url(url); + ScreenBlockEntity.url(url); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index 5bf19c8..595bbcd 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -11,21 +11,20 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.Vector3f; import net.montoyo.wd.utilities.Vector3i; import org.jetbrains.annotations.NotNull; -import org.lwjgl.opengl.GL11; import static com.mojang.math.Axis.*; -public class ScreenRenderer implements BlockEntityRenderer { +public class ScreenRenderer implements BlockEntityRenderer { public ScreenRenderer() { } - public static class ScreenRendererProvider implements BlockEntityRendererProvider { + public static class ScreenRendererProvider implements BlockEntityRendererProvider { @Override - public @NotNull BlockEntityRenderer create(@NotNull Context arg) { + public @NotNull BlockEntityRenderer create(@NotNull Context arg) { return new ScreenRenderer(); } } @@ -35,7 +34,7 @@ public class ScreenRenderer implements BlockEntityRenderer { private final Vector3f tmpf = new Vector3f(); @Override - public void render(TileEntityScreen te, float partialTick, @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + public void render(ScreenBlockEntity te, float partialTick, @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int packedLight, int packedOverlay) { if (!te.isLoaded()) return; @@ -45,7 +44,7 @@ public class ScreenRenderer implements BlockEntityRenderer { RenderSystem.disableBlend(); for (int i = 0; i < te.screenCount(); i++) { - TileEntityScreen.Screen scr = te.getScreen(i); + ScreenBlockEntity.Screen scr = te.getScreen(i); if (scr.browser == null) { scr.createBrowser(true); } diff --git a/src/main/java/net/montoyo/wd/controls/ScreenControl.java b/src/main/java/net/montoyo/wd/controls/ScreenControl.java index a1c2410..8cff930 100644 --- a/src/main/java/net/montoyo/wd/controls/ScreenControl.java +++ b/src/main/java/net/montoyo/wd/controls/ScreenControl.java @@ -8,7 +8,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import java.util.Objects; @@ -22,9 +22,9 @@ public abstract class ScreenControl { } public abstract void write(FriendlyByteBuf buf); - public abstract void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException; + public abstract void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException; @OnlyIn(Dist.CLIENT) - public abstract void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx); + public abstract void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx); public void checkPerms(int perms, Function checker, ServerPlayer player) throws MissingPermissionException { if (!checker.apply(perms)) { diff --git a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java index 3d85d8e..aae3347 100644 --- a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java +++ b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java @@ -8,7 +8,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.builtin.*; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Log; @@ -32,7 +32,7 @@ public class ScreenControlRegistry { if (FMLEnvironment.dist.isClient()) { boolean shouldThrow = false; try { - Method m = type.clazz.getMethod("handleClient", BlockPos.class, BlockSide.class, TileEntityScreen.class, NetworkEvent.Context.class); + Method m = type.clazz.getMethod("handleClient", BlockPos.class, BlockSide.class, ScreenBlockEntity.class, NetworkEvent.Context.class); OnlyIn onlyIn = m.getAnnotation(OnlyIn.class); if (onlyIn == null) shouldThrow = true; Dist d = onlyIn.value(); // idc if this throws, lol diff --git a/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java b/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java index 7b3aac1..b79e579 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java @@ -9,7 +9,7 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import java.util.function.Function; @@ -35,7 +35,7 @@ public class AutoVolumeControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { // I feel like there's probably a better permission category checkPerms(ScreenRights.MANAGE_UPGRADES, permissionChecker, ctx.getSender()); tes.setAutoVolume(side, autoVol); @@ -43,7 +43,7 @@ public class AutoVolumeControl extends ScreenControl { @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { tes.setAutoVolume(side, autoVol); } } diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java index dd35c4f..6366bc3 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java @@ -8,7 +8,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Vector2i; @@ -47,13 +47,13 @@ public class ClickControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { throw new RuntimeException("Cannot call click control on server"); } @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { if (coord != null) tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, coord, -1); diff --git a/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java b/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java index 282b3dc..e2730ff 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java @@ -10,9 +10,8 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Log; import java.util.function.Function; @@ -49,7 +48,7 @@ public class JSRequestControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { ServerPlayer player = ctx.getSender(); // if (reqType == null || data == null) Log.warning("Caught invalid JS request from player %s (UUID %s)", player.getName(), player.getGameProfile().getId().toString()); // else tes.handleJSRequest(player, side, reqId, reqType, data); @@ -57,7 +56,7 @@ public class JSRequestControl extends ScreenControl { @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { throw new RuntimeException("TODO"); } } diff --git a/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java b/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java index d38c94e..e96097c 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java @@ -9,7 +9,7 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import java.util.function.Function; @@ -39,14 +39,14 @@ public class KeyTypedControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { checkPerms(ScreenRights.INTERACT, permissionChecker, ctx.getSender()); tes.type(side, text, soundPos, ctx.getSender()); } @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { tes.type(side, text, soundPos); } } diff --git a/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java b/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java index 6233b96..5cbf78b 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java @@ -9,7 +9,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Vector2i; @@ -54,7 +54,7 @@ public class LaserControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { // feel like this makes sense, but I wanna get opinions first // checkPerms(ScreenRights.INTERACT, permissionChecker, ctx.getSender()); ServerPlayer sender = ctx.getSender(); @@ -67,7 +67,7 @@ public class LaserControl extends ScreenControl { @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { if (coord != null) tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, coord, -1); diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java index 2a56d08..d8d9083 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java @@ -11,7 +11,7 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import java.util.function.Function; @@ -79,7 +79,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { ServerPlayer player = ctx.getSender(); switch (type) { case UPGRADES -> { @@ -89,7 +89,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl { else tes.removeUpgrade(side, toRemove, player); } case RIGHTS -> { - TileEntityScreen.Screen scr = tes.getScreen(side); + ScreenBlockEntity.Screen scr = tes.getScreen(side); int fr = scr.owner.uuid.equals(player.getGameProfile().getId()) ? friendRights : scr.friendRights; int or = (scr.rightsFor(player) & ScreenRights.MANAGE_OTHER_RIGHTS) == 0 ? scr.otherRights : otherRights; @@ -102,7 +102,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl { @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { ServerPlayer player = ctx.getSender(); switch (type) { case UPGRADES -> { @@ -111,7 +111,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl { else tes.removeUpgrade(side, toRemove, player); } case RIGHTS -> { - TileEntityScreen.Screen scr = tes.getScreen(side); + ScreenBlockEntity.Screen scr = tes.getScreen(side); int fr = friendRights; int or = otherRights; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java index 56a5364..89846cb 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java @@ -10,7 +10,7 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.NameUUIDPair; @@ -41,7 +41,7 @@ public class ModifyFriendListControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { ServerPlayer player = ctx.getSender(); checkPerms(ScreenRights.MANAGE_FRIEND_LIST, permissionChecker, ctx.getSender()); if (adding) tes.addFriend(player, side, friend); @@ -50,7 +50,7 @@ public class ModifyFriendListControl extends ScreenControl { @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { throw new RuntimeException("TODO"); } } diff --git a/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java b/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java index 4f0c0af..1a96c9a 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java @@ -8,7 +8,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.NameUUIDPair; @@ -35,13 +35,13 @@ public class OwnerControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { throw new RuntimeException("Cannot handle ownership theft packet from server"); } @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { tes.getScreen(side).owner = owner; } } diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java index 1709f28..15d56ea 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java @@ -9,7 +9,7 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Rotation; import net.montoyo.wd.utilities.Vector2i; @@ -55,7 +55,7 @@ public class ScreenModifyControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { checkPerms(ScreenRights.MODIFY_SCREEN, permissionChecker, ctx.getSender()); switch (type) { case RESOLUTION -> tes.setResolution(side, res); @@ -65,7 +65,7 @@ public class ScreenModifyControl extends ScreenControl { @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { switch (type) { case RESOLUTION -> tes.setResolution(side, res); case ROTATION -> tes.setRotation(side, rotation); diff --git a/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java b/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java index 44b1187..06f0628 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java @@ -9,7 +9,7 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Vector3i; @@ -41,7 +41,7 @@ public class SetURLControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { // TODO: deal with remote checkPerms(ScreenRights.CHANGE_URL, permissionChecker, ctx.getSender()); try { @@ -53,7 +53,7 @@ public class SetURLControl extends ScreenControl { @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { try { tes.setScreenURL(side, url); } catch (Throwable err) { diff --git a/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java index 13a5d13..99c3f77 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java @@ -9,9 +9,8 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.NameUUIDPair; import java.util.function.Function; @@ -29,13 +28,13 @@ public class TurnOffControl extends ScreenControl { } @Override - public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { throw new RuntimeException("Cannot handle deactivation packet from server"); } @Override @OnlyIn(Dist.CLIENT) - public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) { if (side != null) { WebDisplays.PROXY.closeGui(pos, side); tes.disableScreen(side); diff --git a/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java b/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java index 4987c3d..bf7e3b2 100644 --- a/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java +++ b/src/main/java/net/montoyo/wd/core/DefaultPeripheral.java @@ -8,22 +8,22 @@ import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.montoyo.wd.entity.TileEntityKeyboard; -import net.montoyo.wd.entity.TileEntityRCtrl; -import net.montoyo.wd.entity.TileEntityRedCtrl; -import net.montoyo.wd.entity.TileEntityServer; +import net.montoyo.wd.entity.KeyboardBlockEntity; +import net.montoyo.wd.entity.RemoteControlBlockEntity; +import net.montoyo.wd.entity.RedstoneControlBlockEntity; +import net.montoyo.wd.entity.ServerBlockEntity; import net.montoyo.wd.registry.BlockRegistry; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public enum DefaultPeripheral implements StringRepresentable { - KEYBOARD("keyboard", "Keyboard", TileEntityKeyboard::new, BlockRegistry.KEYBOARD_BLOCK), //WITH FACING (< 3) + KEYBOARD("keyboard", "Keyboard", KeyboardBlockEntity::new, BlockRegistry.KEYBOARD_BLOCK), //WITH FACING (< 3) // CC_INTERFACE("ccinterface", "ComputerCraft_Interface", TileEntityCCInterface.class), // OC_INTERFACE("cointerface", "OpenComputers_Interface", TileEntityOCInterface.class), - REMOTE_CONTROLLER("remotectrl", "Remote_Controller", TileEntityRCtrl::new , BlockRegistry.REMOTE_CONTROLLER_BLOCK), //WITHOUT FACING (>= 3) - REDSTONE_CONTROLLER("redstonectrl", "Redstone_Controller", TileEntityRedCtrl::new , BlockRegistry.REDSTONE_CONTROL_BLOCK), - SERVER("server", "Server", TileEntityServer::new, BlockRegistry.SERVER_BLOCK); + REMOTE_CONTROLLER("remotectrl", "Remote_Controller", RemoteControlBlockEntity::new , BlockRegistry.REMOTE_CONTROLLER_BLOCK), //WITHOUT FACING (>= 3) + REDSTONE_CONTROLLER("redstonectrl", "Redstone_Controller", RedstoneControlBlockEntity::new , BlockRegistry.REDSTONE_CONTROL_BLOCK), + SERVER("server", "Server", ServerBlockEntity::new, BlockRegistry.SERVER_BLOCK); private final String name; private final String wikiName; diff --git a/src/main/java/net/montoyo/wd/core/IUpgrade.java b/src/main/java/net/montoyo/wd/core/IUpgrade.java index 26810da..f54cff6 100644 --- a/src/main/java/net/montoyo/wd/core/IUpgrade.java +++ b/src/main/java/net/montoyo/wd/core/IUpgrade.java @@ -6,15 +6,15 @@ package net.montoyo.wd.core; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import javax.annotation.Nonnull; import javax.annotation.Nullable; public interface IUpgrade { - void onInstall(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); - boolean onRemove(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); //Return true to prevent dropping + void onInstall(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); + boolean onRemove(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); //Return true to prevent dropping boolean isSameUpgrade(@Nonnull ItemStack myStack, @Nonnull ItemStack otherStack); //myStack.getItem() is an instance of this class String getJSName(@Nonnull ItemStack is); //modname:upgradename } diff --git a/src/main/java/net/montoyo/wd/data/KeyboardData.java b/src/main/java/net/montoyo/wd/data/KeyboardData.java index a12937d..24977b2 100644 --- a/src/main/java/net/montoyo/wd/data/KeyboardData.java +++ b/src/main/java/net/montoyo/wd/data/KeyboardData.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiKeyboard; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Vector3i; @@ -27,7 +27,7 @@ public class KeyboardData extends GuiData { public KeyboardData() { } - public KeyboardData(TileEntityScreen tes, BlockSide side, BlockPos kbPos) { + public KeyboardData(ScreenBlockEntity tes, BlockSide side, BlockPos kbPos) { pos = new Vector3i(tes.getBlockPos()); this.side = side; kbX = kbPos.getX(); @@ -39,12 +39,12 @@ public class KeyboardData extends GuiData { @Override public Screen createGui(Screen old, Level world) { BlockEntity te = world.getBlockEntity(pos.toBlock()); - if (te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof ScreenBlockEntity)) { Log.error("TileEntity at %s is not a screen; can't open keyboard!", pos.toString()); return null; } - return new GuiKeyboard((TileEntityScreen) te, side, new BlockPos(kbX, kbY, kbZ)); + return new GuiKeyboard((ScreenBlockEntity) te, side, new BlockPos(kbX, kbY, kbZ)); } @Override diff --git a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java index 9d53829..916b74b 100644 --- a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java +++ b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java @@ -13,7 +13,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.PacketDistributor; import net.montoyo.wd.client.gui.GuiScreenConfig; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageOpenGui; @@ -33,7 +33,7 @@ public class ScreenConfigData extends GuiData { public ScreenConfigData() { } - public ScreenConfigData(Vector3i pos, BlockSide side, TileEntityScreen.Screen scr) { + public ScreenConfigData(Vector3i pos, BlockSide side, ScreenBlockEntity.Screen scr) { this.pos = pos; this.side = side; friends = scr.friends.toArray(new NameUUIDPair[0]); @@ -62,12 +62,12 @@ public class ScreenConfigData extends GuiData { return null; BlockEntity te = world.getBlockEntity(pos.toBlock()); - if (te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof ScreenBlockEntity)) { Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString()); return null; } - return new GuiScreenConfig(Component.nullToEmpty(""), (TileEntityScreen) te, side, friends, friendRights, otherRights); + return new GuiScreenConfig(Component.nullToEmpty(""), (ScreenBlockEntity) te, side, friends, friendRights, otherRights); } @Override diff --git a/src/main/java/net/montoyo/wd/data/SetURLData.java b/src/main/java/net/montoyo/wd/data/SetURLData.java index 6fc81fe..e6d8c2d 100644 --- a/src/main/java/net/montoyo/wd/data/SetURLData.java +++ b/src/main/java/net/montoyo/wd/data/SetURLData.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiSetURL2; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Log; @@ -49,12 +49,12 @@ public class SetURLData extends GuiData { @Override public Screen createGui(Screen old, Level world) { BlockEntity te = world.getBlockEntity(pos.toBlock()); - if (te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof ScreenBlockEntity)) { Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString()); return null; } - return new GuiSetURL2((TileEntityScreen) te, side, url, isRemote ? remoteLocation : null); + return new GuiSetURL2((ScreenBlockEntity) te, side, url, isRemote ? remoteLocation : null); } @Override diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java b/src/main/java/net/montoyo/wd/entity/AbstractInterfaceBlockEntity.java similarity index 92% rename from src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java rename to src/main/java/net/montoyo/wd/entity/AbstractInterfaceBlockEntity.java index e9ecf14..7869ceb 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java +++ b/src/main/java/net/montoyo/wd/entity/AbstractInterfaceBlockEntity.java @@ -23,8 +23,8 @@ import java.lang.annotation.Target; import java.util.ArrayList; import java.util.Map; -public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { - public TileEntityInterfaceBase(BlockEntityType arg, BlockPos arg2, BlockState arg3) { +public abstract class AbstractInterfaceBlockEntity extends AbstractPeripheralBlockEntity { + public AbstractInterfaceBlockEntity(BlockEntityType arg, BlockPos arg2, BlockState arg3) { super(arg, arg2, arg3); } @@ -107,7 +107,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { throw new IllegalArgumentException("invalid right name"); } - TileEntityScreen tes = getConnectedScreenEx(); + ScreenBlockEntity tes = getConnectedScreenEx(); if(owner == null || tes == null) return null; else @@ -118,7 +118,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { public Object[] hasUpgrade(IComputerArgs args) { String name = args.checkString(0); - TileEntityScreen tes = getConnectedScreenEx(); + ScreenBlockEntity tes = getConnectedScreenEx(); if(owner == null || tes == null) return null; else @@ -127,7 +127,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { @ComputerFunc public Object[] getSize(IComputerArgs args) { - TileEntityScreen tes = getConnectedScreenEx(); + ScreenBlockEntity tes = getConnectedScreenEx(); if(owner == null || tes == null) return null; @@ -139,7 +139,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { @ComputerFunc public Object[] getResolution(IComputerArgs args) { - TileEntityScreen tes = getConnectedScreenEx(); + ScreenBlockEntity tes = getConnectedScreenEx(); if(owner == null || tes == null) return null; @@ -151,7 +151,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { @ComputerFunc public Object[] getRotation(IComputerArgs args) { - TileEntityScreen tes = getConnectedScreenEx(); + ScreenBlockEntity tes = getConnectedScreenEx(); if(owner == null || tes == null) return null; @@ -161,7 +161,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { @ComputerFunc public Object[] getURL(IComputerArgs args) { - TileEntityScreen tes = getConnectedScreenEx(); + ScreenBlockEntity tes = getConnectedScreenEx(); if(owner == null || tes == null) return null; @@ -205,12 +205,12 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { // throw new IllegalArgumentException("bad action name"); // } - TileEntityScreen scr = getConnectedScreenEx(); + ScreenBlockEntity scr = getConnectedScreenEx(); if(owner == null || scr == null) return err("notlinked"); else { - TileEntityScreen.Screen scrscr = scr.getScreen(screenSide); + ScreenBlockEntity.Screen scrscr = scr.getScreen(screenSide); if((scrscr.rightsFor(owner.uuid) & ScreenRights.INTERACT) == 0) return err("restrictions"); @@ -244,7 +244,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { } private Object[] realType(String what) { - TileEntityScreen scr = getConnectedScreenEx(); + ScreenBlockEntity scr = getConnectedScreenEx(); if(owner == null || scr == null) return err("notlinked"); @@ -325,7 +325,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { @ComputerFunc public Object[] setURL(IComputerArgs args) { String url = args.checkString(0); - TileEntityScreen scr = getConnectedScreenEx(); + ScreenBlockEntity scr = getConnectedScreenEx(); if(owner == null || scr == null) return err("notlinked"); @@ -345,7 +345,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { public Object[] setResolution(IComputerArgs args) { int rx = args.checkInteger(0); int ry = args.checkInteger(1); - TileEntityScreen scr = getConnectedScreenEx(); + ScreenBlockEntity scr = getConnectedScreenEx(); if(owner == null || scr == null) return err("notlinked"); @@ -368,7 +368,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { rot /= 90; rot &= 3; - TileEntityScreen scr = getConnectedScreenEx(); + ScreenBlockEntity scr = getConnectedScreenEx(); if(owner == null || scr == null) return err("notlinked"); @@ -383,7 +383,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { @ComputerFunc public Object[] runJS(IComputerArgs args) { String code = args.checkString(0); - TileEntityScreen scr = getConnectedScreenEx(); + ScreenBlockEntity scr = getConnectedScreenEx(); if(owner == null || scr == null) return err("notlinked"); diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java b/src/main/java/net/montoyo/wd/entity/AbstractPeripheralBlockEntity.java similarity index 85% rename from src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java rename to src/main/java/net/montoyo/wd/entity/AbstractPeripheralBlockEntity.java index ef7c5bf..0c8c94a 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java +++ b/src/main/java/net/montoyo/wd/entity/AbstractPeripheralBlockEntity.java @@ -24,11 +24,11 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Objects; -public abstract class TileEntityPeripheralBase extends BlockEntity implements IPeripheral { +public abstract class AbstractPeripheralBlockEntity extends BlockEntity implements IPeripheral { protected Vector3i screenPos; protected BlockSide screenSide; - public TileEntityPeripheralBase(BlockEntityType arg, BlockPos arg2, BlockState arg3) { + public AbstractPeripheralBlockEntity(BlockEntityType arg, BlockPos arg2, BlockState arg3) { super(arg, arg2, arg3); } @@ -78,12 +78,12 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP @Override public boolean connect(Level world_, BlockPos blockPos, BlockState blockState, Vector3i pos, BlockSide side) { BlockEntity te = world_.getBlockEntity(pos.toBlock()); - if (!(te instanceof TileEntityScreen)) { + if (!(te instanceof ScreenBlockEntity)) { Log.error("TileEntityPeripheralBase.connect(): Tile entity at %s is not a screen!", pos.toString()); return false; } - if (((TileEntityScreen) te).getScreen(side) == null) { + if (((ScreenBlockEntity) te).getScreen(side) == null) { Log.error("TileEntityPeripheralBase.connect(): There is no screen at %s on side %s!", pos.toString(), side.toString()); return false; } @@ -107,31 +107,31 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP } @Nullable - public TileEntityScreen getConnectedScreen() { + public ScreenBlockEntity getConnectedScreen() { if (screenPos == null || screenSide == null) return null; BlockEntity te = level.getBlockEntity(screenPos.toBlock()); - if (!(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null) { + if (!(te instanceof ScreenBlockEntity) || ((ScreenBlockEntity) te).getScreen(screenSide) == null) { screenPos = null; screenSide = null; setChanged(); return null; } - return (TileEntityScreen) te; + return (ScreenBlockEntity) te; } @Nullable - public TileEntityScreen getConnectedScreenEx() { + public ScreenBlockEntity getConnectedScreenEx() { if (screenPos == null || screenSide == null) return null; BlockEntity te = level.getBlockEntity(screenPos.toBlock()); - if (!(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null) + if (!(te instanceof ScreenBlockEntity) || ((ScreenBlockEntity) te).getScreen(screenSide) == null) return null; - return (TileEntityScreen) te; + return (ScreenBlockEntity) te; } @Nullable diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java b/src/main/java/net/montoyo/wd/entity/CCInterfaceBlockEntity.java similarity index 90% rename from src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java rename to src/main/java/net/montoyo/wd/entity/CCInterfaceBlockEntity.java index 0af19c8..21baa13 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java +++ b/src/main/java/net/montoyo/wd/entity/CCInterfaceBlockEntity.java @@ -3,6 +3,7 @@ */ package net.montoyo.wd.entity; + /* import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; @@ -19,17 +20,17 @@ import java.lang.reflect.Method; import java.util.ArrayList; @Optional.Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "computercraft") -public class TileEntityCCInterface extends TileEntityInterfaceBase implements IPeripheral { +public class CCInterfaceBlockEntity extends AbstractInterfaceBlockEntity implements IPeripheral { private static final String[] METHOD_NAMES; private static final Method[] METHODS; static { ArrayList names = new ArrayList<>(); ArrayList methods = new ArrayList<>(); - Method[] src = TileEntityInterfaceBase.class.getMethods(); + Method[] src = AbstractInterfaceBlockEntity.class.getMethods(); for(Method m: src) { - if(m.getAnnotation(TileEntityInterfaceBase.ComputerFunc.class) != null) { + if(m.getAnnotation(AbstractInterfaceBlockEntity.ComputerFunc.class) != null) { if(m.getParameterCount() != 1 || m.getParameterTypes()[0] != IComputerArgs.class) throw new RuntimeException("Found @ComputerFunc method with invalid arguments"); diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java b/src/main/java/net/montoyo/wd/entity/KeyboardBlockEntity.java similarity index 86% rename from src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java rename to src/main/java/net/montoyo/wd/entity/KeyboardBlockEntity.java index 00c114c..40cf24d 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java +++ b/src/main/java/net/montoyo/wd/entity/KeyboardBlockEntity.java @@ -18,10 +18,10 @@ import net.montoyo.wd.data.KeyboardData; import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.utilities.Util; -public class TileEntityKeyboard extends TileEntityPeripheralBase { +public class KeyboardBlockEntity extends AbstractPeripheralBlockEntity { private static final String RANDOM_CHARS = "AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789"; //Yes I have an AZERTY keyboard, u care? - public TileEntityKeyboard(BlockPos arg2, BlockState arg3) { + public KeyboardBlockEntity(BlockPos arg2, BlockState arg3) { super(TileRegistry.KEYBOARD.get(), arg2, arg3); } @@ -35,13 +35,13 @@ public class TileEntityKeyboard extends TileEntityPeripheralBase { return InteractionResult.SUCCESS; } - TileEntityScreen tes = getConnectedScreen(); + ScreenBlockEntity tes = getConnectedScreen(); if(tes == null) { Util.toast(player, "notLinked"); return InteractionResult.SUCCESS; } - TileEntityScreen.Screen scr = tes.getScreen(screenSide); + ScreenBlockEntity.Screen scr = tes.getScreen(screenSide); if((scr.rightsFor(player) & ScreenRights.INTERACT) == 0) { Util.toast(player, "restrictions"); return InteractionResult.SUCCESS; @@ -55,10 +55,10 @@ public class TileEntityKeyboard extends TileEntityPeripheralBase { if(!isScreenChunkLoaded()) return; - TileEntityScreen tes = getConnectedScreen(); + ScreenBlockEntity tes = getConnectedScreen(); if(tes != null) { - TileEntityScreen.Screen scr = tes.getScreen(screenSide); + ScreenBlockEntity.Screen scr = tes.getScreen(screenSide); boolean ok; if(ent instanceof Player) diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityOCInterface.java b/src/main/java/net/montoyo/wd/entity/OCInterfaceBlockEntity.java similarity index 97% rename from src/main/java/net/montoyo/wd/entity/TileEntityOCInterface.java rename to src/main/java/net/montoyo/wd/entity/OCInterfaceBlockEntity.java index 16b83d1..272dccc 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityOCInterface.java +++ b/src/main/java/net/montoyo/wd/entity/OCInterfaceBlockEntity.java @@ -13,8 +13,7 @@ import net.minecraftforge.fml.common.Optional; import net.montoyo.wd.core.OCArguments; @Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers") -public class TileEntityOCInterface extends TileEntityInterfaceBase implements SimpleComponent { - +public class OCInterfaceBlockEntity extends AbstractInterfaceBlockEntity implements SimpleComponent { @Override public String getComponentName() { return "webdisplays"; @@ -133,5 +132,4 @@ public class TileEntityOCInterface extends TileEntityInterfaceBase implements Si public Object[] unlink(Context ctx, Arguments args) { return unlink(new OCArguments(args)); } - }*/ diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java b/src/main/java/net/montoyo/wd/entity/RedstoneControlBlockEntity.java similarity index 90% rename from src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java rename to src/main/java/net/montoyo/wd/entity/RedstoneControlBlockEntity.java index c68e454..df1ebe8 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java +++ b/src/main/java/net/montoyo/wd/entity/RedstoneControlBlockEntity.java @@ -19,12 +19,12 @@ import net.montoyo.wd.utilities.Util; import java.io.IOException; -public class TileEntityRedCtrl extends TileEntityPeripheralBase { +public class RedstoneControlBlockEntity extends AbstractPeripheralBlockEntity { private String risingEdgeURL = ""; private String fallingEdgeURL = ""; private boolean state = false; - public TileEntityRedCtrl(BlockPos arg2, BlockState arg3) { + public RedstoneControlBlockEntity(BlockPos arg2, BlockState arg3) { super(TileRegistry.REDSTONE_CONTROLLER.get(), arg2, arg3); } @@ -55,13 +55,13 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase { return InteractionResult.SUCCESS; } - TileEntityScreen tes = getConnectedScreen(); + ScreenBlockEntity tes = getConnectedScreen(); if (tes == null) { Util.toast(player, "notLinked"); return InteractionResult.SUCCESS; } - TileEntityScreen.Screen scr = tes.getScreen(screenSide); + ScreenBlockEntity.Screen scr = tes.getScreen(screenSide); if ((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) { Util.toast(player, "restrictions"); return InteractionResult.SUCCESS; @@ -96,7 +96,7 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase { return; if (isScreenChunkLoaded()) { - TileEntityScreen tes = getConnectedScreen(); + ScreenBlockEntity tes = getConnectedScreen(); if (tes != null) try { diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java b/src/main/java/net/montoyo/wd/entity/RemoteControlBlockEntity.java similarity index 83% rename from src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java rename to src/main/java/net/montoyo/wd/entity/RemoteControlBlockEntity.java index 414c80c..bfc0c2a 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java +++ b/src/main/java/net/montoyo/wd/entity/RemoteControlBlockEntity.java @@ -15,8 +15,8 @@ import net.montoyo.wd.data.SetURLData; import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.utilities.Util; -public class TileEntityRCtrl extends TileEntityPeripheralBase { - public TileEntityRCtrl(BlockPos arg2, BlockState arg3) { +public class RemoteControlBlockEntity extends AbstractPeripheralBlockEntity { + public RemoteControlBlockEntity(BlockPos arg2, BlockState arg3) { super(TileRegistry.REMOTE_CONTROLLER.get(), arg2, arg3); } @@ -30,13 +30,13 @@ public class TileEntityRCtrl extends TileEntityPeripheralBase { return InteractionResult.SUCCESS; } - TileEntityScreen tes = getConnectedScreen(); + ScreenBlockEntity tes = getConnectedScreen(); if (tes == null) { Util.toast(player, "notLinked"); return InteractionResult.SUCCESS; } - TileEntityScreen.Screen scr = tes.getScreen(screenSide); + ScreenBlockEntity.Screen scr = tes.getScreen(screenSide); if ((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) { Util.toast(player, "restrictions"); return InteractionResult.SUCCESS; diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java similarity index 99% rename from src/main/java/net/montoyo/wd/entity/TileEntityScreen.java rename to src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java index 65cbfa4..77dd0f7 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java @@ -53,8 +53,8 @@ import java.util.function.Consumer; import static net.montoyo.wd.block.BlockPeripheral.point; -public class TileEntityScreen extends BlockEntity { - public TileEntityScreen(BlockPos arg2, BlockState arg3) { +public class ScreenBlockEntity extends BlockEntity { + public ScreenBlockEntity(BlockPos arg2, BlockState arg3) { super(TileRegistry.SCREEN_BLOCK_ENTITY.get(), arg2, arg3); } @@ -792,7 +792,7 @@ public class TileEntityScreen extends BlockEntity { // TODO: what? lol String webUrl; try { - webUrl = TileEntityScreen.url(url); + webUrl = ScreenBlockEntity.url(url); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityServer.java b/src/main/java/net/montoyo/wd/entity/ServerBlockEntity.java similarity index 92% rename from src/main/java/net/montoyo/wd/entity/TileEntityServer.java rename to src/main/java/net/montoyo/wd/entity/ServerBlockEntity.java index c5db695..3479935 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityServer.java +++ b/src/main/java/net/montoyo/wd/entity/ServerBlockEntity.java @@ -16,10 +16,10 @@ import net.montoyo.wd.registry.TileRegistry; import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.Util; -public class TileEntityServer extends BlockEntity { +public class ServerBlockEntity extends BlockEntity { private NameUUIDPair owner; - public TileEntityServer(BlockPos arg2, BlockState arg3) { + public ServerBlockEntity(BlockPos arg2, BlockState arg3) { super(TileRegistry.SERVER.get(), arg2, arg3); } diff --git a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java index f1b05de..a989ab2 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java +++ b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java @@ -16,7 +16,7 @@ import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.config.ClientConfig; import net.montoyo.wd.controls.builtin.ClickControl; import net.montoyo.wd.core.DefaultUpgrade; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.registry.BlockRegistry; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; @@ -38,7 +38,7 @@ public class ItemLaserPointer extends Item implements WDItem { } //Laser pointer - private static TileEntityScreen pointedScreen; + private static ScreenBlockEntity pointedScreen; private static BlockSide pointedScreenSide; private static long lastPointPacket; @@ -57,11 +57,11 @@ public class ItemLaserPointer extends Item implements WDItem { BlockSide side = BlockSide.values()[result.getDirection().ordinal()]; Multiblock.findOrigin(mc.level, pos, side, null); - TileEntityScreen te = (TileEntityScreen) mc.level.getBlockEntity(pos.toBlock()); + ScreenBlockEntity te = (ScreenBlockEntity) mc.level.getBlockEntity(pos.toBlock()); if (te != null && te.hasUpgrade(side, DefaultUpgrade.LASERMOUSE)) { //hasUpgrade returns false is there's no screen on side 'side' //Since rights aren't synchronized, let the server check them for us... - TileEntityScreen.Screen scr = te.getScreen(side); + ScreenBlockEntity.Screen scr = te.getScreen(side); if (scr.browser != null) { float hitX = ((float) result.getLocation().x) - (float) pos.x; @@ -81,7 +81,7 @@ public class ItemLaserPointer extends Item implements WDItem { deselectScreen(); } - private static void laserClick(TileEntityScreen tes, BlockSide side, TileEntityScreen.Screen scr, Vector2i hit) { + private static void laserClick(ScreenBlockEntity tes, BlockSide side, ScreenBlockEntity.Screen scr, Vector2i hit) { tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1); if (pointedScreen == tes && pointedScreenSide == side) { long t = System.currentTimeMillis(); @@ -125,14 +125,14 @@ public class ItemLaserPointer extends Item implements WDItem { Vector2i tmp = new Vector2i(); BlockEntity be = mc.level.getBlockEntity(pos.toBlock()); - if (!(be instanceof TileEntityScreen)) return; + if (!(be instanceof ScreenBlockEntity)) return; //noinspection PatternVariableCanBeUsed - TileEntityScreen te = (TileEntityScreen) be; + ScreenBlockEntity te = (ScreenBlockEntity) be; if (te.hasUpgrade(side, DefaultUpgrade.LASERMOUSE)) { //hasUpgrade returns false is there's no screen on side 'side' //Since rights aren't synchronized, let the server check them for us... - TileEntityScreen.Screen scr = te.getScreen(side); + ScreenBlockEntity.Screen scr = te.getScreen(side); if (scr.browser != null) { if (BlockScreen.hit2pixels(side, result.getBlockPos(), new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) { diff --git a/src/main/java/net/montoyo/wd/item/ItemLinker.java b/src/main/java/net/montoyo/wd/item/ItemLinker.java index a933266..4654e32 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLinker.java +++ b/src/main/java/net/montoyo/wd/item/ItemLinker.java @@ -17,7 +17,7 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.core.IPeripheral; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Multiblock; import net.montoyo.wd.utilities.Util; @@ -90,12 +90,12 @@ public class ItemLinker extends Item implements WDItem { Multiblock.findOrigin(context.getLevel(), pos, side, null); BlockEntity te = context.getLevel().getBlockEntity(pos.toBlock()); - if (te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof ScreenBlockEntity)) { Util.toast(context.getPlayer(), "turnOn"); return InteractionResult.SUCCESS; } - TileEntityScreen.Screen scr = ((TileEntityScreen) te).getScreen(side); + ScreenBlockEntity.Screen scr = ((ScreenBlockEntity) te).getScreen(side); if (scr == null) Util.toast(context.getPlayer(), "turnOn"); else if ((scr.rightsFor(context.getPlayer()) & ScreenRights.MANAGE_UPGRADES) == 0) diff --git a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java index 2601751..af14436 100644 --- a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java +++ b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java @@ -12,10 +12,9 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.entity.BlockEntity; -import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.config.CommonConfig; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.*; import org.jetbrains.annotations.NotNull; @@ -55,11 +54,11 @@ public class ItemOwnershipThief extends Item implements WDItem { return InteractionResult.SUCCESS; BlockEntity te = context.getLevel().getBlockEntity(bp); - if (te == null || !(te instanceof TileEntityScreen)) + if (te == null || !(te instanceof ScreenBlockEntity)) return InteractionResult.SUCCESS; - TileEntityScreen tes = (TileEntityScreen) te; - TileEntityScreen.Screen scr = tes.getScreen(side); + ScreenBlockEntity tes = (ScreenBlockEntity) te; + ScreenBlockEntity.Screen scr = tes.getScreen(side); if (scr == null) return InteractionResult.SUCCESS; @@ -79,12 +78,12 @@ public class ItemOwnershipThief extends Item implements WDItem { Multiblock.findOrigin(context.getLevel(), pos, side, null); BlockEntity te = context.getLevel().getBlockEntity(pos.toBlock()); - if (te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof ScreenBlockEntity)) { Util.toast(context.getPlayer(), "turnOn"); return InteractionResult.SUCCESS; } - if (((TileEntityScreen) te).getScreen(side) == null) + if (((ScreenBlockEntity) te).getScreen(side) == null) Util.toast(context.getPlayer(), "turnOn"); else { CompoundTag tag = new CompoundTag(); diff --git a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java index 83e5e4d..5771140 100644 --- a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java +++ b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java @@ -10,10 +10,9 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.entity.BlockEntity; -import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.data.ScreenConfigData; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Multiblock; import net.montoyo.wd.utilities.Util; @@ -42,12 +41,12 @@ public class ItemScreenConfigurator extends Item implements WDItem { Multiblock.findOrigin(context.getLevel(), origin, side, null); BlockEntity te = context.getLevel().getBlockEntity(origin.toBlock()); - if (te == null || !(te instanceof TileEntityScreen)) { + if (te == null || !(te instanceof ScreenBlockEntity)) { Util.toast(context.getPlayer(), "turnOn"); return InteractionResult.SUCCESS; } - TileEntityScreen.Screen scr = ((TileEntityScreen) te).getScreen(side); + ScreenBlockEntity.Screen scr = ((ScreenBlockEntity) te).getScreen(side); if (scr == null) Util.toast(context.getPlayer(), "turnOn"); else diff --git a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java index d4721f9..291a7f8 100644 --- a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java +++ b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java @@ -7,10 +7,9 @@ package net.montoyo.wd.item; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.montoyo.wd.WebDisplays; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IUpgrade; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; import org.jetbrains.annotations.NotNull; @@ -26,11 +25,11 @@ public class ItemUpgrade extends ItemMulti implements IUpgrade, WDItem { } @Override - public void onInstall(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) { + public void onInstall(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) { } @Override - public boolean onRemove(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) { + public boolean onRemove(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) { if (DefaultUpgrade.LASERMOUSE.matchesLaserMouse(is)) tes.clearLaserUser(screenSide); diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java index 80d65ab..755ce42 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.*; @@ -22,24 +22,24 @@ import static net.montoyo.wd.block.BlockScreen.hasTE; public class S2CMessageAddScreen extends Packet { private boolean clear; private Vector3i pos; - private TileEntityScreen.Screen[] screens; + private ScreenBlockEntity.Screen[] screens; - public S2CMessageAddScreen(TileEntityScreen tes) { + public S2CMessageAddScreen(ScreenBlockEntity tes) { clear = true; pos = new Vector3i(tes.getBlockPos()); - screens = new TileEntityScreen.Screen[tes.screenCount()]; + screens = new ScreenBlockEntity.Screen[tes.screenCount()]; for (int i = 0; i < tes.screenCount(); i++) screens[i] = tes.getScreen(i); } - public S2CMessageAddScreen(TileEntityScreen tes, TileEntityScreen.Screen... toSend) { + public S2CMessageAddScreen(ScreenBlockEntity tes, ScreenBlockEntity.Screen... toSend) { clear = false; pos = new Vector3i(tes.getBlockPos()); screens = toSend; } - public S2CMessageAddScreen(boolean clear, Vector3i pos, TileEntityScreen.Screen[] screens) { + public S2CMessageAddScreen(boolean clear, Vector3i pos, ScreenBlockEntity.Screen[] screens) { this.clear = clear; this.pos = pos; this.screens = screens; @@ -53,9 +53,9 @@ public class S2CMessageAddScreen extends Packet { int cnt = buf.readByte() & 7; - screens = new TileEntityScreen.Screen[cnt]; + screens = new ScreenBlockEntity.Screen[cnt]; for (int i = 0; i < cnt; i++) { - screens[i] = new TileEntityScreen.Screen(); + screens[i] = new ScreenBlockEntity.Screen(); screens[i].side = BlockSide.values()[buf.readByte()]; screens[i].size = new Vector2i(buf); screens[i].url = buf.readUtf(); @@ -76,7 +76,7 @@ public class S2CMessageAddScreen extends Packet { pos.writeTo(buf); buf.writeByte(screens.length); - for (TileEntityScreen.Screen scr : screens) { + for (ScreenBlockEntity.Screen scr : screens) { buf.writeByte(scr.side.ordinal()); scr.size.writeTo(buf); buf.writeUtf(scr.url); @@ -95,11 +95,11 @@ public class S2CMessageAddScreen extends Packet { ctx.enqueueWork(() -> { Level lvl = (Level) WebDisplays.PROXY.getWorld(ctx); BlockEntity te = lvl.getBlockEntity(pos.toBlock()); - if (!(te instanceof TileEntityScreen)) { + if (!(te instanceof ScreenBlockEntity)) { lvl.setBlockAndUpdate(pos.toBlock(), lvl.getBlockState(pos.toBlock()).setValue(hasTE, true)); te = lvl.getBlockEntity(pos.toBlock()); - if (!(te instanceof TileEntityScreen)) { + if (!(te instanceof ScreenBlockEntity)) { if (clear) Log.error("CMessageAddScreen: Can't add screen to invalid tile entity at %s", pos.toString()); @@ -107,17 +107,17 @@ public class S2CMessageAddScreen extends Packet { } } - TileEntityScreen tes = (TileEntityScreen) te; + ScreenBlockEntity tes = (ScreenBlockEntity) te; if (clear) tes.clear(); - for (TileEntityScreen.Screen entry : screens) { - TileEntityScreen.Screen scr = tes.addScreen(entry.side, entry.size, entry.resolution, null, false); + for (ScreenBlockEntity.Screen entry : screens) { + ScreenBlockEntity.Screen scr = tes.addScreen(entry.side, entry.size, entry.resolution, null, false); scr.rotation = entry.rotation; String webUrl; try { - webUrl = TileEntityScreen.url(entry.url); + webUrl = ScreenBlockEntity.url(entry.url); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java index 05c7bf5..b4c2f88 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java @@ -14,7 +14,7 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.controls.ScreenControlRegistry; import net.montoyo.wd.controls.builtin.*; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.*; @@ -39,49 +39,49 @@ public class S2CMessageScreenUpdate extends Packet { this.control = ScreenControlRegistry.parse(buf); } - public static S2CMessageScreenUpdate setURL(TileEntityScreen screen, BlockSide side, String weburl) { + public static S2CMessageScreenUpdate setURL(ScreenBlockEntity screen, BlockSide side, String weburl) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new SetURLControl(weburl, new Vector3i(screenUpdate.pos)); return screenUpdate; } - public static S2CMessageScreenUpdate setResolution(TileEntityScreen screen, BlockSide side, Vector2i res) { + public static S2CMessageScreenUpdate setResolution(ScreenBlockEntity screen, BlockSide side, Vector2i res) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new ScreenModifyControl(res); return screenUpdate; } - public static S2CMessageScreenUpdate rotation(TileEntityScreen screen, BlockSide side, Rotation rot) { + public static S2CMessageScreenUpdate rotation(ScreenBlockEntity screen, BlockSide side, Rotation rot) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new ScreenModifyControl(rot); return screenUpdate; } - public static S2CMessageScreenUpdate upgrade(TileEntityScreen screen, BlockSide side, boolean adding, ItemStack stack) { + public static S2CMessageScreenUpdate upgrade(ScreenBlockEntity screen, BlockSide side, boolean adding, ItemStack stack) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new ManageRightsAndUpdgradesControl(adding, stack); return screenUpdate; } - public static S2CMessageScreenUpdate click(TileEntityScreen screen, BlockSide side, ClickControl.ControlType mouseMove, Vector2i pos) { + public static S2CMessageScreenUpdate click(ScreenBlockEntity screen, BlockSide side, ClickControl.ControlType mouseMove, Vector2i pos) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new ClickControl(mouseMove, pos); return screenUpdate; } - public static S2CMessageScreenUpdate type(TileEntityScreen screen, BlockSide side, String text) { + public static S2CMessageScreenUpdate type(ScreenBlockEntity screen, BlockSide side, String text) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new KeyTypedControl(text, screenUpdate.pos); return screenUpdate; } - public static S2CMessageScreenUpdate autoVolume(TileEntityScreen screen, BlockSide side, boolean av) { + public static S2CMessageScreenUpdate autoVolume(ScreenBlockEntity screen, BlockSide side, boolean av) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new AutoVolumeControl(av); return screenUpdate; } - public static S2CMessageScreenUpdate owner(TileEntityScreen screen, BlockSide side, NameUUIDPair owner) { + public static S2CMessageScreenUpdate owner(ScreenBlockEntity screen, BlockSide side, NameUUIDPair owner) { S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(screen.getBlockPos(), side); screenUpdate.control = new OwnerControl(owner); return screenUpdate; @@ -107,7 +107,7 @@ public class S2CMessageScreenUpdate extends Packet { ctx.enqueueWork(() -> { Level level = (Level) WebDisplays.PROXY.getWorld(ctx); BlockEntity be = level.getBlockEntity(pos); - if (be instanceof TileEntityScreen tes) { + if (be instanceof ScreenBlockEntity tes) { control.handleClient(pos, side, tes, ctx); } }); diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java index 0645c3b..ac9c073 100644 --- a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java @@ -12,8 +12,8 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.ForgeMod; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityRedCtrl; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.RedstoneControlBlockEntity; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.Util; import net.montoyo.wd.utilities.Vector3i; @@ -50,16 +50,16 @@ public class C2SMessageRedstoneCtrl extends Packet implements Runnable { return; BlockEntity te = world.getBlockEntity(blockPos); - if (te == null || !(te instanceof TileEntityRedCtrl)) + if (te == null || !(te instanceof RedstoneControlBlockEntity)) return; - TileEntityRedCtrl redCtrl = (TileEntityRedCtrl) te; + RedstoneControlBlockEntity redCtrl = (RedstoneControlBlockEntity) te; if (!redCtrl.isScreenChunkLoaded()) { Util.toast(player, "chunkUnloaded"); return; } - TileEntityScreen tes = redCtrl.getConnectedScreen(); + ScreenBlockEntity tes = redCtrl.getConnectedScreen(); if (tes == null) return; diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java index 5ff83bd..9b224e4 100644 --- a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java @@ -17,7 +17,7 @@ import net.montoyo.wd.controls.ScreenControlRegistry; import net.montoyo.wd.controls.builtin.*; import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.*; @@ -40,13 +40,13 @@ public class C2SMessageScreenCtrl extends Packet { public C2SMessageScreenCtrl() { } - public C2SMessageScreenCtrl(TileEntityScreen screen, BlockSide side, ScreenControl control) { + public C2SMessageScreenCtrl(ScreenBlockEntity screen, BlockSide side, ScreenControl control) { this.pos = screen.getBlockPos(); this.side = side; this.control = control; } - protected static C2SMessageScreenCtrl base(TileEntityScreen screen, BlockSide side) { + protected static C2SMessageScreenCtrl base(ScreenBlockEntity screen, BlockSide side) { C2SMessageScreenCtrl packet = new C2SMessageScreenCtrl(); packet.pos = screen.getBlockPos(); packet.side = side; @@ -54,79 +54,79 @@ public class C2SMessageScreenCtrl extends Packet { } @Deprecated(forRemoval = true) - public static C2SMessageScreenCtrl setURL(TileEntityScreen tes, BlockSide side, String url, Vector3i remoteLocation) { + public static C2SMessageScreenCtrl setURL(ScreenBlockEntity tes, BlockSide side, String url, Vector3i remoteLocation) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new SetURLControl(url, remoteLocation); return ret; } @Deprecated(forRemoval = true) - public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, NameUUIDPair friend, boolean del) { + public C2SMessageScreenCtrl(ScreenBlockEntity tes, BlockSide side, NameUUIDPair friend, boolean del) { this(tes, side, new ModifyFriendListControl(friend, !del)); } @Deprecated(forRemoval = true) - public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, int fr, int or) { + public C2SMessageScreenCtrl(ScreenBlockEntity tes, BlockSide side, int fr, int or) { this(tes, side, new ManageRightsAndUpdgradesControl(fr, or)); } @Deprecated(forRemoval = true) - public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, ItemStack toRem) { + public C2SMessageScreenCtrl(ScreenBlockEntity tes, BlockSide side, ItemStack toRem) { this(tes, side, new ManageRightsAndUpdgradesControl(false, toRem)); } @Deprecated(forRemoval = true) - public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, Rotation rot) { + public C2SMessageScreenCtrl(ScreenBlockEntity tes, BlockSide side, Rotation rot) { this(tes, side, new ScreenModifyControl(rot)); } @Deprecated(forRemoval = true) - public static C2SMessageScreenCtrl vec2(TileEntityScreen tes, BlockSide side, int ctrl, Vector2i vec) { + public static C2SMessageScreenCtrl vec2(ScreenBlockEntity tes, BlockSide side, int ctrl, Vector2i vec) { throw new RuntimeException("Moved: look into ScreenControlRegistry"); } @Deprecated(forRemoval = true) - public static C2SMessageScreenCtrl resolution(TileEntityScreen tes, BlockSide side, Vector2i vec) { + public static C2SMessageScreenCtrl resolution(ScreenBlockEntity tes, BlockSide side, Vector2i vec) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new ScreenModifyControl(vec); return ret; } @Deprecated(forRemoval = true) - public static C2SMessageScreenCtrl type(TileEntityScreen tes, BlockSide side, String text, BlockPos soundPos) { + public static C2SMessageScreenCtrl type(ScreenBlockEntity tes, BlockSide side, String text, BlockPos soundPos) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new KeyTypedControl(text, soundPos); return ret; } - public static C2SMessageScreenCtrl laserMove(TileEntityScreen tes, BlockSide side, Vector2i vec) { + public static C2SMessageScreenCtrl laserMove(ScreenBlockEntity tes, BlockSide side, Vector2i vec) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new LaserControl(LaserControl.ControlType.MOVE, vec); return ret; } - public static C2SMessageScreenCtrl laserDown(TileEntityScreen tes, BlockSide side, Vector2i vec, int button) { + public static C2SMessageScreenCtrl laserDown(ScreenBlockEntity tes, BlockSide side, Vector2i vec, int button) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new LaserControl(LaserControl.ControlType.DOWN, vec, button); return ret; } @Deprecated(forRemoval = true) - public static C2SMessageScreenCtrl laserUp(TileEntityScreen tes, BlockSide side, int button) { + public static C2SMessageScreenCtrl laserUp(ScreenBlockEntity tes, BlockSide side, int button) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new LaserControl(LaserControl.ControlType.UP, null, button); return ret; } @Deprecated(forRemoval = true) - public static C2SMessageScreenCtrl jsRequest(TileEntityScreen tes, BlockSide side, int reqId, JSServerRequest reqType, Object... data) { + public static C2SMessageScreenCtrl jsRequest(ScreenBlockEntity tes, BlockSide side, int reqId, JSServerRequest reqType, Object... data) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new JSRequestControl(reqId, reqType, data); return ret; } @Deprecated(forRemoval = true) - public static C2SMessageScreenCtrl autoVol(TileEntityScreen tes, BlockSide side, boolean av) { + public static C2SMessageScreenCtrl autoVol(ScreenBlockEntity tes, BlockSide side, boolean av) { C2SMessageScreenCtrl ret = base(tes, side); ret.control = new AutoVolumeControl(av); return ret; @@ -150,7 +150,7 @@ public class C2SMessageScreenCtrl extends Packet { control.write(buf); } - public void checkPermission(ServerPlayer sender, TileEntityScreen scr, int right) throws MissingPermissionException { + public void checkPermission(ServerPlayer sender, ScreenBlockEntity scr, int right) throws MissingPermissionException { int prights = scr.getScreen(side).rightsFor(sender); if ((prights & right) == 0) throw new MissingPermissionException(right, sender); @@ -162,7 +162,7 @@ public class C2SMessageScreenCtrl extends Packet { try { Level level = (Level) WebDisplays.PROXY.getWorld(ctx); BlockEntity be = level.getBlockEntity(pos); - if (be instanceof TileEntityScreen tes) { + if (be instanceof ScreenBlockEntity tes) { control.handleServer(pos, side, tes, ctx, (perm) -> { try { checkPermission(ctx.getSender(), tes, perm); diff --git a/src/main/java/net/montoyo/wd/registry/TileRegistry.java b/src/main/java/net/montoyo/wd/registry/TileRegistry.java index 84b6b2f..18f0855 100644 --- a/src/main/java/net/montoyo/wd/registry/TileRegistry.java +++ b/src/main/java/net/montoyo/wd/registry/TileRegistry.java @@ -12,21 +12,21 @@ public class TileRegistry { .create(ForgeRegistries.BLOCK_ENTITY_TYPES, "webdisplays"); //Register tile entities - public static final RegistryObject> SCREEN_BLOCK_ENTITY = TILE_TYPES + public static final RegistryObject> SCREEN_BLOCK_ENTITY = TILE_TYPES .register("screen", () -> BlockEntityType.Builder - .of(TileEntityScreen::new, BlockRegistry.SCREEN_BLOCk.get()).build(null)); + .of(ScreenBlockEntity::new, BlockRegistry.SCREEN_BLOCk.get()).build(null)); public static final RegistryObject> KEYBOARD = TILE_TYPES.register("kb_left", () -> BlockEntityType.Builder - .of(TileEntityKeyboard::new, BlockRegistry.KEYBOARD_BLOCK.get()).build(null)); + .of(KeyboardBlockEntity::new, BlockRegistry.KEYBOARD_BLOCK.get()).build(null)); public static final RegistryObject> REMOTE_CONTROLLER = TILE_TYPES.register("rctrl", - () -> BlockEntityType.Builder.of(TileEntityRCtrl::new, BlockRegistry.REMOTE_CONTROLLER_BLOCK.get()).build(null)); //WITHOUT FACING (>= 3) + () -> BlockEntityType.Builder.of(RemoteControlBlockEntity::new, BlockRegistry.REMOTE_CONTROLLER_BLOCK.get()).build(null)); //WITHOUT FACING (>= 3) public static final RegistryObject> REDSTONE_CONTROLLER = TILE_TYPES.register("redctrl", - () -> BlockEntityType.Builder.of(TileEntityRedCtrl::new, BlockRegistry.REDSTONE_CONTROL_BLOCK.get()).build(null)); + () -> BlockEntityType.Builder.of(RedstoneControlBlockEntity::new, BlockRegistry.REDSTONE_CONTROL_BLOCK.get()).build(null)); public static final RegistryObject> SERVER = TILE_TYPES.register("server", - () -> BlockEntityType.Builder.of(TileEntityServer::new, BlockRegistry.SERVER_BLOCK.get()).build(null)); + () -> BlockEntityType.Builder.of(ServerBlockEntity::new, BlockRegistry.SERVER_BLOCK.get()).build(null)); public static void init(IEventBus bus) { TILE_TYPES.register(bus); From a4b4162fa913225a6e75b74bd3c67a2031ff4704 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:58:05 -0500 Subject: [PATCH 07/15] modernize naming pt1 --- ...yboardLeft.java => KeyboardBlockLeft.java} | 18 ++++++++--------- ...oardRight.java => KeyboardBlockRight.java} | 18 ++++++++--------- ...ckPeripheral.java => PeripheralBlock.java} | 4 ++-- .../{BlockScreen.java => ScreenBlock.java} | 6 +++--- ...ckContainer.java => WDContainerBlock.java} | 4 ++-- .../montoyo/wd/block/item/KeyboardItem.java | 10 +++++----- .../net/montoyo/wd/client/ClientProxy.java | 4 ++-- .../montoyo/wd/entity/ScreenBlockEntity.java | 6 +++--- .../net/montoyo/wd/item/ItemLaserPointer.java | 6 +++--- .../java/net/montoyo/wd/item/ItemLinker.java | 4 ++-- .../montoyo/wd/item/ItemOwnershipThief.java | 6 +++--- .../wd/item/ItemScreenConfigurator.java | 4 ++-- .../net/client_bound/S2CMessageAddScreen.java | 2 +- .../montoyo/wd/registry/BlockRegistry.java | 20 +++++++++---------- 14 files changed, 56 insertions(+), 56 deletions(-) rename src/main/java/net/montoyo/wd/block/{BlockKeyboardLeft.java => KeyboardBlockLeft.java} (91%) rename src/main/java/net/montoyo/wd/block/{BlockKeyboardRight.java => KeyboardBlockRight.java} (88%) rename src/main/java/net/montoyo/wd/block/{BlockPeripheral.java => PeripheralBlock.java} (98%) rename src/main/java/net/montoyo/wd/block/{BlockScreen.java => ScreenBlock.java} (99%) rename src/main/java/net/montoyo/wd/block/{WDBlockContainer.java => WDContainerBlock.java} (74%) diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java b/src/main/java/net/montoyo/wd/block/KeyboardBlockLeft.java similarity index 91% rename from src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java rename to src/main/java/net/montoyo/wd/block/KeyboardBlockLeft.java index 53d3f0a..65cb7bc 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java +++ b/src/main/java/net/montoyo/wd/block/KeyboardBlockLeft.java @@ -32,7 +32,7 @@ import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import org.jetbrains.annotations.NotNull; -public class BlockKeyboardLeft extends BlockPeripheral { +public class KeyboardBlockLeft extends PeripheralBlock { public static final EnumProperty TYPE = EnumProperty.create("type", DefaultPeripheral.class); public static final DirectionProperty FACING = DirectionProperty.create("facing", Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST); // public static final DirectionProperty HALF = DirectionProperty.create("facing", Direction.EAST, Direction.WEST); @@ -46,22 +46,22 @@ public class BlockKeyboardLeft extends BlockPeripheral { private static final Property[] properties = new Property[] {TYPE, FACING}; - public BlockKeyboardLeft() { + public KeyboardBlockLeft() { super(DefaultPeripheral.KEYBOARD); } // TODO: make non static (for extensibility purposes) public static KeyboardBlockEntity getTileEntity(BlockState state, Level world, BlockPos pos) { - if (state.getBlock() instanceof BlockKeyboardLeft) { + if (state.getBlock() instanceof KeyboardBlockLeft) { BlockEntity te = world.getBlockEntity(pos); // TODO: check? if (te instanceof KeyboardBlockEntity) return (KeyboardBlockEntity) te; } - BlockPos relative = pos.relative(BlockKeyboardLeft.mapDirection(state.getValue(FACING).getOpposite())); + BlockPos relative = pos.relative(KeyboardBlockLeft.mapDirection(state.getValue(FACING).getOpposite())); BlockState ns = world.getBlockState(relative); - if (ns.getBlock() instanceof BlockPeripheral) { + if (ns.getBlock() instanceof PeripheralBlock) { BlockEntity te = world.getBlockEntity(relative); // TODO: check? if (te instanceof KeyboardBlockEntity) return (KeyboardBlockEntity) te; @@ -89,7 +89,7 @@ public class BlockKeyboardLeft extends BlockPeripheral { public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { double rpos = (entity.getY() - ((double) pos.getY())) * 16.0; if (!world.isClientSide && rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) { - KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, world, pos); + KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, world, pos); if (tek != null) tek.simulateCat(entity); @@ -101,7 +101,7 @@ public class BlockKeyboardLeft extends BlockPeripheral { if (player.getItemInHand(hand).getItem() instanceof ItemLinker) return InteractionResult.PASS; - KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, level, pos); + KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, level, pos); if (tek != null) return tek.onRightClick(player, hand); @@ -119,10 +119,10 @@ public class BlockKeyboardLeft extends BlockPeripheral { } private static void removeRightPiece(BlockState state, Level world, BlockPos pos) { - BlockPos relative = pos.relative(BlockKeyboardLeft.mapDirection(state.getValue(FACING))); + BlockPos relative = pos.relative(KeyboardBlockLeft.mapDirection(state.getValue(FACING))); BlockState ns = world.getBlockState(relative); - if (ns.getBlock() instanceof BlockKeyboardRight) + if (ns.getBlock() instanceof KeyboardBlockRight) world.setBlock(relative, Blocks.AIR.defaultBlockState(), 3); } diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java b/src/main/java/net/montoyo/wd/block/KeyboardBlockRight.java similarity index 88% rename from src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java rename to src/main/java/net/montoyo/wd/block/KeyboardBlockRight.java index 06b75f5..e28f7ef 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java +++ b/src/main/java/net/montoyo/wd/block/KeyboardBlockRight.java @@ -31,23 +31,23 @@ import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Vector3i; import org.jetbrains.annotations.NotNull; -import static net.montoyo.wd.block.BlockKeyboardLeft.KEYBOARD_AABBS; -import static net.montoyo.wd.block.BlockPeripheral.point; +import static net.montoyo.wd.block.KeyboardBlockLeft.KEYBOARD_AABBS; +import static net.montoyo.wd.block.PeripheralBlock.point; // TODO: merge into KeyboardLeft -public class BlockKeyboardRight extends Block implements IPeripheral { +public class KeyboardBlockRight extends Block implements IPeripheral { public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - public BlockKeyboardRight() { + public KeyboardBlockRight() { super(Properties.copy(Blocks.STONE) .strength(1.5f, 10.f)); } private static void removeLeftPiece(BlockState state, Level world, BlockPos pos) { - BlockPos relative = pos.relative(BlockKeyboardLeft.mapDirection(state.getValue(FACING).getOpposite())); + BlockPos relative = pos.relative(KeyboardBlockLeft.mapDirection(state.getValue(FACING).getOpposite())); BlockState ns = world.getBlockState(relative); - if (ns.getBlock() instanceof BlockKeyboardLeft) + if (ns.getBlock() instanceof KeyboardBlockLeft) world.setBlock(relative, Blocks.AIR.defaultBlockState(), 3); } @@ -82,7 +82,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral { @Override public boolean connect(Level world, BlockPos pos, BlockState state, Vector3i scrPos, BlockSide scrSide) { - KeyboardBlockEntity keyboard = BlockKeyboardLeft.getTileEntity(state, world, pos); + KeyboardBlockEntity keyboard = KeyboardBlockLeft.getTileEntity(state, world, pos); return keyboard != null && keyboard.connect(world, pos, state, scrPos, scrSide); } @@ -90,7 +90,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral { public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { double rpos = (entity.getY() - ((double) pos.getY())) * 16.0; if (!world.isClientSide && rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) { - KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, world, pos); + KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, world, pos); if (tek != null) tek.simulateCat(entity); @@ -102,7 +102,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral { if (player.getItemInHand(hand).getItem() instanceof ItemLinker) return InteractionResult.PASS; - KeyboardBlockEntity tek = BlockKeyboardLeft.getTileEntity(state, level, pos); + KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, level, pos); if (tek != null) return tek.onRightClick(player, hand); diff --git a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java b/src/main/java/net/montoyo/wd/block/PeripheralBlock.java similarity index 98% rename from src/main/java/net/montoyo/wd/block/BlockPeripheral.java rename to src/main/java/net/montoyo/wd/block/PeripheralBlock.java index 5c7f23f..40c25f3 100644 --- a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java +++ b/src/main/java/net/montoyo/wd/block/PeripheralBlock.java @@ -37,10 +37,10 @@ import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import net.montoyo.wd.utilities.Log; import org.jetbrains.annotations.Nullable; -public class BlockPeripheral extends WDBlockContainer { +public class PeripheralBlock extends WDContainerBlock { DefaultPeripheral type; - public BlockPeripheral(DefaultPeripheral type) { + public PeripheralBlock(DefaultPeripheral type) { super(BlockBehaviour.Properties.copy(Blocks.STONE).strength(1.5f, 10.f)); this.type = type; } diff --git a/src/main/java/net/montoyo/wd/block/BlockScreen.java b/src/main/java/net/montoyo/wd/block/ScreenBlock.java similarity index 99% rename from src/main/java/net/montoyo/wd/block/BlockScreen.java rename to src/main/java/net/montoyo/wd/block/ScreenBlock.java index 8d96ff0..ef9809f 100644 --- a/src/main/java/net/montoyo/wd/block/BlockScreen.java +++ b/src/main/java/net/montoyo/wd/block/ScreenBlock.java @@ -37,12 +37,12 @@ import net.montoyo.wd.item.ItemLaserPointer; import net.montoyo.wd.utilities.*; import org.jetbrains.annotations.NotNull; -public class BlockScreen extends BaseEntityBlock { +public class ScreenBlock extends BaseEntityBlock { public static final BooleanProperty hasTE = BooleanProperty.create("haste"); public static final BooleanProperty emitting = BooleanProperty.create("emitting"); private static final Property[] properties = new Property[]{hasTE, emitting}; - public BlockScreen(Properties properties) { + public ScreenBlock(Properties properties) { super(properties.strength(1.5f, 10.f)); this.registerDefaultState(this.defaultBlockState().setValue(hasTE, false).setValue(emitting, false)); } @@ -289,7 +289,7 @@ public class BlockScreen extends BaseEntityBlock { neighbors[5] = new Vector3i(pos.getX(), pos.getY(), pos.getZ() - 1); for (Vector3i neighbor : neighbors) { - if (world.getBlockState(neighbor.toBlock()).getBlock() instanceof BlockScreen) { + if (world.getBlockState(neighbor.toBlock()).getBlock() instanceof ScreenBlock) { for (BlockSide bs : BlockSide.values()) destroySide(world, neighbor.clone(), bs, override, (whoDidThisShit instanceof Player) ? ((Player) whoDidThisShit) : null); } diff --git a/src/main/java/net/montoyo/wd/block/WDBlockContainer.java b/src/main/java/net/montoyo/wd/block/WDContainerBlock.java similarity index 74% rename from src/main/java/net/montoyo/wd/block/WDBlockContainer.java rename to src/main/java/net/montoyo/wd/block/WDContainerBlock.java index c62659f..6c7dc55 100644 --- a/src/main/java/net/montoyo/wd/block/WDBlockContainer.java +++ b/src/main/java/net/montoyo/wd/block/WDContainerBlock.java @@ -7,11 +7,11 @@ package net.montoyo.wd.block; import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.block.BaseEntityBlock; -public abstract class WDBlockContainer extends BaseEntityBlock { +public abstract class WDContainerBlock extends BaseEntityBlock { protected static BlockItem itemBlock; - public WDBlockContainer(Properties arg) { + public WDContainerBlock(Properties arg) { super(arg); } diff --git a/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java b/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java index c260757..ad776e0 100644 --- a/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java +++ b/src/main/java/net/montoyo/wd/block/item/KeyboardItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.montoyo.wd.block.BlockKeyboardLeft; +import net.montoyo.wd.block.KeyboardBlockLeft; import net.montoyo.wd.registry.BlockRegistry; public class KeyboardItem extends BlockItem { @@ -18,15 +18,15 @@ public class KeyboardItem extends BlockItem { @Override protected boolean placeBlock(BlockPlaceContext arg, BlockState arg2) { Direction facing = arg.getHorizontalDirection(); - arg2 = arg2.setValue(BlockKeyboardLeft.FACING, facing); + arg2 = arg2.setValue(KeyboardBlockLeft.FACING, facing); - Direction d = BlockKeyboardLeft.mapDirection(facing); + Direction d = KeyboardBlockLeft.mapDirection(facing); if (isValid(arg.getClickedPos(), arg.getLevel(), arg2, d)) { Block kbRight = BlockRegistry.blockKbRight.get(); BlockState rightState = kbRight.defaultBlockState(); - rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing); + rightState = rightState.setValue(KeyboardBlockLeft.FACING, facing); if (!arg.getLevel().setBlock( arg.getClickedPos().relative(d), rightState, @@ -37,7 +37,7 @@ public class KeyboardItem extends BlockItem { Block kbRight = BlockRegistry.blockKbRight.get(); BlockState rightState = kbRight.defaultBlockState(); - rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing); + rightState = rightState.setValue(KeyboardBlockLeft.FACING, facing); if (!arg.getLevel().setBlock( arg.getClickedPos(), rightState, diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index f35f436..3d6ead5 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -58,7 +58,7 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.SharedProxy; import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.client.gui.*; import net.montoyo.wd.client.gui.loading.GuiLoader; import net.montoyo.wd.client.renderers.*; @@ -898,7 +898,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS public static void onDrawSelection(RenderHighlightEvent event) { if (event.getTarget() instanceof BlockHitResult bhr) { BlockState state = Minecraft.getInstance().level.getBlockState(bhr.getBlockPos()); - if (state.getBlock() instanceof BlockScreen screen) { + if (state.getBlock() instanceof ScreenBlock screen) { Vector3i vec = new Vector3i(bhr.getBlockPos().getX(), bhr.getBlockPos().getY(), bhr.getBlockPos().getZ()); BlockSide side = BlockSide.fromInt(bhr.getDirection().ordinal()); Multiblock.findOrigin( diff --git a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java index 77dd0f7..6da5cbf 100644 --- a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java @@ -25,7 +25,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraftforge.network.PacketDistributor; import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.config.CommonConfig; import net.montoyo.wd.controls.builtin.ClickControl; @@ -51,7 +51,7 @@ import java.util.List; import java.util.UUID; import java.util.function.Consumer; -import static net.montoyo.wd.block.BlockPeripheral.point; +import static net.montoyo.wd.block.PeripheralBlock.point; public class ScreenBlockEntity extends BlockEntity { public ScreenBlockEntity(BlockPos arg2, BlockState arg3) { @@ -481,7 +481,7 @@ public class ScreenBlockEntity extends BlockEntity { if (!level.isClientSide) { if (screens.isEmpty()) //No more screens: remove tile entity - level.setBlockAndUpdate(getBlockPos(), BlockRegistry.SCREEN_BLOCk.get().defaultBlockState().setValue(BlockScreen.hasTE, false)); + level.setBlockAndUpdate(getBlockPos(), BlockRegistry.SCREEN_BLOCk.get().defaultBlockState().setValue(ScreenBlock.hasTE, false)); else setChanged(); } diff --git a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java index a989ab2..f97f5dd 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java +++ b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; -import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.config.ClientConfig; import net.montoyo.wd.controls.builtin.ClickControl; @@ -69,7 +69,7 @@ public class ItemLaserPointer extends Item implements WDItem { float hitZ = ((float) result.getLocation().z) - (float) pos.z; Vector2i tmp = new Vector2i(); - if (BlockScreen.hit2pixels(side, bpos, new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) { + if (ScreenBlock.hit2pixels(side, bpos, new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) { laserClick(te, side, scr, tmp); } } @@ -135,7 +135,7 @@ public class ItemLaserPointer extends Item implements WDItem { ScreenBlockEntity.Screen scr = te.getScreen(side); if (scr.browser != null) { - if (BlockScreen.hit2pixels(side, result.getBlockPos(), new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) { + if (ScreenBlock.hit2pixels(side, result.getBlockPos(), new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) { te.handleMouseEvent(side, ClickControl.ControlType.MOVE, tmp, -1); te.handleMouseEvent(side, press ? ClickControl.ControlType.DOWN : ClickControl.ControlType.UP, tmp, button); diff --git a/src/main/java/net/montoyo/wd/item/ItemLinker.java b/src/main/java/net/montoyo/wd/item/ItemLinker.java index 4654e32..91defbe 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLinker.java +++ b/src/main/java/net/montoyo/wd/item/ItemLinker.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.core.IPeripheral; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; @@ -80,7 +80,7 @@ public class ItemLinker extends Item implements WDItem { } } - if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) { + if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof ScreenBlock)) { Util.toast(context.getPlayer(), "notAScreen"); return InteractionResult.SUCCESS; } diff --git a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java index af14436..95935e6 100644 --- a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java +++ b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java @@ -12,7 +12,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.entity.BlockEntity; -import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.config.CommonConfig; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.*; @@ -50,7 +50,7 @@ public class ItemOwnershipThief extends Item implements WDItem { BlockPos bp = new BlockPos(tag.getInt("PosX"), tag.getInt("PosY"), tag.getInt("PosZ")); BlockSide side = BlockSide.values()[tag.getByte("Side")]; - if (!(context.getLevel().getBlockState(bp).getBlock() instanceof BlockScreen)) + if (!(context.getLevel().getBlockState(bp).getBlock() instanceof ScreenBlock)) return InteractionResult.SUCCESS; BlockEntity te = context.getLevel().getBlockEntity(bp); @@ -70,7 +70,7 @@ public class ItemOwnershipThief extends Item implements WDItem { } } - if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) + if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof ScreenBlock)) return InteractionResult.SUCCESS; Vector3i pos = new Vector3i(context.getClickedPos()); diff --git a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java index 5771140..66991ed 100644 --- a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java +++ b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.entity.BlockEntity; -import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.data.ScreenConfigData; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.BlockSide; @@ -29,7 +29,7 @@ public class ItemScreenConfigurator extends Item implements WDItem { @Override public InteractionResult useOn(UseOnContext context) { - if (context.getPlayer().isShiftKeyDown() || !(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) + if (context.getPlayer().isShiftKeyDown() || !(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof ScreenBlock)) return InteractionResult.PASS; if (context.getLevel().isClientSide) diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java index 755ce42..cbd4006 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java @@ -17,7 +17,7 @@ import net.montoyo.wd.utilities.*; import java.io.IOException; import java.util.ArrayList; -import static net.montoyo.wd.block.BlockScreen.hasTE; +import static net.montoyo.wd.block.ScreenBlock.hasTE; public class S2CMessageAddScreen extends Packet { private boolean clear; diff --git a/src/main/java/net/montoyo/wd/registry/BlockRegistry.java b/src/main/java/net/montoyo/wd/registry/BlockRegistry.java index 64b3251..b0cf12d 100644 --- a/src/main/java/net/montoyo/wd/registry/BlockRegistry.java +++ b/src/main/java/net/montoyo/wd/registry/BlockRegistry.java @@ -7,10 +7,10 @@ import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -import net.montoyo.wd.block.BlockKeyboardLeft; -import net.montoyo.wd.block.BlockKeyboardRight; -import net.montoyo.wd.block.BlockPeripheral; -import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.block.KeyboardBlockLeft; +import net.montoyo.wd.block.KeyboardBlockRight; +import net.montoyo.wd.block.PeripheralBlock; +import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.core.DefaultPeripheral; public class BlockRegistry { @@ -20,12 +20,12 @@ public class BlockRegistry { public static DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, "webdisplays"); - public static final RegistryObject SCREEN_BLOCk = BLOCKS.register("screen", () -> new BlockScreen(BlockBehaviour.Properties.copy(Blocks.STONE))); + public static final RegistryObject SCREEN_BLOCk = BLOCKS.register("screen", () -> new ScreenBlock(BlockBehaviour.Properties.copy(Blocks.STONE))); - public static final RegistryObject KEYBOARD_BLOCK = BlockRegistry.BLOCKS.register("kb_left", BlockKeyboardLeft::new); - public static final RegistryObject blockKbRight = BLOCKS.register("kb_right", BlockKeyboardRight::new); + public static final RegistryObject KEYBOARD_BLOCK = BlockRegistry.BLOCKS.register("kb_left", KeyboardBlockLeft::new); + public static final RegistryObject blockKbRight = BLOCKS.register("kb_right", KeyboardBlockRight::new); - public static final RegistryObject REDSTONE_CONTROL_BLOCK = BlockRegistry.BLOCKS.register("redctrl", () -> new BlockPeripheral(DefaultPeripheral.REDSTONE_CONTROLLER)); - public static final RegistryObject REMOTE_CONTROLLER_BLOCK = BlockRegistry.BLOCKS.register("rctrl", () -> new BlockPeripheral(DefaultPeripheral.REMOTE_CONTROLLER)); - public static final RegistryObject SERVER_BLOCK = BlockRegistry.BLOCKS.register("server", () -> new BlockPeripheral(DefaultPeripheral.SERVER)); + public static final RegistryObject REDSTONE_CONTROL_BLOCK = BlockRegistry.BLOCKS.register("redctrl", () -> new PeripheralBlock(DefaultPeripheral.REDSTONE_CONTROLLER)); + public static final RegistryObject REMOTE_CONTROLLER_BLOCK = BlockRegistry.BLOCKS.register("rctrl", () -> new PeripheralBlock(DefaultPeripheral.REMOTE_CONTROLLER)); + public static final RegistryObject SERVER_BLOCK = BlockRegistry.BLOCKS.register("server", () -> new PeripheralBlock(DefaultPeripheral.SERVER)); } From 074cedc85c108f55d8c99c0ca5ce5626f82243a2 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Sat, 11 Nov 2023 00:06:56 -0500 Subject: [PATCH 08/15] some restructuring --- src/main/java/net/montoyo/wd/SharedProxy.java | 5 ++ src/main/java/net/montoyo/wd/WebDisplays.java | 2 +- .../montoyo/wd/block/KeyboardBlockRight.java | 4 +- .../net/montoyo/wd/block/ScreenBlock.java | 5 ++ .../net/montoyo/wd/client/ClientProxy.java | 5 ++ .../java/net/montoyo/wd/client/WDScheme.java | 2 +- .../montoyo/wd/client/gui/GuiKeyboard.java | 6 +-- .../net/montoyo/wd/client/gui/GuiMinePad.java | 4 +- .../wd/client/gui/GuiRedstoneCtrl.java | 9 +--- .../wd/client/gui/GuiScreenConfig.java | 4 ++ .../net/montoyo/wd/client/gui/GuiServer.java | 6 ++- .../net/montoyo/wd/client/gui/GuiSetURL2.java | 6 +-- .../net/montoyo/wd/client/gui/WDScreen.java | 5 +- .../wd/client/gui/controls/Control.java | 4 +- .../wd/client/gui/controls/ControlGroup.java | 6 +-- .../wd/client/gui/controls/YTButton.java | 2 +- .../wd/client/renderers/ScreenBaker.java | 6 +-- .../wd/client/renderers/ScreenRenderer.java | 4 +- .../montoyo/wd/controls/ScreenControl.java | 2 +- .../wd/controls/ScreenControlRegistry.java | 2 +- .../controls/builtin/AutoVolumeControl.java | 2 +- .../wd/controls/builtin/ClickControl.java | 4 +- .../wd/controls/builtin/JSRequestControl.java | 2 +- .../wd/controls/builtin/KeyTypedControl.java | 2 +- .../wd/controls/builtin/LaserControl.java | 4 +- .../ManageRightsAndUpdgradesControl.java | 2 +- .../builtin/ModifyFriendListControl.java | 4 +- .../wd/controls/builtin/OwnerControl.java | 4 +- .../controls/builtin/ScreenModifyControl.java | 6 +-- .../wd/controls/builtin/SetURLControl.java | 4 +- .../wd/controls/builtin/TurnOffControl.java | 2 +- .../java/net/montoyo/wd/core/IPeripheral.java | 4 +- .../montoyo/wd/core/IScreenQueryHandler.java | 2 +- .../java/net/montoyo/wd/core/IUpgrade.java | 2 +- .../net/montoyo/wd/core/JSServerRequest.java | 2 +- .../net/montoyo/wd/data/KeyboardData.java | 4 +- .../net/montoyo/wd/data/RedstoneCtrlData.java | 2 +- .../net/montoyo/wd/data/ScreenConfigData.java | 6 +-- .../java/net/montoyo/wd/data/ServerData.java | 4 +- .../java/net/montoyo/wd/data/SetURLData.java | 4 +- .../entity/AbstractInterfaceBlockEntity.java | 6 ++- .../entity/AbstractPeripheralBlockEntity.java | 4 +- .../wd/entity/KeyboardBlockEntity.java | 2 +- .../wd/entity/RedstoneControlBlockEntity.java | 2 +- .../wd/entity/RemoteControlBlockEntity.java | 2 +- .../montoyo/wd/entity/ScreenBlockEntity.java | 10 ++++ .../montoyo/wd/entity/ServerBlockEntity.java | 4 +- .../net/montoyo/wd/item/ItemLaserPointer.java | 6 +-- .../java/net/montoyo/wd/item/ItemLinker.java | 6 +-- .../montoyo/wd/item/ItemOwnershipThief.java | 3 ++ .../wd/item/ItemScreenConfigurator.java | 6 +-- .../java/net/montoyo/wd/item/ItemUpgrade.java | 2 +- .../montoyo/wd/miniserv/client/Client.java | 2 +- .../miniserv/client/ClientTaskUploadFile.java | 2 +- .../montoyo/wd/miniserv/server/Server.java | 2 +- .../wd/miniserv/server/ServerClient.java | 2 +- .../java/net/montoyo/wd/net/BufferUtils.java | 2 +- .../net/client_bound/S2CMessageACResult.java | 2 +- .../net/client_bound/S2CMessageAddScreen.java | 5 ++ .../net/client_bound/S2CMessageCloseGui.java | 2 +- .../client_bound/S2CMessageScreenUpdate.java | 6 ++- .../net/server_bound/C2SMessageACQuery.java | 2 +- .../server_bound/C2SMessageRedstoneCtrl.java | 4 +- .../server_bound/C2SMessageScreenCtrl.java | 6 ++- .../net/montoyo/wd/utilities/Multiblock.java | 54 +++++++++---------- .../net/montoyo/wd/utilities/NibbleArray.java | 4 +- .../montoyo/wd/utilities/ScreenIterator.java | 20 +++---- .../wd/utilities/{ => data}/BlockSide.java | 4 +- .../wd/utilities/{ => data}/Bounds.java | 2 +- .../wd/utilities/{ => data}/Rotation.java | 2 +- .../wd/utilities/{ => math}/MutableAABB.java | 2 +- .../wd/utilities/{ => math}/Vector2i.java | 2 +- .../wd/utilities/{ => math}/Vector3f.java | 2 +- .../wd/utilities/{ => math}/Vector3i.java | 2 +- .../{ => serialization}/DontSerialize.java | 2 +- .../{ => serialization}/NameUUIDPair.java | 3 +- .../{ => serialization}/TypeData.java | 2 +- .../utilities/{ => serialization}/Util.java | 2 +- 78 files changed, 195 insertions(+), 153 deletions(-) rename src/main/java/net/montoyo/wd/utilities/{ => data}/BlockSide.java (94%) rename src/main/java/net/montoyo/wd/utilities/{ => data}/Bounds.java (92%) rename src/main/java/net/montoyo/wd/utilities/{ => data}/Rotation.java (92%) rename src/main/java/net/montoyo/wd/utilities/{ => math}/MutableAABB.java (98%) rename src/main/java/net/montoyo/wd/utilities/{ => math}/Vector2i.java (93%) rename src/main/java/net/montoyo/wd/utilities/{ => math}/Vector3f.java (98%) rename src/main/java/net/montoyo/wd/utilities/{ => math}/Vector3i.java (99%) rename src/main/java/net/montoyo/wd/utilities/{ => serialization}/DontSerialize.java (86%) rename src/main/java/net/montoyo/wd/utilities/{ => serialization}/NameUUIDPair.java (95%) rename src/main/java/net/montoyo/wd/utilities/{ => serialization}/TypeData.java (95%) rename src/main/java/net/montoyo/wd/utilities/{ => serialization}/Util.java (99%) diff --git a/src/main/java/net/montoyo/wd/SharedProxy.java b/src/main/java/net/montoyo/wd/SharedProxy.java index b828642..408a4c7 100644 --- a/src/main/java/net/montoyo/wd/SharedProxy.java +++ b/src/main/java/net/montoyo/wd/SharedProxy.java @@ -21,6 +21,11 @@ import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.data.GuiData; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import javax.annotation.Nonnull; import java.util.UUID; diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index 9ba905a..6a213d9 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -51,7 +51,7 @@ import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageServerInfo; import net.montoyo.wd.utilities.DistSafety; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import java.io.*; import java.net.MalformedURLException; diff --git a/src/main/java/net/montoyo/wd/block/KeyboardBlockRight.java b/src/main/java/net/montoyo/wd/block/KeyboardBlockRight.java index e28f7ef..169ed62 100644 --- a/src/main/java/net/montoyo/wd/block/KeyboardBlockRight.java +++ b/src/main/java/net/montoyo/wd/block/KeyboardBlockRight.java @@ -27,8 +27,8 @@ import net.montoyo.wd.entity.KeyboardBlockEntity; import net.montoyo.wd.item.ItemLinker; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.math.Vector3i; import org.jetbrains.annotations.NotNull; import static net.montoyo.wd.block.KeyboardBlockLeft.KEYBOARD_AABBS; diff --git a/src/main/java/net/montoyo/wd/block/ScreenBlock.java b/src/main/java/net/montoyo/wd/block/ScreenBlock.java index ef9809f..0e2064c 100644 --- a/src/main/java/net/montoyo/wd/block/ScreenBlock.java +++ b/src/main/java/net/montoyo/wd/block/ScreenBlock.java @@ -35,6 +35,11 @@ import net.montoyo.wd.data.SetURLData; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.item.ItemLaserPointer; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3f; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.serialization.Util; import org.jetbrains.annotations.NotNull; public class ScreenBlock extends BaseEntityBlock { diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 3d6ead5..4f37e44 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -75,6 +75,11 @@ import net.montoyo.wd.miniserv.client.Client; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageMinepadUrl; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import org.cef.CefSettings; import org.cef.browser.CefBrowser; import org.cef.browser.CefFrame; diff --git a/src/main/java/net/montoyo/wd/client/WDScheme.java b/src/main/java/net/montoyo/wd/client/WDScheme.java index 40caf0f..1956eed 100644 --- a/src/main/java/net/montoyo/wd/client/WDScheme.java +++ b/src/main/java/net/montoyo/wd/client/WDScheme.java @@ -8,7 +8,7 @@ import net.montoyo.wd.miniserv.Constants; import net.montoyo.wd.miniserv.client.Client; import net.montoyo.wd.miniserv.client.ClientTaskGetFile; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import org.cef.callback.CefCallback; import org.cef.handler.CefResourceHandler; import org.cef.misc.IntRef; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java index 2eff89d..04c1863 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java @@ -20,10 +20,10 @@ import net.montoyo.wd.client.gui.loading.FillControl; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.TypeData; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.TypeData; +import net.montoyo.wd.utilities.serialization.Util; import org.lwjgl.glfw.GLFW; import org.vivecraft.client_vr.gameplay.VRPlayer; import org.vivecraft.client_vr.gameplay.screenhandlers.KeyboardHandler; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java index f67dcb2..0e9ef15 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java @@ -4,7 +4,6 @@ package net.montoyo.wd.client.gui; -import com.cinemamod.mcef.MCEF; import com.cinemamod.mcef.MCEFBrowser; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; @@ -16,8 +15,7 @@ import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.ClientProxy; -import net.montoyo.wd.utilities.BlockSide; -import org.cef.browser.CefBrowserOsr; +import net.montoyo.wd.utilities.data.BlockSide; import org.cef.misc.CefCursorType; import org.lwjgl.glfw.GLFW; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java b/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java index 55cbe99..6275e3b 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java @@ -7,16 +7,11 @@ package net.montoyo.wd.client.gui; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.client.gui.controls.Button; import net.montoyo.wd.client.gui.controls.TextField; import net.montoyo.wd.client.gui.loading.FillControl; -import net.montoyo.wd.net.WDNetworkRegistry; -import net.montoyo.wd.net.server_bound.C2SMessageRedstoneCtrl; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Util; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.math.Vector3i; import javax.annotation.Nullable; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java index 29cd77a..bb7ca02 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java @@ -20,6 +20,10 @@ import net.montoyo.wd.item.WDItem; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import org.lwjgl.glfw.GLFW; import javax.annotation.Nullable; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java index 4a2e71c..dcbba35 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -23,9 +23,11 @@ import net.montoyo.wd.miniserv.Constants; import net.montoyo.wd.miniserv.client.*; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; +import net.montoyo.wd.utilities.serialization.Util; import org.lwjgl.glfw.GLFW; -import org.lwjgl.opengl.GL; -import org.lwjgl.opengl.GL11; import javax.annotation.Nullable; import javax.swing.filechooser.FileSystemView; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java index ce47fd9..c83ef41 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java @@ -20,9 +20,9 @@ import net.montoyo.wd.item.ItemMinePad2; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageMinepadUrl; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Util; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.serialization.Util; +import net.montoyo.wd.utilities.math.Vector3i; import java.io.IOException; import java.util.Map; diff --git a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java index 1a1740e..ee86c72 100644 --- a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java +++ b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java @@ -8,7 +8,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; @@ -27,6 +26,10 @@ import net.montoyo.wd.client.gui.loading.JsonOWrapper; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageACQuery; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.data.Bounds; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import javax.annotation.Nullable; import java.io.IOException; diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java index 1d973a1..c32ade0 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java @@ -14,20 +14,18 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.resources.language.I18n; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.WDScreen; import net.montoyo.wd.client.gui.loading.JsonOWrapper; -import net.montoyo.wd.utilities.Bounds; +import net.montoyo.wd.utilities.data.Bounds; import org.joml.Matrix4f; import java.util.Arrays; import static com.mojang.math.Axis.XP; -import static org.lwjgl.opengl.GL11.*; @OnlyIn(Dist.CLIENT) public abstract class Control { diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java index ce32abf..1f2460c 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java @@ -7,18 +7,14 @@ package net.montoyo.wd.client.gui.controls; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.montoyo.wd.client.gui.loading.JsonOWrapper; -import net.montoyo.wd.utilities.Bounds; -import org.lwjgl.opengl.GL11; +import net.montoyo.wd.utilities.data.Bounds; import java.util.Arrays; -import static org.lwjgl.opengl.GL11.*; - public class ControlGroup extends Container { private int width; diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/YTButton.java b/src/main/java/net/montoyo/wd/client/gui/controls/YTButton.java index 4852f2a..3d22159 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/YTButton.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/YTButton.java @@ -6,7 +6,7 @@ package net.montoyo.wd.client.gui.controls; import net.minecraft.network.chat.Component; import net.montoyo.wd.client.gui.loading.JsonOWrapper; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import net.montoyo.wd.utilities.VideoType; import java.net.MalformedURLException; diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java index 4a01654..5fa644a 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java @@ -19,9 +19,9 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelProperty; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Vector3f; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.math.Vector3f; +import net.montoyo.wd.utilities.math.Vector3i; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index 595bbcd..a527d02 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -12,8 +12,8 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.Vector3f; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.math.Vector3f; +import net.montoyo.wd.utilities.math.Vector3i; import org.jetbrains.annotations.NotNull; import static com.mojang.math.Axis.*; diff --git a/src/main/java/net/montoyo/wd/controls/ScreenControl.java b/src/main/java/net/montoyo/wd/controls/ScreenControl.java index 8cff930..ada2821 100644 --- a/src/main/java/net/montoyo/wd/controls/ScreenControl.java +++ b/src/main/java/net/montoyo/wd/controls/ScreenControl.java @@ -9,7 +9,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.Objects; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java index aae3347..11d82ed 100644 --- a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java +++ b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java @@ -9,7 +9,7 @@ import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.builtin.*; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Log; import java.lang.reflect.Method; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java b/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java index b79e579..35c9f3a 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/AutoVolumeControl.java @@ -10,7 +10,7 @@ import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java index 6366bc3..68e1ee4 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ClickControl.java @@ -9,8 +9,8 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Vector2i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.math.Vector2i; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java b/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java index e2730ff..b394a5f 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/JSRequestControl.java @@ -11,7 +11,7 @@ import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java b/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java index e96097c..42390d0 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/KeyTypedControl.java @@ -10,7 +10,7 @@ import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java b/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java index 5cbf78b..ac8c25a 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/LaserControl.java @@ -10,8 +10,8 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Vector2i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.math.Vector2i; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java index d8d9083..677e9db 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ManageRightsAndUpdgradesControl.java @@ -12,7 +12,7 @@ import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java index 89846cb..5926975 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ModifyFriendListControl.java @@ -11,8 +11,8 @@ import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.NameUUIDPair; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java b/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java index 1a96c9a..ab81be4 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/OwnerControl.java @@ -9,8 +9,8 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.NameUUIDPair; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java b/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java index 15d56ea..ed10ee6 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/ScreenModifyControl.java @@ -10,9 +10,9 @@ import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Rotation; -import net.montoyo.wd.utilities.Vector2i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.math.Vector2i; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java b/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java index 06f0628..04618dd 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/SetURLControl.java @@ -10,8 +10,8 @@ import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.math.Vector3i; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java index 99c3f77..3c442ec 100644 --- a/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java +++ b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java @@ -10,7 +10,7 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.controls.ScreenControl; import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.function.Function; diff --git a/src/main/java/net/montoyo/wd/core/IPeripheral.java b/src/main/java/net/montoyo/wd/core/IPeripheral.java index d7fe96b..fc06351 100644 --- a/src/main/java/net/montoyo/wd/core/IPeripheral.java +++ b/src/main/java/net/montoyo/wd/core/IPeripheral.java @@ -7,8 +7,8 @@ package net.montoyo.wd.core; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.montoyo.wd.utilities.BlockSide; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.math.Vector3i; public interface IPeripheral { boolean connect(Level world, BlockPos blockPos, BlockState blockState, Vector3i screenPos, BlockSide screenSide); diff --git a/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java b/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java index 97c1171..f18dc7a 100644 --- a/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java +++ b/src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java @@ -6,7 +6,7 @@ // //import net.montoyo.mcef.api.IJSQueryCallback; //import net.montoyo.wd.entity.TileEntityScreen; -//import net.montoyo.wd.utilities.BlockSide; +//import net.montoyo.wd.utilities.orientation.BlockSide; // //import javax.annotation.Nonnull; // diff --git a/src/main/java/net/montoyo/wd/core/IUpgrade.java b/src/main/java/net/montoyo/wd/core/IUpgrade.java index f54cff6..3524400 100644 --- a/src/main/java/net/montoyo/wd/core/IUpgrade.java +++ b/src/main/java/net/montoyo/wd/core/IUpgrade.java @@ -7,7 +7,7 @@ package net.montoyo.wd.core; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/src/main/java/net/montoyo/wd/core/JSServerRequest.java b/src/main/java/net/montoyo/wd/core/JSServerRequest.java index 5a67701..7ef36e7 100644 --- a/src/main/java/net/montoyo/wd/core/JSServerRequest.java +++ b/src/main/java/net/montoyo/wd/core/JSServerRequest.java @@ -5,7 +5,7 @@ package net.montoyo.wd.core; import net.minecraft.network.FriendlyByteBuf; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; public enum JSServerRequest { CLEAR_REDSTONE, diff --git a/src/main/java/net/montoyo/wd/data/KeyboardData.java b/src/main/java/net/montoyo/wd/data/KeyboardData.java index 24977b2..bcfda4e 100644 --- a/src/main/java/net/montoyo/wd/data/KeyboardData.java +++ b/src/main/java/net/montoyo/wd/data/KeyboardData.java @@ -13,9 +13,9 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiKeyboard; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.math.Vector3i; public class KeyboardData extends GuiData { public Vector3i pos; diff --git a/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java b/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java index c8df04e..d6f41f7 100644 --- a/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java +++ b/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java @@ -13,7 +13,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiRedstoneCtrl; import net.montoyo.wd.net.BufferUtils; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.math.Vector3i; public class RedstoneCtrlData extends GuiData { public ResourceLocation dimension; diff --git a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java index 916b74b..ae9e87f 100644 --- a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java +++ b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java @@ -17,10 +17,10 @@ import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageOpenGui; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.NameUUIDPair; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; +import net.montoyo.wd.utilities.math.Vector3i; public class ScreenConfigData extends GuiData { public boolean onlyUpdate; diff --git a/src/main/java/net/montoyo/wd/data/ServerData.java b/src/main/java/net/montoyo/wd/data/ServerData.java index 5eedb87..28a9da7 100644 --- a/src/main/java/net/montoyo/wd/data/ServerData.java +++ b/src/main/java/net/montoyo/wd/data/ServerData.java @@ -12,8 +12,8 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiServer; import net.montoyo.wd.net.BufferUtils; -import net.montoyo.wd.utilities.NameUUIDPair; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; +import net.montoyo.wd.utilities.math.Vector3i; public class ServerData extends GuiData { public Vector3i pos; diff --git a/src/main/java/net/montoyo/wd/data/SetURLData.java b/src/main/java/net/montoyo/wd/data/SetURLData.java index e6d8c2d..97f2e12 100644 --- a/src/main/java/net/montoyo/wd/data/SetURLData.java +++ b/src/main/java/net/montoyo/wd/data/SetURLData.java @@ -14,9 +14,9 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiSetURL2; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.math.Vector3i; public class SetURLData extends GuiData { public Vector3i pos; diff --git a/src/main/java/net/montoyo/wd/entity/AbstractInterfaceBlockEntity.java b/src/main/java/net/montoyo/wd/entity/AbstractInterfaceBlockEntity.java index 7869ceb..2f6f524 100644 --- a/src/main/java/net/montoyo/wd/entity/AbstractInterfaceBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/AbstractInterfaceBlockEntity.java @@ -13,7 +13,11 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.core.IComputerArgs; import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; +import net.montoyo.wd.utilities.serialization.TypeData; +import net.montoyo.wd.utilities.serialization.Util; import java.io.IOException; import java.lang.annotation.ElementType; diff --git a/src/main/java/net/montoyo/wd/entity/AbstractPeripheralBlockEntity.java b/src/main/java/net/montoyo/wd/entity/AbstractPeripheralBlockEntity.java index 0c8c94a..d3f3ab1 100644 --- a/src/main/java/net/montoyo/wd/entity/AbstractPeripheralBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/AbstractPeripheralBlockEntity.java @@ -16,9 +16,9 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; import net.montoyo.wd.core.IPeripheral; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.math.Vector3i; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/src/main/java/net/montoyo/wd/entity/KeyboardBlockEntity.java b/src/main/java/net/montoyo/wd/entity/KeyboardBlockEntity.java index 40cf24d..a01ce20 100644 --- a/src/main/java/net/montoyo/wd/entity/KeyboardBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/KeyboardBlockEntity.java @@ -16,7 +16,7 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.KeyboardData; import net.montoyo.wd.registry.TileRegistry; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; public class KeyboardBlockEntity extends AbstractPeripheralBlockEntity { private static final String RANDOM_CHARS = "AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789"; //Yes I have an AZERTY keyboard, u care? diff --git a/src/main/java/net/montoyo/wd/entity/RedstoneControlBlockEntity.java b/src/main/java/net/montoyo/wd/entity/RedstoneControlBlockEntity.java index df1ebe8..45ec633 100644 --- a/src/main/java/net/montoyo/wd/entity/RedstoneControlBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/RedstoneControlBlockEntity.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.RedstoneCtrlData; import net.montoyo.wd.registry.TileRegistry; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import java.io.IOException; diff --git a/src/main/java/net/montoyo/wd/entity/RemoteControlBlockEntity.java b/src/main/java/net/montoyo/wd/entity/RemoteControlBlockEntity.java index bfc0c2a..4b6ef8e 100644 --- a/src/main/java/net/montoyo/wd/entity/RemoteControlBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/RemoteControlBlockEntity.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.SetURLData; import net.montoyo.wd.registry.TileRegistry; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; public class RemoteControlBlockEntity extends AbstractPeripheralBlockEntity { public RemoteControlBlockEntity(BlockPos arg2, BlockState arg3) { diff --git a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java index 6da5cbf..8524ff8 100644 --- a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java @@ -41,6 +41,14 @@ import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageAddScreen; import net.montoyo.wd.net.client_bound.S2CMessageScreenUpdate; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.MutableAABB; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3f; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; +import net.montoyo.wd.utilities.serialization.TypeData; import org.cef.browser.CefBrowser; import javax.annotation.Nonnull; @@ -196,6 +204,7 @@ public class ScreenBlockEntity extends BlockEntity { final Direction facing = VALUES[side.reverse().ordinal()]; final ScreenIterator it = new ScreenIterator(start, side, size); + // TODO: cache chunk while (it.hasNext()) { int idx = it.getIndex(); redstoneStatus.set(idx, world.getSignal(it.next(), facing)); @@ -246,6 +255,7 @@ public class ScreenBlockEntity extends BlockEntity { if (scr != null) { ScreenIterator it = new ScreenIterator(getBlockPos(), side, scr.size); + // TODO: cache chunk while (it.hasNext()) func.accept(it.next()); } diff --git a/src/main/java/net/montoyo/wd/entity/ServerBlockEntity.java b/src/main/java/net/montoyo/wd/entity/ServerBlockEntity.java index 3479935..834ff1a 100644 --- a/src/main/java/net/montoyo/wd/entity/ServerBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/ServerBlockEntity.java @@ -13,8 +13,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.data.ServerData; import net.montoyo.wd.registry.TileRegistry; -import net.montoyo.wd.utilities.NameUUIDPair; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; +import net.montoyo.wd.utilities.serialization.Util; public class ServerBlockEntity extends BlockEntity { private NameUUIDPair owner; diff --git a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java index f97f5dd..6d4875f 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java +++ b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java @@ -20,10 +20,10 @@ import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.registry.BlockRegistry; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Multiblock; -import net.montoyo.wd.utilities.Vector2i; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/src/main/java/net/montoyo/wd/item/ItemLinker.java b/src/main/java/net/montoyo/wd/item/ItemLinker.java index 91defbe..5d04a95 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLinker.java +++ b/src/main/java/net/montoyo/wd/item/ItemLinker.java @@ -18,10 +18,10 @@ import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.core.IPeripheral; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Multiblock; -import net.montoyo.wd.utilities.Util; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.serialization.Util; +import net.montoyo.wd.utilities.math.Vector3i; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java index 95935e6..34f0c87 100644 --- a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java +++ b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java @@ -16,6 +16,9 @@ import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.config.CommonConfig; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.serialization.Util; import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; diff --git a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java index 66991ed..a76459c 100644 --- a/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java +++ b/src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java @@ -13,10 +13,10 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.data.ScreenConfigData; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.Multiblock; -import net.montoyo.wd.utilities.Util; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.serialization.Util; +import net.montoyo.wd.utilities.math.Vector3i; import org.jetbrains.annotations.NotNull; public class ItemScreenConfigurator extends Item implements WDItem { diff --git a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java index 291a7f8..29147c6 100644 --- a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java +++ b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.entity.ScreenBlockEntity; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; diff --git a/src/main/java/net/montoyo/wd/miniserv/client/Client.java b/src/main/java/net/montoyo/wd/miniserv/client/Client.java index 021d175..fb2669e 100644 --- a/src/main/java/net/montoyo/wd/miniserv/client/Client.java +++ b/src/main/java/net/montoyo/wd/miniserv/client/Client.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.player.Player; import net.montoyo.wd.miniserv.*; import net.montoyo.wd.net.server_bound.C2SMessageMiniservConnect; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; diff --git a/src/main/java/net/montoyo/wd/miniserv/client/ClientTaskUploadFile.java b/src/main/java/net/montoyo/wd/miniserv/client/ClientTaskUploadFile.java index c214e07..e2f026d 100644 --- a/src/main/java/net/montoyo/wd/miniserv/client/ClientTaskUploadFile.java +++ b/src/main/java/net/montoyo/wd/miniserv/client/ClientTaskUploadFile.java @@ -8,7 +8,7 @@ import net.montoyo.wd.miniserv.Constants; import net.montoyo.wd.miniserv.OutgoingPacket; import net.montoyo.wd.miniserv.PacketID; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/net/montoyo/wd/miniserv/server/Server.java b/src/main/java/net/montoyo/wd/miniserv/server/Server.java index 7a2a95f..9a3e4d0 100644 --- a/src/main/java/net/montoyo/wd/miniserv/server/Server.java +++ b/src/main/java/net/montoyo/wd/miniserv/server/Server.java @@ -6,7 +6,7 @@ package net.montoyo.wd.miniserv.server; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import java.io.File; import java.io.IOException; diff --git a/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java b/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java index b4de508..ca27c27 100644 --- a/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java +++ b/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java @@ -6,7 +6,7 @@ package net.montoyo.wd.miniserv.server; import net.montoyo.wd.miniserv.*; import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.serialization.Util; import java.io.*; import java.nio.channels.ClosedChannelException; diff --git a/src/main/java/net/montoyo/wd/net/BufferUtils.java b/src/main/java/net/montoyo/wd/net/BufferUtils.java index cb10fe0..db68a37 100644 --- a/src/main/java/net/montoyo/wd/net/BufferUtils.java +++ b/src/main/java/net/montoyo/wd/net/BufferUtils.java @@ -1,7 +1,7 @@ package net.montoyo.wd.net; import net.minecraft.network.FriendlyByteBuf; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.math.Vector3i; import java.util.Arrays; import java.util.function.Consumer; diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageACResult.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageACResult.java index e54f152..d6c406f 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageACResult.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageACResult.java @@ -8,7 +8,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.net.Packet; -import net.montoyo.wd.utilities.NameUUIDPair; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; public class S2CMessageACResult extends Packet { private static NameUUIDPair[] result; diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java index cbd4006..b56a21b 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java @@ -13,6 +13,11 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java index 761b541..9d253c2 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java @@ -9,7 +9,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.net.Packet; -import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.Arrays; diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java index b4c2f88..e1317bc 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java @@ -17,7 +17,11 @@ import net.montoyo.wd.controls.builtin.*; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.net.Packet; -import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; // TODO: use registry based approach public class S2CMessageScreenUpdate extends Packet { diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java index 082ec6e..7041176 100644 --- a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java @@ -13,7 +13,7 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.net.Packet; import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.client_bound.S2CMessageACResult; -import net.montoyo.wd.utilities.NameUUIDPair; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; import java.util.Arrays; diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java index ac9c073..1143120 100644 --- a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java @@ -15,8 +15,8 @@ import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.RedstoneControlBlockEntity; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.Packet; -import net.montoyo.wd.utilities.Util; -import net.montoyo.wd.utilities.Vector3i; +import net.montoyo.wd.utilities.serialization.Util; +import net.montoyo.wd.utilities.math.Vector3i; public class C2SMessageRedstoneCtrl extends Packet implements Runnable { private Player player; diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java index 9b224e4..1c9001c 100644 --- a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java @@ -20,7 +20,11 @@ import net.montoyo.wd.core.MissingPermissionException; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.net.Packet; -import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; +import net.montoyo.wd.utilities.serialization.NameUUIDPair; // TODO: this is a mess; a registry based approach would likely be more readable public class C2SMessageScreenCtrl extends Packet { diff --git a/src/main/java/net/montoyo/wd/utilities/Multiblock.java b/src/main/java/net/montoyo/wd/utilities/Multiblock.java index 2fa8c94..8bef699 100644 --- a/src/main/java/net/montoyo/wd/utilities/Multiblock.java +++ b/src/main/java/net/montoyo/wd/utilities/Multiblock.java @@ -7,9 +7,11 @@ package net.montoyo.wd.utilities; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; import net.montoyo.wd.registry.BlockRegistry; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; public abstract class Multiblock { - public enum OverrideAction { NONE, SIMULATE, @@ -26,9 +28,9 @@ public abstract class Multiblock { } public boolean apply(Vector3i bp, boolean originalResult) { - if(action == OverrideAction.NONE || !bp.equals(pos)) + if (action == OverrideAction.NONE || !bp.equals(pos)) return originalResult; - else if(action == OverrideAction.SIMULATE) + else if (action == OverrideAction.SIMULATE) return true; else //action == OverrideAction.IGNORE return false; @@ -39,9 +41,8 @@ public abstract class Multiblock { public static final BlockOverride NULL_OVERRIDE = new BlockOverride(null, OverrideAction.NONE); //Modifies pos - public static void findOrigin(LevelAccessor world, Vector3i pos, BlockSide side, BlockOverride override) - { - if(override == null) + public static void findOrigin(LevelAccessor world, Vector3i pos, BlockSide side, BlockOverride override) { + if (override == null) override = NULL_OVERRIDE; BlockPos.MutableBlockPos bp = new BlockPos.MutableBlockPos(); @@ -50,7 +51,7 @@ public abstract class Multiblock { do { pos.add(side.left); pos.toBlock(bp); - } while(override.apply(pos, world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())); + } while (override.apply(pos, world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())); pos.add(side.right); @@ -58,14 +59,13 @@ public abstract class Multiblock { do { pos.add(side.down); pos.toBlock(bp); - } while(override.apply(pos, world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())); + } while (override.apply(pos, world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())); pos.add(side.up); } //Origin stays constant - public static Vector2i measure(LevelAccessor world, Vector3i origin, BlockSide side) - { + public static Vector2i measure(LevelAccessor world, Vector3i origin, BlockSide side) { Vector2i ret = new Vector2i(); Vector3i pos = origin.clone(); @@ -77,7 +77,7 @@ public abstract class Multiblock { pos.add(side.up); pos.toBlock(bp); ret.y++; - } while(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()); + } while (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()); pos.add(side.down); @@ -86,33 +86,32 @@ public abstract class Multiblock { pos.add(side.right); pos.toBlock(bp); ret.x++; - } while(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()); + } while (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()); return ret; } //Origin and size stays constant. //Returns null if structure is okay, otherwise the erroring block pos. - public static Vector3i check(LevelAccessor world, Vector3i origin, Vector2i size, BlockSide side) - { + public static Vector3i check(LevelAccessor world, Vector3i origin, Vector2i size, BlockSide side) { Vector3i pos = origin.clone(); BlockPos.MutableBlockPos bp = new BlockPos.MutableBlockPos(); //Check inner - for(int y = 0; y < size.y; y++) { - for(int x = 0; x < size.x; x++) { + for (int y = 0; y < size.y; y++) { + for (int x = 0; x < size.x; x++) { pos.toBlock(bp); - if(!(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())) + if (!(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get())) return pos; //Hole pos.add(side.forward); pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) + if (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Back should be empty pos.addMul(side.backward, 2); pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) + if (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Front should be empty pos.add(side.forward); @@ -127,9 +126,9 @@ public abstract class Multiblock { pos.set(origin); pos.add(side.left); - for(int y = 0; y < size.y; y++) { + for (int y = 0; y < size.y; y++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) + if (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.up); @@ -139,9 +138,9 @@ public abstract class Multiblock { pos.set(origin); pos.addMul(side.right, size.x); - for(int y = 0; y < size.y; y++) { + for (int y = 0; y < size.y; y++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) + if (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.up); @@ -151,9 +150,9 @@ public abstract class Multiblock { pos.set(origin); pos.add(side.down); - for(int x = 0; x < size.x; x++) { + for (int x = 0; x < size.x; x++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) + if (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.right); @@ -163,9 +162,9 @@ public abstract class Multiblock { pos.set(origin); pos.addMul(side.up, size.y); - for(int x = 0; x < size.x; x++) { + for (int x = 0; x < size.x; x++) { pos.toBlock(bp); - if(world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) + if (world.getBlockState(bp).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) return pos; //Left edge should be empty pos.add(side.right); @@ -174,5 +173,4 @@ public abstract class Multiblock { //All good. return null; } - } diff --git a/src/main/java/net/montoyo/wd/utilities/NibbleArray.java b/src/main/java/net/montoyo/wd/utilities/NibbleArray.java index c6bd33d..000f3a3 100644 --- a/src/main/java/net/montoyo/wd/utilities/NibbleArray.java +++ b/src/main/java/net/montoyo/wd/utilities/NibbleArray.java @@ -18,14 +18,14 @@ public final class NibbleArray { data = d; } - public final int get(int idx) { + public int get(int idx) { if ((idx & 1) == 0) return (data[idx >> 1] >> 4) & 0x0F; //MSB else return data[idx >> 1] & 0x0F; //LSB } - public final void set(int idx, int val) { + public void set(int idx, int val) { val &= 0x0F; if ((idx & 1) == 0) { diff --git a/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java b/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java index fcedc1a..b26d77b 100644 --- a/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java +++ b/src/main/java/net/montoyo/wd/utilities/ScreenIterator.java @@ -5,12 +5,14 @@ package net.montoyo.wd.utilities; import net.minecraft.core.BlockPos; +import net.montoyo.wd.utilities.math.Vector2i; +import net.montoyo.wd.utilities.math.Vector3i; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.Iterator; public final class ScreenIterator implements Iterator { - private final Vector3i vec1; - private final Vector3i vec2; + private final Vector3i from, to; private final BlockSide side; private final Vector2i size; private final BlockPos.MutableBlockPos blockPos; @@ -19,31 +21,31 @@ public final class ScreenIterator implements Iterator { private boolean hasNext = true; public ScreenIterator(BlockPos pos, BlockSide side, Vector2i size) { - vec1 = new Vector3i(pos); - vec2 = vec1.clone(); + from = new Vector3i(pos); + to = from.clone(); this.side = side; this.size = size; blockPos = new BlockPos.MutableBlockPos(); } @Override - public final boolean hasNext() { + public boolean hasNext() { return hasNext; } @Override - public final BlockPos next() { - vec2.toBlock(blockPos); + public BlockPos next() { + to.toBlock(blockPos); if (++x >= size.x) { if (++y >= size.y) hasNext = false; else { x = 0; - vec2.set(vec1.add(side.up)); + to.set(from.add(side.up)); } } else - vec2.add(side.right); + to.add(side.right); return blockPos; } diff --git a/src/main/java/net/montoyo/wd/utilities/BlockSide.java b/src/main/java/net/montoyo/wd/utilities/data/BlockSide.java similarity index 94% rename from src/main/java/net/montoyo/wd/utilities/BlockSide.java rename to src/main/java/net/montoyo/wd/utilities/data/BlockSide.java index ce5feb0..cc8088f 100644 --- a/src/main/java/net/montoyo/wd/utilities/BlockSide.java +++ b/src/main/java/net/montoyo/wd/utilities/data/BlockSide.java @@ -2,7 +2,9 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.data; + +import net.montoyo.wd.utilities.math.Vector3i; public enum BlockSide { BOTTOM(new Vector3i(0, 0, -1), new Vector3i(1, 0, 0), new Vector3i(0, -1, 0)), diff --git a/src/main/java/net/montoyo/wd/utilities/Bounds.java b/src/main/java/net/montoyo/wd/utilities/data/Bounds.java similarity index 92% rename from src/main/java/net/montoyo/wd/utilities/Bounds.java rename to src/main/java/net/montoyo/wd/utilities/data/Bounds.java index 85de36d..ef8a792 100644 --- a/src/main/java/net/montoyo/wd/utilities/Bounds.java +++ b/src/main/java/net/montoyo/wd/utilities/data/Bounds.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.data; public final class Bounds { public final int minX; diff --git a/src/main/java/net/montoyo/wd/utilities/Rotation.java b/src/main/java/net/montoyo/wd/utilities/data/Rotation.java similarity index 92% rename from src/main/java/net/montoyo/wd/utilities/Rotation.java rename to src/main/java/net/montoyo/wd/utilities/data/Rotation.java index 3447403..8f65730 100644 --- a/src/main/java/net/montoyo/wd/utilities/Rotation.java +++ b/src/main/java/net/montoyo/wd/utilities/data/Rotation.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.data; public enum Rotation { ROT_0(0.0f, false), diff --git a/src/main/java/net/montoyo/wd/utilities/MutableAABB.java b/src/main/java/net/montoyo/wd/utilities/math/MutableAABB.java similarity index 98% rename from src/main/java/net/montoyo/wd/utilities/MutableAABB.java rename to src/main/java/net/montoyo/wd/utilities/math/MutableAABB.java index 6996726..55328cd 100644 --- a/src/main/java/net/montoyo/wd/utilities/MutableAABB.java +++ b/src/main/java/net/montoyo/wd/utilities/math/MutableAABB.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.math; import net.minecraft.world.phys.AABB; diff --git a/src/main/java/net/montoyo/wd/utilities/Vector2i.java b/src/main/java/net/montoyo/wd/utilities/math/Vector2i.java similarity index 93% rename from src/main/java/net/montoyo/wd/utilities/Vector2i.java rename to src/main/java/net/montoyo/wd/utilities/math/Vector2i.java index f7f3171..1614863 100644 --- a/src/main/java/net/montoyo/wd/utilities/Vector2i.java +++ b/src/main/java/net/montoyo/wd/utilities/math/Vector2i.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.math; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/net/montoyo/wd/utilities/Vector3f.java b/src/main/java/net/montoyo/wd/utilities/math/Vector3f.java similarity index 98% rename from src/main/java/net/montoyo/wd/utilities/Vector3f.java rename to src/main/java/net/montoyo/wd/utilities/math/Vector3f.java index be7d32a..938a96f 100644 --- a/src/main/java/net/montoyo/wd/utilities/Vector3f.java +++ b/src/main/java/net/montoyo/wd/utilities/math/Vector3f.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.math; public final class Vector3f { public float x; diff --git a/src/main/java/net/montoyo/wd/utilities/Vector3i.java b/src/main/java/net/montoyo/wd/utilities/math/Vector3i.java similarity index 99% rename from src/main/java/net/montoyo/wd/utilities/Vector3i.java rename to src/main/java/net/montoyo/wd/utilities/math/Vector3i.java index 9539ea2..92037da 100644 --- a/src/main/java/net/montoyo/wd/utilities/Vector3i.java +++ b/src/main/java/net/montoyo/wd/utilities/math/Vector3i.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.math; import io.netty.buffer.ByteBuf; import net.minecraft.core.BlockPos; diff --git a/src/main/java/net/montoyo/wd/utilities/DontSerialize.java b/src/main/java/net/montoyo/wd/utilities/serialization/DontSerialize.java similarity index 86% rename from src/main/java/net/montoyo/wd/utilities/DontSerialize.java rename to src/main/java/net/montoyo/wd/utilities/serialization/DontSerialize.java index 6191c80..ec66310 100644 --- a/src/main/java/net/montoyo/wd/utilities/DontSerialize.java +++ b/src/main/java/net/montoyo/wd/utilities/serialization/DontSerialize.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.serialization; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java b/src/main/java/net/montoyo/wd/utilities/serialization/NameUUIDPair.java similarity index 95% rename from src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java rename to src/main/java/net/montoyo/wd/utilities/serialization/NameUUIDPair.java index 25ecba1..9686ab6 100644 --- a/src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java +++ b/src/main/java/net/montoyo/wd/utilities/serialization/NameUUIDPair.java @@ -2,10 +2,9 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.serialization; import com.mojang.authlib.GameProfile; -import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; diff --git a/src/main/java/net/montoyo/wd/utilities/TypeData.java b/src/main/java/net/montoyo/wd/utilities/serialization/TypeData.java similarity index 95% rename from src/main/java/net/montoyo/wd/utilities/TypeData.java rename to src/main/java/net/montoyo/wd/utilities/serialization/TypeData.java index cdf5f74..212439d 100644 --- a/src/main/java/net/montoyo/wd/utilities/TypeData.java +++ b/src/main/java/net/montoyo/wd/utilities/serialization/TypeData.java @@ -2,7 +2,7 @@ * Copyright (C) 2019 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.serialization; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/net/montoyo/wd/utilities/Util.java b/src/main/java/net/montoyo/wd/utilities/serialization/Util.java similarity index 99% rename from src/main/java/net/montoyo/wd/utilities/Util.java rename to src/main/java/net/montoyo/wd/utilities/serialization/Util.java index 4c0d3a6..6db86e8 100644 --- a/src/main/java/net/montoyo/wd/utilities/Util.java +++ b/src/main/java/net/montoyo/wd/utilities/serialization/Util.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.utilities; +package net.montoyo.wd.utilities.serialization; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; From 296947079699eaa7104db300f3bf75348e10ef74 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:09:32 -0600 Subject: [PATCH 09/15] Update mods.toml --- src/main/resources/META-INF/mods.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 29a061b..ab12040 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -2,7 +2,7 @@ modLoader="javafml" #mandatory loaderVersion="[43,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. -license="Public Domain" +license="MIT" issueTrackerURL="" #optional @@ -10,17 +10,17 @@ issueTrackerURL="" #optional modId="webdisplays" #mandatory -version="1.3.3" #mandatory +version="2.0.0-1.20.1" #mandatory displayName="WebDisplays" #mandatory -displayURL="https://github.com/Mysticpasta1/webdisplays" #optional +displayURL="https://github.com/CinemaMod/webdisplays" #optional logoFile= "" #optional credits="" #optional -authors="Mysticpasta1, WaterPicker, Montoyo, GiantLuigi4" #optional +authors="GiantLuigi4, ds58, Mysticpasta1, montoyo, WaterPicker" #optional description=''' ''' From dbd8fba6831778250c1673e090350617f7b391ae Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:31:09 -0600 Subject: [PATCH 10/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 64f334a..b033d56 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # WebDisplays WebDisplays is a mod for creating and interacting with web browsers in Minecraft. You can create screens in your world and browse the internet. -WebDisplay was originally written by montoyo. It is currently maintained by CinemaMod Group. +WebDisplays was originally written by montoyo. It is currently maintained by CinemaMod Group. Download WebDisplays from either: - CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/webdisplays From 0bc5b3b67d5bda9c27df8f59b9f7b26882f7c420 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:36:14 -0600 Subject: [PATCH 11/15] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b033d56..af0d81a 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ WebDisplays is a mod for creating and interacting with web browsers in Minecraft WebDisplays was originally written by montoyo. It is currently maintained by CinemaMod Group. +Discussion: https://discord.gg/rNrh5kW8Ty + Download WebDisplays from either: - CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/webdisplays - Modrinth: TODO From 5b37a39dbc9b2f10fd85d6520e5e8e383884bae8 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:36:42 -0600 Subject: [PATCH 12/15] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index af0d81a..acd5ec4 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ WebDisplays was originally written by montoyo. It is currently maintained by Cin Discussion: https://discord.gg/rNrh5kW8Ty +## Install Download WebDisplays from either: - CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/webdisplays - Modrinth: TODO From 1de20710fe11f96525bff9f96092006a36a58d30 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Sat, 11 Nov 2023 15:44:22 -0600 Subject: [PATCH 13/15] Fix mcef dependency version in mods.toml --- src/main/resources/META-INF/mods.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index ab12040..1f95436 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -42,6 +42,6 @@ side="BOTH" [[dependencies.webdisplays]] modId="mcef" mandatory=true -versionRange="[1.20.1-2.4.17, )" +versionRange="[2.0.0+1.20.1, )" ordering="NONE" side="BOTH" From 639fdefccea4d1c72567466ed3a9bd44d0170de1 Mon Sep 17 00:00:00 2001 From: ds58 <30220598+ds58@users.noreply.github.com> Date: Sat, 11 Nov 2023 15:44:59 -0600 Subject: [PATCH 14/15] 2.0.1-1.20.1 --- gradle.properties | 2 +- src/main/resources/META-INF/mods.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 47c8dda..959d7a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Done to increase the memory available to gradle. org.gradle.jvmargs = -Xmx3G -mod_version = 2.0.0-1.20.1 +mod_version = 2.0.1-1.20.1 maven_group = com.cinemamod archives_base_name = webdisplays \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 1f95436..fac3519 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -10,7 +10,7 @@ issueTrackerURL="" #optional modId="webdisplays" #mandatory -version="2.0.0-1.20.1" #mandatory +version="2.0.1-1.20.1" #mandatory displayName="WebDisplays" #mandatory From 92bd6924b0d58a1227d11717288be2f7143811e8 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:59:15 -0500 Subject: [PATCH 15/15] undo cleanup of mouse handling, because it did not work --- .../java/net/montoyo/wd/block/ScreenBlock.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/montoyo/wd/block/ScreenBlock.java b/src/main/java/net/montoyo/wd/block/ScreenBlock.java index 0e2064c..9c34fbb 100644 --- a/src/main/java/net/montoyo/wd/block/ScreenBlock.java +++ b/src/main/java/net/montoyo/wd/block/ScreenBlock.java @@ -200,15 +200,21 @@ public class ScreenBlock extends BaseEntityBlock { } public static boolean hit2pixels(BlockSide side, BlockPos bpos, Vector3i pos, ScreenBlockEntity.Screen scr, float hitX, float hitY, float hitZ, Vector2i dst) { + if(side.right.x < 0) + hitX -= 1.f; + + if(side.right.z < 0 || side == BlockSide.TOP || side == BlockSide.BOTTOM) + hitZ -= 1.f; + Vector3f rel = new Vector3f(hitX, hitY, hitZ); - // how these dot products come in is beyond me - float cx = rel.dot(side.horizontal.toFloat()) - 2.f / 16.f; - float cy = rel.dot(side.vertical.toFloat()) - 2.f / 16.f; + float cx = rel.dot(side.right.toFloat()) - 2.f / 16.f; + float cy = rel.dot(side.up.toFloat()) - 2.f / 16.f; + float sw = ((float) scr.size.x) - 4.f / 16.f; + float sh = ((float) scr.size.y) - 4.f / 16.f; - // scale coordinate to be in the size mcef expects (0 -> 1) - cx /= ((float) scr.size.x) - 4.f / 16.f; - cy /= ((float) scr.size.y) - 4.f / 16.f; + cx /= sw; + cy /= sh; if (cx >= 0.f && cx <= 1.0 && cy >= 0.f && cy <= 1.f) { if (side != BlockSide.BOTTOM)