Skip to content
Return to Projects
Case Study

IceLegends SMP

A vanilla-first Romanian Minecraft SMP built for clean 3–4 month seasons.

The Problem

Running a community SMP means balancing plugin depth against vanilla feel, managing a world-reset cycle, and keeping operations simple enough for a solo admin. IceLegends SMP solves this with 11 carefully chosen plugins, strict feature gating per a "vanilla-first" principle, and fully automated backups and world resets.

My Role

Designed, configured, and deployed solo — server architecture, 11-plugin selection and configuration, LuckPerms permission model, economy and nation design, Docker infrastructure, and Cloudflare Tunnel ingress for Dynmap.

Highlights

  • PaperMC 1.21 on Docker with a hard 11-plugin cap — every plugin is justified and none are redundant
  • Towny nations with seasonal quests (Quests + Citizens NPCs) and a single manually-spawned MythicMobs boss per season
  • AureliumSkills passive bonuses only — active abilities disabled to preserve vanilla combat (P-01)
  • DiscordSRV bridge logs every death, join, and chat event to dedicated Discord channels in real time
  • Daily automated backups with 7-day retention; resource world resets every Monday at 05:00 via cron

Stack

PaperMC 1.21DockerCloudflare TunnelLuckPermsTownyAureliumSkillsMythicMobsDiscordSRVDynmap

Constraints

  • Solo admin — every operation must complete in under 10 minutes (P-02).
  • Vanilla-first (P-01): if any plugin disappeared tomorrow, the game must continue unchanged.
  • 11-plugin hard cap — every addition must displace something or prove unique, irreplaceable value.

System Architecture

Edge
Cloudflare Tunnel (Dynmap web map)
TCP :25565 open (Minecraft clients)
Runtime
Docker + docker-compose
itzg/minecraft-server image
Core
PaperMC 1.21
Vault
LuckPerms
EssentialsX
CoreProtect
Gameplay
Towny
AureliumSkills
ShopGUI+
Quests + Citizens
MythicMobs
Multiverse-Core
Ops
DiscordSRV bridge
Daily backup cron (04:00)
Weekly world reset cron (Mon 05:00)

Key Trade-offs

The decisions worth defending — what I chose, what I turned down, and why.

Plugin count cap

Chose

Hard cap at 11 plugins

Rejected

Unlimited plugin stack

Each plugin is a maintenance surface and a potential conflict point. The cap forces prioritisation and keeps the dependency graph legible for a solo admin.

Public ingress for Dynmap

Chose

Cloudflare Tunnel (no open ports)

Rejected

Expose :8123 directly via UFW

No origin IP exposure, free DDoS protection, and zero firewall rule maintenance — the same pattern used by the IceLegends portfolio site.

AureliumSkills scope

Chose

Passive bonuses only, active abilities disabled

Rejected

Full AureliumSkills feature set including active combat abilities

Active abilities alter vanilla combat — a direct violation of P-01. Passive bonuses reward playtime additively without changing the combat model.

Season lifecycle

Chose

Full world reset every 3–4 months

Rejected

Incremental map expansion with no reset

Resets keep the world fresh, prevent terrain exhaustion, and give every new player an equal start — critical for community health in a small SMP.

What I'd Do Differently

An honest retrospective — the stuff I'd change with more time, more users, or a second pass.

  1. 1Add a staging compose stack so plugin updates can be tested before touching the live season — one bad update cost several hours of rollback work.
  2. 2Move backup storage off-site from day one; local-only archives are a single hardware failure away from a full season loss.
  3. 3Wire Dynmap as a named Docker service rather than relying on the host port, so the Cloudflare Tunnel config survives container IP reassignment on restart.

Technical Deep-Dive

Architecture, specifications, and implementation details.

29 — Jobs System — Profesii cu Progresie pe Nivel

"

Jobs Reborn + perks pasive per nivel — mineritul devine o carieră, nu o corvoadă

#Filozofie

