From d4a09b61491f06ea17bd8b279c299c02622a544d Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Sat, 18 Nov 2023 08:50:56 -0800 Subject: [PATCH] Initial work on some more of the gamemodes, specifically Live In Fear --- src/server/gamerules.h | 20 ++++- src/server/gamerules.qc | 97 ++++++++++++++------ src/server/gamerules_fear.qc | 19 ++++ src/server/gamerules_hunt.qc | 6 ++ src/server/gamerules_invasion.qc | 6 ++ src/server/gamerules_madness.qc | 6 ++ src/server/gamerules_slaughter.qc | 6 ++ src/server/gamerules_stealth.qc | 6 ++ src/server/shdata_parse.qc | 7 +- src/shared/include.src | 1 + src/shared/items.h | 2 +- src/shared/player.qc | 116 +++++++++++++++++++++++- src/shared/scianims.h | 130 +++++++++++++++++++++++++++ src/shared/w_needle.qc | 123 +++++++++++++++++++++++++ src/shared/weapons.h | 1 + src/shared/weapons.qc | 1 + zpak001.pk3dir/default.cfg | 3 +- zpak001.pk3dir/scripts/constants.txt | 29 +++--- 18 files changed, 529 insertions(+), 50 deletions(-) create mode 100644 src/shared/scianims.h create mode 100644 src/shared/w_needle.qc diff --git a/src/server/gamerules.h b/src/server/gamerules.h index 6bba5a4..fac1be4 100644 --- a/src/server/gamerules.h +++ b/src/server/gamerules.h @@ -24,6 +24,8 @@ class HLGameRules:CGameRules /* client */ virtual void(NSClientPlayer) PlayerSpawn; virtual void(NSClientPlayer) PlayerDeath; + virtual bool PlayerRequestRespawn(NSClientPlayer); + virtual bool ImpulseCommand(NSClient, float); virtual void(NSClientPlayer) PlayerPostFrame; virtual void(NSClientPlayer, entity) ScientistKill; virtual void(void) RegisterSciDeath; @@ -55,7 +57,6 @@ class SHTeamRules:HLGameRules virtual void(void) RestartRound; virtual void(NSClientPlayer) PlayerSpawn; - virtual void(NSClientPlayer) PlayerTeamSpawn; virtual bool(void) IsTeamplay; virtual void(void) AddTeam1Kill; virtual void(void) AddTeam2Kill; @@ -68,6 +69,8 @@ class SHInvasionRules:HLGameRules { void(void) SHInvasionRules; virtual void(void) RegisterSciDeath; + + virtual string Title(void); }; /* Standard Hunting (0): @@ -76,6 +79,8 @@ class SHInvasionRules:HLGameRules class SHGameHunt:SHTeamRules { void(void) SHGameHunt; + + virtual string Title(void); }; /* Stealth Hunting (1): @@ -84,6 +89,8 @@ class SHGameHunt:SHTeamRules class SHGameStealth:SHTeamRules { void(void) SHGameStealth; + + virtual string Title(void); }; /* Traditional Slaughter (2): @@ -92,14 +99,19 @@ class SHGameStealth:SHTeamRules class SHGameSlaughter:HLGameRules { void(void) SHGameSlaughter; + + virtual string Title(void); }; /* Live in Fear (3): Unique round-based gamemode where players have to only kill an evil randomly selected player controlled scientist causing chaos. Those who kill good scientists are punished with lost points. The evil scientist gains one point from every kill (NPC or Players). Scientists respawn. */ -class SHGameFear:HLGameRules +class SHGameFear:SHTeamRules { void(void) SHGameFear; + virtual void(NSClientPlayer, entity) ScientistKill; + + virtual string Title(void); }; /* Madness (4): @@ -108,6 +120,8 @@ class SHGameFear:HLGameRules class SHGameMadness:HLGameRules { void(void) SHGameMadness; + + virtual string Title(void); }; /* Invasion (5): @@ -116,6 +130,8 @@ class SHGameMadness:HLGameRules class SHGameInvasion:SHInvasionRules { void(void) SHGameInvasion; + + virtual string Title(void); }; typedef enum diff --git a/src/server/gamerules.qc b/src/server/gamerules.qc index 35c3f31..daf531e 100644 --- a/src/server/gamerules.qc +++ b/src/server/gamerules.qc @@ -278,7 +278,6 @@ HLGameRules::CheckRules(void) void HLGameRules::PlayerDeath(NSClientPlayer pl) { - player sh_pl = (player)pl; /* obituary networking */ @@ -343,6 +342,17 @@ HLGameRules::PlayerDeath(NSClientPlayer pl) CheckRules(); } +bool +HLGameRules::PlayerRequestRespawn(NSClientPlayer bp) +{ + if (bp.TimeSinceDeath() > 0.5f) { + bp.ScheduleThink(PutClientInServer, 0.0f); + return true; + } + + return false; +} + void HLGameRules::PlayerSpawn(NSClientPlayer pp) { @@ -350,6 +360,7 @@ HLGameRules::PlayerSpawn(NSClientPlayer pp) /* this is where the mods want to deviate */ entity spot; + pl.MakePlayer(); pl.classname = "player"; pl.SetMaxHealth(100); pl.SetHealth(100); @@ -361,15 +372,21 @@ HLGameRules::PlayerSpawn(NSClientPlayer pp) pl.model = "models/player.mdl"; string mymodel = infokey(pl, "model"); - if (mymodel) { - mymodel = sprintf("models/player/%s/%s.mdl", mymodel, mymodel); - if (whichpack(mymodel)) { - pl.model = mymodel; + if (pl.team == 1) { + pl.model = "models/scientist.mdl"; + setmodel(pl, pl.model); + pl.SetSize(VEC_HULL_MIN + [0, 0, 64], VEC_HULL_MAX + [0, 0, 64]); + } else { + if (mymodel) { + mymodel = sprintf("models/player/%s/%s.mdl", mymodel, mymodel); + if (whichpack(mymodel)) { + pl.model = mymodel; + } } + setmodel(pl, pl.model); + pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX); } - setmodel(pl, pl.model); - pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX); pl.ClearVelocity(); pl.gravity = __NULL__; pl.SetFrame(1); @@ -428,10 +445,15 @@ HLGameRules::PlayerSpawn(NSClientPlayer pp) setorigin(pl, spot.origin); pl.angles = spot.angles; - pl.g_items = ITEM_CROWBAR | ITEM_GLOCK | ITEM_SUIT; - pl.activeweapon = WEAPON_GLOCK; - pl.glock_mag = 18; - pl.ammo_9mm = 44; + if (pl.IsScientist() == true) { + pl.g_items = ITEM_NEEDLE | ITEM_SUIT; + pl.activeweapon = WEAPON_NEEDLE; + } else { + pl.g_items = ITEM_CROWBAR | ITEM_GLOCK | ITEM_SUIT; + pl.activeweapon = WEAPON_GLOCK; + pl.glock_mag = 18; + pl.ammo_9mm = 44; + } Weapons_RefreshAmmo(pl); SHData_GetItems(pl); @@ -462,13 +484,6 @@ HLGameRules::HLGameRules(void) * have a race condition */ forceinfokey(world, "sci_count", "0"); - /* realistic is an odd name, allow people to use sv_gamemode as an alias */ - if (cvar("sv_gamemode")) { - cvar_set("sh_realistic",cvar_string("sv_gamemode")); - } else { - cvar_set("sv_gamemode",cvar_string("sh_realistic")); - } - /* if the previous map set this value but the current doesn't * then set the default */ cvar_set("sh_scispeed","40"); @@ -538,6 +553,7 @@ SHTeamRules::PlayerSpawn(NSClientPlayer pp) { player pl = (player)pp; + print(sprintf("team: %d\n", pl.team)); if (pl.team > 0) { super::PlayerSpawn(pl); return; @@ -547,15 +563,6 @@ SHTeamRules::PlayerSpawn(NSClientPlayer pp) Spawn_ObserverCam(pl); } -void -SHTeamRules::PlayerTeamSpawn(NSClientPlayer pl) -{ - int red = 0; - int blue = 0; - - super::PlayerSpawn(pl); -} - void SHTeamRules::ScientistKill(NSClientPlayer cl, entity sci) { @@ -667,12 +674,43 @@ SHInvasionRules::PlayerDeath(NSClientPlayer pl) } +string +SHInvasionRules::Title(void) +{ + return ("Invasion"); +} + void SHInvasionRules::SHInvasionRules(void) { } + + +void +TriggerFlashlight(NSClient target) +{ + entity oldself = self; + self = target; + Flashlight_Toggle(); + self = oldself; +} + +bool +HLGameRules::ImpulseCommand(NSClient bp, float num) +{ + switch (num) { + case 100: + TriggerFlashlight(bp); + break; + default: + return super::ImpulseCommand(bp, num); + } + + return true; +} + void CSEv_JoinAuto(void) { @@ -704,7 +742,7 @@ CSEv_JoinAuto(void) forceinfokey(pl, "*team", sprintf("%d", pl.team)); - rules.PlayerTeamSpawn(pl); + rules.PlayerSpawn(pl); } void @@ -720,8 +758,9 @@ CSEv_JoinTeam_f(float teamNumber) pl.team = teamNumber; forceinfokey(pl, "*team", sprintf("%d", pl.team)); + breakpoint(); - rules.PlayerTeamSpawn(pl); + rules.PlayerSpawn(pl); } void diff --git a/src/server/gamerules_fear.qc b/src/server/gamerules_fear.qc index dcfc442..44b35e8 100644 --- a/src/server/gamerules_fear.qc +++ b/src/server/gamerules_fear.qc @@ -2,4 +2,23 @@ void SHGameFear::SHGameFear(void) { +} + + +void +SHGameFear::ScientistKill(NSClientPlayer pp, entity sci) +{ + player pl = (player)pp; + + if (pl.IsScientist() == true) { + pl.frags++; + } else { + pl.frags--; + } +} + +string +SHGameFear::Title(void) +{ + return ("Stealth"); } \ No newline at end of file diff --git a/src/server/gamerules_hunt.qc b/src/server/gamerules_hunt.qc index 0a8c3f7..20b4f8e 100644 --- a/src/server/gamerules_hunt.qc +++ b/src/server/gamerules_hunt.qc @@ -2,4 +2,10 @@ void SHGameHunt::SHGameHunt(void) { +} + +string +SHGameHunt::Title(void) +{ + return ("Hunt"); } \ No newline at end of file diff --git a/src/server/gamerules_invasion.qc b/src/server/gamerules_invasion.qc index 6b2e03e..e0536da 100644 --- a/src/server/gamerules_invasion.qc +++ b/src/server/gamerules_invasion.qc @@ -3,4 +3,10 @@ SHGameInvasion::SHGameInvasion(void) { +} + +string +SHGameInvasion::Title(void) +{ + return ("Invasion"); } \ No newline at end of file diff --git a/src/server/gamerules_madness.qc b/src/server/gamerules_madness.qc index 38db85c..4aa3bf3 100644 --- a/src/server/gamerules_madness.qc +++ b/src/server/gamerules_madness.qc @@ -2,4 +2,10 @@ void SHGameMadness::SHGameMadness(void) { +} + +string +SHGameMadness::Title(void) +{ + return ("Madness"); } \ No newline at end of file diff --git a/src/server/gamerules_slaughter.qc b/src/server/gamerules_slaughter.qc index dd82133..750afd4 100644 --- a/src/server/gamerules_slaughter.qc +++ b/src/server/gamerules_slaughter.qc @@ -2,4 +2,10 @@ void SHGameSlaughter::SHGameSlaughter(void) { +} + +string +SHGameSlaughter::Title(void) +{ + return ("Slaughter"); } \ No newline at end of file diff --git a/src/server/gamerules_stealth.qc b/src/server/gamerules_stealth.qc index 9a91914..2db21a9 100644 --- a/src/server/gamerules_stealth.qc +++ b/src/server/gamerules_stealth.qc @@ -3,4 +3,10 @@ SHGameStealth::SHGameStealth(void) { +} + +string +SHGameStealth::Title(void) +{ + return ("Stealth"); } \ No newline at end of file diff --git a/src/server/shdata_parse.qc b/src/server/shdata_parse.qc index 22fb06c..90d1b93 100644 --- a/src/server/shdata_parse.qc +++ b/src/server/shdata_parse.qc @@ -29,7 +29,7 @@ SHData_SpawnScientist(void) } slimit++; } - spawnfunc_monster_scientist(); + //spawnfunc_monster_scientist(); } void @@ -87,6 +87,11 @@ SHData_NewAngles(void) void SHData_GetItems(player pl) { + if (pl.IsScientist() == true) { + Weapons_AddItem(pl, WEAPON_NEEDLE, -1); + return; + } + /* TODO: Parse the config files */ pl.ammo_9mm = 68; pl.ammo_buckshot = 34; diff --git a/src/shared/include.src b/src/shared/include.src index ea8b766..c96d06a 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -31,6 +31,7 @@ weapons.h w_cannon.qc w_chainsaw.qc w_hammer.qc +w_needle.qc weapons.qc ../../../valve/src/shared/weapon_common.qc #endlist diff --git a/src/shared/items.h b/src/shared/items.h index 27b4904..c55c069 100644 --- a/src/shared/items.h +++ b/src/shared/items.h @@ -37,7 +37,7 @@ #define ITEM_CANNON 0x00040000 #define ITEM_CHAINSAW 0x00080000 #define ITEM_HAMMER 0x00100000 -#define ITEM_UNUSED22 0x00200000 +#define ITEM_NEEDLE 0x00200000 #define ITEM_UNUSED23 0x00400000 #define ITEM_UNUSED24 0x00800000 diff --git a/src/shared/player.qc b/src/shared/player.qc index 1fdf5c5..8fce4ae 100644 --- a/src/shared/player.qc +++ b/src/shared/player.qc @@ -16,6 +16,7 @@ #include "../../../valve/src/shared/skeleton.h" +#include "scianims.h" /* all custom SendFlags bits we can possibly send */ enumflags @@ -76,6 +77,7 @@ class player:NSClientPlayer PREDICTED_FLOAT(sh_insanetime) PREDICTED_FLOAT(sh_insaneactive) + virtual bool IsScientist(void); virtual void Physics_Jump(void); virtual void UpdatePlayerAnimation(float); @@ -83,6 +85,8 @@ class player:NSClientPlayer virtual float Physics_MaxSpeed(void); virtual void Physics_InputPreMove(void); virtual void Physics_InputPostMove(void); + virtual void Physics_SetViewParms(void); + virtual void Physics_Crouch(void); #ifdef CLIENT ////virtual void(void) draw; @@ -103,14 +107,116 @@ class player:NSClientPlayer #endif }; +void +SHSciAnim_PlayerUpdate(NSClientPlayer playerTarget) +{ + bool useTopAnim; + player pl = (player)playerTarget; + + if (pl.anim_top_delay <= 0.0f) { + useTopAnim = false; + } else { + useTopAnim = true; + } + + if (vlen(pl.velocity) == 0) { + pl.frame = SCIANIM_IDLE1; + } else if (vlen(pl.velocity) < 150) { + pl.frame = SCIANIM_WALK; + } else if (vlen(pl.velocity) > 150) { + pl.frame = SCIANIM_RUN; + } + + if (useTopAnim) { + pl.frame = pl.anim_top; + } + + pl.baseframe = 0; + pl.basebone = 0; + pl.frame1time = pl.anim_top_time; +} + +bool +player::IsScientist(void) +{ +#ifdef CLIENT + float myTeam = getplayerkeyfloat(this.entnum-1, "*team"); +#else + float myTeam = team; +#endif + + return myTeam == 1 ? true : false; +} + +#ifndef PHY_VIEWPOS + #define PHY_VIEWPOS [0,0,28] +#endif + +#ifndef PHY_VIEWPOS_CROUCHED + #define PHY_VIEWPOS_CROUCHED [0,0,12] +#endif +#ifndef PHY_HULL_MIN + #define PHY_HULL_MIN [-16,-16,-36] +#endif + +#ifndef PHY_HULL_MAX + #define PHY_HULL_MAX [16,16,36] +#endif + +#ifndef PHY_HULL_CROUCHED_MIN + #define PHY_HULL_CROUCHED_MIN [-16,-16,-18] +#endif + +#ifndef PHY_HULL_CROUCHED_MAX + #define PHY_HULL_CROUCHED_MAX [16,16,18] +#endif + + +void +player::Physics_Crouch(void) +{ + if (IsScientist() == true) { + view_ofs = PHY_VIEWPOS + [0,0, 36]; + return; + } + + super::Physics_Crouch(); +} + +void +player::Physics_SetViewParms(void) +{ + vector bboxOffset = g_vec_null; + + if (IsScientist() == true) { + bboxOffset = [0, 0, 36]; + } + + if (GetFlags() & FL_CROUCHING) { + mins = PHY_HULL_CROUCHED_MIN; + maxs = PHY_HULL_CROUCHED_MAX; + view_ofs = PHY_VIEWPOS_CROUCHED; + } else { + mins = PHY_HULL_MIN; + maxs = PHY_HULL_MAX; + view_ofs = PHY_VIEWPOS; + } + SetSize(mins + bboxOffset, maxs + bboxOffset); +} + void Animation_PlayerUpdate(player); void Animation_TimerUpdate(player, float); void player::UpdatePlayerAnimation(float timelength) { - /* calculate our skeletal progression */ - Animation_PlayerUpdate(this); + if (IsScientist() == true) { + SHSciAnim_PlayerUpdate(this); + } else { + /* calculate our skeletal progression */ + Animation_PlayerUpdate(this); + } + /* advance animation timers */ Animation_TimerUpdate(this, timelength); } @@ -152,9 +258,15 @@ player::UpdateAliveCam(void) .string oldmodel; string Weapons_GetPlayermodel(player, int); + void player::UpdatePlayerAttachments(bool visible) { + if (IsScientist()) { + p_model.modelindex = 0; + return; + } + /* draw the flashlight */ if (gflags & GF_FLASHLIGHT) { vector src; diff --git a/src/shared/scianims.h b/src/shared/scianims.h new file mode 100644 index 0000000..28be4cd --- /dev/null +++ b/src/shared/scianims.h @@ -0,0 +1,130 @@ +typedef enum { + SCIANIM_WALK = 0, + SCIANIM_WALK_SCARED = 1, + SCIANIM_RUN = 2, + SCIANIM_RUN1 = 3, + SCIANIM_RUN2 = 4, + SCIANIM_180_LEFT = 5, + SCIANIM_180_RIGHT = 6, + SCIANIM_FLINCH = 7, + SCIANIM_FLINCH1 = 8, + SCIANIM_LAFLINCH = 9, + SCIANIM_RAFLINCH = 10, + SCIANIM_LLFLINCH = 11, + SCIANIM_RLFLINCH = 12, + SCIANIM_IDLE1 = 13, + SCIANIM_IDLE3 = 14, + SCIANIM_IDLE4 = 15, + SCIANIM_IDLE5 = 16, + SCIANIM_IDLE6 = 17, + SCIANIM_IDLE7 = 18, + SCIANIM_CROUCHSTAND = 19, + SCIANIM_CROUCH_IDLE = 20, + SCIANIM_CROUCH_IDLE2 = 21, + SCIANIM_CROUCH_IDLE3 = 22, + SCIANIM_CROUCH_IDLE3 = 23, + SCIANIM_PANIC = 24, + SCIANIM_FEAR1 = 25, + SCIANIM_FEAR2 = 26, + SCIANIM_EYE_WIPE = 27, + SCIANIM_PULL_NEEDLE = 28, + SCIANIM_RETURN_NEEDLE = 29, + SCIANIM_GIVE_SHOT = 30, + SCIANIM_DIESIMPLE = 31, + SCIANIM_DIEFORWARD = 32, + SCIANIM_DIEFORWARD1 = 33, + SCIANIM_DIEBACKWARD = 34, + SCIANIM_HEADSHOT = 35, + SCIANIM_GUTSHOT = 36, + SCIANIM_LYING_ON_BACK = 37, + SCIANIM_LYING_ON_STOMACH = 38, + SCIANIM_DEAD_SITTING = 39, + SCIANIM_DEAD_TABLE1 = 40, + SCIANIM_DEAD_TABLE2 = 41, + SCIANIM_DEAD_TABLE3 = 42, + SCIANIM_BARNACLED1 = 43, + SCIANIM_BARNACLED2 = 44, + SCIANIM_BARNACLED3 = 45, + SCIANIM_BARNACLED4 = 46, + SCIANIM_CONSOLE = 47, + SCIANIM_CHECKTIE = 48, + SCIANIM_DRYHANDS = 49, + SCIANIM_TIESHOE = 50, + SCIANIM_WRITEBOARD = 51, + SCIANIM_STUDYCART = 52, + SCIANIM_LEAN = 53, + SCIANIM_PONDERING = 54, + SCIANIM_PONDERING2 = 55, + SCIANIM_PONDERING3 = 56, + SCIANIM_BUYSODA = 57, + SCIANIM_PAUSE = 58, + SCIANIM_YES = 59, + SCIANIM_NO = 60, + SCIANIM_PUSH_BUTTON = 61, + SCIANIM_CONVERSE1 = 62, + SCIANIM_CONVERSE2 = 63, + SCIANIM_RETINA = 64, + SCIANIM_TALKLEFT = 65, + SCIANIM_TALKRIGHT = 66, + SCIANIM_DESKIDLE = 67, + SCIANIM_COFFEE = 68, + SCIANIM_FRANTICBUTTON = 69, + SCIANIM_STARTLE = 70, + SCIANIM_SITLOOKLEFT = 71, + SCIANIM_SITLOOKRIGHT = 72, + SCIANIM_SITSCARED = 73, + SCIANIM_SITTING2 = 74, + SCIANIM_SITTING3 = 75, + SCIANIM_CPRSCIENTIST = 76, + SCIANIM_CPRSCIENTISTREVIVE = 77, + SCIANIM_COWERING_IN_CORNER = 78, + SCIANIM_SSTRUGGLEIDLE = 79, + SCIANIM_SSTRUGGLE = 80, + SCIANIM_HEADCRABBED = 81, + SCIANIM_C1A0_CATWALKIDLE = 82, + SCIANIM_C1A0_CATWALK = 83, + SCIANIM_CEILING_DANGLE = 84, + SCIANIM_VENTPULL1 = 85, + SCIANIM_VENTPULL2 = 86, + SCIANIM_VENTPULLIDLE1 = 87, + SCIANIM_VENTPULLIDLE2 = 88, + SCIANIM_SITIDLE = 89, + SCIANIM_SITSTAND = 90, + SCIANIM_KEYPAD = 91, + SCIANIM_PANIC1 = 92, + SCIANIM_LOOKWINDOW = 93, + SCIANIM_WAVE = 94, + SCIANIM_PULLDOOR = 95, + SCIANIM_BEATDOOR = 96, + SCIANIM_FALLINGLOOP = 97, + SCIANIM_CRAWLWINDOW = 98, + SCIANIM_DIVEWINDOW = 99, + SCIANIM_LOCKED_DOOR = 100, + SCIANIM_PUSH_BUTTON2 = 101, + SCIANIM_UNLOCK_DOOR = 102, + SCIANIM_QUICKLOOK = 103, + SCIANIM_HANDRAILIDLE = 104, + SCIANIM_HANDRAIL = 105, + SCIANIM_HANGING_IDLE = 106, + SCIANIM_FALL = 107, + SCIANIM_SCIENTIST_GET_PULLED = 108, + SCIANIM_HANGING_IDLE2 = 109, + SCIANIM_FALL_ELEVATOR = 110, + SCIANIM_SCIENTIST_IDLEWALL = 111, + SCIANIM_ICKYJUMP_SCI = 112, + SCIANIM_HAULSCIENTIST = 113, + SCIANIM_C1A4_WOUNDED_IDLE = 114, + SCIANIM_C1A4_DYING_SPEECH = 115, + SCIANIM_TENTACLE_GRAB = 116, + SCIANIM_HELICACK = 117, + SCIANIM_WINDIVE = 118, + SCIANIM_SCICRASHIDLE = 119, + SCIANIM_SCICRASH = 120, + SCIANIM_ONGUARD = 121, + SCIANIM_SEEYA = 122, + SCIANIM_ROCKETCRAWL = 123, + SCIANIM_PORTAL = 124, + SCIANIM_GLUONSHOW = 125, + SCIANIM_CROUCH = 126, + SCIANIM_KNEEL = 127, +} sh_scianims_e; \ No newline at end of file diff --git a/src/shared/w_needle.qc b/src/shared/w_needle.qc new file mode 100644 index 0000000..912b9b8 --- /dev/null +++ b/src/shared/w_needle.qc @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016-2020 Marco Cawthorne + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +void w_needle_precache(void) +{ +} + +void w_needle_updateammo(player pl) +{ + Weapons_UpdateAmmo(pl, -1, -1, -1); +} +string w_needle_pmodel(player pl) +{ + return __NULL__; +} +string w_needle_deathmsg(void) +{ + return "%s poisoned %s."; +} + +void w_needle_draw(player pl) +{ +} + +void w_needle_holster(player pl) +{ +} + +void w_needle_primary(player pl) +{ + if (pl.w_attack_next > 0.0) { + return; + } + + vector startTrace = pl.GetEyePos(); + vector endTrace; + + makevectors(pl.v_angle); + endTrace = startTrace + (v_forward * 96); + traceline(startTrace, endTrace, MOVE_NORMAL, pl); + pl.w_attack_next = 1.0f; + Animation_PlayerTop(pl, SCIANIM_PUSH_BUTTON, 1.0f); + +#ifdef SERVER + if (trace_fraction >= 1.0) { + return; + } + + if (trace_ent.takedamage == DAMAGE_NO) { + return; + } + + if not (trace_ent.flags & FL_CLIENT || trace_ent.flags & FL_MONSTER) { + return; + } + + Damage_Apply(trace_ent, pl, 7, WEAPON_NEEDLE, DMG_POISON); +#endif +} + +void w_needle_secondary(player pl) +{ + /* TODO: switch between first/third person */ +} + +float w_needle_aimanim(player pl) +{ + return 0; /* not used */ +} + +void w_needle_hudpic(player pl, int s, vector pos, float a) +{ +#ifdef CLIENT + if (s) { + drawsubpic(pos, [170,45], g_hammer_spr, [0,48/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], g_hammer_spr, [0,0], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } +#endif +} + +bool +w_needle_isempty(player pl) +{ + return false; +} + +weapon_t w_needle = +{ + .name = "needle", + .id = ITEM_NEEDLE, + .slot = 0, + .slot_pos = 2, + .draw = w_needle_draw, + .holster = w_needle_holster, + .primary = w_needle_primary, + .secondary = w_needle_secondary, + .reload = __NULL__, + .release = __NULL__, + .postdraw = __NULL__, + .precache = w_needle_precache, + .pickup = __NULL__, + .updateammo = w_needle_updateammo, + .wmodel = __NULL__, + .pmodel = w_needle_pmodel, + .deathmsg = w_needle_deathmsg, + .aimanim = w_needle_aimanim, + .isempty = w_needle_isempty, + .hudpic = w_needle_hudpic +}; diff --git a/src/shared/weapons.h b/src/shared/weapons.h index d395a24..43bbe8b 100644 --- a/src/shared/weapons.h +++ b/src/shared/weapons.h @@ -21,6 +21,7 @@ enum WEAPON_CROWBAR, WEAPON_HAMMER, WEAPON_CHAINSAW, + WEAPON_NEEDLE, WEAPON_GLOCK, WEAPON_PYTHON, WEAPON_MP5, diff --git a/src/shared/weapons.qc b/src/shared/weapons.qc index 24939af..1ee45db 100644 --- a/src/shared/weapons.qc +++ b/src/shared/weapons.qc @@ -20,6 +20,7 @@ weapon_t g_weapons[] = { w_crowbar, w_hammer, w_chainsaw, + w_needle, w_glock, w_python, w_mp5, diff --git a/zpak001.pk3dir/default.cfg b/zpak001.pk3dir/default.cfg index e6b0d25..afd3599 100644 --- a/zpak001.pk3dir/default.cfg +++ b/zpak001.pk3dir/default.cfg @@ -50,7 +50,8 @@ seta v_muzzledlight 0 // config compat alias mp_timelimit timelimit alias mp_fraglimit fraglimit - +alias sv_gamemode sh_realistic + // video settings seta gl_overbright 0 seta gl_ldr 1 diff --git a/zpak001.pk3dir/scripts/constants.txt b/zpak001.pk3dir/scripts/constants.txt index 1b1883a..870719e 100644 --- a/zpak001.pk3dir/scripts/constants.txt +++ b/zpak001.pk3dir/scripts/constants.txt @@ -3,17 +3,18 @@ WEAPON_NONE 0 WEAPON_CROWBAR 1 WEAPON_HAMMER 2 WEAPON_CHAINSAW 3 -WEAPON_GLOCK 4 -WEAPON_PYTHON 5 -WEAPON_MP5 6 -WEAPON_SHOTGUN 7 -WEAPON_CROSSBOW 8 -WEAPON_CANNON 9 -WEAPON_RPG 10 -WEAPON_GAUSS 11 -WEAPON_EGON 12 -WEAPON_HORNETGUN 13 -WEAPON_HANDGRENADE 14 -WEAPON_SATCHEL 15 -WEAPON_TRIPMINE 16 -WEAPON_SNARK 17 \ No newline at end of file +WEAPON_NEEDLE 4 +WEAPON_GLOCK 5 +WEAPON_PYTHON 6 +WEAPON_MP5 7 +WEAPON_SHOTGUN 8 +WEAPON_CROSSBOW 9 +WEAPON_CANNON 10 +WEAPON_RPG 11 +WEAPON_GAUSS 12 +WEAPON_EGON 13 +WEAPON_HORNETGUN 14 +WEAPON_HANDGRENADE 15 +WEAPON_SATCHEL 16 +WEAPON_TRIPMINE 17 +WEAPON_SNARK 18 \ No newline at end of file