hollow-cube / minestom-ce

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

PlayerChunkUnloadEvent#getInstance null when player quits the server #113

Open DasBabyPixel opened 10 months ago

DasBabyPixel commented 10 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));
}