X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_ca.qc;h=ff011b59deac11355d160bb3f10f6260c6f28ab3;hb=dd2b9a194fa4b844241392bfc136b953abf94a7a;hp=23bee3af7e27d7af0679bb8c564860d2d92a19c9;hpb=826222f84e886d85179a032b07edc71d99982040;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator/gamemode_ca.qc b/qcsrc/server/mutators/mutator/gamemode_ca.qc index 23bee3af7..ff011b59d 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ca.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ca.qc @@ -21,6 +21,8 @@ bool CA_CheckWinner(); void CA_RoundStart(); bool ca_isEliminated(entity e); +void SetLimits(int fraglimit_override, int leadlimit_override, float timelimit_override, float qualifying_override); + REGISTER_MUTATOR(ca, false) { MUTATOR_ONADD @@ -33,7 +35,6 @@ REGISTER_MUTATOR(ca, false) ca_teams = autocvar_g_ca_teams_override; if (ca_teams < 2) ca_teams = autocvar_g_ca_teams; ca_teams = bound(2, ca_teams, 4); - ret_float = ca_teams; ScoreRules_basics(ca_teams, SFL_SORT_PRIO_PRIMARY, 0, true); ScoreInfo_SetLabel_TeamScore(ST_CA_ROUNDS, "rounds", SFL_SORT_PRIO_PRIMARY); @@ -45,7 +46,7 @@ REGISTER_MUTATOR(ca, false) EliminatedPlayers_Init(ca_isEliminated); ActivateTeamplay(); - SetLimits(autocvar_g_ca_point_limit, autocvar_g_ca_point_leadlimit, -1, -1); + SetLimits(autocvar_g_ca_point_limit, autocvar_g_ca_point_leadlimit, autocvar_timelimit_override, -1); if (autocvar_g_ca_team_spawns) have_team_spawns = -1; // request team spawns @@ -113,6 +114,8 @@ float CA_GetWinnerTeam() return -1; // no player left } +void nades_Clear(entity player); + #define CA_ALIVE_TEAMS() ((redalive > 0) + (bluealive > 0) + (yellowalive > 0) + (pinkalive > 0)) #define CA_ALIVE_TEAMS_OK() (CA_ALIVE_TEAMS() == ca_teams) float CA_CheckWinner() @@ -216,22 +219,24 @@ entity CA_SpectateNext(entity player, entity start) MUTATOR_HOOKFUNCTION(ca, PlayerSpawn) { - SELFPARAM(); - this.caplayer = 1; + entity player = M_ARGV(0, entity); + + player.caplayer = 1; if (!warmup_stage) eliminatedPlayers.SendFlags |= 1; } MUTATOR_HOOKFUNCTION(ca, PutClientInServer) { - SELFPARAM(); - if (!allowed_to_spawn && IS_PLAYER(this)) // this is true even when player is trying to join + entity player = M_ARGV(0, entity); + + if (!allowed_to_spawn && IS_PLAYER(player)) // this is true even when player is trying to join { - this.classname = STR_OBSERVER; - if (this.jointime != time && !this.caplayer) // not when connecting + TRANSMUTE(Observer, player); + if (player.jointime != time && !player.caplayer) // not when connecting { - this.caplayer = 0.5; - Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_CA_JOIN_LATE); + player.caplayer = 0.5; + Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_JOIN_LATE); } } } @@ -247,9 +252,9 @@ MUTATOR_HOOKFUNCTION(ca, reset_map_players) } if (it.caplayer) { - it.classname = STR_PLAYER; + TRANSMUTE(Player, it); it.caplayer = 1; - WITH(entity, self, it, PutClientInServer()); + WITHSELF(it, PutClientInServer()); } }); return true; @@ -258,7 +263,7 @@ MUTATOR_HOOKFUNCTION(ca, reset_map_players) MUTATOR_HOOKFUNCTION(ca, ClientConnect) { SELFPARAM(); - this.classname = STR_OBSERVER; + TRANSMUTE(Observer, this); return true; } @@ -270,8 +275,7 @@ MUTATOR_HOOKFUNCTION(ca, reset_map_global) MUTATOR_HOOKFUNCTION(ca, GetTeamCount, CBC_ORDER_EXCLUSIVE) { - ret_float = ca_teams; - return false; + M_ARGV(0, float) = ca_teams; } entity ca_LastPlayerForTeam() @@ -302,6 +306,8 @@ void ca_LastPlayerForTeam_Notify() MUTATOR_HOOKFUNCTION(ca, PlayerDies) { + entity frag_target = M_ARGV(2, entity); + ca_LastPlayerForTeam_Notify(); if (!allowed_to_spawn) frag_target.respawn_flags = RESPAWN_SILENT; @@ -312,10 +318,11 @@ MUTATOR_HOOKFUNCTION(ca, PlayerDies) MUTATOR_HOOKFUNCTION(ca, ClientDisconnect) { - SELFPARAM(); - if (this.caplayer == 1) + entity player = M_ARGV(0, entity); + + if (player.caplayer == 1) ca_LastPlayerForTeam_Notify(); - return 1; + return true; } MUTATOR_HOOKFUNCTION(ca, ForbidPlayerScore_Clear) @@ -325,13 +332,14 @@ MUTATOR_HOOKFUNCTION(ca, ForbidPlayerScore_Clear) MUTATOR_HOOKFUNCTION(ca, MakePlayerObserver) { - SELFPARAM(); - if (this.caplayer == 1) + entity player = M_ARGV(0, entity); + + if (!IS_DEAD(player)) ca_LastPlayerForTeam_Notify(); - if (this.killindicator_teamchange == -2) - this.caplayer = 0; - if (this.caplayer) - this.frags = FRAGS_LMS_LOSER; + if (player.killindicator_teamchange == -2) + player.caplayer = 0; + if (player.caplayer) + player.frags = FRAGS_LMS_LOSER; if (!warmup_stage) eliminatedPlayers.SendFlags |= 1; return true; // prevent team reset @@ -344,8 +352,8 @@ MUTATOR_HOOKFUNCTION(ca, ForbidThrowCurrentWeapon) MUTATOR_HOOKFUNCTION(ca, GiveFragsForKill, CBC_ORDER_FIRST) { - frag_score = 0; // score will be given to the winner team when the round ends - return 1; + M_ARGV(2, float) = 0; // score will be given to the winner team when the round ends + return true; } MUTATOR_HOOKFUNCTION(ca, SetStartItems) @@ -365,6 +373,12 @@ MUTATOR_HOOKFUNCTION(ca, SetStartItems) MUTATOR_HOOKFUNCTION(ca, PlayerDamage_Calculate) { + entity frag_attacker = M_ARGV(1, entity); + entity frag_target = M_ARGV(2, entity); + float frag_deathtype = M_ARGV(3, float); + float frag_damage = M_ARGV(4, float); + float frag_mirrordamage = M_ARGV(5, float); + if (IS_PLAYER(frag_target)) if (!IS_DEAD(frag_target)) if (frag_target == frag_attacker || SAME_TEAM(frag_target, frag_attacker) || frag_deathtype == DEATH_FALL.m_id) @@ -372,6 +386,9 @@ MUTATOR_HOOKFUNCTION(ca, PlayerDamage_Calculate) frag_mirrordamage = 0; + M_ARGV(4, float) = frag_damage; + M_ARGV(5, float) = frag_mirrordamage; + return false; } @@ -390,12 +407,16 @@ MUTATOR_HOOKFUNCTION(ca, FilterItem) MUTATOR_HOOKFUNCTION(ca, PlayerDamage_SplitHealthArmor) { + entity frag_attacker = M_ARGV(1, entity); + entity frag_target = M_ARGV(2, entity); + float frag_damage = M_ARGV(7, float); + float damage_take = M_ARGV(4, float); + float damage_save = M_ARGV(5, float); + float excess = max(0, frag_damage - damage_take - damage_save); if (frag_target != frag_attacker && IS_PLAYER(frag_attacker)) PlayerTeamScore_Add(frag_attacker, SP_SCORE, ST_SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier); - - return false; } MUTATOR_HOOKFUNCTION(ca, PlayerRegen) @@ -476,8 +497,7 @@ MUTATOR_HOOKFUNCTION(ca, ClientCommand_Spectate) MUTATOR_HOOKFUNCTION(ca, WantWeapon) { - want_allguns = true; - return false; + M_ARGV(2, bool) = true; // all weapons } MUTATOR_HOOKFUNCTION(ca, GetPlayerStatus)