}
if(sf & ARC_SF_START) // starting location
{
- WriteCoord(MSG_ENTITY, this.beam_start.x);
- WriteCoord(MSG_ENTITY, this.beam_start.y);
- WriteCoord(MSG_ENTITY, this.beam_start.z);
+ WriteVector(MSG_ENTITY, this.beam_start);
}
if(sf & ARC_SF_WANTDIR) // want/aim direction
{
- WriteCoord(MSG_ENTITY, this.beam_wantdir.x);
- WriteCoord(MSG_ENTITY, this.beam_wantdir.y);
- WriteCoord(MSG_ENTITY, this.beam_wantdir.z);
+ WriteVector(MSG_ENTITY, this.beam_wantdir);
}
if(sf & ARC_SF_BEAMDIR) // beam direction
{
- WriteCoord(MSG_ENTITY, this.beam_dir.x);
- WriteCoord(MSG_ENTITY, this.beam_dir.y);
- WriteCoord(MSG_ENTITY, this.beam_dir.z);
+ WriteAngle(MSG_ENTITY, this.beam_dir.x);
+ WriteAngle(MSG_ENTITY, this.beam_dir.y);
+ WriteAngle(MSG_ENTITY, this.beam_dir.z);
}
if(sf & ARC_SF_BEAMTYPE) // beam type
{
}
void Arc_Player_SetHeat(entity player, .entity weaponentity)
{
- player.arc_heat_percent = Arc_GetHeat_Percent(player, weaponentity);
+ player.(weaponentity).arc_heat_percent = Arc_GetHeat_Percent(player, weaponentity);
//dprint("Heat: ",ftos(player.arc_heat_percent*100),"%\n");
}
void W_Arc_Bolt_Explode(entity this, entity directhitentity)
{
this.event_damage = func_null;
- RadiusDamage(this, this.realowner, WEP_CVAR(arc, bolt_damage), WEP_CVAR(arc, bolt_edgedamage), WEP_CVAR(arc, bolt_radius), NULL, NULL, WEP_CVAR(arc, bolt_force), this.projectiledeathtype, directhitentity);
+ RadiusDamage(this, this.realowner, WEP_CVAR(arc, bolt_damage), WEP_CVAR(arc, bolt_edgedamage), WEP_CVAR(arc, bolt_radius), NULL, NULL, WEP_CVAR(arc, bolt_force), this.projectiledeathtype, this.weaponentity_fld, directhitentity);
delete(this);
}
W_Arc_Bolt_Explode(this, trigger);
}
-void W_Arc_Bolt_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
+void W_Arc_Bolt_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
{
if(this.health <= 0)
return;
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));
+ W_SetupShot(actor, weaponentity, false, 2, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage), WEP_ARC.m_id | HITTYPE_SECONDARY);
Send_Effect(EFFECT_ARC_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
missile.nextthink = time + WEP_CVAR(arc, bolt_lifetime);
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = WEP_ARC.m_id | HITTYPE_SECONDARY;
+ missile.weaponentity_fld = weaponentity;
setorigin(missile, w_shotorg);
setsize(missile, '0 0 0', '0 0 0');
SND_Null,
0,
WEP_CVAR(arc, beam_damage) * coefficient,
- WEP_CVAR(arc, beam_range)
+ WEP_CVAR(arc, beam_range),
+ WEP_ARC.m_id
);
// After teleport, "lock" the beam until the teleport is confirmed.
own,
rootdamage * coefficient * falloff,
WEP_ARC.m_id,
+ weaponentity,
hitorigin,
WEP_CVAR(arc, beam_force) * new_dir * coefficient * falloff
);
void Arc_Smoke(entity actor, .entity weaponentity)
{
makevectors(actor.v_angle);
- W_SetupShot_Range(actor,weaponentity,true,0,SND_Null,0,0,0);
+ W_SetupShot_Range(actor,weaponentity,true,0,SND_Null,0,0,0,WEP_ARC.m_id); // TODO: probably doesn't need deathtype, since this is just a prefire effect
vector smoke_origin = w_shotorg + actor.velocity*frametime;
if ( actor.arc_overheat > time )
{
- if ( random() < actor.arc_heat_percent )
+ if ( random() < actor.(weaponentity).arc_heat_percent )
Send_Effect(EFFECT_ARC_SMOKE, smoke_origin, '0 0 0', 1 );
if ( PHYS_INPUT_BUTTON_ATCK(actor) || PHYS_INPUT_BUTTON_ATCK2(actor) )
{
#endif
#ifdef CSQC
bool autocvar_cl_arcbeam_teamcolor = true;
+bool autocvar_cl_arcbeam_simple = true;
+
+.int beam_slot;
METHOD(Arc, wr_impacteffect, void(entity thiswep, entity actor))
{
vector last_top = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_top);
vector last_bottom = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_bottom);
- R_BeginPolygon(beam.beam_image, DRAWFLAG_NORMAL); // DRAWFLAG_ADDITIVE
- R_PolygonVertex(
- top,
- '0 0.5 0' + ('0 0.5 0' * (thickness / beam.beam_thickness)),
- beam.beam_color,
- beam.beam_alpha
- );
- R_PolygonVertex(
- last_top,
- '0 0.5 0' + ('0 0.5 0' * (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
- beam.beam_color,
- beam.beam_alpha
- );
- R_PolygonVertex(
- last_bottom,
- '0 0.5 0' * (1 - (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
- beam.beam_color,
- beam.beam_alpha
- );
- R_PolygonVertex(
- bottom,
- '0 0.5 0' * (1 - (thickness / beam.beam_thickness)),
- beam.beam_color,
- beam.beam_alpha
- );
- R_EndPolygon();
+ if(autocvar_cl_arcbeam_simple)
+ Draw_CylindricLine(start, end, thickness, beam.beam_image, 0.25, -time * 3, beam.beam_color, beam.beam_alpha, DRAWFLAG_NORMAL, transformed_view_org);
+ else
+ {
+ R_BeginPolygon(beam.beam_image, DRAWFLAG_NORMAL); // DRAWFLAG_ADDITIVE
+ R_PolygonVertex(
+ top,
+ '0 0.5 0' + ('0 0.5 0' * (thickness / beam.beam_thickness)),
+ beam.beam_color,
+ beam.beam_alpha
+ );
+ R_PolygonVertex(
+ last_top,
+ '0 0.5 0' + ('0 0.5 0' * (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
+ beam.beam_color,
+ beam.beam_alpha
+ );
+ R_PolygonVertex(
+ last_bottom,
+ '0 0.5 0' * (1 - (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
+ beam.beam_color,
+ beam.beam_alpha
+ );
+ R_PolygonVertex(
+ bottom,
+ '0 0.5 0' * (1 - (thickness / beam.beam_thickness)),
+ beam.beam_color,
+ beam.beam_alpha
+ );
+ R_EndPolygon();
+ }
// draw trailing particles
// NOTES:
// into a weapon system for client code.
// find where we are aiming
- makevectors(warpzone_save_view_angles);
+ makevectors(((autocvar_chase_active) ? warpzone_save_view_angles : view_angles));
vector forward = v_forward;
vector right = v_right;
vector up = v_up;
+ entity wepent = viewmodels[this.beam_slot];
+
+ if(autocvar_chase_active)
+ this.beam_usevieworigin = 1;
+ else
+ this.beam_usevieworigin = 2;
// decide upon start position
if(this.beam_usevieworigin == 2)
{ start_pos = warpzone_save_view_origin; }
+ else if(csqcplayer)
+ { start_pos = csqcplayer.origin + csqcplayer.view_ofs; }
else
{ start_pos = this.origin; }
+ int v_shot_idx; // used later
+ (v_shot_idx = gettagindex(wepent, "shot")) || (v_shot_idx = gettagindex(wepent, "tag_shot"));
+ if(v_shot_idx && this.beam_usevieworigin == 2)
+ start_pos = gettaginfo(wepent, v_shot_idx) - '0 0 2';
+
// trace forward with an estimation
WarpZone_TraceLine(
start_pos,
end_pos = start_pos + (forward * g_trueaim_minrange);
// move shot origin to the actual gun muzzle origin
- vector origin_offset =
- right * -this.beam_shotorigin.y
- + up * this.beam_shotorigin.z;
+ vector origin_offset = '0 0 0';
+ if(!v_shot_idx || this.beam_usevieworigin != 2)
+ {
+ this.beam_shotorigin = wepent.movedir;
+ origin_offset =
+ right * -this.beam_shotorigin.y
+ + up * this.beam_shotorigin.z;
+ }
+ else
+ this.beam_shotorigin = '0 0 0';
start_pos = start_pos + origin_offset;
)
);
}
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
pointparticles(
this.beam_muzzleeffect,
int slot = ReadByte();
entity flash;
+ this.beam_slot = slot;
+
if(isnew)
{
int gunalign = W_GunAlign(viewmodels[slot], STAT(GUNALIGN)) - 1;
- this.beam_shotorigin = arc_shotorigin[gunalign];
+ this.beam_shotorigin = arc_shotorigin[gunalign]; // get a starting point
// set other main attributes of the beam
this.draw = Draw_ArcBeam;
if(sf & ARC_SF_START) // starting location
{
- this.origin_x = ReadCoord();
- this.origin_y = ReadCoord();
- this.origin_z = ReadCoord();
+ this.origin = ReadVector();
}
else if(this.beam_usevieworigin) // infer the location from player location
{
if(sf & ARC_SF_WANTDIR) // want/aim direction
{
- this.v_angle_x = ReadCoord();
- this.v_angle_y = ReadCoord();
- this.v_angle_z = ReadCoord();
+ this.v_angle = ReadVector();
}
if(sf & ARC_SF_BEAMDIR) // beam direction
{
- this.angles_x = ReadCoord();
- this.angles_y = ReadCoord();
- this.angles_z = ReadCoord();
+ this.angles_x = ReadAngle();
+ this.angles_y = ReadAngle();
+ this.angles_z = ReadAngle();
}
if(sf & ARC_SF_BEAMTYPE) // beam type
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
- if(this.beam_muzzleeffect)
+ this.beam_image = "particles/lgbeam";
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; // (EFFECT_GRENADE_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null; // (EFFECT_GRENADE_MUZZLEFLASH);
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 0;
this.beam_hitlight[3] = 0;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 50;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 0;
this.beam_muzzlelight[3] = 0;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}
this.beam_hitlight[1] = 1;
this.beam_hitlight[2] = 1;
this.beam_hitlight[3] = 1;
- this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+ this.beam_muzzleeffect = EFFECT_Null;
this.beam_muzzlelight[0] = 0;
this.beam_muzzlelight[1] = 1;
this.beam_muzzlelight[2] = 1;
this.beam_muzzlelight[3] = 1;
this.beam_image = "particles/lgbeam";
- if(this.beam_muzzleeffect)
+ if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
{
setmodel(flash, MDL_ARC_MUZZLEFLASH);
flash.alpha = this.beam_alpha;
flash.colormod = this.beam_color;
- flash.scale = 0.5;
+ flash.scale = 0.35;
}
break;
}