Skip to content

Commit 755d037

Browse files
kvetinac97Snake1999
authored andcommitted
Compass position is updating now (Nukkit#1742)
* Found the unknown fields in SetSpawnPositionPacket * Update position compass is pointing...j ... when world's spawn got changed * Update compass positions when switched worlds * SpawnChangeEvent is not cancellable -_- * Oops, typo
1 parent b74dc80 commit 755d037

3 files changed

Lines changed: 34 additions & 4 deletions

File tree

src/main/java/cn/nukkit/Player.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,7 @@ public void setSpawn(Vector3 pos) {
10101010
}
10111011
this.spawnPosition = new Position(pos.x, pos.y, pos.z, level);
10121012
SetSpawnPositionPacket pk = new SetSpawnPositionPacket();
1013+
pk.spawnType = SetSpawnPositionPacket.TYPE_PLAYER_SPAWN;
10131014
pk.x = (int) this.spawnPosition.x;
10141015
pk.y = (int) this.spawnPosition.y;
10151016
pk.z = (int) this.spawnPosition.z;
@@ -4368,6 +4369,15 @@ public boolean teleport(Location location, TeleportCause cause) {
43684369
this.server.getPluginManager().callEvent(event);
43694370
if (event.isCancelled()) return false;
43704371
to = event.getTo();
4372+
if (from.getLevel().getId() != to.getLevel().getId()){ //Different level, update compass position
4373+
SetSpawnPositionPacket pk = new SetSpawnPositionPacket();
4374+
pk.spawnType = SetSpawnPositionPacket.TYPE_WORLD_SPAWN;
4375+
Position spawn = to.getLevel().getSpawnLocation();
4376+
pk.x = spawn.getFloorX();
4377+
pk.y = spawn.getFloorY();
4378+
pk.z = spawn.getFloorZ();
4379+
dataPacket(pk);
4380+
}
43714381
}
43724382

43734383
Position oldPos = this.getPosition();
@@ -4405,6 +4415,7 @@ public void teleportImmediate(Location location) {
44054415
}
44064416

44074417
public void teleportImmediate(Location location, TeleportCause cause) {
4418+
Location from = this.getLocation();
44084419
if (super.teleport(location, cause)) {
44094420

44104421
for (Inventory window : new ArrayList<>(this.windowIndex.values())) {
@@ -4414,6 +4425,16 @@ public void teleportImmediate(Location location, TeleportCause cause) {
44144425
this.removeWindow(window);
44154426
}
44164427

4428+
if (from.getLevel().getId() != location.getLevel().getId()){ //Different level, update compass position
4429+
SetSpawnPositionPacket pk = new SetSpawnPositionPacket();
4430+
pk.spawnType = SetSpawnPositionPacket.TYPE_WORLD_SPAWN;
4431+
Position spawn = location.getLevel().getSpawnLocation();
4432+
pk.x = spawn.getFloorX();
4433+
pk.y = spawn.getFloorY();
4434+
pk.z = spawn.getFloorZ();
4435+
dataPacket(pk);
4436+
}
4437+
44174438
this.forceMovement = new Vector3(this.x, this.y, this.z);
44184439
this.sendPosition(this, this.yaw, this.pitch, MovePlayerPacket.MODE_RESET);
44194440

src/main/java/cn/nukkit/level/Level.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2419,6 +2419,12 @@ public void setSpawnLocation(Vector3 pos) {
24192419
Position previousSpawn = this.getSpawnLocation();
24202420
this.provider.setSpawn(pos);
24212421
this.server.getPluginManager().callEvent(new SpawnChangeEvent(this, previousSpawn));
2422+
SetSpawnPositionPacket pk = new SetSpawnPositionPacket();
2423+
pk.spawnType = SetSpawnPositionPacket.TYPE_WORLD_SPAWN;
2424+
pk.x = pos.getFloorX();
2425+
pk.y = pos.getFloorY();
2426+
pk.z = pos.getFloorZ();
2427+
for (Player p : getPlayers().values()) p.dataPacket(pk);
24222428
}
24232429

24242430
public void requestChunk(int x, int z, Player player) {

src/main/java/cn/nukkit/network/protocol/SetSpawnPositionPacket.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ public class SetSpawnPositionPacket extends DataPacket {
77

88
public static final byte NETWORK_ID = ProtocolInfo.SET_SPAWN_POSITION_PACKET;
99

10-
public int unknown;
10+
public static final int TYPE_PLAYER_SPAWN = 0;
11+
public static final int TYPE_WORLD_SPAWN = 1;
12+
13+
public int spawnType;
1114
public int y;
1215
public int z;
1316
public int x;
14-
public boolean unknownBool;
17+
public boolean spawnForced;
1518

1619
@Override
1720
public void decode() {
@@ -21,9 +24,9 @@ public void decode() {
2124
@Override
2225
public void encode() {
2326
this.reset();
24-
this.putUnsignedVarInt(this.unknown);
27+
this.putVarInt(this.spawnType);
2528
this.putBlockCoords(this.x, this.y, this.z);
26-
this.putBoolean(this.unknownBool);
29+
this.putBoolean(this.spawnForced);
2730
}
2831

2932
@Override

0 commit comments

Comments
 (0)