From 1182fdc12fe84d3cd9489af075ce1c2e6a88facb Mon Sep 17 00:00:00 2001 From: Mario Date: Fri, 23 May 2014 03:40:47 +1000 Subject: [PATCH] Some updates and fixes to nades, new special bonus nades with different powers --- gamemodes.cfg | 3 + gfx/hud/default/nade_bg.tga | Bin 0 -> 65580 bytes gfx/hud/default/nade_nbg.tga | Bin 0 -> 65580 bytes gfx/hud/default/notify_nade.tga | Bin 0 -> 131116 bytes gfx/hud/default/notify_nade_heal.tga | Bin 0 -> 131116 bytes gfx/hud/default/notify_nade_ice.tga | Bin 0 -> 131116 bytes gfx/hud/default/notify_nade_napalm.tga | Bin 0 -> 131116 bytes mutators.cfg | 69 +- qcsrc/client/Main.qc | 3 + qcsrc/client/View.qc | 15 +- qcsrc/client/hud.qc | 105 +- qcsrc/client/progs.src | 3 + qcsrc/client/projectile.qc | 92 +- qcsrc/client/waypointsprites.qc | 2 +- qcsrc/common/constants.qh | 19 +- qcsrc/common/deathtypes.qh | 6 +- qcsrc/common/monsters/monster/mage.qc | 2 +- qcsrc/common/monsters/sv_monsters.qc | 61 +- qcsrc/common/nades.qc | 82 ++ qcsrc/common/nades.qh | 103 ++ qcsrc/common/notifications.qh | 27 +- qcsrc/server/autocvars.qh | 44 + qcsrc/server/bot/aim.qc | 2 +- qcsrc/server/cl_client.qc | 40 +- qcsrc/server/cl_physics.qc | 27 +- qcsrc/server/cl_player.qc | 5 +- qcsrc/server/cl_weapons.qc | 4 +- qcsrc/server/command/cmd.qc | 1 + qcsrc/server/csqcprojectile.qc | 2 + qcsrc/server/defs.qh | 7 +- qcsrc/server/g_damage.qc | 141 ++- qcsrc/server/g_world.qc | 4 + qcsrc/server/miscfunctions.qc | 1 + qcsrc/server/mutators/gamemode_ca.qc | 7 + qcsrc/server/mutators/gamemode_ctf.qc | 8 +- qcsrc/server/mutators/gamemode_freezetag.qc | 245 +---- qcsrc/server/mutators/gamemode_keepaway.qc | 1 + qcsrc/server/mutators/gamemode_keyhunt.qc | 1 + qcsrc/server/mutators/gamemode_nexball.qc | 2 +- qcsrc/server/mutators/mutator_campcheck.qc | 1 + qcsrc/server/mutators/mutator_dodging.qc | 15 +- qcsrc/server/mutators/mutator_minstagib.qc | 1 - qcsrc/server/mutators/mutator_nades.qc | 946 ++++++++++++++++-- qcsrc/server/mutators/mutator_nades.qh | 22 +- .../mutators/mutator_spawn_near_teammate.qc | 2 +- qcsrc/server/mutators/mutator_touchexplode.qc | 4 +- qcsrc/server/progs.src | 3 + qcsrc/server/spawnpoints.qh | 2 +- qcsrc/server/sv_main.qc | 1 - qcsrc/server/teamplay.qc | 3 + qcsrc/server/w_electro.qc | 2 +- 51 files changed, 1727 insertions(+), 409 deletions(-) create mode 100644 gfx/hud/default/nade_bg.tga create mode 100644 gfx/hud/default/nade_nbg.tga create mode 100644 gfx/hud/default/notify_nade.tga create mode 100644 gfx/hud/default/notify_nade_heal.tga create mode 100644 gfx/hud/default/notify_nade_ice.tga create mode 100644 gfx/hud/default/notify_nade_napalm.tga create mode 100644 qcsrc/common/nades.qc create mode 100644 qcsrc/common/nades.qh diff --git a/gamemodes.cfg b/gamemodes.cfg index 30352bba7..1916ddca9 100644 --- a/gamemodes.cfg +++ b/gamemodes.cfg @@ -327,9 +327,12 @@ seta g_freezetag_point_leadlimit -1 "Freeze Tag point lead limit overriding the set g_freezetag_revive_speed 0.4 "Speed for reviving a frozen teammate" set g_freezetag_revive_clearspeed 1.6 "Speed at which reviving progress gets lost when out of range" set g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him" +set g_freezetag_revive_nade 1 "Enable reviving from own nade explosion" +set g_freezetag_revive_nade_health 40 "Amount of health player has if they revived from their own nade explosion" set g_freezetag_revive_falldamage 0 "Enable reviving from this amount of fall damage" set g_freezetag_revive_falldamage_health 40 "Amount of health player has if they revived from falling" set g_freezetag_round_timelimit 180 "round time limit in seconds" +set g_freezetag_frozen_damage_trigger 1 "if 1, frozen players falling into the void will die instead of teleporting to spawn" set g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with" set g_freezetag_frozen_maxtime 60 "frozen players will be automatically unfrozen after this time in seconds" seta g_freezetag_teams_override 0 diff --git a/gfx/hud/default/nade_bg.tga b/gfx/hud/default/nade_bg.tga new file mode 100644 index 0000000000000000000000000000000000000000..ffe0e0f6bb9b743f147ed4e148baf94c9fd8b1dd GIT binary patch literal 65580 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 literal 0 HcmV?d00001 diff --git a/gfx/hud/default/notify_nade_heal.tga b/gfx/hud/default/notify_nade_heal.tga new file mode 100644 index 0000000000000000000000000000000000000000..17e240860dffd3214780053b94f7950540d7f24e GIT binary patch literal 131116 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

