Skip to content

Maintainer notes

  • Granting from code. Use the SnowbirdTagsApi service instead of console commands. The future completes after MariaDB and the cache are updated.
RegisteredServiceProvider<SnowbirdTagsApi> registration =
    Bukkit.getServicesManager().getRegistration(SnowbirdTagsApi.class);
registration.getProvider().grant(uuid, name, "champion", "tournament:season-4");
  • 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.