1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-01-15 03:35:42 +00:00

Remove ClientTerminal/ServerTerminal

They bring very little to the table now that computers do their own
thing! This also helps simplify the code in ServerMonitor a bit - turns
out we had two "dirty" flags in the implementation!
This commit is contained in:
Jonathan Coates 2022-10-21 19:00:29 +01:00
parent cf05ab1db1
commit c0d20b72c9
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
9 changed files with 78 additions and 189 deletions

View File

@ -25,7 +25,7 @@ import javax.annotation.Nonnull;
*/
public class PocketComputerData
{
private Terminal terminal;
private final Terminal terminal;
private ComputerState state = ComputerState.OFF;
private int lightColour = -1;
@ -58,13 +58,6 @@ public class PocketComputerData
public void setTerminal( TerminalState state )
{
if( state.width != terminal.getWidth() || state.height != terminal.getHeight() || state.colour != terminal.isColour() )
{
terminal = state.create();
}
else
{
state.apply( terminal );
}
state.apply( terminal );
}
}

View File

@ -1,71 +0,0 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.common;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.network.client.TerminalState;
public class ClientTerminal
{
private boolean colour;
private Terminal terminal;
private boolean terminalChanged;
public ClientTerminal( boolean colour )
{
this.colour = colour;
terminal = null;
terminalChanged = false;
}
public boolean pollTerminalChanged()
{
boolean changed = terminalChanged;
terminalChanged = false;
return changed;
}
public Terminal getTerminal()
{
return terminal;
}
public void read( TerminalState state )
{
colour = state.colour;
if( state.hasTerminal() )
{
resizeTerminal( state.width, state.height );
state.apply( terminal );
}
else
{
deleteTerminal();
}
}
private void resizeTerminal( int width, int height )
{
if( terminal == null )
{
terminal = new Terminal( width, height, colour, () -> terminalChanged = true );
terminalChanged = true;
}
else
{
terminal.resize( width, height );
}
}
private void deleteTerminal()
{
if( terminal != null )
{
terminal = null;
terminalChanged = true;
}
}
}

View File

@ -1,72 +0,0 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.common;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.network.client.TerminalState;
import javax.annotation.Nullable;
import java.util.concurrent.atomic.AtomicBoolean;
public class ServerTerminal
{
private final boolean colour;
private @Nullable Terminal terminal;
private final AtomicBoolean terminalChanged = new AtomicBoolean( false );
private boolean terminalChangedLastFrame = false;
public ServerTerminal( boolean colour )
{
this.colour = colour;
}
protected void resize( int width, int height )
{
if( terminal == null )
{
terminal = new Terminal( width, height, colour, this::markTerminalChanged );
markTerminalChanged();
}
else
{
terminal.resize( width, height );
}
}
public void delete()
{
if( terminal != null )
{
terminal = null;
markTerminalChanged();
}
}
protected void markTerminalChanged()
{
terminalChanged.set( true );
}
public void tickServer()
{
terminalChangedLastFrame = terminalChanged.getAndSet( false );
}
public boolean hasTerminalChanged()
{
return terminalChangedLastFrame;
}
public Terminal getTerminal()
{
return terminal;
}
public TerminalState write()
{
return new TerminalState( terminal );
}
}

View File

@ -118,6 +118,7 @@ public class TerminalState
public void apply( Terminal terminal )
{
if( buffer == null ) throw new NullPointerException( "buffer" );
terminal.resize( width, height );
terminal.read( new PacketBuffer( buffer ) );
}

View File

@ -9,7 +9,8 @@ import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.client.util.DirectBuffers;
import dan200.computercraft.client.util.DirectVertexBuffer;
import dan200.computercraft.shared.common.ClientTerminal;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.network.client.TerminalState;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@ -22,7 +23,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public final class ClientMonitor extends ClientTerminal
public final class ClientMonitor
{
private static final Set<ClientMonitor> allMonitors = new HashSet<>();
@ -35,10 +36,11 @@ public final class ClientMonitor extends ClientTerminal
public int tboTexture;
public int tboUniform;
public DirectVertexBuffer buffer;
private Terminal terminal;
private boolean terminalChanged;
public ClientMonitor( boolean colour, TileMonitor origin )
public ClientMonitor( TileMonitor origin )
{
super( colour );
this.origin = origin;
}
@ -156,4 +158,34 @@ public final class ClientMonitor extends ClientTerminal
}
}
}
public boolean pollTerminalChanged()
{
boolean changed = terminalChanged;
terminalChanged = false;
return changed;
}
public Terminal getTerminal()
{
return terminal;
}
void read( TerminalState state )
{
if( state.hasTerminal() )
{
if( terminal == null ) terminal = new Terminal( state.width, state.height, state.colour );
state.apply( terminal );
terminalChanged = true;
}
else
{
if( terminal != null )
{
terminal = null;
terminalChanged = true;
}
}
}
}

View File

