Skip to content

Configuration

The bank configuration is stored in config.json inside the plugin’s data folder. On first launch, if no config file exists, the default is extracted from the plugin JAR.


TypeDefaultMin
Integer11

Number of bank pages each player starts with. New players automatically receive this many pages when their bank is first created.

TypeDefaultMin
Integer5Must be >= defaultPages

Maximum number of bank pages a player can unlock. Once a player reaches this limit, further upgrades are denied.

TypeDefaultMin
Integer451

Number of item slots per bank page. This determines the capacity of each SimpleItemContainer created for the bank pages.

TypeDefault
ObjectSee below

Configuration for the page upgrade system.

{
"upgrade": {
"enabled": true,
"defaultCosts": [0, 250, 500, 1000, 2500],
"defaultCurrencyName": "Gold",
"providerCosts": {
"Ecotale": [0, 250, 500, 1000, 2500],
"EconomySystem": [0, 100, 200, 500, 1000]
},
"providerDisplayNames": {
"Ecotale": "Ecotale Coins",
"EconomySystem": "Gems"
}
}
}
  • enabled — Whether players can purchase page upgrades. Default: true.
  • defaultCosts — Fallback cost array used when no provider-specific costs are defined. Each array index corresponds to the page number (index 0 = cost for page 1, index 1 = cost for page 2, etc.). Pages beyond the array length are not buyable by players (only grantable via admin).
  • defaultCurrencyName — Display name for the default/fallback currency. Default: "Gold". Shown in upgrade cost labels when no provider-specific display name is configured.
  • providerCosts — A map of economy provider name to cost array. Provider-specific costs override defaultCosts for that provider. Pages beyond the array length are not buyable.
  • providerDisplayNames — A map of economy provider name to a custom display name. Used in the UI to show a human-readable name (e.g., "Ecotale" displays as "Ecotale Coins").
TypeDefault
ObjectSee below

Feature-level permission gating and rank-based page limits using LuckPerms permissions.

{
"permissions": {
"upgrade": { "permission": "", "lockedMessage": "Requires VIP rank to upgrade!" },
"transfer": { "permission": "", "lockedMessage": "" },
"withdraw": { "permission": "", "lockedMessage": "" },
"deposit": { "permission": "", "lockedMessage": "" },
"rankPages": {
"bank.pages.3": 3,
"bank.pages.5": 5,
"bank.pages.7": 7,
"bank.pages.10": 10
}
}
}
  • upgrade, transfer, withdraw, deposit — Each feature can be gated behind a permission string. If empty (""), every player can use the feature. If set, players without the permission see the lockedMessage.
  • rankPages — A map of permission string to max buyable page count. The player gets the highest matching value across all their permissions. Falls back to defaultPages (no upgrades) if no permission matches. Capped at the global maxPages value.
TypeDefault
Object{} (empty)

Defines which in-game coin items map to currency values for the coin deposit feature. When a player drags matching coin items into the bank, they are automatically converted to currency.

{
"coinProviders": {
"EcotaleCoins": {
"Copper_Coin": 1,
"Silver_Coin": 10,
"Gold_Coin": 100
}
}
}
  • The outer key (EcotaleCoins) is the economy provider name (auto-detected via VaultUnlocked).
  • The inner keys are item IDs, and the values are the currency amount per coin item.
  • Ecotale coin types are auto-detected via reflection on the CoinType enum if the Ecotale plugin is present.

:::warning Legacy: coinItems The flat coinItems map (without provider grouping) is still supported for backward compatibility. Coins defined in coinItems are assigned to the "default" provider internally. New setups should use coinProviders for per-provider grouping. :::

TypeDefault
ObjectSee below

Configuration for the “Want more pages?” info button shown in the page overview when a player has reached their buyable page limit.

{
"shopInfo": {
"enabled": false,
"buttonText": "Want more pages?",
"chatMessage": "Visit our shop for more bank pages!",
"link": "https://your-server-shop.com/bank"
}
}
  • enabled — Whether the shop info button is shown. Default: false.
  • buttonText — The label on the info button in the page overview.
  • chatMessage — The message sent to the player’s chat when they click the button.
  • link — A clickable URL included in the chat message. If empty, no link is added.
TypeDefault
ObjectSee below

Enables separate bank inventories per world group. Worlds not assigned to any group share the global bank.

