X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fevents.qh;h=eaef39ae80e8383cd48063a84ce47bfd50e88e61;hb=5eea97bc262bfaf271817ca034439ad551f691d4;hp=d5a842a6ef301114723b687bbb8c636b0318a4c3;hpb=0141e404f85cd34e2394beb4c8651566cc291063;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/events.qh b/qcsrc/server/mutators/events.qh index d5a842a6e..eaef39ae8 100644 --- a/qcsrc/server/mutators/events.qh +++ b/qcsrc/server/mutators/events.qh @@ -1,7 +1,6 @@ -#ifndef SERVER_MUTATORS_EVENTS_H -#define SERVER_MUTATORS_EVENTS_H +#pragma once -#include "../../common/mutators/base.qh" +#include // 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) \ @@ -182,7 +166,10 @@ 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) * return error to request removal */ -MUTATOR_HOOKABLE(FilterItem, EV_NO_ARGS); +#define EV_FilterItem(i, o) \ + /** the current item */ i(entity, __self) \ + /**/ +MUTATOR_HOOKABLE(FilterItem, EV_FilterItem); /** return error to request removal */ #define EV_TurretSpawn(i, o) \ @@ -205,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); @@ -213,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) \ @@ -230,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); @@ -259,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); @@ -270,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) \ @@ -285,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 @@ -295,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); /** @@ -314,34 +308,48 @@ 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); /** * Called when a player is damaged */ #define EV_PlayerDamaged(i, o) \ - /** attacker */ i(entity, mutator_argv_entity_0) \ - /** target */ i(entity, mutator_argv_entity_1) \ - /** health */ i(int, mutator_argv_int_0) \ - /** armor */ i(int, mutator_argv_int_1) \ - /** location */ i(vector, mutator_argv_vector_0) \ + /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /** 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); +/** + * Called by W_DecreaseAmmo + */ +#define EV_W_DecreaseAmmo(i, o) \ + /** actor */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(W_DecreaseAmmo, EV_W_DecreaseAmmo); + +/** + * Called by W_Reload + */ +#define EV_W_Reload(i, o) \ + /** actor */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +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. */ #define EV_PlayerPowerups(i, o) \ /**/ i(entity, __self) \ @@ -397,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); /** @@ -422,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 */ @@ -469,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; @@ -498,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 @@ -564,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 { @@ -598,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) \ @@ -678,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); @@ -685,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; @@ -771,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); @@ -810,4 +819,43 @@ MUTATOR_HOOKABLE(TurretValidateTarget, EV_TurretValidateTarget); /**/ i(entity, __self) \ /**/ MUTATOR_HOOKABLE(TurretThink, EV_TurretThink); -#endif + +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) \ + /**/ +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) \ + /**/ +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) \ + /**/ +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);