]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/events.qh
Purge self from the damage/death mutator hooks
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / events.qh
index 9cd9045d538a8bd3cde4bda33bb471b47fe8952c..eaef39ae80e8383cd48063a84ce47bfd50e88e61 100644 (file)
@@ -1,7 +1,6 @@
-#ifndef SERVER_MUTATORS_EVENTS_H
-#define SERVER_MUTATORS_EVENTS_H
+#pragma once
 
-#include "../../common/mutators/base.qh"
+#include <common/mutators/base.qh>
 
 // register all possible hooks here
 
@@ -12,15 +11,15 @@ 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);
 
 /** 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 world */ i(entity, MUTATOR_ARGV_1_entity) \
     /**/
-entity spawn_spot;
 MUTATOR_HOOKABLE(PlayerSpawn, EV_PlayerSpawn);
 
 /** called in reset_map */
@@ -45,15 +44,13 @@ 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);
 
 /** called when a player dies to e.g. remove stuff he was carrying */
@@ -73,16 +70,6 @@ string weapon_sound;
 string weapon_sound_output;
 MUTATOR_HOOKABLE(WeaponSound, EV_WeaponSound);
 
-/** called when a weapon model is about to be set, allows custom paths etc. */
-#define EV_WeaponModel(i, o) \
-    /**/ i(string, weapon_model) \
-    /**/ i(string, weapon_model_output) \
-    /**/ o(string, weapon_model_output) \
-    /**/
-string weapon_model;
-string weapon_model_output;
-MUTATOR_HOOKABLE(WeaponModel, EV_WeaponModel);
-
 /** called when an item model is about to be set, allows custom paths etc. */
 #define EV_ItemModel(i, o) \
     /**/ i(string, item_model) \
@@ -93,26 +80,13 @@ string item_model;
 string item_model_output;
 MUTATOR_HOOKABLE(ItemModel, EV_ItemModel);
 
-/** called when a player presses the jump key */
-#define EV_PlayerJump(i, o) \
-    /**/ i(float, player_multijump) \
-    /**/ i(float, player_jumpheight) \
-    /**/ o(float, player_multijump) \
-    /**/ o(float, player_jumpheight) \
-    /**/
-float player_multijump;
-float player_jumpheight;
-MUTATOR_HOOKABLE(PlayerJump, EV_PlayerJump);
-
 /** 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 */
@@ -137,6 +111,7 @@ MUTATOR_HOOKABLE(SpectateCopy, EV_SpectateCopy);
 
 /** called when formatting a chat message to replace fancy functions */
 #define EV_FormatMessage(i, o) \
+    /**/ i(entity, __self) \
     /**/ i(string, format_escape) \
     /**/ i(string, format_replacement) \
     /**/ o(string, format_replacement) \
@@ -148,10 +123,19 @@ string format_message;
 MUTATOR_HOOKABLE(FormatMessage, EV_FormatMessage);
 
 /** returns true if throwing the current weapon shall not be allowed */
-MUTATOR_HOOKABLE(ForbidThrowCurrentWeapon, EV_NO_ARGS);
+#define EV_ForbidThrowCurrentWeapon(i, o) \
+    /**/ i(entity, __self) \
+    /**/
+MUTATOR_HOOKABLE(ForbidThrowCurrentWeapon, EV_ForbidThrowCurrentWeapon);
 
 /** returns true if dropping the current weapon shall not be allowed at any time including death */
-MUTATOR_HOOKABLE(ForbidDropCurrentWeapon, EV_NO_ARGS);
+#define EV_ForbidDropCurrentWeapon(i, o) \
+    /**/ i(entity, __self) \
+    /**/
+MUTATOR_HOOKABLE(ForbidDropCurrentWeapon, EV_ForbidDropCurrentWeapon);
+
+/**  */
+MUTATOR_HOOKABLE(SetDefaultAlpha, EV_NO_ARGS);
 
 /** allows changing attack rate */
 #define EV_WeaponRateFactor(i, o) \
@@ -208,7 +192,10 @@ bool ret_bool;
 MUTATOR_HOOKABLE(Turret_CheckFire, EV_Turret_CheckFire);
 
 /** return error to prevent entity spawn, or modify the entity */
-MUTATOR_HOOKABLE(OnEntityPreSpawn, EV_NO_ARGS);
+#define EV_OnEntityPreSpawn(i, o) \
+    /** turret */ i(entity, __self) \
+    /**/
+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);
@@ -216,12 +203,6 @@ MUTATOR_HOOKABLE(PlayerPreThink, EV_NO_ARGS);
 /** TODO change this into a general PlayerPostThink hook? */
 MUTATOR_HOOKABLE(GetPressedKeys, EV_NO_ARGS);
 
-/**
- * called before any player physics, may adjust variables for movement,
- * is run AFTER bot code and idle checking
- */
-MUTATOR_HOOKABLE(PlayerPhysics, EV_NO_ARGS);
-
 /** 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) \
     /**/ i(float, get_cvars_f) \
