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 150
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 150
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
-exec physicsNoQWBunny-xpmbased.cfg
-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"
set g_ctf_flag_capture_effects 1
set g_ctf_captimerecord_always 0 "if enabled, assisted CTF records (with other players on the server) are recorded too"
-exec ctfscoring-ai.cfg
-
// runematch
set g_runematch 0 "Runematch: pick up and hold the runes, special items that give you points, a special power (rune) and a disadvantage (curse)"
set g_runematch_pointrate 5
set g_nexball_radar_showallplayers 1 "1: show every player and the ball on the radar 0: only show teammates and the ball on the radar"
-// server game balance settings
-// powerup balance settings
-// weapon balance settings follow
-exec balanceXonotic.cfg
-
set g_bloodloss 0 "amount of health below which blood loss occurs"
set g_footsteps 1 "serverside footstep sounds"
r_glsl_offsetmapping_scale 0.02
// execute effects-normal.cfg to make sure that all effect settings are reset
alias menu_sync "" // will be re-aliased later
-exec effects-normal.cfg
// misc
fs_empty_files_in_pack_mark_deletions 1 // makes patches able to delete files
seta sbar_info_pos 0 "Y-axis distance from lower right corner for engine info prints"
-// hud cvar descriptions
-exec _hud_descriptions.cfg
-// exec the default skin config
-// please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency
-exec hud_luminos.cfg
-
// user preference cvars (i.e. shouldn't be adjusted by a skin config)
seta hud_panel_weapons_label 1 "1 = show number of weapon, 2 = show bound key of weapon"
seta hud_panel_weapons_complainbubble_time 1 "time that a new entry stays until it fades out"
set cl_handicap 1 "the higher, the more damage you will receive (client setting)"
-exec turrets.cfg
-
// must be at the bottom of this file:
// alias for switching the teamselect menu
alias menu_showteamselect "menu_cmd directmenu TeamSelect"
// polygonoffset for submodel SUCKS SUCKS SUCKS (only a hack for quake1, we don't need that)
r_polygonoffset_submodel_offset 0
r_polygonoffset_submodel_factor 0
-// workaround for "decals flicker all the time" - note that this polygonoffset still is not perfect, also, why do decals need higher polygonoffset when in a warpzone
-// this workaround causes decals to sometimes be visible through walls! (not seen it happen yet though other than on zfightometer)
-// once the issue is found, please revert back to the default of -14
-r_polygonoffset_decals_offset -100
+// decals: need a higher polygonoffset than default to not compete with _decal surfaces too much
+r_polygonoffset_decals_offset -28
r_polygonoffset_decals_factor 0
// this is mainly for _decal entities (their shaders should use "polygonoffset" shader parameter) - this is "good enough" as it seems, but smaller than the decals one so these don't zfight decals
-mod_q3shader_default_polygonoffset -50
+mod_q3shader_default_polygonoffset -14
mod_q3shader_default_polygonfactor 0
+
+// other config files
+exec balanceXonotic.cfg
+exec ctfscoring-ai.cfg
+exec effects-normal.cfg
+exec physicsNoQWBunny-xpmbased.cfg
+exec turrets.cfg
+
+// hud cvar descriptions
+exec _hud_descriptions.cfg
+// exec the default skin config
+// please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency
+exec hud_luminos.cfg
-// 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);
+ avg_dist = sqrt(avg_dist);
+
+ 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 (!self.crylink_waitrelease)
+ 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