Introduction
This guide explains how to create dynamic aliases for existing commands in detail using the project_smok add-on. Everything about this add-on is documented in it’s github.com – https://github.com/semihM/project_smok. This guide was made for versions of project_smok v2.0.0 and higher.
https://steamcommunity.com/sharedfiles/filedetails/?id=2229460523
Follow each section in order to successfully create a custom command. If you have any questions, suggestions or issue reports, feel free to ask, share and report them in the add-on’s discussions:
- https://steamcommunity.com/workshop/filedetails/discussion/2229460523/2965021152089567424/
- https://steamcommunity.com/workshop/filedetails/discussion/2229460523/2965021152089554499/
- https://steamcommunity.com/workshop/filedetails/discussion/2229460523/2965021152089552207/
- https://steamcommunity.com/workshop/filedetails/discussion/2229460523/3146305075701950313/
This topic is a quite complicated compared to any other feature project_smok provides. If you get lost or get error messages, feel free to ask questions!
This guide will updated in the future to include more complicated examples.
Aliases in project_smok
Aliases in project_smok were meant to be created for making commands more customizable an enable various features that allow commands to be called in ways that isn’t possible otherwise.Some of these features are:
- Delayed command calls: Wait a certain time before executing the command. A similar thing is actually possible with the wait console command, but this is much easier and dynamic.
- Repeated commands calls: Repeat the command execution given times with given delays. Allows commands to be called more than once with a single call, allowing custom delays between calls.
- Expressional arguments: Compile expressional arguments to get dynamic values. Use the returned result of evaluated expressions as arguments. This is basically the same thing using $[expression] format as your command arguments.
- Alias variables: Access to some variables easily. Let’s you access to command caller player’s information and some other features using $variable format.
Locating the configuration files
project_smok lets you customize settings and create commands and much more through the configuration files. These configuration files are created after you start a map at least once.
You can locate the configuration files under the directory
\Steam\steamapps\common\Left 4 Dead 2\left4dead2\ems\admin system
The \aliases folder allows you to alias commands with dynamic settings.
In this folder, there are at least 4 files:
- example_alias_file.txt: An example alias file introduced in v1.0.0
- example_alias_file_v{x}_{y}_{z}.txt: An example alias file introduced in v{x}.{y}.{z}
- file_list.txt: List of file names to include from this folder
You can read/edit the example files with any text editor.
Creating a new alias file
Create a new text file and name it however you want with .txt text file extension.
Start editing the file you’ve created with a text editor ( notepad, VS Code etc. )
Alias file format
Alias files follow the table data type syntax of Squirrel language:
// Things after "//" characters are comments, lets you take notes // Key-value pairs enclosed with { and } characters { key = value // value's type may vary }
Collapsed definition of a basic alias table
The alias tables must contain certain key-value pairs in order for them to be a valid alias. Names of the keys in these pairs are given in the following table. Default value column shows what value is used when key is not present or value type is incorrect.
Key | Value Type | Default value | Explanation |
MinimumUserLevel | user level | PS_USER_NONE | Minimum user level required to use the alias. Check github.com – https://github.com/semihM/project_smok#user-levels-system |
Help | table | {} | Documentation for the alias |
Parameters | table | {} | Parameters of this alias |
Commands | table | {} | Commands which will be called when this alias is called |
Expected key-value pairs for table data typed values are given as below. All of these pairs in these tables are optional.
Help table
Key | Value Type | Default value | Explanation |
docs | string | “” | Explanation of what this alias does |
param_{x} | table or string | Will not be shown | Details for xth parameter in a table or short description string |
Help.param_{x}tables
Key | Value Type | Default value | Explanation |
name | string | “param_{x}“ | Name of this parameter |
docs | string | “Unknown…” | Explanation of what this parameter is for |
when_null | string | Default value fromParameterstable or not shown | What value is used when this parameters doesn’t get an argument |
Parameters table
Key | Value Type | Default value | Explanation |
param_{x} | string or null | null | {x}th parameter declaration and it’s default value. |
Commands table
Key | Value Type | Default value | Explanation |
{command_name} | table | {} | {command_name} call information table. Contains arguments and timing settings. Accepts alias names which were loaded from other files before this one. |
Commands.{command_name}tables
Key | Value Type | Default value | Minimum value | Explanation |
start_delay | integer, float or string(only $variable or $[expressions]) | 0 | 0 | Time in seconds to wait after using the alias to call this command |
repeat | integer or string(only $variable or $[expressions]) | 1 | 1 | Times to repeat this command |
delay_between | integer, float or string(only $variable or $[expressions]) | 0.1 | 0.1 | Times to repeat this command |
arg_{x} | string or null | null | not checked | {x}th argument’s value. Most commands expect string or null as arguments. If $[expression] format is used, result of evaluating the expression will be used directly, make sure the expression evaluates to a string or null |
Alias variables
There are variables available for each alias call which are accessible using $variable format inside Commands table of the alias table. This format can be used directly as a string.
{ key = "$variable" }
These variables can also be used inside a $[expression] format. In this case all known $variable variables will be replaced using sub-string replace methods, meaning both values will be treated as strings during replacement process.
// These variables don't exist, named to self-document { key = "$[ \"$non_string\" + \"concatenated string\" ]" // - Used \" to use as strings key2 = "$[ $string_variable ]" key3 = "$[ $string_variable.len().tostring() ]" }
All available variables are given in the table below.
Variables (dynamic)
Variable Name | Value Type | Explanation | Example Use |
$repeat_id | integer | Repeat number of the current command call. Starts 1, increased by 1 at the end of the repeat |
"$repeat_id" |
$repeats_left
integer
Repeat number left of the current command call. Starts Commands.{command_name}.repeat, decreased by 1 at the start of the repeat.
$last_call_timefloatStores last repeat’s Time() at the start of that repeat. Will be same as Time() call for the first command call
"$last_call_time"
Variables (non-dynamic)
,”$[ $param_1 == 5 ? \”is 5\” : \”not 5\” ]”
Variable Name | Value Type | Explanation | Example Use |
$param_{x} | string or null | Access to {x}th argument passed in alias call. “$param_{x}” will be replaced with {x}th argument is passed, otherwise Parameters.param_{x} default value is used |
"$param_1" |
$caller_entVSLib.PlayerCommand’s caller as VSLib.Player, can be used to access to this classes methods.
"$[$caller_ent.GetSteamID()]"
$caller_idintegerCommand’s caller’s entity index.
"$caller_id"
$caller_charstringCommand’s caller’s character name fist character capitilized.
"$caller_char"
$caller_namestringCommand’s caller’s steam name.
"$caller_name"
$caller_targetVSLib.Entity or nullCommand’s caller’s target (object they’re aiming at) or null. Uses GetLookingEntity() method.
"$caller_target"
Full view of the basic alias table shown in last section:
NOTE: This alias won’t work since existing_command_1 isn’t really a command(unless you create one yourself!)
Registering the alias
After the alias table file is created, you need to write the file name of the file name without the extension to the file_list.txt file to register the aliases in that file.
Check your console to see if the aliases were registered.
Some basic examples
Contents of my_alias_file.txt are given below.
// Make sure to: // + Start with a { character // + End with a } character { my_basic_alias = { MinimumUserLevel = PS_USER_ADMIN Help = { docs = "a cool alias" param_1 = "used as 1st argument" param_2 = { name = "second_param" docs = "is passed as 3rd argument" when_null = "nothing is passed to 3rd argument" } } Parameters = { param_1 = "default_value_1" param_2 = null // no default value } Commands = { // Calls below will be equivelant: // !my_basic_alias arg1 arg2 // !existing_command_1 arg1 static_value arg2 existing_command_1 = { start_delay = 0 repeat = 1 delay_between = 0.5 arg_1 = "$param_1" // Use param_1's value arg_2 = "static_value" arg_3 = "$param_2" // Use param_2's value } } } }
Here are some other very basic alias tables:
// Some basic alias table examples { throw_grabbed = { MinimumUserLevel = PS_USER_ADMIN Help = { docs = "alternative command to yeet command" } Commands = { yeet = {} } } random_francis_line = { MinimumUserLevel = PS_USER_SCRIPTER Help = { docs = "speak a random line by Francis" } Commands = { randomline = { arg_1 = "self" arg_2 = "francis" } } } }
This is all about Left 4 Dead 2 – How to Create Dynamic Aliases for Existing Commands – Project-Smok; I hope you enjoy reading the Guide! If you feel like we should add more information or we forget/mistake, please let us know via commenting below, and thanks! See you soon!
- All Left 4 Dead 2 Posts List
Leave a Reply