Utility methods for safely applying messages to tile entities.

Expecting to need this a lot.
This commit is contained in:
Florian Nücke
2020-09-30 13:44:18 +02:00
parent fb281bd5fa
commit 12a02f71b0
3 changed files with 49 additions and 25 deletions

View File

@@ -0,0 +1,45 @@
package li.cil.oc2.common.network;
import net.minecraft.client.Minecraft;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.fml.network.NetworkEvent;
import java.util.function.Consumer;
import java.util.function.Supplier;
public final class MessageUtils {
@SuppressWarnings("unchecked")
public static <T extends TileEntity> void withServerTileEntityAt(final Supplier<NetworkEvent.Context> context, final BlockPos pos, final Class<T> clazz, final Consumer<T> callback) {
final ServerPlayerEntity player = context.get().getSender();
if (player == null) {
return;
}
final ServerWorld world = player.getServerWorld();
final ChunkPos chunkPos = new ChunkPos(pos);
if (world.chunkExists(chunkPos.x, chunkPos.z)) {
final TileEntity tileEntity = world.getTileEntity(pos);
if (clazz.isInstance(tileEntity)) {
callback.accept((T) tileEntity);
}
}
}
@SuppressWarnings("unchecked")
public static <T extends TileEntity> void withClientTileEntityAt(final BlockPos pos, final Class<T> clazz, final Consumer<T> callback) {
final ClientWorld world = Minecraft.getInstance().world;
if (world == null) {
return;
}
final TileEntity tileEntity = world.getTileEntity(pos);
if (clazz.isInstance(tileEntity)) {
callback.accept((T) tileEntity);
}
}
}

View File

@@ -1,11 +1,7 @@
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;
@@ -21,17 +17,8 @@ public final class TerminalBlockInputMessage extends AbstractTerminalBlockMessag
}
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));
}
});
context.get().enqueueWork(() -> MessageUtils.withServerTileEntityAt(context, message.pos, ComputerTileEntity.class,
(tileEntity) -> tileEntity.getTerminal().putInput(ByteBuffer.wrap(message.data))));
return true;
}
}

View File

@@ -1,10 +1,7 @@
package li.cil.oc2.common.network;
import li.cil.oc2.common.tile.ComputerTileEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fml.network.NetworkEvent;
import java.nio.ByteBuffer;
@@ -20,13 +17,8 @@ public final class TerminalBlockOutputMessage extends AbstractTerminalBlockMessa
}
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;
final TileEntity tileEntity = world.getTileEntity(message.pos);
if (!(tileEntity instanceof ComputerTileEntity)) return;
((ComputerTileEntity) tileEntity).getTerminal().putOutput(ByteBuffer.wrap(message.data));
});
context.get().enqueueWork(() -> MessageUtils.withClientTileEntityAt(message.pos, ComputerTileEntity.class,
tileEntity -> tileEntity.getTerminal().putOutput(ByteBuffer.wrap(message.data))));
return true;
}
}