From 12a02f71b052e16d94401f0ddc339f3f678514d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 30 Sep 2020 13:44:18 +0200 Subject: [PATCH] Utility methods for safely applying messages to tile entities. Expecting to need this a lot. --- .../cil/oc2/common/network/MessageUtils.java | 45 +++++++++++++++++++ .../network/TerminalBlockInputMessage.java | 17 +------ .../network/TerminalBlockOutputMessage.java | 12 +---- 3 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 src/main/java/li/cil/oc2/common/network/MessageUtils.java diff --git a/src/main/java/li/cil/oc2/common/network/MessageUtils.java b/src/main/java/li/cil/oc2/common/network/MessageUtils.java new file mode 100644 index 00000000..2e0cb4ad --- /dev/null +++ b/src/main/java/li/cil/oc2/common/network/MessageUtils.java @@ -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 void withServerTileEntityAt(final Supplier context, final BlockPos pos, final Class clazz, final Consumer 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 void withClientTileEntityAt(final BlockPos pos, final Class clazz, final Consumer 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); + } + } +} diff --git a/src/main/java/li/cil/oc2/common/network/TerminalBlockInputMessage.java b/src/main/java/li/cil/oc2/common/network/TerminalBlockInputMessage.java index cb78868a..61e6f050 100644 --- a/src/main/java/li/cil/oc2/common/network/TerminalBlockInputMessage.java +++ b/src/main/java/li/cil/oc2/common/network/TerminalBlockInputMessage.java @@ -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 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; } } diff --git a/src/main/java/li/cil/oc2/common/network/TerminalBlockOutputMessage.java b/src/main/java/li/cil/oc2/common/network/TerminalBlockOutputMessage.java index 89f11c7e..751a95db 100644 --- a/src/main/java/li/cil/oc2/common/network/TerminalBlockOutputMessage.java +++ b/src/main/java/li/cil/oc2/common/network/TerminalBlockOutputMessage.java @@ -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 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; } }