From a429588ecba4e17ec6db10280a18fcb897de0dd0 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Fri, 23 Oct 2026 16:24:55 +0100 Subject: [PATCH] Keep steam drill progress after reload --- .github/workflows/ci.yml | 6 ++-- .gitignore | 19 ++++++++++ CHANGELOG.txt | 7 ++++ README.md | 6 ++++ build.gradle | 6 ++-- gradle.properties | 2 +- .../steamadvantage/SteamAdvantage.java | 2 +- .../machines/SteamDrillTileEntity.java | 17 +++++++-- .../machines/SteamDrillPersistenceTest.java | 35 +++++++++++++++++++ 9 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 src/test/java/com/mcmoddev/steamadvantage/machines/SteamDrillPersistenceTest.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9265834..f7cebcd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,9 +80,9 @@ jobs: if-no-files-found: error retention-days: 30 path: | - build/libs/SteamAdvantage-2.2.1.112021.jar - build/libs/SteamAdvantage-2.2.1.112021-sources.jar - build/libs/SteamAdvantage-2.2.1.112021-javadoc.jar + build/libs/SteamAdvantage-2.2.2.112021.jar + build/libs/SteamAdvantage-2.2.2.112021-sources.jar + build/libs/SteamAdvantage-2.2.2.112021-javadoc.jar build/release/SHA256SUMS CHANGELOG.txt diff --git a/.gitignore b/.gitignore index 4502811..4933367 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,25 @@ /replay_pid*.log /secret.json +# Nested local tooling and generated output +AGENTS.md +AGENT.md +CLAUDE.md +GEMINI.md +ARCHITECT.md +agent-notes/ +.codex/ +.agent/ +.agents/ +.claude/ +.gemini/ +.cursor/ +agent-*.md +codex-*.md +*.log +*.class +__pycache__/ +*.pyc /.DS_Store /README.txt /forge-*-changelog.txt diff --git a/CHANGELOG.txt b/CHANGELOG.txt index ee7ce40..9e1bd05 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,10 @@ +Steam Advantage 2.2.2.112021 + +- Retain unfinished drill progress when rebuilding the mining target after a world or chunk reload. +- Clear stale deferred target data when loading an untargeted tile; clamp restored progress to current target hardness. +- Refresh the drill's redstone state before its first resumed tick so saved work is not discarded by an uninitialized control cache. +- Preserve registry identities, saved target coordinates, inventories, energy and the existing progress NBT key. + Steam Advantage 2.2.1.112021 - Move the Minecraft 1.12.2 build to ForgeGradle 7 and Gradle 9.6.1. diff --git a/README.md b/README.md index 2550acd..46adcdb 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ Steam Advantage adds steam-powered machines and infrastructure to Power Advantage for Minecraft 1.12.2. +## Drill Reload Fix + +Version `2.2.2.112021` keeps unfinished drill work when a chunk or world reloads. +Existing inventories, energy, orientation and saved-world names are unchanged. +The regression tests cover resumed progress and full server restarts. + ## Building Minecraft 1.12.2 The `master-1.12.2` build uses ForgeGradle 7.0.34 and Gradle 9.6.1. Run Gradle with Java 17; Gradle resolves the Java 8 toolchain used for compilation. diff --git a/build.gradle b/build.gradle index ec616e3..198a467 100644 --- a/build.gradle +++ b/build.gradle @@ -169,6 +169,8 @@ dependencies { // PowerAdvantage is required at runtime but remains a separate mod jar. compileOnly files(powerAdvantageDeobfJar) runtimeOnly files(powerAdvantageDeobfJar) + testImplementation files(powerAdvantageDeobfJar) + testImplementation 'junit:junit:4.13.2' } tasks.named('processResources', ProcessResources) { @@ -298,7 +300,7 @@ tasks.register('verifyReleaseConfiguration') { group = 'verification' description = 'Validates release identity, target metadata, and dependency policy.' doLast { - if (project.mod_version != '2.2.1.112021') { + if (project.mod_version != '2.2.2.112021') { throw new GradleException("Unexpected SteamAdvantage release version: ${project.mod_version}") } if (project.minecraft_version != '1.12.2' @@ -341,7 +343,7 @@ tasks.register('verifyReleaseConfiguration') { String mainSource = file( 'src/main/java/com/mcmoddev/steamadvantage/SteamAdvantage.java').getText('UTF-8') if (!mainSource.contains('MODID = "steamadvantage"') - || !mainSource.contains('VERSION = "2.2.1.112021"') + || !mainSource.contains('VERSION = "2.2.2.112021"') || !mainSource.contains('dependencies = "required-after:poweradvantage;after:basemetals"')) { throw new GradleException('SteamAdvantage source identity or dependency policy changed') } diff --git a/gradle.properties b/gradle.properties index 27145bc..d646ca9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,7 +24,7 @@ curseforge_project_id=240984 mod_id=steamadvantage mod_name=Steam Advantage mod_license=GPL-3.0-only -mod_version=2.2.1.112021 +mod_version=2.2.2.112021 mod_group=com.mcmoddev.steamadvantage mod_authors=DrCyano mod_description=Steam-powered machines and infrastructure for the Power Advantage platform. diff --git a/src/main/java/com/mcmoddev/steamadvantage/SteamAdvantage.java b/src/main/java/com/mcmoddev/steamadvantage/SteamAdvantage.java index 2da0ed2..33a0f0e 100644 --- a/src/main/java/com/mcmoddev/steamadvantage/SteamAdvantage.java +++ b/src/main/java/com/mcmoddev/steamadvantage/SteamAdvantage.java @@ -43,7 +43,7 @@ public class SteamAdvantage /** The display name for this mod */ public static final String NAME = "Steam Advantage"; /** The version of this mod, in the format major.minor.update */ - public static final String VERSION = "2.2.1.112021"; + public static final String VERSION = "2.2.2.112021"; public static float MUSKET_DAMAGE = 20; public static int MUSKET_RELOAD = 20*5; diff --git a/src/main/java/com/mcmoddev/steamadvantage/machines/SteamDrillTileEntity.java b/src/main/java/com/mcmoddev/steamadvantage/machines/SteamDrillTileEntity.java index 3382e04..e8a8cd5 100644 --- a/src/main/java/com/mcmoddev/steamadvantage/machines/SteamDrillTileEntity.java +++ b/src/main/java/com/mcmoddev/steamadvantage/machines/SteamDrillTileEntity.java @@ -59,7 +59,7 @@ public SteamDrillTileEntity() { public void tickUpdate(boolean isServerWorld) { if(isServerWorld){ if(deferred){ - targetBlock(targetBlockCoord); + restoreTargetBlock(); } EnumFacing face = this.getFacing(); if(oldDir == null){ @@ -226,7 +226,7 @@ public void onDataFieldUpdate() { private int oldProgress = 0; @Override public void powerUpdate(){ if(deferred){ - targetBlock(targetBlockCoord); + restoreTargetBlock(); } super.powerUpdate(); boolean flagSync = progress != oldProgress || oldEnergy != getEnergy(Power.steam_power); @@ -334,12 +334,21 @@ private void targetBlock (BlockPos n){ deferred = false; } + private void restoreTargetBlock(){ + int savedProgress = progress; + // Rebuild transient drops and hardness without discarding saved work. + targetBlock(targetBlockCoord); + progress = Math.max(0, Math.min(savedProgress, progressGoal)); + redstone = hasRedstoneSignal(); + } + private void deferredTargetBlock (BlockPos n){ targetBlockCoord = n; deferred = true; } private void untargetBlock(){ + deferred = false; progress = 0; progressGoal = 0; targetBlockCoord = null; @@ -453,6 +462,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound tagRoot){ @Override public void readFromNBT(NBTTagCompound tagRoot){ super.readFromNBT(tagRoot); + untargetBlock(); if(tagRoot.hasKey("Facing")){ int facingIndex = tagRoot.getByte("Facing"); if(facingIndex >= 0 && facingIndex < EnumFacing.values().length){ @@ -470,7 +480,8 @@ public void readFromNBT(NBTTagCompound tagRoot){ if(powerAdvantageWorld() == null){ this.deferredTargetBlock(new BlockPos(x,y,z)); } else { - this.targetBlock(new BlockPos(x,y,z)); + this.deferredTargetBlock(new BlockPos(x,y,z)); + this.restoreTargetBlock(); } } } diff --git a/src/test/java/com/mcmoddev/steamadvantage/machines/SteamDrillPersistenceTest.java b/src/test/java/com/mcmoddev/steamadvantage/machines/SteamDrillPersistenceTest.java new file mode 100644 index 0000000..d608986 --- /dev/null +++ b/src/test/java/com/mcmoddev/steamadvantage/machines/SteamDrillPersistenceTest.java @@ -0,0 +1,35 @@ +package com.mcmoddev.steamadvantage.machines; + +import net.minecraft.nbt.NBTTagCompound; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class SteamDrillPersistenceTest { + @Test public void retainsLegacyProgressBeforeWorldAttachment() { + SteamDrillTileEntity drill = new SteamDrillTileEntity(); + drill.readFromNBT(target(17)); + drill.prepareDataFieldsForSync(); + assertEquals(17, drill.getDataFieldArray()[1]); + } + + @Test public void untargetedDataClearsPendingWork() throws Exception { + SteamDrillTileEntity drill = new SteamDrillTileEntity(); + drill.readFromNBT(target(17)); + drill.readFromNBT(new NBTTagCompound()); + drill.prepareDataFieldsForSync(); + assertEquals(0, drill.getDataFieldArray()[1]); + java.lang.reflect.Field target = SteamDrillTileEntity.class.getDeclaredField("targetBlockCoord"); + target.setAccessible(true); + assertNull(target.get(drill)); + } + + private static NBTTagCompound target(int progress) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setShort("progress", (short) progress); + tag.setInteger("targetX", 2048); + tag.setInteger("targetY", 80); + tag.setInteger("targetZ", 2049); + return tag; + } +}