X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=527216340145463f8cc321a048a61cdf3a7d2b77;hb=c7df878d742427829b294ae9043a64e98aa00c8d;hp=655eed0fa7151f3eff0cd8612e8a52b39cdf1e64;hpb=50700eaa76837175f29f1f366c39adbde1cfdc19;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 655eed0fa..527216340 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -404,8 +404,7 @@ void PutObserverInServer (void) DropAllRunes(self); MUTATOR_CALLHOOK(MakePlayerObserver); - if (g_minstagib) - minstagib_stop_countdown(); + minstagib_stop_countdown(self); Portal_ClearAll(self); @@ -416,13 +415,7 @@ void PutObserverInServer (void) } if(self.vehicle) - vehicles_exit(VHEF_RELESE); - - if(self.flagcarried) - ctf_Handle_Drop(self); // FIXCTF - - if(self.ballcarried && g_nexball) - DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity); + vehicles_exit(VHEF_RELESE); WaypointSprite_PlayerDead(); @@ -452,6 +445,7 @@ void PutObserverInServer (void) self.classname = "observer"; self.iscreature = FALSE; + self.teleportable = TELEPORT_SIMPLE; self.damagedbycontents = FALSE; self.health = -666; self.takedamage = DAMAGE_NO; @@ -476,6 +470,7 @@ void PutObserverInServer (void) self.invincible_finished = 0; self.superweapons_finished = 0; self.pushltime = 0; + self.istypefrag = 0; self.think = SUB_Null; self.nextthink = 0; self.hook_time = 0; @@ -489,7 +484,7 @@ void PutObserverInServer (void) setorigin (self, (spot.origin + PL_VIEW_OFS)); // offset it so that the spectator spawns higher off the ground, looks better this way self.prevorigin = self.origin; self.items = 0; - self.weapons = 0; + WEPSET_CLEAR_E(self); self.model = ""; FixPlayermodel(); setmodel(self, "null"); @@ -551,11 +546,11 @@ void FixPlayermodel() vector m1, m2; defaultmodel = ""; + defaultskin = 0; + chmdl = FALSE; if(autocvar_sv_defaultcharacter == 1) { - defaultskin = 0; - if(teamplay) { string s; @@ -644,12 +639,14 @@ PutClientInServer Called when a client spawns in the server ============= */ -//void() ctf_playerchanged; + void PutClientInServer (void) { if(clienttype(self) == CLIENTTYPE_BOT) { self.classname = "player"; + if(g_ca) + self.caplayer = 1; } else if(clienttype(self) == CLIENTTYPE_REAL) { @@ -657,7 +654,7 @@ void PutClientInServer (void) WriteByte(MSG_ONE, SVC_SETVIEW); WriteEntity(MSG_ONE, self); } - + // reset player keys self.itemkeys = 0; @@ -669,8 +666,7 @@ void PutClientInServer (void) self.classname = "observer"; } - if(g_arena || (g_ca && !allowed_to_spawn)) - if(!self.spawned) + if((g_arena && !self.spawned) || (g_ca && !allowed_to_spawn)) self.classname = "observer"; if(gameover) @@ -699,6 +695,7 @@ void PutClientInServer (void) self.classname = "player"; self.wasplayer = TRUE; self.iscreature = TRUE; + self.teleportable = TELEPORT_NORMAL; self.damagedbycontents = TRUE; self.movetype = MOVETYPE_WALK; self.solid = SOLID_SLIDEBOX; @@ -737,7 +734,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; + WEPSET_COPY_EA(self, warmup_start_weapons); } else { @@ -748,10 +745,10 @@ void PutClientInServer (void) self.ammo_fuel = start_ammo_fuel; self.health = start_health; self.armorvalue = start_armorvalue; - self.weapons = start_weapons; + WEPSET_COPY_EA(self, start_weapons); } - if(self.weapons & WEPBIT_SUPERWEAPONS) // exception for minstagib, as minstanex is a superweapon + if(WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS)) // exception for minstagib, as minstanex is a superweapon self.superweapons_finished = time + autocvar_g_balance_superweapons_time; else self.superweapons_finished = 0; @@ -759,10 +756,10 @@ void PutClientInServer (void) if(g_weaponarena_random) { if(g_weaponarena_random_with_laser) - self.weapons &~= WEPBIT_LASER; - self.weapons = randombits(self.weapons, g_weaponarena_random, FALSE); + WEPSET_ANDNOT_EW(self, WEP_LASER); + W_RandomWeapons(self, g_weaponarena_random); if(g_weaponarena_random_with_laser) - self.weapons |= WEPBIT_LASER; + WEPSET_OR_EW(self, WEP_LASER); } self.items = start_items; @@ -834,13 +831,12 @@ void PutClientInServer (void) self.lastrocket = world; // stop rocket guiding, no revenge from the grave! self.lastteleporttime = time; // prevent insane speeds due to changing origin self.hud = HUD_NORMAL; - + if(g_arena) { Spawnqueue_Remove(self); Spawnqueue_Mark(self); } - else if(g_ca) self.caplayer = 1; @@ -870,9 +866,6 @@ void PutClientInServer (void) //stuffcmd(self, "chase_active 0"); //stuffcmd(self, "set viewsize $tmpviewsize \n"); - if (autocvar_g_spawnsound) - sound (self, CH_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM); - if(g_assault) { if(self.team == assault_attacker_team) centerprint(self, "You are attacking!"); @@ -924,12 +917,12 @@ void PutClientInServer (void) self.alivetime = time; antilag_clear(self); - } else if(self.classname == "observer" || (g_ca && !allowed_to_spawn)) { + + if (autocvar_g_spawnsound) + soundat(world, self.origin, CH_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM); + } else if(self.classname == "observer") { PutObserverInServer (); } - - //if(g_ctf) - // ctf_playerchanged(); } .float ebouncefactor, ebouncestop; // electro's values @@ -1072,8 +1065,7 @@ void ClientKill_Now_TeamChange() { if(self.killindicator_teamchange == -1) { - self.team = -1; - JoinBestTeam( self, FALSE, FALSE ); + JoinBestTeam( self, FALSE, TRUE ); } else if(self.killindicator_teamchange == -2) { @@ -1121,7 +1113,7 @@ void KillIndicator_Think() return; } - if (self.owner.alpha < 0) + if (self.owner.alpha < 0 && !self.owner.vehicle) { self.owner.killindicator = world; remove(self); @@ -1343,7 +1335,6 @@ ClientConnect Called when a client connects to the server ============= */ -//void ctf_clientconnect(); string ColoredTeamName(float t); void DecodeLevelParms (void); //void dom_player_join_team(entity pl); @@ -1358,7 +1349,7 @@ void ClientConnect (void) return; } - if(Ban_MaybeEnforceBan(self)) + if(Ban_MaybeEnforceBanOnce(self)) return; DecodeLevelParms(); @@ -1442,7 +1433,7 @@ void ClientConnect (void) } else { if(teamplay) { - if(autocvar_g_balance_teams || autocvar_g_balance_teams_force) + if(autocvar_g_balance_teams) { self.classname = "player"; campaign_bots_may_start = 1; @@ -1515,10 +1506,6 @@ void ClientConnect (void) if(g_arena) Spawnqueue_Insert(self); } - /*else if(g_ctf) - { - ctf_clientconnect(); - }*/ attach_entcs(); @@ -1535,7 +1522,7 @@ void ClientConnect (void) if(clienttype(self) == CLIENTTYPE_REAL) { - if(autocvar_g_bugrigs || g_weaponarena == WEPBIT_TUBA) + if(autocvar_g_bugrigs || WEPSET_EQ_AW(g_weaponarena_weapons, WEP_TUBA)) stuffcmd(self, "cl_cmd settemp chase_active 1\n"); } @@ -1567,7 +1554,6 @@ void ClientConnect (void) rr = CTS_RECORD; else rr = RACE_RECORD; - t = stof(db_get(ServerProgsDB, strcat(GetMapname(), rr, "time"))); msg_entity = self; race_send_recordtime(MSG_ONE); @@ -1596,8 +1582,14 @@ void ClientConnect (void) CSQCMODEL_AUTOINIT(); self.model_randomizer = random(); + + if(clienttype(self) != CLIENTTYPE_REAL) + return; + + sv_notice_join(); + + MUTATOR_CALLHOOK(ClientConnect); } - /* ============= ClientDisconnect @@ -1651,10 +1643,6 @@ void ClientDisconnect (void) Portal_ClearAll(self); RemoveGrapplingHook(self); - if(self.flagcarried) - ctf_Handle_Drop(self); // FIXCTF - 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. @@ -1896,9 +1884,7 @@ void player_powerups (void) } if (self.items & IT_SUPERWEAPON) { - //if(W_WeaponBit(self.weapon) & WEPBIT_SUPERWEAPONS) - // self.effects = self.effects | EF_RED; - if (!(self.weapons & WEPBIT_SUPERWEAPONS)) + if (!WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS)) { self.superweapons_finished = 0; self.items = self.items - (self.items & IT_SUPERWEAPON); @@ -1914,12 +1900,12 @@ void player_powerups (void) if (time > self.superweapons_finished) { self.items = self.items - (self.items & IT_SUPERWEAPON); - self.weapons &~= WEPBIT_SUPERWEAPONS; + WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS); sprint(self, "^3Superweapons have broken down\n"); } } } - else if(self.weapons & WEPBIT_SUPERWEAPONS) + else if(WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS)) { if (time < self.superweapons_finished || (self.items & IT_UNLIMITED_SUPERWEAPONS)) { @@ -1929,7 +1915,7 @@ void player_powerups (void) else { self.superweapons_finished = 0; - self.weapons &~= WEPBIT_SUPERWEAPONS; // just in case + WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS); } } else @@ -2126,6 +2112,15 @@ void GetPressedKeys(void) { self.pressedkeys |= KEY_CROUCH; else self.pressedkeys &~= KEY_CROUCH; + + if (self.BUTTON_ATCK) + self.pressedkeys |= KEY_ATCK; + else + self.pressedkeys &~= KEY_ATCK; + if (self.BUTTON_ATCK2) + self.pressedkeys |= KEY_ATCK2; + else + self.pressedkeys &~= KEY_ATCK2; } /* @@ -2156,7 +2151,7 @@ void SpectateCopy(entity spectatee) { self.strength_finished = spectatee.strength_finished; self.invincible_finished = spectatee.invincible_finished; self.pressedkeys = spectatee.pressedkeys; - self.weapons = spectatee.weapons; + WEPSET_COPY_EE(self, spectatee); self.switchweapon = spectatee.switchweapon; self.switchingweapon = spectatee.switchingweapon; self.weapon = spectatee.weapon; @@ -2166,29 +2161,24 @@ void SpectateCopy(entity spectatee) { self.minelayer_mines = spectatee.minelayer_mines; self.punchangle = spectatee.punchangle; self.view_ofs = spectatee.view_ofs; - self.v_angle = spectatee.v_angle; self.velocity = spectatee.velocity; self.dmg_take = spectatee.dmg_take; self.dmg_save = spectatee.dmg_save; self.dmg_inflictor = spectatee.dmg_inflictor; + self.v_angle = spectatee.v_angle; self.angles = spectatee.v_angle; if(!self.BUTTON_USE) self.fixangle = TRUE; setorigin(self, spectatee.origin); setsize(self, spectatee.mins, spectatee.maxs); SetZoomState(spectatee.zoomstate); - - anticheat_spectatecopy(spectatee); - - //self.vehicle = spectatee.vehicle; - + + anticheat_spectatecopy(spectatee); self.hud = spectatee.hud; if(spectatee.vehicle) { - setorigin(self, spectatee.origin); - self.velocity = spectatee.vehicle.velocity; - self.v_angle += spectatee.vehicle.angles; - //self.v_angle_x *= -1; + self.fixangle = FALSE; + //self.velocity = spectatee.vehicle.velocity; self.vehicle_health = spectatee.vehicle_health; self.vehicle_shield = spectatee.vehicle_shield; self.vehicle_energy = spectatee.vehicle_energy; @@ -2196,11 +2186,18 @@ void SpectateCopy(entity spectatee) { self.vehicle_ammo2 = spectatee.vehicle_ammo2; self.vehicle_reload1 = spectatee.vehicle_reload1; self.vehicle_reload2 = spectatee.vehicle_reload2; - + msg_entity = self; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity(MSG_ONE, spectatee); - //self.tur_head = spectatee.vehicle.vehicle_viewport; + + 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); + //makevectors(spectatee.v_angle); + //setorigin(self, spectatee.origin - v_forward * 400 + v_up * 300);*/ } } @@ -2243,8 +2240,13 @@ entity CA_SpectateNext(entity start) { return other; } -float SpectateNext() { - other = find(self.enemy, classname, "player"); +float SpectateNext(entity _prefer) { + + if(_prefer) + other = _prefer; + else + 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); @@ -2258,17 +2260,19 @@ float SpectateNext() { self.enemy = other; if(self.enemy.classname == "player") { - if(self.enemy.vehicle) + /*if(self.enemy.vehicle) { + msg_entity = self; - WriteByte(MSG_ONE, SVC_SETVIEWPORT); + 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); @@ -2278,7 +2282,7 @@ float SpectateNext() { if(!SpectateUpdate()) PutObserverInServer(); - } + //} return 1; } else { return 0; @@ -2314,11 +2318,11 @@ 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"; - if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force) + if(autocvar_g_campaign || autocvar_g_balance_teams) JoinBestTeam(self, FALSE, TRUE); if(autocvar_g_campaign) @@ -2364,26 +2368,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; + float totalClients = 0; FOR_EACH_CLIENT(e) - totalClients += 1; + if(e != ignore) + totalClients += 1; if (!autocvar_g_maxplayers) - return maxclients - totalClients + includeMe; + return maxclients - totalClients; - float currentlyPlaying; + float currentlyPlaying = 0; 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; } @@ -2446,7 +2460,7 @@ void ObserverThink() self.flags |= FL_SPAWNING; } else if(self.BUTTON_ATCK && !self.version_mismatch) { self.flags &~= FL_JUMPRELEASED; - if(SpectateNext() == 1) { + if(SpectateNext(world) == 1) { self.classname = "spectator"; } } else { @@ -2477,7 +2491,7 @@ void SpectatorThink() self.flags |= FL_SPAWNING; } else if(self.BUTTON_ATCK) { self.flags &~= FL_JUMPRELEASED; - if(SpectateNext() == 1) { + if(SpectateNext(world) == 1) { self.classname = "spectator"; } else { self.classname = "observer"; @@ -2534,7 +2548,6 @@ Called every frame for each client before the physics are run ============= */ .float usekeypressed; -//void() ctf_setstatus; void() nexball_setstatus; .float items_added; void PlayerPreThink (void) @@ -2544,6 +2557,7 @@ void PlayerPreThink (void) self.stat_game_starttime = game_starttime; self.stat_allow_oldnexbeam = autocvar_g_allow_oldnexbeam; self.stat_leadlimit = autocvar_leadlimit; + self.stat_respawn_time = self.respawn_time; if(frametime) { @@ -2717,6 +2731,11 @@ void PlayerPreThink (void) } ShowRespawnCountdown(); } + + // if respawning, invert stat_respawn_time to indicate this, the client translates it + if(self.deadflag == DEAD_RESPAWNING && self.stat_respawn_time > 0) + self.stat_respawn_time *= -1; + return; } // FIXME from now on self.deadflag is always 0 (and self.health is never < 1) @@ -2771,7 +2790,8 @@ void PlayerPreThink (void) self.prevorigin = self.origin; - if (((self.BUTTON_CROUCH && !self.hook.state) || self.health <= g_bloodloss) && self.animstate_startframe != self.anim_melee_x) // prevent crouching if using melee attack + if (!self.vehicle) + if (((self.BUTTON_CROUCH && !self.hook.state) || self.health <= g_bloodloss) && self.animstate_startframe != self.anim_melee_x && !self.freezetag_frozen) // prevent crouching if using melee attack { if (!self.crouch) { @@ -2832,9 +2852,6 @@ void PlayerPreThink (void) if(frametime) player_anim(); - //if(g_ctf) - // ctf_setstatus(); - if(g_nexball) nexball_setstatus(); @@ -3037,8 +3054,6 @@ void PlayerPostThink (void) } */ - Arena_Warmup(); - //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1); if(self.waypointsprite_attachedforcarrier)