RPGSkills-3.0.3.jar
What's new
[FIX] Maven could not resolve paper-api
Cause: the papermc repository had no <snapshots> block. Maven disables
snapshot resolution per repository by default, so it refused to look there
at all, then reported the artifact missing from the release-only repos.
Fix: snapshots enabled on papermc, explicitly disabled on the other four.
[FIX] com.mojang:brigadier could not be resolved
Cause: a transitive dependency of paper-api, published by Mojang and only
proxied by Paper's repository - which a repository-prefix filter misses.
Fix: Mojang's own repository declared explicitly in pom.xml.
[FIX] Plugin crashed on startup with NullPointerException (EssentialsX)
Cause: a debug logging line called economy.format() during reload().
Economy plugins register with Vault before they finish initialising, so
the call hit a null settings object while another plugin was still
enabling. Two further faults in the same line:
- the message was built BEFORE debug() was called, so the economy call
ran even with debug disabled - the "gate" was never a gate;
- VaultHook.format() let any provider exception propagate.
Fix: debug() now takes a supplier; startup never calls the economy;
VaultHook wraps every provider call and warns once on failure.
[FIX] Plugin failed to start when PlaceholderAPI was absent
Cause: PlaceholderHook extends PlaceholderExpansion. A class extending a
missing type cannot be LOADED, so no guard inside it can ever run.
Fix: every reference isolated in a helper called only when PAPI exists.
[FIX] Migration V8 crashed the server (SQLITE_ERROR near "%")
Cause: `"...%s..." + "...%s...".formatted(a, b)` - method invocation binds
tighter than '+', so only the second literal was formatted and a raw %s
reached SQLite.
Fix: single literal per statement. All 9 migrations verified.
[FIX] 24 compilation errors, then 2, then 1 (across several build cycles)
Included: duplicated constant block, PlayerDeathEvent imported from the
wrong package, a private-constructor utility being instantiated, an
override narrowing access, and a LuckPerms Optional I got backwards twice.
[FIX] serialVersionUID missing on 3 exception classes
[FIX] ~46 build warnings from paper-api's annotations
Fix: org.jetbrains:annotations added as a provided dependency.
[ADD] Central ownership framework
SummonKeys - the ONLY writer of ownership data (persistent data)
SummonRecord - owner, type, source skill, lifetime, behaviour
SummonManager - the single authority on lifecycle and limits
RelationshipManager - one answer to "how do these two entities stand?"
TargetingService - one gate every target selection passes through
[FIX] Summons could attack their owner
Cause: protection was attempted at the damage event. Cancelling damage
stops the hit but not the intent - the mob has already SELECTED its owner,
so it keeps pathing, keeps swinging, and fires a cancelled event forever.
Fix: enforcement moved to EntityTargetEvent, so the owner is invisible to
vanilla's targeting goals. Damage cancellation kept as a second layer.
[FIX] Necromancer summon skills spawned nothing at all
Cause: the entry guard validated the legacy `entity:` field before the
preferred `mob:` path was reached. A skill written as `mob: risen-skeleton`
has no entity type, so apply() returned on its first line. Every summon
skill in the plugin was dead.
[FIX] Per-type summon limits never applied
Cause: the limit key passed was the MOB id while the config and the manager
both use the SKILL id, so no cap ever matched.
[FIX] Summons became permanent after a restart or crash
Cause: summons are persistent entities and return from disk, but sessions
live only in memory. With no expiry stamped on the entity itself, every
summon alive at that moment became a permanent uncontrolled mob.
Fix: the entity carries its own expiry, set deliberately LATER than its
session's, so the session wins normally and the stamp is the net.
[FIX] A summon's kill was worth no experience
Cause: victim.getKiller() returns null when a summon lands the blow.
Fix: the last damager resolves back through ownership to its owner.
[ADD] Reusable mob definitions (mobs.yml, 7 entries)
Stats are formulas against the owner: "owner_max_health * 0.5". A skill
names a mob rather than describing one, so changing the Fire Elemental
once changes every skill that summons it.
[ADD] Raise Dead (Necromancer)
risen-warrior existed in mobs.yml but no skill could reach it.
[ADD] Summon sessions, 7 events, /rpg summon command, management GUI,
6 replacement policies, global/dungeon/party caps, and public API.
[FIX] Players ended up with several pets at once
Cause: PetInstance.entityId is in-memory only. Any path that rebuilt the
collection produced a pet marked active with no entity handle, so the
cleanup - which looked the pet up BY ID - silently did nothing before
spawning a replacement. Worse, the tick loop respawned a pet whenever
Bukkit.getEntity returned null, which it does for any UNLOADED chunk. That
respawned a pet every second one drifted out of view.
Fix: every spawn path sweeps by ownership stamp first. Three guards run
before anything is removed - must carry a stamp, must match this
owner, must be a pet - so a hand-tamed wolf is never touched.
[FIX] Pets never attacked anything
Cause: pets were spawned in FOLLOW mode, which does not seek targets, and
no code anywhere set a target. Every pet was decorative.
Fix: per-pet behaviour in pets.yml, defending the owner before hunting,
only Monster types targeted, 8-second recency window on threats.
[FIX] Pets could only level from their owner's kills
[FIX] Buying an evolved form dead-ended its earlier form
A bought Dire Wolf meant a Wolf Pup silently stopped evolving forever.
Fix: the two merge, higher level wins, lower form consumed.
[ADD] Pet shop (7 pets, all purchasable), active-pet limit, summon cooldown,
targeted dismissal, and gated debug logging (pets.yml -> debug).
[FIX] All bosses had identical health
Cause: the server clamps the max-health attribute, silently. Necro Lord
(1200), Ember Tyrant (2400) and Void Sovereign (8000) all clamped to the
same ceiling, so the endgame boss was no tougher than the level-25 one.
setHealth() then threw because it exceeded the real maximum, and the boss
bar showed a full boss at ~13% - firing every phase change on spawn.
Fix: the applied value is READ BACK rather than assumed, and damage is
scaled by the same ratio, so each boss still takes its designed
damage to kill. Same fix applied to boss adds, dungeon mobs and
summons.
[FIX] ExpressionEvaluator threw on a null formula
An omitted YAML key reads as null - the commonest config mistake there is -
and the "or default" method threw instead of returning the default.
29 call sites, including the armour formula.
[FIX] Area damage hit the caster's own summons and party
Fix: TargetSelector now asks the same relationship authority.
[FIX] Menus showed raw tags: <points>, <total>, <description>
Cause: the lore asked for names the builder never supplied. Found in 5
menus, not just the one reported: Attributes, Class Info, Skill Info,
Skill Bind and the Upgrade Forge.
[FIX] One malformed config line blanked an entire menu
Fix: rendering now fails per line, falling back to plain text and naming
the broken line in the console once.
[FIX] The attribute reset button claimed a cost - resetting is free.
[ADD] Guild GUI rebuilt
GuildService exposes 15 actions; the old GUI reached four. Added an
interactive bank (deposit/withdraw by click), message of the day, leave
and disband with confirmation, an online-members row, and a full roster
menu with promote, demote, kick and leadership transfer. Permissions are
checked BEFORE a button is offered, so the icon says why it is unavailable.
You cannot promote anyone to or past your own rank.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects

