Small rename. Check if chunk exists before accessing it on server.
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -0,0 +1,7 @@
|
||||
@ParametersAreNonnullByDefault
|
||||
@MethodsReturnNonnullByDefault
|
||||
package li.cil.oc2.common.network;
|
||||
|
||||
import mcp.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user