TDXPlugins
TDX VotePlusConfiguration

milestones

One-shot rewards at TOTAL / MONTHLY / WEEKLY / DAILY / STREAK thresholds.

Milestones are one-shot rewards that fire the first time a player crosses a threshold on a particular counter. They're the long-term chase that keeps players coming back well after the daily reward has lost its novelty.

The milestones GUI showing per-tier progress and rewards

The milestones GUI — players can browse every tier, see their progress, and preview the reward at each step.

Quick example

plugins/TDXVotePlus/milestones.yml
milestones:
  enabled: true

  tiers:
    - id: first-vote
      counter: TOTAL
      threshold: 1
      message: "<#4DA6E8>Welcome aboard! Your first vote unlocks the Voter tag.</>"
      rewards:
        - type: command
          value: "lp user %player% parent add voter"

    - id: ten-votes
      counter: TOTAL
      threshold: 10
      message: "<#38D9F0>10 votes! Here's a small thank-you.</>"
      rewards:
        - type: money
          amount: 1000

    - id: streak-7
      counter: STREAK
      threshold: 7
      message: "<#FF9D5E>7-day streak! You're committed.</>"
      rewards:
        - type: item
          material: DIAMOND
          amount: 5
          name: "<#FFD700>Streak Diamonds</>"

    - id: monthly-30
      counter: MONTHLY
      threshold: 30
      message: "<#A8D8F0>30 votes this month — top voter material.</>"
      rewards:
        - type: command
          value: "give %player% netherite_ingot 1"

Counter kinds

Each milestone tier picks one counter to watch. The plugin checks that counter on every vote and fires the milestone once when the threshold is crossed.

CounterWhat it tracksResets?
TOTALAll-time vote count for this playerNever
MONTHLYVotes this calendar monthFirst of the month
WEEKLYVotes this weekMonday 00:00 server-local
DAILYVotes today00:00 server-local
STREAKConsecutive days the player has voted at least onceIf the player misses a day

TOTAL and STREAK milestones are the most common — they're genuinely long-term goals. MONTHLY / WEEKLY / DAILY milestones fire repeatedly across periods (once per period, not once ever), which makes them more like "achievements within a period."

Reference

KeyTypeDefaultNotes
enabledbooleantrueMaster switch for milestones.
tierslistOrdered list of milestone definitions.
<tier>.idstringInternal id, must be unique. Used in the database for dedup.
<tier>.counterstringOne of TOTAL, MONTHLY, WEEKLY, DAILY, STREAK.
<tier>.thresholdintThe counter value the player must reach (or exceed).
<tier>.messagestringMiniMessage line sent when the milestone fires.
<tier>.rewardslistThe reward pool to fire — same shape as vote-rewards.yml.

Repeating milestones

Set repeat: true on a tier to make it re-trigger every threshold votes instead of once at exactly N. Useful for "every 100 votes get a goodie" patterns:

- id: every-100
  counter: TOTAL
  threshold: 100
  repeat: true
  message: "<#A8D8F0>Another 100 votes! Here's another bonus.</>"
  rewards:
    - type: money
      amount: 5000

STREAK milestones with repeat: true are particularly powerful — "every 7 days of voting straight, get a chest of loot" gives players a recurring weekly chase that doesn't reset their progress.

Resetting a player's milestone state

Milestone state is permanent by design — it's what makes a milestone a milestone. If you genuinely need to clear it (e.g. after a wipe), use /voteplus reset <player>, which clears every counter and milestone mark for that player in one command.