X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fevents.qh;h=21c8ef9a5c114e92b0650f4ca5b6ec251a14d3a5;hp=ad97997e2f53c2f4c0d61900688d9a6416c6e84c;hb=530e29e1a8395e12b8b8b44ac1030a84546eb903;hpb=d6414f596f67ca6212738a0f51b9f0a28f0aaefe diff --git a/qcsrc/server/mutators/events.qh b/qcsrc/server/mutators/events.qh index ad97997e2f..21c8ef9a5c 100644 --- a/qcsrc/server/mutators/events.qh +++ b/qcsrc/server/mutators/events.qh @@ -6,20 +6,29 @@ /** called when a player becomes observer, after shared setup */ #define EV_MakePlayerObserver(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(MakePlayerObserver, EV_MakePlayerObserver) /** */ #define EV_PutClientInServer(i, o) \ - /** client wanting to spawn */ i(entity, __self) \ + /** client wanting to spawn */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(PutClientInServer, EV_PutClientInServer); +/** + * return true to prevent a spectator/observer to spawn as player + */ + #define EV_ForbidSpawn(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(ForbidSpawn, EV_ForbidSpawn); + /** called when a player spawns as player, after shared setup, before his weapon is chosen (so items may be changed in here) */ #define EV_PlayerSpawn(i, o) \ - /** spot that was used, or world */ i(entity, spawn_spot) \ + /** player spawning */ i(entity, MUTATOR_ARGV_0_entity) \ + /** spot that was used, or NULL */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ -entity spawn_spot; MUTATOR_HOOKABLE(PlayerSpawn, EV_PlayerSpawn); /** called in reset_map */ @@ -39,101 +48,101 @@ MUTATOR_HOOKABLE(ForbidPlayerScore_Clear, EV_ForbidPlayerScore_Clear); /** called when a player disconnects */ #define EV_ClientDisconnect(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(ClientDisconnect, EV_ClientDisconnect); /** called when a player dies to e.g. remove stuff he was carrying. */ #define EV_PlayerDies(i, o) \ - /**/ i(entity, frag_inflictor) \ - /**/ i(entity, frag_attacker) \ - /** same as self */ i(entity, frag_target) \ - /**/ i(int, frag_deathtype) \ - /**/ -entity frag_inflictor; -entity frag_attacker; -entity frag_target; -int frag_deathtype; + /** inflictor */ i(entity, MUTATOR_ARGV_0_entity) \ + /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ + /** target */ i(entity, MUTATOR_ARGV_2_entity) \ + /** deathtype */ i(float, MUTATOR_ARGV_3_float) \ + /** damage */ i(float, MUTATOR_ARGV_4_float) \ + /** damage */ o(float, MUTATOR_ARGV_4_float) \ + /**/ MUTATOR_HOOKABLE(PlayerDies, EV_PlayerDies); +/** allows overriding the frag centerprint messages */ +#define EV_FragCenterMessage(i, o) \ + /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /** deathtype */ i(float, MUTATOR_ARGV_2_float) \ + /** attacker kcount*/ i(int, MUTATOR_ARGV_3_int) \ + /** targ killcount */ i(int, MUTATOR_ARGV_4_int) \ + /**/ +MUTATOR_HOOKABLE(FragCenterMessage, EV_FragCenterMessage); + /** called when a player dies to e.g. remove stuff he was carrying */ #define EV_PlayHitsound(i, o) \ - /**/ i(entity, frag_victim) \ + /** victim */ i(entity, MUTATOR_ARGV_0_entity) \ + /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ -entity frag_victim; MUTATOR_HOOKABLE(PlayHitsound, EV_PlayHitsound); /** called when a weapon sound is about to be played, allows custom paths etc. */ #define EV_WeaponSound(i, o) \ - /**/ i(string, weapon_sound) \ - /**/ i(string, weapon_sound_output) \ - /**/ o(string, weapon_sound_output) \ + /** sound */ i(string, MUTATOR_ARGV_0_string) \ + /** output */ i(string, MUTATOR_ARGV_1_string) \ + /**/ o(string, MUTATOR_ARGV_1_string) \ /**/ -string weapon_sound; -string weapon_sound_output; MUTATOR_HOOKABLE(WeaponSound, EV_WeaponSound); /** called when an item model is about to be set, allows custom paths etc. */ #define EV_ItemModel(i, o) \ - /**/ i(string, item_model) \ - /**/ i(string, item_model_output) \ - /**/ o(string, item_model_output) \ + /** model */ i(string, MUTATOR_ARGV_0_string) \ + /** output */ i(string, MUTATOR_ARGV_1_string) \ + /**/ o(string, MUTATOR_ARGV_1_string) \ /**/ -string item_model; -string item_model_output; MUTATOR_HOOKABLE(ItemModel, EV_ItemModel); /** called when someone was fragged by "self", and is expected to change frag_score to adjust scoring for the kill */ #define EV_GiveFragsForKill(i, o) \ - /**/ i(entity, __self) \ - /** same as self */ i(entity, frag_attacker) \ - /**/ i(entity, frag_target) \ - /**/ i(float, frag_score) \ - /**/ o(float, frag_score) \ + /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /** frag score */ i(float, MUTATOR_ARGV_2_float) \ + /** */ o(float, MUTATOR_ARGV_2_float) \ /**/ -float frag_score; MUTATOR_HOOKABLE(GiveFragsForKill, EV_GiveFragsForKill); /** called when the match ends */ MUTATOR_HOOKABLE(MatchEnd, EV_NO_ARGS); -/** should adjust ret_float to contain the team count */ -#define EV_GetTeamCount(i, o) \ - /**/ i(float, ret_float) \ - /**/ o(float, ret_float) \ - /**/ i(string, ret_string) \ - /**/ o(string, ret_string) \ +/** allows adjusting allowed teams */ +#define EV_CheckAllowedTeams(i, o) \ + /** mask of teams */ i(float, MUTATOR_ARGV_0_float) \ + /**/ o(float, MUTATOR_ARGV_0_float) \ + /** team entity name */ i(string, MUTATOR_ARGV_1_string) \ + /**/ o(string, MUTATOR_ARGV_1_string) \ /**/ -float ret_float; -MUTATOR_HOOKABLE(GetTeamCount, EV_GetTeamCount); +MUTATOR_HOOKABLE(CheckAllowedTeams, EV_CheckAllowedTeams); -/** copies variables for spectating "other" to "self" */ +/** copies variables for spectating "spectatee" to "this" */ #define EV_SpectateCopy(i, o) \ - /**/ i(entity, other) \ - /**/ i(entity, __self) \ + /** spectatee */ i(entity, MUTATOR_ARGV_0_entity) \ + /** client */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(SpectateCopy, EV_SpectateCopy); /** called when formatting a chat message to replace fancy functions */ #define EV_FormatMessage(i, o) \ - /**/ i(string, format_escape) \ - /**/ i(string, format_replacement) \ - /**/ o(string, format_replacement) \ - /**/ i(string, format_message) \ - /**/ -string format_escape; -string format_replacement; -string format_message; + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** escape */ i(string, MUTATOR_ARGV_1_string) \ + /** replacement */ i(string, MUTATOR_ARGV_2_string) \ + /**/ o(string, MUTATOR_ARGV_2_string) \ + /** message */ i(string, MUTATOR_ARGV_3_string) \ + /**/ MUTATOR_HOOKABLE(FormatMessage, EV_FormatMessage); /** returns true if throwing the current weapon shall not be allowed */ #define EV_ForbidThrowCurrentWeapon(i, o) \ - /**/ i(entity, __self) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(ForbidThrowCurrentWeapon, EV_ForbidThrowCurrentWeapon); /** returns true if dropping the current weapon shall not be allowed at any time including death */ #define EV_ForbidDropCurrentWeapon(i, o) \ - /**/ i(entity, __self) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(ForbidDropCurrentWeapon, EV_ForbidDropCurrentWeapon); @@ -142,16 +151,17 @@ MUTATOR_HOOKABLE(SetDefaultAlpha, EV_NO_ARGS); /** allows changing attack rate */ #define EV_WeaponRateFactor(i, o) \ - /**/ i(float, weapon_rate) \ - /**/ o(float, weapon_rate) \ + /** weapon rate */ i(float, MUTATOR_ARGV_0_float) \ + /**/ o(float, MUTATOR_ARGV_0_float) \ + /** player */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ -float weapon_rate; MUTATOR_HOOKABLE(WeaponRateFactor, EV_WeaponRateFactor); /** allows changing weapon speed (projectiles mostly) */ #define EV_WeaponSpeedFactor(i, o) \ - /**/ i(float, ret_float) \ - /**/ o(float, ret_float) \ + /** weapon speed */ i(float, MUTATOR_ARGV_0_float) \ + /**/ o(float, MUTATOR_ARGV_0_float) \ + /** player */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(WeaponSpeedFactor, EV_WeaponSpeedFactor); @@ -160,51 +170,56 @@ MUTATOR_HOOKABLE(SetStartItems, EV_NO_ARGS); /** called every frame. customizes the waypoint for spectators */ #define EV_CustomizeWaypoint(i, o) \ - /** waypoint */ i(entity, __self) \ - /** player; other.enemy = spectator */ i(entity, other) \ + /** waypoint */ i(entity, MUTATOR_ARGV_0_entity) \ + /** player; other.enemy = spectator */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(CustomizeWaypoint, EV_CustomizeWaypoint); /** - * checks if the current item may be spawned (self.items and self.weapons may be read and written to, as well as the ammo_ fields) + * checks if the current item may be spawned (.items and .weapons may be read and written to, as well as the ammo_ fields) * return error to request removal */ #define EV_FilterItem(i, o) \ - /** the current item */ i(entity, __self) \ + /** item */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(FilterItem, EV_FilterItem); /** return error to request removal */ #define EV_TurretSpawn(i, o) \ - /** turret */ i(entity, __self) \ + /** turret */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(TurretSpawn, EV_TurretSpawn); /** return error to not attack */ #define EV_TurretFire(i, o) \ - /** turret */ i(entity, __self) \ + /** turret */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(TurretFire, EV_TurretFire); /** return error to not attack */ #define EV_Turret_CheckFire(i, o) \ - /**/ i(bool, ret_bool) \ - /**/ o(bool, ret_bool) \ + /** turret */ i(entity, MUTATOR_ARGV_0_entity) \ + /** to fire or not to fire */ o(bool, MUTATOR_ARGV_1_bool) \ /**/ -bool ret_bool; MUTATOR_HOOKABLE(Turret_CheckFire, EV_Turret_CheckFire); /** return error to prevent entity spawn, or modify the entity */ #define EV_OnEntityPreSpawn(i, o) \ - /** turret */ i(entity, __self) \ + /** entity */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(OnEntityPreSpawn, EV_OnEntityPreSpawn); /** runs in the event loop for players; is called for ALL player entities, also bots, also the dead, or spectators */ -MUTATOR_HOOKABLE(PlayerPreThink, EV_NO_ARGS); +#define EV_PlayerPreThink(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(PlayerPreThink, EV_PlayerPreThink); /** TODO change this into a general PlayerPostThink hook? */ -MUTATOR_HOOKABLE(GetPressedKeys, EV_NO_ARGS); +#define EV_GetPressedKeys(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(GetPressedKeys, EV_GetPressedKeys); /** is meant to call GetCvars_handle*(get_cvars_s, get_cvars_f, cvarfield, "cvarname") for cvars this mutator needs from the client */ #define EV_GetCvars(i, o) \ @@ -217,41 +232,43 @@ MUTATOR_HOOKABLE(GetCvars, EV_NO_ARGS); // NOTE: Can't use EV_GetCvars because o /** can edit any "just fired" projectile */ #define EV_EditProjectile(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, other) \ + /** projectile owner */ i(entity, MUTATOR_ARGV_0_entity) \ + /** projectile */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(EditProjectile, EV_EditProjectile); /** called when a monster spawns */ #define EV_MonsterSpawn(i, o) \ - /**/ i(entity, __self) \ + /** monster */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(MonsterSpawn, EV_MonsterSpawn); /** called when a monster dies */ #define EV_MonsterDies(i, o) \ - /**/ i(entity, frag_target) \ - /**/ i(entity, frag_attacker) \ + /** target */ i(entity, MUTATOR_ARGV_0_entity) \ + /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ + /** deathtype */ i(float, MUTATOR_ARGV_2_float) \ /**/ MUTATOR_HOOKABLE(MonsterDies, EV_MonsterDies); /** called when a monster dies */ #define EV_MonsterRemove(i, o) \ - /**/ i(entity, rem_mon) \ + /** monster */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ -entity rem_mon; // avoiding ovewriting self & other MUTATOR_HOOKABLE(MonsterRemove, EV_MonsterRemove); /** called when a monster wants to respawn */ #define EV_MonsterRespawn(i, o) \ - /**/ i(entity, other) \ + /** monster */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(MonsterRespawn, EV_MonsterRespawn); /** called when a monster is dropping loot */ #define EV_MonsterDropItem(i, o) \ - /**/ i(entity, other) \ - /**/ o(entity, other) \ + /* monster */ i(entity, MUTATOR_ARGV_0_entity) \ + /* item (can be removed or changed) */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ o(entity, MUTATOR_ARGV_1_entity) \ + /* attacker */ i(entity, MUTATOR_ARGV_2_entity) \ /**/ .void(entity this) monster_loot; MUTATOR_HOOKABLE(MonsterDropItem, EV_MonsterDropItem); @@ -261,47 +278,57 @@ MUTATOR_HOOKABLE(MonsterDropItem, EV_MonsterDropItem); * returning true makes the monster stop */ #define EV_MonsterMove(i, o) \ - /**/ i(entity, __self) \ - /**/ i(float, monster_speed_run) \ - /**/ o(float, monster_speed_run) \ - /**/ i(float, monster_speed_walk) \ - /**/ o(float, monster_speed_walk) \ - /**/ i(entity, monster_target) \ - /**/ -float monster_speed_run; -float monster_speed_walk; -entity monster_target; + /** monster */ i(entity, MUTATOR_ARGV_0_entity) \ + /** run speed */ i(float, MUTATOR_ARGV_1_float) \ + /**/ o(float, MUTATOR_ARGV_1_float) \ + /** walk speed */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ + /** move target */ i(entity, MUTATOR_ARGV_3_entity) \ + /**/ MUTATOR_HOOKABLE(MonsterMove, EV_MonsterMove); /** called when a monster looks for another target */ MUTATOR_HOOKABLE(MonsterFindTarget, EV_NO_ARGS); +/** + * called when validating a monster's target + */ +#define EV_MonsterValidTarget(i, o) \ + /** monster */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ +MUTATOR_HOOKABLE(MonsterValidTarget, EV_MonsterValidTarget); + /** called to change a random monster to a miniboss */ #define EV_MonsterCheckBossFlag(i, o) \ - /**/ i(entity, __self) \ + /** monster */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(MonsterCheckBossFlag, EV_MonsterCheckBossFlag); /** * called when a player tries to spawn a monster * return 1 to prevent spawning + * NOTE: requires reason if disallowed */ -MUTATOR_HOOKABLE(AllowMobSpawning, EV_NO_ARGS); + #define EV_AllowMobSpawning(i, o) \ + /** caller */ i(entity, MUTATOR_ARGV_0_entity) \ + /** reason */ o(string, MUTATOR_ARGV_1_string) \ + /**/ +MUTATOR_HOOKABLE(AllowMobSpawning, EV_AllowMobSpawning); /** called when a player gets damaged to e.g. remove stuff he was carrying. */ #define EV_PlayerDamage_SplitHealthArmor(i, o) \ - /**/ i(entity, frag_inflictor) \ - /**/ i(entity, frag_attacker) \ - /** same as self */ i(entity, frag_target) \ - /** NOTE: this force already HAS been applied */ i(vector, damage_force) \ - /**/ i(float, damage_take) \ - /**/ o(float, damage_take) \ - /**/ i(float, damage_save) \ - /**/ o(float, damage_save) \ - /**/ -vector damage_force; -float damage_take; -float damage_save; + /** inflictor */ i(entity, MUTATOR_ARGV_0_entity) \ + /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ + /** target */ i(entity, MUTATOR_ARGV_2_entity) \ + /** force (no out) */ i(vector, MUTATOR_ARGV_3_vector) \ + /** damage take */ i(float, MUTATOR_ARGV_4_float) \ + /** damage take */ o(float, MUTATOR_ARGV_4_float) \ + /** damage save */ i(float, MUTATOR_ARGV_5_float) \ + /** damage save */ o(float, MUTATOR_ARGV_5_float) \ + /** deathtype */ i(float, MUTATOR_ARGV_6_float) \ + /** damage */ i(float, MUTATOR_ARGV_7_float) \ + /**/ MUTATOR_HOOKABLE(PlayerDamage_SplitHealthArmor, EV_PlayerDamage_SplitHealthArmor); /** @@ -309,20 +336,17 @@ MUTATOR_HOOKABLE(PlayerDamage_SplitHealthArmor, EV_PlayerDamage_SplitHealthArmor * i'm not sure if I should change this around slightly (Naming of the entities, and also how they're done in g_damage). */ #define EV_PlayerDamage_Calculate(i, o) \ - /**/ i(entity, frag_inflictor) \ - /**/ i(entity, frag_attacker) \ - /**/ i(entity, frag_target) \ - /**/ i(float, frag_deathtype) \ - /**/ i(float, frag_damage) \ - /**/ o(float, frag_damage) \ - /**/ i(float, frag_mirrordamage) \ - /**/ o(float, frag_mirrordamage) \ - /**/ i(vector, frag_force) \ - /**/ o(vector, frag_force) \ - /**/ -float frag_damage; -float frag_mirrordamage; -vector frag_force; + /** inflictor */ i(entity, MUTATOR_ARGV_0_entity) \ + /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ + /** target */ i(entity, MUTATOR_ARGV_2_entity) \ + /** deathtype */ i(float, MUTATOR_ARGV_3_float) \ + /** damage */ i(float, MUTATOR_ARGV_4_float) \ + /** damage */ o(float, MUTATOR_ARGV_4_float) \ + /** mirrordamage */ i(float, MUTATOR_ARGV_5_float) \ + /** mirrordamage */ o(float, MUTATOR_ARGV_5_float) \ + /** force */ i(vector, MUTATOR_ARGV_6_vector) \ + /** force */ o(vector, MUTATOR_ARGV_6_vector) \ + /**/ MUTATOR_HOOKABLE(PlayerDamage_Calculate, EV_PlayerDamage_Calculate); /** @@ -331,10 +355,11 @@ MUTATOR_HOOKABLE(PlayerDamage_Calculate, EV_PlayerDamage_Calculate); #define EV_PlayerDamaged(i, o) \ /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \ /** target */ i(entity, MUTATOR_ARGV_1_entity) \ - /** health */ i(int, MUTATOR_ARGV_0_int) \ - /** armor */ i(int, MUTATOR_ARGV_1_int) \ - /** location */ i(vector, MUTATOR_ARGV_0_vector) \ - /** deathtype */ i(int, MUTATOR_ARGV_2_int) \ + /** health */ i(float, MUTATOR_ARGV_2_float) \ + /** armor */ i(float, MUTATOR_ARGV_3_float) \ + /** location */ i(vector, MUTATOR_ARGV_4_vector) \ + /** deathtype */ i(int, MUTATOR_ARGV_5_int) \ + /** potential_damage */ i(float, MUTATOR_ARGV_6_float) \ /**/ MUTATOR_HOOKABLE(PlayerDamaged, EV_PlayerDamaged); @@ -354,36 +379,51 @@ MUTATOR_HOOKABLE(W_DecreaseAmmo, EV_W_DecreaseAmmo); /**/ MUTATOR_HOOKABLE(W_Reload, EV_W_Reload); -/** called at the end of player_powerups() in cl_client.qc, used for manipulating the values which are set by powerup items. */ +/** called at the end of player_powerups() in client.qc, used for manipulating the values which are set by powerup items. */ #define EV_PlayerPowerups(i, o) \ - /**/ i(entity, __self) \ - /**/ i(int, olditems) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** old items */ i(int, MUTATOR_ARGV_1_int) \ /**/ -int olditems; MUTATOR_HOOKABLE(PlayerPowerups, EV_PlayerPowerups); /** * called every player think frame * return 1 to disable regen */ -float regen_mod_max; -float regen_mod_regen; -float regen_mod_rot; -float regen_mod_limit; -float regen_health; -float regen_health_linear; -float regen_health_rot; -float regen_health_rotlinear; -float regen_health_stable; -float regen_health_rotstable; -MUTATOR_HOOKABLE(PlayerRegen, EV_NO_ARGS); + #define EV_PlayerRegen(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** max_mod */ i(float, MUTATOR_ARGV_1_float) \ + /**/ o(float, MUTATOR_ARGV_1_float) \ + /** regen_mod */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ + /** rot_mod */ i(float, MUTATOR_ARGV_3_float) \ + /**/ o(float, MUTATOR_ARGV_3_float) \ + /** limit_mod */ i(float, MUTATOR_ARGV_4_float) \ + /**/ o(float, MUTATOR_ARGV_4_float) \ + /** health_regen */ i(float, MUTATOR_ARGV_5_float) \ + /**/ o(float, MUTATOR_ARGV_5_float) \ + /** health_regenlinear */ i(float, MUTATOR_ARGV_6_float) \ + /**/ o(float, MUTATOR_ARGV_6_float) \ + /** health_rot */ i(float, MUTATOR_ARGV_7_float) \ + /**/ o(float, MUTATOR_ARGV_7_float) \ + /** health_rotlinear */ i(float, MUTATOR_ARGV_8_float) \ + /**/ o(float, MUTATOR_ARGV_8_float) \ + /** health_stable */ i(float, MUTATOR_ARGV_9_float) \ + /**/ o(float, MUTATOR_ARGV_9_float) \ + /** health_rotstable */ i(float, MUTATOR_ARGV_10_float) \ + /**/ o(float, MUTATOR_ARGV_10_float) \ + /**/ +MUTATOR_HOOKABLE(PlayerRegen, EV_PlayerRegen); /** * called when the use key is pressed * if MUTATOR_RETURNVALUE is 1, don't do anything * return 1 if the use key actually did something */ -MUTATOR_HOOKABLE(PlayerUseKey, EV_NO_ARGS); + #define EV_PlayerUseKey(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(PlayerUseKey, EV_PlayerUseKey); /** * called when a client command is parsed @@ -409,24 +449,19 @@ MUTATOR_HOOKABLE(PlayerUseKey, EV_NO_ARGS); * } */ #define EV_SV_ParseClientCommand(i, o) \ - /** command name */ i(string, cmd_name) \ - /** also, argv() can be used */ i(int, cmd_argc) \ - /** whole command, use only if you really have to */ i(string, cmd_string) \ + /** client sending the command */ i(entity, MUTATOR_ARGV_0_entity) \ + /** command name */ i(string, MUTATOR_ARGV_1_string) \ + /** argc (also, argv() can be used) */ i(int, MUTATOR_ARGV_2_int) \ + /** whole command, use only if you really have to */ i(string, MUTATOR_ARGV_3_string) \ /**/ -string cmd_name; -int cmd_argc; -string cmd_string; MUTATOR_HOOKABLE(SV_ParseClientCommand, EV_SV_ParseClientCommand); /** please read EV_SV_ParseClientCommand description before using */ #define EV_SV_ParseServerCommand(i, o) \ - /** command name */ i(string, cmd_name) \ - /** also, argv() can be used */ i(int, cmd_argc) \ - /** whole command, use only if you really have to */ i(string, cmd_string) \ + /** command name */ i(string, MUTATOR_ARGV_0_string) \ + /** argc (also, argv() can be used) */ i(int, MUTATOR_ARGV_1_int) \ + /** whole command, use only if you really have to */ i(string, MUTATOR_ARGV_2_string) \ /**/ -//string cmd_name; -//int cmd_argc; -//string cmd_string; MUTATOR_HOOKABLE(SV_ParseServerCommand, EV_SV_ParseServerCommand); /** @@ -434,12 +469,11 @@ MUTATOR_HOOKABLE(SV_ParseServerCommand, EV_SV_ParseServerCommand); * return 1 to make the spawnpoint unusable */ #define EV_Spawn_Score(i, o) \ - /** player wanting to spawn */ i(entity, __self) \ - /** spot to be evaluated */ i(entity, spawn_spot) \ - /** _x is priority, _y is "distance" */ i(vector, spawn_score) \ - /**/ o(vector, spawn_score) \ + /** player wanting to spawn */ i(entity, MUTATOR_ARGV_0_entity) \ + /** spot to be evaluated */ i(entity, MUTATOR_ARGV_1_entity) \ + /** spot score, _x is priority, _y is "distance" */ i(vector, MUTATOR_ARGV_2_vector) \ + /**/ o(vector, MUTATOR_ARGV_2_vector) \ /**/ -vector spawn_score; MUTATOR_HOOKABLE(Spawn_Score, EV_Spawn_Score); /** runs globally each server frame */ @@ -447,7 +481,8 @@ MUTATOR_HOOKABLE(SV_StartFrame, EV_NO_ARGS); #define EV_SetModname(i, o) \ /** name of the mutator/mod if it warrants showing as such in the server browser */ \ - o(string, modname) \ + /**/ i(string, MUTATOR_ARGV_0_string) \ + /**/ o(string, MUTATOR_ARGV_0_string) \ /**/ MUTATOR_HOOKABLE(SetModname, EV_SetModname); @@ -456,35 +491,32 @@ MUTATOR_HOOKABLE(SetModname, EV_SetModname); * return 1 to remove an item */ #define EV_Item_Spawn(i, o) \ - /** the item */ i(entity, __self) \ + /** item */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(Item_Spawn, EV_Item_Spawn); #define EV_SetWeaponreplace(i, o) \ - /** map entity */ i(entity, __self) \ - /** weapon info */ i(entity, other) \ - /**/ i(string, ret_string) \ - /**/ o(string, ret_string) \ + /** map entity */ i(entity, MUTATOR_ARGV_0_entity) \ + /** weapon info */ i(entity, MUTATOR_ARGV_1_entity) \ + /** replacement */ i(string, MUTATOR_ARGV_2_string) \ + /**/ o(string, MUTATOR_ARGV_2_string) \ /**/ MUTATOR_HOOKABLE(SetWeaponreplace, EV_SetWeaponreplace); /** called when an item is about to respawn */ #define EV_Item_RespawnCountdown(i, o) \ - /**/ i(string, item_name) \ - /**/ o(string, item_name) \ - /**/ i(vector, item_color) \ - /**/ o(vector, item_color) \ + /** item name */ i(string, MUTATOR_ARGV_0_string) \ + /**/ o(string, MUTATOR_ARGV_0_string) \ + /** item colour */ i(vector, MUTATOR_ARGV_1_vector) \ + /**/ o(vector, MUTATOR_ARGV_1_vector) \ /**/ -string item_name; -vector item_color; MUTATOR_HOOKABLE(Item_RespawnCountdown, EV_Item_RespawnCountdown); /** called when a bot checks a target to attack */ #define EV_BotShouldAttack(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, checkentity) \ + /** bot */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ -entity checkentity; MUTATOR_HOOKABLE(BotShouldAttack, EV_BotShouldAttack); /** @@ -492,18 +524,18 @@ MUTATOR_HOOKABLE(BotShouldAttack, EV_BotShouldAttack); * allows you to strip a player of an item if they go through the teleporter to help prevent cheating */ #define EV_PortalTeleport(i, o) \ - /**/ i(entity, __self) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(PortalTeleport, EV_PortalTeleport); /** - * called whenever a player uses impulse 33 (help me) in cl_impulse.qc - * normally help me ping uses self.waypointsprite_attachedforcarrier, + * called whenever a player uses impulse 33 (help me) in impulse.qc + * normally help me ping uses .waypointsprite_attachedforcarrier, * but if your mutator uses something different then you can handle it * in a special manner using this hook */ #define EV_HelpMePing(i, o) \ - /** the player who pressed impulse 33 */ i(entity, __self) \ + /** the player who pressed impulse 33 */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(HelpMePing, EV_HelpMePing); @@ -511,21 +543,19 @@ MUTATOR_HOOKABLE(HelpMePing, EV_HelpMePing); * called when a vehicle initializes * return true to remove the vehicle */ -#define EV_VehicleSpawn(i, o) \ - /**/ i(entity, __self) \ +#define EV_VehicleInit(i, o) \ + /** vehicle */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ -MUTATOR_HOOKABLE(VehicleSpawn, EV_VehicleSpawn); +MUTATOR_HOOKABLE(VehicleInit, EV_VehicleInit); /** * called when a player enters a vehicle * allows mutators to set special settings in this event */ #define EV_VehicleEnter(i, o) \ - /** player */ i(entity, vh_player) \ - /** vehicle */ i(entity, vh_vehicle) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** vehicle */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ -entity vh_player; -entity vh_vehicle; MUTATOR_HOOKABLE(VehicleEnter, EV_VehicleEnter); /** @@ -533,8 +563,8 @@ MUTATOR_HOOKABLE(VehicleEnter, EV_VehicleEnter); * return true to stop player from entering the vehicle */ #define EV_VehicleTouch(i, o) \ - /** vehicle */ i(entity, __self) \ - /** player */ i(entity, other) \ + /** vehicle */ i(entity, MUTATOR_ARGV_0_entity) \ + /** player */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(VehicleTouch, EV_VehicleTouch); @@ -543,21 +573,22 @@ MUTATOR_HOOKABLE(VehicleTouch, EV_VehicleTouch); * allows mutators to set special settings in this event */ #define EV_VehicleExit(i, o) \ - /** player */ i(entity, vh_player) \ - /** vehicle */ i(entity, vh_vehicle) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** vehicle */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(VehicleExit, EV_VehicleExit); /** called when a speedrun is aborted and the player is teleported back to start position */ #define EV_AbortSpeedrun(i, o) \ - /** player */ i(entity, __self) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(AbortSpeedrun, EV_AbortSpeedrun); /** called at when a item is touched. Called early, can edit item properties. */ #define EV_ItemTouch(i, o) \ - /** item */ i(entity, __self) \ - /** player */ i(entity, other) \ + /** item */ i(entity, MUTATOR_ARGV_0_entity) \ + /** toucher */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ o(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(ItemTouch, EV_ItemTouch); @@ -569,19 +600,19 @@ enum { /** called at when a player connect */ #define EV_ClientConnect(i, o) \ - /** player */ i(entity, __self) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(ClientConnect, EV_ClientConnect); #define EV_HavocBot_ChooseRole(i, o) \ - /**/ i(entity, __self) \ + /** bot */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(HavocBot_ChooseRole, EV_HavocBot_ChooseRole); /** called when a target is checked for accuracy */ #define EV_AccuracyTargetValid(i, o) \ - /** attacker */ i(entity, frag_attacker) \ - /** target */ i(entity, frag_target) \ + /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(AccuracyTargetValid, EV_AccuracyTargetValid); enum { @@ -595,65 +626,56 @@ MUTATOR_HOOKABLE(ClearModelParams, EV_NO_ARGS); /** Called when getting the global parameters for a model */ #define EV_GetModelParams(i, o) \ - /** entity id */ i(string, checkmodel_input) \ - /** entity id */ i(string, checkmodel_command) \ + /** input */ i(string, MUTATOR_ARGV_0_string) \ + /** command */ i(string, MUTATOR_ARGV_1_string) \ /**/ -string checkmodel_input, checkmodel_command; MUTATOR_HOOKABLE(GetModelParams, EV_GetModelParams); /** called when a bullet has hit a target */ #define EV_FireBullet_Hit(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, bullet_hit) \ - /**/ i(vector, bullet_startpos) \ - /**/ i(vector, bullet_endpos) \ - /**/ i(float, frag_damage) \ - /**/ o(float, frag_damage) \ - /**/ -entity bullet_hit; -//vector bullet_hitloc; // the end pos matches the hit location, apparently -vector bullet_startpos; -vector bullet_endpos; -//float frag_damage; + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** targ */ i(entity, MUTATOR_ARGV_1_entity) \ + /** start pos */ i(vector, MUTATOR_ARGV_2_vector) \ + /** end pos */ i(vector, MUTATOR_ARGV_3_vector) \ + /** damage */ i(float, MUTATOR_ARGV_4_float) \ + /**/ o(float, MUTATOR_ARGV_4_float) \ + /**/ MUTATOR_HOOKABLE(FireBullet_Hit, EV_FireBullet_Hit); #define EV_FixPlayermodel(i, o) \ - /**/ i(string, ret_string) \ - /**/ o(string, ret_string) \ - /**/ i(int, ret_int) \ - /**/ o(int, ret_int) \ + /** model */ i(string, MUTATOR_ARGV_0_string) \ + /**/ o(string, MUTATOR_ARGV_0_string) \ + /** skin */ i(int, MUTATOR_ARGV_1_int) \ + /**/ o(int, MUTATOR_ARGV_1_int) \ + /** player */ i(entity, MUTATOR_ARGV_2_entity) \ /**/ -int ret_int; MUTATOR_HOOKABLE(FixPlayermodel, EV_FixPlayermodel); /** Return error to play frag remaining announcements */ MUTATOR_HOOKABLE(Scores_CountFragsRemaining, EV_NO_ARGS); #define EV_GrappleHookThink(i, o) \ - /**/ i(entity, __self) \ - /**/ i(int, hook_tarzan) \ - /**/ o(int, hook_tarzan) \ - /**/ i(entity, hook_pullentity) \ - /**/ o(entity, hook_pullentity) \ - /**/ i(float, hook_velmultiplier) \ - /**/ o(float, hook_velmultiplier) \ - /**/ -int hook_tarzan; -entity hook_pullentity; -float hook_velmultiplier; + /** hook */ i(entity, MUTATOR_ARGV_0_entity) \ + /** tarzan */ i(int, MUTATOR_ARGV_1_int) \ + /**/ o(int, MUTATOR_ARGV_1_int) \ + /** pulling entity */ i(entity, MUTATOR_ARGV_2_entity) \ + /**/ o(entity, MUTATOR_ARGV_2_entity) \ + /** velocity multiplier */ i(float, MUTATOR_ARGV_3_float) \ + /**/ o(float, MUTATOR_ARGV_3_float) \ + /**/ MUTATOR_HOOKABLE(GrappleHookThink, EV_GrappleHookThink); #define EV_BuffModel_Customize(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, buff_player) \ + /** buff */ i(entity, MUTATOR_ARGV_0_entity) \ + /** player */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ -entity buff_player; MUTATOR_HOOKABLE(BuffModel_Customize, EV_BuffModel_Customize); /** called at when a buff is touched. Called early, can edit buff properties. */ #define EV_BuffTouch(i, o) \ - /** item */ i(entity, __self) \ - /** player */ i(entity, other) \ + /** buff */ i(entity, MUTATOR_ARGV_0_entity) \ + /** player */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ o(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(BuffTouch, EV_BuffTouch); @@ -664,55 +686,50 @@ MUTATOR_HOOKABLE(SetChangeParms, EV_NO_ARGS); MUTATOR_HOOKABLE(DecodeLevelParms, EV_NO_ARGS); #define EV_GetRecords(i, o) \ - /**/ i(int, record_page) \ - /**/ i(string, ret_string) \ - /**/ o(string, ret_string) \ + /** page */ i(int, MUTATOR_ARGV_0_int) \ + /** record list */ i(string, MUTATOR_ARGV_1_string) \ + /**/ o(string, MUTATOR_ARGV_1_string) \ /**/ -int record_page; MUTATOR_HOOKABLE(GetRecords, EV_GetRecords); #define EV_Race_FinalCheckpoint(i, o) \ - /**/ i(entity, race_player) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ -entity race_player; MUTATOR_HOOKABLE(Race_FinalCheckpoint, EV_Race_FinalCheckpoint); /** called when player triggered kill (or is changing teams), return error to not do anything */ #define EV_ClientKill(i, o) \ - /** player */ i(entity, __self) \ - /* kill delay */ i(float, ret_float) \ - /* kill delay */ o(float, ret_float) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** kill delay */ i(float, MUTATOR_ARGV_1_float) \ + /**/ o(float, MUTATOR_ARGV_1_float) \ /**/ MUTATOR_HOOKABLE(ClientKill, EV_ClientKill); #define EV_FixClientCvars(i, o) \ - /**/ i(entity, fix_client) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ -entity fix_client; MUTATOR_HOOKABLE(FixClientCvars, EV_FixClientCvars); #define EV_SpectateSet(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, spec_player) \ - /**/ o(entity, spec_player) \ + /** client */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ o(entity, MUTATOR_ARGV_1_entity) \ /**/ -entity spec_player; MUTATOR_HOOKABLE(SpectateSet, EV_SpectateSet); #define EV_SpectateNext(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, spec_player) \ - /**/ o(entity, spec_player) \ + /** client */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ o(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(SpectateNext, EV_SpectateNext); #define EV_SpectatePrev(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, spec_player) \ - /**/ o(entity, spec_player) \ - /**/ i(entity, spec_first) \ + /** client */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ o(entity, MUTATOR_ARGV_1_entity) \ + /** first */ i(entity, MUTATOR_ARGV_2_entity) \ /**/ -entity spec_first; MUTATOR_HOOKABLE(SpectatePrev, EV_SpectatePrev); enum { @@ -723,17 +740,15 @@ enum { /** called when player triggered kill (or is changing teams), return error to not do anything */ #define EV_Bot_FixCount(i, o) \ - /**/ i(int, bot_activerealplayers) \ - /**/ o(int, bot_activerealplayers) \ - /**/ i(int, bot_realplayers) \ - /**/ o(int, bot_realplayers) \ + /** active real players */ i(int, MUTATOR_ARGV_0_int) \ + /**/ o(int, MUTATOR_ARGV_0_int) \ + /** real players */ i(int, MUTATOR_ARGV_1_int) \ + /**/ o(int, MUTATOR_ARGV_1_int) \ /**/ -int bot_activerealplayers; -int bot_realplayers; MUTATOR_HOOKABLE(Bot_FixCount, EV_Bot_FixCount); #define EV_ClientCommand_Spectate(i, o) \ - /**/ i(entity, __self) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(ClientCommand_Spectate, EV_ClientCommand_Spectate); @@ -744,53 +759,45 @@ enum { }; #define EV_CheckRules_World(i, o) \ - /* status */ i(float, ret_float) \ - /* status */ o(float, ret_float) \ - /* time limit */ i(float, checkrules_timelimit) \ - /* frag limit */ i(int, checkrules_fraglimit) \ + /** status */ i(float, MUTATOR_ARGV_0_float) \ + /**/ o(float, MUTATOR_ARGV_0_float) \ + /* time limit */ i(float, MUTATOR_ARGV_1_float) \ + /* frag limit */ i(float, MUTATOR_ARGV_2_float) \ /**/ -float checkrules_timelimit; -int checkrules_fraglimit; MUTATOR_HOOKABLE(CheckRules_World, EV_CheckRules_World); #define EV_WantWeapon(i, o) \ - /**/ i(entity, want_weaponinfo) \ - /**/ i(float, ret_float) \ - /**/ o(float, ret_float) \ - /**/ i(bool, want_allguns) \ - /**/ o(bool, want_allguns) \ - /**/ i(bool, want_mutatorblocked) \ - /**/ o(bool, want_mutatorblocked) \ - /**/ -entity want_weaponinfo; -bool want_allguns; -bool want_mutatorblocked; + /** weapon info entity */ i(entity, MUTATOR_ARGV_0_entity) \ + /** do want? */ i(float, MUTATOR_ARGV_1_float) \ + /**/ o(float, MUTATOR_ARGV_1_float) \ + /** want all guns */ i(bool, MUTATOR_ARGV_2_bool) \ + /**/ o(bool, MUTATOR_ARGV_2_bool) \ + /** want mutator blocked */ i(bool, MUTATOR_ARGV_3_bool) \ + /**/ o(bool, MUTATOR_ARGV_3_bool) \ + /**/ MUTATOR_HOOKABLE(WantWeapon, EV_WantWeapon); #define EV_AddPlayerScore(i, o) \ - /**/ i(int, score_field) \ - /**/ i(float, ret_float) \ - /**/ o(float, ret_float) \ + /** score field */ i(PlayerScoreField, MUTATOR_ARGV_0_entity) \ + /** score */ i(float, MUTATOR_ARGV_1_float) \ + /**/ o(float, MUTATOR_ARGV_1_float) \ + /** player */ i(entity, MUTATOR_ARGV_2_entity) \ /**/ -int score_field; MUTATOR_HOOKABLE(AddPlayerScore, EV_AddPlayerScore); #define EV_GetPlayerStatus(i, o) \ - /**/ i(entity, set_player) \ - /**/ i(string, ret_string) \ - /**/ o(string, ret_string) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ -entity set_player; MUTATOR_HOOKABLE(GetPlayerStatus, EV_GetPlayerStatus); #define EV_SetWeaponArena(i, o) \ - /**/ i(string, ret_string) \ - /**/ o(string, ret_string) \ + /** arena */ i(string, MUTATOR_ARGV_0_string) \ + /**/ o(string, MUTATOR_ARGV_0_string) \ /**/ MUTATOR_HOOKABLE(SetWeaponArena, EV_SetWeaponArena); #define EV_DropSpecialItems(i, o) \ - /**/ i(entity, frag_target) \ + /** target */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(DropSpecialItems, EV_DropSpecialItems); @@ -798,35 +805,33 @@ MUTATOR_HOOKABLE(DropSpecialItems, EV_DropSpecialItems); * called when an admin tries to kill all monsters * return 1 to prevent spawning */ -MUTATOR_HOOKABLE(AllowMobButcher, EV_NO_ARGS); +#define EV_AllowMobButcher(i, o) \ + /** reason */ o(string, MUTATOR_ARGV_0_string) \ + /**/ +MUTATOR_HOOKABLE(AllowMobButcher, EV_AllowMobButcher); MUTATOR_HOOKABLE(ReadLevelCvars, EV_NO_ARGS); #define EV_SendWaypoint(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, wp_sendto) \ - /**/ i(int, wp_sendflags) \ - /**/ o(int, wp_sendflags) \ - /**/ i(int, wp_flag) \ - /**/ o(int, wp_flag) \ - /**/ -entity wp_sendto; -int wp_sendflags; -int wp_flag; + /** waypoint */ i(entity, MUTATOR_ARGV_0_entity) \ + /** to */ i(entity, MUTATOR_ARGV_1_entity) \ + /** send flags */ i(int, MUTATOR_ARGV_2_int) \ + /**/ o(int, MUTATOR_ARGV_2_int) \ + /** wp flag */ i(int, MUTATOR_ARGV_3_int) \ + /**/ o(int, MUTATOR_ARGV_3_int) \ + /**/ MUTATOR_HOOKABLE(SendWaypoint, EV_SendWaypoint); #define EV_TurretValidateTarget(i, o) \ - /**/ i(entity, turret_this) \ - /**/ i(entity, turret_target) \ - /**/ i(int, turret_vflags) \ + /** turret */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /** validate flags */ i(int, MUTATOR_ARGV_2_int) \ + /** target score */ o(float, MUTATOR_ARGV_3_float) \ /**/ -entity turret_this; -entity turret_target; -int turret_vflags; MUTATOR_HOOKABLE(TurretValidateTarget, EV_TurretValidateTarget); #define EV_TurretThink(i, o) \ - /**/ i(entity, __self) \ + /** turret */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(TurretThink, EV_TurretThink); @@ -834,38 +839,47 @@ MUTATOR_HOOKABLE(Ent_Init, EV_NO_ARGS); /** */ #define EV_PrepareExplosionByDamage(i, o) \ - /**/ i(entity, __self) \ - /**/ i(entity, frag_attacker) \ + /** projectile */ i(entity, MUTATOR_ARGV_0_entity) \ + /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(PrepareExplosionByDamage, EV_PrepareExplosionByDamage); /** called when a monster model is about to be set, allows custom paths etc. */ #define EV_MonsterModel(i, o) \ - /**/ i(string, monster_model) \ - /**/ i(string, monster_model_output) \ - /**/ o(string, monster_model_output) \ + /** model */ i(string, MUTATOR_ARGV_0_string) \ + /** output */ i(string, MUTATOR_ARGV_1_string) \ + /**/ o(string, MUTATOR_ARGV_1_string) \ /**/ -string monster_model; -string monster_model_output; MUTATOR_HOOKABLE(MonsterModel, EV_MonsterModel); /**/ #define EV_Player_ChangeTeam(i, o) \ - /**/ i(entity, __self) \ - /**/ i(float, pct_curteam) \ - /**/ i(float, pct_newteam) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** current team */ i(float, MUTATOR_ARGV_1_float) \ + /** new team */ i(float, MUTATOR_ARGV_2_float) \ /**/ -float pct_curteam; -float pct_newteam; MUTATOR_HOOKABLE(Player_ChangeTeam, EV_Player_ChangeTeam); /**/ #define EV_URI_GetCallback(i, o) \ - /**/ i(float, uricb_id) \ - /**/ i(float, uricb_status) \ - /**/ i(string, uricb_data) \ + /** id */ i(float, MUTATOR_ARGV_0_float) \ + /** status */ i(float, MUTATOR_ARGV_1_float) \ + /** data */ i(string, MUTATOR_ARGV_2_string) \ /**/ -float uricb_id; -float uricb_status; -string uricb_data; MUTATOR_HOOKABLE(URI_GetCallback, EV_URI_GetCallback); + +/** + * return true to prevent weapon use for a player + */ + #define EV_ForbidWeaponUse(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(ForbidWeaponUse, EV_ForbidWeaponUse); + +/** called when creating a clone of the player (usually for corpses that stay after the player has re-spawned) */ +#define EV_CopyBody(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** newly created clone */ i(entity, MUTATOR_ARGV_1_entity) \ + /** keepvelocity? */ i(bool, MUTATOR_ARGV_2_bool) \ + /**/ +MUTATOR_HOOKABLE(CopyBody, EV_CopyBody);