X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fserver%2Fcl_client.qc;h=3f6006838e7665bc31933aa8b5742ce7d5c5cfac;hb=b0e4ebf4cf698adc8d6322fb366d0e6045d555e6;hp=a95ff18c32a00e3c1db8515d1fc462474a72981b;hpb=e666aff12e3879625672de71fe4fe5bb9fc7a5bd;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index a95ff18c3..3f6006838 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -401,7 +401,6 @@ void PutObserverInServer (void) WriteEntity(MSG_ONE, self); } - DropAllRunes(self); MUTATOR_CALLHOOK(MakePlayerObserver); minstagib_stop_countdown(self); @@ -474,7 +473,6 @@ void PutObserverInServer (void) self.think = func_null; self.nextthink = 0; self.hook_time = 0; - self.runes = 0; self.deadflag = DEAD_NO; self.angles = spot.angles; self.angles_z = 0; @@ -807,8 +805,6 @@ void PutClientInServer (void) self.metertime = 0; - self.runes = 0; - self.deadflag = DEAD_NO; self.angles = spot.angles; @@ -1400,30 +1396,30 @@ void ClientConnect (void) { switch(autocvar_g_campaign_forceteam) { - case 1: self.team_forced = FL_TEAM_1; break; - case 2: self.team_forced = FL_TEAM_2; break; - case 3: self.team_forced = FL_TEAM_3; break; - case 4: self.team_forced = FL_TEAM_4; break; + case 1: self.team_forced = NUM_TEAM_1; break; + case 2: self.team_forced = NUM_TEAM_2; break; + case 3: self.team_forced = NUM_TEAM_3; break; + case 4: self.team_forced = NUM_TEAM_4; break; default: self.team_forced = 0; } } } else if(PlayerInIDList(self, autocvar_g_forced_team_red)) - self.team_forced = FL_TEAM_1; + self.team_forced = NUM_TEAM_1; else if(PlayerInIDList(self, autocvar_g_forced_team_blue)) - self.team_forced = FL_TEAM_2; + self.team_forced = NUM_TEAM_2; else if(PlayerInIDList(self, autocvar_g_forced_team_yellow)) - self.team_forced = FL_TEAM_3; + self.team_forced = NUM_TEAM_3; else if(PlayerInIDList(self, autocvar_g_forced_team_pink)) - self.team_forced = FL_TEAM_4; + self.team_forced = NUM_TEAM_4; else if(autocvar_g_forced_team_otherwise == "red") - self.team_forced = FL_TEAM_1; + self.team_forced = NUM_TEAM_1; else if(autocvar_g_forced_team_otherwise == "blue") - self.team_forced = FL_TEAM_2; + self.team_forced = NUM_TEAM_2; else if(autocvar_g_forced_team_otherwise == "yellow") - self.team_forced = FL_TEAM_3; + self.team_forced = NUM_TEAM_3; else if(autocvar_g_forced_team_otherwise == "pink") - self.team_forced = FL_TEAM_4; + self.team_forced = NUM_TEAM_4; else if(autocvar_g_forced_team_otherwise == "spectate") self.team_forced = -1; else if(autocvar_g_forced_team_otherwise == "spectator") @@ -1637,7 +1633,6 @@ void ClientDisconnect (void) Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_DISCONNECT, self.netname); - DropAllRunes(self); MUTATOR_CALLHOOK(ClientDisconnect); Portal_ClearAll(self); @@ -2011,32 +2006,6 @@ void player_regen (void) max_mod = regen_mod = rot_mod = limit_mod = 1; - if (self.runes & RUNE_REGEN) - { - if (self.runes & CURSE_VENOM) // do we have both rune/curse? - { - regen_mod = autocvar_g_balance_rune_regen_combo_regenrate; - max_mod = autocvar_g_balance_rune_regen_combo_hpmod; - limit_mod = autocvar_g_balance_rune_regen_combo_limitmod; - } - else - { - regen_mod = autocvar_g_balance_rune_regen_regenrate; - max_mod = autocvar_g_balance_rune_regen_hpmod; - limit_mod = autocvar_g_balance_rune_regen_limitmod; - } - } - else if (self.runes & CURSE_VENOM) - { - max_mod = autocvar_g_balance_curse_venom_hpmod; - if (self.runes & RUNE_REGEN) // do we have both rune/curse? - rot_mod = autocvar_g_balance_rune_regen_combo_rotrate; - else - rot_mod = autocvar_g_balance_curse_venom_rotrate; - limit_mod = autocvar_g_balance_curse_venom_limitmod; - //if (!self.runes & RUNE_REGEN) - // rot_mod = autocvar_g_balance_curse_venom_rotrate; - } maxh = maxh * max_mod; //maxa = maxa * max_mod; //maxf = maxf * max_mod; @@ -2223,6 +2192,46 @@ float SpectateUpdate() { } +float setSpectator() +{ + if(self.enemy.classname != "player") + return FALSE; + /*if(self.enemy.vehicle) + { + + msg_entity = self; + WriteByte(MSG_ONE, SVC_SETVIEW); + WriteEntity(MSG_ONE, self.enemy); + //stuffcmd(self, "set viewsize $tmpviewsize \n"); + + self.movetype = MOVETYPE_NONE; + accuracy_resend(self); + } + else + {*/ + msg_entity = self; + WriteByte(MSG_ONE, SVC_SETVIEW); + WriteEntity(MSG_ONE, self.enemy); + //stuffcmd(self, "set viewsize $tmpviewsize \n"); + self.movetype = MOVETYPE_NONE; + accuracy_resend(self); + + if(!SpectateUpdate()) + PutObserverInServer(); + //} + return TRUE; +} + +float Spectate(entity pl) +{ + if(g_ca && !autocvar_g_ca_spectate_enemies && self.caplayer) + if(pl.team != self.team) + return 0; + + self.enemy = pl; + return setSpectator(); +} + // Returns next available player to spectate if g_ca_spectate_enemies == 0 entity CA_SpectateNext(entity start) { if (start.team == self.team) { @@ -2246,13 +2255,10 @@ entity CA_SpectateNext(entity start) { return other; } -float SpectateNext(entity _prefer) { - - if(_prefer) - other = _prefer; - else - other = find(self.enemy, classname, "player"); - +float SpectateNext() +{ + other = find(self.enemy, classname, "player"); + if (g_ca && !autocvar_g_ca_spectate_enemies && self.caplayer) { // CA and ca players when spectating enemies is forbidden other = CA_SpectateNext(other); @@ -2261,38 +2267,49 @@ float SpectateNext(entity _prefer) { if (!other) other = find(other, classname, "player"); } - + if (other) self.enemy = other; - if(self.enemy.classname == "player") { - /*if(self.enemy.vehicle) - { - - msg_entity = self; - WriteByte(MSG_ONE, SVC_SETVIEW); - WriteEntity(MSG_ONE, self.enemy); - //stuffcmd(self, "set viewsize $tmpviewsize \n"); - - self.movetype = MOVETYPE_NONE; - accuracy_resend(self); - } - else - {*/ - msg_entity = self; - WriteByte(MSG_ONE, SVC_SETVIEW); - WriteEntity(MSG_ONE, self.enemy); - //stuffcmd(self, "set viewsize $tmpviewsize \n"); - self.movetype = MOVETYPE_NONE; - accuracy_resend(self); - - if(!SpectateUpdate()) - PutObserverInServer(); - //} - return 1; - } else { - return 0; + return setSpectator(); +} + +float SpectatePrev() +{ + // NOTE: chain order is from the highest to the lower entnum (unlike find) + other = findchain(classname, "player"); + if not(other) // no player + return FALSE; + + entity first = other; + // skip players until current spectated player + if(self.enemy) + while(other && other != self.enemy) + other = other.chain; + + if (g_ca && !autocvar_g_ca_spectate_enemies && self.caplayer) + { + do { other = other.chain; } + while(other && other.team != self.team); + + if not(other) + { + other = first; + while(other.team != self.team) + other = other.chain; + if(other == self.enemy) + return TRUE; + } + } + else + { + if(other.chain) + other = other.chain; + else + other = first; } + self.enemy = other; + return setSpectator(); } /* @@ -2321,50 +2338,34 @@ void ShowRespawnCountdown() } } -.float prevent_join_msgtime; void LeaveSpectatorMode() { - if(nJoinAllowed(self)) { - if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) { + if(nJoinAllowed(self)) + { + if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) + { self.classname = "player"; if(autocvar_g_campaign || autocvar_g_balance_teams) - JoinBestTeam(self, FALSE, TRUE); + { JoinBestTeam(self, FALSE, TRUE); } if(autocvar_g_campaign) - campaign_bots_may_start = 1; + { campaign_bots_may_start = 1; } + else + { Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_MOTD); } + Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_PREVENT_JOIN); + PutClientInServer(); - if(self.classname == STR_PLAYER) - Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_JOIN_PLAY, self.netname); - - //if(!autocvar_g_campaign) - //if (time < self.jointime + autocvar_welcome_message_time) - // Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MOTD); - - if (self.prevent_join_msgtime) - { - Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_PREVENT_JOIN); - self.prevent_join_msgtime = 0; - } - - return; - } else { - if (g_ca && self.caplayer) { - } // do nothing - else - stuffcmd(self,"menu_showteamselect\n"); - return; + if(IS_PLAYER(self)) { Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_JOIN_PLAY, self.netname); } } + else if not(g_ca && self.caplayer) { stuffcmd(self, "menu_showteamselect\n"); } } - else { - //player may not join because of g_maxplayers is set - if (time - self.prevent_join_msgtime > 2) - { - Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_PREVENT_JOIN); - self.prevent_join_msgtime = time; - } + else + { + // Player may not join because g_maxplayers is set + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_PREVENT_JOIN); } } @@ -2466,7 +2467,7 @@ void ObserverThink() self.flags |= FL_SPAWNING; } else if(self.BUTTON_ATCK && !self.version_mismatch) { self.flags &~= FL_JUMPRELEASED; - if(SpectateNext(world) == 1) { + if(SpectateNext()) { self.classname = "spectator"; } } else { @@ -2495,14 +2496,24 @@ void SpectatorThink() if (self.BUTTON_JUMP && !self.version_mismatch) { self.flags &~= FL_JUMPRELEASED; self.flags |= FL_SPAWNING; - } else if(self.BUTTON_ATCK) { + } else if(self.BUTTON_ATCK || self.impulse == 10 || self.impulse == 15 || self.impulse == 18 || self.impulse >= 200 && self.impulse <= 209) { + self.flags &~= FL_JUMPRELEASED; + if(SpectateNext()) { + self.classname = "spectator"; + } else { + self.classname = "observer"; + PutClientInServer(); + } + self.impulse = 0; + } else if(self.impulse == 12 || self.impulse == 16 || self.impulse == 19 || self.impulse >= 220 && self.impulse <= 229) { self.flags &~= FL_JUMPRELEASED; - if(SpectateNext(world) == 1) { + if(SpectatePrev()) { self.classname = "spectator"; } else { self.classname = "observer"; PutClientInServer(); } + self.impulse = 0; } else if (self.BUTTON_ATCK2) { self.flags &~= FL_JUMPRELEASED; self.classname = "observer";