Data Files
Configuration File
Configuration files are in the .json format, and are generally named config.json
Configuration files are usually automatically generated when the server is first started after installation, located in the plugins/LOICollectionA/config/ directory
The configuration items in config.json are only read once when the server starts. Modifications to the configuration file afterwards will only take effect after restarting the server
When you upgrade the plugin version, newly added configuration items are automatically merged into the existing configuration file. Existing configuration items and their values are preserved, so there is no need to add them manually
WARNING
The names of the configuration items in the configuration file must be in English, digits, or underscores. Please do not use Chinese as configuration item names, otherwise the configuration file may fail to be read properly.
Please do not use text editors such as Notepad that do not support the .json format, to avoid corrupting the structure of the configuration file.
{
"version": 90052239, // Configuration file version number, automatically generated from the plugin version number, used for configuration synchronization; modification is not recommended
"ConsoleLanguage": "system", // Console language, where system follows the system language, zh_CN is Chinese, en_US is English
"ServerConfig": { // Server configuration
"Plugins": { // Built-in plugin configuration
"Blacklist": {
"ModuleEnabled": false, // Whether to enable the blacklist
"BroadcastMessage": true // Whether to enable blacklist content broadcast
},
"Mute": false, // Whether to enable mute
"Cdk": false, // Whether to enable CDK
"Menu": { // Menu configuration
"ModuleEnabled": false, // Whether to enable the menu
"MenuItemId": "minecraft:clock", // Item ID used to open the menu
"EntranceKey": "main", // Menu entrance
"GuiPath": "menu.lcui" // Gui entry file
},
"Tpa": { // TPA configuration
"ModuleEnabled": false, // Whether to enable TPA
"TargetScoreboard": "money", // Score object used by TPA request targets
"BlacklistUpload": 10, // Maximum number of blacklisted targets a player can upload
"RequestRequired": 100, // Score required for a TPA request
"RequestTimeout": 60, // TPA request timeout (in seconds)
"RequestUpload": 5 // Maximum number of teleport requests a player can upload
},
"Shop": {
"ModuleEnabled": false, // Whether to enable the shop
"GuiPath": "shop.lcui"
},
"Monitor": { // Message enhancement configuration
"ModuleEnabled": false, // Whether to enable message enhancement
"BelowName": {
"ModuleEnabled": true, // Whether to enable player name display
"RefreshInterval": 20, // Refresh interval, in ticks (20 ticks = 1 second)
"RefreshDisplayInterval": 100, // Display refresh interval, in ticks
"Pages": [
[
"{player}" // Content displayed on each line
]
] // Player name display format, supports LOICollectionA API variables
},
"ServerToast": {
"ModuleEnabled": true, // Whether to enable server toast notifications
"Messager": {
"join": true, // Whether to enable the player join server notification
"leave": true // Whether to enable the player leave server notification
}
},
"ChangeScore": {
"ModuleEnabled": true, // Whether to enable Score change detection
"ScoreboardLists": [] // Objects for detecting Score changes (when empty, all Score changes are detected)
},
"DisableCommand": {
"ModuleEnabled": true, // Whether to enable command disable detection
"CommandLists": [] // List of disabled commands
},
"DynamicMotd": {
"ModuleEnabled": true, // Whether to enable the dynamic server MOTD
"RefreshInterval": 200, // Refresh interval, in ticks (20 ticks = 1 second)
"Pages": [
"'Players: ' + {server_player_online} + '/' + {server_player_max}" // Content displayed on each line, supports LOICollectionA API variables
]
},
"Sidebar": {
"ModuleEnabled": true, // Whether to enable the sidebar
"RefreshInterval": 20, // Refresh interval, in ticks (20 ticks = 1 second)
"Titles": [ // Sidebar titles, each line is the title of the corresponding page
"'Title'" // Title, supports LOICollectionA API variables
],
"Pages": [
[
"'Content'" // Content displayed on each line, supports LOICollectionA API variables
] // Content of each page
]
}
},
"Pvp": {
"ModuleEnabled": false, // Whether to enable PVP
"ExtraListener": {
"onActorHurt": true, // Whether to enable the player damage listener
"onSplashPotion": true, // Whether to enable the potion effect listener
"onProjectileHit": true // Whether to enable the projectile hit listener
}
},
"Wallet": { // Wallet configuration
"ModuleEnabled": false, // Whether to enable the wallet
"TargetScoreboard": "money", // Score object used by the wallet
"ExchangeRate": 0.1, // Wallet exchange rate
"RedEnvelopeTimeout": 60, // Red envelope timeout (in seconds)
"WalletHistoryEnabled": true, // Whether to record the fund ledger
"WalletHistoryRetentionDays": 90, // Ledger retention days; expired records are cleaned up
"TransferMinAmount": 1, // Minimum transfer amount; below is rejected (0 = unrestricted)
"TransferDailyLimit": 0, // Daily accumulated transfer cap (incl. fee), 0 = unrestricted
"TransferConfirmThreshold": 1000, // Large transfer confirmation threshold; requires GUI confirmation when exceeded (0 = none)
"TransferCooldownSeconds": 0, // Minimum interval between transfers (seconds), 0 = no cooldown
"WealthTopSize": 50, // Wealth ranking size (count)
"WealthRefreshMinutes": 10, // Wealth ranking refresh interval (in minutes)
"WalletBankEnabled": true, // Whether to enable bank savings
"WalletBankMinDeposit": 10, // Minimum deposit amount; below is rejected
"WalletBankDailyRate": 0.0005, // Bank daily interest rate (simple interest, accrues per day)
"WalletInterestTaxRate": 0.1, // Interest tax rate (deducted from interest into the fee pool)
"WalletInterestFromPool": true, // Pay interest from the fee pool first (scaled down when the pool is insufficient)
"RedEnvelopeTargetedEnabled": true, // Whether to enable targeted red envelopes
"RedEnvelopeMaxCount": 100 // Maximum share count of a single red envelope
},
"Chat": { // Chat enhancement configuration
"ModuleEnabled": false, // Whether to enable chat enhancement
"FormatText": "<{player}> ${0}", // Chat message format, where ${0} is the player's chat content, supports LOICollectionA API variables
"BlacklistUpload": 10 // Maximum number of blacklisted targets to upload
},
"Notice": false, // Whether to enable the notice board
"Market": { // Player market configuration
"ModuleEnabled": false, // Whether to enable the player market
"TargetScoreboard": "money", // Score object used by the player market
"MaximumUpload": 20, // Maximum number of items a player can upload to the market
"BlacklistUpload": 10, // Maximum number of blacklisted targets a player can upload
"TradeRequestTimeout": 60, // Player trade request timeout (in seconds)
"TradeTimeout": 90, // Player trade timeout (in seconds)
"ProhibitedItems": [], // Items prohibited from being uploaded to the player market
"StoreEnabled": true, // Whether to enable the player store (shop) feature
"StoreReviewEnabled": true, // Whether to enable store review functionality
"StoreMaximumItems": 20, // Maximum number of items a single store can list
"StoreCreationCost": 0, // Score cost required to create a store (deducted from TargetScoreboard; free when 0)
"StoreSalesWeight": 0.5, // Store ranking weight - number of transactions in the last 30 days
"StoreVolumeWeight": 0.3, // Store ranking weight - transaction volume in the last 30 days
"StoreRatingWeight": 0.35, // Store ranking weight - player rating
"StoreBadReviewPenalty": 3.0, // Store ranking penalty - bad review ratio in the last 30 days
"StoreColdStartWeight": 0.5, // Store ranking bonus - cold start weight for new stores
"StoreRatingSmoothing": 15.0, // Bayesian smoothing parameter for store ratings
"StoreColdStartDays": 7, // Cold start bonus days for new stores (in days)
"StoreTransactionWindowDays": 30, // Store transaction data statistics window (in days)
"StoreRatingWindowDays": 180, // Store review data statistics window (in days)
"StoreRiskWindowDays": 30, // Store risk data statistics window (in days)
"StoreRankRefreshMinutes": 60, // Store leaderboard refresh interval (in minutes)
"StoreQuoteEnabled": true, // Whether to enable quote aggregation (average price, volume and turnover rankings)
"StoreQuoteRefreshMinutes": 30, // Quote refresh interval (in minutes)
"StoreTransactionTaxRate": 0.0, // Transaction tax rate (0.0 ~ 1.0, floor(price × rate); can be overridden at runtime via /market tax)
"StorePriceCeilingRatio": 0.0, // Price ceiling ratio (based on the 30-day average price; listings above average × ratio are rejected, 0 disables)
"StoreWantedEnabled": true, // Whether to enable wanted orders
"StoreWantedMaxPerPlayer": 5, // Maximum number of concurrent wanted orders per player
"StoreWantedExpireDays": 7, // Wanted order expiry (in days; frozen prepayment is refunded on expiry)
"StorePartialBuyEnabled": true, // Whether to enable partial fulfillment of wanted orders
"StoreAuctionEnabled": true, // Whether to enable auctions
"StoreAuctionMinDurationMinutes": 30, // Minimum auction duration (in minutes)
"StoreAuctionMaxDurationHours": 72, // Maximum auction duration (in hours)
"StoreAuctionMinBidIncrement": 1.05, // Minimum bid increment ratio (a new bid must exceed current price × ratio)
"StoreAuctionAntiSnipeSeconds": 0, // Anti-sniping duration (in seconds; late bids extend the auction, 0 disables)
"StoreRepeatTradeLimit": 3, // Repeat trade count limit per trade pair (excess trades are excluded from average price, anti-farming)
"StorePriceOutlierRatio": 0.0 // Outlier price filter ratio (trades deviating beyond this multiple of the recent average are excluded, 0 disables)
},
"BehaviorEvent": { // Behavior event configuration
"ModuleEnabled": false, // Whether to enable behavior events
"OrganizeDatabaseInterval": 144, // Behavior event database cleanup threshold (in hours)
"CleanThresholdEvent": 10000, // Behavior event cleanup threshold
"CleanDatabaseInterval": 1, // Automatic database cleanup interval (in hours)
"RefreshIntervalInMinutes": 5, // Behavior event recording interval (in minutes)
"SingleBacktrackingQuantity": 2000, // Number of events per backtracking run (note: the larger the number, the more events are processed within a single tick, which may cause the server to stall until processing completes)
"Events": { // Behavior event configuration
"onPlayerConnect": { // Player connect event
"ModuleEnabled": true, // Whether to enable this event
"RecordDatabase": true, // Whether to record to the database
"OutputConsole": true // Whether to output to the console
},
"onPlayerDisconnect": { // Player disconnect event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerChat": { // Player chat event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerAddExperience": { // Player gaining experience event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerAttack": { // Player attack event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerChangePerm": { // Player permission change event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerDestroyBlock": { // Player block destroy event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerPlaceBlock": { // Player block place event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerDie": { // Player death event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerPickUpItem": { // Player item pickup event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerRespawn": { // Player respawn event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerUseItem": { // Player item use event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onPlayerContainerInteract": { // Player container interaction event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
},
"onBlockExplode": { // Block explosion event
"ModuleEnabled": true,
"RecordDatabase": true,
"OutputConsole": true
}
}
},
"Statistics": {
"ModuleEnabled": false, // Whether to enable statistics
"RefreshIntervalInMinutes": 5, // Statistics refresh interval (in minutes)
"RankingPlayerCount": 100, // Number of players displayed on the leaderboard
"DatabaseInfo": { // Statistics database information (recorded after each exit)
"OnlineTime": true, // Whether to enable online time statistics
"Kill": true, // Whether to enable mob kill statistics
"Death": true, // Whether to enable death statistics
"Place": true, // Whether to enable block place statistics
"Destroy": true, // Whether to enable block destroy statistics
"Respawn": true, // Whether to enable respawn statistics
"Join": true // Whether to enable join server statistics
}
}
},
"ProtableTool": { // Portable tool configuration
"BasicHook": { // Basic feature configuration
"ModuleEnabled": false, // Whether to enable basic features
"FakeSeed": "$random" // Fake seed configuration
},
"RedStone": 0, // Redstone high-frequency detection, where the value is the frequency per second (disabled when 0)
"OrderedUI": false // Whether to enable ordered UI
}
},
"ClientConfig": { // Client configuration (only takes effect for client targets)
"Music": { // Client "NetEase Cloud Music playback notification" module configuration
"ModuleEnabled": true, // Whether to enable this module
"SourceAppFilters": [ // Media source whitelist; matches a substring of SourceAppUserModelId; leave empty to allow any source
"cloudmusic",
"netease"
],
"IgnorePaused": true, // Whether to also show when paused (true means do not show)
"HoldDuration": 8.0, // Hold duration (in seconds)
"CardMaxWidth": 420.0, // Card maximum width (pixels)
"CardMinWidth": 300.0, // Card minimum width (pixels)
"CardPadding": 12.0, // Card padding (pixels)
"TitleFontSize": 24.0, // Title font size
"ArtistFontSize": 16.0, // Artist font size
"AlbumFontSize": 14.0, // Album font size
"LineSpacing": 8.0, // Line spacing between lines (pixels)
"CoverSize": 64.0, // Cover side length inside the card (pixels); set to 0 to disable the cover
"SlideDistance": 48.0, // Horizontal offset for slide-in / slide-out (pixels)
"VisualizerHeight": 22.0, // Audio visualizer height (pixels); set to 0 to disable and skip audio capture
"VisualizerBarGap": 2.0, // Visualizer bar gap (pixels)
"EnterDuration": 0.5, // Slide-in animation duration (in seconds)
"ExitDuration": 0.4 // Slide-out animation duration (in seconds)
}
},
"ScriptPermission": { // LCUI sandbox permissions
"PermissionFilePath": "gui/permission.json" // Permission file location
},
"LanguageServer": { // LCUI language server
"enabled": true, // Whether to enable
"port": 9257 // Local port
}
}NOTE
The above content is taken from the configuration file structure of LOICollectionA 1.17.1. The configuration file structure of later versions may differ.
Module Data Files
Data files refer to files that store data in the database. Data files are the core of the database, as they store all the data in the database. Data files can be text files, binary files, or other types of files. The format and content of a data file depend on the type of database and the application scenario.
Since 1.17.0 module data is stored through exactly two carriers:
| Carrier | Shape | Editable by hand |
|---|---|---|
| Block-storage database | plugins/LOICollectionA/data/*.db (SQLite file with block-model tables) | Not recommended — the layout is fixed at compile time and manual edits break the SchemaMismatch check |
| JSON file | notice.json, cdk.json, etc. | Yes, via the in-game editors or by editing the file |
Database File Overview
| File | Owning module |
|---|---|
settings.db | global settings plus the shared tables of Wallet / Language / PvP / Chat / Tpa / Market / Statistics / Notice |
blacklist.db | Blacklist (banned words, ban list) |
mute.db | Mute (mute list) |
chat.db | Chat (chat logs, interception rules) |
market.db | Market (market, store, wanted, auction, quotes) |
statistics.db | Statistics (player statistics) |
tpa.db | Tpa (teleport requests) |
behaviorevent.db | BehaviorEvent (behavior event logs) |
WARNING
1.17.0 moves the data layer to block storage, and the plugin does not replay old data at start-up. To keep it, run scripts/migrate/migrate_block.py by hand; back up plugins/LOICollectionA/data first and follow Data Migration for the full procedure.
TIP
In most cases, you do not need to modify data files manually, because most data files have built-in editors during the use of LOICollectionA. Starting from 1.15.0, Menu and Shop have been changed to edit lcui data files directly, and in-game editors are no longer provided.
permission.json (gui directory)
permission.json is the script capability authorization file, located in the plugins/LOICollectionA/gui/ directory. It controls the sensitive capabilities each script may invoke: command execution (mc::runCmd), business reads/writes (GUIManager::value/request/callback), and cross-script navigation (GUIManager::open).
Authorization runs in two gates: first the script's trust level is checked for the required capability (coarse gate), then the per-script id allowlist is matched exactly (fine gate). Both must pass.
IMPORTANT
Authorization uses a deny-by-default policy (defaultPolicy: "deny"). Scripts and authorization are separate: after editing a script (especially menu.lcui / shop.lcui) to add new capability calls, you must sync permission.json accordingly, otherwise those calls are denied and an error is logged.
| Field | Type | Description |
|---|---|---|
defaultPolicy | string | Default policy for scripts not listed in scripts: "deny" or "allow". Keep "deny" |
scripts.<id> | object | Authorization entry for a script, where <id> is the short script id (e.g. wallet, market.auction, menu) |
scripts.<id>.enabled | boolean | Whether opening this script is allowed |
scripts.<id>.commands.allow | boolean | Whether mc::runCmd is allowed |
scripts.<id>.commands.templates | string[] | Command allowlist (exact match). When empty, commands are denied even if allow is true |
scripts.<id>.gui.values | string[] | Allowlist of GUIManager::value ids |
scripts.<id>.gui.requests | string[] | Allowlist of GUIManager::request ids |
scripts.<id>.gui.callbacks | string[] | Allowlist of GUIManager::callback ids |
scripts.<id>.gui.navigations | string[] | Allowlist of target script ids or form ids this script may navigate to via GUIManager::open. When empty, only its own forms may be opened |
defaultTrust | string | Trust level used by scripts that do not declare trust; defaults to "user". Must be a key defined in trustLevels |
trustLevels | object | Map of trust level → capability-name array, e.g. {"user": ["GuiRead","GuiWrite"], "builtin": ["GuiRead","GuiWrite","ServerCommand"]} |
scripts.<id>.trust | string | Trust level of this script; falls back to defaultTrust when omitted. Determines the capability set it holds |
Each sensitive call requires a capability up front; missing it is denied even if the id allowlist matches:
| Call | Required capability |
|---|---|
GUIManager::value / GUIManager::request | GuiRead |
GUIManager::callback | GuiWrite |
GUIManager::open / GUIManager::switchTo (incl. cross-script) | GuiWrite |
mc::runCmd | ServerCommand |
| Read player data / storage (future built-in natives) | PlayerDataRead / StorageRead |
| Write player data / storage (future built-in natives) | PlayerDataWrite / StorageWrite |
{
"defaultPolicy": "deny",
"defaultTrust": "user",
"trustLevels": {
"builtin": ["GuiRead", "GuiWrite", "ServerCommand", "PlayerDataRead", "PlayerDataWrite", "StorageRead", "StorageWrite"],
"admin": ["GuiRead", "GuiWrite", "ServerCommand", "PlayerDataRead", "PlayerDataWrite", "StorageRead", "StorageWrite"],
"user": ["GuiRead", "GuiWrite"]
},
"scripts": {
"menu": {
"enabled": true,
"trust": "builtin",
"commands": {
"allow": true,
"templates": ["say No permission", "say No score"]
},
"gui": {
"values": [],
"requests": [],
"callbacks": [],
"navigations": ["wallet", "market"]
}
},
"wallet": {
"enabled": true,
"commands": { "allow": false, "templates": [] },
"gui": {
"values": ["wallet.players.online", "wallet.rank"],
"requests": ["wallet.info", "wallet.transfer.submit"],
"callbacks": ["wallet.wealth", "wallet.transfer.confirm"],
"navigations": []
}
}
}
}NOTE
navigations only constrains cross-script navigation. A script opening one of its own forms (GUIManager::open("wallet", ...) inside wallet) needs no grant. The target script must also be listed in scripts with enabled set to true.
TIP
Authorization for built-in scripts (blacklist, wallet, etc.) is maintained automatically with plugin updates. menu / shop are scripts you write yourself, so their authorization must be synced manually based on the commands and GUI ids actually invoked in the script.
menu.lcui (config directory)
Starting from LOICollectionA 1.15.0, Menu no longer reads
menu.json. Please createmenu.lcuiyourself in theplugins/LOICollectionA/configdirectory, directly defineMenuDatain the file, and open it usingMenuForm. The form ID corresponds to the Id passed in/menu gui <Id>.
IMPORTANT
Every script variable must be declared with let (const only declares associated constants inside impl / trait bodies); a bare assignment no longer creates a variable. Keep the let when copying the examples below, otherwise loading the script reports Variable 'x' is not declared and the script is not enabled. See lcui syntax and Data Migration.
let button1 = new MenuItemData();
button1.type = "button";
button1.title = "Button 1";
button1.id = "Button1";
button1.run = [ "say Button1" ];
button1.permission = 0;
let form = new MenuForm("main", "Menu Example");
form.label("This is a menu example", new TextOptions());
form.button("Button 1", button1, func () -> void {
}, new ButtonOptions());
form.closeButton();
form.show(func (result) -> void {
if (result.closeReason == 2) [
mc::runCmd("say No permission");
:
if (result.closeReason == 3) [
mc::runCmd("say No score");
]
]
});
let confirmAction = new MenuItemData();
confirmAction.type = "button";
confirmAction.title = "Confirm";
confirmAction.run = [ "say Confirm" ];
confirmAction.permission = 0;
let cancelAction = new MenuItemData();
cancelAction.type = "button";
cancelAction.title = "Cancel";
cancelAction.run = [ "say Cancel" ];
cancelAction.permission = 0;
let box = new MenuMessageBox("Menu1", "Menu 1");
box.body("This is a menu 1");
box.button1("Confirm", confirmAction);
box.button2("Cancel", cancelAction);
box.show(func (result) -> void {
});shop.lcui (config directory)
Starting from LOICollectionA 1.15.0, Shop no longer reads
shop.json. Please createshop.lcuiyourself in theplugins/LOICollectionA/configdirectory, directly defineShopDatain the file, and open it usingShopForm. The form ID corresponds to the Id passed in/shop gui <Id>.
let mainBuy = new ShopData();
mainBuy.id = "MainBuy";
mainBuy.type = "buy";
mainBuy.title = "Buy Shop Example";
mainBuy.content = "This is a shop example";
mainBuy.exitCommand = "say Exit Shop";
mainBuy.scoreCommand = "say No score";
let apple = new ShopItemData();
apple.type = "commodity";
apple.title = "Apple";
apple.introduce = "A red apple";
apple.number = "Buy number";
apple.id = "minecraft:apple";
let appleScore = new ScoreRequirement();
appleScore.objective = "money";
appleScore.value = 100;
apple.scores = [ appleScore ];
mainBuy.items = [ apple ];
let form = new ShopForm("MainBuy", mainBuy);
form.show(func (result) -> void {
if (result.closeReason == 1) [
if (result.resultCode == 1) [
mc::runCmd(result.shop.scoreCommand);
]
]
});TIP
Apart from Menu and Shop, the interface files of the other modules (Blacklist, Mute, Cdk, Chat, Market, Notice, Pvp, Statistics, Tpa, Wallet, Language, etc.) are bundled with the plugin in the plugins/LOICollectionA/gui directory (e.g. blacklist.lcui, mute.lcui). They are updated together with the plugin and are not editable configuration files. Please do not modify them directly. (If you need to modify them, study the lcui syntax in depth first)
notice.json
NOTE
The following content is taken from the notice.json structure of LOICollectionA 1.10.0. The notice.json structure of later versions may differ.
You can find the notice.json file in the plugins/LOICollectionA/config directory.
For the built-in editor, you can edit it through the following command
{
"main": { // Notice ID (must be unique)
"title": "'Test Notice 123'", // Notice title
"content": [ // Notice content (supports multiple lines)
"'This is a test text 1'", // Content of line 1
"'This is a test text 2'", // Content of line 2
"'This is a test text 3'" // Content of line 3
],
"priority": 0, // Notice priority
"poiontout": true // Whether the notice pops up when a player comes online
}
}cdk.json
NOTE
The following content is taken from the cdk.json structure of LOICollectionA 1.7.0. The cdk.json structure of later versions may differ.
You can find the cdk.json file in the plugins/LOICollectionA/config directory.
For the built-in editor, you can edit it through the following command
{
"cdk": { // CDK ID (must be unique)
"personal": false, // Whether it can only be redeemed once
"player": [], // List of players who redeemed the CDK
"scores": { // Scores granted by the CDK (optional)
"money": 100 // Score amount granted by the CDK
},
"item": [ // Items granted by the CDK (optional)
{
"id": "minecraft:apple", // Item ID
"name": "apple", // Item name
"quantity": 1, // Item quantity
"specialvalue": 0, // Item special value
"type": "universal" // Item parsing type
},
{
"id": "{Count:2b,Damage:0s,Name:'minecraft:apple',WasPickedUp:0b}",
"type": "nbt"
}
],
"title": { // Title granted by the CDK (optional)
"None": 0 // Title ID (a value of 0 means a permanent title)
},
"time": "0" // CDK deletion time (the exact format is %Y%m%d%H%M%S; when 0, it exists permanently)
}
}DANGER
When the server is starting, please do not modify data files directly, otherwise data content is very likely to be lost.
TIP
Sometimes, friends are really great ヾ(•ω•`)o