X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_player.qc;h=dafd7d2a6a18df714d1f8e7170b8e48b17db554f;hb=f9e4718d229df569d7878259d3db2bd2df1e7b91;hp=17569147fb091d9e08f9ee4ea7e877287c69f34d;hpb=a6a3b0cebd6928e3678ee4e97de4093f1b61c58b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 17569147f..dafd7d2a6 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -1,11 +1,33 @@ -.entity pusher; -.float pushltime; -.float istypefrag; +#include "cl_player.qh" + +#include "bot/bot.qh" +#include "cheats.qh" +#include "g_damage.qh" +#include "g_subs.qh" +#include "g_violence.qh" +#include "miscfunctions.qh" +#include "portals.qh" +#include "teamplay.qh" +#include "weapons/throwing.qh" +#include "command/common.qh" +#include "../common/animdecide.qh" +#include "../common/csqcmodel_settings.qh" +#include "../common/deathtypes.qh" +#include "../common/triggers/subs.qh" +#include "../common/playerstats.qh" +#include "../lib/csqcmodel/sv_model.qh" + +#include "../common/minigames/sv_minigames.qh" + +#include "../common/mutators/mutator/waypoints/waypointsprites.qh" +#include "../common/triggers/include.qh" + +#include "weapons/weaponstats.qh" + +#include "../common/animdecide.qh" -.float CopyBody_nextthink; -.void(void) CopyBody_think; void CopyBody_Think(void) -{ +{SELFPARAM(); if(self.CopyBody_nextthink && time > self.CopyBody_nextthink) { self.CopyBody_think(); @@ -15,89 +37,88 @@ void CopyBody_Think(void) self.CopyBody_think = self.think; self.think = CopyBody_Think; } - CSQCMODEL_AUTOUPDATE(); + CSQCMODEL_AUTOUPDATE(self); self.nextthink = time; } void CopyBody(float keepvelocity) -{ - entity oldself; +{SELFPARAM(); if (self.effects & EF_NODRAW) return; - oldself = self; - self = spawn(); - self.enemy = oldself; - self.lip = oldself.lip; - self.colormap = oldself.colormap; - self.iscreature = oldself.iscreature; - self.teleportable = oldself.teleportable; - self.damagedbycontents = oldself.damagedbycontents; - self.angles = oldself.angles; - self.v_angle = oldself.v_angle; - self.avelocity = oldself.avelocity; + setself(spawn()); + self.enemy = this; + self.lip = this.lip; + self.colormap = this.colormap; + self.iscreature = this.iscreature; + self.teleportable = this.teleportable; + self.damagedbycontents = this.damagedbycontents; + self.angles = this.angles; + self.v_angle = this.v_angle; + self.avelocity = this.avelocity; self.classname = "body"; - self.damageforcescale = oldself.damageforcescale; - self.effects = oldself.effects; - self.glowmod = oldself.glowmod; - self.event_damage = oldself.event_damage; - self.anim_state = oldself.anim_state; - self.anim_time = oldself.anim_time; - self.anim_lower_action = oldself.anim_lower_action; - self.anim_lower_time = oldself.anim_lower_time; - self.anim_upper_action = oldself.anim_upper_action; - self.anim_upper_time = oldself.anim_upper_time; - self.anim_implicit_state = oldself.anim_implicit_state; - self.anim_implicit_time = oldself.anim_implicit_time; - self.anim_lower_implicit_action = oldself.anim_lower_implicit_action; - self.anim_lower_implicit_time = oldself.anim_lower_implicit_time; - self.anim_upper_implicit_action = oldself.anim_upper_implicit_action; - self.anim_upper_implicit_time = oldself.anim_upper_implicit_time; - self.dphitcontentsmask = oldself.dphitcontentsmask; - self.death_time = oldself.death_time; - self.pain_finished = oldself.pain_finished; - self.health = oldself.health; - self.armorvalue = oldself.armorvalue; - self.armortype = oldself.armortype; - self.model = oldself.model; - self.modelindex = oldself.modelindex; - self.skin = oldself.skin; - self.species = oldself.species; - self.movetype = oldself.movetype; - self.solid = oldself.solid; - self.ballistics_density = oldself.ballistics_density; - self.takedamage = oldself.takedamage; - self.customizeentityforclient = oldself.customizeentityforclient; - self.uncustomizeentityforclient = oldself.uncustomizeentityforclient; - self.uncustomizeentityforclient_set = oldself.uncustomizeentityforclient_set; + self.damageforcescale = this.damageforcescale; + self.effects = this.effects; + self.glowmod = this.glowmod; + self.event_damage = this.event_damage; + self.anim_state = this.anim_state; + self.anim_time = this.anim_time; + self.anim_lower_action = this.anim_lower_action; + self.anim_lower_time = this.anim_lower_time; + self.anim_upper_action = this.anim_upper_action; + self.anim_upper_time = this.anim_upper_time; + self.anim_implicit_state = this.anim_implicit_state; + self.anim_implicit_time = this.anim_implicit_time; + self.anim_lower_implicit_action = this.anim_lower_implicit_action; + self.anim_lower_implicit_time = this.anim_lower_implicit_time; + self.anim_upper_implicit_action = this.anim_upper_implicit_action; + self.anim_upper_implicit_time = this.anim_upper_implicit_time; + self.dphitcontentsmask = this.dphitcontentsmask; + self.death_time = this.death_time; + self.pain_finished = this.pain_finished; + self.health = this.health; + self.armorvalue = this.armorvalue; + self.armortype = this.armortype; + self.model = this.model; + self.modelindex = this.modelindex; + self.skin = this.skin; + self.species = this.species; + self.movetype = this.movetype; + self.solid = this.solid; + self.ballistics_density = this.ballistics_density; + self.takedamage = this.takedamage; + self.customizeentityforclient = this.customizeentityforclient; + self.uncustomizeentityforclient = this.uncustomizeentityforclient; + self.uncustomizeentityforclient_set = this.uncustomizeentityforclient_set; if (keepvelocity == 1) - self.velocity = oldself.velocity; + self.velocity = this.velocity; self.oldvelocity = self.velocity; - self.alpha = oldself.alpha; - self.fade_time = oldself.fade_time; - self.fade_rate = oldself.fade_rate; - //self.weapon = oldself.weapon; - setorigin(self, oldself.origin); - setsize(self, oldself.mins, oldself.maxs); - self.prevorigin = oldself.origin; + self.alpha = this.alpha; + self.fade_time = this.fade_time; + self.fade_rate = this.fade_rate; + //self.weapon = this.weapon; + setorigin(self, this.origin); + setsize(self, this.mins, this.maxs); + self.prevorigin = this.origin; self.reset = SUB_Remove; - Drag_MoveDrag(oldself, self); + Drag_MoveDrag(this, self); if(self.colormap <= maxclients && self.colormap > 0) - self.colormap = 1024 + oldself.clientcolors; + self.colormap = 1024 + this.clientcolors; - CSQCMODEL_AUTOINIT(); - self.CopyBody_nextthink = oldself.nextthink; - self.CopyBody_think = oldself.think; + CSQCMODEL_AUTOINIT(self); + self.CopyBody_nextthink = this.nextthink; + self.CopyBody_think = this.think; self.nextthink = time; self.think = CopyBody_Think; // "bake" the current animation frame for clones (they don't get clientside animation) - animdecide_setframes(self, FALSE, frame, frame1time, frame2, frame2time); + animdecide_load_if_needed(self); + animdecide_setframes(self, false, frame, frame1time, frame2, frame2time); - self = oldself; + setself(this); } float player_getspecies() -{ +{SELFPARAM(); float s; get_model_parameters(self.model, self.skin); s = get_model_parameters_species; @@ -108,15 +129,15 @@ float player_getspecies() } void player_setupanimsformodel() -{ +{SELFPARAM(); // load animation info - animdecide_init(self); - animdecide_setstate(self, 0, FALSE); + animdecide_load_if_needed(self); + animdecide_setstate(self, 0, false); } void player_anim (void) -{ - float deadbits = (self.anim_state & (ANIMSTATE_DEAD1 | ANIMSTATE_DEAD2)); +{SELFPARAM(); + int deadbits = (self.anim_state & (ANIMSTATE_DEAD1 | ANIMSTATE_DEAD2)); if(self.deadflag) { if (!deadbits) { // Decide on which death animation to use. @@ -129,24 +150,26 @@ void player_anim (void) // Clear a previous death animation. deadbits = 0; } - float animbits = deadbits; + int animbits = deadbits; if(self.frozen) animbits |= ANIMSTATE_FROZEN; + if(self.movetype == MOVETYPE_FOLLOW) + animbits |= ANIMSTATE_FOLLOW; if(self.crouch) animbits |= ANIMSTATE_DUCK; - animdecide_setstate(self, animbits, FALSE); + animdecide_setstate(self, animbits, false); animdecide_setimplicitstate(self, (self.flags & FL_ONGROUND)); if (self.weaponentity) { updateanim(self.weaponentity); if (!self.weaponentity.animstate_override) - setanim(self.weaponentity, self.weaponentity.anim_idle, TRUE, FALSE, FALSE); + setanim(self.weaponentity, self.weaponentity.anim_idle, true, false, false); } } -void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ +void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) +{SELFPARAM(); float take, save; vector v; Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker); @@ -155,17 +178,17 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float damage = max(damage - 5, 1); v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage); - take = v_x; - save = v_y; + take = v.x; + save = v.y; if(sound_allowed(MSG_BROADCAST, attacker)) { if (save > 10) - sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTEN_NORM); + sound (self, CH_SHOTS, SND_ARMORIMPACT, VOL_BASE, ATTEN_NORM); else if (take > 30) - sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTEN_NORM); + sound (self, CH_SHOTS, SND_BODYIMPACT2, VOL_BASE, ATTEN_NORM); else if (take > 10) - sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM); + sound (self, CH_SHOTS, SND_BODYIMPACT1, VOL_BASE, ATTEN_NORM); } if (take > 50) @@ -173,13 +196,11 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float if (take > 100) Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker); - if (!(self.flags & FL_GODMODE)) - { - self.armorvalue = self.armorvalue - save; - self.health = self.health - take; - // pause regeneration for 5 seconds - self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_health_regen); - } + self.armorvalue = self.armorvalue - save; + self.health = self.health - take; + // pause regeneration for 5 seconds + self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_health_regen); + self.dmg_save = self.dmg_save + save;//max(save - 10, 0); self.dmg_take = self.dmg_take + take;//max(take - 10, 0); self.dmg_inflictor = inflictor; @@ -195,24 +216,12 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float self.alpha = -1; self.solid = SOLID_NOT; // restore later self.takedamage = DAMAGE_NO; // restore later - self.damagedbycontents = FALSE; + self.damagedbycontents = false; } } -// g__str: -// If 0, default is used. -// If <0, 0 is used. -// Otherwise, g_str (default value) is used. -// For consistency, negative values there are mapped to zero too. -#define GAMETYPE_DEFAULTED_SETTING(str) \ - ((gametype_setting_tmp = cvar(strcat("g_", GetGametype(), "_" #str))), \ - (gametype_setting_tmp < 0) ? 0 : \ - (gametype_setting_tmp == 0) ? max(0, autocvar_g_##str) : \ - gametype_setting_tmp) - - void calculate_player_respawn_time() -{ +{SELFPARAM(); if(g_ca) return; @@ -298,11 +307,10 @@ void calculate_player_respawn_time() self.respawn_flags = self.respawn_flags | RESPAWN_FORCE; } -void ClientKill_Now_TeamChange(); - -void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - float take, save, dh, da, j; +void PlayerDamage (entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) +{SELFPARAM(); + float take, save, dh, da; + int j; vector v; float valid_damage_for_weaponstats; float excess; @@ -317,14 +325,14 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht damage /= sqrt(bound(1.0, attacker.cvar_cl_handicap, 100.0)); } - if(DEATH_ISWEAPON(deathtype, WEP_TUBA)) + if(DEATH_ISWEAPON(deathtype, WEP_TUBA.m_id)) { // tuba causes blood to come out of the ears vector ear1, ear2; vector d; float f; ear1 = self.origin; - ear1_z += 0.125 * self.view_ofs_z + 0.875 * self.maxs_z; // 7/8 + ear1_z += 0.125 * self.view_ofs.z + 0.875 * self.maxs.z; // 7/8 ear2 = ear1; makevectors(self.angles); ear1 += v_right * -10; @@ -353,8 +361,8 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage); - take = v_x; - save = v_y; + take = v.x; + save = v.y; if(attacker == self) { @@ -380,14 +388,8 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.istypefrag = 0; } - frag_inflictor = inflictor; - frag_attacker = attacker; - frag_target = self; frag_damage = damage; - damage_take = take; - damage_save = save; - damage_force = force; - MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor); + MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor, inflictor, attacker, self, force, take, save); take = bound(0, damage_take, self.health); save = bound(0, damage_save, self.armorvalue); excess = max(0, damage - take - save); @@ -395,11 +397,11 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(sound_allowed(MSG_BROADCAST, attacker)) { if (save > 10) - sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTEN_NORM); + sound (self, CH_SHOTS, SND_ARMORIMPACT, VOL_BASE, ATTEN_NORM); else if (take > 30) - sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTEN_NORM); + sound (self, CH_SHOTS, SND_BODYIMPACT2, VOL_BASE, ATTEN_NORM); else if (take > 10) - sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM); // FIXME possibly remove them? + sound (self, CH_SHOTS, SND_BODYIMPACT1, VOL_BASE, ATTEN_NORM); // FIXME possibly remove them? } if (take > 50) @@ -427,9 +429,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if (!self.animstate_override) { if (random() > 0.5) - animdecide_setaction(self, ANIMACTION_PAIN1, TRUE); + animdecide_setaction(self, ANIMACTION_PAIN1, true); else - animdecide_setaction(self, ANIMACTION_PAIN2, TRUE); + animdecide_setaction(self, ANIMACTION_PAIN2, true); } } @@ -457,9 +459,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(IS_BOT_CLIENT(self) && self.health >= 1) { shake = damage * 5 / (bound(0,skill,100) + 1); - self.v_angle_x = self.v_angle_x + (random() * 2 - 1) * shake; - self.v_angle_y = self.v_angle_y + (random() * 2 - 1) * shake; - self.v_angle_x = bound(-90, self.v_angle_x, 90); + self.v_angle_x = self.v_angle.x + (random() * 2 - 1) * shake; + self.v_angle_y = self.v_angle.y + (random() * 2 - 1) * shake; + self.v_angle_x = bound(-90, self.v_angle.x, 90); } } else @@ -493,12 +495,13 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht dh = dh - max(self.health, 0); da = da - max(self.armorvalue, 0); WeaponStats_LogDamage(awep, abot, self.weapon, vbot, dh + da); + MUTATOR_CALLHOOK(PlayerDamaged, attacker, self, dh, da, hitloc); } if (self.health < 1) { float defer_ClientKill_Now_TeamChange; - defer_ClientKill_Now_TeamChange = FALSE; + defer_ClientKill_Now_TeamChange = false; if(self.alivetime) { @@ -524,46 +527,44 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht remove(self.killindicator); self.killindicator = world; if(self.killindicator_teamchange) - defer_ClientKill_Now_TeamChange = TRUE; + defer_ClientKill_Now_TeamChange = true; if(self.classname == "body") if(deathtype == DEATH_KILL) { // for the lemmings fans, a small harmless explosion - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); + Send_Effect(EFFECT_ROCKET_EXPLODE, self.origin, '0 0 0', 1); } } // print an obituary message - Obituary (attacker, inflictor, self, deathtype); + if(self.classname != "body") + Obituary (attacker, inflictor, self, deathtype); // increment frag counter for used weapon type - float w; - w = DEATH_WEAPONOF(deathtype); + int w = DEATH_WEAPONOF(deathtype); if(WEP_VALID(w)) if(accuracy_isgooddamage(attacker, self)) attacker.accuracy.(accuracy_frags[w-1]) += 1; - frag_attacker = attacker; - frag_inflictor = inflictor; - frag_target = self; - frag_deathtype = deathtype; - MUTATOR_CALLHOOK(PlayerDies); + MUTATOR_CALLHOOK(PlayerDies, inflictor, attacker, self, deathtype); + excess = frag_damage; - WEP_ACTION(self.weapon, WR_PLAYERDEATH); + Weapon wep = get_weaponinfo(self.weapon); + wep.wr_playerdeath(wep); RemoveGrapplingHook(self); Portal_ClearAllLater(self); - self.fixangle = TRUE; + self.fixangle = true; if(defer_ClientKill_Now_TeamChange) ClientKill_Now_TeamChange(); // can turn player into spectator // player could have been miraculously resuscitated ;) // e.g. players in freezetag get frozen, they don't really die - if(self.health >= 1 || !IS_PLAYER(self)) + if(self.health >= 1 || !(IS_PLAYER(self) || self.classname == "body")) return; // when we get here, player actually dies @@ -600,10 +601,10 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.death_time = time; if (random() < 0.5) - animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD1, TRUE); + animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD1, true); else - animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD2, TRUE); - if (self.maxs_z > 5) + animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD2, true); + if (self.maxs.z > 5) { self.maxs_z = 5; setsize(self, self.mins, self.maxs); @@ -612,24 +613,33 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.event_damage = PlayerCorpseDamage; // call the corpse damage function just in case it wants to gib self.event_damage(inflictor, attacker, excess, deathtype, hitloc, force); + // set up to fade out later SUB_SetFade (self, time + 6 + random (), 1); + // reset body think wrapper broken by SUB_SetFade + if(self.classname == "body" && self.think != CopyBody_Think) { + self.CopyBody_think = self.think; + self.CopyBody_nextthink = self.nextthink; + self.think = CopyBody_Think; + self.nextthink = time; + } - if(autocvar_sv_gentle > 0 || autocvar_ekg) { + if(autocvar_sv_gentle > 0 || autocvar_ekg || self.classname == "body") { // remove corpse + // clones don't run any animation code any more, so we must gib them when they die :( PlayerCorpseDamage (inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, hitloc, force); } // reset fields the weapons may use just in case for (j = WEP_FIRST; j <= WEP_LAST; ++j) { - WEP_ACTION(j, WR_RESETPLAYER); + Weapon w = get_weaponinfo(j); + w.wr_resetplayer(w); ATTACK_FINISHED_FOR(self, j) = 0; } } } -.float muted; // to be used by prvm_edictset server playernumber muted 1 float Say(entity source, float teamsay, entity privatesay, string msgin, float floodcontrol) // message "": do not say, just test flood control // return value: @@ -657,11 +667,11 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f else { colorstr = ""; - teamsay = FALSE; + teamsay = false; } if(intermission_running) - teamsay = FALSE; + teamsay = false; if(msgin != "") msgin = trigger_magicear_processmessage_forallears(source, teamsay, privatesay, msgin); @@ -702,12 +712,28 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f } else if(teamsay) { - msgstr = strcat("\{1}\{13}", colorstr, "(", colorprefix, namestr, colorstr, ") ^7", msgin); + if(strstrofs(msgin, "/me", 0) >= 0) + { + //msgin = strreplace("/me", "", msgin); + //msgin = substring(msgin, 3, strlen(msgin)); + msgin = strreplace("/me", strcat(colorstr, "(", colorprefix, namestr, colorstr, ")^7"), msgin); + msgstr = strcat("\{1}\{13}^4* ", "^7", msgin); + } + else + msgstr = strcat("\{1}\{13}", colorstr, "(", colorprefix, namestr, colorstr, ") ^7", msgin); cmsgstr = strcat(colorstr, "(", colorprefix, namestr, colorstr, ")\n^7", msgin); } else { - msgstr = strcat("\{1}", colorprefix, namestr, "^7: ", msgin); + if(strstrofs(msgin, "/me", 0) >= 0) + { + //msgin = strreplace("/me", "", msgin); + //msgin = substring(msgin, 3, strlen(msgin)); + msgin = strreplace("/me", strcat(colorprefix, namestr), msgin); + msgstr = strcat("\{1}^4* ", "^7", msgin); + } + else + msgstr = strcat("\{1}", colorprefix, namestr, "^7: ", msgin); cmsgstr = ""; } msgstr = strcat(strreplace("\n", " ", msgstr), "\n"); // newlines only are good for centerprint @@ -772,9 +798,9 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f flood = 2; } - if(time >= source.flood_field) + if (time >= source.(flood_field)) { - source.flood_field = max(time - flood_burst * flood_spl, source.flood_field) + lines * flood_spl; + source.(flood_field) = max(time - flood_burst * flood_spl, source.(flood_field)) + lines * flood_spl; } else { @@ -784,14 +810,14 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f } else { - if(time >= source.flood_field) - source.flood_field = max(time - flood_burst * flood_spl, source.flood_field) + flood_spl; + if (time >= source.(flood_field)) + source.(flood_field) = max(time - flood_burst * flood_spl, source.(flood_field)) + flood_spl; else flood = 1; } if (timeout_status == TIMEOUT_ACTIVE) // when game is paused, no flood protection - source.flood_field = flood = 0; + source.(flood_field) = flood = 0; } if(flood == 2) // cannot happen for empty msgstr @@ -823,7 +849,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f } if(flood) - print("NOTE: ", playername(source), "^7 is flooding.\n"); + LOG_INFO("NOTE: ", playername(source), "^7 is flooding.\n"); // build sourcemsgstr by cutting off a prefix and replacing it by the other one if(privatesay) @@ -836,9 +862,9 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f } else if(flood == 1) { - if(autocvar_g_chat_flood_notify_flooder) + if (autocvar_g_chat_flood_notify_flooder) { - sprint(source, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(source.flood_field - time), "^3 seconds\n")); + sprint(source, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(source.(flood_field) - time), "^3 seconds\n")); ret = 0; } else @@ -865,6 +891,15 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f if(cmsgstr != "") centerprint(privatesay, cmsgstr); } + else if ( teamsay && source.active_minigame ) + { + sprint(source, sourcemsgstr); + dedicated_print(msgstr); // send to server console too + FOR_EACH_REALCLIENT(head) + if(head != source) + if(head.active_minigame == source.active_minigame) + sprint(head, msgstr); + } else if(teamsay > 0) // team message, only sent to team mates { sprint(source, sourcemsgstr); @@ -911,7 +946,6 @@ float GetVoiceMessageVoiceType(string type) return VOICETYPE_TEAMRADIO; } -string allvoicesamples; .string GetVoiceMessageSampleField(string type) { GetPlayerSoundSampleField_notFound = 0; @@ -956,16 +990,15 @@ void PrecacheGlobalSound(string samplestring) void PrecachePlayerSounds(string f) { - float fh; - string s; - fh = fopen(f, FILE_READ); - if(fh < 0) + int fh = fopen(f, FILE_READ); + if (fh < 0) return; - while((s = fgets(fh))) + for (string s; (s = fgets(fh)); ) { - if(tokenize_console(s) != 3) + int n = tokenize_console(s); + if (n != 3) { - dprint("Invalid sound info line: ", s, "\n"); + if (n != 0) LOG_TRACEF("Invalid sound info line: %s\n", s); continue; } PrecacheGlobalSound(strcat(argv(1), " ", argv(2))); @@ -982,7 +1015,7 @@ void PrecachePlayerSounds(string f) } void ClearPlayerSounds() -{ +{SELFPARAM(); #define _VOICEMSG(m) if(self.playersound_##m) { strunzone(self.playersound_##m); self.playersound_##m = string_null; } ALLPLAYERSOUNDS ALLVOICEMSGS @@ -990,14 +1023,14 @@ void ClearPlayerSounds() } float LoadPlayerSounds(string f, float first) -{ +{SELFPARAM(); float fh; string s; var .string field; fh = fopen(f, FILE_READ); if(fh < 0) { - dprint("Player sound file not found: ", f, "\n"); + LOG_TRACE("Player sound file not found: ", f, "\n"); return 0; } while((s = fgets(fh))) @@ -1009,18 +1042,16 @@ float LoadPlayerSounds(string f, float first) field = GetVoiceMessageSampleField(argv(0)); if(GetPlayerSoundSampleField_notFound) continue; - if(self.field) - strunzone(self.field); - self.field = strzone(strcat(argv(1), " ", argv(2))); + if (self.(field)) + strunzone(self.(field)); + self.(field) = strzone(strcat(argv(1), " ", argv(2))); } fclose(fh); return 1; } -.float modelindex_for_playersound; -.float skin_for_playersound; void UpdatePlayerSounds() -{ +{SELFPARAM(); if(self.modelindex == self.modelindex_for_playersound) if(self.skin == self.skin_for_playersound) return; @@ -1034,7 +1065,7 @@ void UpdatePlayerSounds() } void FakeGlobalSound(string sample, float chan, float voicetype) -{ +{SELFPARAM(); float n; float tauntrand; @@ -1087,7 +1118,7 @@ void FakeGlobalSound(string sample, float chan, float voicetype) case VOICETYPE_TAUNT: if(IS_PLAYER(self)) if(self.deadflag == DEAD_NO) - animdecide_setaction(self, ANIMACTION_TAUNT, TRUE); + animdecide_setaction(self, ANIMACTION_TAUNT, true); if(!sv_taunt) break; if(autocvar_sv_gentle) @@ -1109,7 +1140,7 @@ void FakeGlobalSound(string sample, float chan, float voicetype) } void GlobalSound(string sample, float chan, float voicetype) -{ +{SELFPARAM(); float n; float tauntrand; @@ -1184,7 +1215,7 @@ void GlobalSound(string sample, float chan, float voicetype) case VOICETYPE_TAUNT: if(IS_PLAYER(self)) if(self.deadflag == DEAD_NO) - animdecide_setaction(self, ANIMACTION_TAUNT, TRUE); + animdecide_setaction(self, ANIMACTION_TAUNT, true); if(!sv_taunt) break; if(autocvar_sv_gentle) @@ -1198,7 +1229,7 @@ void GlobalSound(string sample, float chan, float voicetype) } break; case VOICETYPE_PLAYERSOUND: - sound(self, chan, sample, VOL_BASE, ATTEN_NORM); + _sound(self, chan, sample, VOL_BASE, ATTEN_NORM); break; default: backtrace("Invalid voice type!"); @@ -1207,16 +1238,15 @@ void GlobalSound(string sample, float chan, float voicetype) } void PlayerSound(.string samplefield, float chan, float voicetype) -{ - GlobalSound(self.samplefield, chan, voicetype); +{SELFPARAM(); + GlobalSound(self.(samplefield), chan, voicetype); } void VoiceMessage(string type, string msg) -{ - var .string sample; +{SELFPARAM(); float voicetype, ownteam; float flood; - sample = GetVoiceMessageSampleField(type); + var .string sample = GetVoiceMessageSampleField(type); if(GetPlayerSoundSampleField_notFound) { @@ -1229,10 +1259,10 @@ void VoiceMessage(string type, string msg) flood = Say(self, ownteam, world, msg, 1); - if(IS_SPEC(self) || IS_OBSERVER(self) || flood < 0) - FakeGlobalSound(self.sample, CH_VOICE, voicetype); + if (IS_SPEC(self) || IS_OBSERVER(self) || flood < 0) + FakeGlobalSound(self.(sample), CH_VOICE, voicetype); else if (flood > 0) - GlobalSound(self.sample, CH_VOICE, voicetype); + GlobalSound(self.(sample), CH_VOICE, voicetype); } void MoveToTeam(entity client, float team_colour, float type)