set g_balance_uzi_first 1
set g_balance_uzi_first_damage 30
+set g_balance_uzi_first_headshotaddeddamage 0
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_headshotaddeddamage 0
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_first 1
set g_balance_uzi_first_damage 15 / f/ LOG: 22 -> 15
+set g_balance_uzi_first_headshotaddeddamage 0
set g_balance_uzi_first_force 50
set g_balance_uzi_first_spread 0.03
set g_balance_uzi_first_refire 0.2
set g_balance_uzi_first_ammo 2
set g_balance_uzi_sustained_damage 12 // 120 dps
+set g_balance_uzi_sustained_headshotaddeddamage 0
set g_balance_uzi_sustained_force 12
set g_balance_uzi_sustained_spread 0.06
set g_balance_uzi_sustained_refire 0.1
set g_balance_uzi_first 1
set g_balance_uzi_first_damage 26
+set g_balance_uzi_first_headshotaddeddamage 0
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_headshotaddeddamage 0
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_first 1
set g_balance_uzi_first_damage 14
+set g_balance_uzi_first_headshotaddeddamage 0
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 10 // 100 dps
+set g_balance_uzi_sustained_headshotaddeddamage 0
set g_balance_uzi_sustained_force 5
set g_balance_uzi_sustained_spread 0.03
set g_balance_uzi_sustained_refire 0.1
set g_balance_electro_primary_falloff_halflifedist 425
set g_balance_electro_secondary_damage 40
set g_balance_electro_secondary_edgedamage 20
-set g_balance_electro_secondary_force 200
+set g_balance_electro_secondary_force 50
set g_balance_electro_secondary_radius 150
set g_balance_electro_secondary_speed 900
set g_balance_electro_secondary_speed_up 200
set g_balance_uzi_first 1
set g_balance_uzi_first_damage 30
+set g_balance_uzi_first_headshotaddeddamage 0
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 14 // 120 dps
+set g_balance_uzi_sustained_headshotaddeddamage 0
set g_balance_uzi_sustained_force 12
set g_balance_uzi_sustained_spread 0.02
set g_balance_uzi_sustained_refire 0.1
cl_sound_r_exp3 ""
sv_sound_land ""
sv_sound_watersplash ""
-seta cl_sound_maptime_warning "1" "play announcer sound telling you the remaining maptime - 0: do not play at all, 1: play at one minute, 2: play at five minutes, 3: play both"
-seta cl_notify_carried_items "3" "notify you of carried items when you obtain them (e.g. flags in CTF) - 0: disabled, 1: notify of taken items, 2: notify of picking up dropped items, 3: notify of both"
seta cl_announcer default "name of the announcer you wish to use from data/sound/announcer"
+seta cl_announcer_antispam 2 "number of seconds before an announcement of the same sound can be played again"
+seta cl_announcer_maptime 3 "play announcer sound telling you the remaining maptime - 0: do not play at all, 1: play at one minute, 2: play at five minutes, 3: play both"
+seta cl_notify_carried_items "3" "notify you of carried items when you obtain them (e.g. flags in CTF) - 0: disabled, 1: notify of taken items, 2: notify of picking up dropped items, 3: notify of both"
// startmap_dm is used when running with the -listen or -dedicated commandline options
set serverconfig server.cfg
// debug
set _independent_players 0 "DO NOT TOUCH"
+set _notarget 0 "NO, REALLY, DON'T"
// define some engine cvars that we need even on dedicated server
set r_showbboxes 0
set g_playerstats_uri ""
set g_playerstats_debug 0 "when 1, player stats are dumped to the console too"
+// session locking
+locksession 1
+
// create this cvar in case the engine did not
set snd_soundradius 1200
set snd_softclip 1
float vid_conwidth, vid_conheight;
float binddb;
-// Announcer
-string announce_snd;
-
// QUALIFYING
float race_checkpoint;
float race_time;
// short mapname
string shortmapname;
-//remaining maptime announcer sounds, true when sound was already played
-float announcer_1min;
-float announcer_5min;
-
// database for misc stuff
float tempdb;
float ClientProgsDB;
#endif
string forcefog;
-string cl_announcer_prev;
void WaypointSprite_Load();
void CSQC_Init(void)
{
DamageInfo_Precache();
Vehicles_Precache();
turrets_precache();
-
- if(autocvar_cl_announcer != cl_announcer_prev) {
- Announcer_Precache();
- if(cl_announcer_prev)
- strunzone(cl_announcer_prev);
- cl_announcer_prev = strzone(autocvar_cl_announcer);
- }
+ Announcer_Precache();
Tuba_Precache();
if(autocvar_cl_reticle)
if(t != self.enttype || bIsNewEntity)
{
//print(_("A CSQC entity changed its type!\n"));
- print(sprintf(_("A CSQC entity changed its type! (edict: %d, type: %d -> %d)\n"), num_for_edict(self), self.enttype, t));
+ print(sprintf(_("A CSQC entity changed its type! (edict: %d, server: %d, type: %d -> %d)\n"), num_for_edict(self), self.entnum, self.enttype, t));
Ent_Remove();
bIsNewEntity = 1;
}
{
if(!bIsNewEntity)
{
- print(sprintf(_("A CSQC entity appeared out of nowhere! (edict: %d, type: %d)\n"), num_for_edict(self), t));
+ print(sprintf(_("A CSQC entity appeared out of nowhere! (edict: %d, server: %d, type: %d)\n"), num_for_edict(self), self.entnum, t));
bIsNewEntity = 1;
}
}
bHandled = true;
break;
case TE_CSQC_ANNOUNCE:
- announce_snd = strzone(ReadString());
+ Announcer_Play(ReadString());
bHandled = true;
break;
case TE_CSQC_KILLNOTIFY:
Net_WeaponComplain();
bHandled = true;
break;
- case TE_CSQC_VEHICLESETUP:
- Net_VehicleSetup();
- bHandled = true;
- break;
+ case TE_CSQC_VEHICLESETUP:
+ Net_VehicleSetup();
+ bHandled = true;
+ break;
default:
// No special logic for this temporary entity; return 0 so the engine can handle it
bHandled = false;
}
}
-/**
- * Checks whether the server initiated a map restart (stat_game_starttime changed)
- *
- * TODO: Use a better solution where a common shared entitiy is used that contains
- * timelimit, fraglimit and game_starttime! Requires engine changes (remove STAT_TIMELIMIT
- * and STAT_FRAGLIMIT to be auto-sent)
- */
-void CheckForGamestartChange() {
- float startTime;
- startTime = getstatf(STAT_GAMESTARTTIME);
- if (previous_game_starttime != startTime) {
- if ((time + 5.0) < startTime) {
- //if connecting to server while restart was active don't always play prepareforbattle
- sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
- }
- if (time < startTime) {
- restartAnnouncer = spawn();
- restartAnnouncer.think = restartAnnouncer_Think;
- restartAnnouncer.nextthink = startTime - floor(startTime - time); //synchronize nextthink to startTime
- }
- }
- previous_game_starttime = startTime;
-}
-
void Porto_Init()
{
porto = spawn();
CHECKFAIL_ASSERT(3, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{111}\{118}\{101}\{114}\{100}\{114}\{97}\{119}", 0);
CHECKFAIL_ASSERT(4, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{108}\{105}\{103}\{104}\{116}", 0);
CHECKFAIL_ASSERT(5, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{115}\{104}\{97}\{100}\{111}\{119}\{118}\{111}\{108}\{117}\{109}\{101}\{115}", 0);
+ CHECKFAIL_ASSERT(6, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{111}\{118}\{101}\{114}\{100}\{114}\{97}\{119}", 0);
vf_size = R_SetView3fv(VF_SIZE);
vf_min = R_SetView3fv(VF_MIN);
PostInit();
if(intermission && !isdemo() && !(calledhooks & HOOK_END))
+ {
if(calledhooks & HOOK_START)
{
localcmd("\ncl_hook_gameend\n");
calledhooks |= HOOK_END;
}
-
- CheckForGamestartChange();
- serverAnnouncer();
- maptimeAnnouncer();
- carrierAnnouncer();
+ }
+
+ Announcer();
fov = autocvar_fov;
if(fov <= 59.5)
--- /dev/null
+float previous_announcement_time;
+float previous_game_starttime;
+string previous_announcement;
+
+// remaining maptime announcer sounds, true when sound was already played
+float announcer_1min;
+float announcer_5min;
+
+void Announcer_Play(string announcement)
+{
+ if((announcement != previous_announcement) || (time >= (previous_announcement_time + autocvar_cl_announcer_antispam)))
+ {
+ sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announcement, ".wav"), VOL_BASEVOICE, ATTN_NONE);
+
+ if(previous_announcement) { strunzone(previous_announcement); }
+
+ previous_announcement = strzone(announcement);
+ previous_announcement_time = time;
+ }
+}
+
+void Announcer_Countdown()
+{
+ float starttime = getstatf(STAT_GAMESTARTTIME);
+ float countdown = (starttime - time);
+ float countdown_rounded = floor(0.5 + countdown);
+
+ if(countdown <= 0) // countdown has finished, starttime is now
+ {
+ if (!spectatee_status)
+ centerprint_generic(CPID_GAME_STARTING, _("^1Begin!"), 1, 0);
+
+ Announcer_Play("begin");
+ announcer_5min = announcer_1min = FALSE; // reset maptime announcers now as well
+ remove(self);
+ return;
+ }
+ else // countdown is still going
+ {
+ if (!spectatee_status)
+ centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded);
+
+ if(countdown_rounded <= 3 && countdown_rounded >= 1)
+ Announcer_Play(ftos(countdown_rounded));
+
+ self.nextthink = (starttime - (countdown - 1));
+ }
+}
+
+/**
+ * Checks whether the server initiated a map restart (stat_game_starttime changed)
+ *
+ * TODO: Use a better solution where a common shared entitiy is used that contains
+ * timelimit, fraglimit and game_starttime! Requires engine changes (remove STAT_TIMELIMIT
+ * and STAT_FRAGLIMIT to be auto-sent)
+ */
+void Announcer_Gamestart()
+{
+ float startTime = getstatf(STAT_GAMESTARTTIME);
+
+ if(previous_game_starttime != startTime)
+ {
+ if((time + 5.0) < startTime) // if connecting to server while restart was active don't always play prepareforbattle
+ Announcer_Play("prepareforbattle");
+
+ if(time < startTime)
+ {
+ entity e;
+ e = spawn();
+ e.think = Announcer_Countdown;
+ e.nextthink = startTime - floor(startTime - time); //synchronize nextthink to startTime
+ }
+ }
+
+ previous_game_starttime = startTime;
+}
+
+
+// Plays the 1 minute or 5 minutes (of maptime) remaining sound, if client wants it
+void Announcer_Time()
+{
+ float timelimit = getstatf(STAT_TIMELIMIT);
+ float timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
+ float warmup_timeleft;
+
+ if(warmup_stage)
+ if(autocvar_g_warmup_limit > 0)
+ warmup_timeleft = max(0, autocvar_g_warmup_limit + getstatf(STAT_GAMESTARTTIME) - time);
+
+ // 5 minute check
+ if(autocvar_cl_announcer_maptime >= 2)
+ {
+ // make sure that after connect (and e.g. 4 minutes left) we will not get a wrong sound
+ if(announcer_5min)
+ {
+ if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timeleft > 300)
+ || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft > 300))
+ announcer_5min = FALSE;
+ }
+ else
+ {
+ if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timelimit > 0 && timeleft < 300 && timeleft > 299)
+ || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft < 300 && warmup_timeleft > 299))
+ {
+ //if we're in warmup mode, check whether there's a warmup timelimit
+ if not(autocvar_g_warmup_limit == -1 && warmup_stage)
+ {
+ announcer_5min = TRUE;
+ Announcer_Play("5minutesremain");
+ }
+ }
+ }
+ }
+
+ // 1 minute check
+ if((autocvar_cl_announcer_maptime == 1) || (autocvar_cl_announcer_maptime == 3))
+ {
+ if (announcer_1min)
+ {
+ if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timeleft > 60)
+ || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft > 60))
+ announcer_1min = FALSE;
+ }
+ else if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timelimit > 0 && timeleft < 60)
+ || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft < 60))
+ {
+ // if we're in warmup mode, check whether there's a warmup timelimit
+ if not(autocvar_g_warmup_limit == -1 && warmup_stage)
+ {
+ announcer_1min = TRUE;
+ Announcer_Play("1minuteremains");
+ }
+ }
+ }
+}
+
+float redflag_prev;
+float blueflag_prev;
+void carrierAnnouncer() {
+ float stat_items, redflag, blueflag;
+ float pickup;
+ string item;
+
+ if not(autocvar_cl_notify_carried_items)
+ return;
+
+ stat_items = getstati(STAT_ITEMS);
+
+ redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
+ blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
+
+ if (redflag == 3 && redflag != redflag_prev) {
+ item = _("^1RED^7 flag");
+ pickup = (redflag_prev == 2);
+ }
+
+ if (blueflag == 3 && blueflag != blueflag_prev) {
+ item = _("^4BLUE^7 flag");
+ pickup = (blueflag_prev == 2);
+ }
+
+ if (item)
+ {
+ if (pickup) {
+ if (autocvar_cl_notify_carried_items & 2)
+ centerprint(sprintf(_("You picked up the %s!"), item));
+ }
+ else {
+ if (autocvar_cl_notify_carried_items & 1)
+ centerprint(sprintf(_("You got the %s!"), item));
+ }
+ }
+
+ blueflag_prev = blueflag;
+ redflag_prev = redflag;
+}
+
+void Announcer()
+{
+ Announcer_Gamestart();
+ Announcer_Time();
+ carrierAnnouncer();
+}
+
+void Announcer_Precache ()
+{
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/electrobitch.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/airshot.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/03kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/05kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/15kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/20kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/25kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/30kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/botlike.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/yoda.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/amazing.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/awesome.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/headshot.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/impressive.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/begin.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/timeoutcalled.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1fragleft.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2fragsleft.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3fragsleft.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/terminated.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/4.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/6.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/7.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/8.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/9.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/lastsecond.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/narrowly.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/voteaccept.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votecall.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votefail.wav"));
+}
float autocvar_chase_active;
float autocvar_cl_allow_uid2name;
string autocvar_cl_announcer;
+var float autocvar_cl_announcer_antispam = 2;
+var float autocvar_cl_announcer_maptime = 3;
float autocvar_cl_autodemo_delete;
float autocvar_cl_autodemo_delete_keeprecords;
float autocvar_cl_casings;
float autocvar_cl_reticle_item_nex;
float autocvar_cl_reticle_item_normal;
float autocvar_cl_reticle_stretch;
-float autocvar_cl_sound_maptime_warning;
float autocvar_cl_stripcolorcodes;
var float autocvar_cl_vehicle_spiderbot_cross_alpha = 0.6;
var float autocvar_cl_vehicle_spiderbot_cross_size = 1;
float vote_waiting;
float vote_waiting_for_me;
-float previous_game_starttime;
-entity restartAnnouncer; //a temporary entity which will play the countdown sounds 3, 2, 1 for the client
-void restartAnnouncer_Think();
-
float current_zoomfraction;
float cs_project_is_b0rked;
entity players;
entity teams;
-void serverAnnouncer()
-{
- // check for pending announcement, play it and remove it
- if(announce_snd != "")
- {
- sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
- strunzone(announce_snd);
- announce_snd = "";
- }
-}
-
-void restartAnnouncer_Think() {
- float countdown_rounded, countdown;
- countdown = getstatf(STAT_GAMESTARTTIME) - time;
- countdown_rounded = floor(0.5 + countdown);
- if(countdown <= 0) {
- if (!spectatee_status) //do cprint only for players
- centerprint_generic(CPID_GAME_STARTING, _("^1Begin!"), 1, 0);
-
- sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
- //reset maptime announcers now as well
- announcer_5min = announcer_1min = FALSE;
-
- remove(self);
- return;
- }
- else {
- if (!spectatee_status) //do cprint only for players
- centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded);
-
- if(countdown_rounded <= 3 && countdown_rounded >= 1) {
- sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
- }
-
- self.nextthink = getstatf(STAT_GAMESTARTTIME) - (countdown - 1);
- }
-}
-
-/**
- * Plays the 1minute or 5 minutes (of maptime) remaining sound, if client wants it
- */
-void maptimeAnnouncer() {
- float timelimit;
- timelimit = getstatf(STAT_TIMELIMIT);
- float timeleft;
- timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
-
- float warmuplimit;
- float warmuptimeleft;
- if(warmup_stage) {
- warmuplimit = autocvar_g_warmup_limit;
- if(warmuplimit > 0) {
- warmuptimeleft = max(0, warmuplimit + getstatf(STAT_GAMESTARTTIME) - time);
- }
- }
-
- //5 minute check
- if (autocvar_cl_sound_maptime_warning >= 2) {
- //make sure that after connect (and e.g. 4 minutes left) we will not get a wrong sound
- if(announcer_5min)
- {
- if(((!warmup_stage || warmuplimit == 0) && timeleft > 300) || (warmup_stage && warmuplimit > 0 && warmuptimeleft > 300))
- announcer_5min = FALSE;
- }
- else if (((!warmup_stage || warmuplimit == 0) && timelimit > 0 && timeleft < 300 && timeleft > 299) || (warmup_stage && warmuplimit > 0 && warmuptimeleft < 300 && warmuptimeleft > 299))
- //if we're in warmup mode, check whether there's a warmup timelimit
- if not (warmuplimit == -1 && warmup_stage) {
- announcer_5min = TRUE;
- sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
- }
- }
-
- //1 minute check
- if (autocvar_cl_sound_maptime_warning == 1 || autocvar_cl_sound_maptime_warning == 3) {
- if (announcer_1min)
- {
- if(((!warmup_stage || warmuplimit == 0) && timeleft > 60) || (warmup_stage && warmuplimit > 0 && warmuptimeleft > 60))
- announcer_1min = FALSE;
- }
- else if (((!warmup_stage || warmuplimit == 0) && timelimit > 0 && timeleft < 60) || (warmup_stage && warmuplimit > 0 && warmuptimeleft < 60))
- //if we're in warmup mode, check whether there's a warmup timelimit
- if not (warmuplimit == -1 && warmup_stage) {
- announcer_1min = TRUE;
- sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
- }
- }
-}
-
-/**
- * Announce carried items (e.g. flags in CTF).
- */
-float redflag_prev;
-float blueflag_prev;
-void carrierAnnouncer() {
- float stat_items, redflag, blueflag;
- float pickup;
- string item;
-
- if not(autocvar_cl_notify_carried_items)
- return;
-
- stat_items = getstati(STAT_ITEMS);
-
- redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
- blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
-
- if (redflag == 3 && redflag != redflag_prev) {
- item = _("^1RED^7 flag");
- pickup = (redflag_prev == 2);
- }
-
- if (blueflag == 3 && blueflag != blueflag_prev) {
- item = _("^4BLUE^7 flag");
- pickup = (blueflag_prev == 2);
- }
-
- if (item)
- {
- if (pickup) {
- if (autocvar_cl_notify_carried_items & 2)
- centerprint(sprintf(_("You picked up the %s!"), item));
- }
- else {
- if (autocvar_cl_notify_carried_items & 1)
- centerprint(sprintf(_("You got the %s!"), item));
- }
- }
-
- blueflag_prev = blueflag;
- redflag_prev = redflag;
-}
-
-/**
- * Add all future announcer sounds precaches here.
- * TODO: announcer queues
- */
-void Announcer_Precache () {
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"));
-
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/electrobitch.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/airshot.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/03kills.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/05kills.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10kills.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/15kills.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/20kills.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/25kills.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/30kills.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/botlike.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/yoda.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/amazing.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/awesome.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/headshot.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/impressive.wav"));
-
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/begin.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/timeoutcalled.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1fragleft.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2fragsleft.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3fragsleft.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/terminated.wav"));
-
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/4.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/6.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/7.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/8.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/9.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10.wav"));
-
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/lastsecond.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/narrowly.wav"));
-
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/voteaccept.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votecall.wav"));
- precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votefail.wav"));
-}
-
void AuditLists()
{
entity e;
shownames.qh
shownames.qc
+announcer.qc
Main.qc
View.qc
interpolate.qc
void url_multi_ready(entity fh, entity me, float status)
{
float n;
- if(status == URL_READY_ERROR)
+ if(status == URL_READY_ERROR || status < 0)
{
+ if(status == -422) // Unprocessable Entity
+ {
+ print("uri_multi_ready: got HTTP error 422, data is in unusable format - not continuing\n");
+ me.url_ready(fh, me.url_ready_pass, status);
+ strunzone(me.url_url);
+ remove(me);
+ return;
+ }
me.cnt += 1;
n = tokenize_console(me.url_url);
if(n <= me.cnt)
+float autocvar__notarget;
float autocvar__independent_players;
float autocvar__campaign_index;
string autocvar__campaign_name;
float autocvar_g_balance_uzi_first;
float autocvar_g_balance_uzi_first_ammo;
float autocvar_g_balance_uzi_first_damage;
+float autocvar_g_balance_uzi_first_headshotaddeddamage;
float autocvar_g_balance_uzi_first_force;
float autocvar_g_balance_uzi_first_refire;
float autocvar_g_balance_uzi_first_spread;
float autocvar_g_balance_uzi_spread_min;
float autocvar_g_balance_uzi_sustained_ammo;
float autocvar_g_balance_uzi_sustained_damage;
+float autocvar_g_balance_uzi_sustained_headshotaddeddamage;
float autocvar_g_balance_uzi_sustained_force;
float autocvar_g_balance_uzi_sustained_refire;
float autocvar_g_balance_uzi_sustained_spread;
float autocvar_r_showbboxes;
float autocvar_rescan_pending;
float autocvar_samelevel;
+string autocvar_sessionid;
#define autocvar_skill cvar("skill")
float autocvar_skill_auto;
#define autocvar_slowmo cvar("slowmo")
FOR_EACH_PLAYER(head)
{
// TODO: Merge this logic with the bot_shouldattack function
- if (self != head)
- if (head.health > 0)
- if ((noteam && (!bot_ignore_bots || clienttype(head) == CLIENTTYPE_REAL)) || head.team != self.team)
+ if(bot_shouldattack(head))
{
distance = vlen(head.origin - org);
if (distance < 100 || distance > sradius)
continue;
- if (head.freezetag_frozen)
- continue;
-
- if(g_minstagib)
- if(head.items & IT_STRENGTH)
- continue;
-
// rate only visible enemies
/*
traceline(self.origin + self.view_ofs, head.origin, MOVE_NOMONSTERS, self);
if(INDEPENDENT_PLAYERS)
MAKE_INDEPENDENT_PLAYER(self);
self.flags = FL_CLIENT;
+ if(autocvar__notarget)
+ self.flags |= FL_NOTARGET;
self.takedamage = DAMAGE_AIM;
if(g_minstagib)
self.effects = EF_FULLBRIGHT;
self.stored_netname = strzone(uid2name(self.crypto_idfp));
if(self.stored_netname != self.netname)
{
- db_put(ServerProgsDB, strcat("uid2name", self.crypto_idfp), self.netname);
+ db_put(ServerProgsDB, strcat("/uid2name/", self.crypto_idfp), self.netname);
strunzone(self.stored_netname);
self.stored_netname = strzone(self.netname);
}
// needs to be done so early as they would still spawn
RegisterWeapons();
- ServerProgsDB = db_load("server.db");
+ ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
TemporaryDB = db_create();
// some things then break, so let's work around them...
// Progs DB (capture records)
- ServerProgsDB = db_load("server.db");
+ ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
// Mapinfo
MapInfo_Shutdown();
if(!cheatcount_total)
{
if(autocvar_sv_db_saveasdump)
- db_dump(ServerProgsDB, "server.db");
+ db_dump(ServerProgsDB, strcat("server.db", autocvar_sessionid));
else
- db_save(ServerProgsDB, "server.db");
+ db_save(ServerProgsDB, strcat("server.db", autocvar_sessionid));
}
if(autocvar_developer)
{
string uid2name(string myuid) {
string s;
- s = db_get(ServerProgsDB, strcat("uid2name", myuid));
+ s = db_get(ServerProgsDB, strcat("/uid2name/", myuid));
+
+ // FIXME remove this later after 0.6 release
+ // convert old style broken records to correct style
+ if(s == "")
+ {
+ s = db_get(ServerProgsDB, strcat("uid2name", myuid));
+ if(s != "")
+ {
+ db_put(ServerProgsDB, strcat("/uid2name/", myuid), s);
+ db_put(ServerProgsDB, strcat("uid2name", myuid), "");
+ }
+ }
if(s == "")
s = "^1Unregistered Player";
float is_from_owner = (inflictor == projowner);
float is_from_exception = (exception != -1);
- //print(strcat("from_contents ", ftos(is_from_contents), " : from_owner ", ftos(is_from_owner), " : exception ", strcat(ftos(is_from_exception), " (", ftos(exception), "). \n")));
+ //dprint(strcat("W_CheckProjectileDamage: from_contents ", ftos(is_from_contents), " : from_owner ", ftos(is_from_owner), " : exception ", strcat(ftos(is_from_exception), " (", ftos(exception), "). \n")));
if(autocvar_g_projectiles_damage <= -2)
{
if (self.health <= 0)
return;
- float is_linkexplode = ((inflictor.realowner == self.realowner)
+ float is_linkexplode = ( ((inflictor.owner != world) ? (inflictor.owner == self.owner) : TRUE)
&& (inflictor.projectiledeathtype & HITTYPE_SECONDARY)
&& (self.projectiledeathtype & HITTYPE_SECONDARY));
is_linkexplode = (is_linkexplode && autocvar_g_balance_hagar_secondary_load_linkexplode);
else
is_linkexplode = -1; // not secondary load, so continue as normal without exception.
-
+
if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, is_linkexplode))
return; // g_projectiles_damage says to halt
ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
if (self.misc_bulletcounter == 1)
- fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_first_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_first_damage, 0, autocvar_g_balance_uzi_first_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_first_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_first_damage, autocvar_g_balance_uzi_first_headshotaddeddamage, autocvar_g_balance_uzi_first_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
else
- fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_sustained_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_sustained_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_headshotaddeddamage, autocvar_g_balance_uzi_sustained_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
}
uzi_spread = bound(autocvar_g_balance_uzi_spread_min, autocvar_g_balance_uzi_spread_min + (autocvar_g_balance_uzi_spread_add * self.misc_bulletcounter), autocvar_g_balance_uzi_spread_max);
- fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+ fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_headshotaddeddamage, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
self.misc_bulletcounter = self.misc_bulletcounter + 1;
self.punchangle_y = random () - 0.5;
}
- fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_headshotaddeddamage, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
+#define REMOVEHACK
+
// for think function
.vector warpzone_save_origin;
.vector warpzone_save_angles;
void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
{
- setorigin (player, to);
+ setorigin (player, to); // NOTE: this also aborts the move, when this is called by touch
player.oldorigin = to; // for DP's unsticking
player.angles = to_angles;
player.fixangle = TRUE;
return TRUE;
}
-#define WARPZONE_TELEPORT_FIXSOLID(ret) \
- do \
- { \
- setorigin(player, o1 - player.view_ofs); \
- if(WarpZoneLib_MoveOutOfSolid(player)) \
- { \
- o1 = player.origin + player.view_ofs; \
- setorigin(player, o0 - player.view_ofs); \
- } \
- else \
- { \
- print("would have to put player in solid, won't do that\n"); \
- setorigin(player, o0 - player.view_ofs); \
- return (ret); \
- } \
- } \
- while(0)
-#define WARPZONE_TELEPORT_DOTELEPORT() \
- do \
- { \
- WarpZone_RefSys_Add(player, wz); \
- WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1); \
- WarpZone_StoreProjectileData(player); \
- player.warpzone_teleport_time = time; \
- player.warpzone_teleport_finishtime = time; \
- player.warpzone_teleport_zone = wz; \
- } \
- while(0)
-
float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
{
vector o0, a0, v0, o1, a1, v1, o10;
o1 = o1 - v1 * (d / dv);
}
- // put him inside solid
+ // put him out of solid
tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player);
if(trace_startsolid)
- WARPZONE_TELEPORT_FIXSOLID(0);
+ {
+ setorigin(player, o1 - player.view_ofs);
+ if(WarpZoneLib_MoveOutOfSolid(player))
+ {
+ o1 = player.origin + player.view_ofs;
+ setorigin(player, o0 - player.view_ofs);
+ }
+ else
+ {
+ print("would have to put player in solid, won't do that\n");
+ setorigin(player, o0 - player.view_ofs);
+ return 0;
+ }
+ }
- WARPZONE_TELEPORT_DOTELEPORT();
+ // do the teleport
+ WarpZone_RefSys_Add(player, wz);
+ WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1);
+ WarpZone_StoreProjectileData(player);
+ player.warpzone_teleport_time = time;
+ player.warpzone_teleport_finishtime = time;
+ player.warpzone_teleport_zone = wz;
// prevent further teleports back
float dt = (o1 - o10) * v1 * (1 / (v1 * v1));
if(!wz)
return 0;
+#ifdef REMOVEHACK
+ print("impactfilter found something - and it no longer gets handled correctly - please tell divVerent whether anything behaves broken now\n");
+#else
print("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again\n");
+#endif
print("Entity type: ", player.classname, "\n");
print("Origin: ", vtos(player.origin), "\n");
print("Velocity: ", vtos(player.velocity), "\n");
+#ifdef REMOVEHACK
+ return 0;
+#else
// retry previous move
setorigin(player, player.warpzone_oldorigin);
player.velocity = player.warpzone_oldvelocity;
}
return +1;
+#endif
}
float WarpZone_Projectile_Touch()
{