// }}}
// {{{ regen/rot
-set g_balance_health_regen 0
-set g_balance_health_regenlinear 5
+set g_balance_health_regen 0.08
+set g_balance_health_regenlinear 0.5
set g_balance_pause_health_regen 5
set g_balance_pause_health_regen_spawn 0
set g_balance_health_rot 0.04
-set g_balance_health_rotlinear 1
-set g_balance_pause_health_rot 0.5
+set g_balance_health_rotlinear 0.75
+set g_balance_pause_health_rot 1
set g_balance_pause_health_rot_spawn 5
set g_balance_health_regenstable 100
set g_balance_health_rotstable 100
set g_balance_armor_regen 0
set g_balance_armor_regenlinear 0
set g_balance_armor_rot 0.04
-set g_balance_armor_rotlinear 1
+set g_balance_armor_rotlinear 0.75
set g_balance_pause_armor_rot 1
set g_balance_pause_armor_rot_spawn 5
set g_balance_armor_regenstable 100
// {{{ laser
set g_balance_laser_primary_damage 25
set g_balance_laser_primary_edgedamage 12.5
-set g_balance_laser_primary_force 175
+set g_balance_laser_primary_force 250
set g_balance_laser_primary_radius 70
set g_balance_laser_primary_speed 6000
set g_balance_laser_primary_spread 0
set g_balance_laser_primary_shotangle 0
set g_balance_laser_primary_delay 0
set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 2 // 350 upforce
-set g_balance_laser_primary_force_velocitybias 0.3
+set g_balance_laser_primary_force_zscale 1.5
+set g_balance_laser_primary_force_velocitybias 0
set g_balance_laser_primary_force_other_scale 1
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 25
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_damage 16
+set g_balance_uzi_first_force 5
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 14
-set g_balance_uzi_sustained_force 20
+set g_balance_uzi_sustained_force 5
set g_balance_uzi_sustained_spread 0.04
set g_balance_uzi_sustained_refire 0.1
set g_balance_uzi_sustained_ammo 1
set g_balance_electro_secondary_health 5
set g_balance_electro_secondary_damageforcescale 4
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_secondary_bouncefactor 0.4
+set g_balance_electro_secondary_bouncestop 0.05
set g_balance_electro_combo_damage 40
set g_balance_electro_combo_edgedamage 20
set g_balance_electro_combo_force 120
set g_balance_electro_combo_radius 175
-set g_balance_electro_combo_comboradius 250
+set g_balance_electro_combo_comboradius 275
set g_balance_electro_combo_speed 2000
set g_balance_electro_reload_ammo 0 //default: 20
set g_balance_electro_reload_time 2
set g_balance_minstanex_reload_ammo 0 //default: 50
set g_balance_minstanex_reload_time 2
// }}}
-// {{{ hagar // TO BE REMOVED
+// {{{ hagar
set g_balance_hagar_primary_damage 30
set g_balance_hagar_primary_edgedamage 15
set g_balance_hagar_primary_force 50
set g_balance_hagar_primary_refire 0.15
set g_balance_hagar_primary_ammo 1
set g_balance_hagar_secondary 1
-set g_balance_hagar_secondary_load 0
+set g_balance_hagar_secondary_load 1
set g_balance_hagar_secondary_load_speed 0.6
set g_balance_hagar_secondary_load_max 4
-set g_balance_hagar_secondary_load_hold 0
-set g_balance_hagar_secondary_load_releasedeath 1
+set g_balance_hagar_secondary_load_hold 1
+set g_balance_hagar_secondary_load_releasedeath 0
set g_balance_hagar_secondary_load_abort 1
-set g_balance_hagar_secondary_damage 35
-set g_balance_hagar_secondary_edgedamage 17.5
-set g_balance_hagar_secondary_force 100
-set g_balance_hagar_secondary_radius 65
-set g_balance_hagar_secondary_spread 0.015
+set g_balance_hagar_secondary_damage 30
+set g_balance_hagar_secondary_edgedamage 15
+set g_balance_hagar_secondary_force 50
+set g_balance_hagar_secondary_radius 70
+set g_balance_hagar_secondary_spread 0.05
set g_balance_hagar_secondary_speed 2000
set g_balance_hagar_secondary_lifetime_min 10
set g_balance_hagar_secondary_lifetime_rand 0
seta hud_contents_water_color "0.4 0.3 0.3"
seta hud_shownames 1 "draw names and health/armor of nearby players"
-seta hud_shownames_enemies 2 "1 = draw names of enemies you point at, 2 = draw names of all enemies in view"
-seta hud_shownames_status 2 "1 = draw health/armor status of teammates, 2 = same as 1, but draw health/armor icons with a question mark on enemies in teamgames"
-seta hud_shownames_height 15 "height of icons"
+seta hud_shownames_enemies 2 "1 = draw names of enemies you point at (TODO), 2 = draw names of all enemies in view"
+seta hud_shownames_status 1 "1 = draw health/armor status of teammates"
+seta hud_shownames_statusbar_height 4 "height of status bar"
seta hud_shownames_aspect 8 "aspect ratio of total drawing area per name"
-seta hud_shownames_fontsize 13 "font size"
+seta hud_shownames_fontsize 12 "font size"
seta hud_shownames_decolorize 1 "1 = decolorize name in team games, 2 = decolorize always"
seta hud_shownames_alpha 0.7 "alpha"
seta hud_shownames_resize 1 "enable resizing of the names, then the size cvars will correspond to the maximum size"
seta hud_shownames_maxdistance 2500 "alpha/size is 0 at this distance"
seta hud_shownames_antioverlap 1 "if two tags get too close to each other, fade out the one further away from you"
seta hud_shownames_antioverlap_distance 125 "2d distance to other tag after which to fade out"
+seta hud_shownames_offset 52 "offset (along z-axis) tag from player origin by this many units"
// scoreboard
seta scoreboard_columns default
// for menu server list (eventually make them have engine support?)
seta menu_slist_showfull 1 "show servers even if they are full and have no slots to join"
seta menu_slist_showempty 1 "show servers even if they are no empty and have no opponents to play against"
-set menu_slist_modfilter "=" // set to either: !modname or modname. modname of = means "same as we are running now".
+seta menu_slist_modfilter "" // set to either: !modname or modname. modname of = means "same as we are running now".
// for menu weapon arena
set menu_weaponarena_with_laser 0 "also enable the Laser in this weapon arena"
exec balanceXonotic.cfg
exec ctfscoring-ai.cfg
exec effects-normal.cfg
-exec physicsX0.cfg
+exec physicsX.cfg
exec turrets.cfg
// hud cvar descriptions
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_waterfriction -1
sv_airaccel_sideways_friction 0 // breaks strafing?
sv_airaccel_qw 0.92
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 20
sv_maxairstrafespeed 100
sv_waterfriction -1
sv_airaccel_sideways_friction 0.65
sv_airaccel_qw 0.95
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0 // breaks strafing?
sv_airaccel_qw -0.8
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate -0.95
sv_airstrafeaccelerate 24
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw -0.8
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 3
sv_airstrafeaccelerate 24
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_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0.35
sv_airaccel_qw 0.95
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 0
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 0
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 0
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 0
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 0
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0.3
sv_airaccel_qw 0.93
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0.35
sv_airaccel_qw 0.95
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0.35
sv_airaccel_qw 0.95
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw -0.9475
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 3
sv_airstrafeaccelerate 24
sv_waterfriction -1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0.8
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0.5
sv_airaccel_qw 0.93
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction -1
sv_airaccel_sideways_friction 0.3
sv_airaccel_qw 0.93
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 1
+sv_airaccel_qw_stretchfactor 0
sv_airstopaccelerate 2
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
--- /dev/null
+// current Xonotic physics
+sv_gravity 800
+sv_maxspeed 360
+sv_maxairspeed 360
+
+sv_stopspeed 100
+sv_accelerate 15
+sv_airaccelerate 2
+sv_friction 8
+edgefriction 1
+sv_stepheight 26
+// 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
+sv_airaccel_qw -0.8
+sv_airaccel_qw_stretchfactor 2
+
+sv_airstopaccelerate 3
+sv_airstrafeaccelerate 24
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.95
+sv_aircontrol 125
+sv_aircontrol_penalty 180
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 800
+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 ""
+sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
+++ /dev/null
-// "NoQWBunny" physics based on XPM
-sv_gravity 800
-sv_maxspeed 360
-sv_maxairspeed 360
-
-sv_stopspeed 100
-sv_accelerate 15
-sv_airaccelerate 2
-sv_friction 8
-edgefriction 1
-sv_stepheight 26
-// 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
-sv_airaccel_qw -0.8
-
-sv_airstopaccelerate 3
-sv_airstrafeaccelerate 24
-sv_maxairstrafespeed 100
-sv_airstrafeaccel_qw -0.95
-sv_aircontrol 125
-sv_aircontrol_penalty 180
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 700
-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 ""
-sv_jumpspeedcap_max_disable_on_ramps 1
-g_teleport_maxspeed 0
--- /dev/null
+// Xonotic 0.1.0preview physics
+sv_gravity 800
+sv_maxspeed 360
+sv_maxairspeed 400
+
+sv_stopspeed 100
+sv_accelerate 15
+sv_airaccelerate 2
+sv_friction 8
+edgefriction 1
+sv_stepheight 26
+// 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
+sv_airaccel_qw -0.8
+sv_airaccel_qw_stretchfactor 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 800
+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 ""
+sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw 0.95
+sv_airaccel_qw_stretchfactor 0
// CPMA: 1
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_waterfriction 1
sv_airaccel_sideways_friction 0
sv_airaccel_qw -0.9146875
+sv_airaccel_qw_stretchfactor 0
+sv_airaccel_qw_stretchfactor 0
// CPMA: 1
sv_airstopaccelerate 6.5625 // matches strafe-stopping speed
sv_airstrafeaccelerate 14
// --------------------------------------------------------------------------
// BEGIN OPTIONAL CSQC FUNCTIONS
+void Ent_RemoveEntCS()
+{
+ entcs_receiver[self.sv_entnum] = world;
+}
void Ent_ReadEntCS()
{
+ float sf;
InterpolateOrigin_Undo();
self.classname = "entcs_receiver";
- self.sv_entnum = ReadByte() - 1;
- self.origin_x = ReadShort();
- self.origin_y = ReadShort();
- self.origin_z = ReadShort();
- self.angles_y = ReadByte() * 360.0 / 256;
- self.origin_z = self.angles_x = self.angles_z = 0;
+ sf = ReadByte();
+
+ if(sf & 1)
+ self.sv_entnum = ReadByte();
+ if(sf & 2)
+ {
+ self.origin_x = ReadShort();
+ self.origin_y = ReadShort();
+ self.origin_z = ReadShort();
+ }
+ if(sf & 4)
+ {
+ self.angles_y = ReadByte() * 360.0 / 256;
+ self.angles_x = self.angles_z = 0;
+ }
+ if(sf & 8)
+ self.healthvalue = ReadByte() * 10;
+ if(sf & 16)
+ self.armorvalue = ReadByte() * 10;
+
+ entcs_receiver[self.sv_entnum] = self;
+ self.entremove = Ent_RemoveEntCS;
InterpolateOrigin_Note();
}
}
}
-void Ent_ShowNames()
-{
- float sf;
-
- // entity init, TODO can this be done only once somehow?
- self.the_entnum = ReadByte(); // TODO: fixme to only send once somehow
- self.draw2d = Draw_ShowNames;
- //self.movetype = MOVETYPE_FLY; // movetype needed so we can traceline?
- self.mins = '-20 -20 -24';
- self.maxs = '20 20 45';
- self.classname = "shownames_tag";
-
- sf = ReadByte();
-
- if(sf & 1)
- {
- self.origin_x = ReadShort();
- self.origin_y = ReadShort();
- self.origin_z = ReadShort();
- }
- if(sf & 2)
- {
- self.healthvalue = ReadByte();
- }
- if(sf & 4)
- {
- self.armorvalue = ReadByte();
- }
-
- if(sf & 128) // same team
- self.sameteam = TRUE;
- else
- self.sameteam = FALSE;
-}
-
// CSQC_Ent_Update : Called every frame that the server has indicated an update to the SSQC / CSQC entity has occured.
// The only parameter reflects if the entity is "new" to the client, meaning it just came into the client's PVS.
void Ent_RadarLink();
case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
- case ENT_CLIENT_SHOWNAMES: Ent_ShowNames(); break;
default:
//error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
error(sprintf(_("Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: %s)\n"), self.enttype, num_for_edict(self), self.classname));
if(self.draw2d)
self.draw2d();
self = e;
+ Draw_ShowNames_All();
scoreboard_active = HUD_WouldDrawScoreboard();
CSQC_common_hud();
// crosshair goes VERY LAST
- if(!scoreboard_active && !camera_active && intermission != 2) {
+ if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1) {
string wcross_style;
float wcross_alpha, wcross_resolution;
wcross_style = autocvar_crosshair;
float autocvar_hud_shownames;
float autocvar_hud_shownames_enemies;
float autocvar_hud_shownames_status;
-float autocvar_hud_shownames_height;
+float autocvar_hud_shownames_statusbar_height;
float autocvar_hud_shownames_aspect;
float autocvar_hud_shownames_fontsize;
float autocvar_hud_shownames_decolorize;
float autocvar_hud_shownames_maxdistance;
float autocvar_hud_shownames_antioverlap;
float autocvar_hud_shownames_antioverlap_distance;
+float autocvar_hud_shownames_offset;
string autocvar_hud_skin;
float autocvar_loddebug;
float autocvar_menu_mouse_speed;
#define SCOREPANEL_MAX_ENTRIES 6
#define SCOREPANEL_ASPECTRATIO 2
const float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES);
- const float height = mySize_y/entries;
- const vector fontsize = '0.9 0.9 0' * height;
- pos_y += height * (1 - 0.9) / 2;
+ const vector fontsize = '1 1 0' * (mySize_y/entries);
vector rgb, score_color;
rgb = '1 1 1';
i, first_pl = 0;
if (autocvar__hud_configure)
{
+ float players_per_team;
if (team_count)
{
// show team scores in the first line
float score_size = mySize_x / team_count;
- for(tm = teams.sort_next; tm; tm = tm.sort_next) {
- if(tm.team == COLOR_SPECTATOR)
- continue;
- if (tm.team == myteam)
- HUD_Panel_DrawHighlight(pos - eY * (height * (1 - 0.9) / 2) + eX * score_size * i, eX * score_size + eY * height, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(pos + eX * score_size * i, ftos(123), eX * score_size + eY * fontsize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
- ++i;
+ players_per_team = max(2, ceil((entries - 1) / team_count));
+ for(i=0; i<team_count; ++i) {
+ if (i == floor((entries - 2) / players_per_team) || (entries == 1 && i == 0))
+ HUD_Panel_DrawHighlight(pos + eX * score_size * i, eX * score_size + eY * fontsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(pos + eX * score_size * i, ftos(175 - 23*i), eX * score_size + eY * fontsize_y, GetTeamRGB(ColorByTeam(i)) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
}
first_pl = 1;
- pos_y += height;
+ pos_y += fontsize_y;
}
score = 10 + SCOREPANEL_MAX_ENTRIES * 3;
for (i=first_pl; i<entries; ++i)
if (i == entries-1 && autocvar_hud_panel_score_rankings == 1)
{
rgb = '1 1 0';
- drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawfill(pos, eX * mySize_x + eY * fontsize_y, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
s = GetPlayerName(pl.sv_entnum);
score = 7;
}
}
if (team_count)
- score_color = GetTeamRGB(ColorByTeam(mod(i + 2, team_count))) * 0.8;
+ score_color = GetTeamRGB(ColorByTeam(floor((i - first_pl) / players_per_team))) * 0.8;
s = textShortenToWidth(s, name_size, fontsize, stringwidth_colors);
drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring(pos + eX * (name_size + spacing_size), ftos(score), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
- pos_y += height;
+ pos_y += fontsize_y;
}
return;
}
if(tm.team == COLOR_SPECTATOR)
continue;
if (tm.team == myteam)
- drawfill(pos - eY * (height * (1 - 0.9) / 2) + eX * score_size * i, eX * score_size + eY * height, '1 1 1', highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawfill(pos + eX * score_size * i, eX * score_size + eY * fontsize_y, '1 1 1', highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring_aspect(pos + eX * score_size * i, ftos(tm.(teamscores[ts_primary])), eX * score_size + eY * fontsize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
++i;
}
first_pl = 1;
- pos_y += height;
+ pos_y += fontsize_y;
+ tm = teams.sort_next;
}
i = first_pl;
- for (pl = players.sort_next; pl && i<entries; pl = pl.sort_next, ++i)
+
+ do
+ for (pl = players.sort_next; pl && i<entries; pl = pl.sort_next)
{
- if (pl.team == COLOR_SPECTATOR)
+ if ((team_count && pl.team != tm.team) || pl.team == COLOR_SPECTATOR)
continue;
if (i == entries-1 && !me_printed && pl != me)
if (i == first_pl)
rgb = '0 1 0'; //first: green
me_printed = 1;
- drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawfill(pos, eX * mySize_x + eY * fontsize_y, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
if (team_count)
score_color = GetTeamRGB(pl.team) * 0.8;
s = textShortenToWidth(GetPlayerName(pl.sv_entnum), name_size, fontsize, stringwidth_colors);
drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring(pos + eX * (name_size + spacing_size), ftos(pl.(scores[ps_primary])), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
- pos_y += height;
+ pos_y += fontsize_y;
+ ++i;
}
+ while (i<entries && team_count && (tm = tm.sort_next) && (tm.team != COLOR_SPECTATOR || (tm = tm.sort_next)));
}
void HUD_Score(void)
fontsize = '0.20 0.20 0' * mySize_y;
float a;
- if(spectatee_status != 0)
- a = 1;
- else
- a = panel_fg_alpha;
+ a = panel_fg_alpha;
string s;
if(!autocvar__hud_configure)
{
if(spectatee_status && !intermission)
{
+ a = 1;
if(spectatee_status == -1)
s = _("^1Observing");
else
hud_fade_alpha = (1 - scoreboard_fade_alpha);
if(intermission == 2) // no hud during mapvote
+ {
+ if (autocvar__hud_configure) //force exit from hud config
+ {
+ if (menu_enabled)
+ {
+ menu_enabled = 0;
+ localcmd("togglemenu\n");
+ }
+ cvar_set("_hud_configure", "0");
+ }
hud_fade_alpha = 0;
+ }
else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0)
hud_fade_alpha = 1;
float g_balance_electro_secondary_bouncefactor;
float g_balance_electro_secondary_bouncestop;
float g_trueaim_minrange;
+
+entity entcs_receiver[255]; // 255 is the engine limit on maxclients
R_EndPolygon();
}
}
+
+const vector GETPLAYERORIGIN_ERROR = '1123581321 2357111317 3141592653'; // way out of bounds for anything on the map
+vector getplayerorigin(float pl)
+{
+ string s;
+ entity e;
+
+ s = getplayerkey(pl, "TEMPHACK_origin");
+ if(s != "")
+ return stov(s);
+
+ e = entcs_receiver[pl];
+ if(e)
+ return e.origin;
+
+ return GETPLAYERORIGIN_ERROR;
+}
// self.sameteam = player is on same team as local client
//
const float SHOWNAMES_FADESPEED = 4;
-void Draw_ShowNames()
+void Draw_ShowNames(entity ent)
{
- if(!autocvar_hud_shownames)
- return;
-
- if(self.sameteam || (!self.sameteam && autocvar_hud_shownames_enemies))
- {
- InterpolateOrigin_Do();
-
- if(!self.sameteam)
- {
- traceline(self.origin, view_origin, 1, self);
-
- /* WIP, why does trace_ent != self not work as intended here?
- if(autocvar_hud_shownames_enemies != 2) // player has to point at enemy if so
- {
- traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, MOVETYPE_FLY, world);
- print("trace_endpos: ", vtos(trace_endpos), " view_origin: ", vtos(view_origin), "\n");
- if(trace_ent != self)
- return;
- }*/
- }
-
- vector o, eo;
- o = project_3d_to_2d(self.origin);
- float overlap;
-
- if(autocvar_hud_shownames_antioverlap)
- {
- // fade tag out if another tag that is closer to you overlaps
- entity e;
- for(e = world; (e = find(e, classname, "shownames_tag")); )
- {
- if(e == self)
- continue;
- eo = project_3d_to_2d(e.origin);
- if not(eo_z < 0 || eo_x < 0 || eo_y < 0 || eo_x > vid_conwidth || eo_y > vid_conheight)
- {
- eo_z = 0;
- if(vlen((eX * o_x + eY * o_y) - eo) < autocvar_hud_shownames_antioverlap_distance && vlen(self.origin - view_origin) > vlen(e.origin - view_origin))
- {
- overlap = TRUE;
- break;
- }
- }
- }
- }
-
- if(!self.sameteam && trace_endpos != view_origin) // out of view, fade out
- self.alpha = max(0, self.alpha - SHOWNAMES_FADESPEED * frametime);
- else if(!self.healthvalue) // dead player, fade out slowly
- self.alpha = max(0, self.alpha - SHOWNAMES_FADESPEED * 0.25 * frametime);
- else if(overlap) // tag overlap detected, fade out
- self.alpha = max(0, self.alpha - SHOWNAMES_FADESPEED * frametime);
- else // fade in
- self.alpha = min(1, self.alpha + SHOWNAMES_FADESPEED * frametime);
-
- if(!self.alpha)
- return;
-
- float dist;
- dist = vlen(self.origin - view_origin);
-
- float a;
- a = autocvar_hud_shownames_alpha;
- a *= self.alpha;
- if(autocvar_hud_shownames_maxdistance)
- {
- if(dist >= autocvar_hud_shownames_maxdistance)
- return;
- a *= ((autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance) - max(0, dist - autocvar_hud_shownames_mindistance)) / (autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance);
- }
-
- if(!a)
- return;
-
- float resize;
- resize = 1;
- if(autocvar_hud_shownames_resize) // limit resize so its never smaller than 0.5... gets unreadable
- resize = 0.5 + 0.5 * ((autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance) - max(0, dist - autocvar_hud_shownames_mindistance)) / (autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance);
-
- // draw the sprite image
- if not(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
- {
- o_z = 0;
-
- vector myPos, mySize;
- mySize = (eX * autocvar_hud_shownames_aspect + eY) * autocvar_hud_shownames_height;
- myPos = o - '0.5 0 0' * mySize_x - '0 1 0' * mySize_y;
-
- // size scaling
- mySize_x *= resize;
- mySize_y *= resize;
-
- myPos_x += 0.5 * (mySize_x / resize - mySize_x);
- myPos_y += (mySize_y / resize - mySize_y);
-
- vector iconpos, iconsize; // these determine icon position/size, if any
- vector namepos; // this is where the origin of the string
- float namesize; // total area where we can draw the string
-
- iconpos = myPos;
-
- if(autocvar_hud_shownames_status && teamplay)
- {
- if(self.sameteam)
- {
- iconsize = eX * 2 * mySize_y + eY * mySize_y;
- // "ghost" backgrounds
- drawpic_aspect_skin(iconpos, "health", '1 1 0' * iconsize_y, '0 0 0', a * 0.5, DRAWFLAG_NORMAL);
- drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor", '1 1 0' * iconsize_y, '0 0 0', a * 0.5, DRAWFLAG_NORMAL);
-
- if(self.healthvalue > 0)
- {
- drawsetcliparea(0, myPos_y + iconsize_y - iconsize_y * min(1, self.healthvalue/autocvar_hud_panel_healtharmor_maxhealth), vid_conwidth, myPos_y + iconsize_y);
- drawpic_aspect_skin(iconpos, "health", '1 1 0' * iconsize_y, '1 1 1', a, DRAWFLAG_NORMAL);
- }
-
- if(self.armorvalue > 0)
- {
- drawsetcliparea(0, myPos_y + iconsize_y - iconsize_y * min(1, self.armorvalue/autocvar_hud_panel_healtharmor_maxarmor), vid_conwidth, myPos_y + iconsize_y);
- drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor", '1 1 0' * iconsize_y, '1 1 1', a, DRAWFLAG_NORMAL);
- }
- drawresetcliparea();
- }
- else if(autocvar_hud_shownames_status == 2)
- {
- iconsize = eX * 2 * mySize_y + eY * mySize_y;
- drawpic_aspect_skin(iconpos, "health_unknown", '1 1 0' * iconsize_y, '0 0 0', a, DRAWFLAG_NORMAL);
- drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor_unknown", '1 1 0' * iconsize_y, '0 0 0', a, DRAWFLAG_NORMAL);
- }
- }
-
- namepos = myPos + eX * 2 * iconsize_y + eY * 0.5 * resize * (autocvar_hud_shownames_height - autocvar_hud_shownames_fontsize);
- namesize = mySize_x - 2 * iconsize_y;
-
- string s;
- s = GetPlayerName(self.the_entnum-1);
- if((autocvar_hud_shownames_decolorize == 1 && teamplay) || autocvar_hud_shownames_decolorize == 2)
- s = playername(s, GetPlayerColor(self.the_entnum-1));
-
- drawfontscale = '1 1 0' * resize;
- s = textShortenToWidth(s, namesize, '1 1 0' * autocvar_hud_shownames_fontsize, stringwidth_colors);
-
- float width;
- width = stringwidth(s, TRUE, '1 1 0' * autocvar_hud_shownames_fontsize);
-
- if (width != namesize)
- namepos_x += (namesize - width) / 2;
- drawcolorcodedstring(namepos, s, '1 1 0' * autocvar_hud_shownames_fontsize, a, DRAWFLAG_NORMAL);
- drawfontscale = '1 1 0';
- }
- }
+ if(!autocvar_hud_shownames)
+ return;
+
+ if(ent.sv_entnum == player_localentnum && !autocvar_chase_active)
+ return;
+
+ if(ent.sameteam || (!ent.sameteam && autocvar_hud_shownames_enemies))
+ {
+ ent.origin_z += autocvar_hud_shownames_offset;
+
+ if(!ent.sameteam)
+ {
+ /* WIP, why does trace_ent != ent not work as intended here?
+ if(autocvar_hud_shownames_enemies != 2) // player has to point at enemy if so
+ {
+ traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, MOVETYPE_FLY, world);
+ print("trace_endpos: ", vtos(trace_endpos), " view_origin: ", vtos(view_origin), "\n");
+ if(trace_ent != ent)
+ return;
+ }*/
+
+ traceline(ent.origin, view_origin, 1, ent);
+ }
+
+ vector o, eo;
+ o = project_3d_to_2d(ent.origin);
+ float overlap;
+
+ if(autocvar_hud_shownames_antioverlap)
+ {
+ // fade tag out if another tag that is closer to you overlaps
+ entity e;
+ for(e = world; (e = find(e, classname, "shownames_tag")); )
+ {
+ if(e == ent)
+ continue;
+ eo = project_3d_to_2d(e.origin);
+ if not(eo_z < 0 || eo_x < 0 || eo_y < 0 || eo_x > vid_conwidth || eo_y > vid_conheight)
+ {
+ eo_z = 0;
+ if(vlen((eX * o_x + eY * o_y) - eo) < autocvar_hud_shownames_antioverlap_distance && vlen(ent.origin - view_origin) > vlen(e.origin - view_origin))
+ {
+ overlap = TRUE;
+ break;
+ }
+ }
+ }
+ }
+
+ if(!ent.sameteam && trace_endpos != view_origin) // out of view, fade out
+ ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
+ else if(ent.healthvalue < 1) // dead player, fade out slowly
+ ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * 0.25 * frametime);
+ else if(overlap) // tag overlap detected, fade out
+ ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
+ else // fade in
+ ent.alpha = min(1, ent.alpha + SHOWNAMES_FADESPEED * frametime);
+
+ if(!ent.alpha)
+ return;
+
+ float dist;
+ dist = vlen(ent.origin - view_origin);
+
+ float a;
+ a = autocvar_hud_shownames_alpha;
+ a *= ent.alpha;
+ if(autocvar_hud_shownames_maxdistance)
+ {
+ if(dist >= autocvar_hud_shownames_maxdistance)
+ return;
+ a *= ((autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance) - max(0, dist - autocvar_hud_shownames_mindistance)) / (autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance);
+ }
+
+ if(!a)
+ return;
+
+ float resize;
+ resize = 1;
+ if(autocvar_hud_shownames_resize) // limit resize so its never smaller than 0.5... gets unreadable
+ resize = 0.5 + 0.5 * ((autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance) - max(0, dist - autocvar_hud_shownames_mindistance)) / (autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance);
+
+ // draw the sprite image
+ if not(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
+ {
+ o_z = 0;
+
+ vector myPos, mySize;
+ mySize = (eX * autocvar_hud_shownames_aspect + eY) * autocvar_hud_shownames_fontsize;
+ myPos = o - '0.5 0 0' * mySize_x - '0 1 0' * mySize_y;
+
+ // size scaling
+ mySize_x *= resize;
+ mySize_y *= resize;
+
+ myPos_x += 0.5 * (mySize_x / resize - mySize_x);
+ myPos_y += (mySize_y / resize - mySize_y);
+
+ vector namepos; // this is where the origin of the string
+ float namewidth;
+
+ namepos = myPos;
+ namewidth = mySize_x;
+
+ if(autocvar_hud_shownames_status && teamplay)
+ {
+ if(ent.sameteam)
+ {
+ if(ent.healthvalue > 0)
+ {
+ HUD_Panel_DrawProgressBar(namepos + '0 1 0' * autocvar_hud_shownames_fontsize * resize, eX * 0.5 * mySize_x + eY * resize * autocvar_hud_shownames_statusbar_height, "nametag_statusbar", ent.healthvalue/autocvar_hud_panel_healtharmor_maxhealth, 0, 1, '1 0 0', a, DRAWFLAG_NORMAL);
+
+ if(ent.armorvalue > 0)
+ HUD_Panel_DrawProgressBar(namepos + '0 1 0' * autocvar_hud_shownames_fontsize * resize + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * resize * autocvar_hud_shownames_statusbar_height, "nametag_statusbar", ent.armorvalue/autocvar_hud_panel_healtharmor_maxarmor, 0, 0, '0 1 0', a, DRAWFLAG_NORMAL);
+ }
+ }
+ }
+
+ string s;
+ s = GetPlayerName(ent.sv_entnum-1);
+ if((autocvar_hud_shownames_decolorize == 1 && teamplay) || autocvar_hud_shownames_decolorize == 2)
+ s = playername(s, GetPlayerColor(ent.sv_entnum-1));
+
+ drawfontscale = '1 1 0' * resize;
+ s = textShortenToWidth(s, namewidth, '1 1 0' * autocvar_hud_shownames_fontsize, stringwidth_colors);
+
+ float width;
+ width = stringwidth(s, TRUE, '1 1 0' * autocvar_hud_shownames_fontsize);
+
+ if (width != namewidth)
+ namepos_x += (namewidth - width) / 2;
+ drawcolorcodedstring(namepos, s, '1 1 0' * autocvar_hud_shownames_fontsize, a, DRAWFLAG_NORMAL);
+ drawfontscale = '1 1 0';
+ }
+ }
+}
+
+entity shownames_ent[255];
+void Draw_ShowNames_All()
+{
+ float i;
+ for(i = 0; i < maxclients; ++i)
+ {
+ vector o;
+ float t;
+ t = GetPlayerColor(i);
+ if(t == COLOR_SPECTATOR)
+ continue;
+
+ entity e;
+ e = shownames_ent[i];
+ if(!e)
+ {
+ e = spawn();
+ e.classname = "shownames_tag";
+ e.sv_entnum = i+1;
+ shownames_ent[i] = e;
+ }
+
+ entity entcs;
+ entcs = entcs_receiver[i];
+ if(entcs)
+ {
+ e.healthvalue = entcs.healthvalue;
+ e.armorvalue = entcs.armorvalue;
+ e.sameteam = 1; /* (teamplay && (t == myteam)); */
+ }
+ else
+ {
+ e.healthvalue = 2342;
+ e.armorvalue = 0;
+ e.sameteam = 0;
+ }
+
+ e.origin = getplayerorigin(i);
+ if(e.origin == GETPLAYERORIGIN_ERROR)
+ continue;
+
+ Draw_ShowNames(e);
+ }
}
var float autocvar_sv_accuracy_data_share = 1;
string autocvar_sv_adminnick;
float autocvar_sv_airaccel_qw;
+float autocvar_sv_airaccel_qw_stretchfactor;
float autocvar_sv_airaccel_sideways_friction;
float autocvar_sv_airaccelerate;
float autocvar_sv_aircontrol;
float autocvar_sv_airstopaccelerate;
float autocvar_sv_airstrafeaccel_qw;
float autocvar_sv_airstrafeaccelerate;
-float autocvar_sv_allow_shownames;
float autocvar_sv_autoscreenshot;
float autocvar_sv_cheats;
float autocvar_sv_curl_serverpackages_auto;
float autocvar_welcome_message_time;
float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
float autocvar_g_trueaim_minrange;
-float autocvar_sv_shownames_cull_distance;
{
// we request a spawn for a team, and we have team
// spawns, but that team has no spawns?
- if(have_team_spawns[0])
+ if(have_team_spawns_forteam[0])
// try noteam spawns
teamcheck = 0;
else
else
teamcheck = self.team; // MUST be team
}
- else if(have_team_spawns == 0 && have_team_spawns[0])
+ else if(have_team_spawns == 0 && have_team_spawns_forteam[0])
teamcheck = 0; // MUST be noteam
else
teamcheck = -1;
ctf_clientconnect();
}*/
- if(teams_matter || radar_showennemies)
- attach_entcs();
+ attach_entcs();
bot_relinkplayerlist();
set_dom_state(self);
CheatInitClient();
-
- PlayerStats_AddPlayer(self);
-
- self.shownames = spawn();
- self.shownames.owner = self;
- self.shownames.think = shownames_think;
- self.shownames.nextthink = time;
- self.shownames.customizeentityforclient = shownames_customize;
- Net_LinkEntity(self.shownames, FALSE, 0, SendEntity_ShowNames);
}
/*
=============
*/
.entity chatbubbleentity;
-.entity teambubbleentity;
void ReadyCount();
void ClientDisconnect (void)
{
if (self.chatbubbleentity)
remove (self.chatbubbleentity);
- if (self.teambubbleentity)
- remove (self.teambubbleentity);
-
if (self.killindicator)
remove (self.killindicator);
self.playerid = 0;
ReadyCount();
- remove(self.shownames);
-
// free cvars
GetCvars(-1);
}
}
-void TeamBubbleThink()
-{
- self.nextthink = time;
- if (!self.owner.modelindex || self.owner.teambubbleentity != self)
- {
- if(self.owner) // but why can that ever be world?
- self.owner.teambubbleentity = world;
- remove(self);
- return;
- }
-// setorigin(self, self.owner.origin + '0 0 15' + self.owner.maxs_z * '0 0 1'); // bandwidth hog. setattachment does this now
- if (self.owner.BUTTON_CHAT || self.owner.deadflag || self.owner.killindicator)
- self.model = "";
- else
- self.model = self.mdl;
-
-};
-
-float TeamBubble_customizeentityforclient()
-{
- return (self.owner != other && self.owner.team == other.team && other.killcount > -666);
-}
-
-void UpdateTeamBubble()
-{
- if (!self.modelindex || !teams_matter)
- return;
- // spawn a teambubble entity if needed
- if (!self.teambubbleentity && teams_matter)
- {
- self.teambubbleentity = spawn();
- self.teambubbleentity.owner = self;
- self.teambubbleentity.exteriormodeltoclient = self;
- self.teambubbleentity.think = TeamBubbleThink;
- self.teambubbleentity.nextthink = time;
- setmodel(self.teambubbleentity, "models/misc/teambubble.spr"); // precision set below
-// setorigin(self.teambubbleentity, self.origin + '0 0 15' + self.maxs_z * '0 0 1');
- setorigin(self.teambubbleentity, '0 0 15' + self.maxs_z * '0 0 1');
- setattachment(self.teambubbleentity, self, ""); // sticks to moving player better, also conserves bandwidth
- self.teambubbleentity.mdl = self.teambubbleentity.model;
- self.teambubbleentity.model = self.teambubbleentity.mdl;
- self.teambubbleentity.customizeentityforclient = TeamBubble_customizeentityforclient;
- self.teambubbleentity.effects = EF_LOWPRECISION;
- }
-}
-
// LordHavoc: this hack will be removed when proper _pants/_shirt layers are
// added to the model skins
/*void UpdateColorModHack()
if(self.classname == "player") {
CheckRules_Player();
UpdateChatBubble();
- UpdateTeamBubble();
if (self.impulse)
ImpulseCommands();
if (intermission_running)
// sv_airaccel_sideways_friction 0
// prvm_globalset server speedclamp_mode 1
// (or 2)
-void PM_Accelerate(vector wishdir, float wishspeed, float wishspeed0, float accel, float accelqw, float sidefric, float speedlimit)
+void PM_Accelerate(vector wishdir, float wishspeed, float wishspeed0, float accel, float accelqw, float stretchfactor, float sidefric, float speedlimit)
{
float vel_straight;
float vel_z;
float vel_xy_backward, vel_xy_forward;
float speedclamp;
- speedclamp = (accelqw < 0);
- if(speedclamp)
+ if(stretchfactor > 0)
+ speedclamp = stretchfactor;
+ else if(accelqw < 0)
+ speedclamp = 1; // full clamping, no stretch
+ else
+ speedclamp = -1; // no clamping
+
+ if(accelqw < 0)
accelqw = -accelqw;
if(autocvar_sv_gameplayfix_q2airaccelerate)
vel_xy = vel_straight * wishdir + vel_perpend;
- if(speedclamp)
+ if(speedclamp >= 0)
{
- // ensure we don't get too fast or decelerate faster than we should
- vel_xy_current = min(vlen(vel_xy), vel_xy_forward);
- if(vel_xy_current > 0) // prevent division by zero
- vel_xy = normalize(vel_xy) * vel_xy_current;
+ float vel_xy_preclamp;
+ vel_xy_preclamp = vlen(vel_xy);
+ if(vel_xy_preclamp > 0) // prevent division by zero
+ {
+ vel_xy_current += (vel_xy_forward - vel_xy_current) * speedclamp;
+ if(vel_xy_current < vel_xy_preclamp)
+ vel_xy = vel_xy * (vel_xy_current / vel_xy_preclamp);
+ }
}
self.velocity = vel_xy + vel_z * '0 0 1';
if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
wishspeed = self.stat_sv_maxspeed*maxspd_mod;
if (time >= self.teleport_time)
- PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
}
else if (self.waterlevel >= WATERLEVEL_SWIMMING)
{
self.velocity = self.velocity * (1 - frametime * autocvar_sv_friction);
// water acceleration
- PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
}
else if (time < self.ladder_time)
{
if (time >= self.teleport_time)
{
// water acceleration
- PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
}
}
else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!autocvar_g_jetpack_fuel || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO))
if (self.crouch)
wishspeed = wishspeed * 0.5;
if (time >= self.teleport_time)
- PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
}
else
{
if(autocvar_sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0)
PM_AirAccelerate(wishdir, wishspeed);
else
- PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, autocvar_sv_airaccel_sideways_friction / maxairspd, self.stat_sv_airspeedlimit_nonqw);
+ PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, autocvar_sv_airaccel_qw_stretchfactor, autocvar_sv_airaccel_sideways_friction / maxairspd, self.stat_sv_airspeedlimit_nonqw);
if(autocvar_sv_aircontrol)
CPM_PM_Aircontrol(wishdir, wishspeed2);
}
}
-// sendflags use: 1 = origin, 2 = health (0 or 1 for dead/alive on enemies), 4 = armor, 0x80 = same team (includes health)
-float SendEntity_ShowNames(entity to, float sendflags)
-{
- float the_health;
- the_health = self.health;
-
- WriteByte(MSG_ENTITY, ENT_CLIENT_SHOWNAMES);
- WriteByte(MSG_ENTITY, num_for_edict(self.owner));
-
- sendflags = sendflags & 127;
- if(teams_matter && self.owner.team == to.team)
- sendflags |= 128;
- else if(self.owner.health >= 1)
- the_health = 1;
-
- WriteByte(MSG_ENTITY, sendflags);
- if(sendflags & 1)
- {
- WriteShort(MSG_ENTITY, rint(self.origin_x));
- WriteShort(MSG_ENTITY, rint(self.origin_y));
- WriteShort(MSG_ENTITY, rint(self.origin_z));
- }
- if(sendflags & 2)
- {
- WriteByte(MSG_ENTITY, the_health);
- }
- if(sendflags & 4)
- {
- WriteByte(MSG_ENTITY, self.armorvalue);
- }
- return TRUE;
-}
-
-const vector SHOWNAMES_ORIGIN_OFFSET = '0 0 48';
-void shownames_think()
-{
- if(self.origin - SHOWNAMES_ORIGIN_OFFSET != self.owner.origin)
- {
- setorigin(self, self.owner.origin + SHOWNAMES_ORIGIN_OFFSET);
- self.SendFlags |= 1;
- }
- if(self.health != max(0, floor(self.owner.health)) || self.armorvalue != max(0, floor(self.owner.armorvalue)))
- {
- self.health = max(0, floor(self.owner.health));
- self.armorvalue = max(0, floor(self.owner.armorvalue));
- self.SendFlags |= 2;
- }
- if(self.armorvalue != max(0, floor(self.owner.armorvalue)))
- {
- self.armorvalue = max(0, floor(self.owner.armorvalue));
- self.SendFlags |= 4;
- }
- self.nextthink = time;
-}
-
-float shownames_customize()
-{
- if(self.owner.classname == "player") // only send players, no spectators!
- if(self.owner != other) // no need to spam own coordinates
- if(vlen(other.origin - self.origin) < autocvar_sv_shownames_cull_distance) // distance cull
- if(self.owner.team == other.team || (self.owner.team != other.team && checkpvs(self.origin, other)))
- return TRUE;
-
- return FALSE;
-}
-
.float muted; // to be used by prvm_edictset server playernumber muted 1
float Say(entity source, float teamsay, entity privatesay, string msgin, float floodcontrol)
// message "": do not say, just test flood control
.entity muzzle_flash;
.float misc_bulletcounter; // replaces uzi & hlac bullet counter.
-
-.entity shownames;
-void shownames_think();
self.captime = time;
- FOR_EACH_PLAYER(head)
+ FOR_EACH_REALCLIENT(head)
set_dom_state(head);
};
if(other == o)
return FALSE;
if(other.classname == "player")
- if(o.team != other.team)
+ if(!teams_matter || o.team != other.team)
if not (radar_showennemies)
return FALSE;
return TRUE;
float entcs_send(entity to, float sf)
{
- entity o;
- o = self.owner;
WriteByte(MSG_ENTITY, ENT_CLIENT_ENTCS);
- WriteByte(MSG_ENTITY, num_for_edict(o));
- WriteShort(MSG_ENTITY, o.origin_x);
- WriteShort(MSG_ENTITY, o.origin_y);
- WriteShort(MSG_ENTITY, o.origin_z);
- WriteByte(MSG_ENTITY, o.angles_y * 256.0 / 360);
+ WriteByte(MSG_ENTITY, sf);
+ if(sf & 1)
+ WriteByte(MSG_ENTITY, num_for_edict(self.owner)-1);
+ if(sf & 2)
+ {
+ WriteShort(MSG_ENTITY, self.origin_x);
+ WriteShort(MSG_ENTITY, self.origin_y);
+ WriteShort(MSG_ENTITY, self.origin_z);
+ }
+ if(sf & 4)
+ WriteByte(MSG_ENTITY, self.angles_y * 256.0 / 360);
+ if(sf & 8)
+ WriteByte(MSG_ENTITY, self.health / 10); // FIXME use a better scale?
+ if(sf & 16)
+ WriteByte(MSG_ENTITY, self.armorvalue / 10); // FIXME use a better scale?
return TRUE;
};
void entcs_think()
{
- self.nextthink = time;
+ self.nextthink = time + 0.033333333333; // increase this to like 0.15 once the client can do smoothing
entity o;
o = self.owner;
- if(o.origin != self.origin || o.angles != self.angles)
+ if(o.origin != self.origin)
{
setorigin(self, o.origin);
+ self.SendFlags |= 2;
+ }
+ if(o.angles_y != self.angles_y)
+ {
self.angles = o.angles;
- self.SendFlags |= 1;
+ self.SendFlags |= 4;
+ }
+ if(o.health != self.health)
+ {
+ self.health = o.health;
+ self.SendFlags |= 8;
+ }
+ if(o.armorvalue != self.armorvalue)
+ {
+ self.armorvalue = o.armorvalue;
+ self.SendFlags |= 16;
}
};
{
if (s == "cl_weaponpriority")
self.switchweapon = w_getbestweapon(self);
+ if (s == "cl_allow_uidtracking")
+ PlayerStats_AddPlayer(self);
}
}
{
// gamemode related things
precache_model ("models/misc/chatbubble.spr");
- precache_model ("models/misc/teambubble.spr");
if (g_runematch)
{
precache_model ("models/runematch/curse.mdl");
{
if(playerstats_db < 0)
return;
+ if(e.playerstats_id)
+ return;
if(e.crypto_idfp != "" && e.cvar_cl_allow_uidtracking == 1)
e.playerstats_id = strzone(e.crypto_idfp);