REGISTER_NET_TEMP(TE_CSQC_SHOCKWAVEPARTICLE)
#ifdef SVQC
-spawnfunc(weapon_shockwave)
+METHOD(Shockwave, m_spawnfunc_hookreplace, Weapon(Shockwave this, entity e))
{
//if(autocvar_sv_q3acompat_machineshockwaveswap) // WEAPONTODO
- if(autocvar_sv_q3acompat_machineshotgunswap)
- if(this.classname != "droppedweapon")
+ if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e))
{
- weapon_defaultspawnfunc(this, WEP_MACHINEGUN);
- return;
+ return WEP_MACHINEGUN;
}
- weapon_defaultspawnfunc(this, WEP_SHOCKWAVE);
+ return this;
}
const float MAX_SHOCKWAVE_HITS = 10;
this.realowner,
swing_damage,
(WEP_SHOCKWAVE.m_id | HITTYPE_SECONDARY),
+ this.weaponentity_fld,
(this.realowner.origin + this.realowner.view_ofs),
(v_forward * WEP_CVAR(shockwave, melee_force))
);
{ accuracy_add(this.realowner, WEP_SHOCKWAVE.m_id, 0, swing_damage); }
#ifdef DEBUG_SHOCKWAVE
- LOG_INFO(sprintf(
- "MELEE: %s hitting %s with %f damage (factor: %f) at %f time.\n",
+ LOG_INFOF(
+ "MELEE: %s hitting %s with %f damage (factor: %f) at %f time.",
this.realowner.netname,
target_victim.netname,
swing_damage,
swing_factor,
time
- ));
+ );
#endif
// allow multiple hits with one swing, but not against the same player twice
meleetemp.owner = meleetemp.realowner = actor;
setthink(meleetemp, W_Shockwave_Melee_Think);
meleetemp.nextthink = time + WEP_CVAR(shockwave, melee_delay) * W_WeaponRateFactor(actor);
- W_SetupShot_Range(actor, weaponentity, true, 0, SND_Null, 0, WEP_CVAR(shockwave, melee_damage), WEP_CVAR(shockwave, melee_range));
+ meleetemp.weaponentity_fld = weaponentity;
+ W_SetupShot_Range(actor, weaponentity, true, 0, SND_Null, 0, WEP_CVAR(shockwave, melee_damage), WEP_CVAR(shockwave, melee_range), WEP_SHOCKWAVE.m_id | HITTYPE_SECONDARY);
}
// SHOCKWAVE ATTACK MODE
float i, queue = 0;
// set up the shot direction
- W_SetupShot(actor, weaponentity, true, 3, SND_LASERGUN_FIRE, CH_WEAPON_B, WEP_CVAR(shockwave, blast_damage));
+ W_SetupShot(actor, weaponentity, true, 3, SND_LASERGUN_FIRE, CH_WEAPON_B, WEP_CVAR(shockwave, blast_damage), WEP_SHOCKWAVE.m_id);
vector attack_endpos = (w_shotorg + (w_shotdir * WEP_CVAR(shockwave, blast_distance)));
WarpZone_TraceLine(w_shotorg, attack_endpos, MOVE_NOMONSTERS, actor);
vector attack_hitpos = trace_endpos;
if(autocvar_g_antilag == 0 || noantilag)
lag = 0; // only do hitscan, but no antilag
if(lag)
- {
- FOREACH_CLIENT(IS_PLAYER(it) && it != actor, antilag_takeback(it, CS(it), time - lag));
- IL_EACH(g_monsters, it != actor,
- {
- antilag_takeback(it, it, time - lag);
- });
- }
+ antilag_takeback_all(actor, lag);
while(head)
{
actor,
final_damage,
WEP_SHOCKWAVE.m_id,
+ weaponentity,
head.origin,
final_force
);
#ifdef DEBUG_SHOCKWAVE
- LOG_INFO(sprintf(
+ LOG_INFOF(
"SELF HIT: multiplier = %f, damage = %f, force = %f... "
- "multiplier_from_accuracy = %f, multiplier_from_distance = %f.\n",
+ "multiplier_from_accuracy = %f, multiplier_from_distance = %f.",
multiplier,
final_damage,
vlen(final_force),
multiplier_from_accuracy,
multiplier_from_distance
- ));
+ );
#endif
}
else if(distance_to_head <= WEP_CVAR(shockwave, blast_splash_radius))
if(W_Shockwave_Attack_CheckHit(queue, head, final_force, final_damage)) { queue = min(queue + 1, MAX_SHOCKWAVE_HITS); }
#ifdef DEBUG_SHOCKWAVE
- LOG_INFO(sprintf(
+ LOG_INFOF(
"SPLASH HIT: multiplier = %f, damage = %f, force = %f... "
- "multiplier_from_accuracy = %f, multiplier_from_distance = %f.\n",
+ "multiplier_from_accuracy = %f, multiplier_from_distance = %f.",
multiplier,
final_damage,
vlen(final_force),
multiplier_from_accuracy,
multiplier_from_distance
- ));
+ );
#endif
}
}
if(W_Shockwave_Attack_CheckHit(queue, head, final_force, final_damage)) { queue = min(queue + 1, MAX_SHOCKWAVE_HITS); }
#ifdef DEBUG_SHOCKWAVE
- LOG_INFO(sprintf(
+ LOG_INFOF(
"BLAST HIT: multiplier = %f, damage = %f, force = %f... "
- "multiplier_from_accuracy = %f, multiplier_from_distance = %f.\n",
+ "multiplier_from_accuracy = %f, multiplier_from_distance = %f.",
multiplier,
final_damage,
vlen(final_force),
multiplier_from_accuracy,
multiplier_from_distance
- ));
+ );
#endif
}
}
actor,
final_damage,
WEP_SHOCKWAVE.m_id,
+ weaponentity,
head.origin,
final_force
);
accuracy_add(actor, WEP_SHOCKWAVE.m_id, 0, final_damage);
#ifdef DEBUG_SHOCKWAVE
- LOG_INFO(sprintf(
- "SHOCKWAVE by %s: damage = %f, force = %f.\n",
+ LOG_INFOF(
+ "SHOCKWAVE by %s: damage = %f, force = %f.",
actor.netname,
final_damage,
vlen(final_force)
- ));
+ );
#endif
shockwave_hit[i-1] = NULL;
}
if(lag)
- {
- FOREACH_CLIENT(IS_PLAYER(it) && it != actor, antilag_restore(it, CS(it)));
- IL_EACH(g_monsters, it != actor,
- {
- antilag_restore(it, it);
- });
- }
+ antilag_restore_all(actor);
}
METHOD(Shockwave, wr_aim, void(entity thiswep, entity actor, .entity weaponentity))