No Pixelmon type in any class signature. All Pixelmon reads are by reflection in
PixelmonDexSource. A mod type in a signature fails while the class loads, before onEnable
(VaultTickets 1.0.0 died that way). This is what lets the plugin load on the Paper hub.
Why the dex numbers go through the database. Pixelmon stores the Pokedex inside the world
folder, so each backend has its own. main publishes the real numbers; everyone else reads them.
server-name has no default on purpose, so no other backend claims to be main.
Pixelmon's DexData.getPercentage returns 0.0 to 1.0, not 0 to 100. A zero with caught Pokemon
is treated as unknown. getStorage(UUID) can start a disk load, so it is only called for online
players, off the main thread. The living dex uses getOriginalParty(), not getAll(), so rental
teams do not count.
One hover placeholder, not three. ChatControl joins the hover list and splits it after
placeholders run, so one placeholder with newlines makes clean rows. Three entries would leave
blank rows.
Hover lines are parsed as MiniMessage. A future line that shows player text must escape it.
Defaults for hover lines live in HoverDefaults too, because Bukkit does not fall back to the
jar for a missing section. A test pins code and yaml together.
Menu clicks are resolved by slot, never by item name, and are cancelled first.
Economy attribution. Tag purchases and refunds are labelled tag_purchase and
tag_purchase_refund for EconomyWarehouseBridge. The bridge is reached by reflection, by method
name and parameter count, and every failure is swallowed after one warning, so a broken bridge
never breaks tags.
Custom message moderation calls ChatControl's checkRules by reflection. It is not a dry
run: matched rules really warn or punish. A message is blocked on a deny or any rise in warning
points.
The shared MariaDB was near its connection limit, so the hover feature reuses this plugin's one
Hikari pool instead of adding a second plugin.
Known rough edges: /custommessageadmin usage replies say /custommessage admin ..., which is
not a real command. The snowbirdtags.custommessages.admin.view/review/override/lock nodes are
declared but not checked; the whole admin command is gated by snowbirdtags.custommessages.admin.
/tags once collided with an old DeluxeMenus tags menu; make sure only one owns the label.