vector traceorigin = entcs_receiver(player_localentnum - 1).origin + (eZ * STAT(VIEWHEIGHT));
- vecs = decompressShotOrigin(STAT(SHOTORG));
+ vecs = STAT(SHOTORG);
traceline(traceorigin, traceorigin + view_forward * max_shot_distance, mv, ta);
trueaimpoint = trace_endpos;
if(vdist((trueaimpoint - traceorigin), <, g_trueaim_minrange))
trueaimpoint = traceorigin + view_forward * g_trueaim_minrange;
- if(vecs.x > 0)
- vecs.y = -vecs.y;
- else
- vecs = '0 0 0';
+ vecs.y = -vecs.y;
dv = view_right * vecs.y + view_up * vecs.z;
w_shotorg = traceorigin + dv;
{
nb_pb_period = ReadByte() / 32; //Accuracy of 1/32th
- hook_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
- hook_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
- hook_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
- hook_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
- arc_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
- arc_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
- arc_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
- arc_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
+ hook_shotorigin[0] = ReadVector();
+ hook_shotorigin[1] = ReadVector();
+ hook_shotorigin[2] = ReadVector();
+ hook_shotorigin[3] = ReadVector();
+ arc_shotorigin[0] = ReadVector();
+ arc_shotorigin[1] = ReadVector();
+ arc_shotorigin[2] = ReadVector();
+ arc_shotorigin[3] = ReadVector();
strcpy(forcefog, ReadString());
/** arc heat in [0,1] */
REGISTER_STAT(PRESSED_KEYS, int)
REGISTER_STAT(FUEL, int)
-/** compressShotOrigin */
-REGISTER_STAT(SHOTORG, int)
+REGISTER_STAT(SHOTORG, vector)
REGISTER_STAT(LEADLIMIT, float, autocvar_leadlimit)
REGISTER_STAT(LEADLIMIT_AND_FRAGLIMIT, float, autocvar_leadlimit_and_fraglimit)
return myvel + spd * mydir;
}
-float compressShotOrigin(vector v)
-{
- float rx = rint(v.x * 2);
- float ry = rint(v.y * 4) + 128;
- float rz = rint(v.z * 4) + 128;
- if(rx > 255 || rx < 0)
- {
- LOG_DEBUG("shot origin ", vtos(v), " x out of bounds\n");
- rx = bound(0, rx, 255);
- }
- if(ry > 255 || ry < 0)
- {
- LOG_DEBUG("shot origin ", vtos(v), " y out of bounds\n");
- ry = bound(0, ry, 255);
- }
- if(rz > 255 || rz < 0)
- {
- LOG_DEBUG("shot origin ", vtos(v), " z out of bounds\n");
- rz = bound(0, rz, 255);
- }
- return rx * 0x10000 + ry * 0x100 + rz;
-}
-vector decompressShotOrigin(int f)
-{
- vector v;
- v.x = ((f & 0xFF0000) / 0x10000) / 2;
- v.y = ((f & 0xFF00) / 0x100 - 128) / 4;
- v.z = ((f & 0xFF) - 128) / 4;
- return v;
-}
-
#ifdef GAMEQC
vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype)
{
vector solve_shotdirection(vector myorg, vector myvel, vector eorg, vector evel, float spd, float newton_style);
vector get_shotvelocity(vector myvel, vector mydir, float spd, float newton_style, float mi, float ma);
-float compressShotOrigin(vector v);
-vector decompressShotOrigin(float f);
-
#ifdef SVQC
string rankings_reply, ladder_reply, lsmaps_reply, maplist_reply, monsterlist_reply; // cached replies
string records_reply[10];
this.view_ofs = '0 0 0';
this.movedir_aligned = this.movedir;
- if (this.movedir.x >= 0)
- {
- //int algn = STAT(GUNALIGN, this.owner);
- int algn = W_GunAlign(this, STAT(GUNALIGN, this.owner));
- #ifdef SVQC
- this.m_gunalign = algn;
- #endif
- vector v = this.movedir;
- this.movedir = shotorg_adjust(v, false, false, algn);
- this.movedir_aligned = shotorg_adjust(v, false, true, algn);
- this.view_ofs = this.movedir_aligned - v;
- }
- int compressed_shotorg = compressShotOrigin(this.movedir);
- // make them match perfectly
+ //int algn = STAT(GUNALIGN, this.owner);
+ int algn = W_GunAlign(this, STAT(GUNALIGN, this.owner));
+#ifdef SVQC
+ this.m_gunalign = algn;
+#endif
+ vector v = this.movedir;
+ this.movedir = shotorg_adjust(v, false, false, algn);
+ this.movedir_aligned = shotorg_adjust(v, false, true, algn);
+ this.view_ofs = this.movedir_aligned - v;
+
#ifdef SVQC
// null during init
- if (this.owner) STAT(SHOTORG, this.owner) = compressed_shotorg;
+ if (this.owner) STAT(SHOTORG, this.owner) = this.movedir;
#endif
- this.movedir = decompressShotOrigin(compressed_shotorg);
#ifdef SVQC
this.spawnorigin += this.view_ofs; // offset the casings origin by the same amount
rlplayer = csqcplayer; // fall back to the global
vector md = wepent.movedir_aligned;
- vector vecs = ((md.x > 0) ? md : '0 0 0');
- vector dv = forward * vecs.x + right * -vecs.y + up * vecs.z;
+ vector dv = forward * md.x + right * -md.y + up * md.z;
vector org = rlplayer.origin + rlplayer.view_ofs + dv;
pointparticles(thiswep.m_muzzleeffect, org, forward * 1000, 1);
makevectors(actor.v_angle);
w_shotdir = v_forward;
vector md = actor.(weaponentity).movedir;
- vector vecs = ((md.x > 0) ? md : '0 0 0');
- vector dv = v_forward * vecs.x + v_right * -vecs.y + v_up * vecs.z;
+ vector dv = v_forward * md.x + v_right * -md.y + v_up * md.z;
w_shotorg = actor.origin + actor.view_ofs + dv;
//W_SetupShot_Range(actor,weaponentity,false,0,SND_Null,0,0,0,thiswep.m_id);
f = 1;
vector md = this.realowner.(weaponentity).movedir;
- vector vecs = ((md.x > 0) ? md : '0 0 0');
- vector dv = v_right * -vecs.y + v_up * vecs.z;
+ vector dv = v_right * -md.y + v_up * md.z;
if(!W_DualWielding(this.realowner))
dv = '0 0 0'; // don't override!
int channel = MSG_ONE;
WriteHeader(channel, ENT_CLIENT_INIT);
WriteByte(channel, g_nexball_meter_period * 32);
- WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[0]));
- WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[1]));
- WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[2]));
- WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[3]));
- WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[0]));
- WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[1]));
- WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[2]));
- WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[3]));
+ WriteVector(channel, hook_shotorigin[0]);
+ WriteVector(channel, hook_shotorigin[1]);
+ WriteVector(channel, hook_shotorigin[2]);
+ WriteVector(channel, hook_shotorigin[3]);
+ WriteVector(channel, arc_shotorigin[0]);
+ WriteVector(channel, arc_shotorigin[1]);
+ WriteVector(channel, arc_shotorigin[2]);
+ WriteVector(channel, arc_shotorigin[3]);
if(autocvar_sv_foginterval && world.fog != "")
WriteString(channel, world.fog);
#if 0
// code stolen from W_SetupShot_Dir_ProjectileSize_Range()
vector md = targ.(weaponentity).movedir;
- vector vecs = ((md.x > 0) ? md : '0 0 0');
- vector dv = v_right * -vecs.y + v_up * vecs.z;
+ vector dv = v_right * -md.y + v_up * md.z;
vector mi = '0 0 0', ma = '0 0 0';
if(IS_CLIENT(targ)) // no antilag for non-clients!
center.z = trace_endpos.z;
#else
- // very cheap way but it skips movedir.x > 0 checks and move into solid checks which is fine most of the time for now AFAIK
- // this should only really be an issue with absurd g_shootfromfixedorigin custom values like "-1 0 9001"
+ // very cheap way but it skips move into solid checks which is fine most of the time for now AFAIK
+ // this should only really be an issue with absurd g_shootfromfixedorigin custom values like "0 0 9001"
center.z = center.z + targ.(weaponentity).movedir.z;
#endif
}
{
.entity weaponentity = weaponentities[slot];
vector md = this.(weaponentity).movedir;
- vector vecs = ((md.x > 0) ? md : '0 0 0');
- vector dv = v_right * -vecs.y;
+ vector dv = v_right * -md.y;
if(!is_dualwielding)
dv = '0 0 0'; // don't override!
W_ThrowWeapon(this, weaponentity, W_CalculateProjectileVelocity(this, this.velocity, v_forward * 750, false), dv, true);
if(IS_PLAYER(ent))
W_HitPlotAnalysis(ent, wep, forward, right, up);
- vector md = ent.(weaponentity).movedir;
- vector vecs = ((md.x > 0) ? md : '0 0 0');
-
- vector dv = right * -vecs.y + up * vecs.z;
+ vector md = ent.(weaponentity).movedir; // read shot origin offset, like g_shootfromcenter
+ //print(sprintf("offset of %s: %v\n\n", ent.(weaponentity).m_weapon.netname, md));
+ vector dv = right * -md.y + up * md.z;
w_shotorg = ent.origin + ent.view_ofs;
+
+ // move the shotorg sideways and vertically as much as requested if possible
if(antilag)
{
if(CS(ent).antilag_debug)
if(antilag)
{
if(CS(ent).antilag_debug)
- tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (vecs.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug);
+ tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug);
else
- tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (vecs.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
+ tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
}
else
- tracebox(w_shotorg, mi, ma, w_shotorg + forward * (vecs.x + nudge), MOVE_NORMAL, ent);
+ tracebox(w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent);
w_shotorg = trace_endpos - forward * nudge;
+
// calculate the shotdir from the chosen shotorg
if(W_DualWielding(ent))
w_shotdir = s_forward;