From 15ac7ab620712a88c2b17232e5d5d2c80c014b61 Mon Sep 17 00:00:00 2001 From: matheusabido Date: Thu, 24 Apr 2025 07:29:26 -0400 Subject: [PATCH 1/3] changes synchronized map to concurrent hashmap for simplicity reasons --- .../world/WorldChunksManager.java | 42 +++++++++---------- .../minecartsloadchunks/world/WorldData.java | 25 ++++------- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java b/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java index 45e84e2..714ccfc 100644 --- a/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java +++ b/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java @@ -110,25 +110,23 @@ public static int savePersistentChunksForWorld(ServerWorld world) { } WorldData worldData = WORLD_DATA.getOrDefault(world, new WorldData(world)); - synchronized (worldData.chunkData) { - Collection forcedChunks = worldData.getChunks(); + Collection forcedChunks = worldData.getChunks(); - for (ChunkData data : forcedChunks) { - data.savedTick = currentTick; - } + for (ChunkData data : forcedChunks) { + data.savedTick = currentTick; + } - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - try (FileWriter writer = new FileWriter(optionalFile.get())) { - gson.toJson(forcedChunks, writer); - } catch (IOException e) { - e.printStackTrace(); - } + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + try (FileWriter writer = new FileWriter(optionalFile.get())) { + gson.toJson(forcedChunks, writer); + } catch (IOException e) { + e.printStackTrace(); + } - if (MinecartsLoadChunks.getConfig().spamConsole) { - System.out.printf("Saved %d forceloaded chunks for world %s.%n", forcedChunks.size(), world.getRegistryKey().getValue()); - } - return forcedChunks.size(); + if (MinecartsLoadChunks.getConfig().spamConsole) { + System.out.printf("Saved %d forceloaded chunks for world %s.%n", forcedChunks.size(), world.getRegistryKey().getValue()); } + return forcedChunks.size(); } /** @@ -157,14 +155,12 @@ public static void freeChunks(ServerWorld world) { WorldData worldData = WORLD_DATA.get(world); long currentTick = world.getServer().getTicks(); - synchronized (worldData.chunkData) { - Iterator iterator = worldData.getChunks().iterator(); - while (iterator.hasNext()) { - ChunkData data = iterator.next(); - if (currentTick > data.expiryTick) { - world.setChunkForced(data.pos.x, data.pos.z, false); - iterator.remove(); - } + Iterator iterator = worldData.getChunks().iterator(); + while (iterator.hasNext()) { + ChunkData data = iterator.next(); + if (currentTick > data.expiryTick) { + world.setChunkForced(data.pos.x, data.pos.z, false); + iterator.remove(); } } } diff --git a/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java b/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java index b353d6b..35878a7 100644 --- a/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java +++ b/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java @@ -4,39 +4,32 @@ import net.minecraft.util.math.ChunkPos; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; public class WorldData { - protected final HashMap chunkData = new HashMap<>(); + protected final ConcurrentHashMap chunkData = new ConcurrentHashMap<>(); private final ServerWorld world; public WorldData(ServerWorld world) { this.world = world; } public Optional getChunkData(ChunkPos pos) { - synchronized (chunkData) { - return Optional.ofNullable(chunkData.get(pos)); - } + return Optional.ofNullable(chunkData.get(pos)); } public Collection getChunks() { - synchronized (chunkData) { - return chunkData.values(); - } + return chunkData.values(); } public ChunkData addForcedChunk(ChunkData chunkData) { - synchronized (this.chunkData) { - return this.chunkData.put(chunkData.pos, chunkData); - } + return this.chunkData.put(chunkData.pos, chunkData); } public ChunkData unloadChunk(ChunkPos pos) { - synchronized (chunkData) { - ChunkData data = this.chunkData.remove(pos); - if (data != null) { - this.world.setChunkForced(pos.x, pos.z, false); - } - return data; + ChunkData data = this.chunkData.remove(pos); + if (data != null) { + this.world.setChunkForced(pos.x, pos.z, false); } + return data; } } \ No newline at end of file From 9b12eda70101c6b6c83cb72efbedd5659e1ca5af Mon Sep 17 00:00:00 2001 From: matheusabido Date: Wed, 30 Jul 2025 21:11:59 -0400 Subject: [PATCH 2/3] upgrade to 1.21.8 + ignore naturally generated minecarts --- .gitignore | 1 + build.gradle | 2 +- gradle.properties | 9 +++--- gradlew | 9 +++--- gradlew.bat | 4 +-- .../MinecartsLoadChunks.java | 11 ++++++++ .../world/WorldChunksManager.java | 28 ++++++++----------- .../minecartsloadchunks/world/WorldData.java | 25 ++++++----------- 8 files changed, 45 insertions(+), 44 deletions(-) diff --git a/.gitignore b/.gitignore index 629d356..d18cd0f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ run/ build/ .gradle/ gradle/ +remappedSrc/ # IDE-related .idea/ diff --git a/build.gradle b/build.gradle index f4689ae..60f1388 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.10-SNAPSHOT' + id 'fabric-loom' version "${loom_version}" id 'maven-publish' } diff --git a/gradle.properties b/gradle.properties index 6d3838b..b7474da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,14 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.21.5 -yarn_mappings=1.21.5+build.1 -loader_version=0.16.13 +minecraft_version=1.21.8 +yarn_mappings=1.21.8+build.1 +loader_version=0.16.14 +loom_version=1.11-SNAPSHOT # Mod Properties mod_version=1.1 maven_group=D7lan archives_base_name=minecartsloadchunks # Dependencies # check this on https://modmuss50.me/fabric.html -fabric_version=0.120.0+1.21.5 +fabric_version=0.130.0+1.21.8 diff --git a/gradlew b/gradlew index f5feea6..23d15a9 100644 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java b/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java index 7fe159f..f584862 100644 --- a/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java +++ b/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java @@ -5,6 +5,7 @@ import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.minecraft.entity.EntityType; import net.minecraft.entity.vehicle.AbstractMinecartEntity; +import net.minecraft.entity.vehicle.ChestMinecartEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.ChunkPos; @@ -37,6 +38,16 @@ private void onServerTick(MinecraftServer server) { for (EntityType type : MINECART_TYPES) { for (AbstractMinecartEntity minecart : world.getEntitiesByType((EntityType) type, e -> true)) { + if (minecart instanceof ChestMinecartEntity chest) { + if (chest.getCommandTags().contains("minecartsloadchunks_ignore")) + continue; + + if (chest.getLootTable() != null) { + chest.addCommandTag("minecartsloadchunks_ignore"); + } + } + + System.out.println(minecart.getPos()); if (!getConfig().alwaysLoad) { boolean isMoving = minecart.getVelocity().lengthSquared() > 1e-6; if (isMoving) MINECART_LAST_MOVED.put(minecart.getUuid(), currentTick); diff --git a/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java b/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java index eaac56d..714ccfc 100644 --- a/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java +++ b/src/main/java/D7lan/minecartsloadchunks/world/WorldChunksManager.java @@ -75,9 +75,7 @@ public static int loadPersistentChunksForWorld(ServerWorld world) { // we get the expiry tick (500), minus the saved tick (300) // that is what remained for the chunk to be unloaded // so we get the currentTick + what remained, and there we go - System.out.println("BEFORE: " + chunkData.expiryTick); chunkData.expiryTick = currentTick + chunkData.expiryTick - chunkData.savedTick; - System.out.println("AFTER: " + chunkData.expiryTick); boolean isChunkForced = chunkData.expiryTick > currentTick; world.setChunkForced(chunkData.pos.x, chunkData.pos.z, isChunkForced); @@ -105,6 +103,12 @@ public static int loadPersistentChunksForWorld(ServerWorld world) { public static int savePersistentChunksForWorld(ServerWorld world) { long currentTick = world.getServer().getTicks(); + Optional optionalFile = getPersistentFileForWorld(world); + if (optionalFile.isEmpty()) { + System.out.println("[!] [MinecartsLoadChunks] Could not save world, since the file could not be created."); + return 0; + } + WorldData worldData = WORLD_DATA.getOrDefault(world, new WorldData(world)); Collection forcedChunks = worldData.getChunks(); @@ -112,12 +116,6 @@ public static int savePersistentChunksForWorld(ServerWorld world) { data.savedTick = currentTick; } - Optional optionalFile = getPersistentFileForWorld(world); - if (optionalFile.isEmpty()) { - System.out.println("[!] [MinecartsLoadChunks] Could not save world, since the file could not be created."); - return 0; - } - Gson gson = new GsonBuilder().setPrettyPrinting().create(); try (FileWriter writer = new FileWriter(optionalFile.get())) { gson.toJson(forcedChunks, writer); @@ -157,14 +155,12 @@ public static void freeChunks(ServerWorld world) { WorldData worldData = WORLD_DATA.get(world); long currentTick = world.getServer().getTicks(); - synchronized (worldData.chunkData) { - Iterator iterator = worldData.getChunks().iterator(); - while (iterator.hasNext()) { - ChunkData data = iterator.next(); - if (currentTick > data.expiryTick) { - world.setChunkForced(data.pos.x, data.pos.z, false); - iterator.remove(); - } + Iterator iterator = worldData.getChunks().iterator(); + while (iterator.hasNext()) { + ChunkData data = iterator.next(); + if (currentTick > data.expiryTick) { + world.setChunkForced(data.pos.x, data.pos.z, false); + iterator.remove(); } } } diff --git a/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java b/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java index b353d6b..35878a7 100644 --- a/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java +++ b/src/main/java/D7lan/minecartsloadchunks/world/WorldData.java @@ -4,39 +4,32 @@ import net.minecraft.util.math.ChunkPos; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; public class WorldData { - protected final HashMap chunkData = new HashMap<>(); + protected final ConcurrentHashMap chunkData = new ConcurrentHashMap<>(); private final ServerWorld world; public WorldData(ServerWorld world) { this.world = world; } public Optional getChunkData(ChunkPos pos) { - synchronized (chunkData) { - return Optional.ofNullable(chunkData.get(pos)); - } + return Optional.ofNullable(chunkData.get(pos)); } public Collection getChunks() { - synchronized (chunkData) { - return chunkData.values(); - } + return chunkData.values(); } public ChunkData addForcedChunk(ChunkData chunkData) { - synchronized (this.chunkData) { - return this.chunkData.put(chunkData.pos, chunkData); - } + return this.chunkData.put(chunkData.pos, chunkData); } public ChunkData unloadChunk(ChunkPos pos) { - synchronized (chunkData) { - ChunkData data = this.chunkData.remove(pos); - if (data != null) { - this.world.setChunkForced(pos.x, pos.z, false); - } - return data; + ChunkData data = this.chunkData.remove(pos); + if (data != null) { + this.world.setChunkForced(pos.x, pos.z, false); } + return data; } } \ No newline at end of file From 92b509e6cc625f1c6656db756a20ec2cd50ae531 Mon Sep 17 00:00:00 2001 From: matheusabido Date: Wed, 30 Jul 2025 21:13:22 -0400 Subject: [PATCH 3/3] removes unnecessary comments and logs --- src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java b/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java index f584862..4cc7878 100644 --- a/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java +++ b/src/main/java/D7lan/minecartsloadchunks/MinecartsLoadChunks.java @@ -47,7 +47,6 @@ private void onServerTick(MinecraftServer server) { } } - System.out.println(minecart.getPos()); if (!getConfig().alwaysLoad) { boolean isMoving = minecart.getVelocity().lengthSquared() > 1e-6; if (isMoving) MINECART_LAST_MOVED.put(minecart.getUuid(), currentTick);