Cobblemon Economy logo

Cobblemon Economy

Mod

by RyvesMods

Addon for Cobblemon to add : Pokedollars and PCO, Customisable Shops and Customisable Quests

Downloads

50,281

Type

Mod

CurseForge ID

1437367

Last Updated

Apr 11, 2026

Description

Cobblemon Economy

Minecraft Loader Discord

Cobblemon Economy is an all-in-one economy + shop + quest layer for Cobblemon servers.

This page is a strict admin guide: install, required/optional mods, shops, skins, quantity controls, quests, JSON config examples, and current hard limits. If a behavior is not described here, do not assume it is supported.

1) Required and Optional Dependencies

Required

  • Minecraft 1.21.1
  • Fabric Loader
  • Fabric API
  • Cobblemon 1.7.1

Optional integrations

  • Cobblemon Raid Dens (raid rewards + raid_win objectives)
  • Cobblemon Battle Tower / tower-style NPC setups (tower_win objectives)
  • CobbleDollars (economy bridge compatibility)
  • Impactor (economy bridge compatibility)
  • YAWP (NPC protection flag support)
  • Placeholder API / TAB (balance placeholders)
  • Star Academy (academy) grading integration

Raid and Battle Tower notes

  • Raid objectives (raid_win): fully supported when Cobblemon Raid Dens is installed.
    • Integration uses Raid Dens runtime events (RAID_BATTLE_START / RAID_END).
    • raid_win quest progression and raid rewards are triggered from raid win events.
  • Battle Tower objectives (tower_win): no hard dependency required.
    • Detection is metadata/tag based (tower actor/entity IDs/tags).
    • For custom NPC towers, use the Tower Tagger (/eco item) to apply tour_de_combat tag for reliable detection.

2) Installation

  1. Drop cobblemon-economy-<version>.jar into mods/.
  2. Start server once.
  3. Edit files in world/config/cobblemon-economy/.
  4. Use /eco reload after JSON edits (full restart is safest after major changes).

What /eco reload does:

  • Reloads config.json, shops.json, quests.json, quest_npcs.json, and quest_boards_bindings.json.

What /eco reload does not do:

  • It does not replace missing dependencies.
  • It is not a substitute for a restart after adding/removing mods.

3) Files and What They Do

