From 67487d30cb8c789f021a4c437231087ba2223844 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Mon, 8 Mar 2021 12:08:54 +0100 Subject: [PATCH] Initial commit, carried over from Nuclide's Git on March 8th 2021 --- LICENSE | 15 ++ README.md | 34 ++++ data.pk3dir/default.cfg | 40 ++++ data.pk3dir/sound/weapons_tfc.sndshd | 19 ++ img/preview1.jpg | Bin 0 -> 126187 bytes src/Makefile | 5 + src/client/Makefile | 4 + src/client/entities.qc | 26 +++ src/client/init.qc | 69 +++++++ src/client/progs.src | 38 ++++ src/client/vgui_chooseteam.qc | 217 +++++++++++++++++++++ src/progs.src | 2 + src/server/Makefile | 4 + src/server/defs.h | 18 ++ src/server/gamerules.h | 26 +++ src/server/gamerules.qc | 177 +++++++++++++++++ src/server/info_player_teamspawn.qc | 52 +++++ src/server/info_tfgoal.qc | 81 ++++++++ src/server/input.qc | 53 ++++++ src/server/item_tfgoal.qc | 71 +++++++ src/server/progs.src | 46 +++++ src/server/server.qc | 39 ++++ src/server/spawn.qc | 175 +++++++++++++++++ src/shared/include.src | 41 ++++ src/shared/items.h | 50 +++++ src/shared/w_asscan.qc | 112 +++++++++++ src/shared/w_autorifle.qc | 114 +++++++++++ src/shared/w_crowbar.qc | 232 +++++++++++++++++++++++ src/shared/w_dbs.qc | 273 ++++++++++++++++++++++++++ src/shared/w_flamer.qc | 114 +++++++++++ src/shared/w_glauncher.qc | 114 +++++++++++ src/shared/w_grapple.qc | 114 +++++++++++ src/shared/w_incendiary.qc | 114 +++++++++++ src/shared/w_knife.qc | 114 +++++++++++ src/shared/w_medkit.qc | 114 +++++++++++ src/shared/w_nailgun.qc | 114 +++++++++++ src/shared/w_pipebomb.qc | 115 +++++++++++ src/shared/w_railgun.qc | 114 +++++++++++ src/shared/w_rpg.qc | 96 ++++++++++ src/shared/w_sbs.qc | 274 +++++++++++++++++++++++++++ src/shared/w_sniper.qc | 114 +++++++++++ src/shared/w_supernail.qc | 114 +++++++++++ src/shared/w_tranquil.qc | 114 +++++++++++ src/shared/w_umbrella.qc | 235 +++++++++++++++++++++++ src/shared/w_wrench.qc | 225 ++++++++++++++++++++++ src/shared/weapons.h | 41 ++++ src/shared/weapons.qc | 40 ++++ 47 files changed, 4313 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100755 data.pk3dir/default.cfg create mode 100644 data.pk3dir/sound/weapons_tfc.sndshd create mode 100644 img/preview1.jpg create mode 100644 src/Makefile create mode 100644 src/client/Makefile create mode 100644 src/client/entities.qc create mode 100644 src/client/init.qc create mode 100755 src/client/progs.src create mode 100644 src/client/vgui_chooseteam.qc create mode 100755 src/progs.src create mode 100644 src/server/Makefile create mode 100644 src/server/defs.h create mode 100644 src/server/gamerules.h create mode 100644 src/server/gamerules.qc create mode 100644 src/server/info_player_teamspawn.qc create mode 100644 src/server/info_tfgoal.qc create mode 100644 src/server/input.qc create mode 100644 src/server/item_tfgoal.qc create mode 100755 src/server/progs.src create mode 100644 src/server/server.qc create mode 100644 src/server/spawn.qc create mode 100644 src/shared/include.src create mode 100644 src/shared/items.h create mode 100644 src/shared/w_asscan.qc create mode 100644 src/shared/w_autorifle.qc create mode 100644 src/shared/w_crowbar.qc create mode 100644 src/shared/w_dbs.qc create mode 100644 src/shared/w_flamer.qc create mode 100644 src/shared/w_glauncher.qc create mode 100644 src/shared/w_grapple.qc create mode 100644 src/shared/w_incendiary.qc create mode 100644 src/shared/w_knife.qc create mode 100644 src/shared/w_medkit.qc create mode 100644 src/shared/w_nailgun.qc create mode 100644 src/shared/w_pipebomb.qc create mode 100644 src/shared/w_railgun.qc create mode 100644 src/shared/w_rpg.qc create mode 100644 src/shared/w_sbs.qc create mode 100644 src/shared/w_sniper.qc create mode 100644 src/shared/w_supernail.qc create mode 100644 src/shared/w_tranquil.qc create mode 100644 src/shared/w_umbrella.qc create mode 100644 src/shared/w_wrench.qc create mode 100644 src/shared/weapons.h create mode 100644 src/shared/weapons.qc diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..73679b8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2016-2021, Marco "eukara" Hladik + +Permission to use, copy, modify, and/or 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 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7de4d5d --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# FreeTFC +Clean-room reimplementation of Team Fortress Classic in QuakeC. + +![Preview 1](img/preview1.jpg) + +## Building +Clone the repository into the Nuclide-SDK: + +> git clone REPOURL tfc + +then either run Nuclide's ./build_game.sh shell script, or issue 'make' inside +./tfc/src! + +Obviously make sure that Nuclide has fteqw and fteqcc set-up for building. + +## Community +Join us on #halflife or #tfc via irc.frag-net.com and chat. + +## License +ISC License + +Copyright (c) 2016-2021 Marco Hladik + +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. diff --git a/data.pk3dir/default.cfg b/data.pk3dir/default.cfg new file mode 100755 index 0000000..056395e --- /dev/null +++ b/data.pk3dir/default.cfg @@ -0,0 +1,40 @@ +// Generic Binds +bind "ESC" "togglemenu" +bind "w" "+forward" +bind "s" "+back" +bind "a" "+moveleft" +bind "d" "+moveright" +bind "SPACE" "+jump" +bind "CTRL" "+duck" +bind "SHIFT" "+speed" +bind "0" "slot10" +bind "1" "slot1" +bind "2" "slot2" +bind "3" "slot3" +bind "4" "slot4" +bind "5" "slot5" +bind "6" "slot6" +bind "7" "slot7" +bind "8" "slot8" +bind "9" "slot9" +bind "UPARROW" "+forward" +bind "DOWNARROW" "+back" +bind "LEFTARROW" "+left" +bind "RIGHTARROW" "+right" +bind "MOUSE1" "+attack" +bind "MOUSE2" "+attack2" +bind "MWHEELDOWN" "invnext" +bind "MWHEELUP" "invprev" +bind "r" "+reload" +bind "e" "+use" +bind "TAB" "+showscores" +bind "y" "messagemode" +bind "u" "messagemode2" +bind "t" "impulse 201" +bind "f" "impulse 100" +bind "f1" "vote yes" +bind "f2" "vote no" + +// Game Variables +seta "hostname" "FreeTF Server" +seta "maxplayers" "8" diff --git a/data.pk3dir/sound/weapons_tfc.sndshd b/data.pk3dir/sound/weapons_tfc.sndshd new file mode 100644 index 0000000..e49af20 --- /dev/null +++ b/data.pk3dir/sound/weapons_tfc.sndshd @@ -0,0 +1,19 @@ +weapon_dbs.fire +{ + sample weapons/shotgn2.wav +} + +weapon_sbs.cock +{ + sample weapons/scock1.wav +} + +weapon_sbs.fire +{ + sample weapons/sbarrel1.wav +} + +weapon_sbs.reload +{ + sample weapons/reload3.wav +} diff --git a/img/preview1.jpg b/img/preview1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4eb6709a293fd7c698b6ee4c044f7cedd827e666 GIT binary patch literal 126187 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 z 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

