From 4e11f98a21a315aa04493129e69f01730f1356ad Mon Sep 17 00:00:00 2001 From: neumond Date: Mon, 27 Jul 2020 14:07:50 +0300 Subject: [PATCH] Modem peripherals toggling --- .../modem/wired/TileWiredModemFull.java | 28 +++++++++++++++---- .../modem/wired/WiredModemElement.java | 5 ++++ .../modem/wired/WiredModemPeripheral.java | 6 ++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java index 349cb6d289..1356f6068f 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java @@ -36,6 +36,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.*; import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL; @@ -90,12 +91,22 @@ public Vec3d getPosition() BlockPos pos = m_entity.getPos(); return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); } + + @Override + public void togglePeripheralAccess() + { + if( !m_entity.requestToTogglePeripherals.getAndSet( true ) ) + { + TickScheduler.schedule( m_entity ); + } + } } private final WiredModemPeripheral[] modems = new WiredModemPeripheral[6]; private final SidedCaps modemCaps = SidedCaps.ofNonNull( this::getPeripheral ); private boolean m_peripheralAccessAllowed = false; + public AtomicBoolean requestToTogglePeripherals = new AtomicBoolean( false ); private final WiredModemLocalPeripheral[] m_peripherals = new WiredModemLocalPeripheral[6]; private boolean m_destroyed = false; @@ -196,6 +207,7 @@ public ActionResultType onActivate( PlayerEntity player, Hand hand, BlockRayTrac // On server, we interacted if a peripheral was found Set oldPeriphNames = getConnectedPeripheralNames(); togglePeripheralAccess(); + updateBlockState(); Set periphNames = getConnectedPeripheralNames(); if( !Objects.equal( periphNames, oldPeriphNames ) ) @@ -262,7 +274,14 @@ public void blockTick() { if( getWorld().isRemote ) return; - if( m_modemState.pollChanged() ) updateBlockState(); + boolean needUpdate = false; + + if( requestToTogglePeripherals.getAndSet( false ) ) + { + if( togglePeripheralAccess() ) needUpdate = true; + } + if( m_modemState.pollChanged() ) needUpdate = true; + if( needUpdate ) updateBlockState(); if( !m_connectionsFormed ) { @@ -299,7 +318,7 @@ private void connectionsChanged() } } - private void togglePeripheralAccess() + private boolean togglePeripheralAccess() { if( !m_peripheralAccessAllowed ) { @@ -311,7 +330,7 @@ private void togglePeripheralAccess() hasAny |= peripheral.hasPeripheral(); } - if( !hasAny ) return; + if( !hasAny ) return false; m_peripheralAccessAllowed = true; m_node.updatePeripherals( getConnectedPeripherals() ); @@ -323,8 +342,7 @@ private void togglePeripheralAccess() for( WiredModemLocalPeripheral peripheral : m_peripherals ) peripheral.detach(); m_node.updatePeripherals( Collections.emptyMap() ); } - - updateBlockState(); + return true; } private Set getConnectedPeripheralNames() diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemElement.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemElement.java index 510e5e3422..7a5d8400e1 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemElement.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemElement.java @@ -61,4 +61,9 @@ public Map getRemotePeripherals() protected abstract void attachPeripheral( String name, IPeripheral peripheral ); protected abstract void detachPeripheral( String name ); + + public void togglePeripheralAccess() + { + + } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java index bdd1187ca1..2405a0f6e1 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java @@ -195,6 +195,12 @@ public final Object[] getNameLocal() return local == null ? null : new Object[] { local }; } + @LuaFunction + public final void togglePeripherals() + { + modem.togglePeripheralAccess(); + } + @Override public void attach( @Nonnull IComputerAccess computer ) {