set g_balance_uzi_spread_min 0.02
set g_balance_uzi_spread_max 0.6
set g_balance_uzi_spread_add 0.012
+
set g_balance_uzi_burst 0 // # of bullets in a burst (if set to 2 or more)
set g_balance_uzi_burst_refire 0.05 // refire between burst bullets
set g_balance_uzi_burst_refire2 0.75 // refire after burst
set g_balance_uzi_burst_damage 18
set g_balance_uzi_burst_force 50
set g_balance_uzi_burst_ammo 3
+
set g_balance_uzi_first 1
set g_balance_uzi_first_damage 30
set g_balance_uzi_first_force 50
set g_balance_uzi_first_spread 0.015
set g_balance_uzi_first_refire 0.2
set g_balance_uzi_first_ammo 1
+
set g_balance_uzi_sustained_damage 15
set g_balance_uzi_sustained_force 27
set g_balance_uzi_sustained_spread 0.05
set g_balance_uzi_sustained_refire 0.1
set g_balance_uzi_sustained_ammo 1
+
set g_balance_uzi_speed 18000
set g_balance_uzi_bulletconstant 115 // 13.1qu
// }}}
set g_balance_grenadelauncher_bouncefactor 0.5
set g_balance_grenadelauncher_bouncestop 0.075
// }}}
-// {{{ minelayer // TODO
+// {{{ minelayer
set g_balance_minelayer_damage 35
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
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_joindelay 0
set g_balance_crylink_primary_joinspread 0
set g_balance_crylink_primary_jointime 0
set g_balance_crylink_primary_joinexplode 0
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_joindelay 0
set g_balance_crylink_secondary_joinspread 0
set g_balance_crylink_secondary_jointime 0
set g_balance_crylink_secondary_joinexplode 0
set g_balance_uzi_spread_min 0.02
set g_balance_uzi_spread_max 0.6
set g_balance_uzi_spread_add 0.012
+
set g_balance_uzi_burst 0 // # of bullets in a burst (if set to 2 or more)
set g_balance_uzi_burst_refire 0.05 // refire between burst bullets
set g_balance_uzi_burst_refire2 0.75 // refire after burst
set g_balance_uzi_burst_damage 18
set g_balance_uzi_burst_force 50
set g_balance_uzi_burst_ammo 3
+
set g_balance_uzi_first 1
set g_balance_uzi_first_damage 26
set g_balance_uzi_first_force -30
set g_balance_uzi_first_spread 0.01
set g_balance_uzi_first_refire 0.2
set g_balance_uzi_first_ammo 1
+
set g_balance_uzi_sustained_damage 17
set g_balance_uzi_sustained_force 27
set g_balance_uzi_sustained_spread 0.05
set g_balance_uzi_sustained_refire 0.1
set g_balance_uzi_sustained_ammo 1
+
set g_balance_uzi_speed 18000
set g_balance_uzi_bulletconstant 300 // 13.1qu
// }}}
-// {{{ mortar
+// {{{ mortar
set g_balance_grenadelauncher_primary_type 0
set g_balance_grenadelauncher_primary_damage 65
set g_balance_grenadelauncher_primary_edgedamage 35
set g_balance_grenadelauncher_bouncefactor 0.7
set g_balance_grenadelauncher_bouncestop 0.12
// }}}
-// {{{ minelayer
+// {{{ minelayer
set g_balance_minelayer_damage 65
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
set g_balance_minelayer_remote_radius 200
set g_balance_minelayer_remote_force 300
// }}}
-// {{{ electro
+// {{{ electro
set g_balance_electro_lightning 0
set g_balance_electro_primary_damage 55
set g_balance_electro_primary_edgedamage 5
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_joindelay 0
set g_balance_crylink_primary_joinspread 0
set g_balance_crylink_primary_jointime 0
set g_balance_crylink_primary_joinexplode 0
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_joindelay 0
set g_balance_crylink_secondary_joinspread 0
set g_balance_crylink_secondary_jointime 0
set g_balance_crylink_secondary_joinexplode 0
set g_balance_hagar_secondary_refire 0.15
set g_balance_hagar_secondary_ammo 2
// }}}
-// {{{ rocketlauncher
+// {{{ rocketlauncher
set g_balance_rocketlauncher_damage 65
set g_balance_rocketlauncher_edgedamage 25
set g_balance_rocketlauncher_force 360
set g_balance_uzi_spread_min 0.02
set g_balance_uzi_spread_max 0.6
set g_balance_uzi_spread_add 0.012
+
set g_balance_uzi_burst 0 // # of bullets in a burst (if set to 2 or more)
set g_balance_uzi_burst_refire 0.05 // refire between burst bullets
set g_balance_uzi_burst_refire2 0.75 // refire after burst
set g_balance_uzi_burst_damage 18
set g_balance_uzi_burst_force 50
set g_balance_uzi_burst_ammo 3
+
set g_balance_uzi_first 1
set g_balance_uzi_first_damage 18
set g_balance_uzi_first_force 20
set g_balance_uzi_first_spread 0.03
set g_balance_uzi_first_refire 0.2
set g_balance_uzi_first_ammo 1
+
set g_balance_uzi_sustained_damage 10
set g_balance_uzi_sustained_force 10
set g_balance_uzi_sustained_spread 0.08
set g_balance_uzi_sustained_refire 0.1
set g_balance_uzi_sustained_ammo 1
+
set g_balance_uzi_speed 18000
set g_balance_uzi_bulletconstant 115 // 13.1qu
// }}}
set g_balance_grenadelauncher_bouncefactor 0.5
set g_balance_grenadelauncher_bouncestop 0.075
// }}}
-// {{{ minelayer // TODO
+// {{{ minelayer
set g_balance_minelayer_damage 35
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
set g_balance_minelayer_remote_radius 200
set g_balance_minelayer_remote_force 300
// }}}
-// {{{ electro // TODO
+// {{{ electro
set g_balance_electro_lightning 1
set g_balance_electro_primary_damage 90
set g_balance_electro_primary_edgedamage 0
set g_balance_electro_combo_comboradius 0
set g_balance_electro_combo_speed 400
// }}}
-// {{{ crylink
+// {{{ crylink
set g_balance_crylink_primary_damage 10
set g_balance_crylink_primary_edgedamage 0
set g_balance_crylink_primary_force -55
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_joindelay 0
set g_balance_crylink_primary_joinspread 0
set g_balance_crylink_primary_jointime 0
set g_balance_crylink_primary_joinexplode 0
set g_balance_crylink_secondary_animtime 0.2
set g_balance_crylink_secondary_ammo 2
set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joindelay 0
set g_balance_crylink_secondary_joinspread 0
set g_balance_crylink_secondary_jointime 0
set g_balance_crylink_secondary_joinexplode 0
set g_balance_crylink_primary_animtime 0.3
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_joindelay 0
set g_balance_crylink_primary_joinspread 0.2
set g_balance_crylink_primary_jointime 0.1
set g_balance_crylink_primary_joinexplode 0
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_joindelay 0
set g_balance_crylink_secondary_joinspread 0
set g_balance_crylink_secondary_jointime 0
set g_balance_crylink_secondary_joinexplode 0
set g_balance_sniperrifle_bursttime 0
set g_balance_sniperrifle_primary_tracer 1
set g_balance_sniperrifle_primary_damage 60
-set g_balance_sniperrifle_primary_headshotaddeddamage 100
+set g_balance_sniperrifle_primary_headshotaddeddamage 60
set g_balance_sniperrifle_primary_spread 0
set g_balance_sniperrifle_primary_force 2
set g_balance_sniperrifle_primary_speed 40000
set g_balance_sniperrifle_secondary 1
set g_balance_sniperrifle_secondary_tracer 0
set g_balance_sniperrifle_secondary_damage 42
-set g_balance_sniperrifle_secondary_headshotaddeddamage 70
+set g_balance_sniperrifle_secondary_headshotaddeddamage 42
set g_balance_sniperrifle_secondary_spread 0
set g_balance_sniperrifle_secondary_force 2
set g_balance_sniperrifle_secondary_speed 20000
// {{{ pickup items
set g_pickup_ammo_anyway 1
set g_pickup_weapons_anyway 1
-
set g_pickup_shells 20
set g_pickup_shells_weapon 10
set g_pickup_shells_max 50
-
set g_pickup_nails 60
set g_pickup_nails_weapon 60
set g_pickup_nails_max 300
-
set g_pickup_rockets 25
set g_pickup_rockets_weapon 15
set g_pickup_rockets_max 150
-
set g_pickup_cells 30
set g_pickup_cells_weapon 20
set g_pickup_cells_max 300
-
set g_pickup_fuel 25
set g_pickup_fuel_weapon 15
set g_pickup_fuel_jetpack 50
set g_pickup_fuel_max 999
-
set g_pickup_armorsmall 5
set g_pickup_armorsmall_max 999
set g_pickup_armorsmall_anyway 0
-
set g_pickup_armormedium 25
set g_pickup_armormedium_max 100
set g_pickup_armormedium_anyway 0
-
set g_pickup_armorbig 50
set g_pickup_armorbig_max 150
set g_pickup_armorbig_anyway 0
-
set g_pickup_armorlarge 100
set g_pickup_armorlarge_max 999
set g_pickup_armorlarge_anyway 0
-
set g_pickup_healthsmall 5
set g_pickup_healthsmall_max 999
set g_pickup_healthsmall_anyway 0
-
set g_pickup_healthmedium 25
set g_pickup_healthmedium_max 100
set g_pickup_healthmedium_anyway 0
-
set g_pickup_healthlarge 50
set g_pickup_healthlarge_max 150
set g_pickup_healthlarge_anyway 0
-
set g_pickup_healthmega 100
set g_pickup_healthmega_max 999
set g_pickup_healthmega_anyway 0
-
set g_pickup_respawntime_short 15
set g_pickup_respawntime_medium 20
set g_pickup_respawntime_long 30
set g_pickup_respawntime_powerup 120
set g_pickup_respawntime_weapon 20
set g_pickup_respawntime_ammo 15
-
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
set g_balance_shotgun_secondary_refire 1.1
set g_balance_shotgun_secondary_animtime 1
// }}}
-
// {{{ uzi
set g_balance_uzi_mode 1 // Activates varible spread for sustained & burst mode secondary
set g_balance_uzi_spread_min 0.02
set g_balance_grenadelauncher_bouncefactor 0.5
set g_balance_grenadelauncher_bouncestop 0.075
// }}}
-// {{{ minelayer // TODO
+// {{{ minelayer
set g_balance_minelayer_damage 35
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
set g_balance_electro_primary_falloff_maxdist 850
set g_balance_electro_primary_falloff_halflifedist 425
-
set g_balance_electro_secondary_damage 25
set g_balance_electro_secondary_edgedamage 0
set g_balance_electro_secondary_force 50
set g_balance_electro_secondary_count 3
set g_balance_electro_secondary_bouncefactor 0.5
set g_balance_electro_secondary_bouncestop 0.075
-
set g_balance_electro_combo_damage 80
set g_balance_electro_combo_edgedamage 10
set g_balance_electro_combo_force 150
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_joindelay 0
set g_balance_crylink_primary_joinspread 0.1
set g_balance_crylink_primary_jointime 0
set g_balance_crylink_primary_joinexplode 1 //if != 0 do a extra damage pass when projectiles join
set g_balance_crylink_primary_joinexplode_radius 200
set g_balance_crylink_primary_joinexplode_force 400
set g_balance_crylink_primary_linkexplode 0
+
set g_balance_crylink_primary_middle_lifetime 5
set g_balance_crylink_primary_middle_fadetime 0.25
set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
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_joindelay 0
set g_balance_crylink_secondary_joinspread 0
set g_balance_crylink_secondary_jointime 0
set g_balance_crylink_secondary_joinexplode 0
set g_balance_hagar_secondary_refire 0.15
set g_balance_hagar_secondary_ammo 1
// }}}
-// {{{ rocketlauncher // TODO
+// {{{ rocketlauncher
set g_balance_rocketlauncher_damage 120
set g_balance_rocketlauncher_edgedamage 25
set g_balance_rocketlauncher_force 350
set g_balance_hlac_secondary_radius 50
set g_balance_hlac_secondary_speed 15000
set g_balance_hlac_secondary_lifetime 3
+
set g_balance_hlac_secondary_refire 1
set g_balance_hlac_secondary_animtime 0.7
set g_balance_hlac_secondary_ammo 10
set g_balance_seeker_flac_speed_up 500
set g_balance_seeker_flac_speed_z 0
set g_balance_seeker_flac_spread 0.25
-
set g_balance_seeker_missile_accel 1400
set g_balance_seeker_missile_ammo 2
set g_balance_seeker_missile_animtime 0.3
set g_balance_seeker_missile_speed_max 1400
set g_balance_seeker_missile_spread 0
set g_balance_seeker_missile_turnrate 0.65
-
set g_balance_seeker_tag_ammo 1
set g_balance_seeker_tag_animtime 0.3
set g_balance_seeker_tag_damageforcescale 4
--- /dev/null
+#!/bin/sh
+
+main=balanceXonotic.cfg
+for X in balance*.cfg; do
+ case "$X" in
+ "$main")
+ ;;
+ *)
+ perl ../../misc/tools/cfgapply.pl "$main" "$X" > "$X.new" && mv "$X.new" "$X"
+ ;;
+ esac
+done
+git diff
// next R_RenderScene call
drawstring('0 0 0', "", '1 1 0', '1 1 1', 0, 0);
- if(autocvar_r_fakelight >= 2 || autocvar_r_fullbright >= 1)
+ if(autocvar_r_fakelight >= 2 || autocvar_r_fullbright)
if not(serverflags & SERVERFLAG_ALLOW_FULLBRIGHT)
{
// apply night vision effect
{
return strcat( // fteqcc sucks
"ping pl name | ",
- "-teams,race,lms/kills -teams,lms/deaths -teams,lms,race,ka/suicides -race,dm,tdm,ka/frags ", // tdm already has this in "score"
+ "-teams,race,lms/kills +freezetag/kills -teams,lms/deaths +freezetag/deaths -teams,lms,race,ka/suicides +freezetag/suicides -race,dm,tdm,ka,freezetag/frags ", // tdm already has this in "score"
"+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ",
"+lms/lives +lms/rank ",
"+kh/caps +kh/pushes +kh/destroyed ",
"?+race/laps ?+race/time ?+race/fastest ",
- "+as/objectives +nexball/faults +nexball/goals +ka/drops +ka/pickups +ka/bckills ",
+ "+as/objectives +nexball/faults +nexball/goals +ka/drops +ka/pickups +ka/bckills +freezetag/revivals ",
"-lms,race,nexball/score");
}
self.anticheat_div0_evade_offset = 0;
}
+string anticheat_display(float f, float mi, float ma)
+{
+ string s;
+ s = ftos(f);
+ if(f <= mi)
+ return strcat(s, ":N");
+ if(f >= ma)
+ return strcat(s, ":Y");
+ return strcat(s, ":-");
+}
+
void anticheat_report()
{
if(!autocvar_sv_eventlog)
GameLogEcho(strcat(":anticheat:speedhack:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_speedhack))));
GameLogEcho(strcat(":anticheat:div0_strafebot_old:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_div0_strafebot_old))));
GameLogEcho(strcat(":anticheat:div0_strafebot_new:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_div0_strafebot_new))));
- GameLogEcho(strcat(":anticheat:div0_evade:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_div0_evade))));
+ GameLogEcho(strcat(":anticheat:div0_evade:", ftos(self.playerid), ":", anticheat_display(MEAN_EVALUATE(anticheat_div0_evade), 0.15, 0.3)));
}
void anticheat_serverframe()
}
if(other.assault_sprite)
+ {
WaypointSprite_Disown(other.assault_sprite, waypointsprite_deadlifetime);
+ if(other.classname == "func_assault_destructible")
+ other.sprite = world;
+ }
else
return; // already activated! cannot activate again!
for(ent = world; (ent = find(ent, target, self.targetname)); )
{
if(ent.assault_sprite != world)
+ {
WaypointSprite_Disown(ent.assault_sprite, waypointsprite_deadlifetime);
+ if(ent.classname == "func_assault_destructible")
+ ent.sprite = world;
+ }
spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
spr.assault_decreaser = self;
spr.classname = "sprite_waypoint";
WaypointSprite_UpdateRule(spr, assault_attacker_team, SPRITERULE_TEAMPLAY);
if(ent.classname == "func_assault_destructible")
+ {
WaypointSprite_UpdateSprites(spr, "as-defend", "as-destroy", "as-destroy");
+ WaypointSprite_UpdateMaxHealth(spr, ent.max_health);
+ WaypointSprite_UpdateHealth(spr, ent.health);
+ ent.sprite = spr;
+ }
else
WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
float autocvar_g_balance_crylink_primary_damage;
float autocvar_g_balance_crylink_primary_edgedamage;
float autocvar_g_balance_crylink_primary_force;
+float autocvar_g_balance_crylink_primary_joindelay;
float autocvar_g_balance_crylink_primary_joinexplode;
float autocvar_g_balance_crylink_primary_joinexplode_damage;
float autocvar_g_balance_crylink_primary_joinexplode_edgedamage;
float autocvar_g_balance_crylink_secondary_damage;
float autocvar_g_balance_crylink_secondary_edgedamage;
float autocvar_g_balance_crylink_secondary_force;
+float autocvar_g_balance_crylink_secondary_joindelay;
float autocvar_g_balance_crylink_secondary_joinexplode;
float autocvar_g_balance_crylink_secondary_joinexplode_damage;
float autocvar_g_balance_crylink_secondary_joinexplode_edgedamage;
void ClientKill_Now_TeamChange();
void freezetag_CheckWinner();
-void freezetag_Unfreeze();
void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
void func_breakable_behave_restore()
{
self.health = self.max_health;
+ if(self.sprite)
+ {
+ WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
+ WaypointSprite_UpdateHealth(self.sprite, self.health);
+ }
self.takedamage = DAMAGE_AIM;
self.event_damage = func_breakable_damage;
self.state = 0;
if(self.team)
if(attacker.team == self.team)
return;
+ self.health = self.health - damage;
if(self.sprite)
+ {
WaypointSprite_Ping(self.sprite);
- self.health = self.health - damage;
+ WaypointSprite_UpdateHealth(self.sprite, self.health);
+ }
func_breakable_colormod();
if(self.health <= 0)
if((arena_roundbased && time < warmup) || (time < game_starttime))
return;
+ if(g_freezetag && self.freezetag_frozen)
+ return;
+
makevectors(self.v_angle);
s = self.cvar_cl_gunalign;
start_armorvalue = 0;
start_weapons = WEPBIT_MINSTANEX;
weapon_action(WEP_MINSTANEX, WR_PRECACHE);
- start_ammo_cells = cvar("g_minstagib_ammo_start");
g_minstagib_invis_alpha = cvar("g_minstagib_invis_alpha");
- start_ammo_fuel = cvar("g_start_ammo_fuel");
if (g_minstagib_invis_alpha <= 0)
g_minstagib_invis_alpha = -1;
if(!cvar("g_use_ammunition"))
start_items |= IT_UNLIMITED_AMMO;
- if(start_items & IT_UNLIMITED_WEAPON_AMMO)
+ if(g_minstagib)
+ {
+ start_ammo_cells = cvar("g_minstagib_ammo_start");
+ start_ammo_fuel = cvar("g_start_ammo_fuel");
+ }
+ else if(start_items & IT_UNLIMITED_WEAPON_AMMO)
{
for (j = WEP_FIRST; j <= WEP_LAST; ++j)
{
// checks if the current item may be spawned (self.items and self.weapons may be read and written to, as well as the ammo_ fields)
// return error to request removal
+MUTATOR_HOOKABLE(TurretSpawn);
+ // return error to request removal
+ // INPUT: self - turret
+
MUTATOR_HOOKABLE(OnEntityPreSpawn);
// return error to prevent entity spawn, or modify the entity
{
precache_model("models/ice/ice.md3");
warmup = time + autocvar_g_start_delay + autocvar_g_freezetag_warmup;
+ ScoreRules_freezetag();
}
void freezetag_CheckWinner()
entity e, winner;
string teamname;
+ winner = world;
FOR_EACH_PLAYER(e)
{
if(winner != world) // just in case a winner wasn't found
{
- TeamScore_AddToTeam(winner.team, ST_SCORE, +1);
if(winner.team == COLOR_TEAM1)
teamname = "^1Red Team";
else if(winner.team == COLOR_TEAM2)
centerprint(e, strcat(teamname, "^5 wins the round, all other teams were frozen.\n"));
}
bprint(teamname, "^5 wins the round since all the other teams were frozen.\n");
+ TeamScore_AddToTeam(winner.team, ST_SCORE, +1);
}
next_round = time + 5;
}
+// this is needed to allow the player to turn his view around (fixangle can't
+// be used to freeze his view, as that also changes the angles), while not
+// turning that ice object with the player
void freezetag_Ice_Think()
{
setorigin(self, self.owner.origin - '0 0 16');
self.nextthink = time;
}
-void freezetag_Freeze()
+void freezetag_Freeze(entity attacker)
{
self.freezetag_frozen = 1;
ice.frame = floor(random() * 21); // ice model has 20 different looking frames
setmodel(ice, "models/ice/ice.md3");
- self.movement = '0 0 0';
+ entity oldself;
+ oldself = self;
+ self = ice;
+ freezetag_Ice_Think();
+ self = oldself;
// add waypoint
WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE);
{
WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1');
}
+
+ if(attacker == self)
+ {
+ // you froze your own dumb self
+ // counted as "suicide" already
+ PlayerScore_Add(self, SP_SCORE, -1);
+ }
+ else if(attacker.classname == "player")
+ {
+ // got frozen by an enemy
+ // counted as "kill" and "death" already
+ PlayerScore_Add(self, SP_SCORE, -1);
+ PlayerScore_Add(attacker, SP_SCORE, +1);
+ }
+ else
+ {
+ // nothing - got frozen by the game type rules themselves
+ }
}
-void freezetag_Unfreeze()
+void freezetag_Unfreeze(entity attacker)
{
self.freezetag_frozen = 0;
if(totalspawned > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that)
freezetag_CheckWinner();
- freezetag_Unfreeze();
+ freezetag_Unfreeze(world);
return 1;
}
--pinkalive;
--totalalive;
- freezetag_Freeze();
+ freezetag_Freeze(frag_attacker);
}
if(frag_attacker.classname == STR_PLAYER)
MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
{
- freezetag_Unfreeze(); // start by making sure that all ice blocks are removed
+ freezetag_Unfreeze(world); // start by making sure that all ice blocks are removed
if(totalspawned == 1 && time > game_starttime) // only one player active on server, start a new match immediately
if(!next_round && warmup && (time < warmup - autocvar_g_freezetag_warmup || time > warmup)) // not awaiting next round
if(warmup && time > warmup) // spawn too late, freeze player
{
centerprint(self, "^1You spawned after the round started, you'll spawn as frozen.\n");
- freezetag_Freeze();
+ freezetag_Freeze(world);
}
return 1;
self.freezetag_revive_progress = (time - self.freezetag_beginrevive_time) / autocvar_g_freezetag_revive_time;
if(time - self.freezetag_beginrevive_time >= autocvar_g_freezetag_revive_time)
{
- freezetag_Unfreeze();
+ freezetag_Unfreeze(self);
+ entity o;
+ o = other;
+
+ // EVERY team mate nearby gets a point (even if multiple!)
+ float n;
+ FOR_EACH_PLAYER(other) if(self != other)
+ {
+ if(other.freezetag_frozen == 0)
+ {
+ if(other.team == self.team)
+ {
+ teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax);
+ if(teammate_nearby)
+ {
+ PlayerScore_Add(other, SP_FREEZETAG_REVIVALS, +1);
+ PlayerScore_Add(other, SP_SCORE, +1);
+ ++n;
+ }
+ }
+ }
+ }
- centerprint(self, strcat("^5You were revived by ^7", other.netname, ".\n"));
- centerprint(other, strcat("^5You revived ^7", self.netname, ".\n"));
- bprint("^7", other.netname, "^5 revived ^7", self.netname, ".\n");
+ if(n > 1)
+ centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5 et al.\n"));
+ else
+ centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5.\n"));
+ centerprint(o, strcat("^5You revived ^7", self.netname, "^5.\n"));
+ bprint("^7", o.netname, "^5 revived ^7", self.netname, "^5.\n");
self.freezetag_beginrevive_time = -9999;
self.freezetag_revive_progress = 0;
}
void ScoreRules_generic()
{
- CheckAllowedTeams(world);
if(teams_matter)
{
CheckAllowedTeams(world);
ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_DROPS, "drops", SFL_LOWER_IS_BETTER);
ScoreRules_basics_end();
}
+
+// FreezeTag stuff
+#define SP_FREEZETAG_REVIVALS 4
+void ScoreRules_freezetag()
+{
+ CheckAllowedTeams(world);
+ ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE); // SFL_SORT_PRIO_PRIMARY
+ ScoreInfo_SetLabel_PlayerScore(SP_FREEZETAG_REVIVALS, "revivals", 0);
+ ScoreRules_basics_end();
+}
vector turret_stdproc_aim_generic()
{
- vector pre_pos,prep;
- float distance,impact_time,i,mintime;
+ vector pre_pos, prep;
+ float distance, impact_time, i, mintime;
turret_tag_fire_update();
if(self.aim_flags & TFL_AIM_SIMPLE)
return real_origin(self.enemy);
- mintime = max(self.attack_finished_single - time,0) + sys_frametime ;
+ mintime = max(self.attack_finished_single - time,0) + sys_frametime;
// Baseline
pre_pos = real_origin(self.enemy);
// thorw head slightly off aim when hit?
if (self.damage_flags & TFL_DMG_HEADSHAKE)
{
- //baseent.tur_aimoff_x += (random() * damage);
- //baseent.tur_aimoff_y += ((random()*0.75) * damage);
self.tur_head.angles_x = self.tur_head.angles_x + (-0.5 + random()) * damage;
self.tur_head.angles_y = self.tur_head.angles_y + (-0.5 + random()) * damage;
}
if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
self.velocity = self.velocity + vforce;
- // FIXME: Better damage feedback
- // Start burning when we have 10% or less health left
- //if (self.health < (self.tur_health * 0.1))
- // self.effects = EF_FLAME;
-
+ // FIXME: Better damage feedback?
+
if (self.health <= 0)
{
self.event_damage = SUB_Null;
if (self.ammo < self.ammo_max)
self.ammo = min(self.ammo + self.ammo_recharge, self.ammo_max);
+ if (self.health < (self.tur_health * 0.5))
+ if(random() < 0.25)
+ te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
+
// Inactive turrets needs to run the think loop,
// So they can handle animation and wake up if need be.
if not (self.tur_active)
{
e = spawn();
+ /*
setorigin(e,'0 0 0');
setmodel(e,"models/turrets/plasma.md3");
vector v;
//crash();
}
setmodel(e,"");
+ */
e.classname = "turret_manager";
e.think = turrets_manager_think;
// Offsets & origins
if (!self.tur_shotorg) self.tur_shotorg = '50 0 50';
+// Gane hooks
+ if(MUTATOR_CALLHOOK(TurretSpawn))
+ return 0;
+
// End of default & sanety checks, start building the turret.
// Spawn extra bits
activator = ee;
self.use();
}
-
+
turret_stdproc_respawn();
return 1;
}
void turret_fusionreactor_dinit();
void turret_fusionreactor_fire();
-float turret_fusionreactor_firecheck()
-{
- if (self.enemy == world) return 0;
- if not (self.enemy.ammo_flags & TFL_AMMO_RECIVE) return 0;
- if not (self.enemy.ammo_flags & TFL_AMMO_ENERGY) return 0;
- if (self.ammo < self.shot_dmg) return 0;
- if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
- if (self.tur_dist_aimpos > self.target_range) return 0;
- if (self.tur_dist_aimpos < self.target_range_min) return 0;
-
- return 1;
-}
-
void turret_fusionreactor_fire()
{
vector fl_org;
self.enemy.ammo = min(self.enemy.ammo + self.shot_dmg,self.enemy.ammo_max);
fl_org = 0.5 * (self.enemy.absmin + self.enemy.absmax);
te_smallflash(fl_org);
- //te_lightning1(world,self.origin,self.enemy.origin);
}
void turret_fusionreactor_postthink()
{
- float f;
- f = self.ammo / self.ammo_max;
- self.tur_head.avelocity = '0 250 0' * f;
+ self.tur_head.avelocity = '0 250 0' * (self.ammo / self.ammo_max);
}
+/*
void turret_fusionreactor_respawnhook()
{
self.tur_head.avelocity = '0 50 0';
}
+*/
+
+/**
+** Preforms pre-fire checks for fusionreactor
+**/
+float turret_fusionreactor_firecheck()
+{
+ if (self.attack_finished_single > time)
+ return 0;
+
+ if (self.enemy.deadflag != DEAD_NO)
+ return 0;
+
+ if (self.enemy == world)
+ return 0;
+
+ if (self.ammo < self.shot_dmg)
+ return 0;
+
+ if (self.enemy.ammo >= self.enemy.ammo_max)
+ return 0;
+
+ if (vlen(self.enemy.origin - self.origin) > self.target_range)
+ return 0;
+
+ if(self.team != self.enemy.team)
+ return 0;
+
+ if not (self.enemy.ammo_flags & TFL_AMMO_ENERGY)
+ return 0;
+
+ return 1;
+}
void turret_fusionreactor_dinit()
{
self.shoot_flags = TFL_SHOOT_HITALLVALID;
self.aim_flags = TFL_AIM_NO;
self.track_flags = TFL_TRACK_NO;
- self.turret_respawnhook = turret_fusionreactor_respawnhook;
+ // self.turret_respawnhook = turret_fusionreactor_respawnhook;
if (turret_stdproc_init("fusreac_std",0,"models/turrets/base.md3","models/turrets/reactor.md3") == 0)
{
proj.fade_rate = 1 / autocvar_g_balance_crylink_primary_other_fadetime;
proj.nextthink = time + autocvar_g_balance_crylink_primary_other_lifetime + autocvar_g_balance_crylink_primary_other_fadetime;
}
+ proj.teleport_time = time + autocvar_g_balance_crylink_primary_joindelay;
proj.cnt = autocvar_g_balance_crylink_primary_bounces;
//proj.scale = 1 + 1 * proj.cnt;
proj.fade_rate = 1 / autocvar_g_balance_crylink_secondary_line_fadetime;
proj.nextthink = time + autocvar_g_balance_crylink_secondary_line_lifetime + autocvar_g_balance_crylink_secondary_line_fadetime;
}
+ proj.teleport_time = time + autocvar_g_balance_crylink_secondary_joindelay;
proj.cnt = autocvar_g_balance_crylink_secondary_bounces;
//proj.scale = 1 + 1 * proj.cnt;
}
else
{
- if (self.crylink_waitrelease)
+ if (self.crylink_waitrelease && (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time))
{
// fired and released now!
if(self.crylink_lastgroup)
vector pos;
entity linkjoineffect;
-
if(self.crylink_waitrelease == 1)
{
pos = W_Crylink_LinkJoin(self.crylink_lastgroup, autocvar_g_balance_crylink_primary_joinspread * autocvar_g_balance_crylink_primary_speed, autocvar_g_balance_crylink_primary_jointime);
linkjoineffect.nextthink = time + w_crylink_linkjoin_time;
linkjoineffect.owner = self;
setorigin(linkjoineffect, pos);
-
-
}
self.crylink_waitrelease = 0;
if(!w_crylink(WR_CHECKAMMO1) && !w_crylink(WR_CHECKAMMO2))
{
charge = autocvar_g_balance_nex_charge_mindmg / mydmg + (1 - autocvar_g_balance_nex_charge_mindmg / mydmg) * self.nex_charge;
self.nex_charge *= autocvar_g_balance_nex_charge_shot_multiplier; // do this AFTER setting mydmg/myforce
- // O RLY? -- divVerent
- // YA RLY -- FruitieX
+ // O RLY? -- divVerent
+ // YA RLY -- FruitieX
}
else
charge = 1;
myforce *= charge;
W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", CHAN_WEAPON, mydmg);
- if(charge > autocvar_g_balance_nex_charge_limit && autocvar_g_balance_nex_charge_limit) // if the Nex is overcharged, we play an extra sound
- {
- sound (self, CHAN_WEAPON2, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * autocvar_g_balance_nex_charge_limit) / (1 - 0.5 * autocvar_g_balance_nex_charge_limit), ATTN_NORM);
- }
+ if(charge > autocvar_g_balance_nex_charge_limit && autocvar_g_balance_nex_charge_limit) // if the Nex is overcharged, we play an extra sound
+ {
+ sound (self, CHAN_WEAPON2, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * autocvar_g_balance_nex_charge_limit) / (1 - 0.5 * autocvar_g_balance_nex_charge_limit), ATTN_NORM);
+ }
yoda = 0;
FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, WEP_NEX);
//beam and muzzle flash done on client
SendCSQCNexBeamParticle(charge);
-
+
// flash and burn the wall
if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
Damage_DamageInfo(trace_endpos, mydmg, 0, 0, myforce * w_shotdir, WEP_NEX, self);
if(autocvar_g_balance_nex_charge && self.nex_charge < autocvar_g_balance_nex_charge_limit)
self.nex_charge = min(1, self.nex_charge + autocvar_g_balance_nex_charge_rate * frametime / W_TICSPERFRAME);
- if(autocvar_g_balance_nex_charge)
- {
- self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_limit);
- self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_limit);
- self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_limit);
-
- if(self.nex_charge > autocvar_g_balance_nex_charge_limit)
- {
- self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_limit) / (1 - autocvar_g_balance_nex_charge_limit);
- self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_limit) / (1 - autocvar_g_balance_nex_charge_limit);
- self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_limit) / (1 - autocvar_g_balance_nex_charge_limit);
- }
- }
-
if(autocvar_g_balance_nex_secondary_chargepool)
- if(self.nex_chargepool_ammo < 1)
- {
- if(self.nex_chargepool_pauseregen_finished < time)
- self.nex_chargepool_ammo = min(1, self.nex_chargepool_ammo + autocvar_g_balance_nex_secondary_chargepool_regen * frametime / W_TICSPERFRAME);
- self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_nex_secondary_chargepool_pause_health_regen);
- }
+ if(self.nex_chargepool_ammo < 1)
+ {
+ if(self.nex_chargepool_pauseregen_finished < time)
+ self.nex_chargepool_ammo = min(1, self.nex_chargepool_ammo + autocvar_g_balance_nex_secondary_chargepool_regen * frametime / W_TICSPERFRAME);
+ self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_nex_secondary_chargepool_pause_health_regen);
+ }
if (self.BUTTON_ATCK)
{
weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nex_primary_animtime, w_ready);
}
}
- if (self.BUTTON_ATCK2)
+ if ((autocvar_g_balance_nex_secondary_charge && !autocvar_g_balance_nex_secondary) ? self.BUTTON_ZOOM : self.BUTTON_ATCK2)
{
if(autocvar_g_balance_nex_secondary_charge)
{
self.nex_charge_rottime = time + autocvar_g_balance_nex_charge_rot_pause;
dt = frametime / W_TICSPERFRAME;
- if(autocvar_g_balance_nex_secondary_chargepool)
+ if(self.nex_charge < 1)
{
- if(autocvar_g_balance_nex_secondary_ammo)
+ if(autocvar_g_balance_nex_secondary_chargepool)
{
- // always deplete if secondary is held
- self.nex_chargepool_ammo = max(0, self.nex_chargepool_ammo - autocvar_g_balance_nex_secondary_ammo * dt);
+ if(autocvar_g_balance_nex_secondary_ammo)
+ {
+ // always deplete if secondary is held
+ self.nex_chargepool_ammo = max(0, self.nex_chargepool_ammo - autocvar_g_balance_nex_secondary_ammo * dt);
- dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
- self.nex_chargepool_pauseregen_finished = time + autocvar_g_balance_nex_secondary_chargepool_pause_regen;
- dt = min(dt, self.nex_chargepool_ammo);
- dt = max(0, dt);
+ dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
+ self.nex_chargepool_pauseregen_finished = time + autocvar_g_balance_nex_secondary_chargepool_pause_regen;
+ dt = min(dt, self.nex_chargepool_ammo);
+ dt = max(0, dt);
- self.nex_charge += dt * autocvar_g_balance_nex_secondary_charge_rate;
+ self.nex_charge += dt * autocvar_g_balance_nex_secondary_charge_rate;
+ }
}
- }
- else if(autocvar_g_balance_nex_secondary_ammo)
- {
- if(self.nex_charge < 1)
+ else if(autocvar_g_balance_nex_secondary_ammo)
{
- dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ if(self.BUTTON_ATCK2) // only eat ammo when the button is pressed
{
- dt = min(dt, (self.ammo_cells - autocvar_g_balance_nex_primary_ammo) / autocvar_g_balance_nex_secondary_ammo);
- dt = max(0, dt);
- if(dt > 0)
+ dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
- self.ammo_cells = max(autocvar_g_balance_nex_secondary_ammo, self.ammo_cells - autocvar_g_balance_nex_secondary_ammo * dt);
+ dt = min(dt, (self.ammo_cells - autocvar_g_balance_nex_primary_ammo) / autocvar_g_balance_nex_secondary_ammo);
+ dt = max(0, dt);
+ if(dt > 0)
+ {
+ self.ammo_cells = max(autocvar_g_balance_nex_secondary_ammo, self.ammo_cells - autocvar_g_balance_nex_secondary_ammo * dt);
+ }
}
+ self.nex_charge += dt * autocvar_g_balance_nex_secondary_charge_rate;
}
+ }
+
+ else
+ {
+ dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
self.nex_charge += dt * autocvar_g_balance_nex_secondary_charge_rate;
}
}
}
}
}
+
+ if(autocvar_g_balance_nex_charge)
+ {
+ self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_limit);
+ self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_limit);
+ self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_limit);
+
+ if(self.nex_charge > autocvar_g_balance_nex_charge_limit)
+ {
+ self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_limit) / (1 - autocvar_g_balance_nex_charge_limit);
+ self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_limit) / (1 - autocvar_g_balance_nex_charge_limit);
+ self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_limit) / (1 - autocvar_g_balance_nex_charge_limit);
+ }
+ }
}
else if (req == WR_PRECACHE)
{
e.SendFlags |= 32;
}
+.float waypointsprite_pingtime;
void WaypointSprite_Ping(entity e)
{
+ // anti spam
+ if(time < e.waypointsprite_pingtime)
+ return;
+ e.waypointsprite_pingtime = time + 0.3;
// ALWAYS sends (this causes a radar circle), thus no check
e.cnt |= 0x80;
e.SendFlags |= 32;