Skip to content

Commit 2b07755

Browse files
committed
Merge branch 'mc-1.14.x' into mc-1.15.x
# Conflicts: # gradle.properties # src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java # src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java # src/main/java/dan200/computercraft/core/apis/handles/HandleGeneric.java # src/main/java/dan200/computercraft/shared/Config.java # src/main/java/dan200/computercraft/shared/network/NetworkHandler.java # src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java # src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java # src/main/resources/data/computercraft/lua/rom/help/changelog.txt # src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt
2 parents 190ed4f + 9134f24 commit 2b07755

File tree

28 files changed

+608
-126
lines changed

28 files changed

+608
-126
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Mod properties
2-
mod_version=1.88.1
2+
mod_version=1.89.0
33

44
# Minecraft properties (update mods.toml when changing)
55
mc_version=1.15.2

src/main/java/dan200/computercraft/ComputerCraft.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public final class ComputerCraft
9999
public static int modemHighAltitudeRangeDuringStorm = 384;
100100
public static int maxNotesPerTick = 8;
101101
public static MonitorRenderer monitorRenderer = MonitorRenderer.BEST;
102+
public static long monitorBandwidth = 1_000_000;
102103

103104
public static boolean turtlesNeedFuel = true;
104105
public static int turtleFuelLimit = 20000;

src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import net.minecraft.client.renderer.Matrix4f;
1616
import net.minecraft.client.renderer.texture.TextureUtil;
1717
import org.lwjgl.BufferUtils;
18-
import org.lwjgl.opengl.GL11;
1918
import org.lwjgl.opengl.GL13;
2019
import org.lwjgl.opengl.GL20;
2120

@@ -30,7 +29,6 @@ class MonitorTextureBufferShader
3029
private static final FloatBuffer PALETTE_BUFFER = BufferUtils.createFloatBuffer( 16 * 3 );
3130

3231
private static int uniformMv;
33-
private static int uniformP;
3432