v;()z_f$I9M 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 literal 0 HcmV?d00001 diff --git a/gfx/hud/default/notify_nade_napalm.tga b/gfx/hud/default/notify_nade_napalm.tga new file mode 100644 index 0000000000000000000000000000000000000000..bb84101faa39464f191f03001640b17a1bbf9a17 GIT binary patch literal 131116 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ðKF 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 dJH5!8X5Ktu_T*WUZtime) + drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, Nade_Color(NADE_TYPE_HEAL), autocvar_hud_colorflash_alpha*getstatf(STAT_HEALING_ORB_ALPHA), DRAWFLAG_ADDITIVE); + else if(getstatf(STAT_REVIVE_PROGRESS)) { - if(getstati(STAT_FROZEN)) - drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); - if(getstatf(STAT_REVIVE_PROGRESS)) - { - DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); - drawstring_aspect(eY * 0.64 * vid_conheight, _("Revival progress"), eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL); - } + DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); + drawstring_aspect(eY * 0.64 * vid_conheight, _("Revival progress"), eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL); } if(autocvar_r_letterbox == 0) diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index bb5eb4a68..774d6ebc0 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -886,6 +886,54 @@ string GetAmmoPicture(float i) } } +void DrawNadeScoreBar(vector myPos, vector mySize, vector color) +{ + + HUD_Panel_DrawProgressBar( + myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, + mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, + autocvar_hud_panel_ammo_progressbar_name, + getstatf(STAT_NADE_BONUS_SCORE), 0, 0, color, + autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + +} + +void DrawAmmoNades(vector myPos, vector mySize, float draw_expanding, float expand_time) +{ + float theAlpha = 1, a, b; + vector nade_color, picpos, numpos; + + nade_color = Nade_Color(getstati(STAT_NADE_BONUS_TYPE)); + + a = getstatf(STAT_NADE_BONUS); + b = getstatf(STAT_NADE_BONUS_SCORE); + + if(autocvar_hud_panel_ammo_iconalign) + { + numpos = myPos; + picpos = myPos + eX * 2 * mySize_y; + } + else + { + numpos = myPos + eX * mySize_y; + picpos = myPos; + } + + DrawNadeScoreBar(myPos, mySize, nade_color); + + if(b > 0 || a > 0) + { + if(autocvar_hud_panel_ammo_text) + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + + if(draw_expanding) + drawpic_aspect_skin_expanding(picpos, "nade_nbg", '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, expand_time); + + drawpic_aspect_skin(picpos, "nade_bg" , '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(picpos, "nade_nbg" , '1 1 0' * mySize_y, nade_color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + } +} + void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected, float infinite_ammo) { float a; @@ -942,6 +990,9 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * theAlpha * 0.5, DRAWFLAG_NORMAL); } +float nade_prevstatus; +float nade_prevframe; +float nade_statuschange_time; void HUD_Ammo(void) { if(hud != HUD_NORMAL) return; @@ -966,21 +1017,39 @@ void HUD_Ammo(void) mySize -= '2 2 0' * panel_bg_padding; } - const float AMMO_COUNT = 4; float rows = 0, columns, row, column; + float nade_cnt = getstatf(STAT_NADE_BONUS), nade_score = getstatf(STAT_NADE_BONUS_SCORE); + float draw_nades = (nade_cnt > 0 || nade_score > 0), nade_statuschange_elapsedtime; + float total_ammo_count; + vector ammo_size; + float AMMO_COUNT = 4; if (autocvar_hud_panel_ammo_onlycurrent) - ammo_size = mySize; + total_ammo_count = 1; else + total_ammo_count = AMMO_COUNT - 1; // fuel + + if(draw_nades) { - rows = mySize_y/mySize_x; - rows = bound(1, floor((sqrt(4 * (3/1) * rows * AMMO_COUNT + rows * rows) + rows + 0.5) / 2), AMMO_COUNT); - // ^^^ ammo item aspect goes here + ++total_ammo_count; + if (nade_cnt != nade_prevframe) + { + nade_statuschange_time = time; + nade_prevstatus = nade_prevframe; + nade_prevframe = nade_cnt; + } + } + else + nade_prevstatus = nade_prevframe = nade_statuschange_time = 0; - columns = ceil(AMMO_COUNT/rows); + rows = mySize_y/mySize_x; + rows = bound(1, floor((sqrt(4 * (3/1) * rows * (total_ammo_count) + rows * rows) + rows + 0.5) / 2), (total_ammo_count)); + // ^^^ ammo item aspect goes here - ammo_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); - } + columns = ceil((total_ammo_count)/rows); + + ammo_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); + local vector offset = '0 0 0'; // fteqcc sucks float newSize; @@ -1001,6 +1070,9 @@ void HUD_Ammo(void) float i, stat_items, currently_selected, infinite_ammo; infinite_ammo = FALSE; + + row = column = 0; + if (autocvar_hud_panel_ammo_onlycurrent) { if(autocvar__hud_configure) @@ -1021,13 +1093,19 @@ void HUD_Ammo(void) } } } + + ++row; + if(row >= rows) + { + row = 0; + column = column + 1; + } } else { stat_items = getstati(STAT_ITEMS, 0, 24); if (stat_items & IT_UNLIMITED_WEAPON_AMMO) infinite_ammo = TRUE; - row = column = 0; for (i = 0; i < AMMO_COUNT; ++i) { currently_selected = stat_items & GetAmmoItemCode(i); DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected, infinite_ammo); @@ -1040,6 +1118,15 @@ void HUD_Ammo(void) } } + if (draw_nades) + { + nade_statuschange_elapsedtime = time - nade_statuschange_time; + + float f = bound(0, nade_statuschange_elapsedtime*2, 1); + + DrawAmmoNades(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, nade_prevstatus < nade_cnt && nade_cnt != 0 && f < 1, f); + } + draw_endBoldFont(); } diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 1a518c5a6..940f1f932 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -16,6 +16,7 @@ Defs.qc ../common/teams.qh ../common/util.qh +../common/nades.qh ../common/test.qh ../common/counting.qh ../common/items.qh @@ -117,6 +118,8 @@ command/cl_cmd.qc ../common/monsters/monsters.qc +../common/nades.qc + ../warpzonelib/anglestransform.qc ../warpzonelib/mathlib.qc ../warpzonelib/common.qc diff --git a/qcsrc/client/projectile.qc b/qcsrc/client/projectile.qc index 8cdcdf470..9744df8be 100644 --- a/qcsrc/client/projectile.qc +++ b/qcsrc/client/projectile.qc @@ -101,24 +101,16 @@ void Projectile_Draw() case PROJECTILE_GRENADE_BOUNCING: rot = '0 -1000 0'; // sideways break; - case PROJECTILE_NADE_RED_BURN: - case PROJECTILE_NADE_RED: - case PROJECTILE_NADE_BLUE_BURN: - case PROJECTILE_NADE_BLUE: - case PROJECTILE_NADE_YELLOW_BURN: - case PROJECTILE_NADE_YELLOW: - case PROJECTILE_NADE_PINK_BURN: - case PROJECTILE_NADE_PINK: - case PROJECTILE_NADE_BURN: - case PROJECTILE_NADE: - rot = self.avelocity; - break; case PROJECTILE_HOOKBOMB: rot = '1000 0 0'; // forward break; default: break; } + + if(Nade_IDFromProjectile(self.cnt) != 0) + rot = self.avelocity; + self.angles = AnglesTransform_ToAngles(AnglesTransform_Multiply(AnglesTransform_FromAngles(self.angles), rot * (t - self.spawntime))); } @@ -136,18 +128,6 @@ void Projectile_Draw() trailorigin = self.origin; switch(self.cnt) { - case PROJECTILE_NADE_RED_BURN: - case PROJECTILE_NADE_RED: - case PROJECTILE_NADE_BLUE_BURN: - case PROJECTILE_NADE_BLUE: - case PROJECTILE_NADE_YELLOW_BURN: - case PROJECTILE_NADE_YELLOW: - case PROJECTILE_NADE_PINK_BURN: - case PROJECTILE_NADE_PINK: - case PROJECTILE_NADE_BURN: - case PROJECTILE_NADE: - trailorigin += v_up * 4; - break; case PROJECTILE_GRENADE: case PROJECTILE_GRENADE_BOUNCING: trailorigin += v_right * 1 + v_forward * -10; @@ -155,6 +135,10 @@ void Projectile_Draw() default: break; } + + if(Nade_IDFromProjectile(self.cnt) != 0) + trailorigin += v_up * 4; + if(drawn) Projectile_DrawTrail(trailorigin); else @@ -274,6 +258,8 @@ void Ent_Projectile() self.fade_time = 0; self.fade_rate = 0; } + + self.team = ReadByte() - 1; } if(f & 2) @@ -302,6 +288,7 @@ void Ent_Projectile() case PROJECTILE_HOOKBOMB: setmodel(self, "models/grenademodel.md3");self.traileffect = particleeffectnum("TR_KNIGHTSPIKE"); break; case PROJECTILE_HAGAR: setmodel(self, "models/hagarmissile.mdl");self.traileffect = particleeffectnum("tr_hagar"); self.scale = 0.75; break; case PROJECTILE_HAGAR_BOUNCING: setmodel(self, "models/hagarmissile.mdl");self.traileffect = particleeffectnum("tr_hagar"); self.scale = 0.75; break; + case PROJECTILE_NAPALM_FOUNTAIN: //self.model = ""; self.modelindex = 0; self.traileffect = particleeffectnum("torch_small"); break; case PROJECTILE_FIREBALL: self.model = ""; self.modelindex = 0; self.traileffect = particleeffectnum("fireball"); break; // particle effect is good enough case PROJECTILE_FIREMINE: self.model = ""; self.modelindex = 0; self.traileffect = particleeffectnum("firemine"); break; // particle effect is good enough case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); self.traileffect = particleeffectnum("TR_ROCKET"); break; @@ -322,18 +309,8 @@ void Ent_Projectile() case PROJECTILE_BUMBLE_GUN: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break; case PROJECTILE_BUMBLE_BEAM: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break; - case PROJECTILE_NADE_RED: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_red"); break; - case PROJECTILE_NADE_RED_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_red_burn"); break; - case PROJECTILE_NADE_BLUE: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_blue"); break; - case PROJECTILE_NADE_BLUE_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_blue_burn"); break; - case PROJECTILE_NADE_YELLOW: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_yellow"); break; - case PROJECTILE_NADE_YELLOW_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_yellow_burn"); break; - case PROJECTILE_NADE_PINK: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_pink"); break; - case PROJECTILE_NADE_PINK_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_pink_burn"); break; - case PROJECTILE_NADE: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade"); break; - case PROJECTILE_NADE_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_burn"); break; - default: + if(Nade_IDFromProjectile(self.cnt) != 0) { setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum(Nade_TrailEffect(self.cnt, self.team)); break; } error("Received invalid CSQC projectile, can't work with this!"); break; } @@ -366,17 +343,6 @@ void Ent_Projectile() self.mins = '-3 -3 -3'; self.maxs = '3 3 3'; break; - case PROJECTILE_NADE_RED_BURN: - case PROJECTILE_NADE_RED: - case PROJECTILE_NADE_BLUE_BURN: - case PROJECTILE_NADE_BLUE: - self.mins = '-3 -3 -3'; - self.maxs = '3 3 3'; - self.move_movetype = MOVETYPE_BOUNCE; - self.move_touch = func_null; - self.scale = 1.5; - self.avelocity = randomvec() * 720; - break; case PROJECTILE_GRENADE_BOUNCING: self.mins = '-3 -3 -3'; self.maxs = '3 3 3'; @@ -385,23 +351,6 @@ void Ent_Projectile() self.move_bounce_factor = g_balance_grenadelauncher_bouncefactor; self.move_bounce_stopspeed = g_balance_grenadelauncher_bouncestop; break; - case PROJECTILE_NADE_RED_BURN: - case PROJECTILE_NADE_RED: - case PROJECTILE_NADE_BLUE_BURN: - case PROJECTILE_NADE_BLUE: - case PROJECTILE_NADE_YELLOW_BURN: - case PROJECTILE_NADE_YELLOW: - case PROJECTILE_NADE_PINK_BURN: - case PROJECTILE_NADE_PINK: - case PROJECTILE_NADE_BURN: - case PROJECTILE_NADE: - self.mins = '-16 -16 -16'; - self.maxs = '16 16 16'; - self.move_movetype = MOVETYPE_BOUNCE; - self.move_touch = func_null; - self.scale = 1.5; - self.avelocity = randomvec() * 720; - break; case PROJECTILE_SHAMBLER_LIGHTNING: self.mins = '-8 -8 -8'; self.maxs = '8 8 8'; @@ -432,6 +381,7 @@ void Ent_Projectile() self.move_movetype = MOVETYPE_BOUNCE; self.move_touch = func_null; break; + case PROJECTILE_NAPALM_FOUNTAIN: case PROJECTILE_FIREBALL: loopsound(self, CH_SHOTS_SINGLE, "weapons/fireball_fly2.wav", VOL_BASE, ATTEN_NORM); self.mins = '-16 -16 -16'; @@ -488,6 +438,21 @@ void Ent_Projectile() default: break; } + + if(Nade_IDFromProjectile(self.cnt) != 0) + { + self.mins = '-16 -16 -16'; + self.maxs = '16 16 16'; + self.colormod = Nade_Color(Nade_IDFromProjectile(self.cnt)); + self.move_movetype = MOVETYPE_BOUNCE; + self.move_touch = func_null; + self.scale = 1.5; + self.avelocity = randomvec() * 720; + + if(Nade_IDFromProjectile(self.cnt) == NADE_TYPE_TRANSLOCATE) + self.solid = SOLID_TRIGGER; + } + setsize(self, self.mins, self.maxs); } @@ -526,6 +491,7 @@ void Projectile_Precache() precache_model("models/rocket.md3"); precache_model("models/tagrocket.md3"); precache_model("models/tracer.mdl"); + precache_model("models/sphere/sphere.md3"); precache_model("models/weapons/v_ok_grenade.md3"); diff --git a/qcsrc/client/waypointsprites.qc b/qcsrc/client/waypointsprites.qc index 1367501a8..faed3bdb2 100644 --- a/qcsrc/client/waypointsprites.qc +++ b/qcsrc/client/waypointsprites.qc @@ -309,7 +309,7 @@ string spritelookuptext(string s) case "item-shield": return _("Shield"); case "item-fuelregen": return _("Fuel regen"); case "item-jetpack": return _("Jet Pack"); - case "freezetag_frozen": return _("Frozen!"); + case "frozen": return _("Frozen!"); case "tagged-target": return _("Tagged"); case "vehicle": return _("Vehicle"); default: return s; diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index e02fad45f..437afd854 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -101,6 +101,8 @@ const float ENT_CLIENT_TURRET = 40; const float ENT_CLIENT_AUXILIARYXHAIR = 50; const float ENT_CLIENT_VEHICLE = 60; +const float ENT_CLIENT_HEALING_ORB = 80; + const float SPRITERULE_DEFAULT = 0; const float SPRITERULE_TEAMPLAY = 1; @@ -185,6 +187,12 @@ const float STAT_WEAPONS3 = 75; const float STAT_MONSTERS_TOTAL = 76; const float STAT_MONSTERS_KILLED = 77; +const float STAT_NADE_BONUS = 80; +const float STAT_NADE_BONUS_TYPE = 81; +const float STAT_NADE_BONUS_SCORE = 82; +const float STAT_HEALING_ORB = 83; +const float STAT_HEALING_ORB_ALPHA = 84; + // mod stats (1xx) const float STAT_REDALIVE = 100; const float STAT_BLUEALIVE = 101; @@ -360,17 +368,6 @@ const float PROJECTILE_BUMBLE_BEAM = 31; const float PROJECTILE_MAGE_SPIKE = 32; const float PROJECTILE_SHAMBLER_LIGHTNING = 33; -const float PROJECTILE_NADE_RED = 50; -const float PROJECTILE_NADE_RED_BURN = 51; -const float PROJECTILE_NADE_BLUE = 52; -const float PROJECTILE_NADE_BLUE_BURN = 53; -const float PROJECTILE_NADE_YELLOW = 54; -const float PROJECTILE_NADE_YELLOW_BURN = 55; -const float PROJECTILE_NADE_PINK = 56; -const float PROJECTILE_NADE_PINK_BURN = 57; -const float PROJECTILE_NADE = 58; -const float PROJECTILE_NADE_BURN = 59; - const float SPECIES_HUMAN = 0; const float SPECIES_ROBOT_SOLID = 1; const float SPECIES_ALIEN = 2; diff --git a/qcsrc/common/deathtypes.qh b/qcsrc/common/deathtypes.qh index 1265e7eea..0bdea312f 100644 --- a/qcsrc/common/deathtypes.qh +++ b/qcsrc/common/deathtypes.qh @@ -23,7 +23,11 @@ DEATHTYPE(DEATH_MONSTER_WYVERN, DEATH_SELF_MON_WYVERN, DEATH_MURDER_MONSTER, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_ZOMBIE_JUMP, DEATH_SELF_MON_ZOMBIE_JUMP, DEATH_MURDER_MONSTER, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_ZOMBIE_MELEE, DEATH_SELF_MON_ZOMBIE_MELEE, DEATH_MURDER_MONSTER, DEATH_MONSTER_LAST) \ - DEATHTYPE(DEATH_NADE, DEATH_SELF_NADE, DEATH_MURDER_NADE, NORMAL_POS) \ + DEATHTYPE(DEATH_NADE, DEATH_SELF_NADE, DEATH_MURDER_NADE, NORMAL_POS) \ + DEATHTYPE(DEATH_NADE_NAPALM, DEATH_SELF_NADE_NAPALM, DEATH_MURDER_NADE_NAPALM, NORMAL_POS) \ + DEATHTYPE(DEATH_NADE_ICE, DEATH_SELF_NADE_ICE, DEATH_MURDER_NADE_ICE, NORMAL_POS) \ + DEATHTYPE(DEATH_NADE_ICE_FREEZE, DEATH_SELF_NADE_ICE_FREEZE, DEATH_MURDER_NADE_ICE_FREEZE, NORMAL_POS) \ + DEATHTYPE(DEATH_NADE_HEAL, DEATH_SELF_NADE_HEAL, DEATH_MURDER_NADE_HEAL, NORMAL_POS) \ DEATHTYPE(DEATH_NOAMMO, DEATH_SELF_NOAMMO, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_ROT, DEATH_SELF_ROT, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_SHOOTING_STAR, DEATH_SELF_SHOOTING_STAR, DEATH_MURDER_SHOOTING_STAR, NORMAL_POS) \ diff --git a/qcsrc/common/monsters/monster/mage.qc b/qcsrc/common/monsters/monster/mage.qc index 2c8ebd547..08e995e2e 100644 --- a/qcsrc/common/monsters/monster/mage.qc +++ b/qcsrc/common/monsters/monster/mage.qc @@ -60,7 +60,7 @@ float friend_needshelp(entity e) return FALSE; if(DIFF_TEAM(e, self) && e != self.monster_owner) return FALSE; - if(e.freezetag_frozen) + if(e.frozen) return FALSE; if(!IS_PLAYER(e)) return ((e.flags & FL_MONSTER) && e.health < e.max_health); diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index 927501e65..cc3379ee3 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -104,7 +104,7 @@ float monster_isvalidtarget (entity targ, entity ent) if(SAME_TEAM(targ, ent)) return FALSE; // enemy is on our team - if (targ.freezetag_frozen) + if (targ.frozen) return FALSE; // ignore frozen if(autocvar_g_monsters_target_infront || ent.spawnflags & MONSTERFLAG_INFRONT) @@ -537,6 +537,51 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ entity targ; + if(self.frozen == 2) + { + self.revive_progress = bound(0, self.revive_progress + self.ticrate * self.revive_speed, 1); + self.health = max(1, self.revive_progress * self.max_health); + self.iceblock.alpha = bound(0.2, 1 - self.revive_progress, 1); + + WaypointSprite_UpdateHealth(self.sprite, self.health); + + movelib_beak_simple(stopspeed); + self.frame = manim_idle; + + self.enemy = world; + self.nextthink = time + self.ticrate; + + if(self.revive_progress >= 1) + Unfreeze(self); + + return; + } + else if(self.frozen == 3) + { + self.revive_progress = bound(0, self.revive_progress - self.ticrate * self.revive_speed, 1); + self.health = max(0, autocvar_g_nades_ice_health + (self.max_health-autocvar_g_nades_ice_health) * self.revive_progress ); + + WaypointSprite_UpdateHealth(self.sprite, self.health); + + movelib_beak_simple(stopspeed); + self.frame = manim_idle; + + self.enemy = world; + self.nextthink = time + self.ticrate; + + if(self.health < 1) + { + Unfreeze(self); + self.health = 0; + self.event_damage(self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE, self.origin, '0 0 0'); + } + + else if ( self.revive_progress <= 0 ) + Unfreeze(self); + + return; + } + if(self.flags & FL_SWIM) { if(self.waterlevel < WATERLEVEL_WETFEET) @@ -712,6 +757,9 @@ void monster_remove(entity mon) if(mon.weaponentity) remove(mon.weaponentity); + if(mon.iceblock) + remove(mon.iceblock); + WaypointSprite_Kill(mon.sprite); remove(mon); @@ -762,6 +810,8 @@ void monsters_reset() setorigin(self, self.pos1); self.angles = self.pos2; + Unfreeze(self); // remove any icy remains + self.health = self.max_health; self.velocity = '0 0 0'; self.enemy = world; @@ -797,6 +847,12 @@ void monster_die(entity attacker, float gibbed) self.nextthink = time; self.ltime = time + 5; + if(self.frozen) + { + Unfreeze(self); // remove any icy remains + self.health = 0; // reset by Unfreeze + } + monster_dropitem(); MonsterSound(monstersound_death, 0, FALSE, CH_VOICE); @@ -840,6 +896,9 @@ void monster_die(entity attacker, float gibbed) void monsters_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { + if(self.frozen && deathtype != DEATH_KILL && deathtype != DEATH_NADE_ICE_FREEZE) + return; + if(time < self.pain_finished && deathtype != DEATH_KILL) return; diff --git a/qcsrc/common/nades.qc b/qcsrc/common/nades.qc new file mode 100644 index 000000000..03b15525c --- /dev/null +++ b/qcsrc/common/nades.qc @@ -0,0 +1,82 @@ +.float healer_lifetime; +.float healer_radius; + +#ifdef SVQC +float healer_send(entity to, float sf) +{ + WriteByte(MSG_ENTITY, ENT_CLIENT_HEALING_ORB); + WriteByte(MSG_ENTITY, sf); + + if(sf & 1) + { + WriteCoord(MSG_ENTITY, self.origin_x); + WriteCoord(MSG_ENTITY, self.origin_y); + WriteCoord(MSG_ENTITY, self.origin_z); + + WriteByte(MSG_ENTITY, self.healer_lifetime); + //WriteByte(MSG_ENTITY, self.ltime - time + 1); + WriteShort(MSG_ENTITY, self.healer_radius); + // round time delta to a 1/10th of a second + WriteByte(MSG_ENTITY, (self.ltime - time)*10.0+0.5); + } + + return TRUE; +} +#endif // SVQC + +#ifdef CSQC +.float ltime; +void healer_draw() +{ + float dt = time - self.move_time; + self.move_time = time; + if(dt <= 0) + return; + + self.alpha = (self.ltime - time) / self.healer_lifetime; + self.scale = min((1 - self.alpha)*self.healer_lifetime*4,1)*self.healer_radius; + +} + +void healer_setup() +{ + setmodel(self, "models/ctf/shield.md3"); + + setorigin(self, self.origin); + + float model_radius = self.maxs_x; + vector size = '1 1 1' * self.healer_radius / 2; + setsize(self,-size,size); + self.healer_radius = self.healer_radius/model_radius*0.6; + + self.draw = healer_draw; + self.health = 255; + self.movetype = MOVETYPE_NONE; + self.solid = SOLID_NOT; + self.drawmask = MASK_NORMAL; + self.scale = 0.01; + self.avelocity = self.move_avelocity = '7 0 11'; + self.colormod = '1 0 0'; + self.renderflags |= RF_ADDITIVE; +} + +void ent_healer() +{ + float sf = ReadByte(); + + if(sf & TNSF_SETUP) + { + self.origin_x = ReadCoord(); + self.origin_y = ReadCoord(); + self.origin_z = ReadCoord(); + setorigin(self, self.origin); + + self.healer_lifetime = ReadByte(); + self.healer_radius = ReadShort(); + self.ltime = time + ReadByte()/10.0; + //self.ltime = time + self.healer_lifetime; + + healer_setup(); + } +} +#endif // CSQC \ No newline at end of file diff --git a/qcsrc/common/nades.qh b/qcsrc/common/nades.qh new file mode 100644 index 000000000..1004e1eca --- /dev/null +++ b/qcsrc/common/nades.qh @@ -0,0 +1,103 @@ +// use slots 70-100 +const float PROJECTILE_NADE = 71; +const float PROJECTILE_NADE_BURN = 72; +const float PROJECTILE_NADE_NAPALM = 73; +const float PROJECTILE_NADE_NAPALM_BURN = 74; +const float PROJECTILE_NAPALM_FOUNTAIN = 75; +const float PROJECTILE_NADE_ICE = 76; +const float PROJECTILE_NADE_ICE_BURN = 77; +const float PROJECTILE_NADE_TRANSLOCATE = 78; +const float PROJECTILE_NADE_SPAWN = 79; +const float PROJECTILE_NADE_HEAL = 80; +const float PROJECTILE_NADE_HEAL_BURN = 81; +const float PROJECTILE_NADE_MONSTER = 82; +const float PROJECTILE_NADE_MONSTER_BURN = 83; + +const float NADE_TYPE_NORMAL = 1; +const float NADE_TYPE_NAPALM = 2; +const float NADE_TYPE_ICE = 3; +const float NADE_TYPE_TRANSLOCATE = 4; +const float NADE_TYPE_SPAWN = 5; +const float NADE_TYPE_HEAL = 6; +const float NADE_TYPE_MONSTER = 7; + +const float NADE_TYPE_LAST = 7; // a check to prevent using higher values & crashing + +vector Nade_Color(float nadeid) +{ + switch(nadeid) + { + case NADE_TYPE_NORMAL: return '1 1 1'; + case NADE_TYPE_NAPALM: return '2 0.5 0'; + case NADE_TYPE_ICE: return '0 0.5 2'; + case NADE_TYPE_TRANSLOCATE: return '1 0.0625 1'; + case NADE_TYPE_SPAWN: return '1 0.9 0.06'; + case NADE_TYPE_HEAL: return '1 0 0'; + case NADE_TYPE_MONSTER: return '1 0.5 0'; + } + + return '0 0 0'; +} + +float Nade_IDFromProjectile(float proj) +{ + switch(proj) + { + case PROJECTILE_NADE: + case PROJECTILE_NADE_BURN: return NADE_TYPE_NORMAL; + case PROJECTILE_NADE_NAPALM: + case PROJECTILE_NADE_NAPALM_BURN: return NADE_TYPE_NAPALM; + case PROJECTILE_NADE_ICE: + case PROJECTILE_NADE_ICE_BURN: return NADE_TYPE_ICE; + case PROJECTILE_NADE_TRANSLOCATE: return NADE_TYPE_TRANSLOCATE; + case PROJECTILE_NADE_SPAWN: return NADE_TYPE_SPAWN; + case PROJECTILE_NADE_HEAL: + case PROJECTILE_NADE_HEAL_BURN: return NADE_TYPE_HEAL; + case PROJECTILE_NADE_MONSTER: + case PROJECTILE_NADE_MONSTER_BURN: return NADE_TYPE_MONSTER; + } + + return 0; +} + +float Nade_ProjectileFromID(float proj, float burn) +{ + switch(proj) + { + case NADE_TYPE_NORMAL: return (burn) ? PROJECTILE_NADE_BURN : PROJECTILE_NADE; + case NADE_TYPE_NAPALM: return (burn) ? PROJECTILE_NADE_NAPALM_BURN : PROJECTILE_NADE_NAPALM; + case NADE_TYPE_ICE: return (burn) ? PROJECTILE_NADE_ICE_BURN : PROJECTILE_NADE_ICE; + case NADE_TYPE_TRANSLOCATE: return PROJECTILE_NADE_TRANSLOCATE; + case NADE_TYPE_SPAWN: return PROJECTILE_NADE_SPAWN; + case NADE_TYPE_HEAL: return (burn) ? PROJECTILE_NADE_HEAL_BURN : PROJECTILE_NADE_HEAL; + case NADE_TYPE_MONSTER: return (burn) ? PROJECTILE_NADE_MONSTER_BURN : PROJECTILE_NADE_MONSTER; + } + + return 0; +} + +string Nade_TrailEffect(float proj, float nade_team) +{ + switch(proj) + { + case PROJECTILE_NADE: return strcat("nade_", Static_Team_ColorName_Lower(nade_team)); + case PROJECTILE_NADE_BURN: return strcat("nade_", Static_Team_ColorName_Lower(nade_team), "_burn"); + case PROJECTILE_NADE_NAPALM: return "TR_ROCKET"; + case PROJECTILE_NADE_NAPALM_BURN: return "spiderbot_rocket_thrust"; + case PROJECTILE_NADE_ICE: return "TR_NEXUIZPLASMA"; + case PROJECTILE_NADE_ICE_BURN: return "wakizashi_rocket_thrust"; + case PROJECTILE_NADE_TRANSLOCATE: return "TR_CRYLINKPLASMA"; + case PROJECTILE_NADE_SPAWN: return "nade_yellow"; + case PROJECTILE_NADE_HEAL: return "nade_red"; + case PROJECTILE_NADE_HEAL_BURN: return "nade_red_burn"; + case PROJECTILE_NADE_MONSTER: return "nade_red"; + case PROJECTILE_NADE_MONSTER_BURN: return "nade_red_burn"; + } + + return ""; +} + +#ifdef CSQC +// misc functions +void ent_healer(); +#endif // CSQC diff --git a/qcsrc/common/notifications.qh b/qcsrc/common/notifications.qh index 003c0fcc1..799efaf03 100644 --- a/qcsrc/common/notifications.qh +++ b/qcsrc/common/notifications.qh @@ -360,7 +360,11 @@ void Send_Notification_WOCOVA( MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"), _("^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s")) \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_lava", _("^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_MONSTER, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was pushed infront of a monster by ^BG%s^K1%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade", _("^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_NAPALM, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_napalm", _("^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"), _("^BG%s%s^K1 got too close to a napalm explosion%s%s")) \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_ice", _("^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE_FREEZE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_ice", _("^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_HEAL, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_heal", _("^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_shootingstar", _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_slime", _("^BG%s%s^K1 was slimed by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SWAMP, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_slime", _("^BG%s%s^K1 was preserved by ^BG%s^K1%s%s"), "") \ @@ -389,7 +393,6 @@ void Send_Notification_WOCOVA( MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FIRE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 became a bit too crispy%s%s"), _("^BG%s^K1 felt a little hot%s%s")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_GENERIC, 2, 1, "s1 s2loc spree_lost", "s1", "notify_selfkill", _("^BG%s^K1 died%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA, 2, 1, "s1 s2loc spree_lost", "s1", "notify_lava", _("^BG%s^K1 turned into hot slag%s%s"), _("^BG%s^K1 found a hot place%s%s")) \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_MAGE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was exploded by a Mage%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_CLAW, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1's innards became outwards by a Shambler%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_SMASH, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was smashed by a Shambler%s%s"), "") \ @@ -398,6 +401,11 @@ void Send_Notification_WOCOVA( MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_WYVERN, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was fireballed by a Wyvern%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_JUMP, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 joins the Zombies%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_MELEE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was given kung fu lessons by a Zombie%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade", _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_NAPALM, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_napalm", _("^BG%s^K1 was burned to death by their own Napalm Nade%s%s"), _("^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s")) \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_ice", _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE_FREEZE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_ice", _("^BG%s^K1 was frozen to death by their own Ice Nade%s%s"), _("^BG%s^K1 felt a little chilly%s%s")) \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_HEAL, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_heal", _("^BG%s^K1's Healing Nade didn't quite heal them%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO, 2, 1, "s1 s2loc spree_lost", "s1", "notify_outofammo", _("^BG%s^K1 died%s%s. What's the point of living without ammo?"), _("^BG%s^K1 ran out of ammo%s%s")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 rotted away%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR, 2, 1, "s1 s2loc spree_lost", "s1", "notify_shootingstar", _("^BG%s^K1 became a shooting star%s%s"), "") \ @@ -432,6 +440,7 @@ void Send_Notification_WOCOVA( MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE, 2, 0, "s1 s2", "", "", _("^BG%s^K1 was frozen by ^BG%s"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED, 2, 0, "s1 s2", "", "", _("^BG%s^K3 was revived by ^BG%s"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED_FALL, 1, 0, "s1", "", "", _("^BG%s^K3 was revived by falling"), "") \ + MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED_NADE, 1, 0, "s1", "", "", _("^BG%s^K3 was revived by their Nade explosion"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_AUTO_REVIVED, 1, 1, "s1 f1", "", "", _("^BG%s^K3 was automatically revived after %s second(s)"), "") \ MULTITEAM_INFO(1, INFO_ROUND_TEAM_WIN_, 4, 0, 0, "", "", "", _("^TC^TT^BG team wins the round"), "") \ MSG_INFO_NOTIF(1, INFO_ROUND_PLAYER_WIN, 1, 0, "s1", "", "", _("^BG%s^BG wins the round"), "") \ @@ -580,6 +589,7 @@ void Send_Notification_WOCOVA( MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE, 1, 4, "spree_cen s1 frag_stats", NO_CPID, "0 0", _("^K1%sYou were typefragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE, 1, 2, "spree_cen s1 frag_ping", NO_CPID, "0 0", _("^K1%sYou typefragged ^BG%s^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_NADE_THROW, 0, 0, "", CPID_NADES, "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the nade!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_NADE_BONUS, 0, 0, "", CPID_NADES, "0 0", _("^F2You got a ^K1BONUS GRENADE^F2!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_AUTOTEAMCHANGE, 0, 1, "death_team", NO_CPID, "0 0", _("^BGYou have been moved into a different team\nYou are now on: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_BETRAYAL, 0, 0, "", NO_CPID, "0 0", _("^K1Don't shoot your team mates!"), _("^K1Don't go against your team mates!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_CAMP, 0, 0, "", NO_CPID, "0 0", _("^K1Die camper!"), _("^K1Reconsider your tactics, camper!")) \ @@ -592,6 +602,9 @@ void Send_Notification_WOCOVA( MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_LAVA, 0, 0, "", NO_CPID, "0 0", _("^K1You couldn't stand the heat!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_MONSTER, 0, 0, "", NO_CPID, "0 0", _("^K1You were killed by a monster!"), _("^K1You need to watch out for monsters!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE, 0, 0, "", NO_CPID, "0 0", _("^K1You forgot to put the pin back in!"), _("^K1Tastes like chicken!")) \ + MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE_NAPALM, 0, 0, "", NO_CPID, "0 0", _("^K1Hanging around a napalm explosion is bad!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE_ICE_FREEZE, 0, 0, "", NO_CPID, "0 0", _("^K1You got a little bit too cold!"), _("^K1You felt a little chilly!")) \ + MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE_HEAL, 0, 0, "", NO_CPID, "0 0", _("^K1Your Healing Nade is a bit defective"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NOAMMO, 0, 0, "", NO_CPID, "0 0", _("^K1You were killed for running out of ammo..."), _("^K1You are respawning for running out of ammo...")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_ROT, 0, 0, "", NO_CPID, "0 0", _("^K1You grew too old without taking your medicine"), _("^K1You need to preserve your health")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_SHOOTING_STAR, 0, 0, "", NO_CPID, "0 0", _("^K1You became a shooting star!"), "") \ @@ -619,7 +632,7 @@ void Send_Notification_WOCOVA( MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FREEZE, 1, 0, "s1", NO_CPID, "0 0", _("^K3You froze ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FROZEN, 1, 0, "s1", NO_CPID, "0 0", _("^K1You were frozen by ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE, 1, 0, "s1", NO_CPID, "0 0", _("^K3You revived ^BG%s"), "") \ - MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE_FALL, 0, 0, "", NO_CPID, "0 0", _("^K3You revived yourself"), "") \ + MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE_SELF, 0, 0, "", NO_CPID, "0 0", _("^K3You revived yourself"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVED, 1, 0, "s1", NO_CPID, "0 0", _("^K3You were revived by ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_AUTO_REVIVED, 0, 1, "f1", NO_CPID, "0 0", _("^K3You were automatically revived after %s second(s)"), "") \ MULTITEAM_CENTER(1, CENTER_ROUND_TEAM_WIN_, 4, 0, 0, "", CPID_ROUND, "0 0", _("^TC^TT^BG team wins the round"), "") \ @@ -699,6 +712,10 @@ void Send_Notification_WOCOVA( MSG_MULTI_NOTIF(1, DEATH_MURDER_LAVA, NO_MSG, INFO_DEATH_MURDER_LAVA, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_MONSTER, NO_MSG, INFO_DEATH_MURDER_MONSTER, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE, NO_MSG, INFO_DEATH_MURDER_NADE, NO_MSG) \ + MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE_NAPALM, NO_MSG, INFO_DEATH_MURDER_NADE_NAPALM, NO_MSG) \ + MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE_ICE, NO_MSG, INFO_DEATH_MURDER_NADE_ICE, NO_MSG) \ + MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE_ICE_FREEZE, NO_MSG, INFO_DEATH_MURDER_NADE_ICE_FREEZE, NO_MSG) \ + MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE_HEAL, NO_MSG, INFO_DEATH_MURDER_NADE_HEAL, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_SHOOTING_STAR, NO_MSG, INFO_DEATH_MURDER_SHOOTING_STAR, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_SLIME, NO_MSG, INFO_DEATH_MURDER_SLIME, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_SWAMP, NO_MSG, INFO_DEATH_MURDER_SWAMP, NO_MSG) \ @@ -736,6 +753,10 @@ void Send_Notification_WOCOVA( MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_JUMP, NO_MSG, INFO_DEATH_SELF_MON_ZOMBIE_JUMP, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_MELEE, NO_MSG, INFO_DEATH_SELF_MON_ZOMBIE_MELEE, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_NADE, NO_MSG, INFO_DEATH_SELF_NADE, CENTER_DEATH_SELF_NADE) \ + MSG_MULTI_NOTIF(1, DEATH_SELF_NADE_NAPALM, NO_MSG, INFO_DEATH_SELF_NADE_NAPALM, CENTER_DEATH_SELF_NADE_NAPALM) \ + MSG_MULTI_NOTIF(1, DEATH_SELF_NADE_ICE, NO_MSG, INFO_DEATH_SELF_NADE_ICE, CENTER_DEATH_SELF_NADE_ICE_FREEZE) \ + MSG_MULTI_NOTIF(1, DEATH_SELF_NADE_ICE_FREEZE, NO_MSG, INFO_DEATH_SELF_NADE_ICE_FREEZE, CENTER_DEATH_SELF_NADE_ICE_FREEZE) \ + MSG_MULTI_NOTIF(1, DEATH_SELF_NADE_HEAL, NO_MSG, INFO_DEATH_SELF_NADE_HEAL, CENTER_DEATH_SELF_NADE_HEAL) \ MSG_MULTI_NOTIF(1, DEATH_SELF_NOAMMO, NO_MSG, INFO_DEATH_SELF_NOAMMO, CENTER_DEATH_SELF_NOAMMO) \ MSG_MULTI_NOTIF(1, DEATH_SELF_ROT, NO_MSG, INFO_DEATH_SELF_ROT, CENTER_DEATH_SELF_ROT) \ MSG_MULTI_NOTIF(1, DEATH_SELF_SHOOTING_STAR, NO_MSG, INFO_DEATH_SELF_SHOOTING_STAR, CENTER_DEATH_SELF_SHOOTING_STAR) \ diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 674c95b14..290277111 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -800,10 +800,13 @@ string autocvar_g_forced_team_otherwise; string autocvar_g_forced_team_pink; string autocvar_g_forced_team_red; string autocvar_g_forced_team_yellow; +float autocvar_g_freezetag_frozen_damage_trigger; float autocvar_g_freezetag_frozen_force; float autocvar_g_freezetag_frozen_maxtime; float autocvar_g_freezetag_revive_falldamage; float autocvar_g_freezetag_revive_falldamage_health; +float autocvar_g_freezetag_revive_nade; +float autocvar_g_freezetag_revive_nade_health; float autocvar_g_freezetag_point_leadlimit; float autocvar_g_freezetag_point_limit; float autocvar_g_freezetag_revive_extra_size; @@ -1105,6 +1108,7 @@ float autocvar_sv_dodging_up_speed; float autocvar_sv_dodging_wall_distance_threshold; float autocvar_sv_dodging_wall_dodging; float autocvar_sv_dodging_frozen; +float autocvar_sv_dodging_frozen_doubletap; float autocvar_sv_doublejump; float autocvar_sv_eventlog; float autocvar_sv_eventlog_console; @@ -1258,6 +1262,8 @@ float autocvar_g_random_gravity_negative; float autocvar_g_random_gravity_delay; float autocvar_g_nades; float autocvar_g_nades_spawn; +float autocvar_g_nades_spawn_count; +float autocvar_g_nades_client_select; float autocvar_g_nades_nade_lifetime; float autocvar_g_nades_nade_minforce; float autocvar_g_nades_nade_maxforce; @@ -1268,6 +1274,44 @@ float autocvar_g_nades_nade_edgedamage; float autocvar_g_nades_nade_radius; float autocvar_g_nades_nade_force; float autocvar_g_nades_nade_newton_style; +float autocvar_g_nades_napalm_ball_count; +float autocvar_g_nades_napalm_ball_spread; +float autocvar_g_nades_napalm_ball_damage; +float autocvar_g_nades_napalm_ball_damageforcescale; +float autocvar_g_nades_napalm_ball_lifetime; +float autocvar_g_nades_napalm_ball_radius; +float autocvar_g_nades_napalm_blast; +float autocvar_g_nades_napalm_fountain_lifetime; +float autocvar_g_nades_napalm_fountain_delay; +float autocvar_g_nades_napalm_fountain_radius; +float autocvar_g_nades_napalm_fountain_damage; +float autocvar_g_nades_napalm_fountain_edgedamage; +float autocvar_g_nades_napalm_burntime; +float autocvar_g_nades_napalm_selfdamage; +float autocvar_g_nades_nade_type; +float autocvar_g_nades_bonus_type; +float autocvar_g_nades_bonus; +float autocvar_g_nades_bonus_onstrength; +float autocvar_g_nades_bonus_client_select; +float autocvar_g_nades_bonus_max; +float autocvar_g_nades_bonus_score_max; +float autocvar_g_nades_bonus_score_time; +float autocvar_g_nades_bonus_score_time_flagcarrier; +float autocvar_g_nades_bonus_score_minor; +float autocvar_g_nades_bonus_score_low; +float autocvar_g_nades_bonus_score_high; +float autocvar_g_nades_bonus_score_medium; +float autocvar_g_nades_bonus_score_spree; +float autocvar_g_nades_ice_freeze_time; +float autocvar_g_nades_ice_health; +float autocvar_g_nades_ice_explode; +float autocvar_g_nades_ice_teamcheck; +float autocvar_g_nades_heal_time; +float autocvar_g_nades_heal_rate; +float autocvar_g_nades_heal_friend; +float autocvar_g_nades_heal_foe; +string autocvar_g_nades_pokenade_monster_type; +//float autocvar_g_nades_pokenade_monster_lifetime; float autocvar_g_campcheck_damage; float autocvar_g_campcheck_distance; float autocvar_g_campcheck_interval; diff --git a/qcsrc/server/bot/aim.qc b/qcsrc/server/bot/aim.qc index 3467e2b39..61f4ab5e8 100644 --- a/qcsrc/server/bot/aim.qc +++ b/qcsrc/server/bot/aim.qc @@ -111,7 +111,7 @@ float bot_shouldattack(entity e) return FALSE; } - if(e.freezetag_frozen) + if(e.frozen) return FALSE; // If neither player has ball then don't attack unless the ball is on the diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index d06bc96be..038799df5 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -168,6 +168,8 @@ void PutObserverInServer (void) Portal_ClearAll(self); + Unfreeze(self); + if(self.alivetime) { if(!warmup_stage) @@ -239,6 +241,7 @@ void PutObserverInServer (void) self.angles_z = 0; self.fixangle = TRUE; self.crouch = FALSE; + self.revival_time = 0; setorigin (self, (spot.origin + PL_VIEW_OFS)); // offset it so that the spectator spawns higher off the ground, looks better this way self.prevorigin = self.origin; @@ -519,6 +522,7 @@ void PutClientInServer (void) self.punchvector = '0 0 0'; self.oldvelocity = self.velocity; self.fire_endtime = -1; + self.revival_time = 0; entity spawnevent = spawn(); spawnevent.owner = self; @@ -592,6 +596,8 @@ void PutClientInServer (void) activator = world; self = oldself; + Unfreeze(self); + spawn_spot = spot; MUTATOR_CALLHOOK(PlayerSpawn); @@ -941,7 +947,7 @@ void ClientKill (void) { if(gameover) return; if(self.player_blocked) return; - if(self.freezetag_frozen) return; + if(self.frozen) return; ClientKill_TeamChange(0); } @@ -1292,6 +1298,8 @@ void ClientDisconnect (void) Portal_ClearAll(self); + Unfreeze(self); + RemoveGrapplingHook(self); // Here, everything has been done that requires this player to be a client. @@ -1586,6 +1594,7 @@ float CalcRotRegen(float current, float regenstable, float regenfactor, float re void player_regen (void) { if(!MUTATOR_CALLHOOK(PlayerRegen)) + if(!self.frozen) { float minh, mina, maxh, maxa, limith, limita, max_mod, regen_mod, rot_mod, limit_mod; maxh = autocvar_g_balance_health_rotstable; @@ -1731,6 +1740,8 @@ void SpectateCopy(entity spectatee) { self.dmg_inflictor = spectatee.dmg_inflictor; self.v_angle = spectatee.v_angle; self.angles = spectatee.v_angle; + self.frozen = spectatee.frozen; + self.revive_progress = spectatee.revive_progress; if(!self.BUTTON_USE) self.fixangle = TRUE; setorigin(self, spectatee.origin); @@ -1936,6 +1947,7 @@ void LeaveSpectatorMode() if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) { self.classname = "player"; + nades_RemoveBonus(self); if(autocvar_g_campaign || autocvar_g_balance_teams) { JoinBestTeam(self, FALSE, TRUE); } @@ -2241,6 +2253,30 @@ void PlayerPreThink (void) return; #endif + if(self.frozen == 2) + { + self.revive_progress = bound(0, self.revive_progress + frametime * self.revive_speed, 1); + self.health = max(1, self.revive_progress * start_health); + self.iceblock.alpha = bound(0.2, 1 - self.revive_progress, 1); + + if(self.revive_progress >= 1) + Unfreeze(self); + } + else if(self.frozen == 3) + { + self.revive_progress = bound(0, self.revive_progress - frametime * self.revive_speed, 1); + self.health = max(0, autocvar_g_nades_ice_health + (start_health-autocvar_g_nades_ice_health) * self.revive_progress ); + + if(self.health < 1) + { + if(self.vehicle) + vehicles_exit(VHEF_RELESE); + self.event_damage(self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE, self.origin, '0 0 0'); + } + else if ( self.revive_progress <= 0 ) + Unfreeze(self); + } + MUTATOR_CALLHOOK(PlayerPreThink); if(!self.cvar_cl_newusekeysupported) // FIXME remove this - it was a stupid idea to begin with, we can JUST use the button @@ -2365,7 +2401,7 @@ void PlayerPreThink (void) do_crouch = 0; if(self.vehicle) do_crouch = 0; - if(self.freezetag_frozen) + if(self.frozen) do_crouch = 0; if(self.weapon == WEP_SHOTGUN && self.weaponentity.wframe == WFRAME_FIRE2 && time < self.weapon_nextthink) do_crouch = 0; diff --git a/qcsrc/server/cl_physics.qc b/qcsrc/server/cl_physics.qc index 0d0dd3138..5a0ff5872 100644 --- a/qcsrc/server/cl_physics.qc +++ b/qcsrc/server/cl_physics.qc @@ -19,6 +19,9 @@ When you press the jump key */ void PlayerJump (void) { + if(self.frozen) + return; // no jumping in freezetag when frozen + float doublejump = FALSE; player_multijump = doublejump; @@ -789,6 +792,28 @@ void SV_PlayerPhysics() self.stat_sv_airspeedlimit_nonqw *= 0.5; } + if(self.frozen) + { + if(autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self)) + { + self.movement_x = bound(-5, self.movement_x, 5); + self.movement_y = bound(-5, self.movement_y, 5); + self.movement_z = bound(-5, self.movement_z, 5); + } + else + self.movement = '0 0 0'; + self.disableclientprediction = 1; + + vector midpoint = ((self.absmin + self.absmax) * 0.5); + if(pointcontents(midpoint) == CONTENT_WATER) + { + self.velocity = self.velocity * 0.5; + + if(pointcontents(midpoint + '0 0 16') == CONTENT_WATER) + { self.velocity_z = 200; } + } + } + MUTATOR_CALLHOOK(PlayerPhysics); if(self.player_blocked) @@ -990,7 +1015,7 @@ void SV_PlayerPhysics() 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) && !self.freezetag_frozen) + else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!autocvar_g_jetpack_fuel || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO) && !self.frozen) { //makevectors(self.v_angle_y * '0 1 0'); makevectors(self.v_angle); diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 67738c4c6..39f503dc4 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -246,7 +246,7 @@ void player_anim (void) else deadbits = ANIMSTATE_DEAD2; float animbits = deadbits; - if(self.freezetag_frozen) + if(self.frozen) animbits |= ANIMSTATE_FROZEN; if(self.crouch) animbits |= ANIMSTATE_DUCK; @@ -693,6 +693,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht // when we get here, player actually dies + Unfreeze(self); // remove any icy remains + self.health = 0; // Unfreeze resets health, so we need to set it back + // clear waypoints WaypointSprite_PlayerDead(); // throw a weapon diff --git a/qcsrc/server/cl_weapons.qc b/qcsrc/server/cl_weapons.qc index 2885e6dc5..540f5b83f 100644 --- a/qcsrc/server/cl_weapons.qc +++ b/qcsrc/server/cl_weapons.qc @@ -330,6 +330,8 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce) w = self.weapon; if (w == 0) return; // just in case + if(self.frozen) + return; if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon)) return; if(!autocvar_g_weapon_throwable) @@ -358,7 +360,7 @@ float forbidWeaponUse() return 1; if(self.player_blocked) return 1; - if(self.freezetag_frozen) + if(self.frozen) return 1; return 0; } diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index c8c87e096..505dba251 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -283,6 +283,7 @@ void ClientCommand_mobspawn(float request, float argc) else if(MUTATOR_CALLHOOK(AllowMobSpawning)) { sprint(self, "Monster spawning is currently disabled by a mutator.\n"); return; } else if(!autocvar_g_monsters) { Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_MONSTERS_DISABLED); return; } else if(self.vehicle) { sprint(self, "You can't spawn monsters while driving a vehicle.\n"); return; } + else if(self.frozen) { sprint(self, "You can't spawn monsters while frozen.\n"); return; } else if(autocvar_g_campaign) { sprint(self, "You can't spawn monsters in campaign mode.\n"); return; } else if(self.deadflag != DEAD_NO) { sprint(self, "You can't spawn monsters while dead.\n"); return; } else if(self.monstercount >= autocvar_g_monsters_max_perplayer) { sprint(self, "You have spawned too many monsters, kill some before trying to spawn any more.\n"); return; } diff --git a/qcsrc/server/csqcprojectile.qc b/qcsrc/server/csqcprojectile.qc index 4d208ebda..3c747bdbb 100644 --- a/qcsrc/server/csqcprojectile.qc +++ b/qcsrc/server/csqcprojectile.qc @@ -48,6 +48,8 @@ float CSQCProjectile_SendEntity(entity to, float sf) WriteByte(MSG_ENTITY, ft); WriteByte(MSG_ENTITY, fr); } + + WriteByte(MSG_ENTITY, self.realowner.team); } if(sf & 2) diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index c32ef7716..d8e35db4a 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -584,7 +584,12 @@ float serverflags; .float player_blocked; -.float freezetag_frozen; +.float frozen; // for freeze attacks +.float revive_progress; +.float revival_time; // time at which player was last revived +.float revive_speed; // NOTE: multiplier (anything above 1 is instaheal) +.entity iceblock; +.entity frozen_by; // for ice fields .entity muzzle_flash; .float misc_bulletcounter; // replaces uzi & hlac bullet counter. diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 45319ca07..b5b52a379 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -549,6 +549,86 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype) if(targ.killcount) { targ.killcount = 0; } } +void Ice_Think() +{ + if(!self.owner.frozen || self.owner.iceblock != self) + { + remove(self); + return; + } + setorigin(self, self.owner.origin - '0 0 16'); + self.nextthink = time; +} + +void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypoint) +{ + if(!IS_PLAYER(targ) && !(targ.flags & FL_MONSTER)) // only specified entities can be freezed + return; + + if(targ.frozen) + return; + + float targ_maxhealth = ((targ.flags & FL_MONSTER) ? targ.max_health : start_health); + + targ.frozen = frozen_type; + targ.revive_progress = ((frozen_type == 3) ? 1 : 0); + targ.health = ((frozen_type == 3) ? targ_maxhealth : 1); + targ.revive_speed = freeze_time; + + entity ice, head; + ice = spawn(); + ice.owner = targ; + ice.classname = "ice"; + ice.scale = targ.scale; + ice.think = Ice_Think; + ice.nextthink = time; + ice.frame = floor(random() * 21); // ice model has 20 different looking frames + setmodel(ice, "models/ice/ice.md3"); + ice.alpha = 1; + ice.colormod = Team_ColorRGB(targ.team); + ice.glowmod = ice.colormod; + targ.iceblock = ice; + targ.revival_time = 0; + + entity oldself; + oldself = self; + self = ice; + Ice_Think(); + self = oldself; + + RemoveGrapplingHook(targ); + + FOR_EACH_PLAYER(head) + if(head.hook.aiment == targ) + RemoveGrapplingHook(head); + + // add waypoint + if(show_waypoint) + WaypointSprite_Spawn("frozen", 0, 0, targ, '0 0 64', world, targ.team, targ, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1'); +} + +void Unfreeze (entity targ) +{ + if(targ.frozen && targ.frozen != 3) // only reset health if target was frozen + targ.health = ((IS_PLAYER(targ)) ? start_health : targ.max_health); + + entity head; + targ.frozen = 0; + targ.revive_progress = 0; + targ.revival_time = time; + + WaypointSprite_Kill(targ.waypointsprite_attached); + + FOR_EACH_PLAYER(head) + if(head.hook.aiment == targ) + RemoveGrapplingHook(head); + + // remove the ice block + if(targ.iceblock) + remove(targ.iceblock); + targ.iceblock = world; +} + // these are updated by each Damage call for use in button triggering and such entity damage_targ; entity damage_inflictor; @@ -690,7 +770,63 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float mirrordamage = frag_mirrordamage; force = frag_force; - if (!g_minstagib) + if(targ.frozen) + if(deathtype != DEATH_HURTTRIGGER && deathtype != DEATH_TEAMCHANGE && deathtype != DEATH_AUTOTEAMCHANGE) + { + if(autocvar_g_freezetag_revive_falldamage > 0) + if(deathtype == DEATH_FALL) + if(damage >= autocvar_g_freezetag_revive_falldamage) + { + Unfreeze(targ); + targ.health = autocvar_g_freezetag_revive_falldamage_health; + pointparticles(particleeffectnum("iceorglass"), targ.origin, '0 0 0', 3); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_REVIVED_FALL, targ.netname); + Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_FREEZETAG_REVIVE_SELF); + } + + damage = 0; + force *= autocvar_g_freezetag_frozen_force; + } + + if(targ.frozen && deathtype == DEATH_HURTTRIGGER && !autocvar_g_freezetag_frozen_damage_trigger) + { + pointparticles(particleeffectnum("teleport"), targ.origin, '0 0 0', 1); + + entity oldself = self; + self = targ; + entity spot = SelectSpawnPoint (FALSE); + + if(spot) + { + damage = 0; + self.deadflag = DEAD_NO; + + self.angles = spot.angles; + + self.effects = 0; + self.effects |= EF_TELEPORT_BIT; + + self.angles_z = 0; // never spawn tilted even if the spot says to + self.fixangle = TRUE; // turn this way immediately + self.velocity = '0 0 0'; + self.avelocity = '0 0 0'; + self.punchangle = '0 0 0'; + self.punchvector = '0 0 0'; + self.oldvelocity = self.velocity; + + self.spawnorigin = spot.origin; + setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 24)); + // don't reset back to last position, even if new position is stuck in solid + self.oldorigin = self.origin; + self.prevorigin = self.origin; + + pointparticles(particleeffectnum("teleport"), self.origin, '0 0 0', 1); + } + + self = oldself; + } + + if(!g_minstagib) { // apply strength multiplier if (attacker.items & IT_STRENGTH) @@ -1200,7 +1336,7 @@ void Fire_ApplyDamage(entity e) e.fire_endtime = 0; // ice stops fire - if(e.freezetag_frozen) + if(e.frozen) e.fire_endtime = 0; t = min(frametime, e.fire_endtime - time); @@ -1217,6 +1353,7 @@ void Fire_ApplyDamage(entity e) e.fire_hitsound = TRUE; if (!IS_INDEPENDENT_PLAYER(e)) + if (!e.frozen) FOR_EACH_PLAYER(other) if(e != other) { if(IS_PLAYER(other)) diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 875a0c3e6..599abdad9 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -794,6 +794,10 @@ void spawnfunc_worldspawn (void) addstat(STAT_HAGAR_LOAD, AS_INT, hagar_load); + // freeze attacks + addstat(STAT_FROZEN, AS_INT, frozen); + addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, revive_progress); + // g_movementspeed hack addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw); addstat(STAT_MOVEVARS_MAXSPEED, AS_FLOAT, stat_sv_maxspeed); diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 5dc6f2e39..f3c26699d 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -1303,6 +1303,7 @@ void precache() { // gamemode related things precache_model ("models/misc/chatbubble.spr"); + precache_model("models/ice/ice.md3"); #ifdef TTURRETS_ENABLED if (autocvar_g_turrets) diff --git a/qcsrc/server/mutators/gamemode_ca.qc b/qcsrc/server/mutators/gamemode_ca.qc index 8a6315c42..8b38ceb09 100644 --- a/qcsrc/server/mutators/gamemode_ca.qc +++ b/qcsrc/server/mutators/gamemode_ca.qc @@ -67,12 +67,15 @@ float CA_GetWinnerTeam() #define CA_ALIVE_TEAMS_OK() (CA_ALIVE_TEAMS() == ca_teams) float CA_CheckWinner() { + entity e; if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0) { Send_Notification(NOTIF_ALL, world, MSG_CENTER, CENTER_ROUND_OVER); Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_ROUND_OVER); allowed_to_spawn = FALSE; round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit); + FOR_EACH_PLAYER(e) + nades_Clear(e); return 1; } @@ -95,6 +98,10 @@ float CA_CheckWinner() allowed_to_spawn = FALSE; round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit); + + FOR_EACH_PLAYER(e) + nades_Clear(e); + return 1; } diff --git a/qcsrc/server/mutators/gamemode_ctf.qc b/qcsrc/server/mutators/gamemode_ctf.qc index 66c7b8715..626e4fed8 100644 --- a/qcsrc/server/mutators/gamemode_ctf.qc +++ b/qcsrc/server/mutators/gamemode_ctf.qc @@ -388,6 +388,8 @@ void ctf_Handle_Capture(entity flag, entity toucher, float capturetype) if (!player) { return; } // without someone to give the reward to, we can't possibly cap + nades_GiveBonus(player, autocvar_g_nades_bonus_score_high ); + // messages and sounds Send_Notification(NOTIF_ONE, player, MSG_CENTER, APP_TEAM_ENT_2(enemy_flag, CENTER_CTF_CAPTURE_)); ctf_CaptureRecord(enemy_flag, player); @@ -448,6 +450,8 @@ void ctf_Handle_Return(entity flag, entity player) { PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_return); // reward for return PlayerScore_Add(player, SP_CTF_RETURNS, 1); // add to count of returns + + nades_GiveBonus(player,autocvar_g_nades_bonus_score_medium); } TeamScore_AddToTeam(flag.team, ST_SCORE, -autocvar_g_ctf_score_penalty_returned); // punish the team who was last carrying it @@ -500,6 +504,7 @@ void ctf_Handle_Pickup(entity flag, entity player, float pickuptype) // scoring PlayerScore_Add(player, SP_CTF_PICKUPS, 1); + nades_GiveBonus(player, autocvar_g_nades_bonus_score_minor); switch(pickuptype) { case PICKUP_BASE: @@ -791,7 +796,8 @@ void ctf_FlagTouch() } // special touch behaviors - if(toucher.vehicle_flags & VHF_ISVEHICLE) + if(toucher.frozen) { return; } + else if(toucher.vehicle_flags & VHF_ISVEHICLE) { if(autocvar_g_ctf_allow_vehicle_touch) toucher = toucher.owner; // the player is actually the vehicle owner, not other diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index bfc2601e9..52d0fd492 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -1,7 +1,6 @@ .float freezetag_frozen_time; .float freezetag_frozen_timeout; .float freezetag_revive_progress; -.entity freezetag_ice; #define ICE_MAX_ALPHA 1 #define ICE_MIN_ALPHA 0.1 float freezetag_teams; @@ -10,29 +9,18 @@ void freezetag_count_alive_players() { entity e; total_players = redalive = bluealive = yellowalive = pinkalive = 0; - FOR_EACH_PLAYER(e) { - if(e.team == NUM_TEAM_1 && e.health >= 1) - { - ++total_players; - if (!e.freezetag_frozen) ++redalive; - } - else if(e.team == NUM_TEAM_2 && e.health >= 1) - { - ++total_players; - if (!e.freezetag_frozen) ++bluealive; - } - else if(e.team == NUM_TEAM_3 && e.health >= 1) - { - ++total_players; - if (!e.freezetag_frozen) ++yellowalive; - } - else if(e.team == NUM_TEAM_4 && e.health >= 1) + FOR_EACH_PLAYER(e) + { + switch(e.team) { - ++total_players; - if (!e.freezetag_frozen) ++pinkalive; + case NUM_TEAM_1: ++total_players; if(e.health >= 1 && e.frozen != 1) ++redalive; break; + case NUM_TEAM_2: ++total_players; if(e.health >= 1 && e.frozen != 1) ++bluealive; break; + case NUM_TEAM_3: ++total_players; if(e.health >= 1 && e.frozen != 1) ++yellowalive; break; + case NUM_TEAM_4: ++total_players; if(e.health >= 1 && e.frozen != 1) ++pinkalive; break; } } - FOR_EACH_REALCLIENT(e) { + FOR_EACH_REALCLIENT(e) + { e.redalive_stat = redalive; e.bluealive_stat = bluealive; e.yellowalive_stat = yellowalive; @@ -102,7 +90,7 @@ float freezetag_CheckWinner() FOR_EACH_PLAYER(e) { e.freezetag_frozen_timeout = 0; - e.freezetag_revive_progress = 0; + nades_Clear(e); } round_handler_Init(5, autocvar_g_freezetag_warmup, autocvar_g_freezetag_round_timelimit); return 1; @@ -128,21 +116,12 @@ float freezetag_CheckWinner() FOR_EACH_PLAYER(e) { e.freezetag_frozen_timeout = 0; - e.freezetag_revive_progress = 0; + nades_Clear(e); } round_handler_Init(5, autocvar_g_freezetag_warmup, autocvar_g_freezetag_round_timelimit); return 1; } -// this is needed to allow the player to turn his view around (fixangle can't -// be used to freeze his view, as that also changes the angles), while not -// turning that ice object with the player -void freezetag_Ice_Think() -{ - setorigin(self, self.owner.origin - '0 0 16'); - self.nextthink = time; -} - void freezetag_Add_Score(entity attacker) { if(attacker == self) @@ -163,51 +142,25 @@ void freezetag_Add_Score(entity attacker) void freezetag_Freeze(entity attacker) { - if(self.freezetag_frozen) + if(self.frozen) return; - self.freezetag_frozen = 1; - self.freezetag_frozen_time = time; - self.freezetag_revive_progress = 0; - self.health = 1; + if(autocvar_g_freezetag_frozen_maxtime > 0) self.freezetag_frozen_timeout = time + autocvar_g_freezetag_frozen_maxtime; - freezetag_count_alive_players(); + Freeze(self, 0, 1, TRUE); - entity ice; - ice = spawn(); - ice.owner = self; - ice.classname = "freezetag_ice"; - ice.think = freezetag_Ice_Think; - ice.nextthink = time; - ice.frame = floor(random() * 21); // ice model has 20 different looking frames - ice.alpha = ICE_MAX_ALPHA; - ice.colormod = Team_ColorRGB(self.team); - ice.glowmod = ice.colormod; - setmodel(ice, "models/ice/ice.md3"); - - self.freezetag_ice = ice; - - RemoveGrapplingHook(self); - - // add waypoint - WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1'); + freezetag_count_alive_players(); freezetag_Add_Score(attacker); } void freezetag_Unfreeze(entity attacker) { - self.freezetag_frozen = 0; self.freezetag_frozen_time = 0; self.freezetag_frozen_timeout = 0; - self.freezetag_revive_progress = 0; - remove(self.freezetag_ice); - self.freezetag_ice = world; - - if(self.waypointsprite_attached) - WaypointSprite_Kill(self.waypointsprite_attached); + Unfreeze(self); } @@ -227,7 +180,7 @@ void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradiu { if ((head != self) && (head.team == self.team)) { - if (head.freezetag_frozen) + if (head.frozen == 1) { distance = vlen(head.origin - org); if (distance > sradius) @@ -259,12 +212,12 @@ void havocbot_role_ft_offense() unfrozen = 0; FOR_EACH_PLAYER(head) { - if ((head.team == self.team) && (!head.freezetag_frozen)) + if ((head.team == self.team) && (head.frozen != 1)) unfrozen++; } // If only one left on team or if role has timed out then start trying to free players. - if (((unfrozen == 0) && (!self.freezetag_frozen)) || (time > self.havocbot_role_timeout)) + if (((unfrozen == 0) && (!self.frozen)) || (time > self.havocbot_role_timeout)) { dprint("changing role to freeing\n"); self.havocbot_role = havocbot_role_ft_freeing; @@ -332,7 +285,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) if(round_handler_IsActive()) if(round_handler_CountdownRunning()) { - if(self.freezetag_frozen) + if(self.frozen) freezetag_Unfreeze(world); freezetag_count_alive_players(); return 1; // let the player die so that he can respawn whenever he wants @@ -344,18 +297,19 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) || frag_deathtype == DEATH_TEAMCHANGE || frag_deathtype == DEATH_AUTOTEAMCHANGE) { // let the player die, he will be automatically frozen when he respawns - if(!self.freezetag_frozen) + if(self.frozen != 1) { freezetag_Add_Score(frag_attacker); freezetag_count_alive_players(); } else freezetag_Unfreeze(world); // remove ice + self.health = 0; // Unfreeze resets health self.freezetag_frozen_timeout = -2; // freeze on respawn return 1; } - if(self.freezetag_frozen) + if(self.frozen) return 1; freezetag_Freeze(frag_attacker); @@ -375,8 +329,6 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_FREEZE, frag_target.netname, frag_attacker.netname); } - frag_target.health = 1; // "respawn" the player :P - return 1; } @@ -408,8 +360,6 @@ MUTATOR_HOOKFUNCTION(freezetag_reset_map_players) FOR_EACH_PLAYER(self) { self.killcount = 0; - if (self.freezetag_frozen) - freezetag_Unfreeze(world); self.freezetag_frozen_timeout = -1; PutClientInServer(); self.freezetag_frozen_timeout = 0; @@ -432,7 +382,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) if(gameover) return 1; - if(self.freezetag_frozen) + if(self.frozen == 1) { // keep health = 1 self.pauseregen_finished = time + autocvar_g_balance_pause_health_regen; @@ -444,8 +394,9 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) entity o; o = world; - if(self.freezetag_frozen_timeout > 0 && time < self.freezetag_frozen_timeout) - self.freezetag_ice.alpha = ICE_MIN_ALPHA + (ICE_MAX_ALPHA - ICE_MIN_ALPHA) * (self.freezetag_frozen_timeout - time) / (self.freezetag_frozen_timeout - self.freezetag_frozen_time); + //if(self.frozen) + //if(self.freezetag_frozen_timeout > 0 && time < self.freezetag_frozen_timeout) + //self.iceblock.alpha = ICE_MIN_ALPHA + (ICE_MAX_ALPHA - ICE_MIN_ALPHA) * (self.freezetag_frozen_timeout - time) / (self.freezetag_frozen_timeout - self.freezetag_frozen_time); if(self.freezetag_frozen_timeout > 0 && time >= self.freezetag_frozen_timeout) n = -1; @@ -453,34 +404,27 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) { vector revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size; n = 0; - FOR_EACH_PLAYER(other) if(self != other) + FOR_EACH_PLAYER(other) + if(self != other) + if(other.frozen == 0) + if(other.deadflag == DEAD_NO) + if(SAME_TEAM(other, self)) + if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax)) { - if(other.freezetag_frozen == 0) - { - if(other.team == self.team) - { - if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax)) - { - if(!o) - o = other; - if(self.freezetag_frozen) - other.reviving = TRUE; - ++n; - } - } - } + if(!o) + o = other; + if(self.frozen == 1) + other.reviving = TRUE; + ++n; } } - if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us + if(n && self.frozen == 1) // OK, there is at least one teammate reviving us { - self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1); - if(warmup_stage) - self.health = max(1, self.freezetag_revive_progress * warmup_start_health); - else - self.health = max(1, self.freezetag_revive_progress * start_health); + self.revive_progress = bound(0, self.revive_progress + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1); + self.health = max(1, self.revive_progress * ((warmup_stage) ? warmup_start_health : start_health)); - if(self.freezetag_revive_progress >= 1) + if(self.revive_progress >= 1) { freezetag_Unfreeze(self); freezetag_count_alive_players(); @@ -499,6 +443,8 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) { PlayerScore_Add(other, SP_FREEZETAG_REVIVALS, +1); PlayerScore_Add(other, SP_SCORE, +1); + + nades_GiveBonus(other,autocvar_g_nades_bonus_score_low); } } @@ -511,88 +457,24 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) { if(other.reviving) { - other.freezetag_revive_progress = self.freezetag_revive_progress; + other.revive_progress = self.revive_progress; other.reviving = FALSE; } } } - else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset - { - self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1); - if(warmup_stage) - self.health = max(1, self.freezetag_revive_progress * warmup_start_health); - else - self.health = max(1, self.freezetag_revive_progress * start_health); - } - else if(!n) + else if(!n && self.frozen == 1) // only if no teammate is nearby will we reset { - self.freezetag_revive_progress = 0; // thawing nobody + self.revive_progress = bound(0, self.revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1); + self.health = max(1, self.revive_progress * ((warmup_stage) ? warmup_start_health : start_health)); } - - return 1; -} - -MUTATOR_HOOKFUNCTION(freezetag_PlayerPhysics) -{ - if(self.freezetag_frozen) + else if(!n && !self.frozen) { - if(autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self)) - { - self.movement_x = bound(-5, self.movement_x, 5); - self.movement_y = bound(-5, self.movement_y, 5); - self.movement_z = bound(-5, self.movement_z, 5); - } - else - self.movement = '0 0 0'; - - self.disableclientprediction = 1; + self.revive_progress = 0; // thawing nobody } - return 1; -} - -MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate) -{ - if(frag_target.freezetag_frozen && frag_deathtype != DEATH_HURTTRIGGER) - { - if(autocvar_g_freezetag_revive_falldamage > 0) - if(frag_deathtype == DEATH_FALL) - if(frag_damage >= autocvar_g_freezetag_revive_falldamage) - { - freezetag_Unfreeze(frag_target); - frag_target.health = autocvar_g_freezetag_revive_falldamage_health; - pointparticles(particleeffectnum("iceorglass"), frag_target.origin, '0 0 0', 3); - Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_REVIVED_FALL, frag_target.netname); - Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_FREEZETAG_REVIVE_FALL); - } - frag_damage = 0; - frag_force = frag_force * autocvar_g_freezetag_frozen_force; - } return 1; } -MUTATOR_HOOKFUNCTION(freezetag_PlayerJump) -{ - if(self.freezetag_frozen) - return TRUE; // no jumping in freezetag when frozen - - return FALSE; -} - -MUTATOR_HOOKFUNCTION(freezetag_ForbidThrowCurrentWeapon) -{ - if (self.freezetag_frozen) - return 1; - return 0; -} - -MUTATOR_HOOKFUNCTION(freezetag_ItemTouch) -{ - if (other.freezetag_frozen) - return MUT_ITEMTOUCH_RETURN; - return MUT_ITEMTOUCH_CONTINUE; -} - MUTATOR_HOOKFUNCTION(freezetag_BotRoles) { if (!self.deadflag) @@ -606,31 +488,14 @@ MUTATOR_HOOKFUNCTION(freezetag_BotRoles) return TRUE; } -MUTATOR_HOOKFUNCTION(freezetag_SpectateCopy) -{ - self.freezetag_frozen = other.freezetag_frozen; - self.freezetag_revive_progress = other.freezetag_revive_progress; - return 0; -} - MUTATOR_HOOKFUNCTION(freezetag_GetTeamCount) { ret_float = freezetag_teams; return 0; } -MUTATOR_HOOKFUNCTION(freezetag_VehicleTouch) -{ - if(other.freezetag_frozen) - return TRUE; - - return FALSE; -} - void freezetag_Initialize() { - precache_model("models/ice/ice.md3"); - freezetag_teams = autocvar_g_freezetag_teams_override; if(freezetag_teams < 2) freezetag_teams = autocvar_g_freezetag_teams; @@ -644,9 +509,6 @@ void freezetag_Initialize() addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat); addstat(STAT_YELLOWALIVE, AS_INT, yellowalive_stat); addstat(STAT_PINKALIVE, AS_INT, pinkalive_stat); - - addstat(STAT_FROZEN, AS_INT, freezetag_frozen); - addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, freezetag_revive_progress); } MUTATOR_DEFINITION(gamemode_freezetag) @@ -658,15 +520,8 @@ MUTATOR_DEFINITION(gamemode_freezetag) MUTATOR_HOOK(reset_map_players, freezetag_reset_map_players, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST); MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST); - MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST); - MUTATOR_HOOK(PlayerDamage_Calculate, freezetag_PlayerDamage_Calculate, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerJump, freezetag_PlayerJump, CBC_ORDER_ANY); - MUTATOR_HOOK(ForbidThrowCurrentWeapon, freezetag_ForbidThrowCurrentWeapon, CBC_ORDER_ANY); - MUTATOR_HOOK(ItemTouch, freezetag_ItemTouch, CBC_ORDER_ANY); MUTATOR_HOOK(HavocBot_ChooseRule, freezetag_BotRoles, CBC_ORDER_ANY); - MUTATOR_HOOK(SpectateCopy, freezetag_SpectateCopy, CBC_ORDER_ANY); MUTATOR_HOOK(GetTeamCount, freezetag_GetTeamCount, CBC_ORDER_EXCLUSIVE); - MUTATOR_HOOK(VehicleTouch, freezetag_VehicleTouch, CBC_ORDER_ANY); MUTATOR_ONADD { diff --git a/qcsrc/server/mutators/gamemode_keepaway.qc b/qcsrc/server/mutators/gamemode_keepaway.qc index ec6ee8cd4..248712f15 100644 --- a/qcsrc/server/mutators/gamemode_keepaway.qc +++ b/qcsrc/server/mutators/gamemode_keepaway.qc @@ -71,6 +71,7 @@ void ka_TouchEvent() // runs any time that the ball comes in contact with someth return; } if(other.deadflag != DEAD_NO) { return; } + if(other.frozen) { return; } if (!IS_PLAYER(other)) { // The ball just touched an object, most likely the world pointparticles(particleeffectnum("kaball_sparks"), self.origin, '0 0 0', 1); diff --git a/qcsrc/server/mutators/gamemode_keyhunt.qc b/qcsrc/server/mutators/gamemode_keyhunt.qc index 34d87f97b..ab67a4821 100644 --- a/qcsrc/server/mutators/gamemode_keyhunt.qc +++ b/qcsrc/server/mutators/gamemode_keyhunt.qc @@ -500,6 +500,7 @@ void kh_WinnerTeam(float teem) // runs when a team wins // Samual: Teem?.... TE f = DistributeEvenly_Get(1); kh_Scores_Event(key.owner, key, "capture", f, 0); PlayerTeamScore_Add(key.owner, SP_KH_CAPS, ST_KH_CAPS, 1); + nades_GiveBonus(key.owner, autocvar_g_nades_bonus_score_high); } first = TRUE; diff --git a/qcsrc/server/mutators/gamemode_nexball.qc b/qcsrc/server/mutators/gamemode_nexball.qc index 014d37ec2..8695ca31b 100644 --- a/qcsrc/server/mutators/gamemode_nexball.qc +++ b/qcsrc/server/mutators/gamemode_nexball.qc @@ -288,7 +288,7 @@ void basketball_touch(void) football_touch(); return; } - if(!self.cnt && IS_PLAYER(other) && (other != self.nb_dropper || time > self.nb_droptime + autocvar_g_nexball_delay_collect)) + if(!self.cnt && IS_PLAYER(other) && !other.frozen && (other != self.nb_dropper || time > self.nb_droptime + autocvar_g_nexball_delay_collect)) { if(other.health <= 0) return; diff --git a/qcsrc/server/mutators/mutator_campcheck.qc b/qcsrc/server/mutators/mutator_campcheck.qc index fb20d1cff..2ec584db4 100644 --- a/qcsrc/server/mutators/mutator_campcheck.qc +++ b/qcsrc/server/mutators/mutator_campcheck.qc @@ -25,6 +25,7 @@ MUTATOR_HOOKFUNCTION(campcheck_PlayerThink) { if(IS_PLAYER(self)) if(self.deadflag == DEAD_NO) + if(!self.frozen) if(autocvar_g_campcheck_interval) { vector dist; diff --git a/qcsrc/server/mutators/mutator_dodging.qc b/qcsrc/server/mutators/mutator_dodging.qc index 3f808499a..b26fe1b9f 100644 --- a/qcsrc/server/mutators/mutator_dodging.qc +++ b/qcsrc/server/mutators/mutator_dodging.qc @@ -35,7 +35,7 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) { float clean_up_and_do_nothing; float horiz_speed = autocvar_sv_dodging_horiz_speed; - if(self.freezetag_frozen) + if(self.frozen) horiz_speed = autocvar_sv_dodging_horiz_speed_frozen; if (self.deadflag != DEAD_NO) @@ -169,8 +169,9 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { tap_direction_x = 0; tap_direction_y = 0; - float frozen_dodging; - frozen_dodging = (self.freezetag_frozen && autocvar_sv_dodging_frozen); + float frozen_dodging, frozen_no_doubletap; + frozen_dodging = (self.frozen && autocvar_sv_dodging_frozen); + frozen_no_doubletap = (frozen_dodging && !autocvar_sv_dodging_frozen_doubletap); float dodge_detected; if (g_dodging == 0) @@ -188,7 +189,7 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if (self.movement_x > 0) { // is this a state change? - if (!(self.pressedkeys & KEY_FORWARD) || frozen_dodging) { + if (!(self.pressedkeys & KEY_FORWARD) || frozen_no_doubletap) { if ((time - self.last_FORWARD_KEY_time) < self.cvar_cl_dodging_timeout) { tap_direction_x = 1.0; dodge_detected = 1; @@ -199,7 +200,7 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if (self.movement_x < 0) { // is this a state change? - if (!(self.pressedkeys & KEY_BACKWARD) || frozen_dodging) { + if (!(self.pressedkeys & KEY_BACKWARD) || frozen_no_doubletap) { tap_direction_x = -1.0; if ((time - self.last_BACKWARD_KEY_time) < self.cvar_cl_dodging_timeout) { dodge_detected = 1; @@ -210,7 +211,7 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if (self.movement_y > 0) { // is this a state change? - if (!(self.pressedkeys & KEY_RIGHT) || frozen_dodging) { + if (!(self.pressedkeys & KEY_RIGHT) || frozen_no_doubletap) { tap_direction_y = 1.0; if ((time - self.last_RIGHT_KEY_time) < self.cvar_cl_dodging_timeout) { dodge_detected = 1; @@ -221,7 +222,7 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if (self.movement_y < 0) { // is this a state change? - if (!(self.pressedkeys & KEY_LEFT) || frozen_dodging) { + if (!(self.pressedkeys & KEY_LEFT) || frozen_no_doubletap) { tap_direction_y = -1.0; if ((time - self.last_LEFT_KEY_time) < self.cvar_cl_dodging_timeout) { dodge_detected = 1; diff --git a/qcsrc/server/mutators/mutator_minstagib.qc b/qcsrc/server/mutators/mutator_minstagib.qc index 6cce15211..20811ad50 100644 --- a/qcsrc/server/mutators/mutator_minstagib.qc +++ b/qcsrc/server/mutators/mutator_minstagib.qc @@ -225,7 +225,6 @@ MUTATOR_HOOKFUNCTION(minstagib_SplitHealthArmor) MUTATOR_HOOKFUNCTION(minstagib_ForbidThrowing) { // weapon dropping on death handled by FilterItem - nades_CheckThrow(); return TRUE; } diff --git a/qcsrc/server/mutators/mutator_nades.qc b/qcsrc/server/mutators/mutator_nades.qc index 2fad60226..03a9e90a2 100644 --- a/qcsrc/server/mutators/mutator_nades.qc +++ b/qcsrc/server/mutators/mutator_nades.qc @@ -1,31 +1,20 @@ +.entity nade_spawnloc; + void nade_timer_think() { self.skin = 8 - (self.owner.wait - time) / (autocvar_g_nades_nade_lifetime / 10); self.nextthink = time; if(!self.owner || wasfreed(self.owner)) remove(self); - } void nade_burn_spawn(entity _nade) { - float p; - - switch(_nade.realowner.team) - { - case NUM_TEAM_1: p = PROJECTILE_NADE_RED_BURN; break; - case NUM_TEAM_2: p = PROJECTILE_NADE_BLUE_BURN; break; - case NUM_TEAM_3: p = PROJECTILE_NADE_YELLOW_BURN; break; - case NUM_TEAM_4: p = PROJECTILE_NADE_PINK_BURN; break; - default: p = PROJECTILE_NADE_BURN; break; - } - - CSQCProjectile(_nade, TRUE, p, TRUE); + CSQCProjectile(_nade, TRUE, Nade_ProjectileFromID(_nade.nade_type, TRUE), TRUE); } void nade_spawn(entity _nade) { - float p; entity timer = spawn(); setmodel(timer, "models/ok_nade_counter/ok_nade_counter.md3"); setattachment(timer, _nade, ""); @@ -38,41 +27,519 @@ void nade_spawn(entity _nade) timer.owner = _nade; timer.skin = 10; - switch(_nade.realowner.team) + _nade.effects |= EF_LOWPRECISION; + + CSQCProjectile(_nade, TRUE, Nade_ProjectileFromID(_nade.nade_type, FALSE), TRUE); +} + +void napalm_damage(float dist, float damage, float edgedamage, float burntime) +{ + entity e; + float d; + vector p; + + if ( damage < 0 ) + return; + + RandomSelection_Init(); + for(e = WarpZone_FindRadius(self.origin, dist, TRUE); e; e = e.chain) + if(e.takedamage == DAMAGE_AIM) + if(self.realowner != e || autocvar_g_nades_napalm_selfdamage) + if(!IS_PLAYER(e) || !self.realowner || DIFF_TEAM(e, self)) + if(!e.frozen) + { + p = e.origin; + p_x += e.mins_x + random() * (e.maxs_x - e.mins_x); + p_y += e.mins_y + random() * (e.maxs_y - e.mins_y); + p_z += e.mins_z + random() * (e.maxs_z - e.mins_z); + d = vlen(WarpZone_UnTransformOrigin(e, self.origin) - p); + if(d < dist) + { + e.fireball_impactvec = p; + RandomSelection_Add(e, 0, string_null, 1 / (1 + d), !Fire_IsBurning(e)); + } + } + if(RandomSelection_chosen_ent) + { + d = vlen(WarpZone_UnTransformOrigin(RandomSelection_chosen_ent, self.origin) - RandomSelection_chosen_ent.fireball_impactvec); + d = damage + (edgedamage - damage) * (d / dist); + Fire_AddDamage(RandomSelection_chosen_ent, self.realowner, d * burntime, burntime, self.projectiledeathtype | HITTYPE_BOUNCE); + //trailparticles(self, particleeffectnum("fireball_laser"), self.origin, RandomSelection_chosen_ent.fireball_impactvec); + pointparticles(particleeffectnum("fireball_laser"), self.origin, RandomSelection_chosen_ent.fireball_impactvec - self.origin, 1); + } +} + + +void napalm_ball_think() +{ + if(round_handler_IsActive()) + if(!round_handler_IsRoundStarted()) + { + remove(self); + return; + } + + if(time > self.pushltime) + { + remove(self); + return; + } + + vector midpoint = ((self.absmin + self.absmax) * 0.5); + if(pointcontents(midpoint) == CONTENT_WATER) + { + self.velocity = self.velocity * 0.5; + + if(pointcontents(midpoint + '0 0 16') == CONTENT_WATER) + { self.velocity_z = 200; } + } + + self.angles = vectoangles(self.velocity); + + napalm_damage(autocvar_g_nades_napalm_ball_radius,autocvar_g_nades_napalm_ball_damage, + autocvar_g_nades_napalm_ball_damage,autocvar_g_nades_napalm_burntime); + + self.nextthink = time + 0.1; +} + + +void nade_napalm_ball() +{ + entity proj; + vector kick; + + spamsound(self, CH_SHOTS, "weapons/fireball_fire.wav", VOL_BASE, ATTEN_NORM); + + proj = spawn (); + proj.owner = self.owner; + proj.realowner = self.realowner; + proj.team = self.owner.team; + proj.classname = "grenade"; + proj.bot_dodge = TRUE; + proj.bot_dodgerating = autocvar_g_nades_napalm_ball_damage; + proj.movetype = MOVETYPE_BOUNCE; + proj.projectiledeathtype = DEATH_NADE_NAPALM; + PROJECTILE_MAKETRIGGER(proj); + setmodel(proj, "null"); + proj.scale = 1;//0.5; + setsize(proj, '-4 -4 -4', '4 4 4'); + setorigin(proj, self.origin); + proj.think = napalm_ball_think; + proj.nextthink = time; + proj.damageforcescale = autocvar_g_nades_napalm_ball_damageforcescale; + proj.effects = EF_LOWPRECISION | EF_FLAME; + + kick_x =(random() - 0.5) * 2 * autocvar_g_nades_napalm_ball_spread; + kick_y = (random() - 0.5) * 2 * autocvar_g_nades_napalm_ball_spread; + kick_z = (random()/2+0.5) * autocvar_g_nades_napalm_ball_spread; + proj.velocity = kick; + + proj.pushltime = time + autocvar_g_nades_napalm_ball_lifetime; + + proj.angles = vectoangles(proj.velocity); + proj.flags = FL_PROJECTILE; + proj.missile_flags = MIF_SPLASH | MIF_PROXY | MIF_ARC; + + //CSQCProjectile(proj, TRUE, PROJECTILE_NAPALM_FIRE, TRUE); +} + + +void napalm_fountain_think() +{ + + if(round_handler_IsActive()) + if(!round_handler_IsRoundStarted()) + { + remove(self); + return; + } + + if(time >= self.ltime) + { + remove(self); + return; + } + + vector midpoint = ((self.absmin + self.absmax) * 0.5); + if(pointcontents(midpoint) == CONTENT_WATER) + { + self.velocity = self.velocity * 0.5; + + if(pointcontents(midpoint + '0 0 16') == CONTENT_WATER) + { self.velocity_z = 200; } + + UpdateCSQCProjectile(self); + } + + napalm_damage(autocvar_g_nades_napalm_fountain_radius, autocvar_g_nades_napalm_fountain_damage, + autocvar_g_nades_napalm_fountain_edgedamage, autocvar_g_nades_napalm_burntime); + + self.nextthink = time + 0.1; + if(time >= self.nade_special_time) + { + self.nade_special_time = time + autocvar_g_nades_napalm_fountain_delay; + nade_napalm_ball(); + } +} + +void nade_napalm_boom() +{ + entity fountain; + local float c; + for (c = 0; c < autocvar_g_nades_napalm_ball_count; c ++) + nade_napalm_ball(); + + + fountain = spawn(); + fountain.owner = self.owner; + fountain.realowner = self.realowner; + fountain.origin = self.origin; + setorigin(fountain, fountain.origin); + fountain.think = napalm_fountain_think; + fountain.nextthink = time; + fountain.ltime = time + autocvar_g_nades_napalm_fountain_lifetime; + fountain.pushltime = fountain.ltime; + fountain.team = self.team; + fountain.movetype = MOVETYPE_TOSS; + fountain.projectiledeathtype = DEATH_NADE_NAPALM; + fountain.bot_dodge = TRUE; + fountain.bot_dodgerating = autocvar_g_nades_napalm_fountain_damage; + fountain.nade_special_time = time; + setsize(fountain, '-16 -16 -16', '16 16 16'); + CSQCProjectile(fountain, TRUE, PROJECTILE_NAPALM_FOUNTAIN, TRUE); +} + +void nade_ice_freeze(entity freezefield, entity frost_target, float freeze_time) +{ + frost_target.frozen_by = freezefield.realowner; + pointparticles(particleeffectnum("electro_impact"), frost_target.origin, '0 0 0', 1); + Freeze(frost_target, 1/freeze_time, 3, FALSE); + if(frost_target.ballcarried) + if(g_keepaway) { ka_DropEvent(frost_target); } + else { DropBall(frost_target.ballcarried, frost_target.origin, frost_target.velocity);} + if(frost_target.flagcarried) { ctf_Handle_Throw(frost_target, world, DROP_THROW); } + if(frost_target.nade) { toss_nade(frost_target, '0 0 0', time + 0.05); } + + kh_Key_DropAll(frost_target, FALSE); +} + +void nade_ice_think() +{ + + if(round_handler_IsActive()) + if(!round_handler_IsRoundStarted()) + { + remove(self); + return; + } + + if(time >= self.ltime) + { + if ( autocvar_g_nades_ice_explode ) + { + string expef; + switch(self.realowner.team) + { + case NUM_TEAM_1: expef = "nade_red_explode"; break; + case NUM_TEAM_2: expef = "nade_blue_explode"; break; + case NUM_TEAM_3: expef = "nade_yellow_explode"; break; + case NUM_TEAM_4: expef = "nade_pink_explode"; break; + default: expef = "nade_neutral_explode"; break; + } + pointparticles(particleeffectnum(expef), self.origin + '0 0 1', '0 0 0', 1); + sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM); + + RadiusDamage(self, self.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, + autocvar_g_nades_nade_radius, self, autocvar_g_nades_nade_force, self.projectiledeathtype, self.enemy); + Damage_DamageInfo(self.origin, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, + autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, self.projectiledeathtype, 0, self); + } + remove(self); + return; + } + + + self.nextthink = time+0.1; + + // gaussian + float randomr; + randomr = random(); + randomr = exp(-5*randomr*randomr)*autocvar_g_nades_nade_radius; + float randomw; + randomw = random()*M_PI*2; + vector randomp; + randomp_x = randomr*cos(randomw); + randomp_y = randomr*sin(randomw); + randomp_z = 1; + pointparticles(particleeffectnum("electro_muzzleflash"), self.origin + randomp, '0 0 0', 1); + + if(time >= self.nade_special_time) + { + self.nade_special_time = time+0.7; + + + pointparticles(particleeffectnum("electro_impact"), self.origin, '0 0 0', 1); + pointparticles(particleeffectnum("icefield"), self.origin, '0 0 0', 1); + } + + + float current_freeze_time = self.ltime - time - 0.1; + + entity e; + for(e = findradius(self.origin, autocvar_g_nades_nade_radius); e; e = e.chain) + if(e != self) + if(!autocvar_g_nades_ice_teamcheck || (DIFF_TEAM(e, self.realowner) || e == self.realowner)) + if(e.takedamage && e.deadflag == DEAD_NO) + if(e.health > 0) + if(!e.revival_time || ((time - e.revival_time) >= 1.5)) + if(!e.frozen) + if(current_freeze_time > 0) + nade_ice_freeze(self, e, current_freeze_time); +} + +void nade_ice_boom() +{ + entity fountain; + fountain = spawn(); + fountain.owner = self.owner; + fountain.realowner = self.realowner; + fountain.origin = self.origin; + setorigin(fountain, fountain.origin); + fountain.think = nade_ice_think; + fountain.nextthink = time; + fountain.ltime = time + autocvar_g_nades_ice_freeze_time; + fountain.pushltime = fountain.wait = fountain.ltime; + fountain.team = self.team; + fountain.movetype = MOVETYPE_TOSS; + fountain.projectiledeathtype = DEATH_NADE_ICE; + fountain.bot_dodge = FALSE; + setsize(fountain, '-16 -16 -16', '16 16 16'); + fountain.nade_special_time = time+0.3; + fountain.angles = self.angles; + + if ( autocvar_g_nades_ice_explode ) + { + setmodel(fountain, "models/grenademodel.md3"); + entity timer = spawn(); + setmodel(timer, "models/ok_nade_counter/ok_nade_counter.md3"); + setattachment(timer, fountain, ""); + timer.classname = "nade_timer"; + timer.colormap = self.colormap; + timer.glowmod = self.glowmod; + timer.think = nade_timer_think; + timer.nextthink = time; + timer.wait = fountain.ltime; + timer.owner = fountain; + timer.skin = 10; + } + else + setmodel(fountain, "null"); +} + +void nade_translocate_boom() +{ + if(self.realowner.vehicle) + return; + + vector locout = self.origin + '0 0 1' * (1 - self.realowner.mins_z - 24); + + makevectors(self.realowner.angles); + + entity oldself = self; + self = self.realowner; + MUTATOR_CALLHOOK(PortalTeleport); + self.realowner = self; + self = oldself; + + TeleportPlayer(self, self.realowner, locout, self.realowner.mangle, v_forward * vlen(self.realowner.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER); +} + +void nade_spawn_boom() +{ + entity spawnloc = spawn(); + setorigin(spawnloc, self.origin); + setsize(spawnloc, self.realowner.mins, self.realowner.maxs); + spawnloc.movetype = MOVETYPE_NONE; + spawnloc.solid = SOLID_NOT; + spawnloc.drawonlytoclient = self.realowner; + spawnloc.effects = EF_STARDUST; + spawnloc.cnt = autocvar_g_nades_spawn_count; + + if(self.realowner.nade_spawnloc) + { + remove(self.realowner.nade_spawnloc); + self.realowner.nade_spawnloc = world; + } + + self.realowner.nade_spawnloc = spawnloc; +} + +void nade_heal_think() +{ + if(time >= self.ltime) + { + remove(self); + return; + } + + self.nextthink = time; + + if(time >= self.nade_special_time) + { + self.nade_special_time = time+0.25; + self.nade_show_particles = 1; + } + else + self.nade_show_particles = 0; +} + +void nade_heal_touch() +{ + float maxhealth; + float health_factor; + if(IS_PLAYER(other) || (other.flags & FL_MONSTER)) + if(other.deadflag == DEAD_NO) + if(!other.frozen) + { + health_factor = autocvar_g_nades_heal_rate*frametime/2; + if ( other != self.realowner ) + { + if ( SAME_TEAM(other,self) ) + health_factor *= autocvar_g_nades_heal_friend; + else + health_factor *= autocvar_g_nades_heal_foe; + } + if ( health_factor > 0 ) + { + maxhealth = (other.flags & FL_MONSTER) ? other.max_health : g_pickup_healthmega_max; + if ( other.health < maxhealth ) + { + if ( self.nade_show_particles ) + pointparticles(particleeffectnum("healing_fx"), other.origin, '0 0 0', 1); + other.health = min(other.health+health_factor, maxhealth); + } + other.pauserothealth_finished = max(other.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot); + } + else if ( health_factor < 0 ) + { + Damage(other,self,self.realowner,-health_factor,DEATH_NADE_HEAL,other.origin,'0 0 0'); + } + + } + + if ( IS_REAL_CLIENT(other) || (other.vehicle_flags & VHF_ISVEHICLE) ) { - case NUM_TEAM_1: p = PROJECTILE_NADE_RED; break; - case NUM_TEAM_2: p = PROJECTILE_NADE_BLUE; break; - case NUM_TEAM_3: p = PROJECTILE_NADE_YELLOW; break; - case NUM_TEAM_4: p = PROJECTILE_NADE_PINK; break; - default: p = PROJECTILE_NADE; break; + entity show_red = (other.vehicle_flags & VHF_ISVEHICLE) ? other.owner : other; + show_red.stat_healing_orb = time+0.1; + show_red.stat_healing_orb_alpha = 0.75 * (self.ltime - time) / self.healer_lifetime; } +} - CSQCProjectile(_nade, TRUE, p, TRUE); +void nade_heal_boom() +{ + entity healer; + healer = spawn(); + healer.owner = self.owner; + healer.realowner = self.realowner; + setorigin(healer, self.origin); + healer.healer_lifetime = autocvar_g_nades_heal_time; // save the cvar + healer.ltime = time + healer.healer_lifetime; + healer.team = self.realowner.team; + healer.bot_dodge = FALSE; + healer.solid = SOLID_TRIGGER; + healer.touch = nade_heal_touch; + + setmodel(healer, "models/ctf/shield.md3"); + healer.healer_radius = autocvar_g_nades_nade_radius; + vector size = '1 1 1' * healer.healer_radius / 2; + setsize(healer,-size,size); + + Net_LinkEntity(healer, TRUE, 0, healer_send); + + healer.think = nade_heal_think; + healer.nextthink = time; + healer.SendFlags |= 1; +} +void nade_monster_boom() +{ + entity e = spawnmonster(self.pokenade_type, 0, self.realowner, self.realowner, self.origin, FALSE, 1); + + //e.monster_lifetime = time + autocvar_g_nades_pokenade_monster_lifetime; + e.monster_skill = MONSTER_SKILL_INSANE; } void nade_boom() { string expef; + float nade_blast = 1; - switch(self.realowner.team) + switch ( self.nade_type ) { - case NUM_TEAM_1: expef = "nade_red_explode"; break; - case NUM_TEAM_2: expef = "nade_blue_explode"; break; - case NUM_TEAM_3: expef = "nade_yellow_explode"; break; - case NUM_TEAM_4: expef = "nade_pink_explode"; break; - default: expef = "nade_explode"; break; + case NADE_TYPE_NAPALM: + nade_blast = autocvar_g_nades_napalm_blast; + expef = "explosion_medium"; + break; + case NADE_TYPE_ICE: + nade_blast = 0; + expef = "electro_combo"; // hookbomb_explode electro_combo bigplasma_impact + break; + case NADE_TYPE_TRANSLOCATE: + nade_blast = 0; + expef = ""; + break; + case NADE_TYPE_MONSTER: + case NADE_TYPE_SPAWN: + nade_blast = 0; + switch(self.realowner.team) + { + case NUM_TEAM_1: expef = "spawn_event_red"; break; + case NUM_TEAM_2: expef = "spawn_event_blue"; break; + case NUM_TEAM_3: expef = "spawn_event_yellow"; break; + case NUM_TEAM_4: expef = "spawn_event_pink"; break; + default: expef = "spawn_event_neutral"; break; + } + break; + case NADE_TYPE_HEAL: + nade_blast = 0; + expef = "spawn_event_red"; + break; + + default: + case NADE_TYPE_NORMAL: + switch(self.realowner.team) + { + case NUM_TEAM_1: expef = "nade_red_explode"; break; + case NUM_TEAM_2: expef = "nade_blue_explode"; break; + case NUM_TEAM_3: expef = "nade_yellow_explode"; break; + case NUM_TEAM_4: expef = "nade_pink_explode"; break; + default: expef = "nade_neutral_explode"; break; + } } - sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM); - sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM); pointparticles(particleeffectnum(expef), self.origin + '0 0 1', '0 0 0', 1); - Damage_DamageInfo(self.origin, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, self.projectiledeathtype, 0, self); + sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM); + sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM); self.takedamage = DAMAGE_NO; - RadiusDamage(self, self.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, + + if(nade_blast) + { + RadiusDamage(self, self.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, autocvar_g_nades_nade_radius, self, autocvar_g_nades_nade_force, self.projectiledeathtype, self.enemy); + Damage_DamageInfo(self.origin, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, self.projectiledeathtype, 0, self); + } + + switch ( self.nade_type ) + { + case NADE_TYPE_NAPALM: nade_napalm_boom(); break; + case NADE_TYPE_ICE: nade_ice_boom(); break; + case NADE_TYPE_TRANSLOCATE: nade_translocate_boom(); break; + case NADE_TYPE_SPAWN: nade_spawn_boom(); break; + case NADE_TYPE_HEAL: nade_heal_boom(); break; + case NADE_TYPE_MONSTER: nade_monster_boom(); break; + } remove(self); } @@ -101,6 +568,9 @@ void nade_beep() void nade_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { + if(self.nade_type == NADE_TYPE_TRANSLOCATE || self.nade_type == NADE_TYPE_SPAWN) + return; + if(DEATH_ISWEAPON(deathtype, WEP_LASER)) return; @@ -113,14 +583,14 @@ void nade_damage(entity inflictor, entity attacker, float damage, float deathtyp if(DEATH_ISWEAPON(deathtype, WEP_UZI)) damage = self.max_health * 0.1; - if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN) && !(deathtype & HITTYPE_SECONDARY)) - damage = self.max_health * 1.1; - - if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN) && (deathtype & HITTYPE_SECONDARY)) + if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN)) + if(deathtype & HITTYPE_SECONDARY) { damage = self.max_health * 0.1; - force *= 15; + force *= 10; } + else + damage = self.max_health * 1.1; self.velocity += force; @@ -134,8 +604,10 @@ void nade_damage(entity inflictor, entity attacker, float damage, float deathtyp self.think = nade_beep; } - self.health -= damage; - self.realowner = attacker; + self.health -= damage; + + if ( self.nade_type != NADE_TYPE_HEAL || IS_PLAYER(attacker) ) + self.realowner = attacker; if(self.health <= 0) W_PrepareExplosionByDamage(attacker, nade_boom); @@ -145,6 +617,9 @@ void nade_damage(entity inflictor, entity attacker, float damage, float deathtyp void toss_nade(entity e, vector _velocity, float _time) { + if(e.nade == world) + return; + entity _nade = e.nade; e.nade = world; @@ -157,10 +632,9 @@ void toss_nade(entity e, vector _velocity, float _time) Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_NADES); - //setorigin(_nade, CENTER_OR_VIEWOFS(e) + (v_right * 10) * -1); setorigin(_nade, w_shotorg + (v_right * 25) * -1); - setmodel(_nade, "models/weapons/v_ok_grenade.md3"); - setattachment(_nade, world, ""); + //setmodel(_nade, "models/weapons/v_ok_grenade.md3"); + //setattachment(_nade, world, ""); PROJECTILE_MAKETRIGGER(_nade); setsize(_nade, '-16 -16 -16', '16 16 16'); _nade.movetype = MOVETYPE_BOUNCE; @@ -177,12 +651,15 @@ void toss_nade(entity e, vector _velocity, float _time) _nade.velocity = _velocity; else _nade.velocity = W_CalculateProjectileVelocity(e.velocity, _velocity, TRUE); - + _nade.touch = nade_touch; _nade.health = autocvar_g_nades_nade_health; _nade.max_health = _nade.health; _nade.takedamage = DAMAGE_AIM; _nade.event_damage = nade_damage; + _nade.customizeentityforclient = func_null; + _nade.exteriormodeltoclient = world; + _nade.traileffectnum = 0; _nade.teleportable = TRUE; _nade.pushable = TRUE; _nade.gravity = 1; @@ -190,6 +667,9 @@ void toss_nade(entity e, vector _velocity, float _time) _nade.damagedbycontents = TRUE; _nade.angles = vectoangles(_nade.velocity); _nade.flags = FL_PROJECTILE; + _nade.projectiledeathtype = DEATH_NADE; + _nade.toss_time = time; + _nade.solid = ((_nade.nade_type == NADE_TYPE_TRANSLOCATE) ? SOLID_CORPSE : SOLID_BBOX); nade_spawn(_nade); @@ -202,6 +682,51 @@ void toss_nade(entity e, vector _velocity, float _time) e.nade_refire = time + autocvar_g_nades_nade_refire; } +void nades_GiveBonus(entity player, float score) +{ + if (autocvar_g_nades) + if (autocvar_g_nades_bonus) + if (IS_REAL_CLIENT(player)) + if (IS_PLAYER(player) && player.bonus_nades < autocvar_g_nades_bonus_max) + if (player.frozen == 0) + if (player.deadflag == DEAD_NO) + { + if ( player.bonus_nade_score < 1 ) + player.bonus_nade_score += score/autocvar_g_nades_bonus_score_max; + + if ( player.bonus_nade_score >= 1 ) + { + Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_NADE_BONUS); + play2(player,"kh/alarm.wav"); + player.bonus_nades++; + player.bonus_nade_score -= 1; + } + } +} + +void nades_RemoveBonus(entity player) +{ + player.bonus_nades = player.bonus_nade_score = 0; +} + +float nade_customize() +{ + //if(IS_SPEC(other)) { return FALSE; } + if(other == self.realowner || (IS_SPEC(other) && other.enemy == self.realowner)) + { + // somewhat hide the model, but keep the glow + //self.effects = 0; + self.alpha = -1; + } + else + { + //self.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; + self.alpha = 1; + } + + return TRUE; +} + void nade_prime() { if(self.nade) @@ -210,29 +735,53 @@ void nade_prime() if(self.fake_nade) remove(self.fake_nade); - self.nade = spawn(); - setmodel(self.nade, "null"); - setattachment(self.nade, self, "bip01 l hand"); - self.nade.classname = "nade"; - self.nade.realowner = self; - self.nade.colormap = self.colormap; - self.nade.glowmod = self.glowmod; - self.nade.wait = time + autocvar_g_nades_nade_lifetime; - self.nade.lifetime = time; - self.nade.think = nade_beep; - self.nade.nextthink = max(self.nade.wait - 3, time); - self.nade.projectiledeathtype = DEATH_NADE; - - self.fake_nade = spawn(); - setmodel(self.fake_nade, "models/weapons/h_ok_grenade.iqm"); - setattachment(self.fake_nade, self.weaponentity, ""); - self.fake_nade.classname = "fake_nade"; - //self.fake_nade.viewmodelforclient = self; - self.fake_nade.realowner = self.fake_nade.owner = self; - self.fake_nade.colormap = self.colormap; - self.fake_nade.glowmod = self.glowmod; - self.fake_nade.think = SUB_Remove; - self.fake_nade.nextthink = self.nade.wait; + entity n = spawn(), fn = spawn(); + + n.classname = "nade"; + fn.classname = "fake_nade"; + + if(self.items & IT_STRENGTH && autocvar_g_nades_bonus_onstrength) + n.nade_type = self.nade_type; + else if (self.bonus_nades >= 1) + { + n.nade_type = self.nade_type; + n.pokenade_type = self.pokenade_type; + self.bonus_nades -= 1; + } + else + { + n.nade_type = ((autocvar_g_nades_client_select) ? self.cvar_cl_nade_type : autocvar_g_nades_nade_type); + n.pokenade_type = ((autocvar_g_nades_client_select) ? self.cvar_cl_pokenade_type : autocvar_g_nades_pokenade_monster_type); + } + + n.nade_type = bound(1, n.nade_type, NADE_TYPE_LAST); + + setmodel(n, "models/weapons/v_ok_grenade.md3"); + //setattachment(n, self, "bip01 l hand"); + n.exteriormodeltoclient = self; + n.customizeentityforclient = nade_customize; + n.traileffectnum = particleeffectnum(Nade_TrailEffect(Nade_ProjectileFromID(n.nade_type, FALSE), self.team)); + n.colormod = Nade_Color(n.nade_type); + n.realowner = self; + n.colormap = self.colormap; + n.glowmod = self.glowmod; + n.wait = time + autocvar_g_nades_nade_lifetime; + n.lifetime = time; + n.think = nade_beep; + n.nextthink = max(n.wait - 3, time); + n.projectiledeathtype = DEATH_NADE; + + setmodel(fn, "models/weapons/h_ok_grenade.iqm"); + setattachment(fn, self.weaponentity, ""); + fn.realowner = fn.owner = self; + fn.colormod = Nade_Color(n.nade_type); + fn.colormap = self.colormap; + fn.glowmod = self.glowmod; + fn.think = SUB_Remove; + fn.nextthink = n.wait; + + self.nade = n; + self.fake_nade = fn; } float CanThrowNade() @@ -285,21 +834,52 @@ void nades_CheckThrow() } } +void nades_Clear(entity player) +{ + if(player.nade) + remove(player.nade); + if(player.fake_nade) + remove(player.fake_nade); + + player.nade = player.fake_nade = world; +} + +MUTATOR_HOOKFUNCTION(nades_CheckThrow) +{ + if(MUTATOR_RETURNVALUE) { nades_CheckThrow(); } + return FALSE; +} + MUTATOR_HOOKFUNCTION(nades_VehicleEnter) { - if(other.nade) - toss_nade(other, '0 0 100', max(other.nade.wait, time + 0.05)); + if(vh_player.nade) + toss_nade(vh_player, '0 0 100', max(vh_player.nade.wait, time + 0.05)); return FALSE; } MUTATOR_HOOKFUNCTION(nades_PlayerPreThink) { - float key_pressed = ((g_grappling_hook || client_hasweapon(self, WEP_HOOK, FALSE, FALSE) || (weaponsInMap & WEPSET_HOOK)) ? self.button16 : self.BUTTON_HOOK); + if(!IS_PLAYER(self)) { return FALSE; } + + float key_pressed = self.BUTTON_HOOK; + float time_score; + + if(g_grappling_hook || client_hasweapon(self, WEP_HOOK, FALSE, FALSE) || (weaponsInMap & WEPSET_HOOK) || g_jetpack || self.items & IT_JETPACK) + key_pressed = self.button16; // if hook/jetpack is enabled, use an alternate key + + if(self.nade) + { + makevectors(self.angles); + self.nade.velocity = self.velocity; + + setorigin(self.nade, self.origin + self.view_ofs + v_forward * 8 + v_right * -8 + v_up * 0); + self.nade.angles_y = self.angles_y; + } if(self.nade) - if(self.nade.wait - 0.1 <= time) - toss_nade(self, '0 0 0', time + 0.05); + if(self.nade.wait - 0.1 <= time) + toss_nade(self, '0 0 0', time + 0.05); if(CanThrowNade()) if(self.nade_refire < time) @@ -322,6 +902,88 @@ MUTATOR_HOOKFUNCTION(nades_PlayerPreThink) } } + if(IS_PLAYER(self)) + { + if ( autocvar_g_nades_bonus && autocvar_g_nades ) + { + entity key; + float key_count = 0; + FOR_EACH_KH_KEY(key) if(key.owner == self) { ++key_count; } + + if(self.flagcarried || self.ballcarried) // this player is important + time_score = autocvar_g_nades_bonus_score_time_flagcarrier; + else + time_score = autocvar_g_nades_bonus_score_time; + + if(key_count) + time_score = autocvar_g_nades_bonus_score_time_flagcarrier * key_count; // multiply by the number of keys the player is holding + + if(autocvar_g_nades_bonus_client_select) + { + self.nade_type = self.cvar_cl_nade_type; + self.pokenade_type = self.cvar_cl_pokenade_type; + } + else + { + self.nade_type = autocvar_g_nades_bonus_type; + self.pokenade_type = autocvar_g_nades_pokenade_monster_type; + } + + self.nade_type = bound(1, self.nade_type, NADE_TYPE_LAST); + + if(self.bonus_nade_score >= 0 && autocvar_g_nades_bonus_score_max) + nades_GiveBonus(self, time_score / autocvar_g_nades_bonus_score_max); + } + else + { + self.bonus_nades = self.bonus_nade_score = 0; + } + } + + float n = 0; + entity o = world; + if(self.freezetag_frozen_timeout > 0 && time >= self.freezetag_frozen_timeout) + n = -1; + else + { + vector revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size; + n = 0; + FOR_EACH_PLAYER(other) if(self != other) + { + if(other.deadflag == DEAD_NO) + if(other.frozen == 0) + if(SAME_TEAM(other, self)) + if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax)) + { + if(!o) + o = other; + if(self.frozen == 1) + other.reviving = TRUE; + ++n; + } + } + } + + if(n && self.frozen == 3) // OK, there is at least one teammate reviving us + { + self.revive_progress = bound(0, self.revive_progress + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1); + self.health = max(1, self.revive_progress * start_health); + + if(self.revive_progress >= 1) + { + Unfreeze(self); + + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_FREEZETAG_REVIVED, o.netname); + Send_Notification(NOTIF_ONE, o, MSG_CENTER, CENTER_FREEZETAG_REVIVE, self.netname); + } + + FOR_EACH_PLAYER(other) if(other.reviving) + { + other.revive_progress = self.revive_progress; + other.reviving = FALSE; + } + } + return FALSE; } @@ -332,24 +994,110 @@ MUTATOR_HOOKFUNCTION(nades_PlayerSpawn) else self.nade_refire = time + autocvar_g_nades_nade_refire; + if(autocvar_g_nades_bonus_client_select) + self.nade_type = self.cvar_cl_nade_type; + + if(self.nade_spawnloc) + { + setorigin(self, self.nade_spawnloc.origin); + self.nade_spawnloc.cnt -= 1; + + if(self.nade_spawnloc.cnt <= 0) + { + remove(self.nade_spawnloc); + self.nade_spawnloc = world; + } + } + return FALSE; } MUTATOR_HOOKFUNCTION(nades_PlayerDies) { - if(self.nade) - toss_nade(self, '0 0 100', max(self.nade.wait, time + 0.05)); + if(frag_target.nade) + if(!frag_target.frozen || !autocvar_g_freezetag_revive_nade) + toss_nade(frag_target, '0 0 100', max(frag_target.nade.wait, time + 0.05)); + + float killcount_bonus = ((frag_attacker.killcount >= 1) ? bound(0, autocvar_g_nades_bonus_score_minor * frag_attacker.killcount, autocvar_g_nades_bonus_score_medium) : autocvar_g_nades_bonus_score_minor); + + if(IS_PLAYER(frag_attacker)) + { + if (SAME_TEAM(frag_attacker, frag_target) || frag_attacker == frag_target) + nades_RemoveBonus(frag_attacker); + else if(frag_target.flagcarried) + nades_GiveBonus(frag_attacker, autocvar_g_nades_bonus_score_medium); + else if(autocvar_g_nades_bonus_score_spree && frag_attacker.killcount > 1) + { + #define SPREE_ITEM(counta,countb,center,normal,gentle) \ + case counta: { nades_GiveBonus(frag_attacker, autocvar_g_nades_bonus_score_spree); break; } + switch(frag_attacker.killcount) + { + KILL_SPREE_LIST + default: nades_GiveBonus(frag_attacker, autocvar_g_nades_bonus_score_minor); break; + } + #undef SPREE_ITEM + } + else + nades_GiveBonus(frag_attacker, killcount_bonus); + } + + nades_RemoveBonus(frag_target); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_PlayerDamage) +{ + if(frag_target.frozen) + if(autocvar_g_freezetag_revive_nade) + if(frag_attacker == frag_target) + if(frag_deathtype == DEATH_NADE) + if(time - frag_inflictor.toss_time <= 0.1) + { + Unfreeze(frag_target); + frag_target.health = autocvar_g_freezetag_revive_nade_health; + pointparticles(particleeffectnum("iceorglass"), frag_target.origin, '0 0 0', 3); + frag_damage = 0; + frag_force = '0 0 0'; + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_REVIVED_NADE, frag_target.netname); + Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_FREEZETAG_REVIVE_SELF); + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_MonsterDies) +{ + if(IS_PLAYER(frag_attacker)) + if(DIFF_TEAM(frag_attacker, self)) + if(!(self.spawnflags & MONSTERFLAG_SPAWNED)) + nades_GiveBonus(frag_attacker, autocvar_g_nades_bonus_score_minor); return FALSE; } MUTATOR_HOOKFUNCTION(nades_RemovePlayer) { - if(self.nade) - remove(self.nade); + nades_Clear(self); + nades_RemoveBonus(self); + return FALSE; +} - if(self.fake_nade) - remove(self.fake_nade); +MUTATOR_HOOKFUNCTION(nades_SpectateCopy) +{ + self.nade_type = other.nade_type; + self.pokenade_type = other.pokenade_type; + self.bonus_nades = other.bonus_nades; + self.bonus_nade_score = other.bonus_nade_score; + self.stat_healing_orb = other.stat_healing_orb; + self.stat_healing_orb_alpha = other.stat_healing_orb_alpha; + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_GetCvars) +{ + GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_nade_type, "cl_nade_type"); + GetCvars_handleString(get_cvars_s, get_cvars_f, cvar_cl_pokenade_type, "cl_pokenade_type"); return FALSE; } @@ -366,31 +1114,49 @@ MUTATOR_HOOKFUNCTION(nades_BuildMutatorsPrettyString) return FALSE; } +void nades_Initialize() +{ + addstat(STAT_NADE_BONUS, AS_FLOAT, bonus_nades); + addstat(STAT_NADE_BONUS_TYPE, AS_INT, nade_type); + addstat(STAT_NADE_BONUS_SCORE, AS_FLOAT, bonus_nade_score); + addstat(STAT_HEALING_ORB, AS_FLOAT, stat_healing_orb); + addstat(STAT_HEALING_ORB_ALPHA, AS_FLOAT, stat_healing_orb_alpha); + + precache_model("models/ok_nade_counter/ok_nade_counter.md3"); + precache_model("models/weapons/h_ok_grenade.iqm"); + precache_model("models/weapons/v_ok_grenade.md3"); + precache_model("models/ctf/shield.md3"); + + precache_sound("weapons/rocket_impact.wav"); + precache_sound("weapons/grenade_bounce1.wav"); + precache_sound("weapons/grenade_bounce2.wav"); + precache_sound("weapons/grenade_bounce3.wav"); + precache_sound("weapons/grenade_bounce4.wav"); + precache_sound("weapons/grenade_bounce5.wav"); + precache_sound("weapons/grenade_bounce6.wav"); + precache_sound("overkill/grenadebip.ogg"); +} + MUTATOR_DEFINITION(mutator_nades) { + MUTATOR_HOOK(ForbidThrowCurrentWeapon, nades_CheckThrow, CBC_ORDER_LAST); MUTATOR_HOOK(VehicleEnter, nades_VehicleEnter, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPreThink, nades_PlayerPreThink, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerSpawn, nades_PlayerSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDies, nades_PlayerDies, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerSpawn, nades_PlayerSpawn, CBC_ORDER_LAST); + MUTATOR_HOOK(PlayerDies, nades_PlayerDies, CBC_ORDER_LAST); + MUTATOR_HOOK(PlayerDamage_Calculate, nades_PlayerDamage, CBC_ORDER_FIRST); + MUTATOR_HOOK(MonsterDies, nades_MonsterDies, CBC_ORDER_ANY); MUTATOR_HOOK(MakePlayerObserver, nades_RemovePlayer, CBC_ORDER_ANY); MUTATOR_HOOK(ClientDisconnect, nades_RemovePlayer, CBC_ORDER_ANY); + MUTATOR_HOOK(SpectateCopy, nades_SpectateCopy, CBC_ORDER_ANY); + MUTATOR_HOOK(GetCvars, nades_GetCvars, CBC_ORDER_ANY); + MUTATOR_HOOK(reset_map_global, nades_RemovePlayer, CBC_ORDER_ANY); MUTATOR_HOOK(BuildMutatorsString, nades_BuildMutatorsString, CBC_ORDER_ANY); MUTATOR_HOOK(BuildMutatorsPrettyString, nades_BuildMutatorsPrettyString, CBC_ORDER_ANY); MUTATOR_ONADD { - precache_model("models/ok_nade_counter/ok_nade_counter.md3"); - - precache_model("models/weapons/h_ok_grenade.iqm"); - precache_model("models/weapons/v_ok_grenade.md3"); - precache_sound("weapons/rocket_impact.wav"); - precache_sound("weapons/grenade_bounce1.wav"); - precache_sound("weapons/grenade_bounce2.wav"); - precache_sound("weapons/grenade_bounce3.wav"); - precache_sound("weapons/grenade_bounce4.wav"); - precache_sound("weapons/grenade_bounce5.wav"); - precache_sound("weapons/grenade_bounce6.wav"); - precache_sound("overkill/grenadebip.ogg"); + nades_Initialize(); } return FALSE; diff --git a/qcsrc/server/mutators/mutator_nades.qh b/qcsrc/server/mutators/mutator_nades.qh index 1940f4e05..90c3296bd 100644 --- a/qcsrc/server/mutators/mutator_nades.qh +++ b/qcsrc/server/mutators/mutator_nades.qh @@ -1,5 +1,25 @@ .entity nade; .entity fake_nade; .float nade_refire; +.float bonus_nades; +.float nade_special_time; +.float bonus_nade_score; +.float nade_type; +.string pokenade_type; +.entity nade_damage_target; +.float cvar_cl_nade_type; +.string cvar_cl_pokenade_type; +.float toss_time; +.float stat_healing_orb; +.float stat_healing_orb_alpha; +.float nade_show_particles; -void() nades_CheckThrow; +void toss_nade(entity e, vector _velocity, float _time); + +// Remove nades that are being thrown +void(entity player) nades_Clear; + +// Give a bonus grenade to a player +void(entity player, float score) nades_GiveBonus; +// Remove all bonus nades from a player +void(entity player) nades_RemoveBonus; diff --git a/qcsrc/server/mutators/mutator_spawn_near_teammate.qc b/qcsrc/server/mutators/mutator_spawn_near_teammate.qc index 54df3a97c..2658c4493 100644 --- a/qcsrc/server/mutators/mutator_spawn_near_teammate.qc +++ b/qcsrc/server/mutators/mutator_spawn_near_teammate.qc @@ -56,7 +56,7 @@ MUTATOR_HOOKFUNCTION(msnt_PlayerSpawn) if(team_mate.msnt_timer < time) if(SAME_TEAM(self, team_mate)) if(time > team_mate.spawnshieldtime) // spawn shielding - if(team_mate.freezetag_frozen == 0) + if(team_mate.frozen == 0) if(team_mate != self) { tracebox(team_mate.origin, PL_MIN, PL_MAX, team_mate.origin - '0 0 100', MOVE_WORLDONLY, team_mate); diff --git a/qcsrc/server/mutators/mutator_touchexplode.qc b/qcsrc/server/mutators/mutator_touchexplode.qc index fabf13639..30b01b0da 100644 --- a/qcsrc/server/mutators/mutator_touchexplode.qc +++ b/qcsrc/server/mutators/mutator_touchexplode.qc @@ -19,13 +19,15 @@ void PlayerTouchExplode(entity p1, entity p2) MUTATOR_HOOKFUNCTION(touchexplode_PlayerThink) { if(time > self.touchexplode_time) - if (!gameover) + if(!gameover) + if(!self.frozen) if(IS_PLAYER(self)) if(self.deadflag == DEAD_NO) if (!IS_INDEPENDENT_PLAYER(self)) FOR_EACH_PLAYER(other) if(self != other) { if(time > other.touchexplode_time) + if(!other.frozen) if(other.deadflag == DEAD_NO) if (!IS_INDEPENDENT_PLAYER(other)) if(boxesoverlap(self.absmin, self.absmax, other.absmin, other.absmax)) diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index 1ae22e202..a4e431d14 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -15,6 +15,7 @@ sys-post.qh ../common/constants.qh ../common/teams.qh ../common/util.qh +../common/nades.qh ../common/test.qh ../common/counting.qh ../common/items.qh @@ -214,6 +215,8 @@ target_music.qc ../common/items.qc +../common/nades.qc + accuracy.qc ../csqcmodellib/sv_model.qc diff --git a/qcsrc/server/spawnpoints.qh b/qcsrc/server/spawnpoints.qh index 06b484e18..607629e42 100644 --- a/qcsrc/server/spawnpoints.qh +++ b/qcsrc/server/spawnpoints.qh @@ -2,4 +2,4 @@ float spawnpoint_nag; float SpawnEvent_Send(entity to, float sf); entity Spawn_FilterOutBadSpots(entity firstspot, float mindist, float teamcheck); - +entity SelectSpawnPoint (float anypoint); diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index 920f738ae..cf974d82b 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -155,7 +155,6 @@ float game_delay; float game_delay_last; float RedirectionThink(); -entity SelectSpawnPoint (float anypoint); void StartFrame (void) { execute_next_frame(); diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index e332e55ed..e325ed845 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -318,6 +318,9 @@ string getwelcomemessage(void) if (g_grappling_hook) s = strcat(s, "\n\n^3grappling hook^8 is enabled, press 'e' to use it\n"); + if (cvar("g_nades")) + s = strcat(s, "\n\n^3nades^8 are enabled, press 'g' to use them\n"); + if(cache_lastmutatormsg != autocvar_g_mutatormsg) { if(cache_lastmutatormsg) diff --git a/qcsrc/server/w_electro.qc b/qcsrc/server/w_electro.qc index 0ad23a137..ea2cf8bf0 100644 --- a/qcsrc/server/w_electro.qc +++ b/qcsrc/server/w_electro.qc @@ -263,7 +263,7 @@ void lgbeam_think() return; } - if (owner_player.weaponentity.state != WS_INUSE || !lgbeam_checkammo() || owner_player.deadflag != DEAD_NO || !owner_player.BUTTON_ATCK || owner_player.freezetag_frozen) + if (owner_player.weaponentity.state != WS_INUSE || !lgbeam_checkammo() || owner_player.deadflag != DEAD_NO || !owner_player.BUTTON_ATCK || owner_player.frozen) { if(self == owner_player.lgbeam) owner_player.lgbeam = world; -- 2.39.2