diff --git a/COPYING b/COPYING index 73679b8..8c379e8 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ ISC License -Copyright (c) 2016-2021, Marco "eukara" Hladik +Copyright (c) 2016-2025, Marco "eukara" Cawthorne Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/README.md b/README.md index 875d209..9e0d9df 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # ![](img/te.png) Team Effort + Clean-room reimplementation of Team Fortress Classic in QuakeC. ![Preview 1](img/preview1.jpg) @@ -28,7 +29,7 @@ We've had people ask in the oddest of places for help, please don't do that. ## License ISC License -Copyright (c) 2016-2025 Marco Hladik +Copyright (c) 2016-2025 Marco Cawthorne Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/default_tfc.cfg b/default_tfc.cfg index a1f7eab..fec5e11 100644 --- a/default_tfc.cfg +++ b/default_tfc.cfg @@ -1,2 +1,3 @@ -set "hostname" "FreeTFC Server" +set "hostname" "Team Effort Server" set "maxplayers" "8" +set g_gametype "default" \ No newline at end of file diff --git a/src/Makefile b/src/Makefile index 4bd1c05..c2ba2d8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,5 +2,5 @@ CC=fteqcc all: cd client && $(MAKE) - cd rules && $(MAKE) cd server && $(MAKE) + cd rules && $(MAKE) diff --git a/src/client/progs.src b/src/client/progs.src index 338e480..c5c2665 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -21,8 +21,6 @@ defs.h ../../../src/gs-entbase/shared.src ../shared/include.src -vox.qc - ../../../valve/src/client/damage.qc draw.qc init.qc diff --git a/src/rules/Makefile b/src/rules/Makefile index 325d772..9150b8e 100644 --- a/src/rules/Makefile +++ b/src/rules/Makefile @@ -1,5 +1,5 @@ QCC=fteqcc all: - mkdir -pv ../../zpak001.pk3dir/progs/ + mkdir -pv ../../progs/ $(QCC) $(CFLAGS) -I../../../src/server default.qc diff --git a/src/rules/default.qc b/src/rules/default.qc index f82d92b..be527c7 100644 --- a/src/rules/default.qc +++ b/src/rules/default.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Marco Cawthorne + * Copyright (c) 2024-2025 Marco Cawthorne * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#pragma PROGS_DAT "../../zpak001.pk3dir/progs/default.dat" +#pragma PROGS_DAT "../../progs/default.dat" #include "../../../src/server/api.h" @@ -77,6 +77,14 @@ TF_GoSpectator(entity targetPlayer) game.TeleportToSpawn(targetPlayer); } +void +CodeCallback_Precache(void) +{ + for (int i = 0i; i < g_tfClasses.length; i++) { + precache.Entity(g_tfClasses[i]); + } +} + void CodeCallback_StartGameType(void) { @@ -110,12 +118,12 @@ CodeCallback_PlayerDamage(entity inflictor, entity attacker) } void -CodeCallback_PlayerKilled(entity inflictor, entity attacker, string weapon) +CodeCallback_PlayerKilled(entity playerEntity, entity inflictor, entity attacker, string weapon) { - combat.Obituary(self.netname, attacker.netname, weapon, ""); + combat.Obituary(playerEntity.netname, attacker.netname, weapon, ""); /* death-counter */ - self.deaths++; + playerEntity.deaths++; /* update score-counter */ if (ents.isPlayer(attacker)) { @@ -142,7 +150,7 @@ CodeCallback_ClientCommand(entity targetPlayer, string command) switch (argv(0)) { case "random": - int classID = (int)floor(0, g_tfClasses.length); + int classID = (int)floor(random(0, g_tfClasses.length)); TF_SwitchClass(targetPlayer, classID); break; case "scout": diff --git a/src/server/bot.qc b/src/server/bot.qc deleted file mode 100644 index 2184d7b..0000000 --- a/src/server/bot.qc +++ /dev/null @@ -1,25 +0,0 @@ -class -TFCBot:ncBot -{ - void TFCBot(void); - - //virtual void CreateObjective(void); -}; - -void CSEv_TeamJoin_f(float f); -void CSEv_ClassJoin_f(float f); - -void -TFCBot::TFCBot(void) -{ - CSEv_TeamJoin_f(0); - CSEv_ClassJoin_f(0); -} - -#if 0 -void -TFCBot::CreateObjective(void) -{ - super:: CreateObjective(); -} -#endif \ No newline at end of file diff --git a/src/server/client.qc b/src/server/client.qc deleted file mode 100644 index e73cc2c..0000000 --- a/src/server/client.qc +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2016-2022 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* called every input frame */ -void -Game_RunClientCommand(void) -{ - TFPlayer pl = (TFPlayer)self; - - /* clear map triggers */ - pl.gflags &= ~GF_NOBUILDZONE; - pl.gflags &= ~GF_NOGRENADEZONE; - - pl.Physics_Run(); -} - -/* client cmd overrides happen here */ -void -Game_ParseClientCommand(string cmd) -{ - tokenize(cmd); - - if (argv(1) == "timeleft") { - string msg; - string timestring; - float timeleft; - timeleft = cvar("timelimit") - (time / 60); - timestring = Util_TimeToString(timeleft); - msg = sprintf("we have %s minutes remaining", timestring); - bprint(PRINT_CHAT, msg); - return; - } - - clientcommand(self, cmd); -} diff --git a/src/server/entities.src b/src/server/entities.src new file mode 100644 index 0000000..ba83310 --- /dev/null +++ b/src/server/entities.src @@ -0,0 +1,15 @@ +#includelist +dispenser.qc +sentry.qc +teleporter.qc +func_nobuild.qc +func_nogrenades.qc +info_player_teamspawn.qc +item_tfgoal.qc +info_tfgoal.qc +info_areadef.qc +info_tfdetect.qc +item_armor.qc +item_healthkit.qc +#endlist + diff --git a/src/server/func_nobuild.qc b/src/server/func_nobuild.qc index dd17b87..fcb5f70 100644 --- a/src/server/func_nobuild.qc +++ b/src/server/func_nobuild.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Marco Cawthorne + * Copyright (c) 2022-2025 Marco Cawthorne * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -23,24 +23,20 @@ Brush volume that when entered, will not allow you to deploy anything as an engi -------- KEYS -------- "targetname" Name */ - class func_nobuild:ncBrushTrigger { - void(void) func_nobuild; +public: + void func_nobuild(void); - virtual void(void) Respawn; - virtual void(entity) Touch; + virtual void Respawn(void); + virtual void Touch(entity); }; void -func_nobuild::Touch(entity eToucher) +func_nobuild::func_nobuild(void) { - TFPlayer pl = (TFPlayer)eToucher; - if (!(eToucher.flags & FL_CLIENT)) - return; - pl.gflags |= GF_NOBUILDZONE; } void @@ -50,7 +46,13 @@ func_nobuild::Respawn(void) } void -func_nobuild::func_nobuild(void) +func_nobuild::Touch(entity eToucher) { + TFPlayer pl = (TFPlayer)eToucher; -} \ No newline at end of file + if (isPlayer(eToucher) == false) { + return; + } + + pl.gflags |= GF_NOBUILDZONE; +} diff --git a/src/server/func_nogrenades.qc b/src/server/func_nogrenades.qc index 0aa0e81..4577768 100644 --- a/src/server/func_nogrenades.qc +++ b/src/server/func_nogrenades.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Marco Cawthorne + * Copyright (c) 2022-2025 Marco Cawthorne * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -23,24 +23,20 @@ Brush volume that when entered, will not allow you to deploy any grenades. -------- KEYS -------- "targetname" Name */ - class func_nogrenades:ncBrushTrigger { - void(void) func_nogrenades; +public: + void func_nogrenades(void); - virtual void(void) Respawn; - virtual void(entity) Touch; + virtual void Respawn(void); + virtual void Touch(entity); }; void -func_nogrenades::Touch(entity eToucher) +func_nogrenades::func_nogrenades(void) { - TFPlayer pl = (TFPlayer)eToucher; - if (!(eToucher.flags & FL_CLIENT)) - return; - pl.gflags |= GF_NOGRENADEZONE; } void @@ -50,7 +46,13 @@ func_nogrenades::Respawn(void) } void -func_nogrenades::func_nogrenades(void) +func_nogrenades::Touch(entity eToucher) { + TFPlayer pl = (TFPlayer)eToucher; -} \ No newline at end of file + if (isPlayer(eToucher) == false) { + return; + } + + pl.gflags |= GF_NOGRENADEZONE; +} diff --git a/src/server/info_areadef.qc b/src/server/info_areadef.qc index 565890b..4930e95 100644 --- a/src/server/info_areadef.qc +++ b/src/server/info_areadef.qc @@ -30,24 +30,31 @@ Describes an area's bounds and description/name. class info_areadef:ncPointTrigger { +public: + void info_areadef(void); + + virtual void Respawn(void); + virtual void SpawnKey(string,string); + virtual void Touch(entity); + +private: string m_strDescription; - vector m_vecMins; - vector m_vecMaxs; - - void(void) info_areadef; - - virtual void(void) Respawn; - virtual void(string,string) SpawnKey; - virtual void(entity) Touch; }; void -info_areadef::Touch(entity eToucher) +info_areadef::info_areadef(void) { - if (!(eToucher.flags & FL_CLIENT)) - return; + serverinfo.SetBool("areadefs", true); +} - forceinfokey(eToucher, "*areadef", m_strDescription); +void +info_areadef::Touch(entity touchingEntity) +{ + if (isPlayer(touchingEntity) == false) { + return; + } + + userinfo.SetString(touchingEntity, "*areadef", m_strDescription); } void @@ -61,12 +68,6 @@ info_areadef::SpawnKey(string strKey, string strValue) m_strDescription = strreplace("GREEN", "^x4F4GREEN^7", m_strDescription); m_strDescription = strreplace("YELLOW", "^xFF4YELLOW^7", m_strDescription); break; - case "mins": - m_vecMins = stov(strValue); - break; - case "maxs": - m_vecMaxs = stov(strValue); - break; default: super::SpawnKey(strKey, strValue); } @@ -79,11 +80,5 @@ info_areadef::Respawn(void) /* set up our volume */ SetSolid(SOLID_TRIGGER); - SetSize(m_vecMins, m_vecMaxs); -} - -void -info_areadef::info_areadef(void) -{ - forceinfokey(world, "areadefs", "1"); + SetSize(GetSpawnFloat("mins"), GetSpawnFloat("maxs")); } \ No newline at end of file diff --git a/src/server/info_player_teamspawn.qc b/src/server/info_player_teamspawn.qc index 85319ce..496f753 100644 --- a/src/server/info_player_teamspawn.qc +++ b/src/server/info_player_teamspawn.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 Marco Cawthorne + * Copyright (c) 2016-2025 Marco Cawthorne * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -17,33 +17,22 @@ class info_player_teamspawn:ncSpawnPoint { +public: void(void) info_player_teamspawn; - virtual void SpawnKey(string, string); virtual void Spawned(void); }; void info_player_teamspawn::info_player_teamspawn(void) { - -} - -void -info_player_teamspawn::SpawnKey(string keyName, string setValue) -{ - switch (keyName) { - case "team_no": - team = ReadInt(setValue); - break; - default: - super::SpawnKey(keyName, setValue); - } } void info_player_teamspawn::Spawned(void) { + team = GetSpawnInt ("team_no"); + switch (team) { case 1: classname = "info_teamspawn_blue"; diff --git a/src/server/info_tfdetect.qc b/src/server/info_tfdetect.qc index 6d2af56..984d9df 100644 --- a/src/server/info_tfdetect.qc +++ b/src/server/info_tfdetect.qc @@ -242,7 +242,7 @@ info_tfdetect::Setup(void) } /* the evil localcmd feature of this entity. */ - if (m_strLocalCommand) { + if (STRING_SET(m_strLocalCommand)) { localcmd(m_strLocalCommand); localcmd("\n"); } diff --git a/src/server/info_tfgoal.qc b/src/server/info_tfgoal.qc index eca4766..54a66fb 100644 --- a/src/server/info_tfgoal.qc +++ b/src/server/info_tfgoal.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 Marco Cawthorne + * Copyright (c) 2016-2025 Marco Cawthorne * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -119,19 +119,63 @@ private: string m_strSpawnModel; /* because we mangle it */ }; +void +info_tfgoal::info_tfgoal(void) +{ + m_tfgState = TFGOAL_INACTIVE; + m_tfgResult = TFRESULT_REMOVE; + m_strName = __NULL__; + m_strActivatedSound = __NULL__; + m_iGoalID = 0i; + m_iGoalGroupID = 0i; + m_tfgActivation = 0; + m_tfgEffects = 0; + m_Activator = __NULL__; + m_dMustCarry = 0.0f; + m_dRespawn = 0.0f; + m_dTeamBlueGain = 0.0f; + m_dTeamRedGain = 0.0f; + m_dTeamYellowGain = 0.0f; + m_dTeamGreenGain = 0.0f; + m_dScore = 0.0f; + m_iTeamUses = 0i; + m_iTeamOwner = 0i; + m_iHealth = 0i; + m_iArmor = 0i; + m_iShells = 0i; + m_iNails = 0i; + m_iCells = 0i; + m_iMedikit = 0i; + m_iRockets = 0i; + m_iDetpack = 0i; + m_msgAll = __NULL__; + m_msgActivator = __NULL__; + m_msgActTeam = __NULL__; + m_msgNonActTeam = __NULL__; + m_msgOwnerTeam = __NULL__; + m_msgNonOwnerTeams = __NULL__; + m_voxAll = __NULL__; + m_voxActivator = __NULL__; + m_voxActTeam = __NULL__; + m_voxNonActTeam = __NULL__; + m_voxOwnerTeam = __NULL__; + m_voxNonOwnerTeams = __NULL__; + m_strSpawnModel = __NULL__; +} + void info_tfgoal::Spawned(void) { super::Spawned(); /* HACK: goals without a targetname and TFGOAL_REMOVED can't work */ - if (m_tfgState == TFGOAL_REMOVED && !targetname) { + if (m_tfgState == TFGOAL_REMOVED && HasTargetname() == false) { m_tfgState = TFGOAL_INACTIVE; } } void -info_tfgoal::Touch(entity eToucher) +info_tfgoal::Touch(entity touchingEntity) { item_tfgoal findme = __NULL__; int rocketType = ammoNumForName("ammo_rockets"); @@ -141,10 +185,11 @@ info_tfgoal::Touch(entity eToucher) int medikitType = ammoNumForName("ammo_medkit"); int detpackType = ammoNumForName("ammo_detpack"); - if (eToucher.classname != "player") { + if (isPlayer(touchingEntity) == false) { return; } - TFPlayer pl = (TFPlayer)eToucher; + + TFPlayer pl = (TFPlayer)touchingEntity; /* check for state */ if (m_tfgState != TFGOAL_INACTIVE) { @@ -154,7 +199,7 @@ info_tfgoal::Touch(entity eToucher) /* check for team eligibility */ if (m_iTeamUses) - if (eToucher.team != m_iTeamUses) { + if (touchingEntity.team != m_iTeamUses) { print("not eligble\n"); return; } @@ -165,8 +210,9 @@ info_tfgoal::Touch(entity eToucher) for (entity e = world; (e = find(e, ::classname, "item_tfgoal"));) { item_tfgoal a = (item_tfgoal)e; - if (a.m_dItemID == m_dMustCarry) + if (a.m_dItemID == m_dMustCarry) { findme = a; + } } if (!findme) { @@ -194,7 +240,7 @@ info_tfgoal::Touch(entity eToucher) } sound(this, CHAN_ITEM, m_strActivatedSound, 1.0f, ATTN_NORM); - Logging_Pickup(eToucher, this, m_strName); + Logging_Pickup(touchingEntity, this, m_strName); /* here we increase/decrease funstuff */ pl.health += m_iHealth; @@ -215,27 +261,27 @@ info_tfgoal::Touch(entity eToucher) string ts; if (m_dScore) { ts = sprintf("teamscore_%i", m_iTeamUses); - forceinfokey(world, ts, sprintf("%d", serverkeyfloat(ts) + m_dScore)); + serverinfo.SetFloat(ts, serverkeyfloat(ts) + m_dScore); } if (m_dTeamBlueGain) { ts = "teamscore_1"; - forceinfokey(world, ts, sprintf("%d", serverkeyfloat(ts) + m_dTeamBlueGain)); + serverinfo.SetFloat(ts, serverkeyfloat(ts) + m_dTeamBlueGain); } if (m_dTeamRedGain) { ts = "teamscore_2"; - forceinfokey(world, ts, sprintf("%d", serverkeyfloat(ts) + m_dTeamRedGain)); + serverinfo.SetFloat(ts, serverkeyfloat(ts) + m_dTeamRedGain); } if (m_dTeamYellowGain) { ts = "teamscore_3"; - forceinfokey(world, ts, sprintf("%d", serverkeyfloat(ts) + m_dTeamYellowGain)); + serverinfo.SetFloat(ts, serverkeyfloat(ts) + m_dTeamYellowGain); } if (m_dTeamGreenGain) { ts = "teamscore_4"; - forceinfokey(world, ts, sprintf("%d", serverkeyfloat(ts) + m_dTeamGreenGain)); + serverinfo.SetFloat(ts, serverkeyfloat(ts) + m_dTeamGreenGain); } /* message broadcaster */ - if (m_msgAll) { + if (STRING_SET(m_msgAll)) { env_message_broadcast(m_msgAll); } else { for (entity e = world; (e = find(e, ::classname, "player")); ) { @@ -244,20 +290,21 @@ info_tfgoal::Touch(entity eToucher) } else if (e.team == pl.team ) { env_message_single(e, m_msgActTeam); } else if (e.team != pl.team) { - if (e.team == m_iTeamOwner && m_msgOwnerTeam) + if (e.team == m_iTeamOwner && STRING_SET(m_msgOwnerTeam)) { env_message_single(e, m_msgOwnerTeam); - else { - if (m_msgNonOwnerTeams) + } else { + if (STRING_SET(m_msgNonOwnerTeams)) { env_message_single(e, m_msgNonOwnerTeams); - else + } else { env_message_single(e, m_msgNonActTeam); + } } } } } /* vox speaker */ - if (m_voxAll) { + if (STRING_SET(m_voxAll)) { Vox_Sentence_Broadcast(m_voxAll); } else { for (entity e = world; (e = find(e, ::classname, "player")); ) { @@ -266,13 +313,14 @@ info_tfgoal::Touch(entity eToucher) } else if (e.team == pl.team ) { Vox_Sentence_Single(e, m_voxActTeam); } else if (e.team != pl.team) { - if (e.team == m_iTeamOwner && m_voxOwnerTeam) + if (e.team == m_iTeamOwner && m_voxOwnerTeam) { Vox_Sentence_Single(e, m_voxOwnerTeam); - else { - if (m_voxNonOwnerTeams) + } else { + if (STRING_SET(m_voxNonOwnerTeams)) { Vox_Sentence_Single(e, m_voxNonOwnerTeams); - else + } else { Vox_Sentence_Single(e, m_voxNonActTeam); + } } } } @@ -295,161 +343,155 @@ info_tfgoal::Respawn(void) SetOrigin(GetSpawnVector("origin")); team = m_iTeamUses; - if (frags > 0) + if (frags > 0) { botinfo = BOTINFO_TEAM_GOALCAPTURE; + } } void -info_tfgoal::SpawnKey(string strKey, string strValue) +info_tfgoal::SpawnKey(string keyName, string setValue) { - switch (strKey) { + switch (keyName) { case "netname": - netname = strValue; + netname = ReadString(setValue); break; case "noise": - m_strActivatedSound = strValue; + m_strActivatedSound = ReadString(setValue); break; case "model": case "mdl": - m_strSpawnModel = strValue; + m_strSpawnModel = ReadString(setValue); - if (serverkeyfloat("*bspversion") == 0) { + if (serverinfo.GetInteger("*bspversion") == 0i) { m_strSpawnModel = strreplace("progs", "models", model); m_strSpawnModel = strreplace("tf_stan", "flag", model); } - break; case "goal_state": - m_tfgState = stof(strValue); + m_tfgState = ReadFloat(setValue); break; case "g_a": - m_tfgActivation = stof(strValue); + m_tfgActivation = ReadFloat(setValue); break; case "g_e": - m_tfgEffects = stof(strValue); + m_tfgEffects = ReadFloat(setValue); break; case "goal_result": - m_tfgResult = stof(strValue); + m_tfgResult = ReadFloat(setValue); break; case "items_allowed": - m_dMustCarry = stof(strValue); + m_dMustCarry = ReadFloat(setValue); break; case "team_no": - m_iTeamUses = stoi(strValue); + m_iTeamUses = ReadInt(setValue); break; case "owned_by": - m_iTeamOwner = stoi(strValue); + m_iTeamOwner = ReadInt(setValue); break; case "count": - m_dScore = stof(strValue); + m_dScore = ReadFloat(setValue); break; case "wait": - m_dRespawn = stof(strValue); + m_dRespawn = ReadFloat(setValue); break; case "increase_team1": - m_dTeamBlueGain = stof(strValue); + m_dTeamBlueGain = ReadFloat(setValue); break; case "increase_team2": - m_dTeamRedGain = stof(strValue); + m_dTeamRedGain = ReadFloat(setValue); break; case "increase_team3": - m_dTeamYellowGain = stof(strValue); + m_dTeamYellowGain = ReadFloat(setValue); break; case "increase_team4": - m_dTeamGreenGain = stof(strValue); + m_dTeamGreenGain = ReadFloat(setValue); break; /* messages that get sent */ case "b_b": - m_msgAll = strValue; /* global */ + m_msgAll = ReadString(setValue); /* global */ break; case "message": - m_msgActivator = strValue; /* AP */ + m_msgActivator = ReadString(setValue); /* AP */ break; case "b_t": case "team_broadcast": - m_msgActTeam = strValue; /* AP team */ + m_msgActTeam = ReadString(setValue); /* AP team */ break; case "b_n": case "netname_non_team_broadcast": - m_msgNonActTeam = strValue; /* non-AP team */ + m_msgNonActTeam = ReadString(setValue); /* non-AP team */ break; case "b_o": case "owners_team_broadcast": - m_msgOwnerTeam = strValue; /* owner team */ + m_msgOwnerTeam = ReadString(setValue); /* owner team */ break; case "non_owners_team_broadcast": - m_msgNonOwnerTeams = strValue; /* non-owner team */ + m_msgNonOwnerTeams = ReadString(setValue); /* non-owner team */ break; /* sentences that get played */ case "speak": - m_voxAll = strValue; /* global */ + m_voxAll = ReadString(setValue); /* global */ break; case "AP_speak": - m_voxActivator = strValue; /* AP */ + m_voxActivator = ReadString(setValue); /* AP */ break; case "team_speak": - m_voxActTeam = strValue; /* AP team */ + m_voxActTeam = ReadString(setValue); /* AP team */ break; case "non_team_speak": - m_voxNonActTeam = strValue; /* non-AP team */ + m_voxNonActTeam = ReadString(setValue); /* non-AP team */ break; case "owners_team_speak": - m_voxOwnerTeam = strValue; /* owner team */ + m_voxOwnerTeam = ReadString(setValue); /* owner team */ break; case "non_owners_team_speak": - m_voxNonOwnerTeams = strValue; /* non-owner team */ + m_voxNonOwnerTeams = ReadString(setValue); /* non-owner team */ break; /* AP manipulators */ case "health": - m_iHealth = stoi(strValue); + m_iHealth = ReadInt(setValue); break; case "armor": - m_iArmor = stoi(strValue); + m_iArmor = ReadInt(setValue); break; case "ammo_shells": - m_iShells = stoi(strValue); + m_iShells = ReadInt(setValue); break; case "ammo_nails": - m_iNails = stoi(strValue); + m_iNails = ReadInt(setValue); break; case "ammo_rockets": - m_iRockets = stoi(strValue); + m_iRockets = ReadInt(setValue); break; case "ammo_cells": - m_iCells = stoi(strValue); + m_iCells = ReadInt(setValue); break; case "ammo_medikit": - m_iMedikit = stoi(strValue); + m_iMedikit = ReadInt(setValue); break; default: - super::SpawnKey(strKey, strValue); + super::SpawnKey(keyName, setValue); break; } } -void -info_tfgoal::info_tfgoal(void) -{ - m_tfgState = TFGOAL_INACTIVE; - m_tfgResult = TFRESULT_REMOVE; - - for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { - SpawnKey(argv(i), argv(i+1)); - } - - precache_sound(m_strActivatedSound); - - super::ncRenderableEntity(); - info_tfgoal::Respawn(); -} - /* the brush based version of tfgoal */ class i_t_g:info_tfgoal { +public: void(void) i_t_g; + virtual void(void) Respawn; }; +void +i_t_g::i_t_g(void) +{ + classname = "info_tfgoal"; + m_tfgState = TFGOAL_INACTIVE; + m_tfgResult = TFRESULT_NONE; +} + void i_t_g::Respawn(void) { @@ -458,26 +500,10 @@ i_t_g::Respawn(void) SetModel(m_strSpawnModel); SetOrigin(GetSpawnVector("origin")); Hide(); + team = m_iTeamUses; - if (frags > 0) + if (frags > 0) { botinfo = BOTINFO_TEAM_GOALCAPTURE; -} - -void -i_t_g::i_t_g(void) -{ - classname = "info_tfgoal"; - - m_tfgState = TFGOAL_INACTIVE; - m_tfgResult = TFRESULT_NONE; - - for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { - SpawnKey(argv(i), argv(i+1)); } - - super::ncRenderableEntity(); - - precache_sound(m_strActivatedSound); - Respawn(); } diff --git a/src/server/item_tfgoal.qc b/src/server/item_tfgoal.qc index 02b7517..810d050 100644 --- a/src/server/item_tfgoal.qc +++ b/src/server/item_tfgoal.qc @@ -102,6 +102,21 @@ private: string m_strSpawnModel; /* because we mangle it */ }; +void +item_tfgoal::item_tfgoal(void) +{ + m_status = GISTATUS_HOME; + m_returnOwner = m_returnTeam = __NULL__; + m_flPausetime = 0; +} + +void +item_tfgoal::Spawned(void) +{ + super::Spawned(); + precache_sound(m_strSound); +} + void item_tfgoal::DropReturnable(ncPlayer pp) { @@ -126,21 +141,22 @@ item_tfgoal::TeamOwnerReturns(void) Respawn(); for (entity e = world; (e = find(e, ::classname, "player")); ) { - if (e.team == m_iTeamUses) + if (e.team == m_iTeamUses) { env_message_single(e, m_returnTeam); - else if (e.team == m_iTeamOwner) + } else if (e.team == m_iTeamOwner) { env_message_single(e, m_returnOwner); + } } } void -item_tfgoal::Touch(entity eToucher) +item_tfgoal::Touch(entity touchingEntity) { - if (eToucher.classname != "player") { + if (isPlayer(touchingEntity) == false) { return; } - TFPlayer pl = (TFPlayer)eToucher; + TFPlayer pl = (TFPlayer)touchingEntity; /* not in standard TFC, make cvar? */ #if 0 @@ -170,7 +186,7 @@ item_tfgoal::Touch(entity eToucher) sound(this, CHAN_ITEM, m_strSound, 1.0f, ATTN_NONE); /* message broadcaster */ - if (m_msgAll) { + if (STRING_SET(m_msgAll)) { env_message_broadcast(m_msgAll); } else { for (entity e = world; (e = find(e, ::classname, "player")); ) { @@ -192,7 +208,7 @@ item_tfgoal::Touch(entity eToucher) } /* vox speaker */ - if (m_voxAll) { + if (STRING_SET(m_voxAll)) { Vox_Sentence_Broadcast(m_voxAll); } else { for (entity e = world; (e = find(e, ::classname, "player")); ) { @@ -201,13 +217,14 @@ item_tfgoal::Touch(entity eToucher) } else if (e.team == pl.team ) { Vox_Sentence_Single(e, m_voxActTeam); } else if (e.team != pl.team) { - if (e.team == m_iTeamOwner && m_voxOwnerTeam) + if (e.team == m_iTeamOwner && STRING_SET(m_voxOwnerTeam)) { Vox_Sentence_Single(e, m_voxOwnerTeam); - else { - if (m_voxNonOwnerTeams) + } else { + if (STRING_SET(m_voxNonOwnerTeams)) { Vox_Sentence_Single(e, m_voxNonOwnerTeams); - else + } else { Vox_Sentence_Single(e, m_voxNonActTeam); + } } } } @@ -224,6 +241,7 @@ item_tfgoal::Respawn(void) m_eActivator = __NULL__; ReleaseThink(); m_status = GISTATUS_HOME; + SetRenderMode(RM_NORMAL); /* helps with bots */ team = m_iTeamOwner; @@ -236,24 +254,25 @@ item_tfgoal::Respawn(void) } if (m_iTeamOwner) { - SetRenderAmt(1.0f); + SetRenderAmt(1); SetRenderFX(RFX_GLOWSHELL); - } else + } else { return; + } /* spawn into the world */ switch (m_iTeamOwner) { case 1: - SetRenderColor([0,0,1]); + SetRenderColor([0,0,255]); break; case 2: - SetRenderColor([1,0,0]); + SetRenderColor([255,0,0]); break; case 3: - SetRenderColor([1,1,0]); + SetRenderColor([255, 255,0]); break; case 4: - SetRenderColor([0,1,0]); + SetRenderColor([0,255,0]); break; } } @@ -339,18 +358,3 @@ item_tfgoal::SpawnKey(string strKey, string strValue) break; } } - -void -item_tfgoal::Spawned(void) -{ - super::Spawned(); - precache_sound(m_strSound); -} - -void -item_tfgoal::item_tfgoal(void) -{ - m_status = GISTATUS_HOME; - m_returnOwner = m_returnTeam = __NULL__; - m_flPausetime = 0; -} diff --git a/src/server/progs.src b/src/server/progs.src index f8d0d13..a840958 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -17,25 +17,10 @@ ../../../src/gs-entbase/shared.src defs.h ../shared/include.src -dispenser.qc -sentry.qc -teleporter.qc -func_nobuild.qc -func_nogrenades.qc -vox.qc +entities.src ../../../src/botlib/include.src -bot.qc -info_player_teamspawn.qc -item_tfgoal.qc -info_tfgoal.qc -info_areadef.qc -info_tfdetect.qc -item_armor.qc -item_healthkit.qc nades.qc -client.qc server.qc -spawn.qc ../../../src/server/include.src ../../../src/shared/include.src #endlist diff --git a/src/server/spawn.qc b/src/server/spawn.qc deleted file mode 100644 index 1b76b25..0000000 --- a/src/server/spawn.qc +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -float -TFCTeamJoin_SmallestTeam(int blue, int red, int yellow, int green) -{ - while (blue > 0i || red > 0i || yellow > 0i || green > 0i) { - /* the first team that goes to 0, gets picked. */ - if (blue <= 0i) - return 1; - else if (red <= 0i) - return 2; - else if (yellow <= 0i) - return 3; - else if (green <= 0i) - return 4; - - blue--; - red--; - yellow--; - green--; - } - - /* the first team that goes to 0, gets picked. */ - if (blue == 0i) - return 1; - else if (red == 0i) - return 2; - else if (yellow == 0i) - return 3; - else if (green == 0i) - return 4; - - return 0; -} - -void -CSEv_TeamJoin_f(float f) -{ - TFPlayer pl = (TFPlayer)self; - - /* random... */ - if (f == 0) { - int bluePlayers = 0i; - int redPlayers = 0i; - int yellowPlayers = 0i; - int greenPlayers = 0i; - - /* hack to get it to never pick this team */ - if (g_tfcHasBlueTeam == false) - bluePlayers = (int)cvar("sv_playerslots"); - if (g_tfcHasRedTeam == false) - redPlayers = (int)cvar("sv_playerslots"); - if (g_tfcHasYellowTeam == false) - yellowPlayers = (int)cvar("sv_playerslots"); - if (g_tfcHasGreenTeam == false) - greenPlayers = (int)cvar("sv_playerslots"); - - /* count all valid players within each team */ - for (entity e = world; (e = find(e, ::classname, "player"));) { - if (e.team == 1) - bluePlayers++; - else if (e.team == 2) - redPlayers++; - else if (e.team == 3) - yellowPlayers++; - else if (e.team == 4) - greenPlayers++; - } - - /* assign us to the team with the lowest amount of players */ - f = TFCTeamJoin_SmallestTeam(bluePlayers, redPlayers, yellowPlayers, greenPlayers); - } - - /* mess, do it better */ - if (f == 1) { - pl.team = 1; /* Blue */ - forceinfokey(pl, "topcolor", "0x9aff"); - forceinfokey(pl, "bottomcolor", "0x9aff"); - } else if (f == 2) { - pl.team = 2; /* Red */ - f -= 10; - forceinfokey(pl, "topcolor", "0xff1800"); - forceinfokey(pl, "bottomcolor", "0xff1800"); - } else if (f == 3) { - pl.team = 3; /* Yellow */ - f -= 20; - forceinfokey(pl, "topcolor", "0xffca00"); - forceinfokey(pl, "bottomcolor", "0xffca00"); - } else if (f == 4) { - pl.team = 4; /* Green */ - f -= 30; - forceinfokey(pl, "topcolor", "0x3bff00"); - forceinfokey(pl, "bottomcolor", "0x3bff00"); - } else { - return; - } - - if (self.health > 0) { - ClientKill(); - return; - } -} - -/** Called by the client-side VGUI menu when we choose a class. */ -void -CSEv_ClassJoin_f(float f) -{ - TFPlayer pl = (TFPlayer)self; - - /* choose a random class. */ - if (f == 0) { - float newClass = 0; - - while (newClass == 0 || newClass == pl.classtype) - newClass = floor(random(CLASS_SCOUT, CLASS_ENGINEER + 1)); - - f = newClass; - } - - /* invalid */ - if (pl.team == 0) { - return; - } - - /* invalid */ - if (pl.classtype == f) - return; - - /* if we're still alive... */ - if (pl.health > 0) { - pl.classtype = f; - pl.MakeClass(f); - ClientKill(); - } else { - /* insta spawn */ - - /* assign our class type for safe keeping */ - pl.classtype = f; - - /* turn the player into the class of his choice */ - pl.MakeClass(f); - } -} diff --git a/src/server/vox.qc b/src/server/vox.qc deleted file mode 100644 index 41ef567..0000000 --- a/src/server/vox.qc +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2022 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -void -Vox_Sentence_Broadcast(string msg) -{ - if (!msg || msg == "") - return; - - WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); - WriteByte(MSG_MULTICAST, EV_TFC_VOXMSG); - WriteString(MSG_MULTICAST, msg); - multicast([0,0,0], MULTICAST_ALL_R); -} - -void -Vox_Sentence_Single(entity targ, string msg) -{ - if (!msg || msg == "") - return; - - WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); - WriteByte(MSG_MULTICAST, EV_TFC_VOXMSG); - WriteString(MSG_MULTICAST, msg); - msg_entity = targ; - multicast([0,0,0], MULTICAST_ONE_R); -} diff --git a/src/shared/include.src b/src/shared/include.src index 68c366f..9d72258 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -12,5 +12,6 @@ player.qc animations_tfc.h ../../../valve/src/shared/animations.qc pmove.qc +vox.qc ../../../valve/src/shared/HLWeapon.qc #endlist diff --git a/src/shared/player.qc b/src/shared/player.qc index ca57fa3..e360cba 100644 --- a/src/shared/player.qc +++ b/src/shared/player.qc @@ -47,6 +47,7 @@ TFPlayer:HLPlayer nonvirtual void TFC_ReleaseGren1(void); nonvirtual void TFC_ReleaseGren2(void); virtual void UpdatePlayerAnimation(float); + virtual void Physics_InputPreMove(void); #ifdef CLIENT virtual void ReceiveEntity(float,float); @@ -62,9 +63,6 @@ TFPlayer:HLPlayer virtual void EvaluateEntity(void); virtual float SendEntity(entity, float); - - virtual void SpawnIntoGame(void); - virtual void MakeClass(classtype_e); virtual void ServerInputFrame(void); nonvirtual void TFC_FragSelf(void); @@ -77,6 +75,17 @@ TFPlayer::TFPlayer(void) { } + + +void +TFPlayer::Physics_InputPreMove(void) +{ + super::Physics_InputPreMove(); + + gflags &= ~GF_NOBUILDZONE; + gflags &= ~GF_NOGRENADEZONE; +} + void TFPlayer::UpdatePlayerAnimation(float timelength) { @@ -389,83 +398,6 @@ TFPlayer::EvaluateEntity(void) EVALUATE_FIELD(m_flHallucination, PLAYER_AMMOTYPES) } -void -TFPlayer::SpawnIntoGame(void) -{ - entity spot = world; - - /* spawn into the world */ - switch (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(this, spot.origin); - angles = spot.angles; - fixangle = TRUE; -} - -void -TFPlayer::MakeClass(classtype_e classType) -{ - int oldTeam = team; - - switch (classType) { - case CLASS_SCOUT: - EntityDef_SpawnClassname("player_scout"); - env_message_single(this, "HELP_SCOUT"); - break; - case CLASS_SNIPER: - EntityDef_SpawnClassname("player_sniper"); - env_message_single(this, "HELP_SNIPER"); - break; - case CLASS_SOLDIER: - EntityDef_SpawnClassname("player_soldier"); - env_message_single(this, "HELP_SOLDIER"); - break; - case CLASS_DEMO: - EntityDef_SpawnClassname("player_demo"); - env_message_single(this, "HELP_DEMOMAN"); - break; - case CLASS_MEDIC: - EntityDef_SpawnClassname("player_medic"); - env_message_single(this, "HELP_MEDIC"); - break; - case CLASS_HVYWEAPON: - EntityDef_SpawnClassname("player_heavy"); - env_message_single(this, "HELP_HWGUY"); - break; - case CLASS_PYRO: - EntityDef_SpawnClassname("player_pyro"); - env_message_single(this, "HELP_PYRO"); - break; - case CLASS_SPY: - EntityDef_SpawnClassname("player_spy"); - env_message_single(this, "HELP_SPY"); - break; - case CLASS_ENGINEER: - EntityDef_SpawnClassname("player_engineer"); - env_message_single(this, "HELP_ENGINEER"); - break; - } - - MakePlayer(); - team = oldTeam; - forceinfokey(this, "*team", ftos(team)); - GiveItem("item_suit"); - SpawnIntoGame(); -} - float TFPlayer::SendEntity(entity ePEnt, float flChanged) { diff --git a/src/client/vox.qc b/src/shared/vox.qc similarity index 51% rename from src/client/vox.qc rename to src/shared/vox.qc index 7ad81e6..0b1fb3e 100644 --- a/src/client/vox.qc +++ b/src/shared/vox.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 Marco Cawthorne + * Copyright (c) 2022-2025 Marco Cawthorne * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,35 +14,65 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef CLIENT class -TFCVox:ncTalkMonster +VOX:ncTalkMonster { - void(void) TFCVox; +public: + void(void) VOX; virtual void(string) SentenceSample; }; -TFCVox g_vox; - void -TFCVox::SentenceSample(string sample) +VOX::SentenceSample(string sample) { sound(this, CHAN_VOICE, sample, 1.0, ATTN_NONE, 100, SOUNDFLAG_FOLLOW | SOUNDFLAG_NOSPACIALISE); } void -TFCVox::TFCVox(void) +VOX:: VOX(void) { } void Vox_Parse(void) { + static VOX voxDelegate; string msg = readstring(); - if (!g_vox) - g_vox = spawn(TFCVox); + if (!voxDelegate) { + voxDelegate = spawn(VOX); + } - print(msg); - print("\n"); - g_vox.Sentence(msg); + voxDelegate.Sentence(msg); } +#endif + +#ifdef SERVER +void +Vox_Sentence_Broadcast(string wordsToBroadcast) +{ + if (!STRING_SET(wordsToBroadcast)) { + return; + } + + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, EV_TFC_VOXMSG); + WriteString(MSG_MULTICAST, wordsToBroadcast); + multicast(g_vec_null, MULTICAST_ALL_R); +} + +void +Vox_Sentence_Single(entity targetClient, string wordsToVOX) +{ + if (!STRING_SET(wordsToVOX)) { + return; + } + + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, EV_TFC_VOXMSG); + WriteString(MSG_MULTICAST, wordsToVOX); + msg_entity = targetClient; + multicast(g_vec_null, MULTICAST_ONE_R); +} +#endif \ No newline at end of file diff --git a/src/shared/w_asscan.qc b/src/shared/w_asscan.qc deleted file mode 100644 index 8d99af9..0000000 --- a/src/shared/w_asscan.qc +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (c) 2016-2021 Marco Cawthorne - * Copyright (c) 2019-2020 Gethyn ThomasQuail - * - * 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. - */ - -/* Animations */ -enum -{ - ASSCAN_IDLE1, - ASSCAN_IDLE2, - ASSCAN_SPINUP, - ASSCAN_SPINDOWN, - ASSCAN_FIRE, - ASSCAN_DRAW, - ASSCAN_HOLSTER -}; - -#ifdef CLIENT -void w_asscan_ejectshell(void) -{ - static void w_asscan_ejectshell_death(void) { - remove(self); - } - static void w_asscan_ejectshell_touch(void) { - if (other == world) - Sound_Play(self, CHAN_BODY, "modelevent_shell.land"); - } - entity eShell = spawn(); - setmodel(eShell, "models/shell.mdl"); - eShell.solid = SOLID_BBOX; - eShell.movetype = MOVETYPE_BOUNCE; - eShell.drawmask = MASK_ENGINE; - eShell.angles = [pSeat->m_eViewModel.angles[0], pSeat->m_eViewModel.angles[1], 0]; - eShell.velocity = pSeat->m_vecPredictedVelocity; - - makevectors(pSeat->m_eViewModel.angles); - eShell.velocity += (v_forward * 0); - eShell.velocity += (v_right * -80); - eShell.velocity += (v_up * 100); - eShell.touch = w_asscan_ejectshell_touch; - - eShell.avelocity = [0,45,900]; - eShell.think = w_asscan_ejectshell_death; - eShell.nextthink = time + 2.5f; - setsize(eShell, [0,0,0], [0,0,0]); - setorigin(eShell, pSeat->m_eViewModel.origin + (v_forward * 26) + (v_up * -15)); -} -#endif - -void -w_asscan_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_asscan.fire"); - Sound_Precache("weapon_asscan.reload"); - Sound_Precache("weapon_asscan.spindown"); - Sound_Precache("weapon_asscan.spinup"); - precache_model("models/w_tfac.mdl"); - precache_model("models/p_tfac.mdl"); -#endif - -#ifdef CLIENT - precache_model("models/v_tfac.mdl"); - Sound_Precache("modelevent_shell.land"); -#endif -} - -int -w_asscan_pickup(player pl, int new, int startammo) -{ - return (1); -} - -void -w_asscan_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, -1, pl.m_iAmmoShells, -1); -} - -string -w_asscan_wmodel(void) -{ - return "models/w_tfac.mdl"; -} - -string -w_asscan_pmodel(player pl) -{ - return "models/p_mini2.mdl"; -} - -string -w_asscan_deathmsg(void) -{ - return "%s was rolled over by %s' Chaingun."; -} - -void -w_asscan_draw(player pl) -{ - pl.mode_tempstate = 0; - Weapons_SetModel("models/v_tfac.mdl"); - Weapons_ViewAnimation(pl, ASSCAN_DRAW); -} - -void -w_asscan_holster(player pl) -{ - Weapons_ViewAnimation(pl, ASSCAN_HOLSTER); -} - -void -w_asscan_release(player pl) -{ - /* end firing */ - if (pl.mode_tempstate == 1) { - pl.mode_tempstate = 0; - Weapons_Sound(pl, CHAN_WEAPON, "weapon_asscan.spindown"); - Weapons_ViewAnimation(pl, ASSCAN_SPINDOWN); - pl.w_attack_next = 1.0f; - pl.w_idle_next = 4.0f; - return; - } - - if (pl.w_idle_next > 0.0) - return; - - int r = (float)input_sequence % 2; - if (r) { - Weapons_ViewAnimation(pl, ASSCAN_IDLE1); - } else { - Weapons_ViewAnimation(pl, ASSCAN_IDLE2); - } - - pl.w_idle_next = 15.0f; -} - -void -w_asscan_primary(player pl) -{ - /* rate check */ - if (pl.w_attack_next > 0.0) - return; - - /* ammo check */ - if (pl.m_iAmmoShells <= 0) { - w_asscan_release(pl); - return; - } - - /* spin up first */ - if (pl.mode_tempstate == 0) { - pl.mode_tempstate = 1; - Weapons_ViewAnimation(pl, ASSCAN_SPINUP); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_asscan.spinup"); - pl.w_attack_next = 0.5f; - pl.w_idle_next = pl.w_attack_next; - return; - } - - /* from now on we're just going rambo */ - pl.m_iAmmoShells--; - - Weapons_ViewAnimation(pl, ASSCAN_FIRE); - Weapons_ViewPunchAngle(pl, [random(-2, 2),0,0]); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_asscan.fire"); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTASSCAN, 0.1f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTASSCAN, 0.1f); - -#ifdef CLIENT - View_AddEvent(w_asscan_ejectshell, 0.0f); - View_SetMuzzleflash(MUZZLE_WEIRD); -#else - TraceAttack_FireBullets(1, Weapons_GetCameraPos(pl), 8, [0.15,0.15], WEAPON_ASSCAN); -#endif - - pl.w_attack_next = 0.1f; - pl.w_idle_next = 0.0f; -} - -void -w_asscan_hud(player pl) -{ -#ifdef CLIENT - vector aicon_pos; - - aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - - Cross_DrawSub(g_cross_spr, [24,24], [48/128,24/128], [0.1875, 0.1875]); - - HUD_DrawAmmo2(); - - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [72/256,72/128], [24/256, 24/128], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -float -w_asscan_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMASSCAN : TFCANIM_AIMASSCAN; -} - -void -w_asscan_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (pl.m_iAmmoShells == 0) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.m_iAmmoShells, 200, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud4_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud3_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -int -w_asscan_isempty(player pl) -{ - if (pl.m_iAmmoShells <= 0) - return 1; - - return 0; -} - -weapontype_t -w_asscan_type(player pl) -{ - return WPNTYPE_RANGED; -} - -weapon_t w_asscan = -{ - .name = "asscan", - .id = ITEM_ASSCAN, - .slot = 3, - .slot_pos = 3, - .weight = WEIGHT_ASSCAN, - .draw = w_asscan_draw, - .holster = w_asscan_holster, - .primary = w_asscan_primary, - .secondary = w_asscan_release, - .reload = __NULL__, - .release = w_asscan_release, - .postdraw = w_asscan_hud, - .precache = w_asscan_precache, - .pickup = w_asscan_pickup, - .updateammo = w_asscan_updateammo, - .wmodel = w_asscan_wmodel, - .pmodel = w_asscan_pmodel, - .deathmsg = w_asscan_deathmsg, - .aimanim = w_asscan_aimanim, - .isempty = w_asscan_isempty, - .type = w_asscan_type, - .hudpic = w_asscan_hudpic -}; diff --git a/src/shared/w_autorifle.qc b/src/shared/w_autorifle.qc deleted file mode 100644 index 5b743a5..0000000 --- a/src/shared/w_autorifle.qc +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -enum -{ - SNIPER_IDLE, - SNIPER_AIM, - SNIPER_FIRE, - SNIPER_DRAW, - SNIPER_HOLSTER, - SNIPER_AUTOIDLE, - SNIPER_AUTOFIRE, - SNIPER_AUTODRAW, - SNIPER_AUTOHOLSTER, -}; - -void -w_autorifle_precache(void) -{ - precache_model("models/v_tfc_sniper.mdl"); - precache_model("models/p_sniper2.mdl"); - Sound_Precache("weapon_sniper.fire"); -} - -void -w_autorifle_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoShells, __NULL__); -} - -string -w_autorifle_wmodel(void) -{ - return ""; -} -string -w_autorifle_pmodel(player pl) -{ - return "models/p_sniper2.mdl"; -} - -string -w_autorifle_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_autorifle_release(player pl) -{ - if (pl.w_idle_next > 0) - return; - - Weapons_ViewAnimation(pl, SNIPER_AUTOIDLE); -} - -void -w_autorifle_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_sniper.mdl"); - Weapons_ViewAnimation(pl, SNIPER_AUTODRAW); - pl.w_idle_next = 1.0f; -} - -float -w_autorifle_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMAUTOSNIPER : TFCANIM_AIMAUTOSNIPER; -} - -void -w_autorifle_primary(player pl) -{ - int s = w_baseauto_fire(WEAPON_AUTORIFLE, player::m_iAmmoShells, 8, [0,0]); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - Weapons_ViewAnimation(pl, SNIPER_AUTOFIRE); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTAUTOSNIPER, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTAUTOSNIPER, 0.45f); - - #ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - #endif - Weapons_Sound(pl, CHAN_WEAPON, "weapon_sniper.fire"); - pl.w_attack_next = 0.1f; - break; - case AUTO_EMPTY: - w_autorifle_release(pl); - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 0.0f; -} - -void -w_autorifle_postdraw(player pl) -{ -#ifdef CLIENT - // crosshair - if (pl.viewzoom == 1) { - Cross_DrawSub(g_cross_spr, [24,24], [72/128,0], [0.1875, 0.1875]); - } else { - Cross_DrawSub(g_cross_spr, [104,16], [24/128,96/128], [104/128, 16/128]); - } - // ammo counter - 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, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -void -w_autorifle_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud2_spr, - [0,0], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud1_spr, - [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, - .weight = WEIGHT_AUTORIFLE, - .draw = w_autorifle_draw, - .holster = __NULL__, - .primary = w_autorifle_primary, - .secondary = w_autorifle_release, - .reload = __NULL__, - .release = w_autorifle_release, - .postdraw = w_autorifle_postdraw, - .precache = w_autorifle_precache, - .pickup = __NULL__, - .updateammo = w_autorifle_updateammo, - .wmodel = __NULL__, - .pmodel = w_autorifle_pmodel, - .deathmsg = w_autorifle_deathmsg, - .aimanim = w_autorifle_aimanim, - .hudpic = w_autorifle_hudpic, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_crowbar.qc b/src/shared/w_crowbar.qc deleted file mode 100644 index b2b7cfd..0000000 --- a/src/shared/w_crowbar.qc +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2016-2021 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/*QUAKED weapon_crowbar (0 0 1) (-16 -16 0) (16 16 32) -"model" "models/w_crowbar.mdl" - -HALF-LIFE (1998) ENTITY - -Crowbar Weapon - -*/ - -enum -{ - CBAR_IDLE, - CBAR_DRAW, - CBAR_HOLSTER, - CBAR_ATTACK1HIT, - CBAR_ATTACK1MISS, - CBAR_ATTACK2MISS, - CBAR_ATTACK2HIT, - CBAR_ATTACK3MISS, - CBAR_ATTACK3HIT -}; - -void -w_crowbar_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_crowbar.hit"); - Sound_Precache("weapon_crowbar.miss"); - Sound_Precache("weapon_crowbar.hitbody"); - precache_model("models/w_crowbar.mdl"); -#else - precache_model("models/v_tfc_crowbar.mdl"); - precache_model("models/p_crowbar.mdl"); -#endif -} - -void -w_crowbar_updateammo(player pl) -{ - -} - -string -w_crowbar_wmodel(void) -{ - return "models/w_crowbar.mdl"; -} -string -w_crowbar_pmodel(player pl) -{ - return "models/p_crowbar.mdl"; -} - -string -w_crowbar_deathmsg(void) -{ - return "%s was assaulted by %s's Crowbar."; -} - -void -w_crowbar_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_crowbar.mdl"); - Weapons_ViewAnimation(pl, CBAR_DRAW); -} - -void -w_crowbar_holster(player pl) -{ - Weapons_ViewAnimation(pl, CBAR_HOLSTER); -} - -void -w_crowbar_primary(player pl) -{ - int anim = 0; - vector src; - - if (pl.w_attack_next) { - return; - } - - Weapons_MakeVectors(pl); - src = pl.origin + pl.view_ofs; - - /* make sure we can gib corpses */ - int oldhitcontents = self.hitcontentsmaski; - self.hitcontentsmaski = CONTENTBITS_POINTSOLID | CONTENTBIT_CORPSE; - traceline(src, src + (v_forward * 32), FALSE, pl); - self.hitcontentsmaski = oldhitcontents; - - if (trace_fraction >= 1.0) { - pl.w_attack_next = 0.5f; - } else { - pl.w_attack_next = 0.25f; - } - pl.w_idle_next = 2.5f; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, trace_fraction >= 1 ? CBAR_ATTACK1MISS:CBAR_ATTACK1HIT); - break; - case 1: - Weapons_ViewAnimation(pl, trace_fraction >= 1 ? CBAR_ATTACK2MISS:CBAR_ATTACK2HIT); - break; - default: - Weapons_ViewAnimation(pl, trace_fraction >= 1 ? CBAR_ATTACK3MISS:CBAR_ATTACK3HIT); - } - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, ANIM_CR_SHOOTCROWBAR, 0.41f); - else - Animation_PlayerTop(pl, ANIM_SHOOTCROWBAR, 0.5f); - -#ifdef SERVER - Sound_Play(self, CHAN_WEAPON, "weapon_crowbar.miss"); - - 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 { - SurfData_Impact(trace_ent, trace_endpos, trace_plane_normal); - } - - if (trace_ent.takedamage) { - Damage_Apply(trace_ent, pl, 18, WEAPON_CROWBAR, DMG_BLUNT); - if (trace_ent.iBleeds) { - Sound_Play(self, CHAN_WEAPON, "weapon_crowbar.hitbody"); - } - } else { - Sound_Play(self, CHAN_WEAPON, "weapon_crowbar.hit"); - } -#endif -} - -void -w_crowbar_release(player pl) -{ - - if (pl.w_idle_next) { - return; - } - - Weapons_ViewAnimation(pl, CBAR_IDLE); - pl.w_idle_next = 15.0f; -} - -float -w_crowbar_aimanim(player pl) -{ - return pl.IsCrouching() ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; -} - -void -w_crowbar_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud4_spr, - [0,0], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud1_spr, - [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, - .weight = WEIGHT_CROWBAR, - .draw = w_crowbar_draw, - .holster = w_crowbar_holster, - .primary = w_crowbar_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_crowbar_release, - .postdraw = __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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_dbs.qc b/src/shared/w_dbs.qc deleted file mode 100644 index 256a1df..0000000 --- a/src/shared/w_dbs.qc +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -enum -{ - DBS_IDLE1, - DBS_FIRE1, - DBS_FIRE2, - DBS_ADDSHELL, - DBS_PUMP, - DBS_START_RELOAD, - DBS_DRAW, - DBS_HOLSTER, - DBS_IDLE2, - DBS_IDLE3 -}; - -void -w_dbs_precache(void) -{ - precache_model("models/v_tfc_shotgun.mdl"); - precache_model("models/w_shot2.mdl"); - precache_model("models/p_shot2.mdl"); -#ifdef SERVER - Sound_Precache("weapon_dbs.cock"); - Sound_Precache("weapon_dbs.fire"); - Sound_Precache("weapon_dbs.reload"); -#endif -} - -void -w_dbs_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.mag_dbs, pl.m_iAmmoShells, __NULL__); -} - -string -w_dbs_wmodel(void) -{ - return "models/w_shot2.mdl"; -} - -string -w_dbs_pmodel(player pl) -{ - return "models/p_shotgun2.mdl"; -} - -string -w_dbs_deathmsg(void) -{ - return ""; -} - -int -w_dbs_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - pl.mag_dbs = bound(0, pl.mag_dbs + 16, 16); -#endif - return (1); -} - -void -w_dbs_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_shotgun.mdl"); - Weapons_ViewAnimation(pl, DBS_DRAW); -} - -void -w_dbs_holster(player pl) -{ - Weapons_ViewAnimation(pl, DBS_HOLSTER); -} - -void -w_dbs_primary(player pl) -{ - int s; - - if (pl.mag_dbs != 1) - s = w_baseshotgun_fire(WEAPON_DBS, player::mag_dbs, 14, 4, [0.14, 0.08, 0]); - else - s = w_baseshotgun_fire(WEAPON_DBS, player::mag_dbs, 6, 4, [0.14, 0.08, 0]); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_LAST: - case AUTO_FIRED: - pl.mag_dbs--; - Weapons_ViewAnimation(pl, DBS_FIRE1); - Weapons_ViewPunchAngle(pl, [-2,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTSHOTGUN, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTSHOTGUN, 0.45f); - - #ifdef CLIENT - View_SetMuzzleflash(MUZZLE_ROUND); - #endif - Weapons_Sound(pl, CHAN_WEAPON, "weapon_dbs.fire"); - pl.w_attack_next = 0.7f; - break; - case AUTO_EMPTY: - Weapons_Sound(pl, CHAN_WEAPON, "weapon_dbs.fire_empty"); - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 1.5f; -} - -void -w_dbs_reload(player pl) -{ - w_baseshotgun_reload(player::mag_dbs, player::m_iAmmoShells, 16); -} - -void -w_dbs_release(player pl) -{ - int s = w_baseshotgun_release(player::mag_dbs, player::m_iAmmoShells, 16); - - switch (s) { - case SHOTGUN_IDLE: - int r = (float)input_sequence % 3; - if (r == 1) { - Weapons_ViewAnimation(pl, DBS_IDLE1); - } else if (r == 2) { - Weapons_ViewAnimation(pl, DBS_IDLE2); - } else { - Weapons_ViewAnimation(pl, DBS_IDLE3); - } - pl.w_idle_next = 5.0f; - break; - case SHOTGUN_BUSY: - break; - case SHOTGUN_START_RELOAD: - Weapons_ViewAnimation(pl, DBS_START_RELOAD); - break; - case SHOTGUN_RELOAD: - Weapons_ViewAnimation(pl, DBS_ADDSHELL); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_dbs.reload"); - break; - case SHOTGUN_END_RELOAD: - Weapons_ViewAnimation(pl, DBS_PUMP); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_dbs.cock"); - break; - } -} - -void -w_dbs_crosshair(player pl) -{ -#ifdef CLIENT - Cross_DrawSub(g_cross_spr, [24,24], [48/128,24/128], [0.1875, 0.1875]); - 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, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -float -w_dbs_aimanim(player pl) -{ - return pl.IsCrouching() ? ANIM_CR_AIMSHOTGUN : ANIM_AIMSHOTGUN; -} - -void -w_dbs_hudpic(player pl, int s, vector pos, float a) -{ -#ifdef CLIENT - if (s) { - drawsubpic(pos, [170,45], g_hud4_spr, [0,180/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); - } else { - drawsubpic(pos, [170,45], g_hud1_spr, [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, - .weight = WEIGHT_DBS, - .draw = w_dbs_draw, - .holster = w_dbs_holster, - .primary = w_dbs_primary, - .secondary = w_dbs_release, - .reload = w_dbs_reload, - .release = w_dbs_release, - .postdraw = 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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_flamer.qc b/src/shared/w_flamer.qc deleted file mode 100644 index 9d43732..0000000 --- a/src/shared/w_flamer.qc +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (c) 2016-2021 Marco Cawthorne - * Copyright (c) 2019-2020 Gethyn ThomasQuail - * - * 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 -{ - EGON_IDLE1, - EGON_FIDGET1, - EGON_ALTFIREON, - EGON_ALTFIRECYCLE, - EGON_ALTFIREOFF, - EGON_FIRE1, - EGON_FIRE2, - EGON_FIRE3, - EGON_FIRE4, - EGON_DRAW, - EGON_HOLSTER -}; - -void -w_flamer_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_flame.fire"); - precache_model("sprites/fthrow.spr"); -#endif - precache_model("models/v_flame.mdl"); - precache_model("models/w_egon.mdl"); - precache_model("models/p_egon.mdl"); -} - -void -w_flamer_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, -1, pl.m_iAmmoCells, -1); -} - -string -w_flamer_wmodel(void) -{ - return "models/w_egon.mdl"; -} - -string -w_flamer_pmodel(player pl) -{ - return "models/p_egon2.mdl"; -} - -string -w_flamer_deathmsg(void) -{ - return "%s burned to a crisp by %s's Flamethrower."; -} - -int -w_flamer_pickup(player pl, int new, int startammo) -{ - return (1); -} - -void -w_flamer_draw(player pl) -{ - Weapons_SetModel("models/v_flame.mdl"); - Weapons_ViewAnimation(pl, EGON_DRAW); -} - -void -w_flamer_holster(player pl) -{ - -} - -void -w_flamer_primary(player pl) -{ - if (pl.w_attack_next > 0.0) - return; - - /* Ammo check */ - if (pl.m_iAmmoCells <= 0) - return; - - pl.m_iAmmoCells--; - Weapons_ViewAnimation(pl, EGON_FIRE1); - -#ifdef SERVER - - static void w_flamer_die(void) { - ncEntity::Destroy(); - } - - static void w_flamer_touch(entity target, entity source) { - ncEntity me = (ncEntity)source; - - if (target.takedamage == DAMAGE_YES) { - ncSurfacePropEntity m = (ncSurfacePropEntity)target; - m.Ignite(source, 5.0f, WEAPON_FLAMER); - } - } - - - - Sound_Play(pl, CHAN_WEAPON, "weapon_flame.fire"); - ncProjectile ball = spawn(ncProjectile); - ball.SetModel("sprites/fthrow.spr"); - ball.SetRenderMode(RM_ADDITIVE); - ball.SetOwner(pl); - ball.SetImpact(w_flamer_touch); - ball.AnimateOnce(0, 15, 0.1f); - -// To be added to spec -// ball.Animate(0,15); -// ball.effects |= EF_BRIGHTLIGHT; - -// Also will need check for water contents (so projectile will die underwater) - - Weapons_MakeVectors(pl); - ball.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 16)); - ball.SetVelocity(v_forward * 300); -#endif - - pl.w_attack_next = 0.2f; - pl.w_idle_next = 0.2f; -} - -void -w_flamer_reload(player pl) -{ -} - -void -w_flamer_release(player pl) -{ - if (pl.w_attack_next > 0) - return; - - if (pl.w_idle_next > 0) - return; - - Weapons_ViewAnimation(pl, EGON_IDLE1); -} - -void -w_flamer_crosshair(player pl) -{ -#ifdef CLIENT - Cross_DrawSub(g_cross_spr, [24,24], [48/128,24/128], [0.1875, 0.1875]); - //Cross_DrawSub(g_cross_spr, [24,24], [72/128,48/128], [0.1875, 0.1875]); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [0,96/128], [24/256, 24/128], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -float -w_flamer_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMEGON : TFCANIM_AIMEGON; -} - -void -w_flamer_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (pl.m_iAmmoCells == 0) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.m_iAmmoCells, 200, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud4_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud3_spr, - [0,0/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -int -w_flamer_isempty(player pl) -{ - - if (pl.m_iAmmoCells <= 0) - return 1; - - return 0; -} - -weapontype_t -w_flamer_type(player pl) -{ - return WPNTYPE_RANGED; -} - -weapon_t w_flamer = -{ - .name = "flamer", - .id = ITEM_FLAMER, - .slot = 3, - .slot_pos = 2, - .weight = WEIGHT_FLAMER, - .draw = w_flamer_draw, - .holster = __NULL__, - .primary = w_flamer_primary, - .secondary = w_flamer_release, - .reload = __NULL__, - .release = w_flamer_release, - .postdraw = w_flamer_crosshair, - .precache = w_flamer_precache, - .pickup = w_flamer_pickup, - .updateammo = w_flamer_updateammo, - .wmodel = w_flamer_wmodel, - .pmodel = w_flamer_pmodel, - .deathmsg = w_flamer_deathmsg, - .aimanim = w_flamer_aimanim, - .isempty = w_flamer_isempty, - .type = w_flamer_type, - .hudpic = w_flamer_hudpic -}; diff --git a/src/shared/w_glauncher.qc b/src/shared/w_glauncher.qc deleted file mode 100644 index 21515f6..0000000 --- a/src/shared/w_glauncher.qc +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -typedef enum -{ - GLAUNCHER_GIDLE, - GLAUNCHER_PIDLE, - GLAUNCHER_GFIRE, - GLAUNCHER_PFIRE, - GLAUNCHER_GRELOAD1, - GLAUNCHER_GRELOAD2, - GLAUNCHER_PRELOAD1, - GLAUNCHER_PRELOAD2, - GLAUNCHER_GDRAW, - GLAUNCHER_PDRAW, - GLAUNCHER_GHOLSTER, - GLAUNCHER_PHOLSTER -} w_glauncher_anims_t; - -void -w_glauncher_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_handgrenade.bounce"); - Sound_Precache("weapon_mp5.gl"); - precache_model("models/w_glauncher.mdl"); - precache_model("models/p_glauncher.mdl"); - precache_model("models/pipebomb.mdl"); -#else - precache_model("models/v_tfgl.mdl"); -#endif -} - -void -w_glauncher_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.mag_glauncher, pl.m_iAmmoRockets, __NULL__); -} - -int -w_glauncher_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - pl.mag_glauncher = bound(0, pl.mag_glauncher + 6, 6); -#endif - return (1); -} - -string -w_glauncher_wmodel(void) -{ - return "models/w_glauncher.mdl"; -} -string -w_glauncher_pmodel(player pl) -{ - return "models/p_glauncher2.mdl"; -} - -string -w_glauncher_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_glauncher_draw(player pl) -{ - Weapons_SetModel("models/v_tfgl.mdl"); - Weapons_ViewAnimation(pl, GLAUNCHER_GDRAW); -} - - -void -w_glauncher_shootnade(player pl) -{ -#ifdef SERVER - vector vecNadeVelocity; - - static void w_glauncher_shootnade_touch(void) { - Sound_Play(self, CHAN_BODY, "weapon_handgrenade.bounce"); - - if (vlen(self.velocity)) - self.avelocity = g_vec_null; - } - - static void w_glauncher_explode(void) { - float dmg = 100; - pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); - Damage_Radius(self.origin, self.owner, dmg, dmg * 2.5f, TRUE, WEAPON_GLAUNCHER); - Sound_Play(self, CHAN_VOICE, "fx.explosion"); - ncEntity::Destroy(); - } - - Weapons_MakeVectors(pl); - vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; - - ncRenderableEntity eNade = spawn(ncRenderableEntity); - eNade.SetModel("models/pipebomb.mdl"); - eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); - eNade.SetOwner(pl); - eNade.SetMovetype(MOVETYPE_BOUNCE); - eNade.SetSolid(SOLID_BBOX); - eNade.SetGravity(1.0f); - eNade.SetVelocity(vecNadeVelocity); - eNade.SetAngularVelocity([300, 300, 300]); - eNade.SetAngles(vectoangles(eNade.GetVelocity())); - eNade.SetSkin(1); - - eNade.touch = w_glauncher_shootnade_touch; - eNade.think = w_glauncher_explode; - eNade.nextthink = time + 2.5f; - - Sound_Play(pl, CHAN_WEAPON, "weapon_mp5.gl"); - - //eNade.traileffectnum = particleeffectnum("weapon_rpg.trail"); -#endif -} - -void -w_glauncher_reload(player pl) -{ - w_baseshotgun_reload(player::mag_glauncher, player::m_iAmmoRockets, 6); -} - -void -w_glauncher_release(player pl) -{ - int s = w_baseshotgun_release(player::mag_glauncher, player::m_iAmmoRockets, 6); - - switch (s) { - case SHOTGUN_IDLE: - Weapons_ViewAnimation(pl, GLAUNCHER_GIDLE); - pl.w_idle_next = 5.0f; - break; - case SHOTGUN_BUSY: - break; - case SHOTGUN_START_RELOAD: - Weapons_ViewAnimation(pl, GLAUNCHER_GRELOAD1); - break; - case SHOTGUN_RELOAD: - break; - case SHOTGUN_END_RELOAD: - Weapons_ViewAnimation(pl, GLAUNCHER_GRELOAD2); - break; - } -} - -void -w_glauncher_primary(player pl) -{ - int s = w_baseprojectile_fire(pl, WEAPON_GLAUNCHER, player::mag_glauncher, w_glauncher_shootnade); - - switch (s) { - case AUTO_FIRE_FAILED: - w_glauncher_release(pl); - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - Weapons_ViewAnimation(pl, GLAUNCHER_GFIRE); - Weapons_ViewPunchAngle(pl, [-1,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTSHOTGUN, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTSHOTGUN, 0.45f); - - pl.w_attack_next = 0.6f; - break; - case AUTO_EMPTY: - Weapons_ViewAnimation(pl, GLAUNCHER_GIDLE); - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 0.6f; -} - -void -w_glauncher_postdraw(player pl) -{ -#ifdef CLIENT - vector aicon_pos; - - Cross_DrawSub(g_cross_spr, [24,24], [24/128,48/128], [0.1875, 0.1875]); - - /* ammo counters */ - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - - /* ammo icon */ - aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic( - aicon_pos, - [24,24], - "sprites/640hud7.spr_0.tga", - [120/256,72/128], - [24/256, 24/128], - g_hud_color, - pSeatLocal->m_flAmmo2Alpha, - DRAWFLAG_ADDITIVE - ); -#endif -} - -float -w_glauncher_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMSHOTGUN : TFCANIM_AIMSHOTGUN; -} - -void -w_glauncher_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud2_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud1_spr, - [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, - .weight = WEIGHT_GLAUNCHER, - .draw = w_glauncher_draw, - .holster = __NULL__, - .primary = w_glauncher_primary, - .secondary = __NULL__, - .reload = w_glauncher_reload, - .release = w_glauncher_release, - .postdraw = w_glauncher_postdraw, - .precache = w_glauncher_precache, - .pickup = w_glauncher_pickup, - .updateammo = w_glauncher_updateammo, - .wmodel = w_glauncher_wmodel, - .pmodel = w_glauncher_pmodel, - .deathmsg = w_glauncher_deathmsg, - .aimanim = w_glauncher_aimanim, - .hudpic = w_glauncher_hudpic, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_grapple.qc b/src/shared/w_grapple.qc deleted file mode 100644 index c7c1834..0000000 --- a/src/shared/w_grapple.qc +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -void -w_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(player pl) -{ - return "models/p_grapple.mdl"; -} - -string -w_grapple_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_grapple_draw(player pl) -{ - Weapons_SetModel("models/v_grapple.mdl"); - Weapons_ViewAnimation(pl, 0); -} - -float -w_grapple_aimanim(player pl) -{ - return pl.IsCrouching() ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; -} - -void -w_grapple_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud4_spr, - [0,0], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud1_spr, - [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, - .weight = WEIGHT_GRAPPLE, - .draw = w_grapple_draw, - .holster = __NULL__, - .primary = __NULL__, - .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = __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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_incendiary.qc b/src/shared/w_incendiary.qc deleted file mode 100644 index 7378e28..0000000 --- a/src/shared/w_incendiary.qc +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2016-2023 Marco Cawthorne - * Copyright (c) 2023 Gethyn ThomasQuail - * - * 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 TFC_RPG_ROCKET_SPEED 900.0f - -enum -{ - INC_IDLE1, - INC_FIDGET1, - INC_FIRE, - INC_HOLSTER1, - INC_DRAW1, - INC_HOLSTER2, - INC_DRAW2, - INC_RELOAD_START, - INC_RELOAD, - INC_RELOAD_END, - INC_IDLE2, - INC_FIDGET2 -}; - -void -w_incendiary_precache(void) -{ - precache_model("models/v_tfc_rpg.mdl"); - precache_model("models/w_incendiary.mdl"); - precache_model("models/p_incendiary.mdl"); - Sound_Precache("weapon_incendiary.fire"); -} - -void -w_incendiary_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoRockets, __NULL__); -} - -string -w_incendiary_wmodel(void) -{ - return "models/w_incendiary.mdl"; -} -string -w_incendiary_pmodel(player pl) -{ - return "models/p_rpg2.mdl"; -} - -string -w_incendiary_deathmsg(void) -{ - return "%s gets well done by %s's incendiary rocket."; - - // TODO - // Has special birthday and suicide death messages -} - -void -w_incendiary_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_rpg.mdl"); - Weapons_ViewAnimation(pl, 0); -} - -void -w_incendiary_shootrocket(player pl) -{ - static void w_incendiary_shootrocket_touch(void) { - pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); - remove(self); - } - - Weapons_MakeVectors(pl); - entity p = spawn(); - setmodel(p, "models/rpgrocket.mdl"); - setorigin(p, Weapons_GetCameraPos(pl) + (v_forward * 8)); - p.owner = self; - p.movetype = MOVETYPE_FLYMISSILE; - p.solid = SOLID_BBOX; - p.gravity = 0.5f; - p.velocity = (v_forward * TFC_RPG_ROCKET_SPEED); - p.angles = vectoangles(p.velocity); - p.touch = w_incendiary_shootrocket_touch; - p.think = Util_Destroy; - p.nextthink = time + 5.0f; -} - -void -w_incendiary_primary(player pl) -{ - int s = w_baseprojectile_fire(pl, WEAPON_INCENDIARY, player::m_iAmmoRockets, w_incendiary_shootrocket); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - Weapons_ViewAnimation(pl, INC_FIRE); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_incendiary.fire"); - Weapons_ViewPunchAngle(pl, [-2,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTRPG, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTRPG, 0.45f); - - pl.w_attack_next = 0.8f; - break; - case AUTO_EMPTY: - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 1.5f; -} - -float -w_incendiary_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMRPG : TFCANIM_AIMRPG; -} - -void -w_incendiary_postdraw(player pl) -{ -#ifdef CLIENT - // crosshair - Cross_DrawSub(g_cross_spr, [24,24], [24/128,48/128], [0.1875, 0.1875]); - // ammo counter - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [120/256,72/128],[24/256, 24/128], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -void -w_incendiary_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud5_spr, - [0,90/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud6_spr, - [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, - .weight = WEIGHT_INCENDIARY, - .draw = w_incendiary_draw, - .holster = __NULL__, - .primary = w_incendiary_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = w_incendiary_postdraw, - .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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_knife.qc b/src/shared/w_knife.qc deleted file mode 100644 index b196045..0000000 --- a/src/shared/w_knife.qc +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2016-2023 Marco Cawthorne - * Copyright (c) 2023 Gethyn ThomasQuail - * - * 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 -{ - KNIFE_IDLE, - KNIFE_IDLE2, - KNIFE_SLASH, - KNIFE_STAB, - KNIFE_DRAW, - KNIFE_HOLSTER -}; - -void -w_knife_precache(void) -{ - Sound_Precache("weapon_crowbar.hit"); - Sound_Precache("weapon_crowbar.miss"); - Sound_Precache("weapon_crowbar.hitbody"); - 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(player pl) -{ - return "models/p_knife.mdl"; -} - -string -w_knife_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_knife_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_knife.mdl"); - Weapons_ViewAnimation(pl, KNIFE_DRAW); -} - -void -w_knife_holster(player pl) -{ - Weapons_ViewAnimation(pl, KNIFE_HOLSTER); -} - -void -w_knife_primary(player pl) -{ - int anim = 0; - vector src; - - if (pl.w_attack_next) { - return; - } - - Weapons_MakeVectors(pl); - src = pl.origin + pl.view_ofs; - - /* make sure we can gib corpses */ - int oldhitcontents = self.hitcontentsmaski; - self.hitcontentsmaski = CONTENTBITS_POINTSOLID | CONTENTBIT_CORPSE; - traceline(src, src + (v_forward * 32), FALSE, pl); - self.hitcontentsmaski = oldhitcontents; - - pl.w_attack_next = 0.4f; - - pl.w_idle_next = 2.5f; - - Weapons_ViewAnimation(pl, KNIFE_SLASH); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, ANIM_CR_SHOOTCROWBAR, 0.41f); - else - Animation_PlayerTop(pl, ANIM_SHOOTCROWBAR, 0.5f); - - Weapons_Sound(pl, CHAN_WEAPON, "weapon_crowbar.miss"); - -#ifdef SERVER - - 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 { - SurfData_Impact(trace_ent, trace_endpos, trace_plane_normal); - } - - // Backstab detection - if (trace_ent.takedamage) { - int damage = 36; - damageType_t dmgtype = DMG_BLUNT; - - if (trace_ent.classname == "player") { - player otherpl = (player) trace_ent; - if (otherpl.IsFacing(pl) == false) { - damage = 500; - dmgtype = DMG_CRUSH; - } - } - Damage_Apply(trace_ent, pl, damage, WEAPON_KNIFE, dmgtype); - if (trace_ent.iBleeds) { - Weapons_Sound(pl, CHAN_WEAPON, "weapon_crowbar.hitbody"); - } else { - Weapons_Sound(pl, CHAN_WEAPON, "weapon_crowbar.hit"); - } - } -#endif -} - -float -w_knife_aimanim(player pl) -{ - return pl.IsCrouching() ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; -} - -void -w_knife_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud4_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud3_spr, - [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, - .weight = WEIGHT_KNIFE, - .draw = w_knife_draw, - .holster = w_knife_holster, - .primary = w_knife_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = __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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_medkit.qc b/src/shared/w_medkit.qc deleted file mode 100644 index e311b59..0000000 --- a/src/shared/w_medkit.qc +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2016-2023 Marco Cawthorne - * Copyright (c) 2023 Gethyn ThomasQuail - * - * 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 -{ - MEDKIT_IDLE1, - MEDKIT_IDLE2, - MEDKIT_USE, - MEDKIT_UNUSED, - MEDKIT_HOLSTER, - MEDKIT_DRAW -}; - -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(player pl) -{ - return "models/p_medkit.mdl"; -} - -string -w_medkit_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_medkit_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_medkit.mdl"); - Weapons_ViewAnimation(pl, 0); -} - -void -w_medkit_primary(player pl) -{ - vector src; - - if (pl.w_attack_next > 0.0) - return; - - // cast our traceline - Weapons_MakeVectors(pl); - src = pl.origin + pl.view_ofs; - - traceline(src, src + (v_forward * 64), FALSE, pl); - - Weapons_ViewAnimation(pl, MEDKIT_USE); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTMEDKIT, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTMEDKIT, 0.45f); - - if (trace_ent.classname == "player") { - player otherpl = (player) trace_ent; - - #ifdef SERVER - if (otherpl.GetTeam() == pl.GetTeam()) { - /* Don't give the player more than 100% health */ - if (otherpl.health < otherpl.m_iMaxHealth) { - /* We want to only give health to our teammate & skip armor */ - otherpl.health = bound(0, otherpl.health + 15, otherpl.m_iMaxHealth); - } - } else { - /* Poison the enemey */ - // TODO - // Needs to last for 10+ seconds and spread to others - Damage_Apply(otherpl, pl, 15, WEAPON_MEDKIT, DMG_GENERIC); - } - Weapons_Sound(pl, CHAN_WEAPON, "weapon_medkit.heal"); - #endif - } - pl.w_attack_next = 0.4f; - pl.w_idle_next = 5.0f; -} - -void -w_medkit_release(player pl) -{ - - if (pl.w_idle_next > 0.0) - return; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, MEDKIT_IDLE1); - pl.w_idle_next = 1.16f; - break; - default: - Weapons_ViewAnimation(pl, MEDKIT_IDLE2); - pl.w_idle_next = 2.36f; - break; - } -} - -float -w_medkit_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMMEDKIT : TFCANIM_AIMMEDKIT; -} - -void -w_medkit_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud5_spr, - [0,180/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud6_spr, - [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, - .weight = WEIGHT_MEDKIT, - .draw = w_medkit_draw, - .holster = __NULL__, - .primary = w_medkit_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_medkit_release, - .postdraw = __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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_nailgun.qc b/src/shared/w_nailgun.qc deleted file mode 100644 index cb9e80b..0000000 --- a/src/shared/w_nailgun.qc +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2016-2024 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -enum -{ - NAILGUN_IDLE, - NAILGUN_FIDGET1, - NAILGUN_UNUSED1, - NAILGUN_UNUSED2, - NAILGUN_DEPLOY, - NAILGUN_SHOOT1, - NAILGUN_SHOOT2, - NAILGUN_SHOOT3, -}; - -void -w_nailgun_precache(void) -{ - precache_model("models/v_tfc_nailgun.mdl"); - precache_model("models/w_nailgun.mdl"); - precache_model("models/p_nailgun.mdl"); - precache_model("models/nail.mdl"); - Sound_Precache("weapon_nailgun.fire"); -} - -void -w_nailgun_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoNails, __NULL__); -} - -string -w_nailgun_wmodel(void) -{ - return "models/w_nailgun.mdl"; -} -string -w_nailgun_pmodel(player pl) -{ - return "models/p_nailgun2.mdl"; -} - -string -w_nailgun_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_nailgun_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_nailgun.mdl"); - Weapons_ViewAnimation(pl, NAILGUN_DEPLOY); -} - -float -w_nailgun_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMMP5 : TFCANIM_AIMMP5; -} - -void -w_nailgun_shootnail(player pl) -{ - static void w_rpg_shootrocket_touch(void) { - #ifndef CLIENT - /* impact per bullet */ - if (trace_ent.iBleeds == 0) { - DecalGroups_Place("Impact.Shot", trace_endpos + (v_forward * -2)); - SurfData_Impact(trace_ent, trace_endpos, trace_plane_normal); - } - if (trace_ent.takedamage == DAMAGE_YES) { - Damage_Apply(trace_ent, self.owner, 9, WEAPON_NAILGUN, DMG_BULLET); - } - #endif - remove(self); - } - - Weapons_MakeVectors(pl); - entity p = spawn(); - setmodel(p, "models/nail.mdl"); - setorigin(p, Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); - p.owner = self; - p.movetype = MOVETYPE_FLYMISSILE; - p.solid = SOLID_BBOX; - p.gravity = 0.5f; - p.velocity = (v_forward * 1000) + (v_up * 4) + (v_right * -2); - p.angles = vectoangles(p.velocity); - p.touch = w_rpg_shootrocket_touch; - p.think = Util_Destroy; - p.nextthink = time + 5.0f; -} - -void -w_nailgun_primary(player pl) -{ - int s = w_baseprojectile_fire(pl, WEAPON_NAILGUN, player::m_iAmmoNails, w_nailgun_shootnail); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - int r = (float)input_sequence % 3; - if (r == 1) { - Weapons_ViewAnimation(pl, NAILGUN_SHOOT1); - } else if (r == 2) { - Weapons_ViewAnimation(pl, NAILGUN_SHOOT2); - } else { - Weapons_ViewAnimation(pl, NAILGUN_SHOOT3); - } - Weapons_ViewAnimation(pl, NAILGUN_SHOOT2); - Weapons_ViewPunchAngle(pl, [-1,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTMP5, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTMP5, 0.45f); - - #ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - #endif - #ifndef CLIENT - Sound_Play(pl, CHAN_WEAPON, "weapon_nailgun.fire"); - #endif - pl.w_attack_next = 0.1f; - break; - case AUTO_EMPTY: - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 1.5f; -} - -void -w_nailgun_crosshair(player pl) -{ -#ifdef CLIENT - Cross_DrawSub(g_cross_spr, [24,24], [0.1875,0], [0.1875, 0.1875]); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [0,72/128],[24/256, 24/128], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -void -w_nailgun_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud7_spr, - [0,90/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud7_spr, - [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, - .weight = WEIGHT_NAILGUN, - .draw = w_nailgun_draw, - .holster = __NULL__, - .primary = w_nailgun_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = w_nailgun_crosshair, - .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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_pipebomb.qc b/src/shared/w_pipebomb.qc deleted file mode 100644 index bd61336..0000000 --- a/src/shared/w_pipebomb.qc +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -void -w_pipebomb_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_handgrenade.bounce"); - Sound_Precache("weapon_mp5.gl"); - precache_model("models/w_pipebomb.mdl"); - precache_model("models/p_pipebomb.mdl"); - precache_model("models/pipebomb.mdl"); -#else - precache_model("models/v_tfgl.mdl"); -#endif -} - -void -w_pipebomb_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.mag_glauncher, pl.m_iAmmoRockets, __NULL__); -} - -int -w_pipebomb_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - pl.mag_glauncher = bound(0, pl.mag_glauncher + 6, 6); -#endif - return (1); -} - -string -w_pipebomb_wmodel(void) -{ - return "models/p_glauncher.mdl"; -} -string -w_pipebomb_pmodel(player pl) -{ - return "models/p_glauncher.mdl"; -} - -string -w_pipebomb_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_pipebomb_draw(player pl) -{ - Weapons_SetModel("models/v_tfgl.mdl"); - Weapons_ViewAnimation(pl, GLAUNCHER_PDRAW); -} - -#ifdef SERVER -void w_pipebomb_explode(void) -{ - pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); - - /* dmg/radius taken from http://web.archive.org/web/20030323072941fw_/http://www.planetfortress.com/tfce/grenades/pipebomb.htm */ - Damage_Radius(self.origin, self.owner, 80, 128, TRUE, WEAPON_GLAUNCHER); - Sound_Play(self, CHAN_VOICE, "fx.explosion"); - ncEntity::Destroy(); -} -#endif - -void -w_pipebomb_shootnade(player pl) -{ - vector vecNadeVelocity; - ncEntity first_nade; - int known_nades = 0i; - float oldest_time = 0.0f; - - static void w_pipebomb_shootnade_touch(void) { - Sound_Play(self, CHAN_BODY, "weapon_handgrenade.bounce"); - - if (vlen(self.velocity)) - self.avelocity = g_vec_null; - } - - Weapons_MakeVectors(pl); - vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; - - ncRenderableEntity eNade = spawn(ncRenderableEntity); - eNade.classname = "pipebomb"; - eNade.SetModel("models/pipebomb.mdl"); - eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); - eNade.SetOwner(pl); - eNade.SetMovetype(MOVETYPE_BOUNCE); - eNade.SetSolid(SOLID_BBOX); - eNade.SetGravity(1.0f); - eNade.SetVelocity(vecNadeVelocity); - eNade.SetAngularVelocity([300, 300, 300]); - eNade.SetAngles(vectoangles(eNade.GetVelocity())); - eNade.SetSkin(0); - - eNade.touch = w_pipebomb_shootnade_touch; - - Sound_Play(pl, CHAN_WEAPON, "weapon_mp5.gl"); - -#ifdef SERVER - /* iterate through and mark the first nade we own */ - for (entity e = world; (e = find(e, ::classname, "pipebomb"));) { - ncEntity pb = (ncEntity)e; - - if (pb.GetOwner() == pl) { - if (pb.GetSpawnAge() > oldest_time) { - first_nade = pb; - oldest_time = pb.GetSpawnAge(); - } - - known_nades++; - } - } - - /* if we have more than 8, destroy the first one we placed */ - if (known_nades > 8) { - first_nade.ScheduleThink(w_pipebomb_explode, 0.0f); - } -#endif - - //eNade.traileffectnum = particleeffectnum("weapon_rpg.trail"); -} - -void -w_pipebomb_reload(player pl) -{ - w_baseshotgun_reload(player::mag_glauncher, player::m_iAmmoRockets, 6); -} - -void -w_pipebomb_release(player pl) -{ - int s = w_baseshotgun_release(player::mag_glauncher, player::m_iAmmoRockets, 6); - - switch (s) { - case SHOTGUN_IDLE: - Weapons_ViewAnimation(pl, GLAUNCHER_PIDLE); - pl.w_idle_next = 5.0f; - break; - case SHOTGUN_BUSY: - break; - case SHOTGUN_START_RELOAD: - Weapons_ViewAnimation(pl, GLAUNCHER_PRELOAD1); - break; - case SHOTGUN_RELOAD: - break; - case SHOTGUN_END_RELOAD: - Weapons_ViewAnimation(pl, GLAUNCHER_PRELOAD2); - break; - } -} - -void -w_pipebomb_primary(player pl) -{ - int s = w_baseprojectile_fire(pl, WEAPON_PIPEBOMB, player::mag_glauncher, w_pipebomb_shootnade); - - switch (s) { - case AUTO_FIRE_FAILED: - w_pipebomb_release(pl); - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - Weapons_ViewAnimation(pl, GLAUNCHER_PFIRE); - Weapons_ViewPunchAngle(pl, [-1,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTSHOTGUN, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTSHOTGUN, 0.45f); - - pl.w_attack_next = 0.6f; - break; - case AUTO_EMPTY: - Weapons_ViewAnimation(pl, GLAUNCHER_PIDLE); - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 0.6f; -} - -void -w_pipebomb_secondary(player pl) -{ - float pb_timer = 0.0f; - - if (pl.w_attack_next > 0) - return; - -#ifdef SERVER - for (entity e = world; (e = find(e, ::classname, "pipebomb"));) { - ncEntity pb = (ncEntity)e; - - if (pb.GetOwner() == pl) { - pb.ScheduleThink(w_pipebomb_explode, pb_timer); - pb_timer += 0.1f; - } - } -#endif - - pl.w_attack_next = 0.5f; -} - -void -w_pipebomb_postdraw(player pl) -{ -#ifdef CLIENT - vector aicon_pos; - - Cross_DrawSub(g_cross_spr, [24,24], [24/128,48/128], [0.1875, 0.1875]); - - /* ammo counters */ - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - - /* ammo icon */ - aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic( - aicon_pos, - [24,24], - "sprites/640hud7.spr_0.tga", - [120/256,72/128], - [24/256, 24/128], - g_hud_color, - pSeatLocal->m_flAmmo2Alpha, - DRAWFLAG_ADDITIVE - ); -#endif -} - -float -w_pipebomb_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMSHOTGUN : TFCANIM_AIMSHOTGUN; -} - -void -w_pipebomb_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud2_spr, - [0,90/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud1_spr, - [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, - .weight = WEIGHT_PIPEBOMB, - .draw = w_pipebomb_draw, - .holster = __NULL__, - .primary = w_pipebomb_primary, - .secondary = w_pipebomb_secondary, - .reload = w_pipebomb_reload, - .release = w_pipebomb_release, - .postdraw = w_pipebomb_postdraw, - .precache = w_pipebomb_precache, - .pickup = w_pipebomb_pickup, - .updateammo = w_pipebomb_updateammo, - .wmodel = w_pipebomb_wmodel, - .pmodel = w_pipebomb_pmodel, - .deathmsg = w_pipebomb_deathmsg, - .aimanim = w_pipebomb_aimanim, - .hudpic = w_pipebomb_hudpic, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_railgun.qc b/src/shared/w_railgun.qc deleted file mode 100644 index 4756442..0000000 --- a/src/shared/w_railgun.qc +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 2016-2023 Marco Cawthorne - * Copyright (c) 2023 Gethyn ThomasQuail - * - * 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 -{ - RAILGUN_IDLE, - RAILGUN_SHOOT, - RAILGUN_DRAW, - RAILGUN_HOLSTER, -}; - -void -w_railgun_precache(void) -{ - precache_model("models/v_tfc_railgun.mdl"); - precache_model("models/w_railgun.mdl"); - precache_model("models/p_railgun.mdl"); - Sound_Precache("weapon_railgun.fire"); -} - -void -w_railgun_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoNails, __NULL__); -} - -string -w_railgun_wmodel(void) -{ - return "models/w_railgun.mdl"; -} -string -w_railgun_pmodel(player pl) -{ - return "models/p_9mmhandgun.mdl"; -} - -string -w_railgun_deathmsg(void) -{ - return "%s was assaulted by %s's railgun."; -} - -void -w_railgun_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_railgun.mdl"); - Weapons_ViewAnimation(pl, RAILGUN_DRAW); -} - -float -w_railgun_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIM1HAND : TFCANIM_AIM1HAND; -} - -void -w_railgun_shootbeam(player pl) -{ -#ifdef SERVER - static void w_railgun_shootbeam_touch(void) { - #ifndef CLIENT - /* impact per bullet */ - if (trace_ent.iBleeds == 0) { - DecalGroups_Place("Impact.BigShot", trace_endpos + (v_forward * -2)); - SurfData_Impact(trace_ent, trace_surfaceflagsi, trace_endpos, trace_plane_normal); - } - if (trace_ent.takedamage == DAMAGE_YES) { - Damage_Apply(trace_ent, self.owner, 23, WEAPON_RAILGUN, DMG_BULLET); - } - #endif - remove(self); - } - - Weapons_MakeVectors(pl); - entity p = spawn(); - setmodel(p, "models/nail.mdl"); - setorigin(p, Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -5) + (v_right * 3.5)); - p.owner = self; - p.movetype = MOVETYPE_FLYMISSILE; - p.solid = SOLID_BBOX; - p.gravity = 0.5f; - p.velocity = (v_forward * 1000) + (v_up * 5) + (v_right * -3.5); - p.angles = vectoangles(p.velocity); - p.touch = w_railgun_shootbeam_touch; - p.think = Util_Destroy; - p.nextthink = time + 5.0f; - p.alpha = 0.01f; - p.traileffectnum = particleeffectnum("weapon_railgun.trail"); -#endif -} - -void -w_railgun_primary(player pl) -{ - int s = w_baseprojectile_fire(pl, WEAPON_RAILGUN, player::m_iAmmoNails, w_railgun_shootbeam); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - int r = (float)input_sequence % 3; - Weapons_ViewAnimation(pl, RAILGUN_SHOOT); - Weapons_ViewPunchAngle(pl, [-1,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOT1HAND, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOT1HAND, 0.45f); - - Weapons_Sound(pl, CHAN_WEAPON, "weapon_railgun.fire"); - pl.w_attack_next = 0.4f; - break; - case AUTO_EMPTY: - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 1.5f; -} - -void -w_railgun_postdraw(player pl) -{ -#ifdef CLIENT - // crosshair - Cross_DrawSub(g_cross_spr, [24,24], [48/128,24/128], [0.1875, 0.1875]); - // ammo counter - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [0,72/128],[24/256, 24/128], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -void -w_railgun_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud7_spr, - [0,0], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud7_spr, - [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, - .weight = WEIGHT_RAILGUN, - .draw = w_railgun_draw, - .holster = __NULL__, - .primary = w_railgun_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = w_railgun_postdraw, - .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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_rpg.qc b/src/shared/w_rpg.qc deleted file mode 100644 index 580829b..0000000 --- a/src/shared/w_rpg.qc +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#define TFC_RPG_ROCKET_SPEED 900.0f - -enum -{ - RPG_IDLE1, - RPG_FIDGET1, - RPG_FIRE, - RPG_HOLSTER1, - RPG_DRAW1, - RPG_HOLSTER2, - RPG_DRAW2, - RPG_RELOAD_START, - RPG_RELOAD, - RPG_RELOAD_END, - RPG_IDLE2, - RPG_FIDGET2 -}; - -void -w_rpg_precache(void) -{ - precache_model("models/v_tfc_rpg.mdl"); - precache_model("models/w_rpg.mdl"); - precache_model("models/p_rpg.mdl"); - precache_model("models/rpgrocket.mdl"); - Sound_Precache("weapon_rpg.fire"); -} - -int -w_rpg_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - pl.mag_rpg = bound(0, pl.mag_rpg + 4, 4); -#endif - return (1); -} - -void -w_rpg_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.mag_rpg, pl.m_iAmmoRockets, __NULL__); -} - -string -w_rpg_wmodel(void) -{ - return "models/w_rpg.mdl"; -} - -string -w_rpg_pmodel(player pl) -{ - return "models/p_rpg.mdl"; -} - -string -w_rpg_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_rpg_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_rpg.mdl"); - Weapons_ViewAnimation(pl, 0); -} - -void -w_rpg_shootrocket(player pl) -{ - static void w_rpg_shootrocket_touch(void) { - pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); - remove(self); - } - - Weapons_MakeVectors(pl); - entity p = spawn(); - setmodel(p, "models/rpgrocket.mdl"); - setorigin(p, Weapons_GetCameraPos(pl) + (v_forward * 8)); - p.owner = self; - p.movetype = MOVETYPE_FLYMISSILE; - p.solid = SOLID_BBOX; - p.gravity = 0.5f; - p.velocity = (v_forward * TFC_RPG_ROCKET_SPEED); - p.angles = vectoangles(p.velocity); - p.touch = w_rpg_shootrocket_touch; - p.think = Util_Destroy; - p.nextthink = time + 5.0f; -} - -void -w_rpg_primary(player pl) -{ - int s = w_baseprojectile_fire(pl, WEAPON_RPG, player::mag_rpg, w_rpg_shootrocket); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_LAST: - case AUTO_FIRED: - Weapons_ViewAnimation(pl, RPG_FIRE); - Weapons_ViewPunchAngle(pl, [-2,0,0]); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_rpg.fire"); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTRPG, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTRPG, 0.45f); - - pl.w_attack_next = 0.8f; - break; - case AUTO_EMPTY: - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 1.5f; -} - -void -w_rpg_reload(player pl) -{ - w_baseshotgun_reload(player::mag_rpg, player::m_iAmmoRockets, 4); -} - -void -w_rpg_release(player pl) -{ - int s = w_baseshotgun_release(player::mag_rpg, player::m_iAmmoRockets, 4); - - switch (s) { - case SHOTGUN_IDLE: - int r = (float)input_sequence % 3; - if (r == 1) { - Weapons_ViewAnimation(pl, RPG_IDLE1); - } else if (r == 2) { - Weapons_ViewAnimation(pl, RPG_FIDGET1); - } else { - Weapons_ViewAnimation(pl, RPG_FIDGET2); - } - pl.w_idle_next = 5.0f; - break; - case SHOTGUN_BUSY: - break; - case SHOTGUN_START_RELOAD: - Weapons_ViewAnimation(pl, RPG_RELOAD_START); - break; - case SHOTGUN_RELOAD: - Weapons_ViewAnimation(pl, RPG_RELOAD); - break; - case SHOTGUN_END_RELOAD: - Weapons_ViewAnimation(pl, RPG_RELOAD_END); - break; - } -} - -float -w_rpg_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMRPG : TFCANIM_AIMRPG; -} - -void -w_rpg_hud(player pl) -{ -#ifdef CLIENT - vector aicon_pos; - - Cross_DrawSub(g_cross_spr, [24,24], [24/128,48/128], [0.1875, 0.1875]); - - /* ammo counters */ - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - - /* ammo icon */ - aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic( - aicon_pos, - [24,24], - g_hud7_spr, - [120/256,72/128], - [24/256, 24/128], - g_hud_color, - pSeatLocal->m_flAmmo2Alpha, - DRAWFLAG_ADDITIVE - ); -#endif -} - - -void -w_rpg_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic(pos, [170,45], g_hud5_spr, [0,45/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); - } else { - drawsubpic(pos, [170,45], g_hud2_spr, [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, - .weight = WEIGHT_RPG, - .draw = w_rpg_draw, - .holster = __NULL__, - .primary = w_rpg_primary, - .secondary = __NULL__, - .reload = w_rpg_reload, - .release = w_rpg_release, - .postdraw = w_rpg_hud, - .precache = w_rpg_precache, - .pickup = w_rpg_pickup, - .updateammo = w_rpg_updateammo, - .wmodel = w_rpg_wmodel, - .pmodel = w_rpg_pmodel, - .deathmsg = w_rpg_deathmsg, - .aimanim = w_rpg_aimanim, - .hudpic = w_rpg_hudpic, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_sbs.qc b/src/shared/w_sbs.qc deleted file mode 100644 index 56e7943..0000000 --- a/src/shared/w_sbs.qc +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -enum -{ - SBS_IDLE1, - SBS_FIRE1, - SBS_FIRE2, - SBS_ADDSHELL, - SBS_PUMP, - SBS_START_RELOAD, - SBS_DRAW, - SBS_HOLSTER, - SBS_IDLE2, - SBS_IDLE3 -}; - -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) -{ - Weapons_UpdateAmmo(pl, pl.mag_sbs, pl.m_iAmmoShells, __NULL__); -} -string w_sbs_wmodel(void) -{ - return "models/ball.mdl"; -} -string w_sbs_pmodel(player pl) -{ - return "models/p_shotgun.mdl"; -} -string w_sbs_deathmsg(void) -{ - return ""; -} - -int -w_sbs_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - pl.mag_sbs = bound(0, pl.mag_sbs + 8, 8); -#endif - return (1); -} - -void -w_sbs_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_12gauge.mdl"); - Weapons_ViewAnimation(pl, SBS_DRAW); -} - -void -w_sbs_holster(player pl) -{ - Weapons_ViewAnimation(pl, SBS_HOLSTER); -} - -void -w_sbs_primary(player pl) -{ - int s = w_baseshotgun_fire(WEAPON_SBS, player::mag_sbs, 6, 4, [0.04, 0.04, 0]); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_LAST: - case AUTO_FIRED: - #ifdef CLIENT - View_SetMuzzleflash(MUZZLE_ROUND); - #endif - Weapons_ViewAnimation(pl, SBS_FIRE1); - Weapons_ViewPunchAngle(pl, [-2,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTSHOTGUN, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTSHOTGUN, 0.45f); - - Weapons_Sound(pl, CHAN_WEAPON, "weapon_sbs.fire"); - pl.w_attack_next = 0.5f; - break; - case AUTO_EMPTY: - Weapons_Sound(pl, CHAN_WEAPON, "weapon_sbs.fire_empty"); - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 1.5f; -} - -void -w_sbs_reload(player pl) -{ - w_baseshotgun_reload(player::mag_sbs, player::m_iAmmoShells, 8); -} - -void -w_sbs_release(player pl) -{ - int s = w_baseshotgun_release(player::mag_sbs, player::m_iAmmoShells, 8); - - switch (s) { - case SHOTGUN_IDLE: - int r = (float)input_sequence % 3; - if (r == 1) { - Weapons_ViewAnimation(pl, SBS_IDLE1); - } else if (r == 2) { - Weapons_ViewAnimation(pl, SBS_IDLE2); - } else { - Weapons_ViewAnimation(pl, SBS_IDLE3); - } - pl.w_idle_next = 5.0f; - break; - case SHOTGUN_BUSY: - break; - case SHOTGUN_START_RELOAD: - Weapons_ViewAnimation(pl, SBS_START_RELOAD); - break; - case SHOTGUN_RELOAD: - Weapons_ViewAnimation(pl, SBS_ADDSHELL); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_sbs.reload"); - break; - case SHOTGUN_END_RELOAD: - Weapons_ViewAnimation(pl, SBS_PUMP); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_sbs.cock"); - break; - } -} - -void -w_sbs_crosshair(player pl) -{ -#ifdef CLIENT - Cross_DrawSub(g_cross_spr, [24,24], [48/128,24/128], [0.1875, 0.1875]); - 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, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -float -w_sbs_aimanim(player pl) -{ - return pl.IsCrouching() ? ANIM_CR_AIMSHOTGUN : ANIM_AIMSHOTGUN; -} - -void -w_sbs_hudpic(player pl, int s, vector pos, float a) -{ -#ifdef CLIENT - if (s) { - drawsubpic(pos, [170,45], g_tfchud2_spr, [0,180/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE); - } else { - drawsubpic(pos, [170,45], g_tfchud1_spr, [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, - .weight = WEIGHT_SBS, - .draw = w_sbs_draw, - .holster = w_sbs_holster, - .primary = w_sbs_primary, - .secondary = w_sbs_release, - .reload = w_sbs_reload, - .release = w_sbs_release, - .postdraw = 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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_sniper.qc b/src/shared/w_sniper.qc deleted file mode 100644 index 9b5c59d..0000000 --- a/src/shared/w_sniper.qc +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -enum -{ - SNIPER_IDLE, - SNIPER_AIM, - SNIPER_FIRE, - SNIPER_DRAW, - SNIPER_HOLSTER, - SNIPER_AUTOIDLE, - SNIPER_AUTOFIRE, - SNIPER_AUTODRAW, - SNIPER_AUTOHOLSTER, -}; - -void -w_sniper_precache(void) -{ - precache_model("models/v_tfc_sniper.mdl"); - precache_model("models/p_sniper.mdl"); - Sound_Precache("weapon_sniper.fire"); -} - -void -w_sniper_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoShells, __NULL__); -} - -string -w_sniper_wmodel(void) -{ - return ""; -} -string -w_sniper_pmodel(player pl) -{ - return "models/p_sniper.mdl"; -} - -string -w_sniper_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_sniper_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_sniper.mdl"); - Weapons_ViewAnimation(pl, SNIPER_DRAW); - pl.w_idle_next = 1.0f; -} - -float -w_sniper_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMSNIPER : TFCANIM_AIMSNIPER; -} - -void -w_sniper_release(player pl) -{ - if (pl.w_idle_next > 0.0) - return; - - if (pl.mode_tempstate > 0) { - float dmg = bound(75, (pl.mode_tempstate/2) * 75, 375); - w_baseauto_fire(WEAPON_SNIPER, player::m_iAmmoShells, dmg, [0,0]); - Weapons_ViewAnimation(pl, SNIPER_FIRE); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTSNIPER, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTSNIPER, 0.45f); - - #ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - #endif - Weapons_Sound(pl, CHAN_WEAPON, "weapon_sniper.fire"); - pl.w_attack_next = 2.0f; - pl.w_idle_next = 0.5f; - pl.mode_tempstate = 0; - } -} - -void -w_sniper_primary(player pl) -{ - /* when moving, immediately release */ - if (vlen(pl.velocity) > 0) { - w_sniper_release(pl); - return; - } - - /* weapon speed check */ - if (pl.w_attack_next > 0.0) - return; - - /* if we aren't already, 'aim' down... */ - - pl.mode_tempstate += 1; - pl.w_attack_next = 1.0f; - - if (pl.mode_tempstate == 0) { - Weapons_ViewAnimation(pl, SNIPER_AIM); - pl.w_idle_next = pl.w_attack_next; - } -} - -void -w_sniper_secondary(player pl) -{ - if (!(input_buttons & INPUT_BUTTON0)) { - if (pl.mode_tempstate != 0) { - w_sniper_release(pl); - return; - } - } - - if (pl.w_idle_next > 0) { - return; - } - - /* Simple toggle of fovs */ - if (pl.viewzoom == 1.0f) { - pl.viewzoom = 0.2f; - } else { - pl.viewzoom = 1.0f; - } - - pl.w_idle_next = 0.25f; -} - -void -w_sniper_postdraw(player pl) -{ -#ifdef CLIENT - Cross_DrawSub(g_cross_spr, [24,24], [72/128,0], [0.1875, 0.1875]); - - if (pl.mode_tempstate) { - vector laser_pos; - float lerpF; - vector jitter = [0.0f, 0.0f, 0.0f]; - Weapons_MakeVectors(pl); - vector src = pl.origin + pl.view_ofs; - float a = bound(0.0, (pl.mode_tempstate / 10), 1.0) * 0.75; - traceline(src, src + (v_forward * 256), FALSE, pl); - lerpF = lerp(32,16, trace_fraction); - jitter[0] = (random(0,2) - 2) * (1 - trace_fraction); - jitter[1] = (random(0,2) - 2) * (1 - trace_fraction); - laser_pos = g_hudmins + (g_hudres / 2) + ([-lerpF,-lerpF] / 2); - - drawsubpic( - laser_pos + jitter, - [lerpF,lerpF], - g_laser_spr, - [0,0], - [1.0, 1.0], - [1,1,1] * (0.25 + a), - 1.0, - DRAWFLAG_ADDITIVE - ); - } - - // ammo counter - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [72/256,72/128], [24/256, 24/128], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -void -w_sniper_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud2_spr, - [0,0], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud1_spr, - [0,0], - [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, - .weight = WEIGHT_SNIPER, - .draw = w_sniper_draw, - .holster = __NULL__, - .primary = w_sniper_primary, - .secondary = w_sniper_secondary, - .reload = __NULL__, - .release = w_sniper_release, - .postdraw = w_sniper_postdraw, - .precache = w_sniper_precache, - .pickup = __NULL__, - .updateammo = w_sniper_updateammo, - .wmodel = __NULL__, - .pmodel = w_sniper_pmodel, - .deathmsg = w_sniper_deathmsg, - .aimanim = w_sniper_aimanim, - .hudpic = w_sniper_hudpic, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_supernail.qc b/src/shared/w_supernail.qc deleted file mode 100644 index 55b079d..0000000 --- a/src/shared/w_supernail.qc +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2016-2024 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -enum -{ - NAILGUN_IDLE, - NAILGUN_FIDGET1, - NAILGUN_UNUSED1, - NAILGUN_UNUSED2, - NAILGUN_DEPLOY, - NAILGUN_SHOOT1, - NAILGUN_SHOOT2, - NAILGUN_SHOOT3, -}; - -void -w_supernail_precache(void) -{ -#ifdef CLIENT - precache_model("models/v_tfc_supernailgun.mdl"); -#else - precache_model("models/w_supernail.mdl"); - precache_model("models/p_supernail.mdl"); - precache_model("models/nail.mdl"); - Sound_Precache("weapon_nailgun.fire"); -#endif -} - -void -w_supernail_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoNails, __NULL__); -} - -string -w_supernail_wmodel(void) -{ - return "models/p_snailgun2.mdl"; -} -string -w_supernail_pmodel(player pl) -{ - return "models/p_snailgun2.mdl"; -} - -string -w_supernail_deathmsg(void) -{ - return "%s was assaulted by %s's Assault Cannon."; -} - -void -w_supernail_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_supernailgun.mdl"); - Weapons_ViewAnimation(pl, NAILGUN_DEPLOY); -} - -float -w_supernail_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIMMP5 : TFCANIM_AIMMP5; -} - -void -w_supernail_shootnail(player pl) -{ - static void w_rpg_shootrocket_touch(void) { - #ifndef CLIENT - /* impact per bullet */ - if (trace_ent.iBleeds == 0) { - DecalGroups_Place("Impact.BigShot", trace_endpos + (v_forward * -2)); - SurfData_Impact(trace_ent, trace_endpos, trace_plane_normal); - } - if (trace_ent.takedamage == DAMAGE_YES) { - Damage_Apply(trace_ent, self.owner, 14, WEAPON_NAILGUN, DMG_BULLET); - } - #endif - remove(self); - } - - Weapons_MakeVectors(pl); - entity p = spawn(); - setmodel(p, "models/nail.mdl"); - setorigin(p, Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); - p.owner = self; - p.movetype = MOVETYPE_FLYMISSILE; - p.solid = SOLID_BBOX; - p.gravity = 0.5f; - p.velocity = (v_forward * 1000) + (v_up * 4) + (v_right * -2); - p.angles = vectoangles(p.velocity); - p.touch = w_rpg_shootrocket_touch; - p.think = Util_Destroy; - p.nextthink = time + 5.0f; -} - -void -w_supernail_primary(player pl) -{ - int s = w_baseprojectile_fire_num(pl, WEAPON_NAILGUN, player::m_iAmmoNails, w_supernail_shootnail, 2); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - int r = (float)input_sequence % 3; - if (r == 1) { - Weapons_ViewAnimation(pl, NAILGUN_SHOOT1); - } else if (r == 2) { - Weapons_ViewAnimation(pl, NAILGUN_SHOOT2); - } else { - Weapons_ViewAnimation(pl, NAILGUN_SHOOT3); - } - Weapons_ViewAnimation(pl, NAILGUN_SHOOT2); - Weapons_ViewPunchAngle(pl, [-1,0,0]); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOTMP5, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOTMP5, 0.45f); - - #ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - #endif - #ifndef CLIENT - Sound_Play(pl, CHAN_WEAPON, "weapon_nailgun.fire"); - #endif - pl.w_attack_next = 0.1f; - break; - case AUTO_EMPTY: - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 1.5f; -} - -void -w_supernail_hud(player pl) -{ -#ifdef CLIENT - vector aicon_pos; - - Cross_DrawSub(g_cross_spr, [24,24], [0.1875,0], [0.1875, 0.1875]); - HUD_DrawAmmo2(); - - aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic( - aicon_pos, - [24,24], - g_hud7_spr, - [0,72/128], - [24/256, 24/128], - g_hud_color, - pSeatLocal->m_flAmmo2Alpha, - DRAWFLAG_ADDITIVE - ); -#endif -} - -void -w_supernail_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud7_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud7_spr, - [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, - .weight = WEIGHT_SUPERNAIL, - .draw = w_supernail_draw, - .holster = __NULL__, - .primary = w_supernail_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = w_supernail_hud, - .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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_tranquil.qc b/src/shared/w_tranquil.qc deleted file mode 100644 index b9b1961..0000000 --- a/src/shared/w_tranquil.qc +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -enum -{ - TRANQUIL_IDLE1, - TRANQUIL_IDLE2, - TRANQUIL_IDLE3, - TRANQUIL_SHOOT, - TRANQUIL_SHOOT_EMPTY, - TRANQUIL_RELOAD_EMPTY, - TRANQUIL_RELOAD, - TRANQUIL_DRAW, - TRANQUIL_HOLSTER -}; - -void -w_tranquil_precache(void) -{ - precache_model("models/v_tfc_pistol.mdl"); - precache_model("models/w_tranquil.mdl"); - precache_model("models/p_tranquil.mdl"); - Sound_Precache("weapon_tranquilizer.fire"); -} - -void -w_tranquil_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoShells, __NULL__); -} - -string -w_tranquil_wmodel(void) -{ - return "models/w_tranquil.mdl"; -} -string -w_tranquil_pmodel(player pl) -{ - return "models/p_9mmhandgun2.mdl"; -} - -string -w_tranquil_deathmsg(void) -{ - return "%s is put to sleep by %s."; -} - -void -w_tranquil_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_pistol.mdl"); - Weapons_ViewAnimation(pl, TRANQUIL_DRAW); - Weapons_SetGeomset("geomset 2 2\n"); -} - -void -w_tranquil_shootdart(player pl) -{ - static void w_rpg_shootrocket_touch(void) { - #ifndef CLIENT - /* impact per bullet */ - if (trace_ent.iBleeds == 0) { - DecalGroups_Place("Impact.BigShot", trace_endpos + (v_forward * -2)); - SurfData_Impact(trace_ent, trace_surfaceflagsi, trace_endpos, trace_plane_normal); - } - if (trace_ent.takedamage == DAMAGE_YES) { - Damage_Apply(trace_ent, self.owner, 18, WEAPON_TRANQUIL, DMG_BULLET); - } - #endif - remove(self); - } - - Weapons_MakeVectors(pl); - entity p = spawn(); - setmodel(p, "models/nail.mdl"); - setorigin(p, Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); - p.owner = self; - p.movetype = MOVETYPE_FLYMISSILE; - p.solid = SOLID_BBOX; - p.gravity = 0.5f; - p.velocity = (v_forward * 1000) + (v_up * 4) + (v_right * -2); - p.angles = vectoangles(p.velocity); - p.touch = w_rpg_shootrocket_touch; - p.think = Util_Destroy; - p.nextthink = time + 5.0f; -} - -void -w_tranquil_primary(player pl) -{ - int s = w_baseprojectile_fire(pl, WEAPON_TRANQUIL, player::m_iAmmoShells, w_tranquil_shootdart); - - switch (s) { - case AUTO_FIRE_FAILED: - return; - break; - case AUTO_FIRED: - case AUTO_LAST: - Weapons_ViewAnimation(pl, TRANQUIL_SHOOT); - Weapons_ViewPunchAngle(pl, [-2,0,0]); - Weapons_Sound(pl, CHAN_WEAPON, "weapon_tranquilizer.fire"); - - if (pl.IsCrouching()) - Animation_PlayerTop(pl, TFCANIM_CR_SHOOT1HAND, 0.45f); - else - Animation_PlayerTop(pl, TFCANIM_SHOOT1HAND, 0.45f); - - pl.w_attack_next = 1.5f; - break; - case AUTO_EMPTY: - pl.w_attack_next = 0.2f; - break; - } - - pl.w_idle_next = 2.5f; -} - -float -w_tranquil_aimanim(player pl) -{ - return pl.IsCrouching() ? TFCANIM_CR_AIM1HAND : TFCANIM_AIM1HAND; -} - -void -w_tranquil_hud(player pl) -{ -#ifdef CLIENT - vector aicon_pos; - - aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - - Cross_DrawSub(g_cross_spr, [24,24], [0.1875,0], [0.1875, 0.1875]); - - HUD_DrawAmmo2(); - - - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [72/256,72/128], [24/256, 24/128], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -void -w_tranquil_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud5_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud6_spr, - [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, - .weight = WEIGHT_TRANQUIL, - .draw = w_tranquil_draw, - .holster = __NULL__, - .primary = w_tranquil_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = w_tranquil_hud, - .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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_umbrella.qc b/src/shared/w_umbrella.qc deleted file mode 100644 index 32afbf9..0000000 --- a/src/shared/w_umbrella.qc +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* 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(player pl) -{ - return "models/p_umbrella.mdl"; -} - -string -w_umbrella_deathmsg(void) -{ - return "%s was assaulted by %s's Umbrella."; -} - -void -w_umbrella_draw(player pl) -{ - Weapons_SetModel("models/v_umbrella.mdl"); - Weapons_ViewAnimation(pl, UMBRELLA_DRAW); -} - -void -w_umbrella_holster(player pl) -{ - Weapons_ViewAnimation(pl, UMBRELLA_HOLSTER); -} - -void -w_umbrella_primary(player pl) -{ - int anim = 0; - vector src; - - if (pl.w_attack_next) { - return; - } - - Weapons_MakeVectors(pl); - 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(pl, 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.IsCrouching()) { - Animation_PlayerTop(pl, ANIM_SHOOTCROWBAR, 0.5f); - } else { - Animation_PlayerTop(pl, 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 { - SurfData_Impact(trace_ent, trace_endpos, trace_plane_normal); - } - - if (trace_ent.takedamage) { - Damage_Apply(trace_ent, self, 18, 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(player pl) -{ - - if (pl.w_idle_next) { - return; - } - - Weapons_ViewAnimation(pl, UMBRELLA_IDLE); - pl.w_idle_next = 15.0f; -} - -float -w_umbrella_aimanim(player pl) -{ - return pl.IsCrouching() ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; -} - -void -w_umbrella_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud4_spr, - [0,0], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud1_spr, - [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, - .weight = WEIGHT_UMBRELLA, - .draw = w_umbrella_draw, - .holster = w_umbrella_holster, - .primary = w_umbrella_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_umbrella_release, - .postdraw = __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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/w_wrench.qc b/src/shared/w_wrench.qc deleted file mode 100644 index 9157831..0000000 --- a/src/shared/w_wrench.qc +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * Copyright (c) 2022 Gethyn ThomasQuail - * - * 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) -{ - Weapons_UpdateAmmo(pl, __NULL__, pl.m_iAmmoCells, __NULL__); -} - -string -w_wrench_wmodel(void) -{ - return "models/ball.mdl"; -} -string -w_wrench_pmodel(player pl) -{ - return "models/p_spanner.mdl"; -} - -string -w_wrench_deathmsg(void) -{ - return "%s was assaulted by %s's wrench."; -} - -void -w_wrench_draw(player pl) -{ - Weapons_SetModel("models/v_tfc_spanner.mdl"); - Weapons_ViewAnimation(pl, WRENCH_DRAW); -} - -void -w_wrench_holster(player pl) -{ - Weapons_ViewAnimation(pl, WRENCH_HOLSTER); -} - -void -w_wrench_primary(player pl) -{ - int anim = 0; - vector src; - - if (pl.w_attack_next) { - return; - } - - Weapons_MakeVectors(pl); - 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(pl, 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.IsCrouching()) { - Animation_PlayerTop(pl, ANIM_SHOOTCROWBAR, 0.5f); - } else { - Animation_PlayerTop(pl, ANIM_CR_SHOOTCROWBAR, 0.42f); - } - - sound(pl, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM); - - if (trace_fraction >= 1.0) { - return; - } - - if (trace_ent.classname == "TFCSentry") { - TFCSentry sentry = (TFCSentry)trace_ent; - /* todo - } else if (trace_ent.classname == "TFCDispenser") { - TFCDispenser dispenser = (TFCDispenser)trace_ent; - todo - } else if (trace_ent.classname == "TFCTeleporter") { - TFCTeleporter teleporter = (TFCTeleporter)trace_ent; - todo - } else if (trace_ent.classname == "TFCTeleporterExit") { - TFCTeleporterExit teleporterexit = (TFCTeleporterExit)trace_ent; - todo */ - } else { - /* don't bother with decals, we got squibs */ - if (trace_ent.iBleeds) { - FX_Blood(trace_endpos, [1,0,0]); - } else { - SurfData_Impact(trace_ent, trace_endpos, trace_plane_normal); - } - - /* Damage without armor is between 12 - 20, so let's just do 15 for now */ - if (trace_ent.takedamage) { - Damage_Apply(trace_ent, pl, 18, WEAPON_WRENCH, DMG_BLUNT); - if (trace_ent.iBleeds) { - Sound_Play(self, CHAN_WEAPON, "weapon_crowbar.hitbody"); - } - } else { - Sound_Play(self, CHAN_WEAPON, "weapon_crowbar.hit"); - } - } - -#endif -} - -void -w_wrench_release(player pl) -{ - - if (pl.w_idle_next) { - return; - } - - Weapons_ViewAnimation(pl, WRENCH_IDLE); - pl.w_idle_next = 15.0f; -} - -void -w_wrench_crosshair(player pl) -{ -#ifdef CLIENT - vector aicon_pos; - - aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - - drawsubpic( - aicon_pos, - [24,24], - g_hud7_spr, - [0,96/128], - [24/256,24/128], - g_hud_color, - pSeatLocal->m_flAmmo2Alpha, - DRAWFLAG_ADDITIVE - ); - - HUD_DrawAmmo2(); -#endif -} - -float -w_wrench_aimanim(player pl) -{ - return pl.IsCrouching() ? ANIM_CR_AIMCROWBAR : ANIM_AIMCROWBAR; -} - -void -w_wrench_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_tfchud4_spr, - [0,180/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_tfchud3_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } - - HUD_DrawAmmoBar(pos, pl.m_iAmmoCells, MAX_A_CELLS, a); -#endif -} - -weapon_t w_wrench = -{ - .name = "wrench", - .id = ITEM_WRENCH, - .slot = 0, - .slot_pos = 3, - .weight = WEIGHT_WRENCH, - .draw = w_wrench_draw, - .holster = w_wrench_holster, - .primary = w_wrench_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_wrench_release, - .postdraw = w_wrench_crosshair, - .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, - .isempty = w_asscan_isempty -}; diff --git a/src/shared/weapon_baseautomatic.qc b/src/shared/weapon_baseautomatic.qc deleted file mode 100644 index 7c95441..0000000 --- a/src/shared/weapon_baseautomatic.qc +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2016-2022 Vera Visions LLC. - * - * 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 -{ - AUTO_FIRE_FAILED, - AUTO_FIRED, - AUTO_LAST, - AUTO_EMPTY -}; - -int -w_baseauto_fire(int w, .int mag, int d, vector bs) -{ - player pl = (player)self; - - if (pl.w_attack_next > 0.0) { - return (AUTO_FIRE_FAILED); - } - if (pl.gflags & GF_SEMI_TOGGLED) { - return (AUTO_FIRE_FAILED); - } - if (pl.(mag) <= 0) { - pl.gflags |= GF_SEMI_TOGGLED; - return (AUTO_EMPTY); - } - - pl.(mag)--; - -#ifdef SERVER - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, d, bs, w); -#endif - - if (pl.(mag) == 0) - return (AUTO_LAST); - else - return (AUTO_FIRED); -} diff --git a/src/shared/weapon_basemelee.qc b/src/shared/weapon_basemelee.qc deleted file mode 100644 index b858179..0000000 --- a/src/shared/weapon_basemelee.qc +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2016-2022 Vera Visions LLC. - * - * 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 -{ - MELEE_FAILED, - MELEE_MISS, - MELEE_HIT, - MELEE_HITBODY -}; - -int -w_basemelee_fire(int d, int w) -{ - int anim = 0; - vector src; - player pl = (player)self; - - if (pl.w_attack_next > 0.0) { - return (MELEE_FAILED); - } - - Weapons_MakeVectors(pl); - src = pl.origin + pl.view_ofs; - - /* make sure we can gib corpses */ - int oldhitcontents = self.hitcontentsmaski; - self.hitcontentsmaski = CONTENTBITS_POINTSOLID | CONTENTBIT_CORPSE; - traceline(src, src + (v_forward * 32), FALSE, pl); - self.hitcontentsmaski = oldhitcontents; - - pl.w_attack_next = 0.5f; - pl.w_idle_next = 2.5f; - - if (trace_fraction >= 1.0) { - return (MELEE_MISS); - } - -#ifdef SERVER - if (trace_ent.takedamage) { - Damage_Apply(trace_ent, pl, d, w, DMG_BLUNT); - } -#endif - - return (MELEE_HIT); -} diff --git a/src/shared/weapon_baseprojectile.qc b/src/shared/weapon_baseprojectile.qc deleted file mode 100644 index 883d385..0000000 --- a/src/shared/weapon_baseprojectile.qc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2016-2022 Vera Visions LLC. - * - * 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 -{ - SEMI_FIRE_FAILED, - SEMI_FIRED, - SEMI_LAST, - SEMI_EMPTY -}; - -int -w_baseprojectile_fire(player pl, int w, .int mag, void(player) spawnfunc) -{ - if (pl.w_attack_next > 0.0) { - return (SEMI_FIRE_FAILED); - } - if (pl.gflags & GF_SEMI_TOGGLED) { - return (SEMI_FIRE_FAILED); - } - if (pl.(mag) <= 0) { - return (SEMI_EMPTY); - } - - pl.(mag)--; - -#ifdef SERVER - spawnfunc(pl); -#endif - - if (pl.(mag) == 0) - return (SEMI_LAST); - else - return (SEMI_FIRED); -} - -int -w_baseprojectile_fire_num(player pl, int w, .int mag, void(player) spawnfunc, int num) -{ - if (pl.w_attack_next > 0.0) { - return (SEMI_FIRE_FAILED); - } - if (pl.gflags & GF_SEMI_TOGGLED) { - return (SEMI_FIRE_FAILED); - } - if ((pl.(mag) - num) < 0) { - return (SEMI_EMPTY); - } - - pl.(mag) -= num; - -#ifdef SERVER - spawnfunc(pl); -#endif - - if (pl.(mag) == 0) - return (SEMI_LAST); - else - return (SEMI_FIRED); -} - diff --git a/src/shared/weapon_basesemi.qc b/src/shared/weapon_basesemi.qc deleted file mode 100644 index 4ab1844..0000000 --- a/src/shared/weapon_basesemi.qc +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2016-2022 Vera Visions LLC. - * - * 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 -{ - SEMI_FIRE_FAILED, - SEMI_FIRED, - SEMI_LAST, - SEMI_EMPTY -}; - -int -w_basesemi_fire(int w, .int mag, int d, vector bs) -{ - player pl = (player)self; - - if (pl.w_attack_next > 0.0) { - return (SEMI_FIRE_FAILED); - } - if (pl.gflags & GF_SEMI_TOGGLED) { - return (SEMI_FIRE_FAILED); - } - if (pl.(mag) <= 0) { - pl.gflags |= GF_SEMI_TOGGLED; - return (SEMI_EMPTY); - } - - pl.(mag)--; - -#ifdef SERVER - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, d, bs, w); -#endif - - pl.gflags |= GF_SEMI_TOGGLED; - - if (pl.(mag) == 0) - return (SEMI_LAST); - else - return (SEMI_FIRED); -} diff --git a/src/shared/weapon_baseshotgun.qc b/src/shared/weapon_baseshotgun.qc deleted file mode 100644 index 98bda6d..0000000 --- a/src/shared/weapon_baseshotgun.qc +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2016-2022 Vera Visions LLC. - * - * 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 -{ - SHOTGUN_FIRE_FAILED, - SHOTGUN_FIRED, - SHOTGUN_LAST, - SHOTGUN_EMPTY -}; - -int -w_baseshotgun_fire(int w, .int mag, int c, int d, vector bs) -{ - player pl = (player)self; - - if (pl.w_attack_next > 0.0) { - return (SHOTGUN_FIRE_FAILED); - } - if (pl.gflags & GF_SEMI_TOGGLED) { - return (SHOTGUN_FIRE_FAILED); - } - if (pl.(mag) <= 0) { - pl.gflags |= GF_SEMI_TOGGLED; - return (SHOTGUN_EMPTY); - } - - pl.(mag)--; - -#ifdef SERVER - TraceAttack_FireBullets(c, pl.origin + pl.view_ofs, d, bs, w); -#endif - - if (pl.(mag) == 0) - return (SHOTGUN_LAST); - else - return (SHOTGUN_FIRED); -} - -enum -{ - SHOTTY_IDLE, - SHOTTY_RELOAD_START, - SHOTTY_RELOAD, - SHOTTY_RELOAD_END, - SHOTTY_COCKSOUND -}; - -void -w_baseshotgun_reload(.int mag, .int ammo, int max) -{ - player pl = (player)self; - - if (pl.(mag) >= max) { - return; - } - if (pl.(ammo) <= 0) { - return; - } - if (pl.mode_tempstate > SHOTTY_IDLE) { - return; - } - - pl.mode_tempstate = SHOTTY_RELOAD_START; - pl.w_idle_next = 0.0f; -} - -enum -{ - SHOTGUN_IDLE, - SHOTGUN_BUSY, - SHOTGUN_START_RELOAD, - SHOTGUN_RELOAD, - SHOTGUN_END_RELOAD -}; - -int -w_baseshotgun_release(.int mag, .int ammo, int max) -{ - player pl = (player)self; - - if (pl.w_idle_next > 0.0) { - return (SHOTGUN_BUSY); - } - - if (pl.mode_tempstate == SHOTTY_RELOAD_START) { - pl.mode_tempstate = SHOTTY_RELOAD; - pl.w_idle_next = 0.65f; - return (SHOTGUN_START_RELOAD); - } else if (pl.mode_tempstate == SHOTTY_RELOAD) { - pl.(mag)++; - pl.(ammo)--; - - if (pl.(ammo) <= 0 || pl.(mag) >= max) { - pl.mode_tempstate = SHOTTY_RELOAD_END; - } - Weapons_UpdateAmmo(pl, pl.(mag), pl.(ammo), pl.mode_tempstate); - pl.w_idle_next = 0.5f; - return (SHOTGUN_RELOAD); - } else if (pl.mode_tempstate == SHOTTY_RELOAD_END) { - pl.mode_tempstate = SHOTTY_IDLE; - pl.w_idle_next = 10.0f; - pl.w_attack_next = 0.5f; - return (SHOTGUN_END_RELOAD); - } - - return (SHOTGUN_IDLE); -} diff --git a/src/shared/weapons.qc b/src/shared/weapons.qc deleted file mode 100644 index f811475..0000000 --- a/src/shared/weapons.qc +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -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 -};