From e30f2a86f0724b4362677250a492d6bc2c700509 Mon Sep 17 00:00:00 2001 From: Nikita Savyolov Date: Fri, 1 Oct 2021 00:02:52 +0300 Subject: [PATCH] fix: advanced turtle gui interactive and correct turtles tick calling --- .../computercraft/client/gui/GuiTurtle.java | 5 -- .../client/gui/widgets/WidgetTerminal.java | 33 +++++------ .../computer/blocks/BlockComputerBase.java | 2 +- .../computer/blocks/TileComputerBase.java | 55 +++++++++---------- .../shared/turtle/blocks/BlockTurtle.java | 10 ++-- .../shared/turtle/blocks/TileTurtle.java | 28 +++++----- .../shared/turtle/core/TurtleBrain.java | 13 ++--- .../turtle/inventory/ContainerTurtle.java | 10 ---- 8 files changed, 65 insertions(+), 91 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java index e6517ff7d..acbc78776 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java @@ -40,11 +40,6 @@ public class GuiTurtle extends ComputerScreenBase backgroundHeight = TEX_HEIGHT; } - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - System.out.println(mouseX + " " + mouseY + " " + button); - return super.mouseClicked(mouseX, mouseY, button); - } @Override protected WidgetTerminal createTerminal() diff --git a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java index 85e308f02..4da351774 100644 --- a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java +++ b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java @@ -65,14 +65,16 @@ public class WidgetTerminal extends ClickableWidget { innerHeight = termHeight * FONT_HEIGHT; } + private boolean inTermRegion( double mouseX, double mouseY ) + { + return active && visible && mouseX >= innerX && mouseY >= innerY && mouseX < innerX + innerWidth && mouseY < innerY + innerHeight; + } + @Override public boolean mouseClicked( double mouseX, double mouseY, int button ) { - ClientComputer computer = this.computer; - if( computer == null || !computer.isColour() || button < 0 || button > 2 ) - { - return false; - } + if( !inTermRegion( mouseX, mouseY ) ) return false; + if( !computer.isColour() || button < 0 || button > 2 ) return false; Terminal term = computer.getTerminal(); if( term != null ) @@ -95,11 +97,8 @@ public class WidgetTerminal extends ClickableWidget { @Override public boolean mouseReleased( double mouseX, double mouseY, int button ) { - ClientComputer computer = this.computer; - if( computer == null || !computer.isColour() || button < 0 || button > 2 ) - { - return false; - } + if( !inTermRegion( mouseX, mouseY ) ) return false; + if( !computer.isColour() || button < 0 || button > 2 ) return false; Terminal term = computer.getTerminal(); if( term != null ) @@ -125,11 +124,8 @@ public class WidgetTerminal extends ClickableWidget { @Override public boolean mouseDragged( double mouseX, double mouseY, int button, double v2, double v3 ) { - ClientComputer computer = this.computer; - if( computer == null || !computer.isColour() || button < 0 || button > 2 ) - { - return false; - } + if( !inTermRegion( mouseX, mouseY ) ) return false; + if( !computer.isColour() || button < 0 || button > 2 ) return false; Terminal term = computer.getTerminal(); if( term != null ) @@ -153,11 +149,8 @@ public class WidgetTerminal extends ClickableWidget { @Override public boolean mouseScrolled( double mouseX, double mouseY, double delta ) { - ClientComputer computer = this.computer; - if( computer == null || !computer.isColour() || delta == 0 ) - { - return false; - } + if( !inTermRegion( mouseX, mouseY ) ) return false; + if( !computer.isColour() || delta == 0 ) return false; Terminal term = computer.getTerminal(); if( term != null ) diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java index 0f0dd0149..c9b293e70 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java @@ -221,7 +221,7 @@ public abstract class BlockComputerBase extends Bloc public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { return world.isClient ? null : (world1, pos, state1, tile) -> { if (tile instanceof TileComputerBase computer) { - TileComputerBase.tick(world1, pos, state1, computer); + computer.serverTick(); } }; } diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java index 549f56b47..dcbed59cd 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java @@ -271,43 +271,40 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT } } - public static void tick( World world, BlockPos pos, BlockState state, TileComputerBase tileComputerBase ) + public void serverTick() { - if( !world.isClient ) + ServerComputer computer = createServerComputer(); + if( computer == null ) { - ServerComputer computer = tileComputerBase.createServerComputer(); - if( computer == null ) - { - return; - } + return; + } - // If the computer isn't on and should be, then turn it on - if( tileComputerBase.startOn || (tileComputerBase.fresh && tileComputerBase.on) ) - { - computer.turnOn(); - tileComputerBase.startOn = false; - } + // If the computer isn't on and should be, then turn it on + if( startOn || (fresh && on) ) + { + computer.turnOn(); + startOn = false; + } - computer.keepAlive(); + computer.keepAlive(); - tileComputerBase.fresh = false; - tileComputerBase.computerID = computer.getID(); - tileComputerBase.label = computer.getLabel(); - tileComputerBase.on = computer.isOn(); + fresh = false; + computerID = computer.getID(); + label = computer.getLabel(); + on = computer.isOn(); - if( computer.hasOutputChanged() ) - { - tileComputerBase.updateOutput(); - } + if( computer.hasOutputChanged() ) + { + updateOutput(); + } - // Update the block state if needed. We don't fire a block update intentionally, - // as this only really is needed on the client side. - tileComputerBase.updateBlockState( computer.getState() ); + // Update the block state if needed. We don't fire a block update intentionally, + // as this only really is needed on the client side. + updateBlockState( computer.getState() ); - if( computer.hasOutputChanged() ) - { - tileComputerBase.updateOutput(); - } + if( computer.hasOutputChanged() ) + { + updateOutput(); } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java index 0ee58fea5..d2e378c6e 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java @@ -196,9 +196,9 @@ public class BlockTurtle extends BlockComputerBase implements Waterl return new TileTurtle(getTypeByFamily(getFamily()), pos, state, getFamily()); } -// @Nullable -// @Override -// public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type){ -// return world.isClient ? BlockTurtle.checkType( type, getTypeByFamily(getFamily()), TileTurtle::tick ) : super.getTicker(world, state, type); -// } + @Nullable + @Override + public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type){ + return world.isClient ? BlockTurtle.checkType( type, getTypeByFamily(getFamily()), ( world1, pos, state1, computer ) -> computer.clientTick() ) : super.getTicker(world, state, type); + } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java index 57679c5dc..94eac31ce 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java @@ -12,6 +12,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.core.computer.ComputerSide; +import dan200.computercraft.fabric.mixin.MixinBlockEntity; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.computer.blocks.ComputerProxy; @@ -256,10 +257,6 @@ public class TileTurtle extends TileComputerBase return super.onActivate( player, hand, hit ); } -// public void setBlockPos( BlockPos pos ) { -// ((MixinBlockEntity) (Object) this).setBlockPos(pos); // FIXME this looks really bad. -// } - @Override public void onNeighbourChange( @Nonnull BlockPos neighbour ) { @@ -278,26 +275,32 @@ public class TileTurtle extends TileComputerBase } } - public static void tick( World world, BlockPos pos, BlockState state, - TileTurtle tileTurtle ) + @Override + public void serverTick( ) { - tileTurtle.brain.update(); - if( !world.isClient && tileTurtle.inventoryChanged ) + super.serverTick(); + brain.update(); + if( inventoryChanged ) { - ServerComputer computer = tileTurtle.getServerComputer(); + ServerComputer computer = getServerComputer(); if( computer != null ) { computer.queueEvent( "turtle_inventory" ); } - tileTurtle.inventoryChanged = false; - for( int n = 0; n < tileTurtle.size(); n++ ) + inventoryChanged = false; + for( int n = 0; n < size(); n++ ) { - tileTurtle.previousInventory.set( n, tileTurtle.getStack( n ).copy() ); + previousInventory.set( n, getStack( n ).copy() ); } } } + protected void clientTick() + { + brain.update(); + } + @Override protected void updateBlockState( ComputerState newState ) {} @@ -564,7 +567,6 @@ public class TileTurtle extends TileComputerBase public ScreenHandler createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity player ) { - System.out.println(inventory.player.getDisplayName()); return new ContainerTurtle( id, inventory, brain ); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java index 3c2c3b7fa..391ea0f3e 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java @@ -252,11 +252,10 @@ public class TurtleBrain implements ITurtleAccess if( block == oldBlock.getBlock() ) { BlockEntity newTile = world.getBlockEntity( pos ); - if( newTile instanceof TileTurtle ) + if( newTile instanceof TileTurtle newTurtle ) { // Copy the old turtle state into the new turtle - TileTurtle newTurtle = (TileTurtle) newTile; - // newTurtle.setLocation( world, pos ); //FIXME: setLocation no longer exists. + newTurtle.setWorld( world ); newTurtle.transferStateFrom( oldOwner ); newTurtle.createServerComputer() .setWorld( world ); @@ -459,6 +458,7 @@ public class TurtleBrain implements ITurtleAccess { throw new UnsupportedOperationException( "Cannot run commands on the client" ); } + if( commandQueue.size() > 16 ) return MethodResult.of( false, "Too many ongoing turtle commands" ); // Issue command int commandID = issueCommand( command ); @@ -995,15 +995,12 @@ public class TurtleBrain implements ITurtleAccess @Override public MethodResult resume( Object[] response ) { - if( response.length < 3 || !(response[1] instanceof Number) || !(response[2] instanceof Boolean) ) + if( response.length < 3 || !(response[1] instanceof Number id) || !(response[2] instanceof Boolean) ) { return pull; } - if( ((Number) response[1]).intValue() != command ) - { - return pull; - } + if( id.intValue() != command ) return pull; return MethodResult.of( Arrays.copyOfRange( response, 2, response.length ) ); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java index 80dbf56d3..2d35669dd 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java @@ -59,8 +59,6 @@ public class ContainerTurtle extends ContainerComputerBase super( ComputerCraftRegistry.ModContainers.TURTLE, id, canUse, computer, family ); this.properties = properties; - System.out.println("Contaienr Turtle init" + properties); - addProperties( properties ); // Turtle inventory @@ -113,7 +111,6 @@ public class ContainerTurtle extends ContainerComputerBase @Override public ItemStack transferSlot( @Nonnull PlayerEntity player, int slotNum ) { - System.out.println("transferSlot"); if( slotNum >= 0 && slotNum < 16 ) { return tryItemMerge( player, slotNum, 16, 52, true ); @@ -128,7 +125,6 @@ public class ContainerTurtle extends ContainerComputerBase @Nonnull private ItemStack tryItemMerge( PlayerEntity player, int slotNum, int firstSlot, int lastSlot, boolean reverse ) { - System.out.println("tryItemMerge"); Slot slot = slots.get( slotNum ); ItemStack originalStack = ItemStack.EMPTY; if( slot != null && slot.hasStack() ) @@ -160,10 +156,4 @@ public class ContainerTurtle extends ContainerComputerBase } return originalStack; } - @Override - public void onSlotClick(int slotIndex, int button, SlotActionType actionType, PlayerEntity player) { - super.onSlotClick(slotIndex, button, actionType, player); - - System.out.println("on slot click: " + slotIndex); - } }