From ca59c8f30a9ca099e7df87ce498a0d154892cdaf Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 29 Jun 2021 02:21:47 -0300 Subject: [PATCH] reloading chunks is not needed when resetting, fixing entities removed. --- src/main/java/carpet/fakes/ServerWorldInterface.java | 3 +++ .../carpet/fakes/SimpleEntityLookupInterface.java | 11 +++++++++++ .../java/carpet/mixins/ServerWorld_scarpetMixin.java | 8 ++++++++ ...dAnvilChunkStorage_scarpetChunkCreationMixin.java | 12 +++++++++++- src/main/java/carpet/script/api/WorldAccess.java | 4 ++-- src/main/resources/carpet.mixins.json | 1 + 6 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/main/java/carpet/fakes/SimpleEntityLookupInterface.java diff --git a/src/main/java/carpet/fakes/ServerWorldInterface.java b/src/main/java/carpet/fakes/ServerWorldInterface.java index 67414706..106eb72a 100644 --- a/src/main/java/carpet/fakes/ServerWorldInterface.java +++ b/src/main/java/carpet/fakes/ServerWorldInterface.java @@ -1,7 +1,10 @@ package carpet.fakes; +import net.minecraft.entity.Entity; +import net.minecraft.world.entity.EntityLookup; import net.minecraft.world.level.ServerWorldProperties; public interface ServerWorldInterface { ServerWorldProperties getWorldPropertiesCM(); + EntityLookup getEntityLookupCMPublic(); } diff --git a/src/main/java/carpet/fakes/SimpleEntityLookupInterface.java b/src/main/java/carpet/fakes/SimpleEntityLookupInterface.java new file mode 100644 index 00000000..2802581d --- /dev/null +++ b/src/main/java/carpet/fakes/SimpleEntityLookupInterface.java @@ -0,0 +1,11 @@ +package carpet.fakes; + +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.entity.EntityLike; + +import java.util.List; + +public interface SimpleEntityLookupInterface +{ + List getChunkEntities(ChunkPos chpos); +} diff --git a/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java b/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java index 592eaf53..cb5277ed 100644 --- a/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java +++ b/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java @@ -13,6 +13,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.profiler.Profiler; import net.minecraft.world.chunk.WorldChunk; +import net.minecraft.world.entity.EntityLookup; import net.minecraft.world.explosion.Explosion; import net.minecraft.world.explosion.ExplosionBehavior; import net.minecraft.world.level.ServerWorldProperties; @@ -79,7 +80,14 @@ public class ServerWorld_scarpetMixin implements ServerWorldInterface @Final @Shadow private ServerWorldProperties worldProperties; + @Shadow @Final private ServerEntityManager entityManager; + public ServerWorldProperties getWorldPropertiesCM(){ return worldProperties; } + + @Override + public EntityLookup getEntityLookupCMPublic() { + return entityManager.getLookup(); + } } diff --git a/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java index 96102f56..526a7c41 100644 --- a/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java +++ b/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java @@ -12,6 +12,10 @@ import java.util.concurrent.Future; import java.util.function.IntFunction; import java.util.stream.Collectors; +import carpet.fakes.SimpleEntityLookupInterface; +import carpet.fakes.ServerWorldInterface; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerTask; import org.apache.commons.lang3.tuple.Pair; @@ -358,11 +362,17 @@ public abstract class ThreadedAnvilChunkStorage_scarpetChunkCreationMixin implem { final ChunkPos pos = chunk.getPos(); + // remove entities + long longPos = pos.toLong(); + if (this.loadedChunks.contains(longPos) && chunk instanceof WorldChunk) + ((SimpleEntityLookupInterface)((ServerWorldInterface)world).getEntityLookupCMPublic()).getChunkEntities(pos).forEach(entity -> { if (!(entity instanceof PlayerEntity)) entity.discard();}); + + if (chunk instanceof WorldChunk) ((WorldChunk) chunk).setLoadedToWorld(false); if (this.loadedChunks.remove(pos.toLong()) && chunk instanceof WorldChunk) - this.world.unloadEntities((WorldChunk) chunk); + this.world.unloadEntities((WorldChunk) chunk); // block entities only ((ServerLightingProviderInterface) this.serverLightingProvider).invokeUpdateChunkStatus(pos); ((ServerLightingProviderInterface) this.serverLightingProvider).removeLightData(chunk); diff --git a/src/main/java/carpet/script/api/WorldAccess.java b/src/main/java/carpet/script/api/WorldAccess.java index e464c4a0..4d199af3 100644 --- a/src/main/java/carpet/script/api/WorldAccess.java +++ b/src/main/java/carpet/script/api/WorldAccess.java @@ -1469,13 +1469,13 @@ public class WorldAccess { ((CarpetContext)c).s.getMinecraftServer().submitAndJoin( () -> { Map report = ((ThreadedAnvilChunkStorageInterface) world.getChunkManager().threadedAnvilChunkStorage).regenerateChunkRegion(requestedChunks); - for (ChunkPos chpos: requestedChunks) + /*for (ChunkPos chpos: requestedChunks) // needed in 1.16 only { if (world.getChunk(chpos.x, chpos.z, ChunkStatus.FULL, false) != null) { WorldTools.forceChunkUpdate(chpos.getStartPos(), world); } - } + }*/ result[0] = MapValue.wrap(report.entrySet().stream().collect(Collectors.toMap( e -> new StringValue((String)((Map.Entry) e).getKey()), e -> new NumericValue((Integer)((Map.Entry) e).getValue()) diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index a9c777f6..1f9f0c2a 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -41,6 +41,7 @@ "CommandFunctionManager_tickMixin", "ThreadedAnvilChunkStorage_scarpetChunkCreationMixin", + "SimpleEntityLookup_scarpetMixin", "ChunkHolder_scarpetChunkCreationMixin", "ServerLightingProvider_scarpetMixin", "LevelPropagator_resetChunkInterface",