<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>362</buildNumber><marked><SHA1>4a33756ca0689495d3c9e2f31fa310326fa01710</SHA1><branch><SHA1>4a33756ca0689495d3c9e2f31fa310326fa01710</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>4a33756ca0689495d3c9e2f31fa310326fa01710</SHA1><branch><SHA1>4a33756ca0689495d3c9e2f31fa310326fa01710</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>4a33756ca0689495d3c9e2f31fa310326fa01710</SHA1><branch><SHA1>4a33756ca0689495d3c9e2f31fa310326fa01710</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/mcMMO-Dev/mcMMO.git</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><artifact><displayPath>mcMMO.jar</displayPath><fileName>mcMMO.jar</fileName><relativePath>target/mcMMO.jar</relativePath></artifact><artifact><displayPath>original-mcMMO.jar</displayPath><fileName>original-mcMMO.jar</fileName><relativePath>target/original-mcMMO.jar</relativePath></artifact><building>false</building><displayName>#362</displayName><duration>63593</duration><estimatedDuration>66807</estimatedDuration><fullDisplayName>mcMMO #362</fullDisplayName><id>362</id><inProgress>false</inProgress><keepLog>false</keepLog><number>362</number><queueId>309</queueId><result>SUCCESS</result><timestamp>1790125454100</timestamp><url>https://popicraft.net/jenkins/job/mcMMO/362/</url><builtOn>Builder</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java</affectedPath><commitId>4fb5035aebd30d34d2cb5ba9835ef520a90662be</commitId><timestamp>1790124370000</timestamp><author><absoluteUrl>https://popicraft.net/jenkins/user/nossr50</absoluteUrl><fullName>nossr50</fullName></author><authorEmail>nossr50@gmail.com</authorEmail><comment>Report FlatFile writes that fail instead of claiming success

writeStringToFileSafely logged and swallowed any IOException from the
write, so every operation that rewrote mcmmo.users returned success
whether or not anything reached disk. saveUser told PlayerProfile the
profile was saved, so it was never retried. saveUserUUIDs told the UUID
upgrade its batch was stored, and removeUser, saveUserUUID and
purgePowerlessUsers reported changes that never happened.

The helper now returns whether the write went through, rewriteUsersFile
returns it, and each caller passes it on and skips its success logging
when it failed. The users file writer is opened through a package-private
factory, alongside the existing reader factory, so tests can make it fail.

The mid-read failure tests are split into one parameterized case per
operation so each broken path fails on its own, and write failures get
the same coverage.
</comment><date>2026-09-22 17:46:10 -0700</date><id>4fb5035aebd30d34d2cb5ba9835ef520a90662be</id><msg>Report FlatFile writes that fail instead of claiming success</msg><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java</file></path><path><editType>edit</editType><file>src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>Changelog.txt</affectedPath><commitId>a9bed7cd00ce445695291e0834f844fd36c7f4e6</commitId><timestamp>1790124371000</timestamp><author><absoluteUrl>https://popicraft.net/jenkins/user/nossr50</absoluteUrl><fullName>nossr50</fullName></author><authorEmail>nossr50@gmail.com</authorEmail><comment>Credit cyrne1-7208 for the FlatFile read failure fix
</comment><date>2026-09-22 17:46:11 -0700</date><id>a9bed7cd00ce445695291e0834f844fd36c7f4e6</id><msg>Credit cyrne1-7208 for the FlatFile read failure fix</msg><path><editType>edit</editType><file>Changelog.txt</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>src/test/java/com/gmail/nossr50/commands/skills/SmeltingCommandTest.java</affectedPath><commitId>4a33756ca0689495d3c9e2f31fa310326fa01710</commitId><timestamp>1790125201000</timestamp><author><absoluteUrl>https://popicraft.net/jenkins/user/nossr50</absoluteUrl><fullName>nossr50</fullName></author><authorEmail>nossr50@gmail.com</authorEmail><comment>Cover the /smelting Vanilla XP multiplier line against a real advanced.yml

The existing Smelting tests stub the config getter, so nothing checked that
a value typed into advanced.yml reaches the stat line players see. The new
test writes an edited copy of the shipped advanced.yml, loads it through
AdvancedConfig, and runs the real SmeltingCommand stat steps.

It pins that configured whole numbers are shown at every rank, that
decimals are rounded down and never shown below 1x, and that the line is
hidden until Understanding The Art unlocks. Showing the rank instead of
the configured value fails it.
</comment><date>2026-09-22 18:00:01 -0700</date><id>4a33756ca0689495d3c9e2f31fa310326fa01710</id><msg>Cover the /smelting Vanilla XP multiplier line against a real advanced.yml</msg><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/commands/skills/SmeltingCommandTest.java</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://popicraft.net/jenkins/user/nossr50</absoluteUrl><fullName>nossr50</fullName></culprit></freeStyleBuild>