2727import java .util .Iterator ;
2828import java .util .LinkedHashSet ;
2929import java .util .Set ;
30+ import java .util .concurrent .ConcurrentLinkedQueue ;
3031import java .util .concurrent .atomic .AtomicReference ;
3132
3233import com .flowpowered .api .Client ;
@@ -57,8 +58,8 @@ public class PlayerNetwork {
5758 * Chunks that have been sent to the client
5859 */
5960 private final Set <ChunkReference > activeChunks = new LinkedHashSet <>();
60- private final Set <ChunkReference > chunkSendQueue = new LinkedHashSet <>();
61- private final Set <ChunkReference > chunkFreeQueue = new LinkedHashSet <>();
61+ private final ConcurrentLinkedQueue <ChunkReference > chunkSendQueue = new ConcurrentLinkedQueue <>();
62+ private final ConcurrentLinkedQueue <ChunkReference > chunkFreeQueue = new ConcurrentLinkedQueue <>();
6263
6364 protected volatile Transform previousTransform = Transform .INVALID ;
6465 private final AtomicReference <RepositionManager > rm = new AtomicReference <>(NullRepositionManager .INSTANCE );
@@ -91,34 +92,31 @@ public void setRepositionManager(RepositionManager rm) {
9192 }
9293 }
9394
94- public void addChunks (Set <Chunk > chunks ) {
95- for (Chunk chunk : chunks ) {
96- chunkSendQueue .add (new ChunkReference (chunk ));
97- }
95+ public void addChunks (Set <ChunkReference > chunks ) {
96+ chunkSendQueue .addAll (chunks );
9897 }
9998
100- public void removeChunks (Set <Chunk > toRemove ) {
101- for (Chunk chunk : toRemove ) {
102- ChunkReference ref = new ChunkReference (chunk );
99+ public void removeChunks (Set <ChunkReference > toRemove ) {
100+ toRemove .stream ().forEach ((ref ) -> {
103101 chunkFreeQueue .add (ref );
104102 chunks .remove (ref );
105- }
103+ });
106104 }
107105
108106 public void preSnapshotRun (Transform transform ) {
109107 if (session .getEngine ().get (Client .class ) != null ) {
110108 return ;
111109 }
112110
113- // We want to free all chunks first
114- for (ChunkReference ref : chunkFreeQueue ) {
115- freeChunk (ref );
116- }
111+ chunkFreeQueue .stream ().forEach ((ref ) -> { freeChunk (ref ); });
117112 chunkFreeQueue .clear ();
118113
119114 // We will sync old chunks, but not new ones
120115 Set <ChunkReference > toSync = new LinkedHashSet <>(activeChunks );
121116
117+ sendPositionUpdates (transform );
118+ previousTransform = transform ;
119+
122120 // Now send new chunks
123121 int chunksSentThisTick = 0 ;
124122
@@ -137,8 +135,7 @@ public void preSnapshotRun(Transform transform) {
137135 previousTransform = transform ;
138136
139137 // Update the active chunks
140- for (Iterator <ChunkReference > it = toSync .iterator (); it .hasNext ();) {
141- ChunkReference ref = it .next ();
138+ for (ChunkReference ref : toSync ) {
142139 Chunk chunk = ref .get ();
143140 // If it was unloaded, we have to free it
144141 // We don't remove it from our chunks though
0 commit comments