hollow-cube / minestom-ce

1.20.4 Lightweight Minecraft server
https://minestom.net
Apache License 2.0
107 stars 35 forks source link

PlayerChunkUnloadEvent#getInstance null when player quits the server #113

Open DasBabyPixel opened 9 months ago

DasBabyPixel commented 9 months ago

When quitting the server the instance is cleared and then the event is called. This causes the instance to be null in the event.

@Override
default @NotNull Instance getInstance() {
    final Instance instance = getEntity().getInstance();
    assert instance != null : "EntityInstanceEvent is only supported on events where the entity's instance is non-null!";
    return instance;
}

Order of method calls: Entity#remove(boolean)

Instance currentInstance = this.instance;
if (currentInstance != null) {
    removeFromInstance(currentInstance);
    this.instance = null;
}

Then Player#remove(boolean) (second part, after returning from Entity#remove(boolean))

...
// Clear all viewable chunks
ChunkUtils.forChunksInRange(chunkX, chunkZ, MinecraftServer.getChunkViewDistance(), chunkRemover);

Fix might be moving this snippet before the following, though I am unsure of possible side effects:

if (permanent) {
    this.packets.clear();
    EventDispatcher.call(new PlayerDisconnectEvent(this));
}