From: Samual Date: Thu, 3 Nov 2011 17:20:54 +0000 (-0400) Subject: Merge remote branch 'origin/master' into samual/balance X-Git-Tag: xonotic-v0.6.0~35^2~66^2~2^2~2 X-Git-Url: http://git.xonotic.org/?a=commitdiff_plain;h=e8f0b7b07920103e92daac21e3b5e5653c5a86fe;hp=e4e1f6e47f1b207a6df01c20860f9ba49d49e1cf;p=xonotic%2Fxonotic-data.pk3dir.git Merge remote branch 'origin/master' into samual/balance --- diff --git a/balance25.cfg b/balance25.cfg index 91db8f238..1a203eb89 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -306,12 +306,14 @@ 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_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 diff --git a/balanceFruit.cfg b/balanceFruit.cfg index fac3faa20..f8bdb2a3c 100644 --- a/balanceFruit.cfg +++ b/balanceFruit.cfg @@ -306,12 +306,14 @@ set g_balance_uzi_burst_ammo 3 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 diff --git a/balanceLeeStricklin.cfg b/balanceLeeStricklin.cfg index 57af50893..bfe7c2fb7 100644 --- a/balanceLeeStricklin.cfg +++ b/balanceLeeStricklin.cfg @@ -306,12 +306,14 @@ 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_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 diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index 86e36f827..e3c0ecff4 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -306,12 +306,14 @@ set g_balance_uzi_burst_ammo 3 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 @@ -412,7 +414,7 @@ set g_balance_electro_primary_falloff_maxdist 850 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 diff --git a/balancetZork.cfg b/balancetZork.cfg index b7fd9641d..520b96ee4 100644 --- a/balancetZork.cfg +++ b/balancetZork.cfg @@ -306,12 +306,14 @@ 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_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 diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index feee0e75f..7dc17ccbd 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -957,10 +957,11 @@ cl_sound_ric3 weapons/ric3.wav 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 "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" // startmap_dm is used when running with the -listen or -dedicated commandline options set serverconfig server.cfg diff --git a/qcsrc/client/Defs.qc b/qcsrc/client/Defs.qc index 4ef1d04d6..a1a32404d 100644 --- a/qcsrc/client/Defs.qc +++ b/qcsrc/client/Defs.qc @@ -177,9 +177,6 @@ float dmg_take; float vid_conwidth, vid_conheight; float binddb; -// Announcer -string announce_snd; - // QUALIFYING float race_checkpoint; float race_time; @@ -225,10 +222,6 @@ float spectatee_status; // 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; diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 627ee9f2f..326bae22b 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -42,7 +42,6 @@ float __engine_check; #endif string forcefog; -string cl_announcer_prev; void WaypointSprite_Load(); void CSQC_Init(void) { @@ -137,13 +136,7 @@ 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) @@ -1392,7 +1385,7 @@ float CSQC_Parse_TempEntity() bHandled = true; break; case TE_CSQC_ANNOUNCE: - announce_snd = strzone(ReadString()); + Announcer_Play(ReadString()); bHandled = true; break; case TE_CSQC_KILLNOTIFY: @@ -1418,10 +1411,10 @@ float CSQC_Parse_TempEntity() 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; diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 11dde5c3a..2d79f8f10 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -78,30 +78,6 @@ void Porto_Draw() } } -/** - * 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(); @@ -526,16 +502,15 @@ void CSQC_UpdateView(float w, float h) 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) diff --git a/qcsrc/client/announcer.qc b/qcsrc/client/announcer.qc new file mode 100644 index 000000000..4c8884ddf --- /dev/null +++ b/qcsrc/client/announcer.qc @@ -0,0 +1,230 @@ +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); + print(strcat("announcement: '", announcement, "' at time: ", ftos(time), ". \n")); + + previous_announcement = 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")); +} \ No newline at end of file diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index 13db0b193..8917dd8ed 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -19,6 +19,8 @@ float autocvar_camera_speed_roll; 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 = 1; float autocvar_cl_autodemo_delete; float autocvar_cl_autodemo_delete_keeprecords; float autocvar_cl_casings; @@ -61,7 +63,6 @@ var float autocvar_cl_reticle = 1; 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; diff --git a/qcsrc/client/main.qh b/qcsrc/client/main.qh index 9ea50c02b..58a0bad19 100644 --- a/qcsrc/client/main.qh +++ b/qcsrc/client/main.qh @@ -131,10 +131,6 @@ float ready_waiting_for_me; 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; diff --git a/qcsrc/client/miscfunctions.qc b/qcsrc/client/miscfunctions.qc index 7301fbf0b..1a512c774 100644 --- a/qcsrc/client/miscfunctions.qc +++ b/qcsrc/client/miscfunctions.qc @@ -3,189 +3,6 @@ var float(string text, float handleColors, vector fontSize) stringwidth; 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; diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 0d024a941..f650d04bd 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -66,6 +66,7 @@ vehicles/vehicles.qc shownames.qh shownames.qc +announcer.qc Main.qc View.qc interpolate.qc diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 3a6e123e0..3b64b1b63 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -702,6 +702,7 @@ float autocvar_g_balance_uzi_burst_spread; 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; @@ -712,6 +713,7 @@ float autocvar_g_balance_uzi_spread_max; 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; diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc index 1a995191c..45b5545dd 100644 --- a/qcsrc/server/w_common.qc +++ b/qcsrc/server/w_common.qc @@ -542,7 +542,7 @@ float W_CheckProjectileDamage(entity inflictor, entity projowner, float deathtyp 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"))); + print(strcat("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) { diff --git a/qcsrc/server/w_hagar.qc b/qcsrc/server/w_hagar.qc index e6467e454..aa0dcdcd6 100644 --- a/qcsrc/server/w_hagar.qc +++ b/qcsrc/server/w_hagar.qc @@ -25,15 +25,24 @@ void W_Hagar_Damage (entity inflictor, entity attacker, float damage, float deat if (self.health <= 0) return; - float is_linkexplode = ((inflictor.realowner == self.realowner) + float is_linkexplode = ((inflictor.owner == self.owner) && (inflictor.projectiledeathtype & HITTYPE_SECONDARY) && (self.projectiledeathtype & HITTYPE_SECONDARY)); + + /* + float is_linkexplode = ( ( ((inflictor.realowner == self.realowner) + && (inflictor.projectiledeathtype & HITTYPE_SECONDARY)) + || (deathtype == DEATH_SLIME || deathtype == DEATH_LAVA) ) + && (self.projectiledeathtype & HITTYPE_SECONDARY) ); + */ if(is_linkexplode) is_linkexplode = (is_linkexplode && autocvar_g_balance_hagar_secondary_load_linkexplode); else is_linkexplode = -1; // not secondary load, so continue as normal without exception. + print(strcat("is_linkexplode: ", ftos(is_linkexplode), ", inflict_owner_classname: ", inflictor.owner.classname, ", self_owner_classname: ", self.owner.classname, ". \n")); + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, is_linkexplode)) return; // g_projectiles_damage says to halt diff --git a/qcsrc/server/w_uzi.qc b/qcsrc/server/w_uzi.qc index 8f6aa521f..77d8b4aee 100644 --- a/qcsrc/server/w_uzi.qc +++ b/qcsrc/server/w_uzi.qc @@ -52,9 +52,9 @@ void W_UZI_Attack (float deathtype) 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); @@ -126,7 +126,7 @@ void uzi_mode1_fire_auto() } 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; @@ -152,7 +152,7 @@ void uzi_mode1_fire_burst() 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();