X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fgamemode_lms.qc;h=fb0bb2e865c9fc741726955a7623425144870b81;hb=b38e2bae0a50554f26bf5af1fbd0e70b97cc0c71;hp=3e8ced87cca852bd5c375a99ac152488f7211b6f;hpb=5eb2dee0826fe4c1365e29010e5f034b6cdc1efd;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/gamemode_lms.qc b/qcsrc/server/mutators/gamemode_lms.qc index 3e8ced87c..fb0bb2e86 100644 --- a/qcsrc/server/mutators/gamemode_lms.qc +++ b/qcsrc/server/mutators/gamemode_lms.qc @@ -18,12 +18,38 @@ float LMS_NewPlayerLives() } // mutator hooks -MUTATOR_HOOKFUNCTION(lms_PlayerSpawn) +MUTATOR_HOOKFUNCTION(lms_ResetMap) +{ + lms_lowest_lives = 999; + lms_next_place = player_count; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(lms_ResetPlayers) { - if(IS_PLAYER(self)) if(restart_mapalreadyrestarted || (time < game_starttime)) + FOR_EACH_CLIENT(self) + if(IS_PLAYER(self)) PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives()); - + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(lms_PlayerPreSpawn) +{ + // player is dead and becomes observer + // FIXME fix LMS scoring for new system + if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0) + self.classname = "observer"; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(lms_PlayerDies) +{ + self.respawn_flags |= RESPAWN_FORCE; + return FALSE; } @@ -34,13 +60,13 @@ MUTATOR_HOOKFUNCTION(lms_RemovePlayer) self.frags = FRAGS_SPECTATOR; else self.frags = FRAGS_LMS_LOSER; - + if(self.killcount != -666) if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0 && self.lms_spectate_warning != 2) Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_LMS_NOLIVES, self.netname); else Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_LMS_FORFEIT, self.netname); - + return FALSE; } @@ -48,13 +74,13 @@ MUTATOR_HOOKFUNCTION(lms_ClientConnect) { self.classname = "player"; campaign_bots_may_start = 1; - + if(PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives()) <= 0) { PlayerScore_Add(self, SP_LMS_RANK, 666); self.frags = FRAGS_SPECTATOR; } - + return FALSE; } @@ -62,52 +88,15 @@ MUTATOR_HOOKFUNCTION(lms_PlayerThink) { if(self.deadflag == DEAD_DYING) self.deadflag = DEAD_RESPAWNING; - - if not(self.deadflag) - if(autocvar_g_lms_campcheck_interval) - { - vector dist; - - // calculate player movement (in 2 dimensions only, so jumping on one spot doesn't count as movement) - dist = self.prevorigin - self.origin; - dist_z = 0; - self.lms_traveled_distance += fabs(vlen(dist)); - - if((autocvar_g_campaign && !campaign_bots_may_start) || (time < game_starttime)) - { - self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval*2; - self.lms_traveled_distance = 0; - } - - if(time > self.lms_nextcheck) - { - if(self.lms_traveled_distance < autocvar_g_lms_campcheck_distance) - { - Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_LMS_CAMPCHECK); - if(self.vehicle) - Damage(self.vehicle, self, self, autocvar_g_lms_campcheck_damage * 2, DEATH_CAMP, self.vehicle.origin, '0 0 0'); - else - Damage(self, self, self, bound(0, autocvar_g_lms_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP, self.origin, '0 0 0'); - } - self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval; - self.lms_traveled_distance = 0; - } - } - + return FALSE; } -MUTATOR_HOOKFUNCTION(lms_PlayerDamage) +MUTATOR_HOOKFUNCTION(lms_PlayerRegen) { - if(IS_PLAYER(frag_target)) - if(IS_PLAYER(frag_attacker)) - if(frag_attacker != frag_target) - { - frag_target.lms_traveled_distance = autocvar_g_lms_campcheck_distance; - frag_attacker.lms_traveled_distance = autocvar_g_lms_campcheck_distance; - } - - return FALSE; + if(autocvar_g_lms_regenerate) + return FALSE; + return TRUE; } MUTATOR_HOOKFUNCTION(lms_ForbidThrowing) @@ -133,26 +122,20 @@ MUTATOR_HOOKFUNCTION(lms_GiveFragsForKill) --lms_next_place; } frag_score = 0; - + return TRUE; } MUTATOR_HOOKFUNCTION(lms_SetStartItems) { - string s; - - s = cvar_string("g_weaponarena"); - if (s == "0" || s == "") - s = "most"; - - start_items &~= IT_UNLIMITED_AMMO; - start_ammo_shells = cvar("g_lms_start_ammo_shells"); - start_ammo_nails = cvar("g_lms_start_ammo_nails"); - start_ammo_rockets = cvar("g_lms_start_ammo_rockets"); - start_ammo_cells = cvar("g_lms_start_ammo_cells"); - start_ammo_fuel = cvar("g_lms_start_ammo_fuel"); - start_health = cvar("g_lms_start_health"); - start_armorvalue = cvar("g_lms_start_armor"); + start_items &= ~IT_UNLIMITED_AMMO; + start_health = warmup_start_health = cvar("g_lms_start_health"); + start_armorvalue = warmup_start_armorvalue = cvar("g_lms_start_armor"); + start_ammo_shells = warmup_start_ammo_shells = cvar("g_lms_start_ammo_shells"); + start_ammo_nails = warmup_start_ammo_nails = cvar("g_lms_start_ammo_nails"); + start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_lms_start_ammo_rockets"); + start_ammo_cells = warmup_start_ammo_cells = cvar("g_lms_start_ammo_cells"); + start_ammo_fuel = warmup_start_ammo_fuel = cvar("g_lms_start_ammo_fuel"); return FALSE; } @@ -171,7 +154,7 @@ MUTATOR_HOOKFUNCTION(lms_FilterItem) self.max_health = 1; return FALSE; } - + return TRUE; } @@ -183,20 +166,8 @@ MUTATOR_HOOKFUNCTION(lms_ItemTouch) Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_EXTRALIVES); PlayerScore_Add(other, SP_LMS_LIVES, autocvar_g_lms_extra_lives); } - - return FALSE; -} -MUTATOR_HOOKFUNCTION(lms_BotSpawn) -{ - // temporary hack to give bots lives - if(PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives()) <= 0) - { - PlayerScore_Add(self, SP_LMS_RANK, 666); - self.frags = FRAGS_SPECTATOR; - } - - return FALSE; + return MUT_ITEMTOUCH_CONTINUE; } // scoreboard stuff @@ -212,24 +183,26 @@ void lms_Initialize() { lms_lowest_lives = 9999; lms_next_place = 0; - + lms_ScoreRules(); } MUTATOR_DEFINITION(gamemode_lms) { - MUTATOR_HOOK(PlayerSpawn, lms_PlayerSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(reset_map_global, lms_ResetMap, CBC_ORDER_ANY); + MUTATOR_HOOK(reset_map_players, lms_ResetPlayers, CBC_ORDER_ANY); + MUTATOR_HOOK(PutClientInServer, lms_PlayerPreSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDies, lms_PlayerDies, CBC_ORDER_ANY); MUTATOR_HOOK(MakePlayerObserver, lms_RemovePlayer, CBC_ORDER_ANY); MUTATOR_HOOK(ClientConnect, lms_ClientConnect, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPreThink, lms_PlayerThink, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDamage_Calculate, lms_PlayerDamage, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerRegen, lms_PlayerRegen, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidThrowCurrentWeapon, lms_ForbidThrowing, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, lms_GiveFragsForKill, CBC_ORDER_ANY); MUTATOR_HOOK(SetStartItems, lms_SetStartItems, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerClearScore, lms_KeepScore, CBC_ORDER_ANY); + MUTATOR_HOOK(ForbidPlayerScore_Clear, lms_KeepScore, CBC_ORDER_ANY); MUTATOR_HOOK(FilterItem, lms_FilterItem, CBC_ORDER_ANY); MUTATOR_HOOK(ItemTouch, lms_ItemTouch, CBC_ORDER_ANY); - MUTATOR_HOOK(HavocBot_ChooseRule, lms_BotSpawn, CBC_ORDER_ANY); MUTATOR_ONADD {