CLASS(Arc, Weapon)
/* ammotype */ ATTRIB(Arc, ammo_field, .int, ammo_cells);
/* impulse */ ATTRIB(Arc, impulse, int, 3);
-/* flags */ ATTRIB(Arc, spawnflags, int, WEP_FLAG_NORMAL);
-/* rating */ ATTRIB(Arc, bot_pickupbasevalue, float, BOT_PICKUP_RATING_HIGH);
+/* flags */ ATTRIB(Arc, spawnflags, int, WEP_TYPE_HITSCAN);
+/* rating */ ATTRIB(Arc, bot_pickupbasevalue, float, 8000);
/* color */ ATTRIB(Arc, wpcolor, vector, '1 1 1');
/* modelname */ ATTRIB(Arc, mdl, string, "arc");
#ifdef GAMEQC
#endif
#ifdef SVQC
.entity arc_beam;
-.bool arc_BUTTON_ATCK_prev[MAX_WEAPONSLOTS]; // for better animation control
+.bool arc_BUTTON_ATCK_prev; // for better animation control
.float beam_prev;
.float beam_initialized;
.float beam_bursting;
if(drawlocal) { sf &= ~ARC_SF_LOCALMASK; }
WriteByte(MSG_ENTITY, sf);
+ WriteByte(MSG_ENTITY, weaponslot(this.weaponentity_fld));
if(sf & ARC_SF_SETTINGS) // settings information
{
{
entity missile;
- W_DecreaseAmmo(thiswep, actor, WEP_CVAR(arc, bolt_ammo));
+ W_DecreaseAmmo(thiswep, actor, WEP_CVAR(arc, bolt_ammo), weaponentity);
W_SetupShot(actor, weaponentity, false, 2, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage));
void W_Arc_Beam_Think(entity this)
{
.entity weaponentity = this.weaponentity_fld;
- if(this != this.owner.(weaponentity).arc_beam)
+ entity own = this.owner;
+ if(this != own.(weaponentity).arc_beam)
{
delete(this);
return;
}
float burst = 0;
- if( (PHYS_INPUT_BUTTON_ATCK2(this.owner) && !WEP_CVAR(arc, bolt)) || this.beam_bursting)
+ if( (PHYS_INPUT_BUTTON_ATCK2(own) && !WEP_CVAR(arc, bolt)) || this.beam_bursting)
{
if(!this.beam_bursting)
this.beam_bursting = true;
Weapon thiswep = WEP_ARC;
if(
- !IS_PLAYER(this.owner)
+ !IS_PLAYER(own)
||
- (this.owner.(thiswep.ammo_field) <= 0 && !(this.owner.items & IT_UNLIMITED_WEAPON_AMMO))
+ (!thiswep.wr_checkammo1(thiswep, own, weaponentity) && !(own.items & IT_UNLIMITED_WEAPON_AMMO))
||
- IS_DEAD(this.owner)
+ IS_DEAD(own)
||
- forbidWeaponUse(this.owner)
+ forbidWeaponUse(own)
||
- PS(this.owner).m_switchweapon != WEP_ARC
+ own.(weaponentity).m_switchweapon != WEP_ARC
||
- (!PHYS_INPUT_BUTTON_ATCK(this.owner) && !burst )
+ (!PHYS_INPUT_BUTTON_ATCK(own) && !burst )
||
- this.owner.vehicle
+ own.vehicle
||
(WEP_CVAR(arc, overheat_max) > 0 && this.beam_heat >= WEP_CVAR(arc, overheat_max))
)
if ( cooldown_speed )
{
if ( WEP_CVAR(arc, cooldown_release) || (WEP_CVAR(arc, overheat_max) > 0 && this.beam_heat >= WEP_CVAR(arc, overheat_max)) )
- this.owner.arc_overheat = time + this.beam_heat / cooldown_speed;
- this.owner.arc_cooldown = cooldown_speed;
+ own.arc_overheat = time + this.beam_heat / cooldown_speed;
+ own.arc_cooldown = cooldown_speed;
}
if ( WEP_CVAR(arc, overheat_max) > 0 && this.beam_heat >= WEP_CVAR(arc, overheat_max) )
}
}
- if(this == this.owner.(weaponentity).arc_beam) { this.owner.(weaponentity).arc_beam = NULL; }
- entity own = this.owner;
- Weapon w = WEP_ARC;
- if(!w.wr_checkammo1(w, own) && !w.wr_checkammo2(w, own))
- if(!(own.items & IT_UNLIMITED_WEAPON_AMMO))
+ if(this == own.(weaponentity).arc_beam) { own.(weaponentity).arc_beam = NULL; }
+ if(!thiswep.wr_checkammo1(thiswep, own, weaponentity) && !(own.items & IT_UNLIMITED_WEAPON_AMMO))
{
// note: this doesn't force the switch
- W_SwitchToOtherWeapon(own);
+ W_SwitchToOtherWeapon(own, weaponentity);
+ own.(weaponentity).arc_BUTTON_ATCK_prev = false; // hax
}
delete(this);
return;
// decrease ammo
float coefficient = frametime;
- if(!(this.owner.items & IT_UNLIMITED_WEAPON_AMMO))
+ if(!(own.items & IT_UNLIMITED_WEAPON_AMMO))
{
float rootammo;
if(burst)
if(rootammo)
{
- coefficient = min(coefficient, this.owner.(thiswep.ammo_field) / rootammo);
- this.owner.(thiswep.ammo_field) = max(0, this.owner.(thiswep.ammo_field) - (rootammo * frametime));
+ coefficient = min(coefficient, own.(thiswep.ammo_field) / rootammo);
+ own.(thiswep.ammo_field) = max(0, own.(thiswep.ammo_field) - (rootammo * frametime));
}
}
float heat_speed = burst ? WEP_CVAR(arc, burst_heat) : WEP_CVAR(arc, beam_heat);
this.beam_heat = min( WEP_CVAR(arc, overheat_max), this.beam_heat + heat_speed*frametime );
- makevectors(this.owner.v_angle);
+ makevectors(own.v_angle);
W_SetupShot_Range(
- this.owner,
+ own,
weaponentity, // TODO
true,
0,
);
// After teleport, "lock" the beam until the teleport is confirmed.
- if (time < this.beam_teleporttime + ANTILAG_LATENCY(this.owner)) {
+ if (time < this.beam_teleporttime + ANTILAG_LATENCY(own)) {
w_shotdir = this.beam_dir;
}
vector new_dir = normalize(new_origin - last_origin);
WarpZone_traceline_antilag(
- this.owner,
+ own,
last_origin,
new_origin,
MOVE_NORMAL,
- this.owner,
- ANTILAG_LATENCY(this.owner)
+ own,
+ ANTILAG_LATENCY(own)
);
// Do all the transforms for warpzones right now, as we already
vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, hitorigin) - w_shotorg)
);
- if(is_player && SAME_TEAM(this.owner, trace_ent))
+ if(is_player && SAME_TEAM(own, trace_ent))
{
float roothealth, rootarmor;
if(burst)
else
{ rootdamage = WEP_CVAR(arc, beam_nonplayerdamage); }
- if(accuracy_isgooddamage(this.owner, trace_ent))
+ if(accuracy_isgooddamage(own, trace_ent))
{
accuracy_add(
- this.owner,
+ own,
WEP_ARC.m_id,
0,
rootdamage * coefficient * falloff
Damage(
trace_ent,
- this.owner,
- this.owner,
+ own,
+ own,
rootdamage * coefficient * falloff,
WEP_ARC.m_id,
hitorigin,
this.beam_type = new_beam_type;
}
- this.owner.beam_prev = time;
+ own.(weaponentity).beam_prev = time;
this.nextthink = time;
}
{
// only play fire sound if 1 sec has passed since player let go the fire button
- if(time - actor.beam_prev > 1)
+ if(time - actor.(weaponentity).beam_prev > 1)
sound(actor, CH_WEAPON_A, SND_ARC_FIRE, VOL_BASE, ATTN_NORM);
entity beam = actor.(weaponentity).arc_beam = new(W_Arc_Beam);
}
if ( actor.arc_smoke_sound && ( actor.arc_overheat <= time ||
- !( PHYS_INPUT_BUTTON_ATCK(actor) || PHYS_INPUT_BUTTON_ATCK2(actor) ) ) || PS(actor).m_switchweapon != WEP_ARC )
+ !( PHYS_INPUT_BUTTON_ATCK(actor) || PHYS_INPUT_BUTTON_ATCK2(actor) ) ) || actor.(weaponentity).m_switchweapon != WEP_ARC )
{
actor.arc_smoke_sound = 0;
sound(actor, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
}
}
-METHOD(Arc, wr_aim, void(entity thiswep, entity actor))
+METHOD(Arc, wr_aim, void(entity thiswep, entity actor, .entity weaponentity))
{
if(WEP_CVAR(arc, beam_botaimspeed))
{
PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(
actor,
+ weaponentity,
WEP_CVAR(arc, beam_botaimspeed),
0,
WEP_CVAR(arc, beam_botaimlifetime),
{
PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(
actor,
+ weaponentity,
1000000,
0,
0.001,
Arc_Smoke(actor, weaponentity);
bool beam_fire2 = ((fire & 2) && !WEP_CVAR(arc, bolt));
- int slot = weaponslot(weaponentity);
if (time >= actor.arc_overheat)
if ((fire & 1) || beam_fire2 || actor.(weaponentity).arc_beam.beam_bursting)
{
- if(actor.arc_BUTTON_ATCK_prev[slot])
+ if(actor.(weaponentity).arc_BUTTON_ATCK_prev)
{
#if 0
if(actor.animstate_startframe == actor.anim_shoot.x && actor.animstate_numframes == actor.anim_shoot.y)
{
W_Arc_Beam(boolean(beam_fire2), actor, weaponentity);
- if(!actor.arc_BUTTON_ATCK_prev[slot])
+ if(!actor.(weaponentity).arc_BUTTON_ATCK_prev)
{
weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready);
- actor.arc_BUTTON_ATCK_prev[slot] = true;
+ actor.(weaponentity).arc_BUTTON_ATCK_prev = true;
}
}
}
}
}
- if(actor.arc_BUTTON_ATCK_prev[slot])
+ if(actor.(weaponentity).arc_BUTTON_ATCK_prev)
{
+ int slot = weaponslot(weaponentity);
sound(actor, CH_WEAPON_A, SND_ARC_STOP, VOL_BASE, ATTN_NORM);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready);
ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor(actor);
}
- actor.arc_BUTTON_ATCK_prev[slot] = false;
+ actor.(weaponentity).arc_BUTTON_ATCK_prev = false;
#if 0
if(fire & 2)
arc_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ARC.m_id), false, false, 4);
}
}
-METHOD(Arc, wr_checkammo1, bool(entity thiswep, entity actor))
+METHOD(Arc, wr_checkammo1, bool(entity thiswep, entity actor, .entity weaponentity))
{
return ((!WEP_CVAR(arc, beam_ammo)) || (actor.(thiswep.ammo_field) > 0));
}
-METHOD(Arc, wr_checkammo2, bool(entity thiswep, entity actor))
+METHOD(Arc, wr_checkammo2, bool(entity thiswep, entity actor, .entity weaponentity))
{
if(WEP_CVAR(arc, bolt))
{
float ammo_amount = actor.(thiswep.ammo_field) >= WEP_CVAR(arc, bolt_ammo);
- ammo_amount += actor.(weapon_load[WEP_ARC.m_id]) >= WEP_CVAR(arc, bolt_ammo);
+ ammo_amount += actor.(weaponentity).(weapon_load[WEP_ARC.m_id]) >= WEP_CVAR(arc, bolt_ammo);
return ammo_amount;
}
else
else
return WEAPON_ARC_MURDER;
}
-METHOD(Arc, wr_drop, void(entity thiswep, entity actor))
+METHOD(Arc, wr_drop, void(entity thiswep, entity actor, .entity weaponentity))
{
weapon_dropevent_item.arc_overheat = actor.arc_overheat;
weapon_dropevent_item.arc_cooldown = actor.arc_cooldown;
actor.arc_overheat = 0;
actor.arc_cooldown = 0;
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- actor.arc_BUTTON_ATCK_prev[slot] = false;
+ actor.(weaponentity).arc_BUTTON_ATCK_prev = false;
}
-METHOD(Arc, wr_pickup, void(entity thiswep, entity actor))
+METHOD(Arc, wr_pickup, void(entity thiswep, entity actor, .entity weaponentity))
{
- if ( !client_hasweapon(actor, thiswep, false, false) &&
+ if ( !client_hasweapon(actor, thiswep, weaponentity, false, false) &&
weapon_dropevent_item.arc_overheat > time )
{
actor.arc_overheat = weapon_dropevent_item.arc_overheat;
actor.arc_overheat = 0;
actor.arc_cooldown = 0;
for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- actor.arc_BUTTON_ATCK_prev[slot] = false;
+ {
+ .entity weaponentity = weaponentities[slot];
+ actor.(weaponentity).arc_BUTTON_ATCK_prev = false;
+ }
}
METHOD(Arc, wr_playerdeath, void(entity thiswep, entity actor, .entity weaponentity))
{
actor.arc_overheat = 0;
actor.arc_cooldown = 0;
- int slot = weaponslot(weaponentity);
- actor.arc_BUTTON_ATCK_prev[slot] = false;
+ actor.(weaponentity).arc_BUTTON_ATCK_prev = false;
}
#endif
#ifdef CSQC
NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
{
int sf = ReadByte();
+ int slot = ReadByte();
entity flash;
if(isnew)
{
- int gunalign = W_GetGunAlignment(NULL);
+ int gunalign = W_GunAlign(viewmodels[slot], STAT(GUNALIGN)) - 1;
this.beam_shotorigin = arc_shotorigin[gunalign];
IL_PUSH(g_drawables, this);
this.entremove = Remove_ArcBeam;
this.move_time = time;
- loopsound(this, CH_SHOTS_SINGLE, SND(ARC_LOOP), VOL_BASE, ATTEN_NORM);
+ loopsound(this, CH_SHOTS_SINGLE, SND_ARC_LOOP, VOL_BASE, ATTEN_NORM);
flash = spawn();
flash.owner = this;