#include "tracing.qh"
-#include "../_all.qh"
#include "accuracy.qh"
#include "common.qh"
#include "hitplot.qh"
+#include "weaponsystem.qh"
#include "../g_damage.qh"
#include "../g_subs.qh"
#include "../antilag.qh"
-#include "../../common/constants.qh"
-#include "../../common/util.qh"
+#include <common/constants.qh>
+#include <common/util.qh>
-#include "../../common/weapons/all.qh"
+#include <common/weapons/all.qh>
-#include "../../warpzonelib/common.qh"
+#include <lib/warpzone/common.qh>
// this function calculates w_shotorg and w_shotdir based on the weapon model
// offset, trueaim and antilag, and won't put w_shotorg inside a wall.
float oldsolid;
vector vecs, dv;
oldsolid = ent.dphitcontentsmask;
- if(ent.weapon == WEP_RIFLE)
+ if (IS_PLAYER(ent) && PS(ent).m_weapon == WEP_RIFLE)
ent.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE;
else
ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
w_shotend = ent.origin + ent.view_ofs + s_forward * autocvar_g_trueaim_minrange;
// track max damage
- if(accuracy_canbegooddamage(ent))
- accuracy_add(ent, ent.weapon, maxdamage, 0);
+ if (IS_PLAYER(ent) && accuracy_canbegooddamage(ent))
+ accuracy_add(ent, PS(ent).m_weapon.m_id, maxdamage, 0);
- W_HitPlotAnalysis(ent, v_forward, v_right, v_up);
+ if(IS_PLAYER(ent))
+ W_HitPlotAnalysis(ent, v_forward, v_right, v_up);
- if(ent.weaponentity.movedir.x > 0)
- vecs = ent.weaponentity.movedir;
+ .entity weaponentity = weaponentities[0]; // TODO: unhardcode
+ vector md = ent.(weaponentity).movedir;
+ if(md.x > 0)
+ vecs = md;
else
vecs = '0 0 0';
if (trace_ent == ent.cursor_trace_ent)
w_shotdir = normalize(ent.cursor_trace_ent.origin - w_shotorg);
else
- print("antilag fail\n");
+ LOG_INFO("antilag fail\n");
}
}
}
if (snd != "")
{
- sound (ent, chan, snd, VOL_BASE, ATTN_NORM);
+ _sound (ent, chan, snd, VOL_BASE, ATTN_NORM);
W_PlayStrengthSound(ent);
}
float mspeed;
vector outvelocity;
- mvelocity = mvelocity * g_weaponspeedfactor;
+ mvelocity = mvelocity * W_WeaponSpeedFactor();
mdirection = normalize(mvelocity);
mspeed = vlen(mvelocity);
#if 0
mspercallsum += gettime(GETTIME_HIRES);
mspercallcount += 1;
- print("avg: ", ftos(mspercallcount / mspercallsum), " per sec\n");
+ LOG_INFO("avg: ", ftos(mspercallcount / mspercallsum), " per sec\n");
#endif
proj.velocity = W_CalculateProjectileVelocity(proj.owner.velocity, pSpeed * dir, forceAbsolute);
// ====================
void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype)
-{
+{SELFPARAM();
vector hitloc, force, endpoint, dir;
entity ent, endent;
float endq3surfaceflags;
//explosion = spawn();
// Find all non-hit players the beam passed close by
- if(deathtype == WEP_VAPORIZER || deathtype == WEP_VORTEX)
+ if(deathtype == WEP_VAPORIZER.m_id || deathtype == WEP_VORTEX.m_id)
{
- FOR_EACH_REALCLIENT(msg_entity)
- if(msg_entity != self)
- if(!msg_entity.railgunhit)
- if(!(IS_SPEC(msg_entity) && msg_entity.enemy == self)) // we use realclient, so spectators can hear the whoosh too
- {
- // nearest point on the beam
- beampos = start + dir * bound(0, (msg_entity.origin - start) * dir, length);
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != self, LAMBDA(
+ if(!it.railgunhit)
+ if(!(IS_SPEC(it) && it.enemy == self))
+ {
+ msg_entity = it;
+ // nearest point on the beam
+ beampos = start + dir * bound(0, (msg_entity.origin - start) * dir, length);
- f = bound(0, 1 - vlen(beampos - msg_entity.origin) / 512, 1);
- if(f <= 0)
- continue;
+ f = bound(0, 1 - vlen(beampos - msg_entity.origin) / 512, 1);
+ if(f <= 0)
+ continue;
- snd = strcat("weapons/nexwhoosh", ftos(floor(random() * 3) + 1), ".wav");
+ snd = SND(NEXWHOOSH_RANDOM());
- if(!pseudoprojectile)
- pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
- soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, snd, VOL_BASE * f, ATTEN_NONE);
- }
+ if(!pseudoprojectile)
+ pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
+ soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, snd, VOL_BASE * f, ATTEN_NONE);
+ }
+ ));
if(pseudoprojectile)
remove(pseudoprojectile);
}
// calculate hits and fired shots for hitscan
- accuracy_add(self, self.weapon, 0, min(bdamage, totaldmg));
+ accuracy_add(self, PS(self).m_weapon.m_id, 0, min(bdamage, totaldmg));
trace_endpos = endpoint;
trace_ent = endent;
}
void fireBullet(vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, int tracereffects)
-{
+{SELFPARAM();
vector end;
dir = normalize(dir + randomvec() * spread);
end = start + dir * MAX_SHOT_DISTANCE;
- entity pl;
fireBullet_last_hit = world;
float solid_penetration_left = 1;
float total_damage = 0;
if(tracereffects & EF_RED)
- fireBullet_trace_callback_eff = particleeffectnum("tr_rifle");
+ fireBullet_trace_callback_eff = EFFECT_RIFLE;
else if(tracereffects & EF_BLUE)
- fireBullet_trace_callback_eff = particleeffectnum("tr_rifle_weak");
+ fireBullet_trace_callback_eff = EFFECT_RIFLE_WEAK;
else
- fireBullet_trace_callback_eff = particleeffectnum("tr_bullet");
+ fireBullet_trace_callback_eff = EFFECT_BULLET;
float lag = ANTILAG_LATENCY(self);
if(lag < 0.001)
lag = 0; // only do hitscan, but no antilag
if(lag)
{
- FOR_EACH_PLAYER(pl)
- if(pl != self)
- antilag_takeback(pl, time - lag);
- FOR_EACH_MONSTER(pl)
- antilag_takeback(pl, time - lag);
+ FOREACH_CLIENT(IS_PLAYER(it) && it != self, LAMBDA(antilag_takeback(it, time - lag)));
+ FOREACH_ENTITY_FLAGS(flags, FL_MONSTER, LAMBDA(
+ if(it != self)
+ antilag_takeback(it, time - lag);
+ ));
}
WarpZone_trace_forent = self;
{
fireBullet_last_hit = hit;
yoda = 0;
+ MUTATOR_CALLHOOK(FireBullet_Hit, self, hit, start, end, damage);
+ damage = frag_damage;
float g = accuracy_isgooddamage(self, hit);
Damage(hit, self, self, damage * solid_penetration_left, dtype, start, force * dir * solid_penetration_left);
// calculate hits for ballistic weapons
// do not exceed 100%
float added_damage = min(damage - total_damage, damage * solid_penetration_left);
total_damage += damage * solid_penetration_left;
- accuracy_add(self, self.weapon, 0, added_damage);
+ accuracy_add(self, PS(self).m_weapon.m_id, 0, added_damage);
}
}
if(lag)
{
- FOR_EACH_PLAYER(pl)
- if(pl != self)
- antilag_restore(pl);
- FOR_EACH_MONSTER(pl)
- antilag_restore(pl);
+ FOREACH_CLIENT(IS_PLAYER(it) && it != self, LAMBDA(antilag_restore(it)));
+ FOREACH_ENTITY_FLAGS(flags, FL_MONSTER, LAMBDA(
+ if(it != self)
+ antilag_restore(it);
+ ));
}
}