X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fevents.qh;h=cc89208004899f3bca1ffac6ad977781d23ae649;hp=89fec0178c7f01c7d00c22d54f0474a38039d449;hb=1852dd0b6c285f4c8d44e08efb6c9ea0709658eb;hpb=53911d2ce2724f2da23fb6806e491ce795ae4326 diff --git a/qcsrc/server/mutators/events.qh b/qcsrc/server/mutators/events.qh index 89fec0178..cc8920800 100644 --- a/qcsrc/server/mutators/events.qh +++ b/qcsrc/server/mutators/events.qh @@ -3,6 +3,9 @@ #include // register all possible hooks here + +// to use a hook, first register your mutator using REGISTER_MUTATOR +// then create your function using MUTATOR_HOOKFUNCTION /** called when a player becomes observer, after shared setup */ #define EV_MakePlayerObserver(i, o) \ @@ -24,6 +27,12 @@ MUTATOR_HOOKABLE(PutClientInServer, EV_PutClientInServer); /**/ MUTATOR_HOOKABLE(ForbidSpawn, EV_ForbidSpawn); +/** called when player spawns to determine whether to give them random start weapons. Return true to forbid giving them. */ +#define EV_ForbidRandomStartWeapons(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(ForbidRandomStartWeapons, EV_ForbidRandomStartWeapons); + /** 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) \ @@ -64,11 +73,17 @@ MUTATOR_HOOKABLE(ClientDisconnect, EV_ClientDisconnect); /** 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 */ i(float, MUTATOR_ARGV_4_float) \ /** damage */ o(float, MUTATOR_ARGV_4_float) \ /**/ MUTATOR_HOOKABLE(PlayerDies, EV_PlayerDies); +/** called after a player died. */ +#define EV_PlayerDied(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(PlayerDied, EV_PlayerDied); + /** allows overriding the frag centerprint messages */ #define EV_FragCenterMessage(i, o) \ /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \ @@ -86,14 +101,6 @@ MUTATOR_HOOKABLE(FragCenterMessage, EV_FragCenterMessage); /**/ MUTATOR_HOOKABLE(PlayHitsound, EV_PlayHitsound); -/** called when a weapon sound is about to be played, allows custom paths etc. */ -#define EV_WeaponSound(i, o) \ - /** sound */ i(string, MUTATOR_ARGV_0_string) \ - /** output */ i(string, MUTATOR_ARGV_1_string) \ - /**/ o(string, MUTATOR_ARGV_1_string) \ - /**/ -MUTATOR_HOOKABLE(WeaponSound, EV_WeaponSound); - /** called when an item model is about to be set, allows custom paths etc. */ #define EV_ItemModel(i, o) \ /** model */ i(string, MUTATOR_ARGV_0_string) \ @@ -132,6 +139,31 @@ MUTATOR_HOOKABLE(MatchEnd, EV_NO_ARGS); /**/ MUTATOR_HOOKABLE(CheckAllowedTeams, EV_CheckAllowedTeams); +/** return true to manually override team counts */ +MUTATOR_HOOKABLE(GetTeamCounts, EV_NO_ARGS); + +/** allow overriding of team counts */ +#define EV_GetTeamCount(i, o) \ + /** team to count */ i(float, MUTATOR_ARGV_0_float) \ + /** player to ignore */ i(entity, MUTATOR_ARGV_1_entity) \ + /** number of players in a team */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ + /** number of bots in a team */ i(float, MUTATOR_ARGV_3_float) \ + /**/ o(float, MUTATOR_ARGV_3_float) \ + /** lowest scoring human in a team */ i(entity, MUTATOR_ARGV_4_entity) \ + /**/ o(entity, MUTATOR_ARGV_4_entity) \ + /** lowest scoring bot in a team */ i(entity, MUTATOR_ARGV_5_entity) \ + /**/ o(entity, MUTATOR_ARGV_5_entity) \ + /**/ +MUTATOR_HOOKABLE(GetTeamCount, EV_GetTeamCount); + +/** allows overriding best teams */ +#define EV_FindBestTeams(i, o) \ + /** player checked */ i(entity, MUTATOR_ARGV_0_entity) \ + /** bitmask of teams */ o(float, MUTATOR_ARGV_1_float) \ + /**/ +MUTATOR_HOOKABLE(FindBestTeams, EV_FindBestTeams); + /** copies variables for spectating "spectatee" to "this" */ #define EV_SpectateCopy(i, o) \ /** spectatee */ i(entity, MUTATOR_ARGV_0_entity) \ @@ -200,6 +232,14 @@ MUTATOR_HOOKABLE(SetStartItems, EV_NO_ARGS); /**/ MUTATOR_HOOKABLE(CustomizeWaypoint, EV_CustomizeWaypoint); +/** Check if items having the given definition are allowed to spawn. + * Return true to disallow spawning. + */ +#define EV_FilterItemDefinition(i, o) \ + /** item */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(FilterItemDefinition, EV_FilterItemDefinition); + /** * 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 @@ -395,6 +435,8 @@ MUTATOR_HOOKABLE(PlayerDamaged, EV_PlayerDamaged); #define EV_W_DecreaseAmmo(i, o) \ /** actor */ i(entity, MUTATOR_ARGV_0_entity) \ /** weapon entity */ i(entity, MUTATOR_ARGV_1_entity) \ + /** ammo to take */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ /**/ MUTATOR_HOOKABLE(W_DecreaseAmmo, EV_W_DecreaseAmmo); @@ -622,6 +664,78 @@ enum { MUT_ITEMTOUCH_PICKUP // return this flag to have the item "picked up" and taken even after mutator handled it }; +/** called after the item has been touched. */ +#define EV_ItemTouched(i, o) \ + /** item */ i(entity, MUTATOR_ARGV_0_entity) \ + /** toucher */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ +MUTATOR_HOOKABLE(ItemTouched, EV_ItemTouched); + +/** Called when the amount of entity resources changes. Can be used to override +resource limit. */ +#define EV_GetResourceLimit(i, o) \ + /** checked entity */ i(entity, MUTATOR_ARGV_0_entity) \ + /** resource type */ i(int, MUTATOR_ARGV_1_int) \ + /** limit */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ + /**/ +MUTATOR_HOOKABLE(GetResourceLimit, EV_GetResourceLimit); + +/** Called when the amount of resource of an entity changes. See RESOURCE_* +constants for resource types. Return true to forbid the change. */ +#define EV_SetResourceAmount(i, o) \ + /** checked entity */ i(entity, MUTATOR_ARGV_0_entity) \ + /** resource type */ i(int, MUTATOR_ARGV_1_int) \ + /**/ o(int, MUTATOR_ARGV_1_int) \ + /** amount */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ + /**/ +MUTATOR_HOOKABLE(SetResourceAmount, EV_SetResourceAmount); + +/** Called after the amount of resource of an entity has changed. See RESOURCE_* +constants for resource types. Amount wasted is the amount of resource that is +above resource limit so it was not given. */ +#define EV_ResourceAmountChanged(i, o) \ + /** checked entity */ i(entity, MUTATOR_ARGV_0_entity) \ + /** resource type */ i(int, MUTATOR_ARGV_1_int) \ + /** amount */ i(float, MUTATOR_ARGV_2_float) \ + /**/ +MUTATOR_HOOKABLE(ResourceAmountChanged, EV_ResourceAmountChanged); + +/** Called when there was an attempt to set entity resources higher than their +limit. See RESOURCE_* constants for resource types. Amount wasted is the amount +of resource that is above resource limit so it was not given. */ +#define EV_ResourceWasted(i, o) \ + /** checked entity */ i(entity, MUTATOR_ARGV_0_entity) \ + /** resource type */ i(int, MUTATOR_ARGV_1_int) \ + /** amount wasted */ i(float, MUTATOR_ARGV_2_float) \ + /**/ +MUTATOR_HOOKABLE(ResourceWasted, EV_ResourceWasted); + +/** Called when entity is being given some resource. See RESOURCE_* constants +for resource types. Return true to forbid giving. */ +#define EV_GiveResource(i, o) \ + /** receiver */ i(entity, MUTATOR_ARGV_0_entity) \ + /** resource type */ i(int, MUTATOR_ARGV_1_int) \ + /**/ o(int, MUTATOR_ARGV_1_int) \ + /** amount */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ + /**/ +MUTATOR_HOOKABLE(GiveResource, EV_GiveResource); + +/** Called when entity is being given some resource with specified limit. See +RESOURCE_* constants for resource types. Return true to forbid giving. */ +#define EV_GiveResourceWithLimit(i, o) \ + /** receiver */ i(entity, MUTATOR_ARGV_0_entity) \ + /** resource type */ i(int, MUTATOR_ARGV_1_int) \ + /**/ o(int, MUTATOR_ARGV_1_int) \ + /** amount */ i(float, MUTATOR_ARGV_2_float) \ + /**/ o(float, MUTATOR_ARGV_2_float) \ + /** limit */ i(float, MUTATOR_ARGV_3_float) \ + /**/ o(float, MUTATOR_ARGV_3_float) \ + /**/ +MUTATOR_HOOKABLE(GiveResourceWithLimit, EV_GiveResourceWithLimit); + /** called at when a player connect */ #define EV_ClientConnect(i, o) \ /** player */ i(entity, MUTATOR_ARGV_0_entity) \ @@ -730,6 +844,12 @@ MUTATOR_HOOKABLE(Race_FinalCheckpoint, EV_Race_FinalCheckpoint); /**/ MUTATOR_HOOKABLE(ClientKill, EV_ClientKill); +/** called when player is about to be killed during kill command or changing teams */ +#define EV_ClientKill_Now(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(ClientKill_Now, EV_ClientKill_Now); + #define EV_FixClientCvars(i, o) \ /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ @@ -803,13 +923,20 @@ MUTATOR_HOOKABLE(CheckRules_World, EV_CheckRules_World); MUTATOR_HOOKABLE(WantWeapon, EV_WantWeapon); #define EV_AddPlayerScore(i, o) \ - /** score field */ i(PlayerScoreField, MUTATOR_ARGV_0_entity) \ + /** score field */ i(entity, MUTATOR_ARGV_0_entity) \ /** score */ i(float, MUTATOR_ARGV_1_float) \ /**/ o(float, MUTATOR_ARGV_1_float) \ /** player */ i(entity, MUTATOR_ARGV_2_entity) \ /**/ MUTATOR_HOOKABLE(AddPlayerScore, EV_AddPlayerScore); +#define EV_AddedPlayerScore(i, o) \ + /** score field */ i(entity, MUTATOR_ARGV_0_entity) \ + /** score */ i(float, MUTATOR_ARGV_1_float) \ + /** player */ i(entity, MUTATOR_ARGV_2_entity) \ + /**/ +MUTATOR_HOOKABLE(AddedPlayerScore, EV_AddPlayerScore); + #define EV_GetPlayerStatus(i, o) \ /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ @@ -877,7 +1004,9 @@ MUTATOR_HOOKABLE(PrepareExplosionByDamage, EV_PrepareExplosionByDamage); /**/ MUTATOR_HOOKABLE(MonsterModel, EV_MonsterModel); -/**/ +/** + * Called before player changes their team. Return true to block team change. + */ #define EV_Player_ChangeTeam(i, o) \ /** player */ i(entity, MUTATOR_ARGV_0_entity) \ /** current team */ i(float, MUTATOR_ARGV_1_float) \ @@ -885,6 +1014,24 @@ MUTATOR_HOOKABLE(MonsterModel, EV_MonsterModel); /**/ MUTATOR_HOOKABLE(Player_ChangeTeam, EV_Player_ChangeTeam); +/** + * Called after player has changed their team. + */ +#define EV_Player_ChangedTeam(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** old team */ i(float, MUTATOR_ARGV_1_float) \ + /** current team */ i(float, MUTATOR_ARGV_2_float) \ + /**/ +MUTATOR_HOOKABLE(Player_ChangedTeam, EV_Player_ChangedTeam); + +/** + * Called when player is about to be killed when changing teams. Return true to block killing. + */ +#define EV_Player_ChangeTeamKill(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(Player_ChangeTeamKill, EV_Player_ChangeTeamKill); + /**/ #define EV_URI_GetCallback(i, o) \ /** id */ i(float, MUTATOR_ARGV_0_float) \ @@ -964,3 +1111,26 @@ MUTATOR_HOOKABLE(PlayerPhysics_UpdateStats, EV_PlayerPhysics_UpdateStats); /** bot */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(HavocBot_Aim, EV_HavocBot_Aim); + +/** return true to skip respawn time calculations */ +#define EV_CalculateRespawnTime(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(CalculateRespawnTime, EV_CalculateRespawnTime); + +/** called when parsing a vote command. */ +#define EV_VoteCommand_Parse(i, o) \ + /** caller */ i(entity, MUTATOR_ARGV_0_entity) \ + /** first command */ i(string, MUTATOR_ARGV_1_string) \ + /** vote command */ i(string, MUTATOR_ARGV_2_string) \ + /** start position of vote command */ i(float, MUTATOR_ARGV_3_float) \ + /** argument count */ i(float, MUTATOR_ARGV_4_float) \ + /**/ +MUTATOR_HOOKABLE(VoteCommand_Parse, EV_VoteCommand_Parse); + +enum { + MUT_VOTEPARSE_CONTINUE, // return this flag to make the function continue as normal + MUT_VOTEPARSE_SUCCESS, // return 1 (vote parsed) + MUT_VOTEPARSE_INVALID, // return -1 (vote parsed but counted as invalid, no action or vote) + MUT_VOTEPARSE_UNACCEPTABLE // return 0 (vote parameter counted as unacceptable, warns caller) +};