Skip to content

VoteMilestones

github-actions[bot] edited this page Jan 27, 2026 · 4 revisions

VoteMilestones

VoteMilestones allow you to run rewards when a player’s vote totals, points, or site counts reach specific conditions.

This system replaces legacy milestone systems such as FirstVote, Cumulative, and MileStones, while remaining fully backward-compatible through automatic migration.

This page explains how VoteMilestones really work, followed by lots of real examples.


Where VoteMilestones are configured

All VoteMilestones are configured in:

plugins/VotingPlugin/SpecialRewards.yml

They live under two root sections:

VoteMilestonesOptions:
VoteMilestones:

How VoteMilestones work

On every vote, VotingPlugin:

  1. Updates the relevant total (votes, points, sites, etc.)
  2. Evaluates all VoteMilestones
  3. Determines which milestones match
  4. Applies group selection rules
  5. Applies limits (cooldowns / windows)
  6. Executes rewards

VoteMilestones are not automatically one-time unless you use a Limit.


VoteMilestonesOptions (group selection)

Groups control how many milestones can trigger per vote.

VoteMilestonesOptions:
  Groups:
    Default: ALL
    RankRewards: HIGHEST

Group modes

Mode Meaning
ALL All matching milestones in the group run
FIRST Only the first matching milestone (file order)
HIGHEST Only the “best” milestone runs

HIGHEST rules

  1. At milestones beat Every
  2. Higher matched value wins
  3. Earlier file order breaks ties

If a milestone has no Group, it automatically uses Default.


VoteMilestone fields

Basic structure:

VoteMilestones:
  ExampleId:
    Enabled: true
    Total: ALLTIME_VOTES
    At: 100
    Group: Default
    Limit:
      Type: NONE
    Rewards:
      Commands:
        - "say %player% hit %amount%"

Core keys

Key Purpose
Enabled Enable/disable milestone
Total What value is checked
At Exact totals (supports ranges & lists)
Every Repeating trigger
Group Group selection bucket
Limit Prevents re-triggering
Rewards What runs when matched

Supported totals (Total:)

Value Meaning
ALLTIME_VOTES Lifetime votes
DAILY_VOTES Votes today
WEEKLY_VOTES Votes this week
MONTHLY_VOTES Votes this month
POINTS Vote points
ALLSITES_TODAY Unique sites voted today

Friendly aliases like AllTime, Daily, Weekly, Monthly, and Points also work.


Triggers: At vs Every

Every (multiples)

Every: 25

Triggers when the total is divisible by 25 (25, 50, 75, …)


At (exact totals)

Single value

At: 50

List

At:
  - 25
  - 50
  - 100

Ranges (with optional steps)

At:
  - "10..100 step 10"
  - "250..500 step 50"

Ranges are expanded safely and automatically.


Limits

Limits control how often a milestone can trigger.

Limit:
  Type: COOLDOWN
  Duration: 12h

Limit types

Type Behavior
NONE No limit
WINDOW_DAY Once per day
WINDOW_WEEK Once per week
WINDOW_MONTH Once per month
COOLDOWN Once per duration

Duration supports:

30m, 12h, 1d, 2w, 1mo

Examples


Example: First-ever vote

VoteMilestones:
  FirstVote:
    Enabled: true
    Total: ALLTIME_VOTES
    At: 1
    Rewards:
      Messages:
        Player: "&aThanks for your first vote!"
      Commands:
        - "eco give %player% 100"

Example: First vote of the day

VoteMilestones:
  FirstVoteToday:
    Enabled: true
    Total: DAILY_VOTES
    At: 1
    Rewards:
      Messages:
        Player: "&eThanks for voting today!"

Example: Every 10 total votes

VoteMilestones:
  Every10Votes:
    Enabled: true
    Total: ALLTIME_VOTES
    Every: 10
    Rewards:
      Commands:
        - "crate give %player% vote 1"

Example: Multiple exact milestones

VoteMilestones:
  BigMilestones:
    Enabled: true
    Total: ALLTIME_VOTES
    At:
      - 25
      - 50
      - 100
    Rewards:
      Broadcast:
        Message: "&6%player% reached %amount% total votes!"

Example: Range + step milestones

VoteMilestones:
  SteppedMilestones:
    Enabled: true
    Total: ALLTIME_VOTES
    At:
      - "10..100 step 10"
      - "250..500 step 50"
    Rewards:
      Commands:
        - "eco give %player% %amount%"

Example: Monthly milestone

VoteMilestones:
  Monthly50:
    Enabled: true
    Total: MONTHLY_VOTES
    At: 50
    Rewards:
      Commands:
        - "points give %player% 25"

Example: Vote points rewards

VoteMilestones:
  PointRewards:
    Enabled: true
    Total: POINTS
    At:
      - 100
      - 500
      - 1000
    Rewards:
      Commands:
        - "lp user %player% parent add vip"

Example: All vote sites today

VoteMilestones:
  AllSitesToday:
    Enabled: true
    Total: ALLSITES_TODAY
    At: 5
    Limit:
      Type: WINDOW_DAY
    Rewards:
      Messages:
        Player: "&aYou voted on all sites today!"

Example: Cooldown-based milestone

VoteMilestones:
  VoteBonusCooldown:
    Enabled: true
    Total: ALLTIME_VOTES
    Every: 50
    Limit:
      Type: COOLDOWN
      Duration: 12h
    Rewards:
      Commands:
        - "eco give %player% 250"

Example: Rank rewards (HIGHEST group)

VoteMilestonesOptions:
  Groups:
    RankRewards: HIGHEST

VoteMilestones:
  Rank50:
    Group: RankRewards
    Total: ALLTIME_VOTES
    At: 50
    Rewards:
      Commands:
        - "lp user %player% parent add bronze"

  Rank100:
    Group: RankRewards
    Total: ALLTIME_VOTES
    At: 100
    Rewards:
      Commands:
        - "lp user %player% parent add silver"

Legacy migration

The following legacy sections are automatically migrated at startup:

FirstVote
FirstVoteToday
Cumulative
MileStones
AllSites
AlmostAllSites

New configurations should always use VoteMilestones.


Placeholders

Placeholder Meaning
%player% Player name
%amount% Matched milestone value
%total% Same as amount
%votemilestone% Milestone ID
%total_type% Total type enum

Clone this wiki locally