Joburile nu înlocuiesc vanilla — le fac mai profunde. Un Miner de nivel 50 simte diferența față de unul de nivel 1: mine mai rapid, primește mai mult, smeltuiește mai repede. Progresia e vizibilă și recompensatoare fără să fie pay-to-win.

Regula de bază: perk-urile sunt bonus, nu obligatorii. Un jucător fără job poate face tot ce face unul cu job — dar mai lent.


#Plugin Stack pentru Jobs

PluginRolCost
Jobs RebornCore — XP, nivele, plată per acțiuneGratis
CMILibDependință obligatorie pentru Jobs RebornGratis
JobRewardsRecompense custom la fiecare nivelGratis
LuckPermsAcordă permisiuni la nivel up (haste, bonusuri)Gratis

##Download

Jobs Reborn:  spigotmc.org/resources/jobs-reborn.4216
CMILib:       zrips.net/cmilib
JobRewards:   spigotmc.org (caută JobRewards)

#Joburile disponibile — 8 selectate pentru SMP

JobAcțiuni plătiteTemă RO
MinerMinerit roci, minereuriMiner
LumberjackTăiat și plantat copaciTăietor de lemne
FarmerRecoltat culturi, crescut animaleFermier
HunterOmorât mobi, animaleVânător
FisherPescuitPescar
BuilderPlasat blocuri, construitConstructor
CrafterCrafted iteme, brewed poțiuniMeșter
SmelterTopit minereuri, gătit mâncareTopitor
"

Limită: jucătorul poate avea maxim 2 joburi simultan. Alege-le cu grijă — specializarea creează identitate pe server.


#Sistem de Perks pe Nivel

##🔨 MINER — Perks pe nivel

NivelPerkMecanism
10+10% șansă ore dublu dropJobs Reborn bonus
20Haste I pasiv (mining mai rapid)LuckPerms → permisiune efect
30+20% income din minereuriJobs Reborn multiplier
40Haste II pasivLuckPerms upgrade
50Night Vision pasiv în mineLuckPerms → CMI effect
75+50% drop rate toate minereurileJobs Reborn bonus
100Haste III + titlu [Maestru Miner]LuckPerms + prefix

##🌲 LUMBERJACK — Perks pe nivel

NivelPerkMecanism
10+10% lemn din copaciJobs Reborn bonus
20Speed I când ții topor în mânăLuckPerms effect
35Replant automat după tăiereJobs Reborn action
50+1 sapling bonus la fiecare copacJobs Reborn bonus
75Whole-tree chop (taie tot copacul)LuckPerms permisiune
100Titlu [Maestru Tăietor]LuckPerms prefix

##🌾 FARMER — Perks pe nivel

NivelPerkMecanism
10+15% recoltă din culturiJobs Reborn bonus
20Replant automat după recoltareJobs Reborn action
35+25% șansă semințe bonusJobs Reborn bonus
50Speed I la fermăLuckPerms effect
75Recoltă instantanee cu Hoe enchantedLuckPerms permisiune
100Titlu [Maestru Fermier]LuckPerms prefix

##🏹 HUNTER — Perks pe nivel

NivelPerkMecanism
10+15% drops de la mobiJobs Reborn bonus
20Strength I la luptă cu mobiLuckPerms effect
35Looting III automat (fără enchant)LuckPerms permisiune
50+30% XP drops de la mobiJobs Reborn bonus
75Mob heads drop chance 10%LuckPerms permisiune
100Titlu [Maestru Vânător]LuckPerms prefix

##🎣 FISHER — Perks pe nivel

NivelPerkMecanism
10+20% treasure din fishingJobs Reborn bonus
25Luck of the Sea III automatLuckPerms permisiune
50Pești rari drop rate dubluJobs Reborn bonus
75Treasure chest din fishing 1/20Jobs Reborn bonus
100Titlu [Maestru Pescar]LuckPerms prefix

##🏗 BUILDER — Perks pe nivel

NivelPerkMecanism
10+10% income din blocat plasatJobs Reborn bonus
25Scaffolding gratuit în inventoryJobs Reborn kit
50/builder fly (zbor limitat în claim)LuckPerms permisiune
75+50% income din buildJobs Reborn bonus
100Titlu [Maestru Constructor]LuckPerms prefix

