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 negativeaddpcis destructive: Pokemon in boxes above the new limit are deleted at the next save. Check the player's boxes first. A negativeaddvaulthides the items on the removed page. A negativeaddbreedingloses 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
VaultTabBridgehere 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 inTicketRedeemer) 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.