Small rename. Check if chunk exists before accessing it on server.

This commit is contained in:
Florian Nücke
2020-09-30 13:34:37 +02:00
parent 9275d9562a
commit fb281bd5fa
8 changed files with 64 additions and 54 deletions

View File

@@ -5,7 +5,7 @@ import com.mojang.blaze3d.systems.RenderSystem;
import li.cil.oc2.api.API;
import li.cil.oc2.client.gui.terminal.Terminal;
import li.cil.oc2.client.gui.terminal.TerminalInput;
import li.cil.oc2.common.network.ComputerTerminalInputMessage;
import li.cil.oc2.common.network.TerminalBlockInputMessage;
import li.cil.oc2.common.network.Network;
import li.cil.oc2.common.tile.ComputerTileEntity;
import net.minecraft.client.gui.screen.Screen;
@@ -69,7 +69,7 @@ public final class TerminalScreen extends Screen {
final ByteBuffer input = terminal.getInput();
if (input != null) {
Network.INSTANCE.sendToServer(new ComputerTerminalInputMessage(tileEntity, input));
Network.INSTANCE.sendToServer(new TerminalBlockInputMessage(tileEntity, input));
}
}

View File

@@ -6,16 +6,16 @@ import net.minecraft.util.math.BlockPos;
import java.nio.ByteBuffer;
public abstract class AbstractComputerTerminalMessage {
public abstract class AbstractTerminalBlockMessage {
protected BlockPos pos;
protected byte[] data;
public AbstractComputerTerminalMessage(final ComputerTileEntity tileEntity, final ByteBuffer data) {
protected AbstractTerminalBlockMessage(final ComputerTileEntity tileEntity, final ByteBuffer data) {
this.pos = tileEntity.getPos();
this.data = data.array();
}
public AbstractComputerTerminalMessage(final PacketBuffer buffer) {
protected AbstractTerminalBlockMessage(final PacketBuffer buffer) {
fromBytes(buffer);
}
@@ -24,7 +24,7 @@ public abstract class AbstractComputerTerminalMessage {
data = buffer.readByteArray();
}
public static void toBytes(final AbstractComputerTerminalMessage message, final PacketBuffer buffer) {
public static void toBytes(final AbstractTerminalBlockMessage message, final PacketBuffer buffer) {
buffer.writeBlockPos(message.pos);
buffer.writeByteArray(message.data);
}

View File

@@ -1,34 +0,0 @@
package li.cil.oc2.common.network;
import li.cil.oc2.common.tile.ComputerTileEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.fml.network.NetworkEvent;
import java.nio.ByteBuffer;
import java.util.function.Supplier;
public final class ComputerTerminalInputMessage extends AbstractComputerTerminalMessage {
public ComputerTerminalInputMessage(final ComputerTileEntity tileEntity, final ByteBuffer data) {
super(tileEntity, data);
}
public ComputerTerminalInputMessage(final PacketBuffer buffer) {
super(buffer);
}
public static boolean handleInput(final AbstractComputerTerminalMessage message, final Supplier<NetworkEvent.Context> context) {
context.get().enqueueWork(() -> {
final ServerPlayerEntity player = context.get().getSender();
if (player == null) return;
final ServerWorld world = player.getServerWorld();
// TODO Check if chunk is loaded first.
final TileEntity tileEntity = world.getTileEntity(message.pos);
if (!(tileEntity instanceof ComputerTileEntity)) return;
((ComputerTileEntity) tileEntity).getTerminal().putInput(ByteBuffer.wrap(message.data));
});
return true;
}
}

View File

@@ -18,16 +18,16 @@ public final class Network {
);
public static void setup() {
INSTANCE.messageBuilder(ComputerTerminalOutputMessage.class, getNextPacketId(), NetworkDirection.PLAY_TO_CLIENT)
.encoder(ComputerTerminalOutputMessage::toBytes)
.decoder(ComputerTerminalOutputMessage::new)
.consumer(ComputerTerminalOutputMessage::handleOutput)
INSTANCE.messageBuilder(TerminalBlockOutputMessage.class, getNextPacketId(), NetworkDirection.PLAY_TO_CLIENT)
.encoder(TerminalBlockOutputMessage::toBytes)
.decoder(TerminalBlockOutputMessage::new)
.consumer(TerminalBlockOutputMessage::handleOutput)
.add();
INSTANCE.messageBuilder(ComputerTerminalInputMessage.class, getNextPacketId(), NetworkDirection.PLAY_TO_SERVER)
.encoder(ComputerTerminalInputMessage::toBytes)
.decoder(ComputerTerminalInputMessage::new)
.consumer(ComputerTerminalInputMessage::handleInput)
INSTANCE.messageBuilder(TerminalBlockInputMessage.class, getNextPacketId(), NetworkDirection.PLAY_TO_SERVER)
.encoder(TerminalBlockInputMessage::toBytes)
.decoder(TerminalBlockInputMessage::new)
.consumer(TerminalBlockInputMessage::handleInput)
.add();
}

View File

@@ -0,0 +1,37 @@
package li.cil.oc2.common.network;
import li.cil.oc2.common.tile.ComputerTileEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.fml.network.NetworkEvent;
import java.nio.ByteBuffer;
import java.util.function.Supplier;
public final class TerminalBlockInputMessage extends AbstractTerminalBlockMessage {
public TerminalBlockInputMessage(final ComputerTileEntity tileEntity, final ByteBuffer data) {
super(tileEntity, data);
}
public TerminalBlockInputMessage(final PacketBuffer buffer) {
super(buffer);
}
public static boolean handleInput(final AbstractTerminalBlockMessage message, final Supplier<NetworkEvent.Context> context) {
context.get().enqueueWork(() -> {
final ServerPlayerEntity player = context.get().getSender();
if (player == null) return;
final ServerWorld world = player.getServerWorld();
final ChunkPos chunkPos = new ChunkPos(message.pos);
if (world.chunkExists(chunkPos.x, chunkPos.z)) {
final TileEntity tileEntity = world.getTileEntity(message.pos);
if (!(tileEntity instanceof ComputerTileEntity)) return;
((ComputerTileEntity) tileEntity).getTerminal().putInput(ByteBuffer.wrap(message.data));
}
});
return true;
}
}

View File

@@ -10,16 +10,16 @@ import net.minecraftforge.fml.network.NetworkEvent;
import java.nio.ByteBuffer;
import java.util.function.Supplier;
public final class ComputerTerminalOutputMessage extends AbstractComputerTerminalMessage {
public ComputerTerminalOutputMessage(final ComputerTileEntity tileEntity, final ByteBuffer data) {
public final class TerminalBlockOutputMessage extends AbstractTerminalBlockMessage {
public TerminalBlockOutputMessage(final ComputerTileEntity tileEntity, final ByteBuffer data) {
super(tileEntity, data);
}
public ComputerTerminalOutputMessage(final PacketBuffer buffer) {
public TerminalBlockOutputMessage(final PacketBuffer buffer) {
super(buffer);
}
public static boolean handleOutput(final AbstractComputerTerminalMessage message, final Supplier<NetworkEvent.Context> context) {
public static boolean handleOutput(final AbstractTerminalBlockMessage message, final Supplier<NetworkEvent.Context> context) {
context.get().enqueueWork(() -> {
final ClientWorld world = Minecraft.getInstance().world;
if (world == null) return;

View File

@@ -0,0 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package li.cil.oc2.common.network;
import mcp.MethodsReturnNonnullByDefault;
import javax.annotation.ParametersAreNonnullByDefault;

View File

@@ -3,7 +3,7 @@ package li.cil.oc2.common.tile;
import it.unimi.dsi.fastutil.bytes.ByteArrayFIFOQueue;
import li.cil.oc2.OpenComputers;
import li.cil.oc2.client.gui.terminal.Terminal;
import li.cil.oc2.common.network.ComputerTerminalOutputMessage;
import li.cil.oc2.common.network.TerminalBlockOutputMessage;
import li.cil.oc2.common.network.Network;
import li.cil.oc2.common.vm.VirtualMachineRunner;
import li.cil.sedna.api.Sizes;
@@ -214,7 +214,7 @@ public final class ComputerTileEntity extends TileEntity implements ITickableTil
terminal.putOutput(output);
output.flip();
final ComputerTerminalOutputMessage message = new ComputerTerminalOutputMessage(ComputerTileEntity.this, output);
final TerminalBlockOutputMessage message = new TerminalBlockOutputMessage(ComputerTileEntity.this, output);
Network.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunk), message);
}
}