Per world folder:

  • world/config/cobblemon-economy/config.json -> global economy settings.
  • world/config/cobblemon-economy/shops.json -> all shop definitions.
  • world/config/cobblemon-economy/quests.json -> all quest definitions.
  • world/config/cobblemon-economy/quest_npcs.json -> quest NPC board definitions.
  • world/config/cobblemon-economy/quest_boards_bindings.json -> block-position to quest-board ID bindings.
  • world/config/cobblemon-economy/milestone.json -> capture milestone rewards.
  • world/config/cobblemon-economy/skins/*.png -> custom NPC skins.
  • world/config/cobblemon-economy/economy.db -> economy database.
  • world/config/cobblemon-economy/quests.db -> quest state database.

3.1) Capture reward keys in config.json

To make the reward rules easier to read, the generated config now uses explicit capture-related keys:

  • capture_event_base_reward
    • Base PokeDollar reward used when a capture payout is allowed.
    • Also reused as the base for fossil revive special payouts.
  • capture_multi_reward
    • Default: 0.
    • Reward for repeat non-special captures of an already known species.
    • If you want no reward on 2nd / 3rd / 4th normal captures, leave it at 0.
  • capture_shiny_multiplier
  • capture_radiant_multiplier
  • capture_legendary_multiplier
  • capture_paradox_multiplier

Exact payout behavior with default values:

  • First normal capture of a new species: capture_event_base_reward.
  • Re-capture of an already known normal species: capture_multi_reward.
  • Re-capture of an already known shiny / radiant / legendary / paradox species: still pays through the special multiplier path.
  • Capture milestone rewards are separate and come from milestone.json.
  • First-time special captures use the special capture reward path and do not stack an extra normal new-species payout on top.

Special multiplier rule:

  • Multipliers are direct payout factors, not base + bonus.
  • Example with capture_event_base_reward = 100 and capture_shiny_multiplier = 5: shiny payout = 500.
  • If a Pokemon matches multiple special categories, factors are added together before multiplying.
  • Example: shiny 5 + legendary 10 = x15 total special payout.

Important scope note:

  • capture_multi_reward only affects repeat normal captures.
  • Fossil revive rewards are handled by the fossil event path and still use capture_event_base_reward / special multipliers separately.

Legacy keys are still read for compatibility:

  • captureReward
  • capture_reward
  • newDiscoveryReward
  • pokedex_new_species_bonus_reward
  • normal_capture_reward_requires_new_pokedex_entry
  • special_capture_reward_ignores_pokedex_history
  • shinyMultiplier
  • radiantMultiplier
  • legendaryMultiplier
  • paradoxMultiplier

When the config is rewritten, Cobblemon Economy saves the explicit key names.

Recommended strict Pokedex-only setup:

{ "capture_event_base_reward": 100, "capture_multi_reward": 0 }

With that setup:

  • already-known species do not pay normal capture rewards
  • shiny / radiant / legendary / paradox captures still pay through their multiplier path
  • only genuinely new Pokedex species pay the normal base capture reward path

3.2) Manual vs automatic files

  • quest_boards_bindings.json is normally managed by /eco questboard bind and /eco questboard unbind.
  • You can edit it manually, but the key format is dimension;x;y;z.
  • The bind command uses the block you are currently looking at.
  • If a placed cobblemon-economy:quest_board block has no explicit binding, it falls back to the first entry found in quest_npcs.json.
  • For predictable behavior on production servers, bind every board explicitly.

4) Core Commands

Player

  • /bal or /balance
  • /pco
  • /pay <player> <amount>

Admin

  • /eco reload
  • /eco shop list
  • /eco shop get <id>
  • /eco quest list
  • /eco questnpc list
  • /eco questnpc get <id>
  • /eco questboard list
  • /eco questboard open <id>
  • /eco questboard bind <id>
  • /eco questboard unbind
  • /eco skin <name>
  • /eco item
  • /balance <player> <add|remove|set> <amount>
  • /pco <player> <add|remove|set> <amount>

5) Shop System (Creation, Binding, Quantity, Buy/Sell)

5.1 Create a shop in JSON

Edit shops.json:

{ "shops": { "general_shop": { "title": "General Shop", "currency": "POKE", "skin": "shopkeeper", "skinModel": "steve", "isSellShop": false, "items": [ { "id": "minecraft:diamond", "name": "Diamond", "price": 1000 }, { "id": "cobblemon:poke_ball", "name": "Poke Ball", "price": 200 } ] } } }

Important fields:

  • currency: POKE or PCO.
  • skin: PNG name (without .png) from world/config/cobblemon-economy/skins/.
  • skinModel: steve or alex (optional, default steve).
  • isSellShop: true for sell mode.
  • items: list of items/command-items.
  • Every shop item entry must have an id, including type: "command" entries.
  • For type: "command", use id as a stable internal key (example: server:vote_key), not as a real given item.

Shop item behavior (exact):

  • type: "item":
    • uses id as the item to give/sell
    • supports components
    • supports legacy nbt
    • can also use dropTable or lootTable
  • type: "command":
    • executes command once per quantity purchased
    • supports %player% placeholder only
    • uses displayItem.material, displayItem.displayname, and displayItem.enchantEffect only for the GUI icon
    • does not give a real item to the player

Not supported / do not rely on this in shops:

  • Extra placeholders beyond %player% in shop commands.
  • displayItem changing the real purchased item for type: "item" entries.
  • components or nbt customizing the visual icon of type: "command" entries.
  • Weighted dropTable entries. If you need weights or advanced rolls, use a Minecraft lootTable instead.

components JSON string rule:

  • Component values are still inside JSON, so inner double quotes must be escaped.
  • Example string component value: "base"
  • If you forget the backslashes, the JSON file becomes invalid.
  • In short: JSON outside, component payload inside, so quote escaping matters.

5.2 Bind a shop to an NPC

  1. Spawn NPC (shopkeeper_spawn_egg or /summon cobblemon-economy:shopkeeper).
  2. Run /eco shop get <shopId>.
  3. Right-click NPC with the setter item.

5.3 Set NPC skin

  1. Put skin file in world/config/cobblemon-economy/skins/ (example: nurse.png).
  2. Run /eco skin nurse.
  3. Right-click NPC with the Skin Setter.

You can also define defaults in JSON per shop or quest NPC:

  • "skin": "nurse"
  • "skinModel": "alex"

5.4 Change buy quantity in GUI

  • Middle-click cycles quantity multiplier: 1x -> 2x -> 4x -> 8x -> 16x -> 32x -> 64x.
  • Price updates using current selected quantity.
  • Left click buys at selected quantity.

5.5 Sell shops

For a sell shop:

  • set "isSellShop": true.
  • players can sell matching items back.
  • supports optional sell limits/cooldowns per item.

Sell matching rule:

  • Matching uses the same item and the same components/custom data.
  • Display name alone is not enough.
  • If you sell highly customized items, the player must hold the same effective item definition.

5.6 Wildcards, loot tables, and command-item limits

  • Wildcards only support namespace:* format such as minecraft:* or cobblemon:*.
  • Wildcards pick one random item from that namespace when the shop entry is resolved.
  • Wildcards also randomize the configured price by about -25% to +25%.
  • lootTable rolls once per purchased quantity.
  • dropTable gives one random item ID per purchased quantity.
  • If both lootTable and dropTable are present on the same entry, lootTable wins.
  • dropTable entries are simple item IDs only; they do not support per-drop NBT/components/weights.
  • dropTable, lootTable, and wildcards are best used in buy shops, not deterministic sell shops.

6) Quest System (How It Works)

Quest system uses 2 files:

  • quests.json = mission definitions.
  • quest_npcs.json = which NPC/board offers which quests.

Flow:

  1. Player opens board.
  2. Accepts quest.
  3. Progress updates from captures/battles/raids/tower/fossil events.
  4. Quest becomes claimable when all objectives are complete.
  5. Player claims rewards.

Lifecycle rules that matter:

  • A quest can only be accepted if it is in the current visible rotation for that board.
  • Cancelled quests stay unavailable until the next board rotation.
  • Expired active quests are also pushed to the next board rotation.
  • Cancelling or expiring a quest clears its saved progress.
  • requiresCompleted is optional and empty by default in the bundled quest set.
  • If you use it, it only checks quests on the same quest-board / NPC ID.
  • Cross-board prerequisite chains are not supported.
  • Active / claimable quests stay pinned on the board first, then remaining slots are filled from the current rotation.

7) quests.json (Exact Authoring Guide)

Top-level key must be quests.

{ "quests": { "my_quest_id": { "name": "My Quest", "repeatPolicy": "DAILY", "repeatable": true, "timeLimitMinutes": 1440, "cooldownMinutes": 0, "requiresCompleted": [], "objectives": [], "rewards": { "pokedollars": 2000, "pco": 0, "commands": [] } } } }

Quest definition behavior:

  • name: display name shown on the board.
  • repeatPolicy:
    • DAILY = next board rotation / next reset window
    • ALWAYS = can become available again immediately after claim unless cooldownMinutes is set
    • ONCE = permanently locked after claim
  • repeatable:
    • optional compatibility flag
    • if omitted, it defaults to true except for ONCE
    • if you set repeatable: false, the quest behaves like a one-time quest after claim
  • timeLimitMinutes:
    • active quest expiry timer
    • when it expires, the quest is cancelled and pushed to the next board rotation
    • expiry also clears objective progress for that quest
  • cooldownMinutes:
    • if > 0, this explicit per-player cooldown is used after claim
    • if missing/0, availability falls back to repeatPolicy
  • requiresCompleted:
    • optional prerequisite quest IDs on the same board/NPC only
    • the prerequisite is satisfied when the required quest is COMPLETED or CLAIMED
  • rewards:
    • pokedollars, pco, and commands can be combined in the same quest reward

Recommended quest presets:

  • Daily rotating repeatable quest:
    • repeatPolicy: "DAILY"
    • repeatable: true
    • cooldownMinutes: 0
  • Repeatable quest with personal cooldown:
    • repeatPolicy: "ALWAYS"
    • repeatable: true
    • cooldownMinutes: <minutes>
  • One-time progression quest:
    • repeatPolicy: "ONCE"
    • repeatable: false

Objective types

  • capture
  • fossil_revive
  • battle_win
  • raid_win
  • tower_win

Filter logic:

  • Within the same field, values are OR-matched.
    • Example: "types": ["water", "ice"] means water OR ice.
  • Different fields stack as AND-matched.
    • Example: species + pokeball + shiny means all three conditions must match.
  • dimensions takes priority over dimension if both are present.

Capture/fossil filters

Use any combination:

  • species (array)
  • types (array)
  • labels (array)
  • pokeball (array)
  • dimension (single string) or dimensions (array)
  • shiny (true/false)

Exact support by objective type:

  • capture:
    • supports species, types, labels, pokeball, dimension, dimensions, shiny
  • fossil_revive:
    • supports species, types, labels, dimension, dimensions, shiny
    • pokeball is not available for fossils and should not be used
  • battle_win, raid_win, tower_win:
    • use count only
    • extra filters are ignored

Quest reward commands:

  • rewards.commands executes as server permission level 4.
  • %player% is the only supported placeholder.
  • Blank command strings are ignored.
  • Command output is suppressed; use side effects/rewards, not chat-return values.

Example: shiny Gyarados quest

{ "quests": { "catch_shiny_gyarados": { "name": "Red Leviator", "repeatPolicy": "DAILY", "repeatable": true, "objectives": [ { "type": "capture", "count": 1, "species": ["cobblemon:gyarados"], "shiny": true } ], "rewards": { "pokedollars": 15000, "pco": 120, "commands": [] } } } }

Yes: this setup shows a shiny Gyarados preview on the quest board.

Example: raid and tower objectives

{ "quests": { "raid_runner": { "name": "Raid Runner", "repeatPolicy": "DAILY", "repeatable": true, "objectives": [ { "type": "raid_win", "count": 3 } ], "rewards": { "pokedollars": 6000, "pco": 60, "commands": [] } }, "tower_runner": { "name": "Tower Runner", "repeatPolicy": "DAILY", "repeatable": true, "objectives": [ { "type": "tower_win", "count": 2 } ], "rewards": { "pokedollars": 5000, "pco": 80, "commands": [] } } } }

8) quest_npcs.json (Board/NPC Definitions)

{ "quest_npcs": { "safari_guide": { "displayName": "Safari Guide", "skin": "shopkeeper", "skinModel": "alex", "maxActive": 2, "visibleQuests": 6, "sharedRotation": true, "rotationMode": "MIDNIGHT", "rotationHours": 24, "questPool": [ "catch_shiny_gyarados", "raid_runner", "tower_runner" ] } } }

Field behavior:

  • maxActive: max simultaneously active quests for that NPC board.
  • visibleQuests: keep this at 6.
    • values below 6 are raised to 6
    • the current board UI only has 6 card slots, so values above 6 are not useful
  • sharedRotation:
    • true = same selection for all players.
    • false = per-player selection.
  • rotationMode:
    • MIDNIGHT = rotates at next local server midnight.
    • HOURS = rotates every rotationHours block.
  • rotationHours:
    • only matters when rotationMode is HOURS
    • minimum effective value is 1
  • questPool: quest IDs from quests.json.
    • duplicate IDs are de-duplicated automatically
    • pool order is not preserved on the board; the active rotation is shuffled from this pool
  • dialogues:
    • accepted in config and kept in the file
    • the current custom quest board screen does not use these dialogue arrays as its main text source
    • treat them as optional flavor/config data, not as the authoritative board UI copy

Board behavior notes:

  • The board UI has 6 card slots total.
  • If players already have active or claimable quests on that board, those cards consume slots first.
  • That means a large questPool does not show more than 6 cards at once.

Bind an NPC to a quest profile:

  1. /eco questnpc list
  2. /eco questnpc get <id>
  3. Right-click a shopkeeper NPC with the setter.

9) Main Currency Modes

Set in config.json:

{ "main_currency": "cobeco" }

Values:

  • cobeco (default)
  • cobbledollars
  • impactor

Behavior:

  • cobeco: CobEco DB is authoritative, with optional mirror/bridge support.
  • cobbledollars: balance ops route to CobbleDollars.
  • impactor: balance ops route to Impactor primary account.

10) Common JSON Mistakes (Avoid These)

  • Wrong key names:
    • use types (not type for filters)
    • use pokeball (not ball)
    • species must be an array
  • Invalid IDs:
    • use full IDs like cobblemon:gyarados, minecraft:the_nether
  • objectives must be an array ([]) even for one objective.
  • count must be >= 1.
  • repeatPolicy must be DAILY, ALWAYS, or ONCE.
  • repeatPolicy: "HOURLY" is not a supported config value. Use board rotation (rotationMode: "HOURS") or cooldownMinutes instead.
  • Do not use visibleQuests > 6 expecting extra board pages; the current board screen is fixed to 6 visible cards.
  • Do not use requiresCompleted to chain quests between different board IDs.
  • Do not expect pokeball filters to work on fossil_revive objectives.
  • Do not expect battle_win, raid_win, or tower_win to filter by species/type/label; they are count-only objectives.
  • Do not expect shop/quest command strings to support placeholders other than %player%.
  • If you changed JSON and behavior does not update, run /eco reload or restart.

11) Integrations Summary

  • Cobblemon: core capture/battle/fossil events.
  • Cobblemon Raid Dens: raid win rewards + raid_win quest progression.
  • Battle Tower-like systems: tower_win detection via battle metadata/tags (use Tower Tagger for custom setups).
  • CobbleDollars / Impactor: compatibility bridge.
  • Placeholder API / TAB: balance placeholders.
  • YAWP: shopkeeper protection flag checks.

12) Support

Discord support: https://discord.gg/zxZXcaTHwe

Screenshots

Similar Mods

External Resources