X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fserver%2Fcl_client.qc;h=79c212f561ca8c3d4c3c162ba9098fe78d5affa0;hb=9f31b2438f27e46e900e4a9afe47fec5fcace088;hp=3d393755a0f3749d33793dc7b6de1e574c1284c2;hpb=85a0fa17b9dda5dc18a1e262a4e93ea1420daaa2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 3d393755a..79c212f56 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -311,7 +311,7 @@ entity SelectSpawnPoint (float anypoint) if (!spot) { if(autocvar_spawn_debug) - GotoNextMap(); + GotoNextMap(0); else { if(some_spawn_has_been_used) @@ -341,160 +341,36 @@ string CheckPlayerModel(string plyermodel) { // to change a cvar default, we'll have a small leak here. FallbackPlayerModel = strzone(cvar_defstring("_cl_playermodel")); } - if(strlen(plyermodel) < 4) - return FallbackPlayerModel; + // only in right path if( substring(plyermodel,0,14) != "models/player/") return FallbackPlayerModel; - else if(autocvar_sv_servermodelsonly) + // only good file extensions + if(substring(plyermodel,-4,4) != ".zym") + if(substring(plyermodel,-4,4) != ".dpm") + if(substring(plyermodel,-4,4) != ".iqm") + if(substring(plyermodel,-4,4) != ".md3") + if(substring(plyermodel,-4,4) != ".psk") + return FallbackPlayerModel; + // forbid the LOD models + if(substring(plyermodel, -9,5) == "_lod1") + return FallbackPlayerModel; + if(substring(plyermodel, -9,5) == "_lod2") + return FallbackPlayerModel; + if(plyermodel != strtolower(plyermodel)) + return FallbackPlayerModel; + // also, restrict to server models + if(autocvar_sv_servermodelsonly) { - if(substring(plyermodel,-4,4) != ".zym") - if(substring(plyermodel,-4,4) != ".dpm") - if(substring(plyermodel,-4,4) != ".iqm") - if(substring(plyermodel,-4,4) != ".md3") - if(substring(plyermodel,-4,4) != ".psk") - return FallbackPlayerModel; - // forbid the LOD models - if(substring(plyermodel, -9,5) == "_lod1") - return FallbackPlayerModel; - if(substring(plyermodel, -9,5) == "_lod2") - return FallbackPlayerModel; - if(plyermodel != strtolower(plyermodel)) - return FallbackPlayerModel; if(!fexists(plyermodel)) return FallbackPlayerModel; } return plyermodel; } -/* -============= -Client_customizeentityforclient - -LOD reduction -============= -*/ -void Client_uncustomizeentityforclient() +void setplayermodel(entity e, string modelname) { - if(self.modelindex == 0) // no need to uncustomize then - return; - self.modelindex = self.modelindex_lod0; - self.skin = self.skinindex; -} - -float Client_customizeentityforclient() -{ - entity modelsource; - - if(self.modelindex == 0) - return TRUE; - - // forcemodel stuff - -#ifdef PROFILING - float t0; - t0 = gettime(GETTIME_HIRES); // reference -#endif - - modelsource = self; - -#ifdef ALLOW_FORCEMODELS - if(other.cvar_cl_forceplayermodelsfromxonotic) - if not(self.modelindex_lod0_from_xonotic) - modelsource = other; - if(other.cvar_cl_forceplayermodels && sv_clforceplayermodels) - modelsource = other; -#endif - - self.skin = modelsource.skinindex; - -#if 0 - if(modelsource == self) - self.skin = modelsource.skinindex; - else - self.skin = mod(modelsource.skinindex, 3); // forbid the fbskins as forced skins -#endif - - // self: me - // other: the player viewing me - float distance; - float f; - - if(other.cvar_cl_playerdetailreduction <= 0) - { - if(other.cvar_cl_playerdetailreduction <= -2) - self.modelindex = modelsource.modelindex_lod2; - else if(other.cvar_cl_playerdetailreduction <= -1) - self.modelindex = modelsource.modelindex_lod1; - else - self.modelindex = modelsource.modelindex_lod0; - } - else - { - distance = vlen(self.origin - other.origin); - f = (distance + 100.0) * other.cvar_cl_playerdetailreduction; - if(f > sv_loddistance2) - self.modelindex = modelsource.modelindex_lod2; - else if(f > sv_loddistance1) - self.modelindex = modelsource.modelindex_lod1; - else - self.modelindex = modelsource.modelindex_lod0; - } - -#ifdef PROFILING - float t1; - t1 = gettime(GETTIME_HIRES); // reference - client_cefc_accumulator += (t1 - t0); -#endif - - return TRUE; -} - -void setmodel_lod(entity e, string modelname) -{ - string s; - - if(sv_loddistance1) - { - // FIXME: this only supports 3-letter extensions - s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4)); - if(fexists(s)) - { - setmodel(e, s); // players have high precision - self.modelindex_lod1 = self.modelindex; - } - else - self.modelindex_lod1 = -1; - - s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4)); - if(fexists(s)) - { - setmodel(e, s); // players have high precision - self.modelindex_lod2 = self.modelindex; - } - else - self.modelindex_lod2 = -1; - - precache_model(modelname); - setmodel(e, modelname); // players have high precision - self.modelindex_lod0 = self.modelindex; - - if(self.modelindex_lod1 < 0) - self.modelindex_lod1 = self.modelindex; - - if(self.modelindex_lod2 < 0) - self.modelindex_lod2 = self.modelindex; - } - else - { - precache_model(modelname); - setmodel(e, modelname); // players have high precision - self.modelindex_lod0 = self.modelindex; - // save it for possible player model forcing - } - - s = whichpack(self.model); - self.modelindex_lod0_from_xonotic = ((s == "") || (substring(s, 0, 4) == "data")); - + precache_model(modelname); + setmodel(e, modelname); player_setupanimsformodel(); UpdatePlayerSounds(); } @@ -590,7 +466,6 @@ void PutObserverInServer (void) self.pauseregen_finished = 0; self.damageforcescale = 0; self.death_time = 0; - self.dead_frame = 0; self.alpha = 0; self.scale = 0; self.fade_time = 0; @@ -609,16 +484,18 @@ void PutObserverInServer (void) self.fixangle = TRUE; self.crouch = FALSE; - 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, 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; self.model = ""; FixPlayermodel(); - self.model = ""; - self.modelindex = 0; + setmodel(self, "null"); + self.drawonlytoclient = self; + + setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY + self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS" + self.weapon = 0; self.weaponname = ""; self.switchingweapon = 0; @@ -633,9 +510,6 @@ void PutObserverInServer (void) self.oldvelocity = self.velocity; self.fire_endtime = -1; - if(sv_loddistance1) - SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient); - if(g_arena) { if(self.version_mismatch) @@ -709,42 +583,35 @@ void FixPlayermodel() } } - if(self.modelindex == 0 && self.deadflag == DEAD_NO) - { - if(self.model != "") - bprint("\{1}^1Player ", self.netname, "^1 has a zero modelindex, trying to fix...\n"); - self.model = ""; // force the != checks to return true - } - if(defaultmodel != "") { if (defaultmodel != self.model) { m1 = self.mins; m2 = self.maxs; - setmodel_lod (self, defaultmodel); + setplayermodel (self, defaultmodel); setsize (self, m1, m2); chmdl = TRUE; } - oldskin = self.skinindex; - self.skinindex = defaultskin; + oldskin = self.skin; + self.skin = defaultskin; } else { if (self.playermodel != self.model || self.playermodel == "") { self.playermodel = CheckPlayerModel(self.playermodel); // this is never "", so no endless loop m1 = self.mins; m2 = self.maxs; - setmodel_lod (self, self.playermodel); + setplayermodel (self, self.playermodel); setsize (self, m1, m2); chmdl = TRUE; } - oldskin = self.skinindex; - self.skinindex = stof(self.playerskin); + oldskin = self.skin; + self.skin = stof(self.playerskin); } - if(chmdl || oldskin != self.skinindex) + if(chmdl || oldskin != self.skin) self.species = player_getspecies(); // model or skin has changed if(!teamplay) @@ -849,6 +716,7 @@ void PutClientInServer (void) self.effects = EF_FULLBRIGHT; else self.effects = 0; + self.effects |= EF_TELEPORT_BIT | EF_RESTARTANIM_BIT; self.air_finished = time + 12; self.dmg = 2; if(autocvar_g_balance_nex_charge) @@ -907,8 +775,6 @@ void PutClientInServer (void) } self.damageforcescale = 2; self.death_time = 0; - self.dead_frame = 0; - self.alpha = 0; self.scale = 0; self.fade_time = 0; self.pain_frame = 0; @@ -946,11 +812,9 @@ void PutClientInServer (void) WriteByte(MSG_ONE, TE_CSQC_SPAWN); }); - if(sv_loddistance1) - SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient); - self.model = ""; FixPlayermodel(); + self.drawonlytoclient = world; self.crouch = FALSE; self.view_ofs = PL_VIEW_OFS; @@ -1249,7 +1113,7 @@ void KillIndicator_Think() return; } - if (!self.owner.modelindex) + if (self.owner.alpha < 0) { self.owner.killindicator = world; remove(self); @@ -1309,13 +1173,13 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 if(!self.killindicator) { - if(self.modelindex && self.deadflag == DEAD_NO) + if(self.deadflag == DEAD_NO) { killtime = max(killtime, self.clientkill_nexttime - time); self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam; } - if(killtime <= 0 || !self.modelindex || self.deadflag != DEAD_NO) + if(killtime <= 0 || self.classname != "player" || self.deadflag != DEAD_NO) { ClientKill_Now(); } @@ -1637,8 +1501,6 @@ void ClientConnect (void) else stuffcmd(self, "set _teams_available 0\n"); - stuffcmd(self, strcat("set gametype ", ftos(game), "\n")); - if(g_arena || g_ca) { self.classname = "observer"; @@ -1661,7 +1523,7 @@ void ClientConnect (void) } self.jointime = time; - self.allowedTimeouts = autocvar_sv_timeout_number; + self.allowed_timeouts = autocvar_sv_timeout_number; if(clienttype(self) == CLIENTTYPE_REAL) { @@ -1723,6 +1585,8 @@ void ClientConnect (void) if(!autocvar_g_campaign) Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0); + CSQCMODEL_AUTOINIT(); + self.model_randomizer = random(); } @@ -1831,7 +1695,7 @@ void ClientDisconnect (void) void ChatBubbleThink() { self.nextthink = time; - if (!self.owner.modelindex || self.owner.chatbubbleentity != self) + if ((self.owner.alpha < 0) || self.owner.chatbubbleentity != self) { if(self.owner) // but why can that ever be world? self.owner.chatbubbleentity = world; @@ -1850,7 +1714,7 @@ void ChatBubbleThink() void UpdateChatBubble() { - if (!self.modelindex) + if (self.alpha < 0) return; // spawn a chatbubble entity if needed if (!self.chatbubbleentity) @@ -1890,7 +1754,7 @@ void UpdateChatBubble() .float oldcolormap; void respawn(void) { - if(self.modelindex != 0 && autocvar_g_respawn_ghosts) + if(self.alpha >= 0 && autocvar_g_respawn_ghosts) { self.solid = SOLID_NOT; self.takedamage = DAMAGE_NO; @@ -1939,9 +1803,9 @@ void player_powerups (void) self.modelflags &~= MF_ROCKET; } - self.effects &~= (EF_DIMLIGHT | EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST); + self.effects &~= (EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST); - if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed + if(self.alpha < 0 || self.deadflag) // don't apply the flags if the player is gibbed return; Fire_ApplyDamage(self); @@ -1976,7 +1840,7 @@ void player_powerups (void) if (self.items & IT_INVINCIBLE) { play_countdown(self.invincible_finished, "misc/poweroff.wav"); - if (time > self.invincible_finished && autocvar_g_balance_powerup_timer) + if (time > self.invincible_finished) { self.items = self.items - (self.items & IT_INVINCIBLE); sprint(self, "^3Speed has worn off\n"); @@ -1997,7 +1861,7 @@ void player_powerups (void) { play_countdown(self.strength_finished, "misc/poweroff.wav"); self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > self.strength_finished && autocvar_g_balance_powerup_timer) + if (time > self.strength_finished) { self.items = self.items - (self.items & IT_STRENGTH); sprint(self, "^3Strength has worn off\n"); @@ -2015,7 +1879,7 @@ void player_powerups (void) { play_countdown(self.invincible_finished, "misc/poweroff.wav"); self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > self.invincible_finished && autocvar_g_balance_powerup_timer) + if (time > self.invincible_finished) { self.items = self.items - (self.items & IT_INVINCIBLE); sprint(self, "^3Shield has worn off\n"); @@ -2734,7 +2598,7 @@ void PlayerPreThink (void) } //don't allow the player to turn around while game is paused! - if(timeoutStatus == 2) { + if(timeout_status == TIMEOUT_ACTIVE) { // FIXME turn this into CSQC stuff self.v_angle = self.lastV_angle; self.angles = self.lastV_angle; @@ -2743,42 +2607,26 @@ void PlayerPreThink (void) if(frametime) { - if(self.health <= 0 && autocvar_g_deathglow) - { - if(self.glowmod_x > 0) - self.glowmod_x -= autocvar_g_deathglow * frametime; - else - self.glowmod_x = -1; - if(self.glowmod_y > 0) - self.glowmod_y -= autocvar_g_deathglow * frametime; - else - self.glowmod_y = -1; - if(self.glowmod_z > 0) - self.glowmod_z -= autocvar_g_deathglow * frametime; - else - self.glowmod_z = -1; - } - else +#ifndef NO_LEGACY_NETWORKING + self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; +#endif + + if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge) { - // set weapon and player glowmod - self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; + self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge) + if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit) { - self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - - if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit) - { - self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); - } + self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); } - else - self.weaponentity_glowmod = self.glowmod; } + else + self.weaponentity_glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; + player_powerups(); } @@ -3070,10 +2918,8 @@ void PlayerPostThink (void) stuffcmd(self, strcat("name ", self.netname, substring(ftos(random()), 2, -1), "\n")); } - if(sv_maxidle && frametime) + if(sv_maxidle && frametime) // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero). { - // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero). - float timeleft; if (time - self.parm_idlesince < 1) // instead of (time == self.parm_idlesince) to support sv_maxidle <= 10 { if(self.idlekick_lasttimeleft) @@ -3081,34 +2927,37 @@ void PlayerPostThink (void) Send_CSQC_Centerprint_Generic_Expire(self, CPID_DISCONNECT_IDLING); self.idlekick_lasttimeleft = 0; } - return; - } - timeleft = ceil(sv_maxidle - (time - self.parm_idlesince)); - if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10 - { - if(!self.idlekick_lasttimeleft) - Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft); } - if(timeleft <= 0) - { - bprint("^3", self.netname, "^3 was kicked for idling.\n"); - AnnounceTo(self, "terminated"); - dropclient(self); - return; - } - else if(timeleft <= 10) + else { - if(timeleft != self.idlekick_lasttimeleft) - AnnounceTo(self, ftos(timeleft)); - self.idlekick_lasttimeleft = timeleft; + float timeleft; + timeleft = ceil(sv_maxidle - (time - self.parm_idlesince)); + if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10 + { + if(!self.idlekick_lasttimeleft) + Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft); + } + if(timeleft <= 0) + { + bprint("^3", self.netname, "^3 was kicked for idling.\n"); + AnnounceTo(self, "terminated"); + dropclient(self); + return; + } + else if(timeleft <= 10) + { + if(timeleft != self.idlekick_lasttimeleft) + AnnounceTo(self, ftos(timeleft)); + self.idlekick_lasttimeleft = timeleft; + } } } #ifdef TETRIS if(self.impulse == 100) ImpulseCommands(); - if (TetrisPostFrame()) - return; + if (!TetrisPostFrame()) + { #endif CheatFrame(); @@ -3129,6 +2978,10 @@ void PlayerPostThink (void) //do nothing } +#ifdef TETRIS + } +#endif + /* float i; for(i = 0; i < 1000; ++i) @@ -3145,8 +2998,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) @@ -3191,4 +3042,6 @@ void PlayerPostThink (void) if(g_race) dprint(sprintf("%f %.6f\n", time, race_GetFractionalLapCount(self))); */ + + CSQCMODEL_AUTOUPDATE(); }