From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Tue, 27 Jun 2023 13:22:34 +0800 Subject: [PATCH] Optimized dragon respawn diff --git a/net/minecraft/world/level/block/state/pattern/BlockPattern.java b/net/minecraft/world/level/block/state/pattern/BlockPattern.java index f7bb979f08634a7e1b77c59040f59fb5e11aafa5..3cad7d6bca9af77bace18bfd7cc013ac22be4075 100644 --- a/net/minecraft/world/level/block/state/pattern/BlockPattern.java +++ b/net/minecraft/world/level/block/state/pattern/BlockPattern.java @@ -59,7 +59,7 @@ public class BlockPattern { } @Nullable - private BlockPattern.BlockPatternMatch matches(BlockPos pos, Direction finger, Direction thumb, LoadingCache cache) { + public BlockPattern.BlockPatternMatch matches(BlockPos pos, Direction finger, Direction thumb, LoadingCache cache) { // Leaves - private -> public for (int i = 0; i < this.width; i++) { for (int i1 = 0; i1 < this.height; i1++) { for (int i2 = 0; i2 < this.depth; i2++) { diff --git a/net/minecraft/world/level/dimension/end/EndDragonFight.java b/net/minecraft/world/level/dimension/end/EndDragonFight.java index 8ccd40c70e150bd5a8d89818c229258642f2349e..18a567b676f0bfcd725f19c5ed9e3fdbc8e65573 100644 --- a/net/minecraft/world/level/dimension/end/EndDragonFight.java +++ b/net/minecraft/world/level/dimension/end/EndDragonFight.java @@ -273,8 +273,68 @@ public class EndDragonFight { return false; } + // Leaves start - optimizedDragonRespawn + private int cachePortalChunkIteratorX = -8; + private int cachePortalChunkIteratorZ = -8; + private int cachePortalOriginIteratorY = -1; + @Nullable public BlockPattern.BlockPatternMatch findExitPortal() { + if (org.leavesmc.leaves.LeavesConfig.performance.optimizedDragonRespawn) { + int i, j; + for (i = cachePortalChunkIteratorX; i <= 8; ++i) { + for (j = cachePortalChunkIteratorZ; j <= 8; ++j) { + LevelChunk worldChunk = this.level.getChunk(i, j); + for (BlockEntity blockEntity : worldChunk.getBlockEntities().values()) { + if (blockEntity instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity) { + continue; + } + if (blockEntity instanceof TheEndPortalBlockEntity) { + BlockPattern.BlockPatternMatch blockPatternMatch = this.exitPortalPattern.find(this.level, blockEntity.getBlockPos()); + if (blockPatternMatch != null) { + BlockPos blockPos = blockPatternMatch.getBlock(3, 3, 3).getPos(); + if (this.portalLocation == null) { + this.portalLocation = blockPos; + } + //No need to judge whether optimizing option is open + cachePortalChunkIteratorX = i; + cachePortalChunkIteratorZ = j; + return blockPatternMatch; + } + } + } + } + } + + if (this.needsStateScanning || this.portalLocation == null) { + if (cachePortalOriginIteratorY != -1) { + i = cachePortalOriginIteratorY; + } else { + i = this.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, EndPodiumFeature.getLocation(BlockPos.ZERO)).getY(); + } + boolean notFirstSearch = false; + for (j = i; j >= 0; --j) { + BlockPattern.BlockPatternMatch result2 = null; + if (notFirstSearch) { + result2 = org.leavesmc.leaves.util.BlockPatternHelper.partialSearchAround(this.exitPortalPattern, this.level, new BlockPos(EndPodiumFeature.getLocation(BlockPos.ZERO).getY(), j, EndPodiumFeature.getLocation(BlockPos.ZERO).getZ())); + } else { + result2 = this.exitPortalPattern.find(this.level, new BlockPos(EndPodiumFeature.getLocation(BlockPos.ZERO).getX(), j, EndPodiumFeature.getLocation(BlockPos.ZERO).getZ())); + } + if (result2 != null) { + if (this.portalLocation == null) { + this.portalLocation = result2.getBlock(3, 3, 3).getPos(); + } + cachePortalOriginIteratorY = j; + return result2; + } + notFirstSearch = true; + } + } + + return null; + } + // Leaves end - optimizedDragonRespawn + ChunkPos chunkPos = new ChunkPos(this.origin); for (int i = -8 + chunkPos.x; i <= 8 + chunkPos.x; i++) { @@ -572,6 +632,11 @@ public class EndDragonFight { } public boolean respawnDragon(List crystals) { // CraftBukkit - return boolean + // Leaves - start optimizedDragonRespawn + cachePortalChunkIteratorX = -8; + cachePortalChunkIteratorZ = -8; + cachePortalOriginIteratorY = -1; + // Leaves - end optimizedDragonRespawn if (this.dragonKilled && this.respawnStage == null) { for (BlockPattern.BlockPatternMatch blockPatternMatch = this.findExitPortal(); blockPatternMatch != null; blockPatternMatch = this.findExitPortal()) { for (int i = 0; i < this.exitPortalPattern.getWidth(); i++) {