Skip to content

Commit 36bda1d

Browse files
committed
WIP code to handle multi-machine packets
Mostly operational, needs more refinement to handle data edge cases and multiplayer environments
1 parent 3631346 commit 36bda1d

File tree

4 files changed

+95
-67
lines changed

4 files changed

+95
-67
lines changed

src/main/java/com/robotgryphon/compactmachines/data/persistent/CompactRoomData.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,19 +169,19 @@ public NewRoomRegistration owner(UUID owner) {
169169
return this;
170170
}
171171

172-
public NewRoomRegistration center(BlockPos roomCenter) {
173-
this.center = roomCenter;
174-
return this;
175-
}
176-
177172
public NewRoomRegistration size(EnumMachineSize size) {
178173
this.size = size;
179174
recalculateSize();
180175
return this;
181176
}
182177

183178
public NewRoomRegistration spawn(BlockPos spawn) {
184-
this.spawn = new Vector3d(spawn.getX(), spawn.getY(), spawn.getZ());
179+
Vector3d spawnTest = new Vector3d(spawn.getX(), spawn.getY(), spawn.getZ());
180+
181+
// Make sure the spawn is inside the new room bounds
182+
if(size.getBounds(this.center).contains(spawnTest))
183+
this.spawn = spawnTest;
184+
185185
return this;
186186
}
187187

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.robotgryphon.compactmachines.network;
2+
3+
import com.robotgryphon.compactmachines.data.persistent.CompactMachineData;
4+
import com.robotgryphon.compactmachines.data.persistent.MachineConnections;
5+
import net.minecraft.entity.player.ServerPlayerEntity;
6+
import net.minecraft.network.IPacket;
7+
import net.minecraft.network.play.ServerPlayNetHandler;
8+
import net.minecraft.server.MinecraftServer;
9+
import net.minecraft.util.math.BlockPos;
10+
import net.minecraft.util.math.ChunkPos;
11+
import net.minecraft.world.Dimension;
12+
import net.minecraft.world.World;
13+
import net.minecraft.world.chunk.Chunk;
14+
import net.minecraft.world.server.ChunkManager;
15+
import net.minecraft.world.server.ServerChunkProvider;
16+
import net.minecraft.world.server.ServerWorld;
17+
import net.minecraftforge.fml.network.NetworkDirection;
18+
import net.minecraftforge.fml.network.PacketDistributor;
19+
20+
import java.util.*;
21+
import java.util.function.Consumer;
22+
import java.util.function.Supplier;
23+
24+
public class CMPacketTargets {
25+
26+
public static final PacketDistributor<Chunk> TRACKING_ROOM = new PacketDistributor<>(
27+
CMPacketTargets::trackingRoom, NetworkDirection.PLAY_TO_CLIENT);
28+
29+
private static Consumer<IPacket<?>> trackingRoom(PacketDistributor<Chunk> dist, Supplier<Chunk> supplier) {
30+
Chunk roomChunk = supplier.get();
31+
World level = roomChunk.getLevel();
32+
33+
HashMap<UUID, ServerPlayNetHandler> trackingPlayersGlobal = new HashMap<>();
34+
35+
if (level instanceof ServerWorld) {
36+
ServerWorld serverWorld = (ServerWorld) level;
37+
MinecraftServer server = serverWorld.getServer();
38+
39+
MachineConnections connections = MachineConnections.get(server);
40+
CompactMachineData machines = CompactMachineData.get(server);
41+
42+
Collection<Integer> linked = connections.graph.getMachinesFor(roomChunk.getPos());
43+
44+
for (int machine : linked) {
45+
machines.getMachineLocation(machine).ifPresent(loc -> {
46+
Optional<ServerWorld> machineWorld = loc.getWorld(server);
47+
BlockPos machineWorldLocation = loc.getBlockPosition();
48+
ChunkPos machineWorldChunk = new ChunkPos(machineWorldLocation);
49+
50+
machineWorld.ifPresent(mw -> {
51+
mw.getChunkSource().chunkMap.getPlayers(machineWorldChunk, false).forEach(player -> {
52+
if (!trackingPlayersGlobal.containsKey(player.getUUID()))
53+
trackingPlayersGlobal.put(player.getUUID(), player.connection);
54+
});
55+
});
56+
});
57+
}
58+
}
59+
60+
return pack -> trackingPlayersGlobal.values().forEach(conn -> conn.send(pack));
61+
}
62+
}

