X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fevents.qh;h=83d39f8bb51100bae80a53746fdad9753d8a6d95;hp=b66b394afb7eef48f003dce1f80b1379ce78e70c;hb=5134c592b8e912ce0f05ff8f8a2f3c258f8924d6;hpb=a62687f222272d216e7fb6fa16748f8750643c92 diff --git a/qcsrc/server/mutators/events.qh b/qcsrc/server/mutators/events.qh index b66b394afb..83d39f8bb5 100644 --- a/qcsrc/server/mutators/events.qh +++ b/qcsrc/server/mutators/events.qh @@ -19,7 +19,7 @@ MUTATOR_HOOKABLE(PutClientInServer, EV_PutClientInServer); /** 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) \ /** player spawning */ i(entity, MUTATOR_ARGV_0_entity) \ - /** spot that was used, or world */ i(entity, MUTATOR_ARGV_1_entity) \ + /** spot that was used, or NULL */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(PlayerSpawn, EV_PlayerSpawn); @@ -58,6 +58,7 @@ MUTATOR_HOOKABLE(PlayerDies, EV_PlayerDies); /** called when a player dies to e.g. remove stuff he was carrying */ #define EV_PlayHitsound(i, o) \ /** victim */ i(entity, MUTATOR_ARGV_0_entity) \ + /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(PlayHitsound, EV_PlayHitsound); @@ -98,7 +99,7 @@ MUTATOR_HOOKABLE(MatchEnd, EV_NO_ARGS); /**/ MUTATOR_HOOKABLE(GetTeamCount, EV_GetTeamCount); -/** copies variables for spectating "other" to "self" */ +/** copies variables for spectating "spectatee" to "this" */ #define EV_SpectateCopy(i, o) \ /** spectatee */ i(entity, MUTATOR_ARGV_0_entity) \ /** client */ i(entity, MUTATOR_ARGV_1_entity) \ @@ -123,7 +124,7 @@ 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) \ - /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(ForbidDropCurrentWeapon, EV_ForbidDropCurrentWeapon); @@ -157,7 +158,7 @@ MUTATOR_HOOKABLE(SetStartItems, EV_NO_ARGS); 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) \ @@ -191,10 +192,16 @@ MUTATOR_HOOKABLE(Turret_CheckFire, EV_Turret_CheckFire); 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) \ @@ -265,6 +272,15 @@ 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) \ /** monster */ i(entity, MUTATOR_ARGV_0_entity) \ @@ -274,8 +290,13 @@ 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) \ @@ -350,24 +371,40 @@ 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 @@ -415,8 +452,8 @@ MUTATOR_HOOKABLE(SV_ParseServerCommand, EV_SV_ParseServerCommand); #define EV_Spawn_Score(i, o) \ /** 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_0_vector) \ - /**/ o(vector, MUTATOR_ARGV_0_vector) \ + /** spot score, _x is priority, _y is "distance" */ i(vector, MUTATOR_ARGV_2_vector) \ + /**/ o(vector, MUTATOR_ARGV_2_vector) \ /**/ MUTATOR_HOOKABLE(Spawn_Score, EV_Spawn_Score); @@ -425,7 +462,7 @@ 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) \ + /**/ o(string, MUTATOR_ARGV_0_string) \ /**/ MUTATOR_HOOKABLE(SetModname, EV_SetModname); @@ -434,36 +471,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) \ /**/ -//string ret_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); /** @@ -471,18 +504,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, + * 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); @@ -491,7 +524,7 @@ MUTATOR_HOOKABLE(HelpMePing, EV_HelpMePing); * return true to remove the vehicle */ #define EV_VehicleSpawn(i, o) \ - /**/ i(entity, __self) \ + /** vehicle */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(VehicleSpawn, EV_VehicleSpawn); @@ -500,11 +533,9 @@ MUTATOR_HOOKABLE(VehicleSpawn, EV_VehicleSpawn); * 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); /** @@ -512,8 +543,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); @@ -522,21 +553,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); @@ -548,12 +580,12 @@ 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); @@ -574,65 +606,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); @@ -643,17 +666,15 @@ 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 */ @@ -670,27 +691,25 @@ MUTATOR_HOOKABLE(ClientKill, EV_ClientKill); 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 { @@ -701,17 +720,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); @@ -741,7 +758,7 @@ MUTATOR_HOOKABLE(CheckRules_World, EV_CheckRules_World); MUTATOR_HOOKABLE(WantWeapon, EV_WantWeapon); #define EV_AddPlayerScore(i, o) \ - /** score field */ i(int, MUTATOR_ARGV_0_int) \ + /** 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) \ @@ -749,16 +766,13 @@ MUTATOR_HOOKABLE(WantWeapon, EV_WantWeapon); 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); @@ -771,21 +785,21 @@ 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) \ @@ -797,7 +811,7 @@ MUTATOR_HOOKABLE(SendWaypoint, EV_SendWaypoint); 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); @@ -806,37 +820,46 @@ MUTATOR_HOOKABLE(Ent_Init, EV_NO_ARGS); /** */ #define EV_PrepareExplosionByDamage(i, o) \ /** projectile */ i(entity, MUTATOR_ARGV_0_entity) \ - /** attacker */ i(entity, MUTATOR_ARGV_1_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 a player spawns as player, after shared setup, before his weapon is chosen (so items may be changed in here) */ +#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);