X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=2c340bf78a4b69ace3314d64933142c09dc04672;hb=a321c69d9d812d97741c33099eaf295b1fa518ab;hp=2ffc3e229eb28b4d509b3f5a5244dc51abb37386;hpb=df4fbc07dacc9c2785e2cbe3f9010c4e07ed10ad;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 2ffc3e229..2c340bf78 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -421,9 +421,6 @@ void PutObserverInServer (void) if(self.flagcarried) DropFlag(self.flagcarried, world, world); - if(self.ballcarried && g_nexball) - DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity); - WaypointSprite_PlayerDead(); if not(g_ca) // don't reset teams when moving a ca player to the spectators @@ -474,6 +471,7 @@ void PutObserverInServer (void) self.pain_finished = 0; self.strength_finished = 0; self.invincible_finished = 0; + self.superweapons_finished = 0; self.pushltime = 0; self.think = SUB_Null; self.nextthink = 0; @@ -644,6 +642,7 @@ Called when a client spawns in the server ============= */ //void() ctf_playerchanged; + void PutClientInServer (void) { if(clienttype(self) == CLIENTTYPE_BOT) @@ -751,6 +750,11 @@ void PutClientInServer (void) self.weapons = start_weapons; } + if(self.weapons & WEPBIT_SUPERWEAPONS) // exception for minstagib, as minstanex is a superweapon + self.superweapons_finished = time + autocvar_g_balance_superweapons_time; + else + self.superweapons_finished = 0; + if(g_weaponarena_random) { if(g_weaponarena_random_with_laser) @@ -961,6 +965,7 @@ float ClientInit_SendEntity(entity to, float sf) WriteByte(MSG_ENTITY, autocvar_g_balance_minelayer_limit); // minelayer max mines WriteByte(MSG_ENTITY, autocvar_g_balance_hagar_secondary_load_max); // hagar max loadable rockets WriteCoord(MSG_ENTITY, autocvar_g_trueaim_minrange); + WriteByte(MSG_ENTITY, autocvar_g_balance_porto_secondary); return TRUE; } @@ -1589,8 +1594,12 @@ void ClientConnect (void) CSQCMODEL_AUTOINIT(); self.model_randomizer = random(); + + if(clienttype(self) != CLIENTTYPE_REAL) + return; + + sv_notice_join(); } - /* ============= ClientDisconnect @@ -1646,8 +1655,6 @@ void ClientDisconnect (void) RemoveGrapplingHook(self); if(self.flagcarried) DropFlag(self.flagcarried, world, world); - if(self.ballcarried && g_nexball) - DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity); // Here, everything has been done that requires this player to be a client. @@ -1887,6 +1894,48 @@ void player_powerups (void) sprint(self, "^3Shield surrounds you\n"); } } + if (self.items & IT_SUPERWEAPON) + { + //if(W_WeaponBit(self.weapon) & WEPBIT_SUPERWEAPONS) + // self.effects = self.effects | EF_RED; + if (!(self.weapons & WEPBIT_SUPERWEAPONS)) + { + self.superweapons_finished = 0; + self.items = self.items - (self.items & IT_SUPERWEAPON); + sprint(self, "^3Superweapons have been lost\n"); + } + else if (self.items & IT_UNLIMITED_SUPERWEAPONS) + { + // don't let them run out + } + else + { + play_countdown(self.superweapons_finished, "misc/poweroff.wav"); + if (time > self.superweapons_finished) + { + self.items = self.items - (self.items & IT_SUPERWEAPON); + self.weapons &~= WEPBIT_SUPERWEAPONS; + sprint(self, "^3Superweapons have broken down\n"); + } + } + } + else if(self.weapons & WEPBIT_SUPERWEAPONS) + { + if (time < self.superweapons_finished || (self.items & IT_UNLIMITED_SUPERWEAPONS)) + { + self.items = self.items | IT_SUPERWEAPON; + sprint(self, "^3You now have a superweapon\n"); + } + else + { + self.superweapons_finished = 0; + self.weapons &~= WEPBIT_SUPERWEAPONS; // just in case + } + } + else + { + self.superweapons_finished = 0; + } } if(autocvar_g_nodepthtestplayers) @@ -2265,7 +2314,7 @@ void ShowRespawnCountdown() .float prevent_join_msgtime; void LeaveSpectatorMode() { - if(nJoinAllowed(1)) { + 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"; @@ -2315,26 +2364,36 @@ void LeaveSpectatorMode() * it checks whether the number of currently playing players exceeds g_maxplayers. * @return int number of free slots for players, 0 if none */ -float nJoinAllowed(float includeMe) { +float nJoinAllowed(entity ignore) { + if(!ignore) + // this is called that way when checking if anyone may be able to join (to build qcstatus) + // so report 0 free slots if restricted + { + if(autocvar_g_forced_team_otherwise == "spectate") + return 0; + if(autocvar_g_forced_team_otherwise == "spectator") + return 0; + } + if(self.team_forced < 0) - return FALSE; // forced spectators can never join + return 0; // forced spectators can never join // TODO simplify this entity e; - float totalClients; FOR_EACH_CLIENT(e) - totalClients += 1; + if(e != ignore) + totalClients += 1; if (!autocvar_g_maxplayers) - return maxclients - totalClients + includeMe; + return maxclients - totalClients; float currentlyPlaying; FOR_EACH_REALPLAYER(e) currentlyPlaying += 1; if(currentlyPlaying < autocvar_g_maxplayers) - return min(maxclients - totalClients + includeMe, autocvar_g_maxplayers - currentlyPlaying); + return min(maxclients - totalClients, autocvar_g_maxplayers - currentlyPlaying); return 0; }