@@ -233,17 +214,22 @@ 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 */
-MUTATOR_HOOKABLE(MonsterSpawn, EV_NO_ARGS);
+#define EV_MonsterSpawn(i, o) \
+    /**/ i(entity, __self) \
+    /**/
+MUTATOR_HOOKABLE(MonsterSpawn, EV_MonsterSpawn);
 
 /** called when a monster dies */
 #define EV_MonsterDies(i, o) \
-    /**/ 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);
 
@@ -262,8 +248,10 @@ 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);
@@ -273,6 +261,7 @@ 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) \
@@ -288,7 +277,10 @@ MUTATOR_HOOKABLE(MonsterMove, EV_MonsterMove);
 MUTATOR_HOOKABLE(MonsterFindTarget, EV_NO_ARGS);
 
 /** called to change a random monster to a miniboss */
-MUTATOR_HOOKABLE(MonsterCheckBossFlag, EV_NO_ARGS);
+#define EV_MonsterCheckBossFlag(i, o) \
+    /**/ i(entity, __self) \
+    /**/
+MUTATOR_HOOKABLE(MonsterCheckBossFlag, EV_MonsterCheckBossFlag);
 
 /**
  * called when a player tries to spawn a monster
@@ -298,18 +290,17 @@ MUTATOR_HOOKABLE(AllowMobSpawning, EV_NO_ARGS);
 
 /** 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);
 
 /**
@@ -317,20 +308,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) \
+    /** 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) \
     /**/
-float frag_damage;
-float frag_mirrordamage;
-vector frag_force;
 MUTATOR_HOOKABLE(PlayerDamage_Calculate, EV_PlayerDamage_Calculate);
 
 /**
@@ -339,10 +327,10 @@ 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(int,    MUTATOR_ARGV_2_int) \
+    /** armor     */ i(int,    MUTATOR_ARGV_3_int) \
+    /** location  */ i(vector, MUTATOR_ARGV_4_vector) \
+    /** deathtype */ i(int,    MUTATOR_ARGV_5_int) \
     /**/
 MUTATOR_HOOKABLE(PlayerDamaged, EV_PlayerDamaged);
 
@@ -417,24 +405,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);
 
 /**
@@ -442,12 +425,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_0_vector) \
+    /**/ o(vector, MUTATOR_ARGV_0_vector) \
     /**/
-vector spawn_score;
 MUTATOR_HOOKABLE(Spawn_Score, EV_Spawn_Score);
 
 /** runs globally each server frame */
@@ -489,6 +471,7 @@ 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) \
     /**/
 entity checkentity;
@@ -518,7 +501,10 @@ MUTATOR_HOOKABLE(HelpMePing, EV_HelpMePing);
  * called when a vehicle initializes
  * return true to remove the vehicle
  */
-MUTATOR_HOOKABLE(VehicleSpawn, EV_NO_ARGS);
+#define EV_VehicleSpawn(i, o) \
+    /**/ i(entity, __self) \
+    /**/
+MUTATOR_HOOKABLE(VehicleSpawn, EV_VehicleSpawn);
 
 /**
  * called when a player enters a vehicle
@@ -584,8 +570,8 @@ 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 {
@@ -618,7 +604,7 @@ entity bullet_hit;
 //vector bullet_hitloc; // the end pos matches the hit location, apparently
 vector bullet_startpos;
 vector bullet_endpos;
-//float frag_damage;
+float frag_damage;
 MUTATOR_HOOKABLE(FireBullet_Hit, EV_FireBullet_Hit);
 
 #define EV_FixPlayermodel(i, o) \
@@ -698,6 +684,7 @@ MUTATOR_HOOKABLE(FixClientCvars, EV_FixClientCvars);
 #define EV_SpectateSet(i, o) \
     /**/ i(entity, __self) \
     /**/ i(entity, spec_player) \
+    /**/ o(entity, spec_player) \
     /**/
 entity spec_player;
 MUTATOR_HOOKABLE(SpectateSet, EV_SpectateSet);
@@ -705,12 +692,14 @@ MUTATOR_HOOKABLE(SpectateSet, EV_SpectateSet);
 #define EV_SpectateNext(i, o) \
     /**/ i(entity, __self) \
     /**/ i(entity, spec_player) \
+    /**/ o(entity, spec_player) \
     /**/
 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) \
     /**/
 entity spec_first;
@@ -791,7 +780,7 @@ MUTATOR_HOOKABLE(GetPlayerStatus, EV_GetPlayerStatus);
 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);
 
@@ -835,8 +824,8 @@ 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);
 
@@ -849,4 +838,24 @@ MUTATOR_HOOKABLE(PrepareExplosionByDamage, EV_PrepareExplosionByDamage);
 string monster_model;
 string monster_model_output;
 MUTATOR_HOOKABLE(MonsterModel, EV_MonsterModel);
-#endif
+
+/**/
+#define EV_Player_ChangeTeam(i, o) \
+    /**/ i(entity, __self) \
+    /**/ i(float, pct_curteam) \
+    /**/ i(float, pct_newteam) \
+    /**/
+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) \
+    /**/
+float uricb_id;
+float uricb_status;
+string uricb_data;
+MUTATOR_HOOKABLE(URI_GetCallback, EV_URI_GetCallback);