X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=fda3e902fa31649e8746faeaee0892a201755590;hb=28da13b2d80022464d46a2cf38ad2c86b65d6876;hp=e747918f693ce24a5e96f421fea196264e7ca923;hpb=d3c9fce4c6e5f38dbd8d9920dade95fac44bf0f2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index e747918f6..fda3e902f 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -13,10 +13,13 @@ void Announce(string snd) { } void AnnounceTo(entity e, string snd) { - msg_entity = e; - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_ANNOUNCE); - WriteString(MSG_ONE, snd); + if (clienttype(e) == CLIENTTYPE_REAL) + { + msg_entity = e; + WriteByte(MSG_ONE, SVC_TEMPENTITY); + WriteByte(MSG_ONE, TE_CSQC_ANNOUNCE); + WriteString(MSG_ONE, snd); + } } float ClientData_Send(entity to, float sf) @@ -395,8 +398,15 @@ Checks if the argument string can be a valid playermodel. Returns a valid one in doubt. ============= */ -string FallbackPlayerModel = "models/player/marine.zym"; +string FallbackPlayerModel; string CheckPlayerModel(string plyermodel) { + if(FallbackPlayerModel != cvar_defstring("_cl_playermodel")) + { + // note: we cannot summon Don Strunzone here, some player may + // still have the model string set. In case anyone manages how + // to change a cvar default, we'll have a small leak here. + FallbackPlayerModel = strzone(cvar_defstring("_cl_playermodel")); + } if(strlen(plyermodel) < 4) return FallbackPlayerModel; if( substring(plyermodel,0,14) != "models/player/") @@ -405,6 +415,7 @@ string CheckPlayerModel(string plyermodel) { { 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; @@ -504,7 +515,6 @@ float Client_customizeentityforclient() return TRUE; } -void UpdatePlayerSounds(); void setmodel_lod(entity e, string modelname) { string s; @@ -929,6 +939,7 @@ void PutClientInServer (void) self.nextthink = 0; self.hook_time = 0; self.dmg_team = 0; + self.ballistics_density = cvar("g_ballistics_density_player"); self.metertime = 0; @@ -1052,22 +1063,67 @@ float ClientInit_SendEntity(entity to, float sf) { WriteByte(MSG_ENTITY, ENT_CLIENT_INIT); WriteByte(MSG_ENTITY, g_nexball_meter_period * 32); - WriteCoord(MSG_ENTITY, hook_shotorigin_x); - WriteCoord(MSG_ENTITY, hook_shotorigin_y); - WriteCoord(MSG_ENTITY, hook_shotorigin_z); - + WriteInt24_t(MSG_ENTITY, compressShotOrigin(hook_shotorigin[0])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(hook_shotorigin[1])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(hook_shotorigin[2])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(hook_shotorigin[3])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[0])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[1])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[2])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[3])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[0])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[1])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[2])); + WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[3])); if(sv_foginterval && world.fog != "") WriteString(MSG_ENTITY, world.fog); else WriteString(MSG_ENTITY, ""); - WriteByte(MSG_ENTITY, cvar("g_balance_armor_blockpercent") * 255.0); - WriteByte(MSG_ENTITY, cvar("g_balance_weaponswitchdelay") * 255.0); + WriteByte(MSG_ENTITY, self.count * 255.0); // g_balance_armor_blockpercent + WriteByte(MSG_ENTITY, self.cnt * 255.0); // g_balance_weaponswitchdelay + WriteCoord(MSG_ENTITY, self.bouncefactor); // g_balance_grenadelauncher_secondary_bouncefactor + WriteCoord(MSG_ENTITY, self.bouncestop); // g_balance_grenadelauncher_secondary_bouncestop return TRUE; } +void ClientInit_CheckUpdate() +{ + self.nextthink = time; + if(self.count != cvar("g_balance_armor_blockpercent")) + { + self.count = cvar("g_balance_armor_blockpercent"); + self.SendFlags |= 1; + } + if(self.cnt != cvar("g_balance_weaponswitchdelay")) + { + self.cnt = cvar("g_balance_weaponswitchdelay"); + self.SendFlags |= 1; + } + if(self.bouncefactor != cvar("g_balance_grenadelauncher_secondary_bouncefactor")) + { + self.bouncefactor = cvar("g_balance_grenadelauncher_secondary_bouncefactor"); + self.SendFlags |= 1; + } + if(self.bouncestop != cvar("g_balance_grenadelauncher_secondary_bouncestop")) + { + self.bouncestop = cvar("g_balance_grenadelauncher_secondary_bouncestop"); + self.SendFlags |= 1; + } +} + void ClientInit_Spawn() { - Net_LinkEntity(spawn(), FALSE, 0, ClientInit_SendEntity); + entity o; + entity e; + e = spawn(); + e.classname = "clientinit"; + e.think = ClientInit_CheckUpdate; + Net_LinkEntity(e, FALSE, 0, ClientInit_SendEntity); + + o = self; + self = e; + ClientInit_CheckUpdate(); + self = o; } /* @@ -1347,6 +1403,10 @@ void ClientConnect (void) DecodeLevelParms(); +#ifdef WATERMARK + sprint(self, strcat("^4SVQC Build information: ", WATERMARK(), "\n")); +#endif + self.classname = "player_joining"; self.flags = FL_CLIENT; @@ -1744,10 +1804,31 @@ void UpdateTeamBubble() else self.colormod = '1 1 1'; };*/ +.float oldcolormap; void respawn(void) { + if(self.modelindex != 0 && cvar("g_respawn_ghosts")) + { + self.solid = SOLID_NOT; + self.takedamage = DAMAGE_NO; + self.movetype = MOVETYPE_FLY; + self.velocity = '0 0 1' * cvar("g_respawn_ghosts_speed"); + self.avelocity = randomvec() * cvar("g_respawn_ghosts_speed") * 3 - randomvec() * cvar("g_respawn_ghosts_speed") * 3; + self.effects |= EF_ADDITIVE; + self.oldcolormap = self.colormap; + self.colormap = 512; + pointparticles(particleeffectnum("respawn_ghost"), self.origin, '0 0 0', 1); + if(cvar("g_respawn_ghosts_maxtime")) + SUB_SetFade (self, time + cvar("g_respawn_ghosts_maxtime") / 2 + random () * (cvar("g_respawn_ghosts_maxtime") - cvar("g_respawn_ghosts_maxtime") / 2), 1.5); + } + CopyBody(1); self.effects |= EF_NODRAW; // prevent another CopyBody + if(self.oldcolormap) + { + self.colormap = self.oldcolormap; + self.oldcolormap = 0; + } PutClientInServer(); } @@ -2527,8 +2608,7 @@ void PlayerPreThink (void) if(frametime) { - if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6 - self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; + self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; player_powerups(); } @@ -2588,7 +2668,6 @@ void PlayerPreThink (void) FOR_EACH_PLAYER(other) if(self != other) { if(time > other.touchexplode_time) - if(other.classname == "player") if(other.deadflag == DEAD_NO) if not(IS_INDEPENDENT_PLAYER(other)) if(boxesoverlap(self.absmin, self.absmax, other.absmin, other.absmax)) @@ -2706,7 +2785,7 @@ void PlayerPreThink (void) } if(!zoomstate_set) - SetZoomState(self.BUTTON_ZOOM || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX)); + SetZoomState(self.BUTTON_ZOOM || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX) || (self.BUTTON_ATCK2 && self.weapon == WEP_CAMPINGRIFLE && cvar("g_balance_campingrifle_secondary") == 0)); float oldspectatee_status; oldspectatee_status = self.spectatee_status; @@ -2777,6 +2856,18 @@ Called every frame for each client after the physics are run ============= */ .float idlekick_lasttimeleft; +.entity showheadshotbbox; +void showheadshotbbox_think() +{ + if(self.owner.showheadshotbbox != self) + { + remove(self); + return; + } + self.nextthink = time; + setorigin(self, self.owner.origin); + setsize(self, GetHeadshotMins(self.owner), GetHeadshotMaxs(self.owner)); +} void PlayerPostThink (void) { // Savage: Check for nameless players @@ -2878,6 +2969,26 @@ void PlayerPostThink (void) if(self.waypointsprite_attachedforcarrier) WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, cvar("g_balance_armor_blockpercent"))); + if(self.classname == "player" && self.deadflag == DEAD_NO && cvar("r_showbboxes")) + { + if(!self.showheadshotbbox) + { + self.showheadshotbbox = spawn(); + self.showheadshotbbox.classname = "headshotbbox"; + self.showheadshotbbox.owner = self; + self.showheadshotbbox.think = showheadshotbbox_think; + self.showheadshotbbox.nextthink = time; + self = self.showheadshotbbox; + self.think(); + self = self.owner; + } + } + else + { + if(self.showheadshotbbox) + remove(self.showheadshotbbox); + } + playerdemo_write(); /*