Runes are power-ups that grant special abilities. You can have only one rune active at a time, and it will remain active until death.
Design Rationale
The original
Quake Runes mod was a free-for-all player deathmatch. Many of the runes had abilities increasing the players survivability or fragging efficiency. When porting the concept to Team Fortress, it became apparent that some of the runes were too strong in a team objective-based setting. Similar to the design philosophy of the weapon alternatives, runes that increase a players damage output come with negative effects.
When designing new runes, the focus was to complement team-play more than buffing individual players. Some runes can become more effective when used in coordination with teammates. Because of the random nature of the rune drops, runes that only effect certain classes were avoided. However some runes are certainly more effective in the hands of certain classes. To facilitate teamplay runes can be shared with teammates by dropping them on the ground.
Although most runes have passive abilities, some runes require activating with the command +use.
List of Runes
Aware - Periodically scans your nearby surroundings. Shows class and health of nearby players.
Recall - Teleport to a previous location. +use sets or clears teleport destination. When far enough away, teleports player to destination.
Blink - Teleports between two locations. +use to toggle destinations.
IronDome - Launches interceptor rockets upon death. Interceptor rockets cause knockback only. Based on
javalia
DeadMansTrigger - Triggers explosion upon death. +use to activate with greater effect. When fully detonated the affected players are temporarily stunned. Contact with interceptor rockets negate this runes effects.
Sharing - Healthkits and ammokits picked up are shared with nearby teammates.
Rage - Increases rate of fire upon damaging an enemy. Prolonged usage can cause adverse effects.
Powerplay - Instantly respawns fallen teammates when you kill three enemies in under 10 seconds.
Shared Sacrifice - Incoming damage is divided among nearby teammates.
Diamond Skin - Damage reduced by 10. The bleed, jarate, milk, and stun conditions have no effect.
Engineering - Grants speed boost when carrying objects. Steals enemy sentries upon death.
Ammo - Passively replenishes ammo. Active with +use to restore your weapon clip. Additionally, engineers gain metal, and spies gain cloak time.
Pounce - Passively grants more control over movement when in the air. Shamelessly copied from
Chanz
Vault - Passively increases height of jumps.
Assault - Grants a speed boost when ubered.
Vanguard - Redirects damage from nearby weaker teammates to you.
AirBud - Increased air movement. Decreased gravity.
Sabotage - Deal extra damage to buildings and take extra damage from engineers. Stronger spy sappers.
Melee - Melee attacks only. Damage increased.
Haste - Slight buff to player movement speed. Penality when under the effects of jarate, bleed, milk, or daze.
Repulsion - Enemy rockets, flares, and arrows are pushed away from the player.
Installation
Requires sdkhooks
Copy materials, models and sound directories into respective tf mod folder. Copy plugins, extensions, gamedata, data into the respective sourcemod folder.
Add to your server.cfg tf_allow_player_use 1, it is required!
Alternatively add exec happs.cfg to your server.cfg, provides useful aliases for testing runetf.
Currently, only stock maps have rune spawn points. But an in-game menu is provided to add spawn points to custom maps.
cvars
Code:
rune_enable Enables runetf game-mode
rune_version Version
rune_spawn_interval Time between random spawns
rune_spawn_lifetime Time until a spawned rune expires
rune_spawn_droptime Time until a rune dropped by a player expires
rune_round_start_clear Clear runes on map and from players when a new round starts
rune_round_end_clear Clear runes on map and from players when a mini-round ends
st_gamedesc_override Changes game type to RuneTF. Set to empty string to disable.
rune_vote_threshold Percentage of players needed to toggle runetf
rune_vote_allow_enable Allow rune voting to enable
rune_vote_allow_disable Allow rune voting to disable
rune_update_mapcfg If you modify the map spawn configuration files, you should set this to 0
rune_update_branch Change the branch the autoupdater will use to sync with
You can change these cvars on a per map basis by adding them to a cfg/mapname.cfg file.
User Commands
Code:
+use players must have bound a key to +use
!drop drop your currently held rune
!inspect_rune shows rune held by player or targeting
!runes vote to enable runetf
!norunes vote to disable runetf
!info_rune display a runes abilities
Dev Commands
Code:
!spawn_rune spawn a specific rune
!menu_rune manipulate spawn generators
/toggle_spawn_rune enable !spawn__rune for everyone
/sm_give give the target player a specific rune
/sm_take take from the target player a specific rune
sm_give and sm_take bypass the checks if a player already has a rune, and should only be used when developing new runes.
Use !spawn_rune when play-testing.
Spawn Generator
Runes do not spawn at random locations in the map. All spawn locations have a fixed origin, angle and force. Each spawn point has a unique number. There are two arrays, a global array and a disabled array. Periodically, as configurable by rune_spawn_interval, a random rune from the global array will be selected and spawned. You can group spawn points into named clusters.
The !menu_rune command is the interface you should use to create new rune generators. It is a wrapper around most of the lower-level commands listed below.
There is a third array, the working set, that is used when creating new spawn points. The working set is not saved to disk, and must be merged for changes to take effect.
Code:
sm_gen list the contents of all three arrays
sm_gen set <...> manipulate properties of spawn point
sm_it iterate through an array
Before you can do anything useful with the spawn points, you have to create a cluster. Clusters can have any number of spawn points, and each spawn point can be a member of any number of clusters. Currently, it is not possible to remove a cluster from the config unless you manually edit the map config file and remove all references to it; so choose wisely.
Code:
sm_gen cluster create <cluster>
All spawn points that are currently in the working set will automatically be added to the created cluster.
Code:
sm_cluster <cluster?> list cluster membership and events
sm_gen cluster <add|remove> <cluster> [id|lower-upper] change cluster membership status of a sequence of spawn points
sm_gen cluster load <cluster> loads all spawn points in the cluster from the working set
sm_gen cluster drop <cluster> drop all spawn points in the cluster from the working set
Each spawn point has a boolean flag that assigns it's membership to the global array or disabled array when the map is started. (or new full round)
Code:
sm_gen cluster <enable|disable> <cluster name> Change the startup membership of every spawn point in a cluster.
To get an idea of what a cluster will look like, you can spawn an entire cluster at once. This is how I created the graphic in the logo.
Code:
sm_gen cluster spawn <cluster> Spawn temporary runes from cluster
Clusters can be tied to map entity outputs to create events that will do one of four actions:
- Spawn cluster of runes at once.
- Add spawn points into global array if not already
- Remove spawn points from global array if not already
- Toggle each spawn point between global and disabled.
Code:
sm_cluster <cluster?> display cluster events
sm_gen event <cluster> remove <#> remove event #number from cluster, starting at 0
sm_gen event <cluster> <create|clone> low-level event tools; use !menu_rune
The event that is triggered can either be from an output of any classname, or a named entitiy of a particular classname.
For example;
Code:
sm_gen event blue_forward create Add ByEnt control_point_1 OnCapTeam2
This will add all rune spawn points from blue_forward when the team_control_point entity named control_point_1 is captured by team blu.
Code:
sm_gen event center_ramps create Spawn ByClass trigger_capture_area OnEndCap
All spawn points in the cluster center_ramps will be spawn a rune when any team_control_point is captured by either team.
When you are done, always make sure to merge and save your changes.
Code:
sm_gen merge Copy working set into persistent arrays, overriding changes if id already exists.
sm_gen_save Save persistant arrays to disk.
test_spawn Test your changes with spawn_test.
Optional Plugins
The only required plugins are spawn_test, spawn_gen and the runetf extension.
Code:
rune_vote Handles the !runes and !norunes vote commands, and rune_enable forwards.
rune_help Greets players with a description of the game-mode, and warns players every ~5 mins if they have never used +use.
rune_info Displays rune descriptions with the !info_rune command.
rune_plugin_updater Periodically check for new releases of the plugin.
rune_updater Separately check for new map spawn generator files. If you modify any, set rune_update_mapcfg 0!
Compiling
Source is located at
github if you wish to contribute.
Requires sdkhooks, steamtools, smlib, color.inc
Updater required for plugin autoupdates.