RewardCore
Three reward systems that keep players coming back — in one plugin, with nothing else to install.
RewardCore bundles daily login rewards, crates, and vote rewards for Paper servers. There are no runtime dependencies at all: no Vault, no economy plugin, no permissions plugin, no database, and no NuVotifier. Everything is configured in YAML you can read, and every word a player sees ships in English and Dutch.
📅 Daily login rewards
A repeating reward cycle players claim once per day with /daily.
- Streaks — claiming on consecutive days builds a streak; missing a day resets it.
- Grace days — optionally forgive one or two missed days, so a single bad week does not destroy a 60-day run.
- Milestone bonuses — an extra reward every 7, 30, or any number of days in a row, paid on top of the normal daily reward.
- Calendar menu — every day of the cycle with its contents in plain words ("3-8x Diamond", "+100 XP", "1x daily key"), the current/best streak, and a live countdown to the next claim.
- Join reminder — a configurable, delayed message telling players their reward is waiting.
- The cycle repeats forever, and changing its length never resets anyone's streak.
🎁 Crates
Weighted reward crates opened with account-bound keys.
- Keys cannot be lost — they are counters on the account, not items. No dropping them on death, no losing them in lava, no duplication exploits, no scams.
- Public odds — a preview screen shows the exact percentage of every reward, taken from the same table the roll uses. There is no setting to hide it.
- Rarity tiers — colour and optional server-wide announcements per tier ("Steve just won an Elytra!"). Five tiers included; add your own.
- Opening animation — a short spinning reel. The outcome is decided before it starts, so a player who closes the window still gets the prize, and a disconnect mid-spin refunds the key.
- Free-key timers — per crate, e.g. one free key every 24 hours or once a week.
- Physical crates — bind any block with
/crate setblock <crate>; right-click opens, left-click previews. A floating label appears above it, the block is protected from breaking, and no orphan entities are ever left behind. - Rank-only crates — give a crate any permission node you like.
- Keys can be granted to offline players, so a webstore command like
crate givekey {player} vote 1just works.
🗳️ Vote rewards
Reward server-list votes — with a Votifier server built into the plugin.
- No NuVotifier needed. RewardCore runs its own Votifier v1/RSA listener, generates its key
pair on first start, and hands you the public key with
/vote key. - Already run NuVotifier? Keep it: RewardCore can reward the votes that plugin receives instead, using the same configuration.
- Vote streaks — a rolling window (48 h by default) that survives an off-by-a-few-hours vote, with a bonus every N consecutive votes.
- Offline voters are not punished — crate keys and command rewards apply immediately; items and XP are kept and delivered on their next login.
- Vote party — every vote counts toward a shared goal that rewards everyone online, with progress announcements ("12 votes to go!").
- Clickable vote links in
/vote, plus each player's totals and streak. /vote testruns the exact code path a real vote takes, so you can verify rewards before touching a firewall.
One reward format for everything
Daily rewards, crate prizes, vote payouts, and vote parties all use the same block. Learn it once:
give:
items:
- type: DIAMOND
min: 1
max: 3
xp: 100
levels: 0
keys:
vote: 1
commands:
- 'eco give {player} 500'
messages:
- '&aThanks for voting, {player}!'
Console commands are the deliberate escape hatch. Instead of depending on one economy or permissions plugin, any reward can run a command — so RewardCore works with EssentialsX, CMI, LuckPerms, or whatever you already run:
commands:
- 'eco give {player} 2500' # any economy
- 'lp user {player} parent addtemp vip 7d' # a week of VIP as a crate prize
Items support amount ranges, custom names, lore, enchantments, and a fake glow. Overflow drops at the player's feet instead of vanishing.
Commands
| Command | Aliases | Description |
|---|---|---|
/daily |
dailyreward, dailyrewards |
Open the reward calendar |
/daily claim | streak |
Claim today's reward · show your streak | |
/crate |
crates, key, keys |
Open the crate menu |
/crate keys | preview <crate> | open <crate> | claim |
Keys · odds · open · free key | |
/vote |
votes, voting |
Vote links, your stats, party progress |
/rewardcore status | reload |
rc, rewards |
Module status · reload everything |
Admin: /crate givekey|takekey|setblock|removeblock|reload, /daily reset|reload,
/vote test|key|reload. Everything is tab-completed.
Permissions
| Node | Default | Controls |
|---|---|---|
rewardcore.daily.use |
everyone | /daily and claiming |
rewardcore.crate.use |
everyone | /crate, opening, previews |
rewardcore.vote.use |
everyone | /vote |
rewardcore.admin |
op | /rewardcore |
rewardcore.daily.admin · rewardcore.crate.admin · rewardcore.vote.admin |
op | Admin subcommands |
rewardcore.lang.<code> |
off | Force a language for a group |
Crate access uses whatever node you write in crates.yml, so it never clashes with your setup.
Modular by design
Each feature is a module you can switch off in config.yml:
modules:
crates:
enabled: true
daily:
enabled: true
vote:
enabled: false # this server does not use vote lists
A disabled module registers no commands, no listeners, and no tasks — and its data is kept, so switching it back on restores every streak, key, and vote count. Modules only reference each other optionally: if you turn crates off, key rewards elsewhere are skipped with a console warning instead of breaking.
Bilingual out of the box
All player-facing text lives in lang/messages_en.yml and lang/messages_nl.yml — menu titles,
item names, lore, chat, even the d/h/m/s countdown suffixes. Nothing is hardcoded.
A player's language is chosen by a rewardcore.lang.<code> permission, then their own client
locale, then your default. Adding a third language is copying one file and translating the values.
Installation
- Drop the jar in
plugins/. - Start the server.
- Edit
daily-rewards.yml,crates.yml, and thevote:section ofconfig.yml. /rewardcore reload.
For votes, open TCP port 8192, run /vote key, and paste the key into your vote sites.
Compatibility
| Server | Paper 1.21+ (and forks: Purpur, Pufferfish). Spigot is not supported. |
| Java | 21 or newer |
| Side | Server only — players need no mod |
| Folia | Not supported |
| Dependencies | None |
| Storage | Flat YAML you can open and read |
Data files
daily-data.yml (streaks) · crate-data.yml (keys and timers) · vote-data.yml (votes, party
counter, pending offline rewards) · crate-blocks.yml (physical crates). Back them up with your
world; the plugin never overwrites your configuration on update.
FAQ
Do I need an economy plugin? No. Reward money with a console command and any economy works.
Are crate keys items players can trade? No — they are account-bound, which is what makes them impossible to duplicate or lose.
Do I need NuVotifier? No, the listener is built in. If you already run it, RewardCore can use its votes instead.
What if a player votes while offline? Keys and commands apply straight away; items and XP wait for their next login and are delivered automatically.
Can I hide the crate odds? No. Showing them is a deliberate design decision — players trust a crate they can inspect, and several jurisdictions expect disclosure.
Does it work on Spigot? No. Paper or a Paper fork.

