diff --git a/.dir.tiff b/.dir.tiff new file mode 100644 index 0000000..0eb6ac9 Binary files /dev/null and b/.dir.tiff differ diff --git a/.forgejo/workflows/pk4.yaml b/.forgejo/workflows/pk4.yaml new file mode 100644 index 0000000..fd25219 --- /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: "./valve" + + - 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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14c70c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*core.txt +*.dat +*.lno +config.cfg +fte.cfg diff --git a/LICENSE b/COPYING similarity index 100% rename from LICENSE rename to COPYING diff --git a/PAK_NAME b/PAK_NAME new file mode 100644 index 0000000..94f8520 --- /dev/null +++ b/PAK_NAME @@ -0,0 +1 @@ +package_cstrike.pk3 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/README.md b/README.md index d2c0855..3302137 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,15 @@ -# FreeCS +# Tactical Retreat [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). - -Aiming for a stable reimagining of the original mod in QuakeC. -Not aiming for accuracy, but for a smooth, exploit and bug-free -experience over the Internet. - -Done in my freetime for countless reasons, but most important to me: to learn everything there is to know about one of my favorite games. - -This is all 100% new, original code written by good old trial and error. -**Differences exist** and features are slowly being implemented one by one. -This allows the code to be fully free and unencumbered, unlike similar projects. - -Featuring proper weapon prediction to enable stress-free netplay. - -The engine you want to use to run this is FTEQW (https://www.fteqw.org), which is a project unrelated to this. It just happens to support the file-formats FreeHL needs. +Allows you to play Counter-Strike 1.5 (mod-version) with Rad-Therapy. ![Preview 1](img/preview1.jpg) ![Preview 2](img/preview2.jpg) ![Preview 3](img/preview3.jpg) ![Preview 4](img/preview4.jpg) -## Features and Improvements - -- Native support for Windows/Mac/Linux/BSD and wherever else FTEQW runs on -- Better support for higher display modes and aspect ratios -- Much easier modding by having the entire logic be in modern QuakeC -- Netcode that's always improving and more advanced prediction -- Open-source code for transparent modding -- Very permissive license (ISC/BSD) -- The code doesn't rely on others work, so nobody can shut it down :-) - ## Installing -To run it, all you need is [FTEQW](https://www.fteqw.org), [FreeHL](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. +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. @@ -44,14 +20,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 !! ** @@ -83,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 85% rename from zpak001.pk3dir/cfg/skill_cstrike.cfg rename to cfg/skill_cstrike.cfg index 196a170..bfb665b 100644 --- a/zpak001.pk3dir/cfg/skill_cstrike.cfg +++ b/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 @@ -92,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 @@ -177,7 +181,22 @@ 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 + +// 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/cfg/skill_manifest.cfg b/cfg/skill_manifest.cfg new file mode 100644 index 0000000..5133fd0 --- /dev/null +++ b/cfg/skill_manifest.cfg @@ -0,0 +1 @@ +exec "skill_cstrike.cfg" diff --git a/zpak001.pk3dir/csprogs.dat.de.po b/csprogs.dat.de.po similarity index 93% rename from zpak001.pk3dir/csprogs.dat.de.po rename to csprogs.dat.de.po index 0a7ba45..d12fba6 100755 --- a/zpak001.pk3dir/csprogs.dat.de.po +++ b/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/csprogs.dat.en.po b/csprogs.dat.default.po old mode 100755 new mode 100644 similarity index 93% rename from zpak001.pk3dir/csprogs.dat.en.po rename to csprogs.dat.default.po index 36dad96..240e4e8 --- a/zpak001.pk3dir/csprogs.dat.en.po +++ b/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/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/decls/def/ammo.def b/decls/def/ammo.def new file mode 100644 index 0000000..ccbe549 --- /dev/null +++ b/decls/def/ammo.def @@ -0,0 +1,71 @@ +// 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_c4" "14" +} + +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.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 { + "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" + "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" +#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/decls/def/ammo/338magnum.def b/decls/def/ammo/338magnum.def new file mode 100644 index 0000000..aa33fdf --- /dev/null +++ b/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/decls/def/ammo/357sig.def b/decls/def/ammo/357sig.def new file mode 100644 index 0000000..22bdfbb --- /dev/null +++ b/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/decls/def/ammo/45acp.def b/decls/def/ammo/45acp.def new file mode 100644 index 0000000..f726e8c --- /dev/null +++ b/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/decls/def/ammo/50ae.def b/decls/def/ammo/50ae.def new file mode 100644 index 0000000..2fe878e --- /dev/null +++ b/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/decls/def/ammo/556nato.def b/decls/def/ammo/556nato.def new file mode 100644 index 0000000..38aa1d1 --- /dev/null +++ b/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/decls/def/ammo/556natobox.def b/decls/def/ammo/556natobox.def new file mode 100644 index 0000000..dc6b555 --- /dev/null +++ b/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/decls/def/ammo/57mm.def b/decls/def/ammo/57mm.def new file mode 100644 index 0000000..bef6162 --- /dev/null +++ b/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/decls/def/ammo/762nato.def b/decls/def/ammo/762nato.def new file mode 100644 index 0000000..a16dec0 --- /dev/null +++ b/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/decls/def/ammo/9mm.def b/decls/def/ammo/9mm.def new file mode 100644 index 0000000..85c56f6 --- /dev/null +++ b/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/decls/def/ammo/base.def b/decls/def/ammo/base.def new file mode 100644 index 0000000..47c319c --- /dev/null +++ b/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/decls/def/ammo/buckshot.def b/decls/def/ammo/buckshot.def new file mode 100644 index 0000000..b11d9c0 --- /dev/null +++ b/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/decls/def/hostage.def b/decls/def/hostage.def new file mode 100644 index 0000000..83e7036 --- /dev/null +++ b/decls/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/decls/def/items.def b/decls/def/items.def new file mode 100644 index 0000000..30adb5d --- /dev/null +++ b/decls/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/decls/def/items/c4.def b/decls/def/items/c4.def new file mode 100644 index 0000000..5f3bf2b --- /dev/null +++ b/decls/def/items/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/decls/def/items/defuse.def b/decls/def/items/defuse.def new file mode 100644 index 0000000..c058a3e --- /dev/null +++ b/decls/def/items/defuse.def @@ -0,0 +1,10 @@ +entityDef item_defuse +{ + "spawnclass" "ncItem" + "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/decls/def/items/kevlar.def b/decls/def/items/kevlar.def new file mode 100644 index 0000000..c34b3ce --- /dev/null +++ b/decls/def/items/kevlar.def @@ -0,0 +1,11 @@ +// actually armor +entityDef item_kevlar +{ + "spawnclass" "ncItem" + "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/decls/def/items/kevlar_helmet.def b/decls/def/items/kevlar_helmet.def new file mode 100644 index 0000000..f7920f8 --- /dev/null +++ b/decls/def/items/kevlar_helmet.def @@ -0,0 +1,11 @@ +// other equipment +entityDef item_kevlar_helmet +{ + "spawnclass" "ncItem" + "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/decls/def/items/nightvision.def b/decls/def/items/nightvision.def new file mode 100644 index 0000000..dafb66a --- /dev/null +++ b/decls/def/items/nightvision.def @@ -0,0 +1,10 @@ +entityDef item_nightvision +{ + "spawnclass" "ncItem" + "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/decls/def/items/suit.def b/decls/def/items/suit.def new file mode 100644 index 0000000..2e3e961 --- /dev/null +++ b/decls/def/items/suit.def @@ -0,0 +1,11 @@ +// used in the training mission, HUD etc. +entityDef item_suit +{ + "spawnclass" "ncItem" + "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/decls/def/monsters.def b/decls/def/monsters.def new file mode 100644 index 0000000..4ccaf31 --- /dev/null +++ b/decls/def/monsters.def @@ -0,0 +1 @@ +// we have none! go away! diff --git a/decls/def/player.def b/decls/def/player.def new file mode 100644 index 0000000..9ef64f8 --- /dev/null +++ b/decls/def/player.def @@ -0,0 +1,106 @@ +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 +{ + "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" +} + +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/decls/def/projectiles.def b/decls/def/projectiles.def new file mode 100644 index 0000000..291374e --- /dev/null +++ b/decls/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" "ncProjectile" + "is_bullet" "1" + "decal_impact" "Impact.BigShot" + "detonate_on_world" "1" +} diff --git a/decls/def/spawns.def b/decls/def/spawns.def new file mode 100644 index 0000000..06a9c51 --- /dev/null +++ b/decls/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" "ncSpawnPoint" +} + +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" "ncSpawnPoint" +} + +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" "ncSpawnPoint" +} diff --git a/decls/def/weapons.def b/decls/def/weapons.def new file mode 100644 index 0000000..41567a9 --- /dev/null +++ b/decls/def/weapons.def @@ -0,0 +1,28 @@ +#include "weapons/csbase.def" +#include "weapons/ak47.def" +#include "weapons/aug.def" +#include "weapons/awp.def" +#include "weapons/c4.def" +#include "weapons/deagle.def" +#include "weapons/elite.def" +#include "weapons/fiveseven.def" +#include "weapons/flashbang.def" +#include "weapons/g3sg1.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" diff --git a/decls/def/weapons/ak47.def b/decls/def/weapons/ak47.def new file mode 100644 index 0000000..78365f3 --- /dev/null +++ b/decls/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" + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/aug.def b/decls/def/weapons/aug.def new file mode 100644 index 0000000..f8d7351 --- /dev/null +++ b/decls/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" + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/awp.def b/decls/def/weapons/awp.def new file mode 100644 index 0000000..ec6d979 --- /dev/null +++ b/decls/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" + + "act_fire" "1,2,3" + "actAltFire" "" + "act_holster" "" + "act_reload" "4" + "act_draw" "5" + "act_idle" "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/decls/def/weapons/c4.def b/decls/def/weapons/c4.def new file mode 100644 index 0000000..68f7682 --- /dev/null +++ b/decls/def/weapons/c4.def @@ -0,0 +1,55 @@ +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" + "ammoRequired" "1" + + "def_fireInfo" "fireInfo_c4Plant" + "inv_name" "C4 Bomb Weapon" + "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" + "act_delay" "3" + + "snd_fire" "C4.PlantSound" + + "speed_mod" "1.0" + + "hudSlot" "4" + "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/decls/def/weapons/csbase.def b/decls/def/weapons/csbase.def new file mode 100644 index 0000000..39bd774 --- /dev/null +++ b/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/decls/def/weapons/deagle.def b/decls/def/weapons/deagle.def new file mode 100644 index 0000000..ebe76da --- /dev/null +++ b/decls/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" + + "act_fire" "1,2" + "act_fireLast" "3" + "act_reload" "4" + "act_draw" "5" + "act_idle" "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/decls/def/weapons/elite.def b/decls/def/weapons/elite.def new file mode 100644 index 0000000..578bb91 --- /dev/null +++ b/decls/def/weapons/elite.def @@ -0,0 +1,66 @@ +entityDef weapon_elite +{ + "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_elite" + "def_altFireInfo" "fireInfo_elite_alt" + "clipSize" "30" + + "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" + + "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_elite +{ + "inherit" "projectile_bullet_base" + "damage" "skill:plr_elite_dmg" +} + +entityDef fireInfo_elite +{ + "def_onFire" "projectile_elite" + "ammoType" "ammo_9mm" + "ammoRequired" "1" + "ammoPerShot" "1" + "fireRate" "0.13" + "punchAngle" "-2 0 0" + "model_flash" "sprites/muzzleflash2.spr" +} + +entityDef fireInfo_elite_alt +{ + "inherit" "fireInfo_elite" + "act_fire" "8,9,10,11,12" + "act_fireLast" "13" +} diff --git a/decls/def/weapons/famas.def b/decls/def/weapons/famas.def new file mode 100644 index 0000000..23b5b9b --- /dev/null +++ b/decls/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" "" + + "act_fire" "" + "actAltFire" "" + "act_holster" "" + "act_reload" "" + "act_draw" "" + "act_idle" "" + + + "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/decls/def/weapons/fiveseven.def b/decls/def/weapons/fiveseven.def new file mode 100644 index 0000000..71ef11f --- /dev/null +++ b/decls/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" + + "act_fire" "1,2" + "act_fireLast" "3" + "act_reload" "4" + "act_draw" "5" + "act_idle" "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/decls/def/weapons/flashbang.def b/decls/def/weapons/flashbang.def new file mode 100644 index 0000000..35efe33 --- /dev/null +++ b/decls/def/weapons/flashbang.def @@ -0,0 +1,53 @@ +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" + "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" + "act_delay" "1" + "act_fire" "2" + "chargeTime" "2" + "removeOnEmpty" "1" + "drawAfterRelease" "1" + + "hudSlot" "3" + "hudSlotPos" "1" +} + +entityDef projectile_flashgrenade +{ + "spawnclass" "CSProjectile" + "model" "models/w_smokegrenade.mdl" + "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" + "decal_detonate" "ExplosionScorch" + + "flashTime" "4" +} diff --git a/decls/def/weapons/g3sg1.def b/decls/def/weapons/g3sg1.def new file mode 100644 index 0000000..926928a --- /dev/null +++ b/decls/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" + + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "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/decls/def/weapons/galil.def b/decls/def/weapons/galil.def new file mode 100644 index 0000000..50abe5b --- /dev/null +++ b/decls/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" + + "act_fire" "5,6,7" + "actAltFire" "2" + "act_holster" "4" + "act_reload" "3" + "act_draw" "4" + "act_idle" "0,1" + + "snd_fire" "Weapon_Galil.Single" + + "hudSlot" "0" + "hudSlotPos" "7" + "weight" "25" +} diff --git a/decls/def/weapons/glock18.def b/decls/def/weapons/glock18.def new file mode 100644 index 0000000..afe1815 --- /dev/null +++ b/decls/def/weapons/glock18.def @@ -0,0 +1,69 @@ +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" + + "act_fire" "5" + "act_fireLast" "6" + "act_holster" "9" + "act_reload" "7,12" + "act_draw" "8,11" + "act_idle" "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" + "weight" "5" + "altMode" "1" + "actModeOn" "3" + "actModeOff" "3" +} + +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" + "act_fire" "3,4" + "snd_fire" "Weapon_Glock.Burst" +} diff --git a/decls/def/weapons/hegrenade.def b/decls/def/weapons/hegrenade.def new file mode 100644 index 0000000..595cccd --- /dev/null +++ b/decls/def/weapons/hegrenade.def @@ -0,0 +1,60 @@ + +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_onRelease" "projectile_handgrenade" + "ammoType" "ammo_hegrenade" + "ammoRequired" "1" + "silent_fire" "1" + + "act_idle" "0" + "act_draw" "3" + "act_delay" "1" + "act_release" "2" + + // HLWeapon specific + "hudSlot" "3" + "hudSlotPos" "0" + "chargeTime" "2" + "removeOnEmpty" "1" + "drawAfterRelease" "1" +} + +entityDef projectile_handgrenade +{ + "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_hegrenade.bounce" + "decal_detonate" "ExplosionScorch" + + "def_damage" "damage_handgrenadeDirect" + "def_splash_damage" "damage_handgrenadeSplash" +} + +entityDef damage_handgrenadeDirect +{ + "damage" "skill:plr_hegrenade_directdmg" +} + +entityDef damage_handgrenadeSplash +{ + "damage" "skill:plr_hegrenade_dmg" + "radius" "skill:plr_hegrenade_radius" + "push" "7500" +} diff --git a/decls/def/weapons/knife.def b/decls/def/weapons/knife.def new file mode 100644 index 0000000..94fe7fe --- /dev/null +++ b/decls/def/weapons/knife.def @@ -0,0 +1,49 @@ +entityDef weapon_knife +{ + "spawnclass" "CSWeapon" + "inherit" "CSBaseMelee" + "editor_usage" "Knife Weapon" + + "model" "models/w_knife.mdl" + "model_view" "models/v_knife.mdl" + + // weapon specific + "def_onFire" "projectile_knife" + "testDistance" "-48" + "inv_name" "Knife Weapon" + "ammoRequired" "0" + "silent_fire" "1" + + "failRate" "0.7" + "fireRate" "0.7" + "snd_hit" "Weapon_Knife.Hit" + "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" "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/decls/def/weapons/m249.def b/decls/def/weapons/m249.def new file mode 100644 index 0000000..0478f47 --- /dev/null +++ b/decls/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" + + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "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/decls/def/weapons/m3.def b/decls/def/weapons/m3.def new file mode 100644 index 0000000..b2230c0 --- /dev/null +++ b/decls/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" + + "act_fire" "1,2" + "act_reloadStart" "5" + "act_reload" "3" + "act_reloadEnd" "4" + "act_draw" "6" + "act_idle" "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_shotgun" + "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/decls/def/weapons/m4a1.def b/decls/def/weapons/m4a1.def new file mode 100644 index 0000000..f5bf480 --- /dev/null +++ b/decls/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" + + "altMode" "1" + "act_modeOn" "6" + "act_modeOff" "13" + + // Unsilenced + "act_fire" "8,9,10" + "act_reload" "11" + "act_draw" "12" + "act_idle" "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" + "act_fire" "1,2,3" + "act_reload" "4" + "act_draw" "5" + "act_idle" "0" + "snd_fire" "Weapon_M4A1.Silenced" +} diff --git a/decls/def/weapons/mac10.def b/decls/def/weapons/mac10.def new file mode 100644 index 0000000..fc9223c --- /dev/null +++ b/decls/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" + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/mp5navy.def b/decls/def/weapons/mp5navy.def new file mode 100644 index 0000000..49d3813 --- /dev/null +++ b/decls/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" + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/p228.def b/decls/def/weapons/p228.def new file mode 100644 index 0000000..a3ce888 --- /dev/null +++ b/decls/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" + + + "act_fire" "1,2,3" + "act_fireLast" "4" + "act_reload" "5" + "act_draw" "6" + "act_idle" "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/decls/def/weapons/p90.def b/decls/def/weapons/p90.def new file mode 100644 index 0000000..d2ffa6b --- /dev/null +++ b/decls/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" + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/scout.def b/decls/def/weapons/scout.def new file mode 100644 index 0000000..2e75ded --- /dev/null +++ b/decls/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" + + + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "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/decls/def/weapons/sg550.def b/decls/def/weapons/sg550.def new file mode 100644 index 0000000..469e7a3 --- /dev/null +++ b/decls/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" + + "act_fire" "1,2" + "act_reload" "3" + "act_draw" "4" + "act_idle" "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/decls/def/weapons/sg552.def b/decls/def/weapons/sg552.def new file mode 100644 index 0000000..a36a068 --- /dev/null +++ b/decls/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" + + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/smokegrenade.def b/decls/def/weapons/smokegrenade.def new file mode 100644 index 0000000..a23ff57 --- /dev/null +++ b/decls/def/weapons/smokegrenade.def @@ -0,0 +1,52 @@ +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" + "def_onRelease" "projectile_smokegrenade" + "inv_name" "smokegrenade" + + "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" + "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/decls/def/weapons/tmp.def b/decls/def/weapons/tmp.def new file mode 100644 index 0000000..90010a1 --- /dev/null +++ b/decls/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" + + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/ump45.def b/decls/def/weapons/ump45.def new file mode 100644 index 0000000..ffbabf8 --- /dev/null +++ b/decls/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" + + + "act_fire" "3,4,5" + "act_reload" "1" + "act_draw" "2" + "act_idle" "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/decls/def/weapons/usp.def b/decls/def/weapons/usp.def new file mode 100644 index 0000000..ac3eae0 --- /dev/null +++ b/decls/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" + + "altMode" "1" + "act_modeOn" "7" + "act_modeOff" "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 + "act_draw" "14" + "act_idle" "8" + "act_fire" "9,10,11" + "act_fireLast" "12" + "act_reload" "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" + "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/decls/def/weapons/xm1014.def b/decls/def/weapons/xm1014.def new file mode 100644 index 0000000..a0b4f9a --- /dev/null +++ b/decls/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" + + "act_fire" "1,2" + "act_reloadStart" "5" + "act_reload" "3" + "act_reloadEnd" "4" + "act_draw" "6" + "act_idle" "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_shotgun" + "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/sound/impacts.sndshd b/decls/sound/impacts.sndshd similarity index 99% rename from zpak001.pk3dir/sound/impacts.sndshd rename to decls/sound/impacts.sndshd index 10e12f2..eab8083 100644 --- a/zpak001.pk3dir/sound/impacts.sndshd +++ b/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/decls/sound/items_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/sound/items_cstrike.sndshd rename to decls/sound/items_cstrike.sndshd diff --git a/zpak001.pk3dir/sound/npcs_cstrike.sndshd b/decls/sound/npcs_cstrike.sndshd similarity index 100% rename from zpak001.pk3dir/sound/npcs_cstrike.sndshd rename to decls/sound/npcs_cstrike.sndshd diff --git a/zpak001.pk3dir/sound/player.sndshd b/decls/sound/player.sndshd similarity index 86% rename from zpak001.pk3dir/sound/player.sndshd rename to decls/sound/player.sndshd index 01661d6..3a46640 100644 --- a/zpak001.pk3dir/sound/player.sndshd +++ b/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 @@ -36,12 +45,12 @@ Player.Death Player.GaspLight { - sample misc/null.wav + sample common/null.wav } Player.GaspHeavy { - sample misc/null.wav + sample common/null.wav } Player.WaterExit @@ -134,4 +143,9 @@ Player.Swim sample player/pl_swim2.wav sample player/pl_swim3.wav sample player/pl_swim4.wav -} \ No newline at end of file +} + +Player.PickupWeapon +{ + sample items/gunpickup2.wav +} diff --git a/zpak001.pk3dir/sound/weapons_cstrike.sndshd b/decls/sound/weapons_cstrike.sndshd similarity index 73% rename from zpak001.pk3dir/sound/weapons_cstrike.sndshd rename to decls/sound/weapons_cstrike.sndshd index 5067656..f27cff4 100644 --- a/zpak001.pk3dir/sound/weapons_cstrike.sndshd +++ b/decls/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 } diff --git a/decls/typeinfo/hlmat.decl b/decls/typeinfo/hlmat.decl new file mode 100644 index 0000000..4085426 --- /dev/null +++ b/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/default_aliases.cfg b/default_aliases.cfg new file mode 100644 index 0000000..0a8a274 --- /dev/null +++ b/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/default_cstrike.cfg b/default_cstrike.cfg new file mode 100644 index 0000000..e50a93a --- /dev/null +++ b/default_cstrike.cfg @@ -0,0 +1,42 @@ +// 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" +set r_menutint "0.22 0.278 0.40" + +// 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/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/icon.tga b/icon.tga new file mode 100644 index 0000000..e7c3ff6 Binary files /dev/null and b/icon.tga differ diff --git a/img/tr.png b/img/tr.png new file mode 100644 index 0000000..1f56e4a Binary files /dev/null and b/img/tr.png differ 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/maps/as_forest.jpg b/maps/as_forest.jpg new file mode 100644 index 0000000..5081eb1 Binary files /dev/null and b/maps/as_forest.jpg differ diff --git a/zpak001.pk3dir/maps/as_forest_src.jpg b/maps/as_forest_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/as_forest_src.jpg rename to maps/as_forest_src.jpg diff --git a/maps/as_highrise.jpg b/maps/as_highrise.jpg new file mode 100644 index 0000000..e86abb7 Binary files /dev/null and b/maps/as_highrise.jpg differ 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 0000000..bca833f Binary files /dev/null and b/maps/as_oilrig.jpg differ diff --git a/zpak001.pk3dir/maps/as_oilrig_src.jpg b/maps/as_oilrig_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/as_oilrig_src.jpg rename to maps/as_oilrig_src.jpg diff --git a/maps/as_riverside.jpg b/maps/as_riverside.jpg new file mode 100644 index 0000000..8159503 Binary files /dev/null and b/maps/as_riverside.jpg differ diff --git a/zpak001.pk3dir/maps/as_riverside_src.jpg b/maps/as_riverside_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/as_riverside_src.jpg rename to maps/as_riverside_src.jpg diff --git a/maps/as_tundra.jpg b/maps/as_tundra.jpg new file mode 100644 index 0000000..f33de37 Binary files /dev/null and b/maps/as_tundra.jpg differ 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 0000000..d55baf4 Binary files /dev/null and b/maps/cs_747.jpg differ 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 0000000..e9b284f Binary files /dev/null and b/maps/cs_alley1.jpg differ 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 0000000..c050bdd Binary files /dev/null and b/maps/cs_arabstreets.jpg differ 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 0000000..5886276 Binary files /dev/null and b/maps/cs_assault.jpg differ 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 0000000..c399b3b Binary files /dev/null and b/maps/cs_backalley.jpg differ diff --git a/zpak001.pk3dir/maps/cs_backalley_src.jpg b/maps/cs_backalley_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_backalley_src.jpg rename to maps/cs_backalley_src.jpg diff --git a/maps/cs_bunker.jpg b/maps/cs_bunker.jpg new file mode 100644 index 0000000..6ed9983 Binary files /dev/null and b/maps/cs_bunker.jpg differ diff --git a/zpak001.pk3dir/maps/cs_bunker_src.jpg b/maps/cs_bunker_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_bunker_src.jpg rename to maps/cs_bunker_src.jpg diff --git a/maps/cs_desert.jpg b/maps/cs_desert.jpg new file mode 100644 index 0000000..d7b78fb Binary files /dev/null and b/maps/cs_desert.jpg differ 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 0000000..5eb1e3c Binary files /dev/null and b/maps/cs_docks.jpg differ 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 0000000..a36076d Binary files /dev/null and b/maps/cs_estate.jpg differ 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 0000000..bbe42c6 Binary files /dev/null and b/maps/cs_facility.jpg differ 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 0000000..f60130d Binary files /dev/null and b/maps/cs_havana.jpg differ diff --git a/zpak001.pk3dir/maps/cs_havana_src.jpg b/maps/cs_havana_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_havana_src.jpg rename to maps/cs_havana_src.jpg diff --git a/maps/cs_hideout.jpg b/maps/cs_hideout.jpg new file mode 100644 index 0000000..8f5b0e3 Binary files /dev/null and b/maps/cs_hideout.jpg differ diff --git a/zpak001.pk3dir/maps/cs_hideout_src.jpg b/maps/cs_hideout_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_hideout_src.jpg rename to maps/cs_hideout_src.jpg diff --git a/maps/cs_iraq.jpg b/maps/cs_iraq.jpg new file mode 100644 index 0000000..8a0aa92 Binary files /dev/null and b/maps/cs_iraq.jpg differ 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 0000000..18ef367 Binary files /dev/null and b/maps/cs_italy.jpg differ 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 0000000..4368a03 Binary files /dev/null and b/maps/cs_mansion.jpg differ diff --git a/zpak001.pk3dir/maps/cs_mansion_src.jpg b/maps/cs_mansion_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_mansion_src.jpg rename to maps/cs_mansion_src.jpg diff --git a/maps/cs_militia.jpg b/maps/cs_militia.jpg new file mode 100644 index 0000000..1de000c Binary files /dev/null and b/maps/cs_militia.jpg differ 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 0000000..f97e856 Binary files /dev/null and b/maps/cs_office.jpg differ diff --git a/zpak001.pk3dir/maps/cs_office_src.jpg b/maps/cs_office_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_office_src.jpg rename to maps/cs_office_src.jpg diff --git a/maps/cs_prison.jpg b/maps/cs_prison.jpg new file mode 100644 index 0000000..6fb470b Binary files /dev/null and b/maps/cs_prison.jpg differ 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 0000000..e3bdb75 Binary files /dev/null and b/maps/cs_ship.jpg differ 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 0000000..ee53d19 Binary files /dev/null and b/maps/cs_siege.jpg differ 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 0000000..3b8929a Binary files /dev/null and b/maps/cs_station.jpg differ 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 0000000..396cd02 Binary files /dev/null and b/maps/cs_thunder.jpg differ 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 0000000..268f07f Binary files /dev/null and b/maps/cs_tire.jpg differ diff --git a/zpak001.pk3dir/maps/cs_tire_src.jpg b/maps/cs_tire_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/cs_tire_src.jpg rename to maps/cs_tire_src.jpg diff --git a/maps/cs_wpndepot.jpg b/maps/cs_wpndepot.jpg new file mode 100644 index 0000000..69bffff Binary files /dev/null and b/maps/cs_wpndepot.jpg differ 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 0000000..ea1f349 Binary files /dev/null and b/maps/cs_zoption.jpg differ 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 0000000..7985340 Binary files /dev/null and b/maps/de_aztec.jpg differ diff --git a/zpak001.pk3dir/maps/de_aztec_src.jpg b/maps/de_aztec_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_aztec_src.jpg rename to maps/de_aztec_src.jpg diff --git a/maps/de_cbble.jpg b/maps/de_cbble.jpg new file mode 100644 index 0000000..18617f3 Binary files /dev/null and b/maps/de_cbble.jpg differ 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 0000000..6339ce4 Binary files /dev/null and b/maps/de_chateau.jpg differ 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 0000000..ff6f52a Binary files /dev/null and b/maps/de_dust.jpg differ diff --git a/maps/de_dust2.jpg b/maps/de_dust2.jpg new file mode 100644 index 0000000..5b9658a Binary files /dev/null and b/maps/de_dust2.jpg differ 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 0000000..8b100b3 Binary files /dev/null and b/maps/de_fang.jpg differ 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 0000000..75f5051 Binary files /dev/null and b/maps/de_foption.jpg differ diff --git a/zpak001.pk3dir/maps/de_foption_src.jpg b/maps/de_foption_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_foption_src.jpg rename to maps/de_foption_src.jpg diff --git a/maps/de_inferno.jpg b/maps/de_inferno.jpg new file mode 100644 index 0000000..08e14e7 Binary files /dev/null and b/maps/de_inferno.jpg differ 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 0000000..480dcf3 Binary files /dev/null and b/maps/de_jeepathon2k.jpg differ 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 0000000..cb29455 Binary files /dev/null and b/maps/de_nuke.jpg differ 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 0000000..929a254 Binary files /dev/null and b/maps/de_piranesi.jpg differ 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 0000000..92b70b8 Binary files /dev/null and b/maps/de_prodigy.jpg differ diff --git a/zpak001.pk3dir/maps/de_prodigy_src.jpg b/maps/de_prodigy_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_prodigy_src.jpg rename to maps/de_prodigy_src.jpg diff --git a/maps/de_railroad.jpg b/maps/de_railroad.jpg new file mode 100644 index 0000000..fe2ba1d Binary files /dev/null and b/maps/de_railroad.jpg differ 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 0000000..f57cb42 Binary files /dev/null and b/maps/de_rotterdam.jpg differ 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 0000000..4b70c28 Binary files /dev/null and b/maps/de_storm.jpg differ 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 0000000..01d15f6 Binary files /dev/null and b/maps/de_survivor.jpg differ 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 0000000..72d672c Binary files /dev/null and b/maps/de_torn.jpg differ 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 0000000..d3d60df Binary files /dev/null and b/maps/de_train.jpg differ 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 0000000..abb12c0 Binary files /dev/null and b/maps/de_vegas.jpg differ 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 0000000..81b4c87 Binary files /dev/null and b/maps/de_vertigo.jpg differ diff --git a/zpak001.pk3dir/maps/de_vertigo_src.jpg b/maps/de_vertigo_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/de_vertigo_src.jpg rename to maps/de_vertigo_src.jpg diff --git a/maps/es_frantic.jpg b/maps/es_frantic.jpg new file mode 100644 index 0000000..3bf1eba Binary files /dev/null and b/maps/es_frantic.jpg differ 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 0000000..7dbb770 Binary files /dev/null and b/maps/es_jail.jpg differ diff --git a/zpak001.pk3dir/maps/es_jail_src.jpg b/maps/es_jail_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/es_jail_src.jpg rename to maps/es_jail_src.jpg diff --git a/maps/es_trinity.jpg b/maps/es_trinity.jpg new file mode 100644 index 0000000..e520a06 Binary files /dev/null and b/maps/es_trinity.jpg differ 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/maps/eukara/test_weapons.bsp b/maps/eukara/test_weapons.bsp new file mode 100644 index 0000000..49285d7 Binary files /dev/null and b/maps/eukara/test_weapons.bsp differ diff --git a/maps/eukara/test_weapons.map b/maps/eukara/test_weapons.map new file mode 100644 index 0000000..063b50c --- /dev/null +++ b/maps/eukara/test_weapons.map @@ -0,0 +1,241 @@ +// entity 0 +{ +"classname" "worldspawn" +"defaultteam" "0" +"newunit" "0" +"gametitle" "0" +"startdark" "0" +"MaxRange" "4096" +"sounds" "1" +"mapversion" "220" +"wad" "/Internal/WAD3/decals.wad;/Internal/WAD3/halflife.wad;/Internal/WAD3/liquids.wad;/Internal/WAD3/xeno.wad;/Internal/WAD3/cstrike.wad;/Internal/WAD3/cs_office.wad" +// brush 0 +{ +( 288 256 160 ) ( 288 256 0 ) ( 288 -256 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -256 160 ) ( 256 -256 0 ) ( 256 256 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -256 160 ) ( 288 -256 0 ) ( 256 -256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 256 160 ) ( 256 256 0 ) ( 288 256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -256 160 ) ( 256 -256 160 ) ( 288 256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 256 0 ) ( 256 -256 0 ) ( 288 256 0 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +// brush 1 +{ +( -256 256 160 ) ( -256 256 0 ) ( -256 -256 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -288 -256 160 ) ( -288 -256 0 ) ( -288 256 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 -256 160 ) ( -256 -256 0 ) ( -288 -256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -288 256 160 ) ( -288 256 0 ) ( -256 256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 -256 160 ) ( -288 -256 160 ) ( -256 256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -288 256 0 ) ( -288 -256 0 ) ( -256 256 0 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +// brush 2 +{ +( 256 288 160 ) ( 256 288 0 ) ( 256 256 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 256 160 ) ( -256 256 0 ) ( -256 288 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 256 160 ) ( 256 256 0 ) ( -256 256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 288 160 ) ( -256 288 0 ) ( 256 288 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 256 160 ) ( -256 256 160 ) ( 256 288 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -256 288 0 ) ( -256 256 0 ) ( 256 288 0 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +// brush 3 +{ +( 256 -256 160 ) ( 256 -256 0 ) ( 256 -288 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 -288 160 ) ( -256 -288 0 ) ( -256 -256 160 ) Core_Urban_028 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -288 160 ) ( 256 -288 0 ) ( -256 -288 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 -256 160 ) ( -256 -256 0 ) ( 256 -256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -288 160 ) ( -256 -288 160 ) ( 256 -256 160 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -256 -256 0 ) ( -256 -288 0 ) ( 256 -256 0 ) Core_Urban_028 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +// brush 4 +{ +( 256 256 192 ) ( 256 256 160 ) ( 256 -256 192 ) CSTRIKE_CH3TILE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 -256 192 ) ( -256 -256 160 ) ( -256 256 192 ) CSTRIKE_CH3TILE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -256 192 ) ( 256 -256 160 ) ( -256 -256 192 ) CSTRIKE_CH3TILE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 256 192 ) ( -256 256 160 ) ( 256 256 192 ) CSTRIKE_CH3TILE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -256 192 ) ( -256 -256 192 ) ( 256 256 192 ) CSTRIKE_CH3TILE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -256 256 160 ) ( -256 -256 160 ) ( 256 256 160 ) CSTRIKE_CH3TILE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +// brush 5 +{ +( 256 256 0 ) ( 256 256 -32 ) ( 256 -256 0 ) Core_Urban_066 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 -256 0 ) ( -256 -256 -32 ) ( -256 256 0 ) Core_Urban_066 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -256 0 ) ( 256 -256 -32 ) ( -256 -256 0 ) Core_Urban_066 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -256 256 0 ) ( -256 256 -32 ) ( 256 256 0 ) Core_Urban_066 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -256 0 ) ( -256 -256 0 ) ( 256 256 0 ) Core_Urban_066 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -256 256 -32 ) ( -256 -256 -32 ) ( 256 256 -32 ) Core_Urban_066 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +// brush 6 +{ +( 32 16 160 ) ( 32 -16 160 ) ( -32 16 160 ) -0CSTRIKE_WE4AL [ 0 1 0 0 ] [ 1 0 0 0 ] -0 1 1 +( 32 16 160 ) ( -32 16 160 ) ( 32 16 128 ) -0CSTRIKE_WE4AL [ -1 -0 -0 0 ] [ 0 0 -1 0 ] -0 1 1 +( 32 16 160 ) ( 32 16 128 ) ( 32 -16 160 ) -0CSTRIKE_WE4AL [ 0 1 0 0 ] [ 0 0 -1 0 ] -0 1 1 +( -32 -16 154 ) ( 32 -16 154 ) ( -32 16 154 ) +0CSTRIKE_IE1LT [ 0 1 0 -32 ] [ -1 0 0 0 ] -0 1 1 +( -32 -16 128 ) ( -32 -16 160 ) ( 32 -16 128 ) -0CSTRIKE_WE4AL [ 1 0 0 0 ] [ 0 0 -1 0 ] -0 1 1 +( -32 -16 128 ) ( -32 16 128 ) ( -32 -16 160 ) -0CSTRIKE_WE4AL [ 0 -1 0 0 ] [ 0 0 -1 0 ] -0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"angles" "0 0 0" +"origin" "-192 0 37" +} +// entity 1 +{ +"classname" "info_player_deathmatch" +"angles" "0 0 0" +"origin" "-192 0 37" +} +// entity 2 +{ +"classname" "light" +"_falloff" "0" +"_fade" "1.0" +"style" "0" +"_light" "255 255 128 200" +"origin" "0 0 128" +} +// entity 3 +{ +"classname" "weapon_ak47" +"origin" "128 192 16" +} +// entity 4 +{ +"classname" "weapon_aug" +"origin" "128 128 16" +} +// entity 5 +{ +"classname" "weapon_awp" +"origin" "128 64 16" +} +// entity 6 +{ +"classname" "weapon_c4bomb" +"origin" "128 0 16" +} +// entity 7 +{ +"classname" "weapon_deagle" +"origin" "128 -64 16" +} +// entity 8 +{ +"classname" "weapon_elite" +"origin" "128 -128 16" +} +// entity 9 +{ +"classname" "weapon_famas" +"origin" "128 -192 16" +} +// entity 10 +{ +"classname" "weapon_fiveseven" +"origin" "0 192 16" +} +// entity 11 +{ +"classname" "weapon_flashbang" +"origin" "0 128 16" +} +// entity 12 +{ +"classname" "weapon_g3sg1" +"origin" "0 64 16" +} +// entity 13 +{ +"classname" "weapon_galil" +"origin" "0 0 16" +} +// entity 14 +{ +"classname" "weapon_glock18" +"origin" "0 -64 16" +} +// entity 15 +{ +"classname" "weapon_hegrenade" +"origin" "0 -128 16" +} +// entity 16 +{ +"classname" "weapon_knife" +"origin" "0 -192 16" +} +// entity 17 +{ +"classname" "weapon_m249" +"origin" "-64 192 16" +} +// entity 18 +{ +"classname" "weapon_m3" +"origin" "-64 128 16" +} +// entity 19 +{ +"classname" "weapon_m4a1" +"origin" "-64 64 16" +} +// entity 20 +{ +"classname" "weapon_mac10" +"origin" "-64 0 16" +} +// entity 21 +{ +"classname" "weapon_mp5navy" +"origin" "-64 -64 16" +} +// entity 22 +{ +"classname" "weapon_p228" +"origin" "-64 -128 16" +} +// entity 23 +{ +"classname" "weapon_p90" +"origin" "-64 -192 16" +} +// entity 24 +{ +"classname" "weapon_scout" +"origin" "64 192 16" +} +// entity 25 +{ +"classname" "weapon_sg550" +"origin" "64 128 16" +} +// entity 26 +{ +"classname" "weapon_sg552" +"origin" "64 64 16" +} +// entity 27 +{ +"classname" "weapon_smokegrenade" +"origin" "64 0 16" +} +// entity 28 +{ +"classname" "weapon_tmp" +"origin" "64 -64 16" +} +// entity 29 +{ +"classname" "weapon_ump45" +"origin" "64 -128 16" +} +// entity 30 +{ +"classname" "weapon_usp" +"origin" "64 -192 16" +} +// entity 31 +{ +"classname" "weapon_xm1014" +"origin" "-128 0 16" +} 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/quake.rc b/quake.rc new file mode 100644 index 0000000..daf0189 --- /dev/null +++ b/quake.rc @@ -0,0 +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 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/scripts/bots.txt b/scripts/bots.txt new file mode 100644 index 0000000..dcac977 --- /dev/null +++ b/scripts/bots.txt @@ -0,0 +1,63 @@ +{ + name nothing + funname n0things +} +{ + name goose + funname ^2Goose +} +{ + 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 + 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 +} diff --git a/scripts/client_style.txt b/scripts/client_style.txt new file mode 100644 index 0000000..567c47b --- /dev/null +++ b/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/def/monsters.def b/scripts/constants.txt similarity index 100% rename from zpak001.pk3dir/def/monsters.def rename to scripts/constants.txt diff --git a/scripts/maptweaks.txt b/scripts/maptweaks.txt new file mode 100644 index 0000000..ebdfb63 --- /dev/null +++ b/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/scripts/surfaceproperties_cstrike.txt b/scripts/surfaceproperties_cstrike.txt new file mode 100644 index 0000000..1e5b5ac --- /dev/null +++ b/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/scripts/surfaceproperties_manifest.txt b/scripts/surfaceproperties_manifest.txt new file mode 100644 index 0000000..67385d2 --- /dev/null +++ b/scripts/surfaceproperties_manifest.txt @@ -0,0 +1,5 @@ +surfaceproperties_manifest +{ + file "scripts/surfaceproperties_cstrike.txt" + file "scripts/surfaceproperties_valve.txt" +} diff --git a/scripts/ui_style.txt b/scripts/ui_style.txt new file mode 100644 index 0000000..d339a64 --- /dev/null +++ b/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 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/Makefile b/src/client/Makefile index 627019a..bcb3bed 100644 --- a/src/client/Makefile +++ b/src/client/Makefile @@ -1,4 +1,4 @@ -CC=fteqcc +QCC=fteqcc all: - $(CC) progs.src + $(QCC) $(CFLAGS) -I../../../src/platform/ -I../../../valve/src/shared/ progs.src diff --git a/src/client/cmds.qc b/src/client/cmds.qc index bb9156b..ab3b654 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) @@ -33,7 +37,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)) { @@ -51,6 +55,45 @@ int ClientGame_ConsoleCommand(void) { switch(argv(0)) { + case "invnext": + pSeatLocal->weaponSelectionHUD.SelectNext(false); + break; + case "invprev": + pSeatLocal->weaponSelectionHUD.SelectPrevious(false); + 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; @@ -72,164 +115,7 @@ ClientGame_ConsoleCommand(void) case "drop": sendevent("DropWeapon", ""); break; - case "glock": - sendevent("BuyWeapon", "f", WEAPON_GLOCK18); - break; - case "usp": - sendevent("BuyWeapon", "f", WEAPON_USP45); - break; - case "p228": - sendevent("BuyWeapon", "f", WEAPON_P228); - break; - case "deagle": - sendevent("BuyWeapon", "f", WEAPON_DEAGLE); - break; - case "fn57": - sendevent("BuyWeapon", "f", WEAPON_FIVESEVEN); - break; - case "elites": - sendevent("BuyWeapon", "f", WEAPON_ELITES); - break; - case "m3": - sendevent("BuyWeapon", "f", WEAPON_M3); - break; - case "xm1014": - sendevent("BuyWeapon", "f", WEAPON_XM1014); - break; - case "tmp": - sendevent("BuyWeapon", "f", WEAPON_TMP); - break; - case "mac10": - sendevent("BuyWeapon", "f", WEAPON_MAC10); - break; - case "mp5": - sendevent("BuyWeapon", "f", WEAPON_MP5); - break; - case "ump45": - sendevent("BuyWeapon", "f", WEAPON_UMP45); - break; - case "p90": - sendevent("BuyWeapon", "f", WEAPON_P90); - break; - case "ak47": - sendevent("BuyWeapon", "f", WEAPON_AK47); - break; - case "m4a1": - sendevent("BuyWeapon", "f", WEAPON_M4A1); - break; - case "sg552": - sendevent("BuyWeapon", "f", WEAPON_SG552); - break; - case "aug": - sendevent("BuyWeapon", "f", WEAPON_AUG); - break; - case "scout": - sendevent("BuyWeapon", "f", WEAPON_SCOUT); - break; - case "sg550": - sendevent("BuyWeapon", "f", WEAPON_SG550); - break; - case "awp": - sendevent("BuyWeapon", "f", WEAPON_AWP); - break; - case "g3sg1": - sendevent("BuyWeapon", "f", WEAPON_G3SG1); - break; - case "m249": - sendevent("BuyWeapon", "f", WEAPON_PARA); - break; - case "buyammo1": - case "primammo": - sendevent("AmmoBuyPrimary", ""); - break; - case "buyammo2": - case "secammo": - sendevent("AmmoBuySecondary", ""); - break; - case "vest": - sendevent("BuyEquipment", "f", 0); - break; - case "vesthelm": - sendevent("BuyEquipment", "f", 1); - break; - case "flash": - sendevent("BuyEquipment", "f", 2); - break; - case "hegren": - sendevent("BuyEquipment", "f", 3); - break; - case "vsgren": - sendevent("BuyEquipment", "f", 4); - break; - case "defuser": - sendevent("BuyEquipment", "f", 5); - break; - case "nvg": - sendevent("BuyEquipment", "f", 6); - 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/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..0017576 100644 --- a/src/client/defs.h +++ b/src/client/defs.h @@ -17,12 +17,15 @@ #include "hud.h" #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; @@ -79,6 +82,7 @@ struct float m_flTimeAlpha; vector m_vecMoneyColor; int m_iNightvision; + HLWeaponSelect weaponSelectionHUD; } g_seatslocal[4], *pSeatLocal; void HUD_DrawAmmo1(void); @@ -87,7 +91,12 @@ 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); + +float +GetGameTime(void) +{ + return max(0.0f, serverkeyfloat("cs_gametime") - time); +} diff --git a/src/client/entities.qc b/src/client/entities.qc index d37263e..5a584e1 100644 --- a/src/client/entities.qc +++ b/src/client/entities.qc @@ -21,6 +21,15 @@ ClientGame_EntityUpdate(float id, float new) case ENT_C4BOMB: w_c4bomb_parse(); break; + case ENT_PLAYER: + NSENTITY_READENTITY(CSPlayer, new) + break; + case ENT_ENTITYPROJECTILE: + NSENTITY_READENTITY(CSProjectile, new) + break; + case ENT_WEAPON: + NSENTITY_READENTITY(CSWeapon, new) + break; default: return (0); } diff --git a/src/client/game_event.qc b/src/client/game_event.qc index c30d962..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(); @@ -59,15 +45,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 4732f44..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 */ @@ -116,23 +122,27 @@ HUD_DrawNums(float fNumber, vector vecPos, float fAlpha, vector vColor) /* timer */ void -HUD_DrawTimer(int NSClientSpectator) +HUD_DrawTimer(int ncSpectator) { + if (g_csDrawTime == false) { + return; + } + 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]; } - 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 +200,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 +270,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 +280,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)); } @@ -284,7 +295,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 +342,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]; @@ -345,7 +356,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 +381,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)], @@ -405,7 +416,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 +439,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 +461,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 +497,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,18 +542,18 @@ 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++; } - 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 +572,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 +618,7 @@ HUD_DrawZones(void) ); pos[1] += 32; } - if (pl.g_items & ITEM_DEFUSAL) { + if (pl.HasItem("item_defuse")) { drawsubpic( pos, [32,32], @@ -652,7 +663,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 +677,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); @@ -695,17 +706,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); @@ -720,13 +727,16 @@ 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); - HUD_DrawWeaponSelect(); + if (pl.m_activeWeapon) { + pl.m_activeWeapon.UpdateGUI(); + } + + pSeatLocal->weaponSelectionHUD.Draw(); Obituary_Draw(); Textmenu_Draw(); @@ -734,7 +744,7 @@ HUD_Draw(void) HUD_DrawMoney(); HUD_DrawTimer(0); - if (!(pl.g_items & ITEM_SUIT)) { + if (pl.HasItem("item_suit") == false) { return; } @@ -754,6 +764,10 @@ HUD_Draw(void) void HUD_DrawSpectator(void) { + if (VGUI_Active() == true) { + return; + } + Textmenu_Draw(); Obituary_Draw(); @@ -761,7 +775,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..330aa19 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; @@ -83,8 +99,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(ncPlayer 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 +115,10 @@ 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 +} + +void +HUD_ItemNotify_Check(ncPlayer pl) +{ } \ 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..0b6f241 100644 --- a/src/client/init.qc +++ b/src/client/init.qc @@ -36,85 +36,25 @@ 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"); + registercommand("invprev"); Obituary_Init(); Sound_Precache("nvg.on"); Sound_Precache("nvg.off"); + + pSeatLocal->weaponSelectionHUD = spawn(HLWeaponSelect); } 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 +63,7 @@ ClientGame_IsUsingVGUI(void) return true; return false; +#endif } void VGUI_ShowMOTD(void); @@ -166,7 +107,6 @@ ClientGame_RendererRestart(string rstr) Obituary_Precache(); Damage_Precache(); - FX_Blood_Init(); FX_Smokenade_Init(); HLSprite_Init(); diff --git a/src/client/nightvision.qc b/src/client/nightvision.qc index 1e6675e..103d73a 100644 --- a/src/client/nightvision.qc +++ b/src/client/nightvision.qc @@ -17,30 +17,32 @@ void Nightvision_Toggle(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; - if (!(pl.g_items & ITEM_NIGHTVISION)) { + if (pl.HasItem("item_nightvision") == false) { pSeatLocal->m_iNightvision = 0; return; } 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 Nightvision_PreFrame(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; - if (!pSeatLocal->m_iNightvision) + if (!pSeatLocal->m_iNightvision) { return; + } - if (!(pl.g_items & ITEM_NIGHTVISION)) { + if (pl.HasItem("item_nightvision") == false) { pSeatLocal->m_iNightvision = 0; return; } @@ -51,12 +53,13 @@ Nightvision_PreFrame(void) void Nightvision_PostFrame(void) { - player pl = (player)pSeat->m_ePlayer; + CSPlayer pl = (CSPlayer)pSeat->m_ePlayer; - if (!pSeatLocal->m_iNightvision) + if (!pSeatLocal->m_iNightvision) { return; + } - if (!(pl.g_items & ITEM_NIGHTVISION)) { + if (pl.HasItem("item_nightvision") == false) { pSeatLocal->m_iNightvision = 0; return; } diff --git a/src/client/progs.src b/src/client/progs.src index 28a8602..ec1d3e3 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -1,52 +1,53 @@ #pragma target fte_5768 //#pragma flag enable assumeint #pragma progs_dat "../../csprogs.dat" +#pragma forcecrc 54730 #define CSQC #define CLIENT #define CSTRIKE -#define CLASSIC_VGUI + #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 -hud_weaponselect.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/client/radar.qc b/src/client/radar.qc index f6472f5..74357f6 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 ncRadar g_csRadar; void Radar_Init(void) { g_cs_radar = spriteframe("sprites/radar640.spr", 0, 0.0f); + + g_csRadar = ncRadar::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/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/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 a943282..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,60 +35,59 @@ 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) { - player pl; - pl = (player)pSeat->m_ePlayer; + CSPlayer pl; + pl = (CSPlayer)pSeat->m_ePlayer; int inteam = getplayerkeyfloat(pl.entnum-1, "*team"); switch (n) { @@ -106,11 +107,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 +129,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 +160,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 +196,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 +224,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 +254,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 +275,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 +303,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 +336,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 +361,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 +388,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_buymenu.qc b/src/client/vgui_buymenu.qc index 3700adf..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'); @@ -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..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 @@ -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,41 +66,45 @@ typedef struct string titleName; /* the name of the titles.txt entry */ } buyItems_t; -const buyItems_t g_buyItemList [29] = { - { "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" }, - { "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" }, +const buyItems_t g_buyItemList [] = { + { "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) + { "CSBuy", BUY_FAMAS, "classes/famas.txt", "gfx/vgui/640_famas", "Famas" }, + { "CSBuy", BUY_GALIL, "classes/galil.txt", "gfx/vgui/640_galil", "Galil" }, +#endif + { "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]; -class CSBuyItemButton:VGUIButton +class CSBuyItemButton:vguiButton { void CSBuyItemButton(void); @@ -142,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; @@ -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"); @@ -168,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]); @@ -249,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'); @@ -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..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); @@ -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(); } @@ -101,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; @@ -115,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]); @@ -192,5 +206,5 @@ VGUI_ChooseClassCT(void) } winClassSelectionCT.Show(); - winClassSelectionCT.SetPos((video_res / 2) - (winClassSelectionCT.GetSize() / 2)); -} \ No newline at end of file + winClassSelectionCT.SetPos((g_vidsize / 2) - (winClassSelectionCT.GetSize() / 2)); +} diff --git a/src/client/vgui_changeclass_t.qc b/src/client/vgui_changeclass_t.qc index d0fad34..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); @@ -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(); } @@ -102,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; @@ -116,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]); @@ -193,5 +207,5 @@ VGUI_ChooseClassT(void) } winClassSelection.Show(); - winClassSelection.SetPos((video_res / 2) - (winClassSelection.GetSize() / 2)); -} \ No newline at end of file + winClassSelection.SetPos((g_vidsize / 2) - (winClassSelection.GetSize() / 2)); +} diff --git a/src/client/vgui_chooseteam.qc b/src/client/vgui_chooseteam.qc index f3ed81d..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,34 +63,33 @@ 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"); 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(); } @@ -98,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'); @@ -163,5 +162,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..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]); @@ -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/client/vgui_spectator.qc b/src/client/vgui_spectator.qc index 0865717..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,8 @@ 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 */ 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/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/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 new file mode 100644 index 0000000..2f3c02d --- /dev/null +++ b/src/rules/Makefile @@ -0,0 +1,7 @@ +QCC=fteqcc + +all: + 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 new file mode 100644 index 0000000..edaf580 --- /dev/null +++ b/src/rules/counterstrike.qc @@ -0,0 +1,1097 @@ +/* + * 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 "../../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; + +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; +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); +} + +string +GameStateName(void) +{ + return (g_csGameStateName[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 %S\n", GameTime(), GameStateName()); + + /* 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); +} + +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) +{ + string spawnCT; + string spawnT; + + 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", [255, 63, 63], true); + teams.SetSpawnPoint(TEAM_T, spawnT); + teams.SetUp(TEAM_CT, "Counter-Terrorist", [153, 204, 255], 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(entity playerEntity) +{ + /* first course of action is to kick players into spectator cam */ + CS_GoSpectator(playerEntity); +} + +void +CodeCallback_PlayerDisconnect(entity playerEntity) +{ + /* if they leave, timeout, get kicked (or banned), we gotta know! */ + CS_PlayerRemovedFromGame(playerEntity); +} + +void +CodeCallback_PlayerDamage(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 player scores */ + if (ents.isPlayer(attacker)) { + if (playerEntity == attacker) { + attacker.frags--; + } else if (playerEntity.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(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(playerEntity, "Spectate", "", world); + } + + CS_PlayerRemovedFromGame(playerEntity); +} + +bool +CodeCallback_CallRequestTeam(entity playerEntity, int teamNum) +{ + /* can't switch teams while alive. */ + if (ents.isAlive(playerEntity) == true) { + return (false); + } + + /* can't switch teams while we're a VIP */ + if (IsVIP(playerEntity) == 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(playerEntity, "SetTeam", "1", playerEntity); + break; + case TEAM_CT: + ents.Input(playerEntity, "SetTeam", "2", playerEntity); + break; + default: + CS_GoSpectator(playerEntity); + return (true); + } + + return (true); +} + +bool +CodeCallback_ClientCommand(entity playerEntity, string command) +{ + float commandArgs = tokenize(command); + + switch (argv(0)) { + /* class selection */ + case "terror": + SetTClass(playerEntity, 1); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); + break; + case "leet": + SetTClass(playerEntity, 2); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); + break; + case "arctic": + SetTClass(playerEntity, 3); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); + break; + case "guerilla": + SetTClass(playerEntity, 4); + CodeCallback_CallRequestTeam(playerEntity, TEAM_T); + CS_RequestSpawn(playerEntity); + break; + case "urban": + SetCTClass(playerEntity, 1); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); + break; + case "gsg9": + SetCTClass(playerEntity, 2); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); + break; + case "sas": + SetCTClass(playerEntity, 3); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); + break; + case "gign": + SetCTClass(playerEntity, 4); + CodeCallback_CallRequestTeam(playerEntity, TEAM_CT); + CS_RequestSpawn(playerEntity); + break; + case "buy": + Money_Purchase(playerEntity, argv(1)); + break; + case "buyammo": + Money_PurchaseAmmoForSlot(playerEntity, stoi(argv(1))); + break; + default: + return (false); + } + + return (true); +} + +bool +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(playerEntity, "UseItem", "item_suit", playerEntity); + } + break; + default: + return (false); + } + + return (true); +} diff --git a/src/rules/deathmatch.qc b/src/rules/deathmatch.qc new file mode 100644 index 0000000..ebe3113 --- /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 "../../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/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/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 627019a..e96b4a9 100644 --- a/src/server/Makefile +++ b/src/server/Makefile @@ -1,4 +1,4 @@ -CC=fteqcc +QCC=fteqcc all: - $(CC) progs.src + $(QCC) $(CFLAGS) -I../../../valve/src/shared/ progs.src diff --git a/src/server/ammo.h b/src/server/ammo.h deleted file mode 100644 index 0c3986a..0000000 --- a/src/server/ammo.h +++ /dev/null @@ -1,3 +0,0 @@ -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 87d2565..0000000 --- a/src/server/ammo.qc +++ /dev/null @@ -1,333 +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; - -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 - } -}; - -int -Ammo_BuyCaliber(player pl, int cal, int free) -{ - int *ptr_ammo = __NULL__; - int rv = 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; - } - - return rv; -} - - -void -Ammo_BuySecondary(NSClientPlayer pp, int free) -{ - int cal = 0; - int ps = 0; - player pl = (player)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); -} - -/* 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) -{ - player pl = (player)self; - - CSGameRules rules = (CSGameRules)g_grMode; - if (rules.BuyingPossible(pl) == FALSE) { - return; - } - - Ammo_BuySecondary(pl, FALSE); -} - -void -Ammo_BuyPrimary(NSClientPlayer pp, int free) -{ - int ps = 0; - int cal = 0; - player pl = (player)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; - 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); -} - -void -CSEv_AmmoBuyPrimary(void) -{ - player pl = (player)self; - - CSGameRules rules = (CSGameRules)g_grMode; - if (rules.BuyingPossible(pl) == FALSE) { - return; - } - - Ammo_BuyPrimary(pl, FALSE); -} - -void -Ammo_AutoFill(NSClientPlayer pp) -{ - player pl = (player)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 d0148c4..dc835ca 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] = { @@ -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; @@ -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) { @@ -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; } @@ -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.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 5ef69d6..0000000 --- a/src/server/bot.qc +++ /dev/null @@ -1,615 +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; - - /* 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); -} - -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 ((flags & FL_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 ((g_items & ITEM_C4BOMB)) { - /* We carry the bomb */ - if (m_gflagsBackup & GF_BOMBZONE) { - /* We are at a bombsite and ready to plant the bomb */ - if (activeweapon != WEAPON_C4BOMB) { - activeweapon = WEAPON_C4BOMB; - Weapons_Draw((player)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 */ - makevectors(v_angle); - vecNewAngles = v_forward; - - /* aimdir = new final angle */ - aimdir = vectoangles(aimpos - origin); - makevectors(aimdir); - - /* 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); - - /* 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; -} - -void -csbot::PostFrame(void) -{ - if (team == 0) { - CSEv_JoinAuto(); - } - - team = infokeyf(this, "*team"); - m_gflagsBackup = gflags; -}; - -void -csbot::WeaponThink(void) -{ - if (activeweapon == WEAPON_KNIFE) - return; - - /* 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); - } - } -}; - -/** @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; - player pl = (player)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 == WEAPON_M4A1) { continue; } - if (r == WEAPON_AUG) { continue; } - if (r == WEAPON_SG550) { continue; } - if (r == WEAPON_FIVESEVEN) { continue; } - if (r == WEAPON_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 (g_cstrikeWeaponPrice[r] <= pl.money) { - CSEv_BuyWeapon_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 && - g_cstrikeUtilPrice[(float)5] <= pl.money && - random() < 0.5) - { - CSEv_BuyEquipment_f((float)5); // 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); - } else if (!(pl.g_items & ITEM_HELMET)) { /* we need helmet */ - if (pl.money >= 350) /* kevlar and helmet */ - CSEv_BuyEquipment_f(1); - } - - /* 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; - } - - /* force buy right now */ - CSEv_AmmoBuyPrimary(); - CSEv_AmmoBuySecondary(); -} - -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 b79ac61..0000000 --- a/src/server/buy.h +++ /dev/null @@ -1,64 +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 g_cstrikeWeaponPrice[] = -{ - 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 */ -}; - -int g_cstrikeUtilPrice[] = -{ - 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); diff --git a/src/server/buy.qc b/src/server/buy.qc deleted file mode 100644 index 4c773e8..0000000 --- a/src/server/buy.qc +++ /dev/null @@ -1,176 +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_BuyWeapon_f(float fWeapon) -{ - CSGameRules rules = (CSGameRules)g_grMode; - - int iWeapon; - player pl = (player)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!"); - } -} - -void -CSEv_BuyEquipment_f(float fUtil) -{ - CSGameRules rules = (CSGameRules)g_grMode; - - int iUtil; - player pl = (player)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.g_items & ITEM_NIGHTVISION) - return; - - pl.g_items |= ITEM_NIGHTVISION; - Sound_Play(pl, CHAN_ITEM, "buy.weapon"); - break; - } - Money_AddMoney(pl, -g_cstrikeUtilPrice[iUtil]); - } else { - centerprint(pl, "You have insufficient funds!"); - } -} 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 6096b70..ee91f88 100644 --- a/src/server/func_bomb_target.qc +++ b/src/server/func_bomb_target.qc @@ -28,32 +28,24 @@ 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; - virtual void(void) Respawn; virtual void(entity) Touch; }; void func_bomb_target::func_bomb_target(void) { - g_cs_bombzones++; -} - -void -func_bomb_target::Respawn(void) -{ - InitBrushTrigger(); } void func_bomb_target::Touch(entity eToucher) { - player pl = (player)eToucher; + CSPlayer pl = (CSPlayer)eToucher; - if (!(eToucher.flags & FL_CLIENT)) { + if (isPlayer(pl) == false) { return; } @@ -61,9 +53,10 @@ 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; } + pl.gflags |= GF_BOMBZONE; } diff --git a/src/server/func_buyzone.qc b/src/server/func_buyzone.qc index 3f1b457..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; @@ -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; @@ -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 136d6ce..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); @@ -38,7 +38,6 @@ func_escapezone:NSBrushTrigger void func_escapezone::func_escapezone(void) { - g_cs_escapezones++; } void @@ -51,21 +50,7 @@ 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; - - player pl = (player)eToucher; - - /* don't matter when rules are not active */ - if (g_cs_gamestate != GAME_ACTIVE) - return; + CSPlayer pl = (CSPlayer)eToucher; /* disallow the wrong players */ if (pl.classname != "player") @@ -73,29 +58,6 @@ func_escapezone::Touch(entity eToucher) 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"));) { - player ct = (player)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 ba5e17a..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; @@ -51,8 +51,8 @@ func_hostage_rescue::Respawn(void) void func_hostage_rescue::Touch(entity eToucher) { - if (eToucher.flags & FL_CLIENT) { - player pl = (player)eToucher; + if (isPlayer(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; @@ -70,15 +70,7 @@ func_hostage_rescue::Touch(entity eToucher) if (!(hosty.m_eFollowing)) return; - Radio_BroadcastMessage(RADIO_RESCUED); - g_cs_hostagesrescued++; - - Money_AddMoney((player)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 f344562..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); @@ -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; - - player pl = (player)eToucher; + 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 a5932cf..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) -{ - player pl = (player)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/gamerules.h b/src/server/gamerules.h deleted file mode 100644 index ecaf505..0000000 --- a/src/server/gamerules.h +++ /dev/null @@ -1,117 +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 PlayerKill(NSClientPlayer); - 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 4f9be0e..0000000 --- a/src/server/gamerules.qc +++ /dev/null @@ -1,205 +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) -{ - player pl = (player)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.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) { - setsize(pl, VEC_CHULL_MIN, VEC_CHULL_MAX); - } else { - setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); - } -} - -void -CSGameRules::LevelChangeParms(NSClientPlayer pp) -{ - player pl = (player)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; - - 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 -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; -} - -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); - } - - 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 dbe7969..0000000 --- a/src/server/gamerules_deathmatch.qc +++ /dev/null @@ -1,291 +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((player)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((player)pl, ANIM_DEATH1); - //FX_Corpse_Spawn((player)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) -{ - player pl = (player)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.SetCanBleed(true); - - LevelNewParms(); - LevelDecodeParms(pl); - - pl.g_items = ITEM_KNIFE | ITEM_SUIT; - pl.activeweapon = WEAPON_KNIFE; - - 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; - - Ammo_BuyPrimary(pl, TRUE); - Ammo_BuySecondary(pl, TRUE); - - spot = Spawn_SelectRandom("info_player_deathmatch"); - pl.Transport(spot.origin, spot.angles); - Weapons_RefreshAmmo(pl); - 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 7215382..0000000 --- a/src/server/gamerules_multiplayer.qc +++ /dev/null @@ -1,1277 +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 -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) -{ - player targ = (player)g_dmg_eTarget; - player attk = (player)g_dmg_eAttacker; - NSRenderableEntity newCorpse; - float deathAnimation = ANIM_DEATH1; - - if (targ.flags & FL_CROUCHING) { - 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 (g_dmg_eTarget.flags & FL_CLIENT || g_dmg_eTarget.flags & FL_MONSTER) - if (g_dmg_eAttacker.flags & FL_CLIENT) { - 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 (g_dmg_eTarget.flags & FL_CLIENT) { - targ.SetInfoKey("*icon1", "d_skull"); - targ.SetInfoKey("*icon1_r", "1"); - targ.SetInfoKey("*icon1_g", "0"); - targ.SetInfoKey("*icon1_b", "0"); - } - - 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); - } else { - targ.activeweapon = Cstrike_WeaponToDropUponDeath(targ); - Weapon_DropCurrentWeapon(targ); - } - - /* clear all ammo and inventory... */ - PlayerClearWeaponry(targ); - targ.Death(); - targ.gflags &= ~GF_FLASHLIGHT; - - 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; - player p = (player)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, "info_player_start"));) { - 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, "info_player_start"));) { - 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, "info_player_deathmatch"));) { - info_buyzone newzone = spawn(info_buyzone, origin: e.origin); - newzone.Respawn(); - newzone.team = TEAM_T; - } -} - -void -CSMultiplayerRules::InitPostEnts(void) -{ - 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.health <= 0) { - 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) -{ - Weapons_AddItem(pl, WEAPON_C4BOMB, -1); - 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"); - forceinfokey(pl, "*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"));) { - player pl = (player)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 (!(eFind.flags & FL_CLIENT)) - continue; - - player pl = (player)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 (!(eFind.flags & FL_CLIENT)) - continue; - - player pl = (player)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 (!(eFind.flags & FL_CLIENT)) - continue; - - player pl = (player)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"));) { - decal dec = (decal)eFind; - dec.m_strTexture = ""; - dec.SendFlags = -1; - } - for (entity eFind = world; (eFind = find(eFind, ::classname, "item_c4"));) { - 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); - 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((player)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((player)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); - } - } - - CSBot_BuyStart(); - 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"));) { - player pl = (player)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; - } - forceinfokey(pl, "*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, "info_player_deathmatch"); - - if (m_eLastTSpawn == world) { - m_eLastTSpawn = find(m_eLastTSpawn, ::classname, "info_player_deathmatch"); - } - point = m_eLastTSpawn; - } else if (t == TEAM_CT) { - m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, "info_player_start"); - - if (m_eLastCTSpawn == world) { - m_eLastCTSpawn = find(m_eLastCTSpawn, ::classname, "info_player_start"); - } - 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"); - } - - 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) -{ - 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; - - pl.SetOrigin(eSpawn.origin); - pl.angles = eSpawn.angles; - pl.SendFlags = UPDATE_ALL; - Client_FixAngle(pl, pl.angles); - - pl.SetInfoKey("*icon1", ""); - pl.SetInfoKey("*icon1_r", "1"); - pl.SetInfoKey("*icon1_g", "1"); - pl.SetInfoKey("*icon1_b", "1"); - - 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.velocity = [0,0,0]; - pl.progress = 0.0f; - Weapons_SwitchBest(pl); - Ammo_AutoFill(pl); -} - -void -CSMultiplayerRules::PlayerClearWeaponry(NSClientPlayer pp) -{ - player pl = (player)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; -} - -void -CSMultiplayerRules::PlayerMakePlayable(NSClientPlayer pp, int chara) -{ - player pl = (player)pp; - /* spectator */ - if (chara == 0) { - PlayerSpawn(pl); - return; - } - - MakePlayable(pp); - pl.g_items |= ITEM_SUIT; - Weapons_AddItem(pl, WEAPON_KNIFE, -1); - - /* terrorists */ - if (chara < 5) { - pl.team = TEAM_T; - if (autocvar_fcs_knifeonly == FALSE) { - Weapons_AddItem(pl, WEAPON_GLOCK18, -1); - 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.ingame = TRUE; - forceinfokey(pl, "*team", ftos(pl.team)); - PlayerRespawn(pl, pl.team); -} - -/* -================= -PlayerMakeSpectator - -Force the player to become an observer. -================= -*/ -void -CSMultiplayerRules::PlayerMakeSpectator(NSClientPlayer pp) -{ - player pl = (player)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) -{ - player p = (player)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; -} - -/* -================= -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; - forceinfokey(pl, "*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; - player pl; - - /* matches Game_InitRules() */ - if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { - return; - } - - rules = (CSMultiplayerRules)g_grMode; - pl = (player)self; - - 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) { - rules.PlayerKill(pl); - } - - 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; - } - - //PlayerMakeSpectator(pl); - pl.charmodel = (int)flChar; - forceinfokey(pl, "*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 */ - 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 0d6e5b7..0000000 --- a/src/server/gamerules_singleplayer.qc +++ /dev/null @@ -1,80 +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.view_ofs = PHY_VIEWPOS; - pl.velocity = [0,0,0]; - pl.gravity = __NULL__; - pl.frame = 1; - pl.SendFlags = UPDATE_ALL; - pl.customphysics = Empty; - pl.iBleeds = TRUE; - forceinfokey(pl, "*spec", "0"); - forceinfokey(pl, "*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; - } - - Weapons_RefreshAmmo(pl); - Client_FixAngle(pl, pl.angles); -} diff --git a/src/server/hostage_entity.qc b/src/server/hostage_entity.qc index e091439..6273474 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,25 +79,33 @@ enum HOSA_DEADTABLE3 }; -class hostage_entity:NSTalkMonster +class CSHostage:ncTalkMonster { - int m_iUsedOnce; + bool m_bUsedOnce; - void(void) hostage_entity; + void CSHostage(void); + + virtual void OnPlayerUse(void); + virtual void Pain(entity, entity, int, vector, vector, int); + virtual void Death(entity, entity, int, vector, vector, int); - virtual void(void) Respawn; - virtual void(void) OnPlayerUse; - virtual void(void) Pain; - virtual void(void) Death; }; void -hostage_entity::OnPlayerUse(void) +CSHostage::CSHostage(void) +{ + Sound_Precache("hostage_entity.follow"); + m_bUsedOnce = false; +} + + +void +CSHostage::OnPlayerUse(void) { if (eActivator.team == TEAM_T) { - player pl = (player)eActivator; + 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; @@ -105,25 +113,29 @@ hostage_entity::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) { - Money_AddMoney((player)eActivator, 150); - m_iUsedOnce = TRUE; } - NSTalkMonster::OnPlayerUse(); + /* CT reward, first time only */ + if (m_bUsedOnce == false) { + g_grMode.Input(eActivator, "HostageContacted", ""); + m_bUsedOnce = true; + } + + ncTalkMonster::OnPlayerUse(); } void -hostage_entity::Pain(void) +CSHostage::Pain(entity inflictor, entity attacker, int damageDealt, vector dir, vector absImpactPos, int hitBody) { - if (IsAlive() == false) - return; + super::Pain(inflictor, attacker, damageDealt, dir, absImpactPos, hitBody); - switch (g_dmg_iHitBody) { + if (IsAlive() == false) { + return; + } + + switch (hitBody) { case BODY_HEAD: case BODY_DEFAULT: case BODY_CHEST: @@ -145,19 +157,20 @@ hostage_entity::Pain(void) } /* penalties */ - if (g_dmg_eAttacker.classname != "player") + if (isPlayer(attacker) == false) { return; + } - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, -(g_dmg_iDamage * 25)); + g_grMode.Input(attacker, "HostageInjured", itos(damageDealt)); } void -hostage_entity::Death(void) +CSHostage::Death(entity inflictor, entity attacker, int damageDealt, vector dir, vector absImpactPos, int hitBody) { WarnAllies(); if (IsAlive() == true) { - switch (g_dmg_iHitBody) { + switch (hitBody) { case BODY_HEAD: SetFrame(HOSA_DIE_HEADSHOT); break; @@ -169,13 +182,8 @@ hostage_entity::Death(void) break; } - if (g_dmg_eAttacker.classname == "player") { - if (g_dmg_iDamage >= 100) - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, -2500); - else - Money_AddMoney((NSClientPlayer)g_dmg_eAttacker, -500); - - Radio_BroadcastMessage(RADIO_HOSDOWN); + if (isPlayer(attacker) == true) { + g_grMode.Input(attacker, "HostageKilled", itos(damageDealt)); } } @@ -183,52 +191,6 @@ hostage_entity::Death(void) SetHealth(0); /* now mark our state as 'dead' */ - super::Death(); + super::Death(inflictor, attacker, damageDealt, dir, absImpactPos, hitBody); 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) -{ - 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..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); @@ -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..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; @@ -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; + if (isPlayer(eToucher)) { + CSPlayer pl = (CSPlayer)eToucher; pl.gflags |= GF_RESCUEZONE; return; } @@ -63,24 +62,16 @@ info_hostage_rescue::Touch(entity eToucher) return; } - NSTalkMonster hosty = (NSTalkMonster)other; + ncTalkMonster hosty = (ncTalkMonster)other; if (hosty.GetSolid() == SOLID_NOT) { return; } /* 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); - - /* 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/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/item_suit.qc b/src/server/item_suit.qc deleted file mode 100644 index 1ace710..0000000 --- a/src/server/item_suit.qc +++ /dev/null @@ -1,79 +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) -{ - 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; - - 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/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/player.qc b/src/server/player.qc deleted file mode 100644 index 8706f8b..0000000 --- a/src/server/player.qc +++ /dev/null @@ -1,36 +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 Weapons_Draw(player); - -void -CSEv_PlayerSwitchWeapon_i(int w) -{ - player pl = (player)self; - pl.activeweapon = w; - Weapons_Draw(pl); -} - -void -Player_Precache(void) -{ - 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); -} diff --git a/src/server/progs.src b/src/server/progs.src index b4647a3..73d8ff0 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -1,11 +1,13 @@ #pragma target fte_5768 //#pragma flag enable assumeint #pragma progs_dat "../../progs.dat" +#pragma forcecrc 54730 #define QWSSQC #define SERVER #define VALVE #define CSTRIKE + #define BULLETPENETRATION //#define BULLETPATTERNS @@ -16,45 +18,21 @@ ../../../src/botlib/botinfo.h ../../../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 -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 -item_suit.qc -../../../valve/src/server/items.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 -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/damage.qc -../../../valve/src/server/flashlight.qc -../../../valve/src/server/modelevent.qc - -spawn.qc - +../../../cstrike/src/server/server.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 53d441a..0000000 --- a/src/server/radio.h +++ /dev/null @@ -1,4 +0,0 @@ -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 71efdbd..46df00c 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 @@ -36,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); } } } @@ -115,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 7fa75f9..4baff6f 100644 --- a/src/server/server.qc +++ b/src/server/server.qc @@ -14,34 +14,9 @@ * 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 = spawn(CSSingleplayerRules); - } else { - if (cvar("fcs_deathmatch") == 1) { - g_grMode = spawn(CSDeathmatchRules); - } else { - g_grMode = spawn(CSMultiplayerRules); - } - } - - 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"); @@ -53,19 +28,4 @@ Game_Worldspawn(void) Sound_Precache("player.headshotarmor"); 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"); - - Weapons_Init(); - FX_Corpse_Init(); - - clientstat(STAT_MONEY, EV_INTEGER, player::money); - clientstat(STAT_PROGRESS, EV_FLOAT, player::progress); - - pointerstat(STAT_GAMETIME, EV_FLOAT, &g_cs_gametime); - pointerstat(STAT_GAMESTATE, EV_INTEGER, &g_cs_gamestate); } 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/server/game_rules.qc b/src/shared/CSProjectile.h old mode 100755 new mode 100644 similarity index 59% rename from src/server/game_rules.qc rename to src/shared/CSProjectile.h index 0375c53..e5bd3fa --- a/src/server/game_rules.qc +++ b/src/shared/CSProjectile.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 Marco Cawthorne + * 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 @@ -12,33 +12,26 @@ * 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 +class +CSProjectile:ncProjectile +{ +public: + void CSProjectile(void); + +#ifdef SERVER + virtual void HasExploded(void); + 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); + +private: + float m_flRangeModifier; + int m_iTotalPenetrations; + float m_flMaxThickness; +#endif }; - - diff --git a/src/shared/CSProjectile.qc b/src/shared/CSProjectile.qc new file mode 100644 index 0000000..5fba891 --- /dev/null +++ b/src/shared/CSProjectile.qc @@ -0,0 +1,249 @@ +/* + * 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. + */ + +void +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) +{ + m_flRangeModifier = rangeModifier; +} + +void +CSProjectile::SetPenetrationMaxThickness(float maxThickness) +{ + m_flMaxThickness = maxThickness; +} + +void +CSProjectile::SetPenetrationPower(int powerLevel) +{ + m_iTotalPenetrations = powerLevel; +} + +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"); + + ncPlayer pl = (ncPlayer)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 = (ncSurfacePropEntity)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, ncEntity 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 new file mode 100644 index 0000000..4faf2c4 --- /dev/null +++ b/src/shared/CSWeapon.qc @@ -0,0 +1,216 @@ +/* + * 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); +#endif + +class +CSWeapon:HLWeapon +{ +public: + void CSWeapon(void); + +#ifdef CLIENT + virtual void AddedToInventory(void); + virtual void UpdateGUI(void); +#endif + + virtual bool CanFire(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 +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::FiredWeaponAttack(string defName) +{ + CSPlayer ourOwner = (CSPlayer)owner; + + if (GetSubDefBool(defName, "csWeaponMode") == false) { + super::FiredWeaponAttack(defName); + return; + } + + + + /* 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) { + bulletSpread = [random(-1,1) * 0.1,random(-1,1) * 0.05]; + } + + for (int i = 0i; i < numProjectiles; i++) { + CSProjectile_SpawnDef(traceInfo, ourOwner, flRangeModifier, flPenetrationPower, bulletSpread); + } +#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::Release(void) +{ + owner.v_angle = input_angles; + Cstrike_ShotMultiplierUpdate((CSPlayer)owner); + input_angles = owner.v_angle; + 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) +{ + 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 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..4728056 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(HLPlayer 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(HLPlayer 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(HLPlayer 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(HLPlayer pl, float botanim, float timer) { pl.anim_bottom = botanim; } diff --git a/src/shared/weapons.qc b/src/shared/buying.h similarity index 54% rename from src/shared/weapons.qc rename to src/shared/buying.h index 09e9e08..c039799 100644 --- a/src/shared/weapons.qc +++ b/src/shared/buying.h @@ -14,51 +14,45 @@ * 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) +/* Weapon Indices for the weapon table */ +typedef enum { - 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 + 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 ef1006a..17f8d17 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -16,16 +16,14 @@ #include "animations.h" #include "radio.h" -#include "weapons.h" -#include "items.h" +#include "buying.h" #include "entities.h" #include "events.h" -#include "pmove.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/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 1cea513..c31d7a8 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -1,47 +1,16 @@ #includelist -flags.h -player.h -../../../valve/src/shared/weapon_common.h -animations.h -animations.qc - -item_c4bomb.h - -../../../valve/src/shared/fx_blood.qc -../../../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 +../../../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 +../../../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 +../../../cstrike/src/shared/CSWeapon.qc #endlist diff --git a/src/shared/item_c4bomb.h b/src/shared/item_c4bomb.h index 5cbdae3..33a2dbd 100644 --- a/src/shared/item_c4bomb.h +++ b/src/shared/item_c4bomb.h @@ -1,6 +1,18 @@ -#ifdef SERVER -void C4Bomb_Plant(NSClientPlayer); -#endif +/* + * 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; diff --git a/src/shared/item_c4bomb.qc b/src/shared/item_c4bomb.qc index ce4c12e..1fc0e0f 100644 --- a/src/shared/item_c4bomb.qc +++ b/src/shared/item_c4bomb.qc @@ -14,18 +14,12 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -class item_c4:NSRenderableEntity +class CSBombEntity:ncRenderableEntity { -#ifdef SERVER - entity m_eUser; - float m_flBeepTime; - float m_flExplodeTime; - float m_flDefusalState; -#endif +public: + void CSBombEntity(void); #ifdef SERVER - void item_c4(void); - virtual void Spawned(void); virtual float SendEntity(entity, float); virtual void ClearProgress(void); @@ -35,14 +29,21 @@ class item_c4:NSRenderableEntity #endif #ifdef CLIENT - void item_c4(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 -item_c4::item_c4(void) +CSBombEntity::CSBombEntity(void) { #ifdef SERVER m_eUser = __NULL__; @@ -54,7 +55,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 +69,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 +96,11 @@ 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) { @@ -110,27 +109,25 @@ item_c4::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; /* tracked stat */ pl.progress = m_flDefusalState; - pl.flags |= FL_FROZEN; - - g_cs_bombbeingdefused = TRUE; + pl.AddVFlags(VFL_FROZEN); + 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; } @@ -138,12 +135,13 @@ item_c4::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, ""); + //Damage_Radius(origin, this.real_owner, 500, g_cstrike_bombradius, false, WEAPON_C4BOMB); + - /* 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); StartSoundDef("weapon_c4bomb.explode", CHAN_VOICE, true); for (entity e = world; (e = find(e, ::classname, "func_bomb_target"));) { @@ -151,7 +149,7 @@ item_c4::Logic(void) if (dist < bestDist) { bestDist = dist; - bestTarget = (NSEntity)e; + bestTarget = (ncEntity)e; } } @@ -183,17 +181,17 @@ item_c4::Logic(void) } void -item_c4::OnRemoveEntity(void) +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 -item_c4::Spawned(void) +CSBombEntity::Spawned(void) { super::Spawned(); @@ -208,33 +206,14 @@ 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); + serverinfo.SetBool("cs_bombplanted", 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 +245,7 @@ item_c4::DrawLED(void) } float -item_c4::predraw(void) +CSBombEntity::predraw(void) { DrawLED(); addentity(this); @@ -276,8 +255,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 deleted file mode 100644 index 2974ed5..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_LONGJUMP 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_NIGHTVISION 0x40000000i -#define ITEM_HELMET 0x80000000i diff --git a/src/shared/player.h b/src/shared/player.h index 7cf1c50..b628127 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -14,145 +14,62 @@ * 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 **/ +ncEntity +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 (ncEntity)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. + * */ +ncEntity +GetBombsiteByIndex(int index) +{ + return GetEntityByNameAndIndex("func_bomb_target", index); +} + +/** @brief Get Escape Zone entity by index **/ +ncEntity +GetEscapeZoneByIndex(int index) +{ + return GetEntityByNameAndIndex("func_escapezone", index); +} + +/** @brief Get VIP Safety Zone entity by index **/ +ncEntity +GetVIPSafetyZoneByIndex(int index) +{ + return GetEntityByNameAndIndex("func_vip_safetyzone", index); +} /* all potential SendFlags bits we can possibly send */ 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:HLPlayer { 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) + void CSPlayer(void); PREDICTED_FLOAT(cs_shotmultiplier) PREDICTED_FLOAT(cs_shottime) @@ -160,18 +77,11 @@ class player:NSClientPlayer 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 Physics_Fall(float); + virtual void Physics_Jump(void); + virtual void Physics_InputPreMove(void); - virtual float(void) Physics_MaxSpeed; - virtual void(float) Physics_Fall; - virtual void(void) Physics_Jump; - - virtual void(void) Physics_InputPostMove; - virtual void UpdatePlayerAnimation(float); + virtual void Physics_InputPostMove(void); #ifdef CLIENT int playertype; @@ -180,16 +90,29 @@ class player: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); #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; @@ -200,186 +123,117 @@ class player:NSClientPlayer bool m_seenEnemy; 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 }; -float punchangle_recovery(float punchangle) { +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 +} + +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 -player::Physics_InputPostMove(void) +CSPlayer::Physics_InputPostMove(void) { //start of this function is taken from super::Physics_InputPostMove 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); + RemoveVFlags(VFL_FROZEN); + RemoveVFlags(VFL_NOATTACK); - RemoveFlags(FL_FROZEN); - -#ifdef SERVER - if (g_cs_gamestate == GAME_FREEZE) { -#else - if (getstati(STAT_GAMESTATE) == GAME_FREEZE) { -#endif - flags |= FL_FROZEN; + 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(player); -void Animation_TimerUpdate(player, float); - -void -player::UpdatePlayerAnimation(float timelength) -{ - /* calculate our skeletal progression */ - Animation_PlayerUpdate(this); - /* advance animation timers */ - Animation_TimerUpdate(this, timelength); -} - #ifdef CLIENT -void Camera_RunPosBob(vector angles, __inout vector camera_pos); -void Camera_StrafeRoll(__inout vector camera_angle); -void Shake_Update(NSClientPlayer); -void -player::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(player, int); - -void -player::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 = 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 Weapons_AmmoUpdate(entity); -void HUD_AmmoNotify_Check(player pl); /* ================= -player::ReceiveEntity +CSPlayer::ReceiveEntity ================= */ void -player::ReceiveEntity(float flIsNew, float flChanged) +CSPlayer::ReceiveEntity(float flIsNew, float flChanged) { - NSClientPlayer::ReceiveEntity(flIsNew, flChanged); + ncPlayer::ReceiveEntity(flIsNew, flChanged); /* animation */ READENTITY_BYTE(anim_top, PLAYER_TOPFRAME) @@ -387,241 +241,499 @@ 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) 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) } /* ================= -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) 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 -player::ServerInputFrame(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) +{ + ncEntity e = __NULL__; + e = (ncEntity)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) +{ + ncEntity 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) +{ + ncEntity 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) +{ + ncEntity 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) +{ + ncEntity e = __NULL__; + + e = (ncEntity)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(ncNavInfo::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 */ + ncEntity e = (ncEntity)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) { 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 +743,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 +757,14 @@ player::SendEntity(entity ePEnt, float flChanged) flChanged = OptimiseChangedFlags(ePEnt, flChanged); - WriteByte(MSG_ENTITY, ENT_PLAYER); - WriteFloat(MSG_ENTITY, flChanged); - - NSClientPlayer::SendEntity(ePEnt, flChanged); + ncPlayer::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) @@ -702,3 +773,52 @@ player::SendEntity(entity ePEnt, float flChanged) return (1); } #endif + +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; + + /* 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 */ + ncDict damageDecl = spawn(ncDict); + 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.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 deleted file mode 100644 index 83b824e..0000000 --- a/src/shared/pmove.qc +++ /dev/null @@ -1,152 +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. - */ - -.float waterlevel; -.float watertype; - -/* values courtesy of https://wiki.alliedmods.net/Cs_weapons_information */ -float -player::Physics_MaxSpeed(void) -{ - float spd = serverkeyfloat("phy_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: - } - - if (flags & FL_CROUCHING) { - spd *= 0.5f; - } - - return spd; -} - -void -player::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 -player::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/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/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/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 deleted file mode 100644 index 0ccf943..0000000 --- a/src/shared/weapons.h +++ /dev/null @@ -1,62 +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, - 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/src/shared/weapons_cstrike.qc b/src/shared/weapons_cstrike.qc index 5f1e4af..aa6332f 100644 --- a/src/shared/weapons_cstrike.qc +++ b/src/shared/weapons_cstrike.qc @@ -33,20 +33,8 @@ 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(player pl) -{ - return WPNTYPE_RANGED; -} - -weapontype_t -csweapon_melee_type(player 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 +49,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 +57,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); @@ -150,11 +138,9 @@ 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 +165,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 +178,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 +189,15 @@ 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) -{ - player pl = (player)self; - pl.punchangle[1] *= 0.95; - Cstrike_ShotMultiplierUpdate(pl); -} - -void -w_cstrke_switched(player 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/cfg/skill_manifest.cfg b/zpak001.pk3dir/cfg/skill_manifest.cfg deleted file mode 100644 index 5ed9b95..0000000 --- a/zpak001.pk3dir/cfg/skill_manifest.cfg +++ /dev/null @@ -1,2 +0,0 @@ -exec "skill.cfg" -exec "skill_cstrike.cfg" \ No newline at end of file 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/weapons.def b/zpak001.pk3dir/def/weapons.def deleted file mode 100644 index e69de29..0000000 diff --git a/zpak001.pk3dir/default.cfg b/zpak001.pk3dir/default.cfg deleted file mode 100644 index f520110..0000000 --- a/zpak001.pk3dir/default.cfg +++ /dev/null @@ -1,90 +0,0 @@ -// 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 diff --git a/zpak001.pk3dir/scripts/constants.txt b/zpak001.pk3dir/scripts/constants.txt deleted file mode 100644 index 0438b01..0000000 --- a/zpak001.pk3dir/scripts/constants.txt +++ /dev/null @@ -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