From 1550f8cbe16f91f74fb6f8ebabd768bed0cb38ed Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 23 Jul 2024 17:54:58 -0700 Subject: [PATCH 01/17] Rebase against Nuclide Develop, convert most things over --- README.md | 2 +- manifest.fmf | 14 - radiant.game | 26 ++ radiant.xml | 76 ++++ src/client/Makefile | 4 +- src/client/cmds.qc | 2 +- src/client/crosshair.qc | 9 +- src/client/defs.h | 2 +- src/client/entities.qc | 6 + src/client/hud.qc | 28 +- src/client/hud_ammonotify.qc | 4 +- src/client/hud_weaponselect.qc | 20 +- src/client/init.qc | 4 + src/client/nightvision.qc | 12 +- src/client/progs.src | 4 +- src/client/radar.qc | 58 +-- src/client/textmenu.qc | 4 +- src/client/vgui_buymenu.qc | 2 +- src/client/vgui_buypages.qc | 26 +- src/client/vgui_changeclass_ct.qc | 2 +- src/client/vgui_changeclass_t.qc | 2 +- src/client/vgui_chooseteam.qc | 2 +- src/client/vgui_motd.qc | 2 +- src/server/Makefile | 4 +- src/server/ammo.qc | 26 +- src/server/armoury_entity.qc | 48 +- src/server/bot.qc | 58 +-- src/server/buy.qc | 12 +- src/server/func_bomb_target.qc | 2 +- src/server/func_buyzone.qc | 2 +- src/server/func_escapezone.qc | 4 +- src/server/func_hostage_rescue.qc | 6 +- src/server/func_vip_safetyzone.qc | 2 +- src/server/game_money.qc | 2 +- src/server/gamerules.h | 1 - src/server/gamerules.qc | 96 +--- src/server/gamerules_deathmatch.qc | 17 +- src/server/gamerules_multiplayer.qc | 272 ++++++------ src/server/gamerules_singleplayer.qc | 2 - src/server/hostage_entity.qc | 85 +--- src/server/info_buyzone.qc | 5 +- src/server/info_hostage_rescue.qc | 9 +- src/server/item_suit.qc | 5 +- src/server/player.qc | 9 - src/server/progs.src | 5 +- src/server/server.qc | 5 +- src/shared/CSProjectile.h | 8 + src/shared/CSProjectile.qc | 5 + src/shared/CSWeapon.qc | 220 ++++++++++ src/shared/animations.h | 6 +- src/shared/animations.qc | 16 +- src/shared/defs.h | 1 - src/shared/include.src | 36 +- src/shared/item_c4bomb.h | 4 - src/shared/item_c4bomb.qc | 66 ++- src/shared/items.h | 4 +- src/shared/player.h | 315 ++------------ src/shared/pmove.h | 19 - src/shared/pmove.qc | 38 +- src/shared/w_ak47.qc | 342 --------------- src/shared/w_aug.qc | 329 -------------- src/shared/w_awp.qc | 383 ---------------- src/shared/w_c4bomb.qc | 262 ----------- src/shared/w_deagle.qc | 339 --------------- src/shared/w_elites.qc | 410 ------------------ src/shared/w_fiveseven.qc | 309 ------------- src/shared/w_flashbang.qc | 307 ------------- src/shared/w_g3sg1.qc | 318 -------------- src/shared/w_glock18.qc | 395 ----------------- src/shared/w_hegrenade.qc | 310 ------------- src/shared/w_knife.qc | 323 -------------- src/shared/w_m3.qc | 378 ---------------- src/shared/w_m4a1.qc | 383 ---------------- src/shared/w_mac10.qc | 304 ------------- src/shared/w_mp5.qc | 302 ------------- src/shared/w_p228.qc | 310 ------------- src/shared/w_p90.qc | 302 ------------- src/shared/w_para.qc | 299 ------------- src/shared/w_scout.qc | 344 --------------- src/shared/w_sg550.qc | 321 -------------- src/shared/w_sg552.qc | 326 -------------- src/shared/w_smokegrenade.qc | 306 ------------- src/shared/w_tmp.qc | 302 ------------- src/shared/w_ump45.qc | 301 ------------- src/shared/w_usp45.qc | 376 ---------------- src/shared/w_xm1014.qc | 381 ---------------- src/shared/weapons.h | 4 + src/shared/weapons.qc | 64 --- src/shared/weapons_cstrike.qc | 29 +- zpak001.pk3dir/PAK_NAME | 1 + zpak001.pk3dir/cfg/skill_cstrike.cfg | 12 +- ...progs.dat.en.po => csprogs.dat.default.po} | 19 +- zpak001.pk3dir/def/ammo.def | 116 +++++ zpak001.pk3dir/def/bot.def | 4 - zpak001.pk3dir/def/hostage.def | 16 + zpak001.pk3dir/def/item_c4.def | 12 + zpak001.pk3dir/def/player.def | 4 + zpak001.pk3dir/def/spawns.def | 26 ++ zpak001.pk3dir/def/weapons.def | 76 ++++ zpak001.pk3dir/def/weapons/ak47.def | 54 +++ zpak001.pk3dir/def/weapons/aug.def | 54 +++ zpak001.pk3dir/def/weapons/awp.def | 64 +++ zpak001.pk3dir/def/weapons/c4.def | 33 ++ zpak001.pk3dir/def/weapons/deagle.def | 55 +++ zpak001.pk3dir/def/weapons/elites.def | 66 +++ zpak001.pk3dir/def/weapons/fiveseven.def | 57 +++ zpak001.pk3dir/def/weapons/flashbang.def | 46 ++ zpak001.pk3dir/def/weapons/g3sg1.def | 54 +++ zpak001.pk3dir/def/weapons/glock18.def | 65 +++ zpak001.pk3dir/def/weapons/hegrenade.def | 63 +++ zpak001.pk3dir/def/weapons/knife.def | 40 ++ zpak001.pk3dir/def/weapons/m249.def | 54 +++ zpak001.pk3dir/def/weapons/m3.def | 57 +++ zpak001.pk3dir/def/weapons/m4a1.def | 70 +++ zpak001.pk3dir/def/weapons/mac10.def | 55 +++ zpak001.pk3dir/def/weapons/mp5navy.def | 55 +++ zpak001.pk3dir/def/weapons/p228.def | 57 +++ zpak001.pk3dir/def/weapons/p90.def | 55 +++ zpak001.pk3dir/def/weapons/scout.def | 55 +++ zpak001.pk3dir/def/weapons/sg550.def | 54 +++ zpak001.pk3dir/def/weapons/sg552.def | 56 +++ zpak001.pk3dir/def/weapons/smokegrenade.def | 50 +++ zpak001.pk3dir/def/weapons/tmp.def | 56 +++ zpak001.pk3dir/def/weapons/ump45.def | 57 +++ zpak001.pk3dir/def/weapons/usp.def | 86 ++++ zpak001.pk3dir/def/weapons/xm1014.def | 59 +++ zpak001.pk3dir/scripts/bots.txt | 59 +++ zpak001.pk3dir/scripts/constants.txt | 29 -- zpak001.pk3dir/scripts/maptweaks.txt | 6 + zpak001.pk3dir/scripts/surfaceproperties.txt | 224 ++++++++++ zpak001.pk3dir/sound/player.sndshd | 5 + zpak001.pk3dir/sound/weapons_cstrike.sndshd | 91 ++-- 132 files changed, 2957 insertions(+), 10055 deletions(-) delete mode 100644 manifest.fmf create mode 100644 radiant.game create mode 100644 radiant.xml create mode 100644 src/shared/CSProjectile.h create mode 100644 src/shared/CSProjectile.qc create mode 100644 src/shared/CSWeapon.qc delete mode 100644 src/shared/pmove.h delete mode 100644 src/shared/w_ak47.qc delete mode 100644 src/shared/w_aug.qc delete mode 100644 src/shared/w_awp.qc delete mode 100644 src/shared/w_c4bomb.qc delete mode 100644 src/shared/w_deagle.qc delete mode 100644 src/shared/w_elites.qc delete mode 100644 src/shared/w_fiveseven.qc delete mode 100644 src/shared/w_flashbang.qc delete mode 100644 src/shared/w_g3sg1.qc delete mode 100644 src/shared/w_glock18.qc delete mode 100644 src/shared/w_hegrenade.qc delete mode 100644 src/shared/w_knife.qc delete mode 100644 src/shared/w_m3.qc delete mode 100644 src/shared/w_m4a1.qc delete mode 100644 src/shared/w_mac10.qc delete mode 100644 src/shared/w_mp5.qc delete mode 100644 src/shared/w_p228.qc delete mode 100644 src/shared/w_p90.qc delete mode 100644 src/shared/w_para.qc delete mode 100644 src/shared/w_scout.qc delete mode 100644 src/shared/w_sg550.qc delete mode 100644 src/shared/w_sg552.qc delete mode 100644 src/shared/w_smokegrenade.qc delete mode 100644 src/shared/w_tmp.qc delete mode 100644 src/shared/w_ump45.qc delete mode 100644 src/shared/w_usp45.qc delete mode 100644 src/shared/w_xm1014.qc delete mode 100644 src/shared/weapons.qc create mode 100644 zpak001.pk3dir/PAK_NAME rename zpak001.pk3dir/{csprogs.dat.en.po => csprogs.dat.default.po} (93%) mode change 100755 => 100644 create mode 100644 zpak001.pk3dir/def/ammo.def delete mode 100644 zpak001.pk3dir/def/bot.def create mode 100644 zpak001.pk3dir/def/hostage.def create mode 100644 zpak001.pk3dir/def/item_c4.def create mode 100644 zpak001.pk3dir/def/player.def create mode 100644 zpak001.pk3dir/def/spawns.def create mode 100644 zpak001.pk3dir/def/weapons/ak47.def create mode 100644 zpak001.pk3dir/def/weapons/aug.def create mode 100644 zpak001.pk3dir/def/weapons/awp.def create mode 100644 zpak001.pk3dir/def/weapons/c4.def create mode 100644 zpak001.pk3dir/def/weapons/deagle.def create mode 100644 zpak001.pk3dir/def/weapons/elites.def create mode 100644 zpak001.pk3dir/def/weapons/fiveseven.def create mode 100644 zpak001.pk3dir/def/weapons/flashbang.def create mode 100644 zpak001.pk3dir/def/weapons/g3sg1.def create mode 100644 zpak001.pk3dir/def/weapons/glock18.def create mode 100644 zpak001.pk3dir/def/weapons/hegrenade.def create mode 100644 zpak001.pk3dir/def/weapons/knife.def create mode 100644 zpak001.pk3dir/def/weapons/m249.def create mode 100644 zpak001.pk3dir/def/weapons/m3.def create mode 100644 zpak001.pk3dir/def/weapons/m4a1.def create mode 100644 zpak001.pk3dir/def/weapons/mac10.def create mode 100644 zpak001.pk3dir/def/weapons/mp5navy.def create mode 100644 zpak001.pk3dir/def/weapons/p228.def create mode 100644 zpak001.pk3dir/def/weapons/p90.def create mode 100644 zpak001.pk3dir/def/weapons/scout.def create mode 100644 zpak001.pk3dir/def/weapons/sg550.def create mode 100644 zpak001.pk3dir/def/weapons/sg552.def create mode 100644 zpak001.pk3dir/def/weapons/smokegrenade.def create mode 100644 zpak001.pk3dir/def/weapons/tmp.def create mode 100644 zpak001.pk3dir/def/weapons/ump45.def create mode 100644 zpak001.pk3dir/def/weapons/usp.def create mode 100644 zpak001.pk3dir/def/weapons/xm1014.def create mode 100644 zpak001.pk3dir/scripts/bots.txt create mode 100644 zpak001.pk3dir/scripts/maptweaks.txt create mode 100644 zpak001.pk3dir/scripts/surfaceproperties.txt diff --git a/README.md b/README.md index d2c0855..9760ff3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# FreeCS +# Tactical Retreat (FreeCS) [As seen on phoronix.com](https://phoronix.com/scan.php?page=news_item&px=FreeCS-Open-Counter-Strike) Clean-room reimplementation of Counter-Strike 1.5 (mod-version). diff --git a/manifest.fmf b/manifest.fmf deleted file mode 100644 index bde984f..0000000 --- a/manifest.fmf +++ /dev/null @@ -1,14 +0,0 @@ -FTEMANIFEST 1 -GAME cstrike -NAME "Counter-Strike" -BASEGAME platform -BASEGAME valve -BASEGAME cstrike - -// you don't really want to change these -RTCBROKER master.frag-net.com:27950 -PROTOCOLNAME "Nuclide" -MAINCONFIG game.cfg -DOWNLOADSURL "http://www.frag-net.com/dl/packages" - --exec platform_default.cfg diff --git a/radiant.game b/radiant.game new file mode 100644 index 0000000..bfc8b49 --- /dev/null +++ b/radiant.game @@ -0,0 +1,26 @@ + + diff --git a/radiant.xml b/radiant.xml new file mode 100644 index 0000000..84fafec --- /dev/null +++ b/radiant.xml @@ -0,0 +1,76 @@ + + + + "hlcsg" + "hlbsp" + "hlvis" + "hlrad" + + qbsp -hlbsp -basedir "[EnginePath]" -gamedir "[GameName]" -path "[UserEnginePath]" + qvis -basedir "[EnginePath]" -gamedir "[GameName]" -path "[UserEnginePath]" + qlight -basedir "[EnginePath]" -gamedir "[GameName]" -path "[UserEnginePath]" + + + [csg] "[MapFile]" + [bsp] "[MapFile]" + [vis] -full "[MapFile]" + [light] -extra "[MapFile]" + + + [csg] "[MapFile]" + [bsp] "[MapFile]" + [vis] "[MapFile]" + [light] "[MapFile]" + + + [csg] "[MapFile]" + [bsp] "[MapFile]" + [vis] -fast "[MapFile]" + [light] -fast "[MapFile]" + + + [csg] "[MapFile]" + [bsp] "[MapFile]" + [vis] -fast "[MapFile]" + + + [csg] "[MapFile]" + [bsp] "[MapFile]" + + + [csg] -onlyents "[MapFile]" + [bsp]"[MapFile]" + + + + + [qbsp] "[MapFile]" + [qvis] "[MapFile]" + [qlight] -extra "[MapFile]" + + + [qbsp] "[MapFile]" + [qvis] "[MapFile]" + [qlight] "[MapFile]" + + + [qbsp] "[MapFile]" + [qvis] -fast "[MapFile]" + [qlight] -fast "[MapFile]" + + + [qbsp] "[MapFile]" + [qvis] -fast "[MapFile]" + + + [qbsp] "[MapFile]" + + + [qbsp] -onlyents "[MapFile]" + + + diff --git a/src/client/Makefile b/src/client/Makefile index 627019a..2fe44a4 100644 --- a/src/client/Makefile +++ b/src/client/Makefile @@ -1,4 +1,4 @@ -CC=fteqcc +QCC=fteqcc all: - $(CC) progs.src + $(QCC) progs.src diff --git a/src/client/cmds.qc b/src/client/cmds.qc index bb9156b..76b3b01 100644 --- a/src/client/cmds.qc +++ b/src/client/cmds.qc @@ -33,7 +33,7 @@ CMD_ChooseTeam(void) void CMD_BuyMenu(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; /* only in buy zones... */ if (!(pl.gflags & GF_BUYZONE)) { diff --git a/src/client/crosshair.qc b/src/client/crosshair.qc index f06f0d1..92614c2 100644 --- a/src/client/crosshair.qc +++ b/src/client/crosshair.qc @@ -27,19 +27,18 @@ var bool autocvar_cl_crosshair_additive = true; #define CS_CROSS_THICKNESS autocvar_cl_crosshair_thickness void -Cstrike_DrawCrosshair(void) +Cstrike_DrawCrosshair(CSPlayer pl) { - player pl = (player)self; int cross_dist; int line_length; /* these are defined in the weapon-code files */ - float distance = pl.cs_cross_mindist; - float delta = pl.cs_cross_deltadist; + float distance = (float)pl.cs_cross_mindist; + float delta = (float)pl.cs_cross_deltadist; if (!(pl.flags & FL_ONGROUND)) { distance = distance * 2.0f; - } else if (pl.flags & FL_CROUCHING) { /* crouching... */ + } else if (pl.IsCrouching()) { /* crouching... */ distance = distance * 0.5f; } else if (vlen(pl.velocity) > 120) { /* running, not walking */ distance = distance * 1.5f; diff --git a/src/client/defs.h b/src/client/defs.h index ff4a016..cd6155a 100644 --- a/src/client/defs.h +++ b/src/client/defs.h @@ -17,6 +17,7 @@ #include "hud.h" #include "radio.h" #include "../../../valve/src/client/obituary.h" +#include "../../../valve/src/client/hud_sprite.h" var int autocvar_cl_autoweaponswitch = TRUE; @@ -87,7 +88,6 @@ void HUD_DrawAmmo3(void); void HUD_WeaponPickupNotify(int); void HUD_DrawAmmoBar(vector pos, float val, float max, float a); -void Cstrike_DrawCrosshair(void); void Cstrike_DrawSimpleCrosshair(void); void Cstrike_DrawScope(void); void Textmenu_Call(string); diff --git a/src/client/entities.qc b/src/client/entities.qc index d37263e..91f0140 100644 --- a/src/client/entities.qc +++ b/src/client/entities.qc @@ -21,6 +21,12 @@ ClientGame_EntityUpdate(float id, float new) case ENT_C4BOMB: w_c4bomb_parse(); break; + case ENT_PLAYER: + NSENTITY_READENTITY(CSPlayer, new) + break; + case ENT_WEAPON: + NSENTITY_READENTITY(CSWeapon, new) + break; default: return (0); } diff --git a/src/client/hud.qc b/src/client/hud.qc index 4732f44..13ad143 100644 --- a/src/client/hud.qc +++ b/src/client/hud.qc @@ -284,7 +284,7 @@ void HUD_DrawHealth(void) { vector pos; - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (pl.health != pSeatLocal->m_iHealthOld) { pSeatLocal->m_flHealthAlpha = 1.0; @@ -331,7 +331,7 @@ void HUD_DrawArmor(void) { vector pos; - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; pos = g_hudmins + [198, g_hudres[1] - 42]; @@ -405,7 +405,7 @@ HUD_DrawArmor(void) void HUD_DrawAmmo1(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; vector pos; if (pl.a_ammo1 != pSeatLocal->m_iAmmo1Old) { @@ -428,7 +428,7 @@ HUD_DrawAmmo1(void) void HUD_DrawAmmo2(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; vector pos; if (pl.a_ammo2 != pSeatLocal->m_iAmmo2Old) { @@ -450,7 +450,7 @@ HUD_DrawAmmo2(void) void HUD_DrawAmmo3(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; vector pos; if (pl.a_ammo3 != pSeatLocal->m_iAmmo3Old) { @@ -486,7 +486,7 @@ void HUD_DrawFlashlight(void) { vector pos; - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; pos = g_hudmins + [g_hudres[0] - 48, 16]; /* both on, draw both sprites at full intensity */ @@ -531,7 +531,7 @@ HUD_DrawZones(void) { int zc = 0; vector pos = [0,0,0]; - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (pl.gflags & GF_BUYZONE) { zc++; @@ -652,7 +652,7 @@ HUD_DrawProgress(void) void HUD_DrawNotify(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; vector pos; float a; @@ -666,7 +666,7 @@ HUD_DrawNotify(void) } a = bound(0.0, pSeatLocal->m_flPickupAlpha, 1.0); - Weapons_HUDPic(pl, pSeatLocal->m_iPickupWeapon, 1, pos, a); + //Weapons_HUDPic(pl, pSeatLocal->m_iPickupWeapon, 1, pos, a); pos[0] += 148; pos[1] -= 32; HUD_AmmoNotify_Draw(pos); @@ -720,12 +720,14 @@ HUD_PlayerNames(void) void HUD_Draw(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; g_hud_color = autocvar_con_color * (1 / 255); /* little point in not drawing these, even if you don't have a suit */ - Weapons_DrawCrosshair(pl); + if (pl.m_activeWeapon) + pl.m_activeWeapon.UpdateGUI(); + HUD_DrawWeaponSelect(); Obituary_Draw(); @@ -734,7 +736,7 @@ HUD_Draw(void) HUD_DrawMoney(); HUD_DrawTimer(0); - if (!(pl.g_items & ITEM_SUIT)) { + if (pl.HasItem("item_suit") == false) { return; } @@ -761,7 +763,7 @@ HUD_DrawSpectator(void) g_specHUD = spawn(CSSpectateHUD); g_specHUD.SetPos(video_mins); - g_specHUD.SetSize(video_res); + g_specHUD.SetSize(g_vidsize); g_specHUD.Draw(); } diff --git a/src/client/hud_ammonotify.qc b/src/client/hud_ammonotify.qc index 51fee30..08a5355 100644 --- a/src/client/hud_ammonotify.qc +++ b/src/client/hud_ammonotify.qc @@ -83,8 +83,9 @@ HUD_AmmoNotify_Insert(int type, int count) /* called whenever we should check for pickup updates */ void -HUD_AmmoNotify_Check(player pl) +HUD_AmmoNotify_Check(CSPlayer pl) { +#if 0 HUD_AmmoNotify_Insert(0, pl.ammo_50ae - pl.ammo_50ae_net); HUD_AmmoNotify_Insert(1, pl.ammo_762mm - pl.ammo_762mm_net); HUD_AmmoNotify_Insert(2, pl.ammo_556mm - pl.ammo_556mm_net); @@ -98,4 +99,5 @@ HUD_AmmoNotify_Check(player pl) HUD_AmmoNotify_Insert(10, pl.ammo_hegrenade - pl.ammo_hegrenade_net); HUD_AmmoNotify_Insert(11, pl.ammo_fbgrenade - pl.ammo_fbgrenade_net); HUD_AmmoNotify_Insert(12, pl.ammo_smokegrenade - pl.ammo_smokegrenade_net); +#endif } \ No newline at end of file diff --git a/src/client/hud_weaponselect.qc b/src/client/hud_weaponselect.qc index e072d74..d282fce 100644 --- a/src/client/hud_weaponselect.qc +++ b/src/client/hud_weaponselect.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -void View_ForceChange(player pl, int targetWeapon); +void View_ForceChange(CSPlayer pl, int targetWeapon); vector g_vecHUDNums[6] = { @@ -29,7 +29,7 @@ vector g_vecHUDNums[6] = void HUD_DrawWeaponSelect_Forward(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (!pl.activeweapon) { return; @@ -57,7 +57,7 @@ HUD_DrawWeaponSelect_Forward(void) void HUD_DrawWeaponSelect_Back(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (!pl.activeweapon) { return; @@ -85,7 +85,7 @@ HUD_DrawWeaponSelect_Back(void) void HUD_DrawWeaponSelect_Trigger(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (pl.activeweapon != pSeat->m_iHUDWeaponSelected) View_ForceChange(pl, pSeat->m_iHUDWeaponSelected); @@ -98,7 +98,7 @@ HUD_DrawWeaponSelect_Trigger(void) void HUD_DrawWeaponSelect_Last(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (pl.g_items & g_weapons[pSeat->m_iOldWeapon].id) { pl.activeweapon = pSeat->m_iOldWeapon; sendevent("PlayerSwitchWeapon", "i", pSeat->m_iOldWeapon); @@ -114,7 +114,7 @@ HUD_DrawWeaponSelect_Num(vector vecPos, int val) int HUD_InSlotPos(int slot, int pos) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; for (int i = 1; i < g_weapons.length; i++) { if (g_weapons[i].slot == slot && g_weapons[i].slot_pos == pos) { if (pl.g_items & g_weapons[i].id) { @@ -130,7 +130,7 @@ HUD_InSlotPos(int slot, int pos) void HUD_SlotSelect(int slot) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; int curslot = g_weapons[pSeat->m_iHUDWeaponSelected].slot; int i; @@ -184,7 +184,7 @@ HUD_SlotSelect(int slot) void HUD_DrawWeaponSelect(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (!pl.activeweapon) { return; } @@ -211,13 +211,13 @@ HUD_DrawWeaponSelect(void) slot_selected = TRUE; if (x == wantpos) { // Selected Sprite - Weapons_HUDPic(pl, pSeat->m_iHUDWeaponSelected, 1, vecPos, 1.0f); + //Weapons_HUDPic(pl, pSeat->m_iHUDWeaponSelected, 1, vecPos, 1.0f); drawsubpic(vecPos, [170,45], g_hud3_spr, [0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); vecPos[1] += 50; } else if ((b=HUD_InSlotPos(i, x)) != -1) { // Unselected Sprite - Weapons_HUDPic(pl, b, 0, vecPos, 1.0f); + //Weapons_HUDPic(pl, b, 0, vecPos, 1.0f); vecPos[1] += 50; } } else if (HUD_InSlotPos(i, x) != -1) { diff --git a/src/client/init.qc b/src/client/init.qc index 300c683..8af4885 100644 --- a/src/client/init.qc +++ b/src/client/init.qc @@ -115,6 +115,9 @@ ClientGame_Init(float apilevel, string enginename, float engineversion) bool ClientGame_IsUsingVGUI(void) { +#if defined(CZERO) || defined(CSSOURCE) + return true; +#else /* FTE has a bug with _ infokeys, so we'll accept both formats in case that gets fixed in the future :/ */ if (getplayerkeyfloat(player_localnum, "vgui_menus") == 1) @@ -123,6 +126,7 @@ ClientGame_IsUsingVGUI(void) return true; return false; +#endif } void VGUI_ShowMOTD(void); diff --git a/src/client/nightvision.qc b/src/client/nightvision.qc index 1e6675e..bb6347d 100644 --- a/src/client/nightvision.qc +++ b/src/client/nightvision.qc @@ -17,12 +17,14 @@ void Nightvision_Toggle(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; +#if 0 if (!(pl.g_items & ITEM_NIGHTVISION)) { pSeatLocal->m_iNightvision = 0; return; } +#endif pSeatLocal->m_iNightvision = 1 - pSeatLocal->m_iNightvision; @@ -35,15 +37,17 @@ Nightvision_Toggle(void) void Nightvision_PreFrame(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (!pSeatLocal->m_iNightvision) return; +#if 0 if (!(pl.g_items & ITEM_NIGHTVISION)) { pSeatLocal->m_iNightvision = 0; return; } +#endif dynamiclight_add(pSeat->m_vecPredictedOrigin, 768, [1,1,1]); } @@ -51,15 +55,17 @@ Nightvision_PreFrame(void) void Nightvision_PostFrame(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; if (!pSeatLocal->m_iNightvision) return; +#if 0 if (!(pl.g_items & ITEM_NIGHTVISION)) { pSeatLocal->m_iNightvision = 0; return; } +#endif drawpic(video_mins, "fade_modulate", g_hudres, [0,1,0], 1.0f, 0); } diff --git a/src/client/progs.src b/src/client/progs.src index 28a8602..75e3b7c 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -1,6 +1,6 @@ #pragma target fte_5768 //#pragma flag enable assumeint -#pragma progs_dat "../../csprogs.dat" +#pragma progs_dat "../../zpak001.pk3dir/csprogs.dat" #define CSQC #define CLIENT @@ -36,8 +36,8 @@ crosshair.qc hud_ammonotify.qc vgui_spectator.qc hud.qc -hud_weaponselect.qc ../../../valve/src/client/hud_sprite.qc +../../../valve/src/client/hud_weaponselect.qc ../../../valve/src/client/scoreboard.qc radio.qc diff --git a/src/client/radar.qc b/src/client/radar.qc index f6472f5..dccac6d 100644 --- a/src/client/radar.qc +++ b/src/client/radar.qc @@ -17,69 +17,27 @@ #define CSRADAR_DISTANCE 1024 var string g_cs_radar; +var NSRadar g_csRadar; void Radar_Init(void) { g_cs_radar = spriteframe("sprites/radar640.spr", 0, 0.0f); + + g_csRadar = NSRadar::InitEmpty(); } void Radar_Draw(void) { - vector radpos = g_hudmins + [16,16]; + vector radpos = g_view.GetHUDCanvasPos() + [16,16]; drawpic(radpos, g_cs_radar, [128,128], [1,1,1], 0.25f, DRAWFLAG_ADDITIVE); - for (entity a = world; (a = find(a, ::classname, "player"));) { - vector color; - vector own_pos = pSeat->m_vecPredictedOrigin; - vector difference = (a.origin - own_pos); + /* these need constant adjustment for when the display changes */ + g_csRadar.SetViewPosition(radpos); + g_csRadar.SetViewSize([128,128]); + g_csRadar.UpdateView(); - /* don't draw when we're exceeding the view radius */ - if (vlen(difference) > CSRADAR_DISTANCE) - continue; - /* this is perhaps a bit too aggressive, so fix this and uncomment */ -#if 0 - /* test if we can actually see the player */ - traceline(a.origin, own_pos + pSeat->m_ePlayer.view_ofs, MOVE_NORMAL, pSeat->m_ePlayer); - if (trace_ent != a) { - traceline(a.origin + [0,0,a.maxs[2]], own_pos + pSeat->m_ePlayer.view_ofs, MOVE_OTHERONLY, pSeat->m_ePlayer); - if (trace_ent != a) { - traceline(a.origin + [0,0,a.mins[2]], own_pos + pSeat->m_ePlayer.view_ofs, MOVE_OTHERONLY, pSeat->m_ePlayer); - if (trace_ent != a) { - continue; - } - } - } -#endif - - vector matrix; - float ht; - makevectors([0,view_angles[1] - 90, 0]); - matrix[0] = dotproduct(difference, v_forward); - matrix[1] = dotproduct(difference, v_right); - matrix[2] = 0; - - /* we need to fit 1024 in-game units into the 64px radar image */ - vector apos = radpos + [62,62] + (matrix * (64/CSRADAR_DISTANCE)); - - if (getplayerkeyfloat(a.entnum-1, "*team") == TEAM_CT) - color = [115, 155, 205] / 255; - else - color = [190, 52, 57] / 255; - - drawfill(apos, [4,4], color, 1.0f, DRAWFLAG_NORMAL); - - /* do the line indicating the height of the player relative to us */ - ht = fabs(difference[2] * (64 / CSRADAR_DISTANCE)); - - if (difference[2] > 0) - drawfill(apos + [1,0], [2,ht], color, 1.0f, DRAWFLAG_NORMAL); - else if (difference[2] < 0) - drawfill(apos + [1,-ht], [2,ht], color, 1.0f, DRAWFLAG_NORMAL); - - //drawpic(apos, "fade_modulate", [4,4], color, 1.0f, 0); - } } diff --git a/src/client/textmenu.qc b/src/client/textmenu.qc index a943282..7bf41b0 100644 --- a/src/client/textmenu.qc +++ b/src/client/textmenu.qc @@ -85,8 +85,8 @@ CT_SELECT(int n) void BUY(int n) { - player pl; - pl = (player)pSeat->m_ePlayer; + CSPlayer pl; + pl = (CSPlayer)pSeat->m_ePlayer; int inteam = getplayerkeyfloat(pl.entnum-1, "*team"); switch (n) { diff --git a/src/client/vgui_buymenu.qc b/src/client/vgui_buymenu.qc index 3700adf..dcd7b16 100644 --- a/src/client/vgui_buymenu.qc +++ b/src/client/vgui_buymenu.qc @@ -220,5 +220,5 @@ VGUI_BuyMenu(void) } winBuyMenu.Show(); - winBuyMenu.SetPos((video_res / 2) - (winBuyMenu.GetSize() / 2)); + winBuyMenu.SetPos((g_vidsize / 2) - (winBuyMenu.GetSize() / 2)); } diff --git a/src/client/vgui_buypages.qc b/src/client/vgui_buypages.qc index 27e00b6..74e9ace 100644 --- a/src/client/vgui_buypages.qc +++ b/src/client/vgui_buypages.qc @@ -30,6 +30,10 @@ typedef enum BUYITEM_FIVESEVEN, BUYITEM_M3, BUYITEM_XM1014, +#if defined(CZERO) || defined(CSSOURCE) + BUYITEM_FAMAS, + BUYITEM_GALIL, +#endif BUYITEM_AK47, BUYITEM_SG552, BUYITEM_M4A1, @@ -62,7 +66,7 @@ typedef struct string titleName; /* the name of the titles.txt entry */ } buyItems_t; -const buyItems_t g_buyItemList [29] = { +const buyItems_t g_buyItemList [] = { { "BuyWeapon", WEAPON_USP45, "classes/usp.txt", "gfx/vgui/640_usp", "USP45" }, { "BuyWeapon", WEAPON_GLOCK18, "classes/glock18.txt", "gfx/vgui/640_glock18", "Glock18" }, { "BuyWeapon", WEAPON_DEAGLE, "classes/deagle.txt", "gfx/vgui/640_deagle", "DesertEagle" }, @@ -71,6 +75,10 @@ const buyItems_t g_buyItemList [29] = { { "BuyWeapon", WEAPON_FIVESEVEN, "classes/fiveseven.txt", "gfx/vgui/640_fiveseven", "FiveSeven" }, { "BuyWeapon", WEAPON_M3, "classes/m3.txt", "gfx/vgui/640_m3", "Super90" }, { "BuyWeapon", WEAPON_XM1014, "classes/xm1014.txt", "gfx/vgui/640_xm1014", "XM1014" }, +#if defined(CZERO) || defined(CSSOURCE) + { "BuyWeapon", WEAPON_FAMAS, "classes/famas.txt", "gfx/vgui/640_famas", "Famas" }, + { "BuyWeapon", WEAPON_GALIL, "classes/galil.txt", "gfx/vgui/640_galil", "Galil" }, +#endif { "BuyWeapon", WEAPON_AK47, "classes/ak47.txt", "gfx/vgui/640_ak47", "AK47" }, { "BuyWeapon", WEAPON_SG552, "classes/sg552.txt", "gfx/vgui/640_sg552", "SG552" }, { "BuyWeapon", WEAPON_M4A1, "classes/m4a1.txt", "gfx/vgui/640_m4a1", "M4A1" }, @@ -156,7 +164,7 @@ VGUI_BuyMenu_Page(int buyPage) static CSBuyItemButton btnBuyItem8; static CSBuyItemButton btnBuyItem9; - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; int inTeam = getplayerkeyfloat(pl.entnum-1, "*team"); @@ -284,7 +292,7 @@ VGUI_BuyMenu_Page(int buyPage) imgBuyItemPic.SetImage(""); winBuyMenuPage.Show(); - winBuyMenuPage.SetPos((video_res / 2) - (winBuyMenuPage.GetSize() / 2)); + winBuyMenuPage.SetPos((g_vidsize / 2) - (winBuyMenuPage.GetSize() / 2)); switch (buyPage) { case BUYPAGE_PISTOLS: @@ -386,6 +394,18 @@ VGUI_BuyMenu_Page(int buyPage) btnBuyItem8.Show(); btnBuyItem9.Hide(); +#if defined(CZERO) || defined(CSSOURCE) + if (inTeam == TEAM_CT) { + btnBuyItem9.SetTitle(Titles_GetTextBody("Famas")); + btnBuyItem9.SetTag(BUYITEM_FAMAS); + btnBuyItem9.Show(); + } else { + btnBuyItem9.SetTitle(Titles_GetTextBody("Galil")); + btnBuyItem9.SetTag(BUYITEM_GALIL); + btnBuyItem9.Show(); + } +#endif + btnBuyItem1.SetTitle(Titles_GetTextBody("AK47")); btnBuyItem1.SetTag(BUYITEM_AK47); btnBuyItem2.SetTitle(Titles_GetTextBody("Krieg552")); diff --git a/src/client/vgui_changeclass_ct.qc b/src/client/vgui_changeclass_ct.qc index f53f3fd..5c532fa 100644 --- a/src/client/vgui_changeclass_ct.qc +++ b/src/client/vgui_changeclass_ct.qc @@ -192,5 +192,5 @@ VGUI_ChooseClassCT(void) } winClassSelectionCT.Show(); - winClassSelectionCT.SetPos((video_res / 2) - (winClassSelectionCT.GetSize() / 2)); + winClassSelectionCT.SetPos((g_vidsize / 2) - (winClassSelectionCT.GetSize() / 2)); } \ No newline at end of file diff --git a/src/client/vgui_changeclass_t.qc b/src/client/vgui_changeclass_t.qc index d0fad34..bbe07d3 100644 --- a/src/client/vgui_changeclass_t.qc +++ b/src/client/vgui_changeclass_t.qc @@ -193,5 +193,5 @@ VGUI_ChooseClassT(void) } winClassSelection.Show(); - winClassSelection.SetPos((video_res / 2) - (winClassSelection.GetSize() / 2)); + winClassSelection.SetPos((g_vidsize / 2) - (winClassSelection.GetSize() / 2)); } \ No newline at end of file diff --git a/src/client/vgui_chooseteam.qc b/src/client/vgui_chooseteam.qc index f3ed81d..e5cb099 100644 --- a/src/client/vgui_chooseteam.qc +++ b/src/client/vgui_chooseteam.qc @@ -163,5 +163,5 @@ VGUI_ChooseTeam(void) } winChooseTeam.Show(); - winChooseTeam.SetPos((video_res / 2) - (winChooseTeam.GetSize() / 2)); + winChooseTeam.SetPos((g_vidsize / 2) - (winChooseTeam.GetSize() / 2)); } diff --git a/src/client/vgui_motd.qc b/src/client/vgui_motd.qc index 26c022d..2293217 100644 --- a/src/client/vgui_motd.qc +++ b/src/client/vgui_motd.qc @@ -68,5 +68,5 @@ VGUI_ShowMOTD(void) } winMotd.Show(); - winMotd.SetPos((video_res / 2) - (winMotd.GetSize() / 2)); + winMotd.SetPos((g_vidsize / 2) - (winMotd.GetSize() / 2)); } diff --git a/src/server/Makefile b/src/server/Makefile index 627019a..2fe44a4 100644 --- a/src/server/Makefile +++ b/src/server/Makefile @@ -1,4 +1,4 @@ -CC=fteqcc +QCC=fteqcc all: - $(CC) progs.src + $(QCC) progs.src diff --git a/src/server/ammo.qc b/src/server/ammo.qc index 87d2565..3fa4ed6 100644 --- a/src/server/ammo.qc +++ b/src/server/ammo.qc @@ -108,11 +108,12 @@ ammoinfo_t cs_ammoinfo[11] = { }; int -Ammo_BuyCaliber(player pl, int cal, int free) +Ammo_BuyCaliber(CSPlayer pl, int cal, int free) { int *ptr_ammo = __NULL__; int rv = 0; +#if 0 while (pl.money - cs_ammoinfo[cal].price > 0 || free) { switch (cal) { case CALIBER_50AE: @@ -166,6 +167,7 @@ Ammo_BuyCaliber(player pl, int cal, int free) rv = 1; } +#endif return rv; } @@ -173,9 +175,10 @@ Ammo_BuyCaliber(player pl, int cal, int free) void Ammo_BuySecondary(NSClientPlayer pp, int free) { +#if 0 int cal = 0; int ps = 0; - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; for (int i = 1; i < g_weapons.length; i++) { if ((pl.g_items & g_weapons[i].id) && (g_weapons[i].slot == 1)) { @@ -210,6 +213,7 @@ Ammo_BuySecondary(NSClientPlayer pp, int free) Sound_Play(pl, CHAN_ITEM, "buy.ammo"); } Weapons_RefreshAmmo(pl); +#endif } /* We want to loop through all the possible weapons in case the server @@ -217,7 +221,7 @@ Ammo_BuySecondary(NSClientPlayer pp, int free) void CSEv_AmmoBuySecondary(void) { - player pl = (player)self; + CSPlayer pl = (CSPlayer)self; CSGameRules rules = (CSGameRules)g_grMode; if (rules.BuyingPossible(pl) == FALSE) { @@ -230,9 +234,10 @@ CSEv_AmmoBuySecondary(void) void Ammo_BuyPrimary(NSClientPlayer pp, int free) { +#if 0 int ps = 0; int cal = 0; - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; for (int i = 1; i < g_weapons.length; i++) { if ((pl.g_items & g_weapons[i].id) && (g_weapons[i].slot == 0)) { @@ -258,6 +263,14 @@ Ammo_BuyPrimary(NSClientPlayer pp, int free) case WEAPON_TMP: cal = CALIBER_9MM; break; +#if defined(CZERO) || defined(CSSOURCE) + case WEAPON_GALIL: + cal = CALIBER_762MM; + break; + case WEAPON_FAMAS: + cal = CALIBER_762MM; + break; +#endif case WEAPON_AK47: cal = CALIBER_762MM; break; @@ -298,12 +311,13 @@ Ammo_BuyPrimary(NSClientPlayer pp, int free) } Weapons_RefreshAmmo(pl); +#endif } void CSEv_AmmoBuyPrimary(void) { - player pl = (player)self; + CSPlayer pl = (CSPlayer)self; CSGameRules rules = (CSGameRules)g_grMode; if (rules.BuyingPossible(pl) == FALSE) { @@ -316,7 +330,7 @@ CSEv_AmmoBuyPrimary(void) void Ammo_AutoFill(NSClientPlayer pp) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; if (autocvar_fcs_fillweapons == FALSE) { return; diff --git a/src/server/armoury_entity.qc b/src/server/armoury_entity.qc index d0148c4..83f6660 100644 --- a/src/server/armoury_entity.qc +++ b/src/server/armoury_entity.qc @@ -53,26 +53,26 @@ List of available items: var int autocvar_fcs_nopickups = FALSE; -int g_cstrike_armouryitems[19] = { - WEAPON_MP5, - WEAPON_TMP, - WEAPON_P90, - WEAPON_MAC10, - WEAPON_AK47, - WEAPON_SG552, - WEAPON_M4A1, - WEAPON_AUG, - WEAPON_SCOUT, - WEAPON_G3SG1, - WEAPON_AWP, - WEAPON_M3, - WEAPON_XM1014, - WEAPON_PARA, - WEAPON_FLASHBANG, - WEAPON_HEGRENADE, - 0,/*EQUIPMENT_KEVLAR,*/ - 0,/*EQUIPMENT_HELMET,*/ - WEAPON_SMOKEGRENADE +string g_cstrike_armouryitems[19] = { + "weapon_mp5navy", + "weapon_tmp", + "weapon_p90", + "weapon_max10", + "weapon_ak47", + "weapon_sg552", + "weapon_m4a1", + "weapon_aug", + "weapon_scout", + "weapon_g3sg1", + "weapon_awp", + "weapon_m3", + "weapon_xm1014", + "weapon_m249", + "weapon_flashbang", + "weapon_hegrenade", + "equipment_kevlar", + "equipment_helmet", + "weapon_smokegrenade" }; string g_cstrike_armourymodels[19] = { @@ -165,12 +165,12 @@ armoury_entity::Restore(string strKey, string strValue) void armoury_entity::Touch(entity eToucher) { - player pl; + CSPlayer pl; if (eToucher.classname != "player") { return; } - pl = (player)eToucher; + pl = (CSPlayer)eToucher; /* armor is separate from weapons */ if (m_iID == 17 || m_iID == 16) { @@ -194,7 +194,7 @@ armoury_entity::Touch(entity eToucher) sound(pl, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); } else { /* weapon pickup code */ - if (Weapons_AddItem(pl, g_cstrike_armouryitems[m_iID], -1) == FALSE) + if (pl.GiveItem(g_cstrike_armouryitems[m_iID]) == FALSE) return; sound(pl, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM); @@ -211,7 +211,7 @@ armoury_entity::Touch(entity eToucher) void armoury_entity::Respawn(void) { - SetOrigin(GetSpawnOrigin()); + super::Respawn(); SetSolid(SOLID_TRIGGER); SetModel(g_cstrike_armourymodels[m_iID]); SetSize([-16,-16,0], [16,16,16]); diff --git a/src/server/bot.qc b/src/server/bot.qc index 5ef69d6..360ea1b 100644 --- a/src/server/bot.qc +++ b/src/server/bot.qc @@ -159,31 +159,8 @@ void csbot::Roam(vector roamOrigin, int maxDistance) { randLoc.x += sin(radian) * distance; randLoc.y += cos(radian) * distance; - /* Find closest waypoint to our random location. */ - float flBestDist = COST_INFINITE; - int iBestNodeIndex = -1; - for (int i = 0; i < g_iNodes; i++) { - float fDist = vlen(g_pNodes[i].origin - randLoc) - g_pNodes[i].radius; - - if (fDist > (float)maxDistance) { - /* Distance is greater then our maxDistance */ - continue; - } - - if (fDist < flBestDist) { - flBestDist = fDist; - iBestNodeIndex = i; - } - } - - if (iBestNodeIndex == -1) { - /* TODO No waypoint in range found */ - print("WARNING!: Roaming failed, could not find waypoint in range.\n"); - return; - } - /* Go to the random waypoint. */ - RouteToPosition(g_pNodes[iBestNodeIndex].origin); + RouteToPosition(Nodes_PositionOfClosestNode(randLoc)); } void @@ -236,7 +213,7 @@ csbot::CreateObjective(void) } else { /* Aim at the bomb. */ input_buttons |= INPUT_BUTTON8; // duck - if ((flags & FL_ONUSABLE)) { + if ((HasVFlags(VFL_ONUSABLE))) { // Aimed at the bomb, ready to defuse! ChatSayTeam("Defusing!"); input_buttons |= INPUT_BUTTON5; @@ -262,13 +239,14 @@ csbot::CreateObjective(void) else { if (team == TEAM_T) { /* T-bot: plant bomb */ - if ((g_items & ITEM_C4BOMB)) { + if (HasItem("weapon_c4")) { /* We carry the bomb */ if (m_gflagsBackup & GF_BOMBZONE) { /* We are at a bombsite and ready to plant the bomb */ if (activeweapon != WEAPON_C4BOMB) { + /* TODO: REPLACE THIS WITH NSNAVAI METHOD */ activeweapon = WEAPON_C4BOMB; - Weapons_Draw((player)self); + //Weapons_Draw((CSPlayer)self); } if (!m_actionIsPlanting) { @@ -346,27 +324,17 @@ void csbot::AimLerp(vector aimpos, float flLerp) { vector oldAngle = v_angle; /* that's the old angle */ - makevectors(v_angle); - vecNewAngles = v_forward; + vecNewAngles = anglesToForward(v_angle); /* aimdir = new final angle */ - aimdir = vectoangles(aimpos - origin); - makevectors(aimdir); + aimdir = vectorToAngles(aimpos - origin); /* slowly lerp towards the final angle */ - vecNewAngles[0] = Math_Lerp(vecNewAngles[0], v_forward[0], flLerp); - vecNewAngles[1] = Math_Lerp(vecNewAngles[1], v_forward[1], flLerp); - vecNewAngles[2] = Math_Lerp(vecNewAngles[2], v_forward[2], flLerp); + vecNewAngles = vectorLerp(vecNewAngles, anglesToForward(aimdir), flLerp); /* make sure we're aiming tight */ - v_angle = vectoangles(vecNewAngles); - v_angle[0] = Math_FixDelta(v_angle[0]); - v_angle[1] = Math_FixDelta(v_angle[1]); - v_angle[2] = Math_FixDelta(v_angle[2]); - angles[0] = Math_FixDelta(v_angle[0]); - angles[1] = Math_FixDelta(v_angle[1]); - angles[2] = Math_FixDelta(v_angle[2]); - input_angles = v_angle; + v_angle = vectorToAngles(vecNewAngles); + input_angles = angles = v_angle = fixAngle(v_angle); } void @@ -386,6 +354,7 @@ csbot::WeaponThink(void) if (activeweapon == WEAPON_KNIFE) return; +#if FIXME /* clip empty */ if (a_ammo1 == 0) { /* still got ammo left, reload! */ @@ -396,6 +365,7 @@ csbot::WeaponThink(void) Weapons_SwitchBest(this); } } +#endif }; /** @brief Get entity by class name and index **/ @@ -491,7 +461,7 @@ CSBot_BuyStart_Shop(void) { int done = 0; int count = 0; - player pl = (player)self; + CSPlayer pl = (CSPlayer)self; pl.team = infokeyf(pl, "*team"); @@ -546,6 +516,7 @@ CSBot_BuyStart_Shop(void) CSEv_BuyEquipment_f(1); } +#if FIXME /* make SURE we switch to it */ for (int i = 0; i < g_weapons.length; i++) if (pl.g_items & g_weapons[i].id) { @@ -553,6 +524,7 @@ CSBot_BuyStart_Shop(void) Weapons_Draw(pl); return; } +#endif /* force buy right now */ CSEv_AmmoBuyPrimary(); diff --git a/src/server/buy.qc b/src/server/buy.qc index 4c773e8..85fb9ac 100644 --- a/src/server/buy.qc +++ b/src/server/buy.qc @@ -17,10 +17,11 @@ void CSEv_BuyWeapon_f(float fWeapon) { +#if 0 CSGameRules rules = (CSGameRules)g_grMode; int iWeapon; - player pl = (player)self; + CSPlayer pl = (CSPlayer)self; iWeapon = (int)fWeapon; if (rules.BuyingPossible(pl) == FALSE) { @@ -77,15 +78,17 @@ CSEv_BuyWeapon_f(float fWeapon) } else { //centerprint(pl, "You have insufficient funds!"); } +#endif } void CSEv_BuyEquipment_f(float fUtil) { +#if 0 CSGameRules rules = (CSGameRules)g_grMode; int iUtil; - player pl = (player)self; + CSPlayer pl = (CSPlayer)self; iUtil = (int)fUtil; if (rules.BuyingPossible(pl) == FALSE) { @@ -162,10 +165,10 @@ CSEv_BuyEquipment_f(float fUtil) Sound_Play(pl, CHAN_ITEM, "buy.weapon"); break; case 6: - if (pl.g_items & ITEM_NIGHTVISION) + if (pl.m_bHasNightvision == true) return; - pl.g_items |= ITEM_NIGHTVISION; + pl.m_bHasNightvision = true; Sound_Play(pl, CHAN_ITEM, "buy.weapon"); break; } @@ -173,4 +176,5 @@ CSEv_BuyEquipment_f(float fUtil) } else { centerprint(pl, "You have insufficient funds!"); } +#endif } diff --git a/src/server/func_bomb_target.qc b/src/server/func_bomb_target.qc index 6096b70..0462ee3 100644 --- a/src/server/func_bomb_target.qc +++ b/src/server/func_bomb_target.qc @@ -51,7 +51,7 @@ func_bomb_target::Respawn(void) void func_bomb_target::Touch(entity eToucher) { - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; if (!(eToucher.flags & FL_CLIENT)) { return; diff --git a/src/server/func_buyzone.qc b/src/server/func_buyzone.qc index 3f1b457..f7f883c 100644 --- a/src/server/func_buyzone.qc +++ b/src/server/func_buyzone.qc @@ -76,7 +76,7 @@ func_buyzone::SpawnKey(string strKey, string strValue) void func_buyzone::Touch(entity eToucher) { - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; if (!(eToucher.flags & FL_CLIENT)) return; diff --git a/src/server/func_escapezone.qc b/src/server/func_escapezone.qc index 136d6ce..cf1d6f3 100644 --- a/src/server/func_escapezone.qc +++ b/src/server/func_escapezone.qc @@ -61,7 +61,7 @@ func_escapezone::Touch(entity eToucher) if (to_escape > 3) to_escape = 3; - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; /* don't matter when rules are not active */ if (g_cs_gamestate != GAME_ACTIVE) @@ -78,7 +78,7 @@ func_escapezone::Touch(entity eToucher) /* balancing tweak: for every escaped T, each and every CT will lose funds */ if (autocvar_fcs_escapepenalty != 0) { for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - player ct = (player)eFind; + CSPlayer ct = (CSPlayer)eFind; if (ct.team == TEAM_CT) { Money_AddMoney(ct, autocvar_fcs_escapepenalty); diff --git a/src/server/func_hostage_rescue.qc b/src/server/func_hostage_rescue.qc index ba5e17a..845f83a 100644 --- a/src/server/func_hostage_rescue.qc +++ b/src/server/func_hostage_rescue.qc @@ -52,7 +52,7 @@ void func_hostage_rescue::Touch(entity eToucher) { if (eToucher.flags & FL_CLIENT) { - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; pl.gflags |= GF_RESCUEZONE; return; } @@ -61,7 +61,7 @@ func_hostage_rescue::Touch(entity eToucher) return; } - hostage_entity hosty = (hostage_entity)eToucher; + CSHostage hosty = (CSHostage)eToucher; if (hosty.GetSolid() == SOLID_NOT) { return; @@ -73,7 +73,7 @@ func_hostage_rescue::Touch(entity eToucher) Radio_BroadcastMessage(RADIO_RESCUED); g_cs_hostagesrescued++; - Money_AddMoney((player)hosty.m_eFollowing, 1000); + Money_AddMoney((CSPlayer)hosty.m_eFollowing, 1000); CSBot_HostageRescueNotify(); /* In Hostage Rescue, all Counter-Terrorists receive an $850 diff --git a/src/server/func_vip_safetyzone.qc b/src/server/func_vip_safetyzone.qc index f344562..f588375 100644 --- a/src/server/func_vip_safetyzone.qc +++ b/src/server/func_vip_safetyzone.qc @@ -52,7 +52,7 @@ func_vip_safetyzone::Touch(entity eToucher) { CSMultiplayerRules rule = (CSMultiplayerRules)g_grMode; - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; if (pl.classname != "player") return; diff --git a/src/server/game_money.qc b/src/server/game_money.qc index a5932cf..b29ab41 100644 --- a/src/server/game_money.qc +++ b/src/server/game_money.qc @@ -17,7 +17,7 @@ void Money_AddMoney(NSClientPlayer pp, int iMoneyValue) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; dprint(sprintf("^2Money_AddMoney^7: giving %s $%i\n", pl.netname, iMoneyValue)); pl.money += (float)iMoneyValue; diff --git a/src/server/gamerules.h b/src/server/gamerules.h index ecaf505..2988265 100644 --- a/src/server/gamerules.h +++ b/src/server/gamerules.h @@ -16,7 +16,6 @@ class CSGameRules:CGameRules { - virtual void PlayerKill(NSClientPlayer); virtual void PlayerPreFrame(NSClientPlayer); virtual void PlayerDeath(NSClientPlayer); virtual void PlayerPain(NSClientPlayer); diff --git a/src/server/gamerules.qc b/src/server/gamerules.qc index 4f9be0e..23f765e 100644 --- a/src/server/gamerules.qc +++ b/src/server/gamerules.qc @@ -49,7 +49,7 @@ CSGameRules::PlayerPreFrame(NSClientPlayer pp) void CSGameRules::LevelDecodeParms(NSClientPlayer pp) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; g_landmarkpos[0] = parm1; g_landmarkpos[1] = parm2; g_landmarkpos[2] = parm3; @@ -62,45 +62,9 @@ CSGameRules::LevelDecodeParms(NSClientPlayer pp) pl.g_items = parm10; pl.activeweapon = parm11; pl.flags = parm64; - - pl.ammo_50ae = parm12; - pl.ammo_762mm = parm13; - pl.ammo_556mm = parm14; - pl.ammo_556mmbox = parm15; - pl.ammo_338mag = parm16; - pl.ammo_9mm = parm17; - pl.ammo_buckshot = parm18; - pl.ammo_45acp = parm19; - pl.ammo_357sig = parm20; - pl.ammo_57mm = parm21; - pl.ammo_hegrenade = parm22; - pl.ammo_fbgrenade = parm23; - pl.ammo_smokegrenade = parm24; - pl.usp45_mag = parm25; - pl.glock18_mag = parm26; - pl.deagle_mag = parm27; - pl.p228_mag = parm28; - pl.elites_mag = parm29; - pl.fiveseven_mag = parm30; - pl.m3_mag = parm31; - pl.xm1014_mag = parm32; - pl.mp5_mag = parm33; - pl.p90_mag = parm34; - pl.ump45_mag = parm35; - pl.mac10_mag = parm36; - pl.tmp_mag = parm37; - pl.ak47_mag = parm38; - pl.sg552_mag = parm39; - pl.m4a1_mag = parm40; - pl.aug_mag = parm41; - pl.scout_mag = parm42; - pl.awp_mag = parm43; - pl.g3sg1_mag = parm44; - pl.sg550_mag = parm45; - pl.para_mag = parm46; pl.gflags = parm63; - if (pl.flags & FL_CROUCHING) { + if (pl.IsCrouching()) { setsize(pl, VEC_CHULL_MIN, VEC_CHULL_MAX); } else { setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); @@ -110,7 +74,7 @@ CSGameRules::LevelDecodeParms(NSClientPlayer pp) void CSGameRules::LevelChangeParms(NSClientPlayer pp) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; parm1 = g_landmarkpos[0]; parm2 = g_landmarkpos[1]; parm3 = g_landmarkpos[2]; @@ -124,42 +88,6 @@ CSGameRules::LevelChangeParms(NSClientPlayer pp) parm64 = pl.flags; parm10 = pl.g_items; parm11 = pl.activeweapon; - - parm12 = pl.ammo_50ae; - parm13 = pl.ammo_762mm; - parm14 = pl.ammo_556mm; - parm15 = pl.ammo_556mmbox; - parm16 = pl.ammo_338mag; - parm17 = pl.ammo_9mm; - parm18 = pl.ammo_buckshot; - parm19 = pl.ammo_45acp; - parm20 = pl.ammo_357sig; - parm21 = pl.ammo_57mm; - parm22 = pl.ammo_hegrenade; - parm23 = pl.ammo_fbgrenade; - parm24 = pl.ammo_smokegrenade; - parm25 = pl.usp45_mag; - parm26 = pl.glock18_mag; - parm27 = pl.deagle_mag; - parm28 = pl.p228_mag; - parm29 = pl.elites_mag; - parm30 = pl.fiveseven_mag; - parm31 = pl.m3_mag; - parm32 = pl.xm1014_mag; - parm33 = pl.mp5_mag; - parm34 = pl.p90_mag; - parm35 = pl.ump45_mag; - parm36 = pl.mac10_mag; - parm37 = pl.tmp_mag; - parm38 = pl.ak47_mag; - parm39 = pl.sg552_mag; - parm40 = pl.m4a1_mag; - parm41 = pl.aug_mag; - parm42 = pl.scout_mag; - parm43 = pl.awp_mag; - parm44 = pl.g3sg1_mag; - parm45 = pl.sg550_mag; - parm46 = pl.para_mag; } void @@ -175,28 +103,10 @@ CSGameRules::LevelNewParms(void) parm64 = FL_CLIENT; } -void -CSGameRules::PlayerKill(NSClientPlayer pl) -{ - Damage_Apply(pl, pl, pl.health, WEAPON_NONE, DMG_SKIP_ARMOR); -} - -void -TriggerFlashlight(NSClient target) -{ - entity oldself = self; - self = target; - Flashlight_Toggle(); - self = oldself; -} - bool CSGameRules::ImpulseCommand(NSClient bp, float num) { switch (num) { - case 100: - TriggerFlashlight(bp); - break; default: return super::ImpulseCommand(bp, num); } diff --git a/src/server/gamerules_deathmatch.qc b/src/server/gamerules_deathmatch.qc index dbe7969..1b9cdba 100644 --- a/src/server/gamerules_deathmatch.qc +++ b/src/server/gamerules_deathmatch.qc @@ -119,7 +119,7 @@ CSDeathmatchRules::PlayerDeath(NSClientPlayer pl) /* explode all satchels */ s_satchel_detonate((entity)pl); /* drop their posessions into a weaponbox item */ - weaponbox_spawn((player)pl); + weaponbox_spawn((CSPlayer)pl); #endif /* either gib, or make a corpse */ @@ -128,12 +128,12 @@ CSDeathmatchRules::PlayerDeath(NSClientPlayer pl) float gibStrength = g_dmg_iDamage * 2.0f; BreakModel_Entity(pl, gibDir, gibStrength); } else { - FX_Corpse_Spawn((player)pl, ANIM_DEATH1); - //FX_Corpse_Spawn((player)pl, ANIM_DIESIMPLE); + FX_Corpse_Spawn((CSPlayer)pl, ANIM_DEATH1); + //FX_Corpse_Spawn((CSPlayer)pl, ANIM_DIESIMPLE); } /* now let's make the real client invisible */ - pl.Death(); + //pl.Death(); pl.SetTakedamage(DAMAGE_NO); pl.gflags &= ~GF_FLASHLIGHT; @@ -149,7 +149,7 @@ CSDeathmatchRules::PlayerDeath(NSClientPlayer pl) void CSDeathmatchRules::PlayerSpawn(NSClientPlayer pp) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; /* this is where the mods want to deviate */ entity spot; @@ -223,7 +223,7 @@ CSDeathmatchRules::PlayerSpawn(NSClientPlayer pp) pl.SetInfoKey("*dead", "0"); pl.SetInfoKey("*deaths", ftos(pl.deaths)); pl.SetPropData("actor_human"); - pl.SetCanBleed(true); + pl.EnableBleeding(); LevelNewParms(); LevelDecodeParms(pl); @@ -232,9 +232,9 @@ CSDeathmatchRules::PlayerSpawn(NSClientPlayer pp) pl.activeweapon = WEAPON_KNIFE; int randomGun = (int)rint(random(WEAPON_USP45, WEAPON_FIVESEVEN)); - Weapons_AddItem(pl, randomGun, -1); + //Weapons_AddItem(pl, randomGun, -1); randomGun = (int)rint(random(WEAPON_M3, WEAPON_PARA)); - Weapons_AddItem(pl, randomGun, -1); + //Weapons_AddItem(pl, randomGun, -1); pl.activeweapon = randomGun; Ammo_BuyPrimary(pl, TRUE); @@ -242,7 +242,6 @@ CSDeathmatchRules::PlayerSpawn(NSClientPlayer pp) spot = Spawn_SelectRandom("info_player_deathmatch"); pl.Transport(spot.origin, spot.angles); - Weapons_RefreshAmmo(pl); Client_FixAngle(pl, pl.angles); } diff --git a/src/server/gamerules_multiplayer.qc b/src/server/gamerules_multiplayer.qc index 7215382..677bd2e 100644 --- a/src/server/gamerules_multiplayer.qc +++ b/src/server/gamerules_multiplayer.qc @@ -14,6 +14,14 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef CSSOURCE + #define SPAWNPOINT_CT "info_player_counterterrorist" + #define SPAWNPOINT_T "info_player_terrorist" +#else + #define SPAWNPOINT_CT "info_player_start" + #define SPAWNPOINT_T "info_player_deathmatch" +#endif + string CSMultiplayerRules::Title(void) { @@ -42,12 +50,12 @@ CSMultiplayerRules::PlayerDisconnect(NSClientPlayer pl) void CSMultiplayerRules::PlayerDeath(NSClientPlayer pl) { - player targ = (player)g_dmg_eTarget; - player attk = (player)g_dmg_eAttacker; + CSPlayer targ = (CSPlayer)g_dmg_eTarget; + CSPlayer attk = (CSPlayer)g_dmg_eAttacker; NSRenderableEntity newCorpse; float deathAnimation = ANIM_DEATH1; - if (targ.flags & FL_CROUCHING) { + if (targ.IsCrouching()) { deathAnimation = ANIM_CROUCH_DIE; } else { switch (g_dmg_iHitBody) { @@ -128,21 +136,25 @@ CSMultiplayerRules::PlayerDeath(NSClientPlayer pl) targ.SetInfoKey("*icon1_b", "0"); } - Weapon_DropCurrentWeapon(targ); + /* TODO: implement this in NSNavAI */ + //targ.DropActiveWeapon(); + + ///Weapon_DropCurrentWeapon(targ); /* if we're the bomb carrier, make sure we drop the bomb. */ - if (targ.g_items & ITEM_C4BOMB) { - targ.activeweapon = WEAPON_C4BOMB; - Weapon_DropCurrentWeapon(targ); + if (targ.HasItem("weapon_c4")) { + //targ.SwitchToWeapon("weapon_c4"); + //Weapon_DropCurrentWeapon(targ); } else { - targ.activeweapon = Cstrike_WeaponToDropUponDeath(targ); - Weapon_DropCurrentWeapon(targ); + //targ.activeweapon = Cstrike_WeaponToDropUponDeath(targ); + //Weapon_DropCurrentWeapon(targ); } /* clear all ammo and inventory... */ - PlayerClearWeaponry(targ); - targ.Death(); + targ.RemoveAllWeapons(); +// targ.Death(); targ.gflags &= ~GF_FLASHLIGHT; + targ.m_bHasNightvision = false; targ.StartSoundDef("Player.Death", CHAN_AUTO, true); @@ -170,7 +182,7 @@ CSMultiplayerRules::PlayerPreFrame(NSClientPlayer pl) happen here */ { vector sourcePos, destPos; - player p = (player)pl; + CSPlayer p = (CSPlayer)pl; sourcePos = pl.GetEyePos(); destPos = sourcePos + (pl.GetForward() * 512); @@ -235,7 +247,7 @@ CSMultiplayerRules::CreateRescueZones(void) return; /* hostage zones need to go somewhere */ - for (entity e = world; (e = find(e, ::classname, "info_player_start"));) { + for (entity e = world; (e = find(e, ::classname, SPAWNPOINT_CT));) { info_hostage_rescue newzone = spawn(info_hostage_rescue, origin: e.origin); newzone.Respawn(); } @@ -258,7 +270,7 @@ CSMultiplayerRules::CreateCTBuyzones(void) return; /* since no buyzones are available, let's create one around every CT spawn */ - for (entity e = world; (e = find(e, ::classname, "info_player_start"));) { + for (entity e = world; (e = find(e, ::classname, SPAWNPOINT_CT));) { info_buyzone newzone = spawn(info_buyzone, origin: e.origin); newzone.Respawn(); newzone.team = TEAM_CT; @@ -282,7 +294,7 @@ CSMultiplayerRules::CreateTBuyzones(void) return; /* since no buyzones are available, let's create one around every T spawn */ - for (entity e = world; (e = find(e, ::classname, "info_player_deathmatch"));) { + for (entity e = world; (e = find(e, ::classname, SPAWNPOINT_T));) { info_buyzone newzone = spawn(info_buyzone, origin: e.origin); newzone.Respawn(); newzone.team = TEAM_T; @@ -292,6 +304,39 @@ CSMultiplayerRules::CreateTBuyzones(void) void CSMultiplayerRules::InitPostEnts(void) { + EntityDef_Precache("CSBasePistol"); + EntityDef_Precache("CSBaseRifle"); + EntityDef_Precache("CSBaseShotgun"); + EntityDef_Precache("weapon_ak47"); + EntityDef_Precache("weapon_aug"); + EntityDef_Precache("weapon_awp"); + EntityDef_Precache("weapon_c4"); + EntityDef_Precache("weapon_deagle"); + EntityDef_Precache("weapon_elites"); + EntityDef_Precache("weapon_famas"); + EntityDef_Precache("weapon_fiveseven"); + EntityDef_Precache("weapon_flashbang"); + EntityDef_Precache("weapon_g3sg1"); + EntityDef_Precache("weapon_galil"); + EntityDef_Precache("weapon_glock18"); + EntityDef_Precache("weapon_hegrenade"); + EntityDef_Precache("weapon_knife"); + EntityDef_Precache("weapon_m249"); + EntityDef_Precache("weapon_m3"); + EntityDef_Precache("weapon_m4a1"); + EntityDef_Precache("weapon_mac10"); + EntityDef_Precache("weapon_mp5navy"); + EntityDef_Precache("weapon_p228"); + EntityDef_Precache("weapon_p90"); + EntityDef_Precache("weapon_scout"); + EntityDef_Precache("weapon_sg550"); + EntityDef_Precache("weapon_sg552"); + EntityDef_Precache("weapon_smokegrenade"); + EntityDef_Precache("weapon_tmp"); + EntityDef_Precache("weapon_ump45"); + EntityDef_Precache("weapon_usp"); + EntityDef_Precache("weapon_xm1014"); + MOTD_LoadDefault(); /* let's check if we need to create buyzones */ @@ -482,7 +527,7 @@ CSMultiplayerRules::BuyingPossible(NSClientPlayer pl) void CSMultiplayerRules::MakeBomber(NSClientPlayer pl) { - Weapons_AddItem(pl, WEAPON_C4BOMB, -1); + pl.GiveItem("weapon_c4"); env_message_single(pl, "Hint_you_have_the_bomb"); } @@ -511,7 +556,7 @@ CSMultiplayerRules::RestartRound(int iWipe) m_iSwapTeamRoundCounter = 0; for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - player pl = (player)eFind; + CSPlayer pl = (CSPlayer)eFind; if (pl.team == TEAM_T) { pl.team = TEAM_CT; /* temp for CT */ @@ -532,7 +577,7 @@ CSMultiplayerRules::RestartRound(int iWipe) if (!(eFind.flags & FL_CLIENT)) continue; - player pl = (player)eFind; + CSPlayer pl = (CSPlayer)eFind; if (pl.health > 0 && iWipe == FALSE) { PlayerRespawn(pl, pl.team); @@ -551,7 +596,7 @@ CSMultiplayerRules::RestartRound(int iWipe) if (!(eFind.flags & FL_CLIENT)) continue; - player pl = (player)eFind; + CSPlayer pl = (CSPlayer)eFind; if (pl.health > 0 && iWipe == FALSE) { PlayerRespawn(pl, pl.team); @@ -572,7 +617,7 @@ CSMultiplayerRules::RestartRound(int iWipe) if (!(eFind.flags & FL_CLIENT)) continue; - player pl = (player)eFind; + CSPlayer pl = (CSPlayer)eFind; pl.team = TEAM_CT; if (pl.health > 0 && iWipe == FALSE) { @@ -590,7 +635,7 @@ CSMultiplayerRules::RestartRound(int iWipe) } for (entity eFind = world; (eFind = find(eFind, ::classname, "tempdecal"));) { - decal dec = (decal)eFind; + NSDecal dec = (NSDecal)eFind; dec.m_strTexture = ""; dec.SendFlags = -1; } @@ -598,12 +643,6 @@ CSMultiplayerRules::RestartRound(int iWipe) NSEntity e = (NSEntity)eFind; e.Destroy(); } - // Remove potential bomb backpack model from the world, else bots will go - // chase a ghost. - entity e = find(world, ::model, "models/w_backpack.mdl"); - if (e != world) { - remove(e); - } WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, EV_CLEARDECALS); @@ -620,7 +659,7 @@ CSMultiplayerRules::RestartRound(int iWipe) iPickT++; if (iPickT == iRandomT) { - MakeBomber((player)eFind); + MakeBomber((CSPlayer)eFind); } } } @@ -635,7 +674,7 @@ CSMultiplayerRules::RestartRound(int iWipe) if (eFind.team == TEAM_CT) { iPickCT++; if (iPickCT == iRandomCT) { - MakeVIP((player)eFind); + MakeVIP((CSPlayer)eFind); } } } @@ -658,7 +697,10 @@ CSMultiplayerRules::RestartRound(int iWipe) } } +#ifdef BOT CSBot_BuyStart(); +#endif + TimerBegin(autocvar_mp_freezetime, GAME_FREEZE); Money_ResetTeamReward(); } @@ -751,7 +793,7 @@ CSMultiplayerRules::SwitchTeams(void) int iCTW, iTW; for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - player pl = (player)eFind; + CSPlayer pl = (CSPlayer)eFind; if (pl.team == TEAM_CT) { pl.team = TEAM_T; pl.charmodel -= 4; @@ -866,24 +908,24 @@ CSMultiplayerRules::PlayerFindSpawn(float t) entity point = world; if (t == TEAM_T) { - m_eLastTSpawn = find(m_eLastTSpawn, ::classname, "info_player_deathmatch"); + m_eLastTSpawn = find(m_eLastTSpawn, ::classname, SPAWNPOINT_T); if (m_eLastTSpawn == world) { - m_eLastTSpawn = find(m_eLastTSpawn, ::classname, "info_player_deathmatch"); + m_eLastTSpawn = find(m_eLastTSpawn, ::classname, SPAWNPOINT_T); } point = m_eLastTSpawn; } else if (t == TEAM_CT) { - m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, "info_player_start"); + m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, SPAWNPOINT_CT); if (m_eLastCTSpawn == world) { - m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, "info_player_start"); + m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, SPAWNPOINT_CT); } point = m_eLastCTSpawn; } else if (t == TEAM_VIP) { point = find(world, ::classname, "info_vip_start"); if (!point) - point = find(m_eLastTSpawn, ::classname, "info_player_start"); + point = find(m_eLastTSpawn, ::classname, SPAWNPOINT_CT); } if (point == world) { @@ -903,35 +945,29 @@ Called whenever a player survived a round and needs a basic respawn. void CSMultiplayerRules::PlayerRespawn(NSClientPlayer pp, int fTeam) { - player pl = (player)pp; - - entity eSpawn; - forceinfokey(pl, "*spec", "0"); - eSpawn = PlayerFindSpawn(pl.team); - - pl.classname = "player"; - pl.health = pl.max_health = 100; - forceinfokey(pl, "*dead", "0"); - CountPlayers(); - - pl.takedamage = DAMAGE_YES; - pl.solid = SOLID_SLIDEBOX; - pl.movetype = MOVETYPE_WALK; - pl.flags = FL_CLIENT; - pl.iBleeds = TRUE; - pl.viewzoom = 1.0; - pl.g_items &= ~ITEM_C4BOMB; + CSPlayer pl = (CSPlayer)pp; + NSEntity eSpawn = (NSEntity)PlayerFindSpawn(pl.team); + pl.MakePlayer(); + pl.GiveItem("item_suit"); pl.SetOrigin(eSpawn.origin); - pl.angles = eSpawn.angles; - pl.SendFlags = UPDATE_ALL; + pl.SetAngles(eSpawn.angles); Client_FixAngle(pl, pl.angles); + CountPlayers(); + pl.SetInfoKey("*icon1", ""); pl.SetInfoKey("*icon1_r", "1"); pl.SetInfoKey("*icon1_g", "1"); pl.SetInfoKey("*icon1_b", "1"); + /* VIP starts with 200 armor and an extra mag */ + if (pl.team == TEAM_VIP) { + pl.SetArmor(200); + pl.GiveItem("weapon_usp"); + } + +#ifndef CSSOURCE switch (pl.charmodel) { case 1: pl.model = "models/player/terror/terror.mdl"; @@ -960,118 +996,89 @@ CSMultiplayerRules::PlayerRespawn(NSClientPlayer pp, int fTeam) default: pl.model = "models/player/vip/vip.mdl"; } +#else + switch (pl.charmodel) { + case 1: + pl.model = "models/player/t_phoenix.mdl"; + break; + case 2: + pl.model = "models/player/t_leet.mdl"; + break; + case 3: + pl.model = "models/player/t_arctic.mdl"; + break; + case 4: + pl.model = "models/player/t_guerilla.mdl"; + break; + case 5: + pl.model = "models/player/ct_urban.mdl"; + break; + case 6: + pl.model = "models/player/ct_gsg9.mdl"; + break; + case 7: + pl.model = "models/player/ct_sas.mdl"; + break; + case 8: + pl.model = "models/player/ct_gign.mdl"; + break; + default: + pl.model = "models/player/vip/vip.mdl"; + } +#endif pl.SetModel(pl.model); pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX); - pl.velocity = [0,0,0]; + pl.ClearVelocity(); pl.progress = 0.0f; - Weapons_SwitchBest(pl); + /* TODO: Implement this in NSNavAI*/ + //Weapons_SwitchBest(pl); Ammo_AutoFill(pl); } void CSMultiplayerRules::PlayerClearWeaponry(NSClientPlayer pp) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; pl.g_items = 0x0; pl.activeweapon = 0; - pl.ammo_50ae = 0; - pl.ammo_762mm = 0; - pl.ammo_556mm = 0; - pl.ammo_556mmbox = 0; - pl.ammo_338mag = 0; - pl.ammo_9mm = 0; - pl.ammo_buckshot = 0; - pl.ammo_45acp = 0; - pl.ammo_357sig = 0; - pl.ammo_57mm = 0; - pl.ammo_hegrenade = 0; - pl.ammo_fbgrenade = 0; - pl.ammo_smokegrenade = 0; - pl.usp45_mag = 0; - pl.glock18_mag = 0; - pl.deagle_mag = 0; - pl.p228_mag = 0; - pl.elites_mag = 0; - pl.fiveseven_mag = 0; - pl.m3_mag = 0; - pl.xm1014_mag = 0; - pl.mp5_mag = 0; - pl.p90_mag = 0; - pl.ump45_mag = 0; - pl.mac10_mag = 0; - pl.tmp_mag = 0; - pl.ak47_mag = 0; - pl.sg552_mag = 0; - pl.m4a1_mag = 0; - pl.aug_mag = 0; - pl.scout_mag = 0; - pl.awp_mag = 0; - pl.g3sg1_mag = 0; - pl.sg550_mag = 0; - pl.para_mag = 0; pl.viewzoom = 1.0f; - pl.mode_temp = 0; -} - -/* -================= -PlayerMakePlayable - -Called whenever need a full-reinit of a player. -This may be after a player had died or when the game starts for the first time. -================= -*/ - -static void -MakePlayable(entity targ) -{ - entity oself = self; - self = targ; - - if (clienttype(targ) != CLIENTTYPE_REAL) - spawnfunc_csbot(); - else - spawnfunc_player(); - - self = oself; + pl.m_bHasNightvision = false; } void CSMultiplayerRules::PlayerMakePlayable(NSClientPlayer pp, int chara) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; /* spectator */ if (chara == 0) { PlayerSpawn(pl); return; } - MakePlayable(pp); - pl.g_items |= ITEM_SUIT; - Weapons_AddItem(pl, WEAPON_KNIFE, -1); + pl.ingame = TRUE; + forceinfokey(pl, "*team", ftos(pl.team)); + PlayerRespawn(pl, pl.team); /* terrorists */ if (chara < 5) { pl.team = TEAM_T; if (autocvar_fcs_knifeonly == FALSE) { - Weapons_AddItem(pl, WEAPON_GLOCK18, -1); - pl.ammo_9mm = 40; + pl.GiveItem("weapon_glock18"); + //pl.ammo_9mm = 40; } } else { pl.team = TEAM_CT; if (autocvar_fcs_knifeonly == FALSE) { - Weapons_AddItem(pl, WEAPON_USP45, -1); - pl.ammo_45acp = 24; + pl.GiveItem("weapon_usp"); + //pl.ammo_45acp = 24; } } - pl.ingame = TRUE; - forceinfokey(pl, "*team", ftos(pl.team)); - PlayerRespawn(pl, pl.team); + pl.GiveItem("weapon_knife"); } /* @@ -1084,7 +1091,7 @@ Force the player to become an observer. void CSMultiplayerRules::PlayerMakeSpectator(NSClientPlayer pp) { - player pl = (player)pp; + CSPlayer pl = (CSPlayer)pp; pl.MakeTempSpectator(); PlayerClearWeaponry(pl); pl.view_ofs = g_vec_null; @@ -1101,7 +1108,7 @@ another player joins and causes the game rules/scores to reset fully void CSMultiplayerRules::PlayerReset(NSClientPlayer pl) { - player p = (player)pl; + CSPlayer p = (CSPlayer)pl; /* give the initial server-joining money */ p.money = 0; @@ -1111,6 +1118,7 @@ CSMultiplayerRules::PlayerReset(NSClientPlayer pl) p.m_seenFriend = false; p.m_seenEnemy = false; p.m_seenHostage = false; + p.m_bHasNightvision = false; } /* @@ -1177,7 +1185,7 @@ void CSEv_JoinTeam_f(float flChar) { CSMultiplayerRules rules; - player pl; + CSPlayer pl; /* matches Game_InitRules() */ if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { @@ -1185,7 +1193,7 @@ CSEv_JoinTeam_f(float flChar) } rules = (CSMultiplayerRules)g_grMode; - pl = (player)self; + pl = (CSPlayer)self; if (pl.team == TEAM_VIP) { centerprint(pl, "You are the VIP!\nYou cannot switch roles now.\n"); diff --git a/src/server/gamerules_singleplayer.qc b/src/server/gamerules_singleplayer.qc index 0d6e5b7..dd685b2 100644 --- a/src/server/gamerules_singleplayer.qc +++ b/src/server/gamerules_singleplayer.qc @@ -52,7 +52,6 @@ CSSingleplayerRules::PlayerSpawn(NSClientPlayer pl) setmodel(pl, pl.model); setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); - pl.view_ofs = PHY_VIEWPOS; pl.velocity = [0,0,0]; pl.gravity = __NULL__; pl.frame = 1; @@ -75,6 +74,5 @@ CSSingleplayerRules::PlayerSpawn(NSClientPlayer pl) pl.angles = spot.angles; } - Weapons_RefreshAmmo(pl); Client_FixAngle(pl, pl.angles); } diff --git a/src/server/hostage_entity.qc b/src/server/hostage_entity.qc index e091439..b4557e4 100644 --- a/src/server/hostage_entity.qc +++ b/src/server/hostage_entity.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/*!QUAKED hostage_entity (0 1 0) (-16 -16 0) (16 16 72) +/*!QUAKED CSHostage (0 1 0) (-16 -16 0) (16 16 72) # OVERVIEW Hostage NPC. Used in the Hostage Rescue mode (cs_* maps). @@ -79,23 +79,23 @@ enum HOSA_DEADTABLE3 }; -class hostage_entity:NSTalkMonster +class CSHostage:NSTalkMonster { int m_iUsedOnce; - void(void) hostage_entity; + void CSHostage(void); + + virtual void OnPlayerUse(void); + virtual void Pain(entity, entity, int, vector, int); + virtual void Death(entity, entity, int, vector, int); - virtual void(void) Respawn; - virtual void(void) OnPlayerUse; - virtual void(void) Pain; - virtual void(void) Death; }; void -hostage_entity::OnPlayerUse(void) +CSHostage::OnPlayerUse(void) { if (eActivator.team == TEAM_T) { - player pl = (player)eActivator; + CSPlayer pl = (CSPlayer)eActivator; if (g_csMode.ShowHints() == true) if (pl.m_hostMessageT == false) { @@ -110,7 +110,7 @@ hostage_entity::OnPlayerUse(void) /* CT reward, first time only */ if (m_iUsedOnce == FALSE) { - Money_AddMoney((player)eActivator, 150); + Money_AddMoney((CSPlayer)eActivator, 150); m_iUsedOnce = TRUE; } @@ -118,12 +118,14 @@ hostage_entity::OnPlayerUse(void) } void -hostage_entity::Pain(void) +CSHostage::Pain(entity inflictor, entity attacker, int damage, vector dir, int location) { + super::Pain(inflictor, attacker, damage, dir, location); + if (IsAlive() == false) return; - switch (g_dmg_iHitBody) { + switch (location) { case BODY_HEAD: case BODY_DEFAULT: case BODY_CHEST: @@ -145,19 +147,19 @@ hostage_entity::Pain(void) } /* penalties */ - if (g_dmg_eAttacker.classname != "player") + if (attacker.classname != "player") return; - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, -(g_dmg_iDamage * 25)); + Money_AddMoney((NSClientPlayer)attacker, -(damage * 25i)); } void -hostage_entity::Death(void) +CSHostage::Death(entity inflictor, entity attacker, int damage, vector dir, int location) { WarnAllies(); if (IsAlive() == true) { - switch (g_dmg_iHitBody) { + switch (location) { case BODY_HEAD: SetFrame(HOSA_DIE_HEADSHOT); break; @@ -169,11 +171,11 @@ hostage_entity::Death(void) break; } - if (g_dmg_eAttacker.classname == "player") { - if (g_dmg_iDamage >= 100) - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, -2500); + if (attacker.classname == "player") { + if (damage >= 100) + Money_AddMoney((NSClientPlayer)attacker, -2500); else - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, -500); + Money_AddMoney((NSClientPlayer)attacker, -500); Radio_BroadcastMessage(RADIO_HOSDOWN); } @@ -183,52 +185,13 @@ hostage_entity::Death(void) SetHealth(0); /* now mark our state as 'dead' */ - super::Death(); + super::Death(inflictor, attacker, damage, dir, location); SetSolid(SOLID_NOT); } void -hostage_entity::Respawn(void) -{ - spawnflags |= MSF_MULTIPLAYER; - model = "models/hostage.mdl"; - netname = "Hostage"; - base_health = 100; - base_mins = [-16,-16,0]; - base_maxs = [16,16,72]; - - super::Respawn(); - - m_iFlags |= MONSTER_CANFOLLOW; - m_iUsedOnce = FALSE; - PlayerUse = OnPlayerUse; -} - -void -hostage_entity::hostage_entity(void) +CSHostage::CSHostage(void) { Sound_Precache("hostage_entity.follow"); - - m_talkAnswer = ""; - m_talkAsk = ""; - m_talkAllyShot = ""; - m_talkGreet = ""; - m_talkIdle = ""; - m_talkHearing = ""; - m_talkSmelling = ""; - m_talkStare = ""; - m_talkSurvived = ""; - m_talkWounded = ""; - - m_talkPlayerAsk = ""; - m_talkPlayerGreet = ""; - m_talkPlayerIdle = ""; - m_talkPlayerWounded1 = ""; - m_talkPlayerWounded2 = ""; - m_talkPlayerWounded3 = ""; - m_talkUnfollow = ""; - m_talkFollow = ""; - m_talkStopFollow = ""; - g_cs_hostagestotal++; } diff --git a/src/server/info_buyzone.qc b/src/server/info_buyzone.qc index 8426744..dc20fc4 100644 --- a/src/server/info_buyzone.qc +++ b/src/server/info_buyzone.qc @@ -42,15 +42,14 @@ info_buyzone::info_buyzone(void) void info_buyzone::Respawn(void) { - SetSolid(SOLID_TRIGGER); + super::Respawn(); SetSize([-128,-128,-128], [128,128,128]); - SetOrigin(GetSpawnOrigin()); } void info_buyzone::Touch(entity eToucher) { - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; if (!(eToucher.flags & FL_CLIENT)) return; diff --git a/src/server/info_hostage_rescue.qc b/src/server/info_hostage_rescue.qc index d205699..c5ca6af 100644 --- a/src/server/info_hostage_rescue.qc +++ b/src/server/info_hostage_rescue.qc @@ -45,16 +45,15 @@ info_hostage_rescue::info_hostage_rescue(void) void info_hostage_rescue::Respawn(void) { - SetSolid(SOLID_TRIGGER); + super::Respawn(); SetSize([-128,-128,-128], [128,128,128]); - SetOrigin(GetSpawnOrigin()); } void info_hostage_rescue::Touch(entity eToucher) { if (eToucher.flags & FL_CLIENT) { - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; pl.gflags |= GF_RESCUEZONE; return; } @@ -70,14 +69,14 @@ info_hostage_rescue::Touch(entity eToucher) } /* some custom maps are very smart... */ - if (!((player)hosty.m_eFollowing)) + if (!((CSPlayer)hosty.m_eFollowing)) return; Radio_BroadcastMessage(RADIO_RESCUED); CSBot_HostageRescueNotify(); g_cs_hostagesrescued++; - Money_AddMoney((player)hosty.m_eFollowing, 1000); + Money_AddMoney((CSPlayer)hosty.m_eFollowing, 1000); /* In Hostage Rescue, all Counter-Terrorists receive an $850 * bonus for every hostage they rescue, even if they lose the round. */ diff --git a/src/server/item_suit.qc b/src/server/item_suit.qc index 1ace710..8d4e8eb 100644 --- a/src/server/item_suit.qc +++ b/src/server/item_suit.qc @@ -42,18 +42,17 @@ item_suit::Spawned(void) void item_suit::Respawn(void) { + super::Respawn(); SetSolid(SOLID_TRIGGER); SetMovetype(MOVETYPE_TOSS); - SetModel(GetSpawnModel()); SetSize(VEC_HULL_MIN, VEC_HULL_MAX); - SetOrigin(GetSpawnOrigin()); ReleaseThink(); } void item_suit::Touch(entity eToucher) { - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; if (pl.classname != "player") { return; diff --git a/src/server/player.qc b/src/server/player.qc index 8706f8b..bfec853 100644 --- a/src/server/player.qc +++ b/src/server/player.qc @@ -14,15 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -void Weapons_Draw(player); - -void -CSEv_PlayerSwitchWeapon_i(int w) -{ - player pl = (player)self; - pl.activeweapon = w; - Weapons_Draw(pl); -} void Player_Precache(void) diff --git a/src/server/progs.src b/src/server/progs.src index b4647a3..7bb0387 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -1,6 +1,6 @@ #pragma target fte_5768 //#pragma flag enable assumeint -#pragma progs_dat "../../progs.dat" +#pragma progs_dat "../../zpak001.pk3dir/progs.dat" #define QWSSQC #define SERVER @@ -34,7 +34,6 @@ info_hostage_rescue.qc func_vip_safetyzone.qc info_map_parameters.qc item_suit.qc -../../../valve/src/server/items.qc ../../../src/botlib/include.src bot.qc @@ -49,9 +48,7 @@ radio.qc ammo.qc buy.qc server.qc -../../../valve/src/server/damage.qc ../../../valve/src/server/flashlight.qc -../../../valve/src/server/modelevent.qc spawn.qc diff --git a/src/server/server.qc b/src/server/server.qc index 7fa75f9..fc586c7 100644 --- a/src/server/server.qc +++ b/src/server/server.qc @@ -60,11 +60,10 @@ Game_Worldspawn(void) Sound_Precache("item.respawn"); Sound_Precache("weapon.pickup"); - Weapons_Init(); FX_Corpse_Init(); - clientstat(STAT_MONEY, EV_INTEGER, player::money); - clientstat(STAT_PROGRESS, EV_FLOAT, player::progress); + clientstat(STAT_MONEY, EV_INTEGER, CSPlayer::money); + clientstat(STAT_PROGRESS, EV_FLOAT, CSPlayer::progress); pointerstat(STAT_GAMETIME, EV_FLOAT, &g_cs_gametime); pointerstat(STAT_GAMESTATE, EV_INTEGER, &g_cs_gamestate); diff --git a/src/shared/CSProjectile.h b/src/shared/CSProjectile.h new file mode 100644 index 0000000..a00110d --- /dev/null +++ b/src/shared/CSProjectile.h @@ -0,0 +1,8 @@ +class +CSProjectile:NSProjectile +{ + void CSProjectile(void); + + +}; + diff --git a/src/shared/CSProjectile.qc b/src/shared/CSProjectile.qc new file mode 100644 index 0000000..a62e885 --- /dev/null +++ b/src/shared/CSProjectile.qc @@ -0,0 +1,5 @@ +void +CSProjectile::CSProjectile(void) +{ + +} diff --git a/src/shared/CSWeapon.qc b/src/shared/CSWeapon.qc new file mode 100644 index 0000000..950d2b1 --- /dev/null +++ b/src/shared/CSWeapon.qc @@ -0,0 +1,220 @@ + +#ifdef CLIENT +void Cstrike_DrawCrosshair(CSPlayer); +#endif + +class +CSWeapon:NSWeapon +{ + void CSWeapon(void); + +#ifdef CLIENT + int m_iHudSlot; + int m_iHudSlotPos; + + string m_ammoIcon; + string m_crossHair; + NSWeapon m_nextWeapon; + virtual void AddedToInventory(void); + virtual void UpdateGUI(void); +#endif + + virtual void Draw(void); + virtual void PrimaryAttack(void); + virtual void SecondaryAttack(void); + virtual void Release(void); + virtual void HitscanAttack(string); + virtual void SwitchedToWeapon(void); +}; + +void +CSWeapon::CSWeapon(void) +{ + +} + +void +CSWeapon::SwitchedToWeapon(void) +{ + w_cstrke_switched((CSPlayer)owner); +} + +void +CSWeapon::PrimaryAttack(void) +{ + if (GetDefBool("altAlternates") == true) { + if (CanFire() == false) { + return; + } + + m_iMode = 1 - m_iMode; + } + + if (m_iMode) { + super::SecondaryAttack(); + return; + } + + super::PrimaryAttack(); +} + +void +CSWeapon::SecondaryAttack(void) +{ + if (GetDefBool("altSilences") == true) { + if (CanFire() == false) { + return; + } + + float silAnimation = 0; + float silTime; + + m_iMode = 1 - m_iMode; + + if (m_iMode) + silAnimation = GetDefAct("actAddSil"); + else + silAnimation = GetDefAct("actDetachSil"); + + SetWeaponFrame(silAnimation); + silTime = frameduration(m_viewModel, silAnimation); + SetAttackNext(silTime); + SetIdleNext(silTime + 1.0f); + return; + } + + super::SecondaryAttack(); +} + +void +CSWeapon::HitscanAttack(string defName) +{ + CSPlayer ourOwner = (CSPlayer)owner; + int numProjectiles = GetSubDefInt(defName, "numProjectiles"); + string traceInfo = GetSubDefString(defName, "def_projectile"); + float flAccuracyDivisor = GetSubDefFloat(defName,"accuracyDivisor"); + float flAccuracyMovementPenalty = GetSubDefFloat(defName,"accuracyMovementPenalty"); + float flAccuracyMultiplier = GetSubDefFloat(defName,"accuracyMultiplier"); + float flAccuracyAdd= GetSubDefFloat(defName,"accuracyAdd"); + float flRangeModifier = GetSubDefFloat(defName,"rangeModifier"); + float flPenetrationPower = GetSubDefFloat(defName,"penetrationPower"); + float flBulletStrength = GetSubDefFloat(defName,"bulletStrength"); + float flMultiplierShots = GetSubDefFloat(defName,"multiplierShots"); + float flMultiplierStrength = GetSubDefFloat(defName,"multiplierStrength"); + float flMultiplierInaccuracy = GetSubDefFloat(defName,"multiplierInaccuracy"); + float accuracy = Cstrike_CalculateAccuracy(ourOwner, flAccuracyDivisor, flAccuracyMovementPenalty) / flAccuracyMultiplier; + accuracy += flAccuracyAdd; + vector bulletSpread = [accuracy, accuracy]; + + /* always fire at least 1 */ + if (numProjectiles <= 0i) { + numProjectiles = 1i; + } + + if (flBulletStrength) { + Cstrike_BulletRecoil_ApplyPre(ourOwner, flBulletStrength); + } + +#ifdef SERVER + float traceDamage = GetSubDefFloat(traceInfo, "damage"); + + /* don't bother with shotguns */ + if (numProjectiles <= 3i) { + //TraceAttack_SetRangeModifier(flRangeModifier); + //TraceAttack_SetPenetrationPower(flPenetrationPower); + } else { + bulletSpread = [random(-1,1) * 0.1,random(-1,1) * 0.05]; + } + + for (int i = 0i; i < numProjectiles; i++) { + // TraceAttack_FireBulletsWithDecal(1, ourOwner.GetEyePos(), traceDamage, bulletSpread, 0, "Impact.BigShot", ourOwner); + } +#endif + + if (flBulletStrength) { + Cstrike_BulletRecoil_ApplyPost(ourOwner, flBulletStrength); + } + + /* don't bother with shotguns */ + if (numProjectiles <= 3i) { + Cstrike_ShotMultiplierAdd(ourOwner, flMultiplierShots, flMultiplierStrength,accuracy* flMultiplierInaccuracy); + } +} + +void +CSWeapon::Draw(void) +{ + super::Draw(); + +#ifdef CLIENT + CSPlayer ourOwner = (CSPlayer)owner; + ourOwner.cs_cross_mindist = GetDefInt("crossMinDist"); + ourOwner.cs_cross_deltadist = GetDefInt("crossDeltaDist"); + + CStrikeView_UpdateGeomset(ourOwner); +#endif +} + +void +CSWeapon::Release(void) +{ + owner.v_angle = input_angles; + w_cstrike_weaponrelease((CSPlayer)owner); + input_angles = owner.v_angle; + super::Release(); +} + +#ifdef CLIENT +void +CSWeapon::AddedToInventory(void) +{ + super::AddedToInventory(); + + m_ammoIcon = GetDefString("ammoIcon"); + + if (m_ammoIcon == "") { + m_ammoIcon = sprintf("%s.ammo", strtolower(classname)); + } + + m_crossHair = GetDefString("crosshair"); + + if (m_crossHair == "") { + m_crossHair = sprintf("%s.crosshair", strtolower(classname)); + } + + m_iHudSlot = GetDefInt("hudSlot"); + m_iHudSlotPos = GetDefInt("hudSlotPos"); +} + +void +CSWeapon::UpdateGUI(void) +{ + CSPlayer ourOwner = (CSPlayer)GetOwner(); + + /* draw crosshair */ + Cstrike_DrawCrosshair(ourOwner); + + /* draw ammo icon */ + if (m_ammoIcon) { + vector ammoPos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + HLSprite_Draw_RGBA(m_ammoIcon, ammoPos, g_hud_color, pSeatLocal->m_flAmmo2Alpha, true); + } + + if (m_bAmmoRequired == false) { + return; + } + + if (m_iClipSize > 0i) { + ourOwner.a_ammo1 = m_iClip; + HUD_DrawAmmo1(); + } + + ourOwner.a_ammo2 = ourOwner.GetReserveAmmo(m_primaryAmmoType); + HUD_DrawAmmo2(); + + if (m_secondaryAmmoType && m_primaryAmmoType != m_secondaryAmmoType) { + ourOwner.a_ammo3 = ourOwner.GetReserveAmmo(m_secondaryAmmoType); + HUD_DrawAmmo3(); + } +} +#endif \ No newline at end of file diff --git a/src/shared/animations.h b/src/shared/animations.h index 81483a2..217517d 100644 --- a/src/shared/animations.h +++ b/src/shared/animations.h @@ -101,9 +101,9 @@ enum ANIM_RELOAD_AK47, ANIM_GUT_FLINCH, ANIM_HEAD_FLINCH, - ANIM_DEATH1, - ANIM_DEATH2, - ANIM_DEATH3, + ANIM_DEATH1, /* land on stomach */ + ANIM_DEATH2, /* land on back */ + ANIM_DEATH3, /* dramatic death */ ANIM_DIE_HEAD, ANIM_DIE_GUT, ANIM_DIE_LEFT, diff --git a/src/shared/animations.qc b/src/shared/animations.qc index daa8341..4c8daf5 100644 --- a/src/shared/animations.qc +++ b/src/shared/animations.qc @@ -40,7 +40,7 @@ void Animation_Print(string sWow) { } void -Animation_TimerUpdate(player pl, float ftime) +Animation_TimerUpdate(CSPlayer pl, float ftime) { makevectors([0, pl.v_angle[1], 0]); @@ -65,28 +65,28 @@ depending on what the player is doing ================= */ void -Animation_PlayerUpdate(player pl) +Animation_PlayerUpdate(CSPlayer pl) { pl.basebone = gettagindex(pl, "-- R shoulder outside"); if (pl.anim_top_delay <= 0.0f) { - pl.anim_top = Weapons_GetAim(pl, pl.activeweapon); + pl.anim_top = 0;//Weapons_GetAim(pl, pl.activeweapon); } if (vlen(pl.velocity) == 0) { - if (pl.flags & FL_CROUCHING) { + if (pl.IsCrouching()) { pl.anim_bottom = ANIM_IDLE_CROUCH; } else { pl.anim_bottom = ANIM_IDLE; } } else if (vlen(pl.velocity) < 150) { - if (pl.flags & FL_CROUCHING) { + if (pl.IsCrouching()) { pl.anim_bottom = ANIM_RUN_CROUCH; } else { pl.anim_bottom = ANIM_WALK; } } else if (vlen(pl.velocity) > 150) { - if (pl.flags & FL_CROUCHING) { + if (pl.IsCrouching()) { pl.anim_bottom = ANIM_RUN_CROUCH; } else { pl.anim_bottom = ANIM_RUN; @@ -128,7 +128,7 @@ Animation_PlayerUpdate(player pl) } void -Animation_PlayerTop(player pl, float topanim, float timer) +Animation_PlayerTop(CSPlayer pl, float topanim, float timer) { #if 0 pl.anim_top = topanim; @@ -138,7 +138,7 @@ Animation_PlayerTop(player pl, float topanim, float timer) } void -Animation_PlayerBottom(player pl, float botanim, float timer) +Animation_PlayerBottom(CSPlayer pl, float botanim, float timer) { pl.anim_bottom = botanim; } diff --git a/src/shared/defs.h b/src/shared/defs.h index ef1006a..9e9e14c 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -20,7 +20,6 @@ #include "items.h" #include "entities.h" #include "events.h" -#include "pmove.h" #define TEAM_SPECTATOR 0 #define TEAM_T 1 diff --git a/src/shared/include.src b/src/shared/include.src index 1cea513..b77e372 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -1,7 +1,6 @@ #includelist flags.h player.h -../../../valve/src/shared/weapon_common.h animations.h animations.qc @@ -11,37 +10,8 @@ item_c4bomb.h ../../../valve/src/shared/fx_corpse.qc fx_flashbang.qc fx_smokenade.qc - -weapons_cstrike.qc -w_ak47.qc -w_deagle.qc -w_knife.qc -w_usp45.qc -w_glock18.qc -w_p228.qc -w_elites.qc -w_fiveseven.qc -w_m3.qc -w_xm1014.qc -w_mp5.qc -w_p90.qc -w_ump45.qc -w_mac10.qc -w_tmp.qc -w_sg552.qc -w_m4a1.qc -w_aug.qc -w_scout.qc -w_awp.qc -w_g3sg1.qc -w_sg550.qc -w_para.qc -w_c4bomb.qc -w_flashbang.qc -w_hegrenade.qc -w_smokegrenade.qc -weapons.qc -../../../valve/src/shared/weapon_common.qc -pmove.qc item_c4bomb.qc +weapons_cstrike.qc +CSWeapon.qc +pmove.qc #endlist diff --git a/src/shared/item_c4bomb.h b/src/shared/item_c4bomb.h index 5cbdae3..de3d1ad 100644 --- a/src/shared/item_c4bomb.h +++ b/src/shared/item_c4bomb.h @@ -1,7 +1,3 @@ -#ifdef SERVER -void C4Bomb_Plant(NSClientPlayer); -#endif - #ifdef CLIENT string g_c4bombled_spr; void w_c4bomb_parse(void); diff --git a/src/shared/item_c4bomb.qc b/src/shared/item_c4bomb.qc index ce4c12e..87c6fde 100644 --- a/src/shared/item_c4bomb.qc +++ b/src/shared/item_c4bomb.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -class item_c4:NSRenderableEntity +class CSBombEntity:NSRenderableEntity { #ifdef SERVER entity m_eUser; @@ -24,7 +24,7 @@ class item_c4:NSRenderableEntity #endif #ifdef SERVER - void item_c4(void); + void CSBombEntity(void); virtual void Spawned(void); virtual float SendEntity(entity, float); @@ -35,14 +35,14 @@ class item_c4:NSRenderableEntity #endif #ifdef CLIENT - void item_c4(void); + void CSBombEntity(void); virtual void DrawLED(void); virtual float predraw(void); #endif }; void -item_c4::item_c4(void) +CSBombEntity::CSBombEntity(void) { #ifdef SERVER m_eUser = __NULL__; @@ -54,7 +54,7 @@ item_c4::item_c4(void) #ifdef SERVER float -item_c4::SendEntity(entity pvsent, float flags) +CSBombEntity::SendEntity(entity pvsent, float flags) { WriteByte(MSG_ENTITY, ENT_C4BOMB); WriteCoord(MSG_ENTITY, origin[0]); @@ -68,19 +68,19 @@ item_c4::SendEntity(entity pvsent, float flags) } void -item_c4::ClearProgress(void) +CSBombEntity::ClearProgress(void) { if (m_eUser != world) { - player pl = (player)m_eUser; + CSPlayer pl = (CSPlayer)m_eUser; pl.progress = 0.0f; - pl.flags &= ~FL_FROZEN; + pl.RemoveVFlags(VFL_FROZEN); } } void -item_c4::OnPlayerUse(void) +CSBombEntity::OnPlayerUse(void) { - player pl = (player)eActivator; + CSPlayer pl = (CSPlayer)eActivator; /* obvious check */ if (pl.team != TEAM_CT) { @@ -95,13 +95,13 @@ item_c4::OnPlayerUse(void) } void -item_c4::Logic(void) +CSBombEntity::Logic(void) { CSMultiplayerRules rules = (CSMultiplayerRules)g_grMode; /* check if we're being used */ if (m_eUser != world) { - player pl = (player)m_eUser; + CSPlayer pl = (CSPlayer)m_eUser; /* we need to check if the user has changed every frame. */ if (!m_eUser.button5) { @@ -121,7 +121,7 @@ item_c4::Logic(void) /* tracked stat */ pl.progress = m_flDefusalState; - pl.flags |= FL_FROZEN; + pl.AddVFlags(VFL_FROZEN); g_cs_bombbeingdefused = TRUE; } @@ -143,7 +143,11 @@ item_c4::Logic(void) /* In Bomb Defusal, all Terrorists receive $3500 * if they won by detonating the bomb. */ rules.RoundOver(TEAM_T, 3500, FALSE); - Damage_Radius(origin, this.real_owner, 500, g_cstrike_bombradius, false, WEAPON_C4BOMB); + + radiusDamage(origin, -g_cstrike_bombradius, 0i, 500i, real_owner); + //Damage_Radius(origin, this.real_owner, 500, g_cstrike_bombradius, false, WEAPON_C4BOMB); + + StartSoundDef("weapon_c4bomb.explode", CHAN_VOICE, true); for (entity e = world; (e = find(e, ::classname, "func_bomb_target"));) { @@ -183,7 +187,7 @@ item_c4::Logic(void) } void -item_c4::OnRemoveEntity(void) +CSBombEntity::OnRemoveEntity(void) { ClearProgress(); m_flBeepTime = 0.0f; @@ -193,7 +197,7 @@ item_c4::OnRemoveEntity(void) } void -item_c4::Spawned(void) +CSBombEntity::Spawned(void) { super::Spawned(); @@ -208,33 +212,13 @@ item_c4::Spawned(void) customphysics = Logic; PlayerUse = OnPlayerUse; m_flExplodeTime = time + 45.0f; - StartSoundDef("weapon_c4bomb.plant", CHAN_WEAPON, true); -} - -void -C4Bomb_Plant(NSClientPlayer planter) -{ - item_c4 bomb = spawn(item_c4); - bomb.Spawned(); - bomb.real_owner = planter; - - /* place directly below */ - traceline(planter.origin, planter.origin + [0,0,-64], FALSE, planter); - setorigin(bomb, trace_endpos); - bomb.SendFlags = -1; - - /* push the player out if we're on top */ - setorigin_safe(planter, planter.origin); - - Radio_BroadcastMessage(RADIO_BOMBPL); - CSBot_BombPlantedNotify(); - g_cs_bombplanted = TRUE; + StartSoundDef("c4.plant", CHAN_WEAPON, true); } #endif #ifdef CLIENT void -item_c4::DrawLED(void) +CSBombEntity::DrawLED(void) { vector cameraPos = g_view.GetCameraOrigin(); float ledAlpha = 1.0 - (time - floor(time)); @@ -266,7 +250,7 @@ item_c4::DrawLED(void) } float -item_c4::predraw(void) +CSBombEntity::predraw(void) { DrawLED(); addentity(this); @@ -276,8 +260,8 @@ item_c4::predraw(void) void w_c4bomb_parse(void) { - item_c4 tm = (item_c4)self; - spawnfunc_item_c4(); + CSBombEntity tm = (CSBombEntity)self; + spawnfunc_CSBombEntity(); g_c4bombled_spr = spriteframe("sprites/ledglow.spr", 0, 0.0f); diff --git a/src/shared/items.h b/src/shared/items.h index 2974ed5..1dc336f 100644 --- a/src/shared/items.h +++ b/src/shared/items.h @@ -30,7 +30,7 @@ #define ITEM_MAC10 0x00001000i #define ITEM_TMP 0x00002000i #define ITEM_SUIT 0x00004000i -#define ITEM_LONGJUMP 0x00008000i +#define ITEM_FAMAS 0x00008000i #define ITEM_AK47 0x00010000i #define ITEM_SG552 0x00020000i @@ -47,5 +47,5 @@ #define ITEM_HEGRENADE 0x08000000i #define ITEM_SMOKEGRENADE 0x10000000i #define ITEM_DEFUSAL 0x20000000i -#define ITEM_NIGHTVISION 0x40000000i +#define ITEM_GALIL 0x40000000i #define ITEM_HELMET 0x80000000i diff --git a/src/shared/player.h b/src/shared/player.h index 7cf1c50..d7a595c 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -101,59 +101,14 @@ string g_pbones[] = enumflags { PLAYER_TOPFRAME = PLAYER_CUSTOMFIELDSTART, - PLAYER_BOTTOMFRAME, - PLAYER_AMMO1, - PLAYER_AMMO2, - PLAYER_AMMO3, - PLAYER_CSTIMERS + PLAYER_BOTTOMFRAME = PLAYER_CUSTOMFIELDSTART, + PLAYER_CSTIMERS = PLAYER_CUSTOMFIELDSTART }; -class player:NSClientPlayer +class CSPlayer:NSClientPlayer { int ingame; - PREDICTED_INT(usp45_mag) - PREDICTED_INT(glock18_mag) - PREDICTED_INT(deagle_mag) - PREDICTED_INT(p228_mag) - PREDICTED_INT(elites_mag) - PREDICTED_INT(fiveseven_mag) - PREDICTED_INT(m3_mag) - PREDICTED_INT(xm1014_mag) - PREDICTED_INT(mp5_mag) - PREDICTED_INT(p90_mag) - PREDICTED_INT(ump45_mag) - PREDICTED_INT(mac10_mag) - PREDICTED_INT(tmp_mag) - PREDICTED_INT(ak47_mag) - PREDICTED_INT(sg552_mag) - PREDICTED_INT(m4a1_mag) - PREDICTED_INT(aug_mag) - PREDICTED_INT(scout_mag) - PREDICTED_INT(awp_mag) - PREDICTED_INT(g3sg1_mag) - PREDICTED_INT(sg550_mag) - PREDICTED_INT(para_mag) - - PREDICTED_INT(ammo_50ae) - PREDICTED_INT(ammo_762mm) - PREDICTED_INT(ammo_556mm) - PREDICTED_INT(ammo_556mmbox) - PREDICTED_INT(ammo_338mag) - PREDICTED_INT(ammo_9mm) - PREDICTED_INT(ammo_buckshot) - PREDICTED_INT(ammo_45acp) - PREDICTED_INT(ammo_357sig) - PREDICTED_INT(ammo_57mm) - PREDICTED_INT(ammo_hegrenade) - PREDICTED_INT(ammo_fbgrenade) - PREDICTED_INT(ammo_smokegrenade) - - PREDICTED_INT(mode_usp45) - PREDICTED_INT(mode_m4a1) - PREDICTED_INT(mode_glock18) - PREDICTED_INT(mode_temp) - PREDICTED_FLOAT(cs_shotmultiplier) PREDICTED_FLOAT(cs_shottime) PREDICTED_FLOAT(cs_prev_hor_rec) @@ -200,6 +155,7 @@ class player:NSClientPlayer bool m_seenEnemy; bool m_seenHostage; bool m_seenBombSite; + bool m_bHasNightvision; #endif }; @@ -207,7 +163,7 @@ float punchangle_recovery(float punchangle) { return 0.05 * (-0.2 * pow(1.2, fabs(punchangle)) + 4); } void -player::Physics_InputPostMove(void) +CSPlayer::Physics_InputPostMove(void) { //start of this function is taken from super::Physics_InputPostMove float punch; @@ -224,15 +180,16 @@ player::Physics_InputPostMove(void) /* player animation code */ UpdatePlayerAnimation(input_timelength); - - RemoveFlags(FL_FROZEN); + RemoveVFlags(VFL_FROZEN); + RemoveVFlags(VFL_NOATTACK); #ifdef SERVER if (g_cs_gamestate == GAME_FREEZE) { #else if (getstati(STAT_GAMESTATE) == GAME_FREEZE) { #endif - flags |= FL_FROZEN; + AddVFlags(VFL_FROZEN); + AddVFlags(VFL_NOATTACK); if (input_buttons & INPUT_BUTTON0) { w_attack_next = (w_attack_next > 0.1) ? w_attack_next : 0.1f; @@ -242,11 +199,11 @@ player::Physics_InputPostMove(void) ProcessInput(); } -void Animation_PlayerUpdate(player); -void Animation_TimerUpdate(player, float); +void Animation_PlayerUpdate(CSPlayer); +void Animation_TimerUpdate(CSPlayer, float); void -player::UpdatePlayerAnimation(float timelength) +CSPlayer::UpdatePlayerAnimation(float timelength) { /* calculate our skeletal progression */ Animation_PlayerUpdate(this); @@ -260,7 +217,7 @@ void Camera_StrafeRoll(__inout vector camera_angle); void Shake_Update(NSClientPlayer); void -player::UpdateAliveCam(void) +CSPlayer::UpdateAliveCam(void) { vector cam_pos = GetEyePos(); Camera_RunPosBob(view_angles, cam_pos); @@ -289,10 +246,10 @@ player::UpdateAliveCam(void) } .string oldmodel; -string Weapons_GetPlayermodel(player, int); +///string Weapons_GetPlayermodel(NSClientPlayer, int); void -player::UpdatePlayerAttachments(bool visible) +CSPlayer::UpdatePlayerAttachments(bool visible) { /* draw the flashlight */ if (gflags & GF_FLASHLIGHT) { @@ -324,7 +281,7 @@ player::UpdatePlayerAttachments(bool visible) return; /* what's the current weapon model supposed to be anyway? */ - p_model.oldmodel = Weapons_GetPlayermodel(this, activeweapon); + p_model.oldmodel = 0;//Weapons_GetPlayermodel(this, activeweapon); /* we changed weapons, update skeletonindex */ if (p_model.model != p_model.oldmodel) { @@ -369,17 +326,16 @@ player::UpdatePlayerAttachments(bool visible) } } -void Weapons_AmmoUpdate(entity); -void HUD_AmmoNotify_Check(player pl); +void HUD_AmmoNotify_Check(CSPlayer pl); /* ================= -player::ReceiveEntity +CSPlayer::ReceiveEntity ================= */ void -player::ReceiveEntity(float flIsNew, float flChanged) +CSPlayer::ReceiveEntity(float flIsNew, float flChanged) { - NSClientPlayer::ReceiveEntity(flIsNew, flChanged); + super::ReceiveEntity(flIsNew, flChanged); /* animation */ READENTITY_BYTE(anim_top, PLAYER_TOPFRAME) @@ -387,110 +343,35 @@ player::ReceiveEntity(float flIsNew, float flChanged) READENTITY_FLOAT(anim_top_delay, PLAYER_TOPFRAME) READENTITY_BYTE(anim_bottom, PLAYER_BOTTOMFRAME) READENTITY_FLOAT(anim_bottom_time, PLAYER_BOTTOMFRAME) - READENTITY_BYTE(usp45_mag, PLAYER_AMMO1) - READENTITY_BYTE(glock18_mag, PLAYER_AMMO1) - READENTITY_BYTE(deagle_mag, PLAYER_AMMO1) - READENTITY_BYTE(p228_mag, PLAYER_AMMO1) - READENTITY_BYTE(elites_mag, PLAYER_AMMO1) - READENTITY_BYTE(fiveseven_mag, PLAYER_AMMO1) - READENTITY_BYTE(m3_mag, PLAYER_AMMO1) - READENTITY_BYTE(xm1014_mag, PLAYER_AMMO1) - READENTITY_BYTE(mp5_mag, PLAYER_AMMO1) - READENTITY_BYTE(p90_mag, PLAYER_AMMO1) - READENTITY_BYTE(ump45_mag, PLAYER_AMMO1) - READENTITY_BYTE(mac10_mag, PLAYER_AMMO1) - READENTITY_BYTE(tmp_mag, PLAYER_AMMO1) - READENTITY_BYTE(ak47_mag, PLAYER_AMMO1) - READENTITY_BYTE(sg552_mag, PLAYER_AMMO1) - READENTITY_BYTE(m4a1_mag, PLAYER_AMMO1) - READENTITY_BYTE(aug_mag, PLAYER_AMMO1) - READENTITY_BYTE(scout_mag, PLAYER_AMMO1) - READENTITY_BYTE(awp_mag, PLAYER_AMMO1) - READENTITY_BYTE(g3sg1_mag, PLAYER_AMMO1) - READENTITY_BYTE(sg550_mag, PLAYER_AMMO1) - READENTITY_BYTE(para_mag, PLAYER_AMMO1) - READENTITY_BYTE(ammo_50ae, PLAYER_AMMO2) - READENTITY_BYTE(ammo_762mm, PLAYER_AMMO2) - READENTITY_BYTE(ammo_556mm, PLAYER_AMMO2) - READENTITY_BYTE(ammo_556mmbox, PLAYER_AMMO2) - READENTITY_BYTE(ammo_338mag, PLAYER_AMMO2) - READENTITY_BYTE(ammo_9mm, PLAYER_AMMO2) - READENTITY_BYTE(ammo_buckshot, PLAYER_AMMO2) - READENTITY_BYTE(ammo_45acp, PLAYER_AMMO2) - READENTITY_BYTE(ammo_357sig, PLAYER_AMMO2) - READENTITY_BYTE(ammo_57mm, PLAYER_AMMO2) - READENTITY_BYTE(ammo_hegrenade, PLAYER_AMMO2) - READENTITY_BYTE(ammo_fbgrenade, PLAYER_AMMO2) - READENTITY_BYTE(ammo_smokegrenade, PLAYER_AMMO2) - READENTITY_BYTE(mode_usp45, PLAYER_AMMO3) - READENTITY_BYTE(mode_m4a1, PLAYER_AMMO3) - READENTITY_BYTE(mode_glock18, PLAYER_AMMO3) - READENTITY_BYTE(mode_temp, PLAYER_AMMO3) + READENTITY_BYTE(cs_shotmultiplier, PLAYER_CSTIMERS) READENTITY_FLOAT(cs_shottime, PLAYER_CSTIMERS) READENTITY_FLOAT(cs_prev_hor_rec, PLAYER_CSTIMERS) READENTITY_BYTE(cs_hor_rec_sign, PLAYER_CSTIMERS) READENTITY_FLOAT(cs_rec_reverse_chance, PLAYER_CSTIMERS) - if (flChanged & PLAYER_AMMO1 || flChanged & PLAYER_AMMO2 || flChanged & PLAYER_AMMO3) { - Weapons_AmmoUpdate(this); + +#if 0 + if (flChanged & PLAYER_AMMOTYPE) { HUD_AmmoNotify_Check(this); } +#endif setorigin(this, origin); } /* ================= -player::PredictPostFrame +CSPlayer::PredictPostFrame Save the last valid server values away in the _net variants of each field so we can roll them back later. ================= */ void -player::PredictPreFrame(void) +CSPlayer::PredictPreFrame(void) { - NSClientPlayer::PredictPreFrame(); + super::PredictPreFrame(); - SAVE_STATE(usp45_mag) - SAVE_STATE(glock18_mag) - SAVE_STATE(deagle_mag) - SAVE_STATE(p228_mag) - SAVE_STATE(elites_mag) - SAVE_STATE(fiveseven_mag) - SAVE_STATE(m3_mag) - SAVE_STATE(xm1014_mag) - SAVE_STATE(mp5_mag) - SAVE_STATE(p90_mag) - SAVE_STATE(ump45_mag) - SAVE_STATE(mac10_mag) - SAVE_STATE(tmp_mag) - SAVE_STATE(ak47_mag) - SAVE_STATE(sg552_mag) - SAVE_STATE(m4a1_mag) - SAVE_STATE(aug_mag) - SAVE_STATE(scout_mag) - SAVE_STATE(awp_mag) - SAVE_STATE(g3sg1_mag) - SAVE_STATE(sg550_mag) - SAVE_STATE(para_mag) - SAVE_STATE(ammo_50ae) - SAVE_STATE(ammo_762mm) - SAVE_STATE(ammo_556mm) - SAVE_STATE(ammo_556mmbox) - SAVE_STATE(ammo_338mag) - SAVE_STATE(ammo_9mm) - SAVE_STATE(ammo_buckshot) - SAVE_STATE(ammo_45acp) - SAVE_STATE(ammo_357sig) - SAVE_STATE(ammo_57mm) - SAVE_STATE(ammo_hegrenade) - SAVE_STATE(ammo_fbgrenade) - SAVE_STATE(ammo_smokegrenade) - SAVE_STATE(mode_usp45) - SAVE_STATE(mode_m4a1) - SAVE_STATE(mode_glock18) - SAVE_STATE(mode_temp) SAVE_STATE(cs_shotmultiplier) SAVE_STATE(cs_shottime) SAVE_STATE(cs_prev_hor_rec) @@ -505,55 +386,16 @@ player::PredictPreFrame(void) /* ================= -player::PredictPostFrame +CSPlayer::PredictPostFrame Where we roll back our values to the ones last sent/verified by the server. ================= */ void -player::PredictPostFrame(void) +CSPlayer::PredictPostFrame(void) { - NSClientPlayer::PredictPostFrame(); + super::PredictPostFrame(); - ROLL_BACK(usp45_mag) - ROLL_BACK(glock18_mag) - ROLL_BACK(deagle_mag) - ROLL_BACK(p228_mag) - ROLL_BACK(elites_mag) - ROLL_BACK(fiveseven_mag) - ROLL_BACK(m3_mag) - ROLL_BACK(xm1014_mag) - ROLL_BACK(mp5_mag) - ROLL_BACK(p90_mag) - ROLL_BACK(ump45_mag) - ROLL_BACK(mac10_mag) - ROLL_BACK(tmp_mag) - ROLL_BACK(ak47_mag) - ROLL_BACK(sg552_mag) - ROLL_BACK(m4a1_mag) - ROLL_BACK(aug_mag) - ROLL_BACK(scout_mag) - ROLL_BACK(awp_mag) - ROLL_BACK(g3sg1_mag) - ROLL_BACK(sg550_mag) - ROLL_BACK(para_mag) - ROLL_BACK(ammo_50ae) - ROLL_BACK(ammo_762mm) - ROLL_BACK(ammo_556mm) - ROLL_BACK(ammo_556mmbox) - ROLL_BACK(ammo_338mag) - ROLL_BACK(ammo_9mm) - ROLL_BACK(ammo_buckshot) - ROLL_BACK(ammo_45acp) - ROLL_BACK(ammo_357sig) - ROLL_BACK(ammo_57mm) - ROLL_BACK(ammo_hegrenade) - ROLL_BACK(ammo_fbgrenade) - ROLL_BACK(ammo_smokegrenade) - ROLL_BACK(mode_usp45) - ROLL_BACK(mode_m4a1) - ROLL_BACK(mode_glock18) - ROLL_BACK(mode_temp) ROLL_BACK(cs_shotmultiplier) ROLL_BACK(cs_shottime) ROLL_BACK(cs_prev_hor_rec) @@ -568,60 +410,22 @@ player::PredictPostFrame(void) #else void -player::ServerInputFrame(void) +CSPlayer::ServerInputFrame(void) { super::ServerInputFrame(); } void -player::EvaluateEntity(void) +CSPlayer::EvaluateEntity(void) { - NSClientPlayer::EvaluateEntity(); + super::EvaluateEntity(); EVALUATE_FIELD(anim_top, PLAYER_TOPFRAME) EVALUATE_FIELD(anim_top_time, PLAYER_TOPFRAME) EVALUATE_FIELD(anim_top_delay, PLAYER_TOPFRAME) EVALUATE_FIELD(anim_bottom, PLAYER_BOTTOMFRAME) EVALUATE_FIELD(anim_bottom_time, PLAYER_BOTTOMFRAME) - EVALUATE_FIELD(usp45_mag, PLAYER_AMMO1) - EVALUATE_FIELD(glock18_mag, PLAYER_AMMO1) - EVALUATE_FIELD(deagle_mag, PLAYER_AMMO1) - EVALUATE_FIELD(p228_mag, PLAYER_AMMO1) - EVALUATE_FIELD(elites_mag, PLAYER_AMMO1) - EVALUATE_FIELD(fiveseven_mag, PLAYER_AMMO1) - EVALUATE_FIELD(m3_mag, PLAYER_AMMO1) - EVALUATE_FIELD(xm1014_mag, PLAYER_AMMO1) - EVALUATE_FIELD(mp5_mag, PLAYER_AMMO1) - EVALUATE_FIELD(p90_mag, PLAYER_AMMO1) - EVALUATE_FIELD(ump45_mag, PLAYER_AMMO1) - EVALUATE_FIELD(mac10_mag, PLAYER_AMMO1) - EVALUATE_FIELD(tmp_mag, PLAYER_AMMO1) - EVALUATE_FIELD(ak47_mag, PLAYER_AMMO1) - EVALUATE_FIELD(sg552_mag, PLAYER_AMMO1) - EVALUATE_FIELD(m4a1_mag, PLAYER_AMMO1) - EVALUATE_FIELD(aug_mag, PLAYER_AMMO1) - EVALUATE_FIELD(scout_mag, PLAYER_AMMO1) - EVALUATE_FIELD(awp_mag, PLAYER_AMMO1) - EVALUATE_FIELD(g3sg1_mag, PLAYER_AMMO1) - EVALUATE_FIELD(sg550_mag, PLAYER_AMMO1) - EVALUATE_FIELD(para_mag, PLAYER_AMMO1) - EVALUATE_FIELD(ammo_50ae, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_762mm, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_556mm, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_556mmbox, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_338mag, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_9mm, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_buckshot, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_45acp, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_357sig, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_57mm, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_hegrenade, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_fbgrenade, PLAYER_AMMO2) - EVALUATE_FIELD(ammo_smokegrenade, PLAYER_AMMO2) - EVALUATE_FIELD(mode_usp45, PLAYER_AMMO3) - EVALUATE_FIELD(mode_m4a1, PLAYER_AMMO3) - EVALUATE_FIELD(mode_glock18, PLAYER_AMMO3) - EVALUATE_FIELD(mode_temp, PLAYER_AMMO3) + EVALUATE_FIELD(cs_shotmultiplier, PLAYER_CSTIMERS) EVALUATE_FIELD(cs_shottime, PLAYER_CSTIMERS) EVALUATE_FIELD(cs_prev_hor_rec, PLAYER_CSTIMERS) @@ -631,11 +435,11 @@ player::EvaluateEntity(void) /* ================= -player::SendEntity +CSPlayer::SendEntity ================= */ float -player::SendEntity(entity ePEnt, float flChanged) +CSPlayer::SendEntity(entity ePEnt, float flChanged) { /* don't broadcast invisible players */ if (IsFakeSpectator() && ePEnt != this) @@ -645,55 +449,14 @@ player::SendEntity(entity ePEnt, float flChanged) flChanged = OptimiseChangedFlags(ePEnt, flChanged); - WriteByte(MSG_ENTITY, ENT_PLAYER); - WriteFloat(MSG_ENTITY, flChanged); - - NSClientPlayer::SendEntity(ePEnt, flChanged); + super::SendEntity(ePEnt, flChanged); SENDENTITY_BYTE(anim_top, PLAYER_TOPFRAME) SENDENTITY_FLOAT(anim_top_time, PLAYER_TOPFRAME) SENDENTITY_FLOAT(anim_top_delay, PLAYER_TOPFRAME) SENDENTITY_BYTE(anim_bottom, PLAYER_BOTTOMFRAME) SENDENTITY_FLOAT(anim_bottom_time, PLAYER_BOTTOMFRAME) - SENDENTITY_BYTE(usp45_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(glock18_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(deagle_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(p228_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(elites_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(fiveseven_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(m3_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(xm1014_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(mp5_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(p90_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(ump45_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(mac10_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(tmp_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(ak47_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(sg552_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(m4a1_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(aug_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(scout_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(awp_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(g3sg1_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(sg550_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(para_mag, PLAYER_AMMO1) - SENDENTITY_BYTE(ammo_50ae, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_762mm, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_556mm, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_556mmbox, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_338mag, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_9mm, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_buckshot, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_45acp, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_357sig, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_57mm, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_hegrenade, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_fbgrenade, PLAYER_AMMO2) - SENDENTITY_BYTE(ammo_smokegrenade, PLAYER_AMMO2) - SENDENTITY_BYTE(mode_usp45, PLAYER_AMMO3) - SENDENTITY_BYTE(mode_m4a1, PLAYER_AMMO3) - SENDENTITY_BYTE(mode_glock18, PLAYER_AMMO3) - SENDENTITY_BYTE(mode_temp, PLAYER_AMMO3) + SENDENTITY_BYTE(cs_shotmultiplier, PLAYER_CSTIMERS) SENDENTITY_FLOAT(cs_shottime, PLAYER_CSTIMERS) SENDENTITY_FLOAT(cs_prev_hor_rec, PLAYER_CSTIMERS) diff --git a/src/shared/pmove.h b/src/shared/pmove.h deleted file mode 100644 index bac8a3c..0000000 --- a/src/shared/pmove.h +++ /dev/null @@ -1,19 +0,0 @@ -#define PMOVE_STEPHEIGHT 18 -#define PMOVE_AIRSTEPHEIGHT 0 -#define PMOVE_FRICTION 4 -#define PMOVE_EDGEFRICTION 1 -#define PMOVE_STOPSPEED 75 -#define PMOVE_GRAVITY 800 -#define PMOVE_AIRACCELERATE 10 -#define PMOVE_WATERACCELERATE 8 -#define PMOVE_ACCELERATE 4 -#define PMOVE_MAXSPEED 250 - -/* Counter-Strike players are hunched over a little bit */ -#define PHY_VIEWPOS [0,0,18] -#define PHY_VIEWPOS_CROUCHED [0,0,12] - -#define PHY_HULL_MIN [-16,-16,-36] -#define PHY_HULL_MAX [16,16,36] -#define PHY_HULL_CROUCHED_MIN [-16,-16,-18] -#define PHY_HULL_CROUCHED_MAX [16,16,18] diff --git a/src/shared/pmove.qc b/src/shared/pmove.qc index 83b824e..420cfaa 100644 --- a/src/shared/pmove.qc +++ b/src/shared/pmove.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021 Marco Cawthorne + * 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 @@ -14,14 +14,36 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#define PMOVE_STEPHEIGHT 18 +#define PMOVE_AIRSTEPHEIGHT 0 +#define PMOVE_FRICTION 4 +#define PMOVE_EDGEFRICTION 1 +#define PMOVE_STOPSPEED 75 +#define PMOVE_GRAVITY 800 +#define PMOVE_AIRACCELERATE 10 +#define PMOVE_WATERACCELERATE 8 +#define PMOVE_ACCELERATE 4 +#define PMOVE_MAXSPEED 250 +#define PMOVE_STEP_WALKSPEED 270 +#define PMOVE_STEP_CROUCHSPEED 90 +#define PMOVE_BOXCENTER true +#define PMOVE_NORMAL_HEIGHT 72 +#define PMOVE_NORMAL_VIEWHEIGHT 54 +#define PMOVE_CROUCH_HEIGHT 36 +#define PMOVE_CROUCH_VIEWHEIGHT 30 + +/* disable prone, run and lean */ +#define PMOVE_STEP_RUNSPEED 0 +#define PMOVE_PRONE_HEIGHT 0 + .float waterlevel; .float watertype; /* values courtesy of https://wiki.alliedmods.net/Cs_weapons_information */ float -player::Physics_MaxSpeed(void) +CSPlayer::Physics_MaxSpeed(void) { - float spd = serverkeyfloat("phy_maxspeed"); + float spd = super::Physics_MaxSpeed(); switch (activeweapon) { @@ -109,21 +131,17 @@ player::Physics_MaxSpeed(void) default: } - if (flags & FL_CROUCHING) { - spd *= 0.5f; - } - return spd; } void -player::Physics_Fall(float impactspeed) +CSPlayer::Physics_Fall(float impactspeed) { impactspeed *= 1.25f; if (impactspeed > 580) { #ifdef SERVER float fFallDamage = (impactspeed - 580) * (100 / (1024 - 580)) * 0.75f; - Damage_Apply(this, world, fFallDamage, 0, DMG_FALL | DMG_SKIP_ARMOR); + //Damage_Apply(this, world, fFallDamage, 0, DMG_FALL | DMG_SKIP_ARMOR); if (random() < 0.5) sound(this, CHAN_AUTO, "player/pl_pain2.wav", 1.0, ATTN_NORM); @@ -134,7 +152,7 @@ player::Physics_Fall(float impactspeed) } void -player::Physics_Jump(void) +CSPlayer::Physics_Jump(void) { if (waterlevel >= 2) { if (watertype == CONTENT_WATER) { diff --git a/src/shared/w_ak47.qc b/src/shared/w_ak47.qc deleted file mode 100644 index 9f1eca1..0000000 --- a/src/shared/w_ak47.qc +++ /dev/null @@ -1,342 +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_ak47 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -AK-47 Weapon - -- Buy Menu - -Price: $2500 -Terrorists only weapon - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_ak47.mdl" -*/ - -#ifdef CLIENT -void -w_rifle_ejectshell(void) -{ - static void w_rifle_ejectshell_death(void) { - remove(self); - } - static void w_rifle_ejectshell_touch(void) { - if (other == world) - Sound_Play(self, CHAN_BODY, "modelevent_shell.land"); - } - entity eShell = spawn(); - setmodel(eShell, "models/rshell.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 * 80); - eShell.touch = w_rifle_ejectshell_touch; - - eShell.avelocity = [0,45,900]; - eShell.think = w_rifle_ejectshell_death; - eShell.nextthink = time + 2.5f; - setsize(eShell, [0,0,0], [0,0,0]); - setorigin(eShell, gettaginfo(pSeat->m_eViewModel, pSeat->m_iVMBones + 1)); -} -#endif - -enum -{ - AK47_IDLE, - AK47_RELOAD, - AK47_DRAW, - AK47_SHOOT1, - AK47_SHOOT2, - AK47_SHOOT3 -}; - -void -w_ak47_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_ak47.fire"); - precache_model("models/w_ak47.mdl"); -#else - Sound_Precache("modelevent_shell.land"); - precache_model("models/v_ak47.mdl"); - precache_model("models/p_ak47.mdl"); -#endif -} - -void -w_ak47_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.ak47_mag, pl.ammo_762mm, -1); -} - -string -w_ak47_wmodel(void) -{ - return "models/w_ak47.mdl"; -} - -string -w_ak47_pmodel(player pl) -{ - return "models/p_ak47.mdl"; -} - -string -w_ak47_deathmsg(void) -{ - return ""; -} - -int -w_ak47_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.ak47_mag = 30; - else - pl.ak47_mag = startammo; - } else { - if (pl.ammo_762mm < AMMO_MAX_762MM) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, AMMO_MAX_762MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_ak47_draw(player pl) -{ - Weapons_SetModel("models/v_ak47.mdl"); - Weapons_ViewAnimation(pl, AK47_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 4; - pl.cs_cross_deltadist = 4; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_ak47_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0) { - return; - } - if (!pl.ak47_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl, 30,3)/1.5; - pl.ak47_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, AK47_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, AK47_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, AK47_SHOOT3); - break; - } - - if (self.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_AK47, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_AK47, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_rifle_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_ak47_dmg", 36); - TraceAttack_SetRangeModifier(2.375); /* 18 units!!! */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,1.2); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_AK47, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,1.2); - Sound_Play(pl, CHAN_WEAPON, "weapon_ak47.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 1.1f, 0.92f,accuracy*0.5); - pl.w_attack_next = 0.0975f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_ak47_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) { - return; - } - if (pl.ak47_mag >= 30) { - return; - } - if (!pl.ammo_762mm) { - return; - } - - Weapons_ViewAnimation(pl, AK47_RELOAD); - - pl.w_attack_next = 2.4f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::ak47_mag, player::ammo_762mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_ak47_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.ak47_mag == 0 && pl.ammo_762mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_ak47_aimanim(player pl) -{ - return pl.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_AK47 : ANIM_AIM_AK47; -} - -void -w_ak47_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_ak47_isempty(player pl) -{ - - if (pl.ak47_mag <= 0 && pl.ammo_762mm <= 0) - return 1; - - return 0; -} - -void -w_ak47_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_ak47_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_762mm, AMMO_MAX_762MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud11_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud11_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_ak47 = -{ - .name = "ak47", - .id = ITEM_AK47, - .slot = 0, - .slot_pos = 7, - .weight = 25, - .allow_drop = TRUE, - .draw = w_ak47_draw, - .holster = __NULL__, - .primary = w_ak47_primary, - .secondary = __NULL__, - .reload = w_ak47_reload, - .release = w_ak47_release, - .postdraw = w_ak47_hud, - .precache = w_ak47_precache, - .pickup = w_ak47_pickup, - .updateammo = w_ak47_updateammo, - .wmodel = w_ak47_wmodel, - .pmodel = w_ak47_pmodel, - .deathmsg = w_ak47_deathmsg, - .aimanim = w_ak47_aimanim, - .hudpic = w_ak47_hudpic, - .type = csweapon_ranged_type, - .isempty = w_ak47_isempty -}; - -#ifdef SERVER -void -weapon_ak47(void) -{ - Weapons_InitItem(WEAPON_AK47); -} -#endif diff --git a/src/shared/w_aug.qc b/src/shared/w_aug.qc deleted file mode 100644 index 705e5cb..0000000 --- a/src/shared/w_aug.qc +++ /dev/null @@ -1,329 +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. - */ - -/*!QUAKED weapon_aug (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Steyr AUG Weapon - -- Buy Menu - -Price: $3500 -Counter-Terrorists only weapon - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_aug.mdl" -*/ - -enum -{ - AUG_IDLE, - AUG_RELOAD, - AUG_DRAW, - AUG_SHOOT1, - AUG_SHOOT2, - AUG_SHOOT3 -}; - -void -w_aug_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_aug.fire"); - precache_model("models/w_aug.mdl"); -#else - precache_model("models/v_aug.mdl"); - precache_model("models/p_aug.mdl"); -#endif -} - -void -w_aug_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.aug_mag, pl.ammo_762mm, -1); -} - -string -w_aug_wmodel(void) -{ - return "models/w_aug.mdl"; -} - -string -w_aug_pmodel(player pl) -{ - return "models/p_aug.mdl"; -} - -string -w_aug_deathmsg(void) -{ - return ""; -} - -int -w_aug_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.aug_mag = 30; - else - pl.aug_mag = startammo; - } else { - if (pl.ammo_762mm < AMMO_MAX_762MM) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, AMMO_MAX_762MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_aug_draw(player pl) -{ - Weapons_SetModel("models/v_aug.mdl"); - Weapons_ViewAnimation(pl, AUG_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 3; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_aug_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) { - return; - } - if (!pl.aug_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl, 35,2); - pl.aug_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, AUG_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, AUG_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, AUG_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_RIFLE, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_RIFLE, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_rifle_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_aug_dmg", 32); - TraceAttack_SetRangeModifier(2.125); - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,1.03); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_AUG, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,1.03); - Sound_Play(pl, CHAN_WEAPON, "weapon_aug.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 0.7f, 1.1f,accuracy); - if (pl.viewzoom == 1.0f) { - pl.w_attack_next = 0.0825f; - } else { - pl.w_attack_next = 0.15f; - } - pl.w_idle_next = pl.w_attack_next; -} - -void -w_aug_secondary(player pl) -{ - if (pl.w_attack_next) { - return; - } - /* Simple toggle of fovs */ - if (pl.viewzoom == 1.0f) { - pl.viewzoom = 0.2f; - } else { - pl.viewzoom = 1.0f; - } - pl.w_attack_next = 0.5f; -} - -void -w_aug_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) { - return; - } - if (pl.aug_mag >= 30) { - return; - } - if (!pl.ammo_762mm) { - return; - } - Weapons_ViewAnimation(pl, AUG_RELOAD); - pl.w_attack_next = 3.3f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::aug_mag, player::ammo_762mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_aug_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.aug_mag == 0 && pl.ammo_762mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_aug_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_aug_hud(player pl) -{ -#ifdef CLIENT - if (pl.viewzoom == 1.0f) { - Cstrike_DrawCrosshair(); - } else { - Cstrike_DrawSimpleCrosshair(); - } - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_aug_isempty(player pl) -{ - - if (pl.aug_mag <= 0 && pl.ammo_762mm <= 0) - return 1; - - return 0; -} - -void -w_aug_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_aug_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_762mm, AMMO_MAX_762MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud15_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud14_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_aug = -{ - .name = "aug", - .id = ITEM_AUG, - .slot = 0, - .slot_pos = 10, - .weight = 25, - .allow_drop = TRUE, - .draw = w_aug_draw, - .holster = __NULL__, - .primary = w_aug_primary, - .secondary = w_aug_secondary, - .reload = w_aug_reload, - .release = w_aug_release, - .postdraw = w_aug_hud, - .precache = w_aug_precache, - .pickup = w_aug_pickup, - .updateammo = w_aug_updateammo, - .wmodel = w_aug_wmodel, - .pmodel = w_aug_pmodel, - .deathmsg = w_aug_deathmsg, - .aimanim = w_aug_aimanim, - .hudpic = w_aug_hudpic, - .type = csweapon_ranged_type, - .isempty = w_aug_isempty -}; - -#ifdef SERVER -void -weapon_aug(void) -{ - Weapons_InitItem(WEAPON_AUG); -} -#endif diff --git a/src/shared/w_awp.qc b/src/shared/w_awp.qc deleted file mode 100644 index 3aa6ab4..0000000 --- a/src/shared/w_awp.qc +++ /dev/null @@ -1,383 +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_awp (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -AWP (AI Arctic Warfare/Magnum) Weapon - -- Buy Menu - -Price: $4750 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_awp.mdl" -*/ - -#ifdef CLIENT -void -w_sniper_ejectshell(void) -{ - static void w_sniper_ejectshelldeath(void) { - remove(self); - } - static void w_sniper_ejectshell_touch(void) { - if (other == world) - Sound_Play(self, CHAN_BODY, "modelevent_shell.land"); - } - entity eShell = spawn(); - setmodel(eShell, "models/rshell_big.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_sniper_ejectshell_touch; - - eShell.avelocity = [0,45,900]; - eShell.think = w_sniper_ejectshelldeath; - eShell.nextthink = time + 2.5f; - setsize(eShell, [0,0,0], [0,0,0]); - setorigin(eShell, gettaginfo(pSeat->m_eViewModel, pSeat->m_iVMBones + 1)); -} -#endif - -enum -{ - AWP_IDLE, - AWP_SHOOT1, - AWP_SHOOT2, - AWP_SHOOT3, - AWP_RELOAD, - AWP_DRAW -}; - -void -w_awp_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_awp.fire"); - Sound_Precache("weapon_awp.zoom"); - precache_model("models/w_awp.mdl"); -#else - precache_model("models/v_awp.mdl"); - precache_model("models/p_awp.mdl"); -#endif -} - -void -w_awp_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_338mag, pl.mode_temp); -} - -string -w_awp_wmodel(void) -{ - return "models/w_awp.mdl"; -} - -string -w_awp_pmodel(player pl) -{ - return "models/p_awp.mdl"; -} - -string -w_awp_deathmsg(void) -{ - return ""; -} - -int -w_awp_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.awp_mag = 10; - else - pl.awp_mag = startammo; - } else { - if (pl.ammo_338mag < 20) { - pl.ammo_338mag = bound(0, pl.ammo_338mag + 10, 20); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_awp_draw(player pl) -{ - Weapons_SetModel("models/v_awp.mdl"); - Weapons_ViewAnimation(pl, AWP_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - pl.cs_cross_mindist = 8; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_awp_release(player pl) -{ - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.awp_mag == 0 && pl.ammo_338mag > 0) { - Weapons_Reload(pl); - return; - } - - if (pl.w_idle_next > 0.0f) { - pl.viewzoom = 1.0f; - Weapons_EnableModel(); - return; - } - - if (pl.mode_temp == 1) { - pl.viewzoom = 0.45f; - Weapons_DisableModel(); - } else if (pl.mode_temp == 2) { - pl.viewzoom = 0.1f; - Weapons_DisableModel(); - } else { - pl.viewzoom = 1.0f; - Weapons_EnableModel(); - } -} - -void -w_awp_secondary(player pl) -{ - if (pl.w_attack_next) { - return; - } - -#ifdef SSQC - Sound_Play(pl, CHAN_WEAPON, "weapon_awp.zoom"); -#endif - - /* Simple toggle of fovs */ - if (pl.mode_temp == 1) { - pl.mode_temp = 2; - } else if (pl.mode_temp == 2) { - pl.mode_temp = 0; - } else { - pl.mode_temp = 1; - } - - pl.w_attack_next = 0.3f; - pl.w_idle_next = 0.0f; - w_awp_release(pl); -} - -void -w_awp_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) { - w_awp_release(pl); - return; - } - if (!pl.awp_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl, -1); - - pl.awp_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, AWP_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, AWP_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, AWP_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_RIFLE, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_RIFLE, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_sniper_ejectshell, 0.9f); -#else - dmg = Skill_GetValue("plr_awp_dmg", 115); - TraceAttack_SetRangeModifier(1.375); - TraceAttack_SetPenetrationPower(2); /* however, we can only penetrate one wall if the first one is 5 units thick or higher */ - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_AWP, "Impact.BigShot"); - - Sound_Play(pl, CHAN_WEAPON, "weapon_awp.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 1, 1,accuracy); - pl.w_attack_next = 1.2f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_awp_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.awp_mag >= 10) - return; - if (!pl.ammo_338mag) - return; - - Weapons_ViewAnimation(pl, AWP_RELOAD); - - pl.w_attack_next = 2.9f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::awp_mag, player::ammo_338mag, 10); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -float -w_awp_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_awp_hud(player pl) -{ -#ifdef CLIENT - if (pl.viewzoom < 1.0f) { - Cstrike_DrawScope(); - } - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [24/256,96/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_awp_isempty(player pl) -{ - - if (pl.awp_mag <= 0 && pl.ammo_338mag <= 0) - return 1; - - return 0; -} - -void -w_awp_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_awp_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_338mag, AMMO_MAX_338MAG, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud5_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud2_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_awp = -{ - .name = "awp", - .id = ITEM_AWP, - .slot = 0, - .slot_pos = 12, - .weight = 30, - .allow_drop = TRUE, - .draw = w_awp_draw, - .holster = __NULL__, - .primary = w_awp_primary, - .secondary = w_awp_secondary, - .reload = w_awp_reload, - .release = w_awp_release, - .postdraw = w_awp_hud, - .precache = w_awp_precache, - .pickup = w_awp_pickup, - .updateammo = w_awp_updateammo, - .wmodel = w_awp_wmodel, - .pmodel = w_awp_pmodel, - .deathmsg = w_awp_deathmsg, - .aimanim = w_awp_aimanim, - .hudpic = w_awp_hudpic, - .type = csweapon_ranged_type, - .isempty = w_awp_isempty -}; - -#ifdef SERVER -void -weapon_awp(void) -{ - Weapons_InitItem(WEAPON_AWP); -} -#endif diff --git a/src/shared/w_c4bomb.qc b/src/shared/w_c4bomb.qc deleted file mode 100644 index 2768558..0000000 --- a/src/shared/w_c4bomb.qc +++ /dev/null @@ -1,262 +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_c4bomb (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -C4 Bomb Weapon, Bomb Defusal Gamemode Entity - -Default arsenal for Terrorists - -Can only be picked up by Terrorists and planted in -func_bombtarget brush entities. - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_c4.mdl" -*/ - -/* C4 weapon logic */ - -enum -{ - C4_IDLE, - C4_DRAW, - C4_DROP, - C4_ENTERCODE -}; - -enum -{ - C4S_NONE, - C4S_ENTERINGCODE, - C4S_DROPPING, - C4S_DONE -}; - -void -w_c4bomb_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_c4bomb.disarm"); - Sound_Precache("weapon_c4bomb.disarmed"); - Sound_Precache("weapon_c4bomb.explode"); - Sound_Precache("weapon_c4bomb.plant"); - Sound_Precache("weapon_c4bomb.beep1"); - Sound_Precache("weapon_c4bomb.beep2"); - Sound_Precache("weapon_c4bomb.beep3"); - Sound_Precache("weapon_c4bomb.beep4"); - Sound_Precache("weapon_c4bomb.beep5"); - precache_sound("weapons/c4_beep1.wav"); - precache_sound("weapons/c4_beep2.wav"); - precache_sound("weapons/c4_beep3.wav"); - precache_sound("weapons/c4_beep4.wav"); - precache_sound("weapons/c4_beep5.wav"); - precache_sound("weapons/c4_disarmed.wav"); - precache_sound("weapons/c4_disarm.wav"); - precache_model("models/w_c4.mdl"); - precache_model("models/w_backpack.mdl"); - precache_model("sprites/ledglow.spr"); -#else - precache_model("models/v_c4.mdl"); - precache_model("models/p_c4.mdl"); -#endif -} - -void -w_c4bomb_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, -1, 1, -1); -} - -string -w_c4bomb_wmodel(void) -{ - return "models/w_backpack.mdl"; -} - -string -w_c4bomb_pmodel(player pl) -{ - return "models/p_c4.mdl"; -} - -string -w_c4bomb_deathmsg(void) -{ - return ""; -} - -void -w_c4bomb_draw(player pl) -{ - Weapons_SetModel("models/v_c4.mdl"); - Weapons_ViewAnimation(pl, C4_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_c4bomb_release(player pl) -{ - - w_cstrike_weaponrelease(); - - if (pl.mode_temp == C4S_DROPPING) { - if (pl.w_idle_next <= 0.0f) { - pl.mode_temp = C4S_DONE; -#ifdef SERVER - C4Bomb_Plant(pl); - Weapons_RemoveItem(pl, WEAPON_C4BOMB); -#endif - } - return; - } - - /* reset animation */ - if (pl.mode_temp != C4S_NONE) { - Weapons_ViewAnimation(pl, C4_IDLE); - } - pl.mode_temp = C4S_NONE; - pl.w_idle_next = 0.0f; -} - -void -w_c4bomb_primary(player pl) -{ - - if (!(pl.gflags & GF_BOMBZONE)) { - return; - } - - pl.flags |= FL_FROZEN; - input_movevalues = [0,0,0]; - - switch (pl.mode_temp) { - case C4S_NONE: - pl.mode_temp = C4S_ENTERINGCODE; - Weapons_ViewAnimation(pl, C4_ENTERCODE); - pl.w_idle_next = 3.0f; - break; - case C4S_ENTERINGCODE: - if (pl.w_idle_next <= 0.0f) { - pl.mode_temp = C4S_DROPPING; - Weapons_ViewAnimation(pl, C4_DROP); - pl.w_idle_next = 1.0f; - } - break; - case C4S_DROPPING: - w_c4bomb_release(pl); - return; - break; - default: - break; - } - - pl.w_attack_next = 0.0f; -} - -float -w_c4bomb_aimanim(player pl) -{ - return self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_C4 : ANIM_AIM_C4; -} - -void -w_c4bomb_hud(player pl) -{ -#ifdef CLIENT - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [96/256,96/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_c4bomb_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (pl.team != TEAM_T) - return (0); -#endif - return (1); -} - -void -w_c4bomb_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_c4bomb = -{ - .name = "c4", - .id = ITEM_C4BOMB, - .slot = 4, - .slot_pos = 0, - .allow_drop = TRUE, - .draw = w_c4bomb_draw, - .holster = __NULL__, - .primary = w_c4bomb_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_c4bomb_release, - .postdraw = w_c4bomb_hud, - .precache = w_c4bomb_precache, - .pickup = w_c4bomb_pickup, - .updateammo = w_c4bomb_updateammo, - .wmodel = w_c4bomb_wmodel, - .pmodel = w_c4bomb_pmodel, - .deathmsg = w_c4bomb_deathmsg, - .aimanim = w_c4bomb_aimanim, - .hudpic = w_c4bomb_hudpic -}; - -#ifdef SERVER -void -weapon_c4bomb(void) -{ - Weapons_InitItem(WEAPON_C4BOMB); -} -#endif diff --git a/src/shared/w_deagle.qc b/src/shared/w_deagle.qc deleted file mode 100644 index 1a60237..0000000 --- a/src/shared/w_deagle.qc +++ /dev/null @@ -1,339 +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_deagle (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Desert Eagle .50 AE Weapon - -- Buy Menu - -Price: $650 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_deagle.mdl" -*/ - -#ifdef CLIENT -void -w_pistol_ejectshell(void) -{ - static void w_pistol_ejectshell_death(void) { - remove(self); - } - static void w_pistol_ejectshell_touch(void) { - if (other == world) - Sound_Play(self, CHAN_BODY, "modelevent_shell.land"); - } - entity eShell = spawn(); - setmodel(eShell, "models/pshell.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_pistol_ejectshell_touch; - - eShell.avelocity = [0,45,900]; - eShell.think = w_pistol_ejectshell_death; - eShell.nextthink = time + 2.5f; - setsize(eShell, [0,0,0], [0,0,0]); - setorigin(eShell, gettaginfo(pSeat->m_eViewModel, pSeat->m_iVMBones + 1)); -} -#endif - -enum -{ - DEAGLE_IDLE, - DEAGLE_SHOOT1, - DEAGLE_SHOOT2, - DEAGLE_SHOOT_EMPTY, - DEAGLE_RELOAD, - DEAGLE_DRAW -}; - -void -w_deagle_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_deagle.fire"); - precache_model("models/w_deagle.mdl"); -#else - precache_model("models/v_deagle.mdl"); - precache_model("models/p_deagle.mdl"); -#endif -} - -void -w_deagle_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.deagle_mag, pl.ammo_50ae, -1); -} - -string -w_deagle_wmodel(void) -{ - return "models/w_deagle.mdl"; -} - -string -w_deagle_pmodel(player pl) -{ - return "models/p_deagle.mdl"; -} - -string -w_deagle_deathmsg(void) -{ - return ""; -} - -int -w_deagle_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.deagle_mag = 7; - else - pl.deagle_mag = startammo; - } else { - if (pl.ammo_50ae < AMMO_MAX_50AE) { - pl.ammo_50ae = bound(0, pl.ammo_50ae + 7, AMMO_MAX_50AE); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_deagle_draw(player pl) -{ - Weapons_SetModel("models/v_deagle.mdl"); - Weapons_ViewAnimation(pl, DEAGLE_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 8; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_deagle_primary(player pl) -{ - if (pl.w_attack_next > 0.0) - return; - if (pl.gflags & GF_SEMI_TOGGLED) - return; - if (!pl.deagle_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 55,1.5)+0.005; - pl.deagle_mag--; - - if (pl.deagle_mag <= 0) { - Weapons_ViewAnimation(pl, DEAGLE_SHOOT_EMPTY); - } else { - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, DEAGLE_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, DEAGLE_SHOOT2); - break; - } - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_ONEHAND, 0.45f); - else - Animation_PlayerTop(pl, ANIM_SHOOT_ONEHAND, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - int dmg = Skill_GetValue("plr_deagle_dmg", 54); - TraceAttack_SetRangeModifier(1.875); /* 14 but not 15 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,0.5); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_DEAGLE, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,0.5); - Sound_Play(pl, CHAN_WEAPON, "weapon_deagle.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 10, .35,accuracy*0.5); - pl.gflags |= GF_SEMI_TOGGLED; - pl.w_attack_next = 0.2f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_deagle_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) { - return; - } - if (pl.deagle_mag >= 7) { - return; - } - if (!pl.ammo_50ae) { - return; - } - Weapons_ViewAnimation(pl, DEAGLE_RELOAD); - - pl.w_attack_next = 2.1f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::deagle_mag, player::ammo_50ae, 7); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_deagle_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.deagle_mag == 0 && pl.ammo_50ae > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_deagle_aimanim(player pl) -{ - return pl.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_ONEHAND : ANIM_AIM_ONEHAND; -} - -void -w_deagle_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [24/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_deagle_isempty(player pl) -{ - - if (pl.deagle_mag <= 0 && pl.ammo_50ae <= 0) - return 1; - - return 0; -} - -void -w_deagle_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_deagle_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_50ae, AMMO_MAX_50AE, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud11_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud10_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_deagle = -{ - .name = "deagle", - .id = ITEM_DEAGLE, - .slot = 1, - .slot_pos = 2, - .weight = 7, - .allow_drop = TRUE, - .draw = w_deagle_draw, - .holster = __NULL__, - .primary = w_deagle_primary, - .secondary = __NULL__, - .reload = w_deagle_reload, - .release = w_deagle_release, - .postdraw = w_deagle_hud, - .precache = w_deagle_precache, - .pickup = w_deagle_pickup, - .updateammo = w_deagle_updateammo, - .wmodel = w_deagle_wmodel, - .pmodel = w_deagle_pmodel, - .deathmsg = w_deagle_deathmsg, - .aimanim = w_deagle_aimanim, - .hudpic = w_deagle_hudpic, - .type = csweapon_ranged_type, - .isempty = w_deagle_isempty -}; - -#ifdef SERVER -void -weapon_deagle(void) -{ - Weapons_InitItem(WEAPON_DEAGLE); -} -#endif diff --git a/src/shared/w_elites.qc b/src/shared/w_elites.qc deleted file mode 100644 index 2248374..0000000 --- a/src/shared/w_elites.qc +++ /dev/null @@ -1,410 +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_elites (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Dual Beretta 96G (Elites) Weapon - -- Buy Menu - -Price: $1000 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_elite.mdl" -*/ - -#ifdef CLIENT -void -w_elites_ejectshell(int side) -{ - static void w_elites_ejectshell_death(void) { - remove(self); - } - static void w_elites_ejectshell_touch(void) { - if (other == world) - Sound_Play(self, CHAN_BODY, "modelevent_shell.land"); - } - entity eShell = spawn(); - setmodel(eShell, "models/pshell.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_elites_ejectshell_touch; - - eShell.avelocity = [0,45,900]; - eShell.think = w_elites_ejectshell_death; - eShell.nextthink = time + 2.5f; - setsize(eShell, [0,0,0], [0,0,0]); - setorigin(eShell, gettaginfo(pSeat->m_eViewModel, pSeat->m_iVMBones + 1 + side)); -} - -void -w_pistol_ejectshell_left(void) -{ - w_elites_ejectshell(1); -} - -void -w_pistol_ejectshell_right(void) -{ - w_elites_ejectshell(0); -} -#endif - -enum -{ - ELITES_IDLE, - ELITES_IDLE_LEFTEMPTY, - ELITES_SHOOT_LEFT1, - ELITES_SHOOT_LEFT2, - ELITES_SHOOT_LEFT3, - ELITES_SHOOT_LEFT4, - ELITES_SHOOT_LEFT5, - ELITES_SHOOT_LEFTLAST, - ELITES_SHOOT_RIGHT1, - ELITES_SHOOT_RIGHT2, - ELITES_SHOOT_RIGHT3, - ELITES_SHOOT_RIGHT4, - ELITES_SHOOT_RIGHT5, - ELITES_SHOOT_RIGHTLAST, - ELITES_RELOAD, - ELITES_DRAW -}; - -void -w_elites_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_elites.fire"); - precache_model("models/w_elite.mdl"); -#else - precache_model("models/v_elite.mdl"); - precache_model("models/p_elite.mdl"); -#endif -} - -void -w_elites_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.elites_mag, pl.ammo_9mm, -1); -} - -string -w_elites_wmodel(void) -{ - return "models/w_elite.mdl"; -} - -string -w_elites_pmodel(player pl) -{ - return "models/p_elite.mdl"; -} - -string -w_elites_deathmsg(void) -{ - return ""; -} - -int -w_elites_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.elites_mag = 30; - else - pl.elites_mag = startammo; - } else { - if (pl.ammo_9mm < AMMO_MAX_9MM) { - pl.ammo_9mm = bound(0, pl.ammo_9mm + 30, AMMO_MAX_9MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_elites_draw(player pl) -{ - Weapons_SetModel("models/v_elite.mdl"); - Weapons_ViewAnimation(pl, ELITES_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - pl.cs_cross_mindist = 4; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_elites_primary(player pl) -{ - - if (pl.w_attack_next > 0.0) { - return; - } - if (pl.gflags & GF_SEMI_TOGGLED) { - return; - } - if (!pl.elites_mag) { - return; - } - - pl.mode_temp = 1 - pl.mode_temp; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 150,1)+0.002; - int dmg = 0; - pl.elites_mag--; - - int r = (float)input_sequence % 5; - if (pl.mode_temp) { - if (pl.elites_mag <= 0) { - Weapons_ViewAnimation(pl, ELITES_SHOOT_LEFTLAST); - } else { - switch (r) { - case 0: - Weapons_ViewAnimation(pl, ELITES_SHOOT_LEFT1); - break; - case 1: - Weapons_ViewAnimation(pl, ELITES_SHOOT_LEFT2); - break; - case 2: - Weapons_ViewAnimation(pl, ELITES_SHOOT_LEFT3); - break; - case 3: - Weapons_ViewAnimation(pl, ELITES_SHOOT_LEFT4); - break; - default: - Weapons_ViewAnimation(pl, ELITES_SHOOT_LEFT1); - break; - } - } - } else { - if (pl.elites_mag <= 0) { - Weapons_ViewAnimation(pl, ELITES_SHOOT_RIGHTLAST); - } else { - switch (r) { - case 0: - Weapons_ViewAnimation(pl, ELITES_SHOOT_RIGHT1); - break; - case 1: - Weapons_ViewAnimation(pl, ELITES_SHOOT_RIGHT2); - break; - case 2: - Weapons_ViewAnimation(pl, ELITES_SHOOT_RIGHT3); - break; - case 3: - Weapons_ViewAnimation(pl, ELITES_SHOOT_RIGHT4); - break; - default: - Weapons_ViewAnimation(pl, ELITES_SHOOT_RIGHT1); - break; - } - } - } - - if (pl.flags & FL_CROUCHING) { - if (pl.mode_temp) - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT2_DUALPISTOLS, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_DUALPISTOLS, 0.45f); - } else { - if (pl.mode_temp) - Animation_PlayerTop(pl, ANIM_SHOOT2_DUALPISTOLS, 0.45f); - else - Animation_PlayerTop(pl, ANIM_SHOOT_DUALPISTOLS, 0.45f); - } - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - - if (pl.mode_temp) - View_AddEvent(w_pistol_ejectshell_left, 0.0f); - else - View_AddEvent(w_pistol_ejectshell_right, 0.0f); -#else - dmg = Skill_GetValue("plr_elites_dmg", 45); - TraceAttack_SetRangeModifier(1.875); /* 14 but not 15 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,.9f); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_ELITES, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,.9f); - Sound_Play(pl, CHAN_WEAPON, "weapon_elites.fire"); -#endif - Cstrike_ShotMultiplierAdd(pl, 3, .85,accuracy); - pl.gflags |= GF_SEMI_TOGGLED; - pl.w_attack_next = 0.13f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_elites_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.elites_mag >= 30) - return; - if (!pl.ammo_9mm) - return; - - Weapons_ViewAnimation(pl, ELITES_RELOAD); - - pl.w_attack_next = 4.6f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::elites_mag, player::ammo_9mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_elites_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.elites_mag == 0 && pl.ammo_9mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_elites_aimanim(player pl) -{ - return pl.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_DUALPISTOLS : ANIM_AIM_DUALPISTOLS; -} - -void -w_elites_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [48/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_elites_isempty(player pl) -{ - - if (pl.elites_mag <= 0 && pl.ammo_9mm <= 0) - return 1; - - return 0; -} - -void -w_elites_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_elites_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_9mm, AMMO_MAX_9MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud15_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud14_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_elites = -{ - .name = "elites", - .id = ITEM_ELITES, - .slot = 1, - .slot_pos = 4, - .weight = 5, - .allow_drop = TRUE, - .draw = w_elites_draw, - .holster = __NULL__, - .primary = w_elites_primary, - .secondary = __NULL__, - .reload = w_elites_reload, - .release = w_elites_release, - .postdraw = w_elites_hud, - .precache = w_elites_precache, - .pickup = w_elites_pickup, - .updateammo = w_elites_updateammo, - .wmodel = w_elites_wmodel, - .pmodel = w_elites_pmodel, - .deathmsg = w_elites_deathmsg, - .aimanim = w_elites_aimanim, - .hudpic = w_elites_hudpic, - .type = csweapon_ranged_type, - .isempty = w_elites_isempty -}; - -#ifdef SERVER -void -weapon_elites(void) -{ - Weapons_InitItem(WEAPON_ELITES); -} -#endif diff --git a/src/shared/w_fiveseven.qc b/src/shared/w_fiveseven.qc deleted file mode 100644 index 0edf9e5..0000000 --- a/src/shared/w_fiveseven.qc +++ /dev/null @@ -1,309 +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_fiveseven (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Five-SeveN Weapon - -- Buy Menu - -Price: $750 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_fiveseven.mdl" -*/ - -enum -{ - FIVESEVEN_IDLE, - FIVESEVEN_SHOOT1, - FIVESEVEN_SHOOT2, - FIVESEVEN_SHOOT_EMPTY, - FIVESEVEN_RELOAD, - FIVESEVEN_DRAW -}; - -void -w_fiveseven_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_fiveseven.fire"); - precache_model("models/w_fiveseven.mdl"); -#else - precache_model("models/v_fiveseven.mdl"); - precache_model("models/p_fiveseven.mdl"); -#endif -} - -void -w_fiveseven_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.fiveseven_mag, pl.ammo_57mm, -1); -} - -string -w_fiveseven_wmodel(void) -{ - return "models/w_fiveseven.mdl"; -} - -string -w_fiveseven_pmodel(player pl) -{ - return "models/p_fiveseven.mdl"; -} - -string -w_fiveseven_deathmsg(void) -{ - return ""; -} - -int -w_fiveseven_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.fiveseven_mag = 20; - else - pl.fiveseven_mag = startammo; - } else { - if (pl.ammo_57mm < AMMO_MAX_57MM) { - pl.ammo_57mm = bound(0, pl.ammo_57mm + 20, AMMO_MAX_57MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_fiveseven_draw(player pl) -{ - Weapons_SetModel("models/v_fiveseven.mdl"); - Weapons_ViewAnimation(pl, FIVESEVEN_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 8; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_fiveseven_primary(player pl) -{ - - if (pl.w_attack_next > 0.0) { - return; - } - - if (pl.gflags & GF_SEMI_TOGGLED) { - return; - } - if (!pl.fiveseven_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl,200,1.4)+ 0.0055f; - int dmg = 0; - pl.fiveseven_mag--; - - if (pl.fiveseven_mag <= 0) { - Weapons_ViewAnimation(pl, FIVESEVEN_SHOOT_EMPTY); - } else { - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, FIVESEVEN_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, FIVESEVEN_SHOOT2); - break; - } - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_ONEHAND, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_ONEHAND, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_fiveseven_dmg", 25); - TraceAttack_SetRangeModifier(1.875); /* 14 but not 15 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,0.5f); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_FIVESEVEN, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,0.5f); - Sound_Play(pl, CHAN_WEAPON, "weapon_fiveseven.fire"); -#endif - Cstrike_ShotMultiplierAdd(pl, 10, .4,accuracy); - pl.gflags |= GF_SEMI_TOGGLED; - pl.w_attack_next = 0.155f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_fiveseven_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.fiveseven_mag >= 20) - return; - if (!pl.ammo_57mm) - return; - - Weapons_ViewAnimation(pl, FIVESEVEN_RELOAD); - - pl.w_attack_next = 3.1f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::fiveseven_mag, player::ammo_57mm, 20); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_fiveseven_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.fiveseven_mag == 0 && pl.ammo_57mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_fiveseven_aimanim(player pl) -{ - return pl.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_ONEHAND : ANIM_AIM_ONEHAND; -} - -void -w_fiveseven_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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,96/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_fiveseven_isempty(player pl) -{ - - if (pl.fiveseven_mag <= 0 && pl.ammo_57mm <= 0) - return 1; - - return 0; -} - -void -w_fiveseven_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_fiveseven_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_57mm, AMMO_MAX_57MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud15_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud14_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_fiveseven = -{ - .name = "fiveseven", - .id = ITEM_FIVESEVEN, - .slot = 1, - .slot_pos = 5, - .weight = 5, - .allow_drop = TRUE, - .draw = w_fiveseven_draw, - .holster = __NULL__, - .primary = w_fiveseven_primary, - .secondary = __NULL__, - .reload = w_fiveseven_reload, - .release = w_fiveseven_release, - .postdraw = w_fiveseven_hud, - .precache = w_fiveseven_precache, - .pickup = w_fiveseven_pickup, - .updateammo = w_fiveseven_updateammo, - .wmodel = w_fiveseven_wmodel, - .pmodel = w_fiveseven_pmodel, - .deathmsg = w_fiveseven_deathmsg, - .aimanim = w_fiveseven_aimanim, - .hudpic = w_fiveseven_hudpic, - .type = csweapon_ranged_type, - .isempty = w_fiveseven_isempty -}; - -#ifdef SERVER -void -weapon_fiveseven(void) -{ - Weapons_InitItem(WEAPON_FIVESEVEN); -} -#endif diff --git a/src/shared/w_flashbang.qc b/src/shared/w_flashbang.qc deleted file mode 100644 index afdd4de..0000000 --- a/src/shared/w_flashbang.qc +++ /dev/null @@ -1,307 +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_flashbang (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Concussion (Flashbang) Grenade Weapon - -When thrown, nearby players become blinded temporarily from the blast. - -- Buy Menu - -Price: $200 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_flashbang.mdl" -*/ - -enum -{ - FLASHBANG_IDLE, - FLASHBANG_PULLPIN, - FLASHBANG_THROW, - FLASHBANG_DRAW, -}; - -void -w_flashbang_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_flashbang.bounce"); - Sound_Precache("weapon_flashbang.explode"); - precache_model("models/w_flashbang.mdl"); -#else - precache_model("models/v_flashbang.mdl"); - precache_model("models/p_flashbang.mdl"); -#endif -} - -void -w_flashbang_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, -1, pl.ammo_fbgrenade, pl.mode_temp); -} - -int -w_flashbang_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (pl.ammo_fbgrenade < AMMO_MAX_FLASHBANG) { - pl.ammo_fbgrenade = bound(0, pl.ammo_fbgrenade + 1, AMMO_MAX_FLASHBANG); - } else { - return (0); - } -#endif - return (1); -} - -string -w_flashbang_wmodel(void) -{ - return "models/w_flashbang.mdl"; -} - -string -w_flashbang_pmodel(player pl) -{ - return "models/p_flashbang.mdl"; -} - -string -w_flashbang_deathmsg(void) -{ - return ""; -} - -void -w_flashbang_draw(player pl) -{ - Weapons_SetModel("models/v_flashbang.mdl"); - Weapons_ViewAnimation(pl, FLASHBANG_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - CStrikeView_UpdateGeomset(pl); -#endif -} - -#ifdef SERVER -void -w_flashbang_throw(player pl) -{ - static void flashbang_explode(void) - { - FX_Flashbang(self.origin); - Sound_Play(self, CHAN_BODY, "weapon_flashbang.explode"); - remove(self); - } - - static void flashbang_touch(void) - { - if (other.takedamage == DAMAGE_YES) { - Damage_Apply(other, self.owner, 15, WEAPON_FLASHBANG, DMG_BLUNT); - } else { - Sound_Play(self, CHAN_BODY, "weapon_flashbang.bounce"); - } - self.frame = 0; - } - - vector vPLAngle = pl.v_angle; - if (vPLAngle[0] < 0) { - vPLAngle[0] = -10 + vPLAngle[0] * ((90 - 10) / 90.0); - } else { - vPLAngle[0] = -10 + vPLAngle[0] * ((90 + 10) / 90.0); - } - - float flVel = (90 - vPLAngle[0]) * 5; - if (flVel > 1000) { - flVel = 1000; - } - - makevectors(vPLAngle); - vector vecSrc = pl.origin + pl.view_ofs + v_forward * 16; - vector vecThrow = v_forward * flVel + pl.velocity; - - entity eGrenade = spawn(); - eGrenade.owner = pl; - eGrenade.classname = "remove_me"; - eGrenade.solid = SOLID_BBOX; - eGrenade.frame = 1; - eGrenade.velocity = vecThrow; - eGrenade.movetype = MOVETYPE_BOUNCE; - eGrenade.think = flashbang_explode; - eGrenade.touch = flashbang_touch; - eGrenade.nextthink = time + 4.0f; - setmodel(eGrenade, "models/w_flashbang.mdl"); - setsize(eGrenade, [0,0,0], [0,0,0]); - setorigin(eGrenade, vecSrc); -} -#endif - -void -w_flashbang_primary(player pl) -{ - if (pl.w_attack_next > 0.0) { - return; - } - - /* We're abusing this network variable for the holding check */ - if (pl.mode_temp > 0) { - return; - } - - /* Ammo check */ - if (pl.ammo_fbgrenade <= 0) { -#ifdef SERVER - Weapons_RemoveItem(pl, WEAPON_FLASHBANG); -#endif - return; - } - - Weapons_ViewAnimation(pl, FLASHBANG_PULLPIN); - - pl.mode_temp = 1; - pl.w_attack_next = 0.975f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_flashbang_release(player pl) -{ - w_cstrike_weaponrelease(); - - if (pl.w_idle_next > 0.0) { - return; - } - - if (pl.mode_temp == 1) { - pl.ammo_fbgrenade--; -#ifdef CLIENT - Weapons_ViewAnimation(pl, FLASHBANG_THROW); -#else - w_flashbang_throw(pl); -#endif - pl.mode_temp = 2; - pl.w_attack_next = 1.0f; - pl.w_idle_next = 0.5f; - } else if (pl.mode_temp == 2) { -#ifdef CLIENT - Weapons_ViewAnimation(pl, FLASHBANG_DRAW); -#else - if (!pl.ammo_fbgrenade) { - Weapons_RemoveItem(pl, WEAPON_FLASHBANG); - } -#endif - pl.w_attack_next = 0.5f; - pl.w_idle_next = 0.5f; - pl.mode_temp = 0; - } -} - -float -w_flashbang_aimanim(player pl) -{ - return self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_GRENADE : ANIM_AIM_GRENADE; -} - -void -w_flashbang_hud(player pl) -{ -#ifdef CLIENT - - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [48/256,96/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_flashbang_isempty(player pl) -{ - - if (pl.ammo_fbgrenade <= 0) - return 1; - - return 0; -} - -void -w_flashbang_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - - HUD_DrawAmmoBar(pos, pl.ammo_fbgrenade, AMMO_MAX_FLASHBANG, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud6_spr, - [0,90/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud3_spr, - [0,90/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_flashbang = -{ - .name = "flashbang", - .id = ITEM_FLASHBANG, - .slot = 3, - .slot_pos = 1, - .allow_drop = FALSE, - .draw = w_flashbang_draw, - .holster = __NULL__, - .primary = w_flashbang_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_flashbang_release, - .postdraw = w_flashbang_hud, - .precache = w_flashbang_precache, - .pickup = w_flashbang_pickup, - .updateammo = w_flashbang_updateammo, - .wmodel = w_flashbang_wmodel, - .pmodel = w_flashbang_pmodel, - .deathmsg = w_flashbang_deathmsg, - .aimanim = w_flashbang_aimanim, - .hudpic = w_flashbang_hudpic, - .isempty = w_flashbang_isempty -}; - -#ifdef SERVER -void -weapon_flashbang(void) -{ - Weapons_InitItem(WEAPON_FLASHBANG); -} -#endif diff --git a/src/shared/w_g3sg1.qc b/src/shared/w_g3sg1.qc deleted file mode 100644 index c2e1c58..0000000 --- a/src/shared/w_g3sg1.qc +++ /dev/null @@ -1,318 +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_g3sg1 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Heckler & Koch G3/SG-1 Weapon - -- Buy Menu - -Price: $5000 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_g3sg1.mdl"*/ - -enum -{ - G3SG1_IDLE, - G3SG1_SHOOT1, - G3SG1_SHOOT2, - G3SG1_RELOAD, - G3SG1_DRAW -}; - -void -w_g3sg1_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_g3sg1.fire"); - precache_model("models/w_g3sg1.mdl"); -#else - precache_model("models/v_g3sg1.mdl"); - precache_model("models/p_g3sg1.mdl"); -#endif -} - -void -w_g3sg1_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.g3sg1_mag, pl.ammo_762mm, -1); -} - -string -w_g3sg1_wmodel(void) -{ - return "models/w_g3sg1.mdl"; -} - -string -w_g3sg1_pmodel(player pl) -{ - return "models/p_g3sg1.mdl"; -} - -string -w_g3sg1_deathmsg(void) -{ - return ""; -} - -int -w_g3sg1_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.g3sg1_mag = 20; - else - pl.g3sg1_mag = startammo; - } else { - if (pl.ammo_762mm < AMMO_MAX_762MM) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 20, AMMO_MAX_762MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_g3sg1_draw(player pl) -{ - Weapons_SetModel("models/v_g3sg1.mdl"); - Weapons_ViewAnimation(pl, G3SG1_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 6; - pl.cs_cross_deltadist = 4; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_g3sg1_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) { - return; - } - if (!pl.g3sg1_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl, 200); - Cstrike_ShotMultiplierAdd(pl, 1, 1,accuracy); - pl.g3sg1_mag--; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, SCOUT_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, SCOUT_SHOOT2); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_RIFLE, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_RIFLE, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_rifle_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_g3sg1_dmg", 80); - TraceAttack_SetRangeModifier(2.375); - TraceAttack_SetPenetrationPower(1); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_G3SG1, "Impact.BigShot"); - Sound_Play(pl, CHAN_WEAPON, "weapon_g3sg1.fire"); -#endif - - pl.w_attack_next = 0.25f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_g3sg1_secondary(player pl) -{ - if (pl.w_attack_next) { - return; - } - /* Simple toggle of fovs */ - if (pl.viewzoom == 1.0f) { - pl.viewzoom = 0.45f; - Weapons_DisableModel(); - } else if (pl.viewzoom == 0.45f) { - pl.viewzoom = 0.1f; - Weapons_DisableModel(); - } else { - pl.viewzoom = 1.0f; - Weapons_EnableModel(); - } - pl.w_attack_next = 0.5f; -} - -void -w_g3sg1_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.g3sg1_mag >= 20) - return; - if (!pl.ammo_762mm) - return; - - Weapons_ViewAnimation(pl, G3SG1_RELOAD); - pl.w_attack_next = 4.6f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::g3sg1_mag, player::ammo_762mm, 20); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_g3sg1_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.g3sg1_mag == 0 && pl.ammo_762mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_g3sg1_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_g3sg1_hud(player pl) -{ -#ifdef CLIENT - if (pl.viewzoom < 1.0f) { - Cstrike_DrawScope(); - } - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_g3sg1_isempty(player pl) -{ - - if (pl.g3sg1_mag <= 0 && pl.ammo_762mm <= 0) - return 1; - - return 0; -} - -void -w_g3sg1_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_g3sg1_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_762mm, AMMO_MAX_762MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud5_spr, - [0,180/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud2_spr, - [0,180/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_g3sg1 = -{ - .name = "g3sg1", - .id = ITEM_G3SG1, - .slot = 0, - .slot_pos = 13, - .weight = 25, - .allow_drop = TRUE, - .draw = w_g3sg1_draw, - .holster = __NULL__, - .primary = w_g3sg1_primary, - .secondary = w_g3sg1_secondary, - .reload = w_g3sg1_reload, - .release = w_g3sg1_release, - .postdraw = w_g3sg1_hud, - .precache = w_g3sg1_precache, - .pickup = w_g3sg1_pickup, - .updateammo = w_g3sg1_updateammo, - .wmodel = w_g3sg1_wmodel, - .pmodel = w_g3sg1_pmodel, - .deathmsg = w_g3sg1_deathmsg, - .aimanim = w_g3sg1_aimanim, - .hudpic = w_g3sg1_hudpic, - .type = csweapon_ranged_type, - .isempty = w_g3sg1_isempty -}; - -#ifdef SERVER -void -weapon_g3sg1(void) -{ - Weapons_InitItem(WEAPON_G3SG1); -} -#endif diff --git a/src/shared/w_glock18.qc b/src/shared/w_glock18.qc deleted file mode 100644 index b1fd973..0000000 --- a/src/shared/w_glock18.qc +++ /dev/null @@ -1,395 +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_glock18 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Glock 18 Select Fire Weapon - -Default arsenal for Terrorists - -- Buy Menu - -Price: $400 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_glock18.mdl" -*/ - -enum -{ - GLOCK_IDLE1, - GLOCK_IDLE2, - GLOCK_IDLE3, - GLOCK_SHOOT_BURST1, - GLOCK_SHOOT_BURST2, - GLOCK_SHOOT, - GLOCK_SHOOT_EMPTY, - GLOCK_RELOAD1, - GLOCK_DRAW1, - GLOCK_UNUSED1, - GLOCK_UNUSED2, - GLOCK_DRAW2, - GLOCK_RELOAD2 -}; - -void -w_glock18_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_glock18.fire"); - Sound_Precache("weapon_glock18.burstfire"); - precache_model("models/w_glock18.mdl"); -#else - precache_model("models/v_glock18.mdl"); - precache_model("models/p_glock18.mdl"); -#endif -} - -void -w_glock18_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.glock18_mag, pl.ammo_9mm, -1); -} - -string -w_glock18_wmodel(void) -{ - return "models/w_glock18.mdl"; -} - -string -w_glock18_pmodel(player pl) -{ - return "models/p_glock18.mdl"; -} - -string -w_glock18_deathmsg(void) -{ - return ""; -} - -int -w_glock18_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.glock18_mag = 20; - else - pl.glock18_mag = startammo; - } else { - if (pl.ammo_9mm < AMMO_MAX_9MM) { - pl.ammo_9mm = bound(0, pl.ammo_9mm + 20, AMMO_MAX_9MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_glock18_draw(player pl) -{ - Weapons_SetModel("models/v_glock18.mdl"); - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, GLOCK_DRAW1); - break; - default: - Weapons_ViewAnimation(pl, GLOCK_DRAW2); - break; - } - -#ifdef CLIENT - pl.cs_cross_mindist = 8; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_glock18_primary(player pl) -{ - if (pl.w_attack_next > 0.0) - return; - if (pl.gflags & GF_SEMI_TOGGLED) - return; - if (!pl.glock18_mag) - return; - - float accuracy = Cstrike_CalculateAccuracy(pl, (pl.mode_glock18) ? 75 : 120,1.2); - int shotcount = (pl.mode_glock18) ? 3 : 1; - int dmg = 0; - - /* fix shotcount if we're < 3 in burst mode */ - if (pl.glock18_mag < 3 && pl.mode_glock18) - shotcount = pl.glock18_mag; - - for (int i = 0; i < shotcount; i ++) { - - - accuracy += 0.0035; - pl.glock18_mag--; -#ifdef SERVER - dmg = Skill_GetValue("plr_glock18_dmg", 25); - TraceAttack_SetRangeModifier(1.25); /* penetrates 9 units, but not 10 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,0.6); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_GLOCK18, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,0.6); -#endif - } - - if (pl.mode_glock18) { - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, GLOCK_SHOOT_BURST1); - break; - default: - Weapons_ViewAnimation(pl, GLOCK_SHOOT_BURST2); - break; - } - pl.w_attack_next = 0.5f; - } else { - if (pl.glock18_mag <= 0) { - Weapons_ViewAnimation(pl, GLOCK_SHOOT_EMPTY); - } else { - Weapons_ViewAnimation(pl, GLOCK_SHOOT); - } - pl.w_attack_next = 0.13f; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_ONEHAND, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_ONEHAND, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - if (pl.mode_glock18) { - Sound_Play(pl, CHAN_WEAPON, "weapon_glock18.burstfire"); - } else { - Sound_Play(pl, CHAN_WEAPON, "weapon_glock18.fire"); - } -#endif - - Cstrike_ShotMultiplierAdd(pl, 2, .7,accuracy); - pl.gflags |= GF_SEMI_TOGGLED; - pl.w_idle_next = pl.w_attack_next + 1.0f; -} - -void -w_glock18_secondary(player pl) -{ - - if (pl.w_attack_next > 0) { - return; - } - - /* toggle burst-fire */ - pl.mode_glock18 = 1 - pl.mode_glock18; - -#ifdef CLIENT - if (pl.mode_glock18) { - CSQC_Parse_CenterPrint("Switched to Burst-Fire mode"); - } else { - CSQC_Parse_CenterPrint("Switched to Semi-Automatic mode"); - } -#endif - - pl.w_attack_next = 0.5f; - pl.w_idle_next = pl.w_attack_next + 1.0f; -} - -void -w_glock18_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.glock18_mag >= 20) - return; - if (!pl.ammo_9mm) - return; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, GLOCK_RELOAD1); - break; - default: - Weapons_ViewAnimation(pl, GLOCK_RELOAD2); - break; - } - - pl.w_attack_next = 2.1f; - pl.w_idle_next = pl.w_attack_next + 1.0f; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::glock18_mag, player::ammo_9mm, 20); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_glock18_release(player pl) -{ - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.glock18_mag == 0 && pl.ammo_9mm > 0) { - Weapons_Reload(pl); - return; - } - - if (pl.w_idle_next) - return; - - int r = floor(pseudorandom() * 3); - - switch (r) { - case 0: - Weapons_ViewAnimation(pl, GLOCK_IDLE1); - pl.w_idle_next = 2.8125f; - break; - case 1: - Weapons_ViewAnimation(pl, GLOCK_IDLE2); - pl.w_idle_next = 2.25f; - break; - case 2: - Weapons_ViewAnimation(pl, GLOCK_IDLE3); - pl.w_idle_next = 2.5f; - break; - } -} - -float -w_glock18_aimanim(player pl) -{ - return w_deagle_aimanim(pl); -} - -void -w_glock18_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [48/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_glock18_isempty(player pl) -{ - - if (pl.glock18_mag <= 0 && pl.ammo_9mm <= 0) - return 1; - - return 0; -} - -void -w_glock18_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_glock18_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_9mm, AMMO_MAX_9MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud4_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud1_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_glock18 = -{ - .name = "glock18", - .id = ITEM_GLOCK18, - .slot = 1, - .slot_pos = 1, - .weight = 5, - .allow_drop = TRUE, - .draw = w_glock18_draw, - .holster = __NULL__, - .primary = w_glock18_primary, - .secondary = w_glock18_secondary, - .reload = w_glock18_reload, - .release = w_glock18_release, - .postdraw = w_glock18_hud, - .precache = w_glock18_precache, - .pickup = w_glock18_pickup, - .updateammo = w_glock18_updateammo, - .wmodel = w_glock18_wmodel, - .pmodel = w_glock18_pmodel, - .deathmsg = w_glock18_deathmsg, - .aimanim = w_glock18_aimanim, - .hudpic = w_glock18_hudpic, - .type = csweapon_ranged_type, - .isempty = w_glock18_isempty -}; - -#ifdef SERVER -void -weapon_glock18(void) -{ - Weapons_InitItem(WEAPON_GLOCK18); -} -#endif diff --git a/src/shared/w_hegrenade.qc b/src/shared/w_hegrenade.qc deleted file mode 100644 index 909671f..0000000 --- a/src/shared/w_hegrenade.qc +++ /dev/null @@ -1,310 +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_hegrenade (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -HE (High Explosive) Grenade Weapon - -When thrown, explodes with a fairly deadly blast radius to players. - -- Buy Menu - -Price: $300 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_hegrenade.mdl" -*/ - -enum -{ - HEGRENADE_IDLE, - HEGRENADE_PULLPIN, - HEGRENADE_THROW, - HEGRENADE_DRAW, -}; - -void -w_hegrenade_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_hegrenade.bounce"); - Sound_Precache("weapon_hegrenade.explode"); - precache_model("models/w_hegrenade.mdl"); -#else - precache_model("models/v_hegrenade.mdl"); - precache_model("models/p_hegrenade.mdl"); -#endif -} - -void -w_hegrenade_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, -1, pl.ammo_hegrenade, pl.mode_temp); -} - -int -w_hegrenade_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (pl.ammo_hegrenade < AMMO_MAX_HENADE) { - pl.ammo_hegrenade = bound(0, pl.ammo_hegrenade + 1, AMMO_MAX_HENADE); - } else { - return (0); - } -#endif - return (1); -} - -string -w_hegrenade_wmodel(void) -{ - return "models/w_hegrenade.mdl"; -} - -string -w_hegrenade_pmodel(player pl) -{ - return "models/p_hegrenade.mdl"; -} - -string -w_hegrenade_deathmsg(void) -{ - return ""; -} - -void -w_hegrenade_draw(player pl) -{ - Weapons_SetModel("models/v_hegrenade.mdl"); - Weapons_ViewAnimation(pl, HEGRENADE_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - CStrikeView_UpdateGeomset(pl); -#endif -} - -#ifdef SERVER -void -w_hegrenade_throw(player pl) -{ - static void hegrenade_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_HEGRENADE); - Sound_Play(self, CHAN_BODY, "weapon_hegrenade.explode"); - remove(self); - } - - static void hegrenade_touch(void) - { - if (other.takedamage == DAMAGE_YES) { - Damage_Apply(other, self.owner, 15, WEAPON_HEGRENADE, DMG_BLUNT); - } else { - Sound_Play(self, CHAN_BODY, "weapon_hegrenade.bounce"); - } - self.frame = 0; - } - - vector vPLAngle = pl.v_angle; - if (vPLAngle[0] < 0) { - vPLAngle[0] = -10 + vPLAngle[0] * ((90 - 10) / 90.0); - } else { - vPLAngle[0] = -10 + vPLAngle[0] * ((90 + 10) / 90.0); - } - - float flVel = (90 - vPLAngle[0]) * 5; - if (flVel > 1000) { - flVel = 1000; - } - - makevectors(vPLAngle); - vector vecSrc = pl.origin + pl.view_ofs + v_forward * 16; - vector vecThrow = v_forward * flVel + pl.velocity; - - entity eGrenade = spawn(); - eGrenade.owner = pl; - eGrenade.classname = "remove_me"; - eGrenade.solid = SOLID_BBOX; - eGrenade.frame = 1; - eGrenade.velocity = vecThrow; - eGrenade.movetype = MOVETYPE_BOUNCE; - eGrenade.think = hegrenade_explode; - eGrenade.touch = hegrenade_touch; - eGrenade.nextthink = time + 4.0f; - setmodel(eGrenade, "models/w_hegrenade.mdl"); - setsize(eGrenade, [0,0,0], [0,0,0]); - setorigin(eGrenade, vecSrc); -} -#endif - -void -w_hegrenade_primary(player pl) -{ - if (pl.w_attack_next > 0.0) { - return; - } - - /* We're abusing this network variable for the holding check */ - if (pl.mode_temp > 0) { - return; - } - - /* Ammo check */ - if (pl.ammo_hegrenade <= 0) { -#ifdef SERVER - Weapons_RemoveItem(pl, WEAPON_HEGRENADE); -#endif - return; - } - - Weapons_ViewAnimation(pl, HEGRENADE_PULLPIN); - - pl.mode_temp = 1; - pl.w_attack_next = 0.975f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_hegrenade_release(player pl) -{ - - w_cstrike_weaponrelease(); - - if (pl.w_idle_next > 0.0) { - return; - } - - if (pl.mode_temp == 1) { - pl.ammo_hegrenade--; -#ifdef CLIENT - Weapons_ViewAnimation(pl, HEGRENADE_THROW); -#else - w_hegrenade_throw(pl); -#endif - pl.mode_temp = 2; - pl.w_attack_next = 1.0f; - pl.w_idle_next = 0.5f; - } else if (pl.mode_temp == 2) { -#ifdef CLIENT - Weapons_ViewAnimation(pl, HEGRENADE_DRAW); -#else - if (!pl.ammo_hegrenade) { - Weapons_RemoveItem(pl, WEAPON_HEGRENADE); - } -#endif - pl.w_attack_next = 0.5f; - pl.w_idle_next = 0.5f; - pl.mode_temp = 0; - } -} - -float -w_hegrenade_aimanim(player pl) -{ - return w_flashbang_aimanim(pl); -} - -void -w_hegrenade_hud(player pl) -{ -#ifdef CLIENT - - 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,96/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_hegrenade_isempty(player pl) -{ - - if (pl.ammo_hegrenade <= 0) - return 1; - - return 0; -} - -void -w_hegrenade_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - - HUD_DrawAmmoBar(pos, pl.ammo_hegrenade, AMMO_MAX_HENADE, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud6_spr, - [0,45/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud3_spr, - [0,45/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_hegrenade = -{ - .name = "hegrenade", - .id = ITEM_HEGRENADE, - .slot = 3, - .slot_pos = 0, - .allow_drop = FALSE, - .draw = w_hegrenade_draw, - .holster = __NULL__, - .primary = w_hegrenade_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_hegrenade_release, - .postdraw = w_hegrenade_hud, - .precache = w_hegrenade_precache, - .pickup = w_hegrenade_pickup, - .updateammo = w_hegrenade_updateammo, - .wmodel = w_hegrenade_wmodel, - .pmodel = w_hegrenade_pmodel, - .deathmsg = w_hegrenade_deathmsg, - .aimanim = w_hegrenade_aimanim, - .hudpic = w_hegrenade_hudpic, - .isempty = w_hegrenade_isempty -}; - -#ifdef SERVER -void -weapon_hegrenade(void) -{ - Weapons_InitItem(WEAPON_HEGRENADE); -} -#endif diff --git a/src/shared/w_knife.qc b/src/shared/w_knife.qc deleted file mode 100644 index c2b363b..0000000 --- a/src/shared/w_knife.qc +++ /dev/null @@ -1,323 +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_knife (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Knife Weapon - -Default arsenal on both teams - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_knife.mdl" -*/ - -enum -{ - KNIFE_IDLE1, - KNIFE_SLASH1, - KNIFE_SLASH2, - KNIFE_DRAW, - KNIFE_STAB, - KNIFE_STAB_MISS, - KNIFE_MIDSLASH1, - KNIFE_MIDSLASH2 -}; - -void -w_knife_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_knife.hit"); - Sound_Precache("weapon_knife.hitbody"); - Sound_Precache("weapon_knife.hithard"); - Sound_Precache("weapon_knife.miss"); - precache_model("models/w_knife.mdl"); -#else - precache_model("models/v_knife.mdl"); - precache_model("models/p_knife.mdl"); -#endif -} - -void -w_knife_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, -1, -1, -1); -} - -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 ""; -} - -void -w_knife_draw(player pl) -{ - Weapons_SetModel("models/v_knife.mdl"); - Weapons_ViewAnimation(pl, KNIFE_DRAW); - -#ifdef CLIENT - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_knife_primary(player pl) -{ - - if (pl.w_attack_next > 0.0) { - return; - } - pl.w_attack_next = 0.7f; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, KNIFE_SLASH1); - break; - default: - Weapons_ViewAnimation(pl, KNIFE_SLASH2); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_KNIFE, 1.33f); - else - Animation_PlayerTop(pl, ANIM_SHOOT_KNIFE, 1.33f); - -#ifdef SERVER - vector src; - int range = Skill_GetValue("plr_knife_range", 48); - - Weapons_MakeVectors(pl); - src = pl.origin + pl.view_ofs; - traceline(src, src + (v_forward * range), MOVE_HITMODEL, pl); - - Sound_Play(pl, CHAN_WEAPON, "weapon_knife.miss"); - - if (trace_fraction >= 1.0) { - return; - } - - if (trace_ent.iBleeds) { - FX_Blood(trace_endpos, [1,0,0]); - Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hitbody"); - } else { - Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hit"); - } - - /* let's calculate damage! */ - if (trace_ent.takedamage) { - /* values taken from https://counterstrike.fandom.com/wiki/Knife */ - int dmg = 0; - - switch (trace_surface_id) { - case BODY_HEAD: - dmg = Skill_GetValue("plr_knife_dmghead", 60); - break; - case BODY_STOMACH: - dmg = Skill_GetValue("plr_knife_dmgstomach", 18); - break; - case BODY_LEGLEFT: - case BODY_LEGRIGHT: - dmg = Skill_GetValue("plr_knife_dmglegs", 11); - break; - case BODY_CHEST: - dmg = Skill_GetValue("plr_knife_dmgchest", 15); - break; - case BODY_ARMLEFT: - case BODY_ARMRIGHT: - dmg = Skill_GetValue("plr_knife_dmgarms", 15); - break; - case BODY_DEFAULT: - default: - dmg = Skill_GetValue("plr_knife_dmg", 15); - break; - } - Damage_Apply(trace_ent, pl, dmg, WEAPON_KNIFE, DMG_SLASH); - } -#endif -} - -void -w_knife_secondary(player pl) -{ - - if (pl.w_attack_next > 0.0) { - return; - } - pl.w_attack_next = 1.2f; - - - Weapons_ViewAnimation(pl, KNIFE_STAB); - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_KNIFE, 1.33f); - else - Animation_PlayerTop(pl, ANIM_SHOOT_KNIFE, 1.33f); - -#ifdef SERVER - vector src; - int range = Skill_GetValue("plr_knife_altrange", 48); - - Weapons_MakeVectors(pl); - src = pl.origin + pl.view_ofs; - traceline(src, src + (v_forward * range), MOVE_HITMODEL, pl); - - Sound_Play(pl, CHAN_WEAPON, "weapon_knife.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]); - Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hitbody"); - } else { - Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hit"); - } - - /* let's calculate damage! */ - if (trace_ent.takedamage) { - /* values taken from https://counterstrike.fandom.com/wiki/Knife */ - int dmg = 0; - switch (trace_surface_id) { - case BODY_HEAD: - dmg = Skill_GetValue("plr_knife_altdmghead", 260); - break; - case BODY_STOMACH: - dmg = Skill_GetValue("plr_knife_altdmgstomach", 81); - break; - case BODY_LEGLEFT: - case BODY_LEGRIGHT: - dmg = Skill_GetValue("plr_knife_altdmglegs", 48); - break; - case BODY_CHEST: - dmg = Skill_GetValue("plr_knife_altdmgchest", 65); - break; - case BODY_ARMLEFT: - case BODY_ARMRIGHT: - dmg = Skill_GetValue("plr_knife_altdmgarms", 65); - break; - case BODY_DEFAULT: - default: - dmg = Skill_GetValue("plr_knife_altdmg", 65); - break; - } - - /* secondary can do a backstab */ - if (trace_ent.classname == "player") { - player otherpl = (player)trace_ent; - if (otherpl.IsFacing(pl) == false) { - dmg *= 3; - } - } - - Damage_Apply(trace_ent, pl, dmg, WEAPON_KNIFE, DMG_SLASH); - } -#endif -} - -float -w_knife_aimanim(player pl) -{ - return pl.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_KNIFE : ANIM_AIM_KNIFE; -} - -int -w_knife_isempty(player pl) -{ - return 0; -} - -void -w_knife_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud11_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud10_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_knife = -{ - .name = "knife", - .id = ITEM_KNIFE, - .slot = 2, - .slot_pos = 0, - .allow_drop = FALSE, - .draw = w_knife_draw, - .holster = __NULL__, - .primary = w_knife_primary, - .secondary = w_knife_secondary, - .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, - .type = csweapon_melee_type, - .isempty = w_knife_isempty -}; - -#ifdef SERVER -void -weapon_knife(void) -{ - Weapons_InitItem(WEAPON_KNIFE); -} -#endif diff --git a/src/shared/w_m3.qc b/src/shared/w_m3.qc deleted file mode 100644 index 1de567b..0000000 --- a/src/shared/w_m3.qc +++ /dev/null @@ -1,378 +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_m3 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Benneli M3 Super90 Weapon - -- Buy Menu - -Price: $1700 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_m3.mdl" -*/ - -#ifdef CLIENT -void -w_m3_ejectshell(void) -{ - static void w_m3_ejectshell_death(void) { - remove(self); - } - static void w_m3_ejectshell_touch(void) { - if (other == world) - Sound_Play(self, CHAN_BODY, "modelevent_shotgunshell.land"); - } - entity eShell = spawn(); - setmodel(eShell, "models/shotgunshell.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] + 20, 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_m3_ejectshell_touch; - - eShell.avelocity = [0,45,900]; - eShell.think = w_m3_ejectshell_death; - eShell.renderflags |= RF_DEPTHHACK; - eShell.nextthink = time + 2.5f; - setsize(eShell, [0,0,0], [0,0,0]); - setorigin(eShell, pSeat->m_eViewModel.origin + (v_forward * 10) + (v_right * 10) + (v_up * -8)); -} -#endif - -enum -{ - M3_IDLE, - M3_SHOOT1, - M3_SHOOT2, - M3_INSERT, - M3_RELOAD_END, - M3_RELOAD_START, - M3_DRAW -}; - -enum -{ - M3S_IDLE, - M3S_RELOAD_START, - M3S_RELOAD, - M3S_RELOAD_END -}; - -void -w_m3_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_m3.fire"); - precache_model("models/w_m3.mdl"); -#else - precache_model("models/v_m3.mdl"); - precache_model("models/p_m3.mdl"); - Sound_Precache("modelevent_shotgunshell.land"); -#endif -} - -void -w_m3_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.m3_mag, pl.ammo_buckshot, -1); -} - -string -w_m3_wmodel(void) -{ - return "models/w_m3.mdl"; -} - -string -w_m3_pmodel(player pl) -{ - return "models/p_m3.mdl"; -} - -string -w_m3_deathmsg(void) -{ - return ""; -} - -int -w_m3_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.m3_mag = 8; - else - pl.m3_mag = startammo; - } else { - if (pl.ammo_buckshot < AMMO_MAX_BUCKSHOT) { - pl.ammo_buckshot = bound(0, pl.ammo_buckshot + 8, AMMO_MAX_BUCKSHOT); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_m3_draw(player pl) -{ - Weapons_SetModel("models/v_m3.mdl"); - Weapons_ViewAnimation(pl, M3_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - pl.cs_cross_mindist = 8; - pl.cs_cross_deltadist = 6; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void w_m3_release(player pl); - -void -w_m3_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) { - w_m3_release(pl); - return; - } - - /* interrupt reloading if no longer empty */ - if (pl.mode_temp == M3S_RELOAD && pl.m3_mag >= 1) { - pl.mode_temp = M3S_RELOAD_END; - w_m3_release(pl); - return; - } else if (pl.mode_temp > M3S_IDLE) { - w_m3_release(pl); - return; - } - - /* Ammo check */ - if (pl.m3_mag <= 0) { - w_m3_release(pl); - return; - } - - pl.m3_mag--; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, M3_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, M3_SHOOT2); - break; - } - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_m3_ejectshell, 0.6f); -#else - dmg = Skill_GetValue("plr_m3_dmg", 26); - TraceAttack_SetPenetrationPower(0); /* shotties can't wallbang?! */ - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_SHOTGUN, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_SHOTGUN, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_m3.fire"); -#endif - - for (int i = 0; i < 9; i++) { - Cstrike_ShotMultiplierAdd(pl, 1, 1,1); - pl.punchangle[0] = -4 * (9 / 6); -#ifdef SERVER - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [random(-1,1) * 0.1,random(-1,1) * 0.05], WEAPON_M3, "Impact.BigShot"); -#endif - } - - pl.w_attack_next = 1.0f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_m3_reload(player pl) -{ - - if (pl.m3_mag >= 8) { - return; - } - if (pl.ammo_buckshot <= 0) { - return; - } - - if (pl.mode_temp > M3S_IDLE) { - return; - } - pl.mode_temp = M3S_RELOAD_START; - pl.w_idle_next = 0.0f; -} - -void -w_m3_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.mode_temp == M3S_IDLE && pl.m3_mag == 0 && pl.ammo_buckshot > 0) { - Weapons_Reload(pl); - return; - } - - if (pl.w_idle_next > 0.0) { - return; - } - - if (pl.mode_temp == M3S_RELOAD_START) { - Weapons_ViewAnimation(pl, M3_RELOAD_START); - pl.mode_temp = M3S_RELOAD; - pl.w_idle_next = 0.65f; - } else if (pl.mode_temp == M3S_RELOAD) { - Weapons_ViewAnimation(pl, M3_INSERT); - pl.m3_mag++; - pl.ammo_buckshot--; - w_m3_updateammo(pl); - if (pl.ammo_buckshot <= 0 || pl.m3_mag >= 8) { - pl.mode_temp = M3S_RELOAD_END; - } - pl.w_idle_next = 0.5f; - } else if (pl.mode_temp == M3S_RELOAD_END) { - Weapons_ViewAnimation(pl, M3_RELOAD_END); - pl.mode_temp = M3S_IDLE; - pl.w_idle_next = 10.0f; - pl.w_attack_next = 0.5f; - } -} - -float -w_m3_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_m3_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_m3_isempty(player pl) -{ - - if (pl.m3_mag <= 0 && pl.ammo_buckshot <= 0) - return 1; - - return 0; -} - -void -w_m3_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_m3_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_buckshot, AMMO_MAX_BUCKSHOT, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud4_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud1_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_m3 = -{ - .name = "m3", - .id = ITEM_M3, - .slot = 0, - .slot_pos = 0, - .weight = 20, - .allow_drop = TRUE, - .draw = w_m3_draw, - .holster = __NULL__, - .primary = w_m3_primary, - .secondary = __NULL__, - .reload = w_m3_reload, - .release = w_m3_release, - .postdraw = w_m3_hud, - .precache = w_m3_precache, - .pickup = w_m3_pickup, - .updateammo = w_m3_updateammo, - .wmodel = w_m3_wmodel, - .pmodel = w_m3_pmodel, - .deathmsg = w_m3_deathmsg, - .aimanim = w_m3_aimanim, - .hudpic = w_m3_hudpic, - .type = csweapon_ranged_type, - .isempty = w_m3_isempty -}; - -#ifdef SERVER -void -weapon_m3(void) -{ - Weapons_InitItem(WEAPON_M3); -} -#endif diff --git a/src/shared/w_m4a1.qc b/src/shared/w_m4a1.qc deleted file mode 100644 index 632b099..0000000 --- a/src/shared/w_m4a1.qc +++ /dev/null @@ -1,383 +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_m4a1 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Colt M4A1 Carbine Weapon - -- Buy Menu - -Price: $3100 -Counter-Terrorists only weapon - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_m4a1.mdl" -*/ - -enum -{ - M4A1_IDLE, - M4A1_SHOOT1, - M4A1_SHOOT2, - M4A1_SHOOT3, - M4A1_RELOAD, - M4A1_DRAW, - M4A1_ADDSIL, - M4A1_IDLEUNSIL, - M4A1_SHOOT1UNSIL, - M4A1_SHOOT2UNSIL, - M4A1_SHOOT3UNSIL, - M4A1_RELOADUNSIL, - M4A1_DRAWUNSIL, - M4A1_DETACHSIL -}; - -void -w_m4a1_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_m4a1.fire"); - Sound_Precache("weapon_m4a1.silenced"); - precache_model("models/w_m4a1.mdl"); -#else - precache_model("models/v_m4a1.mdl"); - precache_model("models/p_m4a1.mdl"); -#endif -} - -void -w_m4a1_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.m4a1_mag, pl.ammo_556mm, -1); -} - -string -w_m4a1_wmodel(void) -{ - return "models/w_m4a1.mdl"; -} - -string -w_m4a1_pmodel(player pl) -{ - return "models/p_m4a1.mdl"; -} - -string -w_m4a1_deathmsg(void) -{ - return ""; -} - -int -w_m4a1_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - Cstrike_ShotMultiplierUpdate(pl); - if (new) { - if (startammo == -1) - pl.m4a1_mag = 30; - else - pl.m4a1_mag = startammo; - } else { - if (pl.ammo_556mm < AMMO_MAX_556MM) { - pl.ammo_556mm = bound(0, pl.ammo_556mm + 30, AMMO_MAX_556MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_m4a1_draw(player pl) -{ - - Weapons_SetModel("models/v_m4a1.mdl"); - - if (pl.mode_m4a1 == 1) { - Weapons_ViewAnimation(pl, M4A1_DRAW); - } else { - Weapons_ViewAnimation(pl, M4A1_DRAWUNSIL); - } - -#ifdef CLIENT - pl.cs_cross_mindist = 4; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_m4a1_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) { - return; - } - if (!pl.m4a1_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl, 60, 3); -// accuracy += pl.cs_shotmultiplier*pl.cs_shotmultiplier / 500; - pl.m4a1_mag--; - - int r = (float)input_sequence % 3; - if (pl.mode_m4a1 == 1) { - switch (r) { - case 0: - Weapons_ViewAnimation(pl, M4A1_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, M4A1_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, M4A1_SHOOT3); - break; - } - } else { - switch (r) { - case 0: - Weapons_ViewAnimation(pl, M4A1_SHOOT1UNSIL); - break; - case 1: - Weapons_ViewAnimation(pl, M4A1_SHOOT2UNSIL); - break; - default: - Weapons_ViewAnimation(pl, M4A1_SHOOT3UNSIL); - break; - } - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_RIFLE, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_RIFLE, 0.45f); - - /* actual firing */ -#ifdef CLIENT - if (pl.mode_m4a1 == 1) { - View_SetMuzzleflash(0); - } else { - View_SetMuzzleflash(MUZZLE_RIFLE); - } - View_AddEvent(w_rifle_ejectshell, 0.0f); -#else - /* Different sounds without silencer */ - if (pl.mode_m4a1 == 1) { - Sound_Play(pl, CHAN_WEAPON, "weapon_m4a1.silenced"); - } else { - Sound_Play(pl, CHAN_WEAPON, "weapon_m4a1.fire"); - } - - dmg = Skill_GetValue("plr_m4a1_dmg", 33); - TraceAttack_SetRangeModifier(2.125); - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,.96f); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_M4A1, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,.96f); -#endif - - Cstrike_ShotMultiplierAdd(pl, 0.8f, 1.025f,accuracy*0.8); - pl.w_attack_next = 0.0875f; - pl.w_idle_next = 2.0f; -} - -void -w_m4a1_secondary(player pl) -{ - - if (pl.w_attack_next > 0) { - return; - } - - /* toggle silencer */ - pl.mode_m4a1 = 1 - pl.mode_m4a1; - - /* play the animation */ - if (pl.mode_m4a1) { - Weapons_ViewAnimation(pl, M4A1_ADDSIL); - } else { - Weapons_ViewAnimation(pl, M4A1_DETACHSIL); - } - - pl.w_attack_next = 2.0f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_m4a1_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.m4a1_mag >= 30) - return; - if (!pl.ammo_556mm) - return; - Cstrike_ShotMultiplierUpdate(pl); - - if (pl.mode_m4a1 == 1) - Weapons_ViewAnimation(pl, M4A1_RELOAD); - else - Weapons_ViewAnimation(pl, M4A1_RELOADUNSIL); - - pl.w_attack_next = 3.1f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::m4a1_mag, player::ammo_556mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -float -w_m4a1_aimanim(player pl) -{ - return pl.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_RIFLE : ANIM_AIM_RIFLE; -} - -void -w_m4a1_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -void -w_m4a1_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.m4a1_mag == 0 && pl.ammo_556mm > 0) { - Weapons_Reload(pl); - return; - } - - if (pl.w_idle_next > 0.0) { - return; - } - - if (pl.mode_m4a1) { - Weapons_ViewAnimation(pl, M4A1_IDLE); - } else { - Weapons_ViewAnimation(pl, M4A1_IDLEUNSIL); - } - pl.w_idle_next = 5.0f; -} - -int -w_m4a1_isempty(player pl) -{ - - if (pl.m4a1_mag <= 0 && pl.ammo_556mm <= 0) - return 1; - - return 0; -} - -void -w_m4a1_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_m4a1_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_556mm, AMMO_MAX_556MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud5_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud2_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_m4a1 = -{ - .name = "m4a1", - .id = ITEM_M4A1, - .slot = 0, - .slot_pos = 9, - .weight = 25, - .allow_drop = TRUE, - .draw = w_m4a1_draw, - .holster = __NULL__, - .primary = w_m4a1_primary, - .secondary = w_m4a1_secondary, - .reload = w_m4a1_reload, - .release = w_m4a1_release, - .postdraw = w_m4a1_hud, - .precache = w_m4a1_precache, - .pickup = w_m4a1_pickup, - .updateammo = w_m4a1_updateammo, - .wmodel = w_m4a1_wmodel, - .pmodel = w_m4a1_pmodel, - .deathmsg = w_m4a1_deathmsg, - .aimanim = w_m4a1_aimanim, - .hudpic = w_m4a1_hudpic, - .type = csweapon_ranged_type, - .isempty = w_m4a1_isempty -}; - -#ifdef SERVER -void -weapon_m4a1(void) -{ - Weapons_InitItem(WEAPON_M4A1); -} -#endif diff --git a/src/shared/w_mac10.qc b/src/shared/w_mac10.qc deleted file mode 100644 index 71dc2eb..0000000 --- a/src/shared/w_mac10.qc +++ /dev/null @@ -1,304 +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_mac10 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Ingram MAC-10 Weapon - -- Buy Menu - -Price: $1400 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_mac10.mdl" -*/ - -enum -{ - MAC10_IDLE, - MAC10_RELOAD, - MAC10_DRAW, - MAC10_SHOOT1, - MAC10_SHOOT2, - MAC10_SHOOT3 -}; - -void -w_mac10_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_mac10.fire"); - precache_model("models/w_mac10.mdl"); -#else - precache_model("models/v_mac10.mdl"); - precache_model("models/p_mac10.mdl"); -#endif -} - -void -w_mac10_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.mac10_mag, pl.ammo_45acp, -1); -} - -string -w_mac10_wmodel(void) -{ - return "models/w_mac10.mdl"; -} - -string -w_mac10_pmodel(player pl) -{ - return "models/p_mac10.mdl"; -} - -string -w_mac10_deathmsg(void) -{ - return ""; -} - -int -w_mac10_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.mac10_mag = 30; - else - pl.mac10_mag = startammo; - } else { - if (pl.ammo_45acp < AMMO_MAX_45ACP) { - pl.ammo_45acp = bound(0, pl.ammo_45acp + 30, AMMO_MAX_45ACP); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_mac10_draw(player pl) -{ - Weapons_SetModel("models/v_mac10.mdl"); - Weapons_ViewAnimation(pl, MAC10_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 9; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_mac10_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) { - return; - } - if (!pl.mac10_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl, 50,0.8)+0.0095f; - pl.mac10_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, MAC10_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, MAC10_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, MAC10_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_MP5, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_MP5, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_mac10_dmg", 29); - TraceAttack_SetRangeModifier(1.25); /* 9, but not 10 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,1.115); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_MAC10, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,1.115); - Sound_Play(pl, CHAN_WEAPON, "weapon_mac10.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 2, 0.7f,accuracy); - pl.w_attack_next = 0.07f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_mac10_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.mac10_mag >= 30) - return; - if (!pl.ammo_45acp) - return; - - Weapons_ViewAnimation(pl, MAC10_RELOAD); - - pl.w_attack_next = 3.2f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::mac10_mag, player::ammo_45acp, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_mac10_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.mac10_mag == 0 && pl.ammo_45acp > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_mac10_aimanim(player pl) -{ - return w_deagle_aimanim(pl); -} - -void -w_mac10_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [96/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_mac10_isempty(player pl) -{ - - if (pl.mac10_mag <= 0 && pl.ammo_45acp <= 0) - return 1; - - return 0; -} - -void -w_mac10_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_mac10_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_45acp, AMMO_MAX_45ACP, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud15_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud14_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_mac10 = -{ - .name = "mac10", - .id = ITEM_MAC10, - .slot = 0, - .slot_pos = 5, - .weight = 25, - .allow_drop = TRUE, - .draw = w_mac10_draw, - .holster = __NULL__, - .primary = w_mac10_primary, - .secondary = __NULL__, - .reload = w_mac10_reload, - .release = w_mac10_release, - .postdraw = w_mac10_hud, - .precache = w_mac10_precache, - .pickup = w_mac10_pickup, - .updateammo = w_mac10_updateammo, - .wmodel = w_mac10_wmodel, - .pmodel = w_mac10_pmodel, - .deathmsg = w_mac10_deathmsg, - .aimanim = w_mac10_aimanim, - .hudpic = w_mac10_hudpic, - .type = csweapon_ranged_type, - .isempty = w_mac10_isempty -}; - -#ifdef SERVER -void -weapon_mac10(void) -{ - Weapons_InitItem(WEAPON_MAC10); -} -#endif diff --git a/src/shared/w_mp5.qc b/src/shared/w_mp5.qc deleted file mode 100644 index 81124a4..0000000 --- a/src/shared/w_mp5.qc +++ /dev/null @@ -1,302 +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_mp5navy (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Heckler & Koch MP5-Navy Weapon - -- Buy Menu - -Price: $1500 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_mp5.mdl" -*/ - -enum -{ - MP5_IDLE, - MP5_RELOAD, - MP5_DRAW, - MP5_SHOOT1, - MP5_SHOOT2, - MP5_SHOOT3 -}; - -void -w_mp5_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_mp5.fire"); - precache_model("models/w_mp5.mdl"); -#else - precache_model("models/v_mp5.mdl"); - precache_model("models/p_mp5.mdl"); -#endif -} - -void -w_mp5_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.mp5_mag, pl.ammo_9mm, -1); -} - -string -w_mp5_wmodel(void) -{ - return "models/w_mp5.mdl"; -} - -string -w_mp5_pmodel(player pl) -{ - return "models/p_mp5.mdl"; -} - -string -w_mp5_deathmsg(void) -{ - return ""; -} - -int -w_mp5_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.mp5_mag = 30; - else - pl.mp5_mag = startammo; - } else { - if (pl.ammo_9mm < AMMO_MAX_9MM) { - pl.ammo_9mm = bound(0, pl.ammo_9mm + 30, AMMO_MAX_9MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_mp5_draw(player pl) -{ - Weapons_SetModel("models/v_mp5.mdl"); - Weapons_ViewAnimation(pl, MP5_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 5; - pl.cs_cross_deltadist = 2; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_mp5_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) - return; - if (!pl.mp5_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl,60,1.25)+0.0045f; - pl.mp5_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, MP5_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, MP5_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, MP5_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_MP5, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_MP5, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_mp5_dmg", 26); - TraceAttack_SetRangeModifier(1.25); /* 9 units but not 10 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,.825f); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_MP5, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,.825f); - Sound_Play(pl, CHAN_WEAPON, "weapon_mp5.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, .5f, 1.25f,accuracy); - pl.w_attack_next = 0.08f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_mp5_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.mp5_mag >= 30) - return; - if (!pl.ammo_9mm) - return; - - Weapons_ViewAnimation(pl, MP5_RELOAD); - - pl.w_attack_next = 2.6f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::mp5_mag, player::ammo_9mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_mp5_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.mp5_mag == 0 && pl.ammo_9mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_mp5_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_mp5_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [48/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_mp5_isempty(player pl) -{ - - if (pl.mp5_mag <= 0 && pl.ammo_9mm <= 0) - return 1; - - return 0; -} - -void -w_mp5_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_mp5_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_9mm, AMMO_MAX_9MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud4_spr, - [0,180/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud1_spr, - [0,180/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_mp5 = -{ - .name = "mp5navy", - .id = ITEM_MP5, - .slot = 0, - .slot_pos = 2, - .weight = 25, - .allow_drop = TRUE, - .draw = w_mp5_draw, - .holster = __NULL__, - .primary = w_mp5_primary, - .secondary = __NULL__, - .reload = w_mp5_reload, - .release = w_mp5_release, - .postdraw = w_mp5_hud, - .precache = w_mp5_precache, - .pickup = w_mp5_pickup, - .updateammo = w_mp5_updateammo, - .wmodel = w_mp5_wmodel, - .pmodel = w_mp5_pmodel, - .deathmsg = w_mp5_deathmsg, - .aimanim = w_mp5_aimanim, - .hudpic = w_mp5_hudpic, - .type = csweapon_ranged_type, - .isempty = w_mp5_isempty -}; - -#ifdef SERVER -void -weapon_mp5navy(void) -{ - Weapons_InitItem(WEAPON_MP5); -} -#endif diff --git a/src/shared/w_p228.qc b/src/shared/w_p228.qc deleted file mode 100644 index a52d64b..0000000 --- a/src/shared/w_p228.qc +++ /dev/null @@ -1,310 +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_p228 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -SIG P228 Weapon - -- Buy Menu - -Price: $600 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_p228.mdl" -*/ - -enum -{ - P228_IDLE, - P228_SHOOT1, - P228_SHOOT2, - P228_SHOOT3, - P228_SHOOT_EMPTY, - P228_RELOAD, - P228_DRAW -}; - -void -w_p228_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_p228.fire"); - precache_model("models/w_p228.mdl"); -#else - precache_model("models/v_p228.mdl"); - precache_model("models/p_p228.mdl"); -#endif -} - -void -w_p228_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.p228_mag, pl.ammo_357sig, -1); -} - -string -w_p228_wmodel(void) -{ - return "models/w_p228.mdl"; -} - -string -w_p228_pmodel(player pl) -{ - return "models/p_p228.mdl"; -} - -string -w_p228_deathmsg(void) -{ - return ""; -} - -int -w_p228_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.p228_mag = 13; - else - pl.p228_mag = startammo; - } else { - if (pl.ammo_357sig < AMMO_MAX_357SIG) { - pl.ammo_357sig = bound(0, pl.ammo_357sig + 13, AMMO_MAX_357SIG); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_p228_draw(player pl) -{ - Weapons_SetModel("models/v_p228.mdl"); - Weapons_ViewAnimation(pl, P228_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 8; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_p228_primary(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.gflags & GF_SEMI_TOGGLED) - return; - if (!pl.p228_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 200,1.6) + 0.004f; - int dmg = 0; - pl.p228_mag--; - - if (pl.p228_mag <= 0) { - Weapons_ViewAnimation(pl, P228_SHOOT_EMPTY); - } else { - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, P228_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, P228_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, P228_SHOOT3); - break; - } - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_ONEHAND, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_ONEHAND, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_p228_dmg", 40); - TraceAttack_SetRangeModifier(1.5); /* penetrates 11, but not 12 units */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,1.05); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_P228, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,1.05); - Sound_Play(pl, CHAN_WEAPON, "weapon_p228.fire"); -#endif - Cstrike_ShotMultiplierAdd(pl, 6, 0.5f,accuracy); - - pl.gflags |= GF_SEMI_TOGGLED; - pl.w_attack_next = 0.1425f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_p228_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.p228_mag >= 13) - return; - if (!pl.ammo_357sig) - return; - - Weapons_ViewAnimation(pl, P228_RELOAD); - - pl.w_attack_next = 2.7f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::p228_mag, player::ammo_357sig, 13); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_p228_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.p228_mag == 0 && pl.ammo_357sig > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_p228_aimanim(player pl) -{ - return w_deagle_aimanim(pl); -} - -void -w_p228_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_p228_isempty(player pl) -{ - - if (pl.p228_mag <= 0 && pl.ammo_357sig <= 0) - return 1; - - return 0; -} - -void -w_p228_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_p228_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_357sig, AMMO_MAX_357SIG, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud13_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud12_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_p228 = -{ - .name = "p228", - .id = ITEM_P228, - .slot = 1, - .slot_pos = 3, - .weight = 5, - .allow_drop = TRUE, - .draw = w_p228_draw, - .holster = __NULL__, - .primary = w_p228_primary, - .secondary = __NULL__, - .reload = w_p228_reload, - .release = w_p228_release, - .postdraw = w_p228_hud, - .precache = w_p228_precache, - .pickup = w_p228_pickup, - .updateammo = w_p228_updateammo, - .wmodel = w_p228_wmodel, - .pmodel = w_p228_pmodel, - .deathmsg = w_p228_deathmsg, - .aimanim = w_p228_aimanim, - .hudpic = w_p228_hudpic, - .type = csweapon_ranged_type, - .isempty = w_p228_isempty -}; - -#ifdef SERVER -void -weapon_p228(void) -{ - Weapons_InitItem(WEAPON_P228); -} -#endif diff --git a/src/shared/w_p90.qc b/src/shared/w_p90.qc deleted file mode 100644 index 1d4a362..0000000 --- a/src/shared/w_p90.qc +++ /dev/null @@ -1,302 +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_p90 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -FN P90 Weapon - -- Buy Menu - -Price: $2350 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_p90.mdl" -*/ - -enum -{ - P90_IDLE, - P90_RELOAD, - P90_DRAW, - P90_SHOOT1, - P90_SHOOT2, - P90_SHOOT3 -}; - -void -w_p90_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_p90.fire"); - precache_model("models/w_p90.mdl"); -#else - precache_model("models/v_p90.mdl"); - precache_model("models/p_p90.mdl"); -#endif -} - -void -w_p90_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.p90_mag, pl.ammo_57mm, -1); -} - -string -w_p90_wmodel(void) -{ - return "models/w_p90.mdl"; -} - -string -w_p90_pmodel(player pl) -{ - return "models/p_p90.mdl"; -} - -string -w_p90_deathmsg(void) -{ - return ""; -} - -int -w_p90_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.p90_mag = 50; - else - pl.p90_mag = startammo; - } else { - if (pl.ammo_57mm < AMMO_MAX_57MM) { - pl.ammo_57mm = bound(0, pl.ammo_57mm + 50, AMMO_MAX_57MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_p90_draw(player pl) -{ - Weapons_SetModel("models/v_p90.mdl"); - Weapons_ViewAnimation(pl, P90_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 7; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_p90_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) - return; - if (!pl.p90_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 50,1.125)+0.0055; - pl.p90_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, P90_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, P90_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, P90_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_MP5, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_MP5, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_p90_dmg", 26); - TraceAttack_SetRangeModifier(1.875); /* 9 but not 10 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,.9); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_P90, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,.9); - Sound_Play(pl, CHAN_WEAPON, "weapon_p90.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 1.1, 1.3,accuracy); - pl.w_attack_next = 0.07f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_p90_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.p90_mag >= 50) - return; - if (!pl.ammo_57mm) - return; - - Weapons_ViewAnimation(pl, P90_RELOAD); - - pl.w_attack_next = 3.3f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::p90_mag, player::ammo_57mm, 50); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_p90_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.p90_mag == 0 && pl.ammo_57mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_p90_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_p90_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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,96/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_p90_isempty(player pl) -{ - - if (pl.p90_mag <= 0 && pl.ammo_57mm <= 0) - return 1; - - return 0; -} - -void -w_p90_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_p90_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_57mm, AMMO_MAX_57MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud13_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud12_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_p90 = -{ - .name = "p90", - .id = ITEM_P90, - .slot = 0, - .slot_pos = 3, - .weight = 26, - .allow_drop = TRUE, - .draw = w_p90_draw, - .holster = __NULL__, - .primary = w_p90_primary, - .secondary = __NULL__, - .reload = w_p90_reload, - .release = w_p90_release, - .postdraw = w_p90_hud, - .precache = w_p90_precache, - .pickup = w_p90_pickup, - .updateammo = w_p90_updateammo, - .wmodel = w_p90_wmodel, - .pmodel = w_p90_pmodel, - .deathmsg = w_p90_deathmsg, - .aimanim = w_p90_aimanim, - .hudpic = w_p90_hudpic, - .type = csweapon_ranged_type, - .isempty = w_p90_isempty -}; - -#ifdef SERVER -void -weapon_p90(void) -{ - Weapons_InitItem(WEAPON_P90); -} -#endif diff --git a/src/shared/w_para.qc b/src/shared/w_para.qc deleted file mode 100644 index 1d8af98..0000000 --- a/src/shared/w_para.qc +++ /dev/null @@ -1,299 +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_m249 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -FN M249 Para Weapon - -- Buy Menu - -Price: $5750 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_m249.mdl" -*/ - -enum -{ - PARA_IDLE, - PARA_SHOOT1, - PARA_SHOOT2, - PARA_RELOAD, - PARA_DRAW -}; - -void -w_para_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_para.fire"); - precache_model("models/w_m249.mdl"); -#else - precache_model("models/v_m249.mdl"); - precache_model("models/p_m249.mdl"); -#endif -} - -void -w_para_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.para_mag, pl.ammo_556mmbox, -1); -} - -string -w_para_wmodel(void) -{ - return "models/w_m249.mdl"; -} - -string -w_para_pmodel(player pl) -{ - return "models/p_m249.mdl"; -} - -string -w_para_deathmsg(void) -{ - return ""; -} - -int -w_para_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.para_mag = 100; - else - pl.para_mag = startammo; - } else { - if (pl.ammo_556mmbox < AMMO_MAX_556MMBOX) { - pl.ammo_556mmbox = bound(0, pl.ammo_556mmbox + 100, AMMO_MAX_556MMBOX); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_para_draw(player pl) -{ - Weapons_SetModel("models/v_m249.mdl"); - Weapons_ViewAnimation(pl, PARA_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 6; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_para_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) - return; - if (!pl.para_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 70, 3); - - pl.para_mag--; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, SCOUT_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, SCOUT_SHOOT2); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_PARA, 0.45f); - else - Animation_PlayerTop(pl, ANIM_SHOOT_PARA, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_rifle_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_para_dmg", 35); - TraceAttack_SetRangeModifier(2.125); - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,1); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_PARA, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,1); - Sound_Play(pl, CHAN_WEAPON, "weapon_para.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 1, 1,accuracy); - pl.w_attack_next = 0.1f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_para_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.para_mag >= 100) - return; - if (!pl.ammo_556mmbox) - return; - - Weapons_ViewAnimation(pl, PARA_RELOAD); - - pl.w_attack_next = 3.0f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::para_mag, player::ammo_556mmbox, 100); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_para_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.para_mag == 0 && pl.ammo_556mmbox > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_para_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_para_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_para_isempty(player pl) -{ - - if (pl.para_mag <= 0 && pl.ammo_556mmbox <= 0) - return 1; - - return 0; -} - -void -w_para_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_para_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_556mmbox, AMMO_MAX_556MMBOX, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud6_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud3_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_para = -{ - .name = "m249", - .id = ITEM_PARA, - .slot = 0, - .slot_pos = 15, - .weight = 25, - .allow_drop = TRUE, - .draw = w_para_draw, - .holster = __NULL__, - .primary = w_para_primary, - .secondary = __NULL__, - .reload = w_para_reload, - .release = w_para_release, - .postdraw = w_para_hud, - .precache = w_para_precache, - .pickup = w_para_pickup, - .updateammo = w_para_updateammo, - .wmodel = w_para_wmodel, - .pmodel = w_para_pmodel, - .deathmsg = w_para_deathmsg, - .aimanim = w_para_aimanim, - .hudpic = w_para_hudpic, - .type = csweapon_ranged_type, - .isempty = w_para_isempty -}; - -#ifdef SERVER -void -weapon_m249(void) -{ - Weapons_InitItem(WEAPON_PARA); -} -#endif diff --git a/src/shared/w_scout.qc b/src/shared/w_scout.qc deleted file mode 100644 index 183e69f..0000000 --- a/src/shared/w_scout.qc +++ /dev/null @@ -1,344 +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_scout (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Steyr Scout Weapon - -- Buy Menu - -Price: $1250 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_scout.mdl" -*/ - -enum -{ - SCOUT_IDLE, - SCOUT_SHOOT1, - SCOUT_SHOOT2, - SCOUT_RELOAD, - SCOUT_DRAW -}; - -void -w_scout_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_scout.fire"); - precache_model("models/w_scout.mdl"); -#else - precache_model("models/v_scout.mdl"); - precache_model("models/p_scout.mdl"); -#endif -} - -void -w_scout_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.scout_mag, pl.ammo_762mm, -1); -} - -string -w_scout_wmodel(void) -{ - return "models/w_scout.mdl"; -} - -string -w_scout_pmodel(player pl) -{ - return "models/p_scout.mdl"; -} - -string -w_scout_deathmsg(void) -{ - return ""; -} - -int -w_scout_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.scout_mag = 10; - else - pl.scout_mag = startammo; - } else { - if (pl.ammo_762mm < AMMO_MAX_762MM) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 10, AMMO_MAX_762MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_scout_draw(player pl) -{ - Weapons_SetModel("models/v_scout.mdl"); - Weapons_ViewAnimation(pl, SCOUT_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - pl.cs_cross_mindist = 5; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - - -void -w_scout_release(player pl) -{ - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.scout_mag == 0 && pl.ammo_762mm > 0) { - Weapons_Reload(pl); - return; - } - - if (pl.w_idle_next > 0.0f) { - pl.viewzoom = 1.0f; - Weapons_EnableModel(); - return; - } - - if (pl.mode_temp == 1) { - pl.viewzoom = 0.45f; - Weapons_DisableModel(); - } else if (pl.mode_temp == 2) { - pl.viewzoom = 0.1f; - Weapons_DisableModel(); - } else { - pl.viewzoom = 1.0f; - Weapons_EnableModel(); - } -} - -void -w_scout_secondary(player pl) -{ - - if (pl.w_attack_next) - return; - -#ifdef SSQC - Sound_Play(pl, CHAN_WEAPON, "weapon_awp.zoom"); -#endif - - /* Simple toggle of fovs */ - if (pl.mode_temp == 1) - pl.mode_temp = 2; - else if (pl.mode_temp == 2) - pl.mode_temp = 0; - else - pl.mode_temp = 1; - - pl.w_attack_next = 0.3f; - pl.w_idle_next = 0.0f; - w_scout_release(pl); -} - -void -w_scout_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) { - w_scout_release(pl); - return; - } - if (!pl.scout_mag) { - return; - } - - - float accuracy = Cstrike_CalculateAccuracy(pl, 200); - - pl.scout_mag--; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, SCOUT_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, SCOUT_SHOOT2); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_RIFLE, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_RIFLE, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_rifle_ejectshell, 0.5f); -#else - dmg = Skill_GetValue("plr_scout_dmg", 75); - TraceAttack_SetRangeModifier(2.375); - TraceAttack_SetPenetrationPower(1); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_SCOUT, "Impact.BigShot"); - Sound_Play(pl, CHAN_WEAPON, "weapon_scout.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 1, 1,accuracy); - pl.w_attack_next = 1.25f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_scout_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.scout_mag >= 10) - return; - if (!pl.ammo_762mm) - return; - - Weapons_ViewAnimation(pl, SCOUT_RELOAD); - - pl.w_attack_next = 2.0f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::scout_mag, player::ammo_762mm, 10); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -float -w_scout_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_scout_hud(player pl) -{ -#ifdef CLIENT - if (pl.viewzoom < 1.0f) { - Cstrike_DrawScope(); - } - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_scout_isempty(player pl) -{ - - if (pl.scout_mag <= 0 && pl.ammo_762mm <= 0) - return 1; - - return 0; -} - -void -w_scout_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_scout_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_762mm, AMMO_MAX_762MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud13_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud12_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_scout = -{ - .name = "scout", - .id = ITEM_SCOUT, - .slot = 0, - .slot_pos = 11, - .weight = 30, - .allow_drop = TRUE, - .draw = w_scout_draw, - .holster = __NULL__, - .primary = w_scout_primary, - .secondary = w_scout_secondary, - .reload = w_scout_reload, - .release = w_scout_release, - .postdraw = w_scout_hud, - .precache = w_scout_precache, - .pickup = w_scout_pickup, - .updateammo = w_scout_updateammo, - .wmodel = w_scout_wmodel, - .pmodel = w_scout_pmodel, - .deathmsg = w_scout_deathmsg, - .aimanim = w_scout_aimanim, - .hudpic = w_scout_hudpic, - .type = csweapon_ranged_type, - .isempty = w_scout_isempty -}; - -#ifdef SERVER -void -weapon_scout(void) -{ - Weapons_InitItem(WEAPON_SCOUT); -} -#endif diff --git a/src/shared/w_sg550.qc b/src/shared/w_sg550.qc deleted file mode 100644 index 0c41b5a..0000000 --- a/src/shared/w_sg550.qc +++ /dev/null @@ -1,321 +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_sg550 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -SIG SG 550 Weapon - -- Buy Menu - -Price: $4200 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_sg550.mdl" -*/ - -enum -{ - SG550_IDLE, - SG550_SHOOT1, - SG550_SHOOT2, - SG550_RELOAD, - SG550_DRAW, -}; - -void -w_sg550_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_sg550.fire"); - precache_model("models/w_sg550.mdl"); -#else - precache_model("models/v_sg550.mdl"); - precache_model("models/p_sg550.mdl"); -#endif -} - -void -w_sg550_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.sg550_mag, pl.ammo_556mm, -1); -} - -string -w_sg550_wmodel(void) -{ - return "models/w_sg550.mdl"; -} - -string -w_sg550_pmodel(player pl) -{ - return "models/p_sg550.mdl"; -} - -string -w_sg550_deathmsg(void) -{ - return ""; -} - -int -w_sg550_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.sg550_mag = 30; - else - pl.sg550_mag = startammo; - } else { - if (pl.ammo_556mm < AMMO_MAX_556MM) { - pl.ammo_556mm = bound(0, pl.ammo_556mm + 30, AMMO_MAX_556MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_sg550_draw(player pl) -{ - Weapons_SetModel("models/v_sg550.mdl"); - Weapons_ViewAnimation(pl, SG550_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 5; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_sg550_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) - return; - if (!pl.sg550_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 200); - Cstrike_ShotMultiplierAdd(pl, 1, 1,accuracy); - pl.sg550_mag--; - - int r = (float)input_sequence % 2; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, SCOUT_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, SCOUT_SHOOT2); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_RIFLE, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_RIFLE, 0.45f); - - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_rifle_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_sg550_dmg", 70); - TraceAttack_SetRangeModifier(2.125); - TraceAttack_SetPenetrationPower(1); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_SG550, "Impact.BigShot"); - Sound_Play(pl, CHAN_WEAPON, "weapon_sg550.fire"); -#endif - - pl.w_attack_next = 0.25f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_sg550_secondary(player pl) -{ - - if (pl.w_attack_next) - return; - - /* Simple toggle of fovs */ - if (pl.viewzoom == 1.0f) { - pl.viewzoom = 0.45f; - Weapons_DisableModel(); - } else if (pl.viewzoom == 0.45f) { - pl.viewzoom = 0.1f; - Weapons_DisableModel(); - } else { - pl.viewzoom = 1.0f; - Weapons_EnableModel(); - } - - pl.w_attack_next = 0.5f; -} - -void -w_sg550_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.sg550_mag >= 30) - return; - if (!pl.ammo_556mm) - return; - - Weapons_ViewAnimation(pl, SG550_RELOAD); - - pl.w_attack_next = 3.8f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::sg550_mag, player::ammo_556mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_sg550_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.sg550_mag == 0 && pl.ammo_556mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_sg550_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_sg550_hud(player pl) -{ -#ifdef CLIENT - if (pl.viewzoom < 1.0f) { - Cstrike_DrawScope(); - } - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_sg550_isempty(player pl) -{ - - if (pl.sg550_mag <= 0 && pl.ammo_556mm <= 0) - return 1; - - return 0; -} - -void -w_sg550_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_sg550_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_556mm, AMMO_MAX_556MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud15_spr, - [0,180/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud14_spr, - [0,180/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_sg550 = -{ - .name = "sg550", - .id = ITEM_SG550, - .slot = 0, - .slot_pos = 14, - .weight = 20, - .allow_drop = TRUE, - .draw = w_sg550_draw, - .holster = __NULL__, - .primary = w_sg550_primary, - .secondary = w_sg550_secondary, - .reload = w_sg550_reload, - .release = w_sg550_release, - .postdraw = w_sg550_hud, - .precache = w_sg550_precache, - .pickup = w_sg550_pickup, - .updateammo = w_sg550_updateammo, - .wmodel = w_sg550_wmodel, - .pmodel = w_sg550_pmodel, - .deathmsg = w_sg550_deathmsg, - .aimanim = w_sg550_aimanim, - .hudpic = w_sg550_hudpic, - .type = csweapon_ranged_type, - .isempty = w_sg550_isempty -}; - -#ifdef SERVER -void -weapon_sg550(void) -{ - Weapons_InitItem(WEAPON_SG550); -} -#endif diff --git a/src/shared/w_sg552.qc b/src/shared/w_sg552.qc deleted file mode 100644 index 0e046af..0000000 --- a/src/shared/w_sg552.qc +++ /dev/null @@ -1,326 +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_sg552 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -SIG SG 552 Commando Weapon - -- Buy Menu - -Price: $3500 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_sg552.mdl" -*/ - -enum -{ - SG552_IDLE, - SG552_RELOAD, - SG552_DRAW, - SG552_SHOOT1, - SG552_SHOOT2, - SG552_SHOOT3 -}; - -void -w_sg552_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_sg552.fire"); - precache_model("models/w_sg552.mdl"); -#else - precache_model("models/v_sg552.mdl"); - precache_model("models/p_sg552.mdl"); -#endif -} - -void -w_sg552_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.sg552_mag, pl.ammo_556mm, -1); -} - -string -w_sg552_wmodel(void) -{ - return "models/w_sg552.mdl"; -} - -string -w_sg552_pmodel(player pl) -{ - return "models/p_sg552.mdl"; -} - -string -w_sg552_deathmsg(void) -{ - return ""; -} - -int -w_sg552_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.sg552_mag = 30; - else - pl.sg552_mag = startammo; - } else { - if (pl.ammo_556mm < AMMO_MAX_556MM) { - pl.ammo_556mm = bound(0, pl.ammo_556mm + 30, AMMO_MAX_556MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_sg552_draw(player pl) -{ - Weapons_SetModel("models/v_sg552.mdl"); - Weapons_ViewAnimation(pl, SG552_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 5; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_sg552_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) - return; - if (!pl.sg552_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 75,3)*pl.viewzoom; - pl.sg552_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, SG552_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, SG552_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, SG552_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_RIFLE, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_RIFLE, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_rifle_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_sg552_dmg", 33); - TraceAttack_SetRangeModifier(2.125); - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,0.726f); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_SG552, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,0.725f); - Sound_Play(pl, CHAN_WEAPON, "weapon_sg552.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 2.2, 0.9,accuracy); - if (pl.viewzoom == 1.0f) - pl.w_attack_next = 0.0825f; - else - pl.w_attack_next = 0.15f; - - pl.w_idle_next = pl.w_attack_next; -} - -void -w_sg552_secondary(player pl) -{ - - if (pl.w_attack_next) - return; - - /* Simple toggle of fovs */ - if (pl.viewzoom == 1.0f) - pl.viewzoom = 0.2f; - else - pl.viewzoom = 1.0f; - - pl.w_attack_next = 0.5f; -} - -void -w_sg552_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.sg552_mag >= 30) - return; - if (!pl.ammo_556mm) - return; - - Weapons_ViewAnimation(pl, SG552_RELOAD); - - pl.w_attack_next = 3.2f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::sg552_mag, player::ammo_556mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_sg552_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.sg552_mag == 0 && pl.ammo_556mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_sg552_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_sg552_hud(player pl) -{ -#ifdef CLIENT - if (pl.viewzoom == 1.0f) { - Cstrike_DrawCrosshair(); - } else { - Cstrike_DrawSimpleCrosshair(); - } - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_sg552_isempty(player pl) -{ - - if (pl.sg552_mag <= 0 && pl.ammo_556mm <= 0) - return 1; - - return 0; -} - -void -w_sg552_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_sg552_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_556mm, AMMO_MAX_556MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud11_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud10_spr, - [0,45/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_sg552 = -{ - .name = "sg552", - .id = ITEM_SG552, - .slot = 0, - .slot_pos = 8, - .weight = 25, - .allow_drop = TRUE, - .draw = w_sg552_draw, - .holster = __NULL__, - .primary = w_sg552_primary, - .secondary = w_sg552_secondary, - .reload = w_sg552_reload, - .release = w_sg552_release, - .postdraw = w_sg552_hud, - .precache = w_sg552_precache, - .pickup = w_sg552_pickup, - .updateammo = w_sg552_updateammo, - .wmodel = w_sg552_wmodel, - .pmodel = w_sg552_pmodel, - .deathmsg = w_sg552_deathmsg, - .aimanim = w_sg552_aimanim, - .hudpic = w_sg552_hudpic, - .type = csweapon_ranged_type, - .isempty = w_sg552_isempty -}; - -#ifdef SERVER -void -weapon_sg552(void) -{ - Weapons_InitItem(WEAPON_SG552); -} -#endif diff --git a/src/shared/w_smokegrenade.qc b/src/shared/w_smokegrenade.qc deleted file mode 100644 index 6dba00a..0000000 --- a/src/shared/w_smokegrenade.qc +++ /dev/null @@ -1,306 +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_smokegrenade (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Smoke Grenade Weapon - -When thrown, the explosion casts view-blocking smoke in that radius. - -- Buy Menu - -Price: $300 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_smokegrenade.mdl" -*/ - -enum -{ - SMOKEGRENADE_IDLE, - SMOKEGRENADE_PULLPIN, - SMOKEGRENADE_THROW, - SMOKEGRENADE_DRAW, -}; - -void -w_smokegrenade_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_smokegrenade.bounce"); - Sound_Precache("weapon_smokegrenade.explode"); - precache_model("models/w_smokegrenade.mdl"); -#else - precache_model("models/v_smokegrenade.mdl"); - precache_model("models/p_smokegrenade.mdl"); -#endif -} - -void -w_smokegrenade_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, -1, pl.ammo_smokegrenade, pl.mode_temp); -} - -int -w_smokegrenade_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (pl.ammo_smokegrenade < AMMO_MAX_SMOKE) { - pl.ammo_smokegrenade = bound(0, pl.ammo_smokegrenade + 1, AMMO_MAX_SMOKE); - } else { - return (0); - } -#endif - return (1); -} - -string -w_smokegrenade_wmodel(void) -{ - return "models/w_smokegrenade.mdl"; -} - -string -w_smokegrenade_pmodel(player pl) -{ - return "models/p_smokegrenade.mdl"; -} - -string -w_smokegrenade_deathmsg(void) -{ - return ""; -} - -void -w_smokegrenade_draw(player pl) -{ - Weapons_SetModel("models/v_smokegrenade.mdl"); - Weapons_ViewAnimation(pl, SMOKEGRENADE_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - CStrikeView_UpdateGeomset(pl); -#endif -} - -#ifdef SERVER -void -w_smokegrenade_throw(player pl) -{ - static void smokegrenade_explode(void) - { - FX_Smokenade(self.origin); - Sound_Play(self, CHAN_BODY, "weapon_smokegrenade.explode"); - remove(self); - } - - static void smokegrenade_touch(void) - { - if (other.takedamage == DAMAGE_YES) { - Damage_Apply(other, self.owner, 15, WEAPON_SMOKEGRENADE, DMG_BLUNT); - } else { - Sound_Play(self, CHAN_BODY, "weapon_smokegrenade.bounce"); - } - self.frame = 0; - } - - vector vPLAngle = pl.v_angle; - if (vPLAngle[0] < 0) { - vPLAngle[0] = -10 + vPLAngle[0] * ((90 - 10) / 90.0); - } else { - vPLAngle[0] = -10 + vPLAngle[0] * ((90 + 10) / 90.0); - } - - float flVel = (90 - vPLAngle[0]) * 5; - if (flVel > 1000) { - flVel = 1000; - } - - makevectors(vPLAngle); - vector vecSrc = pl.origin + pl.view_ofs + v_forward * 16; - vector vecThrow = v_forward * flVel + pl.velocity; - - entity eGrenade = spawn(); - eGrenade.owner = pl; - eGrenade.classname = "remove_me"; - eGrenade.solid = SOLID_BBOX; - eGrenade.frame = 1; - eGrenade.velocity = vecThrow; - eGrenade.movetype = MOVETYPE_BOUNCE; - eGrenade.think = smokegrenade_explode; - eGrenade.touch = smokegrenade_touch; - eGrenade.nextthink = time + 4.0f; - setmodel(eGrenade, "models/w_smokegrenade.mdl"); - setsize(eGrenade, [0,0,0], [0,0,0]); - setorigin(eGrenade, vecSrc); -} -#endif - -void -w_smokegrenade_primary(player pl) -{ - if (pl.w_attack_next > 0.0) { - return; - } - - /* We're abusing this network variable for the holding check */ - if (pl.mode_temp > 0) { - return; - } - - /* Ammo check */ - if (pl.ammo_smokegrenade <= 0) { -#ifdef SERVER - Weapons_RemoveItem(pl, WEAPON_SMOKEGRENADE); -#endif - return; - } - - Weapons_ViewAnimation(pl, SMOKEGRENADE_PULLPIN); - pl.mode_temp = 1; - pl.w_attack_next = 0.975f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_smokegrenade_release(player pl) -{ - - w_cstrike_weaponrelease(); - - if (pl.w_idle_next > 0.0) { - return; - } - - if (pl.mode_temp == 1) { - pl.ammo_smokegrenade--; -#ifdef CLIENT - Weapons_ViewAnimation(pl, SMOKEGRENADE_THROW); -#else - w_smokegrenade_throw(pl); -#endif - pl.mode_temp = 2; - pl.w_attack_next = 1.0f; - pl.w_idle_next = 0.5f; - } else if (pl.mode_temp == 2) { -#ifdef CLIENT - Weapons_ViewAnimation(pl, SMOKEGRENADE_DRAW); -#else - if (!pl.ammo_smokegrenade) { - Weapons_RemoveItem(pl, WEAPON_SMOKEGRENADE); - } -#endif - pl.w_attack_next = 0.5f; - pl.w_idle_next = 0.5f; - pl.mode_temp = 0; - } -} - -float -w_smokegrenade_aimanim(player pl) -{ - return w_flashbang_aimanim(pl); -} - -void -w_smokegrenade_hud(player pl) -{ -#ifdef CLIENT - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [144/256,96/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_smokegrenade_isempty(player pl) -{ - - if (pl.ammo_smokegrenade <= 0) - return 1; - - return 0; -} - -void -w_smokegrenade_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - - HUD_DrawAmmoBar(pos, pl.ammo_smokegrenade, AMMO_MAX_SMOKE, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud6_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud3_spr, - [0,135/256], - [170/256,45/256], - g_hud_color, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_smokegrenade = -{ - .name = "smokegrenade", - .id = ITEM_SMOKEGRENADE, - .slot = 3, - .slot_pos = 2, - .allow_drop = FALSE, - .draw = w_smokegrenade_draw, - .holster = __NULL__, - .primary = w_smokegrenade_primary, - .secondary = __NULL__, - .reload = __NULL__, - .release = w_smokegrenade_release, - .postdraw = w_smokegrenade_hud, - .precache = w_smokegrenade_precache, - .pickup = w_smokegrenade_pickup, - .updateammo = w_smokegrenade_updateammo, - .wmodel = w_smokegrenade_wmodel, - .pmodel = w_smokegrenade_pmodel, - .deathmsg = w_smokegrenade_deathmsg, - .aimanim = w_smokegrenade_aimanim, - .hudpic = w_smokegrenade_hudpic, - .isempty = w_smokegrenade_isempty -}; - -#ifdef SERVER -void -weapon_smokegrenade(void) -{ - Weapons_InitItem(WEAPON_SMOKEGRENADE); -} -#endif diff --git a/src/shared/w_tmp.qc b/src/shared/w_tmp.qc deleted file mode 100644 index 2c1a56a..0000000 --- a/src/shared/w_tmp.qc +++ /dev/null @@ -1,302 +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_tmp (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Steyr Tactical Weapon - -- Buy Menu - -Price: $1250 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_tmp.mdl" -*/ - -enum -{ - TMP_IDLE, - TMP_RELOAD, - TMP_DRAW, - TMP_SHOOT1, - TMP_SHOOT2, - TMP_SHOOT3 -}; - -void -w_tmp_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_tmp.fire"); - precache_model("models/w_tmp.mdl"); -#else - precache_model("models/v_tmp.mdl"); - precache_model("models/p_tmp.mdl"); -#endif -} - -void -w_tmp_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.tmp_mag, pl.ammo_9mm, -1); -} - -string -w_tmp_wmodel(void) -{ - return "models/w_tmp.mdl"; -} - -string -w_tmp_pmodel(player pl) -{ - return "models/p_tmp.mdl"; -} - -string -w_tmp_deathmsg(void) -{ - return ""; -} - -int -w_tmp_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.tmp_mag = 30; - else - pl.tmp_mag = startammo; - } else { - if (pl.ammo_9mm < AMMO_MAX_9MM) { - pl.ammo_9mm = bound(0, pl.ammo_9mm + 30, AMMO_MAX_9MM); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_tmp_draw(player pl) -{ - Weapons_SetModel("models/v_tmp.mdl"); - Weapons_ViewAnimation(pl, TMP_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 7; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_tmp_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) - return; - if (!pl.tmp_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 30,0.95)+0.0035; - pl.tmp_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, TMP_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, TMP_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, TMP_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_MP5, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_MP5, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_tmp_dmg", 26); - TraceAttack_SetRangeModifier(1.25); /* 9 but not 10 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,0.8); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_TMP, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,0.8); - Sound_Play(pl, CHAN_WEAPON, "weapon_tmp.fire"); -#endif - - Cstrike_ShotMultiplierAdd(pl, 0.95, 1.25,accuracy); - pl.w_attack_next = 0.07f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_tmp_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.tmp_mag >= 30) - return; - if (!pl.ammo_9mm) - return; - - Weapons_ViewAnimation(pl, TMP_RELOAD); - - pl.w_attack_next = 2.1f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::tmp_mag, player::ammo_9mm, 30); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_tmp_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.tmp_mag == 0 && pl.ammo_9mm > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_tmp_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_tmp_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [48/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_tmp_isempty(player pl) -{ - - if (pl.tmp_mag <= 0 && pl.ammo_9mm <= 0) - return 1; - - return 0; -} - -void -w_tmp_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_tmp_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_9mm, AMMO_MAX_9MM, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud5_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud2_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_tmp = -{ - .name = "tmp", - .id = ITEM_TMP, - .slot = 0, - .slot_pos = 6, - .weight = 25, - .allow_drop = TRUE, - .draw = w_tmp_draw, - .holster = __NULL__, - .primary = w_tmp_primary, - .secondary = __NULL__, - .reload = w_tmp_reload, - .release = w_tmp_release, - .postdraw = w_tmp_hud, - .precache = w_tmp_precache, - .pickup = w_tmp_pickup, - .updateammo = w_tmp_updateammo, - .wmodel = w_tmp_wmodel, - .pmodel = w_tmp_pmodel, - .deathmsg = w_tmp_deathmsg, - .aimanim = w_tmp_aimanim, - .hudpic = w_tmp_hudpic, - .type = csweapon_ranged_type, - .isempty = w_tmp_isempty -}; - -#ifdef SERVER -void -weapon_tmp(void) -{ - Weapons_InitItem(WEAPON_TMP); -} -#endif diff --git a/src/shared/w_ump45.qc b/src/shared/w_ump45.qc deleted file mode 100644 index 7713624..0000000 --- a/src/shared/w_ump45.qc +++ /dev/null @@ -1,301 +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_ump45 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Heckler & Koch UMP .45 ACP Weapon - -- Buy Menu - -Price: $1700 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_ump45.mdl" -*/ - -enum -{ - UMP45_IDLE, - UMP45_RELOAD, - UMP45_DRAW, - UMP45_SHOOT1, - UMP45_SHOOT2, - UMP45_SHOOT3 -}; - -void -w_ump45_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_ump45.fire"); - precache_model("models/w_ump45.mdl"); -#else - precache_model("models/v_ump45.mdl"); - precache_model("models/p_ump45.mdl"); -#endif -} - -void -w_ump45_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.ump45_mag, pl.ammo_45acp, -1); -} - -string -w_ump45_wmodel(void) -{ - return "models/w_ump45.mdl"; -} - -string -w_ump45_pmodel(player pl) -{ - return "models/p_ump45.mdl"; -} - -string -w_ump45_deathmsg(void) -{ - return ""; -} - -int -w_ump45_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.ump45_mag = 25; - else - pl.ump45_mag = startammo; - } else { - if (pl.ammo_45acp < AMMO_MAX_45ACP) { - pl.ammo_45acp = bound(0, pl.ammo_45acp + 25, AMMO_MAX_45ACP); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_ump45_draw(player pl) -{ - Weapons_SetModel("models/v_ump45.mdl"); - Weapons_ViewAnimation(pl, UMP45_DRAW); - -#ifdef CLIENT - pl.cs_cross_mindist = 6; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_ump45_primary(player pl) -{ - int dmg = 0; - - if (pl.w_attack_next > 0.0) - return; - if (!pl.ump45_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl, 100,1)+0.003; - pl.ump45_mag--; - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, UMP45_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, UMP45_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, UMP45_SHOOT3); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_MP5, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_MP5, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_ump45_dmg", 30); - TraceAttack_SetRangeModifier(0.875); /* 6, but not 7 */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,1.2); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_UMP45, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,1.2); - Sound_Play(pl, CHAN_WEAPON, "weapon_ump45.fire"); -#endif - Cstrike_ShotMultiplierAdd(pl, 1, .9,accuracy); - pl.w_attack_next = 0.105f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_ump45_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.ump45_mag >= 25) - return; - if (!pl.ammo_45acp) - return; - - Weapons_ViewAnimation(pl, UMP45_RELOAD); - - pl.w_attack_next = 3.5f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::ump45_mag, player::ammo_45acp, 25); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_ump45_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.ump45_mag == 0 && pl.ammo_45acp > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_ump45_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_ump45_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [96/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_ump45_isempty(player pl) -{ - - if (pl.ump45_mag <= 0 && pl.ammo_45acp <= 0) - return 1; - - return 0; -} - -void -w_ump45_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_ump45_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_45acp, AMMO_MAX_45ACP, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud16_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud16_spr, - [0,0], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_ump45 = -{ - .name = "ump45", - .id = ITEM_UMP45, - .slot = 0, - .slot_pos = 4, - .weight = 25, - .allow_drop = TRUE, - .draw = w_ump45_draw, - .holster = __NULL__, - .primary = w_ump45_primary, - .secondary = __NULL__, - .reload = w_ump45_reload, - .release = w_ump45_release, - .postdraw = w_ump45_hud, - .precache = w_ump45_precache, - .pickup = w_ump45_pickup, - .updateammo = w_ump45_updateammo, - .wmodel = w_ump45_wmodel, - .pmodel = w_ump45_pmodel, - .deathmsg = w_ump45_deathmsg, - .aimanim = w_ump45_aimanim, - .hudpic = w_ump45_hudpic, - .type = csweapon_ranged_type, - .isempty = w_ump45_isempty -}; - -#ifdef SERVER -void -weapon_ump45(void) -{ - Weapons_InitItem(WEAPON_UMP45); -} -#endif diff --git a/src/shared/w_usp45.qc b/src/shared/w_usp45.qc deleted file mode 100644 index 333575c..0000000 --- a/src/shared/w_usp45.qc +++ /dev/null @@ -1,376 +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_usp45 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Heckler & Koch USP .45 Tactical Weapon - -Default arsenal for Counter-Terrorists - -- Buy Menu - -Price: $500 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_usp45.mdl" -*/ - -enum -{ - USP45_IDLE, - USP45_SHOOT1, - USP45_SHOOT2, - USP45_SHOOT3, - USP45_SHOOTLAST, - USP45_RELOAD, - USP45_DRAW, - USP45_ADDSIL, - USP45_IDLEUNSIL, - USP45_SHOOT1UNSIL, - USP45_SHOOT2UNSIL, - USP45_SHOOT3UNSIL, - USP45_SHOOTLASTUNSIL, - USP45_RELOADUNSIL, - USP45_DRAWUNSIL, - USP45_DETACHSIL -}; - -void -w_usp45_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_usp45.fire"); - Sound_Precache("weapon_usp45.silenced"); - precache_model("models/w_usp.mdl"); -#else - precache_model("models/v_usp.mdl"); - precache_model("models/p_usp.mdl"); -#endif -} - -void -w_usp45_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.usp45_mag, pl.ammo_45acp, -1); -} - -string -w_usp45_wmodel(void) -{ - return "models/w_usp.mdl"; -} - -string -w_usp45_pmodel(player pl) -{ - return "models/p_usp.mdl"; -} - -string -w_usp45_deathmsg(void) -{ - return ""; -} - -int -w_usp45_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.usp45_mag = 12; - else - pl.usp45_mag = startammo; - } else { - if (pl.ammo_45acp < AMMO_MAX_45ACP) { - pl.ammo_45acp = bound(0, pl.ammo_45acp + 12, AMMO_MAX_45ACP); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_usp45_draw(player pl) -{ - - Weapons_SetModel("models/v_usp.mdl"); - if (pl.mode_usp45 == 1) { - Weapons_ViewAnimation(pl, USP45_DRAW); - } else { - Weapons_ViewAnimation(pl, USP45_DRAWUNSIL); - } - -#ifdef CLIENT - pl.cs_cross_mindist = 8; - pl.cs_cross_deltadist = 3; - CStrikeView_UpdateGeomset(pl); -#endif -} - -void -w_usp45_primary(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.gflags & GF_SEMI_TOGGLED) - return; - if (!pl.usp45_mag) - return; - - - float accuracy = Cstrike_CalculateAccuracy(pl,25,2.2); - int dmg = 0; - pl.usp45_mag--; - - /* this stuff is predicted */ - int r = (float)input_sequence % 3; - if (pl.mode_usp45 == 1) { - if (pl.usp45_mag <= 0) { - Weapons_ViewAnimation(pl, USP45_SHOOTLAST); - } else { - switch (r) { - case 0: - Weapons_ViewAnimation(pl, USP45_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(pl, USP45_SHOOT2); - break; - default: - Weapons_ViewAnimation(pl, USP45_SHOOT3); - break; - } - } - } else { - if (pl.usp45_mag <= 0) { - Weapons_ViewAnimation(pl, USP45_SHOOTLASTUNSIL); - } else { - switch (r) { - case 0: - Weapons_ViewAnimation(pl, USP45_SHOOT1UNSIL); - break; - case 1: - Weapons_ViewAnimation(pl, USP45_SHOOT2UNSIL); - break; - default: - Weapons_ViewAnimation(pl, USP45_SHOOT3UNSIL); - break; - } - } - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_ONEHAND, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_ONEHAND, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_SMALL); - View_AddEvent(w_pistol_ejectshell, 0.0f); -#else - /* Different sounds without silencer */ - if (pl.mode_usp45 == 1) { - Sound_Play(pl, CHAN_WEAPON, "weapon_usp45.silenced"); - } else { - Sound_Play(pl, CHAN_WEAPON, "weapon_usp45.fire"); - } - - /* actual firing */ - dmg = Skill_GetValue("plr_usp45_dmg", 33); - TraceAttack_SetRangeModifier(0.79); /* can penetrate 6 but not 7 units */ - TraceAttack_SetPenetrationPower(1); - Cstrike_BulletRecoil_ApplyPre(pl,0.625); - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [accuracy,accuracy], WEAPON_USP45, "Impact.BigShot"); - Cstrike_BulletRecoil_ApplyPost(pl,0.625); -#endif - Cstrike_ShotMultiplierAdd(pl, 2.5, .5,accuracy*0.5); - - pl.gflags |= GF_SEMI_TOGGLED; - pl.w_attack_next = 0.15f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_usp45_secondary(player pl) -{ - - if (pl.w_attack_next > 0) - return; - - /* toggle silencer */ - pl.mode_usp45 = 1 - pl.mode_usp45; - - /* play the animation */ - if (pl.mode_usp45) - Weapons_ViewAnimation(pl, USP45_ADDSIL); - else - Weapons_ViewAnimation(pl, USP45_DETACHSIL); - - pl.w_attack_next = 3.1f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_usp45_reload(player pl) -{ - - if (pl.w_attack_next > 0.0) - return; - if (pl.usp45_mag >= 12) - return; - if (!pl.ammo_45acp) - return; - - if (pl.mode_usp45 == 1) - Weapons_ViewAnimation(pl, USP45_RELOAD); - else - Weapons_ViewAnimation(pl, USP45_RELOADUNSIL); - - pl.w_attack_next = 2.5f; - pl.w_idle_next = pl.w_attack_next; - -#ifdef SERVER - static void w_weapon_reload_done(void) { - player pl = (player)self; - Weapons_ReloadWeapon(pl, player::usp45_mag, player::ammo_45acp, 12); - Cstrike_ShotReset(pl); - } - - pl.think = w_weapon_reload_done; - pl.nextthink = time + pl.w_attack_next - 0.1f; -#endif -} - -void -w_usp45_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.usp45_mag == 0 && pl.ammo_45acp > 0) { - Weapons_Reload(pl); - return; - } -} - -float -w_usp45_aimanim(player pl) -{ - return w_deagle_aimanim(pl); -} - -void -w_usp45_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - HUD_DrawAmmo2(); - vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], g_hud7_spr, [96/256,72/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_usp45_isempty(player pl) -{ - - if (pl.usp45_mag <= 0 && pl.ammo_45acp <= 0) - return 1; - - return 0; -} - -void -w_usp45_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_usp45_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_45acp, AMMO_MAX_45ACP, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud4_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud1_spr, - [0,90/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_usp45 = -{ - .name = "usp", - .id = ITEM_USP45, - .slot = 1, - .slot_pos = 0, - .weight = 5, - .allow_drop = TRUE, - .draw = w_usp45_draw, - .holster = __NULL__, - .primary = w_usp45_primary, - .secondary = w_usp45_secondary, - .reload = w_usp45_reload, - .release = w_usp45_release, - .postdraw = w_usp45_hud, - .precache = w_usp45_precache, - .pickup = w_usp45_pickup, - .updateammo = w_usp45_updateammo, - .wmodel = w_usp45_wmodel, - .pmodel = w_usp45_pmodel, - .deathmsg = w_usp45_deathmsg, - .aimanim = w_usp45_aimanim, - .hudpic = w_usp45_hudpic, - .type = csweapon_ranged_type, - .isempty = w_usp45_isempty -}; - -#ifdef SERVER -void -weapon_usp45(void) -{ - Weapons_InitItem(WEAPON_USP45); -} -#endif diff --git a/src/shared/w_xm1014.qc b/src/shared/w_xm1014.qc deleted file mode 100644 index 04779ca..0000000 --- a/src/shared/w_xm1014.qc +++ /dev/null @@ -1,381 +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_xm1014 (0 0 1) (-16 -16 0) (16 16 32) - -COUNTER-STRIKE (1999) ENTITY - -Benneli XM1014 Weapon - -- Buy Menu - -Price: $3000 - --------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- -model="models/w_xm1014.mdl" -*/ - -#ifdef CLIENT -void -w_xm1014_ejectshell(void) -{ - static void w_xm1014_ejectshell_death(void) { - remove(self); - } - static void w_xm1014_ejectshell_touch(void) { - if (other == world) - Sound_Play(self, CHAN_BODY, "modelevent_shotgunshell.land"); - } - entity eShell = spawn(); - setmodel(eShell, "models/shotgunshell.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_xm1014_ejectshell_touch; - - eShell.avelocity = [0,45,900]; - eShell.think = w_xm1014_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_right * 8) + (v_up * -8)); -} -#endif - -enum -{ - XM1014_IDLE, - XM1014_SHOOT1, - XM1014_SHOOT2, - XM1014_INSERT, - XM1014_RELOAD_END, - XM1014_RELOAD_START, - XM1014_DRAW -}; - -enum -{ - XM1014S_IDLE, - XM1014S_RELOAD_START, - XM1014S_RELOAD, - XM1014S_RELOAD_END -}; - -void -w_xm1014_precache(void) -{ -#ifdef SERVER - Sound_Precache("weapon_xm1014.fire"); - Sound_Precache("weapon_xm1014.insertshell"); - precache_model("models/w_xm1014.mdl"); -#else - precache_model("models/v_xm1014.mdl"); - precache_model("models/p_xm1014.mdl"); -#endif -} - -void -w_xm1014_updateammo(player pl) -{ - Weapons_UpdateAmmo(pl, pl.xm1014_mag, pl.ammo_buckshot, -1); -} - -string -w_xm1014_wmodel(void) -{ - return "models/w_xm1014.mdl"; -} - -string -w_xm1014_pmodel(player pl) -{ - return "models/p_xm1014.mdl"; -} - -string -w_xm1014_deathmsg(void) -{ - return ""; -} - -int -w_xm1014_pickup(player pl, int new, int startammo) -{ -#ifdef SERVER - - if (new) { - if (startammo == -1) - pl.xm1014_mag = 7; - else - pl.xm1014_mag = startammo; - } else { - if (pl.ammo_buckshot < AMMO_MAX_BUCKSHOT) { - pl.ammo_buckshot = bound(0, pl.ammo_buckshot + 7, AMMO_MAX_BUCKSHOT); - } else { - return (0); - } - } -#endif - return (1); -} - -void -w_xm1014_draw(player pl) -{ - Weapons_SetModel("models/v_xm1014.mdl"); - Weapons_ViewAnimation(pl, XM1014_DRAW); - pl.mode_temp = 0; - -#ifdef CLIENT - pl.cs_cross_mindist = 9; - pl.cs_cross_deltadist = 4; - CStrikeView_UpdateGeomset(pl); -#endif -} - - -void w_xm1014_release(player pl); - -void -w_xm1014_primary(player pl) -{ - int dmg = 0; - int r = 0; - - if (pl.w_attack_next > 0.0) { - w_xm1014_release(pl); - return; - } - - /* interrupt reloading if no longer empty */ - if (pl.mode_temp == XM1014S_RELOAD && pl.xm1014_mag >= 1) { - pl.mode_temp = XM1014S_RELOAD_END; - w_xm1014_release(pl); - return; - } else if (pl.mode_temp > XM1014S_IDLE) { - w_xm1014_release(pl); - return; - } - - /* Ammo check */ - if (pl.xm1014_mag <= 0) { - w_xm1014_release(pl); - return; - } - - pl.xm1014_mag--; - - r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(pl, XM1014_SHOOT1); - break; - default: - Weapons_ViewAnimation(pl, XM1014_SHOOT2); - break; - } - - if (pl.flags & FL_CROUCHING) - Animation_PlayerTop(pl, ANIM_SHOOT_SHOTGUN, 0.45f); - else - Animation_PlayerTop(pl, ANIM_CROUCH_SHOOT_SHOTGUN, 0.45f); - -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - View_AddEvent(w_xm1014_ejectshell, 0.0f); -#else - dmg = Skill_GetValue("plr_xm1014_dmg", 22); - TraceAttack_SetPenetrationPower(0); /* shotties can't wallbang?! */ - Sound_Play(pl, CHAN_WEAPON, "weapon_xm1014.fire"); -#endif - - for (int i = 0; i < 6; i++) { - Cstrike_ShotMultiplierAdd(pl, 1, 1,1); - pl.punchangle[0] = -4 * (6 / 6); -#ifdef SERVER - TraceAttack_FireBulletsWithDecal(1, pl.origin + pl.view_ofs, dmg, [random(-1,1) * 0.1,random(-1,1) * 0.05], WEAPON_M3, "Impact.BigShot"); -#endif - } - - pl.w_attack_next = 0.25f; - pl.w_idle_next = pl.w_attack_next; -} - -void -w_xm1014_reload(player pl) -{ - - if (pl.xm1014_mag >= 7) { - return; - } - if (pl.ammo_buckshot <= 0) { - return; - } - - if (pl.mode_temp > XM1014S_IDLE) { - return; - } - pl.mode_temp = XM1014S_RELOAD_START; - pl.w_idle_next = 0.0f; -} - -void -w_xm1014_release(player pl) -{ - - w_cstrike_weaponrelease(); - - /* auto-reload if need be */ - if (pl.w_attack_next <= 0.0) - if (pl.mode_temp == XM1014S_IDLE && pl.xm1014_mag == 0 && pl.ammo_buckshot > 0) { - Weapons_Reload(pl); - return; - } - - if (pl.w_idle_next > 0.0) { - return; - } - - if (pl.mode_temp == XM1014S_RELOAD_START) { - Weapons_ViewAnimation(pl, XM1014_RELOAD_START); - pl.mode_temp = XM1014S_RELOAD; - pl.w_idle_next = 0.65f; - } else if (pl.mode_temp == XM1014S_RELOAD) { - Weapons_ViewAnimation(pl, XM1014_INSERT); - pl.xm1014_mag++; - pl.ammo_buckshot--; - w_xm1014_updateammo(pl); -#ifdef SERVER - Sound_Play(pl, CHAN_WEAPON, "weapon_xm1014.insertshell"); -#endif - if (pl.ammo_buckshot <= 0 || pl.xm1014_mag >= 7) { - pl.mode_temp = XM1014S_RELOAD_END; - } - pl.w_idle_next = 0.5f; - } else if (pl.mode_temp == XM1014S_RELOAD_END) { - Weapons_ViewAnimation(pl, XM1014_RELOAD_END); - pl.mode_temp = XM1014S_IDLE; - pl.w_idle_next = 10.0f; - pl.w_attack_next = 0.5f; - } -} - -float -w_xm1014_aimanim(player pl) -{ - return w_ak47_aimanim(pl); -} - -void -w_xm1014_hud(player pl) -{ -#ifdef CLIENT - Cstrike_DrawCrosshair(); - HUD_DrawAmmo1(); - 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/256], [24/256, 24/256], g_hud_color, pSeatLocal->m_flAmmo2Alpha, DRAWFLAG_ADDITIVE); -#endif -} - -int -w_xm1014_isempty(player pl) -{ - - if (pl.xm1014_mag <= 0 && pl.ammo_buckshot <= 0) - return 1; - - return 0; -} - -void -w_xm1014_hudpic(player pl, int selected, vector pos, float a) -{ -#ifdef CLIENT - vector hud_col; - - if (w_xm1014_isempty(pl)) - hud_col = [1,0,0]; - else - hud_col = g_hud_color; - - HUD_DrawAmmoBar(pos, pl.ammo_buckshot, AMMO_MAX_BUCKSHOT, a); - - if (selected) { - drawsubpic( - pos, - [170,45], - g_hud13_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } else { - drawsubpic( - pos, - [170,45], - g_hud12_spr, - [0,135/256], - [170/256,45/256], - hud_col, - a, - DRAWFLAG_ADDITIVE - ); - } -#endif -} - -weapon_t w_xm1014 = -{ - .name = "xm1014", - .id = ITEM_XM1014, - .slot = 0, - .slot_pos = 1, - .weight = 20, - .allow_drop = TRUE, - .draw = w_xm1014_draw, - .holster = __NULL__, - .primary = w_xm1014_primary, - .secondary = __NULL__, - .reload = w_xm1014_reload, - .release = w_xm1014_release, - .postdraw = w_xm1014_hud, - .precache = w_xm1014_precache, - .pickup = w_xm1014_pickup, - .updateammo = w_xm1014_updateammo, - .wmodel = w_xm1014_wmodel, - .pmodel = w_xm1014_pmodel, - .deathmsg = w_xm1014_deathmsg, - .aimanim = w_xm1014_aimanim, - .hudpic = w_xm1014_hudpic, - .type = csweapon_ranged_type, - .isempty = w_xm1014_isempty -}; - -#ifdef SERVER -void -weapon_xm1014(void) -{ - Weapons_InitItem(WEAPON_XM1014); -} -#endif diff --git a/src/shared/weapons.h b/src/shared/weapons.h index 0ccf943..facea3f 100644 --- a/src/shared/weapons.h +++ b/src/shared/weapons.h @@ -25,6 +25,10 @@ enum WEAPON_UMP45, WEAPON_MAC10, WEAPON_TMP, +#if defined(CZERO) || defined(CSSOURCE) + WEAPON_FAMAS, + WEAPON_GALIL, +#endif WEAPON_AK47, WEAPON_SG552, WEAPON_M4A1, diff --git a/src/shared/weapons.qc b/src/shared/weapons.qc deleted file mode 100644 index 09e9e08..0000000 --- a/src/shared/weapons.qc +++ /dev/null @@ -1,64 +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_m3, - w_xm1014, - w_mp5, - w_p90, - w_ump45, - w_mac10, - w_tmp, - w_ak47, - w_sg552, - w_m4a1, - w_aug, - w_scout, - w_awp, - w_g3sg1, - w_sg550, - w_para, - w_usp45, - w_glock18, - w_deagle, - w_p228, - w_elites, - w_fiveseven, - w_knife, - w_hegrenade, - w_flashbang, - w_smokegrenade, - w_c4bomb -}; - -int -Cstrike_WeaponToDropUponDeath(player pl) -{ - int best_weapon = WEAPON_KNIFE; /* this will never drop, so an okay default */ - - for (int i = 0; i < g_weapons.length; i++) { - if (pl.g_items & g_weapons[i].id) { - if (g_weapons[i].slot == 0) - return i; /* immediately choose this primary weapon */ - - best_weapon = i; - } - } - - return best_weapon; -} \ No newline at end of file diff --git a/src/shared/weapons_cstrike.qc b/src/shared/weapons_cstrike.qc index 5f1e4af..d53cefa 100644 --- a/src/shared/weapons_cstrike.qc +++ b/src/shared/weapons_cstrike.qc @@ -34,19 +34,19 @@ var float autocvar_fcs_guns_movement_inaccuracy = 1.0f; var float autocvar_fcs_guns_firing_inaccuracy = 1.0f; weapontype_t -csweapon_ranged_type(player pl) +csweapon_ranged_type(CSPlayer pl) { return WPNTYPE_RANGED; } weapontype_t -csweapon_melee_type(player pl) +csweapon_melee_type(CSPlayer pl) { return WPNTYPE_CLOSE; } float -Cstrike_CalculateMovementInaccuracy(player pl) { +Cstrike_CalculateMovementInaccuracy(CSPlayer pl) { float m = 1.0f; float maxspeed = 250; float speedlimit_low = maxspeed/3; @@ -61,7 +61,7 @@ Cstrike_CalculateMovementInaccuracy(player pl) { } if (!(pl.flags & FL_ONGROUND)) { m = 2.5f; - }else if (pl.flags & FL_CROUCHING) { + }else if (pl.IsCrouching()) { m *= 0.6f; } return bound(0.75f,m,2.5f); @@ -69,7 +69,7 @@ Cstrike_CalculateMovementInaccuracy(player pl) { /* called whenever a cstrike gun fires a successful shot */ void -Cstrike_ShotMultiplierAdd(player pl, float shots, float strength, float inaccuracy) +Cstrike_ShotMultiplierAdd(CSPlayer pl, float shots, float strength, float inaccuracy) { int r; inaccuracy = bound(.95,inaccuracy*50+0.1,1.6); @@ -154,7 +154,7 @@ Cstrike_ShotMultiplierAdd(player pl, float shots, float strength, float inaccura /* generate an accuracy value that we'll pass onto TraceAttack */ float -Cstrike_CalculateAccuracy(player pl, float divisor, float movement_penalty=1) +Cstrike_CalculateAccuracy(CSPlayer pl, float divisor, float movement_penalty=1) { float inacc = 0; float m = Cstrike_CalculateMovementInaccuracy(pl); @@ -179,12 +179,12 @@ Cstrike_CalculateAccuracy(player pl, float divisor, float movement_penalty=1) void -Cstrike_BulletRecoil_ApplyPre(player pl, float strength) { +Cstrike_BulletRecoil_ApplyPre(CSPlayer pl, float strength) { strength *= autocvar_fcs_guns_recoil_strength; pl.v_angle += strength*pl.punchangle*(2 - pl.cs_shotmultiplier/100*0.2); } void -Cstrike_BulletRecoil_ApplyPost(player pl, float strength) { +Cstrike_BulletRecoil_ApplyPost(CSPlayer pl, float strength) { strength *= autocvar_fcs_guns_recoil_strength; pl.v_angle -= strength*pl.punchangle*(2 - pl.cs_shotmultiplier/100*0.2); } @@ -192,7 +192,7 @@ Cstrike_BulletRecoil_ApplyPost(player pl, float strength) { /* called whenever cstrike guns aren't firing */ void -Cstrike_ShotMultiplierUpdate(player pl) +Cstrike_ShotMultiplierUpdate(CSPlayer pl) { if ((pl.cs_shotmultiplier > 0) && (pl.cs_shottime <= 0.0f)) { pl.cs_shottime = pl.w_attack_next + 0.01; @@ -203,29 +203,28 @@ Cstrike_ShotMultiplierUpdate(player pl) } void -Cstrike_ShotReset(player pl) +Cstrike_ShotReset(CSPlayer pl) { pl.cs_shottime = 0.0f; pl.cs_shotmultiplier = 0; } void -w_cstrike_weaponrelease(void) +w_cstrike_weaponrelease(CSPlayer pl) { - player pl = (player)self; - pl.punchangle[1] *= 0.95; + //pl.punchangle[1] *= 0.95; Cstrike_ShotMultiplierUpdate(pl); } void -w_cstrke_switched(player pl) +w_cstrke_switched(CSPlayer pl) { Cstrike_ShotReset(pl); } #ifdef CLIENT void -CStrikeView_UpdateGeomset(player pl) +CStrikeView_UpdateGeomset(CSPlayer pl) { if (getplayerkeyfloat(pl.entnum-1, "*team") == TEAM_CT) { setcustomskin(pSeat->m_eViewModel, "", "geomset 0 2\ngeomset 1 1\n"); diff --git a/zpak001.pk3dir/PAK_NAME b/zpak001.pk3dir/PAK_NAME new file mode 100644 index 0000000..94f8520 --- /dev/null +++ b/zpak001.pk3dir/PAK_NAME @@ -0,0 +1 @@ +package_cstrike.pk3 diff --git a/zpak001.pk3dir/cfg/skill_cstrike.cfg b/zpak001.pk3dir/cfg/skill_cstrike.cfg index 196a170..2afe7e7 100644 --- a/zpak001.pk3dir/cfg/skill_cstrike.cfg +++ b/zpak001.pk3dir/cfg/skill_cstrike.cfg @@ -2,6 +2,10 @@ // this is so that users can tweak all the stuff we mostly guessed // and can make it more like how they want it to behave. +set sk_hostage_health1 100 +set sk_hostage_health2 100 +set sk_hostage_health3 100 + // knife: primary attack range set sk_plr_knife_range1 48 set sk_plr_knife_range2 48 @@ -177,7 +181,7 @@ set sk_plr_awp_dmg1 115 set sk_plr_awp_dmg2 115 set sk_plr_awp_dmg3 115 -// para: bullet damage -set sk_plr_para_dmg1 35 -set sk_plr_para_dmg2 35 -set sk_plr_para_dmg3 35 \ No newline at end of file +// m249: bullet damage +set sk_plr_m249_dmg1 35 +set sk_plr_m249_dmg2 35 +set sk_plr_m249_dmg3 35 diff --git a/zpak001.pk3dir/csprogs.dat.en.po b/zpak001.pk3dir/csprogs.dat.default.po old mode 100755 new mode 100644 similarity index 93% rename from zpak001.pk3dir/csprogs.dat.en.po rename to zpak001.pk3dir/csprogs.dat.default.po index 36dad96..240e4e8 --- a/zpak001.pk3dir/csprogs.dat.en.po +++ b/zpak001.pk3dir/csprogs.dat.default.po @@ -1,21 +1,4 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-21 15:30+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" +# English (Default) Locale file msgid "VGUI_TITLE_MOTD" msgstr "Message Of The Day" diff --git a/zpak001.pk3dir/def/ammo.def b/zpak001.pk3dir/def/ammo.def new file mode 100644 index 0000000..f4bc7ee --- /dev/null +++ b/zpak001.pk3dir/def/ammo.def @@ -0,0 +1,116 @@ +// these have to be defined by the game. +entityDef ammo_types { + "ammo_none" "0" + "ammo_338magnum" "1" + "ammo_357sig" "2" + "ammo_45acp" "3" + "ammo_50ae" "4" + "ammo_556nato" "5" + "ammo_556natobox" "6" + "ammo_57mm" "7" + "ammo_762nato" "8" + "ammo_9mm" "9" + "ammo_buckshot" "10" + "ammo_hegrenade" "11" + "ammo_smokegrenade" "12" + "ammo_flashbang" "13" +} + +entityDef ammo_names { + "ammo_none" "None" + "ammo_338magnum" ".338 Lapua Magnum" + "ammo_357sig" ".357 SIG" + "ammo_45acp" ".45 ACP" + "ammo_50ae" ".50 Action Express" + "ammo_556nato" "5.56×45mm NATO" + "ammo_556natobox" "5.56×45mm NATO BOX" + "ammo_57mm" "FN 5.7×28mm" + "ammo_762nato" "7.62×51mm NATO" + "ammo_9mm" "9×19mm Parabellum" + "ammo_buckshot" "Buckshot" + "ammo_hegrenade" "HE Grenade" + "ammo_smokegrenade" "Smoke Grenade" + "ammo_flashbang" "Flashbang" +} + +entityDef ammo_base +{ + "spawnclass" "NSItem" + "snd_acquire" "ammo.pickup" + "snd_respawn" "ammo.respawn" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "model" "models/w_backpack.mdl" +} + +// these don't exist as pickups in the game, but +// might be helpful nonetheless +entityDef ammo_338magnum +{ + "editor_usage" "Ammo used by weapon_awp" + "inherit" "ammo_base" + "inv_ammo_338magnum" "10" +} + +entityDef ammo_357sig +{ + "editor_usage" "Ammo used by weapon_p228" + "inherit" "ammo_base" + "inv_ammo_357sig" "13" +} + +entityDef ammo_45acp +{ + "editor_usage" "Ammo used by weapon_mac10, weapon_ump45, weapon_usp45" + "inherit" "ammo_base" + "inv_ammo_45acp" "12" +} + +entityDef ammo_50ae +{ + "editor_usage" "Ammo used by weapon_deagle" + "inherit" "ammo_base" + "inv_ammo_50ae" "7" +} + +entityDef ammo_556nato +{ + "editor_usage" "Ammo used by weapon_m4a1, weapon_sg550, weapon_sg552" + "inherit" "ammo_base" + "inv_ammo_556nato" "30" +} + +entityDef ammo_556natobox +{ + "editor_usage" "Ammo used by weapon_m249" + "inherit" "ammo_base" + "inv_ammo_556natobox" "30" +} + +entityDef ammo_57mm +{ + "editor_usage" "Ammo used by weapon_fiveseven, weapon_p90" + "inherit" "ammo_base" + "inv_ammo_57mm" "50" +} + +entityDef ammo_762nato +{ + "editor_usage" "Ammo used by weapon_aug, weapon_famas, weapon_g3sg1, weapon_galil, weapon_ak47, weapon_scout" + "inherit" "ammo_base" + "inv_ammo_762nato" "30" +} + +entityDef ammo_9mm +{ + "editor_usage" "Ammo used by weapon_elites, weapon_glock18, weapon_mp5navy, weapon_tmp" + "inherit" "ammo_base" + "inv_ammo_9mm" "30" +} + +entityDef ammo_buckshot +{ + "editor_usage" "Ammo used by weapon_m3, weapon_xm1014" + "inherit" "ammo_base" + "inv_ammo_buckshot" "8" +} diff --git a/zpak001.pk3dir/def/bot.def b/zpak001.pk3dir/def/bot.def deleted file mode 100644 index 7fbc892..0000000 --- a/zpak001.pk3dir/def/bot.def +++ /dev/null @@ -1,4 +0,0 @@ -entityDef bot -{ - spawnclass csbot -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/hostage.def b/zpak001.pk3dir/def/hostage.def new file mode 100644 index 0000000..5d92a55 --- /dev/null +++ b/zpak001.pk3dir/def/hostage.def @@ -0,0 +1,16 @@ +entityDef hostage_entity +{ + "spawnclass" "CSHostage" + "model" "models/hostage.mdl" + "netname" "Hostage" + "health" "skill:hostage_health" + "mins" "-16 -16 0" + "maxs" "16 16 72" + "eye_height" "64" + "team" "0" + "propdata" "actor_human" + + "follow_on_use" "1" + "speed_walk" "64" + "speed_run" "364" +} diff --git a/zpak001.pk3dir/def/item_c4.def b/zpak001.pk3dir/def/item_c4.def new file mode 100644 index 0000000..5f3bf2b --- /dev/null +++ b/zpak001.pk3dir/def/item_c4.def @@ -0,0 +1,12 @@ +entityDef item_c4 +{ + "spawnclass" "CSBombEntity" + "model" "models/w_c4.mdl" + "model_led" "sprites/ledglow.spr" + "snd_beep1" "weapon_c4bomb.beep1" + "snd_beep2" "weapon_c4bomb.beep2" + "snd_beep3" "weapon_c4bomb.beep3" + "snd_beep4" "weapon_c4bomb.beep4" + "snd_beep5" "weapon_c4bomb.beep5" + "snd_planted" "c4.plant" +} diff --git a/zpak001.pk3dir/def/player.def b/zpak001.pk3dir/def/player.def new file mode 100644 index 0000000..bb234ef --- /dev/null +++ b/zpak001.pk3dir/def/player.def @@ -0,0 +1,4 @@ +entityDef player +{ + "spawnclass" "CSPlayer" +} diff --git a/zpak001.pk3dir/def/spawns.def b/zpak001.pk3dir/def/spawns.def new file mode 100644 index 0000000..7ca23f6 --- /dev/null +++ b/zpak001.pk3dir/def/spawns.def @@ -0,0 +1,26 @@ +entityDef info_player_start +{ + "editor_mins" "-16 -16 -36" + "editor_maxs" "16 16 36" + "editor_description" "Singleplayer Spawn Point" + "editor_color" "1 0 0" + "spawnclass" "NSSpawnPoint" +} + +entityDef info_player_deathmatch +{ + "editor_mins" "-16 -16 -36" + "editor_maxs" "16 16 36" + "editor_description" "Deathmatch Spawn Point" + "editor_color" "1 0 0" + "spawnclass" "NSSpawnPoint" +} + +entityDef info_player_coop +{ + "editor_mins" "-16 -16 -36" + "editor_maxs" "16 16 36" + "editor_description" "Cooperative Spawn Point" + "editor_color" "1 0 0" + "spawnclass" "NSSpawnPoint" +} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapons.def b/zpak001.pk3dir/def/weapons.def index e69de29..62590c0 100644 --- a/zpak001.pk3dir/def/weapons.def +++ b/zpak001.pk3dir/def/weapons.def @@ -0,0 +1,76 @@ +#include "weapons/ak47.def" +#include "weapons/aug.def" +#include "weapons/awp.def" +#include "weapons/c4.def" +#include "weapons/deagle.def" +#include "weapons/elites.def" +#include "weapons/famas.def" +#include "weapons/fiveseven.def" +#include "weapons/flashbang.def" +#include "weapons/g3sg1.def" +#include "weapons/galil.def" +#include "weapons/glock18.def" +#include "weapons/hegrenade.def" +#include "weapons/knife.def" +#include "weapons/m249.def" +#include "weapons/m3.def" +#include "weapons/m4a1.def" +#include "weapons/mac10.def" +#include "weapons/mp5navy.def" +#include "weapons/p228.def" +#include "weapons/p90.def" +#include "weapons/scout.def" +#include "weapons/sg550.def" +#include "weapons/sg552.def" +#include "weapons/smokegrenade.def" +#include "weapons/tmp.def" +#include "weapons/ump45.def" +#include "weapons/usp.def" +#include "weapons/xm1014.def" + +entityDef CSBaseMelee +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "snd_acquire" "Player.PickupWeapon" +} + +entityDef CSBasePistol +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "semiAuto" "1" + "snd_acquire" "Player.PickupWeapon" + "snd_empty" "Default.ClipEmpty_Pistol" +} + +entityDef CSBaseRifle +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "snd_acquire" "Player.PickupWeapon" + "snd_empty" "Default.ClipEmpty_Rifle" +} + +entityDef CSBaseShotgun +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "snd_acquire" "Player.PickupWeapon" +} diff --git a/zpak001.pk3dir/def/weapons/ak47.def b/zpak001.pk3dir/def/weapons/ak47.def new file mode 100644 index 0000000..d14fd50 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/ak47.def @@ -0,0 +1,54 @@ +entityDef weapon_ak47 +{ + "inherit" "CSBaseRifle" + "editor_usage" "AK-47 Weapon - Uses ammo_762nato" + + "model" "models/w_ak47.mdl" + "model_view" "models/v_ak47.mdl" + + "inv_name" "AK-47 Weapon" + "def_fireInfo" "fireInfo_ak47" + "clipSize" "30" + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_AK47.Single" + + "speed_mod" "0.884" + "price" "2500" + "crossMinDist" "4" + "crossDeltaDist" "4" + "accuracyDivisor" "30" + "accuracyMovementPenalty" "3" + "accuracyMultiplier" "1.5" + "rangeModifier" "2.375" + "penetrationPower" "1.0" + "bulletStrength" "1.2" + "multiplierShots" "1.1" + "multiplierStrength" "0.92" + "multiplierInaccuracy" "0.5" + + "hudSlot" "0" + "hudSlotPos" "7" + "weight" "25" +} + +entityDef projectile_ak47 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_ak47_dmg" +} + +entityDef fireInfo_ak47 +{ + "def_onFire" "projectile_ak47" + "ammoType" "ammo_762nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" ".0975" + "punchAngle" "-2 0 0" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/aug.def b/zpak001.pk3dir/def/weapons/aug.def new file mode 100644 index 0000000..795c19b --- /dev/null +++ b/zpak001.pk3dir/def/weapons/aug.def @@ -0,0 +1,54 @@ +entityDef weapon_aug +{ + "inherit" "CSBaseRifle" + "editor_usage" "Steyr AUG Weapon - Uses ammo_762nato" + + "model" "models/w_aug.mdl" + "model_view" "models/v_aug.mdl" + + "inv_name" "Steyr AUG Weapon" + "def_fireInfo" "fireInfo_aug" + "clipSize" "30" + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_AUG.Single" + + "speed_mod" "0.96" + "price" "3500" + "crossMinDist" "3" + "crossDeltaDist" "3" + "accuracyDivisor" "35" + "accuracyMovementPenalty" "2" + "accuracyMultiplier" "1" + "rangeModifier" "2.125" + "penetrationPower" "1.0" + "bulletStrength" "1.03" + "multiplierShots" "1.1" + "multiplierStrength" "1.1" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "10" + "weight" "25" +} + +entityDef projectile_aug +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_aug_dmg" +} + +entityDef fireInfo_aug +{ + "def_onFire" "projectile_aug" + "ammoType" "ammo_762nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.0825f" + "punchAngle" "-2 0 0" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/awp.def b/zpak001.pk3dir/def/weapons/awp.def new file mode 100644 index 0000000..3cb1a50 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/awp.def @@ -0,0 +1,64 @@ +entityDef weapon_awp +{ + "inherit" "CSBaseRifle" + "editor_usage" "AWP (AI Arctic Warfare/Magnum) Weapon - Uses ammo_338magnum" + + "model" "models/w_awp.mdl" + "model_view" "models/v_awp.mdl" + + "inv_name" "AWP (AI Arctic Warfare/Magnum) Weapon" + "def_fireInfo" "fireInfo_awp" + "clipSize" "5" + + "actFire" "1,2,3" + "actAltFire" "" + "actHolster" "" + "actReload" "4" + "actDraw" "5" + "actIdle" "0" + + "snd_fire" "Weapon_AWP.Single" + + "speed_mod" "0.84" + "price" "4750" + "crossMinDist" "8" + "crossDeltaDist" "3" + "accuracyDivisor" "-1" + "accuracyMovementPenalty" "1" + "accuracyMultiplier" "1" + "rangeModifier" "1.375" + "penetrationPower" "2.0" + "bulletStrength" "1" + "multiplierShots" "1.0" + "multiplierStrength" "1.0" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "12" + "weight" "30" + + "zoomDuration" "0.075" + "zoomFov" "20" + "zoomFovStep" "5" + "zoomFovMin" "5" + "zoomFovMax" "40" + "snd_raise_scope" "Default.Zoom" + "snd_lower_scope" "Default.Zoom" +} + +entityDef projectile_awp +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_awp_dmg" +} + +entityDef fireInfo_awp +{ + "def_onFire" "projectile_awp" + "ammoType" "ammo_338magnum" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "1.2" + "punchAngle" "-5 0 0" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/c4.def b/zpak001.pk3dir/def/weapons/c4.def new file mode 100644 index 0000000..52ceac3 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/c4.def @@ -0,0 +1,33 @@ +entityDef weapon_c4 +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_usage" "C4 Bomb Weapon, Bomb Defusal Gamemode Entity" + "editor_rotatable" "1" + + "spawnclass" "CSWeapon" + "model" "models/w_backpack.mdl" + "model_view" "models/v_c4.mdl" + "snd_acquire" "weapon.pickup" + "snd_respawn" "item.respawn" + + "def_plant" "item_c4" + "inv_name" "C4 Bomb Weapon" + "clipSize" "1" + "trigger_delay" "3" // takes three seconds to charge + + "actFire" "2" + "actDraw" "1" + "actIdle" "0" + "actDelay" "3" + + "snd_fire" "C4.PlantSound" + + "speed_mod" "1.0" + + "hudSlot" "4" + "hudSlotPos" "0" + "weight" "0" + "team" "1" // Terrorists only! +} diff --git a/zpak001.pk3dir/def/weapons/deagle.def b/zpak001.pk3dir/def/weapons/deagle.def new file mode 100644 index 0000000..9ff23a9 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/deagle.def @@ -0,0 +1,55 @@ +entityDef weapon_deagle +{ + "inherit" "CSBasePistol" + "editor_usage" "Desert Eagle .50 AE Weapon - Uses ammo_50ae" + "model" "models/w_deagle.mdl" + "model_view" "models/v_deagle.mdl" + + "inv_name" "Desert Eagle .50 AE Weapon" + "def_fireInfo" "fireInfo_deagle" + "clipSize" "7" + + "actFire" "1,2" + "actFireLast" "3" + "actReload" "4" + "actDraw" "5" + "actIdle" "0" + + "snd_fire" "Weapon_DEagle.Single" + + "speed_mod" "1.0" + "price" "650" + + "crossMinDist" "8" + "crossDeltaDist" "3" + "accuracyDivisor" "55" + "accuracyMovementPenalty" "1.5" + "accuracyMultiplier" "1.0" + "accuracyAdd" "0.005" + "rangeModifier" "1.875" + "penetrationPower" "1.0" + "bulletStrength" "0.5" + "multiplierShots" "10" + "multiplierStrength" "0.35" + "multiplierInaccuracy" "0.5" + + "hudSlot" "1" + "hudSlotPos" "2" + "weight" "7" +} + +entityDef projectile_deagle +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_deagle_dmg" +} + +entityDef fireInfo_deagle +{ + "def_onFire" "projectile_deagle" + "ammoType" "ammo_50ae" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.2" + "model_flash" "sprites/muzzleflash2.spr" +} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapons/elites.def b/zpak001.pk3dir/def/weapons/elites.def new file mode 100644 index 0000000..45a2e36 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/elites.def @@ -0,0 +1,66 @@ +entityDef weapon_elites +{ + "inherit" "CSBasePistol" + "editor_usage" "Dual Beretta 96G (Elites) Weapon - Uses ammo_9mm" + + "model" "models/w_elite.mdl" + "model_view" "models/v_elite.mdl" + + "inv_name" "Dual Beretta 96G (Elites) Weapon" + "def_fireInfo" "fireInfo_elites" + "def_altFireInfo" "fireInfo_elites_alt" + "clipSize" "30" + + "actFire" "2,3,4,5,6" + "actFireLast" "7" + "actReload" "14" + "actDraw" "15" + "actIdle" "0" + + "snd_fire" "Weapon_ELITE.Single" + "snd_altfire" "Weapon_ELITE.Single" + + "altAlternates" "1" + "speed_mod" "1.0" + "price" "1000" + "crossMinDist" "4" + "crossDeltaDist" "3" + "accuracyDivisor" "150" + "accuracyMovementPenalty" "1" + "accuracyMultiplier" "1" + "accuracyAdd" "0.002" + "rangeModifier" "1.875" + "penetrationPower" "1.0" + "bulletStrength" "0.9" + "multiplierShots" "3" + "multiplierStrength" "0.85" + "multiplierInaccuracy" "1.0" + + "hudSlot" "1" + "hudSlotPos" "4" + "weight" "5" +} + +entityDef projectile_elites +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_elites_dmg" +} + +entityDef fireInfo_elites +{ + "def_onFire" "projectile_elites" + "ammoType" "ammo_9mm" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.13" + "punchAngle" "-2 0 0" + "model_flash" "sprites/muzzleflash2.spr" +} + +entityDef fireInfo_elites_alt +{ + "inherit" "fireInfo_elites" + "actFire" "8,9,10,11,12" + "actFireLast" "13" +} diff --git a/zpak001.pk3dir/def/weapons/fiveseven.def b/zpak001.pk3dir/def/weapons/fiveseven.def new file mode 100644 index 0000000..6bc86de --- /dev/null +++ b/zpak001.pk3dir/def/weapons/fiveseven.def @@ -0,0 +1,57 @@ +entityDef weapon_fiveseven +{ + "inherit" "CSBasePistol" + "editor_usage" "Five-SeveN Weapon - Uses ammo_57mm" + + "model" "models/w_fiveseven.mdl" + "model_view" "models/v_fiveseven.mdl" + + "inv_name" "Five-SeveN Weapon" + "def_fireInfo" "fireInfo_fiveseven" + "clipSize" "20" + + "actFire" "1,2" + "actFireLast" "3" + "actReload" "4" + "actDraw" "5" + "actIdle" "0" + + + "snd_fire" "Weapon_FiveSeven.Single" + + "speed_mod" "1.0" + "price" "750" + "crossMinDist" "8" + "crossDeltaDist" "3" + "accuracyDivisor" "200" + "accuracyMovementPenalty" "1.4" + "accuracyMultiplier" "1" + "accuracyAdd" "0.0055" + "rangeModifier" "1.875" + "penetrationPower" "1.0" + "bulletStrength" "0.5" + "multiplierShots" "10" + "multiplierStrength" "0.4" + "multiplierInaccuracy" "1.0" + + "hudSlot" "1" + "hudSlotPos" "5" + "weight" "5" +} + +entityDef projectile_fiveseven +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_fiveseven_dmg" +} + +entityDef fireInfo_fiveseven +{ + "def_onFire" "projectile_fiveseven" + "ammoType" "ammo_57mm" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.155" + "punchAngle" "-2 0 0" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/flashbang.def b/zpak001.pk3dir/def/weapons/flashbang.def new file mode 100644 index 0000000..a026c1b --- /dev/null +++ b/zpak001.pk3dir/def/weapons/flashbang.def @@ -0,0 +1,46 @@ +entityDef weapon_flashbang +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_usage" "Flashbang" + "editor_rotatable" "1" + + "spawnclass" "CSWeapon" + "model" "models/w_flashbang.mdl" + "model_view" "models/v_flashbang.mdl" + "snd_acquire" "weapon.pickup" + "snd_respawn" "item.respawn" + + "def_onFire" "projectile_flashgrenade" + "inv_name" "Flashbang" + "ammoType" "ammo_flashbang" + "ammoRequired" "1" + "silent_fire" "1" + "primed_fuse" "4" + + "actIdle" "0" + "actDraw" "3" + "actPull" "1" + "actThrow" "2" + + "hudSlot" "3" + "hudSlotPos" "1" +} + +entityDef projectile_flashgrenade +{ + "spawnclass" "CSProjectile" + "model" "models/w_smokegrenade.mdl" + "frame" "1" + "fuse" "4" + "detonate_on_fuse" "1" + "bounce" "1" + "angular_velocity" "-350 0 0" + + "snd_explode" "Flashbang.Explode" + "snd_bounce" "Flashbang.Bounce" + "decal_detonate" "ExplosionScorch" + + "flashTime" "4" +} diff --git a/zpak001.pk3dir/def/weapons/g3sg1.def b/zpak001.pk3dir/def/weapons/g3sg1.def new file mode 100644 index 0000000..924149b --- /dev/null +++ b/zpak001.pk3dir/def/weapons/g3sg1.def @@ -0,0 +1,54 @@ +entityDef weapon_g3sg1 +{ + "inherit" "CSBaseRifle" + "editor_usage" "Heckler & Koch G3/SG-1 Weapon - Uses ammo_762nato" + + "model" "models/w_g3sg1.mdl" + "model_view" "models/v_g3sg1.mdl" + + "inv_name" "Heckler & Koch G3/SG-1 Weapon" + "def_fireInfo" "fireInfo_g3sg1" + "clipSize" "20" + + "actFire" "1,2" + "actReload" "3" + "actDraw" "4" + "actIdle" "0" + + "snd_fire" "Weapon_G3SG1.Single" + + "speed_mod" "0.84" + "price" "5000" + + "crossMinDist" "6" + "crossDeltaDist" "4" + "accuracyDivisor" "200" + "accuracyMovementPenalty" "1" + "accuracyMultiplier" "1" + "rangeModifier" "2.375" + "penetrationPower" "1.0" + "bulletStrength" "" + "multiplierShots" "1.0" + "multiplierStrength" "1.0" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "13" + "weight" "25" +} + +entityDef projectile_g3sg1 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_g3sg1_dmg" +} + +entityDef fireInfo_g3sg1 +{ + "def_onFire" "projectile_g3sg1" + "ammoType" "ammo_762nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.25" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/glock18.def b/zpak001.pk3dir/def/weapons/glock18.def new file mode 100644 index 0000000..7a6d8c7 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/glock18.def @@ -0,0 +1,65 @@ +entityDef weapon_glock18 +{ + "inherit" "CSBasePistol" + "editor_usage" "Glock 18 Select Fire Weapon - Uses ammo_9mm" + + "model" "models/w_glock18.mdl" + "model_view" "models/v_glock18.mdl" + + "inv_name" "Glock 18 Select Fire Weapon" + "def_fireInfo" "fireInfo_glock18" + "def_altFireInfo" "fireInfo_altglock18" + "clipSize" "20" + "ammoRequired" "1" + "model_flash" "sprites/muzzleflash2.spr" + + "actFire" "5" + "actFireLast" "6" + "actHolster" "9" + "actReload" "7,12" + "actDraw" "9,11" + "actIdle" "0,1,2" + + "snd_fire" "Weapon_Glock.Single" + + "speed_mod" "1.0" + "price" "400" + + "crossMinDist" "8.0" + "crossDeltaDist" "3.0" + "accuracyMovementPenalty" "1.2" + "accuracyMultiplier" "1" + "rangeModifier" "1.25" + "penetrationPower" "1.0" + "bulletStrength" "0.6" + "multiplierShots" "2.0" + "multiplierStrength" "0.7" + "multiplierInaccuracy" "1.0" +} + +entityDef projectile_glock +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_glock18_dmg" +} + +entityDef fireInfo_glock18 +{ + "def_onFire" "projectile_glock" + "ammoType" "ammo_9mm" + "ammoPerShot" "1" + "fireRate" "0.13" + "accuracyDivisor" "120" +} + +entityDef fireInfo_altglock18 +{ + "def_onFire" "projectile_glock" + "ammoType" "ammo_9mm" + "ammoPerShot" "3" + "numProjectiles" "3" + "fireRate" "0.5" + "accuracyDivisor" "75" + "actFire" "3,4" + "snd_fire" "Weapon_Glock.Burst" +} diff --git a/zpak001.pk3dir/def/weapons/hegrenade.def b/zpak001.pk3dir/def/weapons/hegrenade.def new file mode 100644 index 0000000..8dc0d46 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/hegrenade.def @@ -0,0 +1,63 @@ + +entityDef weapon_hegrenade +{ + "inherit" "CSBasePistol" + "editor_usage" "HE Grenade" + + "model" "models/w_hegrenade.mdl" + "model_view" "models/v_hegrenade.mdl" + + "inv_name" "HE Grenade" + "inv_ammo_hegrenade" "5" + "def_onFire" "projectile_handgrenade" + "def_explode_inhand" "env_handgrenade_explodeinhand" + "def_damage_inhand" "damage_handgrenadeSplash" + "ammoType" "ammo_hegrenade" + "ammoRequired" "1" + "silent_fire" "1" + "primed_fuse" "4" + + "actIdle" "0" + "actDraw" "3" + "actPull" "1" + "actThrow" "2" + + // HLWeapon specific + "hudSlot" "3" + "hudSlotPos" "0" +} + +entityDef projectile_handgrenade +{ + "spawnclass" "NSProjectile" + "model" "models/w_grenade.mdl" + "frame" "1" + "fuse" "4" + "detonate_on_fuse" "1" + "bounce" "1" + "angular_velocity" "-350 0 0" + "model_detonate" "fx_explosion.main" + "snd_explode" "fx.explosion" + "snd_bounce" "weapon_handgrenade.bounce" + "decal_detonate" "ExplosionScorch" + + "def_damage" "damage_handgrenadeDirect" + "def_splash_damage" "damage_handgrenadeSplash" +} + +entityDef damage_handgrenadeDirect +{ + "damage" "1" +} + +entityDef damage_handgrenadeSplash +{ + "damage" "skill:plr_hand_grenade" + "radius" "250" +} + +entityDef env_handgrenade_explodeinhand +{ + "spawnclass" "idAnimatedEntity" + "model" "grenadeExplosion.prt" +} diff --git a/zpak001.pk3dir/def/weapons/knife.def b/zpak001.pk3dir/def/weapons/knife.def new file mode 100644 index 0000000..5cb2118 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/knife.def @@ -0,0 +1,40 @@ +entityDef weapon_knife +{ + "inherit" "CSBaseMelee" + "editor_usage" "Knife Weapon" + + "model" "models/w_knife.mdl" + "model_view" "models/v_knife.mdl" + + // weapon specific + "def_melee" "damage_knife" + "melee_distance" "48" + "inv_name" "Knife Weapon" + "clipSize" "6" + "ammoType" "" + "ammoRequired" "0" + "clipSize" "0" + "silent_fire" "1" + + "meleeRateMiss" "0.7" + "meleeRateHit" "0.7" + + "actIdle" "0" + "actDraw" "3" + "actMeleeMiss" "1,2" + "actMeleeHit" "1,2" + + "hudSlot" "2" + "hudSlotPos" "0" +} + +entityDef damage_knife +{ + "damage" "skill:plr_knife" +// "kickDir" "-1 0 0" +// "knockback" "20" +// "push" "20000" + + "snd_hit" "Weapon_Knife.Hit" + "snd_miss" "Weapon_Knife.Slash" +} diff --git a/zpak001.pk3dir/def/weapons/m249.def b/zpak001.pk3dir/def/weapons/m249.def new file mode 100644 index 0000000..1605b0d --- /dev/null +++ b/zpak001.pk3dir/def/weapons/m249.def @@ -0,0 +1,54 @@ +entityDef weapon_m249 +{ + "inherit" "CSBaseRifle" + "editor_usage" "FN M249 Para Weapon - Uses ammo_556natobox" + + "model" "models/w_m249.mdl" + "model_view" "models/v_m249.mdl" + + "inv_name" "FN M249 Para Weapon" + "def_fireInfo" "fireInfo_m249" + "clipSize" "100" + + "actFire" "1,2" + "actReload" "3" + "actDraw" "4" + "actIdle" "0" + + "snd_fire" "Weapon_M249.Single" + + "speed_mod" "0.88" + "price" "5750" + + "crossMinDist" "6" + "crossDeltaDist" "3" + "accuracyDivisor" "70" + "accuracyMovementPenalty" "3" + "accuracyMultiplier" "1" + "rangeModifier" "2.125" + "penetrationPower" "1.0" + "bulletStrength" "1.0" + "multiplierShots" "1.0" + "multiplierStrength" "1.0" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "15" + "weight" "25" +} + +entityDef projectile_m249 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_m249_dmg" +} + +entityDef fireInfo_m249 +{ + "def_onFire" "projectile_m249" + "ammoType" "ammo_556natobox" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.1" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/m3.def b/zpak001.pk3dir/def/weapons/m3.def new file mode 100644 index 0000000..5f2a50c --- /dev/null +++ b/zpak001.pk3dir/def/weapons/m3.def @@ -0,0 +1,57 @@ +entityDef weapon_m3 +{ + "inherit" "CSBaseShotgun" + "editor_usage" "Benneli M3 Super90 Weapon - Uses ammo_buckshot" + + "model" "models/w_m3.mdl" + "model_view" "models/v_m3.mdl" + + "inv_name" "Benneli M3 Super90 Weapon" + "def_fireInfo" "fireInfo_m3" + "clipSize" "8" + + "actFire" "1,2" + "actReloadStart" "5" + "actReload" "3" + "actReloadEnd" "4" + "actDraw" "6" + "actIdle" "0" + + "snd_fire" "Weapon_M3.Single" + + "speed_mod" "0.92" + "price" "1700" + "crossMinDist" "" + "crossDeltaDist" "" + "accuracyDivisor" "" + "accuracyMovementPenalty" "" + "accuracyMultiplier" "" + "rangeModifier" "" + "penetrationPower" "0" + "bulletStrength" "" + "multiplierShots" "" + "multiplierStrength" "" + "multiplierInaccuracy" "" + + "hudSlot" "0" + "hudSlotPos" "0" + "weight" "20" +} + +entityDef projectile_m3 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_m3_dmg" +} + +entityDef fireInfo_m3 +{ + "def_onFire" "projectile_m3" + "ammoType" "ammo_buckshot" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "1.0" + "punchAngle" "-2 0 0" + "model_flash" "sprites/muzzleflash2.spr" + "numProjectiles" "9" +} diff --git a/zpak001.pk3dir/def/weapons/m4a1.def b/zpak001.pk3dir/def/weapons/m4a1.def new file mode 100644 index 0000000..0b01711 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/m4a1.def @@ -0,0 +1,70 @@ +entityDef weapon_m4a1 +{ + "inherit" "CSBaseRifle" + "editor_usage" "Colt M4A1 Carbine Weapon - Uses ammo_556nato" + + "model" "models/w_m4a1.mdl" + "model_view" "models/v_m4a1.mdl" + + "inv_name" "Colt M4A1 Carbine Weapon" + "def_fireInfo" "fireInfo_m4a1" + "def_altFireInfo" "fireInfo_m4a1_silenced" + "clipSize" "30" + "ammoType" "ammo_556nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.0875" + + "altSilences" "1" + "actAddSil" "6" + "actDetachSil" "13" + + // Unsilenced + "actFire" "8,9,10" + "actReload" "11" + "actDraw" "12" + "actIdle" "7" + "snd_fire" "Weapon_M4A1.Single" + + + "speed_mod" "0.92" + "price" "3100" + + "crossMinDist" "4.0" + "crossDeltaDist" "3.0" + "accuracyDivisor" "60" + "accuracyMovementPenalty" "3" + "accuracyMultiplier" "1" + "rangeModifier" "2.125" + "penetrationPower" "1.0" + "bulletStrength" "0.96" + "multiplierShots" "0.8" + "multiplierStrength" "1.025" + "multiplierInaccuracy" "0.8" + + "hudSlot" "0" + "hudSlotPos" "9" + "weight" "25" +} + +entityDef projectile_m4a1 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_m4a1_dmg" +} + +entityDef fireInfo_m4a1 +{ + "def_onFire" "projectile_m4a1" + "model_flash" "sprites/muzzleflash2.spr" +} + +entityDef fireInfo_m4a1_silenced +{ + "inherit" "fireInfo_m4a1" + "actFire" "1,2,3" + "actReload" "4" + "actDraw" "5" + "actIdle" "0" + "snd_fire" "Weapon_M4A1.Silenced" +} diff --git a/zpak001.pk3dir/def/weapons/mac10.def b/zpak001.pk3dir/def/weapons/mac10.def new file mode 100644 index 0000000..eb7d2ea --- /dev/null +++ b/zpak001.pk3dir/def/weapons/mac10.def @@ -0,0 +1,55 @@ +entityDef weapon_mac10 +{ + "inherit" "CSBaseRifle" + "editor_usage" "Ingram MAC-10 Weapon - Used ammo_45acp" + + "model" "models/w_mac10.mdl" + "model_view" "models/v_mac10.mdl" + + "inv_name" "Ingram MAC-10 Weapon" + "def_fireInfo" "fireInfo_mac10" + "clipSize" "30" + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_MAC10.Single" + + "speed_mod" "1.0" + "price" "1400" + + "crossMinDist" "9" + "crossDeltaDist" "3" + "accuracyDivisor" "50" + "accuracyMovementPenalty" "0.8" + "accuracyMultiplier" "1" + "accuracyAdd" "0.0095" + "rangeModifier" "1.25" + "penetrationPower" "1.0" + "bulletStrength" "1.115" + "multiplierShots" "2.0" + "multiplierStrength" "0.7" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "5" + "weight" "25" +} + +entityDef projectile_mac10 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_mac10_dmg" +} + +entityDef fireInfo_mac10 +{ + "def_onFire" "projectile_mac10" + "ammoType" "ammo_45acp" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.07" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/mp5navy.def b/zpak001.pk3dir/def/weapons/mp5navy.def new file mode 100644 index 0000000..89179ea --- /dev/null +++ b/zpak001.pk3dir/def/weapons/mp5navy.def @@ -0,0 +1,55 @@ +entityDef weapon_mp5navy +{ + "inherit" "CSBaseRifle" + "editor_usage" "Heckler & Koch MP5-Navy Weapon - Uses ammo_9mm" + + "model" "models/w_mp5.mdl" + "model_view" "models/v_mp5.mdl" + + "inv_name" "Heckler & Koch MP5-Navy Weapon" + "def_fireInfo" "fireInfo_mp5navy" + "clipSize" "30" + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_MP5Navy.Single" + + "speed_mod" "1.0" + "price" "1500" + + "crossMinDist" "5.0" + "crossDeltaDist" "2.0" + "accuracyDivisor" "60" + "accuracyMovementPenalty" "1.25" + "accuracyMultiplier" "1" + "accuracyAdd" "0.0045" + "rangeModifier" "1.25" + "penetrationPower" "1.0" + "bulletStrength" "0.825" + "multiplierShots" "0.5" + "multiplierStrength" "1.25" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "2" + "weight" "25" +} + +entityDef projectile_mp5navy +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_mp5_dmg" +} + +entityDef fireInfo_mp5navy +{ + "def_onFire" "projectile_mp5navy" + "ammoType" "ammo_9mm" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.08" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/p228.def b/zpak001.pk3dir/def/weapons/p228.def new file mode 100644 index 0000000..4b70c1c --- /dev/null +++ b/zpak001.pk3dir/def/weapons/p228.def @@ -0,0 +1,57 @@ +entityDef weapon_p228 +{ + "inherit" "CSBasePistol" + "editor_usage" "SIG P228 Weapon - Uses ammo_357sig" + + "model" "models/w_p228.mdl" + "model_view" "models/v_p228.mdl" + + "inv_name" "SIG P228 Weapon" + "def_fireInfo" "fireInfo_p228" + "clipSize" "13" + + + "actFire" "1,2,3" + "actFireLast" "4" + "actReload" "5" + "actDraw" "6" + "actIdle" "0" + + "snd_fire" "Weapon_P228.Single" + + "speed_mod" "1.0" + "price" "600" + + "crossMinDist" "8.0" + "crossDeltaDist" "3.0" + "accuracyDivisor" "200" + "accuracyMovementPenalty" "1.6" + "accuracyMultiplier" "1" + "accuracyAdd" "0.004" + "rangeModifier" "1.5" + "penetrationPower" "1.0" + "bulletStrength" "1.05" + "multiplierShots" "6.0" + "multiplierStrength" "0.5" + "multiplierInaccuracy" "1.0" + + "hudSlot" "1" + "hudSlotPos" "3" + "weight" "5" +} + +entityDef projectile_p228 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_p228_dmg" +} + +entityDef fireInfo_p228 +{ + "def_onFire" "projectile_p228" + "ammoType" "ammo_357sig" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.1425" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/p90.def b/zpak001.pk3dir/def/weapons/p90.def new file mode 100644 index 0000000..afc2c1e --- /dev/null +++ b/zpak001.pk3dir/def/weapons/p90.def @@ -0,0 +1,55 @@ +entityDef weapon_p90 +{ + "inherit" "CSBaseRifle" + "editor_usage" "FN P90 Weapon - Uses ammo_57mm" + + "model" "models/w_p90.mdl" + "model_view" "models/v_p90.mdl" + + "inv_name" "FN P90 Weapon" + "def_fireInfo" "fireInfo_p90" + "clipSize" "50" + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_P90.Single" + + "speed_mod" "0.98" + "price" "2350" + + "crossMinDist" "7" + "crossDeltaDist" "3" + "accuracyDivisor" "50" + "accuracyMovementPenalty" "1.125" + "accuracyMultiplier" "1" + "accuracyAdd" "0.0055" + "rangeModifier" "1.875" + "penetrationPower" "1.0" + "bulletStrength" "0.9" + "multiplierShots" "1.1" + "multiplierStrength" "1.3" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "3" + "weight" "26" +} + +entityDef projectile_p90 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_p90_dmg" +} + +entityDef fireInfo_p90 +{ + "def_onFire" "projectile_p90" + "ammoType" "ammo_57mm" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.07" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/scout.def b/zpak001.pk3dir/def/weapons/scout.def new file mode 100644 index 0000000..8c65233 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/scout.def @@ -0,0 +1,55 @@ +entityDef weapon_scout +{ + "inherit" "CSBaseRifle" + "editor_usage" "Steyr Scout Weapon - Uses ammo_762nato" + + "model" "models/w_scout.mdl" + "model_view" "models/v_scout.mdl" + + "inv_name" "Steyr Scout Weapon" + "def_fireInfo" "fireInfo_scout" + "clipSize" "10" + + + "actFire" "1,2" + "actReload" "3" + "actDraw" "4" + "actIdle" "0" + + "snd_fire" "Weapon_Scout.Single" + + "speed_mod" "1.04" + "price" "1250" + + "crossMinDist" "5.0" + "crossDeltaDist" "3.0" + "accuracyDivisor" "200" + "accuracyMovementPenalty" "1" + "accuracyMultiplier" "1" + "rangeModifier" "2.375" + "penetrationPower" "1.0" + "bulletStrength" "" + "multiplierShots" "1.0" + "multiplierStrength" "1.0" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "11" + "weight" "30" +} + +entityDef projectile_scout +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_scout_dmg" +} + +entityDef fireInfo_scout +{ + "def_onFire" "projectile_scout" + "ammoType" "ammo_762nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.3" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/sg550.def b/zpak001.pk3dir/def/weapons/sg550.def new file mode 100644 index 0000000..a4b190d --- /dev/null +++ b/zpak001.pk3dir/def/weapons/sg550.def @@ -0,0 +1,54 @@ +entityDef weapon_sg550 +{ + "inherit" "CSBaseRifle" + "editor_usage" "SIG SG 550 Weapon - Uses ammo_556nato" + + "model" "models/w_sg550.mdl" + "model_view" "models/v_sg550.mdl" + + "inv_name" "SIG SG 550 Weapon" + "def_fireInfo" "fireInfo_sg550" + "clipSize" "30" + + "actFire" "1,2" + "actReload" "3" + "actDraw" "4" + "actIdle" "0" + + "snd_fire" "Weapon_SG550.Single" + + "speed_mod" "0.84" + "price" "4200" + + "crossMinDist" "5.0" + "crossDeltaDist" "3.0" + "accuracyDivisor" "200" + "accuracyMovementPenalty" "1" + "accuracyMultiplier" "1" + "rangeModifier" "2.125" + "penetrationPower" "1.0" + "bulletStrength" "" + "multiplierShots" "1.0" + "multiplierStrength" "1.0" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "14" + "weight" "20" +} + +entityDef projectile_sg550 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_sg550_dmg" +} + +entityDef fireInfo_sg550 +{ + "def_onFire" "projectile_sg550" + "ammoType" "ammo_556nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.25" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/sg552.def b/zpak001.pk3dir/def/weapons/sg552.def new file mode 100644 index 0000000..4b23007 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/sg552.def @@ -0,0 +1,56 @@ +entityDef weapon_sg552 +{ + "inherit" "CSBaseRifle" + "editor_usage" "SIG SG 552 Commando Weapon - Uses ammo_556nato" + + "model" "models/w_sg552.mdl" + "model_view" "models/v_sg552.mdl" + + "inv_name" "SIG SG 552 Commando Weapon" + "def_fireInfo" "fireInfo_sg552" + "clipSize" "30" + + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_SG552.Single" + + "speed_mod" "0.94" + "price" "3500" + + "crossMinDist" "5.0" + "crossDeltaDist" "3.0" + "accuracyDivisor" "75" + "accuracyMovementPenalty" "3" + // we actually want to * viewzoom here... + "accuracyMultiplier" "1" + "rangeModifier" "2.125" + "penetrationPower" "1.0" + "bulletStrength" "0.726" + "multiplierShots" "2.2" + "multiplierStrength" "0.9" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "8" + "weight" "25" +} + +entityDef projectile_sg552 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_sg552_dmg" +} + +entityDef fireInfo_sg552 +{ + "def_onFire" "projectile_sg552" + "ammoType" "ammo_556nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.0825" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/smokegrenade.def b/zpak001.pk3dir/def/weapons/smokegrenade.def new file mode 100644 index 0000000..5de28d5 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/smokegrenade.def @@ -0,0 +1,50 @@ +entityDef weapon_smokegrenade +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_usage" "smokegrenade" + "editor_rotatable" "1" + + "spawnclass" "CSWeapon" + "model" "models/w_smokegrenade.mdl" + "model_view" "models/v_smokegrenade.mdl" + "snd_acquire" "weapon.pickup" + "snd_respawn" "item.respawn" + + "def_onFire" "projectile_smokegrenade" + "inv_name" "smokegrenade" + "clipSize" "50" + "clipSizeDefault" "25" + + "actFire" "5,6,7" + "actAltFire" "2" + "actHolster" "4" + "actReload" "3" + "actDraw" "4" + "actIdle" "0,1" + + "snd_fire" "weapon_smokegrenade.shoot" + "snd_altfire" "weapon_smokegrenade.gl" + "snd_empty" "weapon_smokegrenade.empty" + + "hudSlot" "3" + "hudSlotPos" "2" +} + +entityDef projectile_smokegrenade +{ + "spawnclass" "CSProjectile" + "model" "models/w_smokegrenade.mdl" + "frame" "1" + "fuse" "4" + "detonate_on_fuse" "1" + "bounce" "1" + "angular_velocity" "-350 0 0" + + "snd_explode" "BaseSmokeEffect.Sound" + "snd_bounce" "SmokeGrenade.Bounce" + "decal_detonate" "ExplosionScorch" + + "smokeTime" "4" +} diff --git a/zpak001.pk3dir/def/weapons/tmp.def b/zpak001.pk3dir/def/weapons/tmp.def new file mode 100644 index 0000000..c00050e --- /dev/null +++ b/zpak001.pk3dir/def/weapons/tmp.def @@ -0,0 +1,56 @@ +entityDef weapon_tmp +{ + "inherit" "CSBaseRifle" + "editor_usage" "Steyr Tactical Weapon - Uses ammo_9mm" + + "model" "models/w_tmp.mdl" + "model_view" "models/v_tmp.mdl" + + "inv_name" "Steyr Tactical Weapon" + "def_fireInfo" "fireInfo_tmp" + "clipSize" "30" + + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_TMP.Single" + + "speed_mod" "1.0" + "price" "1250" + + "crossMinDist" "7" + "crossDeltaDist" "3" + "accuracyDivisor" "30" + "accuracyMovementPenalty" "0.95" + "accuracyMultiplier" "1" + "accuracyAdd" "0.0035" + "rangeModifier" "1.25" + "penetrationPower" "1.0" + "bulletStrength" "0.8" + "multiplierShots" "0.95" + "multiplierStrength" "1.25" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "6" + "weight" "25" +} + +entityDef projectile_tmp +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_tmp_dmg" +} + +entityDef fireInfo_tmp +{ + "def_onFire" "projectile_tmp" + "ammoType" "ammo_9mm" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.07" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/ump45.def b/zpak001.pk3dir/def/weapons/ump45.def new file mode 100644 index 0000000..71655b0 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/ump45.def @@ -0,0 +1,57 @@ +entityDef weapon_ump45 +{ + "inherit" "CSBaseRifle" + "editor_usage" "Heckler & Koch UMP .45 ACP Weapon - Uses ammo_45acp" + + "model" "models/w_ump45.mdl" + "model_view" "models/v_ump45.mdl" + + "inv_name" "Heckler & Koch UMP .45 ACP Weapon" + "def_fireInfo" "fireInfo_ump45" + "clipSize" "25" + + + "actFire" "3,4,5" + "actReload" "1" + "actDraw" "2" + "actIdle" "0" + + "snd_fire" "Weapon_UMP45.Single" + + "speed_mod" "1.0" + "price" "1700" + + "crossMinDist" "6.0" + "crossDeltaDist" "3.0" + "accuracyDivisor" "100" + "accuracyMovementPenalty" "1" + "accuracyMultiplier" "1" + "accuracyAdd" "0.003" + "rangeModifier" "0.875" + "penetrationPower" "1.0" + "bulletStrength" "1.2" + "multiplierShots" "1.0" + "multiplierStrength" "0.9" + "multiplierInaccuracy" "1.0" + + "hudSlot" "0" + "hudSlotPos" "4" + "weight" "25" +} + +entityDef projectile_ump45 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_ump45_dmg" +} + +entityDef fireInfo_ump45 +{ + "def_onFire" "projectile_ump45" + "ammoType" "ammo_45acp" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.105" + "model_flash" "sprites/muzzleflash2.spr" +} + diff --git a/zpak001.pk3dir/def/weapons/usp.def b/zpak001.pk3dir/def/weapons/usp.def new file mode 100644 index 0000000..60cc9fd --- /dev/null +++ b/zpak001.pk3dir/def/weapons/usp.def @@ -0,0 +1,86 @@ +#define USP45_IDLE 0 +#define USP45_SHOOT1 1 +#define USP45_SHOOT2 2 +#define USP45_SHOOT3 3 +#define USP45_SHOOTLAST 4 +#define USP45_RELOAD 5 +#define USP45_DRAW 6 +#define USP45_ADDSIL 7 +#define USP45_IDLEUNSIL 8 +#define USP45_SHOOT1UNSIL 9 +#define USP45_SHOOT2UNSIL 10 +#define USP45_SHOOT3UNSIL 11 +#define USP45_SHOOTLASTUNSIL 12 +#define USP45_RELOADUNSIL 13 +#define USP45_DRAWUNSIL 14 +#define USP45_DETACHSIL 15 + +entityDef weapon_usp +{ + "inherit" "CSBasePistol" + "editor_usage" "usp45" + + "model" "models/w_usp.mdl" + "model_view" "models/v_usp.mdl" + + "def_fireInfo" "fireInfo_usp45_unsil" + "def_altFireInfo" "fireInfo_usp45_sil" + "inv_name" "USP .45" + "clipSize" "12" + "ammoType" "ammo_45acp" + "fireRate" ".15" + "semiAuto" "1" + "ammoRequired" "1" + + "altSilences" "1" + "actAddSil" "7" + "actDetachSil" "15" + + "crossMinDist" "4" + "crossDeltaDist" "4" + "accuracyDivisor" "25" + "accuracyMovementPenalty" "2.2" + "accuracyMultiplier" "1" + "rangeModifier" "0.79" + "penetrationPower" "1.0" + "bulletStrength" "0.625" + "multiplierShots" "2.5" + "multiplierStrength" "0.5" + "multiplierInaccuracy" "0.5" + + // Unsilenced + "actDraw" "14" + "actIdle" "8" + "actFire" "9,10,11" + "actFireLast" "12" + "actReload" "13" + "snd_fire" "Weapon_USP.Single" + + "hudSlot" "1" + "hudSlotPos" "0" + "weight" "5" +} + +entityDef projectile_usp45 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_usp45_dmg" +} + +entityDef fireInfo_usp45_unsil +{ + "def_onFire" "projectile_usp45" + "model_flash" "sprites/muzzleflash2.spr" +} + +entityDef fireInfo_usp45_sil +{ + "def_onFire" "projectile_usp45" + "model_flash" "sprites/muzzleflash2.spr" + "actDraw" "6" + "actIdle" "0" + "actReload" "5" + "actFire" "1,2,3" + "actFireLast" "4" + "snd_fire" "Weapon_USP.SilencedShot" +} diff --git a/zpak001.pk3dir/def/weapons/xm1014.def b/zpak001.pk3dir/def/weapons/xm1014.def new file mode 100644 index 0000000..b1b570c --- /dev/null +++ b/zpak001.pk3dir/def/weapons/xm1014.def @@ -0,0 +1,59 @@ +entityDef weapon_xm1014 +{ + "inherit" "CSBaseShotgun" + "editor_usage" "Benneli XM1014 Weapon - Uses ammo_buckshot" + + "model" "models/w_xm1014.mdl" + "model_view" "models/v_xm1014.mdl" + + "inv_name" "Benneli XM1014 Weapon" + "def_fireInfo" "fireInfo_xm1014" + "clipSize" "7" + + "ammoType" "ammo_buckshot" + + "actFire" "1,2" + "actReloadStart" "5" + "actReload" "3" + "actReloadEnd" "4" + "actDraw" "6" + "actIdle" "0" + + "snd_fire" "Weapon_XM1014.Single" + + "speed_mod" "0.96" + "price" "3000" + "crossMinDist" "" + "crossDeltaDist" "" + "accuracyDivisor" "" + "accuracyMovementPenalty" "" + "accuracyMultiplier" "" + "rangeModifier" "" + "penetrationPower" "0" + "bulletStrength" "" + "multiplierShots" "" + "multiplierStrength" "" + "multiplierInaccuracy" "" + + "hudSlot" "0" + "hudSlotPos" "1" + "weight" "20" +} + +entityDef projectile_xm1014 +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_xm1014_dmg" +} + +entityDef fireInfo_xm1014 +{ + "def_onFire" "projectile_xm1014" + "ammoType" "ammo_buckshot" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.25" + "punchAngle" "-2 0 0" + "model_flash" "sprites/muzzleflash2.spr" + "numProjectiles" "6" +} diff --git a/zpak001.pk3dir/scripts/bots.txt b/zpak001.pk3dir/scripts/bots.txt new file mode 100644 index 0000000..b127b78 --- /dev/null +++ b/zpak001.pk3dir/scripts/bots.txt @@ -0,0 +1,59 @@ +{ + name nothing + funname n0things +} +{ + name goose + funname ^2Goose +} +{ + name marco + funname "]I[ M4RC0 ]I[" +} +{ + name rich + funname "Rich" +} +{ + name Getman +} +{ + name pod + funname p0d +} +{ + name leet + funname ^3l33t +} +{ + name max + funname ^4Max^1well +} +{ + name spike +} +{ + name jub +} +{ + name funkyboi +} +{ + name error + funname ^1Error +} +{ + name Shazbot +} +{ + name BombGoBoom +} +{ + name SgtMajor +} +{ + name happy_camper +} +{ + name DEViL +} \ No newline at end of file diff --git a/zpak001.pk3dir/scripts/constants.txt b/zpak001.pk3dir/scripts/constants.txt index 0438b01..e69de29 100644 --- a/zpak001.pk3dir/scripts/constants.txt +++ b/zpak001.pk3dir/scripts/constants.txt @@ -1,29 +0,0 @@ -// weapon constants -WEAPON_NONE 0 -WEAPON_M3 1 -WEAPON_XM1014 2 -WEAPON_MP5 3 -WEAPON_P90 4 -WEAPON_UMP45 5 -WEAPON_MAC10 6 -WEAPON_TMP 7 -WEAPON_AK47 8 -WEAPON_SG552 9 -WEAPON_M4A1 10 -WEAPON_AUG 11 -WEAPON_SCOUT 12 -WEAPON_AWP 13 -WEAPON_G3SG1 14 -WEAPON_SG550 15 -WEAPON_PARA 16 -WEAPON_USP45 17 -WEAPON_GLOCK18 18 -WEAPON_DEAGLE 19 -WEAPON_P228 20 -WEAPON_ELITES 21 -WEAPON_FIVESEVEN 22 -WEAPON_KNIFE 23 -WEAPON_HEGRENADE 24 -WEAPON_FLASHBANG 25 -WEAPON_SMOKEGRENADE 26 -WEAPON_C4BOMB 27 \ No newline at end of file diff --git a/zpak001.pk3dir/scripts/maptweaks.txt b/zpak001.pk3dir/scripts/maptweaks.txt new file mode 100644 index 0000000..ebdfb63 --- /dev/null +++ b/zpak001.pk3dir/scripts/maptweaks.txt @@ -0,0 +1,6 @@ +// allows you to play Counter-Strike: Source levels (needs hl2 engine plugin) +css_tweaks +{ + replace info_player_counterterrorist info_player_start + replace info_player_terrorist info_player_deathmatch +} diff --git a/zpak001.pk3dir/scripts/surfaceproperties.txt b/zpak001.pk3dir/scripts/surfaceproperties.txt new file mode 100644 index 0000000..5c051e2 --- /dev/null +++ b/zpak001.pk3dir/scripts/surfaceproperties.txt @@ -0,0 +1,224 @@ +default +{ + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.default" + stepleft "step_default.left" + stepright "step_default.right" + scraperough "scrape.default" + scrapesmooth "scrape.default" +} + +gs_material_glass +{ + gamematerial Y + part_bulletimpact "impact_glass.main" + bulletimpact "sfx_impact.glass" + stepleft "step_glass.left" + stepright "step_glass.right" + break "func_breakable.break_glass" +} + +gs_material_wood +{ + gamematerial W + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.wood" + stepleft "step_wood.left" + stepright "step_wood.right" + break "func_breakable.break_wood" +} + +gs_material_metal +{ + gamematerial M + part_bulletimpact "impact_unbreakable.main" + bulletimpact "sfx_impact.metal" + stepleft "step_metal.left" + stepright "step_metal.right" + break "func_breakable.break_metal" +} + +gs_material_ladder +{ + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.metal" + stepleft "step_ladder.left" + stepright "step_ladder.right" +} + +gs_material_flesh +{ + gamematerial F + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.flesh" + stepleft "step_flesh.left" + stepright "step_flesh.right" + break "func_breakable.break_flesh" +} + +gs_material_cinderblock +{ + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.concrete" + stepleft "step_default.left" + stepright "step_default.right" + break "func_breakable.break_cinder" +} + +gs_material_tile +{ + gamematerial T + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.tile" + stepleft "step_tile.left" + stepright "step_tile.right" + break "func_breakable.break_cinder" +} + +gs_material_computer +{ + gamematerial P + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.computer" + stepleft "step_computer.left" + stepright "step_computer.right" + break "func_breakable.break_computer" +} + +gs_material_unbreakableglass +{ + part_bulletimpact "impact_unbreakable.main" + bulletimpact "sfx_impact.glass" + stepleft "step_glass.left" + stepright "step_glass.right" + break "func_breakable.break_glass" +} + +gs_material_rocks +{ + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.concrete" + stepleft "step_default.left" + stepright "step_default.right" + break "func_breakable.break_cinder" +} + +gs_material_flesh +{ + gamematerial F + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.flesh" + stepleft "step_flesh.left" + stepright "step_flesh.right" + break "func_breakable.break_flesh" +} + +gs_material_concrete +{ + gamematerial C + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.concrete" + stepleft "step_concrete.left" + stepright "step_concrete.right" + break "func_breakable.break_cinder" +} + +gs_material_dirt +{ + gamematerial D + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.dirt" + stepleft "step_dirt.left" + stepright "step_dirt.right" + break "func_breakable.break_rocks" +} + +gs_material_grate +{ + gamematerial G + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.grate" + stepleft "step_grate.left" + stepright "step_grate.right" + break "func_breakable.break_metal" +} + +gs_material_alien +{ + gamematerial H + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.alien" + stepleft "step_alien.left" + stepright "step_alien.right" + break "func_breakable.break_flesh" +} + +gs_material_snow +{ + gamematerial K + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.snow" + stepleft "step_snow.left" + stepright "step_snow.right" +} + +gs_material_sand +{ + gamematerial N + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.sand" + stepleft "step_sand.left" + stepright "step_sand.right" +} + +gs_material_foliage +{ + gamematerial O + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.foliage" + stepleft "step_foliage.left" + stepright "step_foliage.right" +} + +gs_material_slosh +{ + gamematerial S + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.slosh" + stepleft "step_slosh.left" + stepright "step_slosh.right" +} + +gs_material_vent +{ + gamematerial V + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.snow" + stepleft "step_vent.left" + stepright "step_vent.right" + break "func_breakable.break_metal" +} + +water +{ + part_bulletimpact "fx_impact.water" + bulletimpact "sfx_impact.slosh" + stepleft "step_slosh.left" + stepright "step_slosh.right" +} + +lava +{ + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.slosh" + stepleft "step_slosh.left" + stepright "step_slosh.right" +} + +slime +{ + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.slosh" + stepleft "step_slosh.left" + stepright "step_slosh.right" +} \ No newline at end of file diff --git a/zpak001.pk3dir/sound/player.sndshd b/zpak001.pk3dir/sound/player.sndshd index 01661d6..361afd2 100644 --- a/zpak001.pk3dir/sound/player.sndshd +++ b/zpak001.pk3dir/sound/player.sndshd @@ -134,4 +134,9 @@ Player.Swim sample player/pl_swim2.wav sample player/pl_swim3.wav sample player/pl_swim4.wav +} + +Player.PickupWeapon +{ + sample items/gunpickup2.wav } \ No newline at end of file diff --git a/zpak001.pk3dir/sound/weapons_cstrike.sndshd b/zpak001.pk3dir/sound/weapons_cstrike.sndshd index 5067656..f27cff4 100644 --- a/zpak001.pk3dir/sound/weapons_cstrike.sndshd +++ b/zpak001.pk3dir/sound/weapons_cstrike.sndshd @@ -1,42 +1,52 @@ -weapon_ak47.fire +Default.ClipEmpty_Rifle +{ + sample weapons/dryfire_rifle.wav +} + +Default.ClipEmpty_Pistol +{ + sample weapons/dryfire_pistol.wav +} + +Weapon_AK47.Single { sample weapons/ak47-1.wav sample weapons/ak47-2.wav } -weapon_aug.fire +Weapon_AUG.Single { sample weapons/aug-1.wav } -weapon_awp.fire +Weapon_AWP.Single { sample weapons/awp1.wav } -weapon_awp.zoom +Default.Zoom { sample weapons/zoom.wav } -weapon_c4bomb.disarm +c4.disarmstart { attenuation none sample weapons/c4_disarm.wav } -weapon_c4bomb.disarmed +c4.disarmfinish { sample weapons/c4_disarmed.wav } -weapon_c4bomb.explode +c4.explode { attenuation none sample weapons/c4_explode1.wav } -weapon_c4bomb.plant +c4.plant { sample weapons/c4_plant.wav } @@ -67,19 +77,19 @@ weapon_c4bomb.beep5 sample weapons/c4_beep5.wav } -weapon_deagle.fire +Weapon_DEagle.Single { sample weapons/deagle-1.wav sample weapons/deagle-2.wav } -weapon_elites.fire +Weapon_ELITE.Single { sample weapons/elite_fire.wav sample weapons/elite_fire.wav } -weapon_fiveseven.fire +Weapon_FiveSeven.Single { sample weapons/fiveseven-1.wav } @@ -89,17 +99,27 @@ weapon_flashbang.explode sample weapons/flashbang-1.wav } -weapon_g3sg1.fire +Weapon_FAMAS.Single +{ + sample weapons/famas-1.wav +} + +Weapon_G3SG1.Single { sample weapons/g3sg1-1.wav } -weapon_glock18.fire +Weapon_Galil.Single +{ + sample weapons/galil-1.wav +} + +Weapon_Glock.Single { sample weapons/glock18-2.wav } -weapon_glock18.burstfire +Weapon_Glock.Burst { sample weapons/glock18-1.wav } @@ -140,12 +160,12 @@ weapon_flashbang.explode sample weapons/flashbang-2.wav } -weapon_knife.hit +Weapon_Knife.HitWall { sample weapons/knife_hitwall1.wav } -weapon_knife.hitbody +Weapon_Knife.Hit { sample weapons/knife_hit1.wav sample weapons/knife_hit2.wav @@ -153,70 +173,69 @@ weapon_knife.hitbody sample weapons/knife_hit4.wav } -weapon_knife.hithard +Weapon_Knife.Stab { sample weapons/knife_stab.wav } -weapon_knife.miss +Weapon_Knife.Slash { sample weapons/knife_slash1.wav } -weapon_m3.fire +Weapon_M3.Single { sample weapons/m3-1.wav } -weapon_m4a1.fire +Weapon_M4A1.Single { sample weapons/m4a1_unsil-1.wav sample weapons/m4a1_unsil-2.wav } -weapon_m4a1.silenced +Weapon_M4A1.Silenced { sample weapons/m4a1-1.wav } -weapon_mac10.fire +Weapon_MAC10.Single { sample weapons/mac10-1.wav } -weapon_mp5.fire +Weapon_MP5Navy.Single { sample weapons/mp5-1.wav } -weapon_p228.fire +Weapon_P228.Single { sample weapons/p228-1.wav } -weapon_p90.fire +Weapon_P90.Single { sample weapons/p90-1.wav } - -weapon_para.fire +Weapon_M249.Single { sample weapons/m249-1.wav sample weapons/m249-2.wav } -weapon_scout.fire +Weapon_Scout.Single { sample weapons/scout_fire-1.wav } -weapon_sg550.fire +Weapon_SG550.Single { sample weapons/sg550-1.wav } -weapon_sg552.fire +Weapon_SG552.Single { sample weapons/sg552-1.wav } @@ -226,34 +245,34 @@ weapon_smokegrenade.explode sample weapons/sg_explode.wav } -weapon_tmp.fire +Weapon_TMP.Single { sample weapons/tmp-1.wav sample weapons/tmp-2.wav } -weapon_ump45.fire +Weapon_UMP45.Single { sample weapons/ump45-1.wav } -weapon_usp45.fire +Weapon_USP.Single { sample weapons/usp_unsil-1.wav } -weapon_usp45.silenced +Weapon_USP.SilencedShot { sample weapons/usp1.wav sample weapons/usp2.wav } -weapon_xm1014.fire +Weapon_XM1014.Single { sample weapons/xm1014-1.wav } -weapon_xm1014.insertshell +Weapon_XM1014.InsertShell { sample weapons/m3_insertshell.wav } From 949f3c39bc49e785292378ff28fad609715b639e Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 24 Jul 2024 10:26:53 -0700 Subject: [PATCH 02/17] remove reference to unused weapons. --- zpak001.pk3dir/def/weapons.def | 2 -- 1 file changed, 2 deletions(-) diff --git a/zpak001.pk3dir/def/weapons.def b/zpak001.pk3dir/def/weapons.def index 62590c0..ca51fe6 100644 --- a/zpak001.pk3dir/def/weapons.def +++ b/zpak001.pk3dir/def/weapons.def @@ -4,11 +4,9 @@ #include "weapons/c4.def" #include "weapons/deagle.def" #include "weapons/elites.def" -#include "weapons/famas.def" #include "weapons/fiveseven.def" #include "weapons/flashbang.def" #include "weapons/g3sg1.def" -#include "weapons/galil.def" #include "weapons/glock18.def" #include "weapons/hegrenade.def" #include "weapons/knife.def" From dc0c57397bb022b98d43749235abe7221d337446 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 24 Jul 2024 18:51:27 -0700 Subject: [PATCH 03/17] Rip out more now-unused stuff. Start fixing up the buy system, make weapons fire again --- src/client/cmds.qc | 62 ++--- src/client/entities.qc | 3 + src/client/radio.qc | 0 src/client/textmenu.qc | 94 +++---- src/client/vgui_buypages.qc | 62 ++--- src/server/ammo.qc | 8 +- src/server/bot.qc | 48 ++-- src/server/buy.h | 20 +- src/server/buy.qc | 2 +- src/server/gamerules_deathmatch.qc | 6 +- src/server/item_suit.qc | 78 ------ src/server/progs.src | 11 - src/server/spawn.qc | 74 ------ src/shared/CSProjectile.h | 30 ++- src/shared/CSProjectile.qc | 229 +++++++++++++++++ src/shared/CSWeapon.qc | 30 ++- src/{server/player.qc => shared/buying.h} | 53 +++- src/shared/defs.h | 3 +- src/shared/include.src | 1 + src/shared/player.h | 1 - src/shared/pmove.qc | 95 ------- src/shared/weapons.h | 66 ----- zpak001.pk3dir/def/items.def | 6 + .../def/{item_c4.def => items/c4.def} | 0 zpak001.pk3dir/def/items/defuse.def | 10 + zpak001.pk3dir/def/items/kevlar.def | 11 + zpak001.pk3dir/def/items/kevlar_helmet.def | 11 + zpak001.pk3dir/def/items/nightvision.def | 10 + zpak001.pk3dir/def/items/suit.def | 11 + zpak001.pk3dir/def/projectiles.def | 15 ++ zpak001.pk3dir/def/weapons/famas.def | 56 +++++ zpak001.pk3dir/def/weapons/galil.def | 27 ++ zpak001.pk3dir/def/weapons/m3.def | 4 +- zpak001.pk3dir/def/weapons/xm1014.def | 2 +- zpak001.pk3dir/maps/eukara/test_weapons.bsp | Bin 0 -> 18992 bytes zpak001.pk3dir/maps/eukara/test_weapons.map | 235 ++++++++++++++++++ zpak001.pk3dir/sound/player.sndshd | 4 +- 37 files changed, 872 insertions(+), 506 deletions(-) mode change 100755 => 100644 src/client/radio.qc delete mode 100644 src/server/item_suit.qc delete mode 100644 src/server/spawn.qc rename src/{server/player.qc => shared/buying.h} (53%) delete mode 100644 src/shared/weapons.h create mode 100644 zpak001.pk3dir/def/items.def rename zpak001.pk3dir/def/{item_c4.def => items/c4.def} (100%) create mode 100644 zpak001.pk3dir/def/items/defuse.def create mode 100644 zpak001.pk3dir/def/items/kevlar.def create mode 100644 zpak001.pk3dir/def/items/kevlar_helmet.def create mode 100644 zpak001.pk3dir/def/items/nightvision.def create mode 100644 zpak001.pk3dir/def/items/suit.def create mode 100644 zpak001.pk3dir/def/projectiles.def create mode 100644 zpak001.pk3dir/def/weapons/famas.def create mode 100644 zpak001.pk3dir/def/weapons/galil.def create mode 100644 zpak001.pk3dir/maps/eukara/test_weapons.bsp create mode 100644 zpak001.pk3dir/maps/eukara/test_weapons.map diff --git a/src/client/cmds.qc b/src/client/cmds.qc index 76b3b01..7ae10cf 100644 --- a/src/client/cmds.qc +++ b/src/client/cmds.qc @@ -73,99 +73,99 @@ ClientGame_ConsoleCommand(void) sendevent("DropWeapon", ""); break; case "glock": - sendevent("BuyWeapon", "f", WEAPON_GLOCK18); + sendevent("CSBuy", "f", BUY_GLOCK18); break; case "usp": - sendevent("BuyWeapon", "f", WEAPON_USP45); + sendevent("CSBuy", "f", BUY_USP45); break; case "p228": - sendevent("BuyWeapon", "f", WEAPON_P228); + sendevent("CSBuy", "f", BUY_P228); break; case "deagle": - sendevent("BuyWeapon", "f", WEAPON_DEAGLE); + sendevent("CSBuy", "f", BUY_DEAGLE); break; case "fn57": - sendevent("BuyWeapon", "f", WEAPON_FIVESEVEN); + sendevent("CSBuy", "f", BUY_FIVESEVEN); break; case "elites": - sendevent("BuyWeapon", "f", WEAPON_ELITES); + sendevent("CSBuy", "f", BUY_ELITES); break; case "m3": - sendevent("BuyWeapon", "f", WEAPON_M3); + sendevent("CSBuy", "f", BUY_M3); break; case "xm1014": - sendevent("BuyWeapon", "f", WEAPON_XM1014); + sendevent("CSBuy", "f", BUY_XM1014); break; case "tmp": - sendevent("BuyWeapon", "f", WEAPON_TMP); + sendevent("CSBuy", "f", BUY_TMP); break; case "mac10": - sendevent("BuyWeapon", "f", WEAPON_MAC10); + sendevent("CSBuy", "f", BUY_MAC10); break; case "mp5": - sendevent("BuyWeapon", "f", WEAPON_MP5); + sendevent("CSBuy", "f", BUY_MP5); break; case "ump45": - sendevent("BuyWeapon", "f", WEAPON_UMP45); + sendevent("CSBuy", "f", BUY_UMP45); break; case "p90": - sendevent("BuyWeapon", "f", WEAPON_P90); + sendevent("CSBuy", "f", BUY_P90); break; case "ak47": - sendevent("BuyWeapon", "f", WEAPON_AK47); + sendevent("CSBuy", "f", BUY_AK47); break; case "m4a1": - sendevent("BuyWeapon", "f", WEAPON_M4A1); + sendevent("CSBuy", "f", BUY_M4A1); break; case "sg552": - sendevent("BuyWeapon", "f", WEAPON_SG552); + sendevent("CSBuy", "f", BUY_SG552); break; case "aug": - sendevent("BuyWeapon", "f", WEAPON_AUG); + sendevent("CSBuy", "f", BUY_AUG); break; case "scout": - sendevent("BuyWeapon", "f", WEAPON_SCOUT); + sendevent("CSBuy", "f", BUY_SCOUT); break; case "sg550": - sendevent("BuyWeapon", "f", WEAPON_SG550); + sendevent("CSBuy", "f", BUY_SG550); break; case "awp": - sendevent("BuyWeapon", "f", WEAPON_AWP); + sendevent("CSBuy", "f", BUY_AWP); break; case "g3sg1": - sendevent("BuyWeapon", "f", WEAPON_G3SG1); + sendevent("CSBuy", "f", BUY_G3SG1); break; case "m249": - sendevent("BuyWeapon", "f", WEAPON_PARA); + sendevent("CSBuy", "f", BUY_PARA); break; case "buyammo1": case "primammo": - sendevent("AmmoBuyPrimary", ""); + sendevent("CSBuy", "f", BUY_PRIMARYAMMO); break; case "buyammo2": case "secammo": - sendevent("AmmoBuySecondary", ""); + sendevent("CSBuy", "f", BUY_SECONDARYAMMO); break; case "vest": - sendevent("BuyEquipment", "f", 0); + sendevent("CSBuy", "f", BUY_VEST); break; case "vesthelm": - sendevent("BuyEquipment", "f", 1); + sendevent("CSBuy", "f", BUY_VESTHELMET); break; case "flash": - sendevent("BuyEquipment", "f", 2); + sendevent("CSBuy", "f", BUY_FLASHBANG); break; case "hegren": - sendevent("BuyEquipment", "f", 3); + sendevent("CSBuy", "f", BUY_HEGRENADE); break; case "vsgren": - sendevent("BuyEquipment", "f", 4); + sendevent("CSBuy", "f", BUY_SMOKEGRENADE); break; case "defuser": - sendevent("BuyEquipment", "f", 5); + sendevent("CSBuy", "f", BUY_DEFUSALKIT); break; case "nvg": - sendevent("BuyEquipment", "f", 6); + sendevent("CSBuy", "f", BUY_NIGHTVISION); break; case "coverme": sendevent("Radio", "f", RADIO_CT_COVERME); diff --git a/src/client/entities.qc b/src/client/entities.qc index 91f0140..5a584e1 100644 --- a/src/client/entities.qc +++ b/src/client/entities.qc @@ -24,6 +24,9 @@ ClientGame_EntityUpdate(float id, float new) case ENT_PLAYER: NSENTITY_READENTITY(CSPlayer, new) break; + case ENT_ENTITYPROJECTILE: + NSENTITY_READENTITY(CSProjectile, new) + break; case ENT_WEAPON: NSENTITY_READENTITY(CSWeapon, new) break; diff --git a/src/client/radio.qc b/src/client/radio.qc old mode 100755 new mode 100644 diff --git a/src/client/textmenu.qc b/src/client/textmenu.qc index 7bf41b0..9ca20a8 100644 --- a/src/client/textmenu.qc +++ b/src/client/textmenu.qc @@ -106,11 +106,11 @@ BUY(int n) Textmenu_Call(inteam == TEAM_T ? "BUYMACHINEGUN" : "BUYMACHINEGUN"); break; case 6: - sendevent("AmmoBuyPrimary", ""); + sendevent("CSBuy", "f", BUY_PRIMARYAMMO); Textmenu_Call(""); break; case 7: - sendevent("AmmoBuySecondary", ""); + sendevent("CSBuy", "f", BUY_SECONDARYAMMO); Textmenu_Call(""); break; case 8: @@ -128,22 +128,22 @@ DT_BUYITEM(int n) { switch (n) { case 1: - sendevent("BuyEquipment", "f", 0); + sendevent("CSBuy", "f", BUY_VEST); break; case 2: - sendevent("BuyEquipment", "f", 1); + sendevent("CSBuy", "f", BUY_VESTHELMET); break; case 3: - sendevent("BuyEquipment", "f", 2); + sendevent("CSBuy", "f", BUY_FLASHBANG); break; case 4: - sendevent("BuyEquipment", "f", 3); + sendevent("CSBuy", "f", BUY_HEGRENADE); break; case 5: - sendevent("BuyEquipment", "f", 4); + sendevent("CSBuy", "f", BUY_SMOKEGRENADE); break; case 7: - sendevent("BuyEquipment", "f", 6); + sendevent("CSBuy", "f", BUY_NIGHTVISION); break; case 10: Textmenu_Call(""); @@ -159,25 +159,25 @@ DCT_BUYITEM(int n) { switch (n) { case 1: - sendevent("BuyEquipment", "f", 0); + sendevent("CSBuy", "f", BUY_VEST); break; case 2: - sendevent("BuyEquipment", "f", 1); + sendevent("CSBuy", "f", BUY_VESTHELMET); break; case 3: - sendevent("BuyEquipment", "f", 2); + sendevent("CSBuy", "f", BUY_FLASHBANG); break; case 4: - sendevent("BuyEquipment", "f", 3); + sendevent("CSBuy", "f", BUY_HEGRENADE); break; case 5: - sendevent("BuyEquipment", "f", 4); + sendevent("CSBuy", "f", BUY_SMOKEGRENADE); break; case 6: - sendevent("BuyEquipment", "f", 5); + sendevent("CSBuy", "f", BUY_DEFUSALKIT); break; case 7: - sendevent("BuyEquipment", "f", 6); + sendevent("CSBuy", "f", BUY_NIGHTVISION); break; case 10: Textmenu_Call(""); @@ -195,19 +195,19 @@ T_BUYPISTOL(int n) { switch (n) { case 1: - sendevent("BuyWeapon", "f", WEAPON_USP45); + sendevent("CSBuy", "f", BUY_USP45); break; case 2: - sendevent("BuyWeapon", "f", WEAPON_GLOCK18); + sendevent("CSBuy", "f", BUY_GLOCK18); break; case 3: - sendevent("BuyWeapon", "f", WEAPON_DEAGLE); + sendevent("CSBuy", "f", BUY_DEAGLE); break; case 4: - sendevent("BuyWeapon", "f", WEAPON_P228); + sendevent("CSBuy", "f", BUY_P228); break; case 5: - sendevent("BuyWeapon", "f", WEAPON_ELITES); + sendevent("CSBuy", "f", BUY_ELITES); break; case 10: Textmenu_Call(""); @@ -223,19 +223,19 @@ CT_BUYPISTOL(int n) { switch (n) { case 1: - sendevent("BuyWeapon", "f", WEAPON_USP45); + sendevent("CSBuy", "f", BUY_USP45); break; case 2: - sendevent("BuyWeapon", "f", WEAPON_GLOCK18); + sendevent("CSBuy", "f", BUY_GLOCK18); break; case 3: - sendevent("BuyWeapon", "f", WEAPON_DEAGLE); + sendevent("CSBuy", "f", BUY_DEAGLE); break; case 4: - sendevent("BuyWeapon", "f", WEAPON_P228); + sendevent("CSBuy", "f", BUY_P228); break; case 6: - sendevent("BuyWeapon", "f", WEAPON_FIVESEVEN); + sendevent("CSBuy", "f", BUY_FIVESEVEN); break; case 10: Textmenu_Call(""); @@ -253,10 +253,10 @@ BUYSHOTGUN(int n) { switch (n) { case 1: - sendevent("BuyWeapon", "f", WEAPON_M3); + sendevent("CSBuy", "f", BUY_M3); break; case 2: - sendevent("BuyWeapon", "f", WEAPON_XM1014); + sendevent("CSBuy", "f", BUY_XM1014); break; case 10: Textmenu_Call(""); @@ -274,19 +274,19 @@ T_BUYRIFLE(int n) { switch (n) { case 1: - sendevent("BuyWeapon", "f", WEAPON_AK47); + sendevent("CSBuy", "f", BUY_AK47); break; case 2: - sendevent("BuyWeapon", "f", WEAPON_SG552); + sendevent("CSBuy", "f", BUY_SG552); break; case 5: - sendevent("BuyWeapon", "f", WEAPON_SCOUT); + sendevent("CSBuy", "f", BUY_SCOUT); break; case 6: - sendevent("BuyWeapon", "f", WEAPON_AWP); + sendevent("CSBuy", "f", BUY_AWP); break; case 7: - sendevent("BuyWeapon", "f", WEAPON_G3SG1); + sendevent("CSBuy", "f", BUY_G3SG1); break; case 10: Textmenu_Call(""); @@ -302,22 +302,22 @@ CT_BUYRIFLE(int n) { switch (n) { case 3: - sendevent("BuyWeapon", "f", WEAPON_M4A1); + sendevent("CSBuy", "f", BUY_M4A1); break; case 4: - sendevent("BuyWeapon", "f", WEAPON_AUG); + sendevent("CSBuy", "f", BUY_AUG); break; case 5: - sendevent("BuyWeapon", "f", WEAPON_SCOUT); + sendevent("CSBuy", "f", BUY_SCOUT); break; case 6: - sendevent("BuyWeapon", "f", WEAPON_AWP); + sendevent("CSBuy", "f", BUY_AWP); break; case 7: - sendevent("BuyWeapon", "f", WEAPON_G3SG1); + sendevent("CSBuy", "f", BUY_G3SG1); break; case 8: - sendevent("BuyWeapon", "f", WEAPON_SG550); + sendevent("CSBuy", "f", BUY_SG550); break; case 10: Textmenu_Call(""); @@ -335,16 +335,16 @@ T_BUYSUBMACHINEGUN(int n) { switch (n) { case 1: - sendevent("BuyWeapon", "f", WEAPON_MP5); + sendevent("CSBuy", "f", BUY_MP5); break; case 3: - sendevent("BuyWeapon", "f", WEAPON_P90); + sendevent("CSBuy", "f", BUY_P90); break; case 4: - sendevent("BuyWeapon", "f", WEAPON_MAC10); + sendevent("CSBuy", "f", BUY_MAC10); break; case 5: - sendevent("BuyWeapon", "f", WEAPON_UMP45); + sendevent("CSBuy", "f", BUY_UMP45); break; case 10: Textmenu_Call(""); @@ -360,16 +360,16 @@ CT_BUYSUBMACHINEGUN(int n) { switch (n) { case 1: - sendevent("BuyWeapon", "f", WEAPON_MP5); + sendevent("CSBuy", "f", BUY_MP5); break; case 2: - sendevent("BuyWeapon", "f", WEAPON_TMP); + sendevent("CSBuy", "f", BUY_TMP); break; case 3: - sendevent("BuyWeapon", "f", WEAPON_P90); + sendevent("CSBuy", "f", BUY_P90); break; case 5: - sendevent("BuyWeapon", "f", WEAPON_UMP45); + sendevent("CSBuy", "f", BUY_UMP45); break; case 10: Textmenu_Call(""); @@ -387,7 +387,7 @@ BUYMACHINEGUN(int n) { switch (n) { case 1: - sendevent("BuyWeapon", "f", WEAPON_PARA); + sendevent("CSBuy", "f", BUY_PARA); break; case 10: Textmenu_Call(""); diff --git a/src/client/vgui_buypages.qc b/src/client/vgui_buypages.qc index 74e9ace..d3a0dbd 100644 --- a/src/client/vgui_buypages.qc +++ b/src/client/vgui_buypages.qc @@ -67,39 +67,39 @@ typedef struct } buyItems_t; const buyItems_t g_buyItemList [] = { - { "BuyWeapon", WEAPON_USP45, "classes/usp.txt", "gfx/vgui/640_usp", "USP45" }, - { "BuyWeapon", WEAPON_GLOCK18, "classes/glock18.txt", "gfx/vgui/640_glock18", "Glock18" }, - { "BuyWeapon", WEAPON_DEAGLE, "classes/deagle.txt", "gfx/vgui/640_deagle", "DesertEagle" }, - { "BuyWeapon", WEAPON_P228, "classes/p228.txt", "gfx/vgui/640_p228", "P228" }, - { "BuyWeapon", WEAPON_ELITES, "classes/elite.txt", "gfx/vgui/640_elite", "Beretta96G" }, - { "BuyWeapon", WEAPON_FIVESEVEN, "classes/fiveseven.txt", "gfx/vgui/640_fiveseven", "FiveSeven" }, - { "BuyWeapon", WEAPON_M3, "classes/m3.txt", "gfx/vgui/640_m3", "Super90" }, - { "BuyWeapon", WEAPON_XM1014, "classes/xm1014.txt", "gfx/vgui/640_xm1014", "XM1014" }, + { "CSBuy", BUY_USP45, "classes/usp.txt", "gfx/vgui/640_usp", "USP45" }, + { "CSBuy", BUY_GLOCK18, "classes/glock18.txt", "gfx/vgui/640_glock18", "Glock18" }, + { "CSBuy", BUY_DEAGLE, "classes/deagle.txt", "gfx/vgui/640_deagle", "DesertEagle" }, + { "CSBuy", BUY_P228, "classes/p228.txt", "gfx/vgui/640_p228", "P228" }, + { "CSBuy", BUY_ELITES, "classes/elite.txt", "gfx/vgui/640_elite", "Beretta96G" }, + { "CSBuy", BUY_FIVESEVEN, "classes/fiveseven.txt", "gfx/vgui/640_fiveseven", "FiveSeven" }, + { "CSBuy", BUY_M3, "classes/m3.txt", "gfx/vgui/640_m3", "Super90" }, + { "CSBuy", BUY_XM1014, "classes/xm1014.txt", "gfx/vgui/640_xm1014", "XM1014" }, #if defined(CZERO) || defined(CSSOURCE) - { "BuyWeapon", WEAPON_FAMAS, "classes/famas.txt", "gfx/vgui/640_famas", "Famas" }, - { "BuyWeapon", WEAPON_GALIL, "classes/galil.txt", "gfx/vgui/640_galil", "Galil" }, + { "CSBuy", BUY_FAMAS, "classes/famas.txt", "gfx/vgui/640_famas", "Famas" }, + { "CSBuy", BUY_GALIL, "classes/galil.txt", "gfx/vgui/640_galil", "Galil" }, #endif - { "BuyWeapon", WEAPON_AK47, "classes/ak47.txt", "gfx/vgui/640_ak47", "AK47" }, - { "BuyWeapon", WEAPON_SG552, "classes/sg552.txt", "gfx/vgui/640_sg552", "SG552" }, - { "BuyWeapon", WEAPON_M4A1, "classes/m4a1.txt", "gfx/vgui/640_m4a1", "M4A1" }, - { "BuyWeapon", WEAPON_AUG, "classes/aug.txt", "gfx/vgui/640_aug", "Aug" }, - { "BuyWeapon", WEAPON_SCOUT, "classes/scout.txt", "gfx/vgui/640_scout", "Scout" }, - { "BuyWeapon", WEAPON_AWP, "classes/awp.txt", "gfx/vgui/640_awp", "ArcticWarfareMagnum" }, - { "BuyWeapon", WEAPON_G3SG1, "classes/g3sg1.txt", "gfx/vgui/640_g3sg1", "G3SG1" }, - { "BuyWeapon", WEAPON_SG550, "classes/sg550.txt", "gfx/vgui/640_sg550", "SG550" }, - { "BuyWeapon", WEAPON_MP5, "classes/mp5.txt", "gfx/vgui/640_mp5", "mp5navy" }, - { "BuyWeapon", WEAPON_TMP, "classes/tmp.txt", "gfx/vgui/640_tmp", "tmp" }, - { "BuyWeapon", WEAPON_P90, "classes/p90.txt", "gfx/vgui/640_p90", "FNP90" }, - { "BuyWeapon", WEAPON_MAC10, "classes/mac10.txt", "gfx/vgui/640_mac10", "Mac10" }, - { "BuyWeapon", WEAPON_UMP45, "classes/ump45.txt", "gfx/vgui/640_ump45", "UMP45" }, - { "BuyWeapon", WEAPON_PARA, "classes/m249.txt", "gfx/vgui/640_m249", "M249" }, - { "BuyEquipment", 0, "classes/kevlar.txt", "", "Kevlar_Vest" }, - { "BuyEquipment", 1, "classes/kevlar_helmet.txt", "", "Kevlar_Vest_Ballistic_Helmet" }, - { "BuyEquipment", 2, "classes/flashbang.txt", "gfx/vgui/640_flashbang", "Flashbang" }, - { "BuyEquipment", 3, "classes/hegrenade.txt", "gfx/vgui/640_hegrenade", "High_Explosive_Grenade" }, - { "BuyEquipment", 4, "classes/smokegrenade.txt", "gfx/vgui/640_smokegrenade", "Smoke_Grenade" }, - { "BuyEquipment", 5, "classes/defuse.txt", "", "Defusal_Kit" }, - { "BuyEquipment", 6, "classes/nightvision.txt", "", "Nightvision_Goggles" }, + { "CSBuy", BUY_AK47, "classes/ak47.txt", "gfx/vgui/640_ak47", "AK47" }, + { "CSBuy", BUY_SG552, "classes/sg552.txt", "gfx/vgui/640_sg552", "SG552" }, + { "CSBuy", BUY_M4A1, "classes/m4a1.txt", "gfx/vgui/640_m4a1", "M4A1" }, + { "CSBuy", BUY_AUG, "classes/aug.txt", "gfx/vgui/640_aug", "Aug" }, + { "CSBuy", BUY_SCOUT, "classes/scout.txt", "gfx/vgui/640_scout", "Scout" }, + { "CSBuy", BUY_AWP, "classes/awp.txt", "gfx/vgui/640_awp", "ArcticWarfareMagnum" }, + { "CSBuy", BUY_G3SG1, "classes/g3sg1.txt", "gfx/vgui/640_g3sg1", "G3SG1" }, + { "CSBuy", BUY_SG550, "classes/sg550.txt", "gfx/vgui/640_sg550", "SG550" }, + { "CSBuy", BUY_MP5, "classes/mp5.txt", "gfx/vgui/640_mp5", "mp5navy" }, + { "CSBuy", BUY_TMP, "classes/tmp.txt", "gfx/vgui/640_tmp", "tmp" }, + { "CSBuy", BUY_P90, "classes/p90.txt", "gfx/vgui/640_p90", "FNP90" }, + { "CSBuy", BUY_MAC10, "classes/mac10.txt", "gfx/vgui/640_mac10", "Mac10" }, + { "CSBuy", BUY_UMP45, "classes/ump45.txt", "gfx/vgui/640_ump45", "UMP45" }, + { "CSBuy", BUY_PARA, "classes/m249.txt", "gfx/vgui/640_m249", "M249" }, + { "CSBuy", BUY_VEST, "classes/kevlar.txt", "", "Kevlar_Vest" }, + { "CSBuy", BUY_VESTHELMET, "classes/kevlar_helmet.txt", "", "Kevlar_Vest_Ballistic_Helmet" }, + { "CSBuy", BUY_FLASHBANG, "classes/flashbang.txt", "gfx/vgui/640_flashbang", "Flashbang" }, + { "CSBuy", BUY_HEGRENADE, "classes/hegrenade.txt", "gfx/vgui/640_hegrenade", "High_Explosive_Grenade" }, + { "CSBuy", BUY_SMOKEGRENADE, "classes/smokegrenade.txt", "gfx/vgui/640_smokegrenade", "Smoke_Grenade" }, + { "CSBuy", BUY_DEFUSALKIT, "classes/defuse.txt", "", "Defusal_Kit" }, + { "CSBuy", BUY_NIGHTVISION, "classes/nightvision.txt", "", "Nightvision_Goggles" }, }; string g_butItemDescr[29]; diff --git a/src/server/ammo.qc b/src/server/ammo.qc index 3fa4ed6..be622f2 100644 --- a/src/server/ammo.qc +++ b/src/server/ammo.qc @@ -38,6 +38,7 @@ typedef struct int price; } ammoinfo_t; +#if 0 ammoinfo_t cs_ammoinfo[11] = { /* CALIBER_NONE */ { @@ -106,6 +107,7 @@ ammoinfo_t cs_ammoinfo[11] = { .price = 50 } }; +#endif int Ammo_BuyCaliber(CSPlayer pl, int cal, int free) @@ -324,7 +326,7 @@ CSEv_AmmoBuyPrimary(void) return; } - Ammo_BuyPrimary(pl, FALSE); + //Ammo_BuyPrimary(pl, FALSE); } void @@ -336,8 +338,8 @@ Ammo_AutoFill(NSClientPlayer pp) return; } - Ammo_BuyPrimary(pl, true); - Ammo_BuySecondary(pl, true); + //Ammo_BuyPrimary(pl, true); + //Ammo_BuySecondary(pl, true); } void diff --git a/src/server/bot.qc b/src/server/bot.qc index 360ea1b..227ebe8 100644 --- a/src/server/bot.qc +++ b/src/server/bot.qc @@ -243,9 +243,9 @@ csbot::CreateObjective(void) /* We carry the bomb */ if (m_gflagsBackup & GF_BOMBZONE) { /* We are at a bombsite and ready to plant the bomb */ - if (activeweapon != WEAPON_C4BOMB) { + if (GetCurrentWeapon() != "weapon_c4") { /* TODO: REPLACE THIS WITH NSNAVAI METHOD */ - activeweapon = WEAPON_C4BOMB; + SwitchToWeapon("weapon_c4"); //Weapons_Draw((CSPlayer)self); } @@ -351,7 +351,7 @@ csbot::PostFrame(void) void csbot::WeaponThink(void) { - if (activeweapon == WEAPON_KNIFE) + if (GetCurrentWeapon() == "weapon_knife") return; #if FIXME @@ -473,21 +473,21 @@ CSBot_BuyStart_Shop(void) int r = floor(random(1,17)); if (pl.team == TEAM_T) { - if (r == WEAPON_M4A1) { continue; } - if (r == WEAPON_AUG) { continue; } - if (r == WEAPON_SG550) { continue; } - if (r == WEAPON_FIVESEVEN) { continue; } - if (r == WEAPON_TMP) { continue; } + if (r == BUY_M4A1) { continue; } + if (r == BUY_AUG) { continue; } + if (r == BUY_SG550) { continue; } + if (r == BUY_FIVESEVEN) { continue; } + if (r == BUY_TMP) { continue; } } else if (pl.team == TEAM_CT) { - if (r == WEAPON_AK47) { continue; } - if (r == WEAPON_SG552) { continue; } - if (r == WEAPON_G3SG1) { continue; } - if (r == WEAPON_ELITES) { continue; } - if (r == WEAPON_MAC10) { continue; } + if (r == BUY_AK47) { continue; } + if (r == BUY_SG552) { continue; } + if (r == BUY_G3SG1) { continue; } + if (r == BUY_ELITES) { continue; } + if (r == BUY_MAC10) { continue; } } - if (g_cstrikeWeaponPrice[r] <= pl.money) { - CSEv_BuyWeapon_f((float)r); + if (cs_buyprices[r] <= pl.money) { + CSEv_CSBuy_f((float)r); done = 1; } count++; @@ -499,21 +499,21 @@ CSBot_BuyStart_Shop(void) /* CT: Random buy bomb defuse kit when enough money left */ if (pl.team == TEAM_CT && g_cs_bombzones > 0 && - g_cstrikeUtilPrice[(float)5] <= pl.money && + cs_buyprices[BUY_DEFUSALKIT] <= pl.money && random() < 0.5) { - CSEv_BuyEquipment_f((float)5); // ITEM_DEFUSAL + CSEv_CSBuy_f(BUY_DEFUSALKIT); // ITEM_DEFUSAL } /* need armor */ if (pl.armor < 100) { - if (pl.money >= g_cstrikeUtilPrice[1]) /* kevlar and helmet */ - CSEv_BuyEquipment_f(1); - else if (pl.money >= g_cstrikeUtilPrice[0]) /* just kevlar */ - CSEv_BuyEquipment_f(0); + if (pl.money >= cs_buyprices[1]) /* kevlar and helmet */ + CSEv_CSBuy_f(BUY_VESTHELMET); + else if (pl.money >= cs_buyprices[0]) /* just kevlar */ + CSEv_CSBuy_f(BUY_VEST); } else if (!(pl.g_items & ITEM_HELMET)) { /* we need helmet */ if (pl.money >= 350) /* kevlar and helmet */ - CSEv_BuyEquipment_f(1); + CSEv_CSBuy_f(BUY_VESTHELMET); } #if FIXME @@ -527,8 +527,8 @@ CSBot_BuyStart_Shop(void) #endif /* force buy right now */ - CSEv_AmmoBuyPrimary(); - CSEv_AmmoBuySecondary(); + CSEv_CSBuy_f(BUY_PRIMARYAMMO); + CSEv_CSBuy_f(BUY_SECONDARYAMMO); } void diff --git a/src/server/buy.h b/src/server/buy.h index b79ac61..15cae04 100644 --- a/src/server/buy.h +++ b/src/server/buy.h @@ -15,7 +15,7 @@ */ /* values courtesy of https://wiki.alliedmods.net/Cs_weapons_information */ -int g_cstrikeWeaponPrice[] = +int cs_buyprices[] = { 0, /* WEAPON_NONE */ 1700, /* WEAPON_M3 */ @@ -40,25 +40,17 @@ int g_cstrikeWeaponPrice[] = 600, /* WEAPON_P228 */ 800, /* WEAPON_ELITES */ 750, /* WEAPON_FIVESEVEN */ - 0, /* WEAPON_KNIFE */ + 0, /* WEAPON_KNIFE */ 300, /* WEAPON_HEGRENADE */ 200, /* WEAPON_FLASHBANG */ 300, /* WEAPON_SMOKEGRENADE */ - 0 /* WEAPON_C4BOMB */ -}; - -int g_cstrikeUtilPrice[] = -{ + 0, /* WEAPON_C4BOMB */ + 0, /* padding */ + 0, /* padding */ 650, /* Kevlar Vest */ 1000, /* Kevlar Vest & Helmet */ - 200, /* Flashbang */ - 300, /* HE Grenade */ - 300, /* Smoke Grenade */ 200, /* Defuse Kit */ 1250 /* NightVision Goggles */ }; -void CSEv_BuyWeapon_f(float fWeapon); -void CSEv_BuyEquipment_f(float fWeapon); -void CSEv_AmmoBuyPrimary(void); -void CSEv_AmmoBuySecondary(void); +void CSEv_CSBuy_f(float itemID); diff --git a/src/server/buy.qc b/src/server/buy.qc index 85fb9ac..7648733 100644 --- a/src/server/buy.qc +++ b/src/server/buy.qc @@ -15,7 +15,7 @@ */ void -CSEv_BuyWeapon_f(float fWeapon) +CSEv_CSBuy_f(float fWeapon) { #if 0 CSGameRules rules = (CSGameRules)g_grMode; diff --git a/src/server/gamerules_deathmatch.qc b/src/server/gamerules_deathmatch.qc index 1b9cdba..7e6043c 100644 --- a/src/server/gamerules_deathmatch.qc +++ b/src/server/gamerules_deathmatch.qc @@ -228,14 +228,16 @@ CSDeathmatchRules::PlayerSpawn(NSClientPlayer pp) LevelNewParms(); LevelDecodeParms(pl); - pl.g_items = ITEM_KNIFE | ITEM_SUIT; - pl.activeweapon = WEAPON_KNIFE; + pl.GiveItem("item_suit"); + pl.GiveItem("weapon_knife"); +#if 0 int randomGun = (int)rint(random(WEAPON_USP45, WEAPON_FIVESEVEN)); //Weapons_AddItem(pl, randomGun, -1); randomGun = (int)rint(random(WEAPON_M3, WEAPON_PARA)); //Weapons_AddItem(pl, randomGun, -1); pl.activeweapon = randomGun; +#endif Ammo_BuyPrimary(pl, TRUE); Ammo_BuySecondary(pl, TRUE); diff --git a/src/server/item_suit.qc b/src/server/item_suit.qc deleted file mode 100644 index 8d4e8eb..0000000 --- a/src/server/item_suit.qc +++ /dev/null @@ -1,78 +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. - */ - -class item_suit:NSRenderableEntity -{ - void(void) item_suit; - - virtual void(entity) Touch; - virtual void(void) Respawn; - virtual void(void) Spawned; -}; - -void -item_suit::item_suit(void) -{ - /* a custom map may choose to override this */ - model = "models/w_kevlar.mdl"; -} - -void -item_suit::Spawned(void) -{ - super::Spawned(); - - precache_model(model); - precache_sound("items/tr_kevlar.wav"); -} - -void -item_suit::Respawn(void) -{ - super::Respawn(); - SetSolid(SOLID_TRIGGER); - SetMovetype(MOVETYPE_TOSS); - SetSize(VEC_HULL_MIN, VEC_HULL_MAX); - ReleaseThink(); -} - -void -item_suit::Touch(entity eToucher) -{ - CSPlayer pl = (CSPlayer)eToucher; - - if (pl.classname != "player") { - return; - } - - if (pl.g_items & ITEM_SUIT) { - return; - } - - sound(eToucher, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); - pl.g_items |= ITEM_SUIT; - - UseTargets(eToucher, TRIG_TOGGLE, m_flDelay); - - if (cvar("sv_playerslots") == 1) { - Destroy(); - } else { - Disappear(); - ScheduleThink(Respawn, 30.0f); - } -} - -CLASSEXPORT(item_kevlar, item_suit) diff --git a/src/server/progs.src b/src/server/progs.src index 7bb0387..16df440 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -17,12 +17,8 @@ ../../../src/gs-entbase/server.src ../../../src/gs-entbase/shared.src ../shared/defs.h - defs.h ../shared/include.src - -player.qc - hostage_entity.qc armoury_entity.qc func_bomb_target.qc @@ -33,25 +29,18 @@ func_hostage_rescue.qc info_hostage_rescue.qc func_vip_safetyzone.qc info_map_parameters.qc -item_suit.qc - ../../../src/botlib/include.src bot.qc - game_money.qc gamerules.qc gamerules_singleplayer.qc gamerules_deathmatch.qc gamerules_multiplayer.qc - radio.qc ammo.qc buy.qc server.qc ../../../valve/src/server/flashlight.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 3ff6ddd..0000000 --- a/src/server/spawn.qc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2016-2019 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. - */ - -/* -================= -info_player_start - -Counter-Terrorist Spawnpoints -================= -*/ -void -info_player_start(void) -{ - if (autocvar_fcs_swapteams == TRUE) { - self.classname = "info_player_deathmatch"; - } - self.botinfo = BOTINFO_SPAWNPOINT; -} - -/* -================= -info_player_deathmatch - -Terrorist Spawnpoints -================= -*/ -void -info_player_deathmatch(void) -{ - if (autocvar_fcs_swapteams == TRUE) { - self.classname = "info_player_start"; - } - self.botinfo = BOTINFO_SPAWNPOINT; -} - -/* Counter-Strike: Source compat */ -void -info_player_counterterrorist(void) -{ - setorigin(self, self.origin + [0,0,32]); - self.classname = "info_player_start"; - info_player_start(); -} - -void -info_player_terrorist(void) -{ - setorigin(self, self.origin + [0,0,32]); - self.classname = "info_player_deathmatch"; - info_player_deathmatch(); -} - -/* -================= -info_vip_start -================= -*/ -void -info_vip_start(void) -{ -} diff --git a/src/shared/CSProjectile.h b/src/shared/CSProjectile.h index a00110d..bf56f8d 100644 --- a/src/shared/CSProjectile.h +++ b/src/shared/CSProjectile.h @@ -1,8 +1,34 @@ +/* + * Copyright (c) 2024 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. +*/ + class CSProjectile:NSProjectile { + float m_flRangeModifier; + int m_iTotalPenetrations; + float m_flMaxThickness; + void CSProjectile(void); - -}; +#ifdef SERVER + nonvirtual void SetRangeModifier(float); + nonvirtual void SetPenetrationMaxThickness(float); + nonvirtual void SetPenetrationPower(int); + virtual void _FireSingle(vector,vector,float,float); + virtual void _LaunchHitscan(vector, vector, float); +#endif +}; diff --git a/src/shared/CSProjectile.qc b/src/shared/CSProjectile.qc index a62e885..a972432 100644 --- a/src/shared/CSProjectile.qc +++ b/src/shared/CSProjectile.qc @@ -1,5 +1,234 @@ +/* + * Copyright (c) 2024 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. +*/ + void CSProjectile::CSProjectile(void) { } + +void +CSProjectile::SetRangeModifier(float rangeModifier) +{ + m_flRangeModifier = rangeModifier; +} + +void +CSProjectile::SetPenetrationMaxThickness(float maxThickness) +{ + m_flMaxThickness = maxThickness; +} + +void +CSProjectile::SetPenetrationPower(int powerLevel) +{ + m_iTotalPenetrations = powerLevel; +} + +#ifdef SERVER +void +CSProjectile::_LaunchHitscan(vector startPos, vector launchDir, float dmgMultiplier) +{ + vector vecDir; + vector ownerAngle; + vector ownerDir; + + m_eMultiTarget = __NULL__; + m_iMultiValue = 0; + + ownerAngle = anglesToForward(launchDir); + ownerDir = aim(owner, 100000); + + while (m_iShots > 0) { + /* use cached value */ + v_forward = ownerAngle; + + if (owner.flags & FL_CLIENT) { + vecDir = ownerDir; + } else { + vecDir = v_forward; + } + + /* FOR NOW Monsters will not be able to do spread like players if patterns are enabled */ + if (!(owner.flags & FL_CLIENT)) { + vecDir += random(-1,1) * m_vecSpread[0] * anglesToRight(launchDir); + vecDir += random(-1,1) * m_vecSpread[1] * anglesToUp(launchDir); + } else { + CSPlayer pl = (CSPlayer)owner; + + /* weapons have already applied their multiplier... so attempt this */ + int multiplier = pl.cs_shotmultiplier - m_iShots; + float frand = (multiplier / 6); + + /* shoddy attempt at spray patterns */ + if (frand < 1) + frand = frand; + else if (frand <= 2) + frand = 2 - (frand * 1.5); + + vecDir += frand * m_vecSpread[0] * anglesToRight(launchDir); + vecDir += (m_vecSpread[1] * anglesToUp(launchDir)) * 2; + } + + _FireSingle(startPos, vecDir, m_flDamage, m_flRange); + m_iShots--; + } + + if (m_eMultiTarget) { + _ApplyDamage(); + } +} + +void +CSProjectile::_FireSingle(vector vecPos, vector vecAngles, float flDamage, float flRange) +{ + vector range; + vector planeNormal; + vector endPos; + + if (flRange <= 0) + return; + + if (flDamage < 1) + return; + + range = (vecAngles * 8196); + + owner.dimension_solid = 255; + owner.dimension_hit = 255; + + /* make sure we can gib corpses */ + int oldhitcontents = owner.hitcontentsmaski; + owner.hitcontentsmaski = CONTENTBITS_POINTSOLID | CONTENTBIT_CORPSE | CONTENTBIT_WATER | CONTENTBIT_SLIME | CONTENTBIT_LAVA | CONTENTBIT_PROJECTILE; + traceline(vecPos, vecPos + range, MOVE_LAGGED | MOVE_HITMODEL, owner); + owner.hitcontentsmaski = oldhitcontents; + planeNormal = trace_plane_normal; + endPos = trace_endpos; + + flRange -= trace_plane_dist; + + owner.dimension_solid = 254; + owner.dimension_hit = 254; + + m_iMultiBody |= trace_surface_id; + + if (trace_fraction >= 1.0f) + return; + + /* water impact */ + if (trace_endcontentsi & CONTENTBIT_WATER) { + SurfData_ImpactOfNamedType("water", endPos, planeNormal); + _FireSingle(endPos + (v_forward * 2), vecAngles, flDamage / 2, flRange); + } else if (trace_endcontentsi & CONTENTBIT_SLIME) { + SurfData_ImpactOfNamedType("slime", endPos, planeNormal); + _FireSingle(endPos + (v_forward * 2), vecAngles, flDamage / 2, flRange); + } else if (trace_endcontentsi & CONTENTBIT_LAVA) { + SurfData_ImpactOfNamedType("lama", endPos, planeNormal); + _FireSingle(endPos + (v_forward * 2), vecAngles, flDamage / 2, flRange); + } + + if (trace_ent.takedamage != DAMAGE_NO && trace_ent.iBleeds) { + Sound_Play(trace_ent, CHAN_BODY, "damage_bullet.hit"); + + NSClientPlayer pl = (NSClientPlayer)trace_ent; + /* modify the damage based on the location */ + switch (trace_surface_id) { + case BODY_HEAD: + /* the helmet is one power house */ + if (pl.HasItem("item_kevlar_helmet") == true) { + flDamage = 0; + Sound_Play(trace_ent, CHAN_BODY, "player.headshotarmor"); + pl.RemoveItem("item_kevlar_helmet"); + return; + } else { + flDamage *= 4; + Sound_Play(trace_ent, CHAN_BODY, "player.headshot"); + } + break; + case BODY_STOMACH: + flDamage *= 0.9; + if (pl.armor > 0) + Sound_Play(trace_ent, CHAN_BODY, "player.hitarmor"); + break; + case BODY_LEGLEFT: + case BODY_LEGRIGHT: + flDamage *= 0.4; + break; + } + } + + /* impact per bullet */ + if (m_bDetonateOnWorld == true && trace_ent.iBleeds == 0) { + if (m_strDecalGroup) + DecalGroups_Place(m_strDecalGroup, endPos + (vecAngles * -2)); + + SurfData_Impact(trace_ent, endPos, planeNormal); + } + + /* combine them into one single Damage_Apply call later */ + if (trace_ent.takedamage != DAMAGE_NO) { + if (trace_ent != m_eMultiTarget) { + trace_endpos = endPos; + _ApplyDamage(); + m_eMultiTarget = (NSSurfacePropEntity)trace_ent; + m_iMultiValue = flDamage; + } else { + m_iMultiValue += flDamage; + } + } + + if (m_iTotalPenetrations > 0) { + float cont; + +#if 0 + if (!(trace_surfaceflagsi & SURF_PENETRATE)) + m_iTotalPenetrations -= 1; +#endif + + /* check if this wall is 6 units thick... */ + if (m_iTotalPenetrations > 0) { + cont = pointcontents(endPos + v_forward * 5); + + if (cont == CONTENT_SOLID) + m_iTotalPenetrations -= 1; /* deduct 1 penetration power */ + } + + cont = pointcontents(endPos + v_forward * m_flMaxThickness); + + if (cont == CONTENT_EMPTY) + _FireSingle(endPos + (v_forward * 2), vecAngles, flDamage / 2, flRange); + } +} + +CSProjectile +CSProjectile_SpawnDef(string entityDef, NSEntity theOwner, float rangeMod, int power, vector spread) +{ + entity oldself = self; + + CSProjectile rocket = spawn(CSProjectile); + rocket.owner = theOwner; + self = rocket; + EntityDef_SpawnClassname(entityDef); + self = oldself; + + rocket.m_vecSpread = spread; + rocket.SetRangeModifier(rangeMod); + rocket.SetPenetrationPower(power); + rocket.SetPenetrationMaxThickness((8 * power) * rangeMod); + rocket.Launch(theOwner.GetEyePos(), theOwner.GetViewAngle(), 0.0f, 0.0f, 0.0f); + return rocket; +} +#endif diff --git a/src/shared/CSWeapon.qc b/src/shared/CSWeapon.qc index 950d2b1..80aed9b 100644 --- a/src/shared/CSWeapon.qc +++ b/src/shared/CSWeapon.qc @@ -1,3 +1,18 @@ +/* + * Copyright (c) 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. + */ #ifdef CLIENT void Cstrike_DrawCrosshair(CSPlayer); @@ -23,7 +38,7 @@ CSWeapon:NSWeapon virtual void PrimaryAttack(void); virtual void SecondaryAttack(void); virtual void Release(void); - virtual void HitscanAttack(string); + virtual void FiredWeapon(string); virtual void SwitchedToWeapon(void); }; @@ -87,11 +102,11 @@ CSWeapon::SecondaryAttack(void) } void -CSWeapon::HitscanAttack(string defName) +CSWeapon::FiredWeapon(string defName) { CSPlayer ourOwner = (CSPlayer)owner; int numProjectiles = GetSubDefInt(defName, "numProjectiles"); - string traceInfo = GetSubDefString(defName, "def_projectile"); + string traceInfo = GetSubDefString(defName, "def_onFire"); float flAccuracyDivisor = GetSubDefFloat(defName,"accuracyDivisor"); float flAccuracyMovementPenalty = GetSubDefFloat(defName,"accuracyMovementPenalty"); float flAccuracyMultiplier = GetSubDefFloat(defName,"accuracyMultiplier"); @@ -119,15 +134,12 @@ CSWeapon::HitscanAttack(string defName) float traceDamage = GetSubDefFloat(traceInfo, "damage"); /* don't bother with shotguns */ - if (numProjectiles <= 3i) { - //TraceAttack_SetRangeModifier(flRangeModifier); - //TraceAttack_SetPenetrationPower(flPenetrationPower); - } else { + if (numProjectiles > 3i) { bulletSpread = [random(-1,1) * 0.1,random(-1,1) * 0.05]; } for (int i = 0i; i < numProjectiles; i++) { - // TraceAttack_FireBulletsWithDecal(1, ourOwner.GetEyePos(), traceDamage, bulletSpread, 0, "Impact.BigShot", ourOwner); + CSProjectile_SpawnDef(traceInfo, owner, flRangeModifier, flPenetrationPower, bulletSpread); } #endif @@ -137,7 +149,7 @@ CSWeapon::HitscanAttack(string defName) /* don't bother with shotguns */ if (numProjectiles <= 3i) { - Cstrike_ShotMultiplierAdd(ourOwner, flMultiplierShots, flMultiplierStrength,accuracy* flMultiplierInaccuracy); + Cstrike_ShotMultiplierAdd(ourOwner, flMultiplierShots, flMultiplierStrength, accuracy * flMultiplierInaccuracy); } } diff --git a/src/server/player.qc b/src/shared/buying.h similarity index 53% rename from src/server/player.qc rename to src/shared/buying.h index bfec853..c039799 100644 --- a/src/server/player.qc +++ b/src/shared/buying.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021 Marco Cawthorne + * 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 @@ -14,14 +14,45 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -void -Player_Precache(void) +/* Weapon Indices for the weapon table */ +typedef enum { - searchhandle pm; - pm = search_begin("models/player/*/*.mdl", TRUE, TRUE); - for (int i = 0; i < search_getsize(pm); i++) { - precache_model(search_getfilename(pm, i)); - } - search_end(pm); -} + BUY_NONE, + BUY_M3, + BUY_XM1014, + BUY_MP5, + BUY_P90, + BUY_UMP45, + BUY_MAC10, + BUY_TMP, +#if defined(CZERO) || defined(CSSOURCE) + BUY_FAMAS, + BUY_GALIL, +#endif + BUY_AK47, + BUY_SG552, + BUY_M4A1, + BUY_AUG, + BUY_SCOUT, + BUY_AWP, + BUY_G3SG1, + BUY_SG550, + BUY_PARA, + BUY_USP45, + BUY_GLOCK18, + BUY_DEAGLE, + BUY_P228, + BUY_ELITES, + BUY_FIVESEVEN, + BUY_KNIFE, + BUY_HEGRENADE, + BUY_FLASHBANG, + BUY_SMOKEGRENADE, + BUY_C4BOMB, + BUY_PRIMARYAMMO, + BUY_SECONDARYAMMO, + BUY_VEST, + BUY_VESTHELMET, + BUY_DEFUSALKIT, + BUY_NIGHTVISION +} cs_buyindex; diff --git a/src/shared/defs.h b/src/shared/defs.h index 9e9e14c..2c955e1 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -16,10 +16,11 @@ #include "animations.h" #include "radio.h" -#include "weapons.h" +#include "buying.h" #include "items.h" #include "entities.h" #include "events.h" +#include "CSProjectile.h" #define TEAM_SPECTATOR 0 #define TEAM_T 1 diff --git a/src/shared/include.src b/src/shared/include.src index b77e372..c9b7a40 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -12,6 +12,7 @@ fx_flashbang.qc fx_smokenade.qc item_c4bomb.qc weapons_cstrike.qc +CSProjectile.qc CSWeapon.qc pmove.qc #endlist diff --git a/src/shared/player.h b/src/shared/player.h index d7a595c..01ddcd3 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -121,7 +121,6 @@ class CSPlayer:NSClientPlayer PREDICTED_FLOAT(anim_bottom) PREDICTED_FLOAT(anim_bottom_time) - virtual float(void) Physics_MaxSpeed; virtual void(float) Physics_Fall; virtual void(void) Physics_Jump; diff --git a/src/shared/pmove.qc b/src/shared/pmove.qc index 420cfaa..9a67b0a 100644 --- a/src/shared/pmove.qc +++ b/src/shared/pmove.qc @@ -39,101 +39,6 @@ .float waterlevel; .float watertype; -/* values courtesy of https://wiki.alliedmods.net/Cs_weapons_information */ -float -CSPlayer::Physics_MaxSpeed(void) -{ - float spd = super::Physics_MaxSpeed(); - - switch (activeweapon) - { - case WEAPON_M3: - spd *= 230/250; - break; - case WEAPON_XM1014: - spd *= 240/250; - break; - case WEAPON_MP5: - spd *= 250/250; - break; - case WEAPON_P90: - spd *= 245/250; - break; - case WEAPON_UMP45: - spd *= 250/250; - break; - case WEAPON_MAC10: - spd *= 250/250; - break; - case WEAPON_TMP: - spd *= 250/250; - break; - case WEAPON_AK47: - spd *= 221/250; - break; - case WEAPON_SG552: - spd *= 235/250; - break; - case WEAPON_M4A1: - spd *= 230/250; - break; - case WEAPON_AUG: - spd *= 240/250; - break; - case WEAPON_SCOUT: - spd *= 260/250; - break; - case WEAPON_AWP: - spd *= 210/250; - break; - case WEAPON_G3SG1: - spd *= 210/250; - break; - case WEAPON_SG550: - spd *= 210/250; - break; - case WEAPON_PARA: - spd *= 220/250; - break; - case WEAPON_USP45: - spd *= 250/250; - break; - case WEAPON_GLOCK18: - spd *= 250/250; - break; - case WEAPON_DEAGLE: - spd *= 250/250; - break; - case WEAPON_P228: - spd *= 250/250; - break; - case WEAPON_ELITES: - spd *= 250/250; - break; - case WEAPON_FIVESEVEN: - spd *= 250/250; - break; - case WEAPON_KNIFE: - spd *= 250/250; - break; - case WEAPON_HEGRENADE: - spd *= 250/250; - break; - case WEAPON_FLASHBANG: - spd *= 250/250; - break; - case WEAPON_SMOKEGRENADE: - spd *= 250/250; - break; - case WEAPON_C4BOMB: - spd *= 250/250; - break; - default: - } - - return spd; -} - void CSPlayer::Physics_Fall(float impactspeed) { diff --git a/src/shared/weapons.h b/src/shared/weapons.h deleted file mode 100644 index facea3f..0000000 --- a/src/shared/weapons.h +++ /dev/null @@ -1,66 +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 Indices for the weapon table */ -enum -{ - WEAPON_NONE, - WEAPON_M3, - WEAPON_XM1014, - WEAPON_MP5, - WEAPON_P90, - WEAPON_UMP45, - WEAPON_MAC10, - WEAPON_TMP, -#if defined(CZERO) || defined(CSSOURCE) - WEAPON_FAMAS, - WEAPON_GALIL, -#endif - WEAPON_AK47, - WEAPON_SG552, - WEAPON_M4A1, - WEAPON_AUG, - WEAPON_SCOUT, - WEAPON_AWP, - WEAPON_G3SG1, - WEAPON_SG550, - WEAPON_PARA, - WEAPON_USP45, - WEAPON_GLOCK18, - WEAPON_DEAGLE, - WEAPON_P228, - WEAPON_ELITES, - WEAPON_FIVESEVEN, - WEAPON_KNIFE, - WEAPON_HEGRENADE, - WEAPON_FLASHBANG, - WEAPON_SMOKEGRENADE, - WEAPON_C4BOMB -}; - -#define AMMO_MAX_50AE 35 -#define AMMO_MAX_762MM 90 -#define AMMO_MAX_556MM 90 -#define AMMO_MAX_556MMBOX 200 -#define AMMO_MAX_338MAG 30 -#define AMMO_MAX_9MM 120 -#define AMMO_MAX_BUCKSHOT 32 -#define AMMO_MAX_45ACP 100 -#define AMMO_MAX_357SIG 52 -#define AMMO_MAX_57MM 100 -#define AMMO_MAX_FLASHBANG 2 -#define AMMO_MAX_SMOKE 1 -#define AMMO_MAX_HENADE 1 diff --git a/zpak001.pk3dir/def/items.def b/zpak001.pk3dir/def/items.def new file mode 100644 index 0000000..30adb5d --- /dev/null +++ b/zpak001.pk3dir/def/items.def @@ -0,0 +1,6 @@ +#include "items/c4.def" +#include "items/suit.def" +#include "items/kevlar_helmet.def" +#include "items/nightvision.def" +#include "items/defuse.def" +#include "items/kevlar.def" diff --git a/zpak001.pk3dir/def/item_c4.def b/zpak001.pk3dir/def/items/c4.def similarity index 100% rename from zpak001.pk3dir/def/item_c4.def rename to zpak001.pk3dir/def/items/c4.def diff --git a/zpak001.pk3dir/def/items/defuse.def b/zpak001.pk3dir/def/items/defuse.def new file mode 100644 index 0000000..705eb4c --- /dev/null +++ b/zpak001.pk3dir/def/items/defuse.def @@ -0,0 +1,10 @@ +entityDef item_defuse +{ + "spawnclass" "NSItem" + "model" "models/w_thighpack.mdl" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "snd_acquire" "buy.weapon" + "snd_respawn" "item.respawn" + "inv_carry" "1" +} diff --git a/zpak001.pk3dir/def/items/kevlar.def b/zpak001.pk3dir/def/items/kevlar.def new file mode 100644 index 0000000..dc7f513 --- /dev/null +++ b/zpak001.pk3dir/def/items/kevlar.def @@ -0,0 +1,11 @@ +// actually armor +entityDef item_kevlar +{ + "spawnclass" "NSItem" + "model" "models/w_kevlar.mdl" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "snd_acquire" "buy.kevlar" + "snd_respawn" "item.respawn" + "inv_armor" "100" +} diff --git a/zpak001.pk3dir/def/items/kevlar_helmet.def b/zpak001.pk3dir/def/items/kevlar_helmet.def new file mode 100644 index 0000000..65b21ee --- /dev/null +++ b/zpak001.pk3dir/def/items/kevlar_helmet.def @@ -0,0 +1,11 @@ +// other equipment +entityDef item_kevlar_helmet +{ + "spawnclass" "NSItem" + "model" "models/w_kevlar.mdl" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "snd_acquire" "buy.kevlar" + "snd_respawn" "item.respawn" + "inv_carry" "1" +} diff --git a/zpak001.pk3dir/def/items/nightvision.def b/zpak001.pk3dir/def/items/nightvision.def new file mode 100644 index 0000000..e1380dc --- /dev/null +++ b/zpak001.pk3dir/def/items/nightvision.def @@ -0,0 +1,10 @@ +entityDef item_nightvision +{ + "spawnclass" "NSItem" + "model" "models/w_backpack.mdl" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "snd_acquire" "buy.weapon" + "snd_respawn" "item.respawn" + "inv_carry" "1" +} diff --git a/zpak001.pk3dir/def/items/suit.def b/zpak001.pk3dir/def/items/suit.def new file mode 100644 index 0000000..95854b9 --- /dev/null +++ b/zpak001.pk3dir/def/items/suit.def @@ -0,0 +1,11 @@ +// used in the training mission, HUD etc. +entityDef item_suit +{ + "spawnclass" "NSItem" + "model" "models/w_kevlar.mdl" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "snd_acquire" "buy.kevlar" + "snd_respawn" "item.respawn" + "inv_carry" "1" +} diff --git a/zpak001.pk3dir/def/projectiles.def b/zpak001.pk3dir/def/projectiles.def new file mode 100644 index 0000000..6d8bc9c --- /dev/null +++ b/zpak001.pk3dir/def/projectiles.def @@ -0,0 +1,15 @@ +entityDef projectile_bullet_base +{ + "spawnclass" "CSProjectile" + "is_bullet" "1" + "decal_impact" "Impact.BigShot" + "detonate_on_world" "1" +} + +entityDef projectile_bullet_shotgun +{ + "spawnclass" "NSProjectile" + "is_bullet" "1" + "decal_impact" "Impact.BigShot" + "detonate_on_world" "1" +} diff --git a/zpak001.pk3dir/def/weapons/famas.def b/zpak001.pk3dir/def/weapons/famas.def new file mode 100644 index 0000000..2fd44b4 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/famas.def @@ -0,0 +1,56 @@ +entityDef weapon_famas +{ + "inherit" "CSBaseRifle" + "editor_usage" "FAMAS Weapon - Uses ammo_762nato" + + "model" "models/w_famas.mdl" + "model_view" "models/v_famas.mdl" + + "inv_name" "FAMAS Weapon" + "def_fireInfo" "fireInfo_famas" + "clipSize" "" + + "actFire" "" + "actAltFire" "" + "actHolster" "" + "actReload" "" + "actDraw" "" + "actIdle" "" + + + "snd_fire" "Weapon_FAMAS.Single" + + "speed_mod" "" + "price" "" + "crossMinDist" "" + "crossDeltaDist" "" + "accuracyDivisor" "" + "accuracyMovementPenalty" "" + "accuracyMultiplier" "" + "rangeModifier" "" + "penetrationPower" "" + "bulletStrength" "" + "multiplierShots" "" + "multiplierStrength" "" + "multiplierInaccuracy" "" + + "hudSlot" "0" + "hudSlotPos" "7" + "weight" "25" +} + +entityDef projectile_famas +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_famas_dmg" +} + +entityDef fireInfo_famas +{ + "def_onFire" "projectile_famas" + "ammoType" "ammo_762nato" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "" + "model_flash" "sprites/muzzleflash2.spr" +} diff --git a/zpak001.pk3dir/def/weapons/galil.def b/zpak001.pk3dir/def/weapons/galil.def new file mode 100644 index 0000000..974a647 --- /dev/null +++ b/zpak001.pk3dir/def/weapons/galil.def @@ -0,0 +1,27 @@ +entityDef weapon_galil +{ + "inherit" "CSBaseRifle" + "editor_usage" "galil" + + "model" "models/w_galil.mdl" + "model_view" "models/v_galil.mdl" + + "def_onFire" "projectile_csbullet" + "inv_name" "galil" + "clipSize" "50" + "clipSizeDefault" "25" + "ammoType" "ammo_762nato" + + "actFire" "5,6,7" + "actAltFire" "2" + "actHolster" "4" + "actReload" "3" + "actDraw" "4" + "actIdle" "0,1" + + "snd_fire" "Weapon_Galil.Single" + + "hudSlot" "0" + "hudSlotPos" "7" + "weight" "25" +} diff --git a/zpak001.pk3dir/def/weapons/m3.def b/zpak001.pk3dir/def/weapons/m3.def index 5f2a50c..8ae2a41 100644 --- a/zpak001.pk3dir/def/weapons/m3.def +++ b/zpak001.pk3dir/def/weapons/m3.def @@ -40,13 +40,13 @@ entityDef weapon_m3 entityDef projectile_m3 { - "inherit" "projectile_bullet_base" + "inherit" "projectile_bullet_shotgun" "damage" "skill:plr_m3_dmg" } entityDef fireInfo_m3 { - "def_onFire" "projectile_m3" + "def_onFire" "projectile_m3" "ammoType" "ammo_buckshot" "ammoRequired" "1" "ammoPerShot" "1" diff --git a/zpak001.pk3dir/def/weapons/xm1014.def b/zpak001.pk3dir/def/weapons/xm1014.def index b1b570c..3dd9377 100644 --- a/zpak001.pk3dir/def/weapons/xm1014.def +++ b/zpak001.pk3dir/def/weapons/xm1014.def @@ -42,7 +42,7 @@ entityDef weapon_xm1014 entityDef projectile_xm1014 { - "inherit" "projectile_bullet_base" + "inherit" "projectile_bullet_shotgun" "damage" "skill:plr_xm1014_dmg" } diff --git a/zpak001.pk3dir/maps/eukara/test_weapons.bsp b/zpak001.pk3dir/maps/eukara/test_weapons.bsp new file mode 100644 index 0000000000000000000000000000000000000000..7919edddd071eca911603df2a787f1fa3d82cee3 GIT binary patch literal 18992 zcmeI333Oc7S;wE8I9`(2vMpP?G}?KC)1 zb1290p-qU}p0=DMKAgHKX-dFoErzk5=P|}t zGuCsPVXTEd2=65K=hhm=ry2ihx?z0OZy3jK*W>${_i6Y~-C-E_aUa;o9Qd#Ed3!0|-=Gel^y0eJZpO|RT7hYsZ^JCNcHO+cf!!KD}EGKL7 zS?Ep7RnO3KO#Lh##n`95)t5zIcsViGqRn{GOkFGq!uv+wQhR3{wh6EBrF-$2ezACz z+`gsu_L%lsx(Q#8haJXC2|FyA-!|8^p5=bZ!?sf%wizD&JLO@U;bGe;58HY?Y+LZK zZNbB~9uM1Ici3jxx4{FGkM*vSVf!O~T&wtQ#N%Bdz?Zn4K?y;tL}$$Z8>VQe&RwZ{~f8hbS^GPf8cB_ENgxZ;MI_geg_ zk!x&LV_*n>_RxI&x-ZYtH}Idc@8mJ?qs1?LHvfx`es7|0@hh3gw&pH4`aNb}?$)|8 z?(AD@DZ06q;z^E5tIxqGv!A46ioUGbnUJ@n<4k_M>>54av+4k&^{K6l0C?9Z;|H z#ekj*KU;uK3>-X=|xZcJTF9imqwK4=NfFX0Cs`=)l=l(TFg# zK4?;%KBQ=jLOTUbLj1U*Q4yeh5ZZd4KdNYY-KR_%^#I>%+Ca7Dd(uH`1OS4)G%Akl z@HgVC44}dN7K6}pzm+{)Y`CFL1GjM}tSq}m?a*uK5mLU_85!Ky(-Vx!`GT-=Hn16Ua~ zG^r(j2(6BLJ!AH6&%Z*G zTGK__LHl){e~I=Bw4FS^&b^!aFLM87S`Yp2aQ_$DOSG@hewEe>om*V?#4po+m(~aE zuetYg{~Gt-q5T}~>$Gpu{*gAo*dKHM1KM@kYqVX^cGIMe4br|1?e}PV>Hih?pQnA5 zwvXpmx&I~Yi?o+%FVg;%_S3X4(T3pJPkV#@Ptu0zAE5m?{hy-!4DBG#Kf(PAw9nIi zmi8^$pV6MD{S)mFJipETIojXR?&A5^xPOi&dGi7d5+9EApm7ywq?%D3Rx3Qpi9~R} z1~jgPD%r3eRNqct@GY5fCkPjeZv>6$P&P4R758+N4O_tFCdM-O*{qPi4K!wg#w?yQ zpkyIu4P4nEG6zKFg2+6cazSN2s4O7c3!&tbJCZ#`WOFgp9FSN75=-GM1&w8Jl!3@{ zxJp1}g;B{*DXog1?fjI{s`;tmr=0uk*iysTYItRT+=e#A*iwj1*=SwMPaQwEAu*E~ z>*&|>vxes9XA9$gES3D1ta$8Y-Q?W)81Rv1ol(WdiI3#7v8u%+0SQBt(EtYlk7X=Y`4*7l0*>Z+WY?K!p8xw+XJxt#ny;onkHlu=r| zwVWwsGNr0QX60mU$noIcTvTW+p{A6V%B*adJ@_~I3N*i7LRKj&*_xfXLGvqRocd_~ z&BcXVO2mqc(jxh03QM38CIspWTAPb^c2x}St~+vf>qKZ^;i03S`sB>@=O4QM{6cB5 z#ax+PSDoA7FKlZm>E2PfZ_t1IXh-DC;N?e7eCdl9VZQRirxmj(zg?K~G;`0+s-eC9 zdyjWaMfZN_gCk1pL(wyXXkw~SDQYYu*=A0z^EFFn)A^;_a64i0*X1`i7Ik%$5A@X> zI?yz7VrT5^el+>Qa~Dtsw@9Q)w-F}7T3?gb81S{XmZJ8)!TO{3w1r0dFPu9BKR(fs zb$PF)NeizY9%{fR@FO1|>aZ>mE)K-oyZUS3M?U)Ca~)O*P4QM>rZms>*XB1h_}Uf! zKwmZbpg%DJmhekV#Vw}8@gbJNk9>?pf9xfu8pgu!+fu4vT&V&i{I&UwfkO1hUZ$Xx z4SNM+6T_OnW_vEq0WJ6ke}Wk&>}_MUKIo4#S%N8O#jKl3tL)4>fi(Enct$ISVhaC~ zGGacL1^%U(n8*~^BvXpFN={`hYToy<-1<{16i!#d_{5O?WVwb9u%O)%ZLC2j) zt*8{Npvc&T5o}ZCsC85WN|`)XBpxX{tjM~kiVoxg+7dM?Bn8LjWC+`3NO97~Z=eNq zF+?Aq6Bl7qed0w-VS`SeSmO zG!?TtGBqc;4=O+cK17JV=;I}9$0GEkT!T+I1$Ba%4Cq8hU-Xd%8v=2Z=xNCmL=|p< z&UVixPKOK6!-kizUGQni)Odr=TIN-ejWl6n>C$Z)$pUN(rO=%hJZLCMq%d#eTw@iw z^Mc1@Q<-9CfkrZEC|9w0$RTUUHJwvVPQ|=Y;Vl&`ok{8mc*2C|@h6T-l!D?6@S_ho z01r3;5<*WvE#^FnS*n4jWM?W_%u-~;BB>Z2M&(Ifn+Yo$V&(?zQp;UtF>w|ImE9XT zH^QugwI~o$WD>>1EDl*x5b%swh-C?ve3n=iJa$n+|D>=i7631jpPQZv@JsmJsZ{Gu zCFI-oE}Nt(3T6@ZPXAhpm6`s|V!mu)u{HuRHc81c%cc{bfPC3vD7%boK;lX8nYzpp zU#$t2-c+W*@617Lcjm7%@#%AFGK&V)Lmlj;?5Ltd$5pRfwT^(2CU%{4)mT@3cGY&* zzQ8%bxu>Y)P3%WvzGE+Q?SqXCMgIE2y4r%8>ip{Mc~(D<{`RU|MVC%hWlm)U=V9T| z{fhEz%>$i&d0F=;e!%b3Y|t^hzOH~NjjE5~wKe%J=P28AD>){K zy;(KYwr7Om@|DYzE>SF`7u5^7)L5isy${2kCb$fAnV)b@n>Yv8!C<>iIab`I9lOZw z60!hc;vzcq_YV4*jzA3{s=;YS}m{ecgB-vjTv=j_bz#Ki8AlRd|db{sm`jQMar^ODw}*#qJ5;Hgu+$B%X1b*Ke*ed_5LoIn1#3(r1#j{Z|m zML+zJ@kcJ7eDJ}ebFqW(4G#uS^&LOn1vBntb!5W%W6#Xff8q%(`GhHXa?h!egk-HV zGU0sc>eRWoF`$?C|Y|M->A<;y1*7LK1kf7euWC^WX~#Cy7r+|zzwxEUm1`;`xe z&=b4pU%ou@@Wc1M?|pZlJv$tp+=IgR-Mi!P;nw{_jlcjeU3%ms(k@*(K_8iL;)gS5 z_KuAXAol1H({DiHfd}q+@Z!-2A3TOd_?Fd?2`38R;p4};4&P;p1zLDM7CV5KkVYRp z!{I&1g!A6xUH9DGc3`+^@1WEc@I#F7JpP1-J_3WmK32!Ka2`BB;H1u|a#4i@VuT@l z(}xX<(391X3Fq!zk{yx`?G?w4b`nkG@C^p=(%pyKKmz8oIx&zjwh&5v!Gk|x z12Z@ZJy~6+m`;|PN-F?NvXd8lOTV?O4cIrANHuGqg86igXgre|U0mc#hop&}P#XV@ z@cT`Eij|#%WFmc?gG|&#)s=%D*{zBIvvfVzOXy6*K%AMpZdBr4yKdkv%Wo~pbxkQ; zCqX&h1q@VBI*%ObP(f+&3<@C*t~lJ28c6R2NP~-jbgb)cH;^hlAUY`!J*glHzZ0S< zzz@F*{G`$&%ca#pRgOTQPS}sEEMX}W6oDsIDWL!O<71Q~DFx^5ibnT^#w2G|DQKb; z+*DztkaAjJ=K_js1R#^(5@I$8GL$qyRT2TQ0Hdlhm-7Sg)BFGie!v5~!7XsoQ`kO$ z9D6ILi^cpt$~fR;34jX1**KU5fZ203zf&LN3%|L9IfaGTuNA)thoAIeQwY@iG{07f zCCE5d;hTk60+q;pstPy+UEpM9W|)FT)QAOM#c$dWtiWorfXVs# z3pNz;8f7#y`9dN9ZweFzEfzb-W~OH718JrW>mGp+R%9 zkNQA#kk6(7w#ioNB-IaP5RT>)WbH#j2|x1Dhm8Y!i77CqP68V&1;$z#wg#e!eDpzo z>}3k8IAJVq>@fL}k3KjDd+`tc1T(XE9XHl=`acXLHXy^euo-m~iK3fo%c z?My%VhI6<{U5)hj4>b(&mbAyeXP2D% z`g&pJElIznmcn+B>wtXIM>qxFdZnuEH(#kZ8p#`w;%q*2pqTWtzS;nWZ`G1Z1yoj=)VR=_NW)o%65hLhbo?-!l-4F(3)YanWnr@&RK z!J;@pU-TWW)862>#NrK@F%UUi@aT?qG6j&bDb|@fi0g1skzIrV0nz$~j!0S2al3^ySbZWs2WCm&)$YSxJZqG*bvVa#$BViI+Md zSSK9K+yyh0N>%S&^@JX`0|T4@mH-%d=Ip^*gcaLy7lGb2Af+BduwC#r++^=Kpb;x@ z5qc70TtT=8_vn400T=*=fL*VeIW?8(QtHjJRxL`hQw@Ab(20WRtYDAM%0Tll2D2C_-l$QoGtYYx<)KE4dC_*DHNi%Ni$j#F z;m37;>m)`%wL|1Esa@SCzh{7-(BMNIK{Qcno5w-5nrVwJg6i5kjJyL?~ ziu6BMf;d%Tg}pAW;89h!x2puH->_k$4U?i zC|A6@N|4TrH&KGv-QK1Wr0Z465(MB?F3bDQ&6Xf3o2p7IEkSZnR|k8kvF~gNQfEjC zIGV7JBr8Fo6Wu8;cSUm44XIb}M1f-6rDr7B0@TIc;n?Vtossl0Dft=6E>LQNlf#eK z8R_jPQ1%&#)0E>tg_-(j_a+LI^QiU~&q%2Y6sMy%c}7y_u9cjTNa443Mv^0k9H>&B zkqET=jI>{l5c;h=^%)6ddYq9~P@vw*87W19dN-Vr>eMNBg=eILdjqa(>^(bET#0{7 zwEtD{`une&m*bxr)u>A{kIthJXE|p9G~Wu}9Y-=<@%Te6#c%Ccq?>Nyxx>=g)6CelqO#EIN^g{DUXZZ z3cu$S&-<S`kNMbF<+ynqf3HGCe*X9@S69>x-konRB7pSa^C0 zu?-D=NU`bpsj(Q30Um~f7Y+xfCPF+m`P*A$crG|QHx`^d14-B?g3-`icrGF=@;ntf zKR*?oGoQvnSTncNCcnB@~)+|IG5rgQ*;lAubhgW4+UqYr$&Njny_iH zv1*RYOEzbI!fQ%PQ}P+-XS`|4g&QdldSu7L@&k;}$ zFQ~95({Vf)4KA65Nh!QN9zGX}h0cYR;7eg5sW-;K=;Uc|=ho5hOW}=)#@GZovpBX2 zeo6c=5sZW*ODClA_(WuS^h^LWyH}}Acx#*J8 zB{Nc)G#{O5YWC1CWi^?PEm=n`lH8~Z(SSeDB Date: Wed, 24 Jul 2024 19:09:51 -0700 Subject: [PATCH 04/17] add PROJECT file, add missing HUD binds from FHL. fix missing T spawn in eukara/test_weapons --- PROJECT | 1 + src/client/cmds.qc | 43 ++++++++++++++++++++ zpak001.pk3dir/def/spawns.def | 2 +- zpak001.pk3dir/maps/eukara/test_weapons.bsp | Bin 18992 -> 19072 bytes zpak001.pk3dir/maps/eukara/test_weapons.map | 6 +++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 PROJECT diff --git a/PROJECT b/PROJECT new file mode 100644 index 0000000..65339cb --- /dev/null +++ b/PROJECT @@ -0,0 +1 @@ +TacticalRetreat \ No newline at end of file diff --git a/src/client/cmds.qc b/src/client/cmds.qc index 7ae10cf..4ba3962 100644 --- a/src/client/cmds.qc +++ b/src/client/cmds.qc @@ -16,6 +16,10 @@ void VGUI_ChooseTeam(void); void VGUI_BuyMenu(void); +void HUD_DrawWeaponSelect_Back(void); +void HUD_DrawWeaponSelect_Forward(void); +void HUD_DrawWeaponSelect_Last(void); +void HUD_SlotSelect(int); void CMD_ChooseTeam(void) @@ -51,6 +55,45 @@ int ClientGame_ConsoleCommand(void) { switch(argv(0)) { + case "invnext": + HUD_DrawWeaponSelect_Back(); + break; + case "invprev": + HUD_DrawWeaponSelect_Forward(); + break; + case "lastinv": + HUD_DrawWeaponSelect_Last(); + break; + case "slot1": + HUD_SlotSelect(0); + break; + case "slot2": + HUD_SlotSelect(1); + break; + case "slot3": + HUD_SlotSelect(2); + break; + case "slot4": + HUD_SlotSelect(3); + break; + case "slot5": + HUD_SlotSelect(4); + break; + case "slot6": + HUD_SlotSelect(5); + break; + case "slot7": + HUD_SlotSelect(6); + break; + case "slot8": + HUD_SlotSelect(7); + break; + case "slot9": + HUD_SlotSelect(8); + break; + case "slot10": + HUD_SlotSelect(9); + break; case "chooseteam": CMD_ChooseTeam(); break; diff --git a/zpak001.pk3dir/def/spawns.def b/zpak001.pk3dir/def/spawns.def index 7ca23f6..787c20a 100644 --- a/zpak001.pk3dir/def/spawns.def +++ b/zpak001.pk3dir/def/spawns.def @@ -23,4 +23,4 @@ entityDef info_player_coop "editor_description" "Cooperative Spawn Point" "editor_color" "1 0 0" "spawnclass" "NSSpawnPoint" -} \ No newline at end of file +} diff --git a/zpak001.pk3dir/maps/eukara/test_weapons.bsp b/zpak001.pk3dir/maps/eukara/test_weapons.bsp index 7919edddd071eca911603df2a787f1fa3d82cee3..7b0a2153606c13ee7d515b713914f35d61d3e5b2 100644 GIT binary patch delta 58 zcmdlmg|T5OqnI2614E7@1H(;r28J3S`vMaKgNNrvv2Lfy;ZCMpDXEDi8M%oi$r+m` NI;FF1{_bJP2mrfI5iI}! delta 43 ycmZpe%D7<)qnI2614E7@149=(149jveSwLA;fKdYv2Lf$ADqJ3HhXwlFaiMT Date: Fri, 26 Jul 2024 12:59:00 -0700 Subject: [PATCH 05/17] Fix the dual beretta classname --- src/server/game_rules.qc | 0 src/server/gamerules_multiplayer.qc | 2 +- zpak001.pk3dir/cfg/skill_cstrike.cfg | 8 ++++---- zpak001.pk3dir/def/weapons.def | 2 +- .../def/weapons/{elites.def => elite.def} | 18 +++++++++--------- zpak001.pk3dir/maps/eukara/test_weapons.bsp | Bin 19072 -> 19068 bytes zpak001.pk3dir/maps/eukara/test_weapons.map | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) mode change 100755 => 100644 src/server/game_rules.qc rename zpak001.pk3dir/def/weapons/{elites.def => elite.def} (79%) diff --git a/src/server/game_rules.qc b/src/server/game_rules.qc old mode 100755 new mode 100644 diff --git a/src/server/gamerules_multiplayer.qc b/src/server/gamerules_multiplayer.qc index 677bd2e..7c5cf78 100644 --- a/src/server/gamerules_multiplayer.qc +++ b/src/server/gamerules_multiplayer.qc @@ -312,7 +312,7 @@ CSMultiplayerRules::InitPostEnts(void) EntityDef_Precache("weapon_awp"); EntityDef_Precache("weapon_c4"); EntityDef_Precache("weapon_deagle"); - EntityDef_Precache("weapon_elites"); + EntityDef_Precache("weapon_elite"); EntityDef_Precache("weapon_famas"); EntityDef_Precache("weapon_fiveseven"); EntityDef_Precache("weapon_flashbang"); diff --git a/zpak001.pk3dir/cfg/skill_cstrike.cfg b/zpak001.pk3dir/cfg/skill_cstrike.cfg index 2afe7e7..988ac89 100644 --- a/zpak001.pk3dir/cfg/skill_cstrike.cfg +++ b/zpak001.pk3dir/cfg/skill_cstrike.cfg @@ -96,10 +96,10 @@ set sk_plr_fiveseven_dmg1 25 set sk_plr_fiveseven_dmg2 25 set sk_plr_fiveseven_dmg3 25 -// elites: bullet damage -set sk_plr_elites_dmg1 45 -set sk_plr_elites_dmg2 45 -set sk_plr_elites_dmg3 45 +// elite: bullet damage +set sk_plr_elite_dmg1 45 +set sk_plr_elite_dmg2 45 +set sk_plr_elite_dmg3 45 // deagle: bullet damage set sk_plr_deagle_dmg1 54 diff --git a/zpak001.pk3dir/def/weapons.def b/zpak001.pk3dir/def/weapons.def index ca51fe6..94b0011 100644 --- a/zpak001.pk3dir/def/weapons.def +++ b/zpak001.pk3dir/def/weapons.def @@ -3,7 +3,7 @@ #include "weapons/awp.def" #include "weapons/c4.def" #include "weapons/deagle.def" -#include "weapons/elites.def" +#include "weapons/elite.def" #include "weapons/fiveseven.def" #include "weapons/flashbang.def" #include "weapons/g3sg1.def" diff --git a/zpak001.pk3dir/def/weapons/elites.def b/zpak001.pk3dir/def/weapons/elite.def similarity index 79% rename from zpak001.pk3dir/def/weapons/elites.def rename to zpak001.pk3dir/def/weapons/elite.def index 45a2e36..ed61dda 100644 --- a/zpak001.pk3dir/def/weapons/elites.def +++ b/zpak001.pk3dir/def/weapons/elite.def @@ -1,4 +1,4 @@ -entityDef weapon_elites +entityDef weapon_elite { "inherit" "CSBasePistol" "editor_usage" "Dual Beretta 96G (Elites) Weapon - Uses ammo_9mm" @@ -7,8 +7,8 @@ entityDef weapon_elites "model_view" "models/v_elite.mdl" "inv_name" "Dual Beretta 96G (Elites) Weapon" - "def_fireInfo" "fireInfo_elites" - "def_altFireInfo" "fireInfo_elites_alt" + "def_fireInfo" "fireInfo_elite" + "def_altFireInfo" "fireInfo_elite_alt" "clipSize" "30" "actFire" "2,3,4,5,6" @@ -41,15 +41,15 @@ entityDef weapon_elites "weight" "5" } -entityDef projectile_elites +entityDef projectile_elite { "inherit" "projectile_bullet_base" - "damage" "skill:plr_elites_dmg" + "damage" "skill:plr_elite_dmg" } -entityDef fireInfo_elites +entityDef fireInfo_elite { - "def_onFire" "projectile_elites" + "def_onFire" "projectile_elite" "ammoType" "ammo_9mm" "ammoRequired" "1" "ammoPerShot" "1" @@ -58,9 +58,9 @@ entityDef fireInfo_elites "model_flash" "sprites/muzzleflash2.spr" } -entityDef fireInfo_elites_alt +entityDef fireInfo_elite_alt { - "inherit" "fireInfo_elites" + "inherit" "fireInfo_elite" "actFire" "8,9,10,11,12" "actFireLast" "13" } diff --git a/zpak001.pk3dir/maps/eukara/test_weapons.bsp b/zpak001.pk3dir/maps/eukara/test_weapons.bsp index 7b0a2153606c13ee7d515b713914f35d61d3e5b2..49285d75c706d70ce1c4197cd5d4a6bfc1b361c4 100644 GIT binary patch delta 46 zcmZpe%J^prqo^DM14E7@1H%n=28J3S`vMaKgUd$IVwcH5E@GSKyDVeb?BQv_2mlr^ B3~~Sf delta 47 zcmew}g|T5Oqo^DM14E7@1H(;r28J3S`vMaKgU3eEVi(5Z%^fa#Sb*Hk&YqTx02~kt AsQ>@~ diff --git a/zpak001.pk3dir/maps/eukara/test_weapons.map b/zpak001.pk3dir/maps/eukara/test_weapons.map index 9b12b35..063b50c 100644 --- a/zpak001.pk3dir/maps/eukara/test_weapons.map +++ b/zpak001.pk3dir/maps/eukara/test_weapons.map @@ -121,7 +121,7 @@ } // entity 8 { -"classname" "weapon_elites" +"classname" "weapon_elite" "origin" "128 -128 16" } // entity 9 From 10468ee174891e2fc5a6f1ab01241724d268957a Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 30 Jul 2024 20:21:45 -0700 Subject: [PATCH 06/17] CSWeapon: renamed FiredWeapon() to FiredWeaponAttack() --- src/shared/CSWeapon.qc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/CSWeapon.qc b/src/shared/CSWeapon.qc index 80aed9b..7bd1b56 100644 --- a/src/shared/CSWeapon.qc +++ b/src/shared/CSWeapon.qc @@ -38,7 +38,7 @@ CSWeapon:NSWeapon virtual void PrimaryAttack(void); virtual void SecondaryAttack(void); virtual void Release(void); - virtual void FiredWeapon(string); + virtual void FiredWeaponAttack(string); virtual void SwitchedToWeapon(void); }; @@ -102,7 +102,7 @@ CSWeapon::SecondaryAttack(void) } void -CSWeapon::FiredWeapon(string defName) +CSWeapon::FiredWeaponAttack(string defName) { CSPlayer ourOwner = (CSPlayer)owner; int numProjectiles = GetSubDefInt(defName, "numProjectiles"); From 73638fd19780c34421d6edf5105f91be9d7f9c72 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 14 Aug 2024 17:10:08 -0700 Subject: [PATCH 07/17] - fix team selection race condition exploit in FreeCS - fix lots of buggy round logic - make use of HLWeaponSelect - move from def/ to decls/def --- src/client/cmds.qc | 4 +- src/client/defs.h | 3 + src/client/hud.qc | 9 +- src/client/hud_ammonotify.qc | 16 +++ src/client/init.qc | 7 + src/client/nightvision.qc | 23 ++- src/client/progs.src | 1 + src/client/radio.h | 16 +++ src/server/ammo.h | 16 +++ src/server/func_bomb_target.qc | 10 +- src/server/func_hostage_rescue.qc | 2 +- src/server/gamerules_multiplayer.qc | 74 +++++----- src/server/gamerules_singleplayer.qc | 6 +- src/server/hostage_entity.qc | 26 ++-- src/server/info_hostage_rescue.qc | 2 +- src/server/radio.h | 16 +++ src/server/radio.qc | 16 +++ src/shared/CSProjectile.h | 10 +- src/shared/CSProjectile.qc | 6 +- src/shared/CSWeapon.qc | 50 +++---- src/shared/defs.h | 1 + src/shared/include.src | 1 + src/shared/item_c4bomb.h | 16 +++ src/shared/item_c4bomb.qc | 19 +-- src/shared/player.h | 17 +++ src/shared/radio.h | 15 ++ src/shared/weapons_cstrike.qc | 27 ---- zpak001.pk3dir/{ => decls}/def/ammo.def | 0 zpak001.pk3dir/{ => decls}/def/hostage.def | 0 zpak001.pk3dir/{ => decls}/def/items.def | 0 zpak001.pk3dir/{ => decls}/def/items/c4.def | 0 .../{ => decls}/def/items/defuse.def | 0 .../{ => decls}/def/items/kevlar.def | 0 .../{ => decls}/def/items/kevlar_helmet.def | 0 .../{ => decls}/def/items/nightvision.def | 0 zpak001.pk3dir/{ => decls}/def/items/suit.def | 0 zpak001.pk3dir/{ => decls}/def/monsters.def | 0 zpak001.pk3dir/{ => decls}/def/player.def | 0 .../{ => decls}/def/projectiles.def | 0 zpak001.pk3dir/{ => decls}/def/spawns.def | 0 zpak001.pk3dir/{ => decls}/def/weapons.def | 0 .../{ => decls}/def/weapons/ak47.def | 0 .../{ => decls}/def/weapons/aug.def | 0 .../{ => decls}/def/weapons/awp.def | 0 zpak001.pk3dir/{ => decls}/def/weapons/c4.def | 0 .../{ => decls}/def/weapons/deagle.def | 0 .../{ => decls}/def/weapons/elite.def | 0 .../{ => decls}/def/weapons/famas.def | 0 .../{ => decls}/def/weapons/fiveseven.def | 0 .../{ => decls}/def/weapons/flashbang.def | 0 .../{ => decls}/def/weapons/g3sg1.def | 0 .../{ => decls}/def/weapons/galil.def | 0 .../{ => decls}/def/weapons/glock18.def | 24 ++-- .../{ => decls}/def/weapons/hegrenade.def | 0 .../{ => decls}/def/weapons/knife.def | 0 .../{ => decls}/def/weapons/m249.def | 0 zpak001.pk3dir/{ => decls}/def/weapons/m3.def | 0 .../{ => decls}/def/weapons/m4a1.def | 0 .../{ => decls}/def/weapons/mac10.def | 0 .../{ => decls}/def/weapons/mp5navy.def | 0 .../{ => decls}/def/weapons/p228.def | 0 .../{ => decls}/def/weapons/p90.def | 0 .../{ => decls}/def/weapons/scout.def | 0 .../{ => decls}/def/weapons/sg550.def | 0 .../{ => decls}/def/weapons/sg552.def | 0 .../{ => decls}/def/weapons/smokegrenade.def | 0 .../{ => decls}/def/weapons/tmp.def | 0 .../{ => decls}/def/weapons/ump45.def | 0 .../{ => decls}/def/weapons/usp.def | 0 .../{ => decls}/def/weapons/xm1014.def | 0 .../{ => decls}/sound/impacts.sndshd | 1 - .../{ => decls}/sound/items_cstrike.sndshd | 0 .../{ => decls}/sound/npcs_cstrike.sndshd | 0 .../{ => decls}/sound/player.sndshd | 0 .../{ => decls}/sound/weapons_cstrike.sndshd | 0 zpak001.pk3dir/default.cfg | 135 ++++++------------ 76 files changed, 317 insertions(+), 252 deletions(-) rename zpak001.pk3dir/{ => decls}/def/ammo.def (100%) rename zpak001.pk3dir/{ => decls}/def/hostage.def (100%) rename zpak001.pk3dir/{ => decls}/def/items.def (100%) rename zpak001.pk3dir/{ => decls}/def/items/c4.def (100%) rename zpak001.pk3dir/{ => decls}/def/items/defuse.def (100%) rename zpak001.pk3dir/{ => decls}/def/items/kevlar.def (100%) rename zpak001.pk3dir/{ => decls}/def/items/kevlar_helmet.def (100%) rename zpak001.pk3dir/{ => decls}/def/items/nightvision.def (100%) rename zpak001.pk3dir/{ => decls}/def/items/suit.def (100%) rename zpak001.pk3dir/{ => decls}/def/monsters.def (100%) rename zpak001.pk3dir/{ => decls}/def/player.def (100%) rename zpak001.pk3dir/{ => decls}/def/projectiles.def (100%) rename zpak001.pk3dir/{ => decls}/def/spawns.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/ak47.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/aug.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/awp.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/c4.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/deagle.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/elite.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/famas.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/fiveseven.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/flashbang.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/g3sg1.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/galil.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/glock18.def (77%) rename zpak001.pk3dir/{ => decls}/def/weapons/hegrenade.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/knife.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/m249.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/m3.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/m4a1.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/mac10.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/mp5navy.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/p228.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/p90.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/scout.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/sg550.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/sg552.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/smokegrenade.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/tmp.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/ump45.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/usp.def (100%) rename zpak001.pk3dir/{ => decls}/def/weapons/xm1014.def (100%) rename zpak001.pk3dir/{ => decls}/sound/impacts.sndshd (99%) rename zpak001.pk3dir/{ => decls}/sound/items_cstrike.sndshd (100%) rename zpak001.pk3dir/{ => decls}/sound/npcs_cstrike.sndshd (100%) rename zpak001.pk3dir/{ => decls}/sound/player.sndshd (100%) rename zpak001.pk3dir/{ => decls}/sound/weapons_cstrike.sndshd (100%) diff --git a/src/client/cmds.qc b/src/client/cmds.qc index 4ba3962..7a0608b 100644 --- a/src/client/cmds.qc +++ b/src/client/cmds.qc @@ -56,10 +56,10 @@ ClientGame_ConsoleCommand(void) { switch(argv(0)) { case "invnext": - HUD_DrawWeaponSelect_Back(); + pSeatLocal->weaponSelectionHUD.SelectNext(false); break; case "invprev": - HUD_DrawWeaponSelect_Forward(); + pSeatLocal->weaponSelectionHUD.SelectPrevious(false); break; case "lastinv": HUD_DrawWeaponSelect_Last(); diff --git a/src/client/defs.h b/src/client/defs.h index cd6155a..d1f835d 100644 --- a/src/client/defs.h +++ b/src/client/defs.h @@ -18,12 +18,14 @@ #include "radio.h" #include "../../../valve/src/client/obituary.h" #include "../../../valve/src/client/hud_sprite.h" +#include "../../../valve/src/client/HLWeaponSelect.h" var int autocvar_cl_autoweaponswitch = TRUE; vector g_hud_color; vector g_hudmins; vector g_hudres; +var string g_laser_spr; var string g_hud1_spr; var string g_hud2_spr; @@ -80,6 +82,7 @@ struct float m_flTimeAlpha; vector m_vecMoneyColor; int m_iNightvision; + HLWeaponSelect weaponSelectionHUD; } g_seatslocal[4], *pSeatLocal; void HUD_DrawAmmo1(void); diff --git a/src/client/hud.qc b/src/client/hud.qc index 13ad143..28e9744 100644 --- a/src/client/hud.qc +++ b/src/client/hud.qc @@ -725,10 +725,11 @@ HUD_Draw(void) g_hud_color = autocvar_con_color * (1 / 255); /* little point in not drawing these, even if you don't have a suit */ - if (pl.m_activeWeapon) + if (pl.m_activeWeapon) { pl.m_activeWeapon.UpdateGUI(); + } - HUD_DrawWeaponSelect(); + pSeatLocal->weaponSelectionHUD.Draw(); Obituary_Draw(); Textmenu_Draw(); @@ -756,6 +757,10 @@ HUD_Draw(void) void HUD_DrawSpectator(void) { + if (VGUI_Active() == true) { + return; + } + Textmenu_Draw(); Obituary_Draw(); diff --git a/src/client/hud_ammonotify.qc b/src/client/hud_ammonotify.qc index 08a5355..a161404 100644 --- a/src/client/hud_ammonotify.qc +++ b/src/client/hud_ammonotify.qc @@ -1,3 +1,19 @@ +/* + * 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 AMMO_COUNT 13 string g_ammo_spr; diff --git a/src/client/init.qc b/src/client/init.qc index 8af4885..72efe0d 100644 --- a/src/client/init.qc +++ b/src/client/init.qc @@ -106,10 +106,17 @@ ClientGame_Init(float apilevel, string enginename, float engineversion) registercommand("negative"); registercommand("enemydown"); + /* hud */ + registercommand("lastinv"); + registercommand("invnext"); + registercommand("invprev"); + Obituary_Init(); Sound_Precache("nvg.on"); Sound_Precache("nvg.off"); + + pSeatLocal->weaponSelectionHUD = spawn(HLWeaponSelect); } bool diff --git a/src/client/nightvision.qc b/src/client/nightvision.qc index bb6347d..103d73a 100644 --- a/src/client/nightvision.qc +++ b/src/client/nightvision.qc @@ -19,19 +19,18 @@ Nightvision_Toggle(void) { CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; -#if 0 - if (!(pl.g_items & ITEM_NIGHTVISION)) { + if (pl.HasItem("item_nightvision") == false) { pSeatLocal->m_iNightvision = 0; return; } -#endif pSeatLocal->m_iNightvision = 1 - pSeatLocal->m_iNightvision; - if (pSeatLocal->m_iNightvision) + if (pSeatLocal->m_iNightvision) { Sound_Play(self, CHAN_AUTO, "nvg.on"); - else + } else { Sound_Play(self, CHAN_AUTO, "nvg.off"); + } } void @@ -39,15 +38,14 @@ Nightvision_PreFrame(void) { CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; - if (!pSeatLocal->m_iNightvision) + if (!pSeatLocal->m_iNightvision) { return; + } -#if 0 - if (!(pl.g_items & ITEM_NIGHTVISION)) { + if (pl.HasItem("item_nightvision") == false) { pSeatLocal->m_iNightvision = 0; return; } -#endif dynamiclight_add(pSeat->m_vecPredictedOrigin, 768, [1,1,1]); } @@ -57,15 +55,14 @@ Nightvision_PostFrame(void) { CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; - if (!pSeatLocal->m_iNightvision) + if (!pSeatLocal->m_iNightvision) { return; + } -#if 0 - if (!(pl.g_items & ITEM_NIGHTVISION)) { + if (pl.HasItem("item_nightvision") == false) { pSeatLocal->m_iNightvision = 0; return; } -#endif drawpic(video_mins, "fade_modulate", g_hudres, [0,1,0], 1.0f, 0); } diff --git a/src/client/progs.src b/src/client/progs.src index 75e3b7c..4a10522 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -37,6 +37,7 @@ hud_ammonotify.qc vgui_spectator.qc hud.qc ../../../valve/src/client/hud_sprite.qc +../../../valve/src/client/HLWeaponSelect.qc ../../../valve/src/client/hud_weaponselect.qc ../../../valve/src/client/scoreboard.qc radio.qc diff --git a/src/client/radio.h b/src/client/radio.h index 64cbe23..843c0a0 100644 --- a/src/client/radio.h +++ b/src/client/radio.h @@ -1,3 +1,19 @@ +/* + * 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 Radio_Init(void); void Radio_PlayMessage(float); void Radio_PlayPlayerMessage(float, float); diff --git a/src/server/ammo.h b/src/server/ammo.h index 0c3986a..d106df1 100644 --- a/src/server/ammo.h +++ b/src/server/ammo.h @@ -1,3 +1,19 @@ +/* + * 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 Ammo_BuyPrimary(NSClientPlayer pl, int free); void Ammo_BuySecondary(NSClientPlayer pl, int free); void Ammo_AutoFill(NSClientPlayer); diff --git a/src/server/func_bomb_target.qc b/src/server/func_bomb_target.qc index 0462ee3..f68cfd0 100644 --- a/src/server/func_bomb_target.qc +++ b/src/server/func_bomb_target.qc @@ -32,7 +32,6 @@ func_bomb_target:NSBrushTrigger { void(void) func_bomb_target; - virtual void(void) Respawn; virtual void(entity) Touch; }; @@ -42,18 +41,12 @@ func_bomb_target::func_bomb_target(void) g_cs_bombzones++; } -void -func_bomb_target::Respawn(void) -{ - InitBrushTrigger(); -} - void func_bomb_target::Touch(entity eToucher) { CSPlayer pl = (CSPlayer)eToucher; - if (!(eToucher.flags & FL_CLIENT)) { + if (isPlayer(pl) == false) { return; } @@ -65,5 +58,6 @@ func_bomb_target::Touch(entity eToucher) env_message_single(pl, "Hint_you_are_in_targetzone"); pl.m_seenBombSite = true; } + pl.gflags |= GF_BOMBZONE; } diff --git a/src/server/func_hostage_rescue.qc b/src/server/func_hostage_rescue.qc index 845f83a..e15fba8 100644 --- a/src/server/func_hostage_rescue.qc +++ b/src/server/func_hostage_rescue.qc @@ -51,7 +51,7 @@ func_hostage_rescue::Respawn(void) void func_hostage_rescue::Touch(entity eToucher) { - if (eToucher.flags & FL_CLIENT) { + if (isPlayer(eToucher)) { CSPlayer pl = (CSPlayer)eToucher; pl.gflags |= GF_RESCUEZONE; return; diff --git a/src/server/gamerules_multiplayer.qc b/src/server/gamerules_multiplayer.qc index 7c5cf78..e5f0a6e 100644 --- a/src/server/gamerules_multiplayer.qc +++ b/src/server/gamerules_multiplayer.qc @@ -113,8 +113,8 @@ CSMultiplayerRules::PlayerDeath(NSClientPlayer pl) forceinfokey(targ, "*deaths", ftos(targ.deaths)); /* update score-counter */ - if (g_dmg_eTarget.flags & FL_CLIENT || g_dmg_eTarget.flags & FL_MONSTER) - if (g_dmg_eAttacker.flags & FL_CLIENT) { + if (isClient(g_dmg_eTarget) || isAI(g_dmg_eTarget)) + if (isClient(g_dmg_eAttacker)) { float vip = (g_dmg_eTarget.team == TEAM_VIP && g_dmg_eAttacker.team == TEAM_CT); if (g_dmg_eTarget == g_dmg_eAttacker) { @@ -129,7 +129,7 @@ CSMultiplayerRules::PlayerDeath(NSClientPlayer pl) } /* scoreboard death icon */ - if (g_dmg_eTarget.flags & FL_CLIENT) { + if (isClient(g_dmg_eTarget)) { targ.SetInfoKey("*icon1", "d_skull"); targ.SetInfoKey("*icon1_r", "1"); targ.SetInfoKey("*icon1_g", "0"); @@ -408,7 +408,7 @@ CSMultiplayerRules::TimerUpdate(void) } } - // This map has been played enough we think + /* This map has been played enough we think */ if (g_cs_gamestate != GAME_OVER) { if (cvar("mp_timelimit") > 0) { if (time >= (cvar("mp_timelimit") * 60)) { @@ -418,9 +418,9 @@ CSMultiplayerRules::TimerUpdate(void) } } - // Okay, this means that timelimit is not the only deciding factor + /* Okay, this means that timelimit is not the only deciding factor */ if (autocvar_mp_winlimit > 0 && g_cs_gamestate != GAME_OVER) { - // It really doesn't matter who won. Do some logging perhaps? + /* It really doesn't matter who won. Do some logging perhaps? */ if (g_cs_roundswon_ct == autocvar_mp_winlimit || g_cs_roundswon_t == autocvar_mp_winlimit) { IntermissionStart(); @@ -465,7 +465,7 @@ CSMultiplayerRules::TimerUpdate(void) } } TimeOut(); - TimerBegin(5, GAME_END); // Round is over, 5 seconds til a new round starts + TimerBegin(5, GAME_END); /* Round is over, 5 seconds til a new round starts */ } else { TimerBegin(autocvar_mp_roundtime * 60, GAME_ACTIVE); // Unfreeze Radio_StartMessage(); @@ -485,7 +485,7 @@ Checks if it is possible for players to buy anything bool CSMultiplayerRules::BuyingPossible(NSClientPlayer pl) { - if (pl.health <= 0) { + if (pl.IsDead()) { return (false); } @@ -537,7 +537,7 @@ CSMultiplayerRules::MakeVIP(NSClientPlayer pl) pl.team = TEAM_VIP; PlayerRespawn(pl, pl.team); env_message_single(pl, "Hint_you_are_the_vip"); - forceinfokey(pl, "*dead", "2"); + pl.SetInfoKey("*dead", "2"); pl.SetModel("models/player/vip/vip.mdl"); } @@ -574,8 +574,9 @@ CSMultiplayerRules::RestartRound(int iWipe) CSBot_RestartRound(); for (entity eFind = world; (eFind = findfloat(eFind, ::team, TEAM_T));) { - if (!(eFind.flags & FL_CLIENT)) + if (isClient(eFind) == false) { continue; + } CSPlayer pl = (CSPlayer)eFind; @@ -593,8 +594,9 @@ CSMultiplayerRules::RestartRound(int iWipe) } } for (entity eFind = world; (eFind = findfloat(eFind, ::team, TEAM_CT));) { - if (!(eFind.flags & FL_CLIENT)) + if (isClient(eFind) == false) { continue; + } CSPlayer pl = (CSPlayer)eFind; @@ -614,8 +616,9 @@ CSMultiplayerRules::RestartRound(int iWipe) /* respawn the VIP as well, but turn them back into a CT. */ for (entity eFind = world; (eFind = findfloat(eFind, ::team, TEAM_VIP));) { - if (!(eFind.flags & FL_CLIENT)) + if (isClient(eFind) == false) { continue; + } CSPlayer pl = (CSPlayer)eFind; pl.team = TEAM_CT; @@ -801,7 +804,7 @@ CSMultiplayerRules::SwitchTeams(void) pl.team = TEAM_CT; pl.charmodel += 4; } - forceinfokey(pl, "*team", ftos(pl.team)); + pl.SetInfoKey("*team", ftos(pl.team)); } iCTW = g_cs_roundswon_ct; @@ -1032,8 +1035,7 @@ CSMultiplayerRules::PlayerRespawn(NSClientPlayer pp, int fTeam) pl.ClearVelocity(); pl.progress = 0.0f; - /* TODO: Implement this in NSNavAI*/ - //Weapons_SwitchBest(pl); + pl.SwitchToBestWeapon(false); Ammo_AutoFill(pl); } @@ -1052,29 +1054,32 @@ void CSMultiplayerRules::PlayerMakePlayable(NSClientPlayer pp, int chara) { CSPlayer pl = (CSPlayer)pp; + /* spectator */ if (chara == 0) { PlayerSpawn(pl); return; } + pl.RemoveAllItems(false); pl.ingame = TRUE; - forceinfokey(pl, "*team", ftos(pl.team)); + pl.SetInfoKey("*team", ftos(pl.team)); PlayerRespawn(pl, pl.team); /* terrorists */ if (chara < 5) { pl.team = TEAM_T; + if (autocvar_fcs_knifeonly == FALSE) { pl.GiveItem("weapon_glock18"); - //pl.ammo_9mm = 40; + pl.GiveAmmo(ammoNumForName("ammo_9mm"), 40); } } else { pl.team = TEAM_CT; if (autocvar_fcs_knifeonly == FALSE) { pl.GiveItem("weapon_usp"); - //pl.ammo_45acp = 24; + pl.GiveAmmo(ammoNumForName("ammo_45acp"), 24); } } @@ -1139,7 +1144,7 @@ CSMultiplayerRules::PlayerSpawn(NSClientPlayer pl) /* we don't belong to any team */ pl.team = TEAM_SPECTATOR; - forceinfokey(pl, "*team", "0"); + pl.SetInfoKey("*team", "0"); } bool @@ -1195,16 +1200,28 @@ CSEv_JoinTeam_f(float flChar) rules = (CSMultiplayerRules)g_grMode; pl = (CSPlayer)self; + /* VIPs cannot change teams... ? */ if (pl.team == TEAM_VIP) { centerprint(pl, "You are the VIP!\nYou cannot switch roles now.\n"); return; } - // alive and are trying to switch teams, so subtract us from the Alive_Team counter. - if (pl.health > 0) { + if (pl.IsAlive()) { rules.PlayerKill(pl); } + /* team switching, var reset */ + if (flChar < 5) { + pl.team = TEAM_T; + } else { + pl.team = TEAM_CT; + } + + pl.frags = 0; + pl.deaths = 0; + pl.SetInfoKey("*deaths", ftos(pl.deaths)); + pl.SetInfoKey("*team", ftos(pl.team)); + switch (g_cs_gamestate) { /* spawn the players immediately when its in the freeze state */ case GAME_FREEZE: @@ -1229,23 +1246,12 @@ CSEv_JoinTeam_f(float flChar) return; } - //PlayerMakeSpectator(pl); + rules.PlayerMakeSpectator(pl); pl.charmodel = (int)flChar; - forceinfokey(pl, "*dead", "1"); + pl.SetInfoKey("*dead", "1"); break; } - if (flChar < 5) - pl.team = TEAM_T; - else - pl.team = TEAM_CT; - - forceinfokey(pl, "*team", ftos(pl.team)); - - pl.frags = 0; - pl.deaths = 0; - forceinfokey(pl, "*deaths", ftos(pl.deaths)); - rules.CountPlayers(); /* if no players are present in the chosen team, force restart round */ diff --git a/src/server/gamerules_singleplayer.qc b/src/server/gamerules_singleplayer.qc index dd685b2..9f5e977 100644 --- a/src/server/gamerules_singleplayer.qc +++ b/src/server/gamerules_singleplayer.qc @@ -57,9 +57,9 @@ CSSingleplayerRules::PlayerSpawn(NSClientPlayer pl) pl.frame = 1; pl.SendFlags = UPDATE_ALL; pl.customphysics = Empty; - pl.iBleeds = TRUE; - forceinfokey(pl, "*spec", "0"); - forceinfokey(pl, "*deaths", ftos(pl.deaths)); + pl.EnableBleeding(); + pl.SetInfoKey("*spec", "0"); + pl.SetInfoKey("*deaths", ftos(pl.deaths)); entity spot; diff --git a/src/server/hostage_entity.qc b/src/server/hostage_entity.qc index b4557e4..ecba907 100644 --- a/src/server/hostage_entity.qc +++ b/src/server/hostage_entity.qc @@ -105,8 +105,9 @@ CSHostage::OnPlayerUse(void) return; } - if (m_eFollowing == world) + if (m_eFollowing == world) { Sound_Speak(this, "hostage_entity.follow"); + } /* CT reward, first time only */ if (m_iUsedOnce == FALSE) { @@ -118,12 +119,13 @@ CSHostage::OnPlayerUse(void) } void -CSHostage::Pain(entity inflictor, entity attacker, int damage, vector dir, int location) +CSHostage::Pain(entity inflictor, entity attacker, int damageDealt, vector dir, int location) { - super::Pain(inflictor, attacker, damage, dir, location); + super::Pain(inflictor, attacker, damageDealt, dir, location); - if (IsAlive() == false) + if (IsAlive() == false) { return; + } switch (location) { case BODY_HEAD: @@ -147,14 +149,15 @@ CSHostage::Pain(entity inflictor, entity attacker, int damage, vector dir, int l } /* penalties */ - if (attacker.classname != "player") + if (isPlayer(attacker) == false) { return; + } - Money_AddMoney((NSClientPlayer)attacker, -(damage * 25i)); + Money_AddMoney((NSClientPlayer)attacker, -(damageDealt * 25i)); } void -CSHostage::Death(entity inflictor, entity attacker, int damage, vector dir, int location) +CSHostage::Death(entity inflictor, entity attacker, int damageDealt, vector dir, int location) { WarnAllies(); @@ -171,11 +174,12 @@ CSHostage::Death(entity inflictor, entity attacker, int damage, vector dir, int break; } - if (attacker.classname == "player") { - if (damage >= 100) + if (isPlayer(attacker) == true) { + if (damageDealt >= 100) { Money_AddMoney((NSClientPlayer)attacker, -2500); - else + } else { Money_AddMoney((NSClientPlayer)attacker, -500); + } Radio_BroadcastMessage(RADIO_HOSDOWN); } @@ -185,7 +189,7 @@ CSHostage::Death(entity inflictor, entity attacker, int damage, vector dir, int SetHealth(0); /* now mark our state as 'dead' */ - super::Death(inflictor, attacker, damage, dir, location); + super::Death(inflictor, attacker, damageDealt, dir, location); SetSolid(SOLID_NOT); } diff --git a/src/server/info_hostage_rescue.qc b/src/server/info_hostage_rescue.qc index c5ca6af..a250e6c 100644 --- a/src/server/info_hostage_rescue.qc +++ b/src/server/info_hostage_rescue.qc @@ -52,7 +52,7 @@ info_hostage_rescue::Respawn(void) void info_hostage_rescue::Touch(entity eToucher) { - if (eToucher.flags & FL_CLIENT) { + if (isPlayer(eToucher)) { CSPlayer pl = (CSPlayer)eToucher; pl.gflags |= GF_RESCUEZONE; return; diff --git a/src/server/radio.h b/src/server/radio.h index 53d441a..2bbbfcb 100644 --- a/src/server/radio.h +++ b/src/server/radio.h @@ -1,3 +1,19 @@ +/* + * 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 Radio_BroadcastMessage(float fMessage); void Radio_TeamMessage(float fMessage, float fTeam); float Radio_DefaultStart(void); diff --git a/src/server/radio.qc b/src/server/radio.qc index 71efdbd..dd2732d 100644 --- a/src/server/radio.qc +++ b/src/server/radio.qc @@ -1,3 +1,19 @@ +/* + * 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. + */ + /* ================= Radio_BroadcastMessage diff --git a/src/shared/CSProjectile.h b/src/shared/CSProjectile.h index bf56f8d..eb3d2b8 100644 --- a/src/shared/CSProjectile.h +++ b/src/shared/CSProjectile.h @@ -17,10 +17,7 @@ class CSProjectile:NSProjectile { - float m_flRangeModifier; - int m_iTotalPenetrations; - float m_flMaxThickness; - +public: void CSProjectile(void); #ifdef SERVER @@ -30,5 +27,10 @@ CSProjectile:NSProjectile virtual void _FireSingle(vector,vector,float,float); virtual void _LaunchHitscan(vector, vector, float); + +private: + float m_flRangeModifier; + int m_iTotalPenetrations; + float m_flMaxThickness; #endif }; diff --git a/src/shared/CSProjectile.qc b/src/shared/CSProjectile.qc index a972432..463f1e2 100644 --- a/src/shared/CSProjectile.qc +++ b/src/shared/CSProjectile.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Vera Visions LLC. + * Copyright (c) 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 @@ -12,7 +12,7 @@ * 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 CSProjectile::CSProjectile(void) @@ -20,6 +20,7 @@ CSProjectile::CSProjectile(void) } +#ifdef SERVER void CSProjectile::SetRangeModifier(float rangeModifier) { @@ -38,7 +39,6 @@ CSProjectile::SetPenetrationPower(int powerLevel) m_iTotalPenetrations = powerLevel; } -#ifdef SERVER void CSProjectile::_LaunchHitscan(vector startPos, vector launchDir, float dmgMultiplier) { diff --git a/src/shared/CSWeapon.qc b/src/shared/CSWeapon.qc index 7bd1b56..df5c8c2 100644 --- a/src/shared/CSWeapon.qc +++ b/src/shared/CSWeapon.qc @@ -19,27 +19,31 @@ void Cstrike_DrawCrosshair(CSPlayer); #endif class -CSWeapon:NSWeapon +CSWeapon:HLWeapon { +public: void CSWeapon(void); #ifdef CLIENT + virtual void AddedToInventory(void); + virtual void UpdateGUI(void); +#endif + + virtual void Draw(void); + virtual void SecondaryAttack(void); + virtual void Release(void); + virtual void FiredWeaponAttack(string); + virtual void SwitchedToWeapon(void); + +#ifdef CLIENT +private: int m_iHudSlot; int m_iHudSlotPos; string m_ammoIcon; string m_crossHair; NSWeapon m_nextWeapon; - virtual void AddedToInventory(void); - virtual void UpdateGUI(void); #endif - - virtual void Draw(void); - virtual void PrimaryAttack(void); - virtual void SecondaryAttack(void); - virtual void Release(void); - virtual void FiredWeaponAttack(string); - virtual void SwitchedToWeapon(void); }; void @@ -51,26 +55,7 @@ CSWeapon::CSWeapon(void) void CSWeapon::SwitchedToWeapon(void) { - w_cstrke_switched((CSPlayer)owner); -} - -void -CSWeapon::PrimaryAttack(void) -{ - if (GetDefBool("altAlternates") == true) { - if (CanFire() == false) { - return; - } - - m_iMode = 1 - m_iMode; - } - - if (m_iMode) { - super::SecondaryAttack(); - return; - } - - super::PrimaryAttack(); + Cstrike_ShotReset((CSPlayer)owner); } void @@ -139,7 +124,7 @@ CSWeapon::FiredWeaponAttack(string defName) } for (int i = 0i; i < numProjectiles; i++) { - CSProjectile_SpawnDef(traceInfo, owner, flRangeModifier, flPenetrationPower, bulletSpread); + CSProjectile_SpawnDef(traceInfo, ourOwner, flRangeModifier, flPenetrationPower, bulletSpread); } #endif @@ -162,7 +147,6 @@ CSWeapon::Draw(void) CSPlayer ourOwner = (CSPlayer)owner; ourOwner.cs_cross_mindist = GetDefInt("crossMinDist"); ourOwner.cs_cross_deltadist = GetDefInt("crossDeltaDist"); - CStrikeView_UpdateGeomset(ourOwner); #endif } @@ -171,7 +155,7 @@ void CSWeapon::Release(void) { owner.v_angle = input_angles; - w_cstrike_weaponrelease((CSPlayer)owner); + Cstrike_ShotMultiplierUpdate((CSPlayer)owner); input_angles = owner.v_angle; super::Release(); } diff --git a/src/shared/defs.h b/src/shared/defs.h index 2c955e1..1c26c59 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -21,6 +21,7 @@ #include "entities.h" #include "events.h" #include "CSProjectile.h" +#include "../../../valve/src/shared/HLWeapon.h" #define TEAM_SPECTATOR 0 #define TEAM_T 1 diff --git a/src/shared/include.src b/src/shared/include.src index c9b7a40..97bb5d3 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -13,6 +13,7 @@ fx_smokenade.qc item_c4bomb.qc weapons_cstrike.qc CSProjectile.qc +../../../valve/src/shared/HLWeapon.qc CSWeapon.qc pmove.qc #endlist diff --git a/src/shared/item_c4bomb.h b/src/shared/item_c4bomb.h index de3d1ad..33a2dbd 100644 --- a/src/shared/item_c4bomb.h +++ b/src/shared/item_c4bomb.h @@ -1,3 +1,19 @@ +/* + * 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. + */ + #ifdef CLIENT string g_c4bombled_spr; void w_c4bomb_parse(void); diff --git a/src/shared/item_c4bomb.qc b/src/shared/item_c4bomb.qc index 87c6fde..3ac239c 100644 --- a/src/shared/item_c4bomb.qc +++ b/src/shared/item_c4bomb.qc @@ -16,16 +16,10 @@ class CSBombEntity:NSRenderableEntity { -#ifdef SERVER - entity m_eUser; - float m_flBeepTime; - float m_flExplodeTime; - float m_flDefusalState; -#endif - -#ifdef SERVER +public: void CSBombEntity(void); +#ifdef SERVER virtual void Spawned(void); virtual float SendEntity(entity, float); virtual void ClearProgress(void); @@ -35,10 +29,17 @@ class CSBombEntity:NSRenderableEntity #endif #ifdef CLIENT - void CSBombEntity(void); virtual void DrawLED(void); virtual float predraw(void); #endif + +#ifdef SERVER +private: + entity m_eUser; + float m_flBeepTime; + float m_flExplodeTime; + float m_flDefusalState; +#endif }; void diff --git a/src/shared/player.h b/src/shared/player.h index 01ddcd3..bcf3d50 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -139,6 +139,7 @@ class CSPlayer:NSClientPlayer virtual void PredictPreFrame(void); virtual void PredictPostFrame(void); virtual void UpdateAliveCam(void); + virtual void ClientInputFrame(void); #else virtual void ServerInputFrame(void); virtual void EvaluateEntity(void); @@ -211,6 +212,22 @@ CSPlayer::UpdatePlayerAnimation(float timelength) } #ifdef CLIENT +void +CSPlayer::ClientInputFrame(void) +{ + if (pSeatLocal->weaponSelectionHUD.Active()) { + if (input_buttons & INPUT_PRIMARY) { + pSeatLocal->weaponSelectionHUD.Trigger(); + } else if (input_buttons & INPUT_SECONDARY) { + pSeatLocal->weaponSelectionHUD.Deactivate(); + } + + pSeat->m_flInputBlockTime = time + 0.2; + } + + super::ClientInputFrame(); +} + void Camera_RunPosBob(vector angles, __inout vector camera_pos); void Camera_StrafeRoll(__inout vector camera_angle); void Shake_Update(NSClientPlayer); diff --git a/src/shared/radio.h b/src/shared/radio.h index 94eb79d..5390f83 100644 --- a/src/shared/radio.h +++ b/src/shared/radio.h @@ -1,3 +1,18 @@ +/* + * 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 { diff --git a/src/shared/weapons_cstrike.qc b/src/shared/weapons_cstrike.qc index d53cefa..aa6332f 100644 --- a/src/shared/weapons_cstrike.qc +++ b/src/shared/weapons_cstrike.qc @@ -33,18 +33,6 @@ var bool autocvar_fcs_guns_random_recoil_direction = TRUE; var float autocvar_fcs_guns_movement_inaccuracy = 1.0f; var float autocvar_fcs_guns_firing_inaccuracy = 1.0f; -weapontype_t -csweapon_ranged_type(CSPlayer pl) -{ - return WPNTYPE_RANGED; -} - -weapontype_t -csweapon_melee_type(CSPlayer pl) -{ - return WPNTYPE_CLOSE; -} - float Cstrike_CalculateMovementInaccuracy(CSPlayer pl) { float m = 1.0f; @@ -150,8 +138,6 @@ Cstrike_ShotMultiplierAdd(CSPlayer pl, float shots, float strength, float inaccu }*/ } - - /* generate an accuracy value that we'll pass onto TraceAttack */ float Cstrike_CalculateAccuracy(CSPlayer pl, float divisor, float movement_penalty=1) @@ -209,19 +195,6 @@ Cstrike_ShotReset(CSPlayer pl) pl.cs_shotmultiplier = 0; } -void -w_cstrike_weaponrelease(CSPlayer pl) -{ - //pl.punchangle[1] *= 0.95; - Cstrike_ShotMultiplierUpdate(pl); -} - -void -w_cstrke_switched(CSPlayer pl) -{ - Cstrike_ShotReset(pl); -} - #ifdef CLIENT void CStrikeView_UpdateGeomset(CSPlayer pl) diff --git a/zpak001.pk3dir/def/ammo.def b/zpak001.pk3dir/decls/def/ammo.def similarity index 100% rename from zpak001.pk3dir/def/ammo.def rename to zpak001.pk3dir/decls/def/ammo.def diff --git a/zpak001.pk3dir/def/hostage.def b/zpak001.pk3dir/decls/def/hostage.def similarity index 100% rename from zpak001.pk3dir/def/hostage.def rename to zpak001.pk3dir/decls/def/hostage.def diff --git a/zpak001.pk3dir/def/items.def b/zpak001.pk3dir/decls/def/items.def similarity index 100% rename from zpak001.pk3dir/def/items.def rename to zpak001.pk3dir/decls/def/items.def diff --git a/zpak001.pk3dir/def/items/c4.def b/zpak001.pk3dir/decls/def/items/c4.def similarity index 100% rename from zpak001.pk3dir/def/items/c4.def rename to zpak001.pk3dir/decls/def/items/c4.def diff --git a/zpak001.pk3dir/def/items/defuse.def b/zpak001.pk3dir/decls/def/items/defuse.def similarity index 100% rename from zpak001.pk3dir/def/items/defuse.def rename to zpak001.pk3dir/decls/def/items/defuse.def diff --git a/zpak001.pk3dir/def/items/kevlar.def b/zpak001.pk3dir/decls/def/items/kevlar.def similarity index 100% rename from zpak001.pk3dir/def/items/kevlar.def rename to zpak001.pk3dir/decls/def/items/kevlar.def diff --git a/zpak001.pk3dir/def/items/kevlar_helmet.def b/zpak001.pk3dir/decls/def/items/kevlar_helmet.def similarity index 100% rename from zpak001.pk3dir/def/items/kevlar_helmet.def rename to zpak001.pk3dir/decls/def/items/kevlar_helmet.def diff --git a/zpak001.pk3dir/def/items/nightvision.def b/zpak001.pk3dir/decls/def/items/nightvision.def similarity index 100% rename from zpak001.pk3dir/def/items/nightvision.def rename to zpak001.pk3dir/decls/def/items/nightvision.def diff --git a/zpak001.pk3dir/def/items/suit.def b/zpak001.pk3dir/decls/def/items/suit.def similarity index 100% rename from zpak001.pk3dir/def/items/suit.def rename to zpak001.pk3dir/decls/def/items/suit.def diff --git a/zpak001.pk3dir/def/monsters.def b/zpak001.pk3dir/decls/def/monsters.def similarity index 100% rename from zpak001.pk3dir/def/monsters.def rename to zpak001.pk3dir/decls/def/monsters.def diff --git a/zpak001.pk3dir/def/player.def b/zpak001.pk3dir/decls/def/player.def similarity index 100% rename from zpak001.pk3dir/def/player.def rename to zpak001.pk3dir/decls/def/player.def diff --git a/zpak001.pk3dir/def/projectiles.def b/zpak001.pk3dir/decls/def/projectiles.def similarity index 100% rename from zpak001.pk3dir/def/projectiles.def rename to zpak001.pk3dir/decls/def/projectiles.def diff --git a/zpak001.pk3dir/def/spawns.def b/zpak001.pk3dir/decls/def/spawns.def similarity index 100% rename from zpak001.pk3dir/def/spawns.def rename to zpak001.pk3dir/decls/def/spawns.def diff --git a/zpak001.pk3dir/def/weapons.def b/zpak001.pk3dir/decls/def/weapons.def similarity index 100% rename from zpak001.pk3dir/def/weapons.def rename to zpak001.pk3dir/decls/def/weapons.def diff --git a/zpak001.pk3dir/def/weapons/ak47.def b/zpak001.pk3dir/decls/def/weapons/ak47.def similarity index 100% rename from zpak001.pk3dir/def/weapons/ak47.def rename to zpak001.pk3dir/decls/def/weapons/ak47.def diff --git a/zpak001.pk3dir/def/weapons/aug.def b/zpak001.pk3dir/decls/def/weapons/aug.def similarity index 100% rename from zpak001.pk3dir/def/weapons/aug.def rename to zpak001.pk3dir/decls/def/weapons/aug.def diff --git a/zpak001.pk3dir/def/weapons/awp.def b/zpak001.pk3dir/decls/def/weapons/awp.def similarity index 100% rename from zpak001.pk3dir/def/weapons/awp.def rename to zpak001.pk3dir/decls/def/weapons/awp.def diff --git a/zpak001.pk3dir/def/weapons/c4.def b/zpak001.pk3dir/decls/def/weapons/c4.def similarity index 100% rename from zpak001.pk3dir/def/weapons/c4.def rename to zpak001.pk3dir/decls/def/weapons/c4.def diff --git a/zpak001.pk3dir/def/weapons/deagle.def b/zpak001.pk3dir/decls/def/weapons/deagle.def similarity index 100% rename from zpak001.pk3dir/def/weapons/deagle.def rename to zpak001.pk3dir/decls/def/weapons/deagle.def diff --git a/zpak001.pk3dir/def/weapons/elite.def b/zpak001.pk3dir/decls/def/weapons/elite.def similarity index 100% rename from zpak001.pk3dir/def/weapons/elite.def rename to zpak001.pk3dir/decls/def/weapons/elite.def diff --git a/zpak001.pk3dir/def/weapons/famas.def b/zpak001.pk3dir/decls/def/weapons/famas.def similarity index 100% rename from zpak001.pk3dir/def/weapons/famas.def rename to zpak001.pk3dir/decls/def/weapons/famas.def diff --git a/zpak001.pk3dir/def/weapons/fiveseven.def b/zpak001.pk3dir/decls/def/weapons/fiveseven.def similarity index 100% rename from zpak001.pk3dir/def/weapons/fiveseven.def rename to zpak001.pk3dir/decls/def/weapons/fiveseven.def diff --git a/zpak001.pk3dir/def/weapons/flashbang.def b/zpak001.pk3dir/decls/def/weapons/flashbang.def similarity index 100% rename from zpak001.pk3dir/def/weapons/flashbang.def rename to zpak001.pk3dir/decls/def/weapons/flashbang.def diff --git a/zpak001.pk3dir/def/weapons/g3sg1.def b/zpak001.pk3dir/decls/def/weapons/g3sg1.def similarity index 100% rename from zpak001.pk3dir/def/weapons/g3sg1.def rename to zpak001.pk3dir/decls/def/weapons/g3sg1.def diff --git a/zpak001.pk3dir/def/weapons/galil.def b/zpak001.pk3dir/decls/def/weapons/galil.def similarity index 100% rename from zpak001.pk3dir/def/weapons/galil.def rename to zpak001.pk3dir/decls/def/weapons/galil.def diff --git a/zpak001.pk3dir/def/weapons/glock18.def b/zpak001.pk3dir/decls/def/weapons/glock18.def similarity index 77% rename from zpak001.pk3dir/def/weapons/glock18.def rename to zpak001.pk3dir/decls/def/weapons/glock18.def index 7a6d8c7..f540e6f 100644 --- a/zpak001.pk3dir/def/weapons/glock18.def +++ b/zpak001.pk3dir/decls/def/weapons/glock18.def @@ -13,12 +13,12 @@ entityDef weapon_glock18 "ammoRequired" "1" "model_flash" "sprites/muzzleflash2.spr" - "actFire" "5" - "actFireLast" "6" - "actHolster" "9" - "actReload" "7,12" - "actDraw" "9,11" - "actIdle" "0,1,2" + "actFire" "5" + "actFireLast" "6" + "actHolster" "9" + "actReload" "7,12" + "actDraw" "9,11" + "actIdle" "0,1,2" "snd_fire" "Weapon_Glock.Single" @@ -35,6 +35,10 @@ entityDef weapon_glock18 "multiplierShots" "2.0" "multiplierStrength" "0.7" "multiplierInaccuracy" "1.0" + "weight" "5" + "altMode" "1" + "actModeOn" "3" + "actModeOff" "3" } entityDef projectile_glock @@ -45,7 +49,7 @@ entityDef projectile_glock entityDef fireInfo_glock18 { - "def_onFire" "projectile_glock" + "def_onFire" "projectile_glock" "ammoType" "ammo_9mm" "ammoPerShot" "1" "fireRate" "0.13" @@ -54,12 +58,12 @@ entityDef fireInfo_glock18 entityDef fireInfo_altglock18 { - "def_onFire" "projectile_glock" + "def_onFire" "projectile_glock" "ammoType" "ammo_9mm" "ammoPerShot" "3" "numProjectiles" "3" "fireRate" "0.5" "accuracyDivisor" "75" - "actFire" "3,4" - "snd_fire" "Weapon_Glock.Burst" + "actFire" "3,4" + "snd_fire" "Weapon_Glock.Burst" } diff --git a/zpak001.pk3dir/def/weapons/hegrenade.def b/zpak001.pk3dir/decls/def/weapons/hegrenade.def similarity index 100% rename from zpak001.pk3dir/def/weapons/hegrenade.def rename to zpak001.pk3dir/decls/def/weapons/hegrenade.def diff --git a/zpak001.pk3dir/def/weapons/knife.def b/zpak001.pk3dir/decls/def/weapons/knife.def similarity index 100% rename from zpak001.pk3dir/def/weapons/knife.def rename to zpak001.pk3dir/decls/def/weapons/knife.def diff --git a/zpak001.pk3dir/def/weapons/m249.def b/zpak001.pk3dir/decls/def/weapons/m249.def similarity index 100% rename from zpak001.pk3dir/def/weapons/m249.def rename to zpak001.pk3dir/decls/def/weapons/m249.def diff --git a/zpak001.pk3dir/def/weapons/m3.def b/zpak001.pk3dir/decls/def/weapons/m3.def similarity index 100% rename from zpak001.pk3dir/def/weapons/m3.def rename to zpak001.pk3dir/decls/def/weapons/m3.def diff --git a/zpak001.pk3dir/def/weapons/m4a1.def b/zpak001.pk3dir/decls/def/weapons/m4a1.def similarity index 100% rename from zpak001.pk3dir/def/weapons/m4a1.def rename to zpak001.pk3dir/decls/def/weapons/m4a1.def diff --git a/zpak001.pk3dir/def/weapons/mac10.def b/zpak001.pk3dir/decls/def/weapons/mac10.def similarity index 100% rename from zpak001.pk3dir/def/weapons/mac10.def rename to zpak001.pk3dir/decls/def/weapons/mac10.def diff --git a/zpak001.pk3dir/def/weapons/mp5navy.def b/zpak001.pk3dir/decls/def/weapons/mp5navy.def similarity index 100% rename from zpak001.pk3dir/def/weapons/mp5navy.def rename to zpak001.pk3dir/decls/def/weapons/mp5navy.def diff --git a/zpak001.pk3dir/def/weapons/p228.def b/zpak001.pk3dir/decls/def/weapons/p228.def similarity index 100% rename from zpak001.pk3dir/def/weapons/p228.def rename to zpak001.pk3dir/decls/def/weapons/p228.def diff --git a/zpak001.pk3dir/def/weapons/p90.def b/zpak001.pk3dir/decls/def/weapons/p90.def similarity index 100% rename from zpak001.pk3dir/def/weapons/p90.def rename to zpak001.pk3dir/decls/def/weapons/p90.def diff --git a/zpak001.pk3dir/def/weapons/scout.def b/zpak001.pk3dir/decls/def/weapons/scout.def similarity index 100% rename from zpak001.pk3dir/def/weapons/scout.def rename to zpak001.pk3dir/decls/def/weapons/scout.def diff --git a/zpak001.pk3dir/def/weapons/sg550.def b/zpak001.pk3dir/decls/def/weapons/sg550.def similarity index 100% rename from zpak001.pk3dir/def/weapons/sg550.def rename to zpak001.pk3dir/decls/def/weapons/sg550.def diff --git a/zpak001.pk3dir/def/weapons/sg552.def b/zpak001.pk3dir/decls/def/weapons/sg552.def similarity index 100% rename from zpak001.pk3dir/def/weapons/sg552.def rename to zpak001.pk3dir/decls/def/weapons/sg552.def diff --git a/zpak001.pk3dir/def/weapons/smokegrenade.def b/zpak001.pk3dir/decls/def/weapons/smokegrenade.def similarity index 100% rename from zpak001.pk3dir/def/weapons/smokegrenade.def rename to zpak001.pk3dir/decls/def/weapons/smokegrenade.def diff --git a/zpak001.pk3dir/def/weapons/tmp.def b/zpak001.pk3dir/decls/def/weapons/tmp.def similarity index 100% rename from zpak001.pk3dir/def/weapons/tmp.def rename to zpak001.pk3dir/decls/def/weapons/tmp.def diff --git a/zpak001.pk3dir/def/weapons/ump45.def b/zpak001.pk3dir/decls/def/weapons/ump45.def similarity index 100% rename from zpak001.pk3dir/def/weapons/ump45.def rename to zpak001.pk3dir/decls/def/weapons/ump45.def diff --git a/zpak001.pk3dir/def/weapons/usp.def b/zpak001.pk3dir/decls/def/weapons/usp.def similarity index 100% rename from zpak001.pk3dir/def/weapons/usp.def rename to zpak001.pk3dir/decls/def/weapons/usp.def diff --git a/zpak001.pk3dir/def/weapons/xm1014.def b/zpak001.pk3dir/decls/def/weapons/xm1014.def similarity index 100% rename from zpak001.pk3dir/def/weapons/xm1014.def rename to zpak001.pk3dir/decls/def/weapons/xm1014.def diff --git a/zpak001.pk3dir/sound/impacts.sndshd b/zpak001.pk3dir/decls/sound/impacts.sndshd similarity index 99% rename from zpak001.pk3dir/sound/impacts.sndshd rename to zpak001.pk3dir/decls/sound/impacts.sndshd index 10e12f2..eab8083 100644 --- a/zpak001.pk3dir/sound/impacts.sndshd +++ b/zpak001.pk3dir/decls/sound/impacts.sndshd @@ -24,7 +24,6 @@ sfx_impact.flesh sample debris/flesh1.wav sample debris/flesh2.wav sample debris/flesh3.wav - sample debris/flesh4.wav sample debris/flesh5.wav sample debris/flesh6.wav sample debris/flesh7.wav diff --git a/zpak001.pk3dir/sound/items_cstrike.sndshd b/zpak001.pk3dir/decls/sound/items_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/sound/items_cstrike.sndshd rename to zpak001.pk3dir/decls/sound/items_cstrike.sndshd diff --git a/zpak001.pk3dir/sound/npcs_cstrike.sndshd b/zpak001.pk3dir/decls/sound/npcs_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/sound/npcs_cstrike.sndshd rename to zpak001.pk3dir/decls/sound/npcs_cstrike.sndshd diff --git a/zpak001.pk3dir/sound/player.sndshd b/zpak001.pk3dir/decls/sound/player.sndshd similarity index 100% rename from zpak001.pk3dir/sound/player.sndshd rename to zpak001.pk3dir/decls/sound/player.sndshd diff --git a/zpak001.pk3dir/sound/weapons_cstrike.sndshd b/zpak001.pk3dir/decls/sound/weapons_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/sound/weapons_cstrike.sndshd rename to zpak001.pk3dir/decls/sound/weapons_cstrike.sndshd diff --git a/zpak001.pk3dir/default.cfg b/zpak001.pk3dir/default.cfg index f520110..1ad6480 100644 --- a/zpak001.pk3dir/default.cfg +++ b/zpak001.pk3dir/default.cfg @@ -1,90 +1,45 @@ -// Generic Binds -bind "ESC" "togglemenu" -bind "w" "+forward" -bind "s" "+back" -bind "a" "+moveleft" -bind "d" "+moveright" -bind "SPACE" "+jump" -bind "CTRL" "+duck" -bind "SHIFT" "+speed" -bind "0" "slot10" -bind "1" "slot1" -bind "2" "slot2" -bind "3" "slot3" -bind "4" "slot4" -bind "5" "slot5" -bind "6" "slot6" -bind "7" "slot7" -bind "8" "slot8" -bind "9" "slot9" -bind "UPARROW" "+forward" -bind "DOWNARROW" "+back" -bind "LEFTARROW" "+left" -bind "RIGHTARROW" "+right" -bind "MOUSE1" "+attack" -bind "MOUSE2" "+attack2" -bind "MWHEELDOWN" "invnext" -bind "MWHEELUP" "invprev" -bind "r" "+reload" -bind "e" "+use" -bind "TAB" "+showscores" -bind "y" "messagemode" -bind "u" "messagemode2" -bind "t" "impulse 201" -bind "f" "impulse 100" -bind "f1" "vote yes" -bind "f2" "vote no" - -// Counter-Strike Binds -bind "b" "buy" -bind "m" "chooseteam" -bind "g" "drop" -bind "q" "lastinv" - -// Game Variables -seta "hostname" "FreeCS Server" -seta "maxplayers" "8" -seta "mp_startmoney" "800" -seta "mp_buytime" "90" -seta "mp_freezetime" "6" -seta "mp_c4timer" "45" -seta "mp_roundtime" "5" -seta "fcs_knifeonly" "0" -seta "fcs_swapteams" "0" -seta "fcs_nopickups" "0" -seta "fcs_reward_kill" "300" -seta "fcs_penalty_pain" "-150" -seta "fcs_penalty_kill" "-1500" -seta "fcs_maxmoney" "16000" -seta "fcs_fillweapons" "0" -seta "fcs_autoreload" "0" - -// 2D/HUD Variables -seta "con_color" "255 150 0" -seta "vgui_color" "255 170 0" -seta "cross_color" "0 255 0" - -// physics -seta sv_stepheight 18 -seta sv_airstepheight 18 -seta sv_friction 4 -seta sv_edgefriction 1 -seta sv_stopspeed 75 -seta sv_gravity 800 -seta sv_airaccelerate 10 -seta sv_wateraccelerate 8 -seta sv_accelerate 4 -seta sv_maxspeed 250 - -// disable some nuclide niceties -seta v_muzzledlight 0 - -// config compat -alias mp_timelimit timelimit -alias mp_fraglimit fraglimit - -// video settings -seta gl_overbright 0 -seta gl_ldr 1 -seta r_lightmap_format rgb8 -seta cl_movespeedkey 0.2 +exec default_controls.cfg + +// game specific binds +bind "b" "buy" +bind "m" "chooseteam" +bind "g" "drop" + +exec cvar_defaults.cfg + +// game specific cvars +seta "hostname" "FreeCS Server" +seta "maxplayers" "8" +seta "mp_startmoney" "800" +seta "mp_buytime" "90" +seta "mp_freezetime" "6" +seta "mp_c4timer" "45" +seta "mp_roundtime" "5" +seta "fcs_knifeonly" "0" +seta "fcs_swapteams" "0" +seta "fcs_nopickups" "0" +seta "fcs_reward_kill" "300" +seta "fcs_penalty_pain" "-150" +seta "fcs_penalty_kill" "-1500" +seta "fcs_maxmoney" "16000" +seta "fcs_fillweapons" "0" +seta "fcs_autoreload" "0" + +// cosmetic branding changes +seta "con_color" "255 150 0" +seta "vgui_color" "255 170 0" +seta "cross_color" "0 255 0" + +// physics differences from valve/ +seta pm_accelerate "4" +seta pm_airaccelerate "10" +seta pm_airstepsize "18" +seta pm_crouchviewheight "30" +seta pm_edgefriction "1" +seta pm_friction "4" +seta pm_gravity "800" +seta pm_normalviewheight "54" +seta pm_stepsize "18" +seta pm_stopspeed "75" +seta pm_walkspeed "250" +seta pm_wateraccelerate "8" From d376999f6c7bf21f7a994afd846d5651de1f4fd0 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 16 Oct 2024 23:11:24 -0700 Subject: [PATCH 08/17] Move CS gamerules into their own progs using multiprogs. Clean up scripts. --- src/Makefile | 1 + src/client/cmds.qc | 159 +- src/client/defs.h | 6 + src/client/hud.qc | 51 +- src/client/hud_ammonotify.qc | 7 +- src/client/init.qc | 70 - src/client/progs.src | 3 +- src/client/textmenu.qc | 39 +- src/client/vgui_changeclass_ct.qc | 18 +- src/client/vgui_changeclass_t.qc | 18 +- src/client/vgui_chooseteam.qc | 9 +- src/client/vgui_spectator.qc | 7 +- src/rules/Makefile | 5 + src/rules/counterstrike.qc | 1077 ++++++++++++++ src/rules/money.h | 238 +++ src/rules/radio.h | 121 ++ src/server/ammo.h | 19 - src/server/ammo.qc | 349 ----- src/server/armoury_entity.qc | 4 +- src/server/bot.h | 20 - src/server/bot.qc | 587 -------- src/server/buy.h | 56 - src/server/buy.qc | 180 --- src/server/defs.h | 38 - src/server/func_bomb_target.qc | 3 +- src/server/func_buyzone.qc | 2 +- src/server/func_escapezone.qc | 40 +- src/server/func_hostage_rescue.qc | 10 +- src/server/func_vip_safetyzone.qc | 5 +- src/server/game_money.qc | 156 -- src/server/game_rules.qc | 44 - src/server/gamerules.h | 116 -- src/server/gamerules.qc | 115 -- src/server/gamerules_deathmatch.qc | 292 ---- src/server/gamerules_multiplayer.qc | 1291 ----------------- src/server/gamerules_singleplayer.qc | 78 - src/server/hostage_entity.qc | 35 +- src/server/info_hostage_rescue.qc | 10 +- src/server/money.h | 27 - src/server/progs.src | 12 +- src/server/radio.h | 20 - src/server/radio.qc | 8 +- src/server/server.qc | 29 +- src/shared/animations.qc | 8 +- src/shared/defs.h | 3 - src/shared/include.src | 27 +- src/shared/item_c4bomb.qc | 24 +- src/shared/items.h | 51 - src/shared/player.h | 827 +++++++---- src/shared/pmove.qc | 75 - src/shared/skeleton.h | 82 ++ zpak001.pk3dir/decls/def/ammo.def | 171 +-- zpak001.pk3dir/decls/def/ammo/338magnum.def | 7 + zpak001.pk3dir/decls/def/ammo/357sig.def | 7 + zpak001.pk3dir/decls/def/ammo/45acp.def | 7 + zpak001.pk3dir/decls/def/ammo/50ae.def | 7 + zpak001.pk3dir/decls/def/ammo/556nato.def | 7 + zpak001.pk3dir/decls/def/ammo/556natobox.def | 7 + zpak001.pk3dir/decls/def/ammo/57mm.def | 7 + zpak001.pk3dir/decls/def/ammo/762nato.def | 7 + zpak001.pk3dir/decls/def/ammo/9mm.def | 7 + zpak001.pk3dir/decls/def/ammo/base.def | 9 + zpak001.pk3dir/decls/def/ammo/buckshot.def | 7 + zpak001.pk3dir/decls/def/monsters.def | 1 + zpak001.pk3dir/decls/def/player.def | 77 + zpak001.pk3dir/decls/def/weapons/ak47.def | 8 +- zpak001.pk3dir/decls/def/weapons/aug.def | 8 +- zpak001.pk3dir/decls/def/weapons/awp.def | 10 +- zpak001.pk3dir/decls/def/weapons/c4.def | 6 +- zpak001.pk3dir/decls/def/weapons/deagle.def | 10 +- zpak001.pk3dir/decls/def/weapons/elite.def | 14 +- zpak001.pk3dir/decls/def/weapons/famas.def | 10 +- .../decls/def/weapons/fiveseven.def | 10 +- .../decls/def/weapons/flashbang.def | 4 +- zpak001.pk3dir/decls/def/weapons/g3sg1.def | 8 +- zpak001.pk3dir/decls/def/weapons/galil.def | 10 +- zpak001.pk3dir/decls/def/weapons/glock18.def | 14 +- .../decls/def/weapons/hegrenade.def | 4 +- zpak001.pk3dir/decls/def/weapons/knife.def | 54 +- zpak001.pk3dir/decls/def/weapons/m249.def | 8 +- zpak001.pk3dir/decls/def/weapons/m3.def | 12 +- zpak001.pk3dir/decls/def/weapons/m4a1.def | 22 +- zpak001.pk3dir/decls/def/weapons/mac10.def | 8 +- zpak001.pk3dir/decls/def/weapons/mp5navy.def | 8 +- zpak001.pk3dir/decls/def/weapons/p228.def | 10 +- zpak001.pk3dir/decls/def/weapons/p90.def | 8 +- zpak001.pk3dir/decls/def/weapons/scout.def | 8 +- zpak001.pk3dir/decls/def/weapons/sg550.def | 8 +- zpak001.pk3dir/decls/def/weapons/sg552.def | 8 +- .../decls/def/weapons/smokegrenade.def | 10 +- zpak001.pk3dir/decls/def/weapons/tmp.def | 8 +- zpak001.pk3dir/decls/def/weapons/ump45.def | 8 +- zpak001.pk3dir/decls/def/weapons/usp.def | 26 +- zpak001.pk3dir/decls/def/weapons/xm1014.def | 12 +- zpak001.pk3dir/decls/sound/player.sndshd | 11 +- zpak001.pk3dir/decls/typeinfo/hlmat.decl | 19 + zpak001.pk3dir/default.cfg | 48 +- zpak001.pk3dir/default_aliases.cfg | 57 + zpak001.pk3dir/default_cstrike.cfg | 41 + zpak001.pk3dir/scripts/bots.txt | 6 +- zpak001.pk3dir/scripts/client_style.txt | 11 + zpak001.pk3dir/scripts/surfaceproperties.txt | 224 --- .../scripts/surfaceproperties_cstrike.txt | 17 + .../scripts/surfaceproperties_manifest.txt | 5 + zpak001.pk3dir/scripts/ui_style.txt | 10 + 105 files changed, 2816 insertions(+), 4767 deletions(-) create mode 100644 src/rules/Makefile create mode 100644 src/rules/counterstrike.qc create mode 100644 src/rules/money.h create mode 100644 src/rules/radio.h delete mode 100644 src/server/ammo.h delete mode 100644 src/server/ammo.qc delete mode 100644 src/server/bot.h delete mode 100644 src/server/bot.qc delete mode 100644 src/server/buy.h delete mode 100644 src/server/buy.qc delete mode 100644 src/server/game_money.qc delete mode 100644 src/server/game_rules.qc delete mode 100644 src/server/gamerules.h delete mode 100644 src/server/gamerules.qc delete mode 100644 src/server/gamerules_deathmatch.qc delete mode 100644 src/server/gamerules_multiplayer.qc delete mode 100644 src/server/gamerules_singleplayer.qc delete mode 100644 src/server/money.h delete mode 100644 src/server/radio.h delete mode 100644 src/shared/items.h delete mode 100644 src/shared/pmove.qc create mode 100644 src/shared/skeleton.h create mode 100644 zpak001.pk3dir/decls/def/ammo/338magnum.def create mode 100644 zpak001.pk3dir/decls/def/ammo/357sig.def create mode 100644 zpak001.pk3dir/decls/def/ammo/45acp.def create mode 100644 zpak001.pk3dir/decls/def/ammo/50ae.def create mode 100644 zpak001.pk3dir/decls/def/ammo/556nato.def create mode 100644 zpak001.pk3dir/decls/def/ammo/556natobox.def create mode 100644 zpak001.pk3dir/decls/def/ammo/57mm.def create mode 100644 zpak001.pk3dir/decls/def/ammo/762nato.def create mode 100644 zpak001.pk3dir/decls/def/ammo/9mm.def create mode 100644 zpak001.pk3dir/decls/def/ammo/base.def create mode 100644 zpak001.pk3dir/decls/def/ammo/buckshot.def create mode 100644 zpak001.pk3dir/decls/typeinfo/hlmat.decl create mode 100644 zpak001.pk3dir/default_aliases.cfg create mode 100644 zpak001.pk3dir/default_cstrike.cfg create mode 100644 zpak001.pk3dir/scripts/client_style.txt delete mode 100644 zpak001.pk3dir/scripts/surfaceproperties.txt create mode 100644 zpak001.pk3dir/scripts/surfaceproperties_cstrike.txt create mode 100644 zpak001.pk3dir/scripts/surfaceproperties_manifest.txt create mode 100644 zpak001.pk3dir/scripts/ui_style.txt diff --git a/src/Makefile b/src/Makefile index cc3f82d..c2ba2d8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,3 +3,4 @@ CC=fteqcc all: cd client && $(MAKE) cd server && $(MAKE) + cd rules && $(MAKE) diff --git a/src/client/cmds.qc b/src/client/cmds.qc index 7a0608b..ab3b654 100644 --- a/src/client/cmds.qc +++ b/src/client/cmds.qc @@ -115,164 +115,7 @@ ClientGame_ConsoleCommand(void) case "drop": sendevent("DropWeapon", ""); break; - case "glock": - sendevent("CSBuy", "f", BUY_GLOCK18); - break; - case "usp": - sendevent("CSBuy", "f", BUY_USP45); - break; - case "p228": - sendevent("CSBuy", "f", BUY_P228); - break; - case "deagle": - sendevent("CSBuy", "f", BUY_DEAGLE); - break; - case "fn57": - sendevent("CSBuy", "f", BUY_FIVESEVEN); - break; - case "elites": - sendevent("CSBuy", "f", BUY_ELITES); - break; - case "m3": - sendevent("CSBuy", "f", BUY_M3); - break; - case "xm1014": - sendevent("CSBuy", "f", BUY_XM1014); - break; - case "tmp": - sendevent("CSBuy", "f", BUY_TMP); - break; - case "mac10": - sendevent("CSBuy", "f", BUY_MAC10); - break; - case "mp5": - sendevent("CSBuy", "f", BUY_MP5); - break; - case "ump45": - sendevent("CSBuy", "f", BUY_UMP45); - break; - case "p90": - sendevent("CSBuy", "f", BUY_P90); - break; - case "ak47": - sendevent("CSBuy", "f", BUY_AK47); - break; - case "m4a1": - sendevent("CSBuy", "f", BUY_M4A1); - break; - case "sg552": - sendevent("CSBuy", "f", BUY_SG552); - break; - case "aug": - sendevent("CSBuy", "f", BUY_AUG); - break; - case "scout": - sendevent("CSBuy", "f", BUY_SCOUT); - break; - case "sg550": - sendevent("CSBuy", "f", BUY_SG550); - break; - case "awp": - sendevent("CSBuy", "f", BUY_AWP); - break; - case "g3sg1": - sendevent("CSBuy", "f", BUY_G3SG1); - break; - case "m249": - sendevent("CSBuy", "f", BUY_PARA); - break; - case "buyammo1": - case "primammo": - sendevent("CSBuy", "f", BUY_PRIMARYAMMO); - break; - case "buyammo2": - case "secammo": - sendevent("CSBuy", "f", BUY_SECONDARYAMMO); - break; - case "vest": - sendevent("CSBuy", "f", BUY_VEST); - break; - case "vesthelm": - sendevent("CSBuy", "f", BUY_VESTHELMET); - break; - case "flash": - sendevent("CSBuy", "f", BUY_FLASHBANG); - break; - case "hegren": - sendevent("CSBuy", "f", BUY_HEGRENADE); - break; - case "vsgren": - sendevent("CSBuy", "f", BUY_SMOKEGRENADE); - break; - case "defuser": - sendevent("CSBuy", "f", BUY_DEFUSALKIT); - break; - case "nvg": - sendevent("CSBuy", "f", BUY_NIGHTVISION); - break; - case "coverme": - sendevent("Radio", "f", RADIO_CT_COVERME); - break; - case "takepoint": - sendevent("Radio", "f", RADIO_CT_POINT); - break; - case "takepoint": - sendevent("Radio", "f", RADIO_POSITION); - break; - case "regroup": - sendevent("Radio", "f", RADIO_REGROUP); - break; - case "followme": - sendevent("Radio", "f", RADIO_FOLLOWME); - break; - case "takingfire": - sendevent("Radio", "f", RADIO_FIREASSIS); - break; - case "go": - sendevent("Radio", "f", RADIO_GO); - break; - case "fallback": - sendevent("Radio", "f", RADIO_FALLBACK); - break; - case "sticktog": - sendevent("Radio", "f", RADIO_STICKTOG); - break; - case "getinpos": - sendevent("Radio", "f", RADIO_COM_GETINPOS); - break; - case "stormfront": - sendevent("Radio", "f", RADIO_STORMFRONT); - break; - case "report": - sendevent("Radio", "f", RADIO_COM_REPORTIN); - break; - case "roger": - sendevent("Radio", "f", RADIO_ROGER); - break; - case "enemyspot": - sendevent("Radio", "f", RADIO_CT_ENEMYS); - break; - case "needbackup": - sendevent("Radio", "f", RADIO_CT_BACKUP); - break; - case "sectorclear": - sendevent("Radio", "f", RADIO_CLEAR); - break; - case "inposition": - sendevent("Radio", "f", RADIO_CT_INPOS); - break; - case "reportingin": - sendevent("Radio", "f", RADIO_CT_REPORTINGIN); - break; - case "getout": - sendevent("Radio", "f", RADIO_GETOUT); - break; - case "negative": - sendevent("Radio", "f", RADIO_NEGATIVE); - break; - case "enemydown": - sendevent("Radio", "f", RADIO_ENEMYDOWN); - break; + default: return (0); } diff --git a/src/client/defs.h b/src/client/defs.h index d1f835d..0017576 100644 --- a/src/client/defs.h +++ b/src/client/defs.h @@ -94,3 +94,9 @@ void HUD_DrawAmmoBar(vector pos, float val, float max, float a); void Cstrike_DrawSimpleCrosshair(void); void Cstrike_DrawScope(void); void Textmenu_Call(string); + +float +GetGameTime(void) +{ + return max(0.0f, serverkeyfloat("cs_gametime") - time); +} diff --git a/src/client/hud.qc b/src/client/hud.qc index 28e9744..0a285d9 100644 --- a/src/client/hud.qc +++ b/src/client/hud.qc @@ -127,12 +127,12 @@ HUD_DrawTimer(int NSClientSpectator) time_pos = g_hudmins + [(g_hudres[0] / 2) - 62, g_hudres[1] - 42]; } - if (getstatf(STAT_GAMETIME) == -1) { + if (GetGameTime() < -1) { return; } - iMinutes = getstatf(STAT_GAMETIME) / 60; - iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes; + iMinutes = GetGameTime() / 60; + iSeconds = GetGameTime() - 60 * iMinutes; iTens = iSeconds / 10; iUnits = iSeconds - 10 * iTens; @@ -190,31 +190,32 @@ HUD_DrawMoney(void) { vector money_pos; float endalpha; + float moneyValue = getplayerkeyfloat(player_localnum, "*money"); money_pos = g_hudmins + [g_hudres[0] - 160, g_hudres[1] - 72]; /* if the money differs from last frame, paint it appropriately */ - if (getstati(STAT_MONEY) > pSeatLocal->m_iMoneyOld) { + if (moneyValue > pSeatLocal->m_iMoneyOld) { /* effect already in progress from something else, go add on top of it! */ if (pSeatLocal->m_flMoneyAlpha > 0) { - pSeatLocal->m_iMoneyDelta += (pSeatLocal->m_iMoneyOld - getstati(STAT_MONEY)); + pSeatLocal->m_iMoneyDelta += (pSeatLocal->m_iMoneyOld - moneyValue); } else { - pSeatLocal->m_iMoneyDelta = pSeatLocal->m_iMoneyOld - getstati(STAT_MONEY); + pSeatLocal->m_iMoneyDelta = pSeatLocal->m_iMoneyOld - moneyValue; } /* make it green for a short time */ pSeatLocal->m_vecMoneyColor = [0,1,0]; pSeatLocal->m_flMoneyAlpha = 1.0; - } else if (getstati(STAT_MONEY) < pSeatLocal->m_iMoneyOld) { + } else if (moneyValue < pSeatLocal->m_iMoneyOld) { /* same one as above */ if (pSeatLocal->m_flMoneyAlpha > 0) { - pSeatLocal->m_iMoneyDelta += (pSeatLocal->m_iMoneyOld - getstati(STAT_MONEY)); + pSeatLocal->m_iMoneyDelta += (pSeatLocal->m_iMoneyOld - moneyValue); } else { - pSeatLocal->m_iMoneyDelta = pSeatLocal->m_iMoneyOld - getstati(STAT_MONEY); + pSeatLocal->m_iMoneyDelta = pSeatLocal->m_iMoneyOld - moneyValue; } /* make it red */ pSeatLocal->m_vecMoneyColor = [1,0,0]; pSeatLocal->m_flMoneyAlpha = 1.0; - pSeatLocal->m_iMoneyDelta = pSeatLocal->m_iMoneyOld - getstati(STAT_MONEY); + pSeatLocal->m_iMoneyDelta = pSeatLocal->m_iMoneyOld - moneyValue; } /* maximum alpha is variable. */ @@ -259,7 +260,7 @@ HUD_DrawMoney(void) money_pos[0] += (24 * 5); /* draw the red/green overlay numbers on top of ours */ - HUD_DrawNums(getstati(STAT_MONEY), money_pos, endalpha, pSeatLocal->m_vecMoneyColor); + HUD_DrawNums(moneyValue, money_pos, endalpha, pSeatLocal->m_vecMoneyColor); /* draw above how much money we've lost/gotten from all this */ HUD_DrawNums(fabs(pSeatLocal->m_iMoneyDelta), money_pos + [0,-32], endalpha, pSeatLocal->m_vecMoneyColor); @@ -269,13 +270,13 @@ HUD_DrawMoney(void) /* regular number */ HUD_DrawNums( - getstati(STAT_MONEY), + moneyValue, money_pos, HUD_ALPHA - endalpha, g_hud_color ); - pSeatLocal->m_iMoneyOld = getstati(STAT_MONEY); + pSeatLocal->m_iMoneyOld = moneyValue; pSeatLocal->m_flMoneyAlpha = max(0, pSeatLocal->m_flMoneyAlpha - (clframetime * 0.5)); } @@ -345,7 +346,7 @@ HUD_DrawArmor(void) pSeatLocal->m_flArmorAlpha = HUD_ALPHA; } - if (pl.g_items & ITEM_HELMET) { + if (pl.HasItem("item_kevlar_helmet")) { drawsubpic( pos + [-80,1], [24,24], @@ -370,7 +371,7 @@ HUD_DrawArmor(void) } if (pl.armor > 0) { - if (pl.g_items & ITEM_HELMET) { + if (pl.HasItem("item_kevlar_helmet")) { drawsubpic( pos + [-80,1], [24, 24 * (pl.armor / 100)], @@ -536,13 +537,13 @@ HUD_DrawZones(void) if (pl.gflags & GF_BUYZONE) { zc++; } - if (pl.g_items & ITEM_C4BOMB) { + if (pl.HasItem("weapon_c4")) { zc++; } if (pl.gflags & GF_RESCUEZONE) { zc++; } - if (pl.g_items & ITEM_DEFUSAL) { + if (pl.HasItem("item_defuse")) { zc++; } @@ -561,7 +562,7 @@ HUD_DrawZones(void) ); pos[1] += 32; } - if (pl.g_items & ITEM_C4BOMB) { + if (pl.HasItem("item_defuse")) { bool isRed = false; if (pl.gflags & GF_BOMBZONE) { @@ -607,7 +608,7 @@ HUD_DrawZones(void) ); pos[1] += 32; } - if (pl.g_items & ITEM_DEFUSAL) { + if (pl.HasItem("item_defuse")) { drawsubpic( pos, [32,32], @@ -695,17 +696,13 @@ HUD_PlayerNames(void) float own_team = getplayerkeyfloat(player_localnum, "*team"); string strAlliance; - if ((own_team == TEAM_CT || own_team == TEAM_VIP) && - (player_team == TEAM_VIP || player_team == TEAM_CT)) { - strAlliance = "Friend"; + if (own_team != player_team) { + strAlliance = "Enemy"; } else { - if (own_team != player_team) { - strAlliance = "Enemy"; - } else { - strAlliance = "Friend"; - } + strAlliance = "Friend"; } + if (player_team == TEAM_T) { Font_DrawText(vecTextPos, sprintf("%s%s: %s", \ HUD_GetChatColorHEX (TEAM_T), strAlliance, getplayerkeyvalue(player_num, "name")), FONT_CON); diff --git a/src/client/hud_ammonotify.qc b/src/client/hud_ammonotify.qc index a161404..6e3f43b 100644 --- a/src/client/hud_ammonotify.qc +++ b/src/client/hud_ammonotify.qc @@ -99,7 +99,7 @@ HUD_AmmoNotify_Insert(int type, int count) /* called whenever we should check for pickup updates */ void -HUD_AmmoNotify_Check(CSPlayer pl) +HUD_AmmoNotify_Check(NSClientPlayer pl) { #if 0 HUD_AmmoNotify_Insert(0, pl.ammo_50ae - pl.ammo_50ae_net); @@ -116,4 +116,9 @@ HUD_AmmoNotify_Check(CSPlayer pl) HUD_AmmoNotify_Insert(11, pl.ammo_fbgrenade - pl.ammo_fbgrenade_net); HUD_AmmoNotify_Insert(12, pl.ammo_smokegrenade - pl.ammo_smokegrenade_net); #endif +} + +void +HUD_ItemNotify_Check(NSClientPlayer pl) +{ } \ No newline at end of file diff --git a/src/client/init.qc b/src/client/init.qc index 72efe0d..ec1038d 100644 --- a/src/client/init.qc +++ b/src/client/init.qc @@ -36,76 +36,6 @@ ClientGame_Init(float apilevel, string enginename, float engineversion) registercommand("drop"); registercommand("nightvision"); - /* pistols */ - registercommand("glock"); - registercommand("usp"); - registercommand("p228"); - registercommand("deagle"); - registercommand("fn57"); - registercommand("elites"); - - /* shotties */ - registercommand("m3"); - registercommand("xm1014"); - - /* smg */ - registercommand("tmp"); - registercommand("mac10"); - registercommand("mp5"); - registercommand("ump45"); - - /* rifles */ - registercommand("p90"); - registercommand("ak47"); - registercommand("m4a1"); - registercommand("sg552"); - registercommand("aug"); - registercommand("scout"); - registercommand("sg550"); - registercommand("awp"); - registercommand("g3sg1"); - - /* lonely */ - registercommand("m249"); - - /* ammo */ - registercommand("primammo"); - registercommand("buyammo1"); - registercommand("secammo"); - registercommand("buyammo2"); - - /* equipment */ - registercommand("vest"); - registercommand("vesthelm"); - registercommand("flash"); - registercommand("hegren"); - registercommand("vsgren"); - registercommand("defuser"); - registercommand("nvg"); - - /* radio */ - registercommand("coverme"); - registercommand("takepoint"); - registercommand("holdpos"); - registercommand("regroup"); - registercommand("followme"); - registercommand("takingfire"); - registercommand("go"); - registercommand("fallback"); - registercommand("sticktog"); - registercommand("getinpos"); - registercommand("stormfront"); - registercommand("report"); - registercommand("roger"); - registercommand("enemyspot"); - registercommand("needbackup"); - registercommand("sectorclear"); - registercommand("inposition"); - registercommand("reportingin"); - registercommand("getout"); - registercommand("negative"); - registercommand("enemydown"); - /* hud */ registercommand("lastinv"); registercommand("invnext"); diff --git a/src/client/progs.src b/src/client/progs.src index 4a10522..73a5c38 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -1,11 +1,10 @@ #pragma target fte_5768 //#pragma flag enable assumeint -#pragma progs_dat "../../zpak001.pk3dir/csprogs.dat" +#pragma progs_dat "../../csprogs.dat" #define CSQC #define CLIENT #define CSTRIKE -#define CLASSIC_VGUI #includelist ../../../src/shared/fteextensions.qc diff --git a/src/client/textmenu.qc b/src/client/textmenu.qc index 9ca20a8..9b19efc 100644 --- a/src/client/textmenu.qc +++ b/src/client/textmenu.qc @@ -20,12 +20,14 @@ TEAM_SELECT(int n) switch (n) { case 1: Textmenu_Call("TERRORIST_SELECT"); + localcmd("cmd joinTeam 1\n"); break; case 2: Textmenu_Call("CT_SELECT"); + localcmd("cmd joinTeam 2\n"); break; case 5: - sendevent("JoinAuto", ""); + localcmd("cmd joinTeam 9\n"); Textmenu_Call(""); break; } @@ -33,55 +35,54 @@ TEAM_SELECT(int n) void TERRORIST_SELECT(int n) { + if (n == 5) + n = floor(random(1, 5)); + switch (n) { case 1: - sendevent("JoinTeam", "f", 1); + localcmd("cmd terror\n"); Textmenu_Call(""); break; case 2: - sendevent("JoinTeam", "f", 2); + localcmd("cmd leet\n"); Textmenu_Call(""); break; case 3: - sendevent("JoinTeam", "f", 3); + localcmd("cmd arctic\n"); Textmenu_Call(""); break; case 4: - sendevent("JoinTeam", "f", 4); - Textmenu_Call(""); - break; - case 5: - sendevent("JoinTeam", "f", floor(random(1,5))); + localcmd("cmd guerilla\n"); Textmenu_Call(""); break; } } void -CT_SELECT(int n) +CT_SELECT(int classSelection) { - switch (n) { + if (classSelection == 5) + classSelection = floor(random(1, 5)); + + switch (classSelection) { case 1: - sendevent("JoinTeam", "f", 5); + localcmd("cmd urban\n"); Textmenu_Call(""); break; case 2: - sendevent("JoinTeam", "f", 6); + localcmd("cmd gsg9\n"); Textmenu_Call(""); break; case 3: - sendevent("JoinTeam", "f", 7); + localcmd("cmd sas\n"); Textmenu_Call(""); break; case 4: - sendevent("JoinTeam", "f", 8); - Textmenu_Call(""); - break; - case 5: - sendevent("JoinTeam", "f", floor(random(1,5))); + localcmd("cmd gign\n"); Textmenu_Call(""); break; } } + void BUY(int n) { diff --git a/src/client/vgui_changeclass_ct.qc b/src/client/vgui_changeclass_ct.qc index 5c532fa..f471a6b 100644 --- a/src/client/vgui_changeclass_ct.qc +++ b/src/client/vgui_changeclass_ct.qc @@ -59,7 +59,21 @@ CSClassButtonCT::OnMouseUp(void) if (classSelection == 5) classSelection = floor(random(1, 5)); - sendevent("JoinTeam", "f", (float)classSelection + 4); + switch (classSelection) { + case 1: + localcmd("cmd urban\n"); + break; + case 2: + localcmd("cmd gsg9\n"); + break; + case 3: + localcmd("cmd sas\n"); + break; + case 4: + localcmd("cmd gign\n"); + break; + } + winClassSelectionCT.Hide(); } @@ -193,4 +207,4 @@ VGUI_ChooseClassCT(void) winClassSelectionCT.Show(); winClassSelectionCT.SetPos((g_vidsize / 2) - (winClassSelectionCT.GetSize() / 2)); -} \ No newline at end of file +} diff --git a/src/client/vgui_changeclass_t.qc b/src/client/vgui_changeclass_t.qc index bbe07d3..e08a9d8 100644 --- a/src/client/vgui_changeclass_t.qc +++ b/src/client/vgui_changeclass_t.qc @@ -60,7 +60,21 @@ CSClassButtonT::OnMouseUp(void) if (classSelection == 5) classSelection = floor(random(1, 5)); - sendevent("JoinTeam", "f", (float)classSelection); + switch (classSelection) { + case 1: + localcmd("cmd terror\n"); + break; + case 2: + localcmd("cmd leet\n"); + break; + case 3: + localcmd("cmd arctic\n"); + break; + case 4: + localcmd("cmd guerilla\n"); + break; + } + winClassSelection.Hide(); } @@ -194,4 +208,4 @@ VGUI_ChooseClassT(void) winClassSelection.Show(); winClassSelection.SetPos((g_vidsize / 2) - (winClassSelection.GetSize() / 2)); -} \ No newline at end of file +} diff --git a/src/client/vgui_chooseteam.qc b/src/client/vgui_chooseteam.qc index e5cb099..b8b6541 100644 --- a/src/client/vgui_chooseteam.qc +++ b/src/client/vgui_chooseteam.qc @@ -73,24 +73,23 @@ VGUI_ChooseTeam(void) static VGUILabel lblMapInfo; static void VGUI_ChooseTeam_CT(void) { + localcmd("cmd joinTeam 2\n"); VGUI_ChooseClassCT(); winChooseTeam.Hide(); } static void VGUI_ChooseTeam_T(void) { + localcmd("cmd joinTeam 1\n"); VGUI_ChooseClassT(); winChooseTeam.Hide(); } static void VGUI_ChooseTeam_Auto(void) { - if (VGUI_ChooseTeam_AutoQuery()) - VGUI_ChooseTeam_CT(); - else - VGUI_ChooseTeam_T(); + localcmd("cmd joinTeam 9\n"); } static void VGUI_ChooseTeam_Spec(void) { - sendevent("JoinSpectator", ""); + localcmd("cmd joinTeam 1002\n"); winChooseTeam.Hide(); } diff --git a/src/client/vgui_spectator.qc b/src/client/vgui_spectator.qc index 0865717..e77ac54 100644 --- a/src/client/vgui_spectator.qc +++ b/src/client/vgui_spectator.qc @@ -40,6 +40,7 @@ CSSpectateHUD::Draw(void) string strText; int iMinutes, iSeconds; NSClientSpectator spec = (NSClientSpectator)pSeat->m_ePlayer; + float moneyValue = getplayerkeyfloat(player_localnum, "*money"); /* parts on top and bottom */ drawfill(m_vecOrigin, [m_vecSize[0], 32], [0,0,0], 0.75f, DRAWFLAG_NORMAL); @@ -70,7 +71,7 @@ CSSpectateHUD::Draw(void) #endif /* money */ - strText = sprintf("$ %i", getstati(STAT_MONEY)); + strText = sprintf("$ %d", moneyValue); flSep = stringwidth(strText, TRUE, [12,12]); if (flSep < 42) @@ -99,8 +100,8 @@ CSSpectateHUD::Draw(void) /* time display */ drawpic([flSep + 8, 15], "gfx/vgui/640_timer", [14, 14], [1,1,1], 1.0f, DRAWFLAG_NORMAL); - iMinutes = getstatf(STAT_GAMETIME) / 60; - iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes; + iMinutes = GetGameTime() / 60; + iSeconds = GetGameTime() - 60 * iMinutes; strText = sprintf("%i:%02i", iMinutes, iSeconds); vecPos[0] = flSep + 8 + 17; vecPos[1] = g_hudmins[1] + 17; diff --git a/src/rules/Makefile b/src/rules/Makefile new file mode 100644 index 0000000..ed59d91 --- /dev/null +++ b/src/rules/Makefile @@ -0,0 +1,5 @@ +QCC=fteqcc + +all: + mkdir -pv ../../zpak001.pk3dir/progs/ + $(QCC) counterstrike.qc diff --git a/src/rules/counterstrike.qc b/src/rules/counterstrike.qc new file mode 100644 index 0000000..48f75a6 --- /dev/null +++ b/src/rules/counterstrike.qc @@ -0,0 +1,1077 @@ +/* + * 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. + */ + +#pragma PROGS_DAT "../../zpak001.pk3dir/progs/counterstrike.dat" + +#include "../../../src/server/api.h" + +#define TEAM_NONE 0i +#define TEAM_T 1i +#define TEAM_CT 2i + +typedef enum +{ + STATE_INACTIVE = 0i, + STATE_COMMENCING = 1i, + STATE_FREEZE = 2i, + STATE_ACTIVE = 3i, + STATE_END = 4i, + STATE_OVER = 5i +} csGameState_t; + +var csGameState_t g_csGameState; +var float g_cs_gametime; +var int g_csSwapTeamRoundCounter; +var int g_iEscapedTerrorists; + +/** @return If the usage of the flashlight is allowed. */ +bool +AllowFlashlight(void) +{ + return cvars.GetBool("mp_flashlight"); +} + +/** @return Number of hostages in the map. */ +int +HostageCount(void) +{ + return serverinfo.GetInteger("cs_hostages"); +} + +/** @return Number of different bomb zones/areas. Not bomb-sites. */ +int +BombZones(void) +{ + return serverinfo.GetInteger("cs_bombzones"); +} + +/** @return Number of different escape zones/areas. */ +int +EscapeZones(void) +{ + return serverinfo.GetInteger("cs_escapezones"); +} + +/** @return Number of different vip zones/areas. */ +int +VIPZones(void) +{ + return serverinfo.GetInteger("cs_vipzones"); +} + +/** @return If hostage rescue rules apply. */ +bool +IsHostageRescue(void) +{ + return (HostageCount() > 0i) ? (true) : (false); +} + +/** @return If bomb defusal rules apply. */ +bool +IsBombDefusal(void) +{ + return (BombZones() > 0i) ? (true) : (false); +} + +/** @return If escape mode rules apply. */ +bool +IsEscape(void) +{ + return (EscapeZones() > 0i) ? (true) : (false); +} + +/** @return If assassination rules apply. */ +bool +IsAssassination(void) +{ + return (VIPZones() > 0i) ? (true) : (false); +} + +/** Called to set the internal CS ruleset game state. */ +void +GameState_Set(csGameState_t newState) +{ + g_csGameState = newState; + + /* we need to be able to query it on the client. */ + serverinfo.SetInteger("cs_gamestate", newState); +} + +/** @return Current rule state. See csGameState_t for valid states. */ +csGameState_t +GameState(void) +{ + return (g_csGameState); +} + +float +GameTime(void) +{ + return (g_cs_gametime); +} + +/** @return Whether the bomb had been planted yet. */ +bool +BombHasBeenPlanted(void) +{ + return serverinfo.GetBool("cs_bombplanted"); +} + +/** @return Whether the bomb is being defused. */ +bool +BombIsBeingDefused(void) +{ + return serverinfo.GetBool("cs_bombbeingdefused"); +} + +/** @return How many rounds have been played on this map. */ +int +RoundsPlayed(void) +{ + return serverinfo.GetInteger("cs_roundsplayed"); +} + +/** @return How many hostages have been rescued this round. */ +int +HostagesRescued(void) +{ + return serverinfo.GetInteger("cs_hostagesrescued"); +} + +/** @return The desired CS round time, in seconds. */ +float +RoundTime(void) +{ + return cvars.GetFloat("mp_roundtime") * 60; +} + +/** @return The desired map time limit, in seconds. */ +float +TimeLimit(void) +{ + return cvars.GetFloat("mp_timelimit") * 60; +} + +/** @return The desired map win limit, in rounds won. */ +int +WinLimit(void) +{ + return cvars.GetInteger("mp_winlimit"); +} + +/** @return The amount of frozen time at the start of each round. */ +float +FreezeTime(void) +{ + return cvars.GetFloat("mp_freezetime"); +} + +/** @parm playerCheck Player to check the status from. +@return Whether the given player is a VIP in the Assassination mode. */ +bool +IsVIP(entity playerCheck) +{ + return userinfo.GetBool(playerCheck, "*csvip"); +} + +/** Turns a player into a bomber. Tasked to plant the bomb at a given site. +@parm targetPlayer Player to turn into a bomber. */ +void +MakeBomber(entity targetPlayer) +{ + if (!targetPlayer) { + return; + } + + ents.Input(targetPlayer, "GiveItem", "weapon_c4", targetPlayer); + /* env_message_single(pl, "Hint_you_have_the_bomb"); */ +} + +/** Turns a player into a VIP. He has to escape from the terrorist threat. +@parm targetPlayer Player to turn into a bomber. */ +void +MakeVIP(entity targetPlayer) +{ + if (!targetPlayer) { + return; + } + + userinfo.SetBool(targetPlayer, "*csvip", true); + targetPlayer.modelindex = getmodelindex(entityDef.GetString("player_vip", "model")); +} + +/** Sets the target player's T model class. Visual fluff. */ +void +SetTClass(entity targetPlayer, integer modelIndex) +{ + userinfo.SetInteger(targetPlayer, "t_class", modelIndex); +} + +/** Sets the target player's CT model class. Visual fluff. */ +void +SetCTClass(entity targetPlayer, integer modelIndex) +{ + userinfo.SetInteger(targetPlayer, "ct_class", modelIndex); +} + +/** Returns the modelindex the target player desires to use for the CT team. */ +float +GetCTModelIndex(entity targetPlayer) +{ + int classID = userinfo.GetInteger(targetPlayer, "ct_class"); + string keyName = sprintf("model_class%i", classID); + return getmodelindex(entityDef.GetString("player_counterterrorist", keyName)); +} + +/** Returns the modelindex the target player desires to use for the T team. */ +float +GetTModelIndex(entity targetPlayer) +{ + int classID = userinfo.GetInteger(targetPlayer, "t_class"); + string keyName = sprintf("model_class%i", classID); + return getmodelindex(entityDef.GetString("player_terrorist", keyName)); +} + +/** Instantiates a player into the world. Playable by the end. */ +void +SoftRespawn(entity targetPlayer) +{ + if (!targetPlayer) { + return; + } + + /* override any currently set model with the desired class model. */ + if (userinfo.GetInteger(targetPlayer, "*team") == TEAM_T) { + targetPlayer.modelindex = GetTModelIndex(targetPlayer); + + /* fallback if no "class" key is specified. */ + if (targetPlayer.modelindex == 0) { + targetPlayer.modelindex = getmodelindex(entityDef.GetString("player_terrorist", "model_class1")); + } + } else { + targetPlayer.modelindex = GetCTModelIndex(targetPlayer); + + /* fallback 2nd */ + if (targetPlayer.modelindex == 0) { + targetPlayer.modelindex = getmodelindex(entityDef.GetString("player_counterterrorist", "model_class1")); + } + } + + userinfo.SetBool(targetPlayer, "*csvip", false); + targetPlayer.health = 100; + game.TeleportToSpawn(targetPlayer); +} + +/** Instantiates a player into the world. Playable by the end. */ +void +HardRespawn(entity targetPlayer) +{ + if (!targetPlayer) { + return; + } + + /* decl transformation */ + if (userinfo.GetInteger(targetPlayer, "*team") == TEAM_CT) { + ents.ChangeToClass(targetPlayer, "player_counterterrorist"); + } else { + ents.ChangeToClass(targetPlayer, "player_terrorist"); + } + + userinfo.SetString(targetPlayer, "*icon1", ""); + SoftRespawn(targetPlayer); +} + +/** Will swap teams (and their scores) in the current map. */ +void +SwapTeams(void) +{ + int ctScore = 0i; + int tScore = 0i; + + for (entity teamPlayer = world; (teamPlayer = find(teamPlayer, ::classname, "player"));) { + if (teamPlayer.team == TEAM_CT) { + ents.Input(teamPlayer, "SetTeam", "1", world); + /*teamPlayer.charmodel -= 4;*/ + } else if (teamPlayer.team == TEAM_T) { + ents.Input(teamPlayer, "SetTeam", "2", world); + /*teamPlayer.charmodel += 4;*/ + } + } + + ctScore = teams.Score(TEAM_CT); + tScore = teams.Score(TEAM_T); + + teams.SetScore(TEAM_CT, tScore); + teams.SetScore(TEAM_T, ctScore); +} + +#include "radio.h" +#include "money.h" + +/* ROUND: related to the round timer only */ +void Round_Finished(int winningTeam, int moneyReward, bool silentRadio); +void Round_Restart(bool wipeProgress); + +/** Called when forcing a state change, with a specific count-down timer. */ +void +Round_TimerStart(float secondsLeft, int desiredState) +{ + g_cs_gametime = secondsLeft; + serverinfo.SetFloat("cs_gametime", time + secondsLeft); + + if (desiredState == STATE_FREEZE) { + GameState_Set(STATE_FREEZE); + } else if (desiredState == STATE_ACTIVE) { + GameState_Set(STATE_ACTIVE); + + if (teams.NumPlayers(TEAM_T) <= 1i || teams.NumPlayers(TEAM_CT) <= 1i) + return; + + /* if no players are present in the chosen team, force restart round */ + if (teams.NumAlivePlayers(TEAM_T) == 0i) { + Round_Finished(TEAM_CT, 3600i, false); + return; + } else if (teams.NumAlivePlayers(TEAM_CT) == 0i) { + Round_Finished(TEAM_T, 3600i, false); + return; + } + + } else if (desiredState == STATE_END) { + GameState_Set(STATE_END); + } else if (desiredState == STATE_COMMENCING) { + GameState_Set(STATE_COMMENCING); + } else if (desiredState == STATE_OVER) { + GameState_Set(STATE_OVER); + } +} + +/** This gets called whenever an objective is completed or time is up. */ +void +Round_Finished(int winningTeam, int moneyReward, bool silentRadio) +{ + if (GameState() != STATE_ACTIVE && GameState() != STATE_FREEZE) { + return; + } + + if (winningTeam == TEAM_T) { + if (silentRadio == false) { + Radio_BroadcastMessage(RADIO_TERWIN); + } + + g_csSwapTeamRoundCounter++; + teams.AddScore(TEAM_T, 1i); + } else if (winningTeam == TEAM_CT) { + if (silentRadio == false) { + Radio_BroadcastMessage(RADIO_CTWIN); + } + + g_csSwapTeamRoundCounter++; + teams.AddScore(TEAM_CT, 1i); + + /* In Bomb Defusal, if Terrorists were able to plant the bomb + * but lose the round, all Terrorists receive an $800 bonus. */ + if (BombHasBeenPlanted()) { + Money_QueTeamReward(TEAM_T, 800i); + } + } else { + if (silentRadio == false) { + Radio_BroadcastMessage(RADIO_ROUNDDRAW); + } + } + + Money_HandleRoundReward(winningTeam); + Money_QueTeamReward(winningTeam, moneyReward); + Round_TimerStart(5.0f, STATE_END); /* Round is over, 5 seconds til a new round starts. */ + + serverinfo.SetInteger("cs_hostagesrescued", 0i); + serverinfo.SetBool("cs_bombbeingdefused", false); + serverinfo.SetBool("cs_bombplanted", false); + serverinfo.SetInteger("cs_roundsplayed", serverinfo.GetInteger("cs_roundsplayed") + 1i); +} + +/** Called when the state timer ends, which was started with Round_TimerStart(). */ +void +Round_TimerEnd(void) +{ + if (IsEscape() == true) { + Round_Finished(TEAM_T, 3250i, false); + } else if (IsBombDefusal() == true) { + /* In Bomb Defusal, all Counter-Terrorists receive $3250 + * if they won running down the time. */ + Round_Finished(TEAM_CT, 3250i, false); + } else if (IsHostageRescue() == true) { + // TODO: Broadcast_Print: Hostages have not been rescued! + Round_Finished(TEAM_T, 3250i, false); + } else { + Round_Finished(TEAM_NONE, 0i, false); + } +} + +/** Run every single frame. */ +void +Round_TimerUpdate(void) +{ + /* if we've got hostages in the map... */ + if (IsHostageRescue()) { + /* and they're all rescued.... */ + if (HostagesRescued() >= HostageCount()) { + /* CTs win! */ + Round_Finished(TEAM_CT, 0i, false); + return; + } + } + + /* This map has been played enough we think */ + if (GameState() != STATE_OVER) { + if (TimeLimit() > 0i) { + if (time >= TimeLimit()) { + /* IntermissionStart(); */ + GameState_Set(STATE_OVER); + } + } + } + + /* Okay, this means that timelimit is not the only deciding factor */ + if (WinLimit() > 0i && GameState() != STATE_OVER) { + /* if either win, go end this map.*/ + if (teams.Score(TEAM_CT) >= WinLimit() || + teams.Score(TEAM_T) >= WinLimit()) { + /* IntermissionStart(); */ + } + } + + /* INACTIVE means no one is registered as a player */ + if (GameState() == STATE_INACTIVE) { + return; + } + + /* our continously running down timer */ + g_cs_gametime = bound(0.0f, g_cs_gametime - frametime, g_cs_gametime); + + //printf("%f\n", g_cs_gametime); + + /* if the round is over or the game is done with... */ + if (GameState() == STATE_COMMENCING || GameState() == STATE_END) { + if (GameTime() <= 0.0f) { + if (teams.Score(TEAM_T) == 0i && teams.Score(TEAM_CT) == 0i) { + Money_ResetTeamReward(); + Money_ResetRoundReward(); + Round_Restart(true); + } else { + if (cvars.GetBool("mp_halftime") == true && ((WinLimit() / 2i) == RoundsPlayed())) { + Money_ResetTeamReward(); + SwapTeams(); + Round_Restart(true); + } else { + Round_Restart(false); + } + } + } + return; + } + + if ((GameState() == STATE_ACTIVE) || (GameState() == STATE_FREEZE)) { + if (GameTime() <= 0.0f) { + if (GameState() == STATE_ACTIVE) { + /* 1.5 will make the T's lose if time runs out no matter what */ + if (cvars.GetBool("fcs_fix_bombtimer") == true) { + if (IsBombDefusal() == true && BombHasBeenPlanted() == true) { + return; + } + } + + Round_TimerEnd(); + Round_TimerStart(5.0f, STATE_END); /* Round is over, 5 seconds til a new round starts */ + } else { + Round_TimerStart(RoundTime(), STATE_ACTIVE); // Unfreeze + Radio_StartMessage(); + /* CSBot_RoundStart(); */ + } + } + } +} + +/** Called to forcefully respawn everything in the map, and players. */ +void +Round_Restart(bool wipeProgress) +{ + /* shall we swap teams? */ + if (cvars.GetInteger("fcs_swaponround") > 0i) { + if (g_csSwapTeamRoundCounter >= cvars.GetInteger("fcs_swaponround")) { + g_csSwapTeamRoundCounter = 0i; + SwapTeams(); + } + } + + + for (entity teamPlayer = world; (teamPlayer = find(teamPlayer, ::classname, "player"));) { + if (teamPlayer.team != TEAM_CT && teamPlayer.team != TEAM_T) { + continue; + } + + ents.Input(teamPlayer, "NotifyRoundRestarted", "", world); + + if (ents.isAlive(teamPlayer) == true && wipeProgress == false) { + SoftRespawn(teamPlayer); + } else { + HardRespawn(teamPlayer); + } + + if (wipeProgress == false) { + Money_GiveTeamReward(teamPlayer); + } else { + Money_WipeProgress(teamPlayer); + } + + ents.Input(teamPlayer, "NotifyBuyStart", "", world); + } + + /* sometimes, even when the bomb was planted, the round may end early. + so get rid of any bombs that may be on the level. */ + for (entity bombFinder = world; (bombFinder = find(bombFinder, ::classname, "item_c4"));) { + ents.Input(bombFinder, "Kill", "", world); + } + + /* Select a random Terrorist player for the bomb duty, if needed */ + if (IsBombDefusal() == true) { + MakeBomber(teams.RandomPlayer(TEAM_T)); + } + + /* if there is meant to be a VIP, select a random CT to be it */ + if (IsAssassination() == true) { + MakeVIP(teams.RandomPlayer(TEAM_CT)); + } + + /* Respawn all the entities */ + game.CleanUpMap(); + Round_TimerStart(FreezeTime(), STATE_FREEZE); + Money_ResetTeamReward(); +} + +void +Round_CheckUponDeath(entity playerCheck) +{ + /* don't count kills at this stage */ + if (GameState() == STATE_END) { + return; + } + + /* hack so that we can kill rounds. */ + if ((teams.NumAlivePlayers(TEAM_T) == 0i) && (teams.NumAlivePlayers(TEAM_CT) == 0i)) { + GameState_Set(STATE_ACTIVE); + } + + switch (GameState()) { + case STATE_INACTIVE: + case STATE_COMMENCING: + case STATE_END: + case STATE_OVER: + return; + break; + } + + if ((teams.NumAlivePlayers(TEAM_T) == 0i) && (teams.NumAlivePlayers(TEAM_CT) == 0i)) { + if (BombHasBeenPlanted() == true) { + Round_Finished(TEAM_T, 3600i, false); + } else { + Round_Finished(TEAM_NONE, 0i, false); + } + } else { + int winningTeam; + + if ((playerCheck.team == TEAM_T) && (teams.NumAlivePlayers(TEAM_T) == 0i)) { + winningTeam = TEAM_CT; + } else if ((playerCheck.team == TEAM_CT) && (teams.NumAlivePlayers(TEAM_CT) == 0i)) { + winningTeam = TEAM_T; + } else { + return; + } + + if (IsBombDefusal() == true) { + /* In Bomb Defusal, the winning team receives $3250 + * if they won by eliminating the enemy team. */ + if (BombHasBeenPlanted() == false || teams.NumAlivePlayers(TEAM_CT) == 0i) { + Round_Finished(winningTeam, 3250i, false); + } + } else { + /* In Hostage Rescue, the winning team receives $3600 + * if they won by eliminating the enemy team. */ + Round_Finished(winningTeam, 3600i, false); + } + } +} + +void +CS_CountHostages(void) +{ + int counter = 0i; + + for (entity e = world; (e = find(e, ::classname, "hostage_entity"));) { + counter++; + } + + serverinfo.SetInteger("cs_hostages", counter); +} + +void +CS_CountBombZones(void) +{ + int counter = 0i; + + for (entity e = world; (e = find(e, ::classname, "func_bomb_target"));) { + counter++; + } + + serverinfo.SetInteger("cs_bombzones", counter); +} + +void +CS_CountEscapeZones(void) +{ + int counter = 0i; + + for (entity e = world; (e = find(e, ::classname, "func_escape_zone"));) { + counter++; + } + + serverinfo.SetInteger("cs_escapezones", counter); +} + +void +CS_CountVIPZones(void) +{ + int counter = 0i; + + for (entity e = world; (e = find(e, ::classname, "func_vip_safetyzone"));) { + counter++; + } + + serverinfo.SetInteger("cs_vipzones", counter); +} + +void +CS_GoSpectator(entity targetPlayer) +{ + if (!targetPlayer) { + return; + } + + ents.ChangeToClass(targetPlayer, "spectator"); + game.TeleportToSpawn(targetPlayer); +} + +/* This player requests a spawn, usually when having chosen a team + model. */ +void +CS_RequestSpawn(entity targetPlayer) +{ + if (!targetPlayer) { + return; + } + + switch (GameState()) { + /* spawn the players immediately when its in the freeze state */ + case STATE_FREEZE: + HardRespawn(targetPlayer); + + /* we're the first people to join in this state. make them bomber, vip */ + if (targetPlayer.team == TEAM_T && teams.NumAlivePlayers(TEAM_T) == 1i) { + if (IsBombDefusal() == true) { + MakeBomber(targetPlayer); + } + } else if (targetPlayer.team == TEAM_CT && teams.NumAlivePlayers(TEAM_CT) == 1i) { + if (IsAssassination() == true) { + MakeVIP(targetPlayer); + } + } + + break; + } + + /* if no players are present in the chosen team, force restart round */ + if (targetPlayer.team == TEAM_T && teams.NumAlivePlayers(TEAM_T) == 0i) { + Round_Finished(TEAM_NONE, 0i, false); + } else if (targetPlayer.team == TEAM_CT && teams.NumAlivePlayers(TEAM_CT) == 0i) { + Round_Finished(TEAM_NONE, 0i, false); + } +} + +void +CS_PlayerRemovedFromGame(entity targetPlayer) +{ + /* In Assassination, all Terrorists receive a $2500 + * reward if they won by killing the VIP. */ + if (IsVIP(targetPlayer) == true) { + Round_Finished(TEAM_T, 2500i, false); + return; + } + + Round_CheckUponDeath(targetPlayer); +} + +/* Callbacks, functions that are called from Nuclide */ +void +CodeCallback_StartGameType(void) +{ + string spawnCT; + string spawnT; + + /* players can buy these any time. so they should be precached for speed. */ + ents.Precache("player_vip"); + ents.Precache("player_terrorist"); + ents.Precache("player_counterterrorist"); + + spawnCT = entityDef.GetString("player_counterterrorist", "spawnpoint"); + spawnT = entityDef.GetString("player_terrorist", "spawnpoint"); + + /* let Nuclide decide which motd to read */ + motd.LoadDefault(); + + /* the only teams CS will ever need... ? */ + teams.SetUp(TEAM_T, "Terrorist", [153, 204, 255], true); + teams.SetSpawnPoint(TEAM_T, spawnT); + teams.SetUp(TEAM_CT, "Counter-Terrorist", [255, 63, 63], true); + teams.SetSpawnPoint(TEAM_CT, spawnCT); + + /* evaluate our world */ + CS_CountHostages(); + CS_CountBombZones(); + CS_CountEscapeZones(); + CS_CountVIPZones(); + + /* create gameplay elements on top */ + if (IsHostageRescue() == true) { + if (exists.InMap("func_hostage_rescue") == false) { + for (entity testEnt = world; (testEnt = find(testEnt, ::classname, spawnCT));) { + ents.Create("info_hostage_rescue", testEnt.origin); + } + } + } + + /* we don't need to create any additional CT zones. */ + if (exists.InMap("func_buyzone") == false) { + /* since no buyzones are available, let's create one around every spawn */ + for (entity testEnt = world; (testEnt = find(testEnt, ::classname, spawnCT));) { + entity buyZone = ents.Create("info_buyzone", testEnt.origin); + buyZone.angles = testEnt.angles; + buyZone.team = TEAM_CT; + } + + for (entity testEnt = world; (testEnt = find(testEnt, ::classname, spawnT));) { + entity buyZone = ents.Create("info_buyzone", testEnt.origin); + buyZone.angles = testEnt.angles; + buyZone.team = TEAM_T; + } + } + + /* function to create spawn points for spectators. */ + other = world; + + while ((other = nextent(other))) { + switch (other.classname) { + case "info_player_start": + case "trigger_camera": + case "info_player_deathmatch": + entity specSpawn = ents.Create("info_spectator_start", other.origin); + specSpawn.angles = other.angles; + break; + default: + break; + } + } +} + +void +CodeCallback_FrameStart(void) +{ + int totalPlayers = teams.NumPlayers(TEAM_T) + teams.NumPlayers(TEAM_CT); + + /* if we suddenly have players, commence a new round. */ + if (totalPlayers > 0i && GameState() == STATE_INACTIVE) { + Round_TimerStart(2.0f, STATE_COMMENCING); + return; + } + + /* if there are 0 players whatsoever, forget most state, + so we can commence (see above) a game later. */ + if (totalPlayers == 0i) { + GameState_Set(STATE_INACTIVE); + g_cs_gametime = 0.0f; + teams.SetScore(TEAM_T, 0i); + teams.SetScore(TEAM_CT, 0i); + serverinfo.SetInteger("cs_roundsplayed", 0i); + return; + } + + /* should only ever run when players are actually present. */ + Round_TimerUpdate(); +} + +void +CodeCallback_Input(entity activator, string inputName, string dataString) +{ + switch (inputName) { + case "BombDefused": + /* In Bomb Defusal, all Counter-Terrorists receive $3600 + if they won by defusing the bomb. */ + Round_Finished(TEAM_CT, 3600i, true); + Radio_BroadcastMessage(RADIO_BOMBDEF); + break; + case "BombExploded": + /* In Bomb Defusal, all Terrorists receive $3500 + if they won by detonating the bomb. */ + Round_Finished(TEAM_T, 3500i, false); + break; + case "HostageContacted": + Money_AddMoney(activator, 150i); + break; + case "HostageKilled": + int damageDealt = stoi(dataString); + + if (damageDealt >= 100i) { + Money_AddMoney(activator, -2500i); + } else { + Money_AddMoney(activator, -500i); + } + + Radio_BroadcastMessage(RADIO_HOSDOWN); + break; + case "HostageRescued": + Radio_BroadcastMessage(RADIO_RESCUED); + serverinfo.SetInteger("cs_hostagesrescued", serverinfo.GetInteger("cs_hostagesrescued") + 1i); + + Money_AddMoney(activator, 1000i); + //CSBot_HostageRescueNotify(); + + /* In Hostage Rescue, all Counter-Terrorists receive an $850 + * bonus for every hostage that was rescued, even if they lose the round. */ + Money_QueTeamReward(TEAM_CT, 850i); + break; + case "HostageInjured": + Money_AddMoney(activator, -(stoi(dataString) * 25i)); + break; + case "Escaped": + int to_escape = teams.NumPlayers(TEAM_T); + + /* don't matter when rules are not active */ + if (GameState() != STATE_ACTIVE) { + return; + } + + g_iEscapedTerrorists++; + + if (to_escape > 3i) { + to_escape = 3i; + } + + /* balancing tweak: for every escaped T, each and every CT will lose funds */ + if (cvars.GetInteger("fcs_escapepenalty") != 0i) { + for (entity teamPlayer = world; (teamPlayer = find(teamPlayer, ::classname, "player"));) { + if (teamPlayer.team == TEAM_CT) { + Money_AddMoney(teamPlayer, cvars.GetInteger("fcs_escapepenalty")); + } + } + } + + /* mark player as spectator for the end of this 'round' */ + ents.Input(activator, "Spectate", "", world); + + /* threshold has been met to trigger the end of the round */ + if (g_iEscapedTerrorists >= to_escape) { + /* reset */ + g_iEscapedTerrorists = 0i; + + /* Ts win the round */ + Round_Finished(TEAM_T, 3600i, false); + } + break; + } +} + +int +CodeCallback_MaxItemPerSlot(int weaponSlot) +{ + /* grenades can have more */ + if (weaponSlot == 3) { + return (3); + } + + return (1); +} + +void +CodeCallback_PlayerSpawn(void) +{ + /* first course of action is to kick players into spectator cam */ + CS_GoSpectator(self); +} + +void +CodeCallback_PlayerDisconnect(void) +{ + /* if they leave, timeout, get kicked (or banned), we gotta know! */ + CS_PlayerRemovedFromGame(self); +} + +void +CodeCallback_PlayerDamage(entity inflictor, entity attacker) +{ + +} + +void +CodeCallback_PlayerKilled(entity inflictor, entity attacker, string weapon) +{ + combat.Obituary(self.netname, attacker.netname, weapon, ""); + + /* death-counter */ + self.deaths++; + + /* update player scores */ + if (ents.isPlayer(attacker)) { + if (self == attacker) { + attacker.frags--; + } else if (self.team == attacker.team) { + attacker.frags--; + Money_AddMoney(attacker, cvars.GetInteger("fcs_penalty_teamkill")); + } else { + attacker.frags++; + Money_AddMoney(attacker, cvars.GetInteger("fcs_reward_kill")); + } + } + + /* scoreboard death icon */ + if (ents.isPlayer(self)) { + userinfo.SetString(self, "*icon1", "d_skull"); + userinfo.SetString(self, "*icon1_r", "1"); + userinfo.SetString(self, "*icon1_g", "0"); + userinfo.SetString(self, "*icon1_b", "0"); + + /* turn into a fake spec */ + ents.Input(self, "Spectate", "", world); + } + + CS_PlayerRemovedFromGame(self); +} + +bool +CodeCallback_CallRequestTeam(int teamNum) +{ + /* can't switch teams while alive. */ + if (ents.isAlive(self) == true) { + return (false); + } + + /* can't switch teams while we're a VIP */ + if (IsVIP(self) == true) { + return (false); + } + + /* sanity check, invalid team ID? auto team! */ + if (teamNum != TEAM_CT && teamNum != TEAM_T) { + teamNum = teams.BestAutoJoinTeam(); + } + + switch (teamNum) { + case TEAM_T: + ents.Input(self, "SetTeam", "1", self); + break; + case TEAM_CT: + ents.Input(self, "SetTeam", "2", self); + break; + default: + CS_GoSpectator(self); + return (true); + } + + return (true); +} + +bool +CodeCallback_ClientCommand(string command) +{ + float commandArgs = tokenize(command); + + switch (argv(0)) { + /* class selection */ + case "terror": + SetTClass(self, 1); + CodeCallback_CallRequestTeam(TEAM_T); + CS_RequestSpawn(self); + break; + case "leet": + SetTClass(self, 2); + CodeCallback_CallRequestTeam(TEAM_T); + CS_RequestSpawn(self); + break; + case "arctic": + SetTClass(self, 3); + CodeCallback_CallRequestTeam(TEAM_T); + CS_RequestSpawn(self); + break; + case "guerilla": + SetTClass(self, 4); + CodeCallback_CallRequestTeam(TEAM_T); + CS_RequestSpawn(self); + break; + case "urban": + SetCTClass(self, 1); + CodeCallback_CallRequestTeam(TEAM_CT); + CS_RequestSpawn(self); + break; + case "gsg9": + SetCTClass(self, 2); + CodeCallback_CallRequestTeam(TEAM_CT); + CS_RequestSpawn(self); + break; + case "sas": + SetCTClass(self, 3); + CodeCallback_CallRequestTeam(TEAM_CT); + CS_RequestSpawn(self); + break; + case "gign": + SetCTClass(self, 4); + CodeCallback_CallRequestTeam(TEAM_CT); + CS_RequestSpawn(self); + break; + case "buy": + Money_Purchase(self, argv(1)); + break; + case "buyammo": + Money_PurchaseAmmoForSlot(self, stoi(argv(1))); + break; + default: + return (false); + } + + return (true); +} + +bool +CodeCallback_ImpulseCommand(float impulseNum) +{ + switch (impulseNum) { + /* this is how Half-Life triggers the flashlight. `impulse 100`. */ + case 100: + if (AllowFlashlight() == true) { + ents.Input(self, "UseItem", "item_suit", self); + } + break; + default: + return (false); + } + + return (true); +} diff --git a/src/rules/money.h b/src/rules/money.h new file mode 100644 index 0000000..7174344 --- /dev/null +++ b/src/rules/money.h @@ -0,0 +1,238 @@ +/* + * 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. + */ + +var int g_cs_moneyreward_t; +var int g_cs_moneyreward_ct; +var int g_cs_roundslost_ct; +var int g_cs_roundslost_t; +var int g_cs_winstreak_ct; +var int g_cs_winstreak_t; +var bool g_cs_bonus_ct; +var bool g_cs_bonus_t; + +void +Money_AddMoney(entity targetPlayer, int addCash) +{ + int currentCash = userinfo.GetInteger(targetPlayer, "*money"); + currentCash += addCash; + + /* clamp at the classic 160000. */ + if (currentCash > 16000i) { + currentCash = 16000i; + } else if (currentCash < 0i) { + currentCash = 0i; + } + + if (addCash > 0i) { + NSLog("Paying %s ^7$%i. Cash = $%i\n", targetPlayer.netname, addCash, currentCash); + } else if (addCash < 0i) { + NSLog("Fining %s ^7$%i. Cash = $%i\n", targetPlayer.netname, addCash, currentCash); + } + + userinfo.SetInteger(targetPlayer, "*money", currentCash); +} + +int +Money_GetCapital(entity targetPlayer) +{ + return userinfo.GetInteger(targetPlayer, "*money"); +} + +void +Money_QueTeamReward(int targetTeam, int iMoneyValue) +{ + if (targetTeam == TEAM_T) { + g_cs_moneyreward_t += iMoneyValue; + } else { + g_cs_moneyreward_ct += iMoneyValue; + } +} + +void +Money_GiveTeamReward(entity targetPlayer) +{ + if (targetPlayer.team == TEAM_T) { + Money_AddMoney(targetPlayer, g_cs_moneyreward_t); + } else { + Money_AddMoney(targetPlayer, g_cs_moneyreward_ct); + } +} + +void +Money_ResetTeamReward(void) +{ + g_cs_moneyreward_t = 0i; + g_cs_moneyreward_ct = 0i; +} + +int +Money_GetLosses(int queryTeam) +{ + if (queryTeam == TEAM_T) { + return (g_cs_roundslost_t); + } else { + return (g_cs_roundslost_ct); + } +} + +bool +Money_HasBonus(int queryTeam) +{ + if (queryTeam == TEAM_T) { + return (g_cs_bonus_t); + } else { + return (g_cs_bonus_ct); + } +} + +void +Money_HandleRoundReward(int winningTeam) +{ + int losingTeam = -1i; /* womp */ + + if (winningTeam == TEAM_CT) { + g_cs_winstreak_ct++; + g_cs_winstreak_t = 0i; + g_cs_roundslost_t++; + g_cs_roundslost_ct = 0i; + losingTeam = TEAM_T; + + if (g_cs_winstreak_ct >= 2i) { + g_cs_bonus_ct = true; + } + } else { + g_cs_winstreak_t++; + g_cs_winstreak_ct = 0i; + g_cs_roundslost_ct++; + g_cs_roundslost_t = 0i; + losingTeam = TEAM_CT; + + if (g_cs_winstreak_t >= 2i) { + g_cs_bonus_t = true; + } + } + + /* After the condition of a team winning two consecutive rounds is + * satisfied then the loss bonus money changes to above where their + * first loss means they receive $1500 and not $1400. */ + if (Money_HasBonus(losingTeam)) { + switch (Money_GetLosses(losingTeam)) { + case 1i: + Money_QueTeamReward(losingTeam, 1500i); + break; + case 2i: + Money_QueTeamReward(losingTeam, 2000i); + break; + case 3i: + Money_QueTeamReward(losingTeam, 2500i); + break; + default: + Money_QueTeamReward(losingTeam, 3000i); + break; + } + } else { + switch (Money_GetLosses(losingTeam)) { + case 1i: + Money_QueTeamReward(losingTeam, 1400i); + break; + case 2i: + Money_QueTeamReward(losingTeam, 1900i); + break; + case 3i: + Money_QueTeamReward(losingTeam, 2400i); + break; + case 4i: + Money_QueTeamReward(losingTeam, 2900i); + break; + default: + Money_QueTeamReward(losingTeam, 3400i); + break; + } + } +} + +void +Money_ResetRoundReward(void) +{ + g_cs_roundslost_ct = + g_cs_roundslost_t = + g_cs_winstreak_ct = + g_cs_winstreak_t = 0i; + g_cs_bonus_ct = + g_cs_bonus_t = false; +} + +void +Money_WipeProgress(entity targetPlayer) +{ + userinfo.SetInteger(targetPlayer, "*money", 0i); + Money_AddMoney(targetPlayer, cvars.GetInteger("mp_startmoney")); +} + +void +Money_PurchaseAmmoForSlot(entity customer, int slot) +{ + string inventory = actor.GetInventory(customer); + + /* we get to iterate over the whole inventory */ + for (int i = 0; i < tokenize(inventory); i++) { + string declName = argv(i); + int slotNum = entityDef.GetInteger(declName, "hudSlot"); + string ammoType = entityDef.GetString(declName, "ammoType"); + + /* validity check */ + if (slotNum != slot || !STRING_SET(ammoType)) { + continue; + } + + /* we found a weapon that will get filled up. */ + int itemPrice = entityDef.GetInteger(ammoType, "price"); + int ammoAmount = entityDef.GetInteger(ammoType, strcat("inv_", ammoType)); + int ammoID = ammo.NumForName(ammoType); + + /* invalid weapon. */ + if (itemPrice <= 0i || ammoAmount <= 0i) { + return; + } + + /* as long as we're not full... */ + while (actor.MaxAmmo(customer, ammoID) == false) { + /* and we can afford it... */ + if ((Money_GetCapital(customer) - itemPrice) >= 0) { + ents.Input(customer, "GiveAmmo", sprintf("%s %i", ammoType, ammoAmount), world); + Money_AddMoney(customer, -itemPrice); + } else { + break; + } + } + } +} + +void +Money_Purchase(entity customer, string desiredItem) +{ + int itemPrice = entityDef.GetInteger(desiredItem, "price"); + + /* no free things in CS */ + if (itemPrice <= 0i) { + return; + } + + if ((Money_GetCapital(customer) - itemPrice) >= 0) { + ents.Input(customer, "GiveItem", desiredItem, world); + Money_AddMoney(customer, -itemPrice); + } +} diff --git a/src/rules/radio.h b/src/rules/radio.h new file mode 100644 index 0000000..28e00dc --- /dev/null +++ b/src/rules/radio.h @@ -0,0 +1,121 @@ +/* + * 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. + */ + +#include "../shared/radio.h" +#include "../shared/events.h" + +/* +================= +Radio_BroadcastMessage + +A global radio message for all players +================= +*/ +void +Radio_BroadcastMessage(float fMessage) +{ + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, EV_RADIOMSG); + WriteByte(MSG_MULTICAST, fMessage); + msg_entity = self; + multicast([0,0,0], MULTICAST_ALL); +} + +/* +================= +Radio_TeamMessage + +A radio message targetted at members of a specific team +================= +*/ +void +Radio_TeamMessage(float fMessage, float fTeam) +{ + for (entity teamPlayer = world; (teamPlayer = find(teamPlayer, classname, "player"));) { + if (teamPlayer.team == fTeam) { + ents.Input(teamPlayer, "RadioMessage", ftos(fMessage), world); + } + } +} + +/* +================= +Radio_DefaultStart + +Pick a generic, random radio string for global start messages +================= +*/ +float +Radio_DefaultStart(void) +{ + float fRand = floor(random(1, 4)); + + if (fRand == 1) { + return RADIO_MOVEOUT; + } else if (fRand == 2) { + return RADIO_LOCKNLOAD; + } else { + return RADIO_LETSGO; + } +} + +/* +================= +Radio_StartMessage + +Decide which startmessage to play at the beginning of each round +================= +*/ +void +Radio_StartMessage(void) +{ + if (IsAssassination()) { + Radio_TeamMessage(RADIO_VIP, TEAM_CT); + Radio_TeamMessage(Radio_DefaultStart(), TEAM_T); + } else if (IsEscape()) { + Radio_TeamMessage(RADIO_GETOUT, TEAM_T); + Radio_TeamMessage(Radio_DefaultStart(), TEAM_CT); + } else { + Radio_BroadcastMessage(Radio_DefaultStart()); + } +} + +/* +================= +CSEv_Radio_f + +Triggered by clients, plays a message to members of the same team +================= +*/ +void +CSEv_Radio_f(float fMessage) +{ + // Don't allow spamming + /*if (self.fRadioFinished > time) { + return; + }*/ + + // When dead, don't talk + if (self.health <= 0) { + return; + } + + for (entity teamPlayer = world; (teamPlayer = find(teamPlayer, classname, "player"));) { + ents.Input(teamPlayer, "RadioTeamMessage", sprintf("%d %d", num_for_edict(teamPlayer) - 1, fMessage), world); + } + + /*self.fRadioFinished = time + 3.0f;*/ +} diff --git a/src/server/ammo.h b/src/server/ammo.h deleted file mode 100644 index d106df1..0000000 --- a/src/server/ammo.h +++ /dev/null @@ -1,19 +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 Ammo_BuyPrimary(NSClientPlayer pl, int free); -void Ammo_BuySecondary(NSClientPlayer pl, int free); -void Ammo_AutoFill(NSClientPlayer); diff --git a/src/server/ammo.qc b/src/server/ammo.qc deleted file mode 100644 index be622f2..0000000 --- a/src/server/ammo.qc +++ /dev/null @@ -1,349 +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. - */ - -/* Ammo information courtesy of https://wiki.alliedmods.net/CS_weapons_information */ - -enum -{ - CALIBER_NONE, - CALIBER_50AE, - CALIBER_762MM, - CALIBER_556MM, - CALIBER_556MMBOX, - CALIBER_338MAG, - CALIBER_9MM, - CALIBER_BUCKSHOT, - CALIBER_45ACP, - CALIBER_357SIG, - CALIBER_57MM -}; - -typedef struct -{ - int a_size; - int a_max; - int price; -} ammoinfo_t; - -#if 0 -ammoinfo_t cs_ammoinfo[11] = { - /* CALIBER_NONE */ - { - .a_size = 0, - .a_max = 0, - .price = 0 - }, - /* CALIBER_50AE */ - { - .a_size = 7, - .a_max = AMMO_MAX_50AE, - .price = 40 - }, - /* CALIBER_762MM */ - { - .a_size = 30, - .a_max = AMMO_MAX_762MM, - .price = 80 - }, - /* CALIBER_556MM */ - { - .a_size = 30, - .a_max = AMMO_MAX_556MM, - .price = 60 - }, - /* CALIBER_556MMBOX */ - { - .a_size = 30, - .a_max = AMMO_MAX_556MMBOX, - .price = 60 - }, - /* CALIBER_338MAG */ - { - .a_size = 10, - .a_max = AMMO_MAX_338MAG, - .price = 125 - }, - /* CALIBER_9MM */ - { - .a_size = 30, - .a_max = AMMO_MAX_9MM, - .price = 20 - }, - /* CALIBER_BUCKSHOT */ - { - .a_size = 8, - .a_max = AMMO_MAX_BUCKSHOT, - .price = 65 - }, - /* CALIBER_45ACP */ - { - .a_size = 12, - .a_max = AMMO_MAX_45ACP, - .price = 25 - }, - /* CALIBER_357SIG */ - { - .a_size = 13, - .a_max = AMMO_MAX_357SIG, - .price = 50 - }, - /* CALIBER_57MM */ - { - .a_size = 50, - .a_max = AMMO_MAX_57MM, - .price = 50 - } -}; -#endif - -int -Ammo_BuyCaliber(CSPlayer pl, int cal, int free) -{ - int *ptr_ammo = __NULL__; - int rv = 0; - -#if 0 - while (pl.money - cs_ammoinfo[cal].price > 0 || free) { - switch (cal) { - case CALIBER_50AE: - ptr_ammo = &pl.ammo_50ae; - break; - case CALIBER_762MM: - ptr_ammo = &pl.ammo_762mm; - break; - case CALIBER_556MM: - ptr_ammo = &pl.ammo_556mm; - break; - case CALIBER_556MMBOX: - ptr_ammo = &pl.ammo_556mmbox; - break; - case CALIBER_338MAG: - ptr_ammo = &pl.ammo_338mag; - break; - case CALIBER_9MM: - ptr_ammo = &pl.ammo_9mm; - break; - case CALIBER_BUCKSHOT: - ptr_ammo = &pl.ammo_buckshot; - break; - case CALIBER_45ACP: - ptr_ammo = &pl.ammo_45acp; - break; - case CALIBER_357SIG: - ptr_ammo = &pl.ammo_357sig; - break; - case CALIBER_57MM: - ptr_ammo = &pl.ammo_57mm; - break; - default: - error("Ammo_BuyCaliber: Impossible caliber definition."); - } - - if (*ptr_ammo >= cs_ammoinfo[cal].a_max) { - break; - } - - *ptr_ammo += cs_ammoinfo[cal].a_size; - - /* clamp */ - if (*ptr_ammo >= cs_ammoinfo[cal].a_max) { - *ptr_ammo = cs_ammoinfo[cal].a_max; - } - - if (!free) - Money_AddMoney(pl, -cs_ammoinfo[cal].price); - - rv = 1; - } - -#endif - return rv; -} - - -void -Ammo_BuySecondary(NSClientPlayer pp, int free) -{ -#if 0 - int cal = 0; - int ps = 0; - CSPlayer pl = (CSPlayer)pp; - - for (int i = 1; i < g_weapons.length; i++) { - if ((pl.g_items & g_weapons[i].id) && (g_weapons[i].slot == 1)) { - switch (i) { - case WEAPON_USP45: - cal = CALIBER_45ACP; - break; - case WEAPON_GLOCK18: - cal = CALIBER_9MM; - break; - case WEAPON_DEAGLE: - cal = CALIBER_50AE; - break; - case WEAPON_P228: - cal = CALIBER_357SIG; - break; - case WEAPON_ELITES: - cal = CALIBER_9MM; - break; - case WEAPON_FIVESEVEN: - cal = CALIBER_57MM; - break; - } - - if (Ammo_BuyCaliber(pl, cal, FALSE) == 1) { - ps = 1; - } - } - } - - if (ps && !free) { - Sound_Play(pl, CHAN_ITEM, "buy.ammo"); - } - Weapons_RefreshAmmo(pl); -#endif -} - -/* We want to loop through all the possible weapons in case the server - * enabled the ability to pick up more than one primary/secondary weapon */ -void -CSEv_AmmoBuySecondary(void) -{ - CSPlayer pl = (CSPlayer)self; - - CSGameRules rules = (CSGameRules)g_grMode; - if (rules.BuyingPossible(pl) == FALSE) { - return; - } - - Ammo_BuySecondary(pl, FALSE); -} - -void -Ammo_BuyPrimary(NSClientPlayer pp, int free) -{ -#if 0 - int ps = 0; - int cal = 0; - CSPlayer pl = (CSPlayer)pp; - - for (int i = 1; i < g_weapons.length; i++) { - if ((pl.g_items & g_weapons[i].id) && (g_weapons[i].slot == 0)) { - switch (i) { - case WEAPON_M3: - cal = CALIBER_BUCKSHOT; - break; - case WEAPON_XM1014: - cal = CALIBER_BUCKSHOT; - break; - case WEAPON_MP5: - cal = CALIBER_9MM; - break; - case WEAPON_P90: - cal = CALIBER_57MM; - break; - case WEAPON_UMP45: - cal = CALIBER_45ACP; - break; - case WEAPON_MAC10: - cal = CALIBER_45ACP; - break; - case WEAPON_TMP: - cal = CALIBER_9MM; - break; -#if defined(CZERO) || defined(CSSOURCE) - case WEAPON_GALIL: - cal = CALIBER_762MM; - break; - case WEAPON_FAMAS: - cal = CALIBER_762MM; - break; -#endif - case WEAPON_AK47: - cal = CALIBER_762MM; - break; - case WEAPON_SG552: - cal = CALIBER_556MM; - break; - case WEAPON_M4A1: - cal = CALIBER_556MM; - break; - case WEAPON_AUG: - cal = CALIBER_762MM; - break; - case WEAPON_SCOUT: - cal = CALIBER_762MM; - break; - case WEAPON_AWP: - cal = CALIBER_338MAG; - break; - case WEAPON_G3SG1: - cal = CALIBER_762MM; - break; - case WEAPON_SG550: - cal = CALIBER_556MM; - break; - case WEAPON_PARA: - cal = CALIBER_556MMBOX; - break; - } - - if (Ammo_BuyCaliber(pl, cal, free) == 1) { - ps = 1; - } - } - } - - if (ps && !free) { - Sound_Play(pl, CHAN_ITEM, "buy.ammo"); - } - - Weapons_RefreshAmmo(pl); -#endif -} - -void -CSEv_AmmoBuyPrimary(void) -{ - CSPlayer pl = (CSPlayer)self; - - CSGameRules rules = (CSGameRules)g_grMode; - if (rules.BuyingPossible(pl) == FALSE) { - return; - } - - //Ammo_BuyPrimary(pl, FALSE); -} - -void -Ammo_AutoFill(NSClientPlayer pp) -{ - CSPlayer pl = (CSPlayer)pp; - - if (autocvar_fcs_fillweapons == FALSE) { - return; - } - - //Ammo_BuyPrimary(pl, true); - //Ammo_BuySecondary(pl, true); -} - -void -Ammo_Clear(void) -{ - -} diff --git a/src/server/armoury_entity.qc b/src/server/armoury_entity.qc index 83f6660..b78e63e 100644 --- a/src/server/armoury_entity.qc +++ b/src/server/armoury_entity.qc @@ -183,8 +183,8 @@ armoury_entity::Touch(entity eToucher) } /* we may need a helmet though */ - if (!(pl.g_items & ITEM_HELMET) && m_iID == 17) { - pl.g_items |= ITEM_HELMET; + if (pl.HasItem("item_kevlar_helmet") == false && m_iID == 17) { + pl.GiveItem("item_kevlar_helmet"); picked_up = true; } diff --git a/src/server/bot.h b/src/server/bot.h deleted file mode 100644 index 0a16ec0..0000000 --- a/src/server/bot.h +++ /dev/null @@ -1,20 +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. - */ - -void CSBot_BombPlantedNotify(void); -void CSBot_HostageRescueNotify(void); -void CSBot_RoundStart(void); -void CSBot_RestartRound(void); diff --git a/src/server/bot.qc b/src/server/bot.qc deleted file mode 100644 index 227ebe8..0000000 --- a/src/server/bot.qc +++ /dev/null @@ -1,587 +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. - */ - -/** @brief Get the absolute center pos of a entity */ -vector getEntityCenterPos(entity e) { - vector newVec; - newVec[0] = e.absmin[0] + (0.5 * (e.absmax[0] - e.absmin[0])); - newVec[1] = e.absmin[1] + (0.5 * (e.absmax[1] - e.absmin[1])); - newVec[2] = e.absmin[2] + (0.5 * (e.absmax[2] - e.absmin[2])); - return newVec; -} - -class csbot:NSBot -{ - void(void) csbot; - - /* some objectives */ - virtual void(void) RunToConfront; - virtual void(void) RunToBomb; - virtual void(int) RunToBombsite; - virtual void(void) RunToRandomBombsite; - virtual void(int) RunToEscapeZone; - virtual void(void) RunToRandomEscapeZone; - virtual void(int) RunToVIPSafetyZone; - virtual void(void) RunToRandomVIPSafetyZone; - virtual void(void) RunToHostages; - virtual void(vector, int) Roam; - - virtual void(void) CreateObjective; - virtual void(void) PostFrame; - virtual void(void) WeaponThink; - - /* helpers */ - virtual entity(string, int) GetEntityByNameAndIndex; - virtual entity(int) GetBombsiteByIndex; - virtual entity(int) GetEscapeZoneByIndex; - virtual entity(int) GetVIPSafetyZoneByIndex; - virtual void(vector, float) AimLerp; - - int m_actionIsPlanting; - int m_actionIsDefusing; - - /* Workaround: - * gflags is not yet set when CSBot_BuyStart_Shop() or CreateObjective() - * are called, so we back it up on PostFrame() and use that instead. - * Known issues it solves: - * - Check if the bot is in a Bomb Zone (gflags & GF_BOMBZONE) - * - Check if the bot is in a Buy Zone (gflags & GF_BUYZONE) */ - int m_gflagsBackup; -}; - -void -csbot::RunToConfront(void) -{ - entity t; - if (team == TEAM_T) { - t = Route_SelectRandom("info_player_start"); - } else { - t = Route_SelectRandom("info_player_deathmatch"); - } - - ChatSayTeam("Going to run to the Enemy Spawn!"); - - if (t) - RouteToPosition(t.origin); -} -/* go to the planted bomb */ -void -csbot::RunToBomb(void) -{ - entity e = world; - e = find(e, ::model, "models/w_c4.mdl"); - - if (e) { - RouteToPosition(e.origin); - ChatSayTeam("Going to run to the Bomb!"); - } -} - -/* go to given bombsite */ -void -csbot::RunToBombsite(int bombsiteIndex) -{ - entity e = GetBombsiteByIndex(bombsiteIndex); - RouteToPosition(getEntityCenterPos(e)); - ChatSayTeam(strcat("Going to run to Bomb Site ", itos(bombsiteIndex), "!")); -} - -/* go to random bombsite */ -void -csbot::RunToRandomBombsite(void) -{ - RunToBombsite(random(0, g_cs_bombzones)); -} - -/* go to given escape zone */ -void -csbot::RunToEscapeZone(int index) -{ - entity e = GetEscapeZoneByIndex(index); - RouteToPosition(getEntityCenterPos(e)); - ChatSayTeam(strcat("Going to run to Escape Zone ", itos(index), "!")); -} - -/* go to a random escape zone */ -void -csbot::RunToRandomEscapeZone(void) -{ - RunToEscapeZone(random(0, g_cs_escapezones)); -} - -/* go to given VIP Safety Zone */ -void -csbot::RunToVIPSafetyZone(int index) -{ - entity e = GetVIPSafetyZoneByIndex(index); - RouteToPosition(getEntityCenterPos(e)); - ChatSayTeam(strcat("Going to run to VIP Safety Zone ", itos(index), "!")); -} - -/* go to a random VIP Safety Zone */ -void -csbot::RunToRandomVIPSafetyZone(void) -{ - RunToVIPSafetyZone(random(0, g_cs_vipzones)); -} - -void -csbot::RunToHostages(void) -{ - entity e = world; - - e = find(e, ::classname, "hostage_entity"); - - RouteToPosition(e.origin); - ChatSayTeam("Going to run to the hostages!"); -} - -/** @brief Let the bot roam within a maximum distance from a given origin. */ -void csbot::Roam(vector roamOrigin, int maxDistance) { - /* Get random point whitin a radius from the given origin */ - int angle = random(0, 360); /* random angle. */ - int distance = random(0, maxDistance); /* random distance */ - float radian = angle * 3.145238095238 / 180; - vector randLoc = roamOrigin; - randLoc.x += sin(radian) * distance; - randLoc.y += cos(radian) * distance; - - /* Go to the random waypoint. */ - RouteToPosition(Nodes_PositionOfClosestNode(randLoc)); -} - -void -csbot::CreateObjective(void) -{ - /* Bomb defuse map */ - if (g_cs_bombzones > 0) { - /* Bomb is planted */ - if (g_cs_bombplanted) { - entity eBomb = find(world, ::model, "models/w_c4.mdl"); - if (eBomb == world) { - /* No bomb model found, but it is/was planted */ - - /* RoundOver: Bomb is defused */ - if (g_cs_gamestate == GAME_END) { - RunToRandomBombsite(); - return; - } - - /* Error */ - print("WARNING! g_cs_bombplanted == TRUE, but bomb model " - "cannot be found in the world.\n"); - return; - } - - if (team == TEAM_CT) { - if (g_cs_bombbeingdefused && m_actionIsDefusing == FALSE) { - /* Bomb is being defused but not by this bot */ - /* Go and roam the defuser */ - Roam(eBomb.origin, 300); - return; - } - - if (m_actionIsDefusing) { - if (!g_cs_bombbeingdefused) { - /* Defusing complete or somehow failed. */ - m_actionIsDefusing = FALSE; - } else { - /* Continue defusing. */ - input_buttons |= (INPUT_BUTTON5 | INPUT_BUTTON8); - input_movevalues = [0,0,0]; - button5 = input_buttons & INPUT_BUTTON5; // don't release button5 - } - } - else { - int distToBomb = floor(vlen(eBomb.origin - origin)); - if (distToBomb > 60) { - /* To far away from the bomb to defuse it, run to it! */ - RunToBomb(); - } else { - /* Aim at the bomb. */ - input_buttons |= INPUT_BUTTON8; // duck - if ((HasVFlags(VFL_ONUSABLE))) { - // Aimed at the bomb, ready to defuse! - ChatSayTeam("Defusing!"); - input_buttons |= INPUT_BUTTON5; - input_movevalues = [0,0,0]; - button5 = input_buttons & INPUT_BUTTON5; // don't release button5 - m_actionIsDefusing = TRUE; - } else { - // Do the real aiming - float flLerp = bound(0.0f, frametime * 45, 1.0f); // aim speed - AimLerp(eBomb.origin + [0, 0, -6], flLerp); - } - } - } - } - /* team == TEAM_T */ - else { - /* Let T bots roam around the planted bomb */ - Roam(eBomb.origin, 500); - } - return; - } - /* Bomb is NOT planted */ - else { - if (team == TEAM_T) { - /* T-bot: plant bomb */ - if (HasItem("weapon_c4")) { - /* We carry the bomb */ - if (m_gflagsBackup & GF_BOMBZONE) { - /* We are at a bombsite and ready to plant the bomb */ - if (GetCurrentWeapon() != "weapon_c4") { - /* TODO: REPLACE THIS WITH NSNAVAI METHOD */ - SwitchToWeapon("weapon_c4"); - //Weapons_Draw((CSPlayer)self); - } - - if (!m_actionIsPlanting) { - ChatSayTeam("Going to plant the bomb!"); - m_actionIsPlanting = TRUE; - } - - /* Workaround */ - gflags = m_gflagsBackup; - - /* Duck and plant bomb. */ - input_buttons = (INPUT_BUTTON0 | INPUT_BUTTON8); - input_movevalues = [0,0,0]; - } - else { - /* Go to a bombsite first */ - RunToRandomBombsite(); - } - return; - } - else { - /* T-bot: check if the bomb has been dropped */ - entity e = find(world, ::model, "models/w_backpack.mdl"); - if (e != world) { - /* The bomb backpack has been dropped */ - /* Go fetch dropped bomb! */ - ChatSayTeam("Arrr! Bomb on the ground, going to fetch it!"); - RouteToPosition(getEntityCenterPos(e)); - return; - } - } - } - } - } - - if (g_cs_escapezones && team == TEAM_T) { - RunToRandomEscapeZone(); - return; - } - - if (random() < 0.5 && g_cs_escapezones > 0 && team == TEAM_CT) { - RunToRandomEscapeZone(); - return; - } - - if (g_cs_vipzones > 0 && team == TEAM_CT) { - RunToRandomVIPSafetyZone(); - return; - } - - if (random() < 0.5 && g_cs_vipzones > 0 && team == TEAM_T) { - RunToRandomVIPSafetyZone(); - return; - } - - if (random() < 0.5) { - if (g_cs_hostagestotal > 0) - RunToHostages(); - if (g_cs_bombzones > 0) - RunToRandomBombsite(); - } else { - RunToConfront(); - } -} - -/** @brief Aim towards a given (vector)aimpos with a given (float)lerp speed. - * - * @note - * Copied code from nuclide botlib (inside bot::RunAI), maybe make this a - * method there, could be usefull for other stuff? - **/ -void csbot::AimLerp(vector aimpos, float flLerp) { - vector aimdir, vecNewAngles; - - vector oldAngle = v_angle; - - /* that's the old angle */ - vecNewAngles = anglesToForward(v_angle); - - /* aimdir = new final angle */ - aimdir = vectorToAngles(aimpos - origin); - - /* slowly lerp towards the final angle */ - vecNewAngles = vectorLerp(vecNewAngles, anglesToForward(aimdir), flLerp); - - /* make sure we're aiming tight */ - v_angle = vectorToAngles(vecNewAngles); - input_angles = angles = v_angle = fixAngle(v_angle); -} - -void -csbot::PostFrame(void) -{ - if (team == 0) { - CSEv_JoinAuto(); - } - - team = infokeyf(this, "*team"); - m_gflagsBackup = gflags; -}; - -void -csbot::WeaponThink(void) -{ - if (GetCurrentWeapon() == "weapon_knife") - return; - -#if FIXME - /* clip empty */ - if (a_ammo1 == 0) { - /* still got ammo left, reload! */ - if (a_ammo2 != 0) { - input_buttons &= ~INPUT_BUTTON0; - input_buttons |= INPUT_BUTTON4; - } else { - Weapons_SwitchBest(this); - } - } -#endif -}; - -/** @brief Get entity by class name and index **/ -entity -csbot::GetEntityByNameAndIndex(string name, int index) -{ - int curIndex = 0; - for (entity a = world; (a = find(a, ::classname, name));) { - if (curIndex == index) { - return a; - } - ++curIndex; - } - print("WARNING: cstrike/server/bot.qc GetEntityByNameAndIndex: no entity '", - name, "' with index ", itos(index), "!\n"); - return world; -} - -/** @brief Get bombsite entity by bombsite index - * - * @note - * When there are for example 2 bombsites (g_cs_bombzones == 2) then valid - * indexes would be 0 and 1. - * */ -entity -csbot::GetBombsiteByIndex(int index) -{ - return GetEntityByNameAndIndex("func_bomb_target", index); -} - -/** @brief Get Escape Zone entity by index **/ -entity -csbot::GetEscapeZoneByIndex(int index) -{ - return GetEntityByNameAndIndex("func_escapezone", index); -} - -/** @brief Get VIP Safety Zone entity by index **/ -entity -csbot::GetVIPSafetyZoneByIndex(int index) -{ - return GetEntityByNameAndIndex("func_vip_safetyzone", index); -} - -void -csbot::csbot(void) -{ - targetname = "_csbot_"; - team = infokeyf(this, "*team"); - m_actionIsPlanting = FALSE; - m_actionIsDefusing = FALSE; - m_gflagsBackup = 0; -} - -void -CSBot_BombPlantedNotify(void) -{ - for (entity a = world; (a = find(a, classname, "player"));) { - if (clienttype(a) != CLIENTTYPE_REAL) { - csbot targ; - targ = (csbot)a; - - if (targ.team == TEAM_T) - continue; - if (targ.health <= 0) - continue; - - targ.RunToRandomBombsite(); - } - } -} - -void -CSBot_HostageRescueNotify(void) -{ - for (entity a = world; (a = find(a, classname, "player"));) { - if (clienttype(a) != CLIENTTYPE_REAL) { - csbot targ; - targ = (csbot)a; - - if (targ.team == TEAM_T) - continue; - if (targ.health <= 0) - continue; - - targ.RunToHostages(); - } - } -} - -void -CSBot_BuyStart_Shop(void) -{ - int done = 0; - int count = 0; - CSPlayer pl = (CSPlayer)self; - - pl.team = infokeyf(pl, "*team"); - - /* Workaround */ - pl.gflags = ((csbot)pl).m_gflagsBackup; - - count = 0; - while (done != 1) { - int r = floor(random(1,17)); - - if (pl.team == TEAM_T) { - if (r == BUY_M4A1) { continue; } - if (r == BUY_AUG) { continue; } - if (r == BUY_SG550) { continue; } - if (r == BUY_FIVESEVEN) { continue; } - if (r == BUY_TMP) { continue; } - } else if (pl.team == TEAM_CT) { - if (r == BUY_AK47) { continue; } - if (r == BUY_SG552) { continue; } - if (r == BUY_G3SG1) { continue; } - if (r == BUY_ELITES) { continue; } - if (r == BUY_MAC10) { continue; } - } - - if (cs_buyprices[r] <= pl.money) { - CSEv_CSBuy_f((float)r); - done = 1; - } - count++; - - /* give it enough attempts */ - if (count > 17) - done = 1; - } - - /* CT: Random buy bomb defuse kit when enough money left */ - if (pl.team == TEAM_CT && g_cs_bombzones > 0 && - cs_buyprices[BUY_DEFUSALKIT] <= pl.money && - random() < 0.5) - { - CSEv_CSBuy_f(BUY_DEFUSALKIT); // ITEM_DEFUSAL - } - - /* need armor */ - if (pl.armor < 100) { - if (pl.money >= cs_buyprices[1]) /* kevlar and helmet */ - CSEv_CSBuy_f(BUY_VESTHELMET); - else if (pl.money >= cs_buyprices[0]) /* just kevlar */ - CSEv_CSBuy_f(BUY_VEST); - } else if (!(pl.g_items & ITEM_HELMET)) { /* we need helmet */ - if (pl.money >= 350) /* kevlar and helmet */ - CSEv_CSBuy_f(BUY_VESTHELMET); - } - -#if FIXME - /* make SURE we switch to it */ - for (int i = 0; i < g_weapons.length; i++) - if (pl.g_items & g_weapons[i].id) { - pl.activeweapon = i; - Weapons_Draw(pl); - return; - } -#endif - - /* force buy right now */ - CSEv_CSBuy_f(BUY_PRIMARYAMMO); - CSEv_CSBuy_f(BUY_SECONDARYAMMO); -} - -void -CSBot_BuyStart(void) -{ - for (entity a = world; (a = find(a, classname, "player"));) { - if (clienttype(a) != CLIENTTYPE_REAL) { - if (a.health <= 0) - continue; - - a.think = CSBot_BuyStart_Shop; - a.nextthink = time + random(0, autocvar_mp_freezetime); - } - } -} - -void -CSBot_RoundStart(void) -{ - /* if (g_cs_bombzones <= 0) { - return; - } - for (entity a = world; (a = find(a, classname, "player"));) { - if (clienttype(a) != CLIENTTYPE_REAL) { - csbot targ; - targ = (csbot)a; - - if (targ.team == TEAM_T) - continue; - if (targ.health <= 0) - continue; - - targ.RunToRandomBombsite(); - } - } - } */ -} - -void -CSBot_RestartRound(void) -{ - // Reset some variables for all bots - for (entity a = world; (a = find(a, classname, "player"));) { - if (clienttype(a) != CLIENTTYPE_REAL) { - csbot targ; - targ = (csbot)a; - - if (targ.team == TEAM_T) { - targ.m_actionIsPlanting = FALSE; - } - else { - targ.m_actionIsDefusing = FALSE; - } - } - } -} diff --git a/src/server/buy.h b/src/server/buy.h deleted file mode 100644 index 15cae04..0000000 --- a/src/server/buy.h +++ /dev/null @@ -1,56 +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. - */ - -/* values courtesy of https://wiki.alliedmods.net/Cs_weapons_information */ -int cs_buyprices[] = -{ - 0, /* WEAPON_NONE */ - 1700, /* WEAPON_M3 */ - 3000, /* WEAPON_XM1014 */ - 1500, /* WEAPON_MP5 */ - 2350, /* WEAPON_P90 */ - 1700, /* WEAPON_UMP45 */ - 1400, /* WEAPON_MAC10 */ - 1250, /* WEAPON_TMP */ - 2500, /* WEAPON_AK47 */ - 3500, /* WEAPON_SG552 */ - 3100, /* WEAPON_M4A1 */ - 3500, /* WEAPON_AUG */ - 2750, /* WEAPON_SCOUT */ - 4750, /* WEAPON_AWP */ - 5000, /* WEAPON_G3SG1 */ - 4200, /* WEAPON_SG550 */ - 5750, /* WEAPON_PARA */ - 500, /* WEAPON_USP45 */ - 400, /* WEAPON_GLOCK18 */ - 650, /* WEAPON_DEAGLE */ - 600, /* WEAPON_P228 */ - 800, /* WEAPON_ELITES */ - 750, /* WEAPON_FIVESEVEN */ - 0, /* WEAPON_KNIFE */ - 300, /* WEAPON_HEGRENADE */ - 200, /* WEAPON_FLASHBANG */ - 300, /* WEAPON_SMOKEGRENADE */ - 0, /* WEAPON_C4BOMB */ - 0, /* padding */ - 0, /* padding */ - 650, /* Kevlar Vest */ - 1000, /* Kevlar Vest & Helmet */ - 200, /* Defuse Kit */ - 1250 /* NightVision Goggles */ -}; - -void CSEv_CSBuy_f(float itemID); diff --git a/src/server/buy.qc b/src/server/buy.qc deleted file mode 100644 index 7648733..0000000 --- a/src/server/buy.qc +++ /dev/null @@ -1,180 +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 -CSEv_CSBuy_f(float fWeapon) -{ -#if 0 - CSGameRules rules = (CSGameRules)g_grMode; - - int iWeapon; - CSPlayer pl = (CSPlayer)self; - iWeapon = (int)fWeapon; - - if (rules.BuyingPossible(pl) == FALSE) { - return; - } - - if (pl.team == TEAM_T) { - if (iWeapon == WEAPON_M4A1) { return; } - if (iWeapon == WEAPON_AUG) { return; } - if (iWeapon == WEAPON_SG550) { return; } - if (iWeapon == WEAPON_FIVESEVEN) { return; } - if (iWeapon == WEAPON_TMP) { return; } - } else if (pl.team == TEAM_CT) { - if (iWeapon == WEAPON_AK47) { return; } - if (iWeapon == WEAPON_SG552) { return; } - if (iWeapon == WEAPON_G3SG1) { return; } - if (iWeapon == WEAPON_ELITES) { return; } - if (iWeapon == WEAPON_MAC10) { return; } - } - - if (Weapons_IsPresent(pl, iWeapon)) - return; - - if ((pl.money - g_cstrikeWeaponPrice[iWeapon]) >= 0) { - /* let's check if we've got a limit */ - int maxit; - maxit = rules.MaxItemPerSlot(g_weapons[iWeapon].slot); - if (maxit > 0) { - int wantslot = g_weapons[iWeapon].slot; - int c = 0; - for (int i = 0; i < g_weapons.length; i++) { - if (pl.g_items & g_weapons[i].id && g_weapons[i].slot == wantslot) { - c++; - - /* we're over the slot limit. */ - if (c >= maxit) { - pl.activeweapon = i; - Weapon_DropCurrentWeapon(pl); - } - } - } - } - - Weapons_AddItem(pl, iWeapon, -1); - Money_AddMoney(pl, -g_cstrikeWeaponPrice[iWeapon]); - Sound_Play(pl, CHAN_ITEM, "buy.weapon"); - - if (autocvar_fcs_fillweapons) { - if (g_weapons[iWeapon].slot == 0) - Ammo_BuyPrimary(pl, TRUE); - else if (g_weapons[iWeapon].slot == 1) - Ammo_BuySecondary(pl, TRUE); - } - } else { - //centerprint(pl, "You have insufficient funds!"); - } -#endif -} - -void -CSEv_BuyEquipment_f(float fUtil) -{ -#if 0 - CSGameRules rules = (CSGameRules)g_grMode; - - int iUtil; - CSPlayer pl = (CSPlayer)self; - iUtil = (int)fUtil; - - if (rules.BuyingPossible(pl) == FALSE) { - return; - } - - if (pl.team == TEAM_T) { - if (iUtil == 5) { return; } - } - - if ((pl.money - g_cstrikeUtilPrice[iUtil]) >= 0) { - switch (iUtil) { - case 0: - if (pl.armor >= 100) - return; - - pl.armor = 100; - Sound_Play(pl, CHAN_ITEM, "buy.kevlar"); - break; - case 1: - /* if we already have a helmet, buy just armor */ - if (pl.g_items & ITEM_HELMET && pl.armor >= 0) { - CSEv_BuyEquipment_f(0); - return; - } else if (!(pl.g_items & ITEM_HELMET) && pl.armor >= 100) { /* only need helmet, so add it */ - pl.g_items |= ITEM_HELMET; - Money_AddMoney(pl, -350); - Sound_Play(pl, CHAN_ITEM, "buy.kevlar"); - return; - } - - pl.armor = 100; - pl.g_items |= ITEM_HELMET; - Sound_Play(pl, CHAN_ITEM, "buy.kevlar"); - break; - case 2: - if (Weapons_IsPresent(pl, WEAPON_FLASHBANG)) { - if (pl.ammo_fbgrenade >= AMMO_MAX_FLASHBANG) - return; - else - pl.ammo_fbgrenade++; - } else - Weapons_AddItem(pl, WEAPON_FLASHBANG, -1); - - Sound_Play(pl, CHAN_ITEM, "buy.weapon"); - break; - case 3: - if (Weapons_IsPresent(pl, WEAPON_HEGRENADE)) { - if (pl.ammo_hegrenade >= AMMO_MAX_HENADE) - return; - else - pl.ammo_hegrenade++; - } else - Weapons_AddItem(pl, WEAPON_HEGRENADE, -1); - - Sound_Play(pl, CHAN_ITEM, "buy.weapon"); - break; - case 4: - if (Weapons_IsPresent(pl, WEAPON_SMOKEGRENADE)) { - if (pl.ammo_smokegrenade >= AMMO_MAX_SMOKE) - return; - else - pl.ammo_smokegrenade++; - } else - Weapons_AddItem(pl, WEAPON_SMOKEGRENADE, -1); - - Sound_Play(pl, CHAN_ITEM, "buy.weapon"); - break; - case 5: - if (pl.g_items & ITEM_DEFUSAL) - return; - - pl.g_items |= ITEM_DEFUSAL; - Sound_Play(pl, CHAN_ITEM, "buy.weapon"); - break; - case 6: - if (pl.m_bHasNightvision == true) - return; - - pl.m_bHasNightvision = true; - Sound_Play(pl, CHAN_ITEM, "buy.weapon"); - break; - } - Money_AddMoney(pl, -g_cstrikeUtilPrice[iUtil]); - } else { - centerprint(pl, "You have insufficient funds!"); - } -#endif -} diff --git a/src/server/defs.h b/src/server/defs.h index 64107b3..d9cafb9 100644 --- a/src/server/defs.h +++ b/src/server/defs.h @@ -14,47 +14,9 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "ammo.h" -#include "bot.h" -#include "buy.h" -#include "gamerules.h" -#include "money.h" -#include "radio.h" -#include "../../../valve/src/server/items.h" -#include "../../../valve/src/server/flashlight.h" - var int g_cstrike_buying = 0; var float g_cstrike_bombradius = 500; -var int g_cs_vipzones; -var int g_cs_escapezones; -var int g_cs_bombzones; - -var int g_cs_bombbeingdefused; -var int g_cs_bombplanted; -var int g_cs_roundswon_ct; -var int g_cs_roundswon_t; -var int g_cs_roundsplayed; - -var int g_cs_alive_t; -var int g_cs_alive_ct; - -var int g_cs_total_t; -var int g_cs_total_ct; - -var int g_total_players; - -var int g_cs_hostagesrescued; -var int g_cs_hostagestotal; -var int g_cs_roundslost_ct; -var int g_cs_roundslost_t; -var int g_cs_winstreak_ct; -var int g_cs_winstreak_t; -var int g_cs_bonus_ct; -var int g_cs_bonus_t; -var int g_cs_gamestate; -var float g_cs_gametime; - /* Counter-Strike's own cvars */ var int autocvar_mp_winlimit = 0; var int autocvar_mp_halftime = 0; diff --git a/src/server/func_bomb_target.qc b/src/server/func_bomb_target.qc index f68cfd0..31fd733 100644 --- a/src/server/func_bomb_target.qc +++ b/src/server/func_bomb_target.qc @@ -38,7 +38,6 @@ func_bomb_target:NSBrushTrigger void func_bomb_target::func_bomb_target(void) { - g_cs_bombzones++; } void @@ -54,7 +53,7 @@ func_bomb_target::Touch(entity eToucher) return; } - if (g_csMode.ShowHints() && pl.m_seenBombSite == false) { + if (serverinfo.GetBool("cs_hints") && pl.m_seenBombSite == false) { env_message_single(pl, "Hint_you_are_in_targetzone"); pl.m_seenBombSite = true; } diff --git a/src/server/func_buyzone.qc b/src/server/func_buyzone.qc index f7f883c..d161a80 100644 --- a/src/server/func_buyzone.qc +++ b/src/server/func_buyzone.qc @@ -84,7 +84,7 @@ func_buyzone::Touch(entity eToucher) if (team == 0 || team == pl.team) pl.gflags |= GF_BUYZONE; - if (g_csMode.ShowHints() == true) + if (serverinfo.GetBool("cs_hints") == true) if (pl.m_buyMessage == false) { env_message_single(pl, "Hint_press_buy_to_purchase"); pl.m_buyMessage = true; diff --git a/src/server/func_escapezone.qc b/src/server/func_escapezone.qc index cf1d6f3..0851885 100644 --- a/src/server/func_escapezone.qc +++ b/src/server/func_escapezone.qc @@ -38,7 +38,6 @@ func_escapezone:NSBrushTrigger void func_escapezone::func_escapezone(void) { - g_cs_escapezones++; } void @@ -51,51 +50,14 @@ func_escapezone::Respawn(void) void func_escapezone::Touch(entity eToucher) { - CSMultiplayerRules rule = (CSMultiplayerRules)g_grMode; - int to_escape = 0; - - rule.CountPlayers(); - to_escape = g_cs_total_t; - - /* only 3 Ts need to escape, max */ - if (to_escape > 3) - to_escape = 3; - CSPlayer pl = (CSPlayer)eToucher; - /* don't matter when rules are not active */ - if (g_cs_gamestate != GAME_ACTIVE) - return; - /* disallow the wrong players */ if (pl.classname != "player") return; if (pl.team != TEAM_T) return; - rule.m_iEscapedTerrorists++; + g_grMode.Input(eToucher, "Escaped", ""); - /* balancing tweak: for every escaped T, each and every CT will lose funds */ - if (autocvar_fcs_escapepenalty != 0) { - for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - CSPlayer ct = (CSPlayer)eFind; - - if (ct.team == TEAM_CT) { - Money_AddMoney(ct, autocvar_fcs_escapepenalty); - } - } - } - - /* mark player as spectator for the end of this 'round' */ - pl.MakeTempSpectator(); - pl.gflags &= ~GF_FLASHLIGHT; - - /* threshold has been met to trigger the end of the round */ - if (rule.m_iEscapedTerrorists >= to_escape) { - /* reset */ - rule.m_iEscapedTerrorists = 0; - - /* Ts win the round */ - rule.RoundOver(TEAM_T, 3600, FALSE); - } } diff --git a/src/server/func_hostage_rescue.qc b/src/server/func_hostage_rescue.qc index e15fba8..dca820d 100644 --- a/src/server/func_hostage_rescue.qc +++ b/src/server/func_hostage_rescue.qc @@ -70,15 +70,7 @@ func_hostage_rescue::Touch(entity eToucher) if (!(hosty.m_eFollowing)) return; - Radio_BroadcastMessage(RADIO_RESCUED); - g_cs_hostagesrescued++; - - Money_AddMoney((CSPlayer)hosty.m_eFollowing, 1000); - CSBot_HostageRescueNotify(); - - /* In Hostage Rescue, all Counter-Terrorists receive an $850 - * bonus for every hostage that was rescued, even if they lose the round. */ - Money_QueTeamReward(TEAM_CT, 850); + g_grMode.Input(hosty.m_eFollowing, "HostageRescued", ""); hosty.Disappear(); } diff --git a/src/server/func_vip_safetyzone.qc b/src/server/func_vip_safetyzone.qc index f588375..dab8218 100644 --- a/src/server/func_vip_safetyzone.qc +++ b/src/server/func_vip_safetyzone.qc @@ -38,7 +38,6 @@ class func_vip_safetyzone:NSBrushTrigger void func_vip_safetyzone::func_vip_safetyzone(void) { - g_cs_vipzones++; } void @@ -50,12 +49,11 @@ func_vip_safetyzone::Respawn(void) void func_vip_safetyzone::Touch(entity eToucher) { - CSMultiplayerRules rule = (CSMultiplayerRules)g_grMode; - CSPlayer pl = (CSPlayer)eToucher; if (pl.classname != "player") return; +#if 0 if (pl.team != TEAM_VIP) return; @@ -67,4 +65,5 @@ func_vip_safetyzone::Touch(entity eToucher) /* mark player as spectator for the end of this 'round' */ pl.MakeTempSpectator(); pl.gflags &= ~GF_FLASHLIGHT; +#endif } diff --git a/src/server/game_money.qc b/src/server/game_money.qc deleted file mode 100644 index b29ab41..0000000 --- a/src/server/game_money.qc +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2016-2019 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 -Money_AddMoney(NSClientPlayer pp, int iMoneyValue) -{ - CSPlayer pl = (CSPlayer)pp; - dprint(sprintf("^2Money_AddMoney^7: giving %s $%i\n", pl.netname, iMoneyValue)); - pl.money += (float)iMoneyValue; - - if (pl.money > autocvar_fcs_maxmoney) { - pl.money = autocvar_fcs_maxmoney; - } - - /* Because people do tend to kill hostages... */ - if (pl.money < 0) { - pl.money = 0; - } -} - -void -Money_QueTeamReward(int t, int iMoneyValue) -{ - if (t == TEAM_T) { - g_cs_moneyreward_t += iMoneyValue; - } else { - g_cs_moneyreward_ct += iMoneyValue; - } -} - -void -Money_GiveTeamReward(NSClientPlayer pl) -{ - if (pl.team == TEAM_T) { - Money_AddMoney(pl, g_cs_moneyreward_t); - } else { - Money_AddMoney(pl, g_cs_moneyreward_ct); - } -} - -void -Money_ResetTeamReward(void) -{ - g_cs_moneyreward_t = 0; - g_cs_moneyreward_ct = 0; -} - -int -Money_GetLosses(int team) -{ - if (team == TEAM_T) { - return g_cs_roundslost_t; - } else { - return g_cs_roundslost_ct; - } -} - -int -Money_HasBonus(int team) -{ - if (team == TEAM_T) { - return g_cs_bonus_t; - } else { - return g_cs_bonus_ct; - } -} - -void -Money_HandleRoundReward(int winner) -{ - int loser = -1; - - if (winner == TEAM_CT) { - g_cs_winstreak_ct++; - g_cs_winstreak_t = 0; - g_cs_roundslost_t++; - g_cs_roundslost_ct = 0; - loser = TEAM_T; - - if (g_cs_winstreak_ct >= 2) { - g_cs_bonus_ct = TRUE; - } - } else { - g_cs_winstreak_t++; - g_cs_winstreak_ct = 0; - g_cs_roundslost_ct++; - g_cs_roundslost_t = 0; - loser = TEAM_CT; - - if (g_cs_winstreak_t >= 2) { - g_cs_bonus_t = TRUE; - } - } - - /* After the condition of a team winning two consecutive rounds is - * satisfied then the loss bonus money changes to above where their - * first loss means they receive $1500 and not $1400. */ - if (Money_HasBonus(loser)) { - switch (Money_GetLosses(loser)) { - case 1: - Money_QueTeamReward(loser, 1500); - break; - case 2: - Money_QueTeamReward(loser, 2000); - break; - case 3: - Money_QueTeamReward(loser, 2500); - break; - default: - Money_QueTeamReward(loser, 3000); - break; - } - } else { - switch (Money_GetLosses(loser)) { - case 1: - Money_QueTeamReward(loser, 1400); - break; - case 2: - Money_QueTeamReward(loser, 1900); - break; - case 3: - Money_QueTeamReward(loser, 2400); - break; - case 4: - Money_QueTeamReward(loser, 2900); - break; - default: - Money_QueTeamReward(loser, 3400); - break; - } - } -} - -void -Money_ResetRoundReward(void) -{ - g_cs_roundslost_ct = - g_cs_roundslost_t = - g_cs_winstreak_ct = - g_cs_winstreak_t = - g_cs_bonus_ct = - g_cs_bonus_t = 0; -} diff --git a/src/server/game_rules.qc b/src/server/game_rules.qc deleted file mode 100644 index 0375c53..0000000 --- a/src/server/game_rules.qc +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2016-2019 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. - */ - -/* Edit this for a custom gun-game order */ -int gg_order[] = { - WEAPON_KNIFE, - WEAPON_GLOCK18, - WEAPON_USP45, - WEAPON_P228, - WEAPON_FIVESEVEN, - WEAPON_ELITES, - WEAPON_DEAGLE, - WEAPON_M3, - WEAPON_XM1014, - WEAPON_TMP, - WEAPON_MAC10, - WEAPON_MP5, - WEAPON_UMP45, - WEAPON_P90, - WEAPON_AK47, - WEAPON_SCOUT, - WEAPON_M4A1, - WEAPON_SG552, - WEAPON_AUG, - WEAPON_G3SG1, - WEAPON_SG550, - WEAPON_AWP, - WEAPON_PARA -}; - - diff --git a/src/server/gamerules.h b/src/server/gamerules.h deleted file mode 100644 index 2988265..0000000 --- a/src/server/gamerules.h +++ /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. - */ - -class CSGameRules:CGameRules -{ - virtual void PlayerPreFrame(NSClientPlayer); - virtual void PlayerDeath(NSClientPlayer); - virtual void PlayerPain(NSClientPlayer); - -/* level transitions */ - virtual void LevelChangeParms(NSClientPlayer); - virtual void LevelDecodeParms(NSClientPlayer); - virtual void LevelNewParms(void); - - virtual bool BuyingPossible(NSClientPlayer); - virtual bool ShowHints(void); - - virtual bool ImpulseCommand(NSClient, float); -}; - -class CSSingleplayerRules:CSGameRules -{ - virtual string Title(void); - - /* client */ - virtual void PlayerSpawn(NSClientPlayer); - virtual void PlayerDeath(NSClientPlayer); -}; - -class CSDeathmatchRules:CSGameRules -{ - int m_iIntermission; - int m_iIntermissionTime; - string m_strTeamList; - - void(void) CSDeathmatchRules; - - virtual string Title(void); - virtual void(void) FrameStart; - virtual void(void) CheckRules; - virtual bool(void) MonstersSpawn; - - /* client */ - virtual void(NSClientPlayer) PlayerSpawn; - virtual void(NSClientPlayer) PlayerDeath; - virtual bool(NSClientPlayer, string) ConsoleCommand; - virtual bool(void) IsMultiplayer; - virtual bool(void) IsTeamplay; - virtual void(void) InitPostEnts; - virtual bool PlayerRequestRespawn(NSClientPlayer); - virtual bool ShowHints(void); -}; - -class CSMultiplayerRules:CSGameRules -{ - entity m_eLastTSpawn; - entity m_eLastCTSpawn; - - int m_iEscapedTerrorists; - int m_iSwapTeamRoundCounter; - - void CSMultiplayerRules(void); - - virtual string Title(void); - virtual void InitPostEnts(void); - virtual void FrameStart(void); - virtual void PlayerDisconnect(NSClientPlayer); - virtual void PlayerSpawn(NSClientPlayer); - virtual void PlayerPreFrame(NSClientPlayer); - virtual void PlayerDeath(NSClientPlayer); - virtual int MaxItemPerSlot(int); - virtual bool ConsoleCommand(NSClientPlayer, string); - - /* CS specific */ - virtual void CreateRescueZones(void); - virtual void CreateCTBuyzones(void); - virtual void CreateTBuyzones(void); - virtual void TimerBegin(float, int); - virtual void TimerUpdate(void); - - virtual bool BuyingPossible(NSClientPlayer); - virtual void RoundOver(int, int, int); - virtual void RestartRound(int); - virtual void DeathCheck(NSClientPlayer); - virtual void MakeBomber(NSClientPlayer); - virtual void MakeVIP(NSClientPlayer); - virtual void CountPlayers(void); - virtual void SwitchTeams(void); - virtual void TimeOut(void); - virtual bool IsTeamplay(void); - - virtual void PlayerClearWeaponry(NSClientPlayer); - virtual void PlayerMakePlayable(NSClientPlayer, int); - virtual void PlayerMakeSpectator(NSClientPlayer); - virtual void PlayerRespawn(NSClientPlayer, int); - virtual entity PlayerFindSpawn(float); - virtual void PlayerReset(NSClientPlayer); - -}; - -void CSEv_JoinAuto(void); - -CSGameRules g_csMode; diff --git a/src/server/gamerules.qc b/src/server/gamerules.qc deleted file mode 100644 index 23f765e..0000000 --- a/src/server/gamerules.qc +++ /dev/null @@ -1,115 +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. - */ - -void -CSGameRules::PlayerDeath(NSClientPlayer pl) -{ -} - -void -CSGameRules::PlayerPain(NSClientPlayer pl) -{ -} - -bool -CSGameRules::ShowHints(void) -{ - return (true); -} - -bool -CSGameRules::BuyingPossible(NSClientPlayer pl) -{ - return (false); -} - -/* we check what fields have changed over the course of the frame and network - * only the ones that have actually changed */ -void -CSGameRules::PlayerPreFrame(NSClientPlayer pp) -{ - pp.gflags &= ~GF_BUYZONE; - pp.gflags &= ~GF_RESCUEZONE; - pp.gflags &= ~GF_BOMBZONE; -} - -void -CSGameRules::LevelDecodeParms(NSClientPlayer pp) -{ - CSPlayer pl = (CSPlayer)pp; - g_landmarkpos[0] = parm1; - g_landmarkpos[1] = parm2; - g_landmarkpos[2] = parm3; - pl.angles[0] = parm4; - pl.angles[1] = parm5; - pl.angles[2] = parm6; - pl.velocity[0] = parm7; - pl.velocity[1] = parm8; - pl.velocity[2] = parm9; - pl.g_items = parm10; - pl.activeweapon = parm11; - pl.flags = parm64; - pl.gflags = parm63; - - if (pl.IsCrouching()) { - setsize(pl, VEC_CHULL_MIN, VEC_CHULL_MAX); - } else { - setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); - } -} - -void -CSGameRules::LevelChangeParms(NSClientPlayer pp) -{ - CSPlayer pl = (CSPlayer)pp; - parm1 = g_landmarkpos[0]; - parm2 = g_landmarkpos[1]; - parm3 = g_landmarkpos[2]; - parm4 = pl.angles[0]; - parm5 = pl.angles[1]; - parm6 = pl.angles[2]; - parm7 = pl.velocity[0]; - parm8 = pl.velocity[1]; - parm9 = pl.velocity[2]; - parm63 = pl.gflags; - parm64 = pl.flags; - parm10 = pl.g_items; - parm11 = pl.activeweapon; -} - -void -CSGameRules::LevelNewParms(void) -{ - parm1 = parm2 = parm3 = parm4 = parm5 = parm6 = parm7 = - parm8 = parm9 = parm10 = parm11 = parm12 = parm13 = parm14 = - parm15 = parm16 = parm17 = parm18 = parm19 = parm20 = parm21 = - parm22 = parm23 = parm24 = parm25 = parm26 = parm27 = parm28 = - parm29 = parm30 = parm31 = parm32 = parm33 = parm34 = parm35 = - parm36 = parm37 = parm38 = parm39 = parm40 = parm41 = parm42 = - parm43 = parm44 = parm45 = parm46 = parm63= 0; - parm64 = FL_CLIENT; -} - -bool -CSGameRules::ImpulseCommand(NSClient bp, float num) -{ - switch (num) { - default: - return super::ImpulseCommand(bp, num); - } - - return true; -} \ No newline at end of file diff --git a/src/server/gamerules_deathmatch.qc b/src/server/gamerules_deathmatch.qc deleted file mode 100644 index 7e6043c..0000000 --- a/src/server/gamerules_deathmatch.qc +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright (c) 2016-2023 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. - */ - -string -CSDeathmatchRules::Title(void) -{ - return "Deathmatch"; -} - -bool -CSDeathmatchRules::ShowHints(void) -{ - return (false); -} - -bool -CSDeathmatchRules::IsMultiplayer(void) -{ - return (true); -} - -bool -CSDeathmatchRules::PlayerRequestRespawn(NSClientPlayer bp) -{ - if (bp.TimeSinceDeath() > 0.5f) { - bp.ScheduleThink(PutClientInServer, 0.0f); - return (true); - } - - return (false); -} - -bool -CSDeathmatchRules::IsTeamplay(void) -{ - return cvar("mp_teamplay") == 1 ? true : false; -} - -void -CSDeathmatchRules::InitPostEnts(void) -{ - MOTD_LoadDefault(); - - forceinfokey(world, "scorepoints", "0"); - - if (IsTeamplay() == true) { - forceinfokey(world, "teams", "2"); - forceinfokey(world, "team_1", "Counter-Terrorist"); - forceinfokey(world, "teamscore_1", "0"); - forceinfokey(world, "team_2", "Terrorist"); - forceinfokey(world, "teamscore_2", "0"); - } else { - forceinfokey(world, "teams", "0"); - } -} - -void -CSDeathmatchRules::FrameStart(void) -{ - if (cvar("timelimit")) - if (time >= (cvar("timelimit") * 60)) { - IntermissionStart(); - } - - IntermissionCycle(); -} - -void -CSDeathmatchRules::CheckRules(void) -{ - /* last person who killed somebody has hit the limit */ - if (cvar("fraglimit")) - if (g_dmg_eAttacker.frags >= cvar("fraglimit")) - IntermissionStart(); -} - -void -CSDeathmatchRules::PlayerDeath(NSClientPlayer pl) -{ - /* obituary networking */ - WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); - WriteByte(MSG_MULTICAST, EV_OBITUARY); - WriteString(MSG_MULTICAST, (g_dmg_eAttacker.netname) ? g_dmg_eAttacker.netname : g_dmg_eAttacker.classname); - WriteString(MSG_MULTICAST, pl.netname); - WriteByte(MSG_MULTICAST, g_dmg_iWeapon); - WriteByte(MSG_MULTICAST, 0); - msg_entity = world; - multicast([0,0,0], MULTICAST_ALL); - - Plugin_PlayerObituary(g_dmg_eAttacker, g_dmg_eTarget, g_dmg_iWeapon, g_dmg_iHitBody, g_dmg_iDamage); - - /* death-counter */ - pl.deaths++; - pl.SetInfoKey("*deaths", ftos(pl.deaths)); - - /* update score-counter */ - if (pl.flags & FL_CLIENT || pl.flags & FL_MONSTER) - if (g_dmg_eAttacker.flags & FL_CLIENT) { - if (pl == g_dmg_eAttacker) - g_dmg_eAttacker.frags--; - else - g_dmg_eAttacker.frags++; - } - -#if 0 - /* explode all satchels */ - s_satchel_detonate((entity)pl); - /* drop their posessions into a weaponbox item */ - weaponbox_spawn((CSPlayer)pl); -#endif - - /* either gib, or make a corpse */ - if (pl.health < -50) { - vector gibDir = vectoangles(pl.origin - g_dmg_eAttacker.origin); - float gibStrength = g_dmg_iDamage * 2.0f; - BreakModel_Entity(pl, gibDir, gibStrength); - } else { - FX_Corpse_Spawn((CSPlayer)pl, ANIM_DEATH1); - //FX_Corpse_Spawn((CSPlayer)pl, ANIM_DIESIMPLE); - } - - /* now let's make the real client invisible */ - //pl.Death(); - pl.SetTakedamage(DAMAGE_NO); - pl.gflags &= ~GF_FLASHLIGHT; - - Sound_Play(pl, CHAN_AUTO, "player.die"); - - /* force respawn */ - pl.ScheduleThink(PutClientInServer, 4.0f); - - /* have we gone over the fraglimit? */ - CheckRules(); -} - -void -CSDeathmatchRules::PlayerSpawn(NSClientPlayer pp) -{ - CSPlayer pl = (CSPlayer)pp; - /* this is where the mods want to deviate */ - entity spot; - - pl.classname = "player"; - pl.SetMaxHealth(100); - pl.SetHealth(100); - pl.SetArmor(100); - pl.SetTakedamage(DAMAGE_YES); - pl.SetSolid(SOLID_SLIDEBOX); - pl.SetMovetype(MOVETYPE_WALK); - pl.AddFlags(FL_CLIENT); - pl.viewzoom = 1.0; - - /* player model selection */ - if (IsTeamplay() == true) { - int teamCount = tokenizebyseparator(m_strTeamList, ";"); - int playerTeam = (int)pl.GetTeam(); - - /* not part of a team? pick one of the ones we have */ - /* TODO: this should sort us into the lowest team */ - if (playerTeam == 0) { - playerTeam = 1i + (int)floor(random(0, (float)teamCount)); /* teams start at 1 after all */ - pl.SetTeam(random() < 0.5 ? TEAM_CT : TEAM_T); - } - - if (playerTeam == TEAM_T) - pl.charmodel = floor(random(1,5)); - else - pl.charmodel = floor(random(5,9)); - } else { - pl.charmodel = rint(random(1,9)); - } - - switch (pl.charmodel) { - case 1: - pl.model = "models/player/terror/terror.mdl"; - break; - case 2: - pl.model = "models/player/leet/leet.mdl"; - break; - case 3: - pl.model = "models/player/arctic/arctic.mdl"; - break; - case 4: - pl.model = "models/player/guerilla/guerilla.mdl"; - break; - case 5: - pl.model = "models/player/urban/urban.mdl"; - break; - case 6: - pl.model = "models/player/gsg9/gsg9.mdl"; - break; - case 7: - pl.model = "models/player/sas/sas.mdl"; - break; - case 8: - pl.model = "models/player/gign/gign.mdl"; - break; - default: - pl.model = "models/player/vip/vip.mdl"; - } - - - pl.SetModel(pl.model); - pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX); - pl.ClearVelocity(); - pl.gravity = __NULL__; - pl.SetFrame(1); - pl.SendFlags = UPDATE_ALL; - pl.SetInfoKey("*spec", "0"); - pl.SetInfoKey("*dead", "0"); - pl.SetInfoKey("*deaths", ftos(pl.deaths)); - pl.SetPropData("actor_human"); - pl.EnableBleeding(); - - LevelNewParms(); - LevelDecodeParms(pl); - - pl.GiveItem("item_suit"); - pl.GiveItem("weapon_knife"); - -#if 0 - int randomGun = (int)rint(random(WEAPON_USP45, WEAPON_FIVESEVEN)); - //Weapons_AddItem(pl, randomGun, -1); - randomGun = (int)rint(random(WEAPON_M3, WEAPON_PARA)); - //Weapons_AddItem(pl, randomGun, -1); - pl.activeweapon = randomGun; -#endif - - Ammo_BuyPrimary(pl, TRUE); - Ammo_BuySecondary(pl, TRUE); - - spot = Spawn_SelectRandom("info_player_deathmatch"); - pl.Transport(spot.origin, spot.angles); - Client_FixAngle(pl, pl.angles); -} - -bool -CSDeathmatchRules::ConsoleCommand(NSClientPlayer pp, string cmd) -{ - tokenize(cmd); - - switch (argv(0)) { -#if 0 - case "bot_add": - bot pete = (bot)Bot_AddQuick(); - Bot_RandomColormap(pete); - searchhandle pm = search_begin("models/player/*/*.mdl", TRUE, TRUE); - int r = floor(random(0, search_getsize(pm))); - string mdl = substring(search_getfilename(pm, r), 0, -5); - tokenizebyseparator(mdl, "/"); - pete.SetInfoKey("model", argv(2)); - search_end(pm); - break; -#endif - case "jumptest": - makevectors(pp.v_angle); - traceline(pp.origin + pp.view_ofs, pp.origin + pp.view_ofs + v_forward * 1024, FALSE, pp); - pp.velocity = Route_GetJumpVelocity(pp.origin, trace_endpos, pp.gravity); - break; - default: - return (false); - } - - return (true); -} - -bool -CSDeathmatchRules::MonstersSpawn(void) -{ - return (autocvar(mp_allowmonsters, 0)) ? true : false; -} - -void -CSDeathmatchRules::CSDeathmatchRules(void) -{ - /* these lines do nothing but tell the server to register those cvars */ - autocvar(timelimit, 15, "Timelimit for multiplayer rounds"); - autocvar(fraglimit, 15, "Points limit for multiplayer rounds"); -} \ No newline at end of file diff --git a/src/server/gamerules_multiplayer.qc b/src/server/gamerules_multiplayer.qc deleted file mode 100644 index e5f0a6e..0000000 --- a/src/server/gamerules_multiplayer.qc +++ /dev/null @@ -1,1291 +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. - */ - -#ifdef CSSOURCE - #define SPAWNPOINT_CT "info_player_counterterrorist" - #define SPAWNPOINT_T "info_player_terrorist" -#else - #define SPAWNPOINT_CT "info_player_start" - #define SPAWNPOINT_T "info_player_deathmatch" -#endif - -string -CSMultiplayerRules::Title(void) -{ - return "Counter-Strike"; -} - -int -CSMultiplayerRules::MaxItemPerSlot(int slot) -{ - /* grenades */ - if (slot == 3) { - return (3); - } - return (1); -} - -void -CSMultiplayerRules::PlayerDisconnect(NSClientPlayer pl) -{ - if (health > 0) - PlayerDeath(pl); - - super::PlayerDisconnect(pl); -} - -void -CSMultiplayerRules::PlayerDeath(NSClientPlayer pl) -{ - CSPlayer targ = (CSPlayer)g_dmg_eTarget; - CSPlayer attk = (CSPlayer)g_dmg_eAttacker; - NSRenderableEntity newCorpse; - float deathAnimation = ANIM_DEATH1; - - if (targ.IsCrouching()) { - deathAnimation = ANIM_CROUCH_DIE; - } else { - switch (g_dmg_iHitBody) { - case BODY_HEAD: - deathAnimation = ANIM_DIE_HEAD; - break; - case BODY_STOMACH: - deathAnimation = ANIM_DIE_GUT; - break; - case BODY_ARMLEFT: - deathAnimation = ANIM_DIE_LEFT; - break; - case BODY_ARMRIGHT: - deathAnimation = ANIM_DIE_RIGHT; - break; - default: - bool isFacing = targ.IsFacingPosition(g_dmg_vecLocation); - - /* still want to play ANIM_DEATH1 */ - if (random() < 0.5f) { - if (isFacing == false) { - deathAnimation = ANIM_DIE_FORWARD; - } else { - deathAnimation = ANIM_DIE_BACK; - } - } - - break; - } - } - - newCorpse = (NSRenderableEntity)FX_Corpse_Spawn(targ, deathAnimation); - - targ.SpectatorDeathcam(newCorpse, attk, 3.0f); - - /* obituary networking */ - WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); - WriteByte(MSG_MULTICAST, EV_OBITUARY); - if (g_dmg_eAttacker.netname) - WriteString(MSG_MULTICAST, strcat(HUD_GetChatColorHEX(g_dmg_eAttacker.team), g_dmg_eAttacker.netname)); - else - WriteString(MSG_MULTICAST, g_dmg_eAttacker.classname); - - WriteString(MSG_MULTICAST, strcat(HUD_GetChatColorHEX(targ.team), targ.netname)); - - WriteByte(MSG_MULTICAST, g_dmg_iWeapon); - WriteByte(MSG_MULTICAST, 0); - msg_entity = world; - multicast([0,0,0], MULTICAST_ALL); - - Plugin_PlayerObituary(g_dmg_eAttacker, g_dmg_eTarget, g_dmg_iWeapon, g_dmg_iHitBody, g_dmg_iDamage); - - /* death-counter */ - targ.deaths++; - forceinfokey(targ, "*deaths", ftos(targ.deaths)); - - /* update score-counter */ - if (isClient(g_dmg_eTarget) || isAI(g_dmg_eTarget)) - if (isClient(g_dmg_eAttacker)) { - float vip = (g_dmg_eTarget.team == TEAM_VIP && g_dmg_eAttacker.team == TEAM_CT); - - if (g_dmg_eTarget == g_dmg_eAttacker) { - g_dmg_eAttacker.frags--; - } else if (g_dmg_eTarget.team == g_dmg_eAttacker.team || vip) { - g_dmg_eAttacker.frags--; - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, autocvar_fcs_penalty_teamkill); - } else { - g_dmg_eAttacker.frags++; - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, autocvar_fcs_reward_kill); - } - } - - /* scoreboard death icon */ - if (isClient(g_dmg_eTarget)) { - targ.SetInfoKey("*icon1", "d_skull"); - targ.SetInfoKey("*icon1_r", "1"); - targ.SetInfoKey("*icon1_g", "0"); - targ.SetInfoKey("*icon1_b", "0"); - } - - /* TODO: implement this in NSNavAI */ - //targ.DropActiveWeapon(); - - ///Weapon_DropCurrentWeapon(targ); - - /* if we're the bomb carrier, make sure we drop the bomb. */ - if (targ.HasItem("weapon_c4")) { - //targ.SwitchToWeapon("weapon_c4"); - //Weapon_DropCurrentWeapon(targ); - } else { - //targ.activeweapon = Cstrike_WeaponToDropUponDeath(targ); - //Weapon_DropCurrentWeapon(targ); - } - - /* clear all ammo and inventory... */ - targ.RemoveAllWeapons(); -// targ.Death(); - targ.gflags &= ~GF_FLASHLIGHT; - targ.m_bHasNightvision = false; - - targ.StartSoundDef("Player.Death", CHAN_AUTO, true); - - /* gamerule stuff */ - targ.MakeTempSpectator(); - forceinfokey(targ, "*dead", "1"); - forceinfokey(targ, "*team", ftos(targ.team)); - CountPlayers(); - - /* In Assassination, all Terrorists receive a $2500 - * reward if they won by killing the VIP. */ - if (targ.team == TEAM_VIP) { - RoundOver(TEAM_T, 2500, FALSE); - return; - } - DeathCheck(targ); -} - -void -CSMultiplayerRules::PlayerPreFrame(NSClientPlayer pl) -{ - super::PlayerPreFrame(pl); - - /* the messages that get printed when you aim at something - happen here */ - { - vector sourcePos, destPos; - CSPlayer p = (CSPlayer)pl; - - sourcePos = pl.GetEyePos(); - destPos = sourcePos + (pl.GetForward() * 512); - traceline(sourcePos, destPos, MOVE_NORMAL, pl); - - if (trace_ent) { - if (trace_ent.classname == "player") - if (trace_ent.team == p.team && p.m_seenFriend == false) { - env_message_single(pl, "Hint_spotted_a_friend"); - p.m_seenFriend = true; - } else if (trace_ent.team != p.team && p.m_seenEnemy == false) { - env_message_single(pl, "Hint_spotted_an_enemy"); - p.m_seenEnemy = true; - } - - if (trace_ent.classname == "hostage_entity" && p.m_seenHostage == false) { - if (p.team == TEAM_T) { - env_message_single(pl, "Hint_prevent_hostage_rescue"); - } else { - env_message_single(pl, "Hint_rescue_the_hostages"); - env_message_single(pl, "Hint_press_use_so_hostage_will_follow"); - } - p.m_seenHostage = true; - } - } - } -} - -void -CSMultiplayerRules::FrameStart(void) -{ - if ((g_total_players > 0) && (g_cs_gamestate == GAME_INACTIVE)) { - TimerBegin(2, GAME_COMMENCING); - } else if (g_total_players == 0) { - g_cs_gamestate = GAME_INACTIVE; - g_cs_gametime = 0; - g_cs_roundswon_t = 0; - g_cs_roundswon_ct = 0; - g_cs_roundsplayed = 0; - } else { - TimerUpdate(); // Timer that happens once players have started joining - } -} - -void -CSMultiplayerRules::CreateRescueZones(void) -{ - int zones = 0; - - /* not in hostage rescue mode */ - if (g_cs_hostagestotal <= 0) { - return; - } - - /* count the already existing rescue zones. */ - for (entity e = world; (e = find(e, ::classname, "func_hostage_rescue"));) { - zones++; - } - - /* we don't need to create any additional rescue zones. */ - if (zones > 0) - return; - - /* hostage zones need to go somewhere */ - for (entity e = world; (e = find(e, ::classname, SPAWNPOINT_CT));) { - info_hostage_rescue newzone = spawn(info_hostage_rescue, origin: e.origin); - newzone.Respawn(); - } -} - -void -CSMultiplayerRules::CreateCTBuyzones(void) -{ - int zones = 0; - - /* count the already existing CT zones. */ - for (entity e = world; (e = find(e, ::classname, "func_buyzone"));) { - if (e.team == 0 || e.team == TEAM_CT) { - zones++; - } - } - - /* we don't need to create any additional CT zones. */ - if (zones > 0) - return; - - /* since no buyzones are available, let's create one around every CT spawn */ - for (entity e = world; (e = find(e, ::classname, SPAWNPOINT_CT));) { - info_buyzone newzone = spawn(info_buyzone, origin: e.origin); - newzone.Respawn(); - newzone.team = TEAM_CT; - } -} - -void -CSMultiplayerRules::CreateTBuyzones(void) -{ - int zones = 0; - - /* count the already existing T zones. */ - for (entity e = world; (e = find(e, ::classname, "func_buyzone"));) { - if (e.team == 0 || e.team == TEAM_T) { - zones++; - } - } - - /* we don't need to create any additional T zones. */ - if (zones > 0) - return; - - /* since no buyzones are available, let's create one around every T spawn */ - for (entity e = world; (e = find(e, ::classname, SPAWNPOINT_T));) { - info_buyzone newzone = spawn(info_buyzone, origin: e.origin); - newzone.Respawn(); - newzone.team = TEAM_T; - } -} - -void -CSMultiplayerRules::InitPostEnts(void) -{ - EntityDef_Precache("CSBasePistol"); - EntityDef_Precache("CSBaseRifle"); - EntityDef_Precache("CSBaseShotgun"); - EntityDef_Precache("weapon_ak47"); - EntityDef_Precache("weapon_aug"); - EntityDef_Precache("weapon_awp"); - EntityDef_Precache("weapon_c4"); - EntityDef_Precache("weapon_deagle"); - EntityDef_Precache("weapon_elite"); - EntityDef_Precache("weapon_famas"); - EntityDef_Precache("weapon_fiveseven"); - EntityDef_Precache("weapon_flashbang"); - EntityDef_Precache("weapon_g3sg1"); - EntityDef_Precache("weapon_galil"); - EntityDef_Precache("weapon_glock18"); - EntityDef_Precache("weapon_hegrenade"); - EntityDef_Precache("weapon_knife"); - EntityDef_Precache("weapon_m249"); - EntityDef_Precache("weapon_m3"); - EntityDef_Precache("weapon_m4a1"); - EntityDef_Precache("weapon_mac10"); - EntityDef_Precache("weapon_mp5navy"); - EntityDef_Precache("weapon_p228"); - EntityDef_Precache("weapon_p90"); - EntityDef_Precache("weapon_scout"); - EntityDef_Precache("weapon_sg550"); - EntityDef_Precache("weapon_sg552"); - EntityDef_Precache("weapon_smokegrenade"); - EntityDef_Precache("weapon_tmp"); - EntityDef_Precache("weapon_ump45"); - EntityDef_Precache("weapon_usp"); - EntityDef_Precache("weapon_xm1014"); - - MOTD_LoadDefault(); - - /* let's check if we need to create buyzones */ - switch (g_cstrike_buying) { - case BUY_CT: - CreateCTBuyzones(); - break; - case BUY_T: - CreateTBuyzones(); - break; - case BUY_NEITHER: - break; - default: - CreateCTBuyzones(); - CreateTBuyzones(); - } - - CreateRescueZones(); - - /* get all of the vip zones */ - g_cs_vipzones = 0; - for (entity e = world; (e = find(e, ::classname, "func_vip_safetyzone"));) { - g_cs_vipzones++; - } -} - -void -CSMultiplayerRules::TimerBegin(float tleft, int mode) -{ - g_cs_gametime = tleft; - - if (mode == GAME_FREEZE) { - g_cs_gamestate = GAME_FREEZE; - } else if (mode == GAME_ACTIVE) { - g_cs_gamestate = GAME_ACTIVE; - CountPlayers(); - - if (g_cs_total_t <= 1 || g_cs_total_ct <= 1) - return; - - /* if no players are present in the chosen team, force restart round */ - if ((g_cs_alive_t == 0)) { - RoundOver(TEAM_CT, 3600, FALSE); - return; - } else if (g_cs_alive_ct == 0) { - RoundOver(TEAM_T, 3600, FALSE); - return; - } - - } else if (mode == GAME_END) { - g_cs_gamestate = GAME_END; - } else if (mode == GAME_COMMENCING) { - g_cs_gamestate = GAME_COMMENCING; - } else if (mode == GAME_OVER) { - g_cs_gamestate = GAME_OVER; - } -} - -void -CSMultiplayerRules::TimerUpdate(void) -{ - /* if we've got hostages in the map... */ - if (g_cs_hostagestotal > 0) { - /* and they're all rescued.... */ - if (g_cs_hostagesrescued >= g_cs_hostagestotal) { - /* CTs win! */ - RoundOver(TEAM_CT, 0, FALSE); - return; - } - } - - /* This map has been played enough we think */ - if (g_cs_gamestate != GAME_OVER) { - if (cvar("mp_timelimit") > 0) { - if (time >= (cvar("mp_timelimit") * 60)) { - IntermissionStart(); - g_cs_gamestate = GAME_OVER; - } - } - } - - /* Okay, this means that timelimit is not the only deciding factor */ - if (autocvar_mp_winlimit > 0 && g_cs_gamestate != GAME_OVER) { - /* It really doesn't matter who won. Do some logging perhaps? */ - if (g_cs_roundswon_ct == autocvar_mp_winlimit || - g_cs_roundswon_t == autocvar_mp_winlimit) { - IntermissionStart(); - } - } - - /* INACTIVE means no one is registered as a player */ - if (g_cs_gamestate == GAME_INACTIVE) { - return; - } - - /* our continously running down timer */ - g_cs_gametime = bound(0, g_cs_gametime - frametime, g_cs_gametime); - - /* if the round is over or the game is done with... */ - if (g_cs_gamestate == GAME_COMMENCING || g_cs_gamestate == GAME_END) { - if (g_cs_gametime <= 0) { - if (g_cs_roundswon_t == 0 && g_cs_roundswon_ct == 0) { - Money_ResetTeamReward(); - Money_ResetRoundReward(); - RestartRound(TRUE); - } else { - if (autocvar_mp_halftime == TRUE && (autocvar_mp_winlimit / 2 == g_cs_roundsplayed)) { - Money_ResetTeamReward(); - SwitchTeams(); - RestartRound(TRUE); - } else { - RestartRound(FALSE); - } - } - } - return; - } - - if ((g_cs_gamestate == GAME_ACTIVE) || (g_cs_gamestate == GAME_FREEZE)) { - if (g_cs_gametime <= 0) { - if (g_cs_gamestate == GAME_ACTIVE) { - /* 1.5 will make the T's lose if time runs out no matter what */ - if (autocvar_fcs_fix_bombtimer == TRUE) { - if (g_cs_bombzones > 0 && g_cs_bombplanted == TRUE) { - return; - } - } - TimeOut(); - TimerBegin(5, GAME_END); /* Round is over, 5 seconds til a new round starts */ - } else { - TimerBegin(autocvar_mp_roundtime * 60, GAME_ACTIVE); // Unfreeze - Radio_StartMessage(); - CSBot_RoundStart(); - } - } - } -} - -/* -================= -BuyingPossible - -Checks if it is possible for players to buy anything -================= -*/ -bool -CSMultiplayerRules::BuyingPossible(NSClientPlayer pl) -{ - if (pl.IsDead()) { - return (false); - } - - if (g_cs_gamestate == GAME_ACTIVE) { - if (((autocvar_mp_roundtime * 60) - g_cs_gametime) > autocvar_mp_buytime) { - centerprint(pl, sprintf("%d seconds have passed...\nYou can't buy anything now!", autocvar_mp_buytime)); - return (false); - } - } - - if (pl.team == TEAM_VIP) { - centerprint(pl, "You are the VIP...\nYou can't buy anything!\n"); - return (false); - } - - if (g_cstrike_buying == BUY_NEITHER) { - centerprint(pl, "Sorry, you aren't meant\nto be buying anything.\n"); - return (false); - } - - if (g_cstrike_buying != BUY_BOTH) { - if (g_cstrike_buying == BUY_CT && pl.team == TEAM_T) { - centerprint(pl, "Terrorists aren't allowed to\nbuy anything on this map!\n"); - return (false); - } else if (g_cstrike_buying == BUY_T && pl.team == TEAM_CT) { - centerprint(pl, "CTs aren't allowed to buy\nanything on this map!\n"); - return (false); - } - } - - if (!(pl.gflags & GF_BUYZONE)) { - centerprint(pl, "Sorry, you aren't in a buyzone.\n"); - return (false); - } - - return (true); -} - -void -CSMultiplayerRules::MakeBomber(NSClientPlayer pl) -{ - pl.GiveItem("weapon_c4"); - env_message_single(pl, "Hint_you_have_the_bomb"); -} - -void -CSMultiplayerRules::MakeVIP(NSClientPlayer pl) -{ - pl.team = TEAM_VIP; - PlayerRespawn(pl, pl.team); - env_message_single(pl, "Hint_you_are_the_vip"); - pl.SetInfoKey("*dead", "2"); - pl.SetModel("models/player/vip/vip.mdl"); -} - -/* -================= -RestartRound - -Loop through all ents and handle them -================= -*/ -void -CSMultiplayerRules::RestartRound(int iWipe) -{ - if (autocvar_fcs_swaponround > 0) - if (m_iSwapTeamRoundCounter >= autocvar_fcs_swaponround) { - m_iSwapTeamRoundCounter = 0; - - for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - CSPlayer pl = (CSPlayer)eFind; - - if (pl.team == TEAM_T) { - pl.team = TEAM_CT; /* temp for CT */ - pl.charmodel += 4; - pl.health = 0; - } else if (pl.team == TEAM_VIP || pl.team == TEAM_CT) { - pl.team = TEAM_T; /* temp for CT */ - pl.charmodel -= 4; - pl.health = 0; - } - } - } - - // Reset CSBot vars - CSBot_RestartRound(); - - for (entity eFind = world; (eFind = findfloat(eFind, ::team, TEAM_T));) { - if (isClient(eFind) == false) { - continue; - } - - CSPlayer pl = (CSPlayer)eFind; - - if (pl.health > 0 && iWipe == FALSE) { - PlayerRespawn(pl, pl.team); - } else { - PlayerMakeSpectator(pl); - PlayerMakePlayable(pl, pl.charmodel); - } - - if (iWipe == FALSE) { - Money_GiveTeamReward(pl); - } else { - PlayerReset(pl); - } - } - for (entity eFind = world; (eFind = findfloat(eFind, ::team, TEAM_CT));) { - if (isClient(eFind) == false) { - continue; - } - - CSPlayer pl = (CSPlayer)eFind; - - if (pl.health > 0 && iWipe == FALSE) { - PlayerRespawn(pl, pl.team); - } else { - PlayerMakeSpectator(pl); - PlayerMakePlayable(pl, pl.charmodel); - } - - if (iWipe == FALSE) { - Money_GiveTeamReward(pl); - } else { - PlayerReset(pl); - } - } - - /* respawn the VIP as well, but turn them back into a CT. */ - for (entity eFind = world; (eFind = findfloat(eFind, ::team, TEAM_VIP));) { - if (isClient(eFind) == false) { - continue; - } - - CSPlayer pl = (CSPlayer)eFind; - pl.team = TEAM_CT; - - if (pl.health > 0 && iWipe == FALSE) { - PlayerRespawn(pl, TEAM_CT); - } else { - PlayerMakeSpectator(pl); - PlayerMakePlayable(pl, pl.charmodel); - } - - if (iWipe == FALSE) { - Money_GiveTeamReward(pl); - } else { - PlayerReset(pl); - } - } - - for (entity eFind = world; (eFind = find(eFind, ::classname, "tempdecal"));) { - NSDecal dec = (NSDecal)eFind; - dec.m_strTexture = ""; - dec.SendFlags = -1; - } - for (entity eFind = world; (eFind = find(eFind, ::classname, "item_c4"));) { - NSEntity e = (NSEntity)eFind; - e.Destroy(); - } - - WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); - WriteByte(MSG_MULTICAST, EV_CLEARDECALS); - msg_entity = world; - multicast([0,0,0], MULTICAST_ALL); - - // Select a random Terrorist for the bomb, if needed - if (g_cs_bombzones > 0) { - int iRandomT = floor(random(1, (float)g_cs_alive_t + 1)); - int iPickT = 0; - - for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - if (eFind.team == TEAM_T) { - iPickT++; - - if (iPickT == iRandomT) { - MakeBomber((CSPlayer)eFind); - } - } - } - } - - // If there is a VIP, select a random CT to be it - if (g_cs_vipzones > 0) { - int iRandomCT = floor(random(1, (float)g_cs_alive_ct + 1)); - int iPickCT = 0; - - for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - if (eFind.team == TEAM_CT) { - iPickCT++; - if (iPickCT == iRandomCT) { - MakeVIP((CSPlayer)eFind); - } - } - } - } - - // Respawn all the entities - for (entity a = world; (a = findfloat(a, ::identity, 1));) { - NSEntity caw = (NSEntity)a; - if (caw.classname != "player") - caw.Respawn(); - } - - /* clear the corpses/items/bombs */ - for (entity eFind = world; (eFind = find(eFind, ::classname, "remove_me"));) { - if (eFind.identity) { - NSEntity toRemove = (NSEntity)eFind; - toRemove.Destroy(); - } else { - remove(eFind); - } - } - -#ifdef BOT - CSBot_BuyStart(); -#endif - - TimerBegin(autocvar_mp_freezetime, GAME_FREEZE); - Money_ResetTeamReward(); -} - -/* -================= -RoundOver - -This happens whenever an objective is complete or time is up -================= -*/ -void -CSMultiplayerRules::RoundOver(int iTeamWon, int iMoneyReward, int fSilent) -{ - if (g_cs_gamestate != GAME_ACTIVE && g_cs_gamestate != GAME_FREEZE) { - return; - } - - if (iTeamWon == TEAM_T) { - if (fSilent == FALSE) { - Radio_BroadcastMessage(RADIO_TERWIN); - } - g_cs_roundswon_t++; - m_iSwapTeamRoundCounter++; - } else if (iTeamWon == TEAM_CT) { - if (fSilent == FALSE) { - Radio_BroadcastMessage(RADIO_CTWIN); - } - g_cs_roundswon_ct++; - m_iSwapTeamRoundCounter++; - - /* In Bomb Defusal, if Terrorists were able to plant the bomb - * but lose the round, all Terrorists receive an $800 bonus. */ - if (g_cs_bombplanted) { - Money_QueTeamReward(TEAM_T, 800); - } - } else { - if (fSilent == FALSE) { - Radio_BroadcastMessage(RADIO_ROUNDDRAW); - } - } - - Money_HandleRoundReward(iTeamWon); - Money_QueTeamReward(iTeamWon, iMoneyReward); - TimerBegin(5, GAME_END); // Round is over, 5 seconds til a new round starts - - g_cs_hostagesrescued = 0; - g_cs_bombbeingdefused = 0; - g_cs_bombplanted = 0; - g_cs_roundsplayed++; - - forceinfokey(world, "teamscore_1", sprintf("%i", g_cs_roundswon_t)); - forceinfokey(world, "teamscore_2", sprintf("%i", g_cs_roundswon_ct)); -} - -/* -================= -TimeOut - -Whenever mp_roundtime was being counted down to 0 -================= -*/ -void -CSMultiplayerRules::TimeOut(void) -{ - if (g_cs_vipzones > 0) { - RoundOver(TEAM_T, 3250, FALSE); - } else if (g_cs_bombzones > 0) { - /* In Bomb Defusal, all Counter-Terrorists receive $3250 - * if they won running down the time. */ - RoundOver(TEAM_CT, 3250, FALSE); - } else if (g_cs_hostagestotal > 0) { - // TODO: Broadcast_Print: Hostages have not been rescued! - RoundOver(TEAM_T, 3250, FALSE); - } else { - RoundOver(0, 0, FALSE); - } -} - -/* -================= -SwitchTeams - -Happens rarely -================= -*/ -void -CSMultiplayerRules::SwitchTeams(void) -{ - int iCTW, iTW; - - for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - CSPlayer pl = (CSPlayer)eFind; - if (pl.team == TEAM_CT) { - pl.team = TEAM_T; - pl.charmodel -= 4; - } else if (pl.team == TEAM_T) { - pl.team = TEAM_CT; - pl.charmodel += 4; - } - pl.SetInfoKey("*team", ftos(pl.team)); - } - - iCTW = g_cs_roundswon_ct; - iTW = g_cs_roundswon_t; - - g_cs_roundswon_t = iCTW; - g_cs_roundswon_ct = iTW; - - iCTW = g_cs_alive_ct; - iTW = g_cs_alive_t; - - g_cs_alive_ct = iTW; - g_cs_alive_t = iCTW; - - forceinfokey(world, "teamscore_1", sprintf("%i", g_cs_roundswon_t)); - forceinfokey(world, "teamscore_2", sprintf("%i", g_cs_roundswon_ct)); -} - -void -CSMultiplayerRules::CountPlayers(void) -{ - g_cs_alive_t = 0; - g_cs_alive_ct = 0; - g_cs_total_t = 0; - g_cs_total_ct = 0; - - for (entity eFind = world; (eFind = find(eFind, ::classname, "player"));) { - if (eFind.team == TEAM_T) { - g_cs_total_t++; - - if (eFind.health > 0) - g_cs_alive_t++; - } else if (eFind.team == TEAM_CT || eFind.team == TEAM_VIP) { - g_cs_total_ct++; - - if (eFind.health > 0) - g_cs_alive_ct++; - } - } - - g_total_players = g_cs_total_t + g_cs_total_ct; -} - -void -CSMultiplayerRules::DeathCheck(NSClientPlayer pl) -{ - if (g_cs_gamestate == GAME_END) - return; - - /* hack so that we can kill rounds */ - if ((g_cs_alive_t == 0) && (g_cs_alive_ct == 0)) { - g_cs_gamestate = GAME_ACTIVE; - } - - switch (g_cs_gamestate) { - case GAME_INACTIVE: - case GAME_COMMENCING: - case GAME_END: - case GAME_OVER: - return; - break; - } - - if ((g_cs_alive_t == 0) && (g_cs_alive_ct == 0)) { - if (g_cs_bombplanted == TRUE) { - RoundOver(TEAM_T, 3600, FALSE); - } else { - RoundOver(FALSE, 0, FALSE); - } - } else { - int winner; - if ((pl.team == TEAM_T) && (g_cs_alive_t == 0)) { - winner = TEAM_CT; - } else if ((pl.team == TEAM_CT) && (g_cs_alive_ct == 0)) { - winner = TEAM_T; - } else { - return; - } - - if (g_cs_bombzones > 0) { - /* In Bomb Defusal, the winning team receives $3250 - * if they won by eliminating the enemy team. */ - if (!g_cs_bombplanted || g_cs_alive_ct == 0) { - RoundOver(winner, 3250, FALSE); - } - } else { - /* In Hostage Rescue, the winning team receives $3600 - * if they won by eliminating the enemy team. */ - RoundOver(winner, 3600, FALSE); - } - } -} - -/* -================= -PlayerFindSpawn - -Recursive function that gets the next spawnpoint -================= -*/ -entity -CSMultiplayerRules::PlayerFindSpawn(float t) -{ - entity point = world; - - if (t == TEAM_T) { - m_eLastTSpawn = find(m_eLastTSpawn, ::classname, SPAWNPOINT_T); - - if (m_eLastTSpawn == world) { - m_eLastTSpawn = find(m_eLastTSpawn, ::classname, SPAWNPOINT_T); - } - point = m_eLastTSpawn; - } else if (t == TEAM_CT) { - m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, SPAWNPOINT_CT); - - if (m_eLastCTSpawn == world) { - m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, SPAWNPOINT_CT); - } - point = m_eLastCTSpawn; - } else if (t == TEAM_VIP) { - point = find(world, ::classname, "info_vip_start"); - - if (!point) - point = find(m_eLastTSpawn, ::classname, SPAWNPOINT_CT); - } - - if (point == world) { - error("Error: No valid spawnpoints available."); - } - - return point; -} - -/* -================= -PlayerRespawn - -Called whenever a player survived a round and needs a basic respawn. -================= -*/ -void -CSMultiplayerRules::PlayerRespawn(NSClientPlayer pp, int fTeam) -{ - CSPlayer pl = (CSPlayer)pp; - NSEntity eSpawn = (NSEntity)PlayerFindSpawn(pl.team); - - pl.MakePlayer(); - pl.GiveItem("item_suit"); - pl.SetOrigin(eSpawn.origin); - pl.SetAngles(eSpawn.angles); - Client_FixAngle(pl, pl.angles); - - CountPlayers(); - - pl.SetInfoKey("*icon1", ""); - pl.SetInfoKey("*icon1_r", "1"); - pl.SetInfoKey("*icon1_g", "1"); - pl.SetInfoKey("*icon1_b", "1"); - - /* VIP starts with 200 armor and an extra mag */ - if (pl.team == TEAM_VIP) { - pl.SetArmor(200); - pl.GiveItem("weapon_usp"); - } - -#ifndef CSSOURCE - switch (pl.charmodel) { - case 1: - pl.model = "models/player/terror/terror.mdl"; - break; - case 2: - pl.model = "models/player/leet/leet.mdl"; - break; - case 3: - pl.model = "models/player/arctic/arctic.mdl"; - break; - case 4: - pl.model = "models/player/guerilla/guerilla.mdl"; - break; - case 5: - pl.model = "models/player/urban/urban.mdl"; - break; - case 6: - pl.model = "models/player/gsg9/gsg9.mdl"; - break; - case 7: - pl.model = "models/player/sas/sas.mdl"; - break; - case 8: - pl.model = "models/player/gign/gign.mdl"; - break; - default: - pl.model = "models/player/vip/vip.mdl"; - } -#else - switch (pl.charmodel) { - case 1: - pl.model = "models/player/t_phoenix.mdl"; - break; - case 2: - pl.model = "models/player/t_leet.mdl"; - break; - case 3: - pl.model = "models/player/t_arctic.mdl"; - break; - case 4: - pl.model = "models/player/t_guerilla.mdl"; - break; - case 5: - pl.model = "models/player/ct_urban.mdl"; - break; - case 6: - pl.model = "models/player/ct_gsg9.mdl"; - break; - case 7: - pl.model = "models/player/ct_sas.mdl"; - break; - case 8: - pl.model = "models/player/ct_gign.mdl"; - break; - default: - pl.model = "models/player/vip/vip.mdl"; - } -#endif - - pl.SetModel(pl.model); - pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX); - - pl.ClearVelocity(); - pl.progress = 0.0f; - pl.SwitchToBestWeapon(false); - Ammo_AutoFill(pl); -} - -void -CSMultiplayerRules::PlayerClearWeaponry(NSClientPlayer pp) -{ - CSPlayer pl = (CSPlayer)pp; - - pl.g_items = 0x0; - pl.activeweapon = 0; - pl.viewzoom = 1.0f; - pl.m_bHasNightvision = false; -} - -void -CSMultiplayerRules::PlayerMakePlayable(NSClientPlayer pp, int chara) -{ - CSPlayer pl = (CSPlayer)pp; - - /* spectator */ - if (chara == 0) { - PlayerSpawn(pl); - return; - } - - pl.RemoveAllItems(false); - pl.ingame = TRUE; - pl.SetInfoKey("*team", ftos(pl.team)); - PlayerRespawn(pl, pl.team); - - /* terrorists */ - if (chara < 5) { - pl.team = TEAM_T; - - if (autocvar_fcs_knifeonly == FALSE) { - pl.GiveItem("weapon_glock18"); - pl.GiveAmmo(ammoNumForName("ammo_9mm"), 40); - } - } else { - pl.team = TEAM_CT; - - if (autocvar_fcs_knifeonly == FALSE) { - pl.GiveItem("weapon_usp"); - pl.GiveAmmo(ammoNumForName("ammo_45acp"), 24); - } - } - - pl.GiveItem("weapon_knife"); -} - -/* -================= -PlayerMakeSpectator - -Force the player to become an observer. -================= -*/ -void -CSMultiplayerRules::PlayerMakeSpectator(NSClientPlayer pp) -{ - CSPlayer pl = (CSPlayer)pp; - pl.MakeTempSpectator(); - PlayerClearWeaponry(pl); - pl.view_ofs = g_vec_null; -} - -/* -================= -PlayerReset - -Called when we give the initial starting money, and also when -another player joins and causes the game rules/scores to reset fully -================= -*/ -void -CSMultiplayerRules::PlayerReset(NSClientPlayer pl) -{ - CSPlayer p = (CSPlayer)pl; - - /* give the initial server-joining money */ - p.money = 0; - Money_AddMoney(pl, autocvar_mp_startmoney); - p.m_buyMessage = false; /* unset the buy message. */ - p.m_hostMessageT = false; - p.m_seenFriend = false; - p.m_seenEnemy = false; - p.m_seenHostage = false; - p.m_bHasNightvision = false; -} - -/* -================= -PlayerSpawn - -Called on the client first joining the server. -================= -*/ -void -CSMultiplayerRules::PlayerSpawn(NSClientPlayer pl) -{ - /* immediately put us into spectating mode */ - PlayerMakeSpectator(pl); - Spawn_ObserverCam(pl); - - PlayerReset(pl); - - /* we don't belong to any team */ - pl.team = TEAM_SPECTATOR; - pl.SetInfoKey("*team", "0"); -} - -bool -CSMultiplayerRules::ConsoleCommand(NSClientPlayer pp, string cmd) -{ - tokenize(cmd); - - switch (argv(0)) { - default: - return (false); - } - - return (true); -} - -bool -CSMultiplayerRules::IsTeamplay(void) -{ - return true; -} - -void -CSMultiplayerRules::CSMultiplayerRules(void) -{ - forceinfokey(world, "teams", "2"); - forceinfokey(world, "team_1", "Terrorist"); - forceinfokey(world, "teamscore_1", "0"); - forceinfokey(world, "teamcolor_1", "1 0 0" ); - forceinfokey(world, "team_2", "Counter-Terrorist"); - forceinfokey(world, "teamscore_2", "0"); - forceinfokey(world, "teamcolor_2", "0.25 0.25 1" ); - m_iEscapedTerrorists = 0; -} - -/* -================= -CSEv_JoinTeam_f - -Event Handling, called by the Client codebase via 'sendevent' -================= -*/ -void -CSEv_JoinTeam_f(float flChar) -{ - CSMultiplayerRules rules; - CSPlayer pl; - - /* matches Game_InitRules() */ - if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { - return; - } - - rules = (CSMultiplayerRules)g_grMode; - pl = (CSPlayer)self; - - /* VIPs cannot change teams... ? */ - if (pl.team == TEAM_VIP) { - centerprint(pl, "You are the VIP!\nYou cannot switch roles now.\n"); - return; - } - - if (pl.IsAlive()) { - rules.PlayerKill(pl); - } - - /* team switching, var reset */ - if (flChar < 5) { - pl.team = TEAM_T; - } else { - pl.team = TEAM_CT; - } - - pl.frags = 0; - pl.deaths = 0; - pl.SetInfoKey("*deaths", ftos(pl.deaths)); - pl.SetInfoKey("*team", ftos(pl.team)); - - switch (g_cs_gamestate) { - /* spawn the players immediately when its in the freeze state */ - case GAME_FREEZE: - pl.charmodel = (int)flChar; - rules.PlayerMakePlayable(pl, (int)flChar); - - if ((pl.team == TEAM_T) && (g_cs_alive_t == 1)) { - if (g_cs_bombzones > 0) { - rules.MakeBomber(pl); - } - } else if ((pl.team == TEAM_CT) && (g_cs_alive_ct == 1)) { - if (g_cs_vipzones > 0) { - rules.MakeVIP(pl); - } - } - - break; - /* otherwise, just prepare their fields for the next round */ - default: - if (flChar == 0) { - rules.PlayerSpawn(pl); - return; - } - - rules.PlayerMakeSpectator(pl); - pl.charmodel = (int)flChar; - pl.SetInfoKey("*dead", "1"); - break; - } - - rules.CountPlayers(); - - /* if no players are present in the chosen team, force restart round */ - if ((pl.team == TEAM_T) && (g_cs_alive_t == 0)) { - rules.RoundOver(FALSE, 0, FALSE); - } else if ((pl.team == TEAM_CT) && (g_cs_alive_ct == 0)) { - rules.RoundOver(FALSE, 0, FALSE); - } -} - -void -CSEv_JoinAuto(void) -{ - CSMultiplayerRules rules; - - /* matches Game_InitRules() */ - if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { - return; - } - - rules = (CSMultiplayerRules)g_grMode; - rules.CountPlayers(); - - if (g_cs_total_ct >= g_cs_total_t) { - CSEv_JoinTeam_f(floor(random(1,5))); - } else { - CSEv_JoinTeam_f(floor(random(5,9))); - } -} - -void -CSEv_JoinSpectator(void) -{ - NSClientPlayer pl = (NSClientPlayer)self; - ClientKill(); - pl.MakeSpectator(); -} diff --git a/src/server/gamerules_singleplayer.qc b/src/server/gamerules_singleplayer.qc deleted file mode 100644 index 9f5e977..0000000 --- a/src/server/gamerules_singleplayer.qc +++ /dev/null @@ -1,78 +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. - */ - -string -CSSingleplayerRules::Title(void) -{ - return "Singleplayer"; -} - -void -CSSingleplayerRules::PlayerDeath(NSClientPlayer pl) -{ - pl.movetype = MOVETYPE_NONE; - pl.solid = SOLID_NOT; - pl.takedamage = DAMAGE_NO; - pl.gflags &= ~GF_FLASHLIGHT; - pl.armor = pl.activeweapon = pl.g_items = 0; - - if (pl.health < -50) { - pl.health = 0; - //FX_GibHuman(pl.origin, vectoangles(pl.origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); - return; - } - - pl.health = 0; -} - -void -CSSingleplayerRules::PlayerSpawn(NSClientPlayer pl) -{ - pl.classname = "player"; - pl.health = pl.max_health = 100; - pl.takedamage = DAMAGE_YES; - pl.solid = SOLID_SLIDEBOX; - pl.movetype = MOVETYPE_WALK; - pl.flags = FL_CLIENT; - pl.viewzoom = 1.0; - pl.model = "models/player.mdl"; - setmodel(pl, pl.model); - - setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); - pl.velocity = [0,0,0]; - pl.gravity = __NULL__; - pl.frame = 1; - pl.SendFlags = UPDATE_ALL; - pl.customphysics = Empty; - pl.EnableBleeding(); - pl.SetInfoKey("*spec", "0"); - pl.SetInfoKey("*deaths", ftos(pl.deaths)); - - entity spot; - - if (startspot != "") { - dprint(sprintf("^3Gamerules_Spawn^7: Startspot is %s\n", startspot)); - LevelDecodeParms(pl); - setorigin(pl, Landmark_GetSpot()); - } else { - LevelNewParms(); - spot = find(world, ::classname, "info_player_start"); - setorigin(pl, spot.origin); - pl.angles = spot.angles; - } - - Client_FixAngle(pl, pl.angles); -} diff --git a/src/server/hostage_entity.qc b/src/server/hostage_entity.qc index ecba907..7ac4af0 100644 --- a/src/server/hostage_entity.qc +++ b/src/server/hostage_entity.qc @@ -81,7 +81,7 @@ enum class CSHostage:NSTalkMonster { - int m_iUsedOnce; + bool m_bUsedOnce; void CSHostage(void); @@ -91,13 +91,21 @@ class CSHostage:NSTalkMonster }; +void +CSHostage::CSHostage(void) +{ + Sound_Precache("hostage_entity.follow"); + m_bUsedOnce = false; +} + + void CSHostage::OnPlayerUse(void) { if (eActivator.team == TEAM_T) { CSPlayer pl = (CSPlayer)eActivator; - if (g_csMode.ShowHints() == true) + if (serverinfo.GetBool("cs_hints") == true) if (pl.m_hostMessageT == false) { env_message_single(pl, "Only_CT_Can_Move_Hostages"); pl.m_hostMessageT = true; @@ -110,9 +118,9 @@ CSHostage::OnPlayerUse(void) } /* CT reward, first time only */ - if (m_iUsedOnce == FALSE) { - Money_AddMoney((CSPlayer)eActivator, 150); - m_iUsedOnce = TRUE; + if (m_bUsedOnce == false) { + g_grMode.Input(eActivator, "HostageContacted", ""); + m_bUsedOnce = true; } NSTalkMonster::OnPlayerUse(); @@ -153,7 +161,7 @@ CSHostage::Pain(entity inflictor, entity attacker, int damageDealt, vector dir, return; } - Money_AddMoney((NSClientPlayer)attacker, -(damageDealt * 25i)); + g_grMode.Input(attacker, "HostageInjured", itos(damageDealt)); } void @@ -175,13 +183,7 @@ CSHostage::Death(entity inflictor, entity attacker, int damageDealt, vector dir, } if (isPlayer(attacker) == true) { - if (damageDealt >= 100) { - Money_AddMoney((NSClientPlayer)attacker, -2500); - } else { - Money_AddMoney((NSClientPlayer)attacker, -500); - } - - Radio_BroadcastMessage(RADIO_HOSDOWN); + g_grMode.Input(attacker, "HostageKilled", itos(damageDealt)); } } @@ -192,10 +194,3 @@ CSHostage::Death(entity inflictor, entity attacker, int damageDealt, vector dir, super::Death(inflictor, attacker, damageDealt, dir, location); SetSolid(SOLID_NOT); } - -void -CSHostage::CSHostage(void) -{ - Sound_Precache("hostage_entity.follow"); - g_cs_hostagestotal++; -} diff --git a/src/server/info_hostage_rescue.qc b/src/server/info_hostage_rescue.qc index a250e6c..2232972 100644 --- a/src/server/info_hostage_rescue.qc +++ b/src/server/info_hostage_rescue.qc @@ -72,14 +72,6 @@ info_hostage_rescue::Touch(entity eToucher) if (!((CSPlayer)hosty.m_eFollowing)) return; - Radio_BroadcastMessage(RADIO_RESCUED); - CSBot_HostageRescueNotify(); - g_cs_hostagesrescued++; - - Money_AddMoney((CSPlayer)hosty.m_eFollowing, 1000); - - /* In Hostage Rescue, all Counter-Terrorists receive an $850 - * bonus for every hostage they rescue, even if they lose the round. */ - Money_QueTeamReward(TEAM_CT, 850); + g_grMode.Input(hosty.m_eFollowing, "HostageRescued", ""); hosty.Disappear(); } diff --git a/src/server/money.h b/src/server/money.h deleted file mode 100644 index 477c28a..0000000 --- a/src/server/money.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2016-2019 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. - */ - -int g_cs_moneyreward_ct; -int g_cs_moneyreward_t; - -void Money_AddMoney(NSClientPlayer, int); -void Money_QueTeamReward(int, int); -void Money_GiveTeamReward(NSClientPlayer); -void Money_ResetTeamReward(void); -void Money_HandleRoundReward(int) -void Money_ResetRoundReward(void); -int Money_GetLosses(int); -int Money_HasBonus(int); diff --git a/src/server/progs.src b/src/server/progs.src index 16df440..568142d 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -1,6 +1,6 @@ #pragma target fte_5768 //#pragma flag enable assumeint -#pragma progs_dat "../../zpak001.pk3dir/progs.dat" +#pragma progs_dat "../../progs.dat" #define QWSSQC #define SERVER @@ -30,17 +30,7 @@ info_hostage_rescue.qc func_vip_safetyzone.qc info_map_parameters.qc ../../../src/botlib/include.src -bot.qc -game_money.qc -gamerules.qc -gamerules_singleplayer.qc -gamerules_deathmatch.qc -gamerules_multiplayer.qc -radio.qc -ammo.qc -buy.qc server.qc -../../../valve/src/server/flashlight.qc ../../../src/server/include.src ../../../src/shared/include.src #endlist diff --git a/src/server/radio.h b/src/server/radio.h deleted file mode 100644 index 2bbbfcb..0000000 --- a/src/server/radio.h +++ /dev/null @@ -1,20 +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 Radio_BroadcastMessage(float fMessage); -void Radio_TeamMessage(float fMessage, float fTeam); -float Radio_DefaultStart(void); -void Radio_StartMessage(void); diff --git a/src/server/radio.qc b/src/server/radio.qc index dd2732d..46df00c 100644 --- a/src/server/radio.qc +++ b/src/server/radio.qc @@ -52,8 +52,6 @@ Radio_TeamMessage(float fMessage, float fTeam) for (entity eFind = world; (eFind = find(eFind, classname, "player"));) { if (eFind.team == fTeam) { Radio_TeamMessage_Send(fMessage, eFind); - } else if (eFind.team == TEAM_VIP && fTeam == TEAM_CT) { - Radio_TeamMessage_Send(fMessage, eFind); } } } @@ -131,15 +129,11 @@ CSEv_Radio_f(float fMessage) // Make sure that VIPs and CTs get eachother float fTargetTeam = self.team; - if (fTargetTeam == TEAM_VIP) { - fTargetTeam = TEAM_CT; - } + for (entity eFind = world; (eFind = find(eFind, classname, "player"));) { if (eFind.team == fTargetTeam) { CSEv_Radio_Send(fMessage, self, eFind); - } else if (eFind.team == TEAM_VIP && fTargetTeam == TEAM_CT) { - CSEv_Radio_Send(fMessage, self, eFind); } } diff --git a/src/server/server.qc b/src/server/server.qc index fc586c7..c1daa49 100644 --- a/src/server/server.qc +++ b/src/server/server.qc @@ -18,30 +18,19 @@ void Game_InitRules(void) { if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { - g_grMode = spawn(CSSingleplayerRules); + g_grMode = NSGameRules::InitFromProgs("progs/singleplayer.dat"); } else { if (cvar("fcs_deathmatch") == 1) { - g_grMode = spawn(CSDeathmatchRules); + g_grMode = NSGameRules::InitFromProgs("progs/deathmatch.dat"); } else { - g_grMode = spawn(CSMultiplayerRules); + g_grMode = NSGameRules::InitFromProgs("progs/counterstrike.dat"); } } - - g_csMode = (CSGameRules)g_grMode; } void Game_Worldspawn(void) { - precache_model("models/player/arctic/arctic.mdl"); - precache_model("models/player/gign/gign.mdl"); - precache_model("models/player/gsg9/gsg9.mdl"); - precache_model("models/player/guerilla/guerilla.mdl"); - precache_model("models/player/leet/leet.mdl"); - precache_model("models/player/sas/sas.mdl"); - precache_model("models/player/terror/terror.mdl"); - precache_model("models/player/urban/urban.mdl"); - precache_model("models/player/vip/vip.mdl"); precache_sound("weapons/ric_metal-2.wav"); precache_sound("player/pl_pain2.wav"); precache_sound("player/pl_pain4.wav"); @@ -54,17 +43,5 @@ Game_Worldspawn(void) Sound_Precache("Player.FlashLightOff"); Sound_Precache("Player.FlashLightOn"); - /* some Counter-Strike maps do not have weapon pickups, so we want to - * precache these regardless in case of someone dropping a weapon, - * which happens quite often (buying weapons, etc.) */ - Sound_Precache("item.respawn"); - Sound_Precache("weapon.pickup"); - FX_Corpse_Init(); - - clientstat(STAT_MONEY, EV_INTEGER, CSPlayer::money); - clientstat(STAT_PROGRESS, EV_FLOAT, CSPlayer::progress); - - pointerstat(STAT_GAMETIME, EV_FLOAT, &g_cs_gametime); - pointerstat(STAT_GAMESTATE, EV_INTEGER, &g_cs_gamestate); } diff --git a/src/shared/animations.qc b/src/shared/animations.qc index 4c8daf5..4728056 100644 --- a/src/shared/animations.qc +++ b/src/shared/animations.qc @@ -40,7 +40,7 @@ void Animation_Print(string sWow) { } void -Animation_TimerUpdate(CSPlayer pl, float ftime) +Animation_TimerUpdate(HLPlayer pl, float ftime) { makevectors([0, pl.v_angle[1], 0]); @@ -65,7 +65,7 @@ depending on what the player is doing ================= */ void -Animation_PlayerUpdate(CSPlayer pl) +Animation_PlayerUpdate(HLPlayer pl) { pl.basebone = gettagindex(pl, "-- R shoulder outside"); @@ -128,7 +128,7 @@ Animation_PlayerUpdate(CSPlayer pl) } void -Animation_PlayerTop(CSPlayer pl, float topanim, float timer) +Animation_PlayerTop(HLPlayer pl, float topanim, float timer) { #if 0 pl.anim_top = topanim; @@ -138,7 +138,7 @@ Animation_PlayerTop(CSPlayer pl, float topanim, float timer) } void -Animation_PlayerBottom(CSPlayer pl, float botanim, float timer) +Animation_PlayerBottom(HLPlayer pl, float botanim, float timer) { pl.anim_bottom = botanim; } diff --git a/src/shared/defs.h b/src/shared/defs.h index 1c26c59..17f8d17 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -17,16 +17,13 @@ #include "animations.h" #include "radio.h" #include "buying.h" -#include "items.h" #include "entities.h" #include "events.h" #include "CSProjectile.h" #include "../../../valve/src/shared/HLWeapon.h" -#define TEAM_SPECTATOR 0 #define TEAM_T 1 #define TEAM_CT 2 -#define TEAM_VIP 3 enum { diff --git a/src/shared/include.src b/src/shared/include.src index 97bb5d3..e75fbb9 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -1,19 +1,18 @@ #includelist -flags.h -player.h -animations.h -animations.qc - -item_c4bomb.h - +../../../cstrike/src/shared/flags.h +../../../cstrike/src/shared/skeleton.h +../../../valve/src/shared/player.qc +../../../cstrike/src/shared/player.h +../../../cstrike/src/shared/animations.h +../../../cstrike/src/shared/animations.qc +../../../cstrike/src/shared/item_c4bomb.h ../../../valve/src/shared/fx_blood.qc ../../../valve/src/shared/fx_corpse.qc -fx_flashbang.qc -fx_smokenade.qc -item_c4bomb.qc -weapons_cstrike.qc -CSProjectile.qc +../../../cstrike/src/shared/fx_flashbang.qc +../../../cstrike/src/shared/fx_smokenade.qc +../../../cstrike/src/shared/item_c4bomb.qc +../../../cstrike/src/shared/weapons_cstrike.qc +../../../cstrike/src/shared/CSProjectile.qc ../../../valve/src/shared/HLWeapon.qc -CSWeapon.qc -pmove.qc +../../../cstrike/src/shared/CSWeapon.qc #endlist diff --git a/src/shared/item_c4bomb.qc b/src/shared/item_c4bomb.qc index 3ac239c..4e2d053 100644 --- a/src/shared/item_c4bomb.qc +++ b/src/shared/item_c4bomb.qc @@ -98,8 +98,6 @@ CSBombEntity::OnPlayerUse(void) void CSBombEntity::Logic(void) { - CSMultiplayerRules rules = (CSMultiplayerRules)g_grMode; - /* check if we're being used */ if (m_eUser != world) { CSPlayer pl = (CSPlayer)m_eUser; @@ -111,11 +109,11 @@ CSBombEntity::Logic(void) /* clear user */ m_eUser = world; m_flDefusalState = 0.0f; - g_cs_bombbeingdefused = FALSE; + serverinfo.SetBool("cs_bombbeingdefused", false); } else { /* defusal kit always cuts the time in half */ - if (pl.g_items & ITEM_DEFUSAL) + if (pl.HasItem("item_defuse")) m_flDefusalState += (frametime * 2); else m_flDefusalState += frametime; @@ -123,15 +121,13 @@ CSBombEntity::Logic(void) /* tracked stat */ pl.progress = m_flDefusalState; pl.AddVFlags(VFL_FROZEN); - - g_cs_bombbeingdefused = TRUE; + serverinfo.SetBool("cs_bombbeingdefused", true); } } if (m_flDefusalState > 10.0f) { StartSoundDef("weapon_c4bomb.disarmed", CHAN_VOICE, true); - rules.RoundOver(TEAM_CT, 3600, TRUE); - Radio_BroadcastMessage(RADIO_BOMBDEF); + g_grMode.Input(m_eUser, "BombDisarmed", ""); Destroy(); return; } @@ -140,12 +136,9 @@ CSBombEntity::Logic(void) if (m_flExplodeTime < time) { float bestDist = 9999.0f; NSEntity bestTarget = __NULL__; + g_grMode.Input(m_eUser, "BombExploded", ""); - /* In Bomb Defusal, all Terrorists receive $3500 - * if they won by detonating the bomb. */ - rules.RoundOver(TEAM_T, 3500, FALSE); - - radiusDamage(origin, -g_cstrike_bombradius, 0i, 500i, real_owner); + combat.RadiusDamage(origin, -g_cstrike_bombradius, 0i, 500i, real_owner, ""); //Damage_Radius(origin, this.real_owner, 500, g_cstrike_bombradius, false, WEAPON_C4BOMB); @@ -193,8 +186,8 @@ CSBombEntity::OnRemoveEntity(void) ClearProgress(); m_flBeepTime = 0.0f; m_flDefusalState = 0; - g_cs_bombbeingdefused = FALSE; - g_cs_bombplanted = false; + serverinfo.SetBool("cs_bombbeingdefused", false); + serverinfo.SetBool("cs_bombplanted", false); } void @@ -214,6 +207,7 @@ CSBombEntity::Spawned(void) PlayerUse = OnPlayerUse; m_flExplodeTime = time + 45.0f; StartSoundDef("c4.plant", CHAN_WEAPON, true); + serverinfo.SetBool("cs_bombplanted", true); } #endif diff --git a/src/shared/items.h b/src/shared/items.h deleted file mode 100644 index 1dc336f..0000000 --- a/src/shared/items.h +++ /dev/null @@ -1,51 +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 ITEM_KNIFE 0x00000001i -#define ITEM_USP45 0x00000002i -#define ITEM_GLOCK18 0x00000004i -#define ITEM_DEAGLE 0x00000008i -#define ITEM_P228 0x00000010i -#define ITEM_ELITES 0x00000020i -#define ITEM_FIVESEVEN 0x00000040i -#define ITEM_M3 0x00000080i - -#define ITEM_XM1014 0x00000100i -#define ITEM_MP5 0x00000200i -#define ITEM_P90 0x00000400i -#define ITEM_UMP45 0x00000800i -#define ITEM_MAC10 0x00001000i -#define ITEM_TMP 0x00002000i -#define ITEM_SUIT 0x00004000i -#define ITEM_FAMAS 0x00008000i - -#define ITEM_AK47 0x00010000i -#define ITEM_SG552 0x00020000i -#define ITEM_M4A1 0x00040000i -#define ITEM_AUG 0x00080000i -#define ITEM_SCOUT 0x00100000i -#define ITEM_AWP 0x00200000i -#define ITEM_G3SG1 0x00400000i -#define ITEM_SG550 0x00800000i - -#define ITEM_PARA 0x01000000i -#define ITEM_C4BOMB 0x02000000i -#define ITEM_FLASHBANG 0x04000000i -#define ITEM_HEGRENADE 0x08000000i -#define ITEM_SMOKEGRENADE 0x10000000i -#define ITEM_DEFUSAL 0x20000000i -#define ITEM_GALIL 0x40000000i -#define ITEM_HELMET 0x80000000i diff --git a/src/shared/player.h b/src/shared/player.h index bcf3d50..915a3d5 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -14,88 +14,47 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#ifdef CLIENT -/* Here's a list of bone names that we are aware of on HL player models. - Usually we'd use skeletalobjects to share the same skeleton/anim with - another model - but because FTEQW does not support that for HLMDL we - are forced to manually position the bones of our attachnment - by iterating over them and manually setting their position in 3D-space. -*/ -string g_pbones[] = +/** @brief Get entity by class name and index **/ +NSEntity +GetEntityByNameAndIndex(string name, int index) { - "Bip01", - "Bip01 Footsteps", - "Bip01 Pelvis", - "Bip01 L Leg", - "Bip01 L Leg1", - "Bip01 L Foot", - "Bip01 L Toe0", - "Bip01 L Toe01", - "Bip01 L Toe02", - "Dummy16", - "Bip01 R Leg", - "Bip01 R Leg1", - "Bip01 R Foot", - "Bip01 R Toe0", - "Bip01 R Toe01", - "Bip01 R Toe02", - "Dummy11", - "Bip01 Spine", - "Bip01 Spine1", - "Bip01 Spine2", - "Bip01 Spine3", - "Bip01 Neck", - "Bip01 Head", - "Dummy21", - "Dummy08", - "Bone02", - "Bone03", - "Bone04", - "Dummy05", - "Bone09", - "Bone10", - "Dummy04", - "Bone05", - "Bone06", - "Dummy03", - "Bone07", - "Bone08", - "Dummy09", - "Bone11", - "Bone12", -"Dummy10", - "Bone13", - "Bone14", - "Bone15", - "Bip01 L Arm", - "Bip01 L Arm1", - "Bip01 L Arm2", - "Bip01 L Hand", - "Bip01 L Finger0", - "Bip01 L Finger01", - "Bip01 L Finger02", - "Dummy06", - "Bip01 L Finger1", - "Bip01 L Finger11", - "Bip01 L Finger12", - "Dummy07", - "Bip01 R Arm", - "Bip01 R Arm1", - "Bip01 R Arm2", - "Bip01 R Hand", - "Bip01 R Finger0", - "Bip01 R Finger01", - "Bip01 R Finger02", - "Dummy01", - "Bip01 R Finger1", - "Bip01 R Finger11", - "Bip01 R Finger12", - "Dummy02", - "Box02", - "Bone08", - "Bone15" -}; -#endif + int curIndex = 0; + for (entity a = world; (a = find(a, ::classname, name));) { + if (curIndex == index) { + return (NSEntity)a; + } + ++curIndex; + } + print("WARNING: cstrike/server/bot.qc GetEntityByNameAndIndex: no entity '", + name, "' with index ", itos(index), "!\n"); + return __NULL__; +} + +/** @brief Get bombsite entity by bombsite index + * + * @note + * When there are for example 2 bombsites (g_cs_bombzones == 2) then valid + * indexes would be 0 and 1. + * */ +NSEntity +GetBombsiteByIndex(int index) +{ + return GetEntityByNameAndIndex("func_bomb_target", index); +} + +/** @brief Get Escape Zone entity by index **/ +NSEntity +GetEscapeZoneByIndex(int index) +{ + return GetEntityByNameAndIndex("func_escapezone", index); +} + +/** @brief Get VIP Safety Zone entity by index **/ +NSEntity +GetVIPSafetyZoneByIndex(int index) +{ + return GetEntityByNameAndIndex("func_vip_safetyzone", index); +} /* all potential SendFlags bits we can possibly send */ enumflags @@ -105,27 +64,23 @@ enumflags PLAYER_CSTIMERS = PLAYER_CUSTOMFIELDSTART }; -class CSPlayer:NSClientPlayer +class +CSPlayer:HLPlayer { int ingame; + void CSPlayer(void); + PREDICTED_FLOAT(cs_shotmultiplier) PREDICTED_FLOAT(cs_shottime) PREDICTED_FLOAT(cs_prev_hor_rec) PREDICTED_INT(cs_hor_rec_sign) PREDICTED_FLOAT(cs_rec_reverse_chance) - PREDICTED_FLOAT(anim_top) - PREDICTED_FLOAT(anim_top_time) - PREDICTED_FLOAT(anim_top_delay) - PREDICTED_FLOAT(anim_bottom) - PREDICTED_FLOAT(anim_bottom_time) - virtual void(float) Physics_Fall; virtual void(void) Physics_Jump; virtual void(void) Physics_InputPostMove; - virtual void UpdatePlayerAnimation(float); #ifdef CLIENT int playertype; @@ -134,17 +89,29 @@ class CSPlayer:NSClientPlayer int cs_cross_deltadist; float cs_crosshairdistance; - virtual void UpdatePlayerAttachments(bool); virtual void ReceiveEntity(float, float); virtual void PredictPreFrame(void); virtual void PredictPostFrame(void); - virtual void UpdateAliveCam(void); - virtual void ClientInputFrame(void); #else + virtual void Input(entity, string, string); virtual void ServerInputFrame(void); virtual void EvaluateEntity(void); virtual float SendEntity(entity, float); + nonvirtual void Bot_RunToConfront(void); + nonvirtual void Bot_RunToBomb(void); + nonvirtual void Bot_RunToBombsite(int); + nonvirtual void Bot_RunToRandomBombsite(void); + nonvirtual void Bot_RunToEscapeZone(int); + nonvirtual void Bot_RunToRandomEscapeZone(void); + nonvirtual void Bot_RunToVIPSafetyZone(int); + nonvirtual void Bot_RunToRandomVIPSafetyZone(void); + nonvirtual void Bot_RunToHostages(void); + nonvirtual void Bot_Roam(vector, int); + nonvirtual void Bot_CreateObjective(void); + nonvirtual void Bot_Buy(void); + nonvirtual void Bot_AimLerp(vector, float); + int charmodel; int money; float progress; @@ -156,9 +123,54 @@ class CSPlayer:NSClientPlayer bool m_seenHostage; bool m_seenBombSite; bool m_bHasNightvision; + + /* bot related vars */ + int m_actionIsPlanting; + int m_actionIsDefusing; + + /* Workaround: + * gflags is not yet set when CSBot_BuyStart_Shop() or Bot_CreateObjective() + * are called, so we back it up on PostFrame() and use that instead. + * Known issues it solves: + * - Check if the bot is in a Bomb Zone (gflags & GF_BOMBZONE) + * - Check if the bot is in a Buy Zone (gflags & GF_BUYZONE) */ + int m_gflagsBackup; #endif }; +void +CSPlayer::CSPlayer(void) +{ + ingame = false; + cs_shotmultiplier = 0; + cs_shottime = 0; + cs_prev_hor_rec = 0; + cs_hor_rec_sign = 0; + cs_rec_reverse_chance = 0; + +#ifdef CLIENT + playertype = 0; + cs_cross_mindist = 0; + cs_cross_deltadist = 0; + cs_crosshairdistance = 0; +#else + charmodel = 0; + money = 0; + progress = 0; + m_buyMessage = 0; + m_hostMessageT = 0; + m_seenFriend = 0; + m_seenEnemy = 0; + m_seenHostage = 0; + m_seenBombSite = 0; + m_bHasNightvision = 0; + /* bot related maps */ + m_actionIsPlanting = FALSE; + m_actionIsDefusing = FALSE; + m_gflagsBackup = 0; +#endif +} + float punchangle_recovery(float punchangle) { return 0.05 * (-0.2 * pow(1.2, fabs(punchangle)) + 4); } @@ -183,166 +195,20 @@ CSPlayer::Physics_InputPostMove(void) RemoveVFlags(VFL_FROZEN); RemoveVFlags(VFL_NOATTACK); -#ifdef SERVER - if (g_cs_gamestate == GAME_FREEZE) { -#else - if (getstati(STAT_GAMESTATE) == GAME_FREEZE) { -#endif + if (serverkeyfloat("cs_gamestate") == GAME_FREEZE) { AddVFlags(VFL_FROZEN); AddVFlags(VFL_NOATTACK); if (input_buttons & INPUT_BUTTON0) { w_attack_next = (w_attack_next > 0.1) ? w_attack_next : 0.1f; } - } + ProcessInput(); } - -void Animation_PlayerUpdate(CSPlayer); -void Animation_TimerUpdate(CSPlayer, float); - -void -CSPlayer::UpdatePlayerAnimation(float timelength) -{ - /* calculate our skeletal progression */ - Animation_PlayerUpdate(this); - /* advance animation timers */ - Animation_TimerUpdate(this, timelength); -} - #ifdef CLIENT -void -CSPlayer::ClientInputFrame(void) -{ - if (pSeatLocal->weaponSelectionHUD.Active()) { - if (input_buttons & INPUT_PRIMARY) { - pSeatLocal->weaponSelectionHUD.Trigger(); - } else if (input_buttons & INPUT_SECONDARY) { - pSeatLocal->weaponSelectionHUD.Deactivate(); - } - pSeat->m_flInputBlockTime = time + 0.2; - } - super::ClientInputFrame(); -} - -void Camera_RunPosBob(vector angles, __inout vector camera_pos); -void Camera_StrafeRoll(__inout vector camera_angle); -void Shake_Update(NSClientPlayer); - -void -CSPlayer::UpdateAliveCam(void) -{ - vector cam_pos = GetEyePos(); - Camera_RunPosBob(view_angles, cam_pos); - - g_view.SetCameraOrigin(cam_pos); - Camera_StrafeRoll(view_angles); - g_view.SetCameraAngle(view_angles); - - if (vehicle) { - NSVehicle veh = (NSVehicle)vehicle; - - if (veh.UpdateView) - veh.UpdateView(); - } else if (health) { - if (autocvar_pm_thirdPerson == TRUE) { - makevectors(view_angles); - vector vStart = [pSeat->m_vecPredictedOrigin[0], pSeat->m_vecPredictedOrigin[1], pSeat->m_vecPredictedOrigin[2] + 16] + (v_right * 4); - vector vEnd = vStart + (v_forward * -48) + [0,0,16] + (v_right * 4); - traceline(vStart, vEnd, FALSE, this); - g_view.SetCameraOrigin(trace_endpos + (v_forward * 5)); - } - } - - Shake_Update(this); - g_view.AddPunchAngle(punchangle); -} - -.string oldmodel; -///string Weapons_GetPlayermodel(NSClientPlayer, int); - -void -CSPlayer::UpdatePlayerAttachments(bool visible) -{ - /* draw the flashlight */ - if (gflags & GF_FLASHLIGHT) { - vector src; - vector ang; - - if (entnum != player_localentnum) { - src = origin + view_ofs; - ang = v_angle; - } else { - src = pSeat->m_vecPredictedOrigin + [0,0,-8]; - ang = view_angles; - } - - makevectors(ang); - traceline(src, src + (v_forward * 8096), MOVE_NORMAL, this); - - if (serverkeyfloat("*bspversion") == BSPVER_HL) { - dynamiclight_add(trace_endpos + (v_forward * -2), 128, [1,1,1]); - } else { - float p = dynamiclight_add(src, 512, [1,1,1], 0, "textures/flashlight"); - dynamiclight_set(p, LFIELD_ANGLES, ang); - dynamiclight_set(p, LFIELD_FLAGS, 3); - } - } - - /* FIXME: this needs to be incorporated and simplified, now that we can handle it all in-class */ - if (!visible) - return; - - /* what's the current weapon model supposed to be anyway? */ - p_model.oldmodel = 0;//Weapons_GetPlayermodel(this, activeweapon); - - /* we changed weapons, update skeletonindex */ - if (p_model.model != p_model.oldmodel) { - /* free memory */ - if (p_model.skeletonindex) - skel_delete(p_model.skeletonindex); - - /* set the new model and mark us updated */ - setmodel(p_model, p_model.oldmodel); - p_model.model = p_model.oldmodel; - - /* set the new skeletonindex */ - p_model.skeletonindex = skel_create(p_model.modelindex); - - /* hack this thing in here FIXME: this should be done when popping in/out of a pvs */ - if (autocvar(cl_himodels, 1, "Use high-quality thisayer models over lower-definition ones")) - setcustomskin(this, "", "geomset 0 2\n"); - else - setcustomskin(this, "", "geomset 0 1\n"); - } - - /* follow thisayer at all times */ - setorigin(p_model, origin); - p_model.angles = angles; - skel_build(p_model.skeletonindex, p_model, p_model.modelindex,0, 0, -1); - - /* we have to loop through all valid bones of the weapon model and match them - * to the thisayer one */ - for (float i = 0; i < g_pbones.length; i++) { - vector bpos; - float pbone = gettagindex(this, g_pbones[i]); - float wbone = gettagindex(p_model, g_pbones[i]); - - /* if the bone doesn't ignore in either skeletal mesh, ignore */ - if (wbone <= 0 || pbone <= 0) - continue; - - bpos = gettaginfo(this, pbone); - - /* the most expensive bit */ - skel_set_bone_world(p_model, wbone, bpos, v_forward, v_right, v_up); - } -} - -void HUD_AmmoNotify_Check(CSPlayer pl); /* ================= CSPlayer::ReceiveEntity @@ -351,7 +217,7 @@ CSPlayer::ReceiveEntity void CSPlayer::ReceiveEntity(float flIsNew, float flChanged) { - super::ReceiveEntity(flIsNew, flChanged); + NSClientPlayer::ReceiveEntity(flIsNew, flChanged); /* animation */ READENTITY_BYTE(anim_top, PLAYER_TOPFRAME) @@ -393,11 +259,6 @@ CSPlayer::PredictPreFrame(void) SAVE_STATE(cs_prev_hor_rec) SAVE_STATE(cs_hor_rec_sign) SAVE_STATE(cs_rec_reverse_chance) - SAVE_STATE(anim_top) - SAVE_STATE(anim_top_time) - SAVE_STATE(anim_top_delay) - SAVE_STATE(anim_bottom) - SAVE_STATE(anim_bottom_time) } /* @@ -417,14 +278,429 @@ CSPlayer::PredictPostFrame(void) ROLL_BACK(cs_prev_hor_rec) ROLL_BACK(cs_hor_rec_sign) ROLL_BACK(cs_rec_reverse_chance) - ROLL_BACK(anim_top) - ROLL_BACK(anim_top_time) - ROLL_BACK(anim_top_delay) - ROLL_BACK(anim_bottom) - ROLL_BACK(anim_bottom_time) } #else +/** @brief Aim towards a given (vector)aimpos with a given (float)lerp speed. + * + * @note + * Copied code from nuclide botlib (inside bot::RunAI), maybe make this a + * method there, could be usefull for other stuff? + **/ +void CSPlayer::Bot_AimLerp(vector aimpos, float flLerp) { + vector aimdir, vecNewAngles; + + vector oldAngle = v_angle; + + /* that's the old angle */ + vecNewAngles = anglesToForward(v_angle); + + /* aimdir = new final angle */ + aimdir = vectorToAngles(aimpos - origin); + + /* slowly lerp towards the final angle */ + vecNewAngles = vectorLerp(vecNewAngles, anglesToForward(aimdir), flLerp); + + /* make sure we're aiming tight */ + v_angle = vectorToAngles(vecNewAngles); + input_angles = angles = v_angle = fixAngle(v_angle); +} + +void +CSPlayer::Bot_RunToConfront(void) +{ + entity t; + + if (team == TEAM_T) { + t = Route_SelectRandom(teams.SpawnPoint(TEAM_CT)); + } else { + t = Route_SelectRandom(teams.SpawnPoint(TEAM_T)); + } + + ChatSayTeam("Going to run to the Enemy Spawn!"); + + if (t) + RouteToPosition(t.origin); +} +/* go to the planted bomb */ +void +CSPlayer::Bot_RunToBomb(void) +{ + NSEntity e = __NULL__; + e = (NSEntity)find(e, ::model, "models/w_c4.mdl"); + + if (e) { + RouteToPosition(e.WorldSpaceCenter()); + ChatSayTeam("Going to run to the Bomb!"); + } +} + +/* go to given bombsite */ +void +CSPlayer::Bot_RunToBombsite(int bombsiteIndex) +{ + NSEntity e = GetBombsiteByIndex(bombsiteIndex); + RouteToPosition(e.WorldSpaceCenter()); + ChatSayTeam(strcat("Going to run to Bomb Site ", itos(bombsiteIndex), "!")); +} + +/* go to random bombsite */ +void +CSPlayer::Bot_RunToRandomBombsite(void) +{ + Bot_RunToBombsite(random(0, serverinfo.GetInteger("cs_bombzones"))); +} + +/* go to given escape zone */ +void +CSPlayer::Bot_RunToEscapeZone(int index) +{ + NSEntity e = GetEscapeZoneByIndex(index); + RouteToPosition(e.WorldSpaceCenter()); + ChatSayTeam(strcat("Going to run to Escape Zone ", itos(index), "!")); +} + +/* go to a random escape zone */ +void +CSPlayer::Bot_RunToRandomEscapeZone(void) +{ + Bot_RunToEscapeZone(random(0, serverinfo.GetInteger("cs_escapezones"))); +} + +/* go to given VIP Safety Zone */ +void +CSPlayer::Bot_RunToVIPSafetyZone(int index) +{ + NSEntity e = GetVIPSafetyZoneByIndex(index); + RouteToPosition(e.WorldSpaceCenter()); + ChatSayTeam(strcat("Going to run to VIP Safety Zone ", itos(index), "!")); +} + +/* go to a random VIP Safety Zone */ +void +CSPlayer::Bot_RunToRandomVIPSafetyZone(void) +{ + Bot_RunToVIPSafetyZone(random(0, serverinfo.GetInteger("cs_vipzones"))); +} + +void +CSPlayer::Bot_RunToHostages(void) +{ + NSEntity e = __NULL__; + + e = (NSEntity)find(e, ::classname, "hostage_entity"); + + RouteToPosition(e.origin); + ChatSayTeam("Going to run to the hostages!"); +} + +/** @brief Let the bot roam within a maximum distance from a given origin. */ +void CSPlayer::Bot_Roam(vector roamOrigin, int maxDistance) { + /* Get random point whitin a radius from the given origin */ + int angle = random(0, 360); /* random angle. */ + int distance = random(0, maxDistance); /* random distance */ + float radian = angle * 3.145238095238 / 180; + vector randLoc = roamOrigin; + randLoc.x += sin(radian) * distance; + randLoc.y += cos(radian) * distance; + + /* Go to the random waypoint. */ + RouteToPosition(Nodes_PositionOfClosestNode(randLoc)); +} + +void +CSPlayer::Bot_CreateObjective(void) +{ + /* Bomb defuse map */ + if (serverinfo.GetInteger("cs_bombzones") > 0) { + /* Bomb is planted */ + if (serverinfo.GetBool("cs_bombplanted")) { + entity eBomb = find(world, ::model, "models/w_c4.mdl"); + if (eBomb == world) { + /* No bomb model found, but it is/was planted */ + + /* RoundOver: Bomb is defused */ + if (serverkeyfloat("cs_gamestate") == GAME_END) { + Bot_RunToRandomBombsite(); + return; + } + + /* Error */ + print("WARNING! g_cs_bombplanted == TRUE, but bomb model " + "cannot be found in the world.\n"); + return; + } + + if (team == TEAM_CT) { + if (serverinfo.GetBool("cs_bombbeingdefused") && m_actionIsDefusing == FALSE) { + /* Bomb is being defused but not by this bot */ + /* Go and roam the defuser */ + Bot_Roam(eBomb.origin, 300); + return; + } + + if (m_actionIsDefusing) { + if (serverinfo.GetBool("cs_bombbeingdefused") == false) { + /* Defusing complete or somehow failed. */ + m_actionIsDefusing = FALSE; + } else { + /* Continue defusing. */ + input_buttons |= (INPUT_BUTTON5 | INPUT_BUTTON8); + input_movevalues = [0,0,0]; + button5 = input_buttons & INPUT_BUTTON5; // don't release button5 + } + } + else { + int distToBomb = floor(vlen(eBomb.origin - origin)); + if (distToBomb > 60) { + /* To far away from the bomb to defuse it, run to it! */ + Bot_RunToBomb(); + } else { + /* Aim at the bomb. */ + input_buttons |= INPUT_BUTTON8; // duck + if ((HasVFlags(VFL_ONUSABLE))) { + // Aimed at the bomb, ready to defuse! + ChatSayTeam("Defusing!"); + input_buttons |= INPUT_BUTTON5; + input_movevalues = [0,0,0]; + button5 = input_buttons & INPUT_BUTTON5; // don't release button5 + m_actionIsDefusing = TRUE; + } else { + // Do the real aiming + float flLerp = bound(0.0f, frametime * 45, 1.0f); // aim speed + Bot_AimLerp(eBomb.origin + [0, 0, -6], flLerp); + } + } + } + } + /* team == TEAM_T */ + else { + /* Let T bots roam around the planted bomb */ + Bot_Roam(eBomb.origin, 500); + } + return; + } + /* Bomb is NOT planted */ + else { + if (team == TEAM_T) { + /* T-bot: plant bomb */ + if (HasItem("weapon_c4")) { + /* We carry the bomb */ + if (m_gflagsBackup & GF_BOMBZONE) { + /* We are at a bombsite and ready to plant the bomb */ + if (GetCurrentWeapon() != "weapon_c4") { + /* TODO: REPLACE THIS WITH NSNAVAI METHOD */ + SwitchToWeapon("weapon_c4"); + //Weapons_Draw((CSPlayer)self); + } + + if (!m_actionIsPlanting) { + ChatSayTeam("Going to plant the bomb!"); + m_actionIsPlanting = TRUE; + } + + /* Workaround */ + gflags = m_gflagsBackup; + + /* Duck and plant bomb. */ + input_buttons = (INPUT_BUTTON0 | INPUT_BUTTON8); + input_movevalues = [0,0,0]; + } + else { + /* Go to a bombsite first */ + Bot_RunToRandomBombsite(); + } + return; + } + else { + /* T-bot: check if the bomb has been dropped */ + NSEntity e = (NSEntity)find(world, ::model, "models/w_backpack.mdl"); + + if (e != __NULL__) { + /* The bomb backpack has been dropped */ + /* Go fetch dropped bomb! */ + ChatSayTeam("Arrr! Bomb on the ground, going to fetch it!"); + RouteToPosition(e.WorldSpaceCenter()); + return; + } + } + } + } + } + + if (serverinfo.GetInteger("cs_escapezones") > 0i && team == TEAM_T) { + Bot_RunToRandomEscapeZone(); + return; + } + + if (random() < 0.5 && serverinfo.GetInteger("cs_escapezones") > 0i && team == TEAM_CT) { + Bot_RunToRandomEscapeZone(); + return; + } + + if (serverinfo.GetInteger("cs_vipzones") > 0i && team == TEAM_CT) { + Bot_RunToRandomVIPSafetyZone(); + return; + } + + if (random() < 0.5 && serverinfo.GetInteger("cs_vipzones") > 0i && team == TEAM_T) { + Bot_RunToRandomVIPSafetyZone(); + return; + } + + if (random() < 0.5) { + if (serverinfo.GetInteger("cs_hostages") > 0) { + Bot_RunToHostages(); + } + if (serverinfo.GetInteger("cs_bombzones") > 0) { + Bot_RunToRandomBombsite(); + } + } else { + Bot_RunToConfront(); + } +} + +float ConsoleCmd(string cmd); + +void +CSPlayer::Bot_Buy(void) +{ + int done = 0; + int count = 0; + CSPlayer pl = (CSPlayer)self; + int playerMoney = userinfo.GetInteger(pl, "*money"); + string weaponToBuy = ""; + int weaponPrice = 0i; + + if (pl.team == TEAM_T) { + weaponToBuy = userinfo.GetString(pl, "fav_primary_ct"); + } else if (pl.team == TEAM_CT) { + weaponToBuy = userinfo.GetString(pl, "fav_primary_t"); + } + + /* Workaround */ + pl.gflags = m_gflagsBackup; + + if (STRING_SET(weaponToBuy)) { + weaponPrice = entityDef.GetInteger(weaponToBuy, "price"); + + if (weaponPrice <= userinfo.GetInteger(pl, "*money")) { + ConsoleCmd(strcat("buy ", weaponToBuy)); + playerMoney = userinfo.GetInteger(pl, "*money"); + } else { + weaponToBuy = ""; + } + } + + + /* CT: Random buy bomb defuse kit when enough money left */ + if (pl.team == TEAM_CT && serverinfo.GetInteger("cs_bombzones") > 0 && + entityDef.GetInteger("item_defuse", "price") <= playerMoney && + random() < 0.5) + { + ConsoleCmd("item_defuse"); + playerMoney = userinfo.GetInteger(pl, "*money"); + } + + /* need armor */ + if (pl.armor < 100) { + if (playerMoney >= entityDef.GetInteger("item_kevlar_helmet", "price")) { + ConsoleCmd("buy item_kevlar_helmet"); + } else if (playerMoney >= entityDef.GetInteger("item_kevlar", "price")) { + ConsoleCmd("buy item_kevlar"); + } + } else if (pl.HasItem("item_kevlar_helmet") == false) { + if (playerMoney >= 350) { + ConsoleCmd("buy item_kevlar_helmet"); + } + } + + if (STRING_SET(weaponToBuy)) { + SwitchToWeapon(weaponToBuy); + } + + /* force buy right now */ + ConsoleCmd("buyammo 0"); + ConsoleCmd("buyammo 1"); +} + + +void +CSPlayer::Input(entity eAct, string strInput, string strData) +{ + switch (strInput) { + case "RadioMessage": + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, EV_RADIOMSG); + WriteByte(MSG_MULTICAST, stof(strData)); + msg_entity = this; + multicast([0,0,0], MULTICAST_ONE); + break; + case "RadioTeamMessage": + tokenize(strData); + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, EV_RADIOMSG2); + WriteByte(MSG_MULTICAST, stof(argv(0))); + WriteByte(MSG_MULTICAST, stof(argv(1))); + msg_entity = this; + multicast([0,0,0], MULTICAST_ONE); + break; + case "NotifyBuyStart": + if (IsAlive() == false) { + return; + } + + ScheduleThink(Bot_Buy, random(0, cvars.GetFloat("mp_freezetime"))); + break; + case "NotifyRoundStarted": + if (clienttype(this) != CLIENTTYPE_REAL) { + if (IsAlive() == false) { + return; + } + + if (GetTeam() == TEAM_T) { + return; + } + + Bot_RunToRandomBombsite(); + } + break; + case "NotifyRoundRestarted": + /* bot stuff */ + m_actionIsPlanting = FALSE; + m_actionIsDefusing = FALSE; + break; + case "NotifyBombPlanted": + if (clienttype(this) != CLIENTTYPE_REAL) { + if (IsAlive() == false) { + return; + } + + if (GetTeam() == TEAM_T) { + return; + } + + Bot_RunToRandomBombsite(); + } + break; + case "NotifyHostageRescued": + if (clienttype(this) != CLIENTTYPE_REAL) { + if (IsAlive() == false) { + return; + } + + if (GetTeam() == TEAM_T) { + return; + } + + Bot_RunToHostages(); + } + break; + default: + super::Input(eAct, strInput, strData); + } +} + void CSPlayer::ServerInputFrame(void) { @@ -465,7 +741,7 @@ CSPlayer::SendEntity(entity ePEnt, float flChanged) flChanged = OptimiseChangedFlags(ePEnt, flChanged); - super::SendEntity(ePEnt, flChanged); + NSClientPlayer::SendEntity(ePEnt, flChanged); SENDENTITY_BYTE(anim_top, PLAYER_TOPFRAME) SENDENTITY_FLOAT(anim_top_time, PLAYER_TOPFRAME) @@ -481,3 +757,50 @@ CSPlayer::SendEntity(entity ePEnt, float flChanged) return (1); } #endif + +void +CSPlayer::Physics_Fall(float impactspeed) +{ + /* apply some predicted punch to the player */ + if (impactspeed >= 580) + punchangle += [15,0,(input_sequence & 1) ? 15 : -15]; + else if (impactspeed >= 400) + punchangle += [15,0,0]; + + impactspeed *= 1.25f; + + /* basic server-side falldamage */ +#ifdef SERVER + /* if we've reached a fallheight of PHY_FALLDMG_DISTANCE qu, start applying damage */ + if (impactspeed >= 580) { + float impactDamage = (impactspeed - 580) * (100 / (1024 - 580)) * 0.75f; + + /* this is kinda ugly, but worth the price */ + NSDict damageDecl = spawn(NSDict); + damageDecl.AddKey("damage", ftos((int)impactDamage)); + Damage(this, this, damageDecl, 1.0, g_vec_null, origin); + remove(damageDecl); + StartSoundDef("Player.FallDamage", CHAN_VOICE, true); + } else if (impactspeed >= 400) { + StartSoundDef("Player.LightFall", CHAN_VOICE, true); + } +#endif +} + +void +CSPlayer::Physics_Jump(void) +{ + if (waterlevel >= 2) { + if (watertype == CONTENT_WATER) { + velocity[2] = 100; + } else if (watertype == CONTENT_SLIME) { + velocity[2] = 80; + } else { + velocity[2] = 50; + } + } else { + /* slow the player down a bit to prevent bhopping like crazy */ + velocity *= 0.80f; + velocity[2] += 260; + } +} diff --git a/src/shared/pmove.qc b/src/shared/pmove.qc deleted file mode 100644 index 9a67b0a..0000000 --- a/src/shared/pmove.qc +++ /dev/null @@ -1,75 +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. - */ - -#define PMOVE_STEPHEIGHT 18 -#define PMOVE_AIRSTEPHEIGHT 0 -#define PMOVE_FRICTION 4 -#define PMOVE_EDGEFRICTION 1 -#define PMOVE_STOPSPEED 75 -#define PMOVE_GRAVITY 800 -#define PMOVE_AIRACCELERATE 10 -#define PMOVE_WATERACCELERATE 8 -#define PMOVE_ACCELERATE 4 -#define PMOVE_MAXSPEED 250 -#define PMOVE_STEP_WALKSPEED 270 -#define PMOVE_STEP_CROUCHSPEED 90 -#define PMOVE_BOXCENTER true -#define PMOVE_NORMAL_HEIGHT 72 -#define PMOVE_NORMAL_VIEWHEIGHT 54 -#define PMOVE_CROUCH_HEIGHT 36 -#define PMOVE_CROUCH_VIEWHEIGHT 30 - -/* disable prone, run and lean */ -#define PMOVE_STEP_RUNSPEED 0 -#define PMOVE_PRONE_HEIGHT 0 - -.float waterlevel; -.float watertype; - -void -CSPlayer::Physics_Fall(float impactspeed) -{ - impactspeed *= 1.25f; - if (impactspeed > 580) { -#ifdef SERVER - float fFallDamage = (impactspeed - 580) * (100 / (1024 - 580)) * 0.75f; - //Damage_Apply(this, world, fFallDamage, 0, DMG_FALL | DMG_SKIP_ARMOR); - - if (random() < 0.5) - sound(this, CHAN_AUTO, "player/pl_pain2.wav", 1.0, ATTN_NORM); - else - sound(this, CHAN_AUTO, "player/pl_pain4.wav", 1.0, ATTN_NORM); -#endif - } -} - -void -CSPlayer::Physics_Jump(void) -{ - if (waterlevel >= 2) { - if (watertype == CONTENT_WATER) { - velocity[2] = 100; - } else if (watertype == CONTENT_SLIME) { - velocity[2] = 80; - } else { - velocity[2] = 50; - } - } else { - /* slow the player down a bit to prevent bhopping like crazy */ - velocity *= 0.80f; - velocity[2] += 260; - } -} diff --git a/src/shared/skeleton.h b/src/shared/skeleton.h new file mode 100644 index 0000000..d587b4e --- /dev/null +++ b/src/shared/skeleton.h @@ -0,0 +1,82 @@ +#ifdef CLIENT +/* Here's a list of bone names that we are aware of on HL player models. + Usually we'd use skeletalobjects to share the same skeleton/anim with + another model - but because FTEQW does not support that for HLMDL we + are forced to manually position the bones of our attachnment + by iterating over them and manually setting their position in 3D-space. +*/ +string g_pbones[] = +{ + "Bip01", + "Bip01 Footsteps", + "Bip01 Pelvis", + "Bip01 L Leg", + "Bip01 L Leg1", + "Bip01 L Foot", + "Bip01 L Toe0", + "Bip01 L Toe01", + "Bip01 L Toe02", + "Dummy16", + "Bip01 R Leg", + "Bip01 R Leg1", + "Bip01 R Foot", + "Bip01 R Toe0", + "Bip01 R Toe01", + "Bip01 R Toe02", + "Dummy11", + "Bip01 Spine", + "Bip01 Spine1", + "Bip01 Spine2", + "Bip01 Spine3", + "Bip01 Neck", + "Bip01 Head", + "Dummy21", + "Dummy08", + "Bone02", + "Bone03", + "Bone04", + "Dummy05", + "Bone09", + "Bone10", + "Dummy04", + "Bone05", + "Bone06", + "Dummy03", + "Bone07", + "Bone08", + "Dummy09", + "Bone11", + "Bone12", +"Dummy10", + "Bone13", + "Bone14", + "Bone15", + "Bip01 L Arm", + "Bip01 L Arm1", + "Bip01 L Arm2", + "Bip01 L Hand", + "Bip01 L Finger0", + "Bip01 L Finger01", + "Bip01 L Finger02", + "Dummy06", + "Bip01 L Finger1", + "Bip01 L Finger11", + "Bip01 L Finger12", + "Dummy07", + "Bip01 R Arm", + "Bip01 R Arm1", + "Bip01 R Arm2", + "Bip01 R Hand", + "Bip01 R Finger0", + "Bip01 R Finger01", + "Bip01 R Finger02", + "Dummy01", + "Bip01 R Finger1", + "Bip01 R Finger11", + "Bip01 R Finger12", + "Dummy02", + "Box02", + "Bone08", + "Bone15" +}; +#endif \ No newline at end of file diff --git a/zpak001.pk3dir/decls/def/ammo.def b/zpak001.pk3dir/decls/def/ammo.def index f4bc7ee..3286acd 100644 --- a/zpak001.pk3dir/decls/def/ammo.def +++ b/zpak001.pk3dir/decls/def/ammo.def @@ -1,116 +1,69 @@ -// these have to be defined by the game. +// these have to be defined by the game. +// Counter-Strike ammo data courtesy of https://wiki.alliedmods.net/CS_weapons_information entityDef ammo_types { "ammo_none" "0" - "ammo_338magnum" "1" - "ammo_357sig" "2" - "ammo_45acp" "3" - "ammo_50ae" "4" - "ammo_556nato" "5" - "ammo_556natobox" "6" - "ammo_57mm" "7" - "ammo_762nato" "8" - "ammo_9mm" "9" - "ammo_buckshot" "10" - "ammo_hegrenade" "11" - "ammo_smokegrenade" "12" - "ammo_flashbang" "13" + "ammo_338magnum" "1" + "ammo_357sig" "2" + "ammo_45acp" "3" + "ammo_50ae" "4" + "ammo_556nato" "5" + "ammo_556natobox" "6" + "ammo_57mm" "7" + "ammo_762nato" "8" + "ammo_9mm" "9" + "ammo_buckshot" "10" + "ammo_hegrenade" "11" + "ammo_smokegrenade" "12" + "ammo_flashbang" "13" } entityDef ammo_names { "ammo_none" "None" - "ammo_338magnum" ".338 Lapua Magnum" - "ammo_357sig" ".357 SIG" - "ammo_45acp" ".45 ACP" - "ammo_50ae" ".50 Action Express" - "ammo_556nato" "5.56×45mm NATO" - "ammo_556natobox" "5.56×45mm NATO BOX" - "ammo_57mm" "FN 5.7×28mm" - "ammo_762nato" "7.62×51mm NATO" - "ammo_9mm" "9×19mm Parabellum" - "ammo_buckshot" "Buckshot" - "ammo_hegrenade" "HE Grenade" - "ammo_smokegrenade" "Smoke Grenade" - "ammo_flashbang" "Flashbang" + "ammo_338magnum" ".338 Lapua Magnum" + "ammo_357sig" ".357 SIG" + "ammo_45acp" ".45 ACP" + "ammo_50ae" ".50 Action Express" + "ammo_556nato" "5.56×45mm NATO" + "ammo_556natobox" "5.56×45mm NATO BOX" + "ammo_57mm" "FN 5.7×28mm" + "ammo_762nato" "7.62×51mm NATO" + "ammo_9mm" "9×19mm Parabellum" + "ammo_buckshot" "Buckshot" + "ammo_hegrenade" "HE Grenade" + "ammo_smokegrenade" "Smoke Grenade" + "ammo_flashbang" "Flashbang" } - -entityDef ammo_base -{ - "spawnclass" "NSItem" - "snd_acquire" "ammo.pickup" - "snd_respawn" "ammo.respawn" - "mins" "-16 -16 0" - "maxs" "16 16 16" - "model" "models/w_backpack.mdl" -} - -// these don't exist as pickups in the game, but -// might be helpful nonetheless -entityDef ammo_338magnum -{ - "editor_usage" "Ammo used by weapon_awp" - "inherit" "ammo_base" - "inv_ammo_338magnum" "10" -} - -entityDef ammo_357sig -{ - "editor_usage" "Ammo used by weapon_p228" - "inherit" "ammo_base" - "inv_ammo_357sig" "13" -} - -entityDef ammo_45acp -{ - "editor_usage" "Ammo used by weapon_mac10, weapon_ump45, weapon_usp45" - "inherit" "ammo_base" - "inv_ammo_45acp" "12" -} - -entityDef ammo_50ae -{ - "editor_usage" "Ammo used by weapon_deagle" - "inherit" "ammo_base" - "inv_ammo_50ae" "7" -} - -entityDef ammo_556nato -{ - "editor_usage" "Ammo used by weapon_m4a1, weapon_sg550, weapon_sg552" - "inherit" "ammo_base" - "inv_ammo_556nato" "30" -} - -entityDef ammo_556natobox -{ - "editor_usage" "Ammo used by weapon_m249" - "inherit" "ammo_base" - "inv_ammo_556natobox" "30" -} - -entityDef ammo_57mm -{ - "editor_usage" "Ammo used by weapon_fiveseven, weapon_p90" - "inherit" "ammo_base" - "inv_ammo_57mm" "50" -} - -entityDef ammo_762nato -{ - "editor_usage" "Ammo used by weapon_aug, weapon_famas, weapon_g3sg1, weapon_galil, weapon_ak47, weapon_scout" - "inherit" "ammo_base" - "inv_ammo_762nato" "30" -} - -entityDef ammo_9mm -{ - "editor_usage" "Ammo used by weapon_elites, weapon_glock18, weapon_mp5navy, weapon_tmp" - "inherit" "ammo_base" - "inv_ammo_9mm" "30" -} - -entityDef ammo_buckshot -{ - "editor_usage" "Ammo used by weapon_m3, weapon_xm1014" - "inherit" "ammo_base" - "inv_ammo_buckshot" "8" -} + +entityDef ammo_max { + "ammo_none" "0" + "ammo_338magnum" "30" + "ammo_357sig" "52" + "ammo_45acp" "100" + "ammo_50ae" "35" + "ammo_556nato" "90" + "ammo_556natobox" "200" + "ammo_57mm" "100" + "ammo_762nato" "90" + "ammo_9mm" "120" + "ammo_buckshot" "32" + "ammo_hegrenade" "1" + "ammo_smokegrenade" "1" + "ammo_flashbang" "2" +} + + +// these don't exist as pickups in the game, but +// might be helpful nonetheless for level designers + +#include "ammo/base.def" +#include "ammo/556natobox.def" +#include "ammo/338magnum.def" +#include "ammo/9mm.def" +#include "ammo/556nato.def" +#include "ammo/762nato.def" +#include "ammo/50ae.def" +#include "ammo/45acp.def" +#include "ammo/buckshot.def" +#include "ammo/base.def" +#include "ammo/57mm.def" +#include "ammo/357sig.def" diff --git a/zpak001.pk3dir/decls/def/ammo/338magnum.def b/zpak001.pk3dir/decls/def/ammo/338magnum.def new file mode 100644 index 0000000..aa33fdf --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/338magnum.def @@ -0,0 +1,7 @@ +entityDef ammo_338magnum +{ + "editor_usage" "Ammo used by weapon_awp" + "inherit" "ammo_base" + "inv_ammo_338magnum" "10" + "price" "125" +} diff --git a/zpak001.pk3dir/decls/def/ammo/357sig.def b/zpak001.pk3dir/decls/def/ammo/357sig.def new file mode 100644 index 0000000..22bdfbb --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/357sig.def @@ -0,0 +1,7 @@ +entityDef ammo_357sig +{ + "editor_usage" "Ammo used by weapon_p228" + "inherit" "ammo_base" + "inv_ammo_357sig" "13" + "price" "50" +} diff --git a/zpak001.pk3dir/decls/def/ammo/45acp.def b/zpak001.pk3dir/decls/def/ammo/45acp.def new file mode 100644 index 0000000..f726e8c --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/45acp.def @@ -0,0 +1,7 @@ +entityDef ammo_45acp +{ + "editor_usage" "Ammo used by weapon_mac10, weapon_ump45, weapon_usp45" + "inherit" "ammo_base" + "inv_ammo_45acp" "12" + "price" "25" +} diff --git a/zpak001.pk3dir/decls/def/ammo/50ae.def b/zpak001.pk3dir/decls/def/ammo/50ae.def new file mode 100644 index 0000000..2fe878e --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/50ae.def @@ -0,0 +1,7 @@ +entityDef ammo_50ae +{ + "editor_usage" "Ammo used by weapon_deagle" + "inherit" "ammo_base" + "inv_ammo_50ae" "7" + "price" "40" +} diff --git a/zpak001.pk3dir/decls/def/ammo/556nato.def b/zpak001.pk3dir/decls/def/ammo/556nato.def new file mode 100644 index 0000000..38aa1d1 --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/556nato.def @@ -0,0 +1,7 @@ +entityDef ammo_556nato +{ + "editor_usage" "Ammo used by weapon_m4a1, weapon_sg550, weapon_sg552" + "inherit" "ammo_base" + "inv_ammo_556nato" "30" + "price" "60" +} diff --git a/zpak001.pk3dir/decls/def/ammo/556natobox.def b/zpak001.pk3dir/decls/def/ammo/556natobox.def new file mode 100644 index 0000000..dc6b555 --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/556natobox.def @@ -0,0 +1,7 @@ +entityDef ammo_556natobox +{ + "editor_usage" "Ammo used by weapon_m249" + "inherit" "ammo_base" + "inv_ammo_556natobox" "30" + "price" "60" +} diff --git a/zpak001.pk3dir/decls/def/ammo/57mm.def b/zpak001.pk3dir/decls/def/ammo/57mm.def new file mode 100644 index 0000000..bef6162 --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/57mm.def @@ -0,0 +1,7 @@ +entityDef ammo_57mm +{ + "editor_usage" "Ammo used by weapon_fiveseven, weapon_p90" + "inherit" "ammo_base" + "inv_ammo_57mm" "50" + "price" "50" +} diff --git a/zpak001.pk3dir/decls/def/ammo/762nato.def b/zpak001.pk3dir/decls/def/ammo/762nato.def new file mode 100644 index 0000000..a16dec0 --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/762nato.def @@ -0,0 +1,7 @@ +entityDef ammo_762nato +{ + "editor_usage" "Ammo used by weapon_aug, weapon_famas, weapon_g3sg1, weapon_galil, weapon_ak47, weapon_scout" + "inherit" "ammo_base" + "inv_ammo_762nato" "30" + "price" "80" +} diff --git a/zpak001.pk3dir/decls/def/ammo/9mm.def b/zpak001.pk3dir/decls/def/ammo/9mm.def new file mode 100644 index 0000000..85c56f6 --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/9mm.def @@ -0,0 +1,7 @@ +entityDef ammo_9mm +{ + "editor_usage" "Ammo used by weapon_elites, weapon_glock18, weapon_mp5navy, weapon_tmp" + "inherit" "ammo_base" + "inv_ammo_9mm" "30" + "price" "20" +} diff --git a/zpak001.pk3dir/decls/def/ammo/base.def b/zpak001.pk3dir/decls/def/ammo/base.def new file mode 100644 index 0000000..47c319c --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/base.def @@ -0,0 +1,9 @@ +entityDef ammo_base +{ + "spawnclass" "NSItem" + "snd_acquire" "ammo.pickup" + "snd_respawn" "ammo.respawn" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "model" "models/w_backpack.mdl" +} diff --git a/zpak001.pk3dir/decls/def/ammo/buckshot.def b/zpak001.pk3dir/decls/def/ammo/buckshot.def new file mode 100644 index 0000000..b11d9c0 --- /dev/null +++ b/zpak001.pk3dir/decls/def/ammo/buckshot.def @@ -0,0 +1,7 @@ +entityDef ammo_buckshot +{ + "editor_usage" "Ammo used by weapon_m3, weapon_xm1014" + "inherit" "ammo_base" + "inv_ammo_buckshot" "8" + "price" "65" +} diff --git a/zpak001.pk3dir/decls/def/monsters.def b/zpak001.pk3dir/decls/def/monsters.def index e69de29..4ccaf31 100644 --- a/zpak001.pk3dir/decls/def/monsters.def +++ b/zpak001.pk3dir/decls/def/monsters.def @@ -0,0 +1 @@ +// we have none! go away! diff --git a/zpak001.pk3dir/decls/def/player.def b/zpak001.pk3dir/decls/def/player.def index bb234ef..d7e33a4 100644 --- a/zpak001.pk3dir/decls/def/player.def +++ b/zpak001.pk3dir/decls/def/player.def @@ -2,3 +2,80 @@ entityDef player { "spawnclass" "CSPlayer" } + +entityDef player_mp +{ + "inherit" "player" + "def_precache" "weapon_ak47" + "def_precache" "weapon_aug" + "def_precache" "weapon_awp" + "def_precache" "weapon_c4" + "def_precache" "weapon_deagle" + "def_precache" "weapon_elite" + "def_precache" "weapon_famas" + "def_precache" "weapon_fiveseven" + "def_precache" "weapon_flashbang" + "def_precache" "weapon_g3sg1" + "def_precache" "weapon_galil" + "def_precache" "weapon_glock18" + "def_precache" "weapon_hegrenade" + "def_precache" "weapon_knife" + "def_precache" "weapon_m249" + "def_precache" "weapon_m3" + "def_precache" "weapon_m4a1" + "def_precache" "weapon_mac10" + "def_precache" "weapon_mp5navy" + "def_precache" "weapon_p228" + "def_precache" "weapon_p90" + "def_precache" "weapon_scout" + "def_precache" "weapon_sg550" + "def_precache" "weapon_sg552" + "def_precache" "weapon_smokegrenade" + "def_precache" "weapon_tmp" + "def_precache" "weapon_ump45" + "def_precache" "weapon_usp" + "def_precache" "weapon_xm1014" +} + +entityDef player_terrorist +{ + "inherit" "player_mp" + "ammo_9mm" "40" + "current_weapon" "1" + "item" "item_suit" + "spawnpoint" "info_player_deathmatch" + "team" "1" + "weapon" "weapon_knife,weapon_glock18" + + "model_class1" "models/player/terror/terror.mdl" + "model_class2" "models/player/leet/leet.mdl" + "model_class3" "models/player/arctic/arctic.mdl" + "model_class4" "models/player/guerilla/guerilla.mdl" +} + +entityDef player_counterterrorist +{ + "inherit" "player_mp" + "ammo_45acp" "24" + "current_weapon" "1" + "item" "item_suit" + "spawnpoint" "info_player_start" + "team" "2" + "weapon" "weapon_knife,weapon_usp" + + "model_class1" "models/player/urban/urban.mdl" + "model_class2" "models/player/gsg9/gsg9.mdl" + "model_class3" "models/player/sas/sas.mdl" + "model_class4" "models/player/gign/gign.mdl" +} + +entityDef player_vip +{ + "inherit" "player_mp" + "ammo_45acp" "24" + "current_weapon" "1" + "item" "item_suit" + "model" "models/player/vip/vip.mdl" + "team" "2" + "weapon" "weapon_knife,weapon_usp" +} diff --git a/zpak001.pk3dir/decls/def/weapons/ak47.def b/zpak001.pk3dir/decls/def/weapons/ak47.def index d14fd50..78365f3 100644 --- a/zpak001.pk3dir/decls/def/weapons/ak47.def +++ b/zpak001.pk3dir/decls/def/weapons/ak47.def @@ -10,10 +10,10 @@ entityDef weapon_ak47 "def_fireInfo" "fireInfo_ak47" "clipSize" "30" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_AK47.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/aug.def b/zpak001.pk3dir/decls/def/weapons/aug.def index 795c19b..f8d7351 100644 --- a/zpak001.pk3dir/decls/def/weapons/aug.def +++ b/zpak001.pk3dir/decls/def/weapons/aug.def @@ -10,10 +10,10 @@ entityDef weapon_aug "def_fireInfo" "fireInfo_aug" "clipSize" "30" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_AUG.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/awp.def b/zpak001.pk3dir/decls/def/weapons/awp.def index 3cb1a50..ec6d979 100644 --- a/zpak001.pk3dir/decls/def/weapons/awp.def +++ b/zpak001.pk3dir/decls/def/weapons/awp.def @@ -10,12 +10,12 @@ entityDef weapon_awp "def_fireInfo" "fireInfo_awp" "clipSize" "5" - "actFire" "1,2,3" + "act_fire" "1,2,3" "actAltFire" "" - "actHolster" "" - "actReload" "4" - "actDraw" "5" - "actIdle" "0" + "act_holster" "" + "act_reload" "4" + "act_draw" "5" + "act_idle" "0" "snd_fire" "Weapon_AWP.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/c4.def b/zpak001.pk3dir/decls/def/weapons/c4.def index 52ceac3..79407b9 100644 --- a/zpak001.pk3dir/decls/def/weapons/c4.def +++ b/zpak001.pk3dir/decls/def/weapons/c4.def @@ -17,9 +17,9 @@ entityDef weapon_c4 "clipSize" "1" "trigger_delay" "3" // takes three seconds to charge - "actFire" "2" - "actDraw" "1" - "actIdle" "0" + "act_fire" "2" + "act_draw" "1" + "act_idle" "0" "actDelay" "3" "snd_fire" "C4.PlantSound" diff --git a/zpak001.pk3dir/decls/def/weapons/deagle.def b/zpak001.pk3dir/decls/def/weapons/deagle.def index 9ff23a9..ebe76da 100644 --- a/zpak001.pk3dir/decls/def/weapons/deagle.def +++ b/zpak001.pk3dir/decls/def/weapons/deagle.def @@ -9,11 +9,11 @@ entityDef weapon_deagle "def_fireInfo" "fireInfo_deagle" "clipSize" "7" - "actFire" "1,2" - "actFireLast" "3" - "actReload" "4" - "actDraw" "5" - "actIdle" "0" + "act_fire" "1,2" + "act_fireLast" "3" + "act_reload" "4" + "act_draw" "5" + "act_idle" "0" "snd_fire" "Weapon_DEagle.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/elite.def b/zpak001.pk3dir/decls/def/weapons/elite.def index ed61dda..578bb91 100644 --- a/zpak001.pk3dir/decls/def/weapons/elite.def +++ b/zpak001.pk3dir/decls/def/weapons/elite.def @@ -11,11 +11,11 @@ entityDef weapon_elite "def_altFireInfo" "fireInfo_elite_alt" "clipSize" "30" - "actFire" "2,3,4,5,6" - "actFireLast" "7" - "actReload" "14" - "actDraw" "15" - "actIdle" "0" + "act_fire" "2,3,4,5,6" + "act_fireLast" "7" + "act_reload" "14" + "act_draw" "15" + "act_idle" "0" "snd_fire" "Weapon_ELITE.Single" "snd_altfire" "Weapon_ELITE.Single" @@ -61,6 +61,6 @@ entityDef fireInfo_elite entityDef fireInfo_elite_alt { "inherit" "fireInfo_elite" - "actFire" "8,9,10,11,12" - "actFireLast" "13" + "act_fire" "8,9,10,11,12" + "act_fireLast" "13" } diff --git a/zpak001.pk3dir/decls/def/weapons/famas.def b/zpak001.pk3dir/decls/def/weapons/famas.def index 2fd44b4..23b5b9b 100644 --- a/zpak001.pk3dir/decls/def/weapons/famas.def +++ b/zpak001.pk3dir/decls/def/weapons/famas.def @@ -10,12 +10,12 @@ entityDef weapon_famas "def_fireInfo" "fireInfo_famas" "clipSize" "" - "actFire" "" + "act_fire" "" "actAltFire" "" - "actHolster" "" - "actReload" "" - "actDraw" "" - "actIdle" "" + "act_holster" "" + "act_reload" "" + "act_draw" "" + "act_idle" "" "snd_fire" "Weapon_FAMAS.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/fiveseven.def b/zpak001.pk3dir/decls/def/weapons/fiveseven.def index 6bc86de..71ef11f 100644 --- a/zpak001.pk3dir/decls/def/weapons/fiveseven.def +++ b/zpak001.pk3dir/decls/def/weapons/fiveseven.def @@ -10,11 +10,11 @@ entityDef weapon_fiveseven "def_fireInfo" "fireInfo_fiveseven" "clipSize" "20" - "actFire" "1,2" - "actFireLast" "3" - "actReload" "4" - "actDraw" "5" - "actIdle" "0" + "act_fire" "1,2" + "act_fireLast" "3" + "act_reload" "4" + "act_draw" "5" + "act_idle" "0" "snd_fire" "Weapon_FiveSeven.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/flashbang.def b/zpak001.pk3dir/decls/def/weapons/flashbang.def index a026c1b..ffe5e05 100644 --- a/zpak001.pk3dir/decls/def/weapons/flashbang.def +++ b/zpak001.pk3dir/decls/def/weapons/flashbang.def @@ -19,8 +19,8 @@ entityDef weapon_flashbang "silent_fire" "1" "primed_fuse" "4" - "actIdle" "0" - "actDraw" "3" + "act_idle" "0" + "act_draw" "3" "actPull" "1" "actThrow" "2" diff --git a/zpak001.pk3dir/decls/def/weapons/g3sg1.def b/zpak001.pk3dir/decls/def/weapons/g3sg1.def index 924149b..926928a 100644 --- a/zpak001.pk3dir/decls/def/weapons/g3sg1.def +++ b/zpak001.pk3dir/decls/def/weapons/g3sg1.def @@ -10,10 +10,10 @@ entityDef weapon_g3sg1 "def_fireInfo" "fireInfo_g3sg1" "clipSize" "20" - "actFire" "1,2" - "actReload" "3" - "actDraw" "4" - "actIdle" "0" + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "0" "snd_fire" "Weapon_G3SG1.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/galil.def b/zpak001.pk3dir/decls/def/weapons/galil.def index 974a647..50abe5b 100644 --- a/zpak001.pk3dir/decls/def/weapons/galil.def +++ b/zpak001.pk3dir/decls/def/weapons/galil.def @@ -12,12 +12,12 @@ entityDef weapon_galil "clipSizeDefault" "25" "ammoType" "ammo_762nato" - "actFire" "5,6,7" + "act_fire" "5,6,7" "actAltFire" "2" - "actHolster" "4" - "actReload" "3" - "actDraw" "4" - "actIdle" "0,1" + "act_holster" "4" + "act_reload" "3" + "act_draw" "4" + "act_idle" "0,1" "snd_fire" "Weapon_Galil.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/glock18.def b/zpak001.pk3dir/decls/def/weapons/glock18.def index f540e6f..fd86448 100644 --- a/zpak001.pk3dir/decls/def/weapons/glock18.def +++ b/zpak001.pk3dir/decls/def/weapons/glock18.def @@ -13,12 +13,12 @@ entityDef weapon_glock18 "ammoRequired" "1" "model_flash" "sprites/muzzleflash2.spr" - "actFire" "5" - "actFireLast" "6" - "actHolster" "9" - "actReload" "7,12" - "actDraw" "9,11" - "actIdle" "0,1,2" + "act_fire" "5" + "act_fireLast" "6" + "act_holster" "9" + "act_reload" "7,12" + "act_draw" "9,11" + "act_idle" "0,1,2" "snd_fire" "Weapon_Glock.Single" @@ -64,6 +64,6 @@ entityDef fireInfo_altglock18 "numProjectiles" "3" "fireRate" "0.5" "accuracyDivisor" "75" - "actFire" "3,4" + "act_fire" "3,4" "snd_fire" "Weapon_Glock.Burst" } diff --git a/zpak001.pk3dir/decls/def/weapons/hegrenade.def b/zpak001.pk3dir/decls/def/weapons/hegrenade.def index 8dc0d46..3332e5b 100644 --- a/zpak001.pk3dir/decls/def/weapons/hegrenade.def +++ b/zpak001.pk3dir/decls/def/weapons/hegrenade.def @@ -17,8 +17,8 @@ entityDef weapon_hegrenade "silent_fire" "1" "primed_fuse" "4" - "actIdle" "0" - "actDraw" "3" + "act_idle" "0" + "act_draw" "3" "actPull" "1" "actThrow" "2" diff --git a/zpak001.pk3dir/decls/def/weapons/knife.def b/zpak001.pk3dir/decls/def/weapons/knife.def index 5cb2118..058dcdd 100644 --- a/zpak001.pk3dir/decls/def/weapons/knife.def +++ b/zpak001.pk3dir/decls/def/weapons/knife.def @@ -1,40 +1,38 @@ entityDef weapon_knife { - "inherit" "CSBaseMelee" + "inherit" "CSBaseMelee" "editor_usage" "Knife Weapon" - "model" "models/w_knife.mdl" + "model" "models/w_knife.mdl" "model_view" "models/v_knife.mdl" // weapon specific - "def_melee" "damage_knife" - "melee_distance" "48" - "inv_name" "Knife Weapon" - "clipSize" "6" - "ammoType" "" + "def_onFire" "projectile_knife" + "testDistance" "-48" + "inv_name" "Knife Weapon" "ammoRequired" "0" - "clipSize" "0" + "clipSize" "0" "silent_fire" "1" - "meleeRateMiss" "0.7" - "meleeRateHit" "0.7" - - "actIdle" "0" - "actDraw" "3" - "actMeleeMiss" "1,2" - "actMeleeHit" "1,2" - - "hudSlot" "2" - "hudSlotPos" "0" -} - -entityDef damage_knife -{ - "damage" "skill:plr_knife" -// "kickDir" "-1 0 0" -// "knockback" "20" -// "push" "20000" - + "failRate" "0.7" + "fireRate" "0.7" "snd_hit" "Weapon_Knife.Hit" - "snd_miss" "Weapon_Knife.Slash" + "snd_failed" "Weapon_Knife.Slash" + + "act_idle" "0" + "act_draw" "3" + "act_fireFailed" "1,2" + "act_fire" "1,2" + + "hudSlot" "2" + "hudSlotPos" "0" +} + +entityDef projectile_knife +{ + "spawnclass" "NSProjectile" + "damage" "skill:plr_knife" + "is_bullet" "1" + "decal_impact" "Impact.Shot" + "detonate_on_world" "1" } diff --git a/zpak001.pk3dir/decls/def/weapons/m249.def b/zpak001.pk3dir/decls/def/weapons/m249.def index 1605b0d..0478f47 100644 --- a/zpak001.pk3dir/decls/def/weapons/m249.def +++ b/zpak001.pk3dir/decls/def/weapons/m249.def @@ -10,10 +10,10 @@ entityDef weapon_m249 "def_fireInfo" "fireInfo_m249" "clipSize" "100" - "actFire" "1,2" - "actReload" "3" - "actDraw" "4" - "actIdle" "0" + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "0" "snd_fire" "Weapon_M249.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/m3.def b/zpak001.pk3dir/decls/def/weapons/m3.def index 8ae2a41..b2230c0 100644 --- a/zpak001.pk3dir/decls/def/weapons/m3.def +++ b/zpak001.pk3dir/decls/def/weapons/m3.def @@ -10,12 +10,12 @@ entityDef weapon_m3 "def_fireInfo" "fireInfo_m3" "clipSize" "8" - "actFire" "1,2" - "actReloadStart" "5" - "actReload" "3" - "actReloadEnd" "4" - "actDraw" "6" - "actIdle" "0" + "act_fire" "1,2" + "act_reloadStart" "5" + "act_reload" "3" + "act_reloadEnd" "4" + "act_draw" "6" + "act_idle" "0" "snd_fire" "Weapon_M3.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/m4a1.def b/zpak001.pk3dir/decls/def/weapons/m4a1.def index 0b01711..f5bf480 100644 --- a/zpak001.pk3dir/decls/def/weapons/m4a1.def +++ b/zpak001.pk3dir/decls/def/weapons/m4a1.def @@ -15,15 +15,15 @@ entityDef weapon_m4a1 "ammoPerShot" "1" "fireRate" "0.0875" - "altSilences" "1" - "actAddSil" "6" - "actDetachSil" "13" + "altMode" "1" + "act_modeOn" "6" + "act_modeOff" "13" // Unsilenced - "actFire" "8,9,10" - "actReload" "11" - "actDraw" "12" - "actIdle" "7" + "act_fire" "8,9,10" + "act_reload" "11" + "act_draw" "12" + "act_idle" "7" "snd_fire" "Weapon_M4A1.Single" @@ -62,9 +62,9 @@ entityDef fireInfo_m4a1 entityDef fireInfo_m4a1_silenced { "inherit" "fireInfo_m4a1" - "actFire" "1,2,3" - "actReload" "4" - "actDraw" "5" - "actIdle" "0" + "act_fire" "1,2,3" + "act_reload" "4" + "act_draw" "5" + "act_idle" "0" "snd_fire" "Weapon_M4A1.Silenced" } diff --git a/zpak001.pk3dir/decls/def/weapons/mac10.def b/zpak001.pk3dir/decls/def/weapons/mac10.def index eb7d2ea..fc9223c 100644 --- a/zpak001.pk3dir/decls/def/weapons/mac10.def +++ b/zpak001.pk3dir/decls/def/weapons/mac10.def @@ -10,10 +10,10 @@ entityDef weapon_mac10 "def_fireInfo" "fireInfo_mac10" "clipSize" "30" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_MAC10.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/mp5navy.def b/zpak001.pk3dir/decls/def/weapons/mp5navy.def index 89179ea..49d3813 100644 --- a/zpak001.pk3dir/decls/def/weapons/mp5navy.def +++ b/zpak001.pk3dir/decls/def/weapons/mp5navy.def @@ -10,10 +10,10 @@ entityDef weapon_mp5navy "def_fireInfo" "fireInfo_mp5navy" "clipSize" "30" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_MP5Navy.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/p228.def b/zpak001.pk3dir/decls/def/weapons/p228.def index 4b70c1c..a3ce888 100644 --- a/zpak001.pk3dir/decls/def/weapons/p228.def +++ b/zpak001.pk3dir/decls/def/weapons/p228.def @@ -11,11 +11,11 @@ entityDef weapon_p228 "clipSize" "13" - "actFire" "1,2,3" - "actFireLast" "4" - "actReload" "5" - "actDraw" "6" - "actIdle" "0" + "act_fire" "1,2,3" + "act_fireLast" "4" + "act_reload" "5" + "act_draw" "6" + "act_idle" "0" "snd_fire" "Weapon_P228.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/p90.def b/zpak001.pk3dir/decls/def/weapons/p90.def index afc2c1e..d2ffa6b 100644 --- a/zpak001.pk3dir/decls/def/weapons/p90.def +++ b/zpak001.pk3dir/decls/def/weapons/p90.def @@ -10,10 +10,10 @@ entityDef weapon_p90 "def_fireInfo" "fireInfo_p90" "clipSize" "50" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_P90.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/scout.def b/zpak001.pk3dir/decls/def/weapons/scout.def index 8c65233..2e75ded 100644 --- a/zpak001.pk3dir/decls/def/weapons/scout.def +++ b/zpak001.pk3dir/decls/def/weapons/scout.def @@ -11,10 +11,10 @@ entityDef weapon_scout "clipSize" "10" - "actFire" "1,2" - "actReload" "3" - "actDraw" "4" - "actIdle" "0" + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "0" "snd_fire" "Weapon_Scout.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/sg550.def b/zpak001.pk3dir/decls/def/weapons/sg550.def index a4b190d..469e7a3 100644 --- a/zpak001.pk3dir/decls/def/weapons/sg550.def +++ b/zpak001.pk3dir/decls/def/weapons/sg550.def @@ -10,10 +10,10 @@ entityDef weapon_sg550 "def_fireInfo" "fireInfo_sg550" "clipSize" "30" - "actFire" "1,2" - "actReload" "3" - "actDraw" "4" - "actIdle" "0" + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "0" "snd_fire" "Weapon_SG550.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/sg552.def b/zpak001.pk3dir/decls/def/weapons/sg552.def index 4b23007..a36a068 100644 --- a/zpak001.pk3dir/decls/def/weapons/sg552.def +++ b/zpak001.pk3dir/decls/def/weapons/sg552.def @@ -11,10 +11,10 @@ entityDef weapon_sg552 "clipSize" "30" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_SG552.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/smokegrenade.def b/zpak001.pk3dir/decls/def/weapons/smokegrenade.def index 5de28d5..9da5809 100644 --- a/zpak001.pk3dir/decls/def/weapons/smokegrenade.def +++ b/zpak001.pk3dir/decls/def/weapons/smokegrenade.def @@ -17,12 +17,12 @@ entityDef weapon_smokegrenade "clipSize" "50" "clipSizeDefault" "25" - "actFire" "5,6,7" + "act_fire" "5,6,7" "actAltFire" "2" - "actHolster" "4" - "actReload" "3" - "actDraw" "4" - "actIdle" "0,1" + "act_holster" "4" + "act_reload" "3" + "act_draw" "4" + "act_idle" "0,1" "snd_fire" "weapon_smokegrenade.shoot" "snd_altfire" "weapon_smokegrenade.gl" diff --git a/zpak001.pk3dir/decls/def/weapons/tmp.def b/zpak001.pk3dir/decls/def/weapons/tmp.def index c00050e..90010a1 100644 --- a/zpak001.pk3dir/decls/def/weapons/tmp.def +++ b/zpak001.pk3dir/decls/def/weapons/tmp.def @@ -11,10 +11,10 @@ entityDef weapon_tmp "clipSize" "30" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_TMP.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/ump45.def b/zpak001.pk3dir/decls/def/weapons/ump45.def index 71655b0..ffbabf8 100644 --- a/zpak001.pk3dir/decls/def/weapons/ump45.def +++ b/zpak001.pk3dir/decls/def/weapons/ump45.def @@ -11,10 +11,10 @@ entityDef weapon_ump45 "clipSize" "25" - "actFire" "3,4,5" - "actReload" "1" - "actDraw" "2" - "actIdle" "0" + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "0" "snd_fire" "Weapon_UMP45.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/usp.def b/zpak001.pk3dir/decls/def/weapons/usp.def index 60cc9fd..ac3eae0 100644 --- a/zpak001.pk3dir/decls/def/weapons/usp.def +++ b/zpak001.pk3dir/decls/def/weapons/usp.def @@ -32,9 +32,9 @@ entityDef weapon_usp "semiAuto" "1" "ammoRequired" "1" - "altSilences" "1" - "actAddSil" "7" - "actDetachSil" "15" + "altMode" "1" + "act_modeOn" "7" + "act_modeOff" "15" "crossMinDist" "4" "crossDeltaDist" "4" @@ -49,11 +49,11 @@ entityDef weapon_usp "multiplierInaccuracy" "0.5" // Unsilenced - "actDraw" "14" - "actIdle" "8" - "actFire" "9,10,11" - "actFireLast" "12" - "actReload" "13" + "act_draw" "14" + "act_idle" "8" + "act_fire" "9,10,11" + "act_fireLast" "12" + "act_reload" "13" "snd_fire" "Weapon_USP.Single" "hudSlot" "1" @@ -77,10 +77,10 @@ entityDef fireInfo_usp45_sil { "def_onFire" "projectile_usp45" "model_flash" "sprites/muzzleflash2.spr" - "actDraw" "6" - "actIdle" "0" - "actReload" "5" - "actFire" "1,2,3" - "actFireLast" "4" + "act_draw" "6" + "act_idle" "0" + "act_reload" "5" + "act_fire" "1,2,3" + "act_fireLast" "4" "snd_fire" "Weapon_USP.SilencedShot" } diff --git a/zpak001.pk3dir/decls/def/weapons/xm1014.def b/zpak001.pk3dir/decls/def/weapons/xm1014.def index 3dd9377..6864e4b 100644 --- a/zpak001.pk3dir/decls/def/weapons/xm1014.def +++ b/zpak001.pk3dir/decls/def/weapons/xm1014.def @@ -12,12 +12,12 @@ entityDef weapon_xm1014 "ammoType" "ammo_buckshot" - "actFire" "1,2" - "actReloadStart" "5" - "actReload" "3" - "actReloadEnd" "4" - "actDraw" "6" - "actIdle" "0" + "act_fire" "1,2" + "act_reloadStart" "5" + "act_reload" "3" + "act_reloadEnd" "4" + "act_draw" "6" + "act_idle" "0" "snd_fire" "Weapon_XM1014.Single" diff --git a/zpak001.pk3dir/decls/sound/player.sndshd b/zpak001.pk3dir/decls/sound/player.sndshd index d2d69d5..3a46640 100644 --- a/zpak001.pk3dir/decls/sound/player.sndshd +++ b/zpak001.pk3dir/decls/sound/player.sndshd @@ -15,6 +15,15 @@ player.hitarmor sample player/bhit_kevlar-1.wav } +Player.Pain +{ + sample player/pl_pain2.wav + sample player/pl_pain4.wav + sample player/pl_pain5.wav + sample player/pl_pain6.wav + sample player/pl_pain7.wav +} + Player.FallDamage { sample player/pl_pain2.wav @@ -139,4 +148,4 @@ Player.Swim Player.PickupWeapon { sample items/gunpickup2.wav -} \ No newline at end of file +} diff --git a/zpak001.pk3dir/decls/typeinfo/hlmat.decl b/zpak001.pk3dir/decls/typeinfo/hlmat.decl new file mode 100644 index 0000000..4085426 --- /dev/null +++ b/zpak001.pk3dir/decls/typeinfo/hlmat.decl @@ -0,0 +1,19 @@ +typeInfo material +{ + "C" "gs_material_concrete" + "D" "gs_material_dirt" + "F" "gs_material_flesh" + "G" "gs_material_grate" + "H" "gs_material_alien" + "M" "gs_material_metal" + "O" "gs_material_foliage" + "P" "gs_material_computer" + "R" "gs_material_rocks" + "S" "gs_material_slosh" + "T" "gs_material_tile" + "V" "gs_material_vent" + "W" "gs_material_wood" + "Y" "gs_material_glass" + "N" "gs_material_sand" + "K" "gs_material_snow" +} diff --git a/zpak001.pk3dir/default.cfg b/zpak001.pk3dir/default.cfg index 1ad6480..b344a6d 100644 --- a/zpak001.pk3dir/default.cfg +++ b/zpak001.pk3dir/default.cfg @@ -1,45 +1,5 @@ exec default_controls.cfg - -// game specific binds -bind "b" "buy" -bind "m" "chooseteam" -bind "g" "drop" - -exec cvar_defaults.cfg - -// game specific cvars -seta "hostname" "FreeCS Server" -seta "maxplayers" "8" -seta "mp_startmoney" "800" -seta "mp_buytime" "90" -seta "mp_freezetime" "6" -seta "mp_c4timer" "45" -seta "mp_roundtime" "5" -seta "fcs_knifeonly" "0" -seta "fcs_swapteams" "0" -seta "fcs_nopickups" "0" -seta "fcs_reward_kill" "300" -seta "fcs_penalty_pain" "-150" -seta "fcs_penalty_kill" "-1500" -seta "fcs_maxmoney" "16000" -seta "fcs_fillweapons" "0" -seta "fcs_autoreload" "0" - -// cosmetic branding changes -seta "con_color" "255 150 0" -seta "vgui_color" "255 170 0" -seta "cross_color" "0 255 0" - -// physics differences from valve/ -seta pm_accelerate "4" -seta pm_airaccelerate "10" -seta pm_airstepsize "18" -seta pm_crouchviewheight "30" -seta pm_edgefriction "1" -seta pm_friction "4" -seta pm_gravity "800" -seta pm_normalviewheight "54" -seta pm_stepsize "18" -seta pm_stopspeed "75" -seta pm_walkspeed "250" -seta pm_wateraccelerate "8" +exec default_cvar.cfg +exec default_video.cfg +exec default_cstrike.cfg +exec default_aliases.cfg diff --git a/zpak001.pk3dir/default_aliases.cfg b/zpak001.pk3dir/default_aliases.cfg new file mode 100644 index 0000000..0a8a274 --- /dev/null +++ b/zpak001.pk3dir/default_aliases.cfg @@ -0,0 +1,57 @@ +// buy commands +alias ak47 "cmd buy weapon_ak47" +alias aug "cmd buy weapon_aug" +alias awp "cmd buy weapon_awp" +alias deagle "cmd buy weapon_deagle" +alias elites "cmd buy weapon_elite" +alias fn57 "cmd buy weapon_fiveseven" +alias g3sg1 "cmd buy weapon_g3sg1" +alias glock "cmd buy weapon_glock18" +alias m249 "cmd buy weapon_m249" +alias m3 "cmd buy weapon_m3" +alias m4a1 "cmd buy weapon_m4a1" +alias mac10 "cmd buy weapon_mac10" +alias mp5 "cmd buy weapon_mp5" +alias p228 "cmd buy weapon_p228" +alias p90 "cmd buy weapon_p90" +alias scout "cmd buy weapon_scout" +alias sg550 "cmd buy weapon_sg550" +alias sg552 "cmd buy weapon_sg552" +alias tmp "cmd buy weapon_tmp" +alias ump45 "cmd buy weapon_ump45" +alias usp "cmd buy weapon_usp" +alias xm1014 "cmd buy weapon_xm1014" + +alias primammo "cmd buyammo 0" +alias secammo "cmd buyammo 1" +alias buyammo1 "primammo" +alias buyammo2 "secammo" +alias vest "cmd buy item_kevlar" +alias vesthelm "cmd buy item_kevlar_helmet" +alias flash "cmd buy weapon_flashbang" +alias hegren "cmd buy weapon_hegrenade" +alias vsgren "cmd buy weapon_smokegrenade" +alias defuser "cmd buy item_defuse" +alias nvg "cmd buy item_nightvision" + +// radio commands +alias coverme "cmd coverme" +alias takepoint "cmd takepoint" +alias regroup "cmd regroup" +alias followme "cmd followme" +alias takingfire "cmd takingfire" +alias go "cmd go" +alias fallback "cmd fallback" +alias sticktog "cmd sticktog" +alias getinpos "cmd getinpos" +alias stormfront "cmd stormfront" +alias report "cmd report" +alias roger "cmd roger" +alias enemyspot "cmd enemyspot" +alias needbackup "cmd needbackup" +alias sectorclear "cmd sectorclear" +alias inposition "cmd inposition" +alias reportingin "cmd reportingin" +alias getout "cmd getout" +alias negative "cmd negative" +alias enemydown "cmd enemydown" diff --git a/zpak001.pk3dir/default_cstrike.cfg b/zpak001.pk3dir/default_cstrike.cfg new file mode 100644 index 0000000..b00627c --- /dev/null +++ b/zpak001.pk3dir/default_cstrike.cfg @@ -0,0 +1,41 @@ +// game specific binds +bind b "buy" +bind m "chooseteam" +bind g "drop" + +// game specific cvars +set hostname "FreeCS Server" +set maxplayers "8" +set mp_startmoney "800" +set mp_buytime "90" +set mp_freezetime "6" +set mp_c4timer "45" +set mp_roundtime "5" +set fcs_knifeonly "0" +set fcs_swapteams "0" +set fcs_nopickups "0" +set fcs_reward_kill "300" +set fcs_penalty_pain "-150" +set fcs_penalty_kill "-1500" +set fcs_maxmoney "16000" +set fcs_fillweapons "0" +set fcs_autoreload "0" + +// cosmetic branding changes +set con_color "255 150 0" +set vgui_color "255 170 0" +set cross_color "0 255 0" + +// physics differences from valve/ +set pm_accelerate "4" +set pm_airaccelerate "10" +set pm_airstepsize "18" +set pm_crouchviewheight "30" +set pm_edgefriction "1" +set pm_friction "4" +set pm_gravity "800" +set pm_normalviewheight "54" +set pm_stepsize "18" +set pm_stopspeed "75" +set pm_walkspeed "250" +set pm_wateraccelerate "8" diff --git a/zpak001.pk3dir/scripts/bots.txt b/zpak001.pk3dir/scripts/bots.txt index b127b78..dcac977 100644 --- a/zpak001.pk3dir/scripts/bots.txt +++ b/zpak001.pk3dir/scripts/bots.txt @@ -9,6 +9,10 @@ { name marco funname "]I[ M4RC0 ]I[" + fav_primary_ct weapon_mp5 + fav_primary_t weapon_mac10 + fav_secondary_ct weapon_deagle + fav_secondary_t weapon_elite } { name rich @@ -56,4 +60,4 @@ } { name DEViL -} \ No newline at end of file +} diff --git a/zpak001.pk3dir/scripts/client_style.txt b/zpak001.pk3dir/scripts/client_style.txt new file mode 100644 index 0000000..567c47b --- /dev/null +++ b/zpak001.pk3dir/scripts/client_style.txt @@ -0,0 +1,11 @@ +BG_COLOR=0 0 0 +BG_ALPHA=128 +FG_COLOR=255 170 0 +HILIGHT_COLOR=255 170 0 +SHADOW_COLOR=255 170 0 +BORDER_COLOR=255 170 0 +BORDER_ALPHA=128 +NOICONS=1 +ROUNDED=0 +HOVER_COLOR=255 170 +HOVER_ALPHA=128 diff --git a/zpak001.pk3dir/scripts/surfaceproperties.txt b/zpak001.pk3dir/scripts/surfaceproperties.txt deleted file mode 100644 index 5c051e2..0000000 --- a/zpak001.pk3dir/scripts/surfaceproperties.txt +++ /dev/null @@ -1,224 +0,0 @@ -default -{ - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.default" - stepleft "step_default.left" - stepright "step_default.right" - scraperough "scrape.default" - scrapesmooth "scrape.default" -} - -gs_material_glass -{ - gamematerial Y - part_bulletimpact "impact_glass.main" - bulletimpact "sfx_impact.glass" - stepleft "step_glass.left" - stepright "step_glass.right" - break "func_breakable.break_glass" -} - -gs_material_wood -{ - gamematerial W - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.wood" - stepleft "step_wood.left" - stepright "step_wood.right" - break "func_breakable.break_wood" -} - -gs_material_metal -{ - gamematerial M - part_bulletimpact "impact_unbreakable.main" - bulletimpact "sfx_impact.metal" - stepleft "step_metal.left" - stepright "step_metal.right" - break "func_breakable.break_metal" -} - -gs_material_ladder -{ - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.metal" - stepleft "step_ladder.left" - stepright "step_ladder.right" -} - -gs_material_flesh -{ - gamematerial F - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.flesh" - stepleft "step_flesh.left" - stepright "step_flesh.right" - break "func_breakable.break_flesh" -} - -gs_material_cinderblock -{ - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.concrete" - stepleft "step_default.left" - stepright "step_default.right" - break "func_breakable.break_cinder" -} - -gs_material_tile -{ - gamematerial T - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.tile" - stepleft "step_tile.left" - stepright "step_tile.right" - break "func_breakable.break_cinder" -} - -gs_material_computer -{ - gamematerial P - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.computer" - stepleft "step_computer.left" - stepright "step_computer.right" - break "func_breakable.break_computer" -} - -gs_material_unbreakableglass -{ - part_bulletimpact "impact_unbreakable.main" - bulletimpact "sfx_impact.glass" - stepleft "step_glass.left" - stepright "step_glass.right" - break "func_breakable.break_glass" -} - -gs_material_rocks -{ - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.concrete" - stepleft "step_default.left" - stepright "step_default.right" - break "func_breakable.break_cinder" -} - -gs_material_flesh -{ - gamematerial F - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.flesh" - stepleft "step_flesh.left" - stepright "step_flesh.right" - break "func_breakable.break_flesh" -} - -gs_material_concrete -{ - gamematerial C - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.concrete" - stepleft "step_concrete.left" - stepright "step_concrete.right" - break "func_breakable.break_cinder" -} - -gs_material_dirt -{ - gamematerial D - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.dirt" - stepleft "step_dirt.left" - stepright "step_dirt.right" - break "func_breakable.break_rocks" -} - -gs_material_grate -{ - gamematerial G - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.grate" - stepleft "step_grate.left" - stepright "step_grate.right" - break "func_breakable.break_metal" -} - -gs_material_alien -{ - gamematerial H - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.alien" - stepleft "step_alien.left" - stepright "step_alien.right" - break "func_breakable.break_flesh" -} - -gs_material_snow -{ - gamematerial K - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.snow" - stepleft "step_snow.left" - stepright "step_snow.right" -} - -gs_material_sand -{ - gamematerial N - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.sand" - stepleft "step_sand.left" - stepright "step_sand.right" -} - -gs_material_foliage -{ - gamematerial O - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.foliage" - stepleft "step_foliage.left" - stepright "step_foliage.right" -} - -gs_material_slosh -{ - gamematerial S - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.slosh" - stepleft "step_slosh.left" - stepright "step_slosh.right" -} - -gs_material_vent -{ - gamematerial V - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.snow" - stepleft "step_vent.left" - stepright "step_vent.right" - break "func_breakable.break_metal" -} - -water -{ - part_bulletimpact "fx_impact.water" - bulletimpact "sfx_impact.slosh" - stepleft "step_slosh.left" - stepright "step_slosh.right" -} - -lava -{ - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.slosh" - stepleft "step_slosh.left" - stepright "step_slosh.right" -} - -slime -{ - part_bulletimpact "impact_default.main" - bulletimpact "sfx_impact.slosh" - stepleft "step_slosh.left" - stepright "step_slosh.right" -} \ No newline at end of file diff --git a/zpak001.pk3dir/scripts/surfaceproperties_cstrike.txt b/zpak001.pk3dir/scripts/surfaceproperties_cstrike.txt new file mode 100644 index 0000000..1e5b5ac --- /dev/null +++ b/zpak001.pk3dir/scripts/surfaceproperties_cstrike.txt @@ -0,0 +1,17 @@ +gs_material_snow +{ + gamematerial K + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.snow" + stepleft "step_snow.left" + stepright "step_snow.right" +} + +gs_material_sand +{ + gamematerial N + part_bulletimpact "impact_default.main" + bulletimpact "sfx_impact.sand" + stepleft "step_sand.left" + stepright "step_sand.right" +} diff --git a/zpak001.pk3dir/scripts/surfaceproperties_manifest.txt b/zpak001.pk3dir/scripts/surfaceproperties_manifest.txt new file mode 100644 index 0000000..67385d2 --- /dev/null +++ b/zpak001.pk3dir/scripts/surfaceproperties_manifest.txt @@ -0,0 +1,5 @@ +surfaceproperties_manifest +{ + file "scripts/surfaceproperties_cstrike.txt" + file "scripts/surfaceproperties_valve.txt" +} diff --git a/zpak001.pk3dir/scripts/ui_style.txt b/zpak001.pk3dir/scripts/ui_style.txt new file mode 100644 index 0000000..d339a64 --- /dev/null +++ b/zpak001.pk3dir/scripts/ui_style.txt @@ -0,0 +1,10 @@ +BG_COLOR=76 88 58 +BG_ALPHA=255 +FG_COLOR=216 222 211 +FILL_COLOR=196 181 80 +HILIGHT_COLOR=255 255 255 +SHADOW_COLOR=0 0 0 +BORDER_COLOR=0 0 0 +BORDER_ALPHA=0 +NOICONS=1 +ROUNDED=0 From 26383cf05d8c2c86e28a0e5859212a8b31b1687c Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 3 Jan 2025 04:23:18 -0800 Subject: [PATCH 09/17] More fixes against upstream Nuclide --- README.md | 13 +- src/client/game_event.qc | 9 - src/client/hud.qc | 4 +- src/client/hud_ammonotify.qc | 4 +- src/client/progs.src | 1 + src/client/radar.qc | 4 +- src/client/vgui_buymenu.qc | 22 +-- src/client/vgui_buypages.qc | 32 ++-- src/client/vgui_changeclass_ct.qc | 32 ++-- src/client/vgui_changeclass_t.qc | 32 ++-- src/client/vgui_chooseteam.qc | 38 ++-- src/client/vgui_motd.qc | 22 +-- src/client/vgui_spectator.qc | 4 +- src/progs.src | 1 + src/rules/Makefile | 1 + src/rules/counterstrike.qc | 121 +++++++------ src/rules/deathmatch.qc | 171 ++++++++++++++++++ src/server/armoury_entity.qc | 2 +- src/server/func_bomb_target.qc | 2 +- src/server/func_buyzone.qc | 2 +- src/server/func_escapezone.qc | 2 +- src/server/func_hostage_rescue.qc | 2 +- src/server/func_vip_safetyzone.qc | 2 +- src/server/hostage_entity.qc | 20 +- src/server/info_buyzone.qc | 2 +- src/server/info_hostage_rescue.qc | 4 +- src/server/info_map_parameters.qc | 2 +- src/server/progs.src | 1 + src/server/server.qc | 16 -- src/shared/CSProjectile.h | 3 +- src/shared/CSProjectile.qc | 21 ++- src/shared/CSWeapon.qc | 62 +++---- src/shared/fx_flashbang.qc | 10 +- src/shared/fx_impact.qc | 2 +- src/shared/include.src | 1 - src/shared/item_c4bomb.qc | 6 +- src/shared/player.h | 60 +++--- zpak001.pk3dir/cfg/skill_cstrike.cfg | 15 ++ zpak001.pk3dir/cfg/skill_manifest.cfg | 3 +- zpak001.pk3dir/csprogs.dat.de.po | 19 -- zpak001.pk3dir/decls/def/ammo.def | 14 +- zpak001.pk3dir/decls/def/hostage.def | 14 +- zpak001.pk3dir/decls/def/items/defuse.def | 2 +- zpak001.pk3dir/decls/def/items/kevlar.def | 2 +- .../decls/def/items/kevlar_helmet.def | 2 +- .../decls/def/items/nightvision.def | 2 +- zpak001.pk3dir/decls/def/items/suit.def | 2 +- zpak001.pk3dir/decls/def/player.def | 25 +++ zpak001.pk3dir/decls/def/projectiles.def | 2 +- zpak001.pk3dir/decls/def/spawns.def | 12 +- zpak001.pk3dir/decls/def/weapons.def | 48 +---- zpak001.pk3dir/decls/def/weapons/c4.def | 28 ++- zpak001.pk3dir/decls/def/weapons/csbase.def | 52 ++++++ .../decls/def/weapons/flashbang.def | 19 +- zpak001.pk3dir/decls/def/weapons/glock18.def | 2 +- .../decls/def/weapons/hegrenade.def | 31 ++-- zpak001.pk3dir/decls/def/weapons/knife.def | 15 +- .../decls/def/weapons/smokegrenade.def | 20 +- zpak001.pk3dir/decls/def/weapons/xm1014.def | 2 +- zpak001.pk3dir/default_cstrike.cfg | 1 + zpak001.pk3dir/icon.tga | Bin 0 -> 8215 bytes zpak001.pk3dir/{default.cfg => quake.rc} | 1 + 62 files changed, 660 insertions(+), 406 deletions(-) create mode 100644 src/rules/deathmatch.qc create mode 100644 zpak001.pk3dir/decls/def/weapons/csbase.def create mode 100644 zpak001.pk3dir/icon.tga rename zpak001.pk3dir/{default.cfg => quake.rc} (84%) diff --git a/README.md b/README.md index 9760ff3..eac62b1 100644 --- a/README.md +++ b/README.md @@ -44,14 +44,19 @@ Here's the quick and dirty instructions for those unfamilar: ``` $ git clone https://code.idtech.space/vera/nuclide Nuclide-SDK $ cd Nuclide-SDK -$ ./build_engine.sh # (only required if you don't have an up-to-date FTEQW & FTEQCC in your PATH) + +# (only required if you don't have an up-to-date FTEQW & FTEQCC in your PATH) +$ make update +$ make fteqw + +# build the menu (from valve/) then our own game-logic: $ git clone https://code.idtech.space/fn/valve valve $ git clone https://code.idtech.space/fn/cstrike cstrike -$ SKIP_UPDATE=1 SKIP_RADIANT=1 ./build_game.sh valve -$ SKIP_UPDATE=1 SKIP_RADIANT=1 ./build_game.sh cstrike +$ make game GAME=valve +$ make game GAME=cstrike ``` -You can also issue `make` inside `valve/src/` and `cstrike/src`, but it won't build an `entities.def` file for use in Radiant (level editor family). +You can also issue `make` inside `valve/src/` and `cstrike/src`, but it won't generate some additional helper files. ** !! You need to also provide data-files !! ** diff --git a/src/client/game_event.qc b/src/client/game_event.qc index c30d962..ac516cb 100644 --- a/src/client/game_event.qc +++ b/src/client/game_event.qc @@ -59,15 +59,6 @@ switch (fHeader) { case EV_VIEWMODEL: View_PlayAnimation(readbyte()); break; - case EV_WEAPON_PICKUP: - int w = readbyte(); - - if (autocvar_cl_autoweaponswitch == 1) { - sendevent("PlayerSwitchWeapon", "i", w); - } - - HUD_WeaponPickupNotify(w); - break; case EV_RADIOMSG: Radio_PlayMessage(readbyte()); break; diff --git a/src/client/hud.qc b/src/client/hud.qc index 0a285d9..7950595 100644 --- a/src/client/hud.qc +++ b/src/client/hud.qc @@ -116,12 +116,12 @@ HUD_DrawNums(float fNumber, vector vecPos, float fAlpha, vector vColor) /* timer */ void -HUD_DrawTimer(int NSClientSpectator) +HUD_DrawTimer(int ncSpectator) { int iMinutes, iSeconds, iTens, iUnits; vector time_pos; - if (NSClientSpectator) { + if (ncSpectator) { time_pos = g_hudmins + [(g_hudres[0] / 2) - 62, 16]; } else { time_pos = g_hudmins + [(g_hudres[0] / 2) - 62, g_hudres[1] - 42]; diff --git a/src/client/hud_ammonotify.qc b/src/client/hud_ammonotify.qc index 6e3f43b..330aa19 100644 --- a/src/client/hud_ammonotify.qc +++ b/src/client/hud_ammonotify.qc @@ -99,7 +99,7 @@ HUD_AmmoNotify_Insert(int type, int count) /* called whenever we should check for pickup updates */ void -HUD_AmmoNotify_Check(NSClientPlayer pl) +HUD_AmmoNotify_Check(ncPlayer pl) { #if 0 HUD_AmmoNotify_Insert(0, pl.ammo_50ae - pl.ammo_50ae_net); @@ -119,6 +119,6 @@ HUD_AmmoNotify_Check(NSClientPlayer pl) } void -HUD_ItemNotify_Check(NSClientPlayer pl) +HUD_ItemNotify_Check(ncPlayer pl) { } \ No newline at end of file diff --git a/src/client/progs.src b/src/client/progs.src index 73a5c38..0331690 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -1,6 +1,7 @@ #pragma target fte_5768 //#pragma flag enable assumeint #pragma progs_dat "../../csprogs.dat" +#pragma forcecrc 54730 #define CSQC #define CLIENT diff --git a/src/client/radar.qc b/src/client/radar.qc index dccac6d..74357f6 100644 --- a/src/client/radar.qc +++ b/src/client/radar.qc @@ -17,14 +17,14 @@ #define CSRADAR_DISTANCE 1024 var string g_cs_radar; -var NSRadar g_csRadar; +var ncRadar g_csRadar; void Radar_Init(void) { g_cs_radar = spriteframe("sprites/radar640.spr", 0, 0.0f); - g_csRadar = NSRadar::InitEmpty(); + g_csRadar = ncRadar::InitEmpty(); } void diff --git a/src/client/vgui_buymenu.qc b/src/client/vgui_buymenu.qc index dcd7b16..04cfe5e 100644 --- a/src/client/vgui_buymenu.qc +++ b/src/client/vgui_buymenu.qc @@ -14,10 +14,10 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -static VGUIWindow winBuyMenu; -static VGUILabel lblCategoryDescr; +static vguiWindow winBuyMenu; +static vguiLabel lblCategoryDescr; -class CSBuyMenuButton:VGUIButton +class CSBuyMenuButton:vguiButton { void CSBuyMenuButton(void); @@ -110,9 +110,9 @@ VGUI_BuyMenu(void) static CSBuyMenuButton btnPrimAmmo; static CSBuyMenuButton btnSecAmmo; static CSBuyMenuButton btnEquipment; - static VGUIButton btnCancel; - static VGUILabel lblSelectTeam; - static VGUIFrame frmBuyInfo; + static vguiButton btnCancel; + static vguiLabel lblSelectTeam; + static vguiFrame frmBuyInfo; static void VGUI_BuyMenu_Cancel(void) { winBuyMenu.Hide(); @@ -122,21 +122,21 @@ VGUI_BuyMenu(void) vector btnpos = [40,80]; initialized = TRUE; - winBuyMenu = spawn(VGUIWindow); + winBuyMenu = spawn(vguiWindow); winBuyMenu.SetSize('640 480'); - winBuyMenu.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); + winBuyMenu.SetStyleMask(vguiWindowBorderless | vguiWindowFullscreen); - lblSelectTeam = spawn(VGUILabel); + lblSelectTeam = spawn(vguiLabel); lblSelectTeam.SetTitle(Titles_GetTextBody("Title_select_category_of_purchase")); lblSelectTeam.SetTextSize(19); lblSelectTeam.SetPos([40, 38]); lblSelectTeam.SetSize('400 24'); - frmBuyInfo = spawn(VGUIFrame); + frmBuyInfo = spawn(vguiFrame); frmBuyInfo.SetPos('176 80'); frmBuyInfo.SetSize('200 100'); - lblCategoryDescr = spawn(VGUILabel); + lblCategoryDescr = spawn(vguiLabel); lblCategoryDescr.SetTitle(""); lblCategoryDescr.SetPos('185 90'); lblCategoryDescr.SetSize('375 250'); diff --git a/src/client/vgui_buypages.qc b/src/client/vgui_buypages.qc index d3a0dbd..31507a5 100644 --- a/src/client/vgui_buypages.qc +++ b/src/client/vgui_buypages.qc @@ -14,10 +14,10 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -static VGUIWindow winBuyMenuPage; -static VGUILabel lblBuyItemDescr; -static VGUILabel lblBuyItemTitle; -static VGUIPic imgBuyItemPic; +static vguiWindow winBuyMenuPage; +static vguiLabel lblBuyItemDescr; +static vguiLabel lblBuyItemTitle; +static vguiPic imgBuyItemPic; /* these id's are for the button tags only */ typedef enum @@ -104,7 +104,7 @@ const buyItems_t g_buyItemList [] = { string g_butItemDescr[29]; -class CSBuyItemButton:VGUIButton +class CSBuyItemButton:vguiButton { void CSBuyItemButton(void); @@ -150,9 +150,9 @@ void VGUI_BuyMenu_Page(int buyPage) { static int initialized; - static VGUIButton btnCancel; - static VGUIFrame frmBuyInfo; - static VGUILabel lblBuyScreenTitle; + static vguiButton btnCancel; + static vguiFrame frmBuyInfo; + static vguiLabel lblBuyScreenTitle; static CSBuyItemButton btnBuyItem1; static CSBuyItemButton btnBuyItem2; @@ -176,29 +176,29 @@ VGUI_BuyMenu_Page(int buyPage) vector btnpos = [40,80]; initialized = TRUE; - winBuyMenuPage = spawn(VGUIWindow); + winBuyMenuPage = spawn(vguiWindow); winBuyMenuPage.SetSize([640,480]); - winBuyMenuPage.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); + winBuyMenuPage.SetStyleMask(vguiWindowBorderless | vguiWindowFullscreen); - lblBuyScreenTitle = spawn(VGUILabel); + lblBuyScreenTitle = spawn(vguiLabel); lblBuyScreenTitle.SetTitle(Titles_GetTextBody("Title_select_category_of_purchase")); lblBuyScreenTitle.SetTextSize(19); lblBuyScreenTitle.SetPos([40, 38]); lblBuyScreenTitle.SetSize('400 24'); - frmBuyInfo = spawn(VGUIFrame); + frmBuyInfo = spawn(vguiFrame); frmBuyInfo.SetPos('176 80'); frmBuyInfo.SetSize('424 312'); - lblBuyItemDescr = spawn(VGUILabel); + lblBuyItemDescr = spawn(vguiLabel); lblBuyItemDescr.SetTitle(""); lblBuyItemDescr.SetPos('185 190'); lblBuyItemDescr.SetSize('408 250'); - imgBuyItemPic = spawn(VGUIPic); + imgBuyItemPic = spawn(vguiPic); imgBuyItemPic.SetPos([260, 130]); - lblBuyItemTitle = spawn(VGUILabel); + lblBuyItemTitle = spawn(vguiLabel); lblBuyItemTitle.SetPos([185, 96]); lblBuyItemTitle.SetTextSize(19); lblBuyItemTitle.SetSize([390, 24]); @@ -257,7 +257,7 @@ VGUI_BuyMenu_Page(int buyPage) btnBuyItem9.SetKeyEquivalent("9"); btnBuyItem9.SetFunc(VGUI_BuyMenu_Pistols_Cancel); - btnCancel = spawn(VGUIButton); + btnCancel = spawn(vguiButton); btnCancel.SetTitle(Titles_GetTextBody("Menu_Cancel")); btnCancel.SetPos('40 368'); btnCancel.SetSize('124 24'); diff --git a/src/client/vgui_changeclass_ct.qc b/src/client/vgui_changeclass_ct.qc index f471a6b..affd1c8 100644 --- a/src/client/vgui_changeclass_ct.qc +++ b/src/client/vgui_changeclass_ct.qc @@ -31,13 +31,13 @@ CSClassCT_Init(void) g_classDescrAuto = textfile_to_string("classes/autoselect.txt"); } -static VGUIWindow winClassSelectionCT; -static VGUIPic imgClassPreview; -static VGUILabel lblClassTitle; -static VGUILabel lblClassDescription; -static VGUILabel lblClassCounter; +static vguiWindow winClassSelectionCT; +static vguiPic imgClassPreview; +static vguiLabel lblClassTitle; +static vguiLabel lblClassDescription; +static vguiLabel lblClassCounter; -class CSClassButtonCT:VGUIButton +class CSClassButtonCT:vguiButton { void CSClassButtonCT(void); @@ -115,8 +115,8 @@ void VGUI_ChooseClassCT(void) { static int initialized; - static VGUILabel lblSelectClass; - static VGUIFrame frmClassInfo; + static vguiLabel lblSelectClass; + static vguiFrame frmClassInfo; static CSClassButtonCT btnSeal; static CSClassButtonCT btnGSG9; static CSClassButtonCT btnSAS; @@ -129,33 +129,33 @@ VGUI_ChooseClassCT(void) CSClassCT_Init(); - winClassSelectionCT = spawn(VGUIWindow); + winClassSelectionCT = spawn(vguiWindow); winClassSelectionCT.SetSize([640, 480]); - winClassSelectionCT.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); + winClassSelectionCT.SetStyleMask(vguiWindowBorderless | vguiWindowFullscreen); - lblSelectClass = spawn(VGUILabel); + lblSelectClass = spawn(vguiLabel); lblSelectClass.SetTitle(Titles_GetTextBody("Title_ct_model_selection")); lblSelectClass.SetTextSize(19); lblSelectClass.SetPos([40, 38]); lblSelectClass.SetSize([400, 24]); - frmClassInfo = spawn(VGUIFrame); + frmClassInfo = spawn(vguiFrame); frmClassInfo.SetPos([176, 80]); frmClassInfo.SetSize([424, 312]); - imgClassPreview = spawn(VGUIPic); + imgClassPreview = spawn(vguiPic); imgClassPreview.SetPos([190, 90]); - lblClassTitle = spawn(VGUILabel); + lblClassTitle = spawn(vguiLabel); lblClassTitle.SetPos([338, 90]); lblClassTitle.SetTextSize(19); lblClassTitle.SetSize([320, 24]); - lblClassCounter = spawn(VGUILabel); + lblClassCounter = spawn(vguiLabel); lblClassCounter.SetPos([338, 90 + 32]); lblClassCounter.SetSize([320, 18]); - lblClassDescription = spawn(VGUILabel); + lblClassDescription = spawn(vguiLabel); lblClassDescription.SetPos([338, 90 + 32 + 32]); lblClassDescription.SetSize([250, 240]); diff --git a/src/client/vgui_changeclass_t.qc b/src/client/vgui_changeclass_t.qc index e08a9d8..d0acd13 100644 --- a/src/client/vgui_changeclass_t.qc +++ b/src/client/vgui_changeclass_t.qc @@ -32,13 +32,13 @@ CSClassT_Init(void) g_classDescrAuto = textfile_to_string("classes/autoselect.txt"); } -static VGUIWindow winClassSelection; -static VGUIPic imgClassPreview; -static VGUILabel lblClassTitle; -static VGUILabel lblClassDescription; -static VGUILabel lblClassCounter; +static vguiWindow winClassSelection; +static vguiPic imgClassPreview; +static vguiLabel lblClassTitle; +static vguiLabel lblClassDescription; +static vguiLabel lblClassCounter; -class CSClassButtonT:VGUIButton +class CSClassButtonT:vguiButton { void CSClassButtonT(void); @@ -116,8 +116,8 @@ void VGUI_ChooseClassT(void) { static int initialized; - static VGUILabel lblSelectClass; - static VGUIFrame frmClassInfo; + static vguiLabel lblSelectClass; + static vguiFrame frmClassInfo; static CSClassButtonT btnPhoenix; static CSClassButtonT btnLeet; static CSClassButtonT btnArctic; @@ -130,33 +130,33 @@ VGUI_ChooseClassT(void) CSClassT_Init(); - winClassSelection = spawn(VGUIWindow); + winClassSelection = spawn(vguiWindow); winClassSelection.SetSize([640, 480]); - winClassSelection.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); + winClassSelection.SetStyleMask(vguiWindowBorderless | vguiWindowFullscreen); - lblSelectClass = spawn(VGUILabel); + lblSelectClass = spawn(vguiLabel); lblSelectClass.SetTitle(Titles_GetTextBody("Title_terrorist_model_selection")); lblSelectClass.SetTextSize(19); lblSelectClass.SetPos([40, 38]); lblSelectClass.SetSize([400, 24]); - frmClassInfo = spawn(VGUIFrame); + frmClassInfo = spawn(vguiFrame); frmClassInfo.SetPos([176, 80]); frmClassInfo.SetSize([424, 312]); - imgClassPreview = spawn(VGUIPic); + imgClassPreview = spawn(vguiPic); imgClassPreview.SetPos([190, 90]); - lblClassTitle = spawn(VGUILabel); + lblClassTitle = spawn(vguiLabel); lblClassTitle.SetPos([338, 90]); lblClassTitle.SetTextSize(19); lblClassTitle.SetSize([320, 24]); - lblClassCounter = spawn(VGUILabel); + lblClassCounter = spawn(vguiLabel); lblClassCounter.SetPos([338, 90 + 32]); lblClassCounter.SetSize([320, 18]); - lblClassDescription = spawn(VGUILabel); + lblClassDescription = spawn(vguiLabel); lblClassDescription.SetPos([338, 90 + 32 + 32]); lblClassDescription.SetSize([250, 240]); diff --git a/src/client/vgui_chooseteam.qc b/src/client/vgui_chooseteam.qc index b8b6541..43eb2b7 100644 --- a/src/client/vgui_chooseteam.qc +++ b/src/client/vgui_chooseteam.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -static VGUIWindow winChooseTeam; +static vguiWindow winChooseTeam; string VGUI_ChooseTeam_MapInfo(void) @@ -63,14 +63,14 @@ void VGUI_ChooseTeam(void) { static int initialized; - static VGUIButton btnJoinT; - static VGUIButton btnJoinCT; - static VGUIButton btnAutoAssign; - static VGUIButton btnGoSpectator; - static VGUIFrame frmMapInfo; - static VGUILabel lblSelectTeam; - static VGUILabel lblMapName; - static VGUILabel lblMapInfo; + static vguiButton btnJoinT; + static vguiButton btnJoinCT; + static vguiButton btnAutoAssign; + static vguiButton btnGoSpectator; + static vguiFrame frmMapInfo; + static vguiLabel lblSelectTeam; + static vguiLabel lblMapName; + static vguiLabel lblMapInfo; static void VGUI_ChooseTeam_CT(void) { localcmd("cmd joinTeam 2\n"); @@ -97,53 +97,53 @@ VGUI_ChooseTeam(void) vector btnpos = [40,80]; initialized = TRUE; - winChooseTeam = spawn(VGUIWindow); + winChooseTeam = spawn(vguiWindow); winChooseTeam.SetSize('640 480'); - winChooseTeam.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); + winChooseTeam.SetStyleMask(vguiWindowBorderless | vguiWindowFullscreen); - lblSelectTeam = spawn(VGUILabel); + lblSelectTeam = spawn(vguiLabel); lblSelectTeam.SetTitle("Select Your Team"); lblSelectTeam.SetTextSize(19); lblSelectTeam.SetPos([40, 38]); lblSelectTeam.SetSize('400 24'); - frmMapInfo = spawn(VGUIFrame); + frmMapInfo = spawn(vguiFrame); frmMapInfo.SetPos('176 80'); frmMapInfo.SetSize('424 312'); - lblMapName = spawn(VGUILabel); + lblMapName = spawn(vguiLabel); lblMapName.SetTitle(mapname); lblMapName.SetTextSize(19); lblMapName.SetPos('194 105'); lblMapName.SetSize('250 312'); - lblMapInfo = spawn(VGUILabel); + lblMapInfo = spawn(vguiLabel); lblMapInfo.SetTitle(VGUI_ChooseTeam_MapInfo()); lblMapInfo.SetPos('194 129'); lblMapInfo.SetSize('375 250'); - btnJoinT = spawn(VGUIButton); + btnJoinT = spawn(vguiButton); btnJoinT.SetTitle("Terrorist Forces"); btnJoinT.SetPos('40 80'); btnJoinT.SetSize('124 24'); btnJoinT.SetKeyEquivalent("1"); btnJoinT.SetFunc(VGUI_ChooseTeam_T); - btnJoinCT = spawn(VGUIButton); + btnJoinCT = spawn(vguiButton); btnJoinCT.SetTitle("CT Forces"); btnJoinCT.SetPos('40 112'); btnJoinCT.SetSize('124 24'); btnJoinCT.SetKeyEquivalent("2"); btnJoinCT.SetFunc(VGUI_ChooseTeam_CT); - btnAutoAssign = spawn(VGUIButton); + btnAutoAssign = spawn(vguiButton); btnAutoAssign.SetTitle("Auto Assign"); btnAutoAssign.SetPos('40 208'); btnAutoAssign.SetSize('124 24'); btnAutoAssign.SetKeyEquivalent("5"); btnAutoAssign.SetFunc(VGUI_ChooseTeam_Auto); - btnGoSpectator = spawn(VGUIButton); + btnGoSpectator = spawn(vguiButton); btnGoSpectator.SetTitle("Spectate"); btnGoSpectator.SetPos('40 272'); btnGoSpectator.SetSize('124 24'); diff --git a/src/client/vgui_motd.qc b/src/client/vgui_motd.qc index 2293217..c8b9634 100644 --- a/src/client/vgui_motd.qc +++ b/src/client/vgui_motd.qc @@ -18,11 +18,11 @@ void VGUI_ShowMOTD(void) { static int initialized; - static VGUIButton winMotdClose; - static VGUIWindow winMotd; - static VGUILabel winMotdHostname; - static VGUILabel winMotdBody; - static VGUIFrame frmWindow; + static vguiButton winMotdClose; + static vguiWindow winMotd; + static vguiLabel winMotdHostname; + static vguiLabel winMotdBody; + static vguiFrame frmWindow; static void VGUI_ShowMOTD_Close(void) { @@ -35,27 +35,27 @@ VGUI_ShowMOTD(void) if (!initialized) { initialized = TRUE; - winMotd = spawn(VGUIWindow); + winMotd = spawn(vguiWindow); winMotd.SetTitle("Message Of The Day"); - winMotd.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); + winMotd.SetStyleMask(vguiWindowBorderless | vguiWindowFullscreen); winMotd.SetSize('424 312'); - frmWindow = spawn(VGUIFrame); + frmWindow = spawn(vguiFrame); frmWindow.SetPos('0 0'); frmWindow.SetSize('424 312'); - winMotdClose = spawn(VGUIButton); + winMotdClose = spawn(vguiButton); winMotdClose.SetTitle("OK"); winMotdClose.SetPos([16, 266]); winMotdClose.SetSize([160, 30]); winMotdClose.SetFunc(VGUI_ShowMOTD_Close); - winMotdHostname = spawn(VGUILabel); + winMotdHostname = spawn(vguiLabel); winMotdHostname.SetTitle(serverkey("hostname")); winMotdHostname.SetTextSize(19); winMotdHostname.SetPos([16, 20]); - winMotdBody = spawn(VGUILabel); + winMotdBody = spawn(vguiLabel); winMotdBody.SetTitle(MOTD_GetTextBody()); winMotdBody.SetPos([16, 48]); winMotdBody.SetSize([392, 210]); diff --git a/src/client/vgui_spectator.qc b/src/client/vgui_spectator.qc index e77ac54..e5e17ed 100644 --- a/src/client/vgui_spectator.qc +++ b/src/client/vgui_spectator.qc @@ -18,7 +18,7 @@ #define SPEC_FG_COL [0.561,0.561,0.212] class -CSSpectateHUD:VGUIWidget +CSSpectateHUD:vguiWidget { void CSSpectateHUD(void); @@ -39,7 +39,7 @@ CSSpectateHUD::Draw(void) float flSep; string strText; int iMinutes, iSeconds; - NSClientSpectator spec = (NSClientSpectator)pSeat->m_ePlayer; + ncSpectator spec = (ncSpectator)pSeat->m_ePlayer; float moneyValue = getplayerkeyfloat(player_localnum, "*money"); /* parts on top and bottom */ diff --git a/src/progs.src b/src/progs.src index 2c2a868..f3e407d 100755 --- a/src/progs.src +++ b/src/progs.src @@ -1,2 +1,3 @@ #pragma sourcefile client/progs.src #pragma sourcefile server/progs.src +#pragma sourcefile rules/counterstrike.qc diff --git a/src/rules/Makefile b/src/rules/Makefile index ed59d91..fb8d994 100644 --- a/src/rules/Makefile +++ b/src/rules/Makefile @@ -2,4 +2,5 @@ QCC=fteqcc all: mkdir -pv ../../zpak001.pk3dir/progs/ + $(QCC) deathmatch.qc $(QCC) counterstrike.qc diff --git a/src/rules/counterstrike.qc b/src/rules/counterstrike.qc index 48f75a6..7abe00d 100644 --- a/src/rules/counterstrike.qc +++ b/src/rules/counterstrike.qc @@ -32,6 +32,16 @@ typedef enum STATE_OVER = 5i } csGameState_t; +string g_csGameStateName[] = +{ + "STATE_INACTIVE", + "STATE_COMMENCING", + "STATE_FREEZE", + "STATE_ACTIVE", + "STATE_END", + "STATE_OVER" +}; + var csGameState_t g_csGameState; var float g_cs_gametime; var int g_csSwapTeamRoundCounter; @@ -117,6 +127,12 @@ GameState(void) return (g_csGameState); } +string +GameStateName(void) +{ + return (g_csGameStateName[g_csGameState]); +} + float GameTime(void) { @@ -461,7 +477,7 @@ Round_TimerUpdate(void) /* our continously running down timer */ g_cs_gametime = bound(0.0f, g_cs_gametime - frametime, g_cs_gametime); - //printf("%f\n", g_cs_gametime); + //printf("%f %S\n", GameTime(), GameStateName()); /* if the round is over or the game is done with... */ if (GameState() == STATE_COMMENCING || GameState() == STATE_END) { @@ -814,6 +830,7 @@ CodeCallback_FrameStart(void) serverinfo.SetInteger("cs_roundsplayed", 0i); return; } + /* should only ever run when players are actually present. */ Round_TimerUpdate(); @@ -912,17 +929,17 @@ CodeCallback_MaxItemPerSlot(int weaponSlot) } void -CodeCallback_PlayerSpawn(void) +CodeCallback_PlayerSpawn(entity playerEntity) { /* first course of action is to kick players into spectator cam */ - CS_GoSpectator(self); + CS_GoSpectator(playerEntity); } void -CodeCallback_PlayerDisconnect(void) +CodeCallback_PlayerDisconnect(entity playerEntity) { /* if they leave, timeout, get kicked (or banned), we gotta know! */ - CS_PlayerRemovedFromGame(self); + CS_PlayerRemovedFromGame(playerEntity); } void @@ -932,18 +949,18 @@ 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 player scores */ if (ents.isPlayer(attacker)) { - if (self == attacker) { + if (playerEntity == attacker) { attacker.frags--; - } else if (self.team == attacker.team) { + } else if (playerEntity.team == attacker.team) { attacker.frags--; Money_AddMoney(attacker, cvars.GetInteger("fcs_penalty_teamkill")); } else { @@ -953,29 +970,29 @@ CodeCallback_PlayerKilled(entity inflictor, entity attacker, string weapon) } /* scoreboard death icon */ - if (ents.isPlayer(self)) { - userinfo.SetString(self, "*icon1", "d_skull"); - userinfo.SetString(self, "*icon1_r", "1"); - userinfo.SetString(self, "*icon1_g", "0"); - userinfo.SetString(self, "*icon1_b", "0"); + if (ents.isPlayer(playerEntity)) { + userinfo.SetString(playerEntity, "*icon1", "d_skull"); + userinfo.SetString(playerEntity, "*icon1_r", "1"); + userinfo.SetString(playerEntity, "*icon1_g", "0"); + userinfo.SetString(playerEntity, "*icon1_b", "0"); /* turn into a fake spec */ - ents.Input(self, "Spectate", "", world); + ents.Input(playerEntity, "Spectate", "", world); } - CS_PlayerRemovedFromGame(self); + CS_PlayerRemovedFromGame(playerEntity); } bool -CodeCallback_CallRequestTeam(int teamNum) +CodeCallback_CallRequestTeam(entity playerEntity, int teamNum) { /* can't switch teams while alive. */ - if (ents.isAlive(self) == true) { + if (ents.isAlive(playerEntity) == true) { return (false); } /* can't switch teams while we're a VIP */ - if (IsVIP(self) == true) { + if (IsVIP(playerEntity) == true) { return (false); } @@ -986,13 +1003,13 @@ CodeCallback_CallRequestTeam(int teamNum) switch (teamNum) { case TEAM_T: - ents.Input(self, "SetTeam", "1", self); + ents.Input(playerEntity, "SetTeam", "1", playerEntity); break; case TEAM_CT: - ents.Input(self, "SetTeam", "2", self); + ents.Input(playerEntity, "SetTeam", "2", playerEntity); break; default: - CS_GoSpectator(self); + CS_GoSpectator(playerEntity); return (true); } @@ -1000,57 +1017,57 @@ CodeCallback_CallRequestTeam(int teamNum) } bool -CodeCallback_ClientCommand(string command) +CodeCallback_ClientCommand(entity playerEntity, string command) { float commandArgs = tokenize(command); switch (argv(0)) { /* class selection */ case "terror": - SetTClass(self, 1); - CodeCallback_CallRequestTeam(TEAM_T); - CS_RequestSpawn(self); + SetTClass(playerEntity, 1); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); break; case "leet": - SetTClass(self, 2); - CodeCallback_CallRequestTeam(TEAM_T); - CS_RequestSpawn(self); + SetTClass(playerEntity, 2); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); break; case "arctic": - SetTClass(self, 3); - CodeCallback_CallRequestTeam(TEAM_T); - CS_RequestSpawn(self); + SetTClass(playerEntity, 3); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); break; case "guerilla": - SetTClass(self, 4); - CodeCallback_CallRequestTeam(TEAM_T); - CS_RequestSpawn(self); + SetTClass(playerEntity, 4); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); break; case "urban": - SetCTClass(self, 1); - CodeCallback_CallRequestTeam(TEAM_CT); - CS_RequestSpawn(self); + SetCTClass(playerEntity, 1); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); break; case "gsg9": - SetCTClass(self, 2); - CodeCallback_CallRequestTeam(TEAM_CT); - CS_RequestSpawn(self); + SetCTClass(playerEntity, 2); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); break; case "sas": - SetCTClass(self, 3); - CodeCallback_CallRequestTeam(TEAM_CT); - CS_RequestSpawn(self); + SetCTClass(playerEntity, 3); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); break; case "gign": - SetCTClass(self, 4); - CodeCallback_CallRequestTeam(TEAM_CT); - CS_RequestSpawn(self); + SetCTClass(playerEntity, 4); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); break; case "buy": - Money_Purchase(self, argv(1)); + Money_Purchase(playerEntity, argv(1)); break; case "buyammo": - Money_PurchaseAmmoForSlot(self, stoi(argv(1))); + Money_PurchaseAmmoForSlot(playerEntity, stoi(argv(1))); break; default: return (false); @@ -1060,13 +1077,13 @@ CodeCallback_ClientCommand(string command) } bool -CodeCallback_ImpulseCommand(float impulseNum) +CodeCallback_ImpulseCommand(entity playerEntity, float impulseNum) { switch (impulseNum) { /* this is how Half-Life triggers the flashlight. `impulse 100`. */ case 100: if (AllowFlashlight() == true) { - ents.Input(self, "UseItem", "item_suit", self); + ents.Input(playerEntity, "UseItem", "item_suit", playerEntity); } break; default: diff --git a/src/rules/deathmatch.qc b/src/rules/deathmatch.qc new file mode 100644 index 0000000..30dbda3 --- /dev/null +++ b/src/rules/deathmatch.qc @@ -0,0 +1,171 @@ +/* + * Copyright (c) 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. + */ + +#pragma PROGS_DAT "../../zpak001.pk3dir/progs/deathmatch.dat" + +#include "../../../src/server/api.h" + +bool +IsTeamplay(void) +{ + return cvars.GetBool("mp_teamplay"); +} + +bool +AllowFlashlight(void) +{ + return cvars.GetBool("mp_flashlight"); +} + +void +CodeCallback_StartGameType(void) +{ + motd.LoadDefault(); + + if (IsTeamplay() == true) { + teams.SetUp(1, "Terrorist", [153, 204, 255], true); + teams.SetSpawnPoint(1, "info_player_deathmatch"); + teams.SetUp(2, "Counter-Terrorist", [255, 63, 63], true); + teams.SetSpawnPoint(2, "info_player_deathmatch"); + } else { + game.SetSpawnPoint("info_player_deathmatch"); + } +} + +void +HLDM_PlayerSpawn(entity playerEntity) +{ + string playerModel; + + ents.ChangeToClass(playerEntity, "player_csdm"); + + if (IsTeamplay() == true) { + float teamCount = 2; + float playerTeam = playerEntity.team; + string teamModel; + + /* not part of a team? pick one of the ones we have */ + /* TODO: this should sort us into the lowest team */ + if (playerTeam == 0) { + playerTeam = 1 + floor(random(0, teamCount)); /* teams start at 1 after all */ + ents.Input(playerEntity, "SetTeam", ftos(playerTeam), playerEntity); + } + + teamModel = argv(playerTeam - 1); + playerModel = sprintf("models/player/%s/%s.mdl", teamModel, teamModel); + } else { + /* interpret the 'model' InfoKey */ + playerModel = userinfo.GetString(playerEntity, "model"); + + if (playerModel != "") { + playerModel = sprintf("models/player/%s/%s.mdl", playerModel, playerModel); + } + } + + /* fallback is always models/player.mdl for Half-Life */ + if (playerModel == "" || exists.InVFS(playerModel) == false) { + playerModel = "models/player.mdl"; + } + + playerEntity.modelindex = getmodelindex(playerModel); /* keep OG size */ + game.TeleportToSpawn(playerEntity); +} + +void +CodeCallback_PlayerSpawn(entity playerEntity) +{ + if (IsTeamplay() == false) { + HLDM_PlayerSpawn(playerEntity); + } else { + ents.ChangeToClass(playerEntity, "spectator"); + game.TeleportToSpawn(playerEntity); + } +} + + +void +CodeCallback_PlayerDisconnect(entity playerEntity) +{ + +} + +bool +CodeCallback_PlayerRequestRespawn(entity playerEntity) +{ + CodeCallback_PlayerSpawn(playerEntity); + return (true); +} + +void +CodeCallback_PlayerDamage(entity playerEntity, entity inflictor, entity attacker) +{ + +} + +bool +CodeCallback_CallRequestTeam(entity playerEntity, int teamNum) +{ + ents.Input(playerEntity, "SetTeam", itos(teamNum), playerEntity); + ents.Input(playerEntity, "Damage", "1000", playerEntity); + return (true); +} + +void +CodeCallback_PlayerKilled(entity playerEntity, entity inflictor, entity attacker, string weapon) +{ + combat.Obituary(playerEntity.netname, attacker.netname, weapon, ""); + + /* death-counter */ + playerEntity.deaths++; + + /* update score-counter */ + if (ents.isPlayer(attacker)) { + if (playerEntity == attacker) { + attacker.frags--; + } else { + attacker.frags++; + } + } +} + +bool +CodeCallback_ClientCommand(entity playerEntity, string command) +{ + float commandArgs = tokenize(command); + + switch (argv(0)) { + default: + return (false); + } + + return (true); +} + +bool +CodeCallback_ImpulseCommand(entity playerEntity, float impulseNum) +{ + switch (impulseNum) { + case 100: + if (AllowFlashlight() == true) { + ents.Input(playerEntity, "UseItem", "item_suit", playerEntity); + } + break; + default: + return (false); + } + + return (true); +} diff --git a/src/server/armoury_entity.qc b/src/server/armoury_entity.qc index b78e63e..dc835ca 100644 --- a/src/server/armoury_entity.qc +++ b/src/server/armoury_entity.qc @@ -97,7 +97,7 @@ string g_cstrike_armourymodels[19] = { "models/w_smokegrenade.mdl" }; -class armoury_entity:NSRenderableEntity +class armoury_entity:ncRenderableEntity { int m_iCount; int m_iLeft; diff --git a/src/server/func_bomb_target.qc b/src/server/func_bomb_target.qc index 31fd733..ee91f88 100644 --- a/src/server/func_bomb_target.qc +++ b/src/server/func_bomb_target.qc @@ -28,7 +28,7 @@ Once the bomb explodes inside this volume, it'll trigger its targets. */ class -func_bomb_target:NSBrushTrigger +func_bomb_target:ncBrushTrigger { void(void) func_bomb_target; diff --git a/src/server/func_buyzone.qc b/src/server/func_buyzone.qc index d161a80..964fcfb 100644 --- a/src/server/func_buyzone.qc +++ b/src/server/func_buyzone.qc @@ -41,7 +41,7 @@ Choices for 'team' include: */ class -func_buyzone:NSBrushTrigger +func_buyzone:ncBrushTrigger { void(void) func_buyzone; diff --git a/src/server/func_escapezone.qc b/src/server/func_escapezone.qc index 0851885..6e8aba7 100644 --- a/src/server/func_escapezone.qc +++ b/src/server/func_escapezone.qc @@ -27,7 +27,7 @@ Used in the Escape mode (es_* maps). */ class -func_escapezone:NSBrushTrigger +func_escapezone:ncBrushTrigger { void func_escapezone(void); diff --git a/src/server/func_hostage_rescue.qc b/src/server/func_hostage_rescue.qc index dca820d..fe7cec1 100644 --- a/src/server/func_hostage_rescue.qc +++ b/src/server/func_hostage_rescue.qc @@ -29,7 +29,7 @@ zones will be placed in Counter-Terrorist player spawn nodes automatically. */ class -func_hostage_rescue:NSBrushTrigger +func_hostage_rescue:ncBrushTrigger { void(void) func_hostage_rescue; diff --git a/src/server/func_vip_safetyzone.qc b/src/server/func_vip_safetyzone.qc index dab8218..a31bacb 100644 --- a/src/server/func_vip_safetyzone.qc +++ b/src/server/func_vip_safetyzone.qc @@ -26,7 +26,7 @@ VIP safety zone. Used in the assassination mode (as_* maps). */ -class func_vip_safetyzone:NSBrushTrigger +class func_vip_safetyzone:ncBrushTrigger { void func_vip_safetyzone(void); diff --git a/src/server/hostage_entity.qc b/src/server/hostage_entity.qc index 7ac4af0..6273474 100644 --- a/src/server/hostage_entity.qc +++ b/src/server/hostage_entity.qc @@ -79,15 +79,15 @@ enum HOSA_DEADTABLE3 }; -class CSHostage:NSTalkMonster +class CSHostage:ncTalkMonster { bool m_bUsedOnce; void CSHostage(void); virtual void OnPlayerUse(void); - virtual void Pain(entity, entity, int, vector, int); - virtual void Death(entity, entity, int, vector, int); + virtual void Pain(entity, entity, int, vector, vector, int); + virtual void Death(entity, entity, int, vector, vector, int); }; @@ -123,19 +123,19 @@ CSHostage::OnPlayerUse(void) m_bUsedOnce = true; } - NSTalkMonster::OnPlayerUse(); + ncTalkMonster::OnPlayerUse(); } void -CSHostage::Pain(entity inflictor, entity attacker, int damageDealt, vector dir, int location) +CSHostage::Pain(entity inflictor, entity attacker, int damageDealt, vector dir, vector absImpactPos, int hitBody) { - super::Pain(inflictor, attacker, damageDealt, dir, location); + super::Pain(inflictor, attacker, damageDealt, dir, absImpactPos, hitBody); if (IsAlive() == false) { return; } - switch (location) { + switch (hitBody) { case BODY_HEAD: case BODY_DEFAULT: case BODY_CHEST: @@ -165,12 +165,12 @@ CSHostage::Pain(entity inflictor, entity attacker, int damageDealt, vector dir, } void -CSHostage::Death(entity inflictor, entity attacker, int damageDealt, vector dir, int location) +CSHostage::Death(entity inflictor, entity attacker, int damageDealt, vector dir, vector absImpactPos, int hitBody) { WarnAllies(); if (IsAlive() == true) { - switch (location) { + switch (hitBody) { case BODY_HEAD: SetFrame(HOSA_DIE_HEADSHOT); break; @@ -191,6 +191,6 @@ CSHostage::Death(entity inflictor, entity attacker, int damageDealt, vector dir, SetHealth(0); /* now mark our state as 'dead' */ - super::Death(inflictor, attacker, damageDealt, dir, location); + super::Death(inflictor, attacker, damageDealt, dir, absImpactPos, hitBody); SetSolid(SOLID_NOT); } diff --git a/src/server/info_buyzone.qc b/src/server/info_buyzone.qc index dc20fc4..6232d57 100644 --- a/src/server/info_buyzone.qc +++ b/src/server/info_buyzone.qc @@ -26,7 +26,7 @@ See func_buyzone for more information. */ class -info_buyzone:NSPointTrigger +info_buyzone:ncPointTrigger { void info_buyzone(void); diff --git a/src/server/info_hostage_rescue.qc b/src/server/info_hostage_rescue.qc index 2232972..64cb7ee 100644 --- a/src/server/info_hostage_rescue.qc +++ b/src/server/info_hostage_rescue.qc @@ -29,7 +29,7 @@ If neither a info_hostage_rescue or a func_hostage_rescue is placed, zones will be placed in Counter-Terrorist player spawn nodes automatically. */ -class info_hostage_rescue:NSPointTrigger +class info_hostage_rescue:ncPointTrigger { void(void) info_hostage_rescue; @@ -62,7 +62,7 @@ info_hostage_rescue::Touch(entity eToucher) return; } - NSTalkMonster hosty = (NSTalkMonster)other; + ncTalkMonster hosty = (ncTalkMonster)other; if (hosty.GetSolid() == SOLID_NOT) { return; diff --git a/src/server/info_map_parameters.qc b/src/server/info_map_parameters.qc index 71452bf..27924fa 100644 --- a/src/server/info_map_parameters.qc +++ b/src/server/info_map_parameters.qc @@ -41,7 +41,7 @@ typedef enum } imp_buyrules_t; class -info_map_parameters:NSEntity +info_map_parameters:ncEntity { float m_flBombRadius; imp_buyrules_t m_buyRules; diff --git a/src/server/progs.src b/src/server/progs.src index 568142d..6da7e8a 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -1,6 +1,7 @@ #pragma target fte_5768 //#pragma flag enable assumeint #pragma progs_dat "../../progs.dat" +#pragma forcecrc 54730 #define QWSSQC #define SERVER diff --git a/src/server/server.qc b/src/server/server.qc index c1daa49..4baff6f 100644 --- a/src/server/server.qc +++ b/src/server/server.qc @@ -14,20 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -void -Game_InitRules(void) -{ - if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { - g_grMode = NSGameRules::InitFromProgs("progs/singleplayer.dat"); - } else { - if (cvar("fcs_deathmatch") == 1) { - g_grMode = NSGameRules::InitFromProgs("progs/deathmatch.dat"); - } else { - g_grMode = NSGameRules::InitFromProgs("progs/counterstrike.dat"); - } - } -} - void Game_Worldspawn(void) { @@ -42,6 +28,4 @@ Game_Worldspawn(void) Sound_Precache("player.headshotarmor"); Sound_Precache("Player.FlashLightOff"); Sound_Precache("Player.FlashLightOn"); - - FX_Corpse_Init(); } diff --git a/src/shared/CSProjectile.h b/src/shared/CSProjectile.h index eb3d2b8..e5bd3fa 100644 --- a/src/shared/CSProjectile.h +++ b/src/shared/CSProjectile.h @@ -15,12 +15,13 @@ */ class -CSProjectile:NSProjectile +CSProjectile:ncProjectile { public: void CSProjectile(void); #ifdef SERVER + virtual void HasExploded(void); nonvirtual void SetRangeModifier(float); nonvirtual void SetPenetrationMaxThickness(float); nonvirtual void SetPenetrationPower(int); diff --git a/src/shared/CSProjectile.qc b/src/shared/CSProjectile.qc index 463f1e2..5fba891 100644 --- a/src/shared/CSProjectile.qc +++ b/src/shared/CSProjectile.qc @@ -21,6 +21,21 @@ CSProjectile::CSProjectile(void) } #ifdef SERVER +void +CSProjectile::HasExploded(void) +{ + float flashTime = GetSpawnFloat("flashTime"); + float smokeTime = GetSpawnFloat("smokeTime"); + + if (flashTime > 0.0f) { + FX_Flashbang(GetOrigin()); + } + + if (smokeTime > 0.0f) { + FX_Smokenade(GetOrigin()); + } +} + void CSProjectile::SetRangeModifier(float rangeModifier) { @@ -143,7 +158,7 @@ CSProjectile::_FireSingle(vector vecPos, vector vecAngles, float flDamage, float if (trace_ent.takedamage != DAMAGE_NO && trace_ent.iBleeds) { Sound_Play(trace_ent, CHAN_BODY, "damage_bullet.hit"); - NSClientPlayer pl = (NSClientPlayer)trace_ent; + ncPlayer pl = (ncPlayer)trace_ent; /* modify the damage based on the location */ switch (trace_surface_id) { case BODY_HEAD: @@ -183,7 +198,7 @@ CSProjectile::_FireSingle(vector vecPos, vector vecAngles, float flDamage, float if (trace_ent != m_eMultiTarget) { trace_endpos = endPos; _ApplyDamage(); - m_eMultiTarget = (NSSurfacePropEntity)trace_ent; + m_eMultiTarget = (ncSurfacePropEntity)trace_ent; m_iMultiValue = flDamage; } else { m_iMultiValue += flDamage; @@ -214,7 +229,7 @@ CSProjectile::_FireSingle(vector vecPos, vector vecAngles, float flDamage, float } CSProjectile -CSProjectile_SpawnDef(string entityDef, NSEntity theOwner, float rangeMod, int power, vector spread) +CSProjectile_SpawnDef(string entityDef, ncEntity theOwner, float rangeMod, int power, vector spread) { entity oldself = self; diff --git a/src/shared/CSWeapon.qc b/src/shared/CSWeapon.qc index df5c8c2..99c8f49 100644 --- a/src/shared/CSWeapon.qc +++ b/src/shared/CSWeapon.qc @@ -29,21 +29,11 @@ public: virtual void UpdateGUI(void); #endif + virtual bool CanFire(void); virtual void Draw(void); - virtual void SecondaryAttack(void); virtual void Release(void); virtual void FiredWeaponAttack(string); virtual void SwitchedToWeapon(void); - -#ifdef CLIENT -private: - int m_iHudSlot; - int m_iHudSlotPos; - - string m_ammoIcon; - string m_crossHair; - NSWeapon m_nextWeapon; -#endif }; void @@ -52,44 +42,36 @@ CSWeapon::CSWeapon(void) } +bool +CSWeapon::CanFire(void) +{ + bool returnValue = super::CanFire(); + + if (returnValue == true) { + if (!owner.gflags & GF_BOMBZONE && GetSpawnBool("onlyInBombZone")) { + returnValue = false; + } + } + + return (returnValue); +} + void CSWeapon::SwitchedToWeapon(void) { Cstrike_ShotReset((CSPlayer)owner); } -void -CSWeapon::SecondaryAttack(void) -{ - if (GetDefBool("altSilences") == true) { - if (CanFire() == false) { - return; - } - - float silAnimation = 0; - float silTime; - - m_iMode = 1 - m_iMode; - - if (m_iMode) - silAnimation = GetDefAct("actAddSil"); - else - silAnimation = GetDefAct("actDetachSil"); - - SetWeaponFrame(silAnimation); - silTime = frameduration(m_viewModel, silAnimation); - SetAttackNext(silTime); - SetIdleNext(silTime + 1.0f); - return; - } - - super::SecondaryAttack(); -} - void CSWeapon::FiredWeaponAttack(string defName) { CSPlayer ourOwner = (CSPlayer)owner; + + if (GetSubDefBool(defName, "csWeaponMode") == false) { + super::FiredWeaponAttack(defName); + return; + } + int numProjectiles = GetSubDefInt(defName, "numProjectiles"); string traceInfo = GetSubDefString(defName, "def_onFire"); float flAccuracyDivisor = GetSubDefFloat(defName,"accuracyDivisor"); @@ -213,4 +195,4 @@ CSWeapon::UpdateGUI(void) HUD_DrawAmmo3(); } } -#endif \ No newline at end of file +#endif diff --git a/src/shared/fx_flashbang.qc b/src/shared/fx_flashbang.qc index c2b843c..6e5e0ff 100644 --- a/src/shared/fx_flashbang.qc +++ b/src/shared/fx_flashbang.qc @@ -46,10 +46,10 @@ FX_Flashbang(vector org) /* send the blinding env_fade event */ WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, EV_FADE); - WriteFloat(MSG_MULTICAST, 1.0f); - WriteFloat(MSG_MULTICAST, 1.0f); - WriteFloat(MSG_MULTICAST, 1.0f); - WriteFloat(MSG_MULTICAST, 1.0f); + WriteByte(MSG_MULTICAST, 255); + WriteByte(MSG_MULTICAST, 255); + WriteByte(MSG_MULTICAST, 255); + WriteByte(MSG_MULTICAST, 255); WriteFloat(MSG_MULTICAST, blindness); WriteFloat(MSG_MULTICAST, fade); WriteByte(MSG_MULTICAST, EVF_FADEDROM); @@ -57,4 +57,4 @@ FX_Flashbang(vector org) multicast([0,0,0], MULTICAST_ONE_R); } } -#endif +#endif diff --git a/src/shared/fx_impact.qc b/src/shared/fx_impact.qc index 750dff5..dc17388 100644 --- a/src/shared/fx_impact.qc +++ b/src/shared/fx_impact.qc @@ -52,7 +52,7 @@ FX_Impact_Init(void) void Wallpuff_Travel(void) { - NSEntity sprite = (NSEntity)self; + ncEntity sprite = (ncEntity)self; vector newpos; sprite.origin = sprite.origin_net; diff --git a/src/shared/include.src b/src/shared/include.src index e75fbb9..0dc5e6d 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -7,7 +7,6 @@ ../../../cstrike/src/shared/animations.qc ../../../cstrike/src/shared/item_c4bomb.h ../../../valve/src/shared/fx_blood.qc -../../../valve/src/shared/fx_corpse.qc ../../../cstrike/src/shared/fx_flashbang.qc ../../../cstrike/src/shared/fx_smokenade.qc ../../../cstrike/src/shared/item_c4bomb.qc diff --git a/src/shared/item_c4bomb.qc b/src/shared/item_c4bomb.qc index 4e2d053..1fc0e0f 100644 --- a/src/shared/item_c4bomb.qc +++ b/src/shared/item_c4bomb.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -class CSBombEntity:NSRenderableEntity +class CSBombEntity:ncRenderableEntity { public: void CSBombEntity(void); @@ -135,7 +135,7 @@ CSBombEntity::Logic(void) /* if our time has passed, explode */ if (m_flExplodeTime < time) { float bestDist = 9999.0f; - NSEntity bestTarget = __NULL__; + ncEntity bestTarget = __NULL__; g_grMode.Input(m_eUser, "BombExploded", ""); combat.RadiusDamage(origin, -g_cstrike_bombradius, 0i, 500i, real_owner, ""); @@ -149,7 +149,7 @@ CSBombEntity::Logic(void) if (dist < bestDist) { bestDist = dist; - bestTarget = (NSEntity)e; + bestTarget = (ncEntity)e; } } diff --git a/src/shared/player.h b/src/shared/player.h index 915a3d5..66d4219 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -15,13 +15,13 @@ */ /** @brief Get entity by class name and index **/ -NSEntity +ncEntity GetEntityByNameAndIndex(string name, int index) { int curIndex = 0; for (entity a = world; (a = find(a, ::classname, name));) { if (curIndex == index) { - return (NSEntity)a; + return (ncEntity)a; } ++curIndex; } @@ -36,21 +36,21 @@ GetEntityByNameAndIndex(string name, int index) * When there are for example 2 bombsites (g_cs_bombzones == 2) then valid * indexes would be 0 and 1. * */ -NSEntity +ncEntity GetBombsiteByIndex(int index) { return GetEntityByNameAndIndex("func_bomb_target", index); } /** @brief Get Escape Zone entity by index **/ -NSEntity +ncEntity GetEscapeZoneByIndex(int index) { return GetEntityByNameAndIndex("func_escapezone", index); } /** @brief Get VIP Safety Zone entity by index **/ -NSEntity +ncEntity GetVIPSafetyZoneByIndex(int index) { return GetEntityByNameAndIndex("func_vip_safetyzone", index); @@ -77,10 +77,11 @@ CSPlayer:HLPlayer PREDICTED_INT(cs_hor_rec_sign) PREDICTED_FLOAT(cs_rec_reverse_chance) - virtual void(float) Physics_Fall; - virtual void(void) Physics_Jump; + virtual void Physics_Fall(float); + virtual void Physics_Jump(void); + virtual void Physics_InputPreMove(void); - virtual void(void) Physics_InputPostMove; + virtual void Physics_InputPostMove(void); #ifdef CLIENT int playertype; @@ -171,9 +172,23 @@ CSPlayer::CSPlayer(void) #endif } -float punchangle_recovery(float punchangle) { +void +CSPlayer::Physics_InputPreMove(void) +{ + super::Physics_InputPreMove(); + + + gflags &= ~GF_BUYZONE; + gflags &= ~GF_RESCUEZONE; + gflags &= ~GF_BOMBZONE; +} + +float +punchangle_recovery(float punchangle) +{ return 0.05 * (-0.2 * pow(1.2, fabs(punchangle)) + 4); } + void CSPlayer::Physics_InputPostMove(void) { @@ -181,14 +196,15 @@ CSPlayer::Physics_InputPostMove(void) float punch; /* timers, these are predicted and shared across client and server */ w_attack_next = max(0, w_attack_next - input_timelength); + w_reload_next = max(0, w_reload_next - input_timelength); w_idle_next = max(0, w_idle_next - input_timelength); weapontime += input_timelength; punch = max(0, 1.0f - (input_timelength * 4)); if (punchangle[0] < 0) { punchangle[0] += punchangle_recovery(punchangle[0]); } - punchangle[1] *= .98; - punchangle[2] *= .99; + punchangle[1] *= punch; + punchangle[2] *= punch; /* player animation code */ UpdatePlayerAnimation(input_timelength); @@ -217,7 +233,7 @@ CSPlayer::ReceiveEntity void CSPlayer::ReceiveEntity(float flIsNew, float flChanged) { - NSClientPlayer::ReceiveEntity(flIsNew, flChanged); + ncPlayer::ReceiveEntity(flIsNew, flChanged); /* animation */ READENTITY_BYTE(anim_top, PLAYER_TOPFRAME) @@ -326,8 +342,8 @@ CSPlayer::Bot_RunToConfront(void) void CSPlayer::Bot_RunToBomb(void) { - NSEntity e = __NULL__; - e = (NSEntity)find(e, ::model, "models/w_c4.mdl"); + ncEntity e = __NULL__; + e = (ncEntity)find(e, ::model, "models/w_c4.mdl"); if (e) { RouteToPosition(e.WorldSpaceCenter()); @@ -339,7 +355,7 @@ CSPlayer::Bot_RunToBomb(void) void CSPlayer::Bot_RunToBombsite(int bombsiteIndex) { - NSEntity e = GetBombsiteByIndex(bombsiteIndex); + ncEntity e = GetBombsiteByIndex(bombsiteIndex); RouteToPosition(e.WorldSpaceCenter()); ChatSayTeam(strcat("Going to run to Bomb Site ", itos(bombsiteIndex), "!")); } @@ -355,7 +371,7 @@ CSPlayer::Bot_RunToRandomBombsite(void) void CSPlayer::Bot_RunToEscapeZone(int index) { - NSEntity e = GetEscapeZoneByIndex(index); + ncEntity e = GetEscapeZoneByIndex(index); RouteToPosition(e.WorldSpaceCenter()); ChatSayTeam(strcat("Going to run to Escape Zone ", itos(index), "!")); } @@ -371,7 +387,7 @@ CSPlayer::Bot_RunToRandomEscapeZone(void) void CSPlayer::Bot_RunToVIPSafetyZone(int index) { - NSEntity e = GetVIPSafetyZoneByIndex(index); + ncEntity e = GetVIPSafetyZoneByIndex(index); RouteToPosition(e.WorldSpaceCenter()); ChatSayTeam(strcat("Going to run to VIP Safety Zone ", itos(index), "!")); } @@ -386,9 +402,9 @@ CSPlayer::Bot_RunToRandomVIPSafetyZone(void) void CSPlayer::Bot_RunToHostages(void) { - NSEntity e = __NULL__; + ncEntity e = __NULL__; - e = (NSEntity)find(e, ::classname, "hostage_entity"); + e = (ncEntity)find(e, ::classname, "hostage_entity"); RouteToPosition(e.origin); ChatSayTeam("Going to run to the hostages!"); @@ -514,7 +530,7 @@ CSPlayer::Bot_CreateObjective(void) } else { /* T-bot: check if the bomb has been dropped */ - NSEntity e = (NSEntity)find(world, ::model, "models/w_backpack.mdl"); + ncEntity e = (ncEntity)find(world, ::model, "models/w_backpack.mdl"); if (e != __NULL__) { /* The bomb backpack has been dropped */ @@ -741,7 +757,7 @@ CSPlayer::SendEntity(entity ePEnt, float flChanged) flChanged = OptimiseChangedFlags(ePEnt, flChanged); - NSClientPlayer::SendEntity(ePEnt, flChanged); + ncPlayer::SendEntity(ePEnt, flChanged); SENDENTITY_BYTE(anim_top, PLAYER_TOPFRAME) SENDENTITY_FLOAT(anim_top_time, PLAYER_TOPFRAME) @@ -776,7 +792,7 @@ CSPlayer::Physics_Fall(float impactspeed) float impactDamage = (impactspeed - 580) * (100 / (1024 - 580)) * 0.75f; /* this is kinda ugly, but worth the price */ - NSDict damageDecl = spawn(NSDict); + ncDict damageDecl = spawn(ncDict); damageDecl.AddKey("damage", ftos((int)impactDamage)); Damage(this, this, damageDecl, 1.0, g_vec_null, origin); remove(damageDecl); diff --git a/zpak001.pk3dir/cfg/skill_cstrike.cfg b/zpak001.pk3dir/cfg/skill_cstrike.cfg index 988ac89..bfb665b 100644 --- a/zpak001.pk3dir/cfg/skill_cstrike.cfg +++ b/zpak001.pk3dir/cfg/skill_cstrike.cfg @@ -185,3 +185,18 @@ set sk_plr_awp_dmg3 115 set sk_plr_m249_dmg1 35 set sk_plr_m249_dmg2 35 set sk_plr_m249_dmg3 35 + +// hegrenade: splash damage +set sk_plr_hegrenade_dmg1 100 +set sk_plr_hegrenade_dmg2 100 +set sk_plr_hegrenade_dmg3 100 + +// hegrenade: splash radius +set sk_plr_hegrenade_radius1 100 +set sk_plr_hegrenade_radius2 100 +set sk_plr_hegrenade_radius3 100 + +// hegrenade: direct damage +set sk_plr_hegrenade_directdmg1 15 +set sk_plr_hegrenade_directdmg2 15 +set sk_plr_hegrenade_directdmg3 15 diff --git a/zpak001.pk3dir/cfg/skill_manifest.cfg b/zpak001.pk3dir/cfg/skill_manifest.cfg index 5ed9b95..5133fd0 100644 --- a/zpak001.pk3dir/cfg/skill_manifest.cfg +++ b/zpak001.pk3dir/cfg/skill_manifest.cfg @@ -1,2 +1 @@ -exec "skill.cfg" -exec "skill_cstrike.cfg" \ No newline at end of file +exec "skill_cstrike.cfg" diff --git a/zpak001.pk3dir/csprogs.dat.de.po b/zpak001.pk3dir/csprogs.dat.de.po index 0a7ba45..d12fba6 100755 --- a/zpak001.pk3dir/csprogs.dat.de.po +++ b/zpak001.pk3dir/csprogs.dat.de.po @@ -1,22 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-21 15:30+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - msgid "VGUI_TITLE_MOTD" msgstr "Nachricht des Tages" diff --git a/zpak001.pk3dir/decls/def/ammo.def b/zpak001.pk3dir/decls/def/ammo.def index 3286acd..ccbe549 100644 --- a/zpak001.pk3dir/decls/def/ammo.def +++ b/zpak001.pk3dir/decls/def/ammo.def @@ -15,6 +15,7 @@ entityDef ammo_types { "ammo_hegrenade" "11" "ammo_smokegrenade" "12" "ammo_flashbang" "13" + "ammo_c4" "14" } entityDef ammo_names { @@ -23,15 +24,16 @@ entityDef ammo_names { "ammo_357sig" ".357 SIG" "ammo_45acp" ".45 ACP" "ammo_50ae" ".50 Action Express" - "ammo_556nato" "5.56×45mm NATO" - "ammo_556natobox" "5.56×45mm NATO BOX" - "ammo_57mm" "FN 5.7×28mm" - "ammo_762nato" "7.62×51mm NATO" - "ammo_9mm" "9×19mm Parabellum" + "ammo_556nato" "5.56x45mm NATO" + "ammo_556natobox" "5.56x45mm NATO BOX" + "ammo_57mm" "FN 5.7x28mm" + "ammo_762nato" "7.62x51mm NATO" + "ammo_9mm" "9x19mm Parabellum" "ammo_buckshot" "Buckshot" "ammo_hegrenade" "HE Grenade" "ammo_smokegrenade" "Smoke Grenade" "ammo_flashbang" "Flashbang" + "ammo_c4" "C4" } entityDef ammo_max { @@ -49,12 +51,12 @@ entityDef ammo_max { "ammo_hegrenade" "1" "ammo_smokegrenade" "1" "ammo_flashbang" "2" + "ammo_c4" "1" } // these don't exist as pickups in the game, but // might be helpful nonetheless for level designers - #include "ammo/base.def" #include "ammo/556natobox.def" #include "ammo/338magnum.def" diff --git a/zpak001.pk3dir/decls/def/hostage.def b/zpak001.pk3dir/decls/def/hostage.def index 5d92a55..83e7036 100644 --- a/zpak001.pk3dir/decls/def/hostage.def +++ b/zpak001.pk3dir/decls/def/hostage.def @@ -1,16 +1,16 @@ entityDef hostage_entity { - "spawnclass" "CSHostage" - "model" "models/hostage.mdl" + "spawnclass" "CSHostage" + "model" "models/hostage.mdl" "netname" "Hostage" "health" "skill:hostage_health" - "mins" "-16 -16 0" - "maxs" "16 16 72" - "eye_height" "64" - "team" "0" + "mins" "-16 -16 0" + "maxs" "16 16 72" + "eye_height" "64" + "team" "0" "propdata" "actor_human" "follow_on_use" "1" "speed_walk" "64" - "speed_run" "364" + "speed_run" "364" } diff --git a/zpak001.pk3dir/decls/def/items/defuse.def b/zpak001.pk3dir/decls/def/items/defuse.def index 705eb4c..c058a3e 100644 --- a/zpak001.pk3dir/decls/def/items/defuse.def +++ b/zpak001.pk3dir/decls/def/items/defuse.def @@ -1,6 +1,6 @@ entityDef item_defuse { - "spawnclass" "NSItem" + "spawnclass" "ncItem" "model" "models/w_thighpack.mdl" "mins" "-16 -16 0" "maxs" "16 16 16" diff --git a/zpak001.pk3dir/decls/def/items/kevlar.def b/zpak001.pk3dir/decls/def/items/kevlar.def index dc7f513..c34b3ce 100644 --- a/zpak001.pk3dir/decls/def/items/kevlar.def +++ b/zpak001.pk3dir/decls/def/items/kevlar.def @@ -1,7 +1,7 @@ // actually armor entityDef item_kevlar { - "spawnclass" "NSItem" + "spawnclass" "ncItem" "model" "models/w_kevlar.mdl" "mins" "-16 -16 0" "maxs" "16 16 16" diff --git a/zpak001.pk3dir/decls/def/items/kevlar_helmet.def b/zpak001.pk3dir/decls/def/items/kevlar_helmet.def index 65b21ee..f7920f8 100644 --- a/zpak001.pk3dir/decls/def/items/kevlar_helmet.def +++ b/zpak001.pk3dir/decls/def/items/kevlar_helmet.def @@ -1,7 +1,7 @@ // other equipment entityDef item_kevlar_helmet { - "spawnclass" "NSItem" + "spawnclass" "ncItem" "model" "models/w_kevlar.mdl" "mins" "-16 -16 0" "maxs" "16 16 16" diff --git a/zpak001.pk3dir/decls/def/items/nightvision.def b/zpak001.pk3dir/decls/def/items/nightvision.def index e1380dc..dafb66a 100644 --- a/zpak001.pk3dir/decls/def/items/nightvision.def +++ b/zpak001.pk3dir/decls/def/items/nightvision.def @@ -1,6 +1,6 @@ entityDef item_nightvision { - "spawnclass" "NSItem" + "spawnclass" "ncItem" "model" "models/w_backpack.mdl" "mins" "-16 -16 0" "maxs" "16 16 16" diff --git a/zpak001.pk3dir/decls/def/items/suit.def b/zpak001.pk3dir/decls/def/items/suit.def index 95854b9..2e3e961 100644 --- a/zpak001.pk3dir/decls/def/items/suit.def +++ b/zpak001.pk3dir/decls/def/items/suit.def @@ -1,7 +1,7 @@ // used in the training mission, HUD etc. entityDef item_suit { - "spawnclass" "NSItem" + "spawnclass" "ncItem" "model" "models/w_kevlar.mdl" "mins" "-16 -16 0" "maxs" "16 16 16" diff --git a/zpak001.pk3dir/decls/def/player.def b/zpak001.pk3dir/decls/def/player.def index d7e33a4..9ef64f8 100644 --- a/zpak001.pk3dir/decls/def/player.def +++ b/zpak001.pk3dir/decls/def/player.def @@ -1,6 +1,21 @@ entityDef player { "spawnclass" "CSPlayer" + + "snd_stepladderLeft" "step_ladder.left" + "snd_stepladderRight" "step_ladder.right" + "snd_fall" "Player.FallDamage" + "snd_landHard" "Player.LightFall" + "snd_death" "Player.Death" + "snd_airGaspLight" "Player.GaspLight" + "snd_pain" "Player.Pain" + "snd_airGaspHeavy" "Player.GaspHeavy" + "snd_waterExit" "Player.WaterExit" + "snd_waterEnter" "Player.WaterEnter" + "snd_useDeny" "Player.DenyWeaponSelection" + "snd_useSuccess" "Player.WeaponSelected" + "snd_waterWade" "Player.Wade" + "snd_waterSwim" "Player.Swim" } entityDef player_mp @@ -79,3 +94,13 @@ entityDef player_vip "team" "2" "weapon" "weapon_knife,weapon_usp" } + +entityDef player_csdm +{ + "inherit" "player_mp" + "ammo_45acp" "24" + "current_weapon" "1" + "item" "item_suit" + "model" "models/player/vip/vip.mdl" + "weapon" "weapon_knife,weapon_usp" +} diff --git a/zpak001.pk3dir/decls/def/projectiles.def b/zpak001.pk3dir/decls/def/projectiles.def index 6d8bc9c..291374e 100644 --- a/zpak001.pk3dir/decls/def/projectiles.def +++ b/zpak001.pk3dir/decls/def/projectiles.def @@ -8,7 +8,7 @@ entityDef projectile_bullet_base entityDef projectile_bullet_shotgun { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "is_bullet" "1" "decal_impact" "Impact.BigShot" "detonate_on_world" "1" diff --git a/zpak001.pk3dir/decls/def/spawns.def b/zpak001.pk3dir/decls/def/spawns.def index 787c20a..06a9c51 100644 --- a/zpak001.pk3dir/decls/def/spawns.def +++ b/zpak001.pk3dir/decls/def/spawns.def @@ -3,8 +3,8 @@ entityDef info_player_start "editor_mins" "-16 -16 -36" "editor_maxs" "16 16 36" "editor_description" "Singleplayer Spawn Point" - "editor_color" "1 0 0" - "spawnclass" "NSSpawnPoint" + "editor_color" "1 0 0" + "spawnclass" "ncSpawnPoint" } entityDef info_player_deathmatch @@ -12,8 +12,8 @@ entityDef info_player_deathmatch "editor_mins" "-16 -16 -36" "editor_maxs" "16 16 36" "editor_description" "Deathmatch Spawn Point" - "editor_color" "1 0 0" - "spawnclass" "NSSpawnPoint" + "editor_color" "1 0 0" + "spawnclass" "ncSpawnPoint" } entityDef info_player_coop @@ -21,6 +21,6 @@ entityDef info_player_coop "editor_mins" "-16 -16 -36" "editor_maxs" "16 16 36" "editor_description" "Cooperative Spawn Point" - "editor_color" "1 0 0" - "spawnclass" "NSSpawnPoint" + "editor_color" "1 0 0" + "spawnclass" "ncSpawnPoint" } diff --git a/zpak001.pk3dir/decls/def/weapons.def b/zpak001.pk3dir/decls/def/weapons.def index 94b0011..41567a9 100644 --- a/zpak001.pk3dir/decls/def/weapons.def +++ b/zpak001.pk3dir/decls/def/weapons.def @@ -1,3 +1,4 @@ +#include "weapons/csbase.def" #include "weapons/ak47.def" #include "weapons/aug.def" #include "weapons/awp.def" @@ -25,50 +26,3 @@ #include "weapons/ump45.def" #include "weapons/usp.def" #include "weapons/xm1014.def" - -entityDef CSBaseMelee -{ - "spawnclass" "CSWeapon" - "editor_color" ".3 .3 1" - "editor_mins" "-16 -16 -16" - "editor_maxs" "16 16 16" - "editor_rotatable" "1" - - "snd_acquire" "Player.PickupWeapon" -} - -entityDef CSBasePistol -{ - "spawnclass" "CSWeapon" - "editor_color" ".3 .3 1" - "editor_mins" "-16 -16 -16" - "editor_maxs" "16 16 16" - "editor_rotatable" "1" - - "semiAuto" "1" - "snd_acquire" "Player.PickupWeapon" - "snd_empty" "Default.ClipEmpty_Pistol" -} - -entityDef CSBaseRifle -{ - "spawnclass" "CSWeapon" - "editor_color" ".3 .3 1" - "editor_mins" "-16 -16 -16" - "editor_maxs" "16 16 16" - "editor_rotatable" "1" - - "snd_acquire" "Player.PickupWeapon" - "snd_empty" "Default.ClipEmpty_Rifle" -} - -entityDef CSBaseShotgun -{ - "spawnclass" "CSWeapon" - "editor_color" ".3 .3 1" - "editor_mins" "-16 -16 -16" - "editor_maxs" "16 16 16" - "editor_rotatable" "1" - - "snd_acquire" "Player.PickupWeapon" -} diff --git a/zpak001.pk3dir/decls/def/weapons/c4.def b/zpak001.pk3dir/decls/def/weapons/c4.def index 79407b9..68f7682 100644 --- a/zpak001.pk3dir/decls/def/weapons/c4.def +++ b/zpak001.pk3dir/decls/def/weapons/c4.def @@ -11,16 +11,19 @@ entityDef weapon_c4 "model_view" "models/v_c4.mdl" "snd_acquire" "weapon.pickup" "snd_respawn" "item.respawn" + "ammoRequired" "1" - "def_plant" "item_c4" + "def_fireInfo" "fireInfo_c4Plant" "inv_name" "C4 Bomb Weapon" - "clipSize" "1" + "ammoType" "ammo_c4" + "inv_ammo_c4" "1" "trigger_delay" "3" // takes three seconds to charge "act_fire" "2" + "act_fireFailed" "0" "act_draw" "1" "act_idle" "0" - "actDelay" "3" + "act_delay" "3" "snd_fire" "C4.PlantSound" @@ -30,4 +33,23 @@ entityDef weapon_c4 "hudSlotPos" "0" "weight" "0" "team" "1" // Terrorists only! + "onlyInBombZone" "1" + "removeOnEmpty" "1" +} + +entityDef fireInfo_c4Plant +{ + "def_onFire" "projectile_c4bomb" + "testDistance" "-64" + "chargeTime" "3" +} + +entityDef projectile_c4bomb +{ + "spawnclass" "ncAttack" + "def_plant" "item_c4" + "plant" "1" + "plantOnGround" "1" + "plantDistance" "64" + "plantOffset" "8" } diff --git a/zpak001.pk3dir/decls/def/weapons/csbase.def b/zpak001.pk3dir/decls/def/weapons/csbase.def new file mode 100644 index 0000000..39bd774 --- /dev/null +++ b/zpak001.pk3dir/decls/def/weapons/csbase.def @@ -0,0 +1,52 @@ +entityDef CSBaseMelee +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "snd_acquire" "Player.PickupWeapon" +} + +entityDef CSBasePistol +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "semiAuto" "1" + "snd_acquire" "Player.PickupWeapon" + "snd_empty" "Default.ClipEmpty_Pistol" + "csWeaponMode" "1" + "model_flash" "sprites/muzzleflash1.spr" +} + +entityDef CSBaseRifle +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "snd_acquire" "Player.PickupWeapon" + "snd_empty" "Default.ClipEmpty_Rifle" + "csWeaponMode" "1" + "model_flash" "sprites/muzzleflash3.spr" +} + +entityDef CSBaseShotgun +{ + "spawnclass" "CSWeapon" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 -16" + "editor_maxs" "16 16 16" + "editor_rotatable" "1" + + "snd_acquire" "Player.PickupWeapon" + "csWeaponMode" "1" + "model_flash" "sprites/muzzleflash4.spr" +} diff --git a/zpak001.pk3dir/decls/def/weapons/flashbang.def b/zpak001.pk3dir/decls/def/weapons/flashbang.def index ffe5e05..35efe33 100644 --- a/zpak001.pk3dir/decls/def/weapons/flashbang.def +++ b/zpak001.pk3dir/decls/def/weapons/flashbang.def @@ -12,17 +12,22 @@ entityDef weapon_flashbang "snd_acquire" "weapon.pickup" "snd_respawn" "item.respawn" - "def_onFire" "projectile_flashgrenade" + //"def_onFire" "projectile_flashgrenade" + "def_onRelease" "projectile_flashgrenade" "inv_name" "Flashbang" "ammoType" "ammo_flashbang" "ammoRequired" "1" + "inv_ammo_flashbang" "1" + "silent_fire" "1" "primed_fuse" "4" - - "act_idle" "0" - "act_draw" "3" - "actPull" "1" - "actThrow" "2" + "act_idle" "0" + "act_draw" "3" + "act_delay" "1" + "act_fire" "2" + "chargeTime" "2" + "removeOnEmpty" "1" + "drawAfterRelease" "1" "hudSlot" "3" "hudSlotPos" "1" @@ -35,8 +40,10 @@ entityDef projectile_flashgrenade "frame" "1" "fuse" "4" "detonate_on_fuse" "1" + "thrown" "1" "bounce" "1" "angular_velocity" "-350 0 0" + "velocity" "300 0 40" "snd_explode" "Flashbang.Explode" "snd_bounce" "Flashbang.Bounce" diff --git a/zpak001.pk3dir/decls/def/weapons/glock18.def b/zpak001.pk3dir/decls/def/weapons/glock18.def index fd86448..afe1815 100644 --- a/zpak001.pk3dir/decls/def/weapons/glock18.def +++ b/zpak001.pk3dir/decls/def/weapons/glock18.def @@ -17,7 +17,7 @@ entityDef weapon_glock18 "act_fireLast" "6" "act_holster" "9" "act_reload" "7,12" - "act_draw" "9,11" + "act_draw" "8,11" "act_idle" "0,1,2" "snd_fire" "Weapon_Glock.Single" diff --git a/zpak001.pk3dir/decls/def/weapons/hegrenade.def b/zpak001.pk3dir/decls/def/weapons/hegrenade.def index 3332e5b..595cccd 100644 --- a/zpak001.pk3dir/decls/def/weapons/hegrenade.def +++ b/zpak001.pk3dir/decls/def/weapons/hegrenade.def @@ -10,35 +10,37 @@ entityDef weapon_hegrenade "inv_name" "HE Grenade" "inv_ammo_hegrenade" "5" "def_onFire" "projectile_handgrenade" - "def_explode_inhand" "env_handgrenade_explodeinhand" - "def_damage_inhand" "damage_handgrenadeSplash" + "def_onRelease" "projectile_handgrenade" "ammoType" "ammo_hegrenade" "ammoRequired" "1" "silent_fire" "1" - "primed_fuse" "4" "act_idle" "0" "act_draw" "3" - "actPull" "1" - "actThrow" "2" + "act_delay" "1" + "act_release" "2" // HLWeapon specific "hudSlot" "3" "hudSlotPos" "0" + "chargeTime" "2" + "removeOnEmpty" "1" + "drawAfterRelease" "1" } entityDef projectile_handgrenade { - "spawnclass" "NSProjectile" - "model" "models/w_grenade.mdl" + "spawnclass" "ncProjectile" + "model" "models/w_hegrenade.mdl" "frame" "1" "fuse" "4" "detonate_on_fuse" "1" + "thrown" "1" "bounce" "1" "angular_velocity" "-350 0 0" "model_detonate" "fx_explosion.main" "snd_explode" "fx.explosion" - "snd_bounce" "weapon_handgrenade.bounce" + "snd_bounce" "weapon_hegrenade.bounce" "decal_detonate" "ExplosionScorch" "def_damage" "damage_handgrenadeDirect" @@ -47,17 +49,12 @@ entityDef projectile_handgrenade entityDef damage_handgrenadeDirect { - "damage" "1" + "damage" "skill:plr_hegrenade_directdmg" } entityDef damage_handgrenadeSplash { - "damage" "skill:plr_hand_grenade" - "radius" "250" -} - -entityDef env_handgrenade_explodeinhand -{ - "spawnclass" "idAnimatedEntity" - "model" "grenadeExplosion.prt" + "damage" "skill:plr_hegrenade_dmg" + "radius" "skill:plr_hegrenade_radius" + "push" "7500" } diff --git a/zpak001.pk3dir/decls/def/weapons/knife.def b/zpak001.pk3dir/decls/def/weapons/knife.def index 058dcdd..94fe7fe 100644 --- a/zpak001.pk3dir/decls/def/weapons/knife.def +++ b/zpak001.pk3dir/decls/def/weapons/knife.def @@ -1,5 +1,6 @@ entityDef weapon_knife { + "spawnclass" "CSWeapon" "inherit" "CSBaseMelee" "editor_usage" "Knife Weapon" @@ -11,7 +12,6 @@ entityDef weapon_knife "testDistance" "-48" "inv_name" "Knife Weapon" "ammoRequired" "0" - "clipSize" "0" "silent_fire" "1" "failRate" "0.7" @@ -30,9 +30,20 @@ entityDef weapon_knife entityDef projectile_knife { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" + "damage" "skill:plr_knife_dmg" + "is_bullet" "1" + "decal_impact" "Impact.Shot" + "detonate_on_world" "1" + "range" "skill:plr_knife_altdmg" +} + +entityDef projectile_altKnife +{ + "spawnclass" "ncProjectile" "damage" "skill:plr_knife" "is_bullet" "1" "decal_impact" "Impact.Shot" "detonate_on_world" "1" + "range" "skill:plr_knife_altrange" } diff --git a/zpak001.pk3dir/decls/def/weapons/smokegrenade.def b/zpak001.pk3dir/decls/def/weapons/smokegrenade.def index 9da5809..a23ff57 100644 --- a/zpak001.pk3dir/decls/def/weapons/smokegrenade.def +++ b/zpak001.pk3dir/decls/def/weapons/smokegrenade.def @@ -12,17 +12,19 @@ entityDef weapon_smokegrenade "snd_acquire" "weapon.pickup" "snd_respawn" "item.respawn" - "def_onFire" "projectile_smokegrenade" + "def_onFire" "projectile_smokegrenade" + "def_onRelease" "projectile_smokegrenade" "inv_name" "smokegrenade" - "clipSize" "50" - "clipSizeDefault" "25" - "act_fire" "5,6,7" - "actAltFire" "2" - "act_holster" "4" - "act_reload" "3" - "act_draw" "4" - "act_idle" "0,1" + "silent_fire" "1" + "primed_fuse" "4" + "act_idle" "0" + "act_draw" "3" + "act_delay" "1" + "act_fire" "2" + "chargeTime" "2" + "removeOnEmpty" "1" + "drawAfterRelease" "1" "snd_fire" "weapon_smokegrenade.shoot" "snd_altfire" "weapon_smokegrenade.gl" diff --git a/zpak001.pk3dir/decls/def/weapons/xm1014.def b/zpak001.pk3dir/decls/def/weapons/xm1014.def index 6864e4b..a0b4f9a 100644 --- a/zpak001.pk3dir/decls/def/weapons/xm1014.def +++ b/zpak001.pk3dir/decls/def/weapons/xm1014.def @@ -7,7 +7,7 @@ entityDef weapon_xm1014 "model_view" "models/v_xm1014.mdl" "inv_name" "Benneli XM1014 Weapon" - "def_fireInfo" "fireInfo_xm1014" + "def_fireInfo" "fireInfo_xm1014" "clipSize" "7" "ammoType" "ammo_buckshot" diff --git a/zpak001.pk3dir/default_cstrike.cfg b/zpak001.pk3dir/default_cstrike.cfg index b00627c..e50a93a 100644 --- a/zpak001.pk3dir/default_cstrike.cfg +++ b/zpak001.pk3dir/default_cstrike.cfg @@ -25,6 +25,7 @@ set fcs_autoreload "0" set con_color "255 150 0" set vgui_color "255 170 0" set cross_color "0 255 0" +set r_menutint "0.22 0.278 0.40" // physics differences from valve/ set pm_accelerate "4" diff --git a/zpak001.pk3dir/icon.tga b/zpak001.pk3dir/icon.tga new file mode 100644 index 0000000000000000000000000000000000000000..e7c3ff638acd90bd29c6079625fc0afdead45498 GIT binary patch literal 8215 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 DM-lKF literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/default.cfg b/zpak001.pk3dir/quake.rc similarity index 84% rename from zpak001.pk3dir/default.cfg rename to zpak001.pk3dir/quake.rc index b344a6d..daf0189 100644 --- a/zpak001.pk3dir/default.cfg +++ b/zpak001.pk3dir/quake.rc @@ -1,5 +1,6 @@ exec default_controls.cfg exec default_cvar.cfg exec default_video.cfg +exec default_valve.cfg exec default_cstrike.cfg exec default_aliases.cfg From a2a3d8fd8d3e04e15db4b8330718c432eef4ed7a Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 14 Jan 2025 03:32:08 -0800 Subject: [PATCH 10/17] Uninclude fx_blood.qc and fix compat. --- src/client/game_event.qc | 14 -------------- src/client/init.qc | 1 - src/rules/counterstrike.qc | 6 +++--- src/shared/include.src | 1 - src/shared/player.h | 2 +- 5 files changed, 4 insertions(+), 20 deletions(-) diff --git a/src/client/game_event.qc b/src/client/game_event.qc index ac516cb..c047095 100644 --- a/src/client/game_event.qc +++ b/src/client/game_event.qc @@ -21,20 +21,6 @@ switch (fHeader) { case EV_OBITUARY: Obituary_Parse(); break; - case EV_BLOOD: - vector vBloodPos; - vector vBloodColor; - - vBloodPos[0] = readcoord(); - vBloodPos[1] = readcoord(); - vBloodPos[2] = readcoord(); - - vBloodColor[0] = readbyte() / 255; - vBloodColor[1] = readbyte() / 255; - vBloodColor[2] = readbyte() / 255; - - FX_Blood(vBloodPos, vBloodColor); - break; case EV_SMOKE: vector vSmokePos; vSmokePos[0] = readcoord(); diff --git a/src/client/init.qc b/src/client/init.qc index ec1038d..0b6f241 100644 --- a/src/client/init.qc +++ b/src/client/init.qc @@ -107,7 +107,6 @@ ClientGame_RendererRestart(string rstr) Obituary_Precache(); Damage_Precache(); - FX_Blood_Init(); FX_Smokenade_Init(); HLSprite_Init(); diff --git a/src/rules/counterstrike.qc b/src/rules/counterstrike.qc index 7abe00d..d8cf8bb 100644 --- a/src/rules/counterstrike.qc +++ b/src/rules/counterstrike.qc @@ -745,9 +745,9 @@ CodeCallback_StartGameType(void) string spawnT; /* players can buy these any time. so they should be precached for speed. */ - ents.Precache("player_vip"); - ents.Precache("player_terrorist"); - ents.Precache("player_counterterrorist"); + precache.Entity("player_vip"); + precache.Entity("player_terrorist"); + precache.Entity("player_counterterrorist"); spawnCT = entityDef.GetString("player_counterterrorist", "spawnpoint"); spawnT = entityDef.GetString("player_terrorist", "spawnpoint"); diff --git a/src/shared/include.src b/src/shared/include.src index 0dc5e6d..c31d7a8 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -6,7 +6,6 @@ ../../../cstrike/src/shared/animations.h ../../../cstrike/src/shared/animations.qc ../../../cstrike/src/shared/item_c4bomb.h -../../../valve/src/shared/fx_blood.qc ../../../cstrike/src/shared/fx_flashbang.qc ../../../cstrike/src/shared/fx_smokenade.qc ../../../cstrike/src/shared/item_c4bomb.qc diff --git a/src/shared/player.h b/src/shared/player.h index 66d4219..31dbb23 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -421,7 +421,7 @@ void CSPlayer::Bot_Roam(vector roamOrigin, int maxDistance) { randLoc.y += cos(radian) * distance; /* Go to the random waypoint. */ - RouteToPosition(Nodes_PositionOfClosestNode(randLoc)); + RouteToPosition(ncNavInfo::PositionOfClosestNode(randLoc)); } void From db351e7b191c4d69f1944340b850e9a280cda1a9 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 31 Jan 2025 13:53:43 -0800 Subject: [PATCH 11/17] unpk3dir --- .dir.tiff | Bin 0 -> 9494 bytes .gitignore | 5 + LICENSE => COPYING | 0 zpak001.pk3dir/PAK_NAME => PAK_NAME | 0 README.md | 32 +-- {zpak001.pk3dir/cfg => cfg}/skill_cstrike.cfg | 0 .../cfg => cfg}/skill_manifest.cfg | 0 .../csprogs.dat.de.po => csprogs.dat.de.po | 0 ...s.dat.default.po => csprogs.dat.default.po | 0 {zpak001.pk3dir/data => data}/as_forest.way | 0 {zpak001.pk3dir/data => data}/as_highrise.way | 0 {zpak001.pk3dir/data => data}/as_oilrig.way | 0 .../data => data}/as_riverside.way | 0 {zpak001.pk3dir/data => data}/as_tundra.way | 0 {zpak001.pk3dir/data => data}/cs_747.way | 0 {zpak001.pk3dir/data => data}/cs_alley1.way | 0 .../data => data}/cs_arabstreets.way | 0 {zpak001.pk3dir/data => data}/cs_assault.way | 0 .../data => data}/cs_backalley.way | 0 {zpak001.pk3dir/data => data}/cs_bunker.way | 0 {zpak001.pk3dir/data => data}/cs_desert.way | 0 {zpak001.pk3dir/data => data}/cs_docks.way | 0 {zpak001.pk3dir/data => data}/cs_estate.way | 0 {zpak001.pk3dir/data => data}/cs_facility.way | 0 {zpak001.pk3dir/data => data}/cs_havana.way | 0 {zpak001.pk3dir/data => data}/cs_hideout.way | 0 {zpak001.pk3dir/data => data}/cs_iraq.way | 0 {zpak001.pk3dir/data => data}/cs_italy.way | 0 {zpak001.pk3dir/data => data}/cs_mansion.way | 0 {zpak001.pk3dir/data => data}/cs_militia.way | 0 {zpak001.pk3dir/data => data}/cs_office.way | 0 {zpak001.pk3dir/data => data}/cs_prison.way | 0 {zpak001.pk3dir/data => data}/cs_ship.way | 0 {zpak001.pk3dir/data => data}/cs_siege.way | 0 {zpak001.pk3dir/data => data}/cs_station.way | 0 {zpak001.pk3dir/data => data}/cs_thunder.way | 0 {zpak001.pk3dir/data => data}/cs_tire.way | 0 {zpak001.pk3dir/data => data}/cs_wpndepot.way | 0 {zpak001.pk3dir/data => data}/cs_zoption.way | 0 {zpak001.pk3dir/data => data}/de_aztec.way | 0 {zpak001.pk3dir/data => data}/de_cbble.way | 0 {zpak001.pk3dir/data => data}/de_chateau.way | 0 {zpak001.pk3dir/data => data}/de_dust.way | 0 {zpak001.pk3dir/data => data}/de_dust2.way | 0 {zpak001.pk3dir/data => data}/de_fang.way | 0 {zpak001.pk3dir/data => data}/de_foption.way | 0 {zpak001.pk3dir/data => data}/de_inferno.way | 0 .../data => data}/de_jeepathon2k.way | 0 {zpak001.pk3dir/data => data}/de_nuke.way | 0 {zpak001.pk3dir/data => data}/de_piranesi.way | 0 {zpak001.pk3dir/data => data}/de_prodigy.way | 0 {zpak001.pk3dir/data => data}/de_railroad.way | 0 .../data => data}/de_rotterdam.way | 0 {zpak001.pk3dir/data => data}/de_storm.way | 0 {zpak001.pk3dir/data => data}/de_survivor.way | 0 {zpak001.pk3dir/data => data}/de_torn.way | 0 {zpak001.pk3dir/data => data}/de_train.way | 0 {zpak001.pk3dir/data => data}/de_vegas.way | 0 {zpak001.pk3dir/data => data}/de_vertigo.way | 0 {zpak001.pk3dir/data => data}/es_frantic.way | 0 {zpak001.pk3dir/data => data}/es_jail.way | 0 {zpak001.pk3dir/data => data}/es_trinity.way | 0 {zpak001.pk3dir/data => data}/fy_pool_day.way | 0 {zpak001.pk3dir/decls => decls}/def/ammo.def | 0 .../decls => decls}/def/ammo/338magnum.def | 0 .../decls => decls}/def/ammo/357sig.def | 0 .../decls => decls}/def/ammo/45acp.def | 0 .../decls => decls}/def/ammo/50ae.def | 0 .../decls => decls}/def/ammo/556nato.def | 0 .../decls => decls}/def/ammo/556natobox.def | 0 .../decls => decls}/def/ammo/57mm.def | 0 .../decls => decls}/def/ammo/762nato.def | 0 .../decls => decls}/def/ammo/9mm.def | 0 .../decls => decls}/def/ammo/base.def | 0 .../decls => decls}/def/ammo/buckshot.def | 0 .../decls => decls}/def/hostage.def | 0 {zpak001.pk3dir/decls => decls}/def/items.def | 0 .../decls => decls}/def/items/c4.def | 0 .../decls => decls}/def/items/defuse.def | 0 .../decls => decls}/def/items/kevlar.def | 0 .../def/items/kevlar_helmet.def | 0 .../decls => decls}/def/items/nightvision.def | 0 .../decls => decls}/def/items/suit.def | 0 .../decls => decls}/def/monsters.def | 0 .../decls => decls}/def/player.def | 0 .../decls => decls}/def/projectiles.def | 0 .../decls => decls}/def/spawns.def | 0 .../decls => decls}/def/weapons.def | 0 .../decls => decls}/def/weapons/ak47.def | 0 .../decls => decls}/def/weapons/aug.def | 0 .../decls => decls}/def/weapons/awp.def | 0 .../decls => decls}/def/weapons/c4.def | 0 .../decls => decls}/def/weapons/csbase.def | 0 .../decls => decls}/def/weapons/deagle.def | 0 .../decls => decls}/def/weapons/elite.def | 0 .../decls => decls}/def/weapons/famas.def | 0 .../decls => decls}/def/weapons/fiveseven.def | 0 .../decls => decls}/def/weapons/flashbang.def | 0 .../decls => decls}/def/weapons/g3sg1.def | 0 .../decls => decls}/def/weapons/galil.def | 0 .../decls => decls}/def/weapons/glock18.def | 0 .../decls => decls}/def/weapons/hegrenade.def | 0 .../decls => decls}/def/weapons/knife.def | 0 .../decls => decls}/def/weapons/m249.def | 0 .../decls => decls}/def/weapons/m3.def | 0 .../decls => decls}/def/weapons/m4a1.def | 0 .../decls => decls}/def/weapons/mac10.def | 0 .../decls => decls}/def/weapons/mp5navy.def | 0 .../decls => decls}/def/weapons/p228.def | 0 .../decls => decls}/def/weapons/p90.def | 0 .../decls => decls}/def/weapons/scout.def | 0 .../decls => decls}/def/weapons/sg550.def | 0 .../decls => decls}/def/weapons/sg552.def | 0 .../def/weapons/smokegrenade.def | 0 .../decls => decls}/def/weapons/tmp.def | 0 .../decls => decls}/def/weapons/ump45.def | 0 .../decls => decls}/def/weapons/usp.def | 0 .../decls => decls}/def/weapons/xm1014.def | 0 .../decls => decls}/sound/impacts.sndshd | 0 .../sound/items_cstrike.sndshd | 0 .../decls => decls}/sound/npcs_cstrike.sndshd | 0 .../decls => decls}/sound/player.sndshd | 0 .../sound/weapons_cstrike.sndshd | 0 .../decls => decls}/typeinfo/hlmat.decl | 0 ...default_aliases.cfg => default_aliases.cfg | 0 ...default_cstrike.cfg => default_cstrike.cfg | 0 default_cvar.cfg | 188 +++++++++++++++++ {zpak001.pk3dir/gfx => gfx}/vgui/buymenu.tga | Bin zpak001.pk3dir/icon.tga => icon.tga | Bin maps/as_forest.jpg | Bin 0 -> 5994 bytes .../maps => maps}/as_forest_src.jpg | Bin maps/as_highrise.jpg | Bin 0 -> 5447 bytes .../maps => maps}/as_highrise_src.jpg | Bin maps/as_oilrig.jpg | Bin 0 -> 4640 bytes .../maps => maps}/as_oilrig_src.jpg | Bin maps/as_riverside.jpg | Bin 0 -> 5399 bytes .../maps => maps}/as_riverside_src.jpg | Bin maps/as_tundra.jpg | Bin 0 -> 5673 bytes .../maps => maps}/as_tundra_src.jpg | Bin maps/cs_747.jpg | Bin 0 -> 5217 bytes {zpak001.pk3dir/maps => maps}/cs_747_src.jpg | Bin maps/cs_alley1.jpg | Bin 0 -> 4042 bytes .../maps => maps}/cs_alley1_src.jpg | Bin maps/cs_arabstreets.jpg | Bin 0 -> 5667 bytes .../maps => maps}/cs_arabstreets_src.jpg | Bin maps/cs_assault.jpg | Bin 0 -> 4148 bytes .../maps => maps}/cs_assault_src.jpg | Bin maps/cs_backalley.jpg | Bin 0 -> 4632 bytes .../maps => maps}/cs_backalley_src.jpg | Bin maps/cs_bunker.jpg | Bin 0 -> 3903 bytes .../maps => maps}/cs_bunker_src.jpg | Bin maps/cs_desert.jpg | Bin 0 -> 6804 bytes .../maps => maps}/cs_desert_src.jpg | Bin maps/cs_docks.jpg | Bin 0 -> 4207 bytes .../maps => maps}/cs_docks_src.jpg | Bin maps/cs_estate.jpg | Bin 0 -> 4607 bytes .../maps => maps}/cs_estate_src.jpg | Bin maps/cs_facility.jpg | Bin 0 -> 4473 bytes .../maps => maps}/cs_facility_src.jpg | Bin maps/cs_havana.jpg | Bin 0 -> 6060 bytes .../maps => maps}/cs_havana_src.jpg | Bin maps/cs_hideout.jpg | Bin 0 -> 6336 bytes .../maps => maps}/cs_hideout_src.jpg | Bin maps/cs_iraq.jpg | Bin 0 -> 5861 bytes {zpak001.pk3dir/maps => maps}/cs_iraq_src.jpg | Bin maps/cs_italy.jpg | Bin 0 -> 7278 bytes .../maps => maps}/cs_italy_src.jpg | Bin maps/cs_mansion.jpg | Bin 0 -> 6382 bytes .../maps => maps}/cs_mansion_src.jpg | Bin maps/cs_militia.jpg | Bin 0 -> 6357 bytes .../maps => maps}/cs_militia_src.jpg | Bin maps/cs_office.jpg | Bin 0 -> 4464 bytes .../maps => maps}/cs_office_src.jpg | Bin maps/cs_prison.jpg | Bin 0 -> 4859 bytes .../maps => maps}/cs_prison_src.jpg | Bin maps/cs_ship.jpg | Bin 0 -> 3652 bytes {zpak001.pk3dir/maps => maps}/cs_ship_src.jpg | Bin maps/cs_siege.jpg | Bin 0 -> 5948 bytes .../maps => maps}/cs_siege_src.jpg | Bin maps/cs_station.jpg | Bin 0 -> 4680 bytes .../maps => maps}/cs_station_src.jpg | Bin maps/cs_thunder.jpg | Bin 0 -> 5191 bytes .../maps => maps}/cs_thunder_src.jpg | Bin maps/cs_tire.jpg | Bin 0 -> 7381 bytes {zpak001.pk3dir/maps => maps}/cs_tire_src.jpg | Bin maps/cs_wpndepot.jpg | Bin 0 -> 3756 bytes .../maps => maps}/cs_wpndepot_src.jpg | Bin maps/cs_zoption.jpg | Bin 0 -> 4694 bytes .../maps => maps}/cs_zoption_src.jpg | Bin maps/de_aztec.jpg | Bin 0 -> 6856 bytes .../maps => maps}/de_aztec_src.jpg | Bin maps/de_cbble.jpg | Bin 0 -> 6801 bytes .../maps => maps}/de_cbble_src.jpg | Bin maps/de_chateau.jpg | Bin 0 -> 7744 bytes .../maps => maps}/de_chateau_src.jpg | Bin maps/de_dust.jpg | Bin 0 -> 7236 bytes maps/de_dust2.jpg | Bin 0 -> 7438 bytes .../maps => maps}/de_dust2_src.jpg | Bin {zpak001.pk3dir/maps => maps}/de_dust_src.jpg | Bin maps/de_fang.jpg | Bin 0 -> 4815 bytes {zpak001.pk3dir/maps => maps}/de_fang_src.jpg | Bin maps/de_foption.jpg | Bin 0 -> 3597 bytes .../maps => maps}/de_foption_src.jpg | Bin maps/de_inferno.jpg | Bin 0 -> 7156 bytes .../maps => maps}/de_inferno_src.jpg | Bin maps/de_jeepathon2k.jpg | Bin 0 -> 4329 bytes .../maps => maps}/de_jeepathon2k_src.jpg | Bin maps/de_nuke.jpg | Bin 0 -> 4006 bytes {zpak001.pk3dir/maps => maps}/de_nuke_src.jpg | Bin maps/de_piranesi.jpg | Bin 0 -> 7418 bytes .../maps => maps}/de_piranesi_src.jpg | Bin maps/de_prodigy.jpg | Bin 0 -> 4071 bytes .../maps => maps}/de_prodigy_src.jpg | Bin maps/de_railroad.jpg | Bin 0 -> 4850 bytes .../maps => maps}/de_railroad_src.jpg | Bin maps/de_rotterdam.jpg | Bin 0 -> 5376 bytes .../maps => maps}/de_rotterdam_src.jpg | Bin maps/de_storm.jpg | Bin 0 -> 5154 bytes .../maps => maps}/de_storm_src.jpg | Bin maps/de_survivor.jpg | Bin 0 -> 5460 bytes .../maps => maps}/de_survivor_src.jpg | Bin maps/de_torn.jpg | Bin 0 -> 5932 bytes {zpak001.pk3dir/maps => maps}/de_torn_src.jpg | Bin maps/de_train.jpg | Bin 0 -> 5529 bytes .../maps => maps}/de_train_src.jpg | Bin maps/de_vegas.jpg | Bin 0 -> 4621 bytes .../maps => maps}/de_vegas_src.jpg | Bin maps/de_vertigo.jpg | Bin 0 -> 6343 bytes .../maps => maps}/de_vertigo_src.jpg | Bin maps/es_frantic.jpg | Bin 0 -> 3060 bytes .../maps => maps}/es_frantic_src.jpg | Bin maps/es_jail.jpg | Bin 0 -> 4457 bytes {zpak001.pk3dir/maps => maps}/es_jail_src.jpg | Bin maps/es_trinity.jpg | Bin 0 -> 5797 bytes .../maps => maps}/es_trinity_src.jpg | Bin .../maps => maps}/eukara/test_weapons.bsp | Bin .../maps => maps}/eukara/test_weapons.map | 0 .../particles => particles}/fx_smokenade.cfg | 0 zpak001.pk3dir/quake.rc => quake.rc | 0 {zpak001.pk3dir/scripts => scripts}/bots.txt | 0 .../scripts => scripts}/client_style.txt | 0 .../scripts => scripts}/constants.txt | 0 .../scripts => scripts}/maptweaks.txt | 0 .../surfaceproperties_cstrike.txt | 0 .../surfaceproperties_manifest.txt | 0 .../scripts => scripts}/ui_style.txt | 0 src/client/Makefile | 2 +- src/client/progs.src | 46 ++--- src/files.dat | 194 ++++++++++++++++++ src/rules/Makefile | 7 +- src/rules/counterstrike.qc | 2 +- src/rules/deathmatch.qc | 2 +- src/rules/zombie.qc | 136 ++++++++++++ src/server/Makefile | 2 +- src/server/progs.src | 29 +-- 255 files changed, 573 insertions(+), 72 deletions(-) create mode 100644 .dir.tiff create mode 100644 .gitignore rename LICENSE => COPYING (100%) rename zpak001.pk3dir/PAK_NAME => PAK_NAME (100%) rename {zpak001.pk3dir/cfg => cfg}/skill_cstrike.cfg (100%) rename {zpak001.pk3dir/cfg => cfg}/skill_manifest.cfg (100%) rename zpak001.pk3dir/csprogs.dat.de.po => csprogs.dat.de.po (100%) rename zpak001.pk3dir/csprogs.dat.default.po => csprogs.dat.default.po (100%) rename {zpak001.pk3dir/data => data}/as_forest.way (100%) rename {zpak001.pk3dir/data => data}/as_highrise.way (100%) rename {zpak001.pk3dir/data => data}/as_oilrig.way (100%) rename {zpak001.pk3dir/data => data}/as_riverside.way (100%) rename {zpak001.pk3dir/data => data}/as_tundra.way (100%) rename {zpak001.pk3dir/data => data}/cs_747.way (100%) rename {zpak001.pk3dir/data => data}/cs_alley1.way (100%) rename {zpak001.pk3dir/data => data}/cs_arabstreets.way (100%) rename {zpak001.pk3dir/data => data}/cs_assault.way (100%) rename {zpak001.pk3dir/data => data}/cs_backalley.way (100%) rename {zpak001.pk3dir/data => data}/cs_bunker.way (100%) rename {zpak001.pk3dir/data => data}/cs_desert.way (100%) rename {zpak001.pk3dir/data => data}/cs_docks.way (100%) rename {zpak001.pk3dir/data => data}/cs_estate.way (100%) rename {zpak001.pk3dir/data => data}/cs_facility.way (100%) rename {zpak001.pk3dir/data => data}/cs_havana.way (100%) rename {zpak001.pk3dir/data => data}/cs_hideout.way (100%) rename {zpak001.pk3dir/data => data}/cs_iraq.way (100%) rename {zpak001.pk3dir/data => data}/cs_italy.way (100%) rename {zpak001.pk3dir/data => data}/cs_mansion.way (100%) rename {zpak001.pk3dir/data => data}/cs_militia.way (100%) rename {zpak001.pk3dir/data => data}/cs_office.way (100%) rename {zpak001.pk3dir/data => data}/cs_prison.way (100%) rename {zpak001.pk3dir/data => data}/cs_ship.way (100%) rename {zpak001.pk3dir/data => data}/cs_siege.way (100%) rename {zpak001.pk3dir/data => data}/cs_station.way (100%) rename {zpak001.pk3dir/data => data}/cs_thunder.way (100%) rename {zpak001.pk3dir/data => data}/cs_tire.way (100%) rename {zpak001.pk3dir/data => data}/cs_wpndepot.way (100%) rename {zpak001.pk3dir/data => data}/cs_zoption.way (100%) rename {zpak001.pk3dir/data => data}/de_aztec.way (100%) rename {zpak001.pk3dir/data => data}/de_cbble.way (100%) rename {zpak001.pk3dir/data => data}/de_chateau.way (100%) rename {zpak001.pk3dir/data => data}/de_dust.way (100%) rename {zpak001.pk3dir/data => data}/de_dust2.way (100%) rename {zpak001.pk3dir/data => data}/de_fang.way (100%) rename {zpak001.pk3dir/data => data}/de_foption.way (100%) rename {zpak001.pk3dir/data => data}/de_inferno.way (100%) rename {zpak001.pk3dir/data => data}/de_jeepathon2k.way (100%) rename {zpak001.pk3dir/data => data}/de_nuke.way (100%) rename {zpak001.pk3dir/data => data}/de_piranesi.way (100%) rename {zpak001.pk3dir/data => data}/de_prodigy.way (100%) rename {zpak001.pk3dir/data => data}/de_railroad.way (100%) rename {zpak001.pk3dir/data => data}/de_rotterdam.way (100%) rename {zpak001.pk3dir/data => data}/de_storm.way (100%) rename {zpak001.pk3dir/data => data}/de_survivor.way (100%) rename {zpak001.pk3dir/data => data}/de_torn.way (100%) rename {zpak001.pk3dir/data => data}/de_train.way (100%) rename {zpak001.pk3dir/data => data}/de_vegas.way (100%) rename {zpak001.pk3dir/data => data}/de_vertigo.way (100%) rename {zpak001.pk3dir/data => data}/es_frantic.way (100%) rename {zpak001.pk3dir/data => data}/es_jail.way (100%) rename {zpak001.pk3dir/data => data}/es_trinity.way (100%) rename {zpak001.pk3dir/data => data}/fy_pool_day.way (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/338magnum.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/357sig.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/45acp.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/50ae.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/556nato.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/556natobox.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/57mm.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/762nato.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/9mm.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/base.def (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo/buckshot.def (100%) rename {zpak001.pk3dir/decls => decls}/def/hostage.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items/c4.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items/defuse.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items/kevlar.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items/kevlar_helmet.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items/nightvision.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items/suit.def (100%) rename {zpak001.pk3dir/decls => decls}/def/monsters.def (100%) rename {zpak001.pk3dir/decls => decls}/def/player.def (100%) rename {zpak001.pk3dir/decls => decls}/def/projectiles.def (100%) rename {zpak001.pk3dir/decls => decls}/def/spawns.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/ak47.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/aug.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/awp.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/c4.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/csbase.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/deagle.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/elite.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/famas.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/fiveseven.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/flashbang.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/g3sg1.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/galil.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/glock18.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/hegrenade.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/knife.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/m249.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/m3.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/m4a1.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/mac10.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/mp5navy.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/p228.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/p90.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/scout.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/sg550.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/sg552.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/smokegrenade.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/tmp.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/ump45.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/usp.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/xm1014.def (100%) rename {zpak001.pk3dir/decls => decls}/sound/impacts.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/sound/items_cstrike.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/sound/npcs_cstrike.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/sound/player.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/sound/weapons_cstrike.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/typeinfo/hlmat.decl (100%) rename zpak001.pk3dir/default_aliases.cfg => default_aliases.cfg (100%) rename zpak001.pk3dir/default_cstrike.cfg => default_cstrike.cfg (100%) create mode 100644 default_cvar.cfg rename {zpak001.pk3dir/gfx => gfx}/vgui/buymenu.tga (100%) rename zpak001.pk3dir/icon.tga => icon.tga (100%) create mode 100644 maps/as_forest.jpg rename {zpak001.pk3dir/maps => maps}/as_forest_src.jpg (100%) create mode 100644 maps/as_highrise.jpg rename {zpak001.pk3dir/maps => maps}/as_highrise_src.jpg (100%) create mode 100644 maps/as_oilrig.jpg rename {zpak001.pk3dir/maps => maps}/as_oilrig_src.jpg (100%) create mode 100644 maps/as_riverside.jpg rename {zpak001.pk3dir/maps => maps}/as_riverside_src.jpg (100%) create mode 100644 maps/as_tundra.jpg rename {zpak001.pk3dir/maps => maps}/as_tundra_src.jpg (100%) create mode 100644 maps/cs_747.jpg rename {zpak001.pk3dir/maps => maps}/cs_747_src.jpg (100%) create mode 100644 maps/cs_alley1.jpg rename {zpak001.pk3dir/maps => maps}/cs_alley1_src.jpg (100%) create mode 100644 maps/cs_arabstreets.jpg rename {zpak001.pk3dir/maps => maps}/cs_arabstreets_src.jpg (100%) create mode 100644 maps/cs_assault.jpg rename {zpak001.pk3dir/maps => maps}/cs_assault_src.jpg (100%) create mode 100644 maps/cs_backalley.jpg rename {zpak001.pk3dir/maps => maps}/cs_backalley_src.jpg (100%) create mode 100644 maps/cs_bunker.jpg rename {zpak001.pk3dir/maps => maps}/cs_bunker_src.jpg (100%) create mode 100644 maps/cs_desert.jpg rename {zpak001.pk3dir/maps => maps}/cs_desert_src.jpg (100%) create mode 100644 maps/cs_docks.jpg rename {zpak001.pk3dir/maps => maps}/cs_docks_src.jpg (100%) create mode 100644 maps/cs_estate.jpg rename {zpak001.pk3dir/maps => maps}/cs_estate_src.jpg (100%) create mode 100644 maps/cs_facility.jpg rename {zpak001.pk3dir/maps => maps}/cs_facility_src.jpg (100%) create mode 100644 maps/cs_havana.jpg rename {zpak001.pk3dir/maps => maps}/cs_havana_src.jpg (100%) create mode 100644 maps/cs_hideout.jpg rename {zpak001.pk3dir/maps => maps}/cs_hideout_src.jpg (100%) create mode 100644 maps/cs_iraq.jpg rename {zpak001.pk3dir/maps => maps}/cs_iraq_src.jpg (100%) create mode 100644 maps/cs_italy.jpg rename {zpak001.pk3dir/maps => maps}/cs_italy_src.jpg (100%) create mode 100644 maps/cs_mansion.jpg rename {zpak001.pk3dir/maps => maps}/cs_mansion_src.jpg (100%) create mode 100644 maps/cs_militia.jpg rename {zpak001.pk3dir/maps => maps}/cs_militia_src.jpg (100%) create mode 100644 maps/cs_office.jpg rename {zpak001.pk3dir/maps => maps}/cs_office_src.jpg (100%) create mode 100644 maps/cs_prison.jpg rename {zpak001.pk3dir/maps => maps}/cs_prison_src.jpg (100%) create mode 100644 maps/cs_ship.jpg rename {zpak001.pk3dir/maps => maps}/cs_ship_src.jpg (100%) create mode 100644 maps/cs_siege.jpg rename {zpak001.pk3dir/maps => maps}/cs_siege_src.jpg (100%) create mode 100644 maps/cs_station.jpg rename {zpak001.pk3dir/maps => maps}/cs_station_src.jpg (100%) create mode 100644 maps/cs_thunder.jpg rename {zpak001.pk3dir/maps => maps}/cs_thunder_src.jpg (100%) create mode 100644 maps/cs_tire.jpg rename {zpak001.pk3dir/maps => maps}/cs_tire_src.jpg (100%) create mode 100644 maps/cs_wpndepot.jpg rename {zpak001.pk3dir/maps => maps}/cs_wpndepot_src.jpg (100%) create mode 100644 maps/cs_zoption.jpg rename {zpak001.pk3dir/maps => maps}/cs_zoption_src.jpg (100%) create mode 100644 maps/de_aztec.jpg rename {zpak001.pk3dir/maps => maps}/de_aztec_src.jpg (100%) create mode 100644 maps/de_cbble.jpg rename {zpak001.pk3dir/maps => maps}/de_cbble_src.jpg (100%) create mode 100644 maps/de_chateau.jpg rename {zpak001.pk3dir/maps => maps}/de_chateau_src.jpg (100%) create mode 100644 maps/de_dust.jpg create mode 100644 maps/de_dust2.jpg rename {zpak001.pk3dir/maps => maps}/de_dust2_src.jpg (100%) rename {zpak001.pk3dir/maps => maps}/de_dust_src.jpg (100%) create mode 100644 maps/de_fang.jpg rename {zpak001.pk3dir/maps => maps}/de_fang_src.jpg (100%) create mode 100644 maps/de_foption.jpg rename {zpak001.pk3dir/maps => maps}/de_foption_src.jpg (100%) create mode 100644 maps/de_inferno.jpg rename {zpak001.pk3dir/maps => maps}/de_inferno_src.jpg (100%) create mode 100644 maps/de_jeepathon2k.jpg rename {zpak001.pk3dir/maps => maps}/de_jeepathon2k_src.jpg (100%) create mode 100644 maps/de_nuke.jpg rename {zpak001.pk3dir/maps => maps}/de_nuke_src.jpg (100%) create mode 100644 maps/de_piranesi.jpg rename {zpak001.pk3dir/maps => maps}/de_piranesi_src.jpg (100%) create mode 100644 maps/de_prodigy.jpg rename {zpak001.pk3dir/maps => maps}/de_prodigy_src.jpg (100%) create mode 100644 maps/de_railroad.jpg rename {zpak001.pk3dir/maps => maps}/de_railroad_src.jpg (100%) create mode 100644 maps/de_rotterdam.jpg rename {zpak001.pk3dir/maps => maps}/de_rotterdam_src.jpg (100%) create mode 100644 maps/de_storm.jpg rename {zpak001.pk3dir/maps => maps}/de_storm_src.jpg (100%) create mode 100644 maps/de_survivor.jpg rename {zpak001.pk3dir/maps => maps}/de_survivor_src.jpg (100%) create mode 100644 maps/de_torn.jpg rename {zpak001.pk3dir/maps => maps}/de_torn_src.jpg (100%) create mode 100644 maps/de_train.jpg rename {zpak001.pk3dir/maps => maps}/de_train_src.jpg (100%) create mode 100644 maps/de_vegas.jpg rename {zpak001.pk3dir/maps => maps}/de_vegas_src.jpg (100%) create mode 100644 maps/de_vertigo.jpg rename {zpak001.pk3dir/maps => maps}/de_vertigo_src.jpg (100%) create mode 100644 maps/es_frantic.jpg rename {zpak001.pk3dir/maps => maps}/es_frantic_src.jpg (100%) create mode 100644 maps/es_jail.jpg rename {zpak001.pk3dir/maps => maps}/es_jail_src.jpg (100%) create mode 100644 maps/es_trinity.jpg rename {zpak001.pk3dir/maps => maps}/es_trinity_src.jpg (100%) rename {zpak001.pk3dir/maps => maps}/eukara/test_weapons.bsp (100%) rename {zpak001.pk3dir/maps => maps}/eukara/test_weapons.map (100%) rename {zpak001.pk3dir/particles => particles}/fx_smokenade.cfg (100%) rename zpak001.pk3dir/quake.rc => quake.rc (100%) rename {zpak001.pk3dir/scripts => scripts}/bots.txt (100%) rename {zpak001.pk3dir/scripts => scripts}/client_style.txt (100%) rename {zpak001.pk3dir/scripts => scripts}/constants.txt (100%) rename {zpak001.pk3dir/scripts => scripts}/maptweaks.txt (100%) rename {zpak001.pk3dir/scripts => scripts}/surfaceproperties_cstrike.txt (100%) rename {zpak001.pk3dir/scripts => scripts}/surfaceproperties_manifest.txt (100%) rename {zpak001.pk3dir/scripts => scripts}/ui_style.txt (100%) create mode 100644 src/files.dat create mode 100644 src/rules/zombie.qc diff --git a/.dir.tiff b/.dir.tiff new file mode 100644 index 0000000000000000000000000000000000000000..0eb6ac9e9d176ad4150aee4114e3712272b2d2ea GIT binary patch literal 9494 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 Updates** menu from here on out. +To run it, all you need is [FTEQW](https://www.fteqw.org), [Rad-Therapy](https://www.frag-net.com/pkgs/package_valve.pk3), and [the latest release .pk3 file](https://www.frag-net.com/pkgs/package_cstrike.pk3), which you save into `Half-Life/valve/` and `Half-Life/cstrike/` respectively. That's about it. You can install updates through the **Configuration > Updates** menu from here on out. ### Disclaimer Please **do not** file bugs if you see missing/broken content **while not** using the original Half-Life and Counter-Strike 1.5 data. @@ -88,7 +64,7 @@ We've had people ask in the oddest of places for help, please don't do that. ## License ISC License -Copyright (c) 2016-2024 Marco Cawthorne +Copyright (c) 2016-2025 Marco "eukara" 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/zpak001.pk3dir/cfg/skill_cstrike.cfg b/cfg/skill_cstrike.cfg similarity index 100% rename from zpak001.pk3dir/cfg/skill_cstrike.cfg rename to cfg/skill_cstrike.cfg diff --git a/zpak001.pk3dir/cfg/skill_manifest.cfg b/cfg/skill_manifest.cfg similarity index 100% rename from zpak001.pk3dir/cfg/skill_manifest.cfg rename to cfg/skill_manifest.cfg diff --git a/zpak001.pk3dir/csprogs.dat.de.po b/csprogs.dat.de.po similarity index 100% rename from zpak001.pk3dir/csprogs.dat.de.po rename to csprogs.dat.de.po diff --git a/zpak001.pk3dir/csprogs.dat.default.po b/csprogs.dat.default.po similarity index 100% rename from zpak001.pk3dir/csprogs.dat.default.po rename to csprogs.dat.default.po diff --git a/zpak001.pk3dir/data/as_forest.way b/data/as_forest.way similarity index 100% rename from zpak001.pk3dir/data/as_forest.way rename to data/as_forest.way diff --git a/zpak001.pk3dir/data/as_highrise.way b/data/as_highrise.way similarity index 100% rename from zpak001.pk3dir/data/as_highrise.way rename to data/as_highrise.way diff --git a/zpak001.pk3dir/data/as_oilrig.way b/data/as_oilrig.way similarity index 100% rename from zpak001.pk3dir/data/as_oilrig.way rename to data/as_oilrig.way diff --git a/zpak001.pk3dir/data/as_riverside.way b/data/as_riverside.way similarity index 100% rename from zpak001.pk3dir/data/as_riverside.way rename to data/as_riverside.way diff --git a/zpak001.pk3dir/data/as_tundra.way b/data/as_tundra.way similarity index 100% rename from zpak001.pk3dir/data/as_tundra.way rename to data/as_tundra.way diff --git a/zpak001.pk3dir/data/cs_747.way b/data/cs_747.way similarity index 100% rename from zpak001.pk3dir/data/cs_747.way rename to data/cs_747.way diff --git a/zpak001.pk3dir/data/cs_alley1.way b/data/cs_alley1.way similarity index 100% rename from zpak001.pk3dir/data/cs_alley1.way rename to data/cs_alley1.way diff --git a/zpak001.pk3dir/data/cs_arabstreets.way b/data/cs_arabstreets.way similarity index 100% rename from zpak001.pk3dir/data/cs_arabstreets.way rename to data/cs_arabstreets.way diff --git a/zpak001.pk3dir/data/cs_assault.way b/data/cs_assault.way similarity index 100% rename from zpak001.pk3dir/data/cs_assault.way rename to data/cs_assault.way diff --git a/zpak001.pk3dir/data/cs_backalley.way b/data/cs_backalley.way similarity index 100% rename from zpak001.pk3dir/data/cs_backalley.way rename to data/cs_backalley.way diff --git a/zpak001.pk3dir/data/cs_bunker.way b/data/cs_bunker.way similarity index 100% rename from zpak001.pk3dir/data/cs_bunker.way rename to data/cs_bunker.way diff --git a/zpak001.pk3dir/data/cs_desert.way b/data/cs_desert.way similarity index 100% rename from zpak001.pk3dir/data/cs_desert.way rename to data/cs_desert.way diff --git a/zpak001.pk3dir/data/cs_docks.way b/data/cs_docks.way similarity index 100% rename from zpak001.pk3dir/data/cs_docks.way rename to data/cs_docks.way diff --git a/zpak001.pk3dir/data/cs_estate.way b/data/cs_estate.way similarity index 100% rename from zpak001.pk3dir/data/cs_estate.way rename to data/cs_estate.way diff --git a/zpak001.pk3dir/data/cs_facility.way b/data/cs_facility.way similarity index 100% rename from zpak001.pk3dir/data/cs_facility.way rename to data/cs_facility.way diff --git a/zpak001.pk3dir/data/cs_havana.way b/data/cs_havana.way similarity index 100% rename from zpak001.pk3dir/data/cs_havana.way rename to data/cs_havana.way diff --git a/zpak001.pk3dir/data/cs_hideout.way b/data/cs_hideout.way similarity index 100% rename from zpak001.pk3dir/data/cs_hideout.way rename to data/cs_hideout.way diff --git a/zpak001.pk3dir/data/cs_iraq.way b/data/cs_iraq.way similarity index 100% rename from zpak001.pk3dir/data/cs_iraq.way rename to data/cs_iraq.way diff --git a/zpak001.pk3dir/data/cs_italy.way b/data/cs_italy.way similarity index 100% rename from zpak001.pk3dir/data/cs_italy.way rename to data/cs_italy.way diff --git a/zpak001.pk3dir/data/cs_mansion.way b/data/cs_mansion.way similarity index 100% rename from zpak001.pk3dir/data/cs_mansion.way rename to data/cs_mansion.way diff --git a/zpak001.pk3dir/data/cs_militia.way b/data/cs_militia.way similarity index 100% rename from zpak001.pk3dir/data/cs_militia.way rename to data/cs_militia.way diff --git a/zpak001.pk3dir/data/cs_office.way b/data/cs_office.way similarity index 100% rename from zpak001.pk3dir/data/cs_office.way rename to data/cs_office.way diff --git a/zpak001.pk3dir/data/cs_prison.way b/data/cs_prison.way similarity index 100% rename from zpak001.pk3dir/data/cs_prison.way rename to data/cs_prison.way diff --git a/zpak001.pk3dir/data/cs_ship.way b/data/cs_ship.way similarity index 100% rename from zpak001.pk3dir/data/cs_ship.way rename to data/cs_ship.way diff --git a/zpak001.pk3dir/data/cs_siege.way b/data/cs_siege.way similarity index 100% rename from zpak001.pk3dir/data/cs_siege.way rename to data/cs_siege.way diff --git a/zpak001.pk3dir/data/cs_station.way b/data/cs_station.way similarity index 100% rename from zpak001.pk3dir/data/cs_station.way rename to data/cs_station.way diff --git a/zpak001.pk3dir/data/cs_thunder.way b/data/cs_thunder.way similarity index 100% rename from zpak001.pk3dir/data/cs_thunder.way rename to data/cs_thunder.way diff --git a/zpak001.pk3dir/data/cs_tire.way b/data/cs_tire.way similarity index 100% rename from zpak001.pk3dir/data/cs_tire.way rename to data/cs_tire.way diff --git a/zpak001.pk3dir/data/cs_wpndepot.way b/data/cs_wpndepot.way similarity index 100% rename from zpak001.pk3dir/data/cs_wpndepot.way rename to data/cs_wpndepot.way diff --git a/zpak001.pk3dir/data/cs_zoption.way b/data/cs_zoption.way similarity index 100% rename from zpak001.pk3dir/data/cs_zoption.way rename to data/cs_zoption.way diff --git a/zpak001.pk3dir/data/de_aztec.way b/data/de_aztec.way similarity index 100% rename from zpak001.pk3dir/data/de_aztec.way rename to data/de_aztec.way diff --git a/zpak001.pk3dir/data/de_cbble.way b/data/de_cbble.way similarity index 100% rename from zpak001.pk3dir/data/de_cbble.way rename to data/de_cbble.way diff --git a/zpak001.pk3dir/data/de_chateau.way b/data/de_chateau.way similarity index 100% rename from zpak001.pk3dir/data/de_chateau.way rename to data/de_chateau.way diff --git a/zpak001.pk3dir/data/de_dust.way b/data/de_dust.way similarity index 100% rename from zpak001.pk3dir/data/de_dust.way rename to data/de_dust.way diff --git a/zpak001.pk3dir/data/de_dust2.way b/data/de_dust2.way similarity index 100% rename from zpak001.pk3dir/data/de_dust2.way rename to data/de_dust2.way diff --git a/zpak001.pk3dir/data/de_fang.way b/data/de_fang.way similarity index 100% rename from zpak001.pk3dir/data/de_fang.way rename to data/de_fang.way diff --git a/zpak001.pk3dir/data/de_foption.way b/data/de_foption.way similarity index 100% rename from zpak001.pk3dir/data/de_foption.way rename to data/de_foption.way diff --git a/zpak001.pk3dir/data/de_inferno.way b/data/de_inferno.way similarity index 100% rename from zpak001.pk3dir/data/de_inferno.way rename to data/de_inferno.way diff --git a/zpak001.pk3dir/data/de_jeepathon2k.way b/data/de_jeepathon2k.way similarity index 100% rename from zpak001.pk3dir/data/de_jeepathon2k.way rename to data/de_jeepathon2k.way diff --git a/zpak001.pk3dir/data/de_nuke.way b/data/de_nuke.way similarity index 100% rename from zpak001.pk3dir/data/de_nuke.way rename to data/de_nuke.way diff --git a/zpak001.pk3dir/data/de_piranesi.way b/data/de_piranesi.way similarity index 100% rename from zpak001.pk3dir/data/de_piranesi.way rename to data/de_piranesi.way diff --git a/zpak001.pk3dir/data/de_prodigy.way b/data/de_prodigy.way similarity index 100% rename from zpak001.pk3dir/data/de_prodigy.way rename to data/de_prodigy.way diff --git a/zpak001.pk3dir/data/de_railroad.way b/data/de_railroad.way similarity index 100% rename from zpak001.pk3dir/data/de_railroad.way rename to data/de_railroad.way diff --git a/zpak001.pk3dir/data/de_rotterdam.way b/data/de_rotterdam.way similarity index 100% rename from zpak001.pk3dir/data/de_rotterdam.way rename to data/de_rotterdam.way diff --git a/zpak001.pk3dir/data/de_storm.way b/data/de_storm.way similarity index 100% rename from zpak001.pk3dir/data/de_storm.way rename to data/de_storm.way diff --git a/zpak001.pk3dir/data/de_survivor.way b/data/de_survivor.way similarity index 100% rename from zpak001.pk3dir/data/de_survivor.way rename to data/de_survivor.way diff --git a/zpak001.pk3dir/data/de_torn.way b/data/de_torn.way similarity index 100% rename from zpak001.pk3dir/data/de_torn.way rename to data/de_torn.way diff --git a/zpak001.pk3dir/data/de_train.way b/data/de_train.way similarity index 100% rename from zpak001.pk3dir/data/de_train.way rename to data/de_train.way diff --git a/zpak001.pk3dir/data/de_vegas.way b/data/de_vegas.way similarity index 100% rename from zpak001.pk3dir/data/de_vegas.way rename to data/de_vegas.way diff --git a/zpak001.pk3dir/data/de_vertigo.way b/data/de_vertigo.way similarity index 100% rename from zpak001.pk3dir/data/de_vertigo.way rename to data/de_vertigo.way diff --git a/zpak001.pk3dir/data/es_frantic.way b/data/es_frantic.way similarity index 100% rename from zpak001.pk3dir/data/es_frantic.way rename to data/es_frantic.way diff --git a/zpak001.pk3dir/data/es_jail.way b/data/es_jail.way similarity index 100% rename from zpak001.pk3dir/data/es_jail.way rename to data/es_jail.way diff --git a/zpak001.pk3dir/data/es_trinity.way b/data/es_trinity.way similarity index 100% rename from zpak001.pk3dir/data/es_trinity.way rename to data/es_trinity.way diff --git a/zpak001.pk3dir/data/fy_pool_day.way b/data/fy_pool_day.way similarity index 100% rename from zpak001.pk3dir/data/fy_pool_day.way rename to data/fy_pool_day.way diff --git a/zpak001.pk3dir/decls/def/ammo.def b/decls/def/ammo.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo.def rename to decls/def/ammo.def diff --git a/zpak001.pk3dir/decls/def/ammo/338magnum.def b/decls/def/ammo/338magnum.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/338magnum.def rename to decls/def/ammo/338magnum.def diff --git a/zpak001.pk3dir/decls/def/ammo/357sig.def b/decls/def/ammo/357sig.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/357sig.def rename to decls/def/ammo/357sig.def diff --git a/zpak001.pk3dir/decls/def/ammo/45acp.def b/decls/def/ammo/45acp.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/45acp.def rename to decls/def/ammo/45acp.def diff --git a/zpak001.pk3dir/decls/def/ammo/50ae.def b/decls/def/ammo/50ae.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/50ae.def rename to decls/def/ammo/50ae.def diff --git a/zpak001.pk3dir/decls/def/ammo/556nato.def b/decls/def/ammo/556nato.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/556nato.def rename to decls/def/ammo/556nato.def diff --git a/zpak001.pk3dir/decls/def/ammo/556natobox.def b/decls/def/ammo/556natobox.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/556natobox.def rename to decls/def/ammo/556natobox.def diff --git a/zpak001.pk3dir/decls/def/ammo/57mm.def b/decls/def/ammo/57mm.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/57mm.def rename to decls/def/ammo/57mm.def diff --git a/zpak001.pk3dir/decls/def/ammo/762nato.def b/decls/def/ammo/762nato.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/762nato.def rename to decls/def/ammo/762nato.def diff --git a/zpak001.pk3dir/decls/def/ammo/9mm.def b/decls/def/ammo/9mm.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/9mm.def rename to decls/def/ammo/9mm.def diff --git a/zpak001.pk3dir/decls/def/ammo/base.def b/decls/def/ammo/base.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/base.def rename to decls/def/ammo/base.def diff --git a/zpak001.pk3dir/decls/def/ammo/buckshot.def b/decls/def/ammo/buckshot.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo/buckshot.def rename to decls/def/ammo/buckshot.def diff --git a/zpak001.pk3dir/decls/def/hostage.def b/decls/def/hostage.def similarity index 100% rename from zpak001.pk3dir/decls/def/hostage.def rename to decls/def/hostage.def diff --git a/zpak001.pk3dir/decls/def/items.def b/decls/def/items.def similarity index 100% rename from zpak001.pk3dir/decls/def/items.def rename to decls/def/items.def diff --git a/zpak001.pk3dir/decls/def/items/c4.def b/decls/def/items/c4.def similarity index 100% rename from zpak001.pk3dir/decls/def/items/c4.def rename to decls/def/items/c4.def diff --git a/zpak001.pk3dir/decls/def/items/defuse.def b/decls/def/items/defuse.def similarity index 100% rename from zpak001.pk3dir/decls/def/items/defuse.def rename to decls/def/items/defuse.def diff --git a/zpak001.pk3dir/decls/def/items/kevlar.def b/decls/def/items/kevlar.def similarity index 100% rename from zpak001.pk3dir/decls/def/items/kevlar.def rename to decls/def/items/kevlar.def diff --git a/zpak001.pk3dir/decls/def/items/kevlar_helmet.def b/decls/def/items/kevlar_helmet.def similarity index 100% rename from zpak001.pk3dir/decls/def/items/kevlar_helmet.def rename to decls/def/items/kevlar_helmet.def diff --git a/zpak001.pk3dir/decls/def/items/nightvision.def b/decls/def/items/nightvision.def similarity index 100% rename from zpak001.pk3dir/decls/def/items/nightvision.def rename to decls/def/items/nightvision.def diff --git a/zpak001.pk3dir/decls/def/items/suit.def b/decls/def/items/suit.def similarity index 100% rename from zpak001.pk3dir/decls/def/items/suit.def rename to decls/def/items/suit.def diff --git a/zpak001.pk3dir/decls/def/monsters.def b/decls/def/monsters.def similarity index 100% rename from zpak001.pk3dir/decls/def/monsters.def rename to decls/def/monsters.def diff --git a/zpak001.pk3dir/decls/def/player.def b/decls/def/player.def similarity index 100% rename from zpak001.pk3dir/decls/def/player.def rename to decls/def/player.def diff --git a/zpak001.pk3dir/decls/def/projectiles.def b/decls/def/projectiles.def similarity index 100% rename from zpak001.pk3dir/decls/def/projectiles.def rename to decls/def/projectiles.def diff --git a/zpak001.pk3dir/decls/def/spawns.def b/decls/def/spawns.def similarity index 100% rename from zpak001.pk3dir/decls/def/spawns.def rename to decls/def/spawns.def diff --git a/zpak001.pk3dir/decls/def/weapons.def b/decls/def/weapons.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons.def rename to decls/def/weapons.def diff --git a/zpak001.pk3dir/decls/def/weapons/ak47.def b/decls/def/weapons/ak47.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/ak47.def rename to decls/def/weapons/ak47.def diff --git a/zpak001.pk3dir/decls/def/weapons/aug.def b/decls/def/weapons/aug.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/aug.def rename to decls/def/weapons/aug.def diff --git a/zpak001.pk3dir/decls/def/weapons/awp.def b/decls/def/weapons/awp.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/awp.def rename to decls/def/weapons/awp.def diff --git a/zpak001.pk3dir/decls/def/weapons/c4.def b/decls/def/weapons/c4.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/c4.def rename to decls/def/weapons/c4.def diff --git a/zpak001.pk3dir/decls/def/weapons/csbase.def b/decls/def/weapons/csbase.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/csbase.def rename to decls/def/weapons/csbase.def diff --git a/zpak001.pk3dir/decls/def/weapons/deagle.def b/decls/def/weapons/deagle.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/deagle.def rename to decls/def/weapons/deagle.def diff --git a/zpak001.pk3dir/decls/def/weapons/elite.def b/decls/def/weapons/elite.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/elite.def rename to decls/def/weapons/elite.def diff --git a/zpak001.pk3dir/decls/def/weapons/famas.def b/decls/def/weapons/famas.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/famas.def rename to decls/def/weapons/famas.def diff --git a/zpak001.pk3dir/decls/def/weapons/fiveseven.def b/decls/def/weapons/fiveseven.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/fiveseven.def rename to decls/def/weapons/fiveseven.def diff --git a/zpak001.pk3dir/decls/def/weapons/flashbang.def b/decls/def/weapons/flashbang.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/flashbang.def rename to decls/def/weapons/flashbang.def diff --git a/zpak001.pk3dir/decls/def/weapons/g3sg1.def b/decls/def/weapons/g3sg1.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/g3sg1.def rename to decls/def/weapons/g3sg1.def diff --git a/zpak001.pk3dir/decls/def/weapons/galil.def b/decls/def/weapons/galil.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/galil.def rename to decls/def/weapons/galil.def diff --git a/zpak001.pk3dir/decls/def/weapons/glock18.def b/decls/def/weapons/glock18.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/glock18.def rename to decls/def/weapons/glock18.def diff --git a/zpak001.pk3dir/decls/def/weapons/hegrenade.def b/decls/def/weapons/hegrenade.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/hegrenade.def rename to decls/def/weapons/hegrenade.def diff --git a/zpak001.pk3dir/decls/def/weapons/knife.def b/decls/def/weapons/knife.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/knife.def rename to decls/def/weapons/knife.def diff --git a/zpak001.pk3dir/decls/def/weapons/m249.def b/decls/def/weapons/m249.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/m249.def rename to decls/def/weapons/m249.def diff --git a/zpak001.pk3dir/decls/def/weapons/m3.def b/decls/def/weapons/m3.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/m3.def rename to decls/def/weapons/m3.def diff --git a/zpak001.pk3dir/decls/def/weapons/m4a1.def b/decls/def/weapons/m4a1.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/m4a1.def rename to decls/def/weapons/m4a1.def diff --git a/zpak001.pk3dir/decls/def/weapons/mac10.def b/decls/def/weapons/mac10.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/mac10.def rename to decls/def/weapons/mac10.def diff --git a/zpak001.pk3dir/decls/def/weapons/mp5navy.def b/decls/def/weapons/mp5navy.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/mp5navy.def rename to decls/def/weapons/mp5navy.def diff --git a/zpak001.pk3dir/decls/def/weapons/p228.def b/decls/def/weapons/p228.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/p228.def rename to decls/def/weapons/p228.def diff --git a/zpak001.pk3dir/decls/def/weapons/p90.def b/decls/def/weapons/p90.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/p90.def rename to decls/def/weapons/p90.def diff --git a/zpak001.pk3dir/decls/def/weapons/scout.def b/decls/def/weapons/scout.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/scout.def rename to decls/def/weapons/scout.def diff --git a/zpak001.pk3dir/decls/def/weapons/sg550.def b/decls/def/weapons/sg550.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/sg550.def rename to decls/def/weapons/sg550.def diff --git a/zpak001.pk3dir/decls/def/weapons/sg552.def b/decls/def/weapons/sg552.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/sg552.def rename to decls/def/weapons/sg552.def diff --git a/zpak001.pk3dir/decls/def/weapons/smokegrenade.def b/decls/def/weapons/smokegrenade.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/smokegrenade.def rename to decls/def/weapons/smokegrenade.def diff --git a/zpak001.pk3dir/decls/def/weapons/tmp.def b/decls/def/weapons/tmp.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/tmp.def rename to decls/def/weapons/tmp.def diff --git a/zpak001.pk3dir/decls/def/weapons/ump45.def b/decls/def/weapons/ump45.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/ump45.def rename to decls/def/weapons/ump45.def diff --git a/zpak001.pk3dir/decls/def/weapons/usp.def b/decls/def/weapons/usp.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/usp.def rename to decls/def/weapons/usp.def diff --git a/zpak001.pk3dir/decls/def/weapons/xm1014.def b/decls/def/weapons/xm1014.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/xm1014.def rename to decls/def/weapons/xm1014.def diff --git a/zpak001.pk3dir/decls/sound/impacts.sndshd b/decls/sound/impacts.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/impacts.sndshd rename to decls/sound/impacts.sndshd diff --git a/zpak001.pk3dir/decls/sound/items_cstrike.sndshd b/decls/sound/items_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/items_cstrike.sndshd rename to decls/sound/items_cstrike.sndshd diff --git a/zpak001.pk3dir/decls/sound/npcs_cstrike.sndshd b/decls/sound/npcs_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/npcs_cstrike.sndshd rename to decls/sound/npcs_cstrike.sndshd diff --git a/zpak001.pk3dir/decls/sound/player.sndshd b/decls/sound/player.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/player.sndshd rename to decls/sound/player.sndshd diff --git a/zpak001.pk3dir/decls/sound/weapons_cstrike.sndshd b/decls/sound/weapons_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/weapons_cstrike.sndshd rename to decls/sound/weapons_cstrike.sndshd diff --git a/zpak001.pk3dir/decls/typeinfo/hlmat.decl b/decls/typeinfo/hlmat.decl similarity index 100% rename from zpak001.pk3dir/decls/typeinfo/hlmat.decl rename to decls/typeinfo/hlmat.decl diff --git a/zpak001.pk3dir/default_aliases.cfg b/default_aliases.cfg similarity index 100% rename from zpak001.pk3dir/default_aliases.cfg rename to default_aliases.cfg diff --git a/zpak001.pk3dir/default_cstrike.cfg b/default_cstrike.cfg similarity index 100% rename from zpak001.pk3dir/default_cstrike.cfg rename to default_cstrike.cfg diff --git a/default_cvar.cfg b/default_cvar.cfg new file mode 100644 index 0000000..521486f --- /dev/null +++ b/default_cvar.cfg @@ -0,0 +1,188 @@ +// generated by Nuclide, do not modify +set _pext_infoblobs "1" // override +set _pext_vrinputs "0" // override +set _q3bsp_bihtraces "1" // override +set ai_debugAlerts "0" // Show prints when AI gets alerted to a position. +set ai_debugLogic "0" // Show prints when AI makes decisions regarding thinking. +set ai_debugNav "0" // Show prints when AI makes decisions regarding navigation. +set ai_debugScripts "0" // Show prints when AI interacts with scripted sequences. +set ai_enable "1" // Disable AI behaviour when set. +set ai_runSpeed "320" // Default run speed chosen by AI characters, in units per second. +set ai_walkSpeed "150" // Default walk speed chosen by AI characters, in units per second. +set bot_aimless "0" // Bots will not set goals for themselves when set. +set bot_backspeed "133" // Bots desired maximum backwards speed. +set bot_crouch "0" // Bots are all forced to move crouched. +set bot_developer "0" // TODO: remove? +set bot_dont_shoot "0" // Bots never actually shoot. +set bot_enable "1" // Bot support enabled when set. +set bot_fastChat "0" // Bots will chat instantly instead of 'typing'. +set bot_forwardspeed "190" // Bots desired maximum forward speed. +set bot_minClients "-1" // How many player slots are to be filled, -1 is 'untouched'. +set bot_noChat "0" // Bots will no longer communicate when set. +set bot_pause "0" // Bots logic will be paused. +set bot_prefix "" // Bot nickname prefix for newly added bots. +set bot_prone "0" // Bots are all forced to move prone. +set bot_sidespeed "152" // Bots desired maximum strafe speed. +set bot_skill "2" // Bot version of cvar "skill". +set bot_walk "0" // Bots are forced to walk slowly. +set cfg_save_auto "1" // override +set cg_chatEnabled "1" // Enable the display of chat messages. +set cg_damageShake "0" // Shake the display upon taking damage. +set cg_hudAspect "0" // Aspect ratio override for the HUD. 1.0 is 1:1 square, 0 is auto. +set cg_modelBobHeight "0.0" // Intensity at which objects with the "spin" flag bob. +set cg_modelBobHeightSpeed "0.0" // Speed at which objects with the "spin" flag bob. +set cg_modelSpinPitch "0.0" // Intensity at which objects with the "spin" flag change their pitch. +set cg_modelSpinPitchSpeed "0.0" // Speed at which objects with the "spin" flag change their pitch. +set cg_modelSpinRoll "0.0" // Intensity at which objects with the "spin" flag roll. +set cg_modelSpinRollSpeed "0.0" // Speed at which objects with the "spin" flag roll. +set cg_modelSpinSpeed "120.0" // Speed at which an object with the "spin" key spins. +set cg_muzzleDLight "1" // Enable dlights being spawned from muzzleflashes. +set cg_muzzleDLightColor "1.0 0.45 0.0" // Color of muzzleflash dlights. +set cg_viewZSmoothingMax "16" // Camera vertical-axis smoothing max delta threshold. +set cg_viewZSmoothingMin "1" // Camera vertical-axis smoothing delta threshold. +set cg_viewZSmoothingTime "0.1" // Camera vertical-axis smoothing steps. +set cg_viewmodelFlip "0" // Flip the viewmodel. +set cg_viewmodelFov "90" // Viewmodel field of view. +set cg_viewmodelLag "0" // Viewmodel lag when camera looks around. +set cg_viewmodelOffset "0 0 0" // Viewmodel offset in relative units (forward, right, up) +set cg_viewmodelPass "1" // Renders viewmodel in separate drawpass (no lighting) +set cg_viewmodelScale "1.0" // Viewmodel scale multiplier, affects bob as well. +set cl_backspeed "400" // Client's desired backwards speed. +set cl_bob "0" // override +set cl_cursor_scale "1" // override +set cl_decals "128" // override +set cl_forwardspeed "400" // Client's desired forward speed. +set cl_musicstyle "0" // override +set cl_sidespeed "400" // Client's desired side-step speed. +set con_color "255 150 0" // HUD color value, R G B, 0-255 for each channel. +set con_notifylines "0" // override +set dev_cornerspeed "0" // Override speed set by path_corner entities. +set dev_loddistance "0" // Override distance at which func_lod entities disappear. +set dev_skyscale "" // Override for the sky_camera room scale. +set dsp_soundscapes "1" // Enable the use of sound scapes. +set g_damageScale "1" // final damage scale on objects +set g_gravity "800" // Global gravity setting. +set g_logLevel "2" // Game console log levels. 0 = None, 1 = Errors, 2 = Warnings, 3 = Extra Messages +set g_logTimestamps "0" // When 1, will print time stamps before the log message +set gl_conback "gfx/devcon" // override +set gl_mindist "4" // override +set gl_blendsprites "0" // override +set gl_specular "1" // override +set gl_specular_fallback "0" // override +set in_zoomSensitivity "1.0" // Input sensitivity multiplier for when you're zoomed in. +set logging_enabled "0" // Enable server-side logging for game specific events. +set maxpitch "89" // override +set menu_helptext_size "11" +set menu_intro "1" +set menu_steambg "0" +set menu_updating "0" +set media_repeat "0" // override +set minpitch "-89" // override +set motdfile "motd.txt" +set mp_allowvote "1" +set mp_decals "128" +set mp_flashlight "1" +set mp_td_dmgToKick "300" +set mp_td_dmgToWarn "200" +set nav_linksize "256" +set nav_radius "32" +set phys_developer "0" // Shows debug prints regarding physics operations when set. +set phys_impactforcescale "1" // Scaler for impact forces on physically simulated entities. +set phys_pushscale "1" // Scaler for push forces on physically simulated entities. +set pm_accelerate "10" +set pm_airaccelerate "10" +set pm_airstepsize "0" +set pm_boxcenter "1" +set pm_boxwidth "32" +set pm_crouchheight "36" +set pm_crouchspeed "90" +set pm_crouchviewheight "30" +set pm_edgefriction "1" +set pm_friction "4" +set pm_gravity "800" +set pm_jumpheight "265" +set pm_maxviewpitch "89" +set pm_minviewpitch "-89" +set pm_noclipaccelerate "5" +set pm_noclipspeed "500" +set pm_normalheight "72" +set pm_normalviewheight "64" +set pm_nospeedcap "0" +set pm_proneheight "0" +set pm_pronespeed "40.5" +set pm_proneviewheight "16" +set pm_runspeed "0" +set pm_runfiring "1" +set pm_stairSmoothing "1" +set pm_stamina "24" +set pm_staminarate "0.75" +set pm_staminathreshold "4" +set pm_stepsize "18" +set pm_stopspeed "100" +set pm_thirdPerson "0" +set pm_walkspeed "270" +set pm_wateraccelerate "10" +set pm_waterjumpheight "350" +set r_autoscale "1" // When set, will ensure the game is at 640x480 type scaling. +set r_drawdecals "1" // Shows decal entities managed by the game when set. +set r_ignoreentpvs "0" // override +set r_imageextensions "tga bmp pcx png jpg" // override +set r_meshpitch "1" // override +set r_pixelscale "0" // When set, will ensure the 3D rendered scene is restricted to 640x480 resolution in definition. +set r_renderEntityInfo "0" // Display visual information about entities in-world. +set r_showDlights "0" // Displays dynamic light representations in-world. +set r_showPhysicsInfo "0" // Displays physics entity information in-world. +set r_skipGlows "0" // Skip rendering of glowing sprites. +set r_skipLensFlares "0" // Skip rendering of lens flares. +set r_skipWorld "0" // Skip rendering of the world. +set rm_unlit_additive "1" // Render entities with the 'additive' rendermode fullbright. +set rm_unlit_texture "1" // Render entities with the 'texture' rendermode fullbright. +set rope_debug "0" // Shows primitive debug rendering of a rope when set. +set rope_fast "1" // Don't perform expensive calculations on the rope when set. +set rope_maxsegments "-1" // Limit rope segments. -1 means no limit. +set rope_sag "2" // Rope sagging multiplier. +set rope_swing "2" // Rope swinging multiplier. +set s_logLevel "2" // Sound console log levels. 0 = None, 1 = Errors, 2 = Warnings, 3 = Extra Messages +set scr_conalpha "1" // override +set scr_loadingscreen_aspect "1" // override +set sp_decals "128" +set sv_friendlyFire "0" // Team-inflicted damage is possible when set. +set sv_gameplayfix_setmodelrealbox "1" // override +set sv_gameplayfix_setmodelsize_qw "1" // override +set sv_levelexec "1" // Will search and execute `/maps/currentmap.cfg` when set. +set sv_plugins "1" // Enable the use of server-side plugins when set. +set v_contentblend "0" // override +set vehicle_developer "0" // Shows vehicle related debug prints when set. +set vgui_color "255 170 0" // Default primary color for VGUI widgets. +set vid_brightness "0" // Controls display brightness. +set violence_ablood "1" // Enable non-human (alternative) blood. +set violence_agibs "1" // Enable non-human (alternative) gibs. +set violence_hblood "1" // Enable human blood. +set violence_hgibs "1" // Enable human giblets. +set xr_roomScale "1.0" // XR: Room scale multiplier. +set xr_testInputs "0" // XR: Enable fake inputs, to debug the VR camera and weapon inputs. +set xr_viewHeight "-48" // XR: Default view-height offset. +set physics_ode_quadtree_depth "3" // override +set physics_ode_contactsurfacelayer "0" // override +set physics_ode_worldquickstep "1" // override +set physics_ode_worldquickstep_iterations "10" // was 20, too much +set physics_ode_contact_mu "1" // override +set physics_ode_contact_erp "0.96" // override +set physics_ode_contact_cfm "0.001" // override +set physics_ode_world_damping "-1" // override +set physics_ode_world_damping_linear "-1" // override +set physics_ode_world_damping_linear_threshold "-1" // override +set physics_ode_world_damping_angular "-1" // override +set physics_ode_world_damping_angular_threshold "-1" // override +set physics_ode_world_erp "0.96" // override +set physics_ode_world_cfm "0.001" // override +set physics_ode_iterationsperframe "1" // override +set physics_ode_movelimit "1.0" // override +set physics_ode_spinlimit "1300" // was 2000 +set physics_ode_autodisable "1" // override +set physics_ode_autodisable_steps "5" // override +set physics_ode_autodisable_time "0.1" // override +set physics_ode_autodisable_threshold_linear "0.05" // Was 0.2, too lenient. +set physics_ode_autodisable_threshold_angular "0.01" // override +set physics_ode_autodisable_threshold_samples "5" // override +set physics_ode_maxspeed "800" // was 0 diff --git a/zpak001.pk3dir/gfx/vgui/buymenu.tga b/gfx/vgui/buymenu.tga similarity index 100% rename from zpak001.pk3dir/gfx/vgui/buymenu.tga rename to gfx/vgui/buymenu.tga diff --git a/zpak001.pk3dir/icon.tga b/icon.tga similarity index 100% rename from zpak001.pk3dir/icon.tga rename to icon.tga diff --git a/maps/as_forest.jpg b/maps/as_forest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5081eb135636eac96d54ec2d85416feace147b32 GIT binary patch literal 5994 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 RhSvLFg!6yUMk?I@_&+S7Ee!ww literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/as_highrise_src.jpg b/maps/as_highrise_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/as_highrise_src.jpg rename to maps/as_highrise_src.jpg diff --git a/maps/as_oilrig.jpg b/maps/as_oilrig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bca833ff96be94d3d21f827e5c3b04762fac889b GIT binary patch literal 4640 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/as_tundra_src.jpg b/maps/as_tundra_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/as_tundra_src.jpg rename to maps/as_tundra_src.jpg diff --git a/maps/cs_747.jpg b/maps/cs_747.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d55baf46222e285f783fd2e47048a826745dac54 GIT binary patch literal 5217 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_747_src.jpg b/maps/cs_747_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_747_src.jpg rename to maps/cs_747_src.jpg diff --git a/maps/cs_alley1.jpg b/maps/cs_alley1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9b284f0ad69c9d600953e08988ea763c5c58da1 GIT binary patch literal 4042 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 F_8;OaZs7m` literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_alley1_src.jpg b/maps/cs_alley1_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_alley1_src.jpg rename to maps/cs_alley1_src.jpg diff --git a/maps/cs_arabstreets.jpg b/maps/cs_arabstreets.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c050bdd7537c6537ca3bc6497ed62a76531cf7d6 GIT binary patch literal 5667 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 auZo6W@snJV4sDk}i2!4GdE=GKng0RTeYXk# literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_arabstreets_src.jpg b/maps/cs_arabstreets_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_arabstreets_src.jpg rename to maps/cs_arabstreets_src.jpg diff --git a/maps/cs_assault.jpg b/maps/cs_assault.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58862766c630c552ffc2b5e06fcd0eff0908d0c9 GIT binary patch literal 4148 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 O=ikKFB(?)Dr~U(D53yGO literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_assault_src.jpg b/maps/cs_assault_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_assault_src.jpg rename to maps/cs_assault_src.jpg diff --git a/maps/cs_backalley.jpg b/maps/cs_backalley.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c399b3b1f6f9838e8131281c6693363b769d1529 GIT binary patch literal 4632 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 Pvq}AYQ&WFGUVix>FT$R) literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_desert_src.jpg b/maps/cs_desert_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_desert_src.jpg rename to maps/cs_desert_src.jpg diff --git a/maps/cs_docks.jpg b/maps/cs_docks.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5eb1e3c3ebf81cb093c7760fa4a6a584400937e5 GIT binary patch literal 4207 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_docks_src.jpg b/maps/cs_docks_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_docks_src.jpg rename to maps/cs_docks_src.jpg diff --git a/maps/cs_estate.jpg b/maps/cs_estate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a36076d2542170f08c9d4faa143872566d6efba8 GIT binary patch literal 4607 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_estate_src.jpg b/maps/cs_estate_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_estate_src.jpg rename to maps/cs_estate_src.jpg diff --git a/maps/cs_facility.jpg b/maps/cs_facility.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bbe42c69f5fb8e439a704c7e648531e401cff96b GIT binary patch literal 4473 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_facility_src.jpg b/maps/cs_facility_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_facility_src.jpg rename to maps/cs_facility_src.jpg diff --git a/maps/cs_havana.jpg b/maps/cs_havana.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f60130d9dcf99d91a7a51d4faec8957faacb7c4a GIT binary patch literal 6060 zcmb7mXEfXo(Dlz+R_~%mTOmsHuzK&kLXR1T8IdX)kW{SI?+W4Rwr0NNc0k- zZbawtKks?ZdA>e(=F{9WckX}SlDr)2t z8C5j7qHOHoi&(vrV8Q`Fxc_?qfD6U};o||2JCctQ0NoAvuYmji4B&tON?b4%J07*L zq9KO}EvKFLo%-a;?GJzi_fCoumlBW%hTNU#?ui%;ZJ3gq1aN-bCYal5y;jSz-rnrs zo3=)pO_&-ql;OUpVHE`IQ!>WRo6366xvwi7H zw~{p*A{2l8QS9euc5-g}iGS3+!jw;DwKXwj-X?DHlxBSjjcc2DmZ*Cihr>BFpFh^0 z|C>4yXFjS+X!FIm+E1w(CH*S$%TidcMq4EwC0?tZ-!H_Ly_S0T0vppUtOYCbml<4J zhPTgei&r9!GE>T1`v%EN;ra^xnBWV=sUl$xDjL?Bj|J;V*m(CMW0zRTgsH47A$o@e zr6#Hdn3bD7)-P3KScqDZ{vYO{oE^8tp0kQGo7xcwB6_bJGdl{47^7Cl!9+YtUe<;3w(V+cIfglSqE## zPS+76`r%n*6(-Qb8s6XRxECHacs5I|GgdzSJEP}8@z?o)EQdHo%*@cH3U+FQ?YvfQR~GW~{2Kw)V|-QkA)%d91N!kOO3m_PqMIDDOuweAxc zH}i>i04N^I63z_fJIZmm8|(YU!BGpmR9GSxQo6Q+F${>Ii-3q=!$uwV%GpM05^!|8E&ylYG=Zjrv48SqP- zU70$v+_QD*bjD7xzpQ1_I9|TA;nnPPyN&5UMbCN6&|%o(`o`DcMUAIvBnYi>ljYnd zRu<95KjpyoaaSsniARBBy_3gYL?O{udbBbE#~}&geNcj3(O!DRPMH`R?ZgvJIPvJQ zyp(-;29!B5RKB>`>MSu^I+Rw`GG<7)koU`zZFx~7ik1ATPWStswi?9THEgQ%B1oU@ zYC)qzVD2sC`6e-BxcT*Thin7txAFSq)Ywyro1ZdH3x65KTIK}|v?>*y(pQHS#pz%o z?`|x8YUHZ?G%Bsl7|IYkseWwB#*@(+M>p#M5G=Riugan1);u7RaHZd`2I=2wFxSI* zCaS%OVLdm*vd%KLwBmN>F=&}2SMUYIRm7)P`Re1p;nZnkeZqLz`v}rtYV#0Lpl_s% zPsz;De6~n>u{-^;Q3CI9-8?3HT9;5L2!hoy(h}pMQlAtlObm))C+QNe75jmapqZYT0v`yIe=F%u#;dnc^@LX`P>$EKC z5J;CH$pL^-C0_K%Pv{iXDdYc5qnd8{WF%&Lqtb8-2)r5>cX0Ft7+a~fE@jU;dYL7} z(R>Nry{E0Vsv_+EBsJPD4BZ3h+Uz$E>aFe7TAuV+Fj5$4ZLv zgYwl%tK_ybCH;lB?Js$Ma9svp#9=O-fFI=Lf@0@lP$#e_7WGzfz5Kw3?rfx~_M zXYEJM8+|Q&jol}w^!p9!!$@d~3^gD{A~#Up_C2}fx+dg?Oq=w_PYX9b8Uv#K5wt1M zTIiSgQ(6DK9TwIH1r7vnroxJ?!h~nWsWAkXItvv6jj_-7ybT3;RsJaRXcA(r_Hm@+ zPrzHht4hNTFHrMFOaA_j0&q?9ht`8X;Y&5*1$(n+2NG`dxno~VOY=uXlDUPj<|h}l z(@Zns?G5ej`aiR{lGucYVbiI(gD?9^f<46xCmUT;><$I5x`i7beh4FC=(BHFKTg7T z-K%FXzqYO`-hqA66(ozSAHd5)z-YkOeIvqkCYQq-3hx^hy2Ug5N6e;q%PX!W6X^-9 z^em~QN2L?g3oA`x6ov!os!!6EmHHwjAQjiAvx@#O<~Ih*Jq?o=ojo-5L%s%0P1Cwm ze>flrwl@&PFLjLR&4(D_R1I6DGcX7id+is}DXeS(R(q6Z8LoK?$X(==m$oc$q!*w+ z$ONc*y!<0C`$@M-HHC8jO3UcPy_IXy)=AF7AW-<*!NTv-ZGNg&dS&j~j5ITkwWV8t zQED})>1liW{#Pz&IQcV=-47`x|AJy2-e=@e_Mk;~7;b^)l%jwH$T9<8&pqeD&yz)+ z?tFN!^}IBI{l`ns;Gub*>6cvK6m8>oe#AqY3C*%5?xW*C!gg()L0AfS^G`TXZYU58&kyDq_M(qSrk~LJ(tP0`^eX}TifnoI zndCCY*3}|9lFQ5~Zr0D>MT_F2pjwgiE6nna5w8?lfIgdWHUo#5LSFYIucBl#0_uFS z24iB;7NlA%EOra1+%z}$NzUz-^$JRywZ2g(un+B!c+__GMk{%QtC^4*`FtJsFIucg zya*BR6BpF}P>L>5^2Rz$R@1A$d$ym3Z@7|FCU9#mDqJ|?sOCXUUivAiw1$;7AJ2q` z1LytTB}JysgQsTfcw&!#9C>qSrD@EQXh&y2TIm@ELN9lu$Q~5G;TE6Z9KbQL!hp#7 zUgVFc)5Q%G+Qk9Zce8s4k=L6ZkHV zPpl;_*rEhpRGj|cl?KKqDhDV=LLGB4lRn)JI-m2#I{EKVU!5BZ0n z6VSYj9UskI)aF}(&EMu}{-U3SJW8Az>vsx+o@aKO0vb=`R-E$V_*Bd8(dz>o<-077`P^K+u|8vYoT{Fu(3zS0J4lAo{#J4g3X6Mg3 zNovO^1%wb3Q5iMu-JD|qnlV8m2DKVVQpVz4x-!Us1_#;7<)CzZ{4;l(fHYpxr{w$@ zHY$lZr`uvJ)E2YvX5P-?XDev6WDN_+;Uu{`hh~J3uZ*1VQ!ZBD*kyBYc(V@(StY$1 z+^f+4BtI`0e&+c!TDKXq7nI2mr!Ja2{&QT9#-;p)(--ExA2lO3C%1qDuEwi5(Xn~S z)Awt!B_W!x%46$qNW_necqSAI>mcZofR}K=Q#gAJaXF=Rjo4@t^O5Q72=8OtlnQ6q zk^I>PKbNek2fZcYashcDh z8twJ?XM>!Xe9mCkEx|86gDQiuZ#v^CBQ$r&=B0@1G?ME!LlY z{c;jf+gBPcP@8!8vp)AmE_iAO$$gU$^D0zvCHNC#jNS?>WBVmJsr_P;MA@z@_zW=ZzHY}yL2D*`=>|$2Ms3tC0mA>@KBGpW ziqgI5i;*9P(w{(i1mHTsVX`!5#sAcF-&q{=c(dq-1j1iq z>_OK$f9QqS9B%<@4fEY!(^h<@RB9^8N*W@v8pB~BzdyY#*vp%n)^uA+i{LG%AKI

q|(IPP=d4GX?D?y=D25~>9m_;wg_^WH8R6Ujs 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 M{1nB~$#6ISe+IDoI{*Lx literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_iraq_src.jpg b/maps/cs_iraq_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_iraq_src.jpg rename to maps/cs_iraq_src.jpg diff --git a/maps/cs_italy.jpg b/maps/cs_italy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18ef367d011671a180c6287d1b43d57aeea3268f GIT binary patch literal 7278 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 VDf>puOg3iBH5c%_J^bIq{{UpXj(Pw9 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_italy_src.jpg b/maps/cs_italy_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_italy_src.jpg rename to maps/cs_italy_src.jpg diff --git a/maps/cs_mansion.jpg b/maps/cs_mansion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4368a030e0757710ad2b6b738550ccdfe81f8788 GIT binary patch literal 6382 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_militia_src.jpg b/maps/cs_militia_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_militia_src.jpg rename to maps/cs_militia_src.jpg diff --git a/maps/cs_office.jpg b/maps/cs_office.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f97e85640504efd4109442a68fde0548de8b3aa7 GIT binary patch literal 4464 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_prison_src.jpg b/maps/cs_prison_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_prison_src.jpg rename to maps/cs_prison_src.jpg diff --git a/maps/cs_ship.jpg b/maps/cs_ship.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3bdb75f714c3203e744d103993700d529b25279 GIT binary patch literal 3652 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_ship_src.jpg b/maps/cs_ship_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_ship_src.jpg rename to maps/cs_ship_src.jpg diff --git a/maps/cs_siege.jpg b/maps/cs_siege.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee53d199b6e68a40a6c9f930f6ab8d3330a54f6c GIT binary patch literal 5948 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_siege_src.jpg b/maps/cs_siege_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_siege_src.jpg rename to maps/cs_siege_src.jpg diff --git a/maps/cs_station.jpg b/maps/cs_station.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b8929aa7562901c3a75beb45c79b7279e457787 GIT binary patch literal 4680 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 U$zB$OoK}SVi*_qMx`*li0b<9}hyVZp literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_station_src.jpg b/maps/cs_station_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_station_src.jpg rename to maps/cs_station_src.jpg diff --git a/maps/cs_thunder.jpg b/maps/cs_thunder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..396cd025f4bcc9068d04555bc569e708ea47d5ff GIT binary patch literal 5191 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 L{079ju4euR*QAV% literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_thunder_src.jpg b/maps/cs_thunder_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_thunder_src.jpg rename to maps/cs_thunder_src.jpg diff --git a/maps/cs_tire.jpg b/maps/cs_tire.jpg new file mode 100644 index 0000000000000000000000000000000000000000..268f07f918d16d807c5090058f29c031132709bf GIT binary patch literal 7381 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_wpndepot_src.jpg b/maps/cs_wpndepot_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_wpndepot_src.jpg rename to maps/cs_wpndepot_src.jpg diff --git a/maps/cs_zoption.jpg b/maps/cs_zoption.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea1f349647b730f714dcccbc45a71740ab7f44f1 GIT binary patch literal 4694 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/cs_zoption_src.jpg b/maps/cs_zoption_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_zoption_src.jpg rename to maps/cs_zoption_src.jpg diff --git a/maps/de_aztec.jpg b/maps/de_aztec.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79853401f6d2a711654ede293c15af46ca4cc2f5 GIT binary patch literal 6856 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 Js($(Xe*pLMkSG8E literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_cbble_src.jpg b/maps/de_cbble_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_cbble_src.jpg rename to maps/de_cbble_src.jpg diff --git a/maps/de_chateau.jpg b/maps/de_chateau.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6339ce471ba1e0213c08620171fff82e26f32ece GIT binary patch literal 7744 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 KI+O70ng0NFvXM;y literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_chateau_src.jpg b/maps/de_chateau_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_chateau_src.jpg rename to maps/de_chateau_src.jpg diff --git a/maps/de_dust.jpg b/maps/de_dust.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff6f52a16f5c641aa2a54af917c2e2eb08b95767 GIT binary patch literal 7236 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 VKXtH_Dpb(pDJ5*w!N;qA{|mDR%p(8* literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_dust2_src.jpg b/maps/de_dust2_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_dust2_src.jpg rename to maps/de_dust2_src.jpg diff --git a/zpak001.pk3dir/maps/de_dust_src.jpg b/maps/de_dust_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_dust_src.jpg rename to maps/de_dust_src.jpg diff --git a/maps/de_fang.jpg b/maps/de_fang.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b100b347386109e7589fc18effc6100c52ae07f GIT binary patch literal 4815 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 H`saTDNrK64 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_fang_src.jpg b/maps/de_fang_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_fang_src.jpg rename to maps/de_fang_src.jpg diff --git a/maps/de_foption.jpg b/maps/de_foption.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75f5051298bb24cb01a0270e73f0ce3bb27a2013 GIT binary patch literal 3597 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

3iCd04}qz(qED#w0BA}S21(GC zu8j{}&v9COOD)-8G_f!6JKth$zA~iF5Oh7&O$Y0q|vYmyi%?! zM%z|CwT+)DIoW>%bv?9ygzd5@E^d@Ge`q{8(f<(SQT z{4$B6P628BG&F5f9gCuZ;eTY8zL2rdtjW<(m1sXm1gu0jj~^t)MRMh#Kpv z&})f2;LU`EygqJ!3Hh=WB3xAupMo;C%}y-LuGh<&2b-;7*lu`$WL^bVnLi;zxR=0eUqf!a&0;Sw`WWZz$3(ppjY z{ynq8x*3OHNfXu)&NaeKuDxPUX27#M?4ZToVy0%xs_66BQf!UblQtMAAuWI$l(rHu z{X9W_@HOpFuaPN!m?lt1_1i_ni9?$iMTKf<=VXcGSi}1)p{xZ~r2z9zaphNoG_2)Y zZ)!_g7KDV7nPh63NwY8+f)@d`oq9Ecs#nD{H&V5B@aasXiJyCE1!iqi7kcrvd^lbc z_K^Tz^{n?=I%6n7KzOIL&B78J7or963K^0mcF&<}%ZTS+CpsNc&SfTwMJfHQt}9Qg z`*p2z!o={wp{ZM$=;$L+YE%{dL?>nbfgqZUTWo24mMz5?cI=IM6C*&6Djg1rla;PF zEG^mK&gDxk`pY}+AlU|F-qcy&A$4wjQ=Ih&1K)=XG<`X_ldrVti!fU94aT?uGK zDpTpbPxsFSn(CVo>T&~}m;h;hno{Edb{wUb(|67gf&+~~yX|B;z8D_CU~V!;t>x#* z=usf89|)IF|Qi7#@-?k1+*YLX^62d9ptF&>49Z|U$c76<#WVHKs3xF%1A~aD7iI&d7c~z7Q)uwUt zJCb$D95I^yiz$jt$L1~8~e5qwf@nw5Q?J%$|2UJ=VU;n+8? z>)|Y_Ypub!uMd3YTR#hwNckYppH?2?6|1G-IfXQu#w4gu!x851@~f-bVV^j_+J>s$ z?PU9%@yhQF822gJ1h^iMXS>PkI2GesKiL7NG|csQMqfjo7LNzs3H&Q>dXU1R7gZ`N zUA!Gp?cwW>&GVp#76KHX$IICksy-q+o4UBHEijLYZ&}wB3Dgk4)>UaHY;V|ayVn3j z9%!BbPJ0zF9ag&?vUNU~AMJ^)DCYTDnL8evlw<~@1i#2QYXOm5NHt_9_0JyrH1juY I_P1aE2j@^h#{d8T literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_inferno_src.jpg b/maps/de_inferno_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_inferno_src.jpg rename to maps/de_inferno_src.jpg diff --git a/maps/de_jeepathon2k.jpg b/maps/de_jeepathon2k.jpg new file mode 100644 index 0000000000000000000000000000000000000000..480dcf3df81007114473feab2d35562d26e8a65a GIT binary patch literal 4329 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_jeepathon2k_src.jpg b/maps/de_jeepathon2k_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_jeepathon2k_src.jpg rename to maps/de_jeepathon2k_src.jpg diff --git a/maps/de_nuke.jpg b/maps/de_nuke.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb2945544f51293577b709efd429999487c5d71f GIT binary patch literal 4006 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 VRi+R^A*Y1~rQ91N-oTvC{0Aj_G_L>v literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_nuke_src.jpg b/maps/de_nuke_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_nuke_src.jpg rename to maps/de_nuke_src.jpg diff --git a/maps/de_piranesi.jpg b/maps/de_piranesi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..929a254899b7869f2f4ae9f717dfdce546f9f226 GIT binary patch literal 7418 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 EA17wP*Z=?k literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_piranesi_src.jpg b/maps/de_piranesi_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_piranesi_src.jpg rename to maps/de_piranesi_src.jpg diff --git a/maps/de_prodigy.jpg b/maps/de_prodigy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92b70b83557b5d74e0c2fd2f47ec9044ff86a469 GIT binary patch literal 4071 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

OPH5OcLs+0JM#n2b zRs;aeq&`=)T##Yu{b;b5%`UX0Q^a4ToEWs7xQP-;EceMUj_r}{)Hk91&~}*V;_rOJ zo@!r7`9-(Ay3L8_=r#+r|7w`NsaZ}ZD{f$@Zu}?{^m*`Fw6hl63z$5FyJr3^90Vlp6QFG2So9z-Zk-y9`PkGR zgNHO5n7o?g&!bG^NcECl#*sLOcVaOmkDwg0T`rb}Mj!6?KU#CeHcR&tdAH*e$@5F^ zQ%pH&N^rUCm4-L@))4w-J+;F^?fn7_3YajzQtQpD$)}e_LZ1?ko%3~~4abHJQO3UW z-tN5Qt(V2JEu>e5S7Q!*eeaVy$fHUfta=>r)E;}hr*7bDRfwcRx`y(e5_$AwnM+%D z6h}wXTKQZ&HoQ^jG6~`+wBi?>O1>zR?`@|ktYQ>NXX(Ej&)gY)^)n%#ec#}Zf)cfr zRIx}~=yvH!9EeeS!B;w%e;SgmCPrmQ`CcIlzKtYQ^?8kAL%G8CUDIVCgy3FoyJ42j zQIP%wfXh613%QS$S{Oxy+s<)#*e&u9MFK@RtcIf}0hvojJVv``fcF#c$Cq;Ht*<+( z2b-B>j?eH{D);9W8-%H5!x~GagG9`n5OPYk0ikM&4eutCg3$``dsrzGSNQjWQ9oCy zsVA?YhRGBUxMUL4fw#L)?X9} zN*h*n-1J8?o)~uGFX=7Y=Mlf~b6GcDxgh`SrSd4srHWcw`-%MTP#%w~;4zb&T+IVF zWK+-YYDiC4?<3)ZA!XW~K16d`m2t#(;;{dVeq9i)@LR#nlSGzrS`v#NTKSZMQmbbD zl!n=fYTKFse$(p>_*}Lu`wKhJG@Wx0+2HuoqxE_q47$JRkC!oj=F&|3yUYLlqsEK>Goj2VjuDZ=_-0kyH@TRQa~zp-m^ueH*UvAJ+`=(?VWbi23EgoB`{mKv04k~F>5qv5E2n)%6KfexcTGI1fQ`l8*a z!&bB}cza$0&U?@*8%kX-e=UBJv2u=^Q^Mq(Kap13RARLl)sIX6Zi`l#oMGO7xX;xN zGt4K?@T*Bd+`~%>ihS#TV~fMEvWDV)bOviz-2G&KMciV_*N_11!)Ft6pU?AWD3z3B z?e0Gi+THro?v0n7n&-Q^Y9@m0ntIh-*{(OPQOGmgB!>fJE--!k#1lq5xHwFkp@h(K z4TsxrB-~_3@jm~hm}lI2@x>Isn)21~h@afSkbpN5W6GS6|G@TL|9C!I#dFvT%Z|#m rrMxUf&kIt;*sjG$5F<2S?R{dkMb|W%VZp2dB;CfgJXJvR?A!kVsgm&| literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_railroad_src.jpg b/maps/de_railroad_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_railroad_src.jpg rename to maps/de_railroad_src.jpg diff --git a/maps/de_rotterdam.jpg b/maps/de_rotterdam.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f57cb42882180d95f5f6ce58dfc28b82b658f8a2 GIT binary patch literal 5376 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_rotterdam_src.jpg b/maps/de_rotterdam_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_rotterdam_src.jpg rename to maps/de_rotterdam_src.jpg diff --git a/maps/de_storm.jpg b/maps/de_storm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b70c2842aa69a8760c466fdef07678651487e21 GIT binary patch literal 5154 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_storm_src.jpg b/maps/de_storm_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_storm_src.jpg rename to maps/de_storm_src.jpg diff --git a/maps/de_survivor.jpg b/maps/de_survivor.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01d15f6616e21c407013b666e823995d96411c9f GIT binary patch literal 5460 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_survivor_src.jpg b/maps/de_survivor_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_survivor_src.jpg rename to maps/de_survivor_src.jpg diff --git a/maps/de_torn.jpg b/maps/de_torn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72d672c1443791e6eed2e6c0c37b8e880f1da21c GIT binary patch literal 5932 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_torn_src.jpg b/maps/de_torn_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_torn_src.jpg rename to maps/de_torn_src.jpg diff --git a/maps/de_train.jpg b/maps/de_train.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3d60df797e137730c2251454c31e7acba25400b GIT binary patch literal 5529 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_train_src.jpg b/maps/de_train_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_train_src.jpg rename to maps/de_train_src.jpg diff --git a/maps/de_vegas.jpg b/maps/de_vegas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abb12c03e269591e857ce1e62d281202e376ff89 GIT binary patch literal 4621 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 Q%8!+xE~i<^lCEa|155vbn*aa+ literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/de_vegas_src.jpg b/maps/de_vegas_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_vegas_src.jpg rename to maps/de_vegas_src.jpg diff --git a/maps/de_vertigo.jpg b/maps/de_vertigo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81b4c875b851f6b4b6b831d97f234fe152710080 GIT binary patch literal 6343 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 IVC&Pr0fKi`xc~qF literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/es_frantic_src.jpg b/maps/es_frantic_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/es_frantic_src.jpg rename to maps/es_frantic_src.jpg diff --git a/maps/es_jail.jpg b/maps/es_jail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dbb77077496fcfc55cbcaabe44216a13ce25cf1 GIT binary patch literal 4457 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 A-v9sr literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/es_trinity_src.jpg b/maps/es_trinity_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/es_trinity_src.jpg rename to maps/es_trinity_src.jpg diff --git a/zpak001.pk3dir/maps/eukara/test_weapons.bsp b/maps/eukara/test_weapons.bsp similarity index 100% rename from zpak001.pk3dir/maps/eukara/test_weapons.bsp rename to maps/eukara/test_weapons.bsp diff --git a/zpak001.pk3dir/maps/eukara/test_weapons.map b/maps/eukara/test_weapons.map similarity index 100% rename from zpak001.pk3dir/maps/eukara/test_weapons.map rename to maps/eukara/test_weapons.map diff --git a/zpak001.pk3dir/particles/fx_smokenade.cfg b/particles/fx_smokenade.cfg similarity index 100% rename from zpak001.pk3dir/particles/fx_smokenade.cfg rename to particles/fx_smokenade.cfg diff --git a/zpak001.pk3dir/quake.rc b/quake.rc similarity index 100% rename from zpak001.pk3dir/quake.rc rename to quake.rc diff --git a/zpak001.pk3dir/scripts/bots.txt b/scripts/bots.txt similarity index 100% rename from zpak001.pk3dir/scripts/bots.txt rename to scripts/bots.txt diff --git a/zpak001.pk3dir/scripts/client_style.txt b/scripts/client_style.txt similarity index 100% rename from zpak001.pk3dir/scripts/client_style.txt rename to scripts/client_style.txt diff --git a/zpak001.pk3dir/scripts/constants.txt b/scripts/constants.txt similarity index 100% rename from zpak001.pk3dir/scripts/constants.txt rename to scripts/constants.txt diff --git a/zpak001.pk3dir/scripts/maptweaks.txt b/scripts/maptweaks.txt similarity index 100% rename from zpak001.pk3dir/scripts/maptweaks.txt rename to scripts/maptweaks.txt diff --git a/zpak001.pk3dir/scripts/surfaceproperties_cstrike.txt b/scripts/surfaceproperties_cstrike.txt similarity index 100% rename from zpak001.pk3dir/scripts/surfaceproperties_cstrike.txt rename to scripts/surfaceproperties_cstrike.txt diff --git a/zpak001.pk3dir/scripts/surfaceproperties_manifest.txt b/scripts/surfaceproperties_manifest.txt similarity index 100% rename from zpak001.pk3dir/scripts/surfaceproperties_manifest.txt rename to scripts/surfaceproperties_manifest.txt diff --git a/zpak001.pk3dir/scripts/ui_style.txt b/scripts/ui_style.txt similarity index 100% rename from zpak001.pk3dir/scripts/ui_style.txt rename to scripts/ui_style.txt diff --git a/src/client/Makefile b/src/client/Makefile index 2fe44a4..bcb3bed 100644 --- a/src/client/Makefile +++ b/src/client/Makefile @@ -1,4 +1,4 @@ QCC=fteqcc all: - $(QCC) progs.src + $(QCC) $(CFLAGS) -I../../../src/platform/ -I../../../valve/src/shared/ progs.src diff --git a/src/client/progs.src b/src/client/progs.src index 0331690..ec1d3e3 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -7,47 +7,47 @@ #define CLIENT #define CSTRIKE + #includelist ../../../src/shared/fteextensions.qc ../../../src/shared/defs.h -../shared/defs.h -defs.h +../../../cstrike/src/shared/defs.h +../../../cstrike/src/client/defs.h ../../../src/client/defs.h ../../../src/vgui/include.src ../../../src/gs-entbase/client.src ../../../src/gs-entbase/shared.src ../shared/include.src - -radar.qc -nightvision.qc +../../../cstrike/src/client/radar.qc +../../../cstrike/src/client/nightvision.qc ../../../valve/src/client/damage.qc -draw.qc -textmenu.qc -init.qc +../../../cstrike/src/client/draw.qc +../../../cstrike/src/client/textmenu.qc +../../../cstrike/src/client/init.qc ../../../valve/src/client/flashlight.qc -entities.qc -cmds.qc -game_event.qc +../../../cstrike/src/client/entities.qc +../../../cstrike/src/client/cmds.qc +../../../cstrike/src/client/game_event.qc ../../../valve/src/client/camera.qc ../../../valve/src/client/viewmodel.qc -crosshair.qc +../../../cstrike/src/client/crosshair.qc ../../../valve/src/client/obituary.qc ../../../valve/src/client/hud_dmgnotify.qc -hud_ammonotify.qc -vgui_spectator.qc -hud.qc +../../../cstrike/src/client/hud_ammonotify.qc +../../../cstrike/src/client/vgui_spectator.qc +../../../cstrike/src/client/hud.qc ../../../valve/src/client/hud_sprite.qc ../../../valve/src/client/HLWeaponSelect.qc ../../../valve/src/client/hud_weaponselect.qc ../../../valve/src/client/scoreboard.qc -radio.qc - +../../../cstrike/src/client/radio.qc ../../../src/client/include.src -vgui_buypages.qc -vgui_buymenu.qc -vgui_motd.qc -vgui_changeclass_t.qc -vgui_changeclass_ct.qc -vgui_chooseteam.qc +../../../cstrike/src/client/vgui_buypages.qc +../../../cstrike/src/client/vgui_buymenu.qc +../../../cstrike/src/client/vgui_motd.qc +../../../cstrike/src/client/vgui_changeclass_t.qc +../../../cstrike/src/client/vgui_changeclass_ct.qc +../../../cstrike/src/client/vgui_chooseteam.qc ../../../src/shared/include.src #endlist + diff --git a/src/files.dat b/src/files.dat new file mode 100644 index 0000000..2f05fd3 --- /dev/null +++ b/src/files.dat @@ -0,0 +1,194 @@ +193 +1 cfg/skill_cstrike.cfg +1 cfg/skill_manifest.cfg +1 csprogs.dat.de.po +1 csprogs.dat.default.po +1 data/as_forest.way +1 data/as_highrise.way +1 data/as_oilrig.way +1 data/as_riverside.way +1 data/as_tundra.way +1 data/cs_747.way +1 data/cs_alley1.way +1 data/cs_arabstreets.way +1 data/cs_assault.way +1 data/cs_backalley.way +1 data/cs_bunker.way +1 data/cs_desert.way +1 data/cs_docks.way +1 data/cs_estate.way +1 data/cs_facility.way +1 data/cs_havana.way +1 data/cs_hideout.way +1 data/cs_iraq.way +1 data/cs_italy.way +1 data/cs_mansion.way +1 data/cs_militia.way +1 data/cs_office.way +1 data/cs_prison.way +1 data/cs_ship.way +1 data/cs_siege.way +1 data/cs_station.way +1 data/cs_thunder.way +1 data/cs_tire.way +1 data/cs_wpndepot.way +1 data/cs_zoption.way +1 data/de_aztec.way +1 data/de_cbble.way +1 data/de_chateau.way +1 data/de_dust.way +1 data/de_dust2.way +1 data/de_fang.way +1 data/de_foption.way +1 data/de_inferno.way +1 data/de_jeepathon2k.way +1 data/de_nuke.way +1 data/de_piranesi.way +1 data/de_prodigy.way +1 data/de_railroad.way +1 data/de_rotterdam.way +1 data/de_storm.way +1 data/de_survivor.way +1 data/de_torn.way +1 data/de_train.way +1 data/de_vegas.way +1 data/de_vertigo.way +1 data/es_frantic.way +1 data/es_jail.way +1 data/es_trinity.way +1 data/fy_pool_day.way +1 decls/def/ammo.def +1 decls/def/ammo/338magnum.def +1 decls/def/ammo/357sig.def +1 decls/def/ammo/45acp.def +1 decls/def/ammo/50ae.def +1 decls/def/ammo/556nato.def +1 decls/def/ammo/556natobox.def +1 decls/def/ammo/57mm.def +1 decls/def/ammo/762nato.def +1 decls/def/ammo/9mm.def +1 decls/def/ammo/base.def +1 decls/def/ammo/buckshot.def +1 decls/def/hostage.def +1 decls/def/items.def +1 decls/def/items/c4.def +1 decls/def/items/defuse.def +1 decls/def/items/kevlar.def +1 decls/def/items/kevlar_helmet.def +1 decls/def/items/nightvision.def +1 decls/def/items/suit.def +1 decls/def/monsters.def +1 decls/def/player.def +1 decls/def/projectiles.def +1 decls/def/spawns.def +1 decls/def/weapons.def +1 decls/def/weapons/ak47.def +1 decls/def/weapons/aug.def +1 decls/def/weapons/awp.def +1 decls/def/weapons/c4.def +1 decls/def/weapons/csbase.def +1 decls/def/weapons/deagle.def +1 decls/def/weapons/elite.def +1 decls/def/weapons/famas.def +1 decls/def/weapons/fiveseven.def +1 decls/def/weapons/flashbang.def +1 decls/def/weapons/g3sg1.def +1 decls/def/weapons/galil.def +1 decls/def/weapons/glock18.def +1 decls/def/weapons/hegrenade.def +1 decls/def/weapons/knife.def +1 decls/def/weapons/m249.def +1 decls/def/weapons/m3.def +1 decls/def/weapons/m4a1.def +1 decls/def/weapons/mac10.def +1 decls/def/weapons/mp5navy.def +1 decls/def/weapons/p228.def +1 decls/def/weapons/p90.def +1 decls/def/weapons/scout.def +1 decls/def/weapons/sg550.def +1 decls/def/weapons/sg552.def +1 decls/def/weapons/smokegrenade.def +1 decls/def/weapons/tmp.def +1 decls/def/weapons/ump45.def +1 decls/def/weapons/usp.def +1 decls/def/weapons/xm1014.def +1 decls/sound/impacts.sndshd +1 decls/sound/items_cstrike.sndshd +1 decls/sound/npcs_cstrike.sndshd +1 decls/sound/player.sndshd +1 decls/sound/weapons_cstrike.sndshd +1 decls/typeinfo/hlmat.decl +1 default_aliases.cfg +1 default_cstrike.cfg +1 default_cvar.cfg +1 gfx/vgui/buymenu.tga +1 icon.tga +1 maps/as_forest.jpg +1 maps/as_highrise.jpg +1 maps/as_oilrig.jpg +1 maps/as_riverside.jpg +1 maps/as_tundra.jpg +1 maps/cs_747.jpg +1 maps/cs_alley1.jpg +1 maps/cs_arabstreets.jpg +1 maps/cs_assault.jpg +1 maps/cs_backalley.jpg +1 maps/cs_bunker.jpg +1 maps/cs_desert.jpg +1 maps/cs_docks.jpg +1 maps/cs_estate.jpg +1 maps/cs_facility.jpg +1 maps/cs_havana.jpg +1 maps/cs_hideout.jpg +1 maps/cs_iraq.jpg +1 maps/cs_italy.jpg +1 maps/cs_mansion.jpg +1 maps/cs_militia.jpg +1 maps/cs_office.jpg +1 maps/cs_prison.jpg +1 maps/cs_ship.jpg +1 maps/cs_siege.jpg +1 maps/cs_station.jpg +1 maps/cs_thunder.jpg +1 maps/cs_tire.jpg +1 maps/cs_wpndepot.jpg +1 maps/cs_zoption.jpg +1 maps/de_aztec.jpg +1 maps/de_cbble.jpg +1 maps/de_chateau.jpg +1 maps/de_dust.jpg +1 maps/de_dust2.jpg +1 maps/de_fang.jpg +1 maps/de_foption.jpg +1 maps/de_inferno.jpg +1 maps/de_jeepathon2k.jpg +1 maps/de_nuke.jpg +1 maps/de_piranesi.jpg +1 maps/de_prodigy.jpg +1 maps/de_railroad.jpg +1 maps/de_rotterdam.jpg +1 maps/de_storm.jpg +1 maps/de_survivor.jpg +1 maps/de_torn.jpg +1 maps/de_train.jpg +1 maps/de_vegas.jpg +1 maps/de_vertigo.jpg +1 maps/es_frantic.jpg +1 maps/es_jail.jpg +1 maps/es_trinity.jpg +1 maps/eukara/test_weapons.bsp +1 maps/eukara/test_weapons.map +1 particles/fx_smokenade.cfg +1 progs/counterstrike.dat +1 progs/deathmatch.dat +1 progs/zombie.dat +1 quake.rc +1 progs.dat +1 csprogs.dat +1 scripts/bots.txt +1 scripts/client_style.txt +1 scripts/constants.txt +1 scripts/maptweaks.txt +1 scripts/surfaceproperties_cstrike.txt +1 scripts/surfaceproperties_manifest.txt +1 scripts/ui_style.txt diff --git a/src/rules/Makefile b/src/rules/Makefile index fb8d994..2f3c02d 100644 --- a/src/rules/Makefile +++ b/src/rules/Makefile @@ -1,6 +1,7 @@ QCC=fteqcc all: - mkdir -pv ../../zpak001.pk3dir/progs/ - $(QCC) deathmatch.qc - $(QCC) counterstrike.qc + mkdir -pv ../../progs/ + $(QCC) $(CFLAGS) -I../../../src/server counterstrike.qc + $(QCC) $(CFLAGS) -I../../../src/server deathmatch.qc + $(QCC) $(CFLAGS) -I../../../src/server zombie.qc diff --git a/src/rules/counterstrike.qc b/src/rules/counterstrike.qc index d8cf8bb..77fd490 100644 --- a/src/rules/counterstrike.qc +++ b/src/rules/counterstrike.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#pragma PROGS_DAT "../../zpak001.pk3dir/progs/counterstrike.dat" +#pragma PROGS_DAT "../../progs/counterstrike.dat" #include "../../../src/server/api.h" diff --git a/src/rules/deathmatch.qc b/src/rules/deathmatch.qc index 30dbda3..ebe3113 100644 --- a/src/rules/deathmatch.qc +++ b/src/rules/deathmatch.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#pragma PROGS_DAT "../../zpak001.pk3dir/progs/deathmatch.dat" +#pragma PROGS_DAT "../../progs/deathmatch.dat" #include "../../../src/server/api.h" diff --git a/src/rules/zombie.qc b/src/rules/zombie.qc new file mode 100644 index 0000000..f9f9a62 --- /dev/null +++ b/src/rules/zombie.qc @@ -0,0 +1,136 @@ +/* + * Copyright (c) 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. + */ + +#pragma PROGS_DAT "../../progs/zombie.dat" + +#include "../../../src/server/api.h" + +void +WaveTimer_Tick(void) +{ + int monsterCount = actor.TotalActors(); + + /* spawn a new monster */ + if (monsterCount < 5) { + entity zombie = ents.Create("npc_zombie", [0,0,0]); + game.TeleportToSpawn(zombie); + ents.Input(zombie, "HordeOn", "", world); + } + + self.nextthink = time + 2.0f; +} + +bool +AllowFlashlight(void) +{ + return cvars.GetBool("mp_flashlight"); +} + +void +CodeCallback_StartGameType(void) +{ + precache.Entity("npc_zombie"); + precache.Entity("player_csdm"); + motd.LoadDefault(); + game.SetSpawnPoint("info_player_deathmatch"); + teams.SetUp(1, "Players", [255, 255, 255], false); + teams.SetUp(2, "Zombies", [255, 0, 0], false); + teams.SetSpawnPoint(1, "info_player_deathmatch"); + teams.SetSpawnPoint(2, "info_player_deathmatch"); + + entity tick = spawn(); + tick.think = WaveTimer_Tick; + tick.nextthink = time + 1.0f; +} + +void +CodeCallback_PlayerSpawn(entity playerEntity) +{ + ents.ChangeToClass(playerEntity, "player_csdm"); + ents.Input(playerEntity, "SetTeam", "1", world); + playerEntity.modelindex = getmodelindex("models/player.mdl"); /* keep OG size */ + game.TeleportToSpawn(playerEntity); +} + +void +CodeCallback_PlayerDisconnect(entity playerEntity) +{ + +} + +bool +CodeCallback_PlayerRequestRespawn(entity playerEntity) +{ + CodeCallback_PlayerSpawn(playerEntity); + return (true); +} + +void +CodeCallback_PlayerDamage(entity playerEntity, entity inflictor, entity attacker) +{ + +} + +void +CodeCallback_PlayerKilled(entity playerEntity, entity inflictor, entity attacker, string weapon) +{ + combat.Obituary(playerEntity.netname, attacker.netname, weapon, ""); + + /* death-counter */ + playerEntity.deaths++; + + /* update score-counter */ + if (ents.isPlayer(attacker)) { + if (playerEntity == attacker) { + attacker.frags--; + } else { + attacker.frags++; + } + } else if (ents.isSentient(attacker)) { + teams.AddScore(attacker.team, 1); + } +} + +void +CodeCallback_NPCKilled(entity npcEntity, entity inflictor, entity attacker, string weapon) +{ + combat.Obituary(npcEntity.netname, attacker.netname, weapon, ""); + + /* update score-counter */ + if (ents.isPlayer(attacker)) { + if (npcEntity == attacker) { + attacker.frags--; + } else { + attacker.frags++; + } + } +} + +bool +CodeCallback_ImpulseCommand(entity playerEntity, float impulseNum) +{ + switch (impulseNum) { + case 100: + if (AllowFlashlight() == true) { + ents.Input(playerEntity, "UseItem", "item_suit", playerEntity); + } + break; + default: + return (false); + } + + return (true); +} diff --git a/src/server/Makefile b/src/server/Makefile index 2fe44a4..e96b4a9 100644 --- a/src/server/Makefile +++ b/src/server/Makefile @@ -1,4 +1,4 @@ QCC=fteqcc all: - $(QCC) progs.src + $(QCC) $(CFLAGS) -I../../../valve/src/shared/ progs.src diff --git a/src/server/progs.src b/src/server/progs.src index 6da7e8a..73d8ff0 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -7,6 +7,7 @@ #define SERVER #define VALVE #define CSTRIKE + #define BULLETPENETRATION //#define BULLETPATTERNS @@ -17,21 +18,21 @@ ../../../src/botlib/botinfo.h ../../../src/gs-entbase/server.src ../../../src/gs-entbase/shared.src -../shared/defs.h -defs.h -../shared/include.src -hostage_entity.qc -armoury_entity.qc -func_bomb_target.qc -func_buyzone.qc -info_buyzone.qc -func_escapezone.qc -func_hostage_rescue.qc -info_hostage_rescue.qc -func_vip_safetyzone.qc -info_map_parameters.qc +../../../cstrike/src/shared/defs.h +../../../cstrike/src/server/defs.h +../../../cstrike/src/shared/include.src +../../../cstrike/src/server/hostage_entity.qc +../../../cstrike/src/server/armoury_entity.qc +../../../cstrike/src/server/func_bomb_target.qc +../../../cstrike/src/server/func_buyzone.qc +../../../cstrike/src/server/info_buyzone.qc +../../../cstrike/src/server/func_escapezone.qc +../../../cstrike/src/server/func_hostage_rescue.qc +../../../cstrike/src/server/info_hostage_rescue.qc +../../../cstrike/src/server/func_vip_safetyzone.qc +../../../cstrike/src/server/info_map_parameters.qc ../../../src/botlib/include.src -server.qc +../../../cstrike/src/server/server.qc ../../../src/server/include.src ../../../src/shared/include.src #endlist From ae515b67dbc4c1223fa18aedfe8cbb4bec7eefb3 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 7 Feb 2025 20:55:57 -0800 Subject: [PATCH 12/17] CSWeapon: cache firing values at the (now) proper location. --- src/shared/CSWeapon.qc | 76 ++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/src/shared/CSWeapon.qc b/src/shared/CSWeapon.qc index 99c8f49..4faf2c4 100644 --- a/src/shared/CSWeapon.qc +++ b/src/shared/CSWeapon.qc @@ -30,10 +30,26 @@ public: #endif virtual bool CanFire(void); - virtual void Draw(void); virtual void Release(void); virtual void FiredWeaponAttack(string); virtual void SwitchedToWeapon(void); + virtual void UpdateFireInfoCache(void); + + int numProjectiles; + string traceInfo; + float accuracy; + float flAccuracyDivisor; + float flAccuracyMovementPenalty; + float flAccuracyMultiplier; + float flAccuracyAdd; + float flRangeModifier; + float flPenetrationPower; + float flBulletStrength; + float flMultiplierShots; + float flMultiplierStrength; + float flMultiplierInaccuracy; + vector bulletSpread; + }; void @@ -72,21 +88,7 @@ CSWeapon::FiredWeaponAttack(string defName) return; } - int numProjectiles = GetSubDefInt(defName, "numProjectiles"); - string traceInfo = GetSubDefString(defName, "def_onFire"); - float flAccuracyDivisor = GetSubDefFloat(defName,"accuracyDivisor"); - float flAccuracyMovementPenalty = GetSubDefFloat(defName,"accuracyMovementPenalty"); - float flAccuracyMultiplier = GetSubDefFloat(defName,"accuracyMultiplier"); - float flAccuracyAdd= GetSubDefFloat(defName,"accuracyAdd"); - float flRangeModifier = GetSubDefFloat(defName,"rangeModifier"); - float flPenetrationPower = GetSubDefFloat(defName,"penetrationPower"); - float flBulletStrength = GetSubDefFloat(defName,"bulletStrength"); - float flMultiplierShots = GetSubDefFloat(defName,"multiplierShots"); - float flMultiplierStrength = GetSubDefFloat(defName,"multiplierStrength"); - float flMultiplierInaccuracy = GetSubDefFloat(defName,"multiplierInaccuracy"); - float accuracy = Cstrike_CalculateAccuracy(ourOwner, flAccuracyDivisor, flAccuracyMovementPenalty) / flAccuracyMultiplier; - accuracy += flAccuracyAdd; - vector bulletSpread = [accuracy, accuracy]; + /* always fire at least 1 */ if (numProjectiles <= 0i) { @@ -120,19 +122,6 @@ CSWeapon::FiredWeaponAttack(string defName) } } -void -CSWeapon::Draw(void) -{ - super::Draw(); - -#ifdef CLIENT - CSPlayer ourOwner = (CSPlayer)owner; - ourOwner.cs_cross_mindist = GetDefInt("crossMinDist"); - ourOwner.cs_cross_deltadist = GetDefInt("crossDeltaDist"); - CStrikeView_UpdateGeomset(ourOwner); -#endif -} - void CSWeapon::Release(void) { @@ -142,6 +131,35 @@ CSWeapon::Release(void) super::Release(); } +void +CSWeapon::UpdateFireInfoCache(void) +{ + super::UpdateFireInfoCache(); + + numProjectiles = GetSubDefInt(m_strLastFireInfo, "numProjectiles"); + traceInfo = GetSubDefString(m_strLastFireInfo, "def_onFire"); + flAccuracyDivisor = GetSubDefFloat(m_strLastFireInfo,"accuracyDivisor"); + flAccuracyMovementPenalty = GetSubDefFloat(m_strLastFireInfo,"accuracyMovementPenalty"); + flAccuracyMultiplier = GetSubDefFloat(m_strLastFireInfo,"accuracyMultiplier"); + flAccuracyAdd= GetSubDefFloat(m_strLastFireInfo,"accuracyAdd"); + flRangeModifier = GetSubDefFloat(m_strLastFireInfo,"rangeModifier"); + flPenetrationPower = GetSubDefFloat(m_strLastFireInfo,"penetrationPower"); + flBulletStrength = GetSubDefFloat(m_strLastFireInfo,"bulletStrength"); + flMultiplierShots = GetSubDefFloat(m_strLastFireInfo,"multiplierShots"); + flMultiplierStrength = GetSubDefFloat(m_strLastFireInfo,"multiplierStrength"); + flMultiplierInaccuracy = GetSubDefFloat(m_strLastFireInfo,"multiplierInaccuracy"); + accuracy = Cstrike_CalculateAccuracy(owner, flAccuracyDivisor, flAccuracyMovementPenalty) / flAccuracyMultiplier; + accuracy += flAccuracyAdd; + bulletSpread = [accuracy, accuracy]; + +#ifdef CLIENT + CSPlayer ourOwner = (CSPlayer)owner; + ourOwner.cs_cross_mindist = GetSubDefInt(m_strLastFireInfo, "crossMinDist"); + ourOwner.cs_cross_deltadist = GetSubDefInt(m_strLastFireInfo, "crossDeltaDist"); + CStrikeView_UpdateGeomset(ourOwner); +#endif +} + #ifdef CLIENT void CSWeapon::AddedToInventory(void) From bdfae0ce4dbb04e909999e28dacc8d911aabb60f Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Sun, 9 Feb 2025 01:35:32 -0800 Subject: [PATCH 13/17] Client: don't show timer in modes other than CS. --- src/client/hud.qc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/client/hud.qc b/src/client/hud.qc index 7950595..526972e 100644 --- a/src/client/hud.qc +++ b/src/client/hud.qc @@ -34,6 +34,8 @@ float spr_hudnum[10] = { 216 / 256 }; +var bool g_csDrawTime = false; + /* precaches */ void HUD_Init(void) @@ -67,6 +69,10 @@ HUD_Init(void) precache_model("sprites/top.spr"); precache_model("sprites/top_left.spr"); precache_model("sprites/top_right.spr"); + + if (serverinfo.GetString("mode") == "counterstrike") { + g_csDrawTime = true; + } } /* seperator for mainly ammo */ @@ -118,6 +124,10 @@ HUD_DrawNums(float fNumber, vector vecPos, float fAlpha, vector vColor) void HUD_DrawTimer(int ncSpectator) { + if (g_csDrawTime == false) { + return; + } + int iMinutes, iSeconds, iTens, iUnits; vector time_pos; From 6460c8af733c1ba92af44c5546e12528470f1959 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Sun, 9 Feb 2025 01:36:04 -0800 Subject: [PATCH 14/17] rules/counterstrike: move precaches into their dedicated callback --- img/tr.png | Bin 0 -> 5365 bytes src/rules/counterstrike.qc | 17 ++++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 img/tr.png diff --git a/img/tr.png b/img/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..1f56e4ad7c3e6dcc6c028688ce38420fc7dd3e64 GIT binary patch literal 5365 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 RS+Pd}KuuX&sYbyz@_(p&F!=xg literal 0 HcmV?d00001 diff --git a/src/rules/counterstrike.qc b/src/rules/counterstrike.qc index 77fd490..edaf580 100644 --- a/src/rules/counterstrike.qc +++ b/src/rules/counterstrike.qc @@ -737,6 +737,14 @@ CS_PlayerRemovedFromGame(entity targetPlayer) Round_CheckUponDeath(targetPlayer); } +void +CodeCallback_Precache(void) +{ + precache.Entity("player_vip"); + precache.Entity("player_terrorist"); + precache.Entity("player_counterterrorist"); +} + /* Callbacks, functions that are called from Nuclide */ void CodeCallback_StartGameType(void) @@ -744,11 +752,6 @@ CodeCallback_StartGameType(void) string spawnCT; string spawnT; - /* players can buy these any time. so they should be precached for speed. */ - precache.Entity("player_vip"); - precache.Entity("player_terrorist"); - precache.Entity("player_counterterrorist"); - spawnCT = entityDef.GetString("player_counterterrorist", "spawnpoint"); spawnT = entityDef.GetString("player_terrorist", "spawnpoint"); @@ -756,9 +759,9 @@ CodeCallback_StartGameType(void) motd.LoadDefault(); /* the only teams CS will ever need... ? */ - teams.SetUp(TEAM_T, "Terrorist", [153, 204, 255], true); + teams.SetUp(TEAM_T, "Terrorist", [255, 63, 63], true); teams.SetSpawnPoint(TEAM_T, spawnT); - teams.SetUp(TEAM_CT, "Counter-Terrorist", [255, 63, 63], true); + teams.SetUp(TEAM_CT, "Counter-Terrorist", [153, 204, 255], true); teams.SetSpawnPoint(TEAM_CT, spawnCT); /* evaluate our world */ From 1cf298be3b1afc3474d9be6a42a5428ccfa14ea6 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 21 Feb 2025 19:46:04 -0800 Subject: [PATCH 15/17] Push workflow up. --- .forgejo/workflows/pk4.yaml | 56 +++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .forgejo/workflows/pk4.yaml diff --git a/.forgejo/workflows/pk4.yaml b/.forgejo/workflows/pk4.yaml new file mode 100644 index 0000000..6f2d224 --- /dev/null +++ b/.forgejo/workflows/pk4.yaml @@ -0,0 +1,56 @@ +name: pk4 + +on: [ push, pull_request, workflow_dispatch ] + +jobs: + build: + runs-on: docker + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 1 + repository: vera/nuclide + ref: Develop + + - uses: actions/checkout@v3 + with: + fetch-depth: 1 + repository: fn/valve + ref: Develop + path: "./${{ github.event.repository.name }}" + + - uses: actions/checkout@v3 + with: + fetch-depth: 1 + ref: Develop + path: "./${{ github.event.repository.name }}" + + - name: apt install zip + run: | + apt update + apt install -y \ + zip + + - name: assemble pk4 + run: make dist-pak NAME=bin GAME=${{ github.event.repository.name }} + + - uses: actions/upload-artifact@v3 + with: + name: build-log + path: ./build/bin-content.log + + - uses: actions/forgejo-release@v2 + with: + url: https://code.idtech.space + repo: "${{ github.repository }}" + tag: "${{ github.ref_name }}" + sha: "${{ github.sha }}" + direction: upload + release-dir: ./build/bin-content/${{ github.event.repository.name }}/ + token: ${{ secrets.TOKEN }} + title: "Development Build" + release-notes: "Auto-generated development build, override ${{ github.event.repository.name }}/package_${{ github.event.repository.name }}.pk4." + prerelease: true + override: true + release-notes-assistant: true From a9cbc8a8a997bba2c3ecd78ecde74ff949e32657 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 21 Feb 2025 19:50:19 -0800 Subject: [PATCH 16/17] Disable punchangle on fall (for now) --- src/shared/player.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/shared/player.h b/src/shared/player.h index 31dbb23..b628127 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -777,11 +777,13 @@ CSPlayer::SendEntity(entity ePEnt, float flChanged) void CSPlayer::Physics_Fall(float impactspeed) { +#if 0 /* apply some predicted punch to the player */ if (impactspeed >= 580) punchangle += [15,0,(input_sequence & 1) ? 15 : -15]; else if (impactspeed >= 400) punchangle += [15,0,0]; +#endif impactspeed *= 1.25f; From 38fb0a23b5f236df1ac0bc1f44bdedf743905258 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 21 Feb 2025 20:00:21 -0800 Subject: [PATCH 17/17] pk4.yaml: Fix typo --- .forgejo/workflows/pk4.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/pk4.yaml b/.forgejo/workflows/pk4.yaml index 6f2d224..fd25219 100644 --- a/.forgejo/workflows/pk4.yaml +++ b/.forgejo/workflows/pk4.yaml @@ -18,7 +18,7 @@ jobs: fetch-depth: 1 repository: fn/valve ref: Develop - path: "./${{ github.event.repository.name }}" + path: "./valve" - uses: actions/checkout@v3 with: