From 29528b83d6ed9a15e6d52ed01c507aa2a7be7847 Mon Sep 17 00:00:00 2001 From: ishland Date: Mon, 19 Dec 2022 23:46:43 +0800 Subject: [PATCH] Micro-optimization in spawning --- .../MixinSpawnDensityCapper.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ishland/vmp/mixins/playerwatching/optimize_nearby_player_lookups/MixinSpawnDensityCapper.java b/src/main/java/com/ishland/vmp/mixins/playerwatching/optimize_nearby_player_lookups/MixinSpawnDensityCapper.java index 174c6fb..f88a369 100644 --- a/src/main/java/com/ishland/vmp/mixins/playerwatching/optimize_nearby_player_lookups/MixinSpawnDensityCapper.java +++ b/src/main/java/com/ishland/vmp/mixins/playerwatching/optimize_nearby_player_lookups/MixinSpawnDensityCapper.java @@ -3,6 +3,7 @@ import com.ishland.vmp.common.chunkwatching.AreaPlayerChunkWatchingManager; import com.ishland.vmp.mixins.access.IThreadedAnvilChunkStorage; import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import net.minecraft.entity.SpawnGroup; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ThreadedAnvilChunkStorage; @@ -19,7 +20,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Map; -import java.util.Set; import java.util.function.Function; @Mixin(value = SpawnDensityCapper.class, priority = 950) @@ -35,13 +35,13 @@ public abstract class MixinSpawnDensityCapper { @Inject(method = "", at = @At("RETURN")) private void onInit(CallbackInfo info) { - this.playersToDensityCap = new Object2ReferenceOpenHashMap<>(); + this.playersToDensityCap = new Reference2ReferenceOpenHashMap<>(); } @Unique - private Set getMobSpawnablePlayersSet(ChunkPos chunkPos) { + private Object[] getMobSpawnablePlayersArray(ChunkPos chunkPos) { final AreaPlayerChunkWatchingManager manager = (AreaPlayerChunkWatchingManager) ((IThreadedAnvilChunkStorage) this.threadedAnvilChunkStorage).getPlayerChunkWatchingManager(); - return manager.getPlayersWatchingChunk(chunkPos.toLong()); + return manager.getPlayersWatchingChunkArray(chunkPos.toLong()); } /** @@ -50,8 +50,10 @@ private Set getMobSpawnablePlayersSet(ChunkPos chunkPos) { */ @Overwrite public void increaseDensity(ChunkPos chunkPos, SpawnGroup spawnGroup) { - for(ServerPlayerEntity serverPlayerEntity : this.getMobSpawnablePlayersSet(chunkPos)) { - this.playersToDensityCap.computeIfAbsent(serverPlayerEntity, newDensityCap).increaseDensity(spawnGroup); + for(Object _player : this.getMobSpawnablePlayersArray(chunkPos)) { + if (_player instanceof ServerPlayerEntity serverPlayerEntity) { + this.playersToDensityCap.computeIfAbsent(serverPlayerEntity, newDensityCap).increaseDensity(spawnGroup); + } } } @@ -61,10 +63,12 @@ public void increaseDensity(ChunkPos chunkPos, SpawnGroup spawnGroup) { */ @Overwrite public boolean canSpawn(SpawnGroup spawnGroup, ChunkPos chunkPos) { - for(ServerPlayerEntity serverPlayerEntity : this.getMobSpawnablePlayersSet(chunkPos)) { - SpawnDensityCapper.DensityCap densityCap = this.playersToDensityCap.get(serverPlayerEntity); - if (densityCap == null || densityCap.canSpawn(spawnGroup)) { - return true; + for(Object _player : this.getMobSpawnablePlayersArray(chunkPos)) { + if (_player instanceof ServerPlayerEntity serverPlayerEntity) { + SpawnDensityCapper.DensityCap densityCap = this.playersToDensityCap.get(serverPlayerEntity); + if (densityCap == null || densityCap.canSpawn(spawnGroup)) { + return true; + } } }