LV
0
- Joined
- May 28, 2026
- Messages
- 45
- Reaction score
- 33
- Points
- 38
- Location
- Chaos Tower
- Website
- chaospirates.com
The Complete Drop Rate Guide for Tales of Pirates / PKO: Global Rates, Per-Monster Drops & Quality
Everything you need to control loot on your server, in one place: the one-number global multiplier that scales all drops, the per-monster tables that fine-tune any single item, the drop-grade (quality) table, quest drops, and, for the curious, exactly how the drop system works under the hood. Most of it needs no coding and no recompiling, just a text editor and a server restart. The one thing that trips up nearly everyone, and the reason so many servers run with wrong rates, is that the per-monster drop-rate number works backwards. Start there.
1. The one thing you MUST understand first: bigger number = RARER
This is the part everyone gets wrong, so read it twice.
The per-monster "drop rate" value in the tables is not a percentage. It's an inverse denominator. Think of it as "1 in N", scaled by 100. The game rolls the drop with this formula:
So a smaller number drops more often, and a bigger number is rarer:
Two more rules:
The formula you'll actually use, to hit a target percentage:
Examples: want 5%? Use 10000 / 5 = 2000. Want 0.5%? Use 10000 / 0.5 = 20000. Want 25%? Use 10000 / 25 = 400. Bookmark that formula; it's the whole game.
2. The easy way: global rate multipliers (scale everything at once)
If you just want more or fewer drops across the whole server (a "x2 drop" server, or a weekend event), you don't touch individual monsters at all. There's a one-number multiplier in:
Near the top, under the "Modify Global Rates" header, you'll find:
Each is a plain multiplier where 1 = normal. Set
It applies as soon as you save and restart the GameServer. There is no enable flag to flip for these Global values, they take effect on load.
When to use which:
(Note: this multiplier still can't make something drop more than once every kill, and it stacks with player Luck gear and party bonuses, so a x2 server with Luck players will feel like more than 2x.)
3. Where per-monster drops actually live (and where they do NOT)
For per-monster control, drops are defined per monster in your GameServer's resource folder:
Not
Inside
The first line of the file is a // header naming every column, so you can find Drop ID and Drop Rate by counting to them (they're the same position in every row). Editing in a spreadsheet set to tab-delimited, or a good text editor with column highlighting, makes this painless.
4. How to read a monster's drop list
Say a monster's two columns look like this:
Read them as pairs, left to right:
Each pair is rolled independently, so this monster can drop several of those items in a single kill (the 100% one always, plus a 5% chance at the second, plus a 0.4% chance at the third).
5. How the roll actually works (so you tune the right thing)
Heads-up (don't get scared by this): there's a second, different drop path in the source that rolls once per point of damage. That one is only for gathering and harvest nodes (mining spots, resource objects), not monster kills. Monster kills use the once-per-kill path above. If you were told "drops roll per damage," that's the gathering system, not your mob loot, so don't re-tune your monsters around it.
6. Worked examples
Make item 878 drop at 5% from a monster that doesn't drop it yet:
Add the ID and the value (10000/5 = 2000) to the ends of the two lists, keeping them aligned:
Make a gem ultra-rare (0.01%): use 1000000.
Remove a drop: delete the ID from Drop ID and its matching value from Drop Rate. Keep the two lists the same length and in the same order. That alignment is everything.
Nerf an existing drop from 0.4% to 0.05%: change its value from 25000 to 200000 (10000/0.05 = 200000).
7. Controlling drop QUALITY (how good the item is)
CharacterInfo.txt decides what drops and how often. A separate table decides the quality grade of what dropped: whether a piece of gear comes out plain, or high-grade with better stats. That lives in the same file as the global rates:
Look for the table Item_Baoliao. By default:
When a monster drop fires, the game rolls 1 to 100 and uses this table to pick the item's grade. The numbers are ascending cutoffs, and each grade's real chance is its number minus the previous number (grade 0 gets whatever is left after the last number). With the defaults that works out to:
So by default about 90% of monster drops are low grade (0 to 2) and only about 5% are high grade (4 to 5). Higher grade = better rolled item.
To make high-grade drops more common: widen the gap for the grade you want, keeping the whole list ascending (each value greater than or equal to the one before, never above 100). Example, to roughly double the high-grade odds:
Slots [0] to [4] are 0 by default, which caps monster drops at grade 5. To allow even higher grades (6, 7, and up), put a small non-zero value in those early slots.
A few rules so you don't break it:
8. Quest drops (bonus)
Back in
9. Applying your changes
Both files (
(Note: the client has its own
Always keep a backup copy of the files before a big edit, in case a misaligned list slips in.
10. Top mistakes to avoid
11. Under the hood: how the drop system actually works (optional)
You don't need this to tune drops, but if you want to understand why the numbers behave the way they do, here's the full path. All of this is in the shared server source.
When a monster dies:
Item grade is set right after, in
The "per-damage" drop path some people mention is a separate system (
Key files:
Quick reference card
That's the whole toolkit: one global number to scale everything, two columns to fine-tune any single monster, and one table for drop grade. You can retune your entire loot economy without writing a single line of code.
Everything you need to control loot on your server, in one place: the one-number global multiplier that scales all drops, the per-monster tables that fine-tune any single item, the drop-grade (quality) table, quest drops, and, for the curious, exactly how the drop system works under the hood. Most of it needs no coding and no recompiling, just a text editor and a server restart. The one thing that trips up nearly everyone, and the reason so many servers run with wrong rates, is that the per-monster drop-rate number works backwards. Start there.
1. The one thing you MUST understand first: bigger number = RARER
This is the part everyone gets wrong, so read it twice.
The per-monster "drop rate" value in the tables is not a percentage. It's an inverse denominator. Think of it as "1 in N", scaled by 100. The game rolls the drop with this formula:
Code:
chance to drop (per kill) = 100 / (the drop rate value)
So a smaller number drops more often, and a bigger number is rarer:
Code:
value drop chance
--------- -----------
100 100% (guaranteed)
200 50%
500 20%
1000 10%
2000 5%
5000 2%
10000 1%
25000 0.4%
50000 0.2%
100000 0.1%
1000000 0.01% (super rare)
Two more rules:
- The value must be at least 100 for the item to drop at all. Anything below 100 (like 0, -1, -2) is treated as an empty or disabled slot, so no drop.
- 100 is the smallest useful value, meaning 100% guaranteed. You can't go "more than guaranteed."
The formula you'll actually use, to hit a target percentage:
Code:
value to enter = 10000 / (the % you want)
Examples: want 5%? Use 10000 / 5 = 2000. Want 0.5%? Use 10000 / 0.5 = 20000. Want 25%? Use 10000 / 25 = 400. Bookmark that formula; it's the whole game.
2. The easy way: global rate multipliers (scale everything at once)
If you just want more or fewer drops across the whole server (a "x2 drop" server, or a weekend event), you don't touch individual monsters at all. There's a one-number multiplier in:
Code:
server/GameServer/resource/script/calculate/variable.lua
Near the top, under the "Modify Global Rates" header, you'll find:
Code:
Server.Rates.Global.EXP = 1 -- solo player EXP
Server.Rates.Global.TeamEXP = 1 -- team EXP
Server.Rates.Global.DROP = 1 -- item DROP rate <-- this one
Server.Rates.Global.ShipEXP = 1 -- boat EXP
Server.Rates.Global.FairyEXP = 1 -- fairy EXP
Server.Rates.Global.MissionGold = 1 -- quest gold
Server.Rates.Global.Resource = 1 -- gathering rate
Each is a plain multiplier where 1 = normal. Set
Server.Rates.Global.DROP = 2 for double drops server-wide, 3 for triple, 0.5 for half. Same idea for EXP, fairy EXP, and the rest. This multiplies the final drop chance for every monster, on top of whatever each monster's own rate is.It applies as soon as you save and restart the GameServer. There is no enable flag to flip for these Global values, they take effect on load.
When to use which:
- Want the whole server more or less generous? Change Server.Rates.Global.DROP here. One number, done.
- Want one specific item on one specific monster tuned? Use the per-monster method in the next sections.
(Note: this multiplier still can't make something drop more than once every kill, and it stacks with player Luck gear and party bonuses, so a x2 server with Luck players will feel like more than 2x.)
3. Where per-monster drops actually live (and where they do NOT)
For per-monster control, drops are defined per monster in your GameServer's resource folder:
Code:
server/GameServer/resource/CharacterInfo.txt
Not
monsterinfo.txt. That file is just spawn zones (where mobs appear on each map); it has nothing to do with what they drop. This is one of the most common mix-ups. Drops live in CharacterInfo.txt.Inside
CharacterInfo.txt, each row is one monster and the columns are tab-separated. Two columns control normal drops:- Drop ID: a comma-separated list of item IDs the monster can drop.
- Drop Rate: a comma-separated list of rate values, lined up one-to-one with the Drop ID list.
The first line of the file is a // header naming every column, so you can find Drop ID and Drop Rate by counting to them (they're the same position in every row). Editing in a spreadsheet set to tab-delimited, or a good text editor with column highlighting, makes this painless.
4. How to read a monster's drop list
Say a monster's two columns look like this:
Code:
Drop ID : 885,878,860
Drop Rate : 100,2000,25000
Read them as pairs, left to right:
Code:
item 885 @ value 100 = 100% (drops every kill)
item 878 @ value 2000 = 5%
item 860 @ value 25000 = 0.4%
Each pair is rolled independently, so this monster can drop several of those items in a single kill (the 100% one always, plus a 5% chance at the second, plus a 0.4% chance at the third).
5. How the roll actually works (so you tune the right thing)
- Drops are rolled once per kill, per item in the list. That per-kill 100 / value chance is the base.
- A few things multiply that base chance on the live server:
- The global DROP multiplier from Section 2 (Server.Rates.Global.DROP).
- Luck gear & Luck fairies (Amplifier of Luck, Lucky fairy, etc.) raise the player's drop rate.
- Party size: being in a team adds a small bonus (about +2.5% per extra member near you).
- So the value in the table is the base, unbuffed chance. A player loaded with Luck in a full party on a x2 server will see noticeably more than the raw number. Plan your rates around the base, and remember buffs push the real-world rate up from there.
Heads-up (don't get scared by this): there's a second, different drop path in the source that rolls once per point of damage. That one is only for gathering and harvest nodes (mining spots, resource objects), not monster kills. Monster kills use the once-per-kill path above. If you were told "drops roll per damage," that's the gathering system, not your mob loot, so don't re-tune your monsters around it.
6. Worked examples
Make item 878 drop at 5% from a monster that doesn't drop it yet:
Add the ID and the value (10000/5 = 2000) to the ends of the two lists, keeping them aligned:
Code:
Drop ID : 885,860 -> 885,860,878
Drop Rate : 100,25000 -> 100,25000,2000
Make a gem ultra-rare (0.01%): use 1000000.
Code:
Drop ID : 860
Drop Rate : 1000000
Remove a drop: delete the ID from Drop ID and its matching value from Drop Rate. Keep the two lists the same length and in the same order. That alignment is everything.
Nerf an existing drop from 0.4% to 0.05%: change its value from 25000 to 200000 (10000/0.05 = 200000).
7. Controlling drop QUALITY (how good the item is)
CharacterInfo.txt decides what drops and how often. A separate table decides the quality grade of what dropped: whether a piece of gear comes out plain, or high-grade with better stats. That lives in the same file as the global rates:
Code:
server/GameServer/resource/script/calculate/variable.lua
Look for the table Item_Baoliao. By default:
Code:
Item_Baoliao[0..4] = 0
Item_Baoliao[5] = 1
Item_Baoliao[6] = 5
Item_Baoliao[7] = 10
Item_Baoliao[8] = 40
Item_Baoliao[9] = 80
When a monster drop fires, the game rolls 1 to 100 and uses this table to pick the item's grade. The numbers are ascending cutoffs, and each grade's real chance is its number minus the previous number (grade 0 gets whatever is left after the last number). With the defaults that works out to:
Code:
grade 5 : 1% (1 - 0)
grade 4 : 4% (5 - 1)
grade 3 : 5% (10 - 5)
grade 2 : 30% (40 - 10)
grade 1 : 40% (80 - 40)
grade 0 : 20% (100 - 80)
So by default about 90% of monster drops are low grade (0 to 2) and only about 5% are high grade (4 to 5). Higher grade = better rolled item.
To make high-grade drops more common: widen the gap for the grade you want, keeping the whole list ascending (each value greater than or equal to the one before, never above 100). Example, to roughly double the high-grade odds:
Code:
Item_Baoliao[5] = 2 -> grade 5 = 2%
Item_Baoliao[6] = 8 -> grade 4 = 6%
Item_Baoliao[7] = 16 -> grade 3 = 8%
(leave [8] = 40 and [9] = 80)
Slots [0] to [4] are 0 by default, which caps monster drops at grade 5. To allow even higher grades (6, 7, and up), put a small non-zero value in those early slots.
A few rules so you don't break it:
- Keep the values ascending (slot 0 <= slot 1 <= ... <= slot 9), each 100 or less.
- This is global: it changes the grade of every monster drop on your server, not one mob.
- Quest rewards have their own copies of this table (
Item_Mission_1throughItem_Mission_8) that work the same way.
8. Quest drops (bonus)
Back in
CharacterInfo.txt there's a second pair of columns, Quest Drop ID and Quest Drop Rate, that work the exact same way as normal drops (same "bigger = rarer", same 100/value). The difference: these only drop for a player who's on the matching quest. Use them for quest turn-in items so random players farming the mob don't flood the market with them.9. Applying your changes
Both files (
CharacterInfo.txt and variable.lua) are read by the GameServer at startup, so:- Save your edits.
- Restart the GameServer.
- Done. No bin recompile needed for any of this, it's all server-side.
(Note: the client has its own
MonsterInfo.bin, but that only feeds the in-client "monster info" display; it does not control drops. Drops are 100% server-side. Don't waste time recompiling client bins for this.)Always keep a backup copy of the files before a big edit, in case a misaligned list slips in.
10. Top mistakes to avoid
- Thinking bigger = more common. For the per-monster value it's the opposite. 1000000 is basically never; 100 is every time. (The Global.DROP multiplier is the normal way round: 2 = double.)
- Editing monsterinfo.txt. Wrong file: that's spawns, not drops. Use CharacterInfo.txt.
- Lists getting out of sync. Drop ID and Drop Rate must have the same count and same order. Delete or add from both together, or you'll shift every rate onto the wrong item.
- Using a value under 100. Below 100 = disabled slot = no drop. Minimum real value is 100 (=100%).
- Forgetting the buffs. The table value is the base rate; the Global.DROP multiplier, Luck gear, and party size raise what players actually see. If drops feel "too high," check your Global.DROP and the Luck meta before you crank the per-monster numbers.
11. Under the hood: how the drop system actually works (optional)
You don't need this to tune drops, but if you want to understand why the numbers behave the way they do, here's the full path. All of this is in the shared server source.
When a monster dies:
- The death handler (
EventCalculate) callsCFightAble::ItemCount, which hands the monster's drop list to the Lua function Check_Baoliao inscript/calculate/skilleffect.lua. - For each item in the list, Check_Baoliao runs this (simplified):
Code:
if value >= 100 then
chance = min(1, 100 / value) -- base per-kill chance, capped at 100%
chance = chance * playerDropRate -- global DROP rate * Luck gear * party bonus
chance = chance * expState / 100 -- level-gap / anti-farm factor
if roll(chance) then this item drops end
end
- playerDropRate comes from the engine (
GetPlyDropRate/GetDropRate). It folds together the globalServer.Rates.Global.DROPmultiplier, the player's Luck gear/fairies, and the party-size bonus (about +2.5% per extra nearby member). - expState scales the chance by the level gap between player and monster (killing grey / very low-level mobs pays less; an anti-farm measure).
- The global multiplier reaches the engine from
variable.lua:MF_RAID = Server.Rates.Global.DROP, thenSetGlobalRates(MF_RAID, EXP_RAID)pushes it in at load. That's why changing that one number affects everything.
Item grade is set right after, in
AttrCalculate.lua: SetItemQua calls Item_Quality_Ran(Item_Baoliao), the 1-to-100 roll against the Item_Baoliao table from Section 7.The "per-damage" drop path some people mention is a separate system (
SpawnResource / Check_SpawnResource) for gathering / harvest nodes, scaled by Server.Rates.Global.Resource. It rolls once per point of damage dealt to a resource object. It does not touch monster loot, so don't confuse the two.Key files:
Code:
CharacterInfo.txt -> what each monster drops + per-item rate
script/calculate/variable.lua -> global multipliers + Item_Baoliao (grade)
script/calculate/skilleffect.lua -> Check_Baoliao (the per-kill drop roll)
script/calculate/AttrCalculate.lua -> SetItemQua / Item_Quality_Ran (grade roll)
Quick reference card
Code:
per-monster chance = 100 / value (bigger value = RARER)
value to enter = 10000 / wanted% (to hit a target %)
min value = 100 (=100%); below 100 = disabled
per-monster file = server/GameServer/resource/CharacterInfo.txt
per-monster cols = "Drop ID" + "Drop Rate" (parallel, comma-separated)
global multiplier = Server.Rates.Global.DROP (1 = normal, 2 = double)
quality (grade) = Item_Baoliao table (grade % = its number minus previous)
global file = server/GameServer/resource/script/calculate/variable.lua
apply = save + restart GameServer (no recompile, all server-side)
That's the whole toolkit: one global number to scale everything, two columns to fine-tune any single monster, and one table for drop grade. You can retune your entire loot economy without writing a single line of code.

