Skip to content

Pixelmon Tickets (skintickets)

Tradable paper tickets that players redeem for a Pokemon skin (palette), an extra PC box, an extra Day Care slot, or an extra vault page. Every ticket has a unique serial, so copies are caught and removed.

What it does

Four ticket types, all plain paper with hidden server data (no client mod needed):

Ticket Redeems for
Skin ticket Applies a Pixelmon palette to a party Pokemon that supports it
PC Box Expansion Ticket One more 30-slot PC box
Breeding Slot Expansion Ticket One more Day Care slot
Vault Expansion Ticket One more AxVaults vault page (needs the VaultTickets plugin)
  • Tickets can be traded, stored, sold by a shop or handed out at events. They do not stack.
  • Anti-dupe: every ticket's serial is registered in a shared database. Online inventories are checked every few seconds. Copies, unknown, revoked and already-used serials are removed and online admins are alerted. Redeeming marks the serial used in one database step, so two copies on two servers cannot both work.
  • If the database is down, giving and redeeming tickets fail safely. A real ticket is never used up without the reward.
  • Old 1.1.0 name-tag skin tickets are swapped for the paper version automatically, same serial.

Server-side only. Clients install nothing.

How players use it

Skin ticket: right-click it. A menu shows your party. Only Pokemon whose current form and gender support that skin can be picked. The ticket is used only after the skin is applied.

Expansion tickets: right-click, then confirm. The ticket is used only after the upgrade is saved. PC boxes and Day Care slots apply at once.

Skin tickets are sold in /shop under Skin Tickets. Some tickets only fit one species (for example a Pikachu-only skin); the ticket says so.

Staff guide

/skinticket needs op level 2 (console works). Players never run it themselves; shops and the web store run it as console.

Task Command
Give a skin ticket usable on any compatible Pokemon /skinticket give <players> <skin> [count]
Give a skin ticket for one species only /skinticket givefor <players> <species> <skin> [count]
Give a PC box, Day Care slot or vault page ticket /skinticket givepc\|givebreeding\|givevault <players> [count]
Change the player's count directly, no ticket (2.3.0+) /skinticket addpc\|addbreeding\|addvault <players> <count>
/skinticket give SnowBirdMV drowned 1
/skinticket givefor SnowBirdMV Pikachu drowned 1
/skinticket givepc SnowBirdMV 1
/skinticket addbreeding SnowBirdMV 2
  • Unknown skins, and species and skin pairs that cannot exist, are refused.
  • For a shop or NPC vendor, set the purchase to run the command as console with the buyer as <players>. The shop generator and rules are in the ops repo (documentation/plugins/skin-ticket-vendor.md).
  • add... counts can be negative, for refunds. A negative addpc is destructive: Pokemon in boxes above the new limit are deleted at the next save. Check the player's boxes first. A negative addvault hides the items on the removed page. A negative addbreeding loses nothing. Counts never go below zero.

Configuration

config/skintickets/config.properties. Restart after changes.

Key What it is for
database.host, database.port, database.name, database.user, database.password The shared MariaDB database. Every server that can load the same Pixelmon PC data must use the same database
server.name This server's name, saved with each ticket
expansions.max-vault-tabs Highest total vault pages a player can reach

PC box and Day Care maximums are not set here any more. They are set in config/pixelmonbridge/capacity.properties (see pixelmonbridge). If old expansions.max-pc-boxes or expansions.max-breeding-slots keys are still in this file they are ignored, and an error is logged when they disagree with pixelmonbridge.

Data and storage

MariaDB:

Table Holds
skin_tickets Every ticket serial: type, skin, species, who issued it, to whom, state (issued or redeemed)
skin_ticket_expansions Each player's purchased PC boxes, Day Care slots and vault pages

Never delete rows from either table. Removing a serial turns real tickets into "unknown" tickets that the sweep deletes. Removing an expansion row takes away what the player bought.

Troubleshooting

Symptom Cause Fix
A ticket vanished from a player's inventory and admins got an alert Duplicate, revoked, unknown or used serial Check the serial in skin_tickets. Re-issue only if it was legitimate
Giving or redeeming fails with a database error MariaDB unreachable or wrong login Check the database and config.properties. Nothing was used up
Vault ticket says it cannot be redeemed here VaultTickets plugin not installed or not loaded on this server Install VaultTickets. Look for Vault tab bridge registered by ... in the log
Skin ticket shows no Pokemon to pick No party Pokemon has that palette in its current form and gender Expected. Change form or use a different Pokemon
Player's PC box count looks wrong Limits come from pixelmonbridge now Check config/pixelmonbridge/capacity.properties

Boot line that shows the database is up: Skin Tickets database connected for server '<name>'. Each redemption logs <player> redeemed ....

Maintainer notes

  • PC boxes and Day Care slots are applied through pixelmonbridge. This mod is a capacity provider: it reports what the player bought, and the bridge combines every provider and applies the result. After saving an entitlement it calls applyLive, which recomputes from scratch, so calling it twice cannot double-grant.
  • Vault pages are a Bukkit permission, and a NeoForge mod cannot reach Bukkit or LuckPerms. The VaultTickets plugin registers a VaultTabBridge here when it starts (plugin-to-mod works on Youer; mod-to-plugin does not). No bridge means vault tickets are refused, not silently used up.
  • For an expansion ticket, the serial claim and the entitlement are saved in the same transaction.
  • The add... commands exist so a web-store purchase can raise the count directly. Bundle: manual_uploads/2026-08-26-skintickets-2.3.0-direct-grant/.
  • Skin handling (PaletteRules, the party read and icon build in TicketRedeemer) stays here because it has one consumer.

Building

./gradlew clean test build

Output: build/libs/skintickets-<version>.jar.

Full command, permission and config tables: Reference.