Warrior Medals

A plugin by Ezio(Trusted developer)

Warrior Medals
Downloads 31,851
Updated 1 month ago
Released 2 years ago
Numeric ID 590
Min. Openplanet 1.29.0
Game Trackmania
Seasonal campaign
Seasonal campaign (live)
Club campaign
Track of the Day

Warrior Medals

Are author medals too easy for you, but Champion medals still seem out of reach? Do you need something in-between?

This is of course inspired by the Champion Medals plugin. Warrior medals are available for every official campaign (including training and the TMO discoveries), Weekly Grands, Weekly Shorts (first year), and every Track of the Day. Warrior medals may also be added for club campaigns by request from the campaign's author/maintainer. Message me on Discord, create a GitHub issue, or message me directly from the plugin to request Warrior medals for your campaign. Check all Warrior medal times on my website!

Medals may be manually adjusted due to physics changes or for being more difficult than they should be. Message me on Discord, create a GitHub issue, or message me directly from the plugin if you feel like a Warrior medal does not make sense in some way. Do not ask for Warrior medals to be harder - grind for the Champion medal instead.

This plugin, like most of mine, is licensed under BSD 2-Clause, which is one of the most lenient. You may also use Warrior medal data in whichever way you like without permission, but you do need permission to request it directly from my website. If you're using the data for another plugin, use the Warrior Medals plugin as a dependency and only request data through that.

Seasonal Campaigns:

  • 2 weeks after the season starts
  • 1/4 of the way between author and world record
  • examples:
Map World Record Warrior Author
Summer 2024 - 01 22.325 23.524 23.923
Summer 2024 - 25 1:07.943 1:09.746 1:10.347
  • note: starting Winter 2026, medals are instead calculated like so:
    • White series: 3/4 of the way between author and world record
    • Green: 5/8
    • Blue: 1/2
    • Red: 3/8
    • Black: 1/4 (unchanged)

Weekly Grands:

  • 2 days after the map releases (Tuesday 18:00 CET)
  • 3/8 of the way between author and world record
  • examples:
Map World Record Warrior Author
First Chill (#5) 9:28.571 10:02.392 10:22.684
Green Flow (#6) 9:22.727 10:25.987 11:03.942

Weekly Shorts:

  • when leaderboards are revealed (1 week after release)
  • 1/2 of the way between author and world record
  • discontinued after week 52
  • examples:
Map World Record Warrior Author
First (#1) 16.005 16.819 17.632
Not Cut Proof (#37) 9.244 12.192 15.139

Tracks of the Day:

  • 2 hours after the track releases (21:00 CET)
  • if someone has author by at least 8ms:
    • 1/8 of the way between author and world record
    • otherwise 1 ms faster than author
  • does not account for Champion medal times, so it may be equal or faster
  • examples (arbitrarily chosen values):
World Record Warrior Author
44.926 45.584 45.678
40.069 39.999 40.000

Club Campaigns:

  • when I have time after someone requests medals for a campaign
  • unless decided otherwise, medal will be halfway between author and world record (same as Weekly Shorts)

Function used for calculation:

def calc_warrior_time(author_time: int, world_record: int, factor: float | None = 0.25) -> int:
    '''
    - `factor` is offset from AT
        - between `0.0` and `1.0`
        - examples, given AT is `10.000` and WR is `8.000`:
            - `0.000` - AT (`10.000`)
            - `0.125` - 1/8 of the way between AT and WR (`9.750`) (tracks of the day)
            - `0.250` - 1/4 of the way between AT and WR (`9.500`) (seasonal campaigns)
            - `0.500` - 1/2 of the way between AT and WR (`9.000`) (weekly shorts/club campaigns)
            - `0.750` - 3/4 of the way between AT and WR (`8.500`)
            - `1.000` - WR (`8.000`)
    '''

    return author_time - max(
        int((author_time - world_record) * (factor if factor is not None else 0.25)),
        1
    )

Exports:

Please use this plugin as a dependency! While it's useful on its own, I would love to see integration in some more popular plugins. Include this in your info.toml: optional_dependencies = [ "WarriorMedals" ]

string GetColorWarriorStr()
vec3 GetColorWarriorVec()
Returns the plugin's main color as a string or a vec3.

const UI::Texture@ GetIconWarrior32()
const UI::Texture@ GetIconWarrior512()
Returns the Warrior medal icon with a size of 32x32 or 512x512.

const dictionary@ GetMaps()
Returns all cached map data.
Keys are map UIDs and values are of type WarriorMedals::Map@.

uint GetWMTime()
uint GetWMTime(const string &in uid)
Returns the Warrior medal time for the current map or given map UID. If there is an error or the map does not have a Warrior medal, returns 0. Does not query the API for a time, so the plugin must already have it cached for this to return a time. Only use this if you need a synchronous function.

uint GetWMTimeAsync()
uint GetWMTimeAsync(const string &in uid)
Returns the Warrior medal time for the current map or given map UID. If there is an error or the map does not have a Warrior medal, returns 0. Queries the API for a medal time if the plugin does not have it cached. Use this instead of the synchronous version if possible.

There exist more exports, however they are very basic, are only shared for technical reasons, and are not documented here.

Changelog

1.12.1 - 1 month ago

  • fixed new PBs not saving

1.12.0 - 1 month ago

  • added support for Weekly Grands and Winter 2026

1.11.0 - 2 months ago

  • fixed deprecations
  • improved message system slightly
  • updated license

View all changelogs