{
"worldBanking": {
"enabled": false,
"separateWorlds": {
"pvp": ["arena", "battleground"],
"creative": ["creative_world", "build_zone"]
}
}
}
  • enabled — Whether world banking is active. Default: false. When disabled, all worlds share the same bank.
  • separateWorlds — A map of group name to a list of world name patterns. Pattern matching uses case-insensitive contains — a pattern "arena" matches a world named "PvP_Arena_Kx8hs9d". This accommodates dynamic world name suffixes (UUIDs, hashes).
  • Data for separate world groups is stored in data/worlds/<groupName>/players/<uuid>.json.
TypeDefaultOptions
String"blacklist""blacklist", "whitelist"

Controls how the restrictedItems list is interpreted:

  • blacklist — Items matching the list are blocked from being stored in the bank. Everything else is allowed.
  • whitelist — Only items matching the list are allowed. Everything else is blocked.

Restrictions are enforced server-side via DelegateItemContainer slot validation.

TypeDefault
String Array[] (empty)

List of item ID patterns for the restriction system. Supports wildcard matching:

  • Exact match: "Quest_Item_Key" — blocks/allows only this specific item
  • Wildcard: "Quest_Item_*" — matches all items starting with Quest_Item_

Example — blacklist quest items and soulbound gear:

{
"restrictionMode": "blacklist",
"restrictedItems": [
"Quest_Item_*",
"Soulbound_*"
]
}

Example — whitelist only crafting materials:

{
"restrictionMode": "whitelist",
"restrictedItems": [
"Ingot_*",
"Ore_*",
"Wood_*",
"Gem_*"
]
}
TypeDefaultMin
Integer1000

Maximum number of transaction log entries stored per player in the SQLite database. Older entries are pruned when this limit is exceeded.

Set to 0 to disable history tracking.


{
"defaultPages": 1,
"maxPages": 10,
"slotsPerPage": 45,
"upgrade": {
"enabled": true,
"defaultCosts": [0, 250, 500, 1000, 2500],
"defaultCurrencyName": "Gold",
"providerCosts": {
"Ecotale": [0, 250, 500, 1000, 2500],
"EconomySystem": [0, 100, 200, 500, 1000]
},
"providerDisplayNames": {
"Ecotale": "Ecotale Coins",
"EconomySystem": "Gems"
}
},
"permissions": {
"upgrade": { "permission": "", "lockedMessage": "Requires VIP rank to upgrade!" },
"transfer": { "permission": "", "lockedMessage": "" },
"withdraw": { "permission": "", "lockedMessage": "" },
"deposit": { "permission": "", "lockedMessage": "" },
"rankPages": {
"bank.pages.3": 3,
"bank.pages.5": 5,
"bank.pages.7": 7,
"bank.pages.10": 10
}
},
"coinProviders": {
"Ecotale": {
"Copper_Coin": 1,
"Silver_Coin": 10,
"Gold_Coin": 100
},
"CustomMod": {
"CustomToken": 500,
"PremiumGem": 2500
}
},
"shopInfo": {
"enabled": true,
"buttonText": "Want more pages?",
"chatMessage": "Visit our shop for more bank pages!",
"link": "https://your-server-shop.com/bank"
},
"worldBanking": {
"enabled": false,
"separateWorlds": {
"pvp": ["arena", "battleground"],
"creative": ["creative_world"]
}
},
"restrictionMode": "blacklist",
"restrictedItems": [
"Quest_Item_*",
"Soulbound_*",
"Admin_Tool_*"
],
"historyMaxEntries": 100
}

The config is validated on load. Invalid values are corrected automatically:

FieldCorrection
defaultPages < 1Set to 1
maxPages < 1Set to 5
maxPages < defaultPagesSet to defaultPages
slotsPerPage < 1Set to 45
pageCosts is nullSet to [0, 250, 500, 1000, 2500]
currency is null/emptySet to "gold"
upgrade is nullSet to default UpgradeConfig
upgrade.defaultCosts is nullSet to [0, 250, 500, 1000, 2500]
upgrade.defaultCurrencyName is nullSet to "Gold"
upgrade.providerCosts is nullSet to {}
upgrade.providerDisplayNames is nullSet to {}
permissions is nullSet to default FeaturePermissions
coinProviders is nullSet to {}
coinItems is nullSet to {}
shopInfo is nullSet to default ShopInfoConfig (disabled)
worldBanking is nullSet to default WorldBankingConfig (disabled)
restrictionMode is nullSet to "blacklist"
restrictedItems is nullSet to []
historyMaxEntries < 0Set to 100

The configuration can be reloaded at runtime without a server restart using:

/ksbank reload

This reloads config.json, revalidates all fields, and recompiles the restriction patterns. Requires the bank.admin permission.