AlphaRewardsv1.0.0

Configuration

config.yml controls global behavior; the actual reward tables live in separate menu files under menus/.

Reward mode

reward-mode selects which of two completely independent reward systems is active. Only one runs at a time, but switching back and forth doesn't erase the other mode's saved progress — each keeps its own separate data on disk.

DAILY

One reward per calendar day, no continuity requirement. A player can only claim their current day, once per calendar day — missing a day doesn't reset anything, it just sits there waiting to be claimed.

STREAK

Continuous claiming — a player can only claim the very next day in sequence, once per calendar day. Missing a day breaks the streak back to day 1 (subject to the grace period below).

The shipped config.yml default is reward-mode: "STREAK", but if this value is ever invalid/unparseable the plugin silently falls back to DAILY — not STREAK. Worth double-checking after a manual edit.

Top-level config.yml keys

reward-mode: "STREAK"        # DAILY or STREAK
colors:
  primary-gold: "#C8A96E"    # the only color key actually read — see below
  light-gold: "#D4C5A9"
  dark-gold: "#8B7355"
  accent: "#C8A96E"
  text: "#D4C5A9"
  error: "#FF6B6B"
  success: "#7CFC7C"
  locked: "#808080"
storage:
  type: "YAML"                # not currently read by code — see Storage below
  mysql: { host, port, database, username, password }
join-notification:
  enabled: true
  delay-ticks: 40
auto-claim:
  enabled: true
streak:
  reset-on-miss: true
  grace-period-hours: 6
title-message:
  enabled: false
daily-menu: "daily.yml"
streak-menu: "streak.yml"
rewards-per-page: 4
KeyDefaultBehavior
join-notification.enabledtrueGlobal switch. If on (and the player's own setting is also on), sends a reminder message join-notification.delay-ticks after join, but only if they have ≥1 reward currently claimable.
auto-claim.enabledtrueGlobal switch. Actual auto-claiming on join additionally requires the player's own auto-claim setting and the alpharewards.autoclaim permission.
streak.reset-on-misstrueWhether missing a day breaks the streak at all (STREAK mode only).
streak.grace-period-hours6Only matters when the last streak claim was exactly 2 days ago: if it's still within this many hours past midnight, the streak isn't broken yet. Has no effect for gaps of 0–1 days (never breaks) or 3+ days (always breaks).
title-message.enabledfalseIf true, shows an on-screen title/subtitle (0.5s fade-in, 2.5s stay, 0.5s fade-out) in addition to the chat message on every successful claim.
daily-menu / streak-menudaily.yml / streak.ymlFilenames (relative to menus/) used depending on the active reward-mode.
rewards-per-page4How many reward-day slots are shown per GUI page; page count = ceil(total days ÷ this number).

Colors

Only colors.primary-gold actually does anything. It's used to replace legacy &e/&6 (yellow/gold) color codes throughout messages and menus with this hex value. The other seven keys (light-gold, dark-gold, accent, text, error, success, locked) exist purely as a reference of the hex values already hardcoded directly in the menu YAML files — editing them in config.yml has no effect on anything.

Storage

MySQL is not implemented. storage.type and storage.mysql.* are present in config.yml but nothing in the plugin currently reads them. Every player's data is saved to its own YAML file under playerdata/ regardless of what this section says. See FAQ.

Loaded recursively from plugins/AlphaRewards/menus/ — every .yml file found is cached by its relative path (e.g. daily.yml, settings/settings.yml). Shipped defaults: daily.yml defines days 1–7, streak.yml defines days 1–12.

KeyMeaning
title, rowsGUI title and inventory row count.
navigationprevious-page / next-page / settings button slot, material, name, lore.
reward-slotsList of inventory slots — one template cloned across every page.
rewards.<day>One entry per reward day, keyed by day number.

Reward-day states

Each day has three independent visual states — available, claimed, locked — each with its own material, name, lore, glow, and optional status-line.

Instead of a vanilla Material name, material also accepts basehead-<base64> for a custom player-head skin texture (Paper's PlayerProfile API).

Command tiers

Each day's commands block has a default command list, plus any number of named permission-gated tiers (vip, mvp, etc.) each with their own permission and commands list. Commands run as console (support the {player} placeholder) and are dispatched on the correct thread automatically on Folia.

rewards:
  1:
    available: { material: CHEST, name: "...", lore: [...] }
    claimed:   { material: MINECART, name: "..." }
    locked:    { material: GRAY_DYE, name: "..." }
    commands:
      default:
        - "give {player} iron_ingot 64"
      vip:
        permission: "alpharewards.tier.vip"
        commands:
          - "give {player} iron_ingot 128"
          - "eco give {player} 500"
Tier order in the file matters. Tiers are evaluated top-to-bottom and each matching tier overwrites the previous match — there's no early exit on "best match." List tiers lowest → highest in the file, or a player with a lower-tier permission could end up overriding a higher one that was defined earlier. See Permissions → Tier order.

Player data & persistence

Per-player YAML files at plugins/AlphaRewards/playerdata/<uuid>.yml, holding: current-day, last-claim-date, streak-count, last-streak-date, claimed-days, and the two personal settings toggles. Cached in memory, loaded asynchronously on join, saved asynchronously after every claim/setting change, and flushed synchronously for everyone on plugin disable.