xx`C{Rurx%~eC$Lm(D?fzAmkdok>o^g(VWBl<_ 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 literal 0 HcmV?d00001 diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..cc3f82d --- /dev/null +++ b/src/Makefile @@ -0,0 +1,5 @@ +CC=fteqcc + +all: + cd client && $(MAKE) + cd server && $(MAKE) diff --git a/src/client/Makefile b/src/client/Makefile new file mode 100644 index 0000000..627019a --- /dev/null +++ b/src/client/Makefile @@ -0,0 +1,4 @@ +CC=fteqcc + +all: + $(CC) progs.src diff --git a/src/client/entities.qc b/src/client/entities.qc new file mode 100644 index 0000000..3e4da72 --- /dev/null +++ b/src/client/entities.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +int +ClientGame_EntityUpdate(float id, float new) +{ + switch (id) { + default: + return FALSE; + } + + return TRUE; +} diff --git a/src/client/init.qc b/src/client/init.qc new file mode 100644 index 0000000..562533a --- /dev/null +++ b/src/client/init.qc @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +/* +================= +ClientGame_Init + +Comparable to worldspawn in SSQC in that it's mostly used for precaches +================= +*/ +void +ClientGame_Init(float apilevel, string enginename, float engineversion) +{ + Obituary_Init(); +} + +void +ClientGame_InitDone(void) +{ +// VGUI_ChooseTeam(); +} + +void +ClientGame_RendererRestart(string rstr) +{ + Obituary_Precache(); + + FX_Blood_Init(); + FX_BreakModel_Init(); + FX_Explosion_Init(); + FX_GibHuman_Init(); + FX_Spark_Init(); + FX_Impact_Init(); + + precache_model("sprites/640hud1.spr"); + precache_model("sprites/640hud2.spr"); + precache_model("sprites/640hud3.spr"); + precache_model("sprites/640hud4.spr"); + precache_model("sprites/640hud5.spr"); + precache_model("sprites/640hud6.spr"); + + precache_model("sprites/tfc_dmsg.spr"); + precache_model("sprites/tfchud01.spr"); + precache_model("sprites/tfchud02.spr"); + precache_model("sprites/tfchud03.spr"); + precache_model("sprites/tfchud04.spr"); + precache_model("sprites/tfchud05.spr"); + precache_model("sprites/tfchud06.spr"); + precache_model("sprites/tfchud07.spr"); + + precache_model("sprites/chainsaw.spr"); + precache_model("sprites/hammer.spr"); + precache_model("sprites/w_cannon.spr"); + + BEAM_TRIPMINE = particleeffectnum("weapon_tripmine.beam"); +} diff --git a/src/client/progs.src b/src/client/progs.src new file mode 100755 index 0000000..65bec8b --- /dev/null +++ b/src/client/progs.src @@ -0,0 +1,38 @@ +#pragma target fte +#pragma progs_dat "../..//csprogs.dat" + +#define CSQC +#define CLIENT +#define VALVE +#define CLASSIC_VGUI +#define GS_RENDERFX + +#includelist +../../../src/shared/fteextensions.qc +../../../src/shared/defs.h +../../../valve/src/client/defs.h +../../../src/client/defs.h + +../../../src/vgui/include.src + +../../../src/gs-entbase/client.src +../../../src/gs-entbase/shared.src +../shared/include.src + +../../../valve/src/client/predict.qc +init.qc +../../../valve/src/client/player.qc +entities.qc +../../../valve/src/client/cmds.qc +../../../valve/src/client/game_event.qc +../../../valve/src/client/view.qc +../../../valve/src/client/obituary.qc +../../../valve/src/client/hud.qc +../../../valve/src/client/hud_weaponselect.qc +../../../valve/src/client/scoreboard.qc +../../../valve/src/client/input.qc +../../../base/src/client/modelevent.qc + +../../../src/client/include.src +../../../src/shared/include.src +#endlist diff --git a/src/client/vgui_chooseteam.qc b/src/client/vgui_chooseteam.qc new file mode 100644 index 0000000..ed7ece8 --- /dev/null +++ b/src/client/vgui_chooseteam.qc @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +static CUIWindow winChooseTeam; +static CUIWindow winCTTeam; +static CUIWindow winTTeam; + +typedef struct +{ + string str; + void(void) ptr; +} btnarr_t; + +void +VGUI_TeamJoin(float i) +{ + sendevent("TeamJoin", "f", i); +} + +void +VGUI_TeamBack(void) +{ + +} + +void VGUI_JoinScout_B (void) { VGUI_TeamJoin(1); } +void VGUI_JoinSniper_B (void) { VGUI_TeamJoin(2); } +void VGUI_JoinSoldier_B (void) { VGUI_TeamJoin(3); } +void VGUI_JoinDemoman_B (void) { VGUI_TeamJoin(4); } +void VGUI_JoinMedic_B (void) { VGUI_TeamJoin(5); } +void VGUI_JoinHwguy_B (void) { VGUI_TeamJoin(6); } +void VGUI_JoinPyro_B (void) { VGUI_TeamJoin(7); } +void VGUI_JoinSpy_B (void) { VGUI_TeamJoin(8); } +void VGUI_JoinEngineer_B (void) { VGUI_TeamJoin(9); } + +void VGUI_JoinScout_R (void) { VGUI_TeamJoin(11); } +void VGUI_JoinSniper_R (void) { VGUI_TeamJoin(12); } +void VGUI_JoinSoldier_R (void) { VGUI_TeamJoin(13); } +void VGUI_JoinDemoman_R (void) { VGUI_TeamJoin(14); } +void VGUI_JoinMedic_R (void) { VGUI_TeamJoin(15); } +void VGUI_JoinHwguy_R (void) { VGUI_TeamJoin(16); } +void VGUI_JoinPyro_R (void) { VGUI_TeamJoin(17); } +void VGUI_JoinSpy_R (void) { VGUI_TeamJoin(18); } +void VGUI_JoinEngineer_R (void) { VGUI_TeamJoin(19); } + +void VGUI_JoinScout_Y (void) { VGUI_TeamJoin(21); } +void VGUI_JoinSniper_Y (void) { VGUI_TeamJoin(22); } +void VGUI_JoinSoldier_Y (void) { VGUI_TeamJoin(23); } +void VGUI_JoinDemoman_Y (void) { VGUI_TeamJoin(24); } +void VGUI_JoinMedic_Y (void) { VGUI_TeamJoin(25); } +void VGUI_JoinHwguy_Y (void) { VGUI_TeamJoin(26); } +void VGUI_JoinPyro_Y (void) { VGUI_TeamJoin(27); } +void VGUI_JoinSpy_Y (void) { VGUI_TeamJoin(28); } +void VGUI_JoinEngineer_Y (void) { VGUI_TeamJoin(29); } + +void VGUI_JoinScout_G (void) { VGUI_TeamJoin(31); } +void VGUI_JoinSniper_G (void) { VGUI_TeamJoin(32); } +void VGUI_JoinSoldier_G (void) { VGUI_TeamJoin(33); } +void VGUI_JoinDemoman_G (void) { VGUI_TeamJoin(34); } +void VGUI_JoinMedic_G (void) { VGUI_TeamJoin(35); } +void VGUI_JoinHwguy_G (void) { VGUI_TeamJoin(36); } +void VGUI_JoinPyro_G (void) { VGUI_TeamJoin(37); } +void VGUI_JoinSpy_G (void) { VGUI_TeamJoin(38); } +void VGUI_JoinEngineer_G (void) { VGUI_TeamJoin(39); } + +btnarr_t red_team[] = { + {"SCOUT", VGUI_JoinScout_R }, + {"SNIPER", VGUI_JoinSniper_R }, + {"SOLDIER", VGUI_JoinSoldier_R }, + {"DEMOMAN", VGUI_JoinDemoman_R }, + {"MEDIC", VGUI_JoinMedic_R }, + {"HWGUY", VGUI_JoinHwguy_R }, + {"PYRO", VGUI_JoinPyro_R }, + {"SPY", VGUI_JoinSpy_R }, + {"ENGINEER", VGUI_JoinEngineer_R }, + {__NULL__, __NULL__ }, + {"< Back", VGUI_TeamBack } +}; + +btnarr_t blue_team[] = { + {"SCOUT", VGUI_JoinScout_B }, + {"SNIPER", VGUI_JoinSniper_B }, + {"SOLDIER", VGUI_JoinSoldier_B }, + {"DEMOMAN", VGUI_JoinDemoman_B }, + {"MEDIC", VGUI_JoinMedic_B }, + {"HWGUY", VGUI_JoinHwguy_B }, + {"PYRO", VGUI_JoinPyro_B }, + {"SPY", VGUI_JoinSpy_B }, + {"ENGINEER", VGUI_JoinEngineer_B }, + {__NULL__, __NULL__ }, + {"< Back", VGUI_TeamBack } +}; + +void +VGUI_GoSpectator(void) +{ + VGUI_TeamJoin(0); + winChooseTeam.Hide(); +} + +void +VGUI_ChooseTeam_Red(void) +{ + static int initialized; + static CUIButton *btns; + + if (!initialized) { + vector btnpos = [16,0]; + initialized = TRUE; + winCTTeam = spawn(CUIWindow); + winCTTeam.SetTitle("Choose Skin"); + winCTTeam.SetSize([420,320]); + g_uiDesktop.Add(winCTTeam); + + btns = memalloc(sizeof(btnarr_t) * red_team.length); + for (int i = 0; i < red_team.length; i++) { + btnpos[1] += 30; + if (red_team[i].ptr == __NULL__) { + continue; + } + btns[i] = spawn(CUIButton); + btns[i].SetTitle(red_team[i].str); + btns[i].SetPos(btnpos); + btns[i].SetFunc(red_team[i].ptr); + winCTTeam.Add(btns[i]); + } + } + + winChooseTeam.Hide(); + winCTTeam.Show(); + winCTTeam.SetPos((video_res / 2) - (winCTTeam.GetSize() / 2)); +} + +void +VGUI_ChooseTeam_Blue(void) +{ + static int initialized; + static CUIButton *btns; + + if (!initialized) { + vector btnpos = [16,0]; + initialized = TRUE; + winTTeam = spawn(CUIWindow); + winTTeam.SetTitle("Choose Skin"); + winTTeam.SetSize([420,320]); + g_uiDesktop.Add(winTTeam); + + btns = memalloc(sizeof(btnarr_t) * blue_team.length); + for (int i = 0; i < blue_team.length; i++) { + btnpos[1] += 30; + if (blue_team[i].ptr == __NULL__) { + continue; + } + btns[i] = spawn(CUIButton); + btns[i].SetTitle(blue_team[i].str); + btns[i].SetPos(btnpos); + btns[i].SetFunc(blue_team[i].ptr); + winTTeam.Add(btns[i]); + } + } + + winChooseTeam.Hide(); + winTTeam.Show(); + winTTeam.SetPos((video_res / 2) - (winTTeam.GetSize() / 2)); +} + +void +VGUI_ChooseTeam(void) +{ + static int initialized; + static CUIButton btnGoRed; + static CUIButton btnGoBlue; + static CUIButton btnGoSpectator; + + if (!initialized) { + initialized = TRUE; + winChooseTeam = spawn(CUIWindow); + winChooseTeam.SetTitle("Choose Team"); + winChooseTeam.SetSize('420 320'); + + btnGoRed = spawn(CUIButton); + btnGoRed.SetTitle("Red Team"); + btnGoRed.SetPos('8 132'); + btnGoRed.SetFunc(VGUI_ChooseTeam_Red); + + btnGoBlue = spawn(CUIButton); + btnGoBlue.SetTitle("Blue Team"); + btnGoBlue.SetPos('8 162'); + btnGoBlue.SetFunc(VGUI_ChooseTeam_Blue); + + btnGoSpectator = spawn(CUIButton); + btnGoSpectator.SetTitle("Spectator"); + btnGoSpectator.SetPos('8 192'); + btnGoSpectator.SetFunc(VGUI_GoSpectator); + + g_uiDesktop.Add(winChooseTeam); + winChooseTeam.Add(btnGoRed); + winChooseTeam.Add(btnGoBlue); + winChooseTeam.Add(btnGoSpectator); + } + + winChooseTeam.Show(); + winChooseTeam.SetPos((video_res / 2) - (winChooseTeam.GetSize() / 2)); +} diff --git a/src/progs.src b/src/progs.src new file mode 100755 index 0000000..2c2a868 --- /dev/null +++ b/src/progs.src @@ -0,0 +1,2 @@ +#pragma sourcefile client/progs.src +#pragma sourcefile server/progs.src diff --git a/src/server/Makefile b/src/server/Makefile new file mode 100644 index 0000000..627019a --- /dev/null +++ b/src/server/Makefile @@ -0,0 +1,4 @@ +CC=fteqcc + +all: + $(CC) progs.src diff --git a/src/server/defs.h b/src/server/defs.h new file mode 100644 index 0000000..465ac3d --- /dev/null +++ b/src/server/defs.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +#include "gamerules.h" +#include "../../../valve/src/server/items.h" diff --git a/src/server/gamerules.h b/src/server/gamerules.h new file mode 100644 index 0000000..c3ed26b --- /dev/null +++ b/src/server/gamerules.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +class TFCGameRules:CGameRules +{ + virtual void(base_player) PlayerConnect; + virtual void(base_player) PlayerDisconnect; + virtual void(base_player) PlayerPostFrame; + virtual void(base_player) PlayerSpawn; + virtual void(base_player) PlayerKill; + + virtual void(void) LevelNewParms; +}; diff --git a/src/server/gamerules.qc b/src/server/gamerules.qc new file mode 100644 index 0000000..c572912 --- /dev/null +++ b/src/server/gamerules.qc @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +var int autocvar_sv_playerkeepalive = TRUE; + +/* we check what fields have changed over the course of the frame and network + * only the ones that have actually changed */ +void +TFCGameRules::PlayerPostFrame(base_player pp) +{ + player pl = (player)pp; + Animation_PlayerUpdate(); + + if (autocvar_sv_playerkeepalive) + pl.SendFlags |= PLAYER_KEEPALIVE; + + if (pl.old_modelindex != pl.modelindex) + pl.SendFlags |= PLAYER_MODELINDEX; + + if (pl.old_origin[0] != pl.origin[0]) + pl.SendFlags |= PLAYER_ORIGIN; + + if (pl.old_origin[1] != pl.origin[1]) + pl.SendFlags |= PLAYER_ORIGIN; + + if (pl.old_origin[2] != pl.origin[2]) + pl.SendFlags |= PLAYER_ORIGIN_Z; + + if (pl.old_angles[0] != pl.v_angle[0]) + pl.SendFlags |= PLAYER_ANGLES_X; + + if (pl.old_angles[1] != pl.angles[1]) + pl.SendFlags |= PLAYER_ANGLES_Y; + + if (pl.old_angles[2] != pl.angles[2]) + pl.SendFlags |= PLAYER_ANGLES_Z; + + if (pl.old_velocity[0] != pl.velocity[0]) + pl.SendFlags |= PLAYER_VELOCITY; + + if (pl.old_velocity[1] != pl.velocity[1]) + pl.SendFlags |= PLAYER_VELOCITY; + + if (pl.old_velocity[2] != pl.velocity[2]) + pl.SendFlags |= PLAYER_VELOCITY_Z; + + if (pl.old_flags != pl.flags) + pl.SendFlags |= PLAYER_FLAGS; + + if (pl.old_gflags != pl.gflags) + pl.SendFlags |= PLAYER_FLAGS; + + if (pl.old_activeweapon != pl.activeweapon) + pl.SendFlags |= PLAYER_WEAPON; + + if (pl.old_items != pl.g_items) + pl.SendFlags |= PLAYER_ITEMS; + + if (pl.old_health != pl.health) + pl.SendFlags |= PLAYER_HEALTH; + + if (pl.old_armor != pl.armor) + pl.SendFlags |= PLAYER_ARMOR; + + if (pl.old_movetype != pl.movetype) + pl.SendFlags |= PLAYER_MOVETYPE; + + if (pl.old_viewofs != pl.view_ofs[2]) + pl.SendFlags |= PLAYER_VIEWOFS; + + if (pl.old_baseframe != pl.baseframe) + pl.SendFlags |= PLAYER_BASEFRAME; + + if (pl.old_frame != pl.frame) + pl.SendFlags |= PLAYER_FRAME; + + if (pl.old_a_ammo1 != pl.a_ammo1) + pl.SendFlags |= PLAYER_AMMO1; + + if (pl.old_a_ammo2 != pl.a_ammo2) + pl.SendFlags |= PLAYER_AMMO2; + + if (pl.old_a_ammo3 != pl.a_ammo3) + pl.SendFlags |= PLAYER_AMMO3; + + pl.old_modelindex = pl.modelindex; + pl.old_origin = pl.origin; + pl.old_angles = pl.angles; + pl.old_angles[0] = pl.v_angle[0]; + pl.old_velocity = pl.velocity; + pl.old_flags = pl.flags; + pl.old_gflags = pl.gflags; + pl.old_activeweapon = pl.activeweapon; + pl.old_items = pl.g_items; + pl.old_health = pl.health; + pl.old_armor = pl.armor; + pl.old_movetype = pl.movetype; + pl.old_viewofs = pl.view_ofs[2]; + pl.old_baseframe = pl.baseframe; + pl.old_frame = pl.frame; + pl.old_a_ammo1 = pl.a_ammo1; + pl.old_a_ammo2 = pl.a_ammo2; + pl.old_a_ammo3 = pl.a_ammo3; +} + +void +TFCGameRules::LevelNewParms(void) +{ + parm1 = parm2 = parm3 = parm4 = parm5 = parm6 = parm7 = + parm8 = parm9 = parm10 = parm11 = parm12 = parm13 = parm14 = + parm15 = parm16 = parm17 = parm18 = parm19 = parm20 = parm21 = + parm22 = parm23 = parm24 = parm25 = parm26 = parm27 = parm28 = + parm29 = parm30 = 0; + parm64 = FL_CLIENT; +} + +void +TFCGameRules::PlayerConnect(base_player pl) +{ + if (Plugin_PlayerConnect(pl) == FALSE) + bprint(PRINT_HIGH, sprintf("%s connected\n", pl.netname)); +} + +void +TFCGameRules::PlayerDisconnect(base_player pl) +{ + bprint(PRINT_HIGH, sprintf("%s disconnected\n", pl.netname)); + + /* Make this unusable */ + pl.solid = SOLID_NOT; + pl.movetype = MOVETYPE_NONE; + pl.modelindex = 0; + pl.health = 0; + pl.takedamage = 0; + pl.SendFlags = PLAYER_MODELINDEX; +} + +void +TFCGameRules::PlayerKill(base_player pp) +{ + player pl = (player)pp; + Damage_Apply(pl, pl, pl.health, WEAPON_NONE, DMG_SKIP_ARMOR); +} + +void +TFCGameRules::PlayerSpawn(base_player pp) +{ + player pl = (player)pp; + pl.classname = "spectator"; + pl.health = 0; + pl.armor = 0; + pl.takedamage = DAMAGE_NO; + pl.solid = SOLID_NOT; + pl.movetype = MOVETYPE_NOCLIP; +// pl.SendEntity = Player_SendEntity; + pl.flags = FL_CLIENT; + pl.weapon = 0; + pl.viewzoom = 1.0f; + pl.model = 0; + setsize (pl, [-16,-16,-16], [16,16,16]); + pl.view_ofs = pl.velocity = [0,0,0]; + forceinfokey(pl, "*spec", "2"); + Spawn_ObserverCam(pl); +} diff --git a/src/server/info_player_teamspawn.qc b/src/server/info_player_teamspawn.qc new file mode 100644 index 0000000..92acf17 --- /dev/null +++ b/src/server/info_player_teamspawn.qc @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +class info_player_teamspawn:CBaseTrigger +{ + void(void) info_player_teamspawn; +}; + +void +info_player_teamspawn::info_player_teamspawn(void) +{ + int team = 1; + for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { + switch (argv(i)) { + case "team_no": + team = stoi(argv(i+1)); + break; + default: + break; + } + } + + switch (team) { + case 1: + classname = "info_teamspawn_blue"; + break; + case 2: + classname = "info_teamspawn_red"; + break; + case 3: + classname = "info_teamspawn_yellow"; + break; + case 4: + classname = "info_teamspawn_green"; + break; + } +} + +CLASSEXPORT(i_p_t, info_player_teamspawn) diff --git a/src/server/info_tfgoal.qc b/src/server/info_tfgoal.qc new file mode 100644 index 0000000..21d9765 --- /dev/null +++ b/src/server/info_tfgoal.qc @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +class info_tfgoal:CBaseTrigger +{ + string m_strName; + string m_strSound; + + void(void) info_tfgoal; + virtual void(void) touch; + virtual void(void) Respawn; +}; + +void +info_tfgoal::touch(void) +{ + if (other.classname != "player") { + return; + } + + sound(this, CHAN_ITEM, m_strSound, 1.0f, ATTN_NORM); + Logging_Pickup(other, this, m_strName); + + if (cvar("sv_playerslots") == 1) { + remove(self); + } else { + Hide(); + think = Respawn; + nextthink = time + 30.0f; + } +} + +void +info_tfgoal::Respawn(void) +{ + solid = SOLID_TRIGGER; + movetype = MOVETYPE_NONE; + SetModel(m_oldModel); + setsize(this, VEC_HULL_MIN, VEC_HULL_MAX); + SetOrigin(m_oldOrigin); +} + +void +info_tfgoal::info_tfgoal(void) +{ + for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { + switch (argv(i)) { + case "netname": + m_strSound = argv(i+1); + netname = __NULL__; + break; + case "noise": + m_strSound = argv(i+1); + break; + case "mdl": + model = argv(i+1); + break; + default: + break; + } + } + precache_sound(m_strSound); + + CBaseEntity::CBaseEntity(); + info_tfgoal::Respawn(); +} + +CLASSEXPORT(i_t_g, info_tfgoal) diff --git a/src/server/input.qc b/src/server/input.qc new file mode 100644 index 0000000..440082b --- /dev/null +++ b/src/server/input.qc @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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 +Game_Input(void) +{ + if (input_buttons & INPUT_BUTTON0) { + Weapons_Primary(); + } else if (input_buttons & INPUT_BUTTON4) { + Weapons_Reload(); + } else if (input_buttons & INPUT_BUTTON3) { + Weapons_Secondary(); + } else { + Weapons_Release(); + } + + if (input_buttons & INPUT_BUTTON5) { + Player_UseDown(); + } else { + Player_UseUp(); + } + + if (self.impulse == 100) { + Flashlight_Toggle(); + } + + if (cvar("sv_cheats") == 1) { + player pl = (player)self; + if (self.impulse == 102) { + // Respawn all the entities + for (entity a = world; (a = findfloat(a, ::identity, 1));) { + CBaseEntity caw = (CBaseEntity)a; + caw.Respawn(); + } + bprint(PRINT_HIGH, "Respawning all map entities...\n"); + } + } + + self.impulse = 0; +} diff --git a/src/server/item_tfgoal.qc b/src/server/item_tfgoal.qc new file mode 100644 index 0000000..ce5beea --- /dev/null +++ b/src/server/item_tfgoal.qc @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +class item_tfgoal:CBaseTrigger +{ + string m_strSound; + + void(void) item_tfgoal; + virtual void(void) touch; + virtual void(void) Respawn; +}; + +void +item_tfgoal::touch(void) +{ + if (other.classname != "player") { + return; + } + + if (cvar("sv_playerslots") == 1) { + remove(self); + } else { + Hide(); + think = Respawn; + nextthink = time + 20.0f; + } +} + +void +item_tfgoal::Respawn(void) +{ + solid = SOLID_TRIGGER; + movetype = MOVETYPE_NONE; + SetModel(m_oldModel); + setsize(this, VEC_HULL_MIN, VEC_HULL_MAX); + SetOrigin(m_oldOrigin); +} + +void +item_tfgoal::item_tfgoal(void) +{ + for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { + switch (argv(i)) { + case "noise": + m_strSound = argv(i+1); + break; + case "mdl": + model = argv(i+1); + break; + default: + break; + } + } + precache_sound(m_strSound); + + CBaseEntity::CBaseEntity(); + item_tfgoal::Respawn(); +} diff --git a/src/server/progs.src b/src/server/progs.src new file mode 100755 index 0000000..4f4ae45 --- /dev/null +++ b/src/server/progs.src @@ -0,0 +1,46 @@ +#pragma target fte +#pragma progs_dat "../../progs.dat" + +#define QWSSQC +#define SERVER +#define VALVE +#define TFC +#define GS_RENDERFX + +#includelist +../../../src/shared/fteextensions.qc +../../../src/gs-entbase/server/defs.h +../../../src/shared/defs.h +../../../src/server/defs.h + +../../../src/gs-entbase/server.src +../../../src/gs-entbase/shared.src +../shared/include.src + +defs.h + +../../../valve/src/server/player.qc +../../../valve/src/server/spectator.qc + +../../../valve/src/server/items.qc +info_player_teamspawn.qc +info_tfgoal.qc +item_tfgoal.qc + +gamerules.qc +../../../valve/src/server/client.qc +server.qc +../../../valve/src/server/damage.qc +../../../valve/src/server/rules.qc +../../../valve/src/server/flashlight.qc +../../../base/src/server/modelevent.qc + +../../../src/botlib/include.src + +input.qc +spawn.qc + +../../../src/server/include.src +../../../src/shared/include.src +#endlist + diff --git a/src/server/server.qc b/src/server/server.qc new file mode 100644 index 0000000..d380f35 --- /dev/null +++ b/src/server/server.qc @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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 +Game_InitRules(void) +{ + g_grMode = spawn(TFCGameRules); +} + +void +Game_Worldspawn(void) +{ + Sound_Precache("ammo.pickup"); + Sound_Precache("ammo.respawn"); + Sound_Precache("player.die"); + Sound_Precache("player.fall"); + Sound_Precache("player.lightfall"); + precache_model("models/player.mdl"); + precache_model("models/w_weaponbox.mdl"); + Weapons_Init(); + Player_Precache(); +} + +void weaponbox_spawn(player pl) +{ +} diff --git a/src/server/spawn.qc b/src/server/spawn.qc new file mode 100644 index 0000000..7be5c5b --- /dev/null +++ b/src/server/spawn.qc @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +enum +{ + CLASS_SCOUT = 1, + CLASS_SNIPER, + CLASS_SOLDIER, + CLASS_DEMO, + CLASS_MEDIC, + CLASS_HVYWEAPON, + CLASS_PYRO, + CLASS_SPY, + CLASS_ENGINEER +}; + +string g_teammodels[] = { + "", + "models/player/scout/scout2.mdl", + "models/player/sniper/sniper2.mdl", + "models/player/soldier/soldier2.mdl", + "models/player/demo/demo.mdl", + "models/player/medic/medic2.mdl", + "models/player/hvyweapon/hvyweapon2.mdl", + "models/player/pyro/pyro2.mdl", + "models/player/spy/spy2.mdl", + "models/player/engineer/engineer2.mdl" +}; + +void +CSEv_TeamJoin_f(float f) +{ + if (self.classname != "player") { + spawnfunc_player(); + } + player pl = (player)self; + + entity spot = world; + pl.classname = "player"; + pl.health = self.max_health = 100; + + pl.takedamage = DAMAGE_YES; + pl.solid = SOLID_SLIDEBOX; + pl.movetype = MOVETYPE_WALK; + pl.flags = FL_CLIENT; + pl.viewzoom = 1.0; + + /* mess, do it better */ + if (f < 10) { + pl.team = 1; /* Blue */ + } else if (f < 20) { + pl.team = 2; /* Red */ + f -= 10; + } else if (f < 30) { + pl.team = 3; /* Yellow */ + f -= 20; + } else if (f < 40) { + pl.team = 4; /* Green */ + f -= 30; + } + + pl.model = g_teammodels[f]; + setmodel(pl, pl.model); + setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); + pl.view_ofs = VEC_PLAYER_VIEWPOS; + pl.velocity = [0,0,0]; + pl.gravity = __NULL__; + pl.frame = 1; +// pl.SendEntity = Player_SendEntity; + pl.SendFlags = UPDATE_ALL; + pl.armor = pl.activeweapon = pl.g_items = 0; + + pl.customphysics = Empty; + pl.iBleeds = TRUE; + forceinfokey(pl, "*spec", "0"); + forceinfokey(self, "*deaths", ftos(self.deaths)); + + switch (pl.team) { + case 1: + spot = Spawn_SelectRandom("info_teamspawn_blue"); + break; + case 2: + spot = Spawn_SelectRandom("info_teamspawn_red"); + break; + case 3: + spot = Spawn_SelectRandom("info_teamspawn_yellow"); + break; + case 4: + spot = Spawn_SelectRandom("info_teamspawn_green"); + break; + } + + setorigin(pl, spot.origin); + pl.angles = spot.angles; + pl.fixangle = TRUE; + + switch (f) { + case CLASS_SCOUT: + Weapons_AddItem(pl, WEAPON_CROWBAR, -1); + Weapons_AddItem(pl, WEAPON_SBS, -1); + Weapons_AddItem(pl, WEAPON_NAILGUN, -1); + env_message_single(pl, "HELP_SCOUT"); + break; + case CLASS_SNIPER: + Weapons_AddItem(pl, WEAPON_CROWBAR, -1); + Weapons_AddItem(pl, WEAPON_SNIPER, -1); + Weapons_AddItem(pl, WEAPON_AUTORIFLE, -1); + Weapons_AddItem(pl, WEAPON_NAILGUN, -1); + env_message_single(pl, "HELP_SNIPER"); + break; + case CLASS_SOLDIER: + Weapons_AddItem(pl, WEAPON_CROWBAR, -1); + Weapons_AddItem(pl, WEAPON_SBS, -1); + Weapons_AddItem(pl, WEAPON_DBS, -1); + Weapons_AddItem(pl, WEAPON_RPG, -1); + env_message_single(pl, "HELP_SOLDIER"); + break; + case CLASS_DEMO: + Weapons_AddItem(pl, WEAPON_CROWBAR, -1); + Weapons_AddItem(pl, WEAPON_SBS, -1); + Weapons_AddItem(pl, WEAPON_GLAUNCHER, -1); + Weapons_AddItem(pl, WEAPON_PIPEBOMB, -1); + env_message_single(pl, "HELP_DEMOMAN"); + break; + case CLASS_MEDIC: + Weapons_AddItem(pl, WEAPON_MEDKIT, -1); + Weapons_AddItem(pl, WEAPON_SBS, -1); + Weapons_AddItem(pl, WEAPON_DBS, -1); + Weapons_AddItem(pl, WEAPON_SUPERNAIL, -1); + env_message_single(pl, "HELP_MEDIC"); + break; + case CLASS_HVYWEAPON: + Weapons_AddItem(pl, WEAPON_CROWBAR, -1); + Weapons_AddItem(pl, WEAPON_SBS, -1); + Weapons_AddItem(pl, WEAPON_DBS, -1); + Weapons_AddItem(pl, WEAPON_ASSCAN, -1); + env_message_single(pl, "HELP_HWGUY"); + break; + case CLASS_PYRO: + Weapons_AddItem(pl, WEAPON_CROWBAR, -1); + Weapons_AddItem(pl, WEAPON_SBS, -1); + Weapons_AddItem(pl, WEAPON_FLAMER, -1); + Weapons_AddItem(pl, WEAPON_INCENDIARY, -1); + env_message_single(pl, "HELP_PYRO"); + break; + case CLASS_SPY: + Weapons_AddItem(pl, WEAPON_KNIFE, -1); + Weapons_AddItem(pl, WEAPON_TRANQUIL, -1); + Weapons_AddItem(pl, WEAPON_DBS, -1); + Weapons_AddItem(pl, WEAPON_NAILGUN, -1); + env_message_single(pl, "HELP_SPY"); + break; + case CLASS_ENGINEER: + Weapons_AddItem(pl, WEAPON_WRENCH, -1); + Weapons_AddItem(pl, WEAPON_RAILGUN, -1); + Weapons_AddItem(pl, WEAPON_DBS, -1); + env_message_single(pl, "HELP_ENGINEER"); + break; + } + + pl.g_items |= ITEM_SUIT; +} diff --git a/src/shared/include.src b/src/shared/include.src new file mode 100644 index 0000000..5ec32ab --- /dev/null +++ b/src/shared/include.src @@ -0,0 +1,41 @@ + #includelist +../../../valve/src/shared/flags.h +../../../valve/src/shared/player.qc +../../../valve/src/shared/weapon_common.h +../../../valve/src/shared/animations.h +../../../valve/src/shared/animations.qc +../../../valve/src/shared/pmove.qc +../../../valve/src/shared/pmove_water.qc + +../../../valve/src/shared/fx_blood.qc +../../../valve/src/shared/fx_breakmodel.qc +../../../valve/src/shared/fx_explosion.qc +../../../valve/src/shared/fx_gibhuman.qc +../../../valve/src/shared/fx_spark.qc +../../../valve/src/shared/fx_impact.qc + +items.h +weapons.h +w_asscan.qc +w_autorifle.qc +w_crowbar.qc +w_dbs.qc +w_flamer.qc +w_glauncher.qc +w_grapple.qc +w_incendiary.qc +w_knife.qc +w_medkit.qc +w_nailgun.qc +w_pipebomb.qc +w_railgun.qc +w_rpg.qc +w_sbs.qc +w_sniper.qc +w_supernail.qc +w_tranquil.qc +w_umbrella.qc +w_wrench.qc +weapons.qc +../../../valve/src/shared/weapon_common.qc +#endlist diff --git a/src/shared/items.h b/src/shared/items.h new file mode 100644 index 0000000..185c7fd --- /dev/null +++ b/src/shared/items.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +#define ITEM_CROWBAR 0x00000001 +#define ITEM_MEDKIT 0x00000002 +#define ITEM_KNIFE 0x00000004 +#define ITEM_WRENCH 0x00000008 +#define ITEM_UMBRELLA 0x00000010 +#define ITEM_SBS 0x00000020 +#define ITEM_SNIPER 0x00000040 +#define ITEM_TRANQUIL 0x00000080 +#define ITEM_RAILGUN 0x00000100 +#define ITEM_AUTORIFLE 0x00000200 +#define ITEM_DBS 0x00000400 +#define ITEM_NAILGUN 0x00000800 +#define ITEM_GLAUNCHER 0x00001000 +#define ITEM_SUPERNAIL 0x00002000 +#define ITEM_FLAMER 0x00004000 +#define ITEM_RPG 0x00008000 +#define ITEM_PIPEBOMB 0x00010000 +#define ITEM_ASSCAN 0x00020000 + +#define ITEM_INCENDIARY 0x00040000 + +#define ITEM_GRAPPLE 0x00080000 +#define ITEM_SUIT 0x00100000 +#define ITEM_UNUSED22 0x00200000 +#define ITEM_UNUSED23 0x00400000 +#define ITEM_UNUSED24 0x00800000 +#define ITEM_UNUSED25 0x01000000 +#define ITEM_UNUSED26 0x02000000 +#define ITEM_UNUSED27 0x04000000 +#define ITEM_UNUSED28 0x08000000 +#define ITEM_UNUSED29 0x10000000 +#define ITEM_UNUSED30 0x20000000 +#define ITEM_UNUSED31 0x40000000 +#define ITEM_UNUSED32 0x80000000 diff --git a/src/shared/w_asscan.qc b/src/shared/w_asscan.qc new file mode 100644 index 0000000..77201c9 --- /dev/null +++ b/src/shared/w_asscan.qc @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_asscan_precache(void) +{ + precache_model("models/v_tfac.mdl"); + precache_model("models/w_asscan.mdl"); + precache_model("models/p_asscan.mdl"); +} + +void +w_asscan_updateammo(player pl) +{ + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +} + +string +w_asscan_wmodel(void) +{ + return "models/w_asscan.mdl"; +} +string +w_asscan_pmodel(void) +{ + return "models/p_asscan.mdl"; +} + +string +w_asscan_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_asscan_draw(void) +{ + Weapons_SetModel("models/v_tfac.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_asscan_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_asscan_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud04.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud03.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_asscan = +{ + .name = "asscan", + .id = ITEM_ASSCAN, + .slot = 4, + .slot_pos = 2, + .draw = w_asscan_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_asscan_precache, + .pickup = __NULL__, + .updateammo = w_asscan_updateammo, + .wmodel = w_asscan_wmodel, + .pmodel = w_asscan_pmodel, + .deathmsg = w_asscan_deathmsg, + .aimanim = w_asscan_aimanim, + .hudpic = w_asscan_hudpic +}; diff --git a/src/shared/w_autorifle.qc b/src/shared/w_autorifle.qc new file mode 100644 index 0000000..a64d054 --- /dev/null +++ b/src/shared/w_autorifle.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_autorifle_precache(void) +{ + precache_model("models/v_tfc_sniper.mdl"); + precache_model("models/w_autorifle.mdl"); + precache_model("models/p_autorifle.mdl"); +} + +void +w_autorifle_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_autorifle_wmodel(void) +{ + return "models/w_autorifle.mdl"; +} +string +w_autorifle_pmodel(void) +{ + return "models/p_autorifle.mdl"; +} + +string +w_autorifle_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_autorifle_draw(void) +{ + Weapons_SetModel("models/v_tfc_sniper.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_autorifle_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_autorifle_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud02.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud01.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_autorifle = +{ + .name = "autorifle", + .id = ITEM_AUTORIFLE, + .slot = 2, + .slot_pos = 0, + .draw = w_autorifle_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_autorifle_precache, + .pickup = __NULL__, + .updateammo = w_autorifle_updateammo, + .wmodel = w_autorifle_wmodel, + .pmodel = w_autorifle_pmodel, + .deathmsg = w_autorifle_deathmsg, + .aimanim = w_autorifle_aimanim, + .hudpic = w_autorifle_hudpic +}; diff --git a/src/shared/w_crowbar.qc b/src/shared/w_crowbar.qc new file mode 100644 index 0000000..4123d9b --- /dev/null +++ b/src/shared/w_crowbar.qc @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +enum +{ + CBAR_IDLE, + CBAR_DRAW, + CBAR_HOLSTER, + CBAR_ATTACK1HIT, + CBAR_ATTACK1MISS, + CBAR_ATTACK2MISS, + CBAR_ATTACK2HIT, + CBAR_ATTACK3MISS, + CBAR_ATTACK3HIT +}; + +void +w_crowbar_precache(void) +{ + precache_sound("weapons/cbar_miss1.wav"); + precache_sound("weapons/cbar_hit1.wav"); + precache_sound("weapons/cbar_hit2.wav"); + precache_sound("weapons/cbar_hitbod1.wav"); + precache_sound("weapons/cbar_hitbod2.wav"); + precache_sound("weapons/cbar_hitbod3.wav"); + precache_model("models/v_tfc_crowbar.mdl"); + precache_model("models/w_crowbar.mdl"); + precache_model("models/p_crowbar.mdl"); +} + +void +w_crowbar_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_crowbar_wmodel(void) +{ + return "models/w_crowbar.mdl"; +} +string +w_crowbar_pmodel(void) +{ + return "models/p_crowbar.mdl"; +} + +string +w_crowbar_deathmsg(void) +{ + return "%s was assaulted by %s's Crowbar."; +} + +void +w_crowbar_draw(void) +{ + Weapons_SetModel("models/v_tfc_crowbar.mdl"); + Weapons_ViewAnimation(CBAR_DRAW); +} + +void +w_crowbar_holster(void) +{ + Weapons_ViewAnimation(CBAR_HOLSTER); +} + +void +w_crowbar_primary(void) +{ + int anim = 0; + vector src; + player pl = (player)self; + + if (pl.w_attack_next) { + return; + } + + Weapons_MakeVectors(); + src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 32), FALSE, pl); + + int r = (float)input_sequence % 3; + switch (r) { + case 0: + anim = trace_fraction >= 1 ? CBAR_ATTACK1MISS:CBAR_ATTACK1HIT; + break; + case 1: + anim = trace_fraction >= 1 ? CBAR_ATTACK2MISS:CBAR_ATTACK2HIT; + break; + default: + anim = trace_fraction >= 1 ? CBAR_ATTACK3MISS:CBAR_ATTACK3HIT; + } + Weapons_ViewAnimation(anim); + + if (trace_fraction >= 1.0) { + pl.w_attack_next = 0.5f; + } else { + pl.w_attack_next = 0.25f; + } + + pl.w_idle_next = 2.5f; + +#ifdef SERVER + if (pl.flags & FL_CROUCHING) { + Animation_PlayerTopTemp(ANIM_SHOOTCROWBAR, 0.5f); + } else { + Animation_PlayerTopTemp(ANIM_CR_SHOOTCROWBAR, 0.42f); + } + + sound(pl, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM); + + if (trace_fraction >= 1.0) { + return; + } + + /* don't bother with decals, we got squibs */ + if (trace_ent.iBleeds) { + FX_Blood(trace_endpos, [1,0,0]); + } else { + FX_Impact(IMPACT_MELEE, trace_endpos, trace_plane_normal); + } + + if (trace_ent.takedamage) { + Damage_Apply(trace_ent, self, 10, WEAPON_CROWBAR, DMG_BLUNT); + + if (!trace_ent.iBleeds) { + return; + } + + if (random() < 0.33) { + sound(pl, 8, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); + } else if (random() < 0.66) { + sound(pl, 8, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); + } else { + sound(pl, 8, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); + } + } else { + if (random() < 0.5) { + sound(pl, 8, "weapons/cbar_hit1.wav", 1, ATTN_NORM); + } else { + sound(pl, 8, "weapons/cbar_hit2.wav", 1, ATTN_NORM); + } + } +#endif +} + +void +w_crowbar_release(void) +{ + player pl = (player)self; + + if (pl.w_idle_next) { + return; + } + + Weapons_ViewAnimation(CBAR_IDLE); + pl.w_idle_next = 15.0f; +} + +float +w_crowbar_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_crowbar_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_crowbar = +{ + .name = "crowbar", + .id = ITEM_CROWBAR, + .slot = 0, + .slot_pos = 0, + .draw = w_crowbar_draw, + .holster = w_crowbar_holster, + .primary = w_crowbar_primary, + .secondary = __NULL__, + .reload = __NULL__, + .release = w_crowbar_release, + .crosshair = __NULL__, + .precache = w_crowbar_precache, + .pickup = __NULL__, + .updateammo = w_crowbar_updateammo, + .wmodel = w_crowbar_wmodel, + .pmodel = w_crowbar_pmodel, + .deathmsg = w_crowbar_deathmsg, + .aimanim = w_crowbar_aimanim, + .hudpic = w_crowbar_hudpic +}; diff --git a/src/shared/w_dbs.qc b/src/shared/w_dbs.qc new file mode 100644 index 0000000..3919075 --- /dev/null +++ b/src/shared/w_dbs.qc @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +enum +{ + DBS_IDLE1, + DBS_FIRE1, + DBS_FIRE2, + DBS_ADDSHELL, + DBS_PUMP, + DBS_START_RELOAD, + DBS_DRAW, + DBS_HOLSTER, + DBS_IDLE2, + DBS_IDLE3 +}; + +enum +{ + DBS_IDLE, + DBS_RELOAD_START, + DBS_RELOAD, + DBS_RELOAD_END +}; + +void +w_dbs_precache(void) +{ + precache_model("models/v_tfc_shotgun.mdl"); + precache_model("models/w_shot2.mdl"); + precache_model("models/p_shot2.mdl"); + precache_sound("weapons/sbarrel1.wav"); + precache_sound("weapons/dbarrel1.wav"); + precache_sound("weapons/reload3.wav"); + precache_sound("weapons/scock1.wav"); +} + +void +w_dbs_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, __NULL__); +#endif +} +string w_dbs_wmodel(void) +{ + return "models/w_shot2.mdl"; +} +string w_dbs_pmodel(void) +{ + return "models/p_shot2.mdl"; +} +string w_dbs_deathmsg(void) +{ + return ""; +} + +int +w_dbs_pickup(int new, int startammo) +{ +#ifdef SERVER + player pl = (player)self; + pl.shotgun_mag = bound(0, pl.shotgun_mag + 8, 8); +#endif + return TRUE; +} + +void +w_dbs_draw(void) +{ + Weapons_SetModel("models/v_tfc_shotgun.mdl"); + Weapons_ViewAnimation(DBS_DRAW); +#ifdef SERVER + player pl = (player)self; + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, __NULL__); +#endif +} + +void +w_dbs_holster(void) +{ + Weapons_ViewAnimation(DBS_HOLSTER); +} + +void +w_dbs_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next) { + return; + } + + if (pl.a_ammo3 > DBS_IDLE) { + return; + } + + /* Ammo check */ +#ifdef SERVER + if (pl.shotgun_mag <= 0) { + return; + } +#else + if (pl.a_ammo1 <= 0) { + return; + } +#endif + +#ifdef SERVER + TraceAttack_FireBullets(4, pl.origin + pl.view_ofs, 14, [0.17365,0.04362], WEAPON_DBS); + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/sbarrel1.wav", 1, ATTN_NORM); + pl.shotgun_mag--; + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, __NULL__); +#else + View_SetMuzzleflash(MUZZLE_WEIRD); + Weapons_ViewPunchAngle([-5,0,0]); + pl.a_ammo1--; +#endif + Weapons_ViewAnimation(DBS_FIRE1); + + pl.w_attack_next = 0.75; + pl.w_idle_next = 2.5f; +} + +void +w_dbs_reload(void) +{ + player pl = (player)self; +#ifdef CLIENT + if (pl.a_ammo1 >= 8) { + return; + } + if (pl.a_ammo2 <= 0) { + return; + } +#else + if (pl.shotgun_mag >= 8) { + return; + } + if (pl.ammo_shells <= 0) { + return; + } +#endif + + if (pl.a_ammo3 > DBS_IDLE) { + return; + } + pl.a_ammo3 = DBS_RELOAD_START; + pl.w_idle_next = 0.0f; +} + +void +w_dbs_release(void) +{ + player pl = (player)self; + + if (pl.w_idle_next > 0.0) { + return; + } + + if (pl.a_ammo3 == DBS_IDLE) { + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(DBS_IDLE1); + break; + case 1: + Weapons_ViewAnimation(DBS_IDLE2); + break; + case 2: + Weapons_ViewAnimation(DBS_IDLE3); + break; + } + pl.w_idle_next = 15.0f; + } else if (pl.a_ammo3 == DBS_RELOAD_START) { + Weapons_ViewAnimation(DBS_START_RELOAD); + pl.a_ammo3 = DBS_RELOAD; + pl.w_idle_next = 0.65f; + } else if (pl.a_ammo3 == DBS_RELOAD) { + Weapons_ViewAnimation(DBS_ADDSHELL); +#ifdef CLIENT + pl.a_ammo1++; + pl.a_ammo2--; + + if (pl.a_ammo2 <= 0 || pl.a_ammo1 >= 8) { + pl.a_ammo3 = DBS_RELOAD_END; + } +#else + pl.shotgun_mag++; + pl.ammo_shells--; + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, pl.a_ammo3); + sound(pl, CHAN_WEAPON, "weapons/reload3.wav", 1.0, ATTN_NORM); + if (pl.ammo_shells <= 0 || pl.shotgun_mag >= 8) { + pl.a_ammo3 = DBS_RELOAD_END; + } +#endif + pl.w_idle_next = 0.5f; + } else if (pl.a_ammo3 == DBS_RELOAD_END) { + Weapons_ViewAnimation(DBS_PUMP); +#ifdef SERVER + sound(pl, CHAN_WEAPON, "weapons/scock1.wav", 1.0, ATTN_NORM); +#endif + pl.a_ammo3 = DBS_IDLE; + pl.w_idle_next = 10.0f; + pl.w_attack_next = 0.5f; + } +} +void +w_dbs_crosshair(void) +{ +#ifdef CLIENT + static vector cross_pos; + cross_pos = (g_hudres / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [48/128,24/128], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,72/128], [24/256, 24/128], g_hud_color, pSeat->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); +#endif +} + +float +w_dbs_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMSHOTGUN : ANIM_AIMSHOTGUN; +} + +void +w_dbs_hudpic(int s, vector pos, float a) +{ +#ifdef CLIENT + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud4.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud1.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_dbs = +{ + .name = "sbs", + .id = ITEM_DBS, + .slot = 2, + .slot_pos = 1, + .draw = w_dbs_draw, + .holster = w_dbs_holster, + .primary = w_dbs_primary, + .secondary = w_dbs_release, + .reload = w_dbs_reload, + .release = w_dbs_release, + .crosshair = w_dbs_crosshair, + .precache = w_dbs_precache, + .pickup = w_dbs_pickup, + .updateammo = w_dbs_updateammo, + .wmodel = w_dbs_wmodel, + .pmodel = w_dbs_pmodel, + .deathmsg = w_dbs_deathmsg, + .aimanim = w_dbs_aimanim, + .hudpic = w_dbs_hudpic +}; diff --git a/src/shared/w_flamer.qc b/src/shared/w_flamer.qc new file mode 100644 index 0000000..52ab5ab --- /dev/null +++ b/src/shared/w_flamer.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_flamer_precache(void) +{ + precache_model("models/v_flame.mdl"); + precache_model("models/w_flamer.mdl"); + precache_model("models/p_flamer.mdl"); +} + +void +w_flamer_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_flamer_wmodel(void) +{ + return "models/w_flamer.mdl"; +} +string +w_flamer_pmodel(void) +{ + return "models/p_flamer.mdl"; +} + +string +w_flamer_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_flamer_draw(void) +{ + Weapons_SetModel("models/v_flame.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_flamer_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_flamer_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_flamer = +{ + .name = "flamer", + .id = ITEM_FLAMER, + .slot = 3, + .slot_pos = 3, + .draw = w_flamer_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_flamer_precache, + .pickup = __NULL__, + .updateammo = w_flamer_updateammo, + .wmodel = w_flamer_wmodel, + .pmodel = w_flamer_pmodel, + .deathmsg = w_flamer_deathmsg, + .aimanim = w_flamer_aimanim, + .hudpic = w_flamer_hudpic +}; diff --git a/src/shared/w_glauncher.qc b/src/shared/w_glauncher.qc new file mode 100644 index 0000000..51281d5 --- /dev/null +++ b/src/shared/w_glauncher.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_glauncher_precache(void) +{ + precache_model("models/v_tfgl.mdl"); + precache_model("models/w_glauncher.mdl"); + precache_model("models/p_glauncher.mdl"); +} + +void +w_glauncher_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_glauncher_wmodel(void) +{ + return "models/w_glauncher.mdl"; +} +string +w_glauncher_pmodel(void) +{ + return "models/p_glauncher.mdl"; +} + +string +w_glauncher_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_glauncher_draw(void) +{ + Weapons_SetModel("models/v_tfgl.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_glauncher_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_glauncher_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud02.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud01.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_glauncher = +{ + .name = "glauncher", + .id = ITEM_GLAUNCHER, + .slot = 3, + .slot_pos = 1, + .draw = w_glauncher_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_glauncher_precache, + .pickup = __NULL__, + .updateammo = w_glauncher_updateammo, + .wmodel = w_glauncher_wmodel, + .pmodel = w_glauncher_pmodel, + .deathmsg = w_glauncher_deathmsg, + .aimanim = w_glauncher_aimanim, + .hudpic = w_glauncher_hudpic +}; diff --git a/src/shared/w_grapple.qc b/src/shared/w_grapple.qc new file mode 100644 index 0000000..d41f920 --- /dev/null +++ b/src/shared/w_grapple.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_grapple_precache(void) +{ + precache_model("models/v_grapple.mdl"); + precache_model("models/w_grapple.mdl"); + precache_model("models/p_grapple.mdl"); +} + +void +w_grapple_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_grapple_wmodel(void) +{ + return "models/w_grapple.mdl"; +} +string +w_grapple_pmodel(void) +{ + return "models/p_grapple.mdl"; +} + +string +w_grapple_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_grapple_draw(void) +{ + Weapons_SetModel("models/v_grapple.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_grapple_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_grapple_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_grapple = +{ + .name = "grapple", + .id = ITEM_GRAPPLE, + .slot = 5, + .slot_pos = 0, + .draw = w_grapple_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_grapple_precache, + .pickup = __NULL__, + .updateammo = w_grapple_updateammo, + .wmodel = w_grapple_wmodel, + .pmodel = w_grapple_pmodel, + .deathmsg = w_grapple_deathmsg, + .aimanim = w_grapple_aimanim, + .hudpic = w_grapple_hudpic +}; diff --git a/src/shared/w_incendiary.qc b/src/shared/w_incendiary.qc new file mode 100644 index 0000000..d3d24b1 --- /dev/null +++ b/src/shared/w_incendiary.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_incendiary_precache(void) +{ + precache_model("models/v_tfc_rpg.mdl"); + precache_model("models/w_incendiary.mdl"); + precache_model("models/p_incendiary.mdl"); +} + +void +w_incendiary_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_incendiary_wmodel(void) +{ + return "models/w_incendiary.mdl"; +} +string +w_incendiary_pmodel(void) +{ + return "models/p_incendiary.mdl"; +} + +string +w_incendiary_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_incendiary_draw(void) +{ + Weapons_SetModel("models/v_tfc_rpg.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_incendiary_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_incendiary_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud05.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud06.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_incendiary = +{ + .name = "incendiary", + .id = ITEM_INCENDIARY, + .slot = 4, + .slot_pos = 3, + .draw = w_incendiary_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_incendiary_precache, + .pickup = __NULL__, + .updateammo = w_incendiary_updateammo, + .wmodel = w_incendiary_wmodel, + .pmodel = w_incendiary_pmodel, + .deathmsg = w_incendiary_deathmsg, + .aimanim = w_incendiary_aimanim, + .hudpic = w_incendiary_hudpic +}; diff --git a/src/shared/w_knife.qc b/src/shared/w_knife.qc new file mode 100644 index 0000000..2020968 --- /dev/null +++ b/src/shared/w_knife.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_knife_precache(void) +{ + precache_model("models/v_tfc_knife.mdl"); + precache_model("models/w_knife.mdl"); + precache_model("models/p_knife.mdl"); +} + +void +w_knife_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_knife_wmodel(void) +{ + return "models/w_knife.mdl"; +} +string +w_knife_pmodel(void) +{ + return "models/p_knife.mdl"; +} + +string +w_knife_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_knife_draw(void) +{ + Weapons_SetModel("models/v_tfc_knife.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_knife_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_knife_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud04.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud03.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_knife = +{ + .name = "knife", + .id = ITEM_KNIFE, + .slot = 0, + .slot_pos = 2, + .draw = w_knife_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_knife_precache, + .pickup = __NULL__, + .updateammo = w_knife_updateammo, + .wmodel = w_knife_wmodel, + .pmodel = w_knife_pmodel, + .deathmsg = w_knife_deathmsg, + .aimanim = w_knife_aimanim, + .hudpic = w_knife_hudpic +}; diff --git a/src/shared/w_medkit.qc b/src/shared/w_medkit.qc new file mode 100644 index 0000000..71962d9 --- /dev/null +++ b/src/shared/w_medkit.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_medkit_precache(void) +{ + precache_model("models/v_tfc_medkit.mdl"); + precache_model("models/w_medkit.mdl"); + precache_model("models/p_medkit.mdl"); +} + +void +w_medkit_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_medkit_wmodel(void) +{ + return "models/w_medkit.mdl"; +} +string +w_medkit_pmodel(void) +{ + return "models/p_medkit.mdl"; +} + +string +w_medkit_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_medkit_draw(void) +{ + Weapons_SetModel("models/v_tfc_medkit.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_medkit_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_medkit_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud05.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud06.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_medkit = +{ + .name = "medkit", + .id = ITEM_MEDKIT, + .slot = 0, + .slot_pos = 1, + .draw = w_medkit_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_medkit_precache, + .pickup = __NULL__, + .updateammo = w_medkit_updateammo, + .wmodel = w_medkit_wmodel, + .pmodel = w_medkit_pmodel, + .deathmsg = w_medkit_deathmsg, + .aimanim = w_medkit_aimanim, + .hudpic = w_medkit_hudpic +}; diff --git a/src/shared/w_nailgun.qc b/src/shared/w_nailgun.qc new file mode 100644 index 0000000..7de2cac --- /dev/null +++ b/src/shared/w_nailgun.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_nailgun_precache(void) +{ + precache_model("models/v_tfc_nailgun.mdl"); + precache_model("models/w_nailgun.mdl"); + precache_model("models/p_nailgun.mdl"); +} + +void +w_nailgun_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_nailgun_wmodel(void) +{ + return "models/w_nailgun.mdl"; +} +string +w_nailgun_pmodel(void) +{ + return "models/p_nailgun.mdl"; +} + +string +w_nailgun_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_nailgun_draw(void) +{ + Weapons_SetModel("models/v_tfc_nailgun.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_nailgun_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_nailgun_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_nailgun = +{ + .name = "nailgun", + .id = ITEM_NAILGUN, + .slot = 3, + .slot_pos = 0, + .draw = w_nailgun_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_nailgun_precache, + .pickup = __NULL__, + .updateammo = w_nailgun_updateammo, + .wmodel = w_nailgun_wmodel, + .pmodel = w_nailgun_pmodel, + .deathmsg = w_nailgun_deathmsg, + .aimanim = w_nailgun_aimanim, + .hudpic = w_nailgun_hudpic +}; diff --git a/src/shared/w_pipebomb.qc b/src/shared/w_pipebomb.qc new file mode 100644 index 0000000..1b4ef0b --- /dev/null +++ b/src/shared/w_pipebomb.qc @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_pipebomb_precache(void) +{ + precache_model("models/v_tfgl.mdl"); + precache_model("models/w_pipebomb.mdl"); + precache_model("models/p_pipebomb.mdl"); +} + +void +w_pipebomb_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_pipebomb_wmodel(void) +{ + return "models/w_pipebomb.mdl"; +} + +string +w_pipebomb_pmodel(void) +{ + return "models/p_pipebomb.mdl"; +} + +string +w_pipebomb_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_pipebomb_draw(void) +{ + Weapons_SetModel("models/v_tfgl.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_pipebomb_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_pipebomb_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud02.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud01.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_pipebomb = +{ + .name = "pipebomb", + .id = ITEM_PIPEBOMB, + .slot = 4, + .slot_pos = 1, + .draw = w_pipebomb_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_pipebomb_precache, + .pickup = __NULL__, + .updateammo = w_pipebomb_updateammo, + .wmodel = w_pipebomb_wmodel, + .pmodel = w_pipebomb_pmodel, + .deathmsg = w_pipebomb_deathmsg, + .aimanim = w_pipebomb_aimanim, + .hudpic = w_pipebomb_hudpic +}; diff --git a/src/shared/w_railgun.qc b/src/shared/w_railgun.qc new file mode 100644 index 0000000..f2d18e3 --- /dev/null +++ b/src/shared/w_railgun.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_railgun_precache(void) +{ + precache_model("models/v_tfc_railgun.mdl"); + precache_model("models/w_railgun.mdl"); + precache_model("models/p_railgun.mdl"); +} + +void +w_railgun_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_railgun_wmodel(void) +{ + return "models/w_railgun.mdl"; +} +string +w_railgun_pmodel(void) +{ + return "models/p_railgun.mdl"; +} + +string +w_railgun_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_railgun_draw(void) +{ + Weapons_SetModel("models/v_tfc_railgun.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_railgun_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_railgun_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_railgun = +{ + .name = "railgun", + .id = ITEM_RAILGUN, + .slot = 1, + .slot_pos = 3, + .draw = w_railgun_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_railgun_precache, + .pickup = __NULL__, + .updateammo = w_railgun_updateammo, + .wmodel = w_railgun_wmodel, + .pmodel = w_railgun_pmodel, + .deathmsg = w_railgun_deathmsg, + .aimanim = w_railgun_aimanim, + .hudpic = w_railgun_hudpic +}; diff --git a/src/shared/w_rpg.qc b/src/shared/w_rpg.qc new file mode 100644 index 0000000..8b1712f --- /dev/null +++ b/src/shared/w_rpg.qc @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_rpg_precache(void) +{ + precache_model("models/v_tfc_rpg.mdl"); + precache_model("models/w_rpg.mdl"); + precache_model("models/p_rpg.mdl"); +} + +void +w_rpg_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_rpg_wmodel(void) +{ + return "models/w_rpg.mdl"; +} +string +w_rpg_pmodel(void) +{ + return "models/p_rpg.mdl"; +} + +string +w_rpg_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_rpg_draw(void) +{ + Weapons_SetModel("models/v_tfc_rpg.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_rpg_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_rpg_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic(pos, [170,45], "sprites/640hud5.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud2.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_rpg = +{ + .name = "rpg", + .id = ITEM_RPG, + .slot = 4, + .slot_pos = 0, + .draw = w_rpg_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_rpg_precache, + .pickup = __NULL__, + .updateammo = w_rpg_updateammo, + .wmodel = w_rpg_wmodel, + .pmodel = w_rpg_pmodel, + .deathmsg = w_rpg_deathmsg, + .aimanim = w_rpg_aimanim, + .hudpic = w_rpg_hudpic +}; diff --git a/src/shared/w_sbs.qc b/src/shared/w_sbs.qc new file mode 100644 index 0000000..85fac6e --- /dev/null +++ b/src/shared/w_sbs.qc @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +enum +{ + SBS_IDLE1, + SBS_FIRE1, + SBS_FIRE2, + SBS_ADDSHELL, + SBS_PUMP, + SBS_START_RELOAD, + SBS_DRAW, + SBS_HOLSTER, + SBS_IDLE2, + SBS_IDLE3 +}; + +enum +{ + SBS_IDLE, + SBS_RELOAD_START, + SBS_RELOAD, + SBS_RELOAD_END +}; + +void +w_sbs_precache(void) +{ +#ifdef SERVER + Sound_Precache("weapon_sbs.cock"); + Sound_Precache("weapon_sbs.fire"); + Sound_Precache("weapon_sbs.reload"); +#endif + precache_model("models/v_tfc_12gauge.mdl"); + precache_model("models/p_shotgun.mdl"); + precache_sound("weapons/dbarrel1.wav"); +} + +void +w_sbs_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, __NULL__); +#endif +} +string w_sbs_wmodel(void) +{ + return "models/ball.mdl"; +} +string w_sbs_pmodel(void) +{ + return "models/p_shotgun.mdl"; +} +string w_sbs_deathmsg(void) +{ + return ""; +} + +int +w_sbs_pickup(int new, int startammo) +{ +#ifdef SERVER + player pl = (player)self; + pl.shotgun_mag = bound(0, pl.shotgun_mag + 8, 8); +#endif + return TRUE; +} + +void +w_sbs_draw(void) +{ + Weapons_SetModel("models/v_tfc_12gauge.mdl"); + Weapons_ViewAnimation(SBS_DRAW); +#ifdef SERVER + player pl = (player)self; + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, __NULL__); +#endif +} + +void +w_sbs_holster(void) +{ + Weapons_ViewAnimation(SBS_HOLSTER); +} + +void +w_sbs_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next) { + return; + } + + if (pl.a_ammo3 > SBS_IDLE) { + return; + } + + /* Ammo check */ +#ifdef SERVER + if (pl.shotgun_mag <= 0) { + return; + } +#else + if (pl.a_ammo1 <= 0) { + return; + } +#endif + +#ifdef SERVER + TraceAttack_FireBullets(4, pl.origin + pl.view_ofs, 6, [0.17365,0.04362], WEAPON_SBS); + Sound_Play(pl, CHAN_WEAPON, "weapon_sbs.fire"); + pl.shotgun_mag--; + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, __NULL__); +#else + View_SetMuzzleflash(MUZZLE_WEIRD); + Weapons_ViewPunchAngle([-5,0,0]); + pl.a_ammo1--; +#endif + Weapons_ViewAnimation(SBS_FIRE1); + + pl.w_attack_next = 0.75; + pl.w_idle_next = 2.5f; +} + +void +w_sbs_reload(void) +{ + player pl = (player)self; +#ifdef CLIENT + if (pl.a_ammo1 >= 8) { + return; + } + if (pl.a_ammo2 <= 0) { + return; + } +#else + if (pl.shotgun_mag >= 8) { + return; + } + if (pl.ammo_shells <= 0) { + return; + } +#endif + + if (pl.a_ammo3 > SBS_IDLE) { + return; + } + pl.a_ammo3 = SBS_RELOAD_START; + pl.w_idle_next = 0.0f; +} + +void +w_sbs_release(void) +{ + player pl = (player)self; + + if (pl.w_idle_next > 0.0) { + return; + } + + if (pl.a_ammo3 == SBS_IDLE) { + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(SBS_IDLE1); + break; + case 1: + Weapons_ViewAnimation(SBS_IDLE2); + break; + case 2: + Weapons_ViewAnimation(SBS_IDLE3); + break; + } + pl.w_idle_next = 15.0f; + } else if (pl.a_ammo3 == SBS_RELOAD_START) { + Weapons_ViewAnimation(SBS_START_RELOAD); + pl.a_ammo3 = SBS_RELOAD; + pl.w_idle_next = 0.65f; + } else if (pl.a_ammo3 == SBS_RELOAD) { + Weapons_ViewAnimation(SBS_ADDSHELL); +#ifdef CLIENT + pl.a_ammo1++; + pl.a_ammo2--; + + if (pl.a_ammo2 <= 0 || pl.a_ammo1 >= 8) { + pl.a_ammo3 = SBS_RELOAD_END; + } +#else + pl.shotgun_mag++; + pl.ammo_shells--; + Weapons_UpdateAmmo(pl, pl.shotgun_mag, pl.ammo_shells, pl.a_ammo3); + Sound_Play(pl, CHAN_WEAPON, "weapon_sbs.reload"); + if (pl.ammo_shells <= 0 || pl.shotgun_mag >= 8) { + pl.a_ammo3 = SBS_RELOAD_END; + } +#endif + pl.w_idle_next = 0.5f; + } else if (pl.a_ammo3 == SBS_RELOAD_END) { + Weapons_ViewAnimation(SBS_PUMP); +#ifdef SERVER + Sound_Play(pl, CHAN_WEAPON, "weapon_sbs.cock"); +#endif + pl.a_ammo3 = SBS_IDLE; + pl.w_idle_next = 10.0f; + pl.w_attack_next = 0.5f; + } +} +void +w_sbs_crosshair(void) +{ +#ifdef CLIENT + static vector cross_pos; + cross_pos = (g_hudres / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [48/128,24/128], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,72/128], [24/256, 24/128], g_hud_color, pSeat->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); +#endif +} + +float +w_sbs_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMSHOTGUN : ANIM_AIMSHOTGUN; +} + +void +w_sbs_hudpic(int s, vector pos, float a) +{ +#ifdef CLIENT + if (s) { + drawsubpic(pos, [170,45], "sprites/tfchud02.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/tfchud01.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_sbs = +{ + .name = "sbs", + .id = ITEM_SBS, + .slot = 1, + .slot_pos = 0, + .draw = w_sbs_draw, + .holster = w_sbs_holster, + .primary = w_sbs_primary, + .secondary = w_sbs_release, + .reload = w_sbs_reload, + .release = w_sbs_release, + .crosshair = w_sbs_crosshair, + .precache = w_sbs_precache, + .pickup = w_sbs_pickup, + .updateammo = w_sbs_updateammo, + .wmodel = w_sbs_wmodel, + .pmodel = w_sbs_pmodel, + .deathmsg = w_sbs_deathmsg, + .aimanim = w_sbs_aimanim, + .hudpic = w_sbs_hudpic +}; diff --git a/src/shared/w_sniper.qc b/src/shared/w_sniper.qc new file mode 100644 index 0000000..1873ae7 --- /dev/null +++ b/src/shared/w_sniper.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_sniper_precache(void) +{ + precache_model("models/v_tfc_sniper.mdl"); + precache_model("models/w_sniper.mdl"); + precache_model("models/p_sniper.mdl"); +} + +void +w_sniper_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_sniper_wmodel(void) +{ + return "models/w_sniper.mdl"; +} +string +w_sniper_pmodel(void) +{ + return "models/p_sniper.mdl"; +} + +string +w_sniper_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_sniper_draw(void) +{ + Weapons_SetModel("models/v_tfc_sniper.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_sniper_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_sniper_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud02.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud01.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_sniper = +{ + .name = "sniper", + .id = ITEM_SNIPER, + .slot = 1, + .slot_pos = 1, + .draw = w_sniper_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_sniper_precache, + .pickup = __NULL__, + .updateammo = w_sniper_updateammo, + .wmodel = w_sniper_wmodel, + .pmodel = w_sniper_pmodel, + .deathmsg = w_sniper_deathmsg, + .aimanim = w_sniper_aimanim, + .hudpic = w_sniper_hudpic +}; diff --git a/src/shared/w_supernail.qc b/src/shared/w_supernail.qc new file mode 100644 index 0000000..e6ec5b5 --- /dev/null +++ b/src/shared/w_supernail.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_supernail_precache(void) +{ + precache_model("models/v_tfc_supernailgun.mdl"); + precache_model("models/w_supernail.mdl"); + precache_model("models/p_supernail.mdl"); +} + +void +w_supernail_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_supernail_wmodel(void) +{ + return "models/w_supernail.mdl"; +} +string +w_supernail_pmodel(void) +{ + return "models/p_supernail.mdl"; +} + +string +w_supernail_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_supernail_draw(void) +{ + Weapons_SetModel("models/v_tfc_supernailgun.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_supernail_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_supernail_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud07.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_supernail = +{ + .name = "supernail", + .id = ITEM_SUPERNAIL, + .slot = 3, + .slot_pos = 2, + .draw = w_supernail_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_supernail_precache, + .pickup = __NULL__, + .updateammo = w_supernail_updateammo, + .wmodel = w_supernail_wmodel, + .pmodel = w_supernail_pmodel, + .deathmsg = w_supernail_deathmsg, + .aimanim = w_supernail_aimanim, + .hudpic = w_supernail_hudpic +}; diff --git a/src/shared/w_tranquil.qc b/src/shared/w_tranquil.qc new file mode 100644 index 0000000..01fee11 --- /dev/null +++ b/src/shared/w_tranquil.qc @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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_tranquil_precache(void) +{ + precache_model("models/v_tfc_pistol.mdl"); + precache_model("models/w_tranquil.mdl"); + precache_model("models/p_tranquil.mdl"); +} + +void +w_tranquil_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_tranquil_wmodel(void) +{ + return "models/w_tranquil.mdl"; +} +string +w_tranquil_pmodel(void) +{ + return "models/p_tranquil.mdl"; +} + +string +w_tranquil_deathmsg(void) +{ + return "%s was assaulted by %s's Assault Cannon."; +} + +void +w_tranquil_draw(void) +{ + Weapons_SetModel("models/v_tfc_pistol.mdl"); + Weapons_ViewAnimation(0); +} + +float +w_tranquil_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_tranquil_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud05.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud06.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_tranquil = +{ + .name = "tranquil", + .id = ITEM_TRANQUIL, + .slot = 1, + .slot_pos = 2, + .draw = w_tranquil_draw, + .holster = __NULL__, + .primary = __NULL__, + .secondary = __NULL__, + .reload = __NULL__, + .release = __NULL__, + .crosshair = __NULL__, + .precache = w_tranquil_precache, + .pickup = __NULL__, + .updateammo = w_tranquil_updateammo, + .wmodel = w_tranquil_wmodel, + .pmodel = w_tranquil_pmodel, + .deathmsg = w_tranquil_deathmsg, + .aimanim = w_tranquil_aimanim, + .hudpic = w_tranquil_hudpic +}; diff --git a/src/shared/w_umbrella.qc b/src/shared/w_umbrella.qc new file mode 100644 index 0000000..17b5fbc --- /dev/null +++ b/src/shared/w_umbrella.qc @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +/* stat wise is this the same as the crowbar, but we might tweak it, so it's a + * seperate weapon entry. who knows what modders/servers come up with, too */ + +enum +{ + UMBRELLA_IDLE, + UMBRELLA_DRAW, + UMBRELLA_HOLSTER, + UMBRELLA_ATTACK1HIT, + UMBRELLA_ATTACK1MISS, + UMBRELLA_ATTACK2MISS, + UMBRELLA_ATTACK2HIT, + UMBRELLA_ATTACK3MISS, + UMBRELLA_ATTACK3HIT +}; + +void +w_umbrella_precache(void) +{ + precache_sound("weapons/cbar_miss1.wav"); + precache_sound("weapons/cbar_hit1.wav"); + precache_sound("weapons/cbar_hit2.wav"); + precache_sound("weapons/cbar_hitbod1.wav"); + precache_sound("weapons/cbar_hitbod2.wav"); + precache_sound("weapons/cbar_hitbod3.wav"); + precache_model("models/v_umbrella.mdl"); + precache_model("models/w_umbrella.mdl"); + precache_model("models/p_umbrella.mdl"); +} + +void +w_umbrella_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_umbrella_wmodel(void) +{ + return "models/w_umbrella.mdl"; +} +string +w_umbrella_pmodel(void) +{ + return "models/p_umbrella.mdl"; +} + +string +w_umbrella_deathmsg(void) +{ + return "%s was assaulted by %s's Umbrella."; +} + +void +w_umbrella_draw(void) +{ + Weapons_SetModel("models/v_umbrella.mdl"); + Weapons_ViewAnimation(UMBRELLA_DRAW); +} + +void +w_umbrella_holster(void) +{ + Weapons_ViewAnimation(UMBRELLA_HOLSTER); +} + +void +w_umbrella_primary(void) +{ + int anim = 0; + vector src; + player pl = (player)self; + + if (pl.w_attack_next) { + return; + } + + Weapons_MakeVectors(); + src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 32), FALSE, pl); + + int r = (float)input_sequence % 3; + switch (r) { + case 0: + anim = trace_fraction >= 1 ? UMBRELLA_ATTACK1MISS:UMBRELLA_ATTACK1HIT; + break; + case 1: + anim = trace_fraction >= 1 ? UMBRELLA_ATTACK2MISS:UMBRELLA_ATTACK2HIT; + break; + default: + anim = trace_fraction >= 1 ? UMBRELLA_ATTACK3MISS:UMBRELLA_ATTACK3HIT; + } + Weapons_ViewAnimation(anim); + + if (trace_fraction >= 1.0) { + pl.w_attack_next = 0.5f; + } else { + pl.w_attack_next = 0.25f; + } + + pl.w_idle_next = 2.5f; + +#ifdef SERVER + if (pl.flags & FL_CROUCHING) { + Animation_PlayerTopTemp(ANIM_SHOOTCROWBAR, 0.5f); + } else { + Animation_PlayerTopTemp(ANIM_CR_SHOOTCROWBAR, 0.42f); + } + + sound(pl, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM); + + if (trace_fraction >= 1.0) { + return; + } + + /* don't bother with decals, we got squibs */ + if (trace_ent.iBleeds) { + FX_Blood(trace_endpos, [1,0,0]); + } else { + FX_Impact(IMPACT_MELEE, trace_endpos, trace_plane_normal); + } + + if (trace_ent.takedamage) { + Damage_Apply(trace_ent, self, 10, WEAPON_UMBRELLA, DMG_BLUNT); + + if (!trace_ent.iBleeds) { + return; + } + + if (random() < 0.33) { + sound(pl, 8, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); + } else if (random() < 0.66) { + sound(pl, 8, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); + } else { + sound(pl, 8, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); + } + } else { + if (random() < 0.5) { + sound(pl, 8, "weapons/cbar_hit1.wav", 1, ATTN_NORM); + } else { + sound(pl, 8, "weapons/cbar_hit2.wav", 1, ATTN_NORM); + } + } +#endif +} + +void +w_umbrella_release(void) +{ + player pl = (player)self; + + if (pl.w_idle_next) { + return; + } + + Weapons_ViewAnimation(UMBRELLA_IDLE); + pl.w_idle_next = 15.0f; +} + +float +w_umbrella_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_umbrella_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_umbrella = +{ + .name = "umbrella", + .id = ITEM_UMBRELLA, + .slot = 0, + .slot_pos = 4, + .draw = w_umbrella_draw, + .holster = w_umbrella_holster, + .primary = w_umbrella_primary, + .secondary = __NULL__, + .reload = __NULL__, + .release = w_umbrella_release, + .crosshair = __NULL__, + .precache = w_umbrella_precache, + .pickup = __NULL__, + .updateammo = w_umbrella_updateammo, + .wmodel = w_umbrella_wmodel, + .pmodel = w_umbrella_pmodel, + .deathmsg = w_umbrella_deathmsg, + .aimanim = w_umbrella_aimanim, + .hudpic = w_umbrella_hudpic +}; diff --git a/src/shared/w_wrench.qc b/src/shared/w_wrench.qc new file mode 100644 index 0000000..b37c58f --- /dev/null +++ b/src/shared/w_wrench.qc @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +enum +{ + WRENCH_IDLE, + WRENCH_ATTACK1, + WRENCH_ATTACK2, + WRENCH_USE, + WRENCH_DRAW, + WRENCH_HOLSTER +}; + +void +w_wrench_precache(void) +{ + precache_sound("weapons/cbar_miss1.wav"); + precache_sound("weapons/cbar_hit1.wav"); + precache_sound("weapons/cbar_hit2.wav"); + precache_sound("weapons/cbar_hitbod1.wav"); + precache_sound("weapons/cbar_hitbod2.wav"); + precache_sound("weapons/cbar_hitbod3.wav"); + precache_model("models/v_tfc_spanner.mdl"); + precache_model("models/p_spanner.mdl"); +} + +void +w_wrench_updateammo(player pl) +{ +#ifdef SERVER + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +string +w_wrench_wmodel(void) +{ + return "models/ball.mdl"; +} +string +w_wrench_pmodel(void) +{ + return "models/p_spanner.mdl"; +} + +string +w_wrench_deathmsg(void) +{ + return "%s was assaulted by %s's wrench."; +} + +void +w_wrench_draw(void) +{ + Weapons_SetModel("models/v_tfc_spanner.mdl"); + Weapons_ViewAnimation(WRENCH_DRAW); +} + +void +w_wrench_holster(void) +{ + Weapons_ViewAnimation(WRENCH_HOLSTER); +} + +void +w_wrench_primary(void) +{ + int anim = 0; + vector src; + player pl = (player)self; + + if (pl.w_attack_next) { + return; + } + + Weapons_MakeVectors(); + src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 32), FALSE, pl); + + int r = (float)input_sequence % 2; + switch (r) { + case 0: + anim = WRENCH_ATTACK1; + break; + default: + anim = WRENCH_ATTACK2; + } + Weapons_ViewAnimation(anim); + + if (trace_fraction < 1.0) { + pl.w_attack_next = 0.25f; + } else { + pl.w_attack_next = 0.5f; + } + + pl.w_idle_next = 2.5f; + +#ifdef SERVER + if (pl.flags & FL_CROUCHING) { + Animation_PlayerTopTemp(ANIM_SHOOTCROWBAR, 0.5f); + } else { + Animation_PlayerTopTemp(ANIM_CR_SHOOTCROWBAR, 0.42f); + } + + sound(pl, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM); + + if (trace_fraction >= 1.0) { + return; + } + + /* don't bother with decals, we got squibs */ + if (trace_ent.iBleeds) { + FX_Blood(trace_endpos, [1,0,0]); + } else { + FX_Impact(IMPACT_MELEE, trace_endpos, trace_plane_normal); + } + + if (trace_ent.takedamage) { + Damage_Apply(trace_ent, self, 10, WEAPON_WRENCH, DMG_BLUNT); + + if (!trace_ent.iBleeds) { + return; + } + + if (random() < 0.33) { + sound(pl, 8, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); + } else if (random() < 0.66) { + sound(pl, 8, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); + } else { + sound(pl, 8, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); + } + } else { + if (random() < 0.5) { + sound(pl, 8, "weapons/cbar_hit1.wav", 1, ATTN_NORM); + } else { + sound(pl, 8, "weapons/cbar_hit2.wav", 1, ATTN_NORM); + } + } +#endif +} + +void +w_wrench_release(void) +{ + player pl = (player)self; + + if (pl.w_idle_next) { + return; + } + + Weapons_ViewAnimation(WRENCH_IDLE); + pl.w_idle_next = 15.0f; +} + +float +w_wrench_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; +} + +void +w_wrench_hudpic(int selected, vector pos, float a) +{ +#ifdef CLIENT + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/tfchud04.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/tfchud03.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + a, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_wrench = +{ + .name = "wrench", + .id = ITEM_WRENCH, + .slot = 0, + .slot_pos = 3, + .draw = w_wrench_draw, + .holster = w_wrench_holster, + .primary = w_wrench_primary, + .secondary = __NULL__, + .reload = __NULL__, + .release = w_wrench_release, + .crosshair = __NULL__, + .precache = w_wrench_precache, + .pickup = __NULL__, + .updateammo = w_wrench_updateammo, + .wmodel = w_wrench_wmodel, + .pmodel = w_wrench_pmodel, + .deathmsg = w_wrench_deathmsg, + .aimanim = w_wrench_aimanim, + .hudpic = w_wrench_hudpic +}; diff --git a/src/shared/weapons.h b/src/shared/weapons.h new file mode 100644 index 0000000..94312d3 --- /dev/null +++ b/src/shared/weapons.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +/* weapon Indices for the weapon table */ +enum +{ + WEAPON_NONE, + WEAPON_CROWBAR, + WEAPON_MEDKIT, + WEAPON_KNIFE, + WEAPON_WRENCH, + WEAPON_UMBRELLA, + WEAPON_SBS, + WEAPON_SNIPER, + WEAPON_TRANQUIL, + WEAPON_RAILGUN, + WEAPON_AUTORIFLE, + WEAPON_DBS, + WEAPON_NAILGUN, + WEAPON_GLAUNCHER, + WEAPON_SUPERNAIL, + WEAPON_FLAMER, + WEAPON_RPG, + WEAPON_PIPEBOMB, + WEAPON_ASSCAN, + WEAPON_INCENDIARY, + WEAPON_GRAPPLE +}; diff --git a/src/shared/weapons.qc b/src/shared/weapons.qc new file mode 100644 index 0000000..49530e5 --- /dev/null +++ b/src/shared/weapons.qc @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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. + */ + +weapon_t w_null = {}; +weapon_t g_weapons[] = { + w_null, + w_crowbar, + w_medkit, + w_knife, + w_wrench, + w_umbrella, + w_sbs, + w_sniper, + w_tranquil, + w_railgun, + w_autorifle, + w_dbs, + w_nailgun, + w_glauncher, + w_supernail, + w_flamer, + w_rpg, + w_pipebomb, + w_asscan, + w_incendiary, + w_grapple +};