3533
private static int uniformFont;
3634
private static int uniformWidth;
@@ -49,12 +47,6 @@ static void setupUniform( Matrix4f transform, int width, int height, Palette pal
4947
MATRIX_BUFFER.rewind();
5048
RenderSystem.glUniformMatrix4( uniformMv, false, MATRIX_BUFFER );
5149

52-
// TODO: Cache this?
53-
MATRIX_BUFFER.rewind();
54-
GL11.glGetFloatv( GL11.GL_PROJECTION_MATRIX, MATRIX_BUFFER );
55-
MATRIX_BUFFER.rewind();
56-
RenderSystem.glUniformMatrix4( uniformP, false, MATRIX_BUFFER );
57-
5850
RenderSystem.glUniform1i( uniformWidth, width );
5951
RenderSystem.glUniform1i( uniformHeight, height );
6052

@@ -125,8 +117,6 @@ private static boolean load()
125117
if( !ok ) return false;
126118

127119
uniformMv = getUniformLocation( program, "u_mv" );
128-
uniformP = getUniformLocation( program, "u_p" );
129-
130120
uniformFont = getUniformLocation( program, "u_font" );
131121
uniformWidth = getUniformLocation( program, "u_width" );
132122
uniformHeight = getUniformLocation( program, "u_height" );

src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
4141
* the monitor frame and contents.
4242
*/
4343
private static final float MARGIN = (float) (TileMonitor.RENDER_MARGIN * 1.1);
44+
private static ByteBuffer tboContents;
4445

4546
private static final Matrix4f IDENTITY = TransformationMatrix.identity().getMatrix();
4647

@@ -153,31 +154,6 @@ private static void renderTerminal( Matrix4f matrix, ClientMonitor monitor, floa
153154

154155
switch( renderType )
155156
{
156-
case VBO:
157-
{
158-
VertexBuffer vbo = monitor.buffer;
159-
if( redraw )
160-
{
161-
Tessellator tessellator = Tessellator.getInstance();
162-
BufferBuilder builder = tessellator.getBuffer();
163-
builder.begin( FixedWidthFontRenderer.TYPE.getDrawMode(), FixedWidthFontRenderer.TYPE.getVertexFormat() );
164-
FixedWidthFontRenderer.drawTerminalWithoutCursor(
165-
IDENTITY, builder, 0, 0,
166-
terminal, !monitor.isColour(), yMargin, yMargin, xMargin, xMargin
167-
);
168-
169-
builder.finishDrawing();
170-
vbo.upload( builder );
171-
}
172-
173-
vbo.bindBuffer();
174-
FixedWidthFontRenderer.TYPE.getVertexFormat().setupBufferState( 0L );
175-
vbo.draw( matrix, FixedWidthFontRenderer.TYPE.getDrawMode() );
176-
VertexBuffer.unbindBuffer();
177-
FixedWidthFontRenderer.TYPE.getVertexFormat().clearBufferState();
178-
break;
179-
}
180-
181157
case TBO:
182158
{
183159
if( !MonitorTextureBufferShader.use() ) return;
@@ -187,21 +163,28 @@ private static void renderTerminal( Matrix4f matrix, ClientMonitor monitor, floa
187163

188164
if( redraw )
189165
{
190-
ByteBuffer buffer = GLAllocation.createDirectByteBuffer( width * height * 3 );
166+
int size = width * height * 3;
167+
if( tboContents == null || tboContents.capacity() < size )
168+
{
169+
tboContents = GLAllocation.createDirectByteBuffer( size );
170+
}
171+
172+
ByteBuffer monitorBuffer = tboContents;
173+
monitorBuffer.position( 0 );
191174
for( int y = 0; y < height; y++ )
192175
{
193176
TextBuffer text = terminal.getLine( y ), textColour = terminal.getTextColourLine( y ), background = terminal.getBackgroundColourLine( y );
194177
for( int x = 0; x < width; x++ )
195178
{
196-
buffer.put( (byte) (text.charAt( x ) & 0xFF) );
197-
buffer.put( (byte) getColour( textColour.charAt( x ), Colour.WHITE ) );
198-
buffer.put( (byte) getColour( background.charAt( x ), Colour.BLACK ) );
179+
monitorBuffer.put( (byte) (text.charAt( x ) & 0xFF) );
180+
monitorBuffer.put( (byte) getColour( textColour.charAt( x ), Colour.WHITE ) );
181+
monitorBuffer.put( (byte) getColour( background.charAt( x ), Colour.BLACK ) );
199182
}
200183
}
201-
buffer.flip();
184+
monitorBuffer.flip();
202185

203186
GlStateManager.bindBuffer( GL31.GL_TEXTURE_BUFFER, monitor.tboBuffer );
204-
GlStateManager.bufferData( GL31.GL_TEXTURE_BUFFER, buffer, GL20.GL_STATIC_DRAW );
187+
GlStateManager.bufferData( GL31.GL_TEXTURE_BUFFER, monitorBuffer, GL20.GL_STATIC_DRAW );
205188
GlStateManager.bindBuffer( GL31.GL_TEXTURE_BUFFER, 0 );
206189
}
207190

@@ -224,6 +207,31 @@ private static void renderTerminal( Matrix4f matrix, ClientMonitor monitor, floa
224207
GlStateManager.useProgram( 0 );
225208
break;
226209
}
210+
211+
case VBO:
212+
{
213+
VertexBuffer vbo = monitor.buffer;
214+
if( redraw )
215+
{
216+
Tessellator tessellator = Tessellator.getInstance();
217+
BufferBuilder builder = tessellator.getBuffer();
218+
builder.begin( FixedWidthFontRenderer.TYPE.getDrawMode(), FixedWidthFontRenderer.TYPE.getVertexFormat() );
219+
FixedWidthFontRenderer.drawTerminalWithoutCursor(
220+
IDENTITY, builder, 0, 0,
221+
terminal, !monitor.isColour(), yMargin, yMargin, xMargin, xMargin
222+
);
223+
224+
builder.finishDrawing();
225+
vbo.upload( builder );
226+
}
227+
228+
vbo.bindBuffer();
229+
FixedWidthFontRenderer.TYPE.getVertexFormat().setupBufferState( 0L );
230+
vbo.draw( matrix, FixedWidthFontRenderer.TYPE.getDrawMode() );
231+
VertexBuffer.unbindBuffer();
232+
FixedWidthFontRenderer.TYPE.getVertexFormat().clearBufferState();
233+
break;
234+
}
227235
}
228236
}
229237
}

src/main/java/dan200/computercraft/core/apis/handles/HandleGeneric.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,8 @@ protected final void close()
3535
{
3636
open = false;
3737

38-
Closeable closeable = closable;
39-
if( closeable != null )
40-
{
41-
IoUtil.closeQuietly( closeable );
42-
closable = null;
43-
}
38+
IoUtil.closeQuietly( closable );
39+
closable = null;
4440
}
4541

4642
@LuaFunction( "close" )

src/main/java/dan200/computercraft/core/apis/http/Resource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public boolean queue( Consumer<T> task )
106106

107107
protected static <T extends Closeable> T closeCloseable( T closeable )
108108
{
109-
if( closeable != null ) IoUtil.closeQuietly( closeable );
109+
IoUtil.closeQuietly( closeable );
110110
return null;
111111
}
112112

src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ protected void dispose()
220220

221221
WeakReference<WebsocketHandle> websocketHandleRef = websocketHandle;
222222
WebsocketHandle websocketHandle = websocketHandleRef == null ? null : websocketHandleRef.get();
223-
if( websocketHandle != null ) IoUtil.closeQuietly( websocketHandle );
223+
IoUtil.closeQuietly( websocketHandle );
224224
this.websocketHandle = null;
225225
}
226226

src/main/java/dan200/computercraft/core/filesystem/FileSystem.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,7 @@ private void cleanup()
366366
Reference<?> ref;
367367
while( (ref = m_openFileQueue.poll()) != null )
368368
{
369-
Closeable file = m_openFiles.remove( ref );
370-
if( file != null ) IoUtil.closeQuietly( file );
369+
IoUtil.closeQuietly( m_openFiles.remove( ref ) );
371370
}
372371
}
373372
}

