X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=4f6e29ceacd84ded7d04e289920bb067eee0c909;hp=fac4314ca6e7b53c577b1182228f3ca612bc614e;hb=31bf64ba7821ebb5c0aba8a154472810074ed11e;hpb=c9817f1dec9a45efdc4b617c42cc5ca907162b47 diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index fac4314ca6..4f6e29ceac 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1,6 +1,3 @@ -void race_send_recordtime(float msg); -void race_SendRankings(float pos, float prevpos, float del, float msg); - void send_CSQC_teamnagger() { WriteByte(MSG_BROADCAST, SVC_TEMPENTITY); WriteByte(MSG_BROADCAST, TE_CSQC_TEAMNAGGER); @@ -140,7 +137,6 @@ void PutObserverInServer (void) { entity spot; self.hud = HUD_NORMAL; - race_PreSpawnObserver(); spot = SelectSpawnPoint (TRUE); if(!spot) @@ -154,20 +150,12 @@ void PutObserverInServer (void) WriteEntity(MSG_ONE, self); } - if((g_race && g_race_qualifying) || g_cts) - { - if(PlayerScore_Add(self, SP_RACE_FASTEST, 0)) - self.frags = FRAGS_LMS_LOSER; - else - self.frags = FRAGS_SPECTATOR; - } - else - self.frags = FRAGS_SPECTATOR; + self.frags = FRAGS_SPECTATOR; MUTATOR_CALLHOOK(MakePlayerObserver); Portal_ClearAll(self); - + if(self.alivetime) { if(!warmup_stage) @@ -176,16 +164,18 @@ void PutObserverInServer (void) } if(self.vehicle) - vehicles_exit(VHEF_RELESE); + vehicles_exit(VHEF_RELESE); WaypointSprite_PlayerDead(); - if not(g_ca) // don't reset teams when moving a ca player to the spectators + if (!g_ca) // don't reset teams when moving a ca player to the spectators self.team = -1; // move this as it is needed to log the player spectating in eventlog if(self.killcount != -666) { Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_SPECTATE, self.netname); + if(autocvar_g_chat_nospectators == 1 || (cvar("g_warmup") && !(warmup_stage || gameover) && autocvar_g_chat_nospectators == 2)) + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_CHAT_NOSPECTATORS); if(self.just_joined == FALSE) { LogTeamchange(self.playerid, -1, 4); @@ -198,7 +188,7 @@ void PutObserverInServer (void) accuracy_resend(self); self.spectatortime = time; - + self.classname = "observer"; self.iscreature = FALSE; self.teleportable = TELEPORT_SIMPLE; @@ -281,7 +271,7 @@ void FixPlayermodel() if(teamplay) { string s; - s = Team_ColorName_Lower(self.team); + s = Static_Team_ColorName_Lower(self.team); if(s != "neutral") { defaultmodel = cvar_string(strcat("sv_defaultplayermodel_", s)); @@ -389,8 +379,6 @@ void PutClientInServer (void) if(self.team < 0) JoinBestTeam(self, FALSE, TRUE); - race_PreSpawn(); - spot = SelectSpawnPoint (FALSE); if(!spot) { @@ -400,6 +388,9 @@ void PutClientInServer (void) RemoveGrapplingHook(self); // Wazat's Grappling Hook + if(self.vehicle) + vehicles_exit(VHEF_RELESE); + self.classname = "player"; self.wasplayer = TRUE; self.iscreature = TRUE; @@ -439,7 +430,7 @@ void PutClientInServer (void) self.ammo_fuel = warmup_start_ammo_fuel; self.health = warmup_start_health; self.armorvalue = warmup_start_armorvalue; - self.weapons = warmup_start_weapons; + self.weapons = WARMUP_START_WEAPONS; } else { @@ -519,6 +510,9 @@ void PutClientInServer (void) spawnevent.owner = self; Net_LinkEntity(spawnevent, FALSE, 0.5, SpawnEvent_Send); + // Cut off any still running player sounds. + stopsound(self, CH_PLAYER_SINGLE); + self.model = ""; FixPlayermodel(); self.drawonlytoclient = world; @@ -538,6 +532,9 @@ void PutClientInServer (void) self.event_damage = PlayerDamage; self.bot_attack = TRUE; + self.monster_attack = TRUE; + + self.spider_slowness = 0; self.statdraintime = time + 5; self.BUTTON_ATCK = self.BUTTON_JUMP = self.BUTTON_ATCK2 = 0; @@ -554,11 +551,9 @@ void PutClientInServer (void) self.speedrunning = FALSE; - race_PostSpawn(spot); - //stuffcmd(self, "chase_active 0"); //stuffcmd(self, "set viewsize $tmpviewsize \n"); - + target_voicescript_clear(self); // reset fields the weapons may use @@ -766,7 +761,7 @@ void ClientKill_Now() if(!self.killindicator_teamchange) { self.vehicle_health = -1; - Damage(self, self, self, 1 , DEATH_KILL, self.origin, '0 0 0'); + Damage(self, self, self, 1 , DEATH_KILL, self.origin, '0 0 0'); } } @@ -934,7 +929,7 @@ void ClientKill (void) if(gameover) return; if(self.player_blocked) return; if(self.freezetag_frozen) return; - + ClientKill_TeamChange(0); } @@ -984,7 +979,7 @@ float PlayerInIDList(entity p, string idlist) string s; // NOTE: we do NOT check crypto_keyfp here, an unsigned ID is fine too for this - if not(p.crypto_idfp) + if (!p.crypto_idfp) return 0; // this function allows abbreviated player IDs too! @@ -1049,8 +1044,6 @@ void ClientConnect (void) anticheat_init(); - race_PreSpawnObserver(); - // identify the right forced team if(autocvar_g_campaign) { @@ -1201,27 +1194,7 @@ void ClientConnect (void) else self.hitplotfh = -1; - if(g_race || g_cts) { - string rr; - if(g_cts) - rr = CTS_RECORD; - else - rr = RACE_RECORD; - - msg_entity = self; - race_send_recordtime(MSG_ONE); - race_send_speedaward(MSG_ONE); - - speedaward_alltimebest = stof(db_get(ServerProgsDB, strcat(GetMapname(), rr, "speed/speed"))); - speedaward_alltimebest_holder = uid2name(db_get(ServerProgsDB, strcat(GetMapname(), rr, "speed/crypto_idfp"))); - race_send_speedaward_alltimebest(MSG_ONE); - - float i; - for (i = 1; i <= RANKINGS_CNT; ++i) { - race_SendRankings(i, 0, 0, MSG_ONE); - } - } - else if(autocvar_sv_teamnagger && !(autocvar_bot_vs_human && (c3==-1 && c4==-1)) && !g_ca) // teamnagger is currently bad for ca + if(autocvar_sv_teamnagger && !(autocvar_bot_vs_human && (c3==-1 && c4==-1)) && !g_ca && !g_cts && !g_race) // teamnagger is currently bad for ca, race & cts send_CSQC_teamnagger(); CheatInitClient(); @@ -1249,7 +1222,7 @@ void ClientDisconnect (void) if(self.vehicle) vehicles_exit(VHEF_RELESE); - if not(IS_CLIENT(self)) + if (!IS_CLIENT(self)) { print("Warning: ClientDisconnect without ClientConnect\n"); return; @@ -1277,7 +1250,7 @@ void ClientDisconnect (void) if(autocvar_sv_eventlog) GameLogEcho(strcat(":part:", ftos(self.playerid))); - + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_DISCONNECT, self.netname); MUTATOR_CALLHOOK(ClientDisconnect); @@ -1417,7 +1390,7 @@ void player_powerups (void) // add a way to see what the items were BEFORE all of these checks for the mutator hook olditems = self.items; - if((self.items & IT_USING_JETPACK) && !self.deadflag) + if((self.items & IT_USING_JETPACK) && !self.deadflag && !gameover) self.modelflags |= MF_ROCKET; else self.modelflags &= ~MF_ROCKET; @@ -1430,7 +1403,7 @@ void player_powerups (void) Fire_ApplyDamage(self); Fire_ApplyEffect(self); - if not(g_minstagib) + if (!g_minstagib) { if (self.items & IT_STRENGTH) { @@ -1516,7 +1489,7 @@ void player_powerups (void) self.superweapons_finished = 0; } } - + if(autocvar_g_nodepthtestplayers) self.effects = self.effects | EF_NODEPTHTEST; @@ -1577,44 +1550,51 @@ float CalcRotRegen(float current, float regenstable, float regenfactor, float re void player_regen (void) { - float minh, mina, minf, maxh, maxa, maxf, limith, limita, limitf, max_mod, regen_mod, rot_mod, limit_mod; - maxh = autocvar_g_balance_health_rotstable; - maxa = autocvar_g_balance_armor_rotstable; - maxf = autocvar_g_balance_fuel_rotstable; - minh = autocvar_g_balance_health_regenstable; - mina = autocvar_g_balance_armor_regenstable; - minf = autocvar_g_balance_fuel_regenstable; - limith = autocvar_g_balance_health_limit; - limita = autocvar_g_balance_armor_limit; - limitf = autocvar_g_balance_fuel_limit; - + float max_mod, regen_mod, rot_mod, limit_mod; max_mod = regen_mod = rot_mod = limit_mod = 1; + regen_mod_max = max_mod; + regen_mod_regen = regen_mod; + regen_mod_rot = rot_mod; + regen_mod_limit = limit_mod; + if(!MUTATOR_CALLHOOK(PlayerRegen)) + { + float minh, mina, maxh, maxa, limith, limita; + maxh = autocvar_g_balance_health_rotstable; + maxa = autocvar_g_balance_armor_rotstable; + minh = autocvar_g_balance_health_regenstable; + mina = autocvar_g_balance_armor_regenstable; + limith = autocvar_g_balance_health_limit; + limita = autocvar_g_balance_armor_limit; + + max_mod = regen_mod_max; + regen_mod = regen_mod_regen; + rot_mod = regen_mod_rot; + limit_mod = regen_mod_limit; - maxh = maxh * max_mod; - //maxa = maxa * max_mod; - //maxf = maxf * max_mod; - minh = minh * max_mod; - //mina = mina * max_mod; - //minf = minf * max_mod; - limith = limith * limit_mod; - limita = limita * limit_mod; - //limitf = limitf * limit_mod; - - if(g_ca) - rot_mod = 0; + maxh = maxh * max_mod; + minh = minh * max_mod; + limith = limith * limit_mod; + limita = limita * limit_mod; - if (!g_minstagib && !g_ca && (!g_lms || autocvar_g_lms_regenerate)) - { self.armorvalue = CalcRotRegen(self.armorvalue, mina, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished), maxa, autocvar_g_balance_armor_rot, autocvar_g_balance_armor_rotlinear, rot_mod * frametime * (time > self.pauserotarmor_finished), limita); self.health = CalcRotRegen(self.health, minh, autocvar_g_balance_health_regen, autocvar_g_balance_health_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished), maxh, autocvar_g_balance_health_rot, autocvar_g_balance_health_rotlinear, rot_mod * frametime * (time > self.pauserothealth_finished), limith); - - // if player rotted to death... die! - if(self.health < 1) - self.event_damage(self, self, 1, DEATH_ROT, self.origin, '0 0 0'); } - if not(self.items & IT_UNLIMITED_WEAPON_AMMO) - self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished) * ((self.items & IT_FUEL_REGEN) != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, rot_mod * frametime * (time > self.pauserotfuel_finished), limitf); + // if player rotted to death... die! + // check this outside above checks, as player may still be able to rot to death + if(self.health < 1) + self.event_damage(self, self, 1, DEATH_ROT, self.origin, '0 0 0'); + + if (!(self.items & IT_UNLIMITED_WEAPON_AMMO)) + { + float minf, maxf, limitf; + + maxf = autocvar_g_balance_fuel_rotstable; + minf = autocvar_g_balance_fuel_regenstable; + limitf = autocvar_g_balance_fuel_limit; + + self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, frametime * (time > self.pauseregen_finished) * ((self.items & IT_FUEL_REGEN) != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > self.pauserotfuel_finished), limitf); + } } float zoomstate_set; @@ -1730,7 +1710,7 @@ void SpectateCopy(entity spectatee) { setorigin(self, spectatee.origin); setsize(self, spectatee.mins, spectatee.maxs); SetZoomState(spectatee.zoomstate); - + anticheat_spectatecopy(spectatee); self.hud = spectatee.hud; if(spectatee.vehicle) @@ -1746,27 +1726,27 @@ void SpectateCopy(entity spectatee) { self.vehicle_reload2 = spectatee.vehicle_reload2; msg_entity = self; - + WriteByte (MSG_ONE, SVC_SETVIEWANGLES); WriteAngle(MSG_ONE, spectatee.v_angle_x); WriteAngle(MSG_ONE, spectatee.v_angle_y); WriteAngle(MSG_ONE, spectatee.v_angle_z); //WriteByte (MSG_ONE, SVC_SETVIEW); - // WriteEntity(MSG_ONE, self); + // WriteEntity(MSG_ONE, self); //makevectors(spectatee.v_angle); - //setorigin(self, spectatee.origin - v_forward * 400 + v_up * 300);*/ + //setorigin(self, spectatee.origin - v_forward * 400 + v_up * 300);*/ } } float SpectateUpdate() { if(!self.enemy) - return 0; + return 0; if (self == self.enemy) return 0; - if not(IS_PLAYER(self.enemy)) + if (!IS_PLAYER(self.enemy)) return 0; SpectateCopy(self.enemy); @@ -1820,13 +1800,13 @@ 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"); @@ -1834,7 +1814,7 @@ entity CA_SpectateNext(entity start) { other = find(other, classname, "player"); } } - + return other; } @@ -1861,7 +1841,7 @@ float SpectatePrev() { // NOTE: chain order is from the highest to the lower entnum (unlike find) other = findchain(classname, "player"); - if not(other) // no player + if (!other) // no player return FALSE; entity first = other; @@ -1875,7 +1855,7 @@ float SpectatePrev() do { other = other.chain; } while(other && other.team != self.team); - if not(other) + if (!other) { other = first; while(other.team != self.team) @@ -2135,7 +2115,7 @@ void SpectatorThink() void PlayerUseKey() { - if not(IS_PLAYER(self)) + if (!IS_PLAYER(self)) return; if(self.vehicle) @@ -2143,7 +2123,7 @@ void PlayerUseKey() vehicles_exit(VHEF_NORMAL); return; } - + // a use key was pressed; call handlers MUTATOR_CALLHOOK(PlayerUseKey); } @@ -2305,10 +2285,10 @@ void PlayerPreThink (void) if(frametime) player_anim(); button_pressed = (self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USE); - + if (self.deadflag == DEAD_DYING) { - if(self.respawn_flags & RESPAWN_FORCE) + if((self.respawn_flags & RESPAWN_FORCE) && !autocvar_g_respawn_delay_max) self.deadflag = DEAD_RESPAWNING; else if(!button_pressed) self.deadflag = DEAD_DEAD; @@ -2317,6 +2297,8 @@ void PlayerPreThink (void) { if(button_pressed) self.deadflag = DEAD_RESPAWNABLE; + else if(time >= self.respawn_time_max && (self.respawn_flags & RESPAWN_FORCE)) + self.deadflag = DEAD_RESPAWNING; } else if (self.deadflag == DEAD_RESPAWNABLE) { @@ -2328,6 +2310,7 @@ void PlayerPreThink (void) if(time > self.respawn_time) { self.respawn_time = time + 1; // only retry once a second + self.respawn_time_max = self.respawn_time; respawn(); } } @@ -2336,6 +2319,8 @@ void PlayerPreThink (void) if(self.respawn_flags & RESPAWN_SILENT) self.stat_respawn_time = 0; + else if((self.respawn_flags & RESPAWN_FORCE) && autocvar_g_respawn_delay_max) + self.stat_respawn_time = self.respawn_time_max; else self.stat_respawn_time = self.respawn_time; } @@ -2410,10 +2395,13 @@ void PlayerPreThink (void) if(frametime) player_anim(); - + // secret status secrets_setstatus(); - + + // monsters status + monsters_setstatus(); + self.dmg_team = max(0, self.dmg_team - autocvar_g_teamdamage_resetspeed * frametime); //self.angles_y=self.v_angle_y + 90; // temp @@ -2441,8 +2429,6 @@ void PlayerPreThink (void) if(self.spectatee_status != oldspectatee_status) { ClientData_Touch(self); - if(g_race || g_cts) - race_InitSpectator(); } if(self.teamkill_soundtime) @@ -2573,7 +2559,7 @@ void PlayerPostThink (void) return; // intermission or finale GetPressedKeys(); } - + #ifdef TETRIS } #endif @@ -2601,22 +2587,5 @@ void PlayerPostThink (void) playerdemo_write(); - if((g_cts || g_race) && self.cvar_cl_allow_uidtracking == 1 && self.cvar_cl_allow_uid2name == 1) - { - if not(self.stored_netname) - self.stored_netname = strzone(uid2name(self.crypto_idfp)); - if(self.stored_netname != self.netname) - { - db_put(ServerProgsDB, strcat("/uid2name/", self.crypto_idfp), self.netname); - strunzone(self.stored_netname); - self.stored_netname = strzone(self.netname); - } - } - - /* - if(g_race) - dprint(sprintf("%f %.6f\n", time, race_GetFractionalLapCount(self))); - */ - CSQCMODEL_AUTOUPDATE(); }