X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fevents.qh;h=0110bdf1bd66c989a61f88e8e7840d7e088bcd38;hb=235e1cf920d59aca16a705699c45e6d83818d5cd;hp=b6e8c7f4b7b233f38edc3bf18e5c45417db27285;hpb=ffb677bba14c81963045d979714dd5cce8053d20;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/events.qh b/qcsrc/server/mutators/events.qh index b6e8c7f4b7..0110bdf1bd 100644 --- a/qcsrc/server/mutators/events.qh +++ b/qcsrc/server/mutators/events.qh @@ -31,6 +31,12 @@ MUTATOR_HOOKABLE(ForbidSpawn, EV_ForbidSpawn); /**/ MUTATOR_HOOKABLE(PlayerSpawn, EV_PlayerSpawn); +/** called after a player's weapon is chosen so it can be overriden here */ +#define EV_PlayerWeaponSelect(i, o) \ + /** player spawning */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(PlayerWeaponSelect, EV_PlayerWeaponSelect); + /** called in reset_map */ #define EV_reset_map_global(i, o) \ /**/ @@ -58,11 +64,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) \ @@ -80,14 +92,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) \ @@ -96,6 +100,14 @@ MUTATOR_HOOKABLE(WeaponSound, EV_WeaponSound); /**/ MUTATOR_HOOKABLE(ItemModel, EV_ItemModel); +/** called when an item sound is about to be played, allows custom paths etc. */ +#define EV_ItemSound(i, o) \ + /** sound */ i(string, MUTATOR_ARGV_0_string) \ + /** output */ i(string, MUTATOR_ARGV_1_string) \ + /**/ o(string, MUTATOR_ARGV_1_string) \ + /**/ +MUTATOR_HOOKABLE(ItemSound, EV_ItemSound); + /** 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) \ /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \ @@ -114,9 +126,35 @@ MUTATOR_HOOKABLE(MatchEnd, EV_NO_ARGS); /**/ o(float, MUTATOR_ARGV_0_float) \ /** team entity name */ i(string, MUTATOR_ARGV_1_string) \ /**/ o(string, MUTATOR_ARGV_1_string) \ + /** player checked */ i(entity, MUTATOR_ARGV_2_entity) \ /**/ 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) \ @@ -145,12 +183,14 @@ MUTATOR_HOOKABLE(PreFormatMessage, EV_PreFormatMessage); /** returns true if throwing the current weapon shall not be allowed */ #define EV_ForbidThrowCurrentWeapon(i, o) \ /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** weapon entity */ i(entity, MUTATOR_ARGV_1_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) \ - /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** weapon id */ i(int, MUTATOR_ARGV_1_int) \ /**/ MUTATOR_HOOKABLE(ForbidDropCurrentWeapon, EV_ForbidDropCurrentWeapon); @@ -278,7 +318,7 @@ MUTATOR_HOOKABLE(MonsterRespawn, EV_MonsterRespawn); /**/ o(entity, MUTATOR_ARGV_1_entity) \ /* attacker */ i(entity, MUTATOR_ARGV_2_entity) \ /**/ -.void(entity this) monster_loot; +.entity monster_loot; MUTATOR_HOOKABLE(MonsterDropItem, EV_MonsterDropItem); /** @@ -292,6 +332,7 @@ MUTATOR_HOOKABLE(MonsterDropItem, EV_MonsterDropItem); /** walk speed */ i(float, MUTATOR_ARGV_2_float) \ /**/ o(float, MUTATOR_ARGV_2_float) \ /** move target */ i(entity, MUTATOR_ARGV_3_entity) \ + /**/ o(entity, MUTATOR_ARGV_3_entity) \ /**/ MUTATOR_HOOKABLE(MonsterMove, EV_MonsterMove); @@ -343,7 +384,7 @@ MUTATOR_HOOKABLE(PlayerDamage_SplitHealthArmor, EV_PlayerDamage_SplitHealthArmor * called to adjust damage and force values which are applied to the player, used for e.g. strength damage/force multiplier * 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) \ +#define EV_Damage_Calculate(i, o) \ /** inflictor */ i(entity, MUTATOR_ARGV_0_entity) \ /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \ /** target */ i(entity, MUTATOR_ARGV_2_entity) \ @@ -355,7 +396,7 @@ MUTATOR_HOOKABLE(PlayerDamage_SplitHealthArmor, EV_PlayerDamage_SplitHealthArmor /** force */ i(vector, MUTATOR_ARGV_6_vector) \ /** force */ o(vector, MUTATOR_ARGV_6_vector) \ /**/ -MUTATOR_HOOKABLE(PlayerDamage_Calculate, EV_PlayerDamage_Calculate); +MUTATOR_HOOKABLE(Damage_Calculate, EV_Damage_Calculate); /** * Called when a player is damaged @@ -375,7 +416,8 @@ MUTATOR_HOOKABLE(PlayerDamaged, EV_PlayerDamaged); * Called by W_DecreaseAmmo */ #define EV_W_DecreaseAmmo(i, o) \ - /** actor */ i(entity, MUTATOR_ARGV_0_entity) \ + /** actor */ i(entity, MUTATOR_ARGV_0_entity) \ + /** weapon entity */ i(entity, MUTATOR_ARGV_1_entity) \ /**/ MUTATOR_HOOKABLE(W_DecreaseAmmo, EV_W_DecreaseAmmo); @@ -513,10 +555,7 @@ MUTATOR_HOOKABLE(SetWeaponreplace, EV_SetWeaponreplace); /** called when an item is about to respawn */ #define EV_Item_RespawnCountdown(i, o) \ - /** 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) \ + /** item */ i(entity, MUTATOR_ARGV_0_entity) \ /**/ MUTATOR_HOOKABLE(Item_RespawnCountdown, EV_Item_RespawnCountdown); @@ -606,6 +645,38 @@ enum { MUT_ITEMTOUCH_PICKUP // return this flag to have the item "picked up" and taken even after mutator handled it }; +/** 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 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 at when a player connect */ #define EV_ClientConnect(i, o) \ /** player */ i(entity, MUTATOR_ARGV_0_entity) \ @@ -647,6 +718,7 @@ MUTATOR_HOOKABLE(GetModelParams, EV_GetModelParams); /** end pos */ i(vector, MUTATOR_ARGV_3_vector) \ /** damage */ i(float, MUTATOR_ARGV_4_float) \ /**/ o(float, MUTATOR_ARGV_4_float) \ + /** wep entity */ i(entity, MUTATOR_ARGV_5_entity) \ /**/ MUTATOR_HOOKABLE(FireBullet_Hit, EV_FireBullet_Hit); @@ -713,6 +785,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) \ /**/ @@ -786,7 +864,7 @@ 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) \ @@ -860,7 +938,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) \ @@ -868,6 +948,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) \ @@ -891,3 +989,59 @@ MUTATOR_HOOKABLE(ForbidWeaponUse, EV_ForbidWeaponUse); /** keepvelocity? */ i(bool, MUTATOR_ARGV_2_bool) \ /**/ MUTATOR_HOOKABLE(CopyBody, EV_CopyBody); + +/** called when sending a chat message, ret argument can be changed to prevent the message */ +#define EV_ChatMessage(i, o) \ + /** sender */ i(entity, MUTATOR_ARGV_0_entity) \ + /** ret */ i(int, MUTATOR_ARGV_1_int) \ + /**/ o(int, MUTATOR_ARGV_1_int) \ + /**/ +MUTATOR_HOOKABLE(ChatMessage, EV_ChatMessage); + +/** return true to prevent sending a chat (private, team or regular) message from reaching a certain player */ +#define EV_ChatMessageTo(i, o) \ + /** destination player */ i(entity, MUTATOR_ARGV_0_entity) \ + /** sender */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ +MUTATOR_HOOKABLE(ChatMessageTo, EV_ChatMessageTo); + +/** return true to just restart the match, for modes that don't support readyrestart */ +MUTATOR_HOOKABLE(ReadyRestart_Deny, EV_NO_ARGS); + +/** called when a fusion reactor is validating its target */ +#define EV_FusionReactor_ValidTarget(i, o) \ + /** turret */ i(entity, MUTATOR_ARGV_0_entity) \ + /** target */ i(entity, MUTATOR_ARGV_1_entity) \ + /**/ +MUTATOR_HOOKABLE(FusionReactor_ValidTarget, EV_FusionReactor_ValidTarget); + +enum { + MUT_FUSREAC_TARG_CONTINUE, // return this flag to make the function continue as normal + MUT_FUSREAC_TARG_VALID, // return this flag to make the function return true (valid target) + MUT_FUSREAC_TARG_INVALID // return this flag to make the function return false (invalid target) +}; + +/** return true to hide the 'teamnumbers are imbalanced' message */ +#define EV_HideTeamNagger(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(HideTeamNagger, EV_HideTeamNagger); + +/** return true to show a waypoint while the item is spawning */ +#define EV_Item_ScheduleRespawn(i, o) \ + /** item */ i(entity, MUTATOR_ARGV_0_entity) \ + /** respawn time */ i(float, MUTATOR_ARGV_1_float) \ + /**/ +MUTATOR_HOOKABLE(Item_ScheduleRespawn, EV_Item_ScheduleRespawn); + +/** called before physics stats are set on a player, allows limited early customization */ +#define EV_PlayerPhysics_UpdateStats(i, o) \ + /** player */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(PlayerPhysics_UpdateStats, EV_PlayerPhysics_UpdateStats); + +/** return true to use your own aim target (or none at all) */ +#define EV_HavocBot_Aim(i, o) \ + /** bot */ i(entity, MUTATOR_ARGV_0_entity) \ + /**/ +MUTATOR_HOOKABLE(HavocBot_Aim, EV_HavocBot_Aim);