src/main/java/com/robotgryphon/compactmachines/network/MachinePlayersChangedPacket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static void handle(MachinePlayersChangedPacket message, Supplier<NetworkE
5858
NetworkEvent.Context ctx = context.get();
5959

6060
message.machinePositions.forEach(machinePos -> {
61-
CompactMachines.LOGGER.debug("Player changed inside {}; outer position {}", message.machine, machinePos);
61+
CompactMachines.LOGGER.debug("Player {} machine {} via {}", message.type, message.machine, machinePos);
6262
MachinePlayerEventHandler.handlePlayerMachineChanged(message.playerID, message.type, machinePos);
6363
});
6464

src/main/java/com/robotgryphon/compactmachines/util/PlayerUtil.java

Lines changed: 26 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.robotgryphon.compactmachines.data.player.CompactMachinePlayerData;
1111
import com.robotgryphon.compactmachines.data.persistent.CompactMachineData;
1212
import com.robotgryphon.compactmachines.data.persistent.CompactRoomData;
13+
import com.robotgryphon.compactmachines.network.CMPacketTargets;
1314
import com.robotgryphon.compactmachines.network.MachinePlayersChangedPacket;
1415
import com.robotgryphon.compactmachines.network.NetworkHandler;
1516
import com.robotgryphon.compactmachines.reference.EnumMachineSize;
@@ -27,6 +28,7 @@
2728
import net.minecraft.util.text.TranslationTextComponent;
2829
import net.minecraft.world.IWorld;
2930
import net.minecraft.world.World;
31+
import net.minecraft.world.chunk.Chunk;
3032
import net.minecraft.world.server.ServerWorld;
3133
import net.minecraftforge.fml.network.PacketDistributor;
3234

@@ -106,7 +108,7 @@ public static void teleportPlayerIntoMachine(ServerPlayerEntity serverPlayer, Bl
106108
rooms.createNew()
107109
.owner(serverPlayer.getUUID())
108110
.size(size)
109-
.center(newCenter)
111+
.chunk(machineChunk)
110112
.register();
111113
} catch (OperationNotSupportedException e) {
112114
CompactMachines.LOGGER.warn(e);
@@ -143,6 +145,7 @@ public static void teleportPlayerIntoMachine(ServerPlayerEntity serverPlayer, Bl
143145
// TODO - Move machine generation to new method
144146
}
145147

148+
// TODO - Overhaul this to handle nested machines
146149
public static void teleportPlayerOutOfMachine(ServerWorld world, ServerPlayerEntity serverPlayer) {
147150

148151
MinecraftServer serv = world.getServer();
@@ -162,50 +165,20 @@ public static void teleportPlayerOutOfMachine(ServerWorld world, ServerPlayerEnt
162165

163166
ChunkPos currentMachine = new ChunkPos(serverPlayer.blockPosition());
164167

168+
MachineConnections connections = MachineConnections.get(serv);
169+
if (connections == null)
170+
return;
171+
165172
DimensionalPosition spawnPoint = externalSpawn.get();
166173

167-
Optional<ServerWorld> outsideWorld = spawnPoint.getWorld(world.getServer());
174+
Optional<ServerWorld> outsideWorld = spawnPoint.getWorld(serv);
168175
outsideWorld.ifPresent(w -> {
169176
Vector3d worldPos = spawnPoint.getPosition();
170-
serverPlayer.teleportTo(w, worldPos.x(), worldPos.y(), worldPos.z(), serverPlayer.yRot, serverPlayer.xRot);
171-
172-
// CompactMachinePlayerUtil.removePlayerFromMachine(serverPlayer, MACHINE_POS);
173-
// TODO - Networking for player leaving machine
174-
// machine.ifPresent(m -> {
175-
// CompactMachinePlayerUtil.removePlayerFromMachine(serverPlayer,
176-
// machineInfo.getOutsidePosition(serverPlayer.getServer()).getBlockPosition(),
177-
// m.getId());
178-
// });
179-
});
180-
181-
// TODO
182-
// Optional<CompactMachinePlayerData> machinePlayers = serverData.getPlayerData(machineInfo.getId());
183-
// if (!machinePlayers.isPresent()) {
184-
// // No player data for machine, wut
185-
// CompactMachines.LOGGER.warn("Warning: Machine player data not set but machine registered, and player is inside. Machine ID: {}", machineInfo.getId());
186-
// serverPlayer.displayClientMessage(new TranslationTextComponent("ah_crap"), true);
187-
// return;
188-
// }
189-
//
190-
// Optional<DimensionalPosition> lastPos = machinePlayers.get().getExternalSpawn(serverPlayer);
191-
// if (!lastPos.isPresent()) {
192-
// // PANIC
193-
//
194-
// return;
195-
// } else {
196-
// DimensionalPosition p = lastPos.get();
197-
// Vector3d bp = p.getPosition();
198-
// Optional<ServerWorld> outsideWorld = p.getWorld(world.getServer());
199-
// outsideWorld.ifPresent(w -> {
200-
// machine.ifPresent(m -> {
201-
// serverPlayer.teleportTo(w, bp.x(), bp.y(), bp.z(), serverPlayer.yRot, serverPlayer.xRot);
202-
// CompactMachinePlayerUtil.removePlayerFromMachine(serverPlayer,
203-
// machineInfo.getOutsidePosition(serverPlayer.getServer()).getBlockPosition(),
204-
// m.getId());
205-
// });
206-
// });
207-
// }
177+
Vector3d entryRot = spawnPoint.getRotation();
178+
serverPlayer.teleportTo(w, worldPos.x(), worldPos.y(), worldPos.z(), (float) entryRot.y, (float) entryRot.x);
208179

180+
removePlayerFromMachine(serverPlayer, currentMachine);
181+
});
209182
}
210183

211184
public static void addPlayerToMachine(ServerPlayerEntity serverPlayer, BlockPos machinePos) {
@@ -221,7 +194,10 @@ public static void addPlayerToMachine(ServerPlayerEntity serverPlayer, BlockPos
221194
if (tile == null)
222195
return;
223196

197+
224198
tile.getInternalChunkPos().ifPresent(mChunk -> {
199+
final Chunk chunk = serv.getLevel(Registration.COMPACT_DIMENSION)
200+
.getChunk(mChunk.x, mChunk.z);
225201

226202
playerData.addPlayer(serverPlayer, mChunk);
227203
playerData.setDirty();
@@ -232,38 +208,28 @@ public static void addPlayerToMachine(ServerPlayerEntity serverPlayer, BlockPos
232208
.enteredFrom(tile.machineId)
233209
.build();
234210

235-
NetworkHandler.MAIN_CHANNEL.send(
236-
PacketDistributor.TRACKING_CHUNK.with(() -> serverPlayer.getLevel().getChunkAt(machinePos)),
237-
p);
211+
NetworkHandler.MAIN_CHANNEL.send(CMPacketTargets.TRACKING_ROOM.with(() -> chunk), p);
238212
});
239213
}
240214

241-
public static void removePlayerFromMachine(ServerPlayerEntity serverPlayer, BlockPos machinePos) {
215+
public static void removePlayerFromMachine(ServerPlayerEntity serverPlayer, ChunkPos roomChunk) {
242216
MinecraftServer serv = serverPlayer.getServer();
243217

244218
CompactMachinePlayerData playerData = CompactMachinePlayerData.get(serv);
245219
if (playerData == null)
246220
return;
247221

248222
playerData.removePlayer(serverPlayer);
223+
playerData.setDirty();
249224

250-
CompactMachineTile tile = (CompactMachineTile) serverPlayer.getLevel().getBlockEntity(machinePos);
251-
if (tile == null)
252-
return;
253-
254-
tile.getInternalChunkPos().ifPresent(mChunk -> {
225+
final Chunk chunk = serv.getLevel(Registration.COMPACT_DIMENSION)
226+
.getChunk(roomChunk.x, roomChunk.z);
255227

256-
playerData.removePlayer(serverPlayer);
257-
playerData.setDirty();
228+
MachinePlayersChangedPacket p = MachinePlayersChangedPacket.Builder.create(serv)
229+
.forMachine(roomChunk)
230+
.forPlayer(serverPlayer)
231+
.build();
258232

259-
MachinePlayersChangedPacket p = MachinePlayersChangedPacket.Builder.create(serv)
260-
.forMachine(mChunk)
261-
.forPlayer(serverPlayer)
262-
.build();
263-
264-
NetworkHandler.MAIN_CHANNEL.send(
265-
PacketDistributor.TRACKING_CHUNK.with(() -> serverPlayer.getLevel().getChunkAt(machinePos)),
266-
p);
267-
});
233+
NetworkHandler.MAIN_CHANNEL.send(CMPacketTargets.TRACKING_ROOM.with(() -> chunk), p);
268234
}
269235
}

0 commit comments

Comments
 (0)