newmine.owner = this.owner;
newmine.realowner = this.realowner;
- setsize(newmine, '-4 -4 -4', '4 4 4');
setorigin(newmine, this.origin);
setmodel(newmine, MDL_MINELAYER_MINE);
+ setsize(newmine, '-4 -4 -4', '4 4 4');
newmine.angles = vectoangles(-trace_plane_normal); // face against the surface
- newmine.mine_orientation = -trace_plane_normal;
+ newmine.movedir = -trace_plane_normal;
newmine.takedamage = this.takedamage;
newmine.damageforcescale = this.damageforcescale;
this.takedamage = DAMAGE_NO;
if(this.move_movetype == MOVETYPE_NONE || this.move_movetype == MOVETYPE_FOLLOW)
- this.velocity = this.mine_orientation; // particle fx and decals need .velocity
+ this.velocity = this.movedir; // .velocity must be != '0 0 0' for particle fx and decal to work
RadiusDamage(this, this.realowner, WEP_CVAR(minelayer, remote_damage), WEP_CVAR(minelayer, remote_edgedamage), WEP_CVAR(minelayer, remote_radius),
NULL, NULL, WEP_CVAR(minelayer, remote_force), this.projectiledeathtype | HITTYPE_BOUNCE, this.weaponentity_fld, NULL);
head = findradius(this.origin, WEP_CVAR(minelayer, proximityradius));
while(head)
{
- if(IS_PLAYER(head) && !IS_DEAD(head) && !STAT(FROZEN, head))
+ if(IS_PLAYER(head) && !IS_DEAD(head) && !STAT(FROZEN, head) && !IS_INDEPENDENT_PLAYER(head))
if(head != this.realowner && DIFF_TEAM(head, this.realowner)) // don't trigger for team mates
if(!this.mine_time)
{
void W_MineLayer_Attack(Weapon thiswep, entity actor, .entity weaponentity)
{
- entity mine;
- entity flash;
-
// scan how many mines we placed, and return if we reached our limit
if(WEP_CVAR(minelayer, limit))
{
W_DecreaseAmmo(thiswep, actor, WEP_CVAR(minelayer, ammo), weaponentity);
W_SetupShot_ProjectileSize(actor, weaponentity, '-4 -4 -4', '4 4 4', false, 5, SND_MINE_FIRE, CH_WEAPON_A, WEP_CVAR(minelayer, damage), thiswep.m_id);
- Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+ W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
- mine = WarpZone_RefSys_SpawnSameRefSys(actor);
+ entity mine = WarpZone_RefSys_SpawnSameRefSys(actor);
mine.weaponentity_fld = weaponentity;
IL_PUSH(g_mines, mine);
mine.owner = mine.realowner = actor;
CSQCProjectile(mine, true, PROJECTILE_MINE, true);
- // muzzle flash for 1st person view
- flash = spawn();
- setmodel(flash, MDL_MINELAYER_MUZZLEFLASH); // precision set below
- SUB_SetFade(flash, time, 0.1);
- flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
- W_AttachToShotorg(actor, weaponentity, flash, '5 0 0');
-
// common properties
MUTATOR_CALLHOOK(EditProjectile, actor, mine);
if(minecount >= WEP_CVAR(minelayer, limit))
PHYS_INPUT_BUTTON_ATCK(actor) = false;
else
- PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(actor, weaponentity, WEP_CVAR(minelayer, speed), 0, WEP_CVAR(minelayer, lifetime), false);
+ PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(actor, weaponentity, WEP_CVAR(minelayer, speed), 0, WEP_CVAR(minelayer, lifetime), false, false);
if(skill >= 2) // skill 0 and 1 bots won't detonate mines!
{
// decide whether to detonate mines
float desirabledamage;
desirabledamage = enemydamage;
- if(time > STAT(INVINCIBLE_FINISHED, actor) && time > actor.spawnshieldtime)
+ if(StatusEffects_active(STATUSEFFECT_Shield, actor) && !StatusEffects_active(STATUSEFFECT_SpawnShield, actor))
desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
if(teamplay && actor.team)
desirabledamage = desirabledamage - teamdamage;