##⚒ CRAFTER — Perks pe nivel

NivelPerkMecanism
10+15% income din craftingJobs Reborn bonus
25Rețete secrete deblocateLuckPerms permisiune
50Craft în bulk (x4 simultan)LuckPerms permisiune
75+50% income din orice craftJobs Reborn bonus
100Titlu [Maestru Meșter]LuckPerms prefix

##🔥 SMELTER — Perks pe nivel (IDEEA TA!)

NivelPerkMecanism
10Smelting cu 10% mai rapidJobs Reborn → furnace speed
20+1 output la fiecare 5 iteme smeltedJobs Reborn bonus
30Smelting cu 25% mai rapidJobs Reborn upgrade
50Auto-smelt în inventar (ore → ingot direct)LuckPerms permisiune
75Smelting cu 50% mai rapid + dublu outputJobs Reborn bonus
100Titlu [Maestru Topitor] + instant smeltLuckPerms + permisiune

#Configurare Jobs Reborn

##generalConfig.yml — valori cheie

# Câte joburi poate avea un jucător simultan
max-jobs: 2

# Nivelul maxim per job
max-level: 100

# Pierde XP la leave job?
exp-lost-on-leave: 10   # pierde 10% din XP dacă schimbă jobul

# Income crește cu nivelul — formula
# income = base * (1 + level * 0.02)
# La nivel 50 = base * 2.0 (dublu față de nivel 1)

# Afișare job în chat
display-job-in-chat: true
chat-format: "&8[&a{job}&8] &f{name}&8: &7{message}"

##Miner.yml — exemplu complet

jobName: Miner
shortname: M
description: Minează minereuri și primești coins + XP
ChatColour: GRAY
progressbar:
  enable: true
  color: GREEN

# Plată per bloc minat
Break:
  diamond_ore:
    income: 50.0
    exp: 20.0
  iron_ore:
    income: 10.0
    exp: 5.0
  gold_ore:
    income: 20.0
    exp: 8.0
  coal_ore:
    income: 3.0
    exp: 2.0
  emerald_ore:
    income: 80.0
    exp: 30.0
  ancient_debris:
    income: 200.0
    exp: 80.0

# Bonus drops per nivel (ideea ta!)
levelBonuses:
  10:
    income-multiplier: 1.1    # +10% income
  20:
    income-multiplier: 1.2
    cmd-on-levelup:
      - "perm user {player} add miner.haste1"
  30:
    income-multiplier: 1.3
  40:
    cmd-on-levelup:
      - "perm user {player} remove miner.haste1"
      - "perm user {player} add miner.haste2"
  50:
    income-multiplier: 1.5
    cmd-on-levelup:
      - "perm user {player} add miner.nightvision"
  75:
    income-multiplier: 1.75
  100:
    income-multiplier: 2.0
    cmd-on-levelup:
      - "perm user {player} add miner.haste3"
      - "lp user {player} meta setprefix '[Maestru Miner] '"
      - "broadcast &6{player} a devenit &lMaestru Miner!"

##Smelter.yml — furnace speed perks

jobName: Smelter
shortname: S
description: Smeltuiești și gătești pentru coins + bonusuri de viteză

Smelt:
  iron_ore:
    income: 8.0
    exp: 4.0
  gold_ore:
    income: 15.0
    exp: 6.0
  raw_iron:
    income: 8.0
    exp: 4.0

# Furnace speed bonuses pe nivel
# Jobs Reborn suportă furnace-speed-multiplier nativ
levelBonuses:
  10:
    furnace-speed-multiplier: 1.1   # 10% mai rapid
  20:
    furnace-speed-multiplier: 1.25
    output-multiplier: 1.1          # +10% output
  30:
    furnace-speed-multiplier: 1.5   # 50% mai rapid
  50:
    furnace-speed-multiplier: 1.75
    cmd-on-levelup:
      - "perm user {player} add smelter.autosmelt"
  75:
    furnace-speed-multiplier: 2.0   # dublu de rapid
    output-multiplier: 1.5
  100:
    furnace-speed-multiplier: 3.0   # de 3x mai rapid
    output-multiplier: 2.0
    cmd-on-levelup:
      - "perm user {player} add smelter.instantsmelt"
      - "lp user {player} meta setprefix '[Maestru Topitor] '"
      - "broadcast &c{player} a devenit &lMaestru Topitor!"

