X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_player.qc;h=d890f5d591ad49bc4ef21d0a9a2456704f5a5752;hb=4fc59bbd7e2d4f25ba21952ed50ae754295a7faa;hp=cc639e6b5d2fa5373d5c1c2bff15b7dc7246bcd8;hpb=4bac00fdbd1726c76efffcada6253259762f83c6;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index cc639e6b5..d890f5d59 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -111,6 +111,7 @@ void CopyBody(float keepvelocity) self.enemy = oldself; self.lip = oldself.lip; self.colormap = oldself.colormap; + self.glowmod = oldself.glowmod; self.iscreature = oldself.iscreature; self.angles = oldself.angles; self.avelocity = oldself.avelocity; @@ -142,6 +143,7 @@ void CopyBody(float keepvelocity) self.movetype = oldself.movetype; self.nextthink = oldself.nextthink; self.solid = oldself.solid; + self.ballistics_density = oldself.ballistics_density; self.takedamage = oldself.takedamage; self.think = oldself.think; self.customizeentityforclient = oldself.customizeentityforclient; @@ -165,62 +167,12 @@ void CopyBody(float keepvelocity) float player_getspecies() { - local float glob, i, j, fh, len, s, sk; - local string fn, l, file; - local float tokens; - - file = strcat(substring(self.model, 0, -5), ftos(self.skinindex)); // remove the extension at the end - PrecachePlayerSounds(file); - UpdatePlayerSounds(file); - - s = -1; - - glob = search_begin("models/player/*.txt", TRUE, TRUE); - if(glob < 0) - return s; - for(j = 0; j <= 1; ++j) - { - for(i = 0; i < search_getsize(glob); ++i) - { - fn = search_getfilename(glob, i); - fh = fopen(fn, FILE_READ); - if(fh < 0) - continue; - fgets(fh); fgets(fh); - sk = stof(fgets(fh)); - if(sk == (j ? 0 : self.skinindex)) // 2nd pass skips the skin test - if(fgets(fh) == self.model) - { - tokens = tokenizebyseparator(fn, "."); - - l = fgets(fh); - len = tokenize_console(l); - if (len != 2) - goto nospecies; - if (argv(0) != "species") - goto nospecies; - switch(argv(1)) - { - case "human": s = SPECIES_HUMAN; break; - case "alien": s = SPECIES_ALIEN; break; - case "robot_shiny": s = SPECIES_ROBOT_SHINY; break; - case "robot_rusty": s = SPECIES_ROBOT_RUSTY; break; - case "robot_solid": s = SPECIES_ROBOT_SOLID; break; - case "animal": s = SPECIES_ANIMAL; break; - case "reserved": s = SPECIES_RESERVED; break; - } - } -:nospecies - fclose(fh); - } - if (s >= 0) - break; - } - search_end(glob); - - if (s < 0) - s = SPECIES_HUMAN; - + float s; + get_model_parameters(self.playermodel, self.skinindex); + s = get_model_parameters_species; + get_model_parameters(string_null, 0); + if(s < 0) + return SPECIES_HUMAN; return s; } @@ -482,7 +434,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht else Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker); - if((g_arena && numspawned < 2) || (g_ca && player_cnt < 2) && !inWarmupStage) + if((g_arena && numspawned < 2) || (g_ca && ca_players < required_ca_players) && !inWarmupStage) return; if (!g_minstagib) @@ -536,15 +488,18 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(sound_allowed(MSG_BROADCAST, attacker)) if(!DEATH_ISWEAPON(deathtype, WEP_LASER) || attacker != self || self.health < 2 * cvar("g_balance_laser_primary_damage") * cvar("g_balance_selfdamagepercent") + 1) + if(self.health > 1) // exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two { - if(self.health > 75) // TODO make a "gentle" version? + if(deathtype == DEATH_FALL) + PlayerSound(playersound_fall, CHAN_PAIN, VOICETYPE_PLAYERSOUND); + else if(self.health > 75) // TODO make a "gentle" version? PlayerSound(playersound_pain100, CHAN_PAIN, VOICETYPE_PLAYERSOUND); else if(self.health > 50) PlayerSound(playersound_pain75, CHAN_PAIN, VOICETYPE_PLAYERSOUND); else if(self.health > 25) PlayerSound(playersound_pain50, CHAN_PAIN, VOICETYPE_PLAYERSOUND); - else if(self.health > 1) + else PlayerSound(playersound_pain25, CHAN_PAIN, VOICETYPE_PLAYERSOUND); } } @@ -643,6 +598,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht frag_attacker = attacker; frag_inflictor = inflictor; + frag_target = self; MUTATOR_CALLHOOK(PlayerDies); if(self.flagcarried) @@ -670,6 +626,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.movetype = MOVETYPE_TOSS; // shootable corpse self.solid = SOLID_CORPSE; + self.ballistics_density = cvar("g_ballistics_density_corpse"); // don't stick to the floor self.flags &~= FL_ONGROUND; // dying animation @@ -706,7 +663,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht // call the corpse damage function just in case it wants to gib self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force); // set up to fade out later - SUB_SetFade (self, time + 12 + random () * 4, 1); + SUB_SetFade (self, time + 6 + random (), 1); // remove laserdot if(self.weaponentity) @@ -901,6 +858,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f { string msgstr, colorstr, cmsgstr, namestr, fullmsgstr, sourcemsgstr, fullcmsgstr, sourcecmsgstr, privatemsgprefix; float flood, privatemsgprefixlen; + var .float flood_field; entity head; float ret; @@ -982,7 +940,6 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f float flood_spl; float flood_burst; float flood_lmax; - var .float flood_field; float lines; if(privatesay) { @@ -1044,10 +1001,10 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f else flood = 1; } - } - if (timeoutStatus == 2) //when game is paused, no flood protection - source.flood_field = flood = 0; + if (timeoutStatus == 2) //when game is paused, no flood protection + source.flood_field = flood = 0; + } if(flood == 2) // cannot happen for empty msgstr { @@ -1250,7 +1207,10 @@ void LoadPlayerSounds(string f, float first) var .string field; fh = fopen(f, FILE_READ); if(fh < 0) + { + dprint("Player sound file not found: ", f, "\n"); return; + } while((s = fgets(fh))) { if(tokenize_console(s) != 3) @@ -1271,17 +1231,17 @@ void LoadPlayerSounds(string f, float first) } .float modelindex_for_playersound; -void UpdatePlayerSounds(string filename) +.float skinindex_for_playersound; +void UpdatePlayerSounds() { if(self.modelindex == self.modelindex_for_playersound) + if(self.skinindex == self.skinindex_for_playersound) return; self.modelindex_for_playersound = self.modelindex; + self.skinindex_for_playersound = self.skinindex; ClearPlayerSounds(); LoadPlayerSounds("sound/player/default.sounds", 1); - if(filename != "") - LoadPlayerSounds(strcat(filename, ".sounds"), 0); - else - LoadPlayerSounds(strcat(self.model, ".sounds"), 0); // backwards compatibility + LoadPlayerSounds(get_model_datafilename(self.playermodel, self.skinindex, "sounds"), 0); } void FakeGlobalSound(string sample, float chan, float voicetype)