X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=6ebee9fa1de67cfcdbd00e7d58ea429521593dc0;hb=a8659287998ab42080672303d51001f8a4d67729;hp=60dbeda7e15df958ac656f4f6aedaef73b7dbb72;hpb=e29603d545018c97349769107c7541212dc65cd3;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 60dbeda7e..6ebee9fa1 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -665,7 +665,7 @@ void PutObserverInServer (void) self.health = -666; self.takedamage = DAMAGE_NO; self.solid = SOLID_NOT; - self.movetype = MOVETYPE_SPECTATOR; //(self.cvar_cl_clippedspectating ? MOVETYPE_NOCLIP : MOVETYPE_FLY); // it's too early for this anyway, lets just set it in playerprethink + self.movetype = MOVETYPE_FLY_WORLDONLY; //(self.cvar_cl_clippedspectating ? MOVETYPE_NOCLIP : MOVETYPE_FLY); // it's too early for this anyway, lets just set it in playerprethink self.flags = FL_CLIENT | FL_NOTARGET; self.armorvalue = 666; self.effects = 0; @@ -694,9 +694,9 @@ void PutObserverInServer (void) self.fixangle = TRUE; self.crouch = FALSE; - self.view_ofs = '0 0 0'; // so that you can't go inside walls with MOVETYPE_FLY, previously "PL_VIEW_OFS" - for some reason this is diff from normal players + self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS" setorigin (self, spot.origin); - setsize (self, '-16 -16 -24', '16 16 24'); // so that you can't go inside walls with MOVETYPE_FLY + setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY self.prevorigin = self.origin; self.items = 0; self.weapons = 0; @@ -739,6 +739,13 @@ void PutObserverInServer (void) else self.frags = FRAGS_LMS_LOSER; } + else if(g_ca) + { + if(self.caplayer) + self.frags = FRAGS_LMS_LOSER; + else + self.frags = FRAGS_SPECTATOR; + } else self.frags = FRAGS_SPECTATOR; } @@ -1086,7 +1093,6 @@ void PutClientInServer (void) if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars self.weapon_load[j] = cvar(strcat("g_balance_", e.netname, "_reload_ammo")); } - self.weapon_forbidchange = FALSE; oldself = self; self = spot; @@ -2313,7 +2319,8 @@ void SpectateCopy(entity spectatee) { self.dmg_save = spectatee.dmg_save; self.dmg_inflictor = spectatee.dmg_inflictor; self.angles = spectatee.v_angle; - self.fixangle = TRUE; + if(!self.BUTTON_USE) + self.fixangle = TRUE; setorigin(self, spectatee.origin); setsize(self, spectatee.mins, spectatee.maxs); SetZoomState(spectatee.zoomstate); @@ -2359,12 +2366,41 @@ float SpectateUpdate() { return 1; } -float SpectateNext() { - other = find(self.enemy, classname, "player"); - if (!other) +// Returns next available player to spectate if g_ca_spectate_enemies == 0 +entity CA_SpectateNext(entity start) { + if (start.team == self.team) { + return start; + } + + other = start; + // continue from current player + while(other && other.team != self.team) { other = find(other, classname, "player"); + } + + if (!other) { + // restart from begining + other = find(other, classname, "player"); + while(other && other.team != self.team) { + other = find(other, classname, "player"); + } + } + + return other; +} +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); + } else { + // other modes and ca spectators or spectating enemies is allowed + if (!other) + other = find(other, classname, "player"); + } + if (other) self.enemy = other; @@ -2501,6 +2537,42 @@ void checkSpectatorBlock() { } } +.float motd_actived_time; // used for both motd and campaign_message +void PrintWelcomeMessage() +{ + if (self.motd_actived_time == 0) { // is there already a message showing? + if (autocvar_g_campaign) { + if ((self.classname == "player" && self.BUTTON_INFO) || (self.classname != "player")) { + self.motd_actived_time = time; + Send_CSQC_Centerprint_Generic(self, CPID_MOTD, campaign_message, -1, 0); + } + } else { + if ((time - self.jointime > autocvar_welcome_message_time) && self.BUTTON_INFO) { + self.motd_actived_time = time; + Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), -1, 0); + } + } + } else { // showing MOTD or campaign message + if (autocvar_g_campaign) { + if (self.BUTTON_INFO) + self.motd_actived_time = time; + else if ((time - self.motd_actived_time > 2) && self.classname == "player") { // hide it some seconds after BUTTON_INFO has been released + self.motd_actived_time = 0; + Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); + } + } else { + if ((time - self.jointime) > autocvar_welcome_message_time) { + if (self.BUTTON_INFO) + self.motd_actived_time = time; + else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released + self.motd_actived_time = 0; + Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); + } + } + } + } +} + void ObserverThink() { float prefered_movetype; @@ -2514,7 +2586,7 @@ void ObserverThink() self.classname = "spectator"; } } else { - prefered_movetype = ((self.cvar_cl_clippedspectating && !self.BUTTON_USE) ? MOVETYPE_SPECTATOR : MOVETYPE_NOCLIP); + prefered_movetype = ((!self.BUTTON_USE ? self.cvar_cl_clippedspectating : !self.cvar_cl_clippedspectating) ? MOVETYPE_FLY_WORLDONLY : MOVETYPE_NOCLIP); if (self.movetype != prefered_movetype) self.movetype = prefered_movetype; } @@ -2529,6 +2601,8 @@ void ObserverThink() } } } + + PrintWelcomeMessage(); } void SpectatorThink() @@ -2567,6 +2641,7 @@ void SpectatorThink() PutObserverInServer(); } + PrintWelcomeMessage(); self.flags |= FL_CLIENT | FL_NOTARGET; } @@ -2602,7 +2677,6 @@ Called every frame for each client before the physics are run void() ctf_setstatus; void() nexball_setstatus; .float items_added; -.float motd_actived_time; // used for both motd and campaign_message void PlayerPreThink (void) { WarpZone_PlayerPhysics_FixVAngle(); @@ -2681,40 +2755,8 @@ void PlayerPreThink (void) PlayerUseKey(); self.usekeypressed = self.BUTTON_USE; - if (self.motd_actived_time == 0) { - if (autocvar_g_campaign) { - if (self.classname == "player" && self.BUTTON_INFO) { - self.motd_actived_time = time; - Send_CSQC_Centerprint_Generic(self, CPID_MOTD, campaign_message, -1, 0); - } - } else { - if ((self.classname == "player" || time - self.jointime > autocvar_welcome_message_time) && self.BUTTON_INFO) { - self.motd_actived_time = time; - Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), -1, 0); - } - } - } else { // showing MOTD or campaign message - if (autocvar_g_campaign) { - if (self.classname == "player") { - if (self.BUTTON_INFO) - self.motd_actived_time = time; - else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released - self.motd_actived_time = 0; - Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); - } - } - } else { - if (self.classname == "player" || (time - self.jointime) > autocvar_welcome_message_time) { - if (self.BUTTON_INFO) - self.motd_actived_time = time; - else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released - self.motd_actived_time = 0; - Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); - } - } - } - } - + PrintWelcomeMessage(); + if(self.classname == "player") { // if(self.netname == "Wazat") // bprint(self.classname, "\n");