set g_balance_crylink_primary_animtime 0.3
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.5
+set g_balance_crylink_primary_joinspeed 0
set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
set g_balance_crylink_primary_middle_fadetime 5
set g_balance_crylink_secondary_animtime 0.3
set g_balance_crylink_secondary_ammo 2
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joinspeed 0
set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
set g_balance_crylink_secondary_middle_fadetime 5
// {{{ laser
set g_balance_laser_primary_damage 25
set g_balance_laser_primary_edgedamage 10
-set g_balance_laser_primary_force 258
+set g_balance_laser_primary_force 182 // Original value was insanely low :P
set g_balance_laser_primary_radius 70
set g_balance_laser_primary_speed 12000
set g_balance_laser_primary_spread 0
set g_balance_laser_primary_shotangle 0
set g_balance_laser_primary_delay 0.03
set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 1
-set g_balance_laser_primary_force_velocitybias 0
+set g_balance_laser_primary_force_zscale 2 // 300 upforce
+set g_balance_laser_primary_force_velocitybias 0.3
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 25
-set g_balance_laser_secondary_edgedamage 10
-set g_balance_laser_secondary_force 375
-set g_balance_laser_secondary_radius 70
-set g_balance_laser_secondary_speed 12000
+set g_balance_laser_secondary_damage 200 // dps
+set g_balance_laser_secondary_edgedamage 0
+set g_balance_laser_secondary_force 1300
+set g_balance_laser_secondary_radius 60
+set g_balance_laser_secondary_speed 0
set g_balance_laser_secondary_spread 0
-set g_balance_laser_secondary_refire 0.7
-set g_balance_laser_secondary_animtime 0.3
-set g_balance_laser_secondary_lifetime 30
-set g_balance_laser_secondary_shotangle -90
+set g_balance_laser_secondary_refire 0.066
+set g_balance_laser_secondary_animtime 0.066
+set g_balance_laser_secondary_lifetime 0
+set g_balance_laser_secondary_shotangle 0
set g_balance_laser_secondary_delay 0
-set g_balance_laser_secondary_gauntlet 0
-set g_balance_laser_secondary_force_zscale 1
+set g_balance_laser_secondary_gauntlet 1
+set g_balance_laser_secondary_force_zscale 1.25
set g_balance_laser_secondary_force_velocitybias 0
// }}}
// {{{ shotgun
set g_balance_crylink_primary_animtime 0.30008
set g_balance_crylink_primary_ammo 3
set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_joinspeed 0
set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
set g_balance_crylink_primary_middle_fadetime 5
set g_balance_crylink_secondary_animtime 0.3
set g_balance_crylink_secondary_ammo 3
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joinspeed 0
set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
set g_balance_crylink_secondary_middle_fadetime 5
set g_balance_crylink_primary_animtime 0.3
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.5
+set g_balance_crylink_primary_joinspeed 0
set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
set g_balance_crylink_primary_middle_fadetime 5
set g_balance_crylink_secondary_animtime 0.3
set g_balance_crylink_secondary_ammo 2
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joinspeed 0
set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
set g_balance_crylink_secondary_middle_fadetime 5
set g_balance_crylink_primary_animtime 0.3
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.5
+set g_balance_crylink_primary_joinspeed 0
set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
set g_balance_crylink_primary_middle_fadetime 5
set g_balance_crylink_secondary_animtime 0.1
set g_balance_crylink_secondary_ammo 2
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joinspeed 0
set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
set g_balance_crylink_secondary_middle_fadetime 5
// 7: forward + circle with (1-r)(2-r) falloff
set g_balance_falldamage_deadminspeed 150
set g_balance_falldamage_minspeed 800
-set g_balance_falldamage_factor 0.20
-set g_balance_falldamage_maxdamage 15
+set g_balance_falldamage_factor 0.02 // maxspeed = minspeed + maxdamage / factor = 4550
+set g_balance_falldamage_maxdamage 75
// }}}
// {{{ powerups
set g_balance_crylink_primary_animtime 0.4
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_joinspeed 1000
set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
set g_balance_crylink_primary_middle_fadetime 5
set g_balance_crylink_secondary_animtime 0.15
set g_balance_crylink_secondary_ammo 1
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joinspeed 1000
set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
set g_balance_crylink_secondary_middle_fadetime 5
set g_balance_crylink_primary_animtime 0.4
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_joinspeed 0
set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
set g_balance_crylink_primary_middle_fadetime 5
set g_balance_crylink_secondary_animtime 0.15
set g_balance_crylink_secondary_ammo 1
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joinspeed 0
set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
set g_balance_crylink_secondary_middle_fadetime 5
set g_balance_crylink_primary_animtime 0.4
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_joinspeed 0
set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
set g_balance_crylink_primary_middle_fadetime 5
set g_balance_crylink_secondary_animtime 0.15
set g_balance_crylink_secondary_ammo 1
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joinspeed 0
set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
set g_balance_crylink_secondary_middle_fadetime 5
// use default physics
set sv_friction_on_land 0
-set sv_player_viewoffset "0 0 42" "view offset of the player model"
+set sv_player_viewoffset "0 0 35" "view offset of the player model"
set sv_player_mins "-16 -16 -24" "playermodel mins"
set sv_player_maxs "16 16 45" "playermodel maxs"
+set sv_player_headsize "24 24 12" "playermodel headshot bbox size (centered at top of player bbox, preview with r_showbboxes)" // actually SHOULD be 19.2 19.2 10 according to docs
set sv_player_crouch_viewoffset "0 0 20" "view offset of the player model when crouched"
set sv_player_crouch_mins "-16 -16 -24" "mins of a crouched playermodel"
set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel"
-// These have been modified from Nexuiz 2.4.2's physicsQBR.cfg file and a bunch of other crap div0 threw on here :P
-// DO NOT SCREW WITH friction on land, edge friction, step height, or sv_airaccel_qw
-sv_gravity 819
-sv_maxspeed 420
-sv_maxairspeed 283
+// "NoQWBunny" physics based on XPM
+sv_gravity 800
+sv_maxspeed 320
+sv_maxairspeed 424
sv_stopspeed 100
sv_accelerate 13
-sv_airaccelerate 6
-sv_friction 9.6 // higher values make you slide less
-edgefriction 1 // div0 says no! lol
+sv_airaccelerate 2
+sv_friction 8
+edgefriction 1
sv_stepheight 26
-sv_jumpvelocity 304
+// Q1: 16+2
+// Nex: 32+2
+// we try: 24+2
+
+// actually, what we want is 266.6666 for 180bpm
+// but 260 takes same amount of frames and is nicer to mappers
+sv_jumpvelocity 260
sv_wateraccelerate -1
sv_waterfriction -1
-sv_airaccel_sideways_friction 0 // pain in the ass to tweak without screwing up the strafing
-sv_airaccel_qw -0.93 //given a negative value to combat potential cheats, was told by divVerent not to mess with it
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw -0.8
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
+sv_airstopaccelerate 3
+sv_airstrafeaccelerate 24
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.95
+sv_aircontrol 125
+sv_aircontrol_penalty 150
sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
+sv_airspeedlimit_nonqw 800
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_friction_on_land 0
sv_doublejump 0
sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max 0.38
-sv_jumpspeedcap_max_disable_on_ramps 0
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 1
--- /dev/null
+// These have been modified from Nexuiz 2.4.2's physicsQBR.cfg file and a bunch of other crap div0 threw on here :P
+// DO NOT SCREW WITH friction on land, edge friction, step height, or sv_airaccel_qw
+sv_gravity 819
+sv_maxspeed 420
+sv_maxairspeed 283
+
+sv_stopspeed 100
+sv_accelerate 13
+sv_airaccelerate 6
+sv_friction 9.6 // higher values make you slide less
+edgefriction 1 // div0 says no! lol
+sv_stepheight 26
+sv_jumpvelocity 304
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0 // pain in the ass to tweak without screwing up the strafing
+sv_airaccel_qw -0.93 //given a negative value to combat potential cheats, was told by divVerent not to mess with it
+
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max 0.38
+sv_jumpspeedcap_max_disable_on_ramps 0
vector GetHeadshotMins(entity targ)
{
- return '0.6 0 0' * targ.mins_x + '0 0.6 0' * targ.mins_y + '0 0 1' * (1.3 * targ.view_ofs_z - 0.3 * targ.maxs_z);
+ return '-0.5 0 0' * PL_HEAD_x + '0 -0.5 0' * PL_HEAD_y + '0 0 1' * (targ.maxs_z - PL_HEAD_z);
}
vector GetHeadshotMaxs(entity targ)
{
- return '0.6 0 0' * targ.maxs_x + '0 0.6 0' * targ.maxs_y + '0 0 1' * targ.maxs_z;
+ return '0.5 0 0' * PL_HEAD_x + '0 0.5 0' * PL_HEAD_y + '0 0 1' * targ.maxs_z;
}
void UpdateFrags(entity player, float f)
vector PL_VIEW_OFS;
vector PL_MIN;
vector PL_MAX;
+vector PL_HEAD;
vector PL_CROUCH_VIEW_OFS;
vector PL_CROUCH_MIN;
vector PL_CROUCH_MAX;
PL_VIEW_OFS = stov(cvar_string("sv_player_viewoffset"));
PL_MIN = stov(cvar_string("sv_player_mins"));
PL_MAX = stov(cvar_string("sv_player_maxs"));
+ PL_HEAD = stov(cvar_string("sv_player_headsize"));
PL_CROUCH_VIEW_OFS = stov(cvar_string("sv_player_crouch_viewoffset"));
PL_CROUCH_MIN = stov(cvar_string("sv_player_crouch_mins"));
PL_CROUCH_MAX = stov(cvar_string("sv_player_crouch_maxs"));
MUTATOR_ADD(mutator_nix);
if(cvar("g_dodging"))
MUTATOR_ADD(mutator_dodging);
- if(cvar("g_rocket_flying") || (cvar("g_balance_rocketlauncher_detonatedelay") == 0 && stof(cvar_defstring("g_balance_rocketlauncher_detonatedelay")) != 0))
+ if(cvar("g_rocket_flying"))
MUTATOR_ADD(mutator_rocketflying);
g_bugrigs = cvar("g_bugrigs");
MUTATOR_HOOKFUNCTION(rocketflying_EditProjectile)
{
- if(other.classname == "rocket")
+ if(other.classname == "rocket" || other.classname == "mine")
{
// kill detonate delay of rockets
other.spawnshieldtime = time;
#else
#ifdef SVQC
.float gravity;
+.float crylink_waitrelease;
+.entity crylink_lastgroup;
.entity queuenext;
.entity queueprev;
+void W_Crylink_Dequeue_Raw(entity own, entity prev, entity me, entity next)
+{
+ if(me == own.crylink_lastgroup)
+ own.crylink_lastgroup = ((me == next) ? world : next);
+ prev.queuenext = next;
+ next.queueprev = prev;
+}
+
+void W_Crylink_Dequeue(entity e)
+{
+ W_Crylink_Dequeue_Raw(e.realowner, e.queueprev, e, e.queuenext);
+}
+
// force projectile to explode
void W_Crylink_LinkExplode (entity e, entity e2)
{
float a;
a = bound(0, 1 - (time - e.fade_time) * e.fade_rate, 1);
+ if(e == e.realowner.crylink_lastgroup)
+ e.realowner.crylink_lastgroup = world;
+
RadiusDamage (e, e.realowner, cvar("g_balance_crylink_primary_damage") * a, cvar("g_balance_crylink_primary_edgedamage") * a, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * a, e.projectiledeathtype, other);
if(e.queuenext != e2)
W_Crylink_LinkExplode(e.queuenext, e2);
+
remove (e);
}
+// adjust towards center
+// returns the origin where they will meet... and the time till the meeting is
+// stored in w_crylink_linkjoin_time.
+// could possibly network this origin and time, and display a special particle
+// effect when projectiles meet there :P
+float w_crylink_linkjoin_time;
+vector W_Crylink_LinkJoin(entity e, float joinspeed)
+{
+ vector avg_origin, avg_velocity;
+ vector targ_origin;
+ float avg_dist, n;
+ entity p;
+
+ avg_origin = e.origin;
+ avg_velocity = e.velocity;
+ n = 1;
+ for(p = e; (p = p.queuenext) != e; )
+ {
+ avg_origin += p.origin;
+ avg_velocity += p.velocity;
+ ++n;
+ }
+ avg_origin *= (1.0 / n);
+ avg_velocity *= (1.0 / n);
+
+ // yes, mathematically we can do this in ONE step, but beware of 32bit floats...
+ avg_dist = pow(vlen(e.origin - avg_origin), 2);
+ for(p = e; (p = p.queuenext) != e; )
+ avg_dist += pow(vlen(e.origin - avg_origin), 2);
+ avg_dist *= (1.0 / n);
+
+ w_crylink_linkjoin_time = 0;
+ if(avg_dist == 0)
+ return avg_origin; // no change needed
+
+ if(joinspeed == 0)
+ {
+ e.velocity = avg_velocity;
+ UpdateCSQCProjectile(e);
+ for(p = e; (p = p.queuenext) != e; )
+ {
+ p.velocity = avg_velocity;
+ UpdateCSQCProjectile(p);
+ }
+ }
+ else
+ {
+ w_crylink_linkjoin_time = avg_dist / joinspeed;
+ targ_origin = avg_origin + w_crylink_linkjoin_time * avg_velocity;
+
+ e.velocity = (targ_origin - e.origin) * (joinspeed / avg_dist);
+ UpdateCSQCProjectile(e);
+ for(p = e; (p = p.queuenext) != e; )
+ {
+ p.velocity = (targ_origin - p.origin) * (joinspeed / avg_dist);
+ UpdateCSQCProjectile(p);
+ }
+
+ // analysis:
+ // joinspeed -> +infinity:
+ // w_crylink_linkjoin_time -> +0
+ // targ_origin -> avg_origin
+ // p->velocity -> HUEG towards center
+ // joinspeed -> 0:
+ // w_crylink_linkjoin_time -> +/- infinity
+ // targ_origin -> avg_velocity * +/- infinity
+ // p->velocity -> avg_velocity
+ // joinspeed -> -infinity:
+ // w_crylink_linkjoin_time -> -0
+ // targ_origin -> avg_origin
+ // p->velocity -> HUEG away from center
+ }
+
+ return targ_origin;
+}
+
// NO bounce protection, as bounces are limited!
void W_Crylink_Touch (void)
{
float finalhit;
float f;
//PROJECTILE_TOUCH;
- local entity savenext, saveprev;
+ local entity savenext, saveprev, saveown;
+ saveown = self.realowner;
savenext = self.queuenext;
saveprev = self.queueprev;
if(WarpZone_Projectile_Touch())
{
if(wasfreed(self))
- {
- savenext.queueprev = saveprev;
- saveprev.queuenext = savenext;
- }
+ W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext);
return;
}
float finalhit;
float f;
//PROJECTILE_TOUCH;
- local entity savenext, saveprev;
+ local entity savenext, saveprev, saveown;
savenext = self.queuenext;
saveprev = self.queueprev;
+ saveown = self.realowner;
if(WarpZone_Projectile_Touch())
{
if(wasfreed(self))
- {
- savenext.queueprev = saveprev;
- saveprev.queuenext = savenext;
- }
+ W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext);
return;
}
f = cvar("g_balance_crylink_secondary_bouncedamagefactor");
if(a)
f *= a;
- if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, self.projectiledeathtype, other) || finalhit)
+ if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, self.projectiledeathtype, other))
{
W_Crylink_LinkExplode(self.queuenext, self);
remove (self);
return;
}
+ else if(finalhit)
+ {
+ // just unlink
+ W_Crylink_Dequeue(self);
+ remove(self);
+ return;
+ }
self.cnt = self.cnt - 1;
self.angles = vectoangles(self.velocity);
self.owner = world;
void W_Crylink_Fadethink (void)
{
- self.queuenext.queueprev = self.queueprev;
- self.queueprev.queuenext = self.queuenext;
+ W_Crylink_Dequeue(self);
remove(self);
}
shots = cvar("g_balance_crylink_primary_shots");
pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
+ proj = world;
while (counter < shots)
{
proj = spawn ();
counter = counter + 1;
}
+ self.crylink_lastgroup = proj;
}
void W_Crylink_Attack2 (void)
shots = cvar("g_balance_crylink_secondary_shots");
pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
+ proj = world;
while (counter < shots)
{
proj = spawn ();
counter = counter + 1;
}
+ self.crylink_lastgroup = proj;
}
void spawnfunc_weapon_crylink (void)
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
{
- W_Crylink_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
+ if (!self.crylink_waitrelease)
+ if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
+ {
+ W_Crylink_Attack();
+ weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
+ if(cvar("g_balance_crylink_primary_joinspeed") != 0)
+ self.crylink_waitrelease = 1;
+ }
+ }
+ else if(self.BUTTON_ATCK2 && cvar("g_balance_crylink_secondary"))
+ {
+ if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
+ {
+ W_Crylink_Attack2();
+ weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
+ if(cvar("g_balance_crylink_secondary_joinspeed") != 0)
+ self.crylink_waitrelease = 2;
+ }
}
- if (self.BUTTON_ATCK2 && cvar("g_balance_crylink_secondary"))
- if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
+ else
{
- W_Crylink_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
+ if (self.crylink_waitrelease)
+ {
+ // fired and released now!
+ if(self.crylink_lastgroup)
+ {
+ if(self.crylink_waitrelease == 1)
+ {
+ W_Crylink_LinkJoin(self.crylink_lastgroup, cvar("g_balance_crylink_primary_joinspeed"));
+ }
+ else
+ {
+ W_Crylink_LinkJoin(self.crylink_lastgroup, cvar("g_balance_crylink_secondary_joinspeed"));
+ }
+ }
+ }
+ self.crylink_waitrelease = 0;
}
}
else if (req == WR_PRECACHE)
if(self.owner.deadflag == DEAD_NO)
if((self.spawnshieldtime >= 0)
? (time >= self.spawnshieldtime) // timer
- : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_minelayer_radius")) // safety device
+ : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_minelayer_remote_radius")) // safety device
)
{
W_Mine_DoRemoteExplode();
{
if((self.spawnshieldtime >= 0)
? (time >= self.spawnshieldtime) // timer
- : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_radius")) // safety device
+ : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_remote_radius")) // safety device
)
{
W_Rocket_DoRemoteExplode();
if [ "$countw" != "$countb" ]; then
echo "Mismatch between balanceXonotic.cfg and $b. Aborting."
echo "Differences are:"
- A=`mktemp`
- B=`mktemp`
- awk '/^seta? g_/ { print $2; }' balanceXonotic.cfg | sort -u | tr -d '\r' > "$A"
- awk '/^seta? g_/ { print $2; }' "$b" | sort -u | tr -d '\r' > "$B"
echo "< missing in $b"
echo "> must get removed from $b"
+ A=`mktemp || echo a.tmp`
+ B=`mktemp || echo b.tmp`
+ awk '/^seta? g_/ { print $2; }' balanceXonotic.cfg | sort -u | tr -d '\r' > "$A"
+ awk '/^seta? g_/ { print $2; }' "$b" | sort -u | tr -d '\r' > "$B"
diff "$A" "$B" | grep '^[<>]' | sort
rm -f "$A" "$B"
exit 1