Utility methods for safely applying messages to tile entities.
Expecting to need this a lot.
This commit is contained in:
45
src/main/java/li/cil/oc2/common/network/MessageUtils.java
Normal file
45
src/main/java/li/cil/oc2/common/network/MessageUtils.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user