#LuckPerms — Permisiuni per Perk

# Haste efecte (aplicate via CMI sau un plugin de effects)
# Când Jobs acordă permisiunea → pluginul de effects detectează și aplică

# Miner perks
/lp group miner.haste1    → efect Haste I permanent
/lp group miner.haste2    → efect Haste II permanent
/lp group miner.haste3    → efect Haste III permanent
/lp group miner.nightvision → efect Night Vision permanent

# Smelter perks
/lp group smelter.autosmelt   → auto-smelt ore în inventar
/lp group smelter.instantsmelt → smelt instant

# Hunter perks
/lp group hunter.looting3     → Looting III bonus automat
/lp group hunter.mobheads     → mob head drop enabled

#Titluri la nivel 100 — toate joburile

JobTitluCuloare
Miner[Maestru Miner]&8 (gri închis)
Lumberjack[Maestru Tăietor]&2 (verde)
Farmer[Maestru Fermier]&a (verde deschis)
Hunter[Maestru Vânător]&4 (roșu)
Fisher[Maestru Pescar]&b (aqua)
Builder[Maestru Constructor]&6 (auriu)
Crafter[Maestru Meșter]&5 (mov)
Smelter[Maestru Topitor]&c (roșu deschis)
"

La nivel 100, jucătorul primește titlul în chat + broadcast server + 500 coins bonus


#Integrare cu economia

# Venituri echilibrate — nu strică economia
# Formula: income crește gradual, nu exponențial

# Nivel 1:  iron_ore = 10 coins
# Nivel 50: iron_ore = 10 * 1.5 = 15 coins
# Nivel 100:iron_ore = 10 * 2.0 = 20 coins

# Jucătorul activ câștigă ~200-500 coins/oră la nivel mediu
# La nivel 100: ~400-800 coins/oră
# Nu depășește quest rewards — echilibru menținut

#Comenzi utile

# Jucători
/jobs join Miner          # Alătură-te jobului
/jobs leave Miner         # Părăsești jobul
/jobs info Miner          # Info + perks pe nivel
/jobs stats               # Statisticile tale
/jobs top Miner           # Leaderboard job

# Admin
/jobs admin give Miner exp 1000 NumeJucator  # XP manual
/jobs admin set Miner level 50 NumeJucator   # Setează nivel
/jobs admin reload                            # Reload config

#Comenzi de setup LuckPerms pentru perks

# Rulat automat de Jobs la level-up via cmd-on-levelup
# Sau manual de Admin:

# Acordă Haste I unui miner de nivel 20+
/lp user NumeJucator permission set miner.haste1 true

# Acordă titlu Maestru
/lp user NumeJucator meta setprefix "[Maestru Miner] "

# Verifică permisiunile unui jucător
/lp user NumeJucator permission check miner.haste2

#Prioritizare setup

1. Instalezi: Jobs Reborn + CMILib
2. Configurezi generalConfig.yml (max-jobs=2, max-level=100)
3. Configurezi câte un .yml per job cu levelBonuses
4. Testezi: creezi un jucător test, dai XP manual, verifici că primește perk-ul
5. Adaugi JobRewards pentru recompense vizuale la level-up
6. Integrezi cu LeaderBoards (Plan Analytics afișează top jobs)

#Related Documents

  • Economy (income echilibrat) → 03_economy_design.md
  • LuckPerms (permisiuni) → 11_permissions_staff.md
  • AureliumSkills (skills separate de jobs) → 05_skills_progression.md
  • Leaderboards → 20_plan_analytics.md
~ End of Document ~
Kiwi