Skip to content

Commit 1a624be

Browse files
committed
Fix the client
1 parent 0de7e37 commit 1a624be

File tree

6 files changed

+59
-22
lines changed

6 files changed

+59
-22
lines changed

src/main/java/com/flowpowered/api/component/AbstractObserver.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public Iterator<Vector3i> getIteratorFor(int centerX, int centerY, int centerZ)
5353
/**
5454
* Chunks currently being observed
5555
*/
56-
protected final AtomicReference<Set<ChunkReference>> observingChunks = new AtomicReference<Set<ChunkReference>>(new HashSet<ChunkReference>());
56+
protected final AtomicReference<Set<ChunkReference>> observingChunks = new AtomicReference<>(new HashSet<>());
5757
protected final AtomicReference<ChunkIterator> liveObserverIterator = new AtomicReference<>(NO_CHUNKS);
5858
protected final Engine engine;
5959
protected boolean observeChunksFailed = true;
@@ -185,6 +185,10 @@ protected void updateObserver() {
185185
observingChunks.set(observing);
186186
}
187187

188+
public Set<ChunkReference> getObservingChunks() {
189+
return observingChunks.get();
190+
}
191+
188192
public abstract void copySnapshot();
189193

190194
protected abstract void startObserving(ImmutableSet<ChunkReference> observing);

src/main/java/com/flowpowered/api/component/PlayerObserveChunksComponent.java renamed to src/main/java/com/flowpowered/api/component/entity/PlayerObserveChunksComponent.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,52 @@
2121
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2222
* THE SOFTWARE.
2323
*/
24-
package com.flowpowered.api.component;
24+
package com.flowpowered.api.component.entity;
25+
26+
import java.util.Set;
27+
28+
import com.flowpowered.api.component.Component;
29+
import com.flowpowered.api.entity.Entity;
30+
import com.flowpowered.api.event.EntityStartObservingChunksEvent;
31+
import com.flowpowered.api.event.EntityStopObservingChunksEvent;
32+
import com.flowpowered.api.geo.reference.ChunkReference;
33+
import com.flowpowered.api.player.Player;
34+
import com.flowpowered.events.EventHandler;
2535

2636
public class PlayerObserveChunksComponent extends Component {
37+
private Player controller;
2738

2839
@Override
2940
public void onTick(float dt) {
30-
throw new UnsupportedOperationException("Not supported yet.");
3141
}
3242

3343
@Override
3444
public boolean canTick() {
35-
throw new UnsupportedOperationException("Not supported yet.");
45+
return false;
46+
}
47+
48+
public void setController(Player player) {
49+
Set<ChunkReference> chunks = ((Entity) getOwner()).getObserver().getObservingChunks();
50+
if (this.controller != null) {
51+
controller.getNetwork().removeChunks(chunks);
52+
}
53+
this.controller = player;
54+
if (this.controller != null) {
55+
controller.getNetwork().addChunks(chunks);
56+
}
3657
}
3758

59+
@EventHandler
60+
public void onObserve(EntityStartObservingChunksEvent e) {
61+
if (e.getObserver().equals(getOwner()) && controller != null) {
62+
controller.getNetwork().addChunks(e.getObserved());
63+
}
64+
}
65+
66+
@EventHandler
67+
public void onStopObserve(EntityStopObservingChunksEvent e) {
68+
if (e.getObserver().equals(getOwner()) && controller != null) {
69+
controller.getNetwork().removeChunks(e.getObserved());
70+
}
71+
}
3872
}

src/main/java/com/flowpowered/api/player/PlayerNetwork.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.Iterator;
2828
import java.util.LinkedHashSet;
2929
import java.util.Set;
30+
import java.util.concurrent.ConcurrentLinkedQueue;
3031
import java.util.concurrent.atomic.AtomicReference;
3132

3233
import 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

src/main/java/com/flowpowered/engine/FlowClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void onAdd() {
5959
MaterialRegistry.setupClient();
6060
}
6161
// TEST CODE
62-
FlowServerWorld world = new FlowServerWorld(engine, "TestWorld", null);
62+
FlowServerWorld world = new FlowServerWorld(engine, "fallback", null);
6363
engine.getWorldManager().addWorld(world);
6464
world.getThread().start();
6565
client.connect(new InetSocketAddress(engine.getArgs().server, engine.getArgs().port));

src/main/java/com/flowpowered/engine/network/FlowNetworkClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.concurrent.atomic.AtomicReference;
2727

2828
import com.flowpowered.engine.FlowEngine;
29+
import com.flowpowered.engine.player.FlowPlayer;
2930
import com.flowpowered.networking.NetworkClient;
3031
import com.flowpowered.networking.session.Session;
3132

@@ -44,6 +45,7 @@ public Session newSession(Channel c) {
4445
if (!session.compareAndSet(null, new FlowSession(engine, c))) {
4546
throw new IllegalStateException("Two sessions created on the client!");
4647
}
48+
session.get().setPlayer(new FlowPlayer(session.get(), "Flowy"));
4749
return session.get();
4850
}
4951

src/main/java/com/flowpowered/engine/network/handler/ChunkDataHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class ChunkDataHandler extends FlowMessageHandler<ChunkDataMessage> {
3434
public void handleClient(FlowSession session, ChunkDataMessage message) {
3535
FlowClient client = session.getEngine().get(FlowClient.class);
3636
// TODO: allow adding chunks to other worlds
37-
FlowWorld world = (FlowWorld) client.getSession().getPlayer().getTransformProvider().getTransform().getPosition().getWorld().get();
37+
FlowWorld world = (FlowWorld) client.getTransform().getPosition().getWorld().refresh(session.getEngine().getWorldManager());
3838
if (message.isUnload()) {
3939
world.setChunk(message.getX(), message.getY(), message.getZ(), null);
4040
} else {

0 commit comments

Comments
 (0)