{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.triggers.SCMTrigger$SCMTriggerCause",
          "shortDescription" : "Started by an SCM change"
        }
      ]
    },
    {
      
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "refs/remotes/origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 345,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
            "branch" : [
              {
                "SHA1" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
                "name" : "refs/remotes/origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
            "branch" : [
              {
                "SHA1" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
                "name" : "refs/remotes/origin/master"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
        "branch" : [
          {
            "SHA1" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
            "name" : "refs/remotes/origin/master"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/mcMMO-Dev/mcMMO.git"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    {
      "displayPath" : "mcMMO.jar",
      "fileName" : "mcMMO.jar",
      "relativePath" : "target/mcMMO.jar"
    },
    {
      "displayPath" : "original-mcMMO.jar",
      "fileName" : "original-mcMMO.jar",
      "relativePath" : "target/original-mcMMO.jar"
    }
  ],
  "building" : False,
  "description" : None,
  "displayName" : "#345",
  "duration" : 170624,
  "estimatedDuration" : 135282,
  "executor" : None,
  "fullDisplayName" : "mcMMO #345",
  "id" : "345",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 345,
  "queueId" : 219,
  "result" : "SUCCESS",
  "timestamp" : 1783754351147,
  "url" : "https://popicraft.net/jenkins/job/mcMMO/345/",
  "builtOn" : "Builder",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/listeners/BlockListener.java",
          "src/test/java/com/gmail/nossr50/listeners/BlockListenerBonusDropsTest.java",
          "Changelog.txt"
        ],
        "commitId" : "5a1a61caa94dc9aa4446a955e0e8c904efc1e76a",
        "timestamp" : 1783748147000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix Herbalism double drops not working on beetroots\u000a\u000aAt BlockDropItemEvent time the broken block already reads as AIR, so\u000adeciding the beetroot drop tolerance from the live block type never\u000amatched BEETROOTS and the two legitimate beetroot drop materials\u000atripped the tile-entity dupe heuristic. Read the type from the event's\u000acaptured pre-break BlockState instead.\u000a",
        "date" : "2026-07-10 22:35:47 -0700",
        "id" : "5a1a61caa94dc9aa4446a955e0e8c904efc1e76a",
        "msg" : "Fix Herbalism double drops not working on beetroots",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/BlockListener.java"
          },
          {
            "editType" : "add",
            "file" : "src/test/java/com/gmail/nossr50/listeners/BlockListenerBonusDropsTest.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/test/java/com/gmail/nossr50/listeners/EntityListenerTest.java",
          "Changelog.txt",
          "src/main/java/com/gmail/nossr50/listeners/EntityListener.java"
        ],
        "commitId" : "808bc5577be1a2c70328742570c7c04c1d9e66c3",
        "timestamp" : 1783748411000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix error when a pet owned by a non-player deals damage\u000a\u000aTameable owners resolved in the damage handler are AnimalTamers and\u000anot necessarily players; the unchecked OfflinePlayer cast crashed the\u000ahandler for plugin-provided owners. The tame handler fixed the same\u000abug class earlier; this brings the damage path in line.\u000a",
        "date" : "2026-07-10 22:40:11 -0700",
        "id" : "808bc5577be1a2c70328742570c7c04c1d9e66c3",
        "msg" : "Fix error when a pet owned by a non-player deals damage",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/EntityListener.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/listeners/EntityListenerTest.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/listeners/InventoryListener.java",
          "Changelog.txt",
          "src/test/java/com/gmail/nossr50/listeners/InventoryListenerClickTest.java"
        ],
        "commitId" : "cc7442bbcc595472e468dbcaf2d6552609fe7302",
        "timestamp" : 1783748598000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix error when non-players click or drag in furnace and brewing inventories\u000a\u000aInventoryClickEvent and InventoryDragEvent report the viewer as a\u000aHumanEntity, and plugins can open container inventories for\u000ahuman-shaped entities that are not players. The click and drag\u000ahandlers cast the viewer to Player unchecked and crashed on such\u000aviewers; they now ignore non-player viewers.\u000a",
        "date" : "2026-07-10 22:43:18 -0700",
        "id" : "cc7442bbcc595472e468dbcaf2d6552609fe7302",
        "msg" : "Fix error when non-players click or drag in furnace and brewing inventories",
        "paths" : [
          {
            "editType" : "add",
            "file" : "src/test/java/com/gmail/nossr50/listeners/InventoryListenerClickTest.java"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/InventoryListener.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/listeners/PlayerListener.java",
          "src/test/java/com/gmail/nossr50/listeners/PlayerListenerCommandAliasTest.java",
          "Changelog.txt"
        ],
        "commitId" : "7f3f5b41bc61ace7361929bbc338d45d725b8b60",
        "timestamp" : 1783748841000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix localized skill commands rewriting arguments that repeat the skill name\u000a\u000aThe alias rewrite replaced every occurrence of the alias text in the\u000acommand message, so arguments that repeated the alias (player names,\u000asearch terms) were rewritten along with the command token. Only the\u000aleading command token is rewritten now.\u000a",
        "date" : "2026-07-10 22:47:21 -0700",
        "id" : "7f3f5b41bc61ace7361929bbc338d45d725b8b60",
        "msg" : "Fix localized skill commands rewriting arguments that repeat the skill name",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/PlayerListener.java"
          },
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/listeners/PlayerListenerCommandAliasTest.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/listeners/PlayerListener.java",
          "src/test/java/com/gmail/nossr50/listeners/PlayerListenerFishingTest.java",
          "Changelog.txt"
        ],
        "commitId" : "4d2b088f4a4efe8316c2d7718378ede358d040e4",
        "timestamp" : 1783748881000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix error when a plugin-fired fish catch carries a non-item entity\u000a\u000aCAUGHT_FISH normally carries an Item, but the event does not enforce\u000athe caught entity's type; the HIGH-priority handler cast it unchecked\u000aand crashed on plugin-fired events with other entity types.\u000a",
        "date" : "2026-07-10 22:48:01 -0700",
        "id" : "4d2b088f4a4efe8316c2d7718378ede358d040e4",
        "msg" : "Fix error when a plugin-fired fish catch carries a non-item entity",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/listeners/PlayerListenerFishingTest.java"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/PlayerListener.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/test/java/com/gmail/nossr50/listeners/EntityListenerTest.java",
          "Changelog.txt",
          "src/main/java/com/gmail/nossr50/listeners/EntityListener.java"
        ],
        "commitId" : "81f5c55ca02d8c9d3c11bcf6b0f35bd5dea58672",
        "timestamp" : 1783749004000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix splash saturation potions losing particle and icon visibility\u000a\u000aThe saturation splash workaround re-added the effect with the short\u000aPotionEffect constructor, which resets particle and icon visibility to\u000athe defaults; custom potions brewed to hide their particles started\u000ashowing them after the splash.\u000a",
        "date" : "2026-07-10 22:50:04 -0700",
        "id" : "81f5c55ca02d8c9d3c11bcf6b0f35bd5dea58672",
        "msg" : "Fix splash saturation potions losing particle and icon visibility",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/EntityListener.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/listeners/EntityListenerTest.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/listeners/BlockListener.java",
          "src/main/java/com/gmail/nossr50/listeners/EntityListener.java"
        ],
        "commitId" : "1cad900859c47d0f8c1522d60f642164dfcfabba",
        "timestamp" : 1783749123000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Clean up listener debug reporting and stale comments\u000a\u000aExtract the duplicated PvP combat debug report in EntityListener into\u000aa shared helper, correct the entity explode handler name, and fix two\u000acomments that no longer matched the code (traveling-block cleanup\u000atimer cadence, piston retract direction).\u000a",
        "date" : "2026-07-10 22:52:03 -0700",
        "id" : "1cad900859c47d0f8c1522d60f642164dfcfabba",
        "msg" : "Clean up listener debug reporting and stale comments",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/BlockListener.java"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/EntityListener.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/listeners/InventoryListener.java",
          "Changelog.txt"
        ],
        "commitId" : "8fa27d38cc80ca3414915477dcd47e70d5416faf",
        "timestamp" : 1783749192000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Move buff-stripping inventory handlers off MONITOR priority\u000a\u000aThe inventory click and open handlers strip ability buffs from item\u000astacks, which mutates item state; the MONITOR contract forbids that.\u000aThey now run at HIGHEST like the other mutating handlers moved during\u000athe listener priority cleanup.\u000a",
        "date" : "2026-07-10 22:53:12 -0700",
        "id" : "8fa27d38cc80ca3414915477dcd47e70d5416faf",
        "msg" : "Move buff-stripping inventory handlers off MONITOR priority",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/listeners/InventoryListener.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/test/java/com/gmail/nossr50/listeners/WorldListenerTest.java"
        ],
        "commitId" : "effda0dd6f8025bba8a67cb74fa74723385b090a",
        "timestamp" : 1783749419000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Add WorldListener coverage for growth eligibility and unload flushes\u000a",
        "date" : "2026-07-10 22:56:59 -0700",
        "id" : "effda0dd6f8025bba8a67cb74fa74723385b090a",
        "msg" : "Add WorldListener coverage for growth eligibility and unload flushes",
        "paths" : [
          {
            "editType" : "add",
            "file" : "src/test/java/com/gmail/nossr50/listeners/WorldListenerTest.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java",
          "Changelog.txt",
          "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
        ],
        "commitId" : "7ea3d91ff368a556f0e05c85db46f3a81157ae70",
        "timestamp" : 1783749968000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix error when adding levels to a child skill through the API\u000a\u000aChild skills have no level entry of their own, so the read-then-modify\u000ain PlayerProfile#addLevels crashed on the missing entry before the\u000achild guard in modifySkill could run. Added levels now split evenly\u000aacross the child's parent skills, matching how child skill XP and the\u000aoffline ExperienceAPI level variants already behave. The addlevels\u000acommand rejects child skills up front, so only API callers were\u000aaffected.\u000a",
        "date" : "2026-07-10 23:06:08 -0700",
        "id" : "7ea3d91ff368a556f0e05c85db46f3a81157ae70",
        "msg" : "Fix error when adding levels to a child skill through the API",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java"
          },
          {
            "editType" : "add",
            "file" : "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java",
          "Changelog.txt",
          "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
        ],
        "commitId" : "e76d62cb5a8f78c7c4951f123cb936e03e561d4c",
        "timestamp" : 1783750036000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix error reading XP requirements for offline players with the cumulative curve\u000a\u000aWith 'Experience_Formula.Cumulative_Curve' enabled, PlayerProfile\u000aresolved the power level through UserManager, which has no entry for\u000aoffline-loaded profiles (offline /inspect, ExperienceAPI offline\u000alookups) and crashed. The profile's own level sum now stands in when\u000ano online player is found; permission-aware filtering is impossible\u000aoffline anyway. Also corrects the stale getLastLogin javadoc.\u000a",
        "date" : "2026-07-10 23:07:16 -0700",
        "id" : "e76d62cb5a8f78c7c4951f123cb936e03e561d4c",
        "msg" : "Fix error reading XP requirements for offline players with the cumulative curve",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java"
        ],
        "commitId" : "49ff833b9c475cbd3cd6d8ee6a77ac7cc278648c",
        "timestamp" : 1783750154000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Clean up McMMOPlayer XP gain and logout paths\u000a\u000aCompute the modified XP once in beginUnsharedXpGain instead of running\u000athe permission-heavy perk modifier twice per gain (which also sent the\u000aXP perk debug report to debug-mode players twice), and reuse the local\u000aplayer reference in logout instead of re-reading a field that is never\u000anull.\u000a",
        "date" : "2026-07-10 23:09:14 -0700",
        "id" : "49ff833b9c475cbd3cd6d8ee6a77ac7cc278648c",
        "msg" : "Clean up McMMOPlayer XP gain and logout paths",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
        ],
        "commitId" : "cdc0f61d89a8338cae8bd7702a03123907a1e239",
        "timestamp" : 1783750354000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Add PlayerProfile coverage for save retries and child-skill data handling\u000a",
        "date" : "2026-07-10 23:12:34 -0700",
        "id" : "cdc0f61d89a8338cae8bd7702a03123907a1e239",
        "msg" : "Add PlayerProfile coverage for save retries and child-skill data handling",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java",
          "Changelog.txt",
          "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
        ],
        "commitId" : "43a5f944b494fa9f7809b7731ebdd665e53fca9b",
        "timestamp" : 1783751158000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix error when another plugin reads raw XP for a child skill\u000a\u000aChild skills store no XP entry of their own, so the raw XP read\u000acrashed on the missing entry. Zero is returned instead, matching\u000agetSkillXpLevel. In-repo callers filter child skills first; only\u000aplugins calling the profile API directly were affected.\u000a",
        "date" : "2026-07-10 23:25:58 -0700",
        "id" : "43a5f944b494fa9f7809b7731ebdd665e53fca9b",
        "msg" : "Fix error when another plugin reads raw XP for a child skill",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java"
          },
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java",
          "Changelog.txt",
          "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
        ],
        "commitId" : "b249b4dfcb9b92074c71d06afc42042402bda0fa",
        "timestamp" : 1783751213000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Fix player data changes made during an in-flight save being lost\u000a\u000aThe dirty flag was overwritten unconditionally once the database\u000areturned, so a change that landed while the async save was writing its\u000acopy was marked clean and skipped by later saves until the next\u000aunrelated change. The flag is now cleared before the copy is taken and\u000aonly restored on failure, so concurrent changes re-mark the profile\u000adirty and the next save picks them up. Answers the old TODO about\u000asynchronizing the copy: value races during the copy self-heal through\u000athe dirty flag, so no lock is needed.\u000a",
        "date" : "2026-07-10 23:26:53 -0700",
        "id" : "b249b4dfcb9b92074c71d06afc42042402bda0fa",
        "msg" : "Fix player data changes made during an in-flight save being lost",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java"
          },
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/datatypes/player/PlayerProfileTest.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java",
          "src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java",
          "Changelog.txt"
        ],
        "commitId" : "ce2ae27ae198588b42ef5f42c5e9fd3b3d96fca4",
        "timestamp" : 1783751249000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Deprecate the misspelled PlayerProfile Chimaera Wing cooldown getter\u000a\u000agetChimaerWingDATS is missing a letter; getChimaeraWingDATS replaces\u000ait and the old name delegates until removal.\u000a",
        "date" : "2026-07-10 23:27:29 -0700",
        "id" : "ce2ae27ae198588b42ef5f42c5e9fd3b3d96fca4",
        "msg" : "Deprecate the misspelled PlayerProfile Chimaera Wing cooldown getter",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/test/java/com/gmail/nossr50/util/skills/SkillToolsTest.java",
          "Changelog.txt",
          "src/main/java/com/gmail/nossr50/util/skills/SkillTools.java"
        ],
        "commitId" : "2b85a6fc726b00f53c0814fa289cdb0707cba6ef",
        "timestamp" : 1783752481000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Stop console spam when other plugins check skill names through the API\u000a\u000aUnmatched skill name lookups logged an 'Invalid mcMMO skill' warning on\u000aevery call, so plugins validating names through ExperienceAPI flooded the\u000aconsole. The message is now debug output shown only with Verbose_Logging.\u000a",
        "date" : "2026-07-10 23:48:01 -0700",
        "id" : "2b85a6fc726b00f53c0814fa289cdb0707cba6ef",
        "msg" : "Stop console spam when other plugins check skill names through the API",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/test/java/com/gmail/nossr50/util/skills/SkillToolsTest.java"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/util/skills/SkillTools.java"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java",
          "Changelog.txt",
          "src/test/java/com/gmail/nossr50/commands/experience/AddxpCommandTest.java"
        ],
        "commitId" : "bb6a395fc67638db93cffa4b056270eaf7cbcda9",
        "timestamp" : 1783753760000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Make the -s flag on XP commands silence the sender confirmation too\u000a\u000a/addxp, /addlevels, and /mmoedit echoed 'has been modified' back to the\u000asender even with -s, flooding the log for plugins that award XP by\u000adispatching these commands from console.\u000a",
        "date" : "2026-07-11 00:09:20 -0700",
        "id" : "bb6a395fc67638db93cffa4b056270eaf7cbcda9",
        "msg" : "Make the -s flag on XP commands silence the sender confirmation too",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java"
          },
          {
            "editType" : "add",
            "file" : "src/test/java/com/gmail/nossr50/commands/experience/AddxpCommandTest.java"
          },
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "src/test/java/com/gmail/nossr50/datatypes/player/McMMOPlayerAddXpAndLevelsTest.java",
          "src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java",
          "src/main/java/com/gmail/nossr50/util/EventUtils.java",
          "Changelog.txt"
        ],
        "commitId" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
        "timestamp" : 1783753789000,
        "author" : {
          "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
          "fullName" : "nossr50"
        },
        "authorEmail" : "nossr50@gmail.com",
        "comment" : "Route McMMOPlayer addXp and addLevels through level up processing\u000a\u000aBoth wrote raw values into the profile, so plugins using them left\u000askills over their XP threshold with no level ups, events, or XP bar\u000aupdates. addXp now runs the normal XP gain path with the amount\u000aunmodified, and addLevels fires the level change events like the\u000aaddlevels command. Internal callers that revert cancelled events or\u000aapply vampirism gains keep raw writes via the profile.\u000a",
        "date" : "2026-07-11 00:09:49 -0700",
        "id" : "df4cdce38ca8641eb3add62c2ab973f9ad0e253a",
        "msg" : "Route McMMOPlayer addXp and addLevels through level up processing",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Changelog.txt"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java"
          },
          {
            "editType" : "add",
            "file" : "src/test/java/com/gmail/nossr50/datatypes/player/McMMOPlayerAddXpAndLevelsTest.java"
          },
          {
            "editType" : "edit",
            "file" : "src/main/java/com/gmail/nossr50/util/EventUtils.java"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://popicraft.net/jenkins/user/nossr50",
      "fullName" : "nossr50"
    }
  ]
}