Category: Minecraft Plugins
Building a Minecraft Server with an AI Team#3Numbers ×10, a 12-Hour XP Curve, and Simulating 6 Classes! 📊
This post was translated from the Korean original.
At a glance
How one line, 'make damage and HP feel punchy,' becomes real numbers: a one-time 10x migration that leaves admin-changed values alone, an XP table you edit in Excel, and how simulating the 'starter weapons are too strong' complaint showed the cause was weapon attack speed, not the formula.
- Paper 1.21.11 · server config files · actually applied and simulated 2026-09-28 to 09-30
- The ×10 migration changes only values still at the old default, runs once, and records number-scale: 10 — values the admin edited are preserved
- XP curve goal: about 12 hours for levels 1→30, fast early on · a plateau in each band
- The main cause of the ±40% class DPS gap wasn't the formula but weapon attack speed (axe 0.8 hits/s vs sword 1.6 hits/s)
Contents9 sections
Hi there! It's Mojangcam 😎
Last time, in #2, I covered the plugin structure and the 1000029 damage incident. This episode is all about the game's numbers.
When you build an RPG server, you end up hearing things like this.
"I want damage to hit big and feel satisfying, and HP to grow big and feel satisfying too."
It's a good direction, but turning it into actual numbers is surprisingly tricky. In this episode, I'll go over
- 🔢 How I scaled HP and damage 10x all at once
- 📈 Building an XP curve for "level 30 in 12 hours"
- ⚖️ What happened when I put the "starter weapons are too strong" feedback through a simulation
in that order. The planning-team AI picks the numbers, each dev team puts them into code, and a human makes the final call.
📌 Step 1 - Numbers ×10: Making the "Visible Numbers" Bigger 🔢
What gets scaled 10x
| Scaled 10x (flat values) | Left as is (ratios, etc.) |
|---|---|
| HP, attack, magic attack | % options, multipliers |
| Base weapon damage, flat bonus damage | Defense (it goes into a ratio formula) |
| Fixed potion healing, mob HP and damage | Mana, XP, gold |
The reason you shouldn't scale defense 10x is kind of fun. The defense formula is 방어 / (방어 + 100) (defense / (defense + 100)), so turning 25 defense (20% reduction) into 250 gives you a 71% reduction. If you touch values that feed into a ratio formula, the balance breaks.
How do you change it on a server that's already running?
The hardest part was servers that already had config files. The admin might have changed mob HP directly in-game. So I had every module follow the same rule and migrate exactly once.
# What each module does once when the server starts (really Java; this is just the flow in Python)
if config.get("number-scale", 1) != 10:
backup(config_file) # 1) Back up before changing anything
for key, old_default in OLD_DEFAULTS.items():
if config[key] == old_default: # 2) Only values still "exactly" at the old default
config[key] = old_default * 10 # get scaled 10x
else:
log(f"{key} was changed by the admin, leaving it as is")
config["number-scale"] = 10 # 3) Mark it → never runs again after this
save(config)Let's break it down piece by piece 💡
- Recording number-scale : Starting the server twice won't turn it into 100x.
- Only old defaults change : Values the admin touched are treated as intentional and left alone. Instead, they're listed in the log so a human can check them.
- Backup first : If the migration goes wrong, you can roll it back.
When I actually restarted the server once, the core, combat, item, level, and mob modules all logged a "×10 migration," with 0 errors.
I also settled on a few adjustments along the way.
| Item | Value |
|---|---|
| Critical multiplier | ×1.5 → ×2.0 |
| Normal mob HP | Tier multiplier 1.0 → 0.9 (so it dies in 4 basic attacks) |
| Damage when the mob is higher level than you | Gap ≤2: 100% · 3: 80% · 4: 50% · 5 or more: fixed at 1 |
| Last-hit XP cap | Up to the XP of a mob at your level +4 (stops people from stealing last hits on high-level mobs) |
📌 Step 2 - XP Curve: Levels 1→30 in 12 Hours 📈
The goal was about 12 hours from level 1 to 30, and fast early on. If the early game is slow, people leave.
At first I made a smooth curve, but then I went back to the planning-team AI and asked for "a curve that feels different in each band." Here's what it looks like.
| Band | Shape | Intent |
|---|---|---|
| Lv 1–9 | Hand-picked values, very fast | Several level-ups in the first 30 minutes |
| Lv 10–14 | Plateau | Time to get used to new hunting grounds |
| Lv 15–29 | Rises about ×1.2 per level | You can feel yourself growing |
| Lv 30+ | A plateau every 5 levels + the multiplier gradually shrinks (×1.08 → ×1.075 → …) | So it doesn't keep getting steeper forever |
- Result: 12.0 hours total for 1→30, 281,150 XP overall
- It's all one file,
exp_table.csv, so you can open it in Excel and edit it, and/리로드 level(reload) applies it right away
On top of that, I added a level-gap XP penalty. Kill a mob way below your level and you get less XP.
| How far below you the mob is | 0–3 | 4 | 5 | 6 | 7 | 8 | 9 | 10+ |
|---|---|---|---|---|---|---|---|---|
| XP you get | 100% | 90% | 60% | 45% | 30% | 20% | 15% | 10% |
📌 Step 3 - "Starter Weapons Are Too Strong" → Simulation ⚖️
Among the people testing, the feedback came up that "the class starter weapons are too strong." Here's the direction they wanted.
Weapon damage should be strong early on, but later, attack, penetration, and class stats should matter a lot more.
The lead drafted a formula, and I had the planning-team AI calculate 6 classes × 7 level stages × 2 stat builds × 3 formulas = 252 cases.
Proposed formula (draft)
# Attack: the part that stacks up with level, gear, and stats
ATK = (base_attack + growth_attack(level) + gear_flat_attack) \
* (1 + main_stat * 0.005 + sub_stat * 0.002)
# Base damage: weapon damage isn't affected by stats
B = weapon_damage + ATK
# Defense: as level goes up, the same defense gets a little less effective
effective_def = max(0, defense - flat_pen) * (1 - pct_pen) # Penetration: flat first, then %
K = 100 + attacker_level * 5
damage = B * K / (K + effective_def)Simulation results
| Item | Current formula | Formula change only | Formula + matched attack speed (recommended) |
|---|---|---|---|
| Weapon's share of damage Lv1 → Lv30 | 100% → 14–21% | 45–58% → 10–16% | 58% → 7% |
| DPS gap between classes | −41% to +43% | −43% to +44% | −7% to +11% |
| Basic attacks to kill a normal mob | 5 hits at Lv15 | 5 hits at Lv15 | 4 hits at every level |
The interesting part is the middle column. Change only the formula, and the DPS gap stays exactly the same. When I dug into why, the cause wasn't the formula at all — it was the weapons' attack speed.
- Axe: 0.8 hits per second
- Sword & dagger: 1.6 hits per second
- Magic bolt: 1.67 hits per second
No matter how carefully you balance per-hit damage, the axe only swings half as often, so of course the DPS gap opens up. That's why the recommendation was to match attack speeds first (axe and bow at 1.0 hits/s; sword, dagger, and magic bolt at 1.25 hits/s).
What people felt as "the starter weapon is too strong" was really because early on, 100% of the damage comes from the weapon, and stats only add 1% per 10 points, so nothing besides the weapon made a noticeable difference. The feeling was right, but the cause was somewhere else.
⚠️ This formula v2 is still at the proposal stage. The first integration test will use the current formula, and v2 will be applied once a decision is made.
📌 What I Learned Working with an AI Planning Team 💬
- It's great at translating "feel" into numbers. It turns "satisfying" into a table like "Lv1 one hit 101 → Lv30 1,937, 4 basic attacks."
- You have to make it write down its assumptions. It decides things like attack speed, gear upgrade levels, and hunting speed on its own before calculating, so if the report has no "assumptions" table, it's hard to trust the results.
- The decisions belong to humans. The AI drafts several recommendations and even lists the affected modules, but what to pick is up to the person making the game.
📌 Wrapping Up
- Numbers ×10 for flat values only, migrate only once, and preserve values the admin changed
- XP lives in one table you edit in Excel, 12 hours for levels 1→30
- The real cause of the balance complaints wasn't the formula but attack speed — without the simulation, I'd still be tweaking the formula
The next episode is about art. I'll cover the pipeline where ChatGPT handles GUIs, icons, and weapon art while Claude reviews them, plus the accidents the review caught (bows with swapped names, an invisible background, and a glitchy flickering bow). Stay tuned 🙌
I set the direction for this post and put it together with Claude. This server is a personal project, is not official Minecraft content, and is not affiliated with Mojang or Microsoft.
Series · Part 3 of 5
Building a Minecraft Server with an AI Team
- #11 AI Team Lead + 15 Team Members Building an MMORPG Plugin! 🤖
- #213 Modules in One Plugin! The Core Structure and the '1000029 Damage' Incident 🧩
- #3Numbers ×10, a 12-Hour XP Curve, and Simulating 6 Classes! 📊You are here
- #4A Resource Pack Pipeline Where ChatGPT Draws and Claude Reviews! 🎨
- #5Running the Dev Team with a Discord Bot! Decision Forum, Command List & Resource Pack Channel 🤝