src/main/java/dan200/computercraft/shared/Config.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public final class Config
6363
private static final ConfigValue<Integer> modemRangeDuringStorm;
6464
private static final ConfigValue<Integer> modemHighAltitudeRangeDuringStorm;
6565
private static final ConfigValue<Integer> maxNotesPerTick;
66+
private static final ConfigValue<Integer> monitorBandwidth;
6667

6768
private static final ConfigValue<Boolean> turtlesNeedFuel;
6869
private static final ConfigValue<Integer> turtleFuelLimit;
@@ -209,6 +210,16 @@ private Config() {}
209210
.comment( "Maximum amount of notes a speaker can play at once" )
210211
.defineInRange( "max_notes_per_tick", ComputerCraft.maxNotesPerTick, 1, Integer.MAX_VALUE );
211212

213+
monitorBandwidth = builder
214+
.comment( "The limit to how much monitor data can be sent *per tick*. Note:\n" +
215+
" - Bandwidth is measured before compression, so the data sent to the client is smaller.\n" +
216+
" - This ignores the number of players a packet is sent to. Updating a monitor for one player consumes " +
217+
"the same bandwidth limit as sending to 20.\n" +
218+
" - A full sized monitor sends ~25kb of data. So the default (1MB) allows for ~40 monitors to be updated " +
219+
"in a single tick. \n" +
220+
"Set to 0 to disable." )
221+
.defineInRange( "monitor_bandwidth", (int) ComputerCraft.monitorBandwidth, 0, Integer.MAX_VALUE );
222+
212223
builder.pop();
213224
}
214225

@@ -292,6 +303,7 @@ public static void sync()
292303
ComputerCraft.modemHighAltitudeRange = modemHighAltitudeRange.get();
293304
ComputerCraft.modemRangeDuringStorm = modemRangeDuringStorm.get();
294305
ComputerCraft.modemHighAltitudeRangeDuringStorm = modemHighAltitudeRangeDuringStorm.get();
306+
ComputerCraft.monitorBandwidth = monitorBandwidth.get();
295307

296308
// Turtles
297309
ComputerCraft.turtlesNeedFuel = turtlesNeedFuel.get();

src/main/java/dan200/computercraft/shared/common/ClientTerminal.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
package dan200.computercraft.shared.common;
77

88
import dan200.computercraft.core.terminal.Terminal;
9-
import io.netty.buffer.Unpooled;
10-
import net.minecraft.nbt.CompoundNBT;
11-
import net.minecraft.network.PacketBuffer;
9+
import dan200.computercraft.shared.network.client.TerminalState;
1210

1311
public class ClientTerminal implements ITerminal
1412
{
@@ -48,14 +46,13 @@ public boolean isColour()
4846
return m_colour;
4947
}
5048

