- wget -nv -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints\r
- wget -nv -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache\r
\r
- - EXPECT=f2226bf353b6ff3dd3c489a742ce4e6a\r
+ - EXPECT=2a66d8d70fb6aa726f8b5edf453afea3\r
- HASH=$(${ENGINE} +exec serverbench.cfg\r
| tee /dev/stderr\r
| grep '^:'\r
PROJECTILE_MAKETRIGGER(missile);
//setmodel(missile, "models/elaser.mdl"); // precision set below
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
setorigin(missile, w_shotorg);
W_SetupProjVelocity_Basic(missile, autocvar_g_balance_nexball_secondary_speed, 0);
entity missile = spawn(); //WarpZone_RefSys_SpawnSameRefSys(actor);
W_DecreaseAmmo(thiswep, actor, WEP_CVAR_PRI(okrpc, ammo), weaponentity);
- W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(okrpc, damage), thiswep.m_id);
+ W_SetupShot_ProjectileSize(actor, weaponentity, RPC_MINS, RPC_MAXS, false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(okrpc, damage), thiswep.m_id);
W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = thiswep.m_id;
missile.weaponentity_fld = weaponentity;
- setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
+ setsize (missile, RPC_MINS, RPC_MAXS); // give it some size so it can be shot
setorigin(missile, w_shotorg - v_forward * 3); // move it back so it hits the wall at the right point
W_SetupProjVelocity_Basic(missile, WEP_CVAR_PRI(okrpc, speed), 0);
/* wepname */ ATTRIB(OverkillRocketPropelledChainsaw, m_name, string, _("Overkill Rocket Propelled Chainsaw"));
/* legacy */ ATTRIB(OverkillRocketPropelledChainsaw, m_deprecated_netname, string, "rpc");
+#define RPC_MINS '-4 -4 -4' // 0.8.5 used '-3 -3 -3' (before sv_legacy_bbox_expand 0)
+#define RPC_MAXS '4 4 4' // 0.8.5 used '3 3 3' (before sv_legacy_bbox_expand 0)
+
#define X(BEGIN, P, END, class, prefix) \
BEGIN(class) \
P(class, prefix, ammo, float, PRI) \
setthink(missile, adaptor_think2use_hittype_splash);
missile.nextthink = time + WEP_CVAR(arc, bolt_lifetime);
PROJECTILE_MAKETRIGGER(missile);
+ missile.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
missile.weaponentity_fld = weaponentity;
setorigin(missile, w_shotorg);
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
set_movetype(missile, MOVETYPE_BOUNCEMISSILE);
W_SetupProjVelocity_PRE(missile, arc, bolt_);
missile.bot_dodge = true;
missile.bot_dodgerating = atk_damage;
PROJECTILE_MAKETRIGGER(missile);
+ missile.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
setorigin(missile, w_shotorg);
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
float atk_speed = WEP_CVAR_BOTH(blaster, isprimary, speed);
float atk_spread = WEP_CVAR_BOTH(blaster, isprimary, spread);
set_movetype(proj, MOVETYPE_BOUNCEMISSILE);
PROJECTILE_MAKETRIGGER(proj);
+ proj.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
proj.projectiledeathtype = thiswep.m_id;
//proj.gravity = 0.001;
setorigin(proj, w_shotorg);
- setsize(proj, '0 0 0', '0 0 0');
+ setsize(proj, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
s = '0 0 0';
set_movetype(proj, MOVETYPE_BOUNCEMISSILE);
PROJECTILE_MAKETRIGGER(proj);
+ proj.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
proj.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
//proj.gravity = 0.001;
setorigin(proj, w_shotorg);
- setsize(proj, '0 0 0', '0 0 0');
+ setsize(proj, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
if(WEP_CVAR_SEC(crylink, spreadtype) == 1)
{
{
W_DecreaseAmmo(thiswep, actor, WEP_CVAR(devastator, ammo), weaponentity);
- W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR(devastator, damage), thiswep.m_id);
+ W_SetupShot_ProjectileSize(actor, weaponentity, ROCKET_MINS, ROCKET_MAXS, false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR(devastator, damage), thiswep.m_id);
W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
entity missile = WarpZone_RefSys_SpawnSameRefSys(actor);
set_movetype(missile, MOVETYPE_FLY);
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = thiswep.m_id;
- setsize(missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
+ setsize(missile, ROCKET_MINS, ROCKET_MAXS); // give it some size so it can be shot
setorigin(missile, w_shotorg - v_forward * 3); // move it back so it hits the wall at the right point
W_SetupProjVelocity_Basic(missile, WEP_CVAR(devastator, speedstart), 0);
/* wepname */ ATTRIB(Devastator, m_name, string, _("Devastator"));
/* legacy */ ATTRIB(Devastator, m_deprecated_netname, string, "rocketlauncher");
+#define ROCKET_MINS '-4 -4 -4' // 0.8.5 used '-3 -3 -3' (before sv_legacy_bbox_expand 0)
+#define ROCKET_MAXS '4 4 4' // 0.8.5 used '3 3 3' (before sv_legacy_bbox_expand 0)
+
#define X(BEGIN, P, END, class, prefix) \
BEGIN(class) \
P(class, prefix, ammo, float, NONE) \
W_SetupShot_ProjectileSize(
actor,
weaponentity,
- '0 0 -3',
- '0 0 -3',
+ BOLT_MINS,
+ BOLT_MAXS,
false,
2,
SND_ELECTRO_FIRE,
proj.nextthink = time;
proj.ltime = time + WEP_CVAR_PRI(electro, lifetime);
PROJECTILE_MAKETRIGGER(proj);
+ proj.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
proj.projectiledeathtype = thiswep.m_id;
proj.weaponentity_fld = weaponentity;
setorigin(proj, w_shotorg);
W_SetupProjVelocity_PRI(proj, electro);
proj.angles = vectoangles(proj.velocity);
settouch(proj, W_Electro_TouchExplode);
- setsize(proj, '0 0 -3', '0 0 -3');
+ setsize(proj, BOLT_MINS, BOLT_MAXS);
proj.flags = FL_PROJECTILE;
IL_PUSH(g_projectiles, proj);
IL_PUSH(g_bot_dodge, proj);
W_SetupShot_ProjectileSize(
actor,
weaponentity,
- '-4 -4 -4',
- '4 4 4',
+ ORB_MINS,
+ ORB_MAXS,
false,
2,
SND_ELECTRO_FIRE2,
set_movetype(proj, MOVETYPE_BOUNCE);
W_SetupProjVelocity_UP_SEC(proj, electro);
settouch(proj, W_Electro_Orb_Touch);
- setsize(proj, '-4 -4 -4', '4 4 4');
+ setsize(proj, ORB_MINS, ORB_MAXS);
proj.takedamage = DAMAGE_YES;
proj.damageforcescale = WEP_CVAR_SEC(electro, damageforcescale);
SetResourceExplicit(proj, RES_HEALTH, WEP_CVAR_SEC(electro, health));
/* refname */ ATTRIB(Electro, netname, string, "electro");
/* wepname */ ATTRIB(Electro, m_name, string, _("Electro"));
+#define ORB_MINS '-5 -5 -5' // 0.8.5 used '-4 -4 -4' (before sv_legacy_bbox_expand 0)
+#define ORB_MAXS '5 5 5' // 0.8.5 used '4 4 4' (before sv_legacy_bbox_expand 0)
+#define BOLT_MINS '-1 -1 -4' // 0.8.5 used '0 0 -3' (before sv_legacy_bbox_expand 0)
+#define BOLT_MAXS '1 1 -2' // 0.8.5 used '0 0 -3' (before sv_legacy_bbox_expand 0)
+
#define X(BEGIN, P, END, class, prefix) \
BEGIN(class) \
P(class, prefix, ammo, float, BOTH) \
setthink(missile, adaptor_think2use_hittype_splash);
missile.nextthink = time + WEP_CVAR_PRI(hagar, lifetime);
PROJECTILE_MAKETRIGGER(missile);
+ missile.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
missile.projectiledeathtype = thiswep.m_id;
missile.weaponentity_fld = weaponentity;
setorigin(missile, w_shotorg);
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
set_movetype(missile, MOVETYPE_FLY);
W_SetupProjVelocity_PRI(missile, hagar);
setthink(missile, adaptor_think2use_hittype_splash);
missile.nextthink = time + WEP_CVAR_SEC(hagar, lifetime_min) + random() * WEP_CVAR_SEC(hagar, lifetime_rand);
PROJECTILE_MAKETRIGGER(missile);
+ missile.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
missile.weaponentity_fld = weaponentity;
setorigin(missile, w_shotorg);
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
set_movetype(missile, MOVETYPE_BOUNCEMISSILE);
W_SetupProjVelocity_SEC(missile, hagar);
setthink(missile, adaptor_think2use_hittype_splash);
missile.nextthink = time + WEP_CVAR_SEC(hagar, lifetime_min) + random() * WEP_CVAR_SEC(hagar, lifetime_rand);
PROJECTILE_MAKETRIGGER(missile);
+ missile.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
missile.weaponentity_fld = weaponentity;
setorigin(missile, w_shotorg);
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
set_movetype(missile, MOVETYPE_FLY);
missile.missile_flags = MIF_SPLASH;
set_movetype(missile, MOVETYPE_FLY);
PROJECTILE_MAKETRIGGER(missile);
+ missile.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
setorigin(missile, w_shotorg);
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
W_SetupProjVelocity_Basic(missile, WEP_CVAR_PRI(hlac, speed), spread);
//missile.angles = vectoangles(missile.velocity); // csqc
set_movetype(missile, MOVETYPE_FLY);
PROJECTILE_MAKETRIGGER(missile);
+ missile.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
setorigin(missile, w_shotorg);
- setsize(missile, '0 0 0', '0 0 0');
+ setsize(missile, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
W_SetupProjVelocity_Basic(missile, WEP_CVAR_SEC(hlac, speed), spread);
//missile.angles = vectoangles(missile.velocity); // csqc
gren.bot_dodgerating = WEP_CVAR_SEC(hook, damage);
set_movetype(gren, MOVETYPE_TOSS);
PROJECTILE_MAKETRIGGER(gren);
+ gren.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
gren.projectiledeathtype = WEP_HOOK.m_id | HITTYPE_SECONDARY;
gren.weaponentity_fld = weaponentity;
setorigin(gren, w_shotorg);
- setsize(gren, '0 0 0', '0 0 0');
+ setsize(gren, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
gren.nextthink = time + WEP_CVAR_SEC(hook, lifetime);
setthink(gren, adaptor_think2use_hittype_splash);
newmine.realowner = this.realowner;
setorigin(newmine, this.origin);
setmodel(newmine, MDL_MINELAYER_MINE);
- setsize(newmine, '-4 -4 -4', '4 4 4');
+ setsize(newmine, MINE_MINS, MINE_MAXS);
newmine.angles = vectoangles(-trace_plane_normal); // face against the surface
newmine.movedir = -trace_plane_normal;
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);
+ W_SetupShot_ProjectileSize(actor, weaponentity, MINE_MINS, MINE_MAXS, false, 5, SND_MINE_FIRE, CH_WEAPON_A, WEP_CVAR(minelayer, damage), thiswep.m_id);
W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
entity mine = WarpZone_RefSys_SpawnSameRefSys(actor);
PROJECTILE_MAKETRIGGER(mine);
mine.projectiledeathtype = thiswep.m_id;
mine.weaponentity_fld = weaponentity;
- setsize(mine, '-4 -4 -4', '4 4 4'); // give it some size so it can be shot
+ setsize(mine, MINE_MINS, MINE_MAXS);
setorigin(mine, w_shotorg - v_forward * 4); // move it back so it hits the wall at the right point
W_SetupProjVelocity_Basic(mine, WEP_CVAR(minelayer, speed), 0);
/* refname */ ATTRIB(MineLayer, netname, string, "minelayer");
/* wepname */ ATTRIB(MineLayer, m_name, string, _("Mine Layer"));
+#define MINE_MINS '-5 -5 -5' // 0.8.5 used '-4 -4 -4' (before sv_legacy_bbox_expand 0)
+#define MINE_MAXS '5 5 5' // 0.8.5 used '4 4 4' (before sv_legacy_bbox_expand 0)
+
#define X(BEGIN, P, END, class, prefix) \
BEGIN(class) \
P(class, prefix, ammo, float, NONE) \
{
W_DecreaseAmmo(thiswep, actor, WEP_CVAR_PRI(mortar, ammo), weaponentity);
- W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(mortar, damage), thiswep.m_id);
+ W_SetupShot_ProjectileSize(actor, weaponentity, GREN_MINS, GREN_MAXS, false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(mortar, damage), thiswep.m_id);
w_shotdir = v_forward; // no TrueAim for grenades please
W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
gren.projectiledeathtype = thiswep.m_id;
gren.weaponentity_fld = weaponentity;
setorigin(gren, w_shotorg);
- setsize(gren, '-3 -3 -3', '3 3 3');
+ setsize(gren, GREN_MINS, GREN_MAXS);
gren.cnt = time + WEP_CVAR_PRI(mortar, lifetime);
gren.nextthink = time;
W_DecreaseAmmo(thiswep, actor, WEP_CVAR_SEC(mortar, ammo), weaponentity);
- W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(mortar, damage), thiswep.m_id | HITTYPE_SECONDARY);
+ W_SetupShot_ProjectileSize(actor, weaponentity, GREN_MINS, GREN_MAXS, false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(mortar, damage), thiswep.m_id | HITTYPE_SECONDARY);
w_shotdir = v_forward; // no TrueAim for grenades please
W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
gren.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
gren.weaponentity_fld = weaponentity;
setorigin(gren, w_shotorg);
- setsize(gren, '-3 -3 -3', '3 3 3');
+ setsize(gren, GREN_MINS, GREN_MAXS);
gren.nextthink = time + WEP_CVAR_SEC(mortar, lifetime);
setthink(gren, adaptor_think2use_hittype_splash);
/* wepname */ ATTRIB(Mortar, m_name, string, _("Mortar"));
/* legacy */ ATTRIB(Mortar, m_deprecated_netname, string, "grenadelauncher");
+#define GREN_MINS '-4 -4 -4' // 0.8.5 used '-3 -3 -3' (before sv_legacy_bbox_expand 0)
+#define GREN_MAXS '4 4 4' // 0.8.5 used '3 3 3' (before sv_legacy_bbox_expand 0)
+
#define X(BEGIN, P, END, class, prefix) \
BEGIN(class) \
P(class, prefix, ammo, float, BOTH) \
gren.bot_dodgerating = 200;
set_movetype(gren, MOVETYPE_BOUNCEMISSILE);
PROJECTILE_MAKETRIGGER(gren);
+ gren.clipgroup = CLIPGROUP_UNHITTABLEPROJ;
gren.effects = EF_RED;
gren.scale = 4;
setorigin(gren, w_shotorg);
- setsize(gren, '0 0 0', '0 0 0');
+ setsize(gren, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS);
gren.nextthink = time + WEP_CVAR_BOTH(porto, (type <= 0), lifetime);
setthink(gren, W_Porto_Think);
W_DecreaseAmmo(thiswep, actor, WEP_CVAR(seeker, missile_ammo), weaponentity);
makevectors(actor.v_angle);
- W_SetupShot_ProjectileSize(actor, weaponentity, '-4 -4 -4', '4 4 4', false, 2, SND_SEEKER_FIRE, CH_WEAPON_A, 0, ((m_target != NULL) ? thiswep.m_id | HITTYPE_SECONDARY : thiswep.m_id));
+ W_SetupShot_ProjectileSize(actor, weaponentity, MISSILE_MINS, MISSILE_MAXS, false, 2, SND_SEEKER_FIRE, CH_WEAPON_A, 0, ((m_target != NULL) ? thiswep.m_id | HITTYPE_SECONDARY : thiswep.m_id));
w_shotorg += f_diff;
W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
setorigin(missile, w_shotorg);
- setsize(missile, '-4 -4 -4', '4 4 4');
+ setsize(missile, MISSILE_MINS, MISSILE_MAXS);
set_movetype(missile, MOVETYPE_FLYMISSILE);
missile.flags = FL_PROJECTILE;
IL_PUSH(g_projectiles, missile);
f_diff = '+1.25 +3.75 0';
break;
}
- W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_FLAC_FIRE, CH_WEAPON_A, WEP_CVAR(seeker, flac_damage), thiswep.m_id | HITTYPE_SECONDARY);
+ W_SetupShot_ProjectileSize(actor, weaponentity, FLAC_MINS, FLAC_MAXS, false, 2, SND_FLAC_FIRE, CH_WEAPON_A, WEP_CVAR(seeker, flac_damage), thiswep.m_id | HITTYPE_SECONDARY);
w_shotorg += f_diff;
// uses hagar effects!
//missile.scale = 0.4; // BUG: the model is too big
setorigin(missile, w_shotorg);
- setsize(missile, '-2 -2 -2', '2 2 2');
+ setsize(missile, FLAC_MINS, FLAC_MAXS);
W_SetupProjVelocity_UP_PRE(missile, seeker, flac_);
CSQCProjectile(missile, true, PROJECTILE_FLAC, true);
{
W_DecreaseAmmo(thiswep, actor, WEP_CVAR(seeker, tag_ammo), weaponentity);
- W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_TAG_FIRE, CH_WEAPON_A, WEP_CVAR(seeker, missile_damage) * WEP_CVAR(seeker, missile_count), thiswep.m_id | HITTYPE_BOUNCE | HITTYPE_SECONDARY);
+ W_SetupShot_ProjectileSize(actor, weaponentity, TAG_MINS, TAG_MAXS, false, 2, SND_TAG_FIRE, CH_WEAPON_A, WEP_CVAR(seeker, missile_damage) * WEP_CVAR(seeker, missile_count), thiswep.m_id | HITTYPE_BOUNCE | HITTYPE_SECONDARY);
entity missile = new(seeker_tag);
missile.weaponentity_fld = weaponentity;
missile.damageforcescale = WEP_CVAR(seeker, tag_damageforcescale);
setorigin(missile, w_shotorg);
- setsize(missile, '-2 -2 -2', '2 2 2');
+ setsize(missile, TAG_MINS, TAG_MAXS);
missile.flags = FL_PROJECTILE;
IL_PUSH(g_projectiles, missile);
/* refname */ ATTRIB(Seeker, netname, string, "seeker");
/* wepname */ ATTRIB(Seeker, m_name, string, _("T.A.G. Seeker"));
+#define MISSILE_MINS '-5 -5 -5' // 0.8.5 used '-4 -4 -4' (before sv_legacy_bbox_expand 0)
+#define MISSILE_MAXS '5 5 5' // 0.8.5 used '4 4 4' (before sv_legacy_bbox_expand 0)
+#define TAG_MINS '-3 -3 -3' // 0.8.5 used '-2 -2 -2' (before sv_legacy_bbox_expand 0)
+#define TAG_MAXS '3 3 3' // 0.8.5 used '2 2 2' (before sv_legacy_bbox_expand 0)
+#define FLAC_MINS '-3 -3 -3' // 0.8.5 used '-2 -2 -2' (before sv_legacy_bbox_expand 0)
+#define FLAC_MAXS '3 3 3' // 0.8.5 used '2 2 2' (before sv_legacy_bbox_expand 0)
+
#define X(BEGIN, P, END, class, prefix) \
BEGIN(class) \
P(class, prefix, flac_ammo, float, NONE) \
int laser_count = max(1, autocvar_g_rm_laser_count);
int total = (mode == 0) ? laser_count : 1;
Sound snd = (mode == 0) ? SND_CRYLINK_FIRE : SND_ELECTRO_FIRE2;
- W_SetupShot_ProjectileSize(actor, weaponentity, '0 0 -3', '0 0 -3', false, 2, snd, CH_WEAPON_A, autocvar_g_rm_laser_damage, WEP_ELECTRO.m_id);
+ W_SetupShot_ProjectileSize(actor, weaponentity, RM_MINS, RM_MAXS, false, 2, snd, CH_WEAPON_A, autocvar_g_rm_laser_damage, WEP_ELECTRO.m_id);
// uses electro effects
W_MuzzleFlash(WEP_ELECTRO, actor, weaponentity, w_shotorg, w_shotdir);
proj.velocity = W_CalculateProjectileVelocity(actor, actor.velocity, proj.velocity, true);
proj.angles = vectoangles(proj.velocity);
settouch(proj, W_RocketMinsta_Laser_Touch);
- setsize(proj, '0 0 -3', '0 0 -3');
+ setsize(proj, RM_MINS, RM_MAXS);
proj.flags = FL_PROJECTILE;
IL_PUSH(g_projectiles, proj);
IL_PUSH(g_bot_dodge, proj);
/* wepname */ ATTRIB(Vaporizer, m_name, string, _("Vaporizer"));
/* legacy */ ATTRIB(Vaporizer, m_deprecated_netname, string, "minstanex");
+#define RM_MINS '-1 -1 -4' // 0.8.5 used '0 0 -3' (before sv_legacy_bbox_expand 0)
+#define RM_MAXS '1 1 -2' // 0.8.5 used '0 0 -3' (before sv_legacy_bbox_expand 0)
+
#define X(BEGIN, P, END, class, prefix) \
BEGIN(class) \
P(class, prefix, ammo, float, PRI) \
vector vs = hook_shotorigin[s];
vector oldmovedir = actor.(weaponentity).movedir;
actor.(weaponentity).movedir = vs;
- W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', true, 0, SND_HOOK_FIRE, CH_WEAPON_B, 0, WEP_HOOK.m_id);
+ W_SetupShot_ProjectileSize(actor, weaponentity, HOOK_MINS, HOOK_MAXS, true, 0, SND_HOOK_FIRE, CH_WEAPON_B, 0, WEP_HOOK.m_id);
W_MuzzleFlash(WEP_HOOK, actor, weaponentity, w_shotorg, '0 0 0');
actor.(weaponentity).movedir = oldmovedir;
PROJECTILE_MAKETRIGGER(missile);
//setmodel (missile, MDL_HOOK); // precision set below
- setsize (missile, '-3 -3 -3', '3 3 3');
+ setsize (missile, HOOK_MINS, HOOK_MAXS);
setorigin(missile, w_shotorg);
missile.state = 0; // not latched onto anything
vector hook_shotorigin[4];
+#define HOOK_MINS '-4 -4 -4' // 0.8.5 used '-3 -3 -3' (before sv_legacy_bbox_expand 0)
+#define HOOK_MAXS '4 4 4' // 0.8.5 used '3 3 3' (before sv_legacy_bbox_expand 0)
.entity realowner;
-#define PROJECTILE_TOUCH(e,t) MACRO_BEGIN if (WarpZone_Projectile_Touch(e,t)) return; MACRO_END
+// if these are too big the max possible blaster jump height is increased a little
+const vector UNHITTABLEPROJ_MINS = '-0.015625 -0.015625 -0.015625'; // 0.8.5 set '0 0 0' (before sv_legacy_bbox_expand 0)
+const vector UNHITTABLEPROJ_MAXS = '0.015625 0.015625 0.015625'; // 0.8.5 set '0 0 0' (before sv_legacy_bbox_expand 0)
+const int CLIPGROUP_UNHITTABLEPROJ = 1; // these projectiles cannot deflect or destroy each other
+// TODO: remove the following clipgroup comparison, which is included for backwards compatibility, after upgrading DP:
+// in DP versions with DP_RM_CLIPGROUP, the touch func isn't called when the clipgroup is a matching non zero integer.
+// see: https://gitlab.com/xonotic/xonotic-data.pk3dir/-/merge_requests/1131
+#define PROJECTILE_TOUCH(e,t) if (((e).clipgroup && (e).clipgroup == (t).clipgroup) || ((e).solid == SOLID_TRIGGER && (t).solid == SOLID_TRIGGER) || WarpZone_Projectile_Touch(e,t)) return
#define PROJECTILE_MAKETRIGGER(e) (e).solid = SOLID_CORPSE; (e).dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE
// when doing this, hagar can go through clones
#define W_SetupShot_ProjectileSize(ent, wepent, mi, ma, antilag, recoil, snd, chan, maxdamage, deathtype) \
W_SetupShot_Dir_ProjectileSize(ent, wepent, v_forward, mi, ma, antilag, recoil, snd, chan, maxdamage, deathtype)
#define W_SetupShot_Dir(ent, wepent, s_forward, antilag, recoil, snd, chan, maxdamage, deathtype) \
- W_SetupShot_Dir_ProjectileSize(ent, wepent, s_forward, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage, deathtype)
+ W_SetupShot_Dir_ProjectileSize(ent, wepent, s_forward, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS, antilag, recoil, snd, chan, maxdamage, deathtype)
#define W_SetupShot(ent, wepent, antilag, recoil, snd, chan, maxdamage, deathtype) \
- W_SetupShot_ProjectileSize(ent, wepent, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage, deathtype)
+ W_SetupShot_ProjectileSize(ent, wepent, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS, antilag, recoil, snd, chan, maxdamage, deathtype)
#define W_SetupShot_Range(ent, wepent, antilag, recoil, snd, chan, maxdamage, range, deathtype) \
- W_SetupShot_Dir_ProjectileSize_Range(ent, wepent, v_forward, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage, range, deathtype)
+ W_SetupShot_Dir_ProjectileSize_Range(ent, wepent, v_forward, UNHITTABLEPROJ_MINS, UNHITTABLEPROJ_MAXS, antilag, recoil, snd, chan, maxdamage, range, deathtype)
vector W_CalculateProjectileVelocity(entity actor, vector pvelocity, vector mvelocity, float forceAbsolute);