@ -123,7 +123,7 @@ public final class MonitorWatcher
private static TerminalState getState( TileMonitor tile, ServerMonitor monitor )
{
TerminalState state = tile.cached;
if( state == null ) state = tile.cached = monitor.write();
if( state == null ) state = tile.cached = new TerminalState( monitor.getTerminal() );
return state;
}

View File

@ -5,26 +5,30 @@
*/
package dan200.computercraft.shared.peripheral.monitor;
import com.google.common.annotations.VisibleForTesting;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.common.ServerTerminal;
import dan200.computercraft.shared.util.TickScheduler;
import javax.annotation.Nullable;
import java.util.concurrent.atomic.AtomicBoolean;
public class ServerMonitor extends ServerTerminal
public class ServerMonitor
{
private final TileMonitor origin;
private final boolean colour;
private int textScale = 2;
private @Nullable Terminal terminal;
private final AtomicBoolean resized = new AtomicBoolean( false );
private final AtomicBoolean changed = new AtomicBoolean( false );
public ServerMonitor( boolean colour, TileMonitor origin )
ServerMonitor( boolean colour, TileMonitor origin )
{
super( colour );
this.colour = colour;
this.origin = origin;
}
public synchronized void rebuild()
synchronized void rebuild()
{
Terminal oldTerm = getTerminal();
int oldWidth = oldTerm == null ? -1 : oldTerm.getWidth();
@ -40,52 +44,55 @@ public class ServerMonitor extends ServerTerminal
1.0
);
resize( termWidth, termHeight );
if( terminal == null )
{
terminal = new Terminal( termWidth, termHeight, colour, this::markChanged );
markChanged();
}
else
{
terminal.resize( termWidth, termHeight );
}
if( oldWidth != termWidth || oldHeight != termHeight )
{
getTerminal().clear();
terminal.clear();
resized.set( true );
markChanged();
}
}
@Override
protected void markTerminalChanged()
{
super.markTerminalChanged();
markChanged();
}
private void markChanged()
{
if( !changed.getAndSet( true ) ) TickScheduler.schedule( origin );
}
protected void clearChanged()
{
changed.set( false );
}
public int getTextScale()
int getTextScale()
{
return textScale;
}
public synchronized void setTextScale( int textScale )
synchronized void setTextScale( int textScale )
{
if( this.textScale == textScale ) return;
this.textScale = textScale;
rebuild();
}
public boolean pollResized()
boolean pollResized()
{
return resized.getAndSet( false );
}
public boolean pollTerminalChanged()
boolean pollTerminalChanged()
{
tickServer();
return hasTerminalChanged();
return changed.getAndSet( false );
}
@Nullable
@VisibleForTesting
public Terminal getTerminal()
{
return terminal;
}
}

View File

@ -5,11 +5,11 @@
*/
package dan200.computercraft.shared.peripheral.monitor;
import com.google.common.annotations.VisibleForTesting;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.common.ServerTerminal;
import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.network.client.TerminalState;
import dan200.computercraft.shared.util.CapabilityUtil;
@ -171,8 +171,6 @@ public class TileMonitor extends TileGeneric
if( xIndex != 0 || yIndex != 0 || serverMonitor == null ) return;
serverMonitor.clearChanged();
if( serverMonitor.pollResized() ) eachComputer( c -> c.queueEvent( "monitor_resize", c.getAttachmentName() ) );
if( serverMonitor.pollTerminalChanged() ) MonitorWatcher.enqueue( this );
}
@ -199,6 +197,7 @@ public class TileMonitor extends TileGeneric
}
@Nullable
@VisibleForTesting
public ServerMonitor getCachedServerMonitor()
{
return serverMonitor;
@ -305,7 +304,7 @@ public class TileMonitor extends TileGeneric
if( xIndex == 0 && yIndex == 0 )
{
// If we're the origin terminal then create it.
if( clientMonitor == null ) clientMonitor = new ClientMonitor( advanced, this );
if( clientMonitor == null ) clientMonitor = new ClientMonitor( this );
}
}
@ -317,7 +316,7 @@ public class TileMonitor extends TileGeneric
return;
}
if( clientMonitor == null ) clientMonitor = new ClientMonitor( advanced, this );
if( clientMonitor == null ) clientMonitor = new ClientMonitor( this );
clientMonitor.read( state );
}
@ -588,7 +587,7 @@ public class TileMonitor extends TileGeneric
return;
}
ServerTerminal serverTerminal = getServerMonitor();
ServerMonitor serverTerminal = getServerMonitor();
if( serverTerminal == null ) return;
Terminal originTerminal = serverTerminal.getTerminal();

View File

@ -55,7 +55,7 @@ class Monitor_Test {
val monitor = helper.getBlockEntity(BlockPos(2, 2, 3)) as TileMonitor
monitor.getCapability(Capabilities.CAPABILITY_PERIPHERAL)
val terminal = monitor.cachedServerMonitor!!.terminal
val terminal = monitor.cachedServerMonitor!!.terminal!!
terminal.write("Hello, world!")
terminal.setCursorPos(1, 2)
terminal.textColour = 2