51-
public void readDescription( CompoundNBT nbt )
49+
public void read( TerminalState state )
5250
{
53-
m_colour = nbt.getBoolean( "colour" );
54-
if( nbt.contains( "terminal" ) )
51+
m_colour = state.colour;
52+
if( state.hasTerminal() )
5553
{
56-
CompoundNBT terminal = nbt.getCompound( "terminal" );
57-
resizeTerminal( terminal.getInt( "term_width" ), terminal.getInt( "term_height" ) );
58-
m_terminal.read( new PacketBuffer( Unpooled.wrappedBuffer( terminal.getByteArray( "term_contents" ) ) ) );
54+
resizeTerminal( state.width, state.height );
55+
state.apply( m_terminal );
5956
}
6057
else
6158
{

src/main/java/dan200/computercraft/shared/common/ServerTerminal.java

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,8 @@
55
*/
66
package dan200.computercraft.shared.common;
77

8-
import dan200.computercraft.ComputerCraft;
98
import dan200.computercraft.core.terminal.Terminal;
10-
import io.netty.buffer.ByteBuf;
11-
import io.netty.buffer.Unpooled;
12-
import net.minecraft.nbt.CompoundNBT;
13-
import net.minecraft.network.PacketBuffer;
9+
import dan200.computercraft.shared.network.client.TerminalState;
1410

1511
import java.util.concurrent.atomic.AtomicBoolean;
1612

@@ -73,8 +69,6 @@ public boolean hasTerminalChanged()
7369
return m_terminalChangedLastFrame;
7470
}
7571

76-
// ITerminal implementation
77-
7872
@Override
7973
public Terminal getTerminal()
8074
{
@@ -87,29 +81,8 @@ public boolean isColour()
8781
return m_colour;
8882
}
8983

90-
public void writeDescription( CompoundNBT nbt )
84+
public TerminalState write()
9185
{
92-
nbt.putBoolean( "colour", m_colour );
93-
if( m_terminal != null )
94-
{
95-
// We have a 10 byte header (2 integer positions, then blinking and current colours), followed by the
96-
// contents and palette.
97-
// Yes, this serialisation code is terrible, but we need to serialise to NBT in order to work with monitors
98-
// (or rather tile entity serialisation).
99-
final int length = 10 + (2 * m_terminal.getWidth() * m_terminal.getHeight()) + (16 * 3);
100-
ByteBuf buffer = Unpooled.buffer( length );
101-
m_terminal.write( new PacketBuffer( buffer ) );
102-
103-
if( buffer.writableBytes() != 0 )
104-
{
105-
ComputerCraft.log.warn( "Should have written {} bytes, but have {} ({} remaining).", length, buffer.writerIndex(), buffer.writableBytes() );
106-
}
107-
108-
CompoundNBT terminal = new CompoundNBT();
109-
terminal.putInt( "term_width", m_terminal.getWidth() );
110-
terminal.putInt( "term_height", m_terminal.getHeight() );
111-
terminal.putByteArray( "term_contents", buffer.array() );
112-
nbt.put( "terminal", terminal );
113-
}
86+
return new TerminalState( m_colour, m_terminal );
11487
}
11588
}

src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,7 @@ private NetworkMessage createComputerPacket()
154154

155155
protected NetworkMessage createTerminalPacket()
156156
{
157-
CompoundNBT tagCompound = new CompoundNBT();
158-
writeDescription( tagCompound );
159-
return new ComputerTerminalClientMessage( getInstanceID(), tagCompound );
157+
return new ComputerTerminalClientMessage( getInstanceID(), write() );
160158
}
161159

162160
public void broadcastState( boolean force )

src/main/java/dan200/computercraft/shared/network/NetworkHandler.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
import net.minecraft.util.ResourceLocation;
1515
import net.minecraft.util.math.Vec3d;
1616
import net.minecraft.world.World;
17+
import net.minecraft.world.chunk.Chunk;
1718
import net.minecraftforge.fml.network.NetworkDirection;
1819
import net.minecraftforge.fml.network.NetworkEvent;
1920
import net.minecraftforge.fml.network.NetworkRegistry;
21+
import net.minecraftforge.fml.network.PacketDistributor;
2022
import net.minecraftforge.fml.network.simple.SimpleChannel;
2123
import net.minecraftforge.fml.server.ServerLifecycleHooks;
2224

@@ -52,6 +54,7 @@ public static void setup()
5254
registerMainThread( 12, ComputerDeletedClientMessage::new );
5355
registerMainThread( 13, ComputerTerminalClientMessage::new );
5456
registerMainThread( 14, PlayRecordClientMessage.class, PlayRecordClientMessage::new );
57+
registerMainThread( 15, MonitorClientMessage.class, MonitorClientMessage::new );
5558
}
5659

5760
public static void sendToPlayer( PlayerEntity player, NetworkMessage packet )
@@ -74,13 +77,13 @@ public static void sendToServer( NetworkMessage packet )
7477

7578
public static void sendToAllAround( NetworkMessage packet, World world, Vec3d pos, double range )
7679
{
77-
for( ServerPlayerEntity player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers() )
78-
{
79-
if( player.getEntityWorld() == world && player.getDistanceSq( pos ) < range * range )
80-
{
81-
sendToPlayer( player, packet );
82-
}
83-
}
80+
PacketDistributor.TargetPoint target = new PacketDistributor.TargetPoint( pos.x, pos.y, pos.z, range, world.getDimension().getType() );
81+
network.send( PacketDistributor.NEAR.with( () -> target ), packet );
82+
}
83+
84+
public static void sendToAllTracking( NetworkMessage packet, Chunk chunk )
85+
{
86+
network.send( PacketDistributor.TRACKING_CHUNK.with( () -> chunk ), packet );
8487
}
8588

8689
/**

0 commit comments

Comments
 (0)