From fb1a682ecc5b459a06472e178e16798f4b1cc3f2 Mon Sep 17 00:00:00 2001 From: Farukh Khan <19107369@student.curtin.edu.au> Date: Fri, 1 Dec 2017 20:23:11 +0600 Subject: [PATCH] Initial Source Upload Initial Promod Source Code Upload --- 7za.exe | Bin 0 -> 587776 bytes ...s to the Public for Call of Duty 4-PC).doc | Bin 0 -> 48640 bytes LICENSE | 21 - LICENSE.md | 41 + compile.bat | 20 + compile_fastfile.bat | 32 + images/rank_rec1.iwi | Bin 0 -> 11052 bytes images/rank_sgt1.iwi | Bin 0 -> 11052 bytes ...~80s_econ_glass_spc-rgb&80s_e~29444396.iwi | Bin 0 -> 44 bytes localizedstrings/cgame.str | 16 + maps/createfx/mp_backlot_fx.gsc | 2 + maps/createfx/mp_bloc_fx.gsc | 2 + maps/createfx/mp_bog_fx.gsc | 2 + maps/createfx/mp_broadcast_fx.gsc | 2 + maps/createfx/mp_carentan_fx.gsc | 2 + maps/createfx/mp_cargoship_fx.gsc | 2 + maps/createfx/mp_citystreets_fx.gsc | 2 + maps/createfx/mp_convoy_fx.gsc | 2 + maps/createfx/mp_countdown_fx.gsc | 2 + maps/createfx/mp_crash_fx.gsc | 2 + maps/createfx/mp_crash_snow_fx.gsc | 2 + maps/createfx/mp_creek_fx.gsc | 2 + maps/createfx/mp_crossfire_fx.gsc | 2 + maps/createfx/mp_farm_fx.gsc | 2 + maps/createfx/mp_killhouse_fx.gsc | 2 + maps/createfx/mp_overgrown_fx.gsc | 2 + maps/createfx/mp_pipeline_fx.gsc | 2 + maps/createfx/mp_shipment_fx.gsc | 2 + maps/createfx/mp_showdown_fx.gsc | 2 + maps/createfx/mp_strike_fx.gsc | 2 + maps/createfx/mp_vacant_fx.gsc | 2 + maps/mp/_destructible.gsc | 210 + maps/mp/_explosive_barrels.gsc | 430 ++ maps/mp/_flashgrenades.gsc | 143 + maps/mp/_load.gsc | 223 + maps/mp/gametypes/_class.gsc | 201 + maps/mp/gametypes/_gameobjects.gsc | 1456 +++++++ maps/mp/gametypes/_globallogic.gsc | 3678 +++++++++++++++++ maps/mp/gametypes/_healthoverlay.gsc | 194 + maps/mp/gametypes/_hud.gsc | 84 + maps/mp/gametypes/_hud_message.gsc | 676 +++ maps/mp/gametypes/_killcam.gsc | 211 + maps/mp/gametypes/_menus.gsc | 239 ++ maps/mp/gametypes/_missions.gsc | 11 + maps/mp/gametypes/_promod.gsc | 623 +++ maps/mp/gametypes/_quickmessages.gsc | 269 ++ maps/mp/gametypes/_rank.gsc | 167 + maps/mp/gametypes/_scoreboard.gsc | 62 + maps/mp/gametypes/_spawnlogic.gsc | 701 ++++ maps/mp/gametypes/_spectating.gsc | 132 + maps/mp/gametypes/_teams.gsc | 190 + maps/mp/gametypes/_weapons.gsc | 315 ++ maps/mp/gametypes/dm.gsc | 67 + maps/mp/gametypes/dom.gsc | 627 +++ maps/mp/gametypes/koth.gsc | 709 ++++ maps/mp/gametypes/sab.gsc | 625 +++ maps/mp/gametypes/sd.gsc | 584 +++ maps/mp/gametypes/war.gsc | 96 + maps/mp/mp_backlot.gsc | 24 + maps/mp/mp_bloc.gsc | 24 + maps/mp/mp_bog.gsc | 24 + maps/mp/mp_broadcast.gsc | 24 + maps/mp/mp_carentan.gsc | 24 + maps/mp/mp_cargoship.gsc | 24 + maps/mp/mp_citystreets.gsc | 26 + maps/mp/mp_convoy.gsc | 24 + maps/mp/mp_countdown.gsc | 24 + maps/mp/mp_crash.gsc | 24 + maps/mp/mp_crash_snow.gsc | 24 + maps/mp/mp_creek.gsc | 24 + maps/mp/mp_crossfire.gsc | 24 + maps/mp/mp_farm.gsc | 24 + maps/mp/mp_killhouse.gsc | 24 + maps/mp/mp_overgrown.gsc | 24 + maps/mp/mp_pipeline.gsc | 24 + maps/mp/mp_shipment.gsc | 24 + maps/mp/mp_showdown.gsc | 24 + maps/mp/mp_strike.gsc | 24 + maps/mp/mp_vacant.gsc | 24 + mod.csv | 124 + mp/playeranim.script | 1558 +++++++ pb/pbsvuser.cfg | 2 + pb/promod_iwd_md5.cfg | 1 + pb/stock_iwd_md5.cfg | 14 + promod/client.gsc | 92 + promod/comp.gsc | 189 + promod/customStatsTable.csv | 81 + promod/destructible.csv | 31 + promod/dvarmon.gsc | 58 + promod/messagecenter.gsc | 199 + promod/modes.gsc | 342 ++ promod/readyup.gsc | 376 ++ promod/scorebot.gsc | 73 + promod/servercheck.gsc | 160 + promod/setvariables.gsc | 36 + promod/shoutcast.gsc | 147 + promod/stratmode.gsc | 495 +++ promod/strattime.gsc | 129 + promod/timeout.gsc | 144 + promod_ruleset/custom_public.gsc | 229 + readme.txt | 366 ++ server.cfg | 35 + server_setup.txt | 28 + shock/damage_mp.shock | 60 + sound/promod/defused.wav | Bin 0 -> 71656 bytes sound/promod/destroyed.wav | Bin 0 -> 60408 bytes sound/promod/planted.wav | Bin 0 -> 65158 bytes soundaliases/promod.csv | 4 + ui_mp/cac_ingame.inc | 436 ++ ui_mp/cac_loadout_ingame.inc | 52 + ui_mp/connect.menu | 44 + ui_mp/controls_multi.menu | 73 + ui_mp/hud.menu | 1216 ++++++ ui_mp/main.menu | 243 ++ ui_mp/options_multi.menu | 67 + ui_mp/promod.txt | 18 + ui_mp/scoreboard.inc | 76 + ui_mp/scriptmenus/changeclass_marines_mw.menu | 105 + ui_mp/scriptmenus/changeclass_mw.menu | 42 + ui_mp/scriptmenus/changeclass_opfor_mw.menu | 105 + ui_mp/scriptmenus/class.menu | 149 + ui_mp/scriptmenus/demo.menu | 72 + ui_mp/scriptmenus/echo.menu | 0 ui_mp/scriptmenus/quickpromod.menu | 155 + ui_mp/scriptmenus/quickpromodgfx.menu | 229 + ui_mp/scriptmenus/scoreboard.menu | 322 ++ ui_mp/scriptmenus/shoutcast.menu | 83 + ui_mp/scriptmenus/shoutcast_map.menu | 65 + ui_mp/scriptmenus/shoutcast_setup.inc | 23 + ui_mp/scriptmenus/shoutcast_setup.menu | 115 + ui_mp/scriptmenus/shoutcast_setup_binds.menu | 91 + ui_mp/scriptmenus/team_marinesopfor.menu | 150 + .../team_marinesopfor_flipped.menu | 150 + ui_mp/tactical_map.inc | 98 + ui_mp/tactical_map_s.inc | 79 + ui_mp/wm_quickmessage.menu | 131 + weapons/mp/ak47_mp | 7 + weapons/mp/ak47_silencer_mp | 5 + weapons/mp/ak74u_mp | 7 + weapons/mp/ak74u_silencer_mp | 5 + weapons/mp/beretta_mp | 4 + weapons/mp/beretta_silencer_mp | 4 + weapons/mp/colt45_mp | 5 + weapons/mp/colt45_silencer_mp | 5 + weapons/mp/deserteagle_mp | 5 + weapons/mp/deserteaglegold_mp | 5 + weapons/mp/flash_grenade_mp | 1 + weapons/mp/frag_grenade_mp | 1 + weapons/mp/frag_grenade_short_mp | 1 + weapons/mp/g36c_mp | 7 + weapons/mp/g36c_silencer_mp | 5 + weapons/mp/g3_mp | 7 + weapons/mp/g3_silencer_mp | 5 + weapons/mp/m1014_mp | 5 + weapons/mp/m14_mp | 8 + weapons/mp/m14_silencer_mp | 6 + weapons/mp/m16_mp | 6 + weapons/mp/m16_silencer_mp | 5 + weapons/mp/m40a3_mp | 5 + weapons/mp/m4_mp | 7 + weapons/mp/m4_silencer_mp | 5 + weapons/mp/mp44_mp | 5 + weapons/mp/mp5_mp | 6 + weapons/mp/mp5_silencer_mp | 4 + weapons/mp/radar_mp | 1 + weapons/mp/remington700_mp | 5 + weapons/mp/smoke_grenade_mp | 1 + weapons/mp/usp_mp | 7 + weapons/mp/usp_silencer_mp | 5 + weapons/mp/uzi_mp | 7 + weapons/mp/uzi_silencer_mp | 5 + weapons/mp/winchester1200_mp | 7 + xmodel/com_floodlight_on | Bin 0 -> 95326 bytes 173 files changed, 23121 insertions(+), 21 deletions(-) create mode 100644 7za.exe create mode 100644 End User License Agreement (Release of Map Tools to the Public for Call of Duty 4-PC).doc delete mode 100644 LICENSE create mode 100644 LICENSE.md create mode 100644 compile.bat create mode 100644 compile_fastfile.bat create mode 100644 images/rank_rec1.iwi create mode 100644 images/rank_sgt1.iwi create mode 100644 images/~80s_econ_glass_spc-rgb&80s_e~29444396.iwi create mode 100644 localizedstrings/cgame.str create mode 100644 maps/createfx/mp_backlot_fx.gsc create mode 100644 maps/createfx/mp_bloc_fx.gsc create mode 100644 maps/createfx/mp_bog_fx.gsc create mode 100644 maps/createfx/mp_broadcast_fx.gsc create mode 100644 maps/createfx/mp_carentan_fx.gsc create mode 100644 maps/createfx/mp_cargoship_fx.gsc create mode 100644 maps/createfx/mp_citystreets_fx.gsc create mode 100644 maps/createfx/mp_convoy_fx.gsc create mode 100644 maps/createfx/mp_countdown_fx.gsc create mode 100644 maps/createfx/mp_crash_fx.gsc create mode 100644 maps/createfx/mp_crash_snow_fx.gsc create mode 100644 maps/createfx/mp_creek_fx.gsc create mode 100644 maps/createfx/mp_crossfire_fx.gsc create mode 100644 maps/createfx/mp_farm_fx.gsc create mode 100644 maps/createfx/mp_killhouse_fx.gsc create mode 100644 maps/createfx/mp_overgrown_fx.gsc create mode 100644 maps/createfx/mp_pipeline_fx.gsc create mode 100644 maps/createfx/mp_shipment_fx.gsc create mode 100644 maps/createfx/mp_showdown_fx.gsc create mode 100644 maps/createfx/mp_strike_fx.gsc create mode 100644 maps/createfx/mp_vacant_fx.gsc create mode 100644 maps/mp/_destructible.gsc create mode 100644 maps/mp/_explosive_barrels.gsc create mode 100644 maps/mp/_flashgrenades.gsc create mode 100644 maps/mp/_load.gsc create mode 100644 maps/mp/gametypes/_class.gsc create mode 100644 maps/mp/gametypes/_gameobjects.gsc create mode 100644 maps/mp/gametypes/_globallogic.gsc create mode 100644 maps/mp/gametypes/_healthoverlay.gsc create mode 100644 maps/mp/gametypes/_hud.gsc create mode 100644 maps/mp/gametypes/_hud_message.gsc create mode 100644 maps/mp/gametypes/_killcam.gsc create mode 100644 maps/mp/gametypes/_menus.gsc create mode 100644 maps/mp/gametypes/_missions.gsc create mode 100644 maps/mp/gametypes/_promod.gsc create mode 100644 maps/mp/gametypes/_quickmessages.gsc create mode 100644 maps/mp/gametypes/_rank.gsc create mode 100644 maps/mp/gametypes/_scoreboard.gsc create mode 100644 maps/mp/gametypes/_spawnlogic.gsc create mode 100644 maps/mp/gametypes/_spectating.gsc create mode 100644 maps/mp/gametypes/_teams.gsc create mode 100644 maps/mp/gametypes/_weapons.gsc create mode 100644 maps/mp/gametypes/dm.gsc create mode 100644 maps/mp/gametypes/dom.gsc create mode 100644 maps/mp/gametypes/koth.gsc create mode 100644 maps/mp/gametypes/sab.gsc create mode 100644 maps/mp/gametypes/sd.gsc create mode 100644 maps/mp/gametypes/war.gsc create mode 100644 maps/mp/mp_backlot.gsc create mode 100644 maps/mp/mp_bloc.gsc create mode 100644 maps/mp/mp_bog.gsc create mode 100644 maps/mp/mp_broadcast.gsc create mode 100644 maps/mp/mp_carentan.gsc create mode 100644 maps/mp/mp_cargoship.gsc create mode 100644 maps/mp/mp_citystreets.gsc create mode 100644 maps/mp/mp_convoy.gsc create mode 100644 maps/mp/mp_countdown.gsc create mode 100644 maps/mp/mp_crash.gsc create mode 100644 maps/mp/mp_crash_snow.gsc create mode 100644 maps/mp/mp_creek.gsc create mode 100644 maps/mp/mp_crossfire.gsc create mode 100644 maps/mp/mp_farm.gsc create mode 100644 maps/mp/mp_killhouse.gsc create mode 100644 maps/mp/mp_overgrown.gsc create mode 100644 maps/mp/mp_pipeline.gsc create mode 100644 maps/mp/mp_shipment.gsc create mode 100644 maps/mp/mp_showdown.gsc create mode 100644 maps/mp/mp_strike.gsc create mode 100644 maps/mp/mp_vacant.gsc create mode 100644 mod.csv create mode 100644 mp/playeranim.script create mode 100644 pb/pbsvuser.cfg create mode 100644 pb/promod_iwd_md5.cfg create mode 100644 pb/stock_iwd_md5.cfg create mode 100644 promod/client.gsc create mode 100644 promod/comp.gsc create mode 100644 promod/customStatsTable.csv create mode 100644 promod/destructible.csv create mode 100644 promod/dvarmon.gsc create mode 100644 promod/messagecenter.gsc create mode 100644 promod/modes.gsc create mode 100644 promod/readyup.gsc create mode 100644 promod/scorebot.gsc create mode 100644 promod/servercheck.gsc create mode 100644 promod/setvariables.gsc create mode 100644 promod/shoutcast.gsc create mode 100644 promod/stratmode.gsc create mode 100644 promod/strattime.gsc create mode 100644 promod/timeout.gsc create mode 100644 promod_ruleset/custom_public.gsc create mode 100644 readme.txt create mode 100644 server.cfg create mode 100644 server_setup.txt create mode 100644 shock/damage_mp.shock create mode 100644 sound/promod/defused.wav create mode 100644 sound/promod/destroyed.wav create mode 100644 sound/promod/planted.wav create mode 100644 soundaliases/promod.csv create mode 100644 ui_mp/cac_ingame.inc create mode 100644 ui_mp/cac_loadout_ingame.inc create mode 100644 ui_mp/connect.menu create mode 100644 ui_mp/controls_multi.menu create mode 100644 ui_mp/hud.menu create mode 100644 ui_mp/main.menu create mode 100644 ui_mp/options_multi.menu create mode 100644 ui_mp/promod.txt create mode 100644 ui_mp/scoreboard.inc create mode 100644 ui_mp/scriptmenus/changeclass_marines_mw.menu create mode 100644 ui_mp/scriptmenus/changeclass_mw.menu create mode 100644 ui_mp/scriptmenus/changeclass_opfor_mw.menu create mode 100644 ui_mp/scriptmenus/class.menu create mode 100644 ui_mp/scriptmenus/demo.menu create mode 100644 ui_mp/scriptmenus/echo.menu create mode 100644 ui_mp/scriptmenus/quickpromod.menu create mode 100644 ui_mp/scriptmenus/quickpromodgfx.menu create mode 100644 ui_mp/scriptmenus/scoreboard.menu create mode 100644 ui_mp/scriptmenus/shoutcast.menu create mode 100644 ui_mp/scriptmenus/shoutcast_map.menu create mode 100644 ui_mp/scriptmenus/shoutcast_setup.inc create mode 100644 ui_mp/scriptmenus/shoutcast_setup.menu create mode 100644 ui_mp/scriptmenus/shoutcast_setup_binds.menu create mode 100644 ui_mp/scriptmenus/team_marinesopfor.menu create mode 100644 ui_mp/scriptmenus/team_marinesopfor_flipped.menu create mode 100644 ui_mp/tactical_map.inc create mode 100644 ui_mp/tactical_map_s.inc create mode 100644 ui_mp/wm_quickmessage.menu create mode 100644 weapons/mp/ak47_mp create mode 100644 weapons/mp/ak47_silencer_mp create mode 100644 weapons/mp/ak74u_mp create mode 100644 weapons/mp/ak74u_silencer_mp create mode 100644 weapons/mp/beretta_mp create mode 100644 weapons/mp/beretta_silencer_mp create mode 100644 weapons/mp/colt45_mp create mode 100644 weapons/mp/colt45_silencer_mp create mode 100644 weapons/mp/deserteagle_mp create mode 100644 weapons/mp/deserteaglegold_mp create mode 100644 weapons/mp/flash_grenade_mp create mode 100644 weapons/mp/frag_grenade_mp create mode 100644 weapons/mp/frag_grenade_short_mp create mode 100644 weapons/mp/g36c_mp create mode 100644 weapons/mp/g36c_silencer_mp create mode 100644 weapons/mp/g3_mp create mode 100644 weapons/mp/g3_silencer_mp create mode 100644 weapons/mp/m1014_mp create mode 100644 weapons/mp/m14_mp create mode 100644 weapons/mp/m14_silencer_mp create mode 100644 weapons/mp/m16_mp create mode 100644 weapons/mp/m16_silencer_mp create mode 100644 weapons/mp/m40a3_mp create mode 100644 weapons/mp/m4_mp create mode 100644 weapons/mp/m4_silencer_mp create mode 100644 weapons/mp/mp44_mp create mode 100644 weapons/mp/mp5_mp create mode 100644 weapons/mp/mp5_silencer_mp create mode 100644 weapons/mp/radar_mp create mode 100644 weapons/mp/remington700_mp create mode 100644 weapons/mp/smoke_grenade_mp create mode 100644 weapons/mp/usp_mp create mode 100644 weapons/mp/usp_silencer_mp create mode 100644 weapons/mp/uzi_mp create mode 100644 weapons/mp/uzi_silencer_mp create mode 100644 weapons/mp/winchester1200_mp create mode 100644 xmodel/com_floodlight_on diff --git a/7za.exe b/7za.exe new file mode 100644 index 0000000000000000000000000000000000000000..7f6bf86bc43ed71decf8b03f54dcb9b2be143a24 GIT binary patch literal 587776 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%0DGup{JR5@0O76 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 literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 73d670d..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Farukh Khan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..0671b95 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,41 @@ +Copyright (c) 2009-2017 Andreas Göransson <andreas.goransson@gmail.com>
+Copyright (c) 2009-2017 Indrek Ardel <indrek@ardel.eu> + +--- + +THIS MATERIAL IS NOT MADE OR SUPPORTED BY ACTIVISION. + +Following excerpt is taken from CALL OF DUTY 4: MODERN WARFARE MAP MAKING TOOLS END USER SOFTWARE LICENSE AGREEMENT: + +> All New Game Materials created by you shall be exclusively owned by Activision and/or its licensors as a derivative work (as such term is described under U.S. copyright law) of the Program Utilities and Call of Duty 4: Modern Warfare and Activision and its licensors may use any New Game Materials made publicly available by you for any purpose whatsoever, including but not limited to, for purpose of advertising and promoting Call of Duty 4: Modern Warfare. + +> NO WARRANTIES/NO SUPPORT. THERE ARE NO WARRANTIES, WHETHER ORAL OR WRITTEN, EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, AND NO OTHER REPRESENTATIONS OR CLAIMS OF ANY KIND SHALL BE BINDING ON OR OBLIGATE ACTIVISION. THE PROGRAM UTILITIES ARE PROVIDED TO YOU “AS IS.†Activision does not provide technical or customer support for the Program Utilities or the New Game Materials created by using the Program Utilities. All use of such materials is at your own risk. + +Complete license can be found in `End User License Agreement (Release of Map Tools to the Public for Call of Duty 4-PC).doc`. + +--- + +In addition to license terms set by Activision for new game materials, you agree to Promod Modder Ethical Public License 1.0 (PModEPL) based on Modder Ethical Public License 1.0 (ModEPL by OpenWarfare Project) and the Simple Public License: + +The PModEPL applies to the mod assets required to produce a fully working copy of the mod but do not ship with the original game or its mod tools, including, but not limited to source code, menus, images, models. +You agree to the PModEPL by copying, distributing, hosting or making a derivative work of mod assets. + +You get the royalty free right to: + * Use the mod assets for any purpose; + * Make derivative works of it or combining assets during runtime (in both cases this is called a "Derived Work"); + * Host, copy and distribute it and any Derived Work. + +If you host, copy or distribute the mod assets or a Derived Work, you must give back to the community by: + * Prominently noting the date of any changes you make; + * Leaving other people's copyright notices, warranty disclaimers, and license terms in place; + * Providing these mod assets (including assets that are combined with the mod during runtime, but are not part of original game assets which can be obtained by purchasing a copy of the game) in a form that is easy to get and best to modify; + * Licensing it to everyone under PModEPL; + * Conspicuously announcing that it is available under that license. + +There are some things that you must shoulder: + * You get NO WARRANTIES. None of any kind; + * If the mod assets damage you in any way, you may only recover direct damages up to the amount you paid for it (that is zero if you did not pay anything). You may not recover any other damages, including those called "consequential damages." (The state or country where you live may not allow you to limit your liability in this way, so this may not apply to you). + +The PModEPL continues perpetually, except that your license rights end automatically if: +* You do not abide by the "give back to the community" terms (your licensees get to keep their rights if they abide); +* Anyone prevents you from distributing the mod assets under the terms of the PModEPL. diff --git a/compile.bat b/compile.bat new file mode 100644 index 0000000..71368aa --- /dev/null +++ b/compile.bat @@ -0,0 +1,20 @@ +:: Copyright (c) 2009-2017 Andreas Göransson +:: Copyright (c) 2009-2017 Indrek Ardel +:: +:: This file is part of Call of Duty 4 Promod. +:: +:: Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. +:: Terms of license can be found in LICENSE.md document bundled with the project. + +@echo off + +SET mod_name=pml220 +SET work_directory=%~dp0 +cd %work_directory% + +del ..\%mod_name%\*.iwd + +7za a -r -mx=9 -mpass=15 -mfb=258 -mmt=on -mtc=off -tzip ..\%mod_name%\%mod_name%.iwd weapons images sound +7za a -r -mx=9 -mpass=15 -mfb=258 -mmt=on -mtc=off -tzip ..\%mod_name%\z_c_r.iwd promod_ruleset + +compile_fastfile.bat diff --git a/compile_fastfile.bat b/compile_fastfile.bat new file mode 100644 index 0000000..38d3688 --- /dev/null +++ b/compile_fastfile.bat @@ -0,0 +1,32 @@ +:: Copyright (c) 2009-2017 Andreas Göransson +:: Copyright (c) 2009-2017 Indrek Ardel +:: +:: This file is part of Call of Duty 4 Promod. +:: +:: Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. +:: Terms of license can be found in LICENSE.md document bundled with the project. + +@echo off + +SET work_directory=%~dp0 +cd %work_directory% + +xcopy localizedstrings ..\..\raw\english\localizedstrings\ /SY +xcopy maps ..\..\raw\maps\ /SY +xcopy mp ..\..\raw\mp\ /SY +xcopy promod ..\..\raw\promod\ /SY +xcopy shock ..\..\raw\shock\ /SY +xcopy sound ..\..\raw\sound\ /SY +xcopy soundaliases ..\..\raw\soundaliases\ /SY +xcopy ui_mp ..\..\raw\ui_mp\ /SY +xcopy xmodel ..\..\raw\xmodel\ /SY + +copy mod.csv ..\..\zone_source /Y + +cd ..\..\bin +linker_pc.exe -language english -compress -cleanup mod -verbose + +cd ..\mods\pml220 +copy ..\..\zone\english\mod.ff + +pause diff --git a/images/rank_rec1.iwi b/images/rank_rec1.iwi new file mode 100644 index 0000000000000000000000000000000000000000..d61f0d59d390dcccb6ffca306e80e135174279e4 GIT binary patch literal 11052 zcmeI1O=uHA6vrnq^->F^kdv2!iGnS7YVqbOG}wy=ap}QI+Z794X>#kKqLGyLCWJyE z$4RTOI|bW4m_r34G=h52Q@qp;;r+S-;0*~2e0`;qtF|IM4X z?Hzqb>ktYwq5x`cLa4bGjw5gc5c~=Ue1?_CIGLQB^e`c0r>sv;WC*3yKL2-_qV@(9 zNJm1dl%Ys10S6IEM`{d)EA9d}qS4Ch!~N?~RF&}Uk{U4Yhfq|Lut*6yjNFKVjrRXL zMla1rV$xhFD`f)N6_Faz0sa6+gdRo?GXLBE?*+~EpNh>#dNnB{K6FD$s{DK zdiEUw|9{D5RhVFWqMELN{#gS01mg^b&%v~ZvHnls3z?^jpl+)kz5xCP_tWsZT>rP{A7~rYpQ6}O=dLeM z4>qlL*xU>2hsX*7Ydz-7?ZM;WVCaFZ|At-#Q9QYnyYaX+zEn^^@5N%+UhhY=3EX$N zv(x5+lERcuI`yE*Zhbhb48b_;7p;2npYT$Z>*ampi#~?!yytnI_}D-Gu*&%7D&zj^ zarWAu+hcF-QFi0i(W_Pef!=X4Da+&UTjR?E@lS03Hx>>%`j4u!%9Yi!qjz2L?(h5@ z(h9I&bn`=v2J;~y*!nYh%Exa0FvmH2?ZxfE?P2aeccu?le~w-){p+BA*!~N5-VVgq zR^uO;{z3lE{y(bf(BDylGMNQR6x}GSr@j&+816%Jp_P!6`%8cLnEn~3WZ?N^Q9u;sZLr8hU&IcyL4&SPWI5Ycj zd+>NL>%)Dk2TT8~-j@dlyZrk1^O?<;iG@~qZXDhhPC4P7jts&1geF%^`P*!74}Qiy bY0w98=X2)v;PLPu^kBUIm#~zcnaPvyDTeD) literal 0 HcmV?d00001 diff --git a/images/rank_sgt1.iwi b/images/rank_sgt1.iwi new file mode 100644 index 0000000000000000000000000000000000000000..02d894408b95767d0d3f522060065108b50c759b GIT binary patch literal 11052 zcmeI2L1+^}6ow}w2uTsrkzTS0p&LB3l|pmzBJIJ0@#4~C60FsVH-(a*H?giBq{nRH z!HZDvmMzjmum>*zJt%lFl|XG&^x#>udeGv!zS+&}CYxd_n%dSG*u$6E?CiXG|IB+c zo5)<;e*mFC6a~=8FhV1JaP5ODfZ$iSp!CZ|#Dc<^$jx8!X7?LJ3!%2>ZGp*+dcAI; z1VI5UHYRByigXH$5$Y{RQ89LVIEU$w%G!hW!zeCkm|8k=+D9lU74{fIe_Q>FA{>oN zIea>MX#yM|%*+%dkBBnIeIW6o&LBXzZ{j>ZhjGCl? zO|w+u>%BoLAqW@U_)oB~hwz7;tA`bzURQ_)>w8=LFBfnkKRSN+>=zyt#zNCe)xD3y{TS3 z%kLpNasN*kx2@ld2L`J8y|?poYk70^3he);(ceA=3dH}Z4Cv85{|uuV z=sySv0Jnb)&I3U2u3iNTdkBBneR?>$Zhc;`nlJ71{*#xdNZ0>>PN7wF-e9bZSwB!?k>&xSu#udUrYVxRv_rzzcd|6hx-^WUYVOiTU_ z>+m_66Rrzp_7V0F{_t=0z?Ww&mb3klr%PO)mNmMretC9lwxNX-eED3r-u?Rj33p%J A!~g&Q literal 0 HcmV?d00001 diff --git a/images/~80s_econ_glass_spc-rgb&80s_e~29444396.iwi b/images/~80s_econ_glass_spc-rgb&80s_e~29444396.iwi new file mode 100644 index 0000000000000000000000000000000000000000..350b93d21e7c5b2c0709b867568eafe69f19a7e5 GIT binary patch literal 44 lcmeYa&t&6eU;#o#1|0?l1{omc0pdUZ|NjRHfdP;O1^|-*2XX)a literal 0 HcmV?d00001 diff --git a/localizedstrings/cgame.str b/localizedstrings/cgame.str new file mode 100644 index 0000000..e963579 --- /dev/null +++ b/localizedstrings/cgame.str @@ -0,0 +1,16 @@ +// Copyright (c) 2009-2017 Andreas Göransson +// Copyright (c) 2009-2017 Indrek Ardel +// +// This file is part of Call of Duty 4 Promod. +// +// Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. +// Terms of license can be found in LICENSE.md document bundled with the project. + +VERSION "1" +CONFIG "C:\trees\cod3\cod3\bin\StringEd.cfg" +FILENOTES "" + +REFERENCE SPECTATORS +LANG_ENGLISH "Shoutcaster" + +ENDMARKER \ No newline at end of file diff --git a/maps/createfx/mp_backlot_fx.gsc b/maps/createfx/mp_backlot_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_backlot_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_bloc_fx.gsc b/maps/createfx/mp_bloc_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_bloc_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_bog_fx.gsc b/maps/createfx/mp_bog_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_bog_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_broadcast_fx.gsc b/maps/createfx/mp_broadcast_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_broadcast_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_carentan_fx.gsc b/maps/createfx/mp_carentan_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_carentan_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_cargoship_fx.gsc b/maps/createfx/mp_cargoship_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_cargoship_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_citystreets_fx.gsc b/maps/createfx/mp_citystreets_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_citystreets_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_convoy_fx.gsc b/maps/createfx/mp_convoy_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_convoy_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_countdown_fx.gsc b/maps/createfx/mp_countdown_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_countdown_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_crash_fx.gsc b/maps/createfx/mp_crash_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_crash_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_crash_snow_fx.gsc b/maps/createfx/mp_crash_snow_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_crash_snow_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_creek_fx.gsc b/maps/createfx/mp_creek_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_creek_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_crossfire_fx.gsc b/maps/createfx/mp_crossfire_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_crossfire_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_farm_fx.gsc b/maps/createfx/mp_farm_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_farm_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_killhouse_fx.gsc b/maps/createfx/mp_killhouse_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_killhouse_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_overgrown_fx.gsc b/maps/createfx/mp_overgrown_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_overgrown_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_pipeline_fx.gsc b/maps/createfx/mp_pipeline_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_pipeline_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_shipment_fx.gsc b/maps/createfx/mp_shipment_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_shipment_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_showdown_fx.gsc b/maps/createfx/mp_showdown_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_showdown_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_strike_fx.gsc b/maps/createfx/mp_strike_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_strike_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/createfx/mp_vacant_fx.gsc b/maps/createfx/mp_vacant_fx.gsc new file mode 100644 index 0000000..afca4a5 --- /dev/null +++ b/maps/createfx/mp_vacant_fx.gsc @@ -0,0 +1,2 @@ +//_createfx generated. Do not touch!! +main(){} \ No newline at end of file diff --git a/maps/mp/_destructible.gsc b/maps/mp/_destructible.gsc new file mode 100644 index 0000000..6352ab5 --- /dev/null +++ b/maps/mp/_destructible.gsc @@ -0,0 +1,210 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + filename = "promod/destructible.csv"; + level.destructible_effects = []; + for(i=0;i<8;i++) + level.destructible_effects[tablelookup(filename, 0, i, 1)] = LoadFX(tablelookup(filename, 0, i, 2)); + + level.destructible_breakable_objects = []; + for(i=8;i<22;i++) + level.destructible_breakable_objects[tablelookup(filename, 0, i, 1)] = 1; + + entities = getentarray("destructible", "targetname"); + for(i=0;i 0) + { + self.damageOwner = attacker; + self.damageTaken += damage; + } + } + } + + if(self.damageTaken > 250 && smk) + { + smk = false; + self thread smoke(); + } + if(self.damageTaken > 550 && brn) + { + brn = false; + self thread burn(); + } + } +} + +breakpart(partname) +{ + switch(partname) + { + case "tag_glass_left_front": + case "tag_glass_right_front": + case "tag_glass_left_back": + case "tag_glass_right_back": + case "tag_glass_front": + case "tag_glass_back": + case "tag_glass_left_back2": + case "tag_glass_right_back2": + self playsound("veh_glass_break_large"); + fx = "medium"; + if(strtok(partname, "_").size == 3) + fx = "large"; + playfxontag(level.destructible_effects["car_glass_"+fx], self, partname+"_fx"); + self hidepart(partname); + break; + case "tag_light_left_front": + case "tag_light_right_front": + case "tag_light_left_back": + case "tag_light_right_back": + self playsound("veh_glass_break_small"); + playfxontag(level.destructible_effects["light_"+strtok(partname, "_")[3]], self, partname); + self hidepart(partname); + self showpart(partname+"_d"); + break; + case "tag_mirror_left": + case "tag_mirror_right": + self hidepart(partname); + physicsobject = spawn("script_model", self gettagorigin(partname)); + physicsobject.angles = self gettagangles(partname); + s = "R"; + if(getsubstr(partname, 11, 12) == "l") s = "L"; + physicsobject setmodel(self.destructible_type+"_mirror_"+s); + physicsobject physicslaunch(self gettagorigin(partname), vectornormalize(self gettagorigin(partname)) * 200); + physicsobject thread deleteovertime(); + break; + } +} + +deleteovertime() +{ + wait 5; + self delete(); +} + +smoke() +{ + self endon("explosion"); + + for(fx="white_smoke";;) + { + if(self.damageTaken > 550) + fx = "black_smoke_fire"; + else if(self.damageTaken > 450) + fx = "black_smoke"; + + playfxontag(level.destructible_effects[fx], self, "tag_hood_fx"); + wait 0.4; + } +} + +burn() +{ + self endon("explosion"); + + self playsound("fire_vehicle_flareup_med"); + self playloopsound("fire_vehicle_med"); + + for(;self.damageTaken < 1250;wait 0.2) + self.damageTaken += 12; +} + +explosion() +{ + while(self.damageTaken < 1250) + wait 0.05; + + self stoploopsound("fire_vehicle_med"); + + self notify("explosion"); + + self playsound("car_explode"); + playfxontag(level.destructible_effects["small_vehicle_explosion"], self, "tag_death_fx"); + origin = self.origin+(0, 0, 80); + rng = 250; + if(getsubstr(self.destructible_type, 0, 19) == "vehicle_80s_sedan1_") + rng = 375; + if(isdefined(self.damageOwner)) + self radiusdamage(origin, rng, 300, 20, self.damageOwner); + else + self radiusdamage(origin, rng, 300, 20); + + self movez(16, 0.3, 0, 0.2); + self rotatepitch(10, 0.3, 0, 0.2); + self setmodel(self.destructible_type+"_destroyed"); + wait 0.3; + self movez(-16, 0.3, 0.15, 0); + self rotatepitch(-10, 0.3, 0.15, 0); +} \ No newline at end of file diff --git a/maps/mp/_explosive_barrels.gsc b/maps/mp/_explosive_barrels.gsc new file mode 100644 index 0000000..67f0d1b --- /dev/null +++ b/maps/mp/_explosive_barrels.gsc @@ -0,0 +1,430 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + qBarrels = false; + barrels = getentarray ("explodable_barrel","targetname"); + if ( (isdefined(barrels)) && (barrels.size > 0) ) + qBarrels = true; + barrels = getentarray ("explodable_barrel","script_noteworthy"); + if ( (isdefined(barrels)) && (barrels.size > 0) ) + qBarrels = true; + if (qBarrels) + { + level.breakables_fx["barrel"]["explode"] = loadfx ("props/barrelExp"); + level.breakables_fx["barrel"]["burn_start"] = loadfx ("props/barrel_ignite"); + level.breakables_fx["barrel"]["burn"] = loadfx ("props/barrel_fire_top"); + } + oilspill = getentarray ("oil_spill","targetname"); + if(isdefined(oilspill) && oilspill.size > 0) + { + level.breakables_fx["oilspill"]["burn"] = loadfx ("props/barrel_fire"); + level.breakables_fx["oilspill"]["spark"] = loadfx("impacts/small_metalhit_1"); + } + + level.barrelExpSound = "explo_metal_rand"; + + level.barrelHealth = 150; + maxBrokenPieces = 25; + + level.precachemodeltype = []; + level.barrelExplodingThisFrame = false; + level.breakables_clip = []; + + temp = getentarray ("breakable clip","targetname"); + for (i=0;i= dist) + continue; + dist = newdist; + ent = array[i]; + } + return ent; +} + +oil_spill_burn_after() +{ + for(;;) + { + self.barrel waittill("damage", amount ,attacker, direction_vec, P, type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + continue; + break; + } + self.damageOwner = attacker; + + if ( !isdefined( self.damageOwner ) ) + self radiusdamage (self.origin, 4, 10, 10 ); + else + self radiusdamage (self.origin, 4, 10, 10, self.damageOwner); +} + +oil_spill_burn(P, dest) +{ + forward = vectornormalize(dest - P); + dist = distance(p, dest); + range = 8; + interval = vector_multiply(forward, range); + angle = vectortoangles(forward); + right = anglestoright(angle); + + barrels = getentarray ("explodable_barrel","targetname"); + distsqr = 484; + + test = spawn("script_origin", P); + + num = 0; + for(;;) + { + dist -= range; + if(dist < range * 0.1) + break; + + p += (interval + vector_multiply(right, randomfloatrange(-6, 6))); + + thread oil_spill_burn_section(P); + num++; + if(num == 4) + num = 0; + + test.origin = P; + + remove = []; + barrels = array_removeUndefined(barrels); + for(i=0; i 20) + count = 0; + + playfx (level.breakables_fx["barrel"]["burn"], self.origin + offset2); + + if (!count) + self.damageTaken += (10 + randomfloat(10)); + + count++; + wait 0.05; + } + } + self thread explodable_barrel_explode(); +} + +explodable_barrel_explode() +{ + self notify ("exploding"); + self notify ("death"); + + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + + offset = (0,0,0); + if(dot < 0.5) + { + start = (self.origin + vector_multiply(up, 22)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + + self playsound (level.barrelExpSound); + playfx (level.breakables_fx["barrel"]["explode"], self.origin + offset); + + level.barrelExplodingThisFrame = true; + + if (isdefined (self.remove)) + self.remove delete(); + + phyExpMagnitude = 2; + minDamage = 1; + maxDamage = 250; + blastRadius = 250; + if (isdefined(self.radius)) + blastRadius = self.radius; + + if ( !isdefined( self.damageOwner ) ) + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage); + else + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, self.damageOwner); + + physicsExplosionSphere( self.origin + (0,0,30), blastRadius, blastRadius/2, phyExpMagnitude ); + + self maps\mp\gametypes\_shellshock::barrel_earthQuake(); + + if (randomint(2) == 0) + self setModel("com_barrel_piece"); + else + self setModel("com_barrel_piece2"); + + if(dot < 0.5) + { + start = (self.origin + vector_multiply(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + + self.origin = pos; + self.angles += (0,0,90); + + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} + +getstruct(name, type) +{ + if(!isdefined(level.struct_class_names)) + return undefined; + + array = level.struct_class_names[type][name]; + if(!isdefined(array)) + return undefined; + if(array.size > 1) + return undefined; + + return array[0]; +} + +array_remove (ents, remover) +{ + newents = []; + for(i = 0; i < ents.size; i++) + { + if(ents[i] != remover) + newents[newents.size] = ents[i]; + } + + return newents; +} + +array_removeUndefined (array) +{ + newArray = []; + for(i = 0; i < array.size; i++) + { + if (!isdefined(array[i])) + continue; + newArray[newArray.size] = array[i]; + } + + return newArray; +} + +vector_multiply (vec, dif) +{ + vec = (vec[0] * dif, vec[1] * dif, vec[2] * dif); + return vec; +} + +array_thread( entities, process, var, exclusions ) +{ + if ( !isDefined( exclusions ) ) + exclusions = []; + + for ( i = 0; i < entities.size; i++ ) + { + exclude = false; + for ( j = 0; j < exclusions.size; j++ ) + { + if ( entities[i] != exclusions[j] ) + exclude = true; + } + + if ( exclude ) + continue; + + if ( isDefined( var ) ) + entities[i] thread [[process]]( var ); + else + entities[i] thread [[process]](); + } +} + +breakable_clip() +{ + if (isdefined(self.target)) + { + targ = getent(self.target,"targetname"); + if(targ.classname == "script_brushmodel") + { + self.remove = targ; + return; + } + } + + if ((isdefined (level.breakables_clip)) && (level.breakables_clip.size > 0)) + self.remove = getClosestEnt( self.origin , level.breakables_clip ); + if (isdefined (self.remove)) + level.breakables_clip = array_remove ( level.breakables_clip , self.remove ); +} \ No newline at end of file diff --git a/maps/mp/_flashgrenades.gsc b/maps/mp/_flashgrenades.gsc new file mode 100644 index 0000000..9ff0507 --- /dev/null +++ b/maps/mp/_flashgrenades.gsc @@ -0,0 +1,143 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + precacheShellshock("flashbang"); +} + +startMonitoringFlash() +{ + self thread monitorFlash(); +} + +stopMonitoringFlash(disconnected) +{ + self notify("stop_monitoring_flash"); +} + +flashRumbleLoop( duration ) +{ + self endon("stop_monitoring_flash"); + + self endon("flash_rumble_loop"); + self notify("flash_rumble_loop"); + + goalTime = getTime() + duration * 1000; + + while ( getTime() < goalTime ) + { + self PlayRumbleOnEntity( "damage_heavy" ); + wait 0.05; + } +} + +monitorFlash() +{ + self endon("disconnect"); + + self.flashEndTime = 0; + for(;;) + { + self waittill( "flashbang", amount_distance, amount_angle, attacker ); + + if ( !isalive( self ) || ( isDefined( level.rdyup ) && level.rdyup && ( !isDefined( self.ruptally ) || self.ruptally < 0 ) ) || isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" && isDefined( self.flying ) && self.flying || isDefined( game["PROMOD_KNIFEROUND"] ) && game["PROMOD_KNIFEROUND"] ) + continue; + + hurtattacker = false; + hurtvictim = true; + + if ( amount_angle < 0.35 ) + amount_angle = 0.35; + else if ( amount_angle > 0.8 ) + amount_angle = 1; + + duration = amount_distance * amount_angle * 6; + + if ( duration < 0.25 ) + continue; + + rumbleduration = undefined; + if ( duration > 2 ) + rumbleduration = 0.75; + else + rumbleduration = 0.25; + + if (level.teamBased && isdefined(attacker) && isdefined(attacker.pers["team"]) && isdefined(self.pers["team"]) && attacker.pers["team"] == self.pers["team"] && attacker != self) + { + if(!level.friendlyfire) + continue; + else if(level.friendlyfire == 2) + { + duration = duration * 0.5; + rumbleduration = rumbleduration * 0.5; + hurtvictim = false; + hurtattacker = true; + } + else if(level.friendlyfire == 3) + { + duration = duration * 0.5; + rumbleduration = rumbleduration * 0.5; + hurtattacker = true; + } + } + + if (hurtvictim) + self thread applyFlash(duration, rumbleduration); + if (hurtattacker) + attacker thread applyFlash(duration, rumbleduration); + } +} + +applyFlash(duration, rumbleduration) +{ + if ( !isDefined( self.flashDuration ) || duration > self.flashDuration ) + { + self notify ("strongerFlash"); + self.flashDuration = duration; + } + else if( duration < self.flashDuration ) + return; + + if ( !isDefined( self.flashRumbleDuration ) || rumbleduration > self.flashRumbleDuration ) + self.flashRumbleDuration = rumbleduration; + + wait 0.05; + + if ( isDefined( self.flashDuration ) ) + { + self shellshock( "flashbang", self.flashDuration); + self.flashEndTime = getTime() + (self.flashDuration * 1000); + } + + self thread overlapProtect(duration); + + if ( isDefined( self.flashRumbleDuration ) ) + self thread flashRumbleLoop( self.flashRumbleDuration ); + + self.flashRumbleDuration = undefined; +} + +overlapProtect(duration) +{ + self endon( "disconnect" ); + self endon ( "strongerFlash" ); + for(;duration > 0;) + { + duration -= 0.05; + self.flashDuration = duration; + wait 0.05; + } +} + +isFlashbanged() +{ + return isDefined( self.flashEndTime ) && gettime() < self.flashEndTime; +} \ No newline at end of file diff --git a/maps/mp/_load.gsc b/maps/mp/_load.gsc new file mode 100644 index 0000000..e49b361 --- /dev/null +++ b/maps/mp/_load.gsc @@ -0,0 +1,223 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; + +main( bScriptgened, bCSVgened, bsgenabled ) +{ + level._loadStarted = true; + + struct_class_init(); + + if ( !isdefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + + setDvar("scr_RequiredMapAspectratio", 1); + + thread maps\mp\gametypes\_tweakables::init(); + thread maps\mp\_minefields::minefields(); + thread maps\mp\_destructables::init(); + thread maps\mp\_destructible::init(); + + thread promod\dvarmon::main(); + thread promod\servercheck::main(); + thread promod\modes::monitorMode(); + + VisionSetNight( "default_night" ); + + level.createFX_enabled = 0; + + setupExploders(); + + for ( p = 0;p < 6;p ++ ) + { + switch( p ) + { + case 0: + triggertype = "trigger_multiple"; + break; + + case 1: + triggertype = "trigger_once"; + break; + + case 2: + triggertype = "trigger_use"; + break; + + case 3: + triggertype = "trigger_radius"; + break; + + case 4: + triggertype = "trigger_lookat"; + break; + + default: + triggertype = "trigger_damage"; + break; + } + + triggers = getentarray( triggertype, "classname" ); + + for ( i = 0;i < triggers.size;i ++ ) + { + if( isdefined( triggers[ i ].script_prefab_exploder) ) + triggers[i].script_exploder = triggers[ i ].script_prefab_exploder; + + if( isdefined( triggers[ i ].script_exploder) ) + level thread maps\mp\_load::exploder_load( triggers[ i ] ); + } + } +} + +exploder_load( trigger ) +{ + level endon( "killexplodertridgers" + trigger.script_exploder ); + trigger waittill( "trigger" ); + if ( isdefined( trigger.script_chance ) && randomfloat( 1 ) > trigger.script_chance ) + { + if ( isdefined( trigger.script_delay ) ) + wait trigger.script_delay; + else + wait 4; + level thread exploder_load( trigger ); + return; + } + exploder( trigger.script_exploder ); + level notify( "killexplodertridgers" + trigger.script_exploder ); +} + +setupExploders() +{ + ents = getentarray( "script_brushmodel", "classname" ); + smodels = getentarray( "script_model", "classname" ); + for ( i = 0;i < smodels.size;i ++ ) + ents[ ents.size ] = smodels[ i ]; + + for ( i = 0;i < ents.size;i ++ ) + { + if ( isdefined( ents[ i ].script_prefab_exploder ) ) + ents[ i ].script_exploder = ents[ i ].script_prefab_exploder; + + if ( isdefined( ents[ i ].script_exploder ) ) + { + if ( ( ents[ i ].model == "fx" ) && ( ( !isdefined( ents[ i ].targetname ) ) || ( ents[ i ].targetname != "exploderchunk" ) ) ) + ents[ i ] hide(); + else if ( ( isdefined( ents[ i ].targetname ) ) && ( ents[ i ].targetname == "exploder" ) ) + { + ents[ i ] hide(); + ents[ i ] notsolid(); + } + else if ( ( isdefined( ents[ i ].targetname ) ) && ( ents[ i ].targetname == "exploderchunk" ) ) + { + ents[ i ] hide(); + ents[ i ] notsolid(); + } + } + } + + script_exploders = []; + + potentialExploders = getentarray( "script_brushmodel", "classname" ); + for ( i = 0;i < potentialExploders.size;i ++ ) + { + if ( isdefined( potentialExploders[ i ].script_prefab_exploder ) ) + potentialExploders[ i ].script_exploder = potentialExploders[ i ].script_prefab_exploder; + + if ( isdefined( potentialExploders[ i ].script_exploder ) ) + script_exploders[ script_exploders.size ] = potentialExploders[ i ]; + } + + potentialExploders = getentarray( "script_model", "classname" ); + for ( i = 0;i < potentialExploders.size;i ++ ) + { + if ( isdefined( potentialExploders[ i ].script_prefab_exploder ) ) + potentialExploders[ i ].script_exploder = potentialExploders[ i ].script_prefab_exploder; + + if ( isdefined( potentialExploders[ i ].script_exploder ) ) + script_exploders[ script_exploders.size ] = potentialExploders[ i ]; + } + + potentialExploders = getentarray( "item_health", "classname" ); + for ( i = 0;i < potentialExploders.size;i ++ ) + { + if ( isdefined( potentialExploders[ i ].script_prefab_exploder ) ) + potentialExploders[ i ].script_exploder = potentialExploders[ i ].script_prefab_exploder; + + if ( isdefined( potentialExploders[ i ].script_exploder ) ) + script_exploders[ script_exploders.size ] = potentialExploders[ i ]; + } + + if ( !isdefined( level.createFXent ) ) + level.createFXent = []; + + acceptableTargetnames = []; + acceptableTargetnames[ "exploderchunk visible" ] = true; + acceptableTargetnames[ "exploderchunk" ] = true; + acceptableTargetnames[ "exploder" ] = true; + + for ( i = 0; i < script_exploders.size; i ++ ) + { + exploder = script_exploders[ i ]; + ent = createExploder( exploder.script_fxid ); + ent.v = []; + ent.v[ "origin" ] = exploder.origin; + ent.v[ "angles" ] = exploder.angles; + ent.v[ "delay" ] = exploder.script_delay; + ent.v[ "firefx" ] = exploder.script_firefx; + ent.v[ "firefxdelay" ] = exploder.script_firefxdelay; + ent.v[ "firefxsound" ] = exploder.script_firefxsound; + ent.v[ "firefxtimeout" ] = exploder.script_firefxtimeout; + ent.v[ "earthquake" ] = exploder.script_earthquake; + ent.v[ "damage" ] = exploder.script_damage; + ent.v[ "damage_radius" ] = exploder.script_radius; + ent.v[ "soundalias" ] = exploder.script_soundalias; + ent.v[ "repeat" ] = exploder.script_repeat; + ent.v[ "delay_min" ] = exploder.script_delay_min; + ent.v[ "delay_max" ] = exploder.script_delay_max; + ent.v[ "target" ] = exploder.target; + ent.v[ "ender" ] = exploder.script_ender; + ent.v[ "type" ] = "exploder"; + if ( !isdefined( exploder.script_fxid ) ) + ent.v[ "fxid" ] = "No FX"; + else + ent.v[ "fxid" ] = exploder.script_fxid; + ent.v[ "exploder" ] = exploder.script_exploder; + + if ( !isdefined( ent.v[ "delay" ] ) ) + ent.v[ "delay" ] = 0; + + if ( isdefined( exploder.target ) ) + { + org = getent( ent.v[ "target" ], "targetname" ).origin; + ent.v[ "angles" ] = vectortoangles( org - ent.v[ "origin" ] ); + } + + if ( exploder.classname == "script_brushmodel" || isdefined( exploder.model ) ) + { + ent.model = exploder; + ent.model.disconnect_paths = exploder.script_disconnectpaths; + } + + if ( isdefined( exploder.targetname ) && isdefined( acceptableTargetnames[ exploder.targetname ] ) ) + ent.v[ "exploder_type" ] = exploder.targetname; + else + ent.v[ "exploder_type" ] = "normal"; + + ent maps\mp\_createfx::post_entity_creation_function(); + } +} + +script_gen_dump(){} \ No newline at end of file diff --git a/maps/mp/gametypes/_class.gsc b/maps/mp/gametypes/_class.gsc new file mode 100644 index 0000000..4473d87 --- /dev/null +++ b/maps/mp/gametypes/_class.gsc @@ -0,0 +1,201 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +giveLoadout( team, class ) +{ + self takeAllWeapons(); + + self setClientDvar( "loadout_curclass", class ); + self.curClass = class; + + sidearmWeapon(); + primaryWeapon(); + + if(getDvarInt("weap_allow_frag_grenade") && (!isDefined( level.strat_over ) || level.strat_over)) + { + s = ""; + if ( level.hardcoreMode ) + s = "_short"; + self giveWeapon( "frag_grenade"+s+"_mp" ); + self setWeaponAmmoClip( "frag_grenade"+s+"_mp", 1 ); + self switchToOffhand( "frag_grenade"+s+"_mp" ); + } + + gren = self.pers[class]["loadout_grenade"]; + if((gren == "flash_grenade" || gren == "smoke_grenade") && getDvarInt("weap_allow_"+gren)) + { + self setOffhandSecondaryClass(GetSubStr(gren, 0, 5)); + if(!isDefined(level.strat_over) || level.strat_over) + { + self giveWeapon(gren+"_mp"); + self setWeaponAmmoClip(gren+"_mp", 1); + } + } + + self setMoveSpeedScale( ( 1.0 - 0.05 * int( class == "assault" ) ) * !int( isDefined( level.strat_over ) && !level.strat_over ) ); +} + +sidearmWeapon() +{ + class = self.pers["class"]; + sidearmWeapon = self.pers[class]["loadout_secondary"]; + + if ( sidearmWeapon != "none" && sidearmWeapon != "deserteaglegold" && sidearmWeapon != "deserteagle" && sidearmWeapon != "colt45" && sidearmWeapon != "usp" && sidearmWeapon != "beretta" ) + sidearmWeapon = getDvar( "class_" + class + "_secondary" ); + + if ( sideArmWeapon != "none" ) + { + s = ""; + if ( self.pers[class]["loadout_secondary_attachment"] == "silencer" ) + s = "_silencer"; + else + self.pers[class]["loadout_secondary_attachment"] = "none"; + + sidearmWeapon += s+"_mp"; + + if ( isDefined( level.strat_over ) && level.strat_over && ( !isDefined( game["PROMOD_KNIFEROUND"] ) || !game["PROMOD_KNIFEROUND"] ) || !isDefined( level.strat_over ) ) + { + self giveWeapon( sidearmWeapon ); + self giveMaxAmmo( sidearmWeapon ); + } + } +} + +primaryWeapon() +{ + class = self.pers["class"]; + primaryWeapon = self.pers[class]["loadout_primary"]; + + switch(primaryWeapon) + { + case "none": + case "m16": + case "ak47": + case "m4": + case "g3": + case "g36c": + case "m14": + case "mp44": + case "mp5": + case "uzi": + case "ak74u": + case "winchester1200": + case "m1014": + case "m40a3": + case "remington700": + break; + default: + primaryWeapon = getDvar("class_"+class+"_primary"); + } + + camos = strtok("camo_brockhaurd|camo_bushdweller|camo_blackwhitemarpat|camo_tigerred|camo_stagger", "|"); + camonum = 0; + + if(isDefined(self.pers[class]["loadout_camo"])) + { + for(i=0;i + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + +main(allowed) +{ + entitytypes = getentarray(); + for(i = 0; i < entitytypes.size; i++) + { + if(isdefined(entitytypes[i].script_gameobjectname)) + { + dodelete = true; + + gameobjectnames = strtok(entitytypes[i].script_gameobjectname, " "); + + for(j = 0; j < allowed.size; j++) + { + for (k = 0; k < gameobjectnames.size; k++) + { + if(gameobjectnames[k] == allowed[j]) + { + dodelete = false; + break; + } + } + if (!dodelete) + break; + } + + if(dodelete) + entitytypes[i] delete(); + } + } +} + +init() +{ + level.numGametypeReservedObjectives = 0; + + precacheItem( "briefcase_bomb_mp" ); + precacheItem( "briefcase_bomb_defuse_mp" ); + precacheModel( "prop_suitcase_bomb" ); + + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + level endon ( "game_ended" ); + + for(;;) + { + level waittill( "connecting", player ); + + player thread onPlayerSpawned(); + player thread onDisconnect(); + } +} + +onPlayerSpawned() +{ + self endon( "disconnect" ); + level endon ( "game_ended" ); + + for(;;) + { + self waittill( "spawned_player" ); + + self thread onDeath(); + self.touchTriggers = []; + self.carryObject = undefined; + self.claimTrigger = undefined; + self.canPickupObject = true; + self.killedInUse = undefined; + } +} + +onDeath() +{ + level endon ( "game_ended" ); + + self waittill ( "death" ); + if ( isDefined( self.carryObject ) ) + self.carryObject thread setDropped(); +} + +onDisconnect() +{ + level endon ( "game_ended" ); + + self waittill ( "disconnect" ); + if ( isDefined( self.carryObject ) ) + self.carryObject thread setDropped(); +} + +createCarryObject( ownerTeam, trigger, visuals, offset ) +{ + carryObject = spawnStruct(); + carryObject.type = "carryObject"; + carryObject.curOrigin = trigger.origin; + carryObject.ownerTeam = ownerTeam; + carryObject.entNum = trigger getEntityNumber(); + + if ( isSubStr( trigger.classname, "use" ) ) + carryObject.triggerType = "use"; + else + carryObject.triggerType = "proximity"; + + trigger.baseOrigin = trigger.origin; + carryObject.trigger = trigger; + + if ( !isDefined( offset ) ) + offset = (0,0,0); + + carryObject.offset3d = offset; + + for ( i = 0; i < visuals.size; i++ ) + { + visuals[i].baseOrigin = visuals[i].origin; + visuals[i].baseAngles = visuals[i].angles; + } + + carryObject.visuals = visuals; + carryObject.compassIcons = []; + carryObject.objIDAllies = getNextObjID(); + carryObject.objIDAxis = getNextObjID(); + carryObject.objIDPingFriendly = false; + carryObject.objIDPingEnemy = false; + level.objIDStart += 2; + + objective_add( carryObject.objIDAllies, "invisible", carryObject.curOrigin ); + objective_add( carryObject.objIDAxis, "invisible", carryObject.curOrigin ); + objective_team( carryObject.objIDAllies, "allies" ); + objective_team( carryObject.objIDAxis, "axis" ); + + carryObject.objPoints["allies"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_allies_" + carryObject.entNum, carryObject.curOrigin + offset, "allies", undefined ); + carryObject.objPoints["axis"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_axis_" + carryObject.entNum, carryObject.curOrigin + offset, "axis", undefined ); + + carryObject.objPoints["allies"].alpha = 0; + carryObject.objPoints["axis"].alpha = 0; + + carryObject.carrier = undefined; + + carryObject.isResetting = false; + carryObject.interactTeam = "none"; + + carryObject.worldIcons = []; + carryObject.carrierVisible = false; + carryObject.visibleTeam = "none"; + + carryObject.carryIcon = undefined; + + carryObject.onDrop = undefined; + carryObject.onPickup = undefined; + carryObject.onReset = undefined; + + if ( carryObject.triggerType == "use" ) + carryObject thread carryObjectUseThink(); + else + carryObject thread carryObjectProxThink(); + + carryObject thread updateCarryObjectOrigin(); + + return carryObject; +} + +carryObjectUseThink() +{ + level endon ( "game_ended" ); + + for(;;) + { + self.trigger waittill ( "trigger", player ); + + if ( self.isResetting || !isAlive( player ) || !self canInteractWith( player.pers["team"] ) || !player.canPickupObject || player.throwingGrenade || isDefined( self.carrier ) ) + continue; + + self setPickedUp( player ); + } +} + +carryObjectProxThink() +{ + level endon ( "game_ended" ); + + for(;;) + { + self.trigger waittill ( "trigger", player ); + + if ( self.isResetting || !isAlive( player ) || !self canInteractWith( player.pers["team"] ) || !player.canPickupObject || isDefined( self.carrier ) ) + continue; + + if ( (isDefined( level.timeout_over ) && !level.timeout_over) || ( isDefined( game["PROMOD_KNIFEROUND"] ) && game["PROMOD_KNIFEROUND"] ) ) + return; + + self setPickedUp( player ); + } +} + +pickupObjectDelay( origin ) +{ + level endon ( "game_ended" ); + + self endon("death"); + self endon("disconnect"); + + self.canPickupObject = false; + + for(;;) + { + if ( distanceSquared( self.origin, origin ) > 4096 ) + break; + + wait 0.2; + } + + self.canPickupObject = true; +} + +setPickedUp( player ) +{ + player giveObject( self ); + + self.carrier = player; + + for ( i = 0; i < self.visuals.size; i++ ) + self.visuals[i] hide(); + + self.trigger.origin += (0,0,10000); + + self notify ( "pickup_object" ); + if ( isDefined( self.onPickup ) ) + self [[self.onPickup]]( player ); + + self updateCompassIcons(); + self updateWorldIcons(); +} + +updateCarryObjectOrigin() +{ + level endon ( "game_ended" ); + + objPingDelay = 5; + for(;;) + { + if ( isDefined( self.carrier ) ) + { + self.curOrigin = self.carrier.origin + (0,0,75); + self.objPoints["allies"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin ); + self.objPoints["axis"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin ); + + if ( (self.visibleTeam == "friendly" || self.visibleTeam == "any") && self isFriendlyTeam( "allies" ) && self.objIDPingFriendly ) + { + if ( self.objPoints["allies"].isShown ) + { + self.objPoints["allies"].alpha = self.objPoints["allies"].baseAlpha; + self.objPoints["allies"] fadeOverTime( objPingDelay + 1 ); + self.objPoints["allies"].alpha = 0; + } + objective_position( self.objIDAllies, self.curOrigin ); + } + else if ( (self.visibleTeam == "friendly" || self.visibleTeam == "any") && self isFriendlyTeam( "axis" ) && self.objIDPingFriendly ) + { + if ( self.objPoints["axis"].isShown ) + { + self.objPoints["axis"].alpha = self.objPoints["axis"].baseAlpha; + self.objPoints["axis"] fadeOverTime( objPingDelay + 1 ); + self.objPoints["axis"].alpha = 0; + } + objective_position( self.objIDAxis, self.curOrigin ); + } + + if ( (self.visibleTeam == "enemy" || self.visibleTeam == "any") && !self isFriendlyTeam( "allies" ) && self.objIDPingEnemy ) + { + if ( self.objPoints["allies"].isShown ) + { + self.objPoints["allies"].alpha = self.objPoints["allies"].baseAlpha; + self.objPoints["allies"] fadeOverTime( objPingDelay + 1 ); + self.objPoints["allies"].alpha = 0; + } + objective_position( self.objIDAllies, self.curOrigin ); + } + else if ( (self.visibleTeam == "enemy" || self.visibleTeam == "any") && !self isFriendlyTeam( "axis" ) && self.objIDPingEnemy ) + { + if ( self.objPoints["axis"].isShown ) + { + self.objPoints["axis"].alpha = self.objPoints["axis"].baseAlpha; + self.objPoints["axis"] fadeOverTime( objPingDelay + 1 ); + self.objPoints["axis"].alpha = 0; + } + objective_position( self.objIDAxis, self.curOrigin ); + } + + self wait_endon( objPingDelay, "dropped", "reset" ); + } + else + { + self.objPoints["allies"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin + self.offset3d ); + self.objPoints["axis"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin + self.offset3d ); + + wait 0.05; + } + } +} + +giveObject( object ) +{ + self.carryObject = object; + self thread trackCarrier(); + + if ( isDefined( object.carryIcon ) ) + { + self.carryIcon = createIcon( object.carryIcon, 50, 50 ); + self.carryIcon setPoint( "CENTER", "CENTER", 223, 167 ); + } + + if ( isDefined( level.scorebot ) && level.scorebot ) + level thread maps\mp\gametypes\_globallogic::updateTeamStatus(); +} + +returnHome() +{ + self.isResetting = true; + + self notify ( "reset" ); + for ( i = 0; i < self.visuals.size; i++ ) + { + self.visuals[i].origin = self.visuals[i].baseOrigin; + self.visuals[i].angles = self.visuals[i].baseAngles; + self.visuals[i] show(); + } + + self.trigger.origin = self.trigger.baseOrigin; + + self.curOrigin = self.trigger.origin; + + if ( isDefined( self.onReset ) ) + self [[self.onReset]](); + + self clearCarrier(); + + updateWorldIcons(); + updateCompassIcons(); + + self.isResetting = false; +} + +setDropped() +{ + self.isResetting = true; + + self notify ( "dropped" ); + + if ( isDefined( self.carrier ) ) + { + trace = playerPhysicsTrace( self.carrier.origin + (0,0,20), self.carrier.origin - (0,0,2000), false, self.carrier.body ); + angleTrace = bulletTrace( self.carrier.origin + (0,0,20), self.carrier.origin - (0,0,2000), false, self.carrier.body ); + } + else + { + trace = playerPhysicsTrace( self.safeOrigin + (0,0,20), self.safeOrigin - (0,0,20), false, undefined ); + angleTrace = bulletTrace( self.safeOrigin + (0,0,20), self.safeOrigin - (0,0,20), false, undefined ); + } + + droppingPlayer = self.carrier; + + if ( isDefined( trace ) ) + { + tempAngle = randomfloat( 360 ); + + dropOrigin = trace; + if ( angleTrace["fraction"] < 1 && distance( angleTrace["position"], trace ) < 10 ) + { + forward = (cos( tempAngle ), sin( tempAngle ), 0); + forward = vectornormalize( forward - vector_scale( angleTrace["normal"], vectordot( forward, angleTrace["normal"] ) ) ); + dropAngles = vectortoangles( forward ); + } + else + dropAngles = (0,tempAngle,0); + + for ( i = 0; i < self.visuals.size; i++ ) + { + self.visuals[i].origin = dropOrigin; + self.visuals[i].angles = dropAngles; + self.visuals[i] show(); + } + self.trigger.origin = dropOrigin; + + self.curOrigin = self.trigger.origin; + + self thread pickupTimeout(); + } + else + { + for ( i = 0; i < self.visuals.size; i++ ) + { + self.visuals[i].origin = self.visuals[i].baseOrigin; + self.visuals[i].angles = self.visuals[i].baseAngles; + self.visuals[i] show(); + } + self.trigger.origin = self.trigger.baseOrigin; + + self.curOrigin = self.trigger.baseOrigin; + } + + if ( isDefined( self.onDrop ) ) + self [[self.onDrop]]( droppingPlayer ); + + self clearCarrier(); + + self updateCompassIcons(); + self updateWorldIcons(); + + self.isResetting = false; +} + +clearCarrier() +{ + if ( !isdefined( self.carrier ) ) + return; + + self.carrier takeObject( self ); + self.carrier.carryObject = undefined; + self.carrier = undefined; +} + +pickupTimeout() +{ + self endon ( "pickup_object" ); + + wait 0.05; + + mineTriggers = getEntArray( "minefield", "targetname" ); + hurtTriggers = getEntArray( "trigger_hurt", "classname" ); + + for ( i = 0; i < mineTriggers.size; i++ ) + { + if ( !self.visuals[0] isTouching( mineTriggers[i] ) ) + continue; + + self returnHome(); + return; + } + + for ( i = 0; i < hurtTriggers.size; i++ ) + { + if ( !self.visuals[0] isTouching( hurtTriggers[i] ) ) + continue; + + self returnHome(); + return; + } + + if ( isDefined( self.autoResetTime ) ) + { + wait self.autoResetTime; + + if ( !isDefined( self.carrier ) ) + self returnHome(); + } +} + +takeObject( object ) +{ + if ( isDefined( self.carryIcon ) ) + self.carryIcon destroyElem(); + + if ( !isAlive( self ) ) + return; + + self.carryObject = undefined; + self notify ( "drop_object" ); + + if ( object.triggerType == "proximity" ) + self thread pickupObjectDelay( object.trigger.origin ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + level thread maps\mp\gametypes\_globallogic::updateTeamStatus(); +} + +trackCarrier() +{ + level endon ( "game_ended" ); + self endon ( "disconnect" ); + self endon ( "death" ); + self endon ( "drop_object" ); + + while ( isDefined( self.carryObject ) && isAlive( self ) ) + { + if ( self isOnGround() ) + { + trace = bulletTrace( self.origin + (0,0,20), self.origin - (0,0,20), false, undefined ); + if ( trace["fraction"] < 1 ) + self.carryObject.safeOrigin = trace["position"]; + } + wait 0.05; + } +} + +createUseObject( ownerTeam, trigger, visuals, offset ) +{ + useObject = spawnStruct(); + useObject.type = "useObject"; + useObject.curOrigin = trigger.origin; + useObject.ownerTeam = ownerTeam; + useObject.entNum = trigger getEntityNumber(); + useObject.keyObject = undefined; + + if ( isSubStr( trigger.classname, "use" ) ) + useObject.triggerType = "use"; + else + useObject.triggerType = "proximity"; + + useObject.trigger = trigger; + + for ( i = 0; i < visuals.size; i++ ) + { + visuals[i].baseOrigin = visuals[i].origin; + visuals[i].baseAngles = visuals[i].angles; + } + + useObject.visuals = visuals; + + if ( !isDefined( offset ) ) + offset = (0,0,0); + + useObject.offset3d = offset; + + useObject.compassIcons = []; + useObject.objIDAllies = getNextObjID(); + useObject.objIDAxis = getNextObjID(); + + objective_add( useObject.objIDAllies, "invisible", useObject.curOrigin ); + objective_add( useObject.objIDAxis, "invisible", useObject.curOrigin ); + objective_team( useObject.objIDAllies, "allies" ); + objective_team( useObject.objIDAxis, "axis" ); + + useObject.objPoints["allies"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_allies_" + useObject.entNum, useObject.curOrigin + offset, "allies", undefined ); + useObject.objPoints["axis"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_axis_" + useObject.entNum, useObject.curOrigin + offset, "axis", undefined ); + + useObject.objPoints["allies"].alpha = 0; + useObject.objPoints["axis"].alpha = 0; + + useObject.interactTeam = "none"; + + useObject.worldIcons = []; + useObject.visibleTeam = "none"; + + useObject.onUse = undefined; + useObject.onCantUse = undefined; + + useObject.useText = "default"; + useObject.useTime = 10000; + useObject.curProgress = 0; + + if ( useObject.triggerType == "proximity" ) + { + useObject.numTouching["neutral"] = 0; + useObject.numTouching["axis"] = 0; + useObject.numTouching["allies"] = 0; + useObject.numTouching["none"] = 0; + useObject.touchList["neutral"] = []; + useObject.touchList["axis"] = []; + useObject.touchList["allies"] = []; + useObject.touchList["none"] = []; + useObject.useRate = 0; + useObject.claimTeam = "none"; + useObject.claimPlayer = undefined; + useObject.lastClaimTeam = "none"; + useObject.lastClaimTime = 0; + + useObject thread useObjectProxThink(); + } + else + { + useObject.useRate = 1; + useObject thread useObjectUseThink(); + } + + return useObject; +} + +setKeyObject( object ) +{ + self.keyObject = object; +} + +useObjectUseThink() +{ + if ( (isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"]) || (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" )) + return; + + level endon ( "game_ended" ); + + for(;;) + { + self.trigger waittill ( "trigger", player ); + + while ( isDefined( player ) && player isTouching( self.trigger ) && !player isOnGround() ) + wait 0.05; + + if ( !isAlive( player ) || !self canInteractWith( player.pers["team"] ) || !player isTouching( self.trigger ) || !player useButtonPressed() ) + continue; + + if ( isDefined( self.keyObject ) && (!isDefined( player.carryObject ) || player.carryObject != self.keyObject ) ) + { + if ( isDefined( self.onCantUse ) ) + self [[self.onCantUse]]( player ); + continue; + } + + result = true; + if ( self.useTime > 0 ) + { + if ( isDefined( self.onBeginUse ) ) + self [[self.onBeginUse]]( player ); + + team = player.pers["team"]; + + result = self useHoldThink( player ); + + if ( isDefined( self.onEndUse ) && isDefined( player ) ) + self [[self.onEndUse]]( team, player, result ); + } + + if ( !result ) + continue; + + if ( isDefined( self.onUse ) ) + self [[self.onUse]]( player ); + } +} + +getEarliestClaimPlayer() +{ + team = self.claimTeam; + + earliestPlayer = self.claimPlayer; + + if ( self.touchList[team].size > 0 ) + { + earliestTime = undefined; + players = getArrayKeys( self.touchList[team] ); + for ( i = 0; i < players.size; i++ ) + { + touchdata = self.touchList[team][players[i]]; + if ( !isdefined( earliestTime ) || touchdata.starttime < earliestTime ) + { + earliestPlayer = touchdata.player; + earliestTime = touchdata.starttime; + } + } + } + + return earliestPlayer; +} + +useObjectProxThink() +{ + if ( (isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"]) || (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" ) ) + return; + + level endon ( "game_ended" ); + + self thread proxTriggerThink(); + + for(;;) + { + if ( self.useTime && self.curProgress >= self.useTime ) + { + self.curProgress = 0; + + creditPlayer = getEarliestClaimPlayer(); + + if ( isDefined( self.onEndUse ) ) + self [[self.onEndUse]]( self getClaimTeam(), creditPlayer, isDefined( creditPlayer ) ); + + if ( isDefined( creditPlayer ) && isDefined( self.onUse ) ) + self [[self.onUse]]( creditPlayer ); + + self setClaimTeam( "none" ); + self.claimPlayer = undefined; + } + + if ( self.claimTeam != "none" ) + { + if ( self.useTime ) + { + if ( !self.numTouching[self.claimTeam] ) + { + if ( isDefined( self.onEndUse ) ) + self [[self.onEndUse]]( self getClaimTeam(), self.claimPlayer, false ); + + self setClaimTeam( "none" ); + self.claimPlayer = undefined; + } + else + { + self.curProgress += (50 * self.useRate); + if ( isDefined( self.onUseUpdate ) ) + self [[self.onUseUpdate]]( self getClaimTeam(), self.curProgress / self.useTime, (50*self.useRate) / self.useTime ); + } + } + else + { + if ( isDefined( self.onUse ) ) + self [[self.onUse]]( self.claimPlayer ); + + self setClaimTeam( "none" ); + self.claimPlayer = undefined; + } + } + + wait 0.05; + } +} + +proxTriggerThink() +{ + level endon ( "game_ended" ); + + entityNumber = self.entNum; + + for(;;) + { + self.trigger waittill ( "trigger", player ); + + if ( !isAlive( player ) ) + continue; + + if ( self canInteractWith( player.pers["team"] ) && self.claimTeam == "none" ) + { + if ( !isDefined( self.keyObject ) || (isDefined( player.carryObject ) && player.carryObject == self.keyObject ) ) + { + setClaimTeam( player.pers["team"] ); + self.claimPlayer = player; + + if ( self.useTime && isDefined( self.onBeginUse ) ) + self [[self.onBeginUse]]( self.claimPlayer ); + } + else + { + if ( isDefined( self.onCantUse ) ) + self [[self.onCantUse]]( player ); + } + } + + if ( self.useTime && isAlive( player ) && !isDefined( player.touchTriggers[entityNumber] ) ) + player thread triggerTouchThink( self ); + } +} + +setClaimTeam( newTeam ) +{ + if ( self.claimTeam == "none" && getTime() - self.lastClaimTime > 1000 ) + self.curProgress = 0; + else if ( newTeam != "none" && newTeam != self.lastClaimTeam ) + self.curProgress = 0; + + self.lastClaimTeam = self.claimTeam; + self.lastClaimTime = getTime(); + self.claimTeam = newTeam; + + self updateUseRate(); +} + +getClaimTeam() +{ + return self.claimTeam; +} + +triggerTouchThink( object ) +{ + team = self.pers["team"]; + + object.numTouching[team]++; + object updateUseRate(); + + touchName = "player" + self.clientid; + struct = spawnstruct(); + struct.player = self; + struct.starttime = gettime(); + object.touchList[team][touchName] = struct; + + self.touchTriggers[object.entNum] = object.trigger; + + while ( isDefined( self ) && isAlive( self ) && self isTouching( object.trigger ) && !level.gameEnded ) + { + self updateProxBar( object, false ); + wait 0.05; + } + + if ( isDefined( self ) ) + { + self updateProxBar( object, true ); + self.touchTriggers[object.entNum] = undefined; + } + + if ( level.gameEnded ) + return; + + object.touchList[team][touchName] = undefined; + + object.numTouching[team]--; + object updateUseRate(); +} + +updateProxBar( object, forceRemove ) +{ + if ( forceRemove || !object canInteractWith( self.pers["team"] ) || self.pers["team"] != object.claimTeam ) + { + if ( isDefined( self.proxBar ) ) + self.proxBar hideElem(); + + if ( isDefined( self.proxBarText ) ) + self.proxBarText hideElem(); + return; + } + + if ( !isDefined( self.proxBar ) ) + { + self.proxBar = createPrimaryProgressBar(); + self.proxBar setShader( "progress_bar_bg", 120, 8 ); + self.proxBar.alpha = 1; + self.proxBar.lastUseRate = -1; + } + + if ( self.proxBar.hidden ) + { + self.proxBar showElem(); + self.proxBar.lastUseRate = -1; + } + + if ( !isDefined( self.proxBarText ) ) + { + self.proxBarText = createPrimaryProgressBarText(); + self.proxBarText setText( object.useText ); + } + + if ( self.proxBarText.hidden ) + { + self.proxBarText showElem(); + self.proxBarText setText( object.useText ); + } + + if ( self.proxBar.lastUseRate != object.useRate ) + { + if( object.curProgress > object.useTime) + object.curProgress = object.useTime; + + self.proxBar updateBar( object.curProgress / object.useTime , (1000 / object.useTime) * object.useRate ); + self.proxBar.lastUseRate = object.useRate; + } +} + +updateUseRate() +{ + numClaimants = self.numTouching[self.claimTeam]; + numOther = 0; + + if ( self.claimTeam != "axis" ) + numOther += self.numTouching["axis"]; + if ( self.claimTeam != "allies" ) + numOther += self.numTouching["allies"]; + + self.useRate = 0; + + if ( numClaimants && !numOther ) + self.useRate = numClaimants; +} + +useHoldThink( player ) +{ + player clientClaimTrigger( self.trigger ); + player.claimTrigger = self.trigger; + + player linkTo( self.trigger ); + player _disableWeapon(); + + self.curProgress = 0; + self.inUse = true; + self.useRate = 0; + + player thread personalUseBar( self ); + + result = useHoldThinkLoop( player ); + + if ( isdefined( result ) && result ) + return true; + + if ( isDefined( player ) ) + { + player.claimTrigger = undefined; + player _enableWeapon(); + + if ( !isAlive( player ) ) + player.killedInUse = true; + } + + self.inUse = false; + self.trigger releaseClaimedTrigger(); + return false; +} + +useHoldThinkLoop( player ) +{ + level endon ( "game_ended" ); + self endon("disabled"); + + waitForWeapon = true; + timedOut = 0; + + maxWaitTime = 1.5; + + while( isDefined( player ) && isAlive( player ) && player isTouching( self.trigger ) && player useButtonPressed() && !player.throwingGrenade && !player meleeButtonPressed() && self.curProgress < self.useTime && (self.useRate || waitForWeapon) && !(waitForWeapon && timedOut > maxWaitTime) ) + { + timedOut += 0.05; + + self.curProgress += (50 * self.useRate); + self.useRate = 1; + waitForWeapon = false; + + if ( self.curProgress >= self.useTime ) + { + self.inUse = false; + player clientReleaseTrigger( self.trigger ); + player.claimTrigger = undefined; + player _enableWeapon(); + player unlink(); + + return isAlive( player ); + } + + wait 0.05; + } + + return false; +} + +personalUseBar( object ) +{ + self endon("disconnect"); + + useBar = createPrimaryProgressBar(); + useBar setShader( "progress_bar_bg", 120, 8 ); + useBar.alpha = 1; + useBarText = createPrimaryProgressBarText(); + useBarText setText( object.useText ); + + lastRate = -1; + + while ( isAlive( self ) && object.inUse && self useButtonPressed() && !level.gameEnded ) + { + if ( lastRate != object.useRate ) + { + if( object.curProgress > object.useTime) + object.curProgress = object.useTime; + useBar updateBar( object.curProgress / object.useTime, (1000 / object.useTime) * object.useRate ); + + if ( !object.useRate ) + { + useBar hideElem(); + useBarText hideElem(); + } + else + { + useBar showElem(); + useBarText showElem(); + } + } + lastRate = object.useRate; + wait 0.05; + } + + if ( level.gameEnded ) + { + self _enableWeapon(); + self unlink(); + } + + useBar destroyElem(); + useBarText destroyElem(); +} + +updateTrigger() +{ + if ( self.triggerType != "use" ) + return; + + if ( self.interactTeam == "none" ) + self.trigger.origin -= (0,0,50000); + else if ( self.interactTeam == "any" ) + { + self.trigger.origin = self.curOrigin; + self.trigger setTeamForTrigger( "none" ); + } + else if ( self.interactTeam == "friendly" ) + { + self.trigger.origin = self.curOrigin; + if ( self.ownerTeam == "allies" ) + self.trigger setTeamForTrigger( "allies" ); + else if ( self.ownerTeam == "axis" ) + self.trigger setTeamForTrigger( "axis" ); + else + self.trigger.origin -= (0,0,50000); + } + else if ( self.interactTeam == "enemy" ) + { + self.trigger.origin = self.curOrigin; + if ( self.ownerTeam == "allies" ) + self.trigger setTeamForTrigger( "axis" ); + else if ( self.ownerTeam == "axis" ) + self.trigger setTeamForTrigger( "allies" ); + else + self.trigger setTeamForTrigger( "none" ); + } +} + +updateWorldIcons() +{ + if ( self.visibleTeam == "any" ) + { + updateWorldIcon( "friendly", true ); + updateWorldIcon( "enemy", true ); + } + else if ( self.visibleTeam == "friendly" ) + { + updateWorldIcon( "friendly", true ); + updateWorldIcon( "enemy", false ); + } + else if ( self.visibleTeam == "enemy" ) + { + updateWorldIcon( "friendly", false ); + updateWorldIcon( "enemy", true ); + } + else + { + updateWorldIcon( "friendly", false ); + updateWorldIcon( "enemy", false ); + } +} + +updateWorldIcon( relativeTeam, showIcon ) +{ + if ( !isDefined( self.worldIcons[relativeTeam] ) ) + showIcon = false; + + updateTeams = getUpdateTeams( relativeTeam ); + + for ( i = 0; i < updateTeams.size; i++ ) + { + opName = "objpoint_" + updateTeams[i] + "_" + self.entNum; + objPoint = maps\mp\gametypes\_objpoints::getObjPointByName( opName ); + + objPoint notify( "stop_flashing_thread" ); + objPoint thread maps\mp\gametypes\_objpoints::stopFlashing(); + + if ( showIcon ) + { + objPoint setShader( self.worldIcons[relativeTeam], level.objPointSize, level.objPointSize ); + objPoint fadeOverTime( 0.05 ); + objPoint.alpha = objPoint.baseAlpha; + objPoint.isShown = true; + + if ( isDefined( self.compassIcons[relativeTeam] ) ) + objPoint setWayPoint( true, self.worldIcons[relativeTeam] ); + else + objPoint setWayPoint( true ); + + if ( self.type == "carryObject" ) + { + if ( isDefined( self.carrier ) && !shouldPingObject( relativeTeam ) ) + objPoint SetTargetEnt( self.carrier ); + else + objPoint ClearTargetEnt(); + } + } + else + { + objPoint fadeOverTime( 0.05 ); + objPoint.alpha = 0; + objPoint.isShown = false; + objPoint ClearTargetEnt(); + } + } +} + +updateCompassIcons() +{ + if ( self.visibleTeam == "any" ) + { + updateCompassIcon( "friendly", true ); + updateCompassIcon( "enemy", true ); + } + else if ( self.visibleTeam == "friendly" ) + { + updateCompassIcon( "friendly", true ); + updateCompassIcon( "enemy", false ); + } + else if ( self.visibleTeam == "enemy" ) + { + updateCompassIcon( "friendly", false ); + updateCompassIcon( "enemy", true ); + } + else + { + updateCompassIcon( "friendly", false ); + updateCompassIcon( "enemy", false ); + } +} + +updateCompassIcon( relativeTeam, showIcon ) +{ + updateTeams = getUpdateTeams( relativeTeam ); + + for ( i = 0; i < updateTeams.size; i++ ) + { + showIconThisTeam = showIcon; + + objId = self.objIDAllies; + if ( updateTeams[i] == "axis" ) + objId = self.objIDAxis; + + if ( !isDefined( self.compassIcons[relativeTeam] ) || !showIconThisTeam ) + { + objective_state( objId, "invisible" ); + continue; + } + + objective_icon( objId, self.compassIcons[relativeTeam] ); + objective_state( objId, "active" ); + + if ( self.type == "carryObject" ) + { + if ( isAlive( self.carrier ) && !shouldPingObject( relativeTeam ) ) + objective_onentity( objId, self.carrier ); + else + objective_position( objId, self.curOrigin ); + } + } +} + +shouldPingObject( relativeTeam ) +{ + if ( ( relativeTeam == "friendly" && self.objIDPingFriendly ) || ( relativeTeam == "enemy" && self.objIDPingEnemy ) ) + return true; + + return false; +} + +getUpdateTeams( relativeTeam ) +{ + updateTeams = []; + if ( relativeTeam == "friendly" ) + { + if ( self isFriendlyTeam( "allies" ) ) + updateTeams[0] = "allies"; + else if ( self isFriendlyTeam( "axis" ) ) + updateTeams[0] = "axis"; + } + else if ( relativeTeam == "enemy" ) + { + if ( !self isFriendlyTeam( "allies" ) ) + updateTeams[updateTeams.size] = "allies"; + + if ( !self isFriendlyTeam( "axis" ) ) + updateTeams[updateTeams.size] = "axis"; + } + + return updateTeams; +} + +setOwnerTeam( team ) +{ + self.ownerTeam = team; + self updateTrigger(); + self updateCompassIcons(); + self updateWorldIcons(); +} + +getOwnerTeam() +{ + return self.ownerTeam; +} + +setUseTime( time ) +{ + self.useTime = int( time * 1000 ); +} + +setUseText( text ) +{ + self.useText = text; +} + +setUseHintText( text ) +{ + self.trigger setHintString( text ); +} + +allowCarry( relativeTeam ) +{ + self.interactTeam = relativeTeam; +} + +allowUse( relativeTeam ) +{ + self.interactTeam = relativeTeam; + updateTrigger(); +} + +setVisibleTeam( relativeTeam ) +{ + self.visibleTeam = relativeTeam; + + updateCompassIcons(); + updateWorldIcons(); +} + +setModelVisibility( visibility ) +{ + if ( visibility ) + { + for ( i = 0; i < self.visuals.size; i++ ) + { + self.visuals[i] show(); + if ( self.visuals[i].classname == "script_brushmodel" || self.visuals[i].classname == "script_model" ) + self.visuals[i] thread makeSolid(); + } + } + else + { + for ( i = 0; i < self.visuals.size; i++ ) + { + self.visuals[i] hide(); + if ( self.visuals[i].classname == "script_brushmodel" || self.visuals[i].classname == "script_model" ) + { + self.visuals[i] notify("changing_solidness"); + self.visuals[i] notsolid(); + } + } + } +} + +makeSolid() +{ + self endon("death"); + self notify("changing_solidness"); + self endon("changing_solidness"); + + for(;;) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i] isTouching( self ) ) + break; + } + if ( i == level.players.size ) + { + self solid(); + break; + } + wait 0.05; + } +} + +setCanUse( relativeTeam ) +{ + self.useTeam = relativeTeam; +} + +set2DIcon( relativeTeam, shader ) +{ + if ((isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"]) || (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" )) + return; + + self.compassIcons[relativeTeam] = shader; + updateCompassIcons(); +} + +set3DIcon( relativeTeam, shader ) +{ + if ((isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"]) || (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" )) + return; + + self.worldIcons[relativeTeam] = shader; + updateWorldIcons(); +} + +set3DUseIcon( relativeTeam, shader ) +{ + if ((isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"]) || (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" )) + return; + + self.worldUseIcons[relativeTeam] = shader; +} + +setCarryIcon( shader ) +{ + self.carryIcon = shader; +} + +disableObject() +{ + self notify("disabled"); + + if ( self.type == "carryObject" ) + { + if ( isDefined( self.carrier ) ) + self.carrier takeObject( self ); + + for ( i = 0; i < self.visuals.size; i++ ) + self.visuals[i] hide(); + } + + self.trigger triggerOff(); + + if ( level.gametype == "sd" ) + self setVisibleTeam( game["defenders"] ); + else + self setVisibleTeam( "none" ); +} + +enableObject() +{ + if ( self.type == "carryObject" ) + { + for ( i = 0; i < self.visuals.size; i++ ) + self.visuals[i] show(); + } + + self.trigger triggerOn(); + self setVisibleTeam( "any" ); +} + +getRelativeTeam( team ) +{ + if ( team == self.ownerTeam ) + return "friendly"; + else if ( team == self.enemyTeam ) + return "enemy"; + else + return "neutral"; +} + +isFriendlyTeam( team ) +{ + if ( self.ownerTeam == "any" || self.ownerTeam == team ) + return true; + + return false; +} + +canInteractWith( team ) +{ + switch( self.interactTeam ) + { + case "none": + return false; + + case "any": + return true; + + case "friendly": + if ( team == self.ownerTeam ) + return true; + else + return false; + + case "enemy": + if ( team != self.ownerTeam ) + return true; + else + return false; + + default: + return false; + } +} + +_disableWeapon() +{ + self allowsprint(false); + self allowjump(false); + self setMoveSpeedScale( 0 ); + + self disableweapons(); + + self thread xunlink(); +} + +xunlink() +{ + self endon("disconnect"); + + wait 0.05; + self unlink(); +} + +_enableWeapon() +{ + self endon("disconnect"); + + self enableweapons(); + + wait 0.05; + + self allowsprint(true); + self allowjump(true); + self setMoveSpeedScale( 1.0 - 0.05 * int( isDefined( self.curClass ) && self.curClass == "assault" ) ); +} + +getEnemyTeam( team ) +{ + switch(team) + { + case "allies": + return "axis"; + case "axis": + return "allies"; + default: + return "none"; + } +} + +getNextObjID() +{ + nextID = level.numGametypeReservedObjectives; + + level.numGametypeReservedObjectives++; + return nextID; +} + +getLabel() +{ + label = self.trigger.script_label; + if ( !isDefined( label ) ) + { + label = ""; + return label; + } + + if ( label[0] != "_" ) + return ("_" + label); + + return label; +} \ No newline at end of file diff --git a/maps/mp/gametypes/_globallogic.gsc b/maps/mp/gametypes/_globallogic.gsc new file mode 100644 index 0000000..607a94d --- /dev/null +++ b/maps/mp/gametypes/_globallogic.gsc @@ -0,0 +1,3678 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + +init() +{ + if ( !isDefined( level.tweakablesInitialized ) ) + maps\mp\gametypes\_tweakables::init(); + + level.splitscreen = 0; + level.xenon = 0; + level.ps3 = 0; + level.console = 0; + level.oldschool = 0; + + level.onlineGame = false; + level.rankedMatch = false; + + level.script = toLower( getDvar( "mapname" ) ); + level.gametype = toLower( getDvar( "g_gametype" ) ); + + checkRestartMap(); + + level.otherTeam["allies"] = "axis"; + level.otherTeam["axis"] = "allies"; + + level.teamBased = false; + + level.overrideTeamScore = false; + level.overridePlayerScore = false; + level.displayHalftimeText = false; + level.displayRoundEndText = true; + + level.endGameOnScoreLimit = true; + level.endGameOnTimeLimit = true; + + precacheString( &"MP_HALFTIME" ); + precacheString( &"MP_OVERTIME" ); + precacheString( &"MP_ROUNDEND" ); + precacheString( &"MP_INTERMISSION" ); + precacheString( &"MP_SWITCHING_SIDES" ); + precacheString( &"MP_CONNECTED" ); + + level.halftimeType = "halftime"; + level.halftimeSubCaption = &"MP_SWITCHING_SIDES"; + + level.lastStatusTime = 0; + level.wasWinning = "none"; + + level.lastSlowProcessFrame = 0; + + level.placement["allies"] = []; + level.placement["axis"] = []; + level.placement["all"] = []; + + level.postRoundTime = 5; + + level.inOvertime = false; + + level.players = []; + + level.shoutbars = []; + + registerDvars(); + + precacheModel( "tag_origin" ); + + precacheShader( "faction_128_usmc" ); + precacheShader( "faction_128_arab" ); + precacheShader( "faction_128_ussr" ); + precacheShader( "faction_128_sas" ); + + if ( !isDefined( game["tiebreaker"] ) ) + game["tiebreaker"] = false; + + if ( !isDefined( game["gamestarted"] ) ) + promod\modes::main(); + + level.hardcoreMode = getDvarInt( "scr_hardcore" ); + level.roundswitch = getDvarInt( "scr_" + level.gametype + "_roundswitch" ); + level.roundLimit = getDvarInt( "scr_" + level.gametype + "_roundlimit" ); + level.timelimit = getDvarFloat( "scr_" + level.gametype + "_timelimit" ); + level.scoreLimit = getDvarInt( "scr_" + level.gametype + "_scorelimit" ); + level.numLives = getDvarInt( "scr_" + level.gametype + "_numlives" ); + + setDvar( "ui_scorelimit", level.scoreLimit ); + setDvar( "ui_timelimit", level.timelimit ); + + if ( level.hardcoreMode ) + setDvar( "scr_player_maxhealth", 30 ); + else + setDvar( "scr_player_maxhealth", 100 ); +} + +registerDvars() +{ + setDvar( "ui_bomb_timer", 0 ); + makeDvarServerInfo( "ui_bomb_timer" ); +} + +SetupCallbacks() +{ + level.spawnPlayer = ::spawnPlayer; + level.spawnClient = ::spawnClient; + level.spawnSpectator = ::spawnSpectator; + level.spawnIntermission = ::spawnIntermission; + level.onPlayerScore = ::default_onPlayerScore; + level.onTeamScore = ::default_onTeamScore; + + level.onXPEvent = ::onXPEvent; + level.waveSpawnTimer = ::waveSpawnTimer; + + level.onSpawnPlayer = ::blank; + level.onSpawnSpectator = ::default_onSpawnSpectator; + level.onSpawnIntermission = ::default_onSpawnIntermission; + level.onRespawnDelay = ::blank; + + level.onTimeLimit = ::default_onTimeLimit; + level.onScoreLimit = ::default_onScoreLimit; + level.onDeadEvent = ::default_onDeadEvent; + level.onOneLeftEvent = ::default_onOneLeftEvent; + level.giveTeamScore = ::giveTeamScore; + level.givePlayerScore = ::givePlayerScore; + + level._setTeamScore = ::_setTeamScore; + level._setPlayerScore = ::_setPlayerScore; + + level._getTeamScore = ::_getTeamScore; + level._getPlayerScore = ::_getPlayerScore; + + level.onPrecacheGametype = ::blank; + level.onStartGameType = ::blank; + level.onPlayerConnect = ::blank; + level.onPlayerDisconnect = ::blank; + level.onPlayerDamage = ::blank; + level.onPlayerKilled = ::blank; + + level.onEndGame = ::blank; + + level.autoassign = ::menuAutoAssign; + level.spectator = ::menuSpectator; + level.killspec = ::menuKillspec; + level.allies = ::menuAllies; + level.axis = ::menuAxis; +} + +WaitTillSlowProcessAllowed() +{ + while ( level.lastSlowProcessFrame == gettime() ) + wait 0.05; + + level.lastSlowProcessFrame = gettime(); +} + +blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 ) +{ +} + +default_onDeadEvent( team ) +{ + if ( team == "allies" ) + { + iPrintLn( game["strings"]["allies_eliminated"] ); + makeDvarServerInfo( "ui_text_endreason", game["strings"]["allies_eliminated"] ); + setDvar( "ui_text_endreason", game["strings"]["allies_eliminated"] ); + + thread endGame( "axis", game["strings"]["allies_eliminated"] ); + } + else if ( team == "axis" ) + { + iPrintLn( game["strings"]["axis_eliminated"] ); + makeDvarServerInfo( "ui_text_endreason", game["strings"]["axis_eliminated"] ); + setDvar( "ui_text_endreason", game["strings"]["axis_eliminated"] ); + + thread endGame( "allies", game["strings"]["axis_eliminated"] ); + } + else + { + makeDvarServerInfo( "ui_text_endreason", game["strings"]["tie"] ); + setDvar( "ui_text_endreason", game["strings"]["tie"] ); + + if ( level.teamBased ) + thread endGame( "tie", game["strings"]["tie"] ); + else + thread endGame( undefined, game["strings"]["tie"] ); + } +} + +default_onOneLeftEvent( team ) +{ + if ( !level.teamBased ) + { + winner = getHighestScoringPlayer(); + thread endGame( winner, &"MP_ENEMIES_ELIMINATED" ); + } +} + +default_onTimeLimit() +{ + winner = undefined; + + if ( level.teamBased ) + { + if ( game["teamScores"]["allies"] == game["teamScores"]["axis"] ) + winner = "tie"; + else if ( game["teamScores"]["axis"] > game["teamScores"]["allies"] ) + winner = "axis"; + else + winner = "allies"; + } + else + winner = getHighestScoringPlayer(); + + makeDvarServerInfo( "ui_text_endreason", game["strings"]["time_limit_reached"] ); + setDvar( "ui_text_endreason", game["strings"]["time_limit_reached"] ); + + thread endGame( winner, game["strings"]["time_limit_reached"] ); +} + +default_onScoreLimit() +{ + if ( !level.endGameOnScoreLimit ) + return; + + winner = undefined; + + if ( level.teamBased ) + { + if ( game["teamScores"]["allies"] == game["teamScores"]["axis"] ) + winner = "tie"; + else if ( game["teamScores"]["axis"] > game["teamScores"]["allies"] ) + winner = "axis"; + else + winner = "allies"; + } + else + winner = getHighestScoringPlayer(); + + makeDvarServerInfo( "ui_text_endreason", game["strings"]["score_limit_reached"] ); + setDvar( "ui_text_endreason", game["strings"]["score_limit_reached"] ); + + level.forcedEnd = true; + thread endGame( winner, game["strings"]["score_limit_reached"] ); +} + +updateGameEvents() +{ + if ( ( !level.numLives && !level.inOverTime ) || level.inGracePeriod ) + return; + + if ( level.teamBased ) + { + if ( level.everExisted["allies"] && !level.aliveCount["allies"] && level.everExisted["axis"] && !level.aliveCount["axis"] && !level.playerLives["allies"] && !level.playerLives["axis"] ) + { + [[level.onDeadEvent]]( "all" ); + return; + } + + if ( level.everExisted["allies"] && !level.aliveCount["allies"] && !level.playerLives["allies"] ) + { + [[level.onDeadEvent]]( "allies" ); + return; + } + + if ( level.everExisted["axis"] && !level.aliveCount["axis"] && !level.playerLives["axis"] ) + { + [[level.onDeadEvent]]( "axis" ); + return; + } + + if ( level.lastAliveCount["allies"] > 1 && level.aliveCount["allies"] == 1 && level.playerLives["allies"] == 1 ) + { + [[level.onOneLeftEvent]]( "allies" ); + return; + } + + if ( level.lastAliveCount["axis"] > 1 && level.aliveCount["axis"] == 1 && level.playerLives["axis"] == 1 ) + { + [[level.onOneLeftEvent]]( "axis" ); + return; + } + } + else + { + if ( (!level.aliveCount["allies"] && !level.aliveCount["axis"]) && (!level.playerLives["allies"] && !level.playerLives["axis"]) && level.maxPlayerCount > 1 ) + { + [[level.onDeadEvent]]( "all" ); + return; + } + + if ( (level.aliveCount["allies"] + level.aliveCount["axis"] == 1) && (level.playerLives["allies"] + level.playerLives["axis"] == 1) && level.maxPlayerCount > 1 ) + { + [[level.onOneLeftEvent]]( "all" ); + return; + } + } +} + +matchStartTimer() +{ + visionSetNaked( "mpIntro", 0 ); + + matchStartText = createServerFontString( "objective", 1.5 ); + matchStartText setPoint( "CENTER", "CENTER", 0, -60 ); + matchStartText.sort = 1001; + matchStartText setText( game["strings"]["match_starting_in"] ); + matchStartText.foreground = false; + matchStartText.hidewheninmenu = true; + + matchStartTimer = createServerTimer( "objective", 1.4 ); + matchStartTimer setPoint( "CENTER", "CENTER", 0, -45 ); + matchStartTimer setTimer( level.prematchPeriod ); + matchStartTimer.sort = 1001; + matchStartTimer.foreground = false; + matchStartTimer.hideWhenInMenu = true; + + wait level.prematchPeriod; + + visionSetNaked( getDvar( "mapname" ), 1 ); + + matchStartText destroyElem(); + matchStartTimer destroyElem(); +} + +matchStartTimerSkip() +{ + visionSetNaked( getDvar( "mapname" ), 0 ); +} + +spawnPlayer() +{ + prof_begin( "spawnPlayer_preUTS" ); + + self endon("disconnect"); + self endon("joined_spectators"); + self endon("joined_team"); + self notify("spawned"); + self notify("end_respawn"); + + self setSpawnVariables(); + + if ( isDefined( self.proxBar ) ) + self.proxBar destroyElem(); + if ( isDefined( self.proxBarText ) ) + self.proxBarText destroyElem(); + if ( isDefined( self.xpBar ) ) + self.xpBar destroyElem(); + + if ( level.teamBased ) + self.sessionteam = self.team; + else + self.sessionteam = "none"; + + hadSpawned = self.hasSpawned; + + self.sessionstate = "playing"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + + self.maxhealth = maps\mp\gametypes\_tweakables::getTweakableValue( "player", "maxhealth" ); + self.health = self.maxhealth; + self.hasSpawned = true; + self.spawnTime = getTime(); + + if ( self.pers["lives"] ) + self.pers["lives"]--; + + if ( !self.wasAliveAtMatchStart ) + { + acceptablePassedTime = 20; + if ( level.timeLimit > 0 && acceptablePassedTime < level.timeLimit * 15 ) + acceptablePassedTime = level.timeLimit * 15; + + if ( level.inGracePeriod || getTimePassed() < acceptablePassedTime * 1000 ) + self.wasAliveAtMatchStart = true; + } + + [[level.onSpawnPlayer]](); + + prof_end( "spawnPlayer_preUTS" ); + + level thread updateTeamStatus(); + + prof_begin( "spawnPlayer_postUTS" ); + + if ( isDefined( game["PROMOD_KNIFEROUND"] ) && game["PROMOD_KNIFEROUND"] && isDefined( level.strat_over ) && level.strat_over ) + self thread removeWeapons(); + else + self maps\mp\gametypes\_class::giveLoadout( self.team, self.class ); + + if ( level.inPrematchPeriod && game["promod_do_readyup"] ) + self freezeControls( true ); + else if ( level.inPrematchPeriod ) + { + self freezeControls( true ); + + team = self.pers["team"]; + thread maps\mp\gametypes\_hud_message::oldNotifyMessage( game["strings"][team + "_name"], undefined, game["icons"][team], game["colors"][team] ); + } + else + { + self freezeControls( false ); + self enableWeapons(); + if ( !hadSpawned && isDefined( game["state"] ) && game["state"] == "playing" ) + { + team = self.team; + thread maps\mp\gametypes\_hud_message::oldNotifyMessage( game["strings"][team + "_name"], undefined, game["icons"][team], game["colors"][team] ); + } + } + + if ( isDefined( level.strat_over ) && !level.strat_over ) + { + self allowsprint(false); + self allowjump(false); + self setMoveSpeedScale( 0 ); + } + + prof_end( "spawnPlayer_postUTS" ); + + wait 0.1; + + self notify( "spawned_player" ); + + if ( isDefined( game["state"] ) && game["state"] == "postgame" ) + self freezePlayerForRoundEnd(); + + waittillframeend; + + if ( !isDefined( level.rdyup ) || !level.rdyup ) + self.statusicon = ""; + + self promod\shoutcast::updatePlayer(); +} + +removeWeapons() +{ + self endon("disconnect"); + + self maps\mp\gametypes\_class::giveLoadout( self.team, self.class ); + + wait 0.05; + + attachment = ""; + if(self.pers[self.pers["class"]]["loadout_secondary_attachment"] == "silencer") + attachment = "_silencer"; + + sidearmWeapon = self.pers[self.pers["class"]]["loadout_secondary"]+attachment+"_mp"; + + self takeAllWeapons(); + self giveWeapon(sidearmWeapon, 0); + self setweaponammoclip(sidearmWeapon, 0); + self setweaponammostock(sidearmWeapon, 0); + self switchtoWeapon(sidearmWeapon); + self setclientdvar("g_compassShowEnemies", 1); +} + +spawnSpectator( origin, angles ) +{ + self notify("spawned"); + self notify("end_respawn"); + in_spawnSpectator( origin, angles ); +} + +respawn_asSpectator( origin, angles ) +{ + in_spawnSpectator( origin, angles ); +} + +in_spawnSpectator( origin, angles ) +{ + self setSpawnVariables(); + + if ( self.pers["team"] == "spectator" ) + self clearLowerMessage(); + + self.sessionstate = "spectator"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + + if(self.pers["team"] == "spectator") + { + if ( !isDefined( level.rdyup ) || !level.rdyup ) + self.statusicon = ""; + + if ( !isDefined( self.freelook ) ) + self thread monitorFreeLook(); + } + + maps\mp\gametypes\_spectating::setSpectatePermissions(); + + [[level.onSpawnSpectator]]( origin, angles ); + + level thread updateTeamStatus(); +} + +getPlayerFromClientNum( clientNum ) +{ + if ( clientNum < 0 ) + return undefined; + + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i] getEntityNumber() == clientNum ) + return level.players[i]; + } + return undefined; +} + +waveSpawnTimer() +{ + level endon( "game_ended" ); + + while ( isDefined( game["state"] ) && game["state"] == "playing" ) + { + time = getTime(); + + if ( time - level.lastWave["allies"] > (level.waveDelay["allies"] * 1000) ) + { + level notify ( "wave_respawn_allies" ); + level.lastWave["allies"] = time; + level.wavePlayerSpawnIndex["allies"] = 0; + } + + if ( time - level.lastWave["axis"] > (level.waveDelay["axis"] * 1000) ) + { + level notify ( "wave_respawn_axis" ); + level.lastWave["axis"] = time; + level.wavePlayerSpawnIndex["axis"] = 0; + } + + wait 0.05; + } +} + +freeLook( condition ) +{ + if ( getDvarInt( "scr_game_spectatetype" ) == 1 ) + { + if ( condition ) + wait 0.1; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if ( player.pers["team"] == "spectator" ) + { + if ( !isDefined( player.freelook ) || !player.freelook ) + player allowSpectateTeam( "freelook", condition ); + } + } + } +} + +monitorFreeLook() +{ + self.freelook = true; + + self thread checkADS(); + self thread checkAttack(); + self thread checkMelee(); +} + +checkMelee() +{ + self endon("disconnect"); + self endon("joined_team"); + + waittillframeend; + + for(;;) + { + if ( self meleeButtonPressed() ) + { + self notify ( "stop_follow" ); + self.freelook = true; + self.spectatorlast = undefined; + } + + while ( self meleeButtonPressed() ) + { + wait 0.05; + continue; + } + + wait 0.05; + } +} + +checkAttack() +{ + self endon("disconnect"); + self endon("joined_team"); + + waittillframeend; + + for(;;) + { + if ( self attackButtonPressed() ) + { + for ( i = 0; i < level.players.size; i++ ) + { + players = level.players[i]; + + if ( isAlive( players ) && ( ( players.pers["team"] == "allies" || players.pers["team"] == "axis" ) ) ) + { + self notify ( "stop_follow" ); + self.freelook = false; + break; + } + } + } + + while ( self attackButtonPressed() ) + { + wait 0.05; + continue; + } + + wait 0.05; + } +} + +checkADS() +{ + self endon("disconnect"); + self endon("joined_team"); + + waittillframeend; + + for(;;) + { + while( !self adsButtonPressed() ) + wait 0.05; + + for ( i = 0; i < level.players.size; i++ ) + { + players = level.players[i]; + + if ( isAlive( players ) && ( ( players.pers["team"] == "allies" || players.pers["team"] == "axis" ) ) ) + { + self notify ( "stop_follow" ); + self.freelook = false; + break; + } + } + + while( self adsButtonPressed() ) + wait 0.05; + } +} + +default_onSpawnSpectator( origin, angles) +{ + thread freeLook( false ); + + if( isDefined( origin ) && isDefined( angles ) ) + { + self spawn(origin, angles); + thread freeLook( true ); + return; + } + + spawnpointname = "mp_global_intermission"; + spawnpoints = getentarray(spawnpointname, "classname"); + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints); + + self spawn(spawnpoint.origin, spawnpoint.angles); + + thread freeLook( true ); +} + +spawnIntermission() +{ + self notify("spawned"); + self notify("end_respawn"); + + self setSpawnVariables(); + + self clearLowerMessage(); + + self freezeControls( false ); + + self.sessionstate = "intermission"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + + [[level.onSpawnIntermission]](); + self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 ); +} + +default_onSpawnIntermission() +{ + spawnpointname = "mp_global_intermission"; + spawnpoints = getentarray(spawnpointname, "classname"); + spawnpoint = spawnPoints[0]; + + if( isDefined( spawnpoint ) ) + self spawn( spawnpoint.origin, spawnpoint.angles ); +} + +timeUntilRoundEnd() +{ + if ( level.gameEnded ) + { + timePassed = (getTime() - level.gameEndTime) / 1000; + timeRemaining = level.postRoundTime - timePassed; + + if ( timeRemaining < 0 ) + return 0; + + return timeRemaining; + } + + if ( level.inOvertime || level.timeLimit <= 0 || !isDefined( level.startTime ) ) + return undefined; + + timePassed = (getTime() - level.startTime)/1000; + timeRemaining = (level.timeLimit * 60) - timePassed; + + return timeRemaining + level.postRoundTime; +} + +freezePlayerForRoundEnd() +{ + self clearLowerMessage(); +} + +freeGameplayHudElems() +{ + if ( isDefined( self.lowerMessage ) ) + self.lowerMessage destroyElem(); + if ( isDefined( self.lowerTimer ) ) + self.lowerTimer destroyElem(); + + if ( isDefined( self.proxBar ) ) + self.proxBar destroyElem(); + if ( isDefined( self.proxBarText ) ) + self.proxBarText destroyElem(); +} + +endGame( winner, endReasonText ) +{ + if ( isDefined( game["state"] ) && game["state"] == "postgame" ) + return; + + if ( isDefined( level.onEndGame ) ) + [[level.onEndGame]]( winner ); + + if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" ) + setDvar( "g_deadChat", 1 ); + + game["state"] = "postgame"; + level.gameEndTime = getTime(); + level.gameEnded = true; + level.inGracePeriod = false; + + level notify ( "game_ended" ); + + setGameEndTime( 0 ); + + updatePlacement(); + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + player freezePlayerForRoundEnd(); + player thread roundEndDoF( 4 ); + player freeGameplayHudElems(); + } + + if ( isDefined( level.scorebot ) && level.scorebot ) + { + winners = ""; + if ( winner == "allies" ) + { + if ( game["attackers"] == "allies" && game["defenders"] == "axis" ) + winners = "attack"; + else + winners = "defence"; + } + else if ( winner == "axis" ) + { + if ( game["attackers"] == "allies" && game["defenders"] == "axis" ) + winners = "defence"; + else + winners = "attack"; + } + else + winners = "tie"; + + attack_score = game["teamScores"]["allies"]; + defence_score = game["teamScores"]["axis"]; + + game["promod_scorebot_ticker_buffer"] += "round_winner" + winners + "" + attack_score + "" + defence_score; + } + + if ( (level.roundLimit > 1 || (!level.roundLimit && level.scoreLimit != 1)) && !level.forcedEnd ) + { + if ( level.displayRoundEndText ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( level.teamBased ) + player thread maps\mp\gametypes\_hud_message::teamOutcomeNotify( winner, true, endReasonText, 0.75 ); + else + player thread maps\mp\gametypes\_hud_message::outcomeNotify( winner, endReasonText, 0.75 ); + + if ( isDefined( player.pers["team"] ) && player.pers["team"] == "spectator" ) + continue; + + player setClientDvars( + "ui_hud_hardcore", 1, + "cg_drawSpectatorMessages", 0, + "g_compassShowEnemies", 0 ); + } + + level thread header(); + + if ( hitRoundLimit() || hitScoreLimit() ) + roundEndWait( level.roundEndDelay / 2 ); + else + roundEndWait( level.roundEndDelay ); + } + + game["roundsplayed"]++; + roundSwitching = false; + if ( !hitRoundLimit() && !hitScoreLimit() ) + roundSwitching = checkRoundSwitch(); + + if ( roundSwitching && level.teamBased ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if( player.pers["team"] == "spectator" ) + player setClientDvars( + "shout_scores_attack", game["teamScores"][game["defenders"]], + "shout_scores_defence", game["teamScores"][game["attackers"]] ); + + if ( !isDefined( player.pers["team"] ) || player.pers["team"] == "spectator" ) + { + player [[level.spawnIntermission]](); + player closeMenu(); + player closeInGameMenu(); + continue; + } + + switchType = level.halftimeType; + if ( switchType == "halftime" ) + { + if ( level.roundLimit ) + { + if ( (game["roundsplayed"] * 2) == level.roundLimit ) + switchType = "halftime"; + else + switchType = "intermission"; + } + else if ( level.scoreLimit ) + { + if ( game["roundsplayed"] == (level.scoreLimit - 1) ) + switchType = "halftime"; + else + switchType = "intermission"; + } + else + switchType = "intermission"; + } + + player thread maps\mp\gametypes\_hud_message::teamOutcomeNotify( switchType, true, level.halftimeSubCaption ); + player setClientDvar( "ui_hud_hardcore", 1 ); + + if ( player.pers["team"] == "axis" ) + { + player.switching = true; + player menuAllies(); + } + else if( player.pers["team"] == "allies" ) + { + player.switching = true; + player menuAxis(); + } + } + + old_score = game["teamScores"]["allies"]; + game["teamScores"]["allies"] = game["teamScores"]["axis"]; + game["teamScores"]["axis"] = old_score; + + game["allies_timeout_called"] = 0; + game["axis_timeout_called"] = 0; + + thread maps\mp\gametypes\_promod::updateClassAvailability( "allies" ); + thread maps\mp\gametypes\_promod::updateClassAvailability( "axis" ); + + roundEndWait( level.halftimeRoundEndDelay ); + } + else if ( !hitRoundLimit() && !hitScoreLimit() && !level.displayRoundEndText && level.teamBased ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( !isDefined( player.pers["team"] ) || player.pers["team"] == "spectator" ) + { + player [[level.spawnIntermission]](); + player closeMenu(); + player closeInGameMenu(); + continue; + } + + switchType = level.halftimeType; + if ( switchType == "halftime" ) + { + if ( level.roundLimit ) + { + if ( (game["roundsplayed"] * 2) == level.roundLimit ) + switchType = "halftime"; + else + switchType = "roundend"; + } + else if ( level.scoreLimit ) + { + if ( game["roundsplayed"] == (level.scoreLimit - 1) ) + switchType = "halftime"; + else + switchTime = "roundend"; + } + } + + player thread maps\mp\gametypes\_hud_message::teamOutcomeNotify( switchType, true, endReasonText ); + player setClientDvar( "ui_hud_hardcore", 1 ); + } + + roundEndWait( level.halftimeRoundEndDelay ); + } + + if ( isDefined(game["PROMOD_KNIFEROUND"]) && game["PROMOD_KNIFEROUND"] ) + { + if(isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match") + { + game["promod_do_readyup"] = 1; + game["promod_first_readyup_done"] = 0; + for(i=0;i getGameScore( "axis" ) ) + winner = "allies"; + else + winner = "axis"; + + return winner; +} + +roundEndWait( defaultDelay ) +{ + notifiesDone = false; + while ( !notifiesDone ) + { + notifiesDone = true; + for ( i = 0; i < level.players.size; i++ ) + { + players = level.players[i]; + if ( !isDefined( players.doingNotify ) || !players.doingNotify ) + continue; + + notifiesDone = false; + } + wait 0.5; + } + + wait defaultDelay; +} + +roundEndDOF( time ) +{ + self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 ); +} + +getHighestScoringPlayer() +{ + winner = undefined; + tie = false; + + for( i = 0; i < level.players.size; i++ ) + { + players = level.players[i]; + if ( !isDefined( players.score ) || players.score < 1 ) + continue; + + if ( !isDefined( winner ) || players.score > winner.score ) + { + winner = players; + tie = false; + } + else if ( players.score == winner.score ) + tie = true; + } + + if ( tie || !isDefined( winner ) ) + return undefined; + else + return winner; +} + +checkTimeLimit() +{ + if ( isDefined( level.timeLimitOverride ) && level.timeLimitOverride ) + return; + + if ( !isDefined( game["state"] ) || game["state"] != "playing" ) + { + setGameEndTime( 0 ); + return; + } + + if ( level.timeLimit <= 0 ) + { + setGameEndTime( 0 ); + return; + } + + if ( level.inPrematchPeriod ) + { + setGameEndTime( 0 ); + return; + } + + if ( !isdefined( level.startTime ) ) + return; + + timeLeft = getTimeRemaining(); + + setGameEndTime( getTime() + int(timeLeft) ); + + if ( timeLeft > 0 ) + return; + + [[level.onTimeLimit]](); +} + +getTimeRemaining() +{ + return level.timeLimit * 60000 - getTimePassed(); +} + +checkScoreLimit() +{ + if ( ( !isDefined( game["state"] ) || game["state"] != "playing" ) || level.scoreLimit <= 0 || ( level.teamBased && game["teamScores"]["allies"] < level.scoreLimit && game["teamScores"]["axis"] < level.scoreLimit) || ( !level.teamBased && ( !isPlayer( self ) || self.score < level.scoreLimit ) ) ) + return; + + [[level.onScoreLimit]](); +} + +hitRoundLimit() +{ + if( level.roundLimit <= 0 ) + return false; + + return ( game["roundsplayed"] >= level.roundLimit ); +} + +hitScoreLimit() +{ + if( level.scoreLimit <= 0 ) + return false; + + if ( level.teamBased ) + { + if( game["teamScores"]["allies"] >= level.scoreLimit || game["teamScores"]["axis"] >= level.scoreLimit ) + return true; + } + else + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if ( isDefined( player.score ) && player.score >= level.scorelimit ) + return true; + } + } + return false; +} + +updateGameTypeDvars() +{ + level endon ( "game_ended" ); + + while ( isDefined( game["state"] ) && game["state"] == "playing" ) + { + thread checkTimeLimit(); + thread checkScoreLimit(); + + if ( isdefined( level.startTime ) && getTimeRemaining() < 3000 ) + { + wait 0.1; + continue; + } + wait 1; + } +} + +menuAutoAssign() +{ + teams[0] = "allies"; + teams[1] = "axis"; + assignment = teams[randomInt(2)]; + + self closeMenus(); + + if ( level.teamBased ) + { + playerCounts = self maps\mp\gametypes\_teams::CountPlayers(); + + if ( playerCounts["allies"] == playerCounts["axis"] ) + { + if( getTeamScore( "allies" ) == getTeamScore( "axis" ) ) + assignment = teams[randomInt(2)]; + else if ( getTeamScore( "allies" ) < getTeamScore( "axis" ) ) + assignment = "allies"; + else + assignment = "axis"; + } + else if( playerCounts["allies"] < playerCounts["axis"] ) + assignment = "allies"; + else + assignment = "axis"; + + if ( assignment == self.pers["team"] && (self.sessionstate == "playing" || self.sessionstate == "dead") ) + { + self beginClassChoice(); + return; + } + } + + if ( assignment != self.pers["team"] && self.sessionstate == "playing" ) + { + self.switching_teams = true; + self.joining_team = assignment; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + oldTeam = self.pers["team"]; + + self.pers["class"] = undefined; + self.class = undefined; + self.pers["team"] = assignment; + self.team = assignment; + self setClientDvar( "loadout_curclass", "" ); + + if(isDefined(self.pers["shoutnum"])) + self promod\shoutcast::removePlayer(); + + self updateObjectiveText(); + + if ( level.teamBased ) + self.sessionteam = assignment; + else + self.sessionteam = "none"; + + if ( !isDefined( level.rdyup ) || !level.rdyup ) + { + if ( !isAlive( self ) ) + self.statusicon = "hud_status_dead"; + else + self.statusicon = ""; + } + + self notify("joined_team"); + self notify("end_respawn"); + + self.freelook = undefined; + + if( self.pers["team"] == "allies" && oldTeam != self.pers["team"] ) + { + if( game["attackers"] == "allies" && game["defenders"] == "axis" ) + iPrintLN(self.name + " Joined Attack"); + else + iPrintLN(self.name + " Joined Defence"); + } + else if( self.pers["team"] == "axis" && oldTeam != self.pers["team"] ) + { + if( game["attackers"] == "allies" && game["defenders"] == "axis" ) + iPrintLN(self.name + " Joined Defence"); + else + iPrintLN(self.name + " Joined Attack"); + } + + if ( oldTeam != self.pers["team"] && ( oldTeam == "allies" || oldTeam == "axis" ) ) + thread maps\mp\gametypes\_promod::updateClassAvailability( oldTeam ); + + self setClientDvars("g_compassShowEnemies", 0, "cg_scoreboardheight", 435 ); + + self beginClassChoice(); + + self setclientdvar( "g_scriptMainMenu", game[ "menu_class_" + self.pers["team"] ] ); +} + +updateObjectiveText() +{ + if ( self.pers["team"] == "spectator" ) + { + self setClientDvar( "cg_objectiveText", "" ); + return; + } + + if( level.scorelimit > 0 ) + self setclientdvar( "cg_objectiveText", getObjectiveScoreText( self.pers["team"] ), level.scorelimit ); + else + self setclientdvar( "cg_objectiveText", getObjectiveText( self.pers["team"] ) ); +} + +closeMenus() +{ + self closeMenu(); + self closeInGameMenu(); +} + +beginClassChoice() +{ + if ( self.pers["team"] == "axis" || self.pers["team"] == "allies" ) + self openMenu( game[ "menu_changeclass_" + self.pers["team"] ] ); +} + +menuAllies() +{ + if ( self.pers["team"] == "allies" ) + return; + + self closeMenus(); + + if ( !isDefined( self.switching ) ) + self.switching = false; + + if ( self.pers["team"] != "allies" ) + { + if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] != "match" && level.teamBased && !self.switching && !maps\mp\gametypes\_teams::getJoinTeamPermissions( "allies" ) ) + { + self openMenu(game["menu_team"]); + return; + } + + if ( level.inGracePeriod && (!isdefined(self.hasDoneCombat) || !self.hasDoneCombat) ) + self.hasSpawned = false; + + if( self.sessionstate == "playing" && !self.switching ) + { + self.switching_teams = true; + self.joining_team = "allies"; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + oldTeam = self.pers["team"]; + + if ( self.switching ) + { + self.pers["team"] = "allies"; + self.team = "allies"; + } + else + { + self.pers["class"] = undefined; + self.class = undefined; + self.pers["team"] = "allies"; + self.team = "allies"; + self setClientDvar( "loadout_curclass", "" ); + } + + if(isDefined(self.pers["shoutnum"])) + self promod\shoutcast::removePlayer(); + + self updateObjectiveText(); + + if ( level.teamBased ) + self.sessionteam = "allies"; + else + self.sessionteam = "none"; + + if ( !isDefined( level.rdyup ) || !level.rdyup ) + { + if ( !isAlive( self ) ) + self.statusicon = "hud_status_dead"; + else + self.statusicon = ""; + } + + self setclientdvar("g_scriptMainMenu", game["menu_class_allies"]); + + self notify("joined_team"); + self notify("end_respawn"); + + self.freelook = undefined; + + if( game["attackers"] == "allies" && game["defenders"] == "axis" && !self.switching ) + iprintln(self.name + " Joined Attack"); + else if ( !self.switching ) + iprintln(self.name + " Joined Defence"); + + if ( oldTeam == "axis" ) + thread maps\mp\gametypes\_promod::updateClassAvailability( oldTeam ); + + self setClientDvars("g_compassShowEnemies", 0, "cg_scoreboardheight", 435 ); + } + + if ( !self.switching ) + self beginClassChoice(); + + self.switching = false; +} + +menuAxis() +{ + if ( self.pers["team"] == "axis" ) + return; + + self closeMenus(); + + if ( !isDefined( self.switching ) ) + self.switching = false; + + if ( self.pers["team"] != "axis" ) + { + if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] != "match" && level.teamBased && !self.switching && !maps\mp\gametypes\_teams::getJoinTeamPermissions( "allies" ) ) + { + self openMenu(game["menu_team"]); + return; + } + + if ( level.inGracePeriod && (!isdefined(self.hasDoneCombat) || !self.hasDoneCombat) ) + self.hasSpawned = false; + + if( self.sessionstate == "playing" && !self.switching ) + { + self.switching_teams = true; + self.joining_team = "axis"; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + oldTeam = self.pers["team"]; + + if ( self.switching ) + { + self.pers["team"] = "axis"; + self.team = "axis"; + } + else + { + self.pers["class"] = undefined; + self.class = undefined; + self.pers["team"] = "axis"; + self.team = "axis"; + self setClientDvar( "loadout_curclass", "" ); + } + + if(isDefined(self.pers["shoutnum"])) + self promod\shoutcast::removePlayer(); + + self updateObjectiveText(); + + if ( level.teamBased ) + self.sessionteam = "axis"; + else + self.sessionteam = "none"; + + if ( !isDefined( level.rdyup ) || !level.rdyup ) + { + if ( !isAlive( self ) ) + self.statusicon = "hud_status_dead"; + else + self.statusicon = ""; + } + + self setclientdvar("g_scriptMainMenu", game["menu_class_axis"]); + + self notify("joined_team"); + self notify("end_respawn"); + + self.freelook = undefined; + + if( game["attackers"] == "allies" && game["defenders"] == "axis" && !self.switching ) + iprintln(self.name + " Joined Defence"); + else if ( !self.switching ) + iprintln(self.name + " Joined Attack"); + + if ( oldTeam == "allies" ) + thread maps\mp\gametypes\_promod::updateClassAvailability( oldTeam ); + + self setClientDvars("g_compassShowEnemies", 0, "cg_scoreboardheight", 435 ); + } + + if ( !self.switching ) + self beginClassChoice(); + + self.switching = false; +} + +menuKillspec() +{ + if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" ) + return; + + self closeMenus(); + + if( self.sessionstate == "playing" ) + self suicide(); + + self.pers["class"] = undefined; + self.class = undefined; + self iprintln("Choose a class to respawn"); + self setClientDvar("loadout_curclass", ""); + self thread [[level.spawnSpectator]]( self.origin, self.angles ); + + thread maps\mp\gametypes\_promod::updateClassAvailability( self.pers["team"] ); + + if(isDefined(self.pers["shoutnum"])) + self promod\shoutcast::removePlayer(); +} + +menuSpectator() +{ + if ( self.pers["team"] == "spectator" ) + return; + + self closeMenus(); + self openMenu(game["menu_shoutcast"]); + + if(self.pers["team"] != "spectator") + { + if(self.sessionstate == "playing") + { + self.switching_teams = true; + self.joining_team = "spectator"; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + oldTeam = self.pers["team"]; + + self.pers["class"] = undefined; + self.class = undefined; + self.pers["team"] = "spectator"; + self.team = "spectator"; + self setClientDvar( "loadout_curclass", "" ); + + if(isDefined(self.pers["shoutnum"])) + self promod\shoutcast::removePlayer(); + + self updateObjectiveText(); + + self.sessionteam = "spectator"; + self thread [[level.spawnSpectator]]( self.origin, self.angles ); + + if( game["attackers"] == "allies" && game["defenders"] == "axis" ) + self setClientDvars( + "shout_attack_name", "Attack", + "shout_defence_name", "Defence" ); + else + self setClientDvars( + "shout_attack_name", "Defence", + "shout_defence_name", "Attack" ); + + self setClientDvars( + "shout_scores_attack", game["teamScores"][game["attackers"]], + "shout_scores_defence", game["teamScores"][game["defenders"]] ); + + self setclientdvar( "g_scriptMainMenu", game["menu_shoutcast"] ); + + self notify("joined_spectators"); + iprintln(self.name + " Joined Shoutcaster"); + + self promod\shoutcast::loadOne(); + + if ( oldTeam == "allies" || oldTeam == "axis" ) + thread maps\mp\gametypes\_promod::updateClassAvailability( oldTeam ); + + self setClientDvars("g_compassShowEnemies", 1, "cg_scoreboardheight", 500 ); + } +} + +removeDisconnectedPlayerFromPlacement() +{ + offset = 0; + numPlayers = level.placement["all"].size; + found = false; + for ( i = 0; i < numPlayers; i++ ) + { + if ( level.placement["all"][i] == self ) + found = true; + + if ( found ) + level.placement["all"][i] = level.placement["all"][ i + 1 ]; + } + if ( !found ) + return; + + level.placement["all"][ numPlayers - 1 ] = undefined; + + updateTeamPlacement(); + + if ( level.teamBased ) + return; + + numPlayers = level.placement["all"].size; + for ( i = 0; i < numPlayers; i++ ) + { + player = level.placement["all"][i]; + player notify( "update_outcome" ); + } +} + +updatePlacement() +{ + prof_begin("updatePlacement"); + + if ( !level.players.size ) + return; + + level.placement["all"] = []; + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i].team == "allies" || level.players[i].team == "axis" ) + level.placement["all"][level.placement["all"].size] = level.players[i]; + } + + placementAll = level.placement["all"]; + + for ( i = 1; i < placementAll.size; i++ ) + { + player = placementAll[i]; + playerScore = player.score; + for ( j = i - 1; j >= 0 && (playerScore > placementAll[j].score || (playerScore == placementAll[j].score && player.deaths < placementAll[j].deaths)); j-- ) + placementAll[j + 1] = placementAll[j]; + placementAll[j + 1] = player; + } + + level.placement["all"] = placementAll; + + updateTeamPlacement(); + + prof_end("updatePlacement"); +} + +updateTeamPlacement() +{ + placement["allies"] = []; + placement["axis"] = []; + placement["spectator"] = []; + + if ( !level.teamBased ) + return; + + placementAll = level.placement["all"]; + placementAllSize = placementAll.size; + + for ( i = 0; i < placementAllSize; i++ ) + { + player = placementAll[i]; + team = player.pers["team"]; + + placement[team][ placement[team].size ] = player; + } + + level.placement["allies"] = placement["allies"]; + level.placement["axis"] = placement["axis"]; +} + +onXPEvent( event ) +{ + self maps\mp\gametypes\_rank::giveRankXP( event ); +} + +givePlayerScore( event, player, victim ) +{ + if ( level.overridePlayerScore ) + return; + + score = player.pers["score"]; + [[level.onPlayerScore]]( event, player, victim ); + + if ( score == player.pers["score"] ) + return; + + player.score = player.pers["score"]; + + if ( !level.teambased ) + thread sendUpdatedDMScores(); + + player notify ( "update_playerscore_hud" ); + player thread checkScoreLimit(); +} + +default_onPlayerScore( event, player, victim ) +{ + score = maps\mp\gametypes\_rank::getScoreInfoValue( event ); + player.pers["score"] += score; +} + +_setPlayerScore( player, score ) +{ + if ( score == player.pers["score"] ) + return; + + player.pers["score"] = score; + player.score = player.pers["score"]; + + player notify ( "update_playerscore_hud" ); + player thread checkScoreLimit(); +} + +_getPlayerScore( player ) +{ + return player.pers["score"]; +} + +giveTeamScore( event, team, player, victim ) +{ + if ( level.overrideTeamScore ) + return; + + teamScore = game["teamScores"][team]; + [[level.onTeamScore]]( event, team, player, victim ); + + if ( teamScore == game["teamScores"][team] ) + return; + + updateTeamScores( team ); + + thread checkScoreLimit(); +} + +_setTeamScore( team, teamScore ) +{ + if ( teamScore == game["teamScores"][team] ) + return; + + game["teamScores"][team] = teamScore; + + updateTeamScores( team ); + + thread checkScoreLimit(); +} + +updateTeamScores( team1, team2 ) +{ + setTeamScore( team1, getGameScore( team1 ) ); + if ( isdefined( team2 ) ) + setTeamScore( team2, getGameScore( team2 ) ); + + if ( level.teambased ) + thread sendUpdatedTeamScores(); +} + +_getTeamScore( team ) +{ + return game["teamScores"][team]; +} + +default_onTeamScore( event, team, player, victim ) +{ + score = maps\mp\gametypes\_rank::getScoreInfoValue( event ); + + otherTeam = level.otherTeam[team]; + + if ( game["teamScores"][team] > game["teamScores"][otherTeam] ) + level.wasWinning = team; + else if ( game["teamScores"][otherTeam] > game["teamScores"][team] ) + level.wasWinning = otherTeam; + + game["teamScores"][team] += score; + + isWinning = "none"; + if ( game["teamScores"][team] > game["teamScores"][otherTeam] ) + isWinning = team; + else if ( game["teamScores"][otherTeam] > game["teamScores"][team] ) + isWinning = otherTeam; + + if ( isWinning != "none" && isWinning != level.wasWinning && getTime() - level.lastStatusTime > 5000 ) + level.lastStatusTime = getTime(); + + if ( isWinning != "none" ) + level.wasWinning = isWinning; +} + +sendUpdatedTeamScores() +{ + level notify("updating_scores"); + level endon("updating_scores"); + wait 0.05; + + WaitTillSlowProcessAllowed(); + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] updateScores(); + + for( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if( player.pers["team"] == "spectator" ) + { + if( game["attackers"] == "allies" && game["defenders"] == "axis" ) + player setClientDvars( + "shout_scores_attack", game["teamScores"]["allies"], + "shout_scores_defence", game["teamScores"]["axis"] ); + else + player setClientDvars( + "shout_scores_attack", game["teamScores"]["axis"], + "shout_scores_defence", game["teamScores"]["allies"] ); + } + } + + if ( isDefined( level.scorebot ) && level.scorebot ) + { + if ( !isDefined( level.allies_team ) ) + level.allies_team = "none"; + if ( !isDefined( level.axis_team ) ) + level.axis_team = "none"; + + if( game["attackers"] == "allies" && game["defenders"] == "axis" ) + { + game["promod_scorebot_attack_ticker_buffer"] = game["teamScores"]["allies"] + level.allies_team; + game["promod_scorebot_defence_ticker_buffer"] = game["teamScores"]["axis"] + level.axis_team; + } + else + { + game["promod_scorebot_attack_ticker_buffer"] = game["teamScores"]["axis"] + level.axis_team; + game["promod_scorebot_defence_ticker_buffer"] = game["teamScores"]["allies"] + level.allies_team; + } + } +} + +sendUpdatedDMScores() +{ + level notify("updating_dm_scores"); + level endon("updating_dm_scores"); + wait 0.05; + + WaitTillSlowProcessAllowed(); + + for ( i = 0; i < level.players.size; i++ ) + { + level.players[i] updateDMScores(); + level.players[i].updatedDMScores = true; + } +} + +initPersStat( dataName ) +{ + if( !isDefined( self.pers[dataName] ) ) + self.pers[dataName] = 0; +} + +getPersStat( dataName ) +{ + return self.pers[dataName]; +} + +incPersStat( dataName, increment ) +{ + self.pers[dataName] += increment; +} + +updateTeamStatus() +{ + level notify("updating_team_status"); + level endon("updating_team_status"); + level endon ( "game_ended" ); + + if ( isDefined( game["state"] ) && game["state"] == "postgame" ) + return; + + resetTimeout(); + + prof_begin( "updateTeamStatus" ); + + level.playerCount["allies"] = 0; + level.playerCount["axis"] = 0; + + level.lastAliveCount["allies"] = level.aliveCount["allies"]; + level.lastAliveCount["axis"] = level.aliveCount["axis"]; + level.aliveCount["allies"] = 0; + level.aliveCount["axis"] = 0; + level.playerLives["allies"] = 0; + level.playerLives["axis"] = 0; + level.alivePlayers["allies"] = []; + level.alivePlayers["axis"] = []; + level.activePlayers = []; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + team = player.team; + class = player.class; + + if ( team != "spectator" && (isDefined( class ) && class != "") ) + { + level.playerCount[team]++; + + if ( player.sessionstate == "playing" ) + { + level.aliveCount[team]++; + level.playerLives[team]++; + + if ( isAlive( player ) ) + { + level.alivePlayers[team][level.alivePlayers.size] = player; + level.activeplayers[ level.activeplayers.size ] = player; + } + } + else if ( player maySpawn() ) + level.playerLives[team]++; + } + } + + if ( level.aliveCount["allies"] + level.aliveCount["axis"] > level.maxPlayerCount ) + level.maxPlayerCount = level.aliveCount["allies"] + level.aliveCount["axis"]; + + if ( level.aliveCount["allies"] ) + level.everExisted["allies"] = true; + if ( level.aliveCount["axis"] ) + level.everExisted["axis"] = true; + + for( i = 0; i < level.players.size; i++ ) + if( level.players[i].pers["team"] == "allies" || level.players[i].pers["team"] == "axis" ) + level.players[i] setClientDvars("self_alive", level.aliveCount[level.players[i].pers["team"]], + "opposing_alive", level.aliveCount[maps\mp\gametypes\_gameobjects::getEnemyTeam(level.players[i].pers["team"])] ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + { + level.allies_team = ""; + level.axis_team = ""; + + players = getentarray("player","classname"); + for( i = 0; i < players.size; i++ ) + { + player = players[i]; + playerstring = "" + player.name + "" + int( isAlive( player ) ) + "" + player.kills + "" + player.assists + "" + player.deaths + "0"; + + if ( player.pers["team"] == "allies" ) + level.allies_team += playerstring; + else if ( player.pers["team"] == "axis" ) + level.axis_team += playerstring; + } + + if ( level.allies_team == "" ) + level.allies_team = "none"; + if ( level.axis_team == "" ) + level.axis_team = "none"; + + level.allies_string = game["teamScores"]["allies"] + level.allies_team; + level.axis_string = game["teamScores"]["axis"] + level.axis_team; + + if( game["attackers"] == "allies" && game["defenders"] == "axis" ) + { + game["promod_scorebot_attack_ticker_buffer"] = level.allies_string; + game["promod_scorebot_defence_ticker_buffer"] = level.axis_string; + } + else + { + game["promod_scorebot_attack_ticker_buffer"] = level.axis_string; + game["promod_scorebot_defence_ticker_buffer"] = level.allies_string; + } + } + + prof_end( "updateTeamStatus" ); + + level updateGameEvents(); +} + +isValidClass( class ) +{ + return isdefined( class ) && class != ""; +} + +playTickingSound() +{ + self endon("death"); + self endon("stop_ticking"); + + level endon("game_ended"); + + for(;;) + { + self playSound( "ui_mp_suitcasebomb_timer" ); + wait 1; + } +} + +stopTickingSound() +{ + self notify("stop_ticking"); +} + +timeLimitClock() +{ + level endon ( "game_ended" ); + + wait 0.05; + + clockObject = spawn( "script_origin", (0,0,0) ); + + while ( isDefined( game["state"] ) && game["state"] == "playing" ) + { + if ( !level.timerStopped && level.timeLimit ) + { + timeLeft = getTimeRemaining() / 1000; + timeLeftInt = int(timeLeft + 0.5); + + if ( timeLeftInt <= 10 || (timeLeftInt <= 30 && timeLeftInt % 2 == 0) ) + { + if ( !timeLeftInt ) + break; + + clockObject playSound( "ui_mp_timer_countdown" ); + } + + if ( timeLeft - floor(timeLeft) >= 0.05 ) + wait timeLeft - floor(timeLeft); + } + + wait 1; + } +} + +gameTimer() +{ + level endon ( "game_ended" ); + + level waittill("prematch_over"); + + level.startTime = getTime(); + level.discardTime = 0; + + if ( isDefined( game["roundMillisecondsAlreadyPassed"] ) ) + { + level.startTime -= game["roundMillisecondsAlreadyPassed"]; + game["roundMillisecondsAlreadyPassed"] = undefined; + } + + prevtime = gettime(); + + while ( isDefined( game["state"] ) && game["state"] == "playing" ) + { + if ( !level.timerStopped ) + game["timepassed"] += gettime() - prevtime; + + prevtime = gettime(); + wait 1; + } +} + +getTimePassed() +{ + if ( !isDefined( level.startTime ) ) + return 0; + + if ( level.timerStopped ) + return (level.timerPauseTime - level.startTime) - level.discardTime; + else + return (gettime() - level.startTime) - level.discardTime; +} + +pauseTimer() +{ + if ( level.timerStopped ) + return; + + level.timerStopped = true; + level.timerPauseTime = gettime(); +} + +resumeTimer() +{ + if ( !level.timerStopped ) + return; + + level.timerStopped = false; + level.discardTime += gettime() - level.timerPauseTime; +} + +openMainMenu() +{ + maxwait = 0; + while ( !level.players.size && maxwait <= 1 ) + { + wait 0.05; + maxwait += 0.05; + } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if ( !isDefined( player.pers["team"] ) || player.pers["team"] == "none" ) + { + player setclientdvar( "g_scriptMainMenu", game["menu_team"] ); + player openMenu( game["menu_team"] ); + } + } +} + +checkRestartMap() +{ + if ( getDvar( "o_gametype" ) == "" ) + setDvar( "o_gametype", level.gametype ); + else if ( getDvar( "o_gametype" ) != level.gametype ) + { + level.restarting = true; + + setDvar( "o_gametype", level.gametype ); + + maprot = getDvar( "sv_maprotationcurrent" ); + new_maprot = "map " + level.script + " " + maprot; + setDvar( "sv_maprotationcurrent", new_maprot ); + exitLevel( false ); + } +} + +startGame() +{ + level thread header(); + + thread gameTimer(); + level.timerStopped = true; + thread maps\mp\gametypes\_spawnlogic::spawnPerFrameUpdate(); + + prematchPeriod(); + + thread openMainMenu(); + + if ( isDefined( game["promod_timeout_called"] ) && game["promod_timeout_called"] ) + { + thread promod\timeout::main(); + return; + } + + if ( isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"] ) + { + thread disableBombsites(); + thread promod\readyup::main(); + return; + } + + if ( ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" || getDvarInt( "promod_allow_strattime" ) && isDefined( game["CUSTOM_MODE"] ) && game["CUSTOM_MODE"] ) && level.gametype == "sd" ) + promod\strattime::main(); + + if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" ) + { + thread disableBombsites(); + thread promod\stratmode::main(); + setDvar( "g_deadChat", 1 ); + SetClientNameMode( "auto_change" ); + setGameEndTime( 0 ); + return; + } + else if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" ) + setDvar( "g_deadChat", 0 ); + + if ( isDefined( level.timeout_over ) && !level.timeout_over ) + return; + + if ( isDefined(game["PROMOD_KNIFEROUND"]) && game["PROMOD_KNIFEROUND"] ) + { + thread disableBombsites(); + + if(game["PROMOD_MATCH_MODE"] != "pub") + { + level.timeLimitOverride = true; + setGameEndTime( 0 ); + } + } + + level notify("prematch_over"); + level notify("header_destroy"); + level.timerStopped = false; + + if ( isDefined( level.scorebot ) && level.scorebot ) + { + if ( isDefined(game["PROMOD_KNIFEROUND"]) && game["PROMOD_KNIFEROUND"] ) + game["promod_scorebot_ticker_buffer"] += "knife_round"; + else + { + sb_text = ""; + + if ( !game["roundsplayed"] && !game["promod_in_timeout"] ) + sb_text = "1st_half_started"; + else if ( isDefined( level.roundswitch ) && level.roundswitch > 0 && game["roundsplayed"] % level.roundswitch == 0 && !game["promod_in_timeout"] ) + sb_text = "2nd_half_started"; + else if ( game["promod_in_timeout"] ) + sb_text = "match_resumed"; + else + sb_text = "round_start"; + + game["promod_scorebot_ticker_buffer"] += "" + sb_text + "" + ( game["roundsplayed"] + 1 ); + } + } + + game["promod_in_timeout"] = 0; + + if ( !isDefined( game["PROMOD_KNIFEROUND"] ) || !game["PROMOD_KNIFEROUND"] || game["PROMOD_MATCH_MODE"] == "pub" ) + thread timeLimitClock(); + + thread gracePeriod(); +} + +header() +{ + if ( isDefined( game["state"] ) && game["state"] == "postgame" ) + wait 0.75; + + promod_ver = newHudElem(); + promod_ver.x = -7; + promod_ver.y = 35; + promod_ver.horzAlign = "right"; + promod_ver.vertAlign = "top"; + promod_ver.alignX = "right"; + promod_ver.alignY = "middle"; + promod_ver.fontScale = 1.4; + promod_ver.hidewheninmenu = true; + promod_ver.color = (0.8, 1, 1); + promod_ver setText( game["PROMOD_VERSION"] ); + + promod_mode = newHudElem(); + promod_mode.x = -7; + promod_mode.y = 50; + promod_mode.horzAlign = "right"; + promod_mode.vertAlign = "top"; + promod_mode.alignX = "right"; + promod_mode.alignY = "middle"; + promod_mode.fontScale = 1.4; + promod_mode.hidewheninmenu = true; + promod_mode.color = (1,1,0); + promod_mode setText( game["PROMOD_MODE_HUD"] ); + + level waittill( "header_destroy" ); + + if ( isDefined( promod_ver ) ) + promod_ver destroy(); + + if ( isDefined( promod_mode ) ) + promod_mode destroy(); +} + +disableBombsites() +{ + if ( level.gametype == "sd" && isDefined( level.bombZones ) ) + for ( j = 0; j < level.bombZones.size; j++ ) + level.bombZones[j] maps\mp\gametypes\_gameobjects::disableObject(); +} + +prematchPeriod() +{ + level endon( "game_ended" ); + + if ( level.prematchPeriod > 0 && isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] != "match" && game["PROMOD_MATCH_MODE"] != "strat" ) + { + if ( getDvarInt( "promod_allow_strattime" ) && isDefined( game["CUSTOM_MODE"] ) && game["CUSTOM_MODE"] && level.gametype == "sd" ) + matchStartTimerSkip(); + else + matchStartTimer(); + } + else + matchStartTimerSkip(); + + level.inPrematchPeriod = false; + + for ( i = 0; i < level.players.size; i++ ) + { + level.players[i] freezeControls( false ); + level.players[i] enableWeapons(); + } +} + +gracePeriod() +{ + level endon("game_ended"); + + wait level.gracePeriod; + + level notify ( "grace_period_ending" ); + wait 0.05; + + level.inGracePeriod = false; + + if ( !isDefined( game["state"] ) || game["state"] != "playing" ) + return; + + if ( level.numLives ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( !player.hasSpawned && player.sessionteam != "spectator" && !isAlive( player ) ) + player.statusicon = "hud_status_dead"; + } + } + + level thread updateTeamStatus(); +} + +TimeUntilWaveSpawn( minimumWait ) +{ + earliestSpawnTime = gettime() + minimumWait * 1000; + + lastWaveTime = level.lastWave[self.pers["team"]]; + waveDelay = level.waveDelay[self.pers["team"]] * 1000; + + numWavesPassedEarliestSpawnTime = (earliestSpawnTime - lastWaveTime) / waveDelay; + + numWaves = ceil( numWavesPassedEarliestSpawnTime ); + + timeOfSpawn = lastWaveTime + numWaves * waveDelay; + + if ( isdefined( self.waveSpawnIndex ) ) + timeOfSpawn += 50 * self.waveSpawnIndex; + + return (timeOfSpawn - gettime()) / 1000; +} + +TimeUntilSpawn() +{ + if ( ( level.inGracePeriod && !self.hasSpawned ) || ( isDefined( level.rdyup ) && level.rdyup ) || ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" ) ) + return 0; + + respawnDelay = 0; + if ( self.hasSpawned ) + { + result = self [[level.onRespawnDelay]](); + if ( isDefined( result ) ) + respawnDelay = result; + else + respawnDelay = getDvarInt( "scr_" + level.gameType + "_playerrespawndelay" ); + } + + waveBased = (getDvarInt( "scr_" + level.gameType + "_waverespawndelay" ) > 0); + + if ( waveBased ) + return self TimeUntilWaveSpawn( respawnDelay ); + + return respawnDelay; +} + +maySpawn() +{ + if ( ( isDefined( level.rdyup ) && level.rdyup ) || ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" ) ) + return true; + + if ( level.inOvertime ) + return false; + + if ( level.numLives ) + { + if ( level.teamBased ) + gameHasStarted = ( level.everExisted[ "axis" ] && level.everExisted[ "allies" ] ); + else + gameHasStarted = (level.maxPlayerCount > 1); + + if ( gameHasStarted && ( !self.pers["lives"] || ( !level.inGracePeriod && !self.hasSpawned ) ) ) + return false; + } + return true; +} + +spawnClient( timeAlreadyPassed ) +{ + if ( !self maySpawn() ) + { + shouldShowRespawnMessage = true; + if ( ( level.roundLimit > 1 && game["roundsplayed"] >= (level.roundLimit - 1) ) || ( level.scoreLimit > 1 && level.teambased && game["teamScores"]["allies"] >= level.scoreLimit - 1 && game["teamScores"]["axis"] >= level.scoreLimit - 1 ) ) + shouldShowRespawnMessage = false; + + if ( shouldShowRespawnMessage ) + { + setLowerMessage( game["strings"]["spawn_next_round"] ); + self thread removeSpawnMessageShortly(); + } + self thread [[level.spawnSpectator]]( self.origin, self.angles ); + return; + } + + if ( self.waitingToSpawn ) + return; + + self.waitingToSpawn = true; + + self waitAndSpawnClient( timeAlreadyPassed ); + + if ( isdefined( self ) ) + self.waitingToSpawn = false; +} + +waitAndSpawnClient( timeAlreadyPassed ) +{ + self endon ( "disconnect" ); + self endon ( "end_respawn" ); + self endon ( "game_ended" ); + + if ( !isdefined( timeAlreadyPassed ) ) + timeAlreadyPassed = 0; + + spawnedAsSpectator = false; + + if ( !isdefined( self.waveSpawnIndex ) && isdefined( level.wavePlayerSpawnIndex[self.team] ) ) + { + self.waveSpawnIndex = level.wavePlayerSpawnIndex[self.team]; + level.wavePlayerSpawnIndex[self.team]++; + } + + timeUntilSpawn = TimeUntilSpawn(); + if ( timeUntilSpawn > timeAlreadyPassed ) + { + timeUntilSpawn -= timeAlreadyPassed; + timeAlreadyPassed = 0; + } + else + { + timeAlreadyPassed -= timeUntilSpawn; + timeUntilSpawn = 0; + } + + if ( timeUntilSpawn > 0 ) + { + setLowerMessage( game["strings"]["waiting_to_spawn"], timeUntilSpawn ); + + if ( !spawnedAsSpectator ) + self thread respawn_asSpectator( self.origin + (0, 0, 60), self.angles ); + spawnedAsSpectator = true; + + self waitForTimeOrNotify( timeUntilSpawn, "force_spawn" ); + } + + waveBased = (getDvarInt( "scr_" + level.gameType + "_waverespawndelay" ) > 0); + if ( !maps\mp\gametypes\_tweakables::getTweakableValue( "player", "forcerespawn" ) && self.hasSpawned && !waveBased ) + { + setLowerMessage( game["strings"]["press_to_spawn"] ); + + if ( !spawnedAsSpectator ) + self thread respawn_asSpectator( self.origin + (0, 0, 60), self.angles ); + spawnedAsSpectator = true; + + self waitRespawnButton(); + } + + self.waitingToSpawn = false; + + self clearLowerMessage(); + + self.waveSpawnIndex = undefined; + + self thread [[level.spawnPlayer]](); +} + +waitForTimeOrNotify( time, notifyname ) +{ + self endon("disconnect"); + self endon( notifyname ); + wait time; +} + +removeSpawnMessageShortly() +{ + self endon("disconnect"); + + waittillframeend; + + self endon("end_respawn"); + + wait 2; + + self clearLowerMessage( 2 ); +} + +Callback_StartGameType() +{ + level.prematchPeriod = 0; + + level.intermission = false; + game["state"] = "playing"; + + if ( !isDefined( game["gamestarted"] ) ) + { + if ( !isDefined( game["allies"] ) ) + game["allies"] = "marines"; + if ( !isDefined( game["axis"] ) ) + game["axis"] = "opfor"; + if ( !isDefined( game["attackers"] ) ) + game["attackers"] = "allies"; + if ( !isDefined( game["defenders"] ) ) + game["defenders"] = "axis"; + + if ( !isDefined( game["state"] ) ) + game["state"] = "playing"; + + precacheStatusIcon("hud_status_dead"); + precacheStatusIcon("hud_status_connecting"); + precacheStatusIcon("compassping_friendlyfiring_mp"); + precacheStatusIcon("compassping_enemy"); + + precacheRumble( "damage_heavy" ); + + precacheShader( "white" ); + precacheShader( "black" ); + + makeDvarServerInfo( "scr_allies", "usmc" ); + makeDvarServerInfo( "scr_axis", "arab" ); + + game["strings"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN"; + if ( level.teamBased ) + { + game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_TEAMS"; + game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; + } + else + { + game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_PLAYERS"; + game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; + } + + game["strings"]["match_starting_in"] = &"MP_MATCH_STARTING_IN"; + game["strings"]["spawn_next_round"] = &"MP_SPAWN_NEXT_ROUND"; + game["strings"]["waiting_to_spawn"] = &"MP_WAITING_TO_SPAWN"; + game["strings"]["match_starting"] = &"MP_MATCH_STARTING"; + game["strings"]["change_class"] = &"MP_CHANGE_CLASS_NEXT_SPAWN"; + + game["strings"]["tie"] = &"MP_MATCH_TIE"; + game["strings"]["round_draw"] = &"MP_ROUND_DRAW"; + + game["strings"]["enemies_eliminated"] = &"MP_ENEMIES_ELIMINATED"; + game["strings"]["score_limit_reached"] = &"MP_SCORE_LIMIT_REACHED"; + game["strings"]["round_limit_reached"] = &"MP_ROUND_LIMIT_REACHED"; + game["strings"]["time_limit_reached"] = &"MP_TIME_LIMIT_REACHED"; + game["strings"]["players_forfeited"] = &"MP_PLAYERS_FORFEITED"; + + if( game["attackers"] == "allies" && game["defenders"] == "axis" ) + { + game["strings"]["allies_name"] = "Attack"; + game["strings"]["axis_name"] = "Defence"; + game["strings"]["allies_eliminated"] = "Attack eliminated"; + game["strings"]["axis_eliminated"] = "Defence eliminated"; + game["strings"]["allies_forfeited"] = "Attack forfeited"; + game["strings"]["axis_forfeited"] = "Defence forfeited"; + } + else + { + game["strings"]["allies_name"] = "Defence"; + game["strings"]["axis_name"] = "Attack"; + game["strings"]["allies_eliminated"] = "Defence eliminated"; + game["strings"]["axis_eliminated"] = "Attack eliminated"; + game["strings"]["allies_forfeited"] = "Defence forfeited"; + game["strings"]["axis_forfeited"] = "Attack forfeited"; + } + + switch ( game["allies"] ) + { + case "sas": + game["strings"]["allies_win"] = &"MP_SAS_WIN_MATCH"; + game["strings"]["allies_win_round"] = &"MP_SAS_WIN_ROUND"; + game["strings"]["allies_mission_accomplished"] = &"MP_SAS_MISSION_ACCOMPLISHED"; + + game["icons"]["allies"] = "faction_128_sas"; + game["colors"]["allies"] = (0.6,0.64,0.69); + game["voice"]["allies"] = "UK_1mc_"; + setDvar( "scr_allies", "sas" ); + break; + + default: + game["strings"]["allies_win"] = &"MP_MARINES_WIN_MATCH"; + game["strings"]["allies_win_round"] = &"MP_MARINES_WIN_ROUND"; + game["strings"]["allies_mission_accomplished"] = &"MP_MARINES_MISSION_ACCOMPLISHED"; + + game["icons"]["allies"] = "faction_128_usmc"; + game["colors"]["allies"] = (0.6,0.64,0.69); + game["voice"]["allies"] = "US_1mc_"; + setDvar( "scr_allies", "usmc" ); + break; + } + switch ( game["axis"] ) + { + case "russian": + game["strings"]["axis_win"] = &"MP_SPETSNAZ_WIN_MATCH"; + game["strings"]["axis_win_round"] = &"MP_SPETSNAZ_WIN_ROUND"; + game["strings"]["axis_mission_accomplished"] = &"MP_SPETSNAZ_MISSION_ACCOMPLISHED"; + + game["icons"]["axis"] = "faction_128_ussr"; + game["colors"]["axis"] = (0.52,0.28,0.28); + game["voice"]["axis"] = "RU_1mc_"; + setDvar( "scr_axis", "ussr" ); + break; + + default: + game["strings"]["axis_win"] = &"MP_OPFOR_WIN_MATCH"; + game["strings"]["axis_win_round"] = &"MP_OPFOR_WIN_ROUND"; + game["strings"]["axis_mission_accomplished"] = &"MP_OPFOR_MISSION_ACCOMPLISHED"; + + game["icons"]["axis"] = "faction_128_arab"; + game["colors"]["axis"] = (0.65,0.57,0.41); + game["voice"]["axis"] = "AB_1mc_"; + setDvar( "scr_axis", "arab" ); + break; + } + + [[level.onPrecacheGameType]](); + + game["gamestarted"] = true; + + game["teamScores"]["allies"] = game["SCORES_ATTACK"]; + game["teamScores"]["axis"] = game["SCORES_DEFENCE"]; + + level.prematchPeriod = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "matchstarttime" ); + + thread promod\setvariables::main(); + + if ( !isDefined( game["promod_scorebot_ticker_buffer"] ) ) + { + setDvar( "promod_scorebot_ticker_num", 0 ); + game["promod_scorebot_ticker_buffer"] = 0; + } + + game["promod_scorebot_ticker_buffer"] += "map" + getDvar("mapname") + "" + level.gametype; + } + + if ( !isdefined( game["timepassed"] ) ) + game["timepassed"] = 0; + + if ( !isdefined( game["roundsplayed"] ) ) + game["roundsplayed"] = game["SCORES_ATTACK"] + game["SCORES_DEFENCE"]; + + if ( !isDefined( game["promod_do_readyup"] ) ) + game["promod_do_readyup"] = false; + + if ( (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" || getDvarInt( "promod_allow_readyup" ) && isDefined( game["CUSTOM_MODE"] ) && game["CUSTOM_MODE"]) && ( !game["roundsplayed"] && !game["promod_first_readyup_done"] || ( game["SCORES_ATTACK"] > 0 || game["SCORES_DEFENCE"] > 0 ) ) ) + game["promod_do_readyup"] = true; + + game["SCORES_ATTACK"] = 0; + game["SCORES_DEFENCE"] = 0; + + level.gameEnded = false; + level.teamSpawnPoints["axis"] = []; + level.teamSpawnPoints["allies"] = []; + + level.objIDStart = 0; + level.forcedEnd = false; + + level.useStartSpawns = true; + + thread maps\mp\gametypes\_promod::init(); + thread maps\mp\gametypes\_rank::init(); + thread maps\mp\gametypes\_menus::init(); + thread maps\mp\gametypes\_hud::init(); + thread maps\mp\gametypes\_serversettings::init(); + thread maps\mp\gametypes\_clientids::init(); + thread maps\mp\gametypes\_teams::init(); + thread maps\mp\gametypes\_weapons::init(); + thread maps\mp\gametypes\_scoreboard::init(); + thread maps\mp\gametypes\_killcam::init(); + thread maps\mp\gametypes\_shellshock::init(); + thread maps\mp\gametypes\_damagefeedback::init(); + thread maps\mp\gametypes\_healthoverlay::init(); + thread maps\mp\gametypes\_spectating::init(); + thread maps\mp\gametypes\_objpoints::init(); + thread maps\mp\gametypes\_gameobjects::init(); + thread maps\mp\gametypes\_spawnlogic::init(); + thread maps\mp\gametypes\_hud_message::init(); + thread maps\mp\gametypes\_quickmessages::init(); + + thread promod\scorebot::main(); + + stringNames = getArrayKeys( game["strings"] ); + for ( i = 0; i < stringNames.size; i++ ) + if(!isstring(game["strings"][stringNames[i]])) + precacheString( game["strings"][stringNames[i]] ); + + level.maxPlayerCount = 0; + level.playerCount["allies"] = 0; + level.playerCount["axis"] = 0; + level.aliveCount["allies"] = 0; + level.aliveCount["axis"] = 0; + level.playerLives["allies"] = 0; + level.playerLives["axis"] = 0; + level.lastAliveCount["allies"] = 0; + level.lastAliveCount["axis"] = 0; + level.everExisted["allies"] = false; + level.everExisted["axis"] = false; + level.waveDelay["allies"] = 0; + level.waveDelay["axis"] = 0; + level.lastWave["allies"] = 0; + level.lastWave["axis"] = 0; + level.wavePlayerSpawnIndex["allies"] = 0; + level.wavePlayerSpawnIndex["axis"] = 0; + level.alivePlayers["allies"] = []; + level.alivePlayers["axis"] = []; + level.activePlayers = []; + + makeDvarServerInfo( "ui_scorelimit" ); + makeDvarServerInfo( "ui_timelimit" ); + + waveDelay = getDvarInt( "scr_" + level.gameType + "_waverespawndelay" ); + if ( waveDelay ) + { + level.waveDelay["allies"] = waveDelay; + level.waveDelay["axis"] = waveDelay; + level.lastWave["allies"] = 0; + level.lastWave["axis"] = 0; + + level thread [[level.waveSpawnTimer]](); + } + + level.inPrematchPeriod = true; + + level.gracePeriod = 4; + + level.inGracePeriod = true; + + level.roundEndDelay = 4; + level.halftimeRoundEndDelay = 3; + + updateTeamScores( "axis", "allies" ); + + if ( !level.teamBased ) + thread initialDMScoreUpdate(); + + [[level.onStartGameType]](); + + thread promod\messagecenter::main(); + + deletePlacedEntity("misc_turret"); + + thread deletePickups(); + + thread startGame(); + + level thread updateGameTypeDvars(); +} + +deletePickups() +{ + pickups = getentarray( "oldschool_pickup", "targetname" ); + + for ( i = 0; i < pickups.size; i++ ) + { + if ( isdefined( pickups[i].target ) ) + getent( pickups[i].target, "targetname" ) delete(); + pickups[i] delete(); + } +} + +initialDMScoreUpdate() +{ + wait 0.2; + numSent = 0; + for(;;) + { + didAny = false; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( !isdefined( player ) ) + continue; + + if ( isdefined( player.updatedDMScores ) ) + continue; + + player.updatedDMScores = true; + player updateDMScores(); + + didAny = true; + wait 0.5; + } + + if ( !didAny ) + wait 3; + } +} + +checkRoundSwitch() +{ + if ( !level.roundSwitch || level.gametype == "dm" ) + return false; + + if ( game["roundsplayed"] % level.roundswitch == 0 ) + { + if ( ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" || getDvarInt( "promod_allow_readyup" ) && isDefined( game["CUSTOM_MODE"] ) && game["CUSTOM_MODE"] ) && game["promod_first_readyup_done"] ) + game["promod_do_readyup"] = true; + + game["promod_timeout_called"] = false; + + [[level.onRoundSwitch]](); + return true; + } + + return false; +} + +getGameScore( team ) +{ + return game["teamScores"][team]; +} + +Callback_PlayerConnect() +{ + thread notifyConnecting(); + + self.statusicon = "hud_status_connecting"; + self waittill( "begin" ); + waittillframeend; + + if ( !isDefined( self ) ) + return; + + level notify( "connected", self ); + + if ( !isDefined( level.rdyup ) || !level.rdyup ) + self.statusicon = ""; + + if( !isdefined( self.pers["score"] ) ) + iPrintLn( &"MP_CONNECTED", self.name ); + + logPrint("J;" + self getGuid() + ";" + self getEntityNumber() + ";" + self.name + "\n"); + + if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" ) + self setClientDvar( "promod_hud_website", "" ); + else + self setClientDvar( "promod_hud_website", getDvar( "promod_hud_website" ) ); + + self setClientDvars("cg_hudGrenadeIconMaxRangeFrag", int(!level.hardcoreMode)*250, + "cg_drawcrosshair", int(!level.hardcoreMode), + "cg_drawSpectatorMessages", 1, + "ui_hud_hardcore", level.hardcoreMode, + "fx_drawClouds", 0, + "ui_showmenuonly", "", + "self_ready", "" ); + + self initPersStat( "score" ); + self.score = self.pers["score"]; + + self initPersStat( "deaths" ); + self.deaths = self getPersStat( "deaths" ); + + self initPersStat( "suicides" ); + self.suicides = self getPersStat( "suicides" ); + + self initPersStat( "kills" ); + self.kills = self getPersStat( "kills" ); + + self initPersStat( "headshots" ); + self.headshots = self getPersStat( "headshots" ); + + self initPersStat( "assists" ); + self.assists = self getPersStat( "assists" ); + + self initPersStat( "teamkills" ); + + self.lastGrenadeSuicideTime = -1; + + self.teamkillsThisRound = 0; + + self.pers["lives"] = level.numLives; + + self.hasSpawned = false; + self.waitingToSpawn = false; + self.deathCount = 0; + + self.wasAliveAtMatchStart = false; + + self thread maps\mp\_flashgrenades::monitorFlash(); + + level.players[level.players.size] = self; + + if(isDefined(self.pers["shoutnum"])) + level.shoutbars[self.pers["shoutnum"]] = self; + + if ( level.teambased ) + self updateScores(); + + level endon( "game_ended" ); + + if ( isDefined( self.pers["team"] ) ) + self.team = self.pers["team"]; + + if ( isDefined( self.pers["class"] ) ) + self.class = self.pers["class"]; + + if ( !isDefined( self.pers["team"] ) ) + { + self.pers["team"] = "none"; + self.team = "none"; + self.sessionstate = "dead"; + + self setClientDvar("loadout_curclass", ""); + + self updateObjectiveText(); + + [[level.spawnSpectator]](); + + self thread promod\client::use_config(); + self thread maps\mp\gametypes\_promod::initClassLoadouts(); + + thread maps\mp\gametypes\_promod::updateClassAvailability( "allies" ); + thread maps\mp\gametypes\_promod::updateClassAvailability( "axis" ); + + self setclientdvar( "g_scriptMainMenu", game["menu_team"] ); + self openMenu( game["menu_team"] ); + + if ( level.teamBased ) + { + self.sessionteam = self.pers["team"]; + + if ( ( !isDefined( level.rdyup ) || !level.rdyup ) && !isAlive( self ) ) + self.statusicon = "hud_status_dead"; + + self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); + } + } + else if ( self.pers["team"] == "spectator" ) + { + self setclientdvar( "g_scriptMainMenu", game["menu_shoutcast"] ); + self.sessionteam = "spectator"; + self.sessionstate = "spectator"; + [[level.spawnSpectator]](); + } + else + { + self.sessionteam = self.pers["team"]; + self.sessionstate = "dead"; + + self updateObjectiveText(); + + [[level.spawnSpectator]](); + + if ( isValidClass( self.pers["class"] ) ) + self thread [[level.spawnClient]](); + + self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); + } +} + +Callback_PlayerDisconnect() +{ + self removePlayerOnDisconnect(); + + [[level.onPlayerDisconnect]](); + + logPrint("Q;" + self getGuid() + ";" + self getEntityNumber() + ";" + self.name + "\n"); + + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i] == self ) + { + while ( i < level.players.size-1 ) + { + level.players[i] = level.players[i+1]; + i++; + } + level.players[i] = undefined; + break; + } + } + + if ( level.gameEnded ) + self removeDisconnectedPlayerFromPlacement(); + + self promod\shoutcast::removePlayer(); + self maps\mp\gametypes\_weapons::printStats(); + + if ( isDefined( self.pers["team"] ) && ( self.pers["team"] == "allies" || self.pers["team"] == "axis" ) ) + thread maps\mp\gametypes\_promod::updateClassAvailability( self.pers["team"] ); + + level thread updateTeamStatus(); +} + +removePlayerOnDisconnect() +{ + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i] == self ) + { + while ( i < level.players.size-1 ) + { + level.players[i] = level.players[i+1]; + i++; + } + level.players[i] = undefined; + break; + } + } +} + +isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) +{ + return (sHitLoc == "head" || sHitLoc == "helmet") && sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_IMPACT"; +} + +Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) +{ + if ( !isDefined( level.rdyup ) ) + level.rdyup = false; + + if ( getDvarInt("g_knockback") != 1000 || isDefined( game["state"] ) && game["state"] == "postgame" || self.sessionteam == "spectator" || isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" && isDefined( self.flying ) && self.flying || isDefined( level.bombDefused ) && level.bombDefused || isDefined( level.bombExploded ) && level.bombExploded && self.pers["team"] == game["attackers"] || isDefined( game["PROMOD_KNIFEROUND"] ) && game["PROMOD_KNIFEROUND"] && sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_FALLING" && !level.rdyup ) + return; + + if( isDefined(eAttacker) && isPlayer(eAttacker) && isPlayer(self) && eAttacker.sessionstate == "playing" && isDefined(iDamage) && isDefined( sMeansOfDeath ) && sMeansOfDeath != "" && (sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_PISTOL_BULLET")) + iDamage = int(iDamage*1.4); + + self.iDFlags = iDFlags; + self.iDFlagsTime = getTime(); + + if ( level.rdyup && isDefined( eAttacker ) && isPlayer( eAttacker ) && eAttacker != self ) + { + if ( !isDefined( eAttacker.ruptally ) || eAttacker.ruptally < 0 ) + { + eAttacker.ruptally = 0; + eAttacker setclientdvar("self_kills", 0); + } + + if ( !isDefined( self.ruptally ) ) + self.ruptally = -1; + + if ( self.ruptally < 0 ) + return; + } + + // bit arrays are interesting, huh? + if( !isDefined( vDir ) ) + iDFlags |= level.iDFLAGS_NO_KNOCKBACK; + + // Not sure exactly what happens here, but ok... + if ( level.teamBased && self.health == self.maxhealth || !isDefined( self.attackers ) ) + { + self.attackers = []; + self.attackerData = []; + } + + if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) ) + sMeansOfDeath = "MOD_HEAD_SHOT"; + + if ( sWeapon == "none" && isDefined( eInflictor ) ) + { + if ( isDefined( eInflictor.targetname ) && eInflictor.targetname == "explodable_barrel" ) + sWeapon = "explodable_barrel"; + else if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) ) + sWeapon = "destructible_car"; + } + + friendly = false; + + // if level.iDFLAGS_NO_PROTECTION element in iDflags is not 0, this will happen. NO_PROTECTION == 0 could be god-mode + if( !(iDFlags & level.iDFLAGS_NO_PROTECTION) ) + { + if ( (isSubStr( sMeansOfDeath, "MOD_GRENADE" ) || isSubStr( sMeansOfDeath, "MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, "MOD_PROJECTILE" )) && isDefined( eInflictor ) && game["PROMOD_MATCH_MODE"] != "match" && eInflictor.classname == "grenade" && ( (self.lastSpawnTime + 3500) > getTime() && distance( eInflictor.origin, self.lastSpawnPoint.origin ) < 250 || !isDefined ( eAttacker.pers["class"] ) ) ) + return; + + if ( level.teamBased && isPlayer( eAttacker ) && self != eAttacker && self.pers["team"] == eAttacker.pers["team"] ) + { + if ( !level.friendlyfire ) + return; + if ( level.friendlyfire == 1 || (level.friendlyfire == 2 || level.friendlyfire == 3) && isAlive( eAttacker ) ) + { + if( (level.friendlyfire & 2) > 0 ) // 2 or 3 + iDamage = int(iDamage * 0.5); + + if ( iDamage < 1 ) + iDamage = 1; + + if( (level.friendlyfire & 1) > 0 ) // 1 or 3 + { + if(!level.rdyup) + { + if(!isDefined(self.pers["friendly_damage_taken"])) + self.pers["friendly_damage_taken"] = 0; + if(!isDefined(eAttacker.pers["friendly_damage_done"])) + eAttacker.pers["friendly_damage_done"] = 0; + + self.pers["friendly_damage_taken"] += min(iDamage, self.health); + eAttacker.pers["friendly_damage_done"] += min(iDamage, self.health); + } + + self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); + } + if( (level.friendlyfire & 2) > 0 ) // 2 or 3 + eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); + } + friendly = true; + } + else + { + if(iDamage < 1) + iDamage = 1; + + if ( level.teamBased && isDefined( eAttacker ) && isPlayer( eAttacker ) ) + { + if ( !isdefined( self.attackerData[eAttacker.clientid] ) ) + { + self.attackers[ self.attackers.size ] = eAttacker; + self.attackerData[eAttacker.clientid] = false; + } + if ( isDefined(sWeapon) && isSubStr("m1014_mp winchester1200_mp mp5_mp uzi_mp ak74u_mp ak47_mp m14_mp mp44_mp g3_mp g36c_mp m16_mp m4_mp m40a3_mp remington700_mp", sWeapon) ) + self.attackerData[eAttacker.clientid] = true; + } + + if( !level.rdyup && isDefined(eAttacker) && isPlayer(eAttacker) && eAttacker != self ) + { + if(!isDefined(eAttacker.pers["hits"])) + eAttacker.pers["hits"] = 0; + + eAttacker.pers["hits"]++; + + if(!isDefined(self.pers["damage_taken"])) + self.pers["damage_taken"] = 0; + if(!isDefined(eAttacker.pers["damage_done"])) + eAttacker.pers["damage_done"] = 0; + + self.pers["damage_taken"] += min(iDamage, self.health); + eAttacker.pers["damage_done"] += min(iDamage, self.health); + } + + self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); + } + + if ( isDefined(eAttacker) && eAttacker != self ) + { + if ( sMeansOfDeath == "MOD_HEAD_SHOT" ) + thread dinkNoise(eAttacker, self); + + if ( iDamage > 0 && ( getDvarInt( "scr_enable_hiticon" ) == 1 || getDvarInt( "scr_enable_hiticon" ) == 2 && !(iDFlags & level.iDFLAGS_PENETRATION) ) ) + eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( false ); + } + + self.hasDoneCombat = true; + } + + if ( isdefined( eAttacker ) && eAttacker != self && !friendly ) + level.useStartSpawns = false; + + if( level.rdyup || isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" ) + { + if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sHitLoc ) ) + { + if ( eAttacker != self ) + { + if ( sHitLoc == "none" ) + { + eAttacker iprintln("You inflicted ^2" + iDamage + "^7 damage to " + self.name); + self iprintln(eAttacker.name + " inflicted ^1" + iDamage + "^7 damage to you"); + } + else + { + damagestring = ""; + if( isSubStr( sHitLoc, "torso_upper" ) ) + damagestring = "upper torso"; + else if( isSubStr( sHitLoc, "torso_lower" ) ) + damagestring = "lower torso"; + else if( isSubStr( sHitLoc, "leg_upper" ) ) + damagestring = "upper leg"; + else if( isSubStr( sHitLoc, "leg_lower" ) ) + damagestring = "lower leg"; + else if( isSubStr( sHitLoc, "arm_upper" ) ) + damagestring = "upper arm"; + else if( isSubStr( sHitLoc, "arm_lower" ) ) + damagestring = "lower arm"; + else if( isSubStr( sHitLoc, "head" ) || isSubStr( sHitLoc, "helmet" ) ) + damagestring = "head"; + else if( isSubStr( sHitLoc, "neck" ) ) + damagestring = "neck"; + else if( isSubStr( sHitLoc, "foot" ) ) + damagestring = "foot"; + else if( isSubStr( sHitLoc, "hand" ) ) + damagestring = "hand"; + + metrestring = int(distance(self.origin, eAttacker.origin) * 2.54) / 100; + + eAttacker iprintln("You inflicted ^2" + iDamage + "^7 damage at a distance of ^2" + metrestring + "^7 metres in the ^2" + damagestring + "^7 to " + self.name); + self iprintln(eAttacker.name + " inflicted ^1" + iDamage + "^7 damage at a distance of ^1" + metrestring + "^7 metres in the ^1" + damagestring + "^7 to you"); + } + } + else if ( sHitLoc == "none" ) + self iprintln("You inflicted ^1" + iDamage + "^7 damage to yourself"); + } + else if ( sMeansOfDeath == "MOD_FALLING" ) + self iprintln("You inflicted ^1" + iDamage + "^7 damage to yourself"); + } + + // Logging into file + if( self.sessionstate != "dead" ) + { + lpattackerteam = ""; + + if( isPlayer( eAttacker ) ) + { + lpattacknum = eAttacker getEntityNumber(); + lpattackGuid = eAttacker getGuid(); + lpattackname = eAttacker.name; + lpattackerteam = eAttacker.pers["team"]; + } + else + { + lpattacknum = -1; + lpattackGuid = ""; + lpattackname = ""; + lpattackerteam = "world"; + } + + logPrint("D;" + self getGuid() + ";" + self getEntityNumber() + ";" + self.pers["team"] + ";" + self.name + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n"); + } + + // Shoutcaster healthbar update + self promod\shoutcast::updatePlayer(); +} + +dinkNoise( player1, player2 ) +{ + player1 playLocalSound("bullet_impact_headshot_2"); + player2 playLocalSound("bullet_impact_headshot_2"); +} + +finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) +{ + self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ); + self damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage ); +} + +damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage ) +{ + self thread maps\mp\gametypes\_weapons::onWeaponDamage( eInflictor, sWeapon, sMeansOfDeath, iDamage ); + self PlayRumbleOnEntity( "damage_heavy" ); +} + +Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration) +{ + if ( !isDefined( level.rdyup ) ) + level.rdyup = false; + + self endon( "spawned" ); + self notify( "killed_player" ); + + if ( self.sessionteam == "spectator" || ( isDefined( game["state"] ) && game["state"] == "postgame" ) ) + return; + + prof_begin( "PlayerKilled pre constants" ); + + if( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) ) + sMeansOfDeath = "MOD_HEAD_SHOT"; + + if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + attacker = attacker.owner; + + if( level.teamBased && isDefined( attacker.pers ) && self.team == attacker.team && sMeansOfDeath == "MOD_GRENADE" && !level.friendlyfire ) + obituary(self, self, sWeapon, sMeansOfDeath); + else + obituary(self, attacker, sWeapon, sMeansOfDeath); + + if ( !isDefined( game["promod_do_readyup"] ) || !game["promod_do_readyup"] ) + self maps\mp\gametypes\_weapons::dropWeaponForDeath( attacker ); + + self.sessionstate = "dead"; + + if ( !isDefined( level.rdyup ) || !level.rdyup ) + self.statusicon = "hud_status_dead"; + + if (level.rdyup && isDefined( attacker.pers ) && ( attacker != self ) ) + { + attacker.ruptally++; + attacker setclientdvar("self_kills", attacker.ruptally); + } + + if (!level.rdyup) + { + self.deathCount++; + + if( isDefined( attacker.pers ) && !isDefined( self.switching_teams ) ) + { + self incPersStat( "deaths", 1 ); + self.deaths = self getPersStat( "deaths" ); + } + } + + lpattackGuid = ""; + lpattackname = ""; + lpattackerteam = ""; + lpattacknum = -1; + + prof_end( "PlayerKilled pre constants" ); + + if( isPlayer( attacker ) ) + { + lpattackGuid = attacker getGuid(); + lpattackname = attacker.name; + + if ( attacker == self ) + { + doKillcam = false; + + if ( isDefined( self.switching_teams ) ) + { + if ( !level.teamBased && ((self.leaving_team == "allies" && self.joining_team == "axis") || (self.leaving_team == "axis" && self.joining_team == "allies")) ) + { + playerCounts = self maps\mp\gametypes\_teams::CountPlayers(); + playerCounts[self.leaving_team]--; + playerCounts[self.joining_team]++; + + if( !level.rdyup && (playerCounts[self.joining_team] - playerCounts[self.leaving_team]) > 1 ) + { + self thread [[level.onXPEvent]]( "suicide" ); + self incPersStat( "suicides", 1 ); + self.suicides = self getPersStat( "suicides" ); + } + } + } + else + { + if (!level.rdyup) + { + self thread [[level.onXPEvent]]( "suicide" ); + self incPersStat( "suicides", 1 ); + self.suicides = self getPersStat( "suicides" ); + + scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "suicidepointloss" ); + _setPlayerScore( self, _getPlayerScore( self ) - scoreSub ); + } + if ( sMeansOfDeath == "MOD_SUICIDE" && sHitLoc == "none" && self.throwingGrenade ) + self.lastGrenadeSuicideTime = gettime(); + } + } + else + { + prof_begin( "PlayerKilled attacker" ); + + lpattacknum = attacker getEntityNumber(); + + doKillcam = true; + + if ( level.teamBased && self.pers["team"] == attacker.pers["team"] ) + { + if ( sMeansOfDeath != "MOD_GRENADE" && level.friendlyfire && !level.rdyup ) + { + attacker thread [[level.onXPEvent]]( "teamkill" ); + + attacker.pers["teamkills"] += 1; + + if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) ) + { + scoreSub = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ); + _setPlayerScore( attacker, _getPlayerScore( attacker ) - scoreSub ); + } + } + } + else + { + prof_begin( "pks1" ); + + if ( sMeansOfDeath == "MOD_HEAD_SHOT" ) + { + attacker incPersStat( "headshots", 1 ); + attacker.headshots = attacker getPersStat( "headshots" ); + value = maps\mp\gametypes\_rank::getScoreInfoValue( "headshot" ); + attacker thread maps\mp\gametypes\_rank::giveRankXP( "headshot", value ); + attacker playLocalSound( "bullet_impact_headshot_2" ); + } + else + { + value = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ); + attacker thread maps\mp\gametypes\_rank::giveRankXP( "kill", value ); + } + + if (!level.rdyup) + { + attacker incPersStat( "kills", 1 ); + attacker.kills = attacker getPersStat( "kills" ); + + givePlayerScore( "kill", attacker, self ); + + giveTeamScore( "kill", attacker.pers["team"], attacker, self ); + + scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "deathpointloss" ); + _setPlayerScore( self, _getPlayerScore( self ) - scoreSub ); + } + + prof_end( "pks1" ); + + if ( !level.rdyup && level.teamBased ) + { + prof_begin( "PlayerKilled assists" ); + + if ( isdefined( self.attackers ) ) + { + for ( j = 0; j < self.attackers.size; j++ ) + { + player = self.attackers[j]; + + if ( !isDefined( player ) || player == attacker ) + continue; + + player thread processAssist( self ); + } + self.attackers = []; + } + + prof_end( "PlayerKilled assists" ); + } + } + + prof_end( "PlayerKilled attacker" ); + } + } + else + { + doKillcam = false; + killedByEnemy = false; + + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackerteam = "world"; + + if ( isDefined( attacker ) && isDefined( attacker.team ) && (attacker.team == "axis" || attacker.team == "allies") && attacker.team != self.pers["team"] ) + { + killedByEnemy = true; + if ( level.teamBased ) + giveTeamScore( "kill", attacker.team, attacker, self ); + } + } + + self promod\shoutcast::updatePlayer(); + + self.switching_teams = undefined; + self.joining_team = undefined; + self.leaving_team = undefined; + + prof_begin( "PlayerKilled post constants" ); + + if ( sMeansOfDeath == "MOD_MELEE" ) + scWeapon = "knife_mp"; + else + scWeapon = sWeapon; + + sHeadshot = int(sMeansOfDeath == "MOD_HEAD_SHOT"); + + if ( isDefined( level.scorebot ) && level.scorebot && !level.rdyup ) + game["promod_scorebot_ticker_buffer"] += "kill" + lpattackname + "" + scWeapon + "" + self.name + "" + sHeadshot; + + logPrint( "K;" + self getGuid() + ";" + self getEntityNumber() + ";" + self.pers["team"] + ";" + self.name + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n" ); + + level thread updateTeamStatus(); + + self clonePlayer( deathAnimDuration ); + + self thread [[level.onPlayerKilled]](eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration); + + if ( sWeapon == "none" ) + doKillcam = false; + + killcamentity = -1; + + self.deathTime = getTime(); + + wait 0.25; + + self.cancelKillcam = false; + self thread cancelKillCamOnUse(); + + if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" && level.gametype == "sd" ) + postDeathDelay = waitForTimeOrNotifies( 0.75 ); + else + postDeathDelay = waitForTimeOrNotifies( 1.75 ); + + self notify ( "death_delay_finished" ); + + if ( !isDefined( game["state"] ) || game["state"] != "playing" ) + return; + + respawnTimerStartTime = gettime(); + + if ( !self.cancelKillcam && doKillcam && level.killcam ) + { + livesLeft = !(level.numLives && !self.pers["lives"]); + timeUntilSpawn = TimeUntilSpawn(); + willRespawnImmediately = livesLeft && (timeUntilSpawn <= 0); + + self maps\mp\gametypes\_killcam::killcam( lpattacknum, killcamentity, sWeapon, postDeathDelay, psOffsetTime, willRespawnImmediately, timeUntilRoundEnd(), [], attacker ); + } + + prof_end( "PlayerKilled post constants" ); + + if ( !isDefined( game["state"] ) || game["state"] != "playing" ) + { + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + return; + } + + if ( isValidClass( self.class ) ) + { + timePassed = (gettime() - respawnTimerStartTime) / 1000; + self thread [[level.spawnClient]]( timePassed ); + } +} + +cancelKillCamOnUse() +{ + self endon ( "death_delay_finished" ); + self endon ( "disconnect" ); + level endon ( "game_ended" ); + + for(;;) + { + if ( !self UseButtonPressed() ) + { + wait 0.05; + continue; + } + + buttonTime = 0; + while( self UseButtonPressed() ) + { + buttonTime += 0.05 ; + wait 0.05; + } + + if ( buttonTime >= 0.5 ) + continue; + + buttonTime = 0; + + while ( !self UseButtonPressed() && buttonTime < 0.5 ) + { + buttonTime += 0.05 ; + wait 0.05; + } + + if ( buttonTime >= 0.5 ) + continue; + + self.cancelKillcam = true; + return; + } +} + +waitForTimeOrNotifies( desiredDelay ) +{ + startedWaiting = getTime(); + + waitedTime = (getTime() - startedWaiting)/1000; + + if ( waitedTime < desiredDelay ) + { + wait desiredDelay - waitedTime; + return desiredDelay; + } + else + return waitedTime; +} + +processAssist( killedplayer ) +{ + self endon("disconnect"); + killedplayer endon("disconnect"); + + wait 0.05; + WaitTillSlowProcessAllowed(); + + if ( ( self.pers["team"] != "axis" && self.pers["team"] != "allies" ) || ( self.pers["team"] == killedplayer.pers["team"] ) ) + return; + + self thread [[level.onXPEvent]]( "assist" ); + self incPersStat( "assists", 1 ); + self.assists = self getPersStat( "assists" ); + + givePlayerScore( "assist", self, killedplayer ); + + if ( !isDefined( level.rdyup ) ) + level.rdyup = false; + + if ( isDefined( level.scorebot ) && level.scorebot && !level.rdyup ) + game["promod_scorebot_ticker_buffer"] += "assist_by" + self.name; +} + +Callback_PlayerLastStand() +{ +} + +setSpawnVariables() +{ + resetTimeout(); + + self StopShellshock(); + self StopRumble( "damage_heavy" ); +} + +notifyConnecting() +{ + self setRank( 0, 1 ); + + waittillframeend; + + if( isDefined( self ) ) + level notify( "connecting", self ); +} + +setObjectiveText( team, text ) +{ + game["strings"]["objective_"+team] = text; + precacheString( text ); +} + +setObjectiveScoreText( team, text ) +{ + game["strings"]["objective_score_"+team] = text; + precacheString( text ); +} + +setObjectiveHintText( team, text ) +{ + game["strings"]["objective_hint_"+team] = text; + precacheString( text ); +} + +getObjectiveText( team ) +{ + if ( !isDefined( game["strings"]["objective_"+team] ) ) + return ""; + + return game["strings"]["objective_"+team]; +} + +getObjectiveScoreText( team ) +{ + if ( !isDefined( game["strings"]["objective_score_"+team] ) ) + return ""; + + return game["strings"]["objective_score_"+team]; +} + +getObjectiveHintText( team ) +{ + if ( !isDefined( game["strings"]["objective_hint_"+team] ) ) + return ""; + + return game["strings"]["objective_hint_"+team]; +} \ No newline at end of file diff --git a/maps/mp/gametypes/_healthoverlay.gsc b/maps/mp/gametypes/_healthoverlay.gsc new file mode 100644 index 0000000..bed68e9 --- /dev/null +++ b/maps/mp/gametypes/_healthoverlay.gsc @@ -0,0 +1,194 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + precacheShader("overlay_low_health"); + + level.healthOverlayCutoff = 0.55; + + regenTime = 5; + + level.playerHealth_RegularRegenDelay = regenTime * 1000; + + level.healthRegenDisabled = (level.playerHealth_RegularRegenDelay <= 0); + + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill("connecting", player); + player thread onPlayerSpawned(); + player thread onPlayerKilled(); + player thread onJoinedTeam(); + player thread onJoinedSpectators(); + player thread onPlayerDisconnect(); + } +} + +onJoinedTeam() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("joined_team"); + self notify("end_healthregen"); + } +} + +onJoinedSpectators() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("joined_spectators"); + self notify("end_healthregen"); + } +} + +onPlayerSpawned() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("spawned_player"); + self thread playerHealthRegen(); + } +} + +onPlayerKilled() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("killed_player"); + self notify("end_healthregen"); + } +} + +onPlayerDisconnect() +{ + self waittill("disconnect"); + self notify("end_healthregen"); +} + +playerHealthRegen() +{ + self endon("end_healthregen"); + + if ( self.health <= 0 ) + return; + + maxhealth = self.health; + oldhealth = maxhealth; + player = self; + health_add = 0; + + regenRate = 0.1; + veryHurt = false; + + player.breathingStopTime = -10000; + + thread playerBreathingSound(maxhealth * 0.35); + + lastSoundTime_Recover = 0; + hurtTime = 0; + newHealth = 0; + + for(;;) + { + wait 0.05; + if (player.health == maxhealth) + { + veryHurt = false; + self.atBrinkOfDeath = false; + continue; + } + + if (player.health <= 0) + return; + + wasVeryHurt = veryHurt; + ratio = player.health / maxHealth; + if (ratio <= level.healthOverlayCutoff) + { + veryHurt = true; + self.atBrinkOfDeath = true; + if (!wasVeryHurt) + hurtTime = gettime(); + } + + if (player.health >= oldhealth) + { + if (gettime() - hurttime < level.playerHealth_RegularRegenDelay || level.healthRegenDisabled) + continue; + + if (gettime() - lastSoundTime_Recover > level.playerHealth_RegularRegenDelay) + { + lastSoundTime_Recover = gettime(); + self playLocalSound("breathing_better"); + } + + if (veryHurt) + { + newHealth = ratio; + if (gettime() > hurtTime + 3000) + newHealth += regenRate; + } + else + newHealth = 1; + + if ( newHealth >= 1.0 ) + newHealth = 1.0; + + if (newHealth <= 0) + return; + + player setnormalhealth (newHealth); + oldhealth = player.health; + player promod\shoutcast::updatePlayer(); + continue; + } + + oldhealth = player.health; + + health_add = 0; + hurtTime = gettime(); + player.breathingStopTime = hurtTime + 6000; + } +} + +playerBreathingSound(healthcap) +{ + self endon("end_healthregen"); + + wait 2; + player = self; + for(;;) + { + wait 0.2; + if ( player.health <= 0 ) + return; + + if ( player.health >= healthcap || level.healthRegenDisabled && gettime() > player.breathingStopTime ) + continue; + + player playLocalSound("breathing_hurt"); + wait 0.784; + wait (0.1 + randomfloat (0.8)); + } +} diff --git a/maps/mp/gametypes/_hud.gsc b/maps/mp/gametypes/_hud.gsc new file mode 100644 index 0000000..f5428b8 --- /dev/null +++ b/maps/mp/gametypes/_hud.gsc @@ -0,0 +1,84 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + precacheShader( "progress_bar_bg" ); + precacheShader( "progress_bar_fg" ); + precacheShader( "progress_bar_fill" ); + precacheShader( "score_bar_bg" ); + precacheShader( "score_bar_allies" ); + precacheShader( "score_bar_opfor" ); + + level.uiParent = spawnstruct(); + level.uiParent.horzAlign = "left"; + level.uiParent.vertAlign = "top"; + level.uiParent.alignX = "left"; + level.uiParent.alignY = "top"; + level.uiParent.x = 0; + level.uiParent.y = 0; + level.uiParent.width = 0; + level.uiParent.height = 0; + level.uiParent.children = []; + + level.fontHeight = 12; + + level.hud["allies"] = spawnstruct(); + level.hud["axis"] = spawnstruct(); + + level.primaryProgressBarY = -61; + level.primaryProgressBarX = 0; + level.primaryProgressBarHeight = 8; + level.primaryProgressBarWidth = 120; + level.primaryProgressBarTextY = -75; + level.primaryProgressBarTextX = 0; + level.primaryProgressBarFontSize = 1.4; + + level.teamProgressBarY = 32; + level.teamProgressBarHeight = 14; + level.teamProgressBarWidth = 192; + level.teamProgressBarTextY = 8; + level.teamProgressBarFontSize = 1.65; + + level.lowerTextYAlign = "CENTER"; + level.lowerTextY = 70; + level.lowerTextFontSize = 2; +} + +fontPulseInit() +{ + self.baseFontScale = self.fontScale; + self.maxFontScale = self.fontScale * 2; + self.inFrames = 3; + self.outFrames = 5; +} + +fontPulse(player) +{ + self notify ( "fontPulse" ); + self endon ( "fontPulse" ); + player endon("disconnect"); + player endon("joined_team"); + player endon("joined_spectators"); + + scaleRange = self.maxFontScale - self.baseFontScale; + + while ( self.fontScale < self.maxFontScale ) + { + self.fontScale = min( self.maxFontScale, self.fontScale + (scaleRange / self.inFrames) ); + wait 0.05; + } + + while ( self.fontScale > self.baseFontScale ) + { + self.fontScale = max( self.baseFontScale, self.fontScale - (scaleRange / self.outFrames) ); + wait 0.05; + } +} \ No newline at end of file diff --git a/maps/mp/gametypes/_hud_message.gsc b/maps/mp/gametypes/_hud_message.gsc new file mode 100644 index 0000000..63f825d --- /dev/null +++ b/maps/mp/gametypes/_hud_message.gsc @@ -0,0 +1,676 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\gametypes\_hud_util; + +init() +{ + precacheString( &"MP_FIRSTPLACE_NAME" ); + precacheString( &"MP_SECONDPLACE_NAME" ); + precacheString( &"MP_THIRDPLACE_NAME" ); + precacheString( &"MP_MATCH_BONUS_IS" ); + + game["strings"]["draw"] = &"MP_DRAW"; + game["strings"]["round_draw"] = &"MP_ROUND_DRAW"; + game["strings"]["round_win"] = &"MP_ROUND_WIN"; + game["strings"]["round_loss"] = &"MP_ROUND_LOSS"; + game["strings"]["victory"] = &"MP_VICTORY"; + game["strings"]["defeat"] = &"MP_DEFEAT"; + game["strings"]["halftime"] = &"MP_HALFTIME"; + game["strings"]["overtime"] = &"MP_OVERTIME"; + game["strings"]["roundend"] = &"MP_ROUNDEND"; + game["strings"]["intermission"] = &"MP_INTERMISSION"; + game["strings"]["side_switch"] = &"MP_SWITCHING_SIDES"; + game["strings"]["match_bonus"] = &"MP_MATCH_BONUS_IS"; + + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill( "connecting", player ); + + player thread hintMessageDeathThink(); + player thread lowerMessageThink(); + + player thread initNotifyMessage(); + } +} + +hintMessage( hintText ) +{ + notifyData = spawnstruct(); + + notifyData.notifyText = hintText; + notifyData.glowColor = (0.3, 0.6, 0.3); + + notifyMessage( notifyData ); +} + +initNotifyMessage() +{ + titleSize = 2.5; + textSize = 1.75; + iconSize = 30; + font = "objective"; + point = "TOP"; + relativePoint = "BOTTOM"; + yOffset = 30; + xOffset = 0; + + self.notifyTitle = createFontString( font, titleSize ); + self.notifyTitle setPoint( point, undefined, xOffset, yOffset ); + self.notifyTitle.glowColor = (0.2, 0.3, 0.7); + self.notifyTitle.glowAlpha = 1; + self.notifyTitle.hideWhenInMenu = true; + self.notifyTitle.archived = false; + self.notifyTitle.alpha = 0; + + self.notifyText = createFontString( font, textSize ); + self.notifyText setParent( self.notifyTitle ); + self.notifyText setPoint( point, relativePoint, 0, 0 ); + self.notifyText.glowColor = (0.2, 0.3, 0.7); + self.notifyText.glowAlpha = 1; + self.notifyText.hideWhenInMenu = true; + self.notifyText.archived = false; + self.notifyText.alpha = 0; + + self.notifyText2 = createFontString( font, textSize ); + self.notifyText2 setParent( self.notifyTitle ); + self.notifyText2 setPoint( point, relativePoint, 0, 0 ); + self.notifyText2.glowColor = (0.2, 0.3, 0.7); + self.notifyText2.glowAlpha = 1; + self.notifyText2.hideWhenInMenu = true; + self.notifyText2.archived = false; + self.notifyText2.alpha = 0; + + self.notifyIcon = createIcon( "white", iconSize, iconSize ); + self.notifyIcon setParent( self.notifyText2 ); + self.notifyIcon setPoint( point, relativePoint, 0, 0 ); + self.notifyIcon.hideWhenInMenu = true; + self.notifyIcon.archived = false; + self.notifyIcon.alpha = 0; + + self.doingNotify = false; + self.notifyQueue = []; +} + +oldNotifyMessage( titleText, notifyText, iconName, glowColor, sound, duration ) +{ + notifyData = spawnstruct(); + + notifyData.titleText = titleText; + notifyData.notifyText = notifyText; + notifyData.iconName = iconName; + notifyData.glowColor = glowColor; + notifyData.sound = sound; + notifyData.duration = duration; + + notifyMessage( notifyData ); +} + +notifyMessage( notifyData ) +{ + self endon ( "death" ); + self endon ( "disconnect" ); + + if ( !self.doingNotify ) + { + self thread showNotifyMessage( notifyData ); + return; + } + + self.notifyQueue[ self.notifyQueue.size ] = notifyData; +} + +showNotifyMessage( notifyData ) +{ + self endon("disconnect"); + + self.doingNotify = true; + + waitRequireVisibility( 0 ); + + if ( isDefined( notifyData.duration ) ) + duration = notifyData.duration; + else if ( level.gameEnded ) + duration = 2; + else + duration = 4; + + self thread resetOnCancel(); + + if ( isDefined( notifyData.sound ) ) + self playLocalSound( notifyData.sound ); + + if ( isDefined( notifyData.glowColor ) ) + glowColor = notifyData.glowColor; + else + glowColor = (0.3, 0.6, 0.3); + + anchorElem = self.notifyTitle; + + if ( isDefined( notifyData.titleText ) ) + { + if ( isDefined( notifyData.titleLabel ) ) + self.notifyTitle.label = notifyData.titleLabel; + else + self.notifyTitle.label = &""; + + if ( isDefined( notifyData.titleLabel ) && !isDefined( notifyData.titleIsString ) ) + self.notifyTitle setValue( notifyData.titleText ); + else + self.notifyTitle setText( notifyData.titleText ); + self.notifyTitle setPulseFX( 100, int(duration*1000), 1000 ); + self.notifyTitle.glowColor = glowColor; + self.notifyTitle.alpha = 1; + } + + if ( isDefined( notifyData.notifyText ) ) + { + if ( isDefined( notifyData.textLabel ) ) + self.notifyText.label = notifyData.textLabel; + else + self.notifyText.label = &""; + + if ( isDefined( notifyData.textLabel ) && !isDefined( notifyData.textIsString ) ) + self.notifyText setValue( notifyData.notifyText ); + else + self.notifyText setText( notifyData.notifyText ); + self.notifyText setPulseFX( 100, int(duration*1000), 1000 ); + self.notifyText.glowColor = glowColor; + self.notifyText.alpha = 1; + anchorElem = self.notifyText; + } + + if ( isDefined( notifyData.notifyText2 ) ) + { + self.notifyText2 setParent( anchorElem ); + + if ( isDefined( notifyData.text2Label ) ) + self.notifyText2.label = notifyData.text2Label; + else + self.notifyText2.label = &""; + + self.notifyText2 setText( notifyData.notifyText2 ); + self.notifyText2 setPulseFX( 100, int(duration*1000), 1000 ); + self.notifyText2.glowColor = glowColor; + self.notifyText2.alpha = 1; + anchorElem = self.notifyText2; + } + + if ( isDefined( notifyData.iconName ) ) + { + self.notifyIcon setParent( anchorElem ); + self.notifyIcon setShader( notifyData.iconName, 60, 60 ); + self.notifyIcon.alpha = 0; + self.notifyIcon fadeOverTime( 1 ); + self.notifyIcon.alpha = 1; + + waitRequireVisibility( duration ); + + self.notifyIcon fadeOverTime( 0.75 ); + self.notifyIcon.alpha = 0; + } + else + waitRequireVisibility( duration ); + + self notify ( "notifyMessageDone" ); + self.doingNotify = false; + + if ( self.notifyQueue.size > 0 ) + { + nextNotifyData = self.notifyQueue[0]; + + newQueue = []; + for ( i = 1; i < self.notifyQueue.size; i++ ) + self.notifyQueue[i-1] = self.notifyQueue[i]; + self.notifyQueue[i-1] = undefined; + + self thread showNotifyMessage( nextNotifyData ); + } +} + +waitRequireVisibility( waitTime ) +{ + self endon("disconnect"); + + interval = 0.05; + + while ( !self canReadText() ) + wait interval; + + while ( waitTime > 0 ) + { + wait interval; + if ( self canReadText() ) + waitTime -= interval; + } +} + +canReadText() +{ + if ( self maps\mp\_flashgrenades::isFlashbanged() ) + return false; + + return true; +} + +resetOnDeath() +{ + self endon ( "notifyMessageDone" ); + self endon ( "disconnect" ); + level endon ( "game_ended" ); + self waittill ( "death" ); + + resetNotify(); +} + +resetOnCancel() +{ + self notify ( "resetOnCancel" ); + self endon ( "resetOnCancel" ); + self endon ( "notifyMessageDone" ); + self endon ( "disconnect" ); + + level waittill ( "cancel_notify" ); + + resetNotify(); +} + +resetNotify() +{ + self.notifyTitle.alpha = 0; + self.notifyText.alpha = 0; + self.notifyIcon.alpha = 0; + self.doingNotify = false; +} + +hintMessageDeathThink() +{ + self endon ( "disconnect" ); + + for(;;) + { + self waittill ( "death" ); + + if ( isDefined( self.hintMessage ) ) + self.hintMessage destroyElem(); + } +} + +lowerMessageThink() +{ + self endon ( "disconnect" ); + + self.lowerMessage = createFontString( "default", level.lowerTextFontSize ); + self.lowerMessage setPoint( "CENTER", level.lowerTextYAlign, 0, level.lowerTextY ); + self.lowerMessage setText( "" ); + self.lowerMessage.archived = false; + + timerFontSize = 1.5; + + self.lowerTimer = createFontString( "default", timerFontSize ); + self.lowerTimer setParent( self.lowerMessage ); + self.lowerTimer setPoint( "TOP", "BOTTOM", 0, 0 ); + self.lowerTimer setText( "" ); + self.lowerTimer.archived = false; +} + +teamOutcomeNotify( winner, isRound, endReasonText, delay ) +{ + self endon ( "disconnect" ); + self notify ( "reset_outcome" ); + + team = self.pers["team"]; + if ( !isDefined( team ) || (team != "allies" && team != "axis") ) + team = "allies"; + + while ( self.doingNotify ) + wait 0.05; + + if ( isDefined ( delay ) ) + wait delay; + + self endon ( "reset_outcome" ); + + titleSize = 3; + textSize = 2; + iconSize = 70; + spacing = 30; + font = "objective"; + + duration = 60000; + + outcomeTitle = createFontString( font, titleSize ); + outcomeTitle setPoint( "TOP", undefined, 0, 30 ); + outcomeTitle.glowAlpha = 1; + outcomeTitle.hideWhenInMenu = false; + outcomeTitle.archived = false; + + outcomeText = createFontString( font, 2 ); + outcomeText setParent( outcomeTitle ); + outcomeText setPoint( "TOP", "BOTTOM", 0, 0 ); + outcomeText.glowAlpha = 1; + outcomeText.hideWhenInMenu = false; + outcomeText.archived = false; + + if ( winner == "halftime" ) + { + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + outcomeTitle setText( game["strings"]["halftime"] ); + outcomeTitle.color = (1, 1, 1); + } + else if ( winner == "intermission" ) + { + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + outcomeTitle setText( game["strings"]["intermission"] ); + outcomeTitle.color = (1, 1, 1); + } + else if ( winner == "roundend" ) + { + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + outcomeTitle setText( game["strings"]["roundend"] ); + outcomeTitle.color = (1, 1, 1); + } + else if ( winner == "overtime" ) + { + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + outcomeTitle setText( game["strings"]["overtime"] ); + outcomeTitle.color = (1, 1, 1); + } + else if ( winner == "tie" ) + { + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + if ( isRound ) + outcomeTitle setText( game["strings"]["round_draw"] ); + else + outcomeTitle setText( game["strings"]["draw"] ); + outcomeTitle.color = (1, 1, 1); + } + else if ( isDefined( self.pers["team"] ) && winner == team ) + { + outcomeTitle.glowColor = (0, 0, 0); + if ( isRound ) + outcomeTitle setText( game["strings"]["round_win"] ); + else + outcomeTitle setText( game["strings"]["victory"] ); + outcomeTitle.color = (0.6, 0.9, 0.6); + } + else + { + outcomeTitle.glowColor = (0, 0, 0); + if ( isRound ) + outcomeTitle setText( game["strings"]["round_loss"] ); + else + outcomeTitle setText( game["strings"]["defeat"] ); + outcomeTitle.color = (0.7, 0.3, 0.2); + } + + outcomeText.glowColor = (0.2, 0.3, 0.7); + outcomeText setText( endReasonText ); + + outcomeTitle setPulseFX( 100, duration, 1000 ); + outcomeText setPulseFX( 100, duration, 1000 ); + + leftIcon = createIcon( game["icons"][team], iconSize, iconSize ); + leftIcon setParent( outcomeText ); + leftIcon setPoint( "TOP", "BOTTOM", -60, spacing ); + leftIcon.hideWhenInMenu = false; + leftIcon.archived = false; + leftIcon.alpha = 0; + leftIcon fadeOverTime( 0.5 ); + leftIcon.alpha = 1; + + rightIcon = createIcon( game["icons"][level.otherTeam[team]], iconSize, iconSize ); + rightIcon setParent( outcomeText ); + rightIcon setPoint( "TOP", "BOTTOM", 60, spacing ); + rightIcon.hideWhenInMenu = false; + rightIcon.archived = false; + rightIcon.alpha = 0; + rightIcon fadeOverTime( 0.5 ); + rightIcon.alpha = 1; + + leftScore = createFontString( font, titleSize ); + leftScore setParent( leftIcon ); + leftScore setPoint( "TOP", "BOTTOM", 0, spacing ); + leftScore.glowColor = game["colors"][team]; + leftScore.glowAlpha = 1; + leftScore setValue( getTeamScore( team ) ); + leftScore.hideWhenInMenu = false; + leftScore.archived = false; + leftScore setPulseFX( 100, duration, 1000 ); + + rightScore = createFontString( font, titleSize ); + rightScore setParent( rightIcon ); + rightScore setPoint( "TOP", "BOTTOM", 0, spacing ); + rightScore.glowColor = game["colors"][level.otherTeam[team]]; + rightScore.glowAlpha = 1; + rightScore setValue( getTeamScore( level.otherTeam[team] ) ); + rightScore.hideWhenInMenu = false; + rightScore.archived = false; + rightScore setPulseFX( 100, duration, 1000 ); + + if ( winner == "halftime" ) + { + leftIcon MoveOverTime( 2.5 ); + leftIcon setPoint( "TOP", "BOTTOM", 60, spacing ); + rightIcon MoveOverTime( 2.5 ); + rightIcon setPoint( "TOP", "BOTTOM", -60, spacing ); + leftScore MoveOverTime( 2.5 ); + leftScore setPoint( "TOP", "BOTTOM", -120, spacing ); + rightScore MoveOverTime( 2.5 ); + rightScore setPoint( "TOP", "BOTTOM", 120, spacing ); + } + + matchBonus = undefined; + if ( isDefined( self.matchBonus ) ) + { + matchBonus = createFontString( font, 2 ); + matchBonus setParent( outcomeText ); + matchBonus setPoint( "TOP", "BOTTOM", 0, iconSize + (spacing * 3) + leftScore.height ); + matchBonus.glowAlpha = 1; + matchBonus.hideWhenInMenu = false; + matchBonus.archived = false; + matchBonus.label = game["strings"]["match_bonus"]; + matchBonus setValue( self.matchBonus ); + } + + self thread resetTeamOutcomeNotify( outcomeTitle, outcomeText, leftIcon, rightIcon, leftScore, rightScore, matchBonus ); +} + +outcomeNotify( winner, endReasonText, delay ) +{ + self endon ( "disconnect" ); + self notify ( "reset_outcome" ); + + while ( self.doingNotify ) + wait 0.05; + + if ( isDefined ( delay ) ) + wait delay; + + self endon ( "reset_outcome" ); + + titleSize = 3; + winnerSize = 2; + otherSize = 1.5; + iconSize = 30; + spacing = 20; + font = "objective"; + + duration = 60000; + + players = level.placement["all"]; + + outcomeTitle = createFontString( font, titleSize ); + outcomeTitle setPoint( "TOP", undefined, 0, spacing ); + if ( isDefined( players[1] ) && players[0].score == players[1].score && players[0].deaths == players[1].deaths && (self == players[0] || self == players[1]) ) + { + outcomeTitle setText( game["strings"]["tie"] ); + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + } + else if ( isDefined( players[2] ) && players[0].score == players[2].score && players[0].deaths == players[2].deaths && self == players[2] ) + { + outcomeTitle setText( game["strings"]["tie"] ); + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + } + else if ( isDefined( players[0] ) && self == players[0] ) + { + outcomeTitle setText( game["strings"]["victory"] ); + outcomeTitle.glowColor = (0.2, 0.3, 0.7); + } + else + { + outcomeTitle setText( game["strings"]["defeat"] ); + outcomeTitle.glowColor = (0.7, 0.3, 0.2); + } + outcomeTitle.glowAlpha = 1; + outcomeTitle.hideWhenInMenu = false; + outcomeTitle.archived = false; + outcomeTitle setPulseFX( 100, duration, 1000 ); + + outcomeText = createFontString( font, 2 ); + outcomeText setParent( outcomeTitle ); + outcomeText setPoint( "TOP", "BOTTOM", 0, 0 ); + outcomeText.glowAlpha = 1; + outcomeText.hideWhenInMenu = false; + outcomeText.archived = false; + outcomeText.glowColor = (0.2, 0.3, 0.7); + outcomeText setText( endReasonText ); + + firstTitle = createFontString( font, winnerSize ); + firstTitle setParent( outcomeText ); + firstTitle setPoint( "TOP", "BOTTOM", 0, spacing ); + firstTitle.glowColor = (0.3, 0.7, 0.2); + firstTitle.glowAlpha = 1; + firstTitle.hideWhenInMenu = false; + firstTitle.archived = false; + if ( isDefined( players[0] ) ) + { + firstTitle.label = &"MP_FIRSTPLACE_NAME"; + firstTitle setPlayerNameString( players[0] ); + firstTitle setPulseFX( 100, duration, 1000 ); + } + + secondTitle = createFontString( font, otherSize ); + secondTitle setParent( firstTitle ); + secondTitle setPoint( "TOP", "BOTTOM", 0, spacing ); + secondTitle.glowColor = (0.2, 0.3, 0.7); + secondTitle.glowAlpha = 1; + secondTitle.hideWhenInMenu = false; + secondTitle.archived = false; + if ( isDefined( players[1] ) ) + { + secondTitle.label = &"MP_SECONDPLACE_NAME"; + secondTitle setPlayerNameString( players[1] ); + secondTitle setPulseFX( 100, duration, 1000 ); + } + + thirdTitle = createFontString( font, otherSize ); + thirdTitle setParent( secondTitle ); + thirdTitle setPoint( "TOP", "BOTTOM", 0, spacing ); + thirdTitle setParent( secondTitle ); + thirdTitle.glowColor = (0.2, 0.3, 0.7); + thirdTitle.glowAlpha = 1; + thirdTitle.hideWhenInMenu = false; + thirdTitle.archived = false; + if ( isDefined( players[2] ) ) + { + thirdTitle.label = &"MP_THIRDPLACE_NAME"; + thirdTitle setPlayerNameString( players[2] ); + thirdTitle setPulseFX( 100, duration, 1000 ); + } + + matchBonus = createFontString( font, 2 ); + matchBonus setParent( thirdTitle ); + matchBonus setPoint( "TOP", "BOTTOM", 0, spacing ); + matchBonus.glowAlpha = 1; + matchBonus.hideWhenInMenu = false; + matchBonus.archived = false; + if ( isDefined( self.matchBonus ) ) + { + matchBonus.label = game["strings"]["match_bonus"]; + matchBonus setValue( self.matchBonus ); + } + + self thread updateOutcome( firstTitle, secondTitle, thirdTitle ); + self thread resetOutcomeNotify( outcomeTitle, outcomeText, firstTitle, secondTitle, thirdTitle, matchBonus ); +} + +resetOutcomeNotify( outcomeTitle, outcomeText, firstTitle, secondTitle, thirdTitle, matchBonus ) +{ + self endon ( "disconnect" ); + self waittill ( "reset_outcome" ); + + if ( isDefined( outcomeTitle ) ) + outcomeTitle destroyElem(); + if ( isDefined( outcomeText ) ) + outcomeText destroyElem(); + if ( isDefined( firstTitle ) ) + firstTitle destroyElem(); + if ( isDefined( secondTitle ) ) + secondTitle destroyElem(); + if ( isDefined( thirdTitle ) ) + thirdTitle destroyElem(); + if ( isDefined( matchBonus ) ) + matchBonus destroyElem(); +} + +resetTeamOutcomeNotify( outcomeTitle, outcomeText, leftIcon, rightIcon, LeftScore, rightScore, matchBonus ) +{ + self endon ( "disconnect" ); + self waittill ( "reset_outcome" ); + + if ( isDefined( outcomeTitle ) ) + outcomeTitle destroyElem(); + if ( isDefined( outcomeText ) ) + outcomeText destroyElem(); + if ( isDefined( leftIcon ) ) + leftIcon destroyElem(); + if ( isDefined( rightIcon ) ) + rightIcon destroyElem(); + if ( isDefined( leftScore ) ) + leftScore destroyElem(); + if ( isDefined( rightScore ) ) + rightScore destroyElem(); + if ( isDefined( matchBonus ) ) + matchBonus destroyElem(); +} + +updateOutcome( firstTitle, secondTitle, thirdTitle ) +{ + self endon( "disconnect" ); + self endon( "reset_outcome" ); + + for(;;) + { + self waittill( "update_outcome" ); + + players = level.placement["all"]; + + if ( isDefined( firstTitle ) && isDefined( players[0] ) ) + firstTitle setPlayerNameString( players[0] ); + else if ( isDefined( firstTitle ) ) + firstTitle.alpha = 0; + + if ( isDefined( secondTitle ) && isDefined( players[1] ) ) + secondTitle setPlayerNameString( players[1] ); + else if ( isDefined( secondTitle ) ) + secondTitle.alpha = 0; + + if ( isDefined( thirdTitle ) && isDefined( players[2] ) ) + thirdTitle setPlayerNameString( players[2] ); + else if ( isDefined( thirdTitle ) ) + thirdTitle.alpha = 0; + } +} \ No newline at end of file diff --git a/maps/mp/gametypes/_killcam.gsc b/maps/mp/gametypes/_killcam.gsc new file mode 100644 index 0000000..70d0d73 --- /dev/null +++ b/maps/mp/gametypes/_killcam.gsc @@ -0,0 +1,211 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\gametypes\_hud_util; + +init() +{ + precacheString(&"PLATFORM_PRESS_TO_SKIP"); + precacheString(&"PLATFORM_PRESS_TO_RESPAWN"); + precacheShader("white"); + + level.killcam = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "allowkillcam" ); + + if( level.killcam ) + setArchive(true); +} + +killcam( attackerNum, killcamentity, sWeapon, predelay, offsetTime, respawn, maxtime, perks, attacker ) +{ + self endon("disconnect"); + self endon("spawned"); + level endon("game_ended"); + + if(attackerNum < 0) + return; + + if ( !respawn ) + camtime = 5; + else if (sWeapon == "frag_grenade_mp" || sWeapon == "frag_grenade_short_mp") + camtime = 4.5; + else + camtime = 2.5; + + if (isdefined(maxtime)) + { + if (camtime > maxtime) + camtime = maxtime; + if (camtime < 0.05) + camtime = 0.05; + } + + postdelay = 2; + + killcamlength = camtime + postdelay; + + if (isdefined(maxtime) && killcamlength > maxtime) + { + if (maxtime < 2) + return; + + if (maxtime - camtime >= 1) + postdelay = maxtime - camtime; + else + { + postdelay = 1; + camtime = maxtime - 1; + } + + killcamlength = camtime + postdelay; + } + + killcamoffset = camtime + predelay; + + self notify ( "begin_killcam", getTime() ); + + self.sessionstate = "spectator"; + self.spectatorclient = attackerNum; + self.killcamentity = killcamentity; + self.archivetime = killcamoffset; + self.killcamlength = killcamlength; + self.psoffsettime = offsetTime; + + self allowSpectateTeam("allies", true); + self allowSpectateTeam("axis", true); + self allowSpectateTeam("freelook", true); + self allowSpectateTeam("none", true); + + wait 0.05; + + if ( self.archivetime <= predelay ) + { + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + return; + } + + self.killcam = true; + + if ( !isdefined( self.kc_skiptext ) ) + { + self.kc_skiptext = newClientHudElem(self); + self.kc_skiptext.archived = false; + self.kc_skiptext.x = 0; + self.kc_skiptext.alignX = "center"; + self.kc_skiptext.alignY = "middle"; + self.kc_skiptext.horzAlign = "center_safearea"; + self.kc_skiptext.vertAlign = "top"; + self.kc_skiptext.sort = 1; + self.kc_skiptext.font = "objective"; + self.kc_skiptext.foreground = true; + self.kc_skiptext.y = 60; + self.kc_skiptext.fontscale = 2; + } + if ( respawn ) + self.kc_skiptext setText(&"PLATFORM_PRESS_TO_RESPAWN"); + else + self.kc_skiptext setText(&"PLATFORM_PRESS_TO_SKIP"); + + self.kc_skiptext.alpha = 1; + + if ( !isdefined( self.kc_timer ) ) + { + self.kc_timer = createFontString( "objective", 2 ); + self.kc_timer setPoint( "BOTTOM", undefined, 0, -60 ); + self.kc_timer.archived = false; + self.kc_timer.foreground = true; + } + + self.kc_timer.alpha = 1; + self.kc_timer setTenthsTimer(camtime); + + self thread spawnedKillcamCleanup(); + self thread endedKillcamCleanup(); + self thread waitSkipKillcamButton(); + self thread waitKillcamTime(); + + self waittill("end_killcam"); + + self endKillcam(); + + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; +} + +waitKillcamTime() +{ + self endon("disconnect"); + self endon("end_killcam"); + + wait(self.killcamlength - 0.05); + self notify("end_killcam"); +} + +waitSkipKillcamButton() +{ + self endon("disconnect"); + self endon("end_killcam"); + + while(self useButtonPressed()) + wait 0.05; + + while(!(self useButtonPressed())) + wait 0.05; + + self notify("end_killcam"); +} + +endKillcam() +{ + if(isDefined(self.kc_skiptext)) + self.kc_skiptext.alpha = 0; + if(isDefined(self.kc_timer)) + self.kc_timer.alpha = 0; + + self.killcam = undefined; + + self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); +} + +spawnedKillcamCleanup() +{ + self endon("end_killcam"); + self endon("disconnect"); + + self waittill("spawned"); + self endKillcam(); +} + +spectatorKillcamCleanup( attacker ) +{ + self endon("end_killcam"); + self endon("disconnect"); + attacker endon ( "disconnect" ); + + attacker waittill ( "begin_killcam", attackerKcStartTime ); + waitTime = max( 0, (attackerKcStartTime - self.deathTime) - 50 ); + wait waitTime; + self endKillcam(); +} + +endedKillcamCleanup() +{ + self endon("end_killcam"); + self endon("disconnect"); + + level waittill("game_ended"); + self endKillcam(); +} \ No newline at end of file diff --git a/maps/mp/gametypes/_menus.gsc b/maps/mp/gametypes/_menus.gsc new file mode 100644 index 0000000..adaa0ea --- /dev/null +++ b/maps/mp/gametypes/_menus.gsc @@ -0,0 +1,239 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + game["menu_team"] = "team_marinesopfor"; + if(game["attackers"] == "axis" && game["defenders"] == "allies") + game["menu_team"] += "_flipped"; + game["menu_class_allies"] = "class_marines"; + game["menu_changeclass_allies"] = "changeclass_marines_mw"; + game["menu_class_axis"] = "class_opfor"; + game["menu_changeclass_axis"] = "changeclass_opfor_mw"; + game["menu_class"] = "class"; + game["menu_changeclass"] = "changeclass_mw"; + game["menu_changeclass_offline"] = "changeclass_offline"; + game["menu_shoutcast"] = "shoutcast"; + game["menu_shoutcast_map"] = "shoutcast_map"; + game["menu_shoutcast_setup"] = "shoutcast_setup"; + game["menu_callvote"] = "callvote"; + game["menu_muteplayer"] = "muteplayer"; + game["menu_quickcommands"] = "quickcommands"; + game["menu_quickstatements"] = "quickstatements"; + game["menu_quickresponses"] = "quickresponses"; + game["menu_quickpromod"] = "quickpromod"; + game["menu_quickpromodgfx"] = "quickpromodgfx"; + game["menu_demo"] = "demo"; + + precacheMenu("quickcommands"); + precacheMenu("quickstatements"); + precacheMenu("quickresponses"); + precacheMenu("quickpromod"); + precacheMenu("quickpromodgfx"); + precacheMenu("scoreboard"); + precacheMenu(game["menu_team"]); + precacheMenu("class_marines"); + precacheMenu("changeclass_marines_mw"); + precacheMenu("class_opfor"); + precacheMenu("changeclass_opfor_mw"); + precacheMenu("class"); + precacheMenu("changeclass_mw"); + precacheMenu("changeclass_offline"); + precacheMenu("callvote"); + precacheMenu("muteplayer"); + precacheMenu("shoutcast"); + precacheMenu("shoutcast_map"); + precacheMenu("shoutcast_setup"); + precacheMenu("shoutcast_setup_binds"); + precacheMenu("echo"); + precacheMenu("demo"); + + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill("connecting", player); + player thread onMenuResponse(); + } +} + +onMenuResponse() +{ + level endon("restarting"); + self endon("disconnect"); + + for(;;) + { + self waittill("menuresponse", menu, response); + + if ( !isDefined( self.pers["team"] ) ) + continue; + + if( getSubStr( response, 0, 7 ) == "loadout" ) + { + self maps\mp\gametypes\_promod::processLoadoutResponse( response ); + continue; + } + + switch( response ) + { + case "back": + if ( self.pers["team"] == "none" ) + continue; + + if( menu == game["menu_changeclass"] && ( self.pers["team"] == "axis" || self.pers["team"] == "allies" ) ) + { + if( isDefined(self.pers["class"]) ) + { + self maps\mp\gametypes\_promod::setClassChoice( self.pers["class"] ); + self maps\mp\gametypes\_promod::menuAcceptClass( "go" ); + } + + self openMenu( game["menu_changeclass_"+self.pers["team"]] ); + } + else + { + self closeMenu(); + self closeInGameMenu(); + } + continue; + + case "demo": + if ( menu == "demo" ) + self.inrecmenu = false; + continue; + + case "changeteam": + self closeMenu(); + self closeInGameMenu(); + self openMenu(game["menu_team"]); + continue; + + case "shoutcast_setup": + if ( self.pers["team"] != "spectator" ) + continue; + + self closeMenu(); + self closeInGameMenu(); + self openMenu(game["menu_shoutcast_setup"]); + continue; + + case "changeclass_marines": + case "changeclass_opfor": + if ( self.pers["team"] == "axis" || self.pers["team"] == "allies" ) + { + self closeMenu(); + self closeInGameMenu(); + self openMenu( game["menu_changeclass_"+self.pers["team"]] ); + } + continue; + } + + switch( menu ) + { + case "echo": + k = strtok(response, "_"); + buf = k[0]; + for(i=1;i 0 ) + self promod\shoutcast::followBar(int(response)-1); + } + continue; + + case "quickcommands": + case "quickstatements": + case "quickresponses": + maps\mp\gametypes\_quickmessages::doQuickMessage( menu, int(response)-1 ); + continue; + + case "quickpromod": + maps\mp\gametypes\_quickmessages::quickpromod( response ); + continue; + + case "quickpromodgfx": + maps\mp\gametypes\_quickmessages::quickpromodgfx( response ); + continue; + } + } +} \ No newline at end of file diff --git a/maps/mp/gametypes/_missions.gsc b/maps/mp/gametypes/_missions.gsc new file mode 100644 index 0000000..400249b --- /dev/null +++ b/maps/mp/gametypes/_missions.gsc @@ -0,0 +1,11 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init(){} \ No newline at end of file diff --git a/maps/mp/gametypes/_promod.gsc b/maps/mp/gametypes/_promod.gsc new file mode 100644 index 0000000..33d2ace --- /dev/null +++ b/maps/mp/gametypes/_promod.gsc @@ -0,0 +1,623 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + level.serverDvars = []; + + setDvarDefault( "class_assault_limit", 64, 0, 64 ); + setDvarDefault( "class_specops_limit", 2, 0, 64 ); + setDvarDefault( "class_demolitions_limit", 1, 0, 64 ); + setDvarDefault( "class_sniper_limit", 1, 0, 64 ); + + setDvarDefault( "class_assault_allowdrop", 1, 0, 1 ); + setDvarDefault( "class_specops_allowdrop", 1, 0, 1 ); + setDvarDefault( "class_demolitions_allowdrop", 0, 0, 1 ); + setDvarDefault( "class_sniper_allowdrop", 0, 0, 1 ); + + setDvarDefault( "weap_allow_m16", 1, 0, 1 ); + setDvarDefault( "weap_allow_ak47", 1, 0, 1 ); + setDvarDefault( "weap_allow_m4", 1, 0, 1 ); + setDvarDefault( "weap_allow_g3", 1, 0, 1 ); + setDvarDefault( "weap_allow_g36c", 1, 0, 1 ); + setDvarDefault( "weap_allow_m14", 1, 0, 1 ); + setDvarDefault( "weap_allow_mp44", 1, 0, 1 ); + + setDvarDefault( "attach_allow_assault_none", 1, 0, 1 ); + setDvarDefault( "attach_allow_assault_silencer", 1, 0, 1 ); + + setDvarDefault( "weap_allow_mp5", 1, 0, 1 ); + setDvarDefault( "weap_allow_uzi", 1, 0, 1 ); + setDvarDefault( "weap_allow_ak74u", 1, 0, 1 ); + + setDvarDefault( "attach_allow_specops_none", 1, 0, 1 ); + setDvarDefault( "attach_allow_specops_silencer", 1, 0, 1 ); + + setDvarDefault( "weap_allow_m1014", 1, 0, 1 ); + setDvarDefault( "weap_allow_winchester1200", 1, 0, 1 ); + + setDvarDefault( "weap_allow_m40a3", 1, 0, 1 ); + setDvarDefault( "weap_allow_remington700", 1, 0, 1 ); + + setServerDvarDefault( "weap_allow_beretta", 1, 0, 1 ); + setServerDvarDefault( "weap_allow_colt45", 1, 0, 1 ); + setServerDvarDefault( "weap_allow_usp", 1, 0, 1 ); + setServerDvarDefault( "weap_allow_deserteagle", 1, 0, 1 ); + setServerDvarDefault( "weap_allow_deserteaglegold", 1, 0, 1 ); + + setServerDvarDefault( "attach_allow_pistol_none", 1, 0, 1 ); + setServerDvarDefault( "attach_allow_pistol_silencer", 1, 0, 1 ); + + setServerDvarDefault( "weap_allow_frag_grenade", 1, 0, 1 ); + setServerDvarDefault( "weap_allow_flash_grenade", 1, 0, 1 ); + setServerDvarDefault( "weap_allow_smoke_grenade", 1, 0, 1 ); + + setServerDvarDefault( "allies_allow_assault", 1, 0, 1 ); + setServerDvarDefault( "allies_allow_specops", 1, 0, 1 ); + setServerDvarDefault( "allies_allow_demolitions", 1, 0, 1 ); + setServerDvarDefault( "allies_allow_sniper", 1, 0, 1 ); + setServerDvarDefault( "axis_allow_assault", 1, 0, 1 ); + setServerDvarDefault( "axis_allow_specops", 1, 0, 1 ); + setServerDvarDefault( "axis_allow_demolitions", 1, 0, 1 ); + setServerDvarDefault( "axis_allow_sniper", 1, 0, 1 ); + + setDvarDefault( "class_assault_primary", "ak47" ); + setDvarDefault( "class_assault_primary_attachment", "none" ); + setDvarDefault( "class_assault_secondary", "deserteagle" ); + setDvarDefault( "class_assault_secondary_attachment", "none" ); + setDvarDefault( "class_assault_grenade", "smoke_grenade" ); + setDvarDefault( "class_assault_camo", "camo_none" ); + + setDvarDefault( "class_specops_primary", "ak74u" ); + setDvarDefault( "class_specops_primary_attachment", "none" ); + setDvarDefault( "class_specops_secondary", "deserteagle" ); + setDvarDefault( "class_specops_secondary_attachment", "none" ); + setDvarDefault( "class_specops_grenade", "smoke_grenade" ); + setDvarDefault( "class_specops_camo", "camo_none" ); + + setDvarDefault( "class_demolitions_primary", "winchester1200" ); + setDvarDefault( "class_demolitions_primary_attachment", "none" ); + setDvarDefault( "class_demolitions_secondary", "deserteagle" ); + setDvarDefault( "class_demolitions_secondary_attachment", "none" ); + setDvarDefault( "class_demolitions_grenade", "smoke_grenade" ); + setDvarDefault( "class_demolitions_camo", "camo_none" ); + + setDvarDefault( "class_sniper_primary", "m40a3" ); + setDvarDefault( "class_sniper_primary_attachment", "none" ); + setDvarDefault( "class_sniper_secondary", "deserteagle" ); + setDvarDefault( "class_sniper_secondary_attachment", "none" ); + setDvarDefault( "class_sniper_grenade", "smoke_grenade" ); + setDvarDefault( "class_sniper_camo", "camo_none" ); + + setDvarDefault( "scr_enable_hiticon", 2, 0, 2 ); + setDvarDefault( "scr_enable_scoretext", 1, 0, 1 ); + + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill( "connecting", player ); + player thread updateServerDvars(); + } +} + +setClassChoice( classType ) +{ + if( classType != "assault" && classType != "specops" && classType != "demolitions" && classType != "sniper" ) + return; + + idef = !isDefined(self.pers["class"]); + + self.pers["class"] = classType; + self.class = classType; + + if(idef) + self promod\shoutcast::addPlayer(); + + self setClientDvar( "loadout_class", classType ); + + self initClassLoadouts(); + self setDvarsFromClass( classType ); + + switch ( classType ) + { + case "assault": + self setClientDvars( + "weap_allow_m16", getDvar( "weap_allow_m16" ), + "weap_allow_ak47", getDvar( "weap_allow_ak47" ), + "weap_allow_m4", getDvar( "weap_allow_m4" ), + "weap_allow_g3", getDvar( "weap_allow_g3" ), + "weap_allow_g36c", getDvar( "weap_allow_g36c" ), + "weap_allow_m14", getDvar( "weap_allow_m14" ), + "weap_allow_mp44", getDvar( "weap_allow_mp44" ), + "attach_allow_assault_none", getDvar( "attach_allow_assault_none" ), + "attach_allow_assault_silencer", getDvar( "attach_allow_assault_silencer" ) ); + break; + case "specops": + self setClientDvars( + "weap_allow_mp5", getDvar( "weap_allow_mp5" ), + "weap_allow_uzi", getDvar( "weap_allow_uzi" ), + "weap_allow_ak74u", getDvar( "weap_allow_ak74u" ), + "attach_allow_specops_none", getDvar( "attach_allow_specops_none" ), + "attach_allow_specops_silencer", getDvar( "attach_allow_specops_silencer" ) ); + break; + case "demolitions": + self setClientDvars( + "weap_allow_m1014", getDvar( "weap_allow_m1014" ), + "weap_allow_winchester1200", getDvar( "weap_allow_winchester1200" ) ); + break; + case "sniper": + self setClientDvars( + "weap_allow_m40a3", getDvar( "weap_allow_m40a3" ), + "weap_allow_remington700", getDvar( "weap_allow_remington700" ) ); + break; + } + + thread updateClassAvailability( self.pers["team"] ); +} + +setDvarWrapper( dvarName, setVal ) +{ + setDvar( dvarName, setVal ); + if ( isDefined( level.serverDvars[dvarName] ) ) + { + level.serverDvars[dvarName] = setVal; + for ( i = 0; i < level.players.size; i++ ) + level.players[i] setClientDvar( dvarName, setVal ); + } +} + +setDvarDefault( dvarName, setVal, minVal, maxVal ) +{ + if ( getDvar( dvarName ) != "" ) + { + if ( isString( setVal ) ) + setVal = getDvar( dvarName ); + else + setVal = getDvarFloat( dvarName ); + } + + if ( isDefined( minVal ) && !isString( setVal ) ) + setVal = max( setVal, minVal ); + + if ( isDefined( maxVal ) && !isString( setVal ) ) + setVal = min( setVal, maxVal ); + + setDvar( dvarName, setVal ); + return setVal; +} + +setServerDvarDefault( dvarName, setVal, minVal, maxVal ) +{ + setVal = setDvarDefault( dvarName, setVal, minVal, maxVal ); + + level.serverDvars[dvarName] = setVal; +} + +initClassLoadouts() +{ + self initLoadoutForClass( "assault" ); + self initLoadoutForClass( "specops" ); + self initLoadoutForClass( "demolitions" ); + self initLoadoutForClass( "sniper" ); +} + +initLoadoutForClass( classType ) +{ + SSALC = ""; + if ( classType == "assault" ) + SSALC = "ASSAULT"; + else if ( classType == "specops" ) + SSALC = "SPECOPS"; + else if ( classType == "demolitions" ) + SSALC = "DEMOLITIONS"; + else if ( classType == "sniper" ) + SSALC = "SNIPER"; + + CLASS_PRIMARY = SSALC + "_PRIMARY"; + CLASS_PRIMARY_ATTACHMENT = SSALC + "_PRIMARY_ATTACHMENT"; + CLASS_SECONDARY = SSALC + "_SECONDARY"; + CLASS_SECONDARY_ATTACHMENT = SSALC + "_SECONDARY_ATTACHMENT"; + CLASS_GRENADE = SSALC + "_GRENADE"; + CLASS_CAMO = SSALC + "_CAMO"; + + if ( !isDefined( self.pers[classType] ) || !isDefined( self.pers[classType]["loadout_primary"] ) ) + { + if ( validClass( classType, get_config( CLASS_PRIMARY ), "loadout_primary" ) ) + self.pers[classType]["loadout_primary"] = get_config( CLASS_PRIMARY ); + else + self.pers[classType]["loadout_primary"] = getDvar( "class_" + classType + "_primary" ); + } + + if ( !isDefined( self.pers[classType] ) || !isDefined( self.pers[classType]["loadout_primary_attachment"] ) ) + { + if ( validClass( classType, get_config( CLASS_PRIMARY_ATTACHMENT ), "loadout_primary_attachment" ) ) + self.pers[classType]["loadout_primary_attachment"] = get_config( CLASS_PRIMARY_ATTACHMENT ); + else + self.pers[classType]["loadout_primary_attachment"] = getDvar( "class_" + classType + "_primary_attachment" ); + } + + if ( !isDefined( self.pers[classType] ) || !isDefined( self.pers[classType]["loadout_secondary"] ) ) + { + if ( validClass( classType, get_config( CLASS_SECONDARY ), "loadout_secondary" ) ) + self.pers[classType]["loadout_secondary"] = get_config( CLASS_SECONDARY ); + else + self.pers[classType]["loadout_secondary"] = getDvar( "class_" + classType + "_secondary" ); + } + + if ( !isDefined( self.pers[classType] ) || !isDefined( self.pers[classType]["loadout_secondary_attachment"] ) ) + { + if ( validClass( classType, get_config( CLASS_SECONDARY_ATTACHMENT ), "loadout_secondary_attachment" ) ) + self.pers[classType]["loadout_secondary_attachment"] = get_config( CLASS_SECONDARY_ATTACHMENT ); + else + self.pers[classType]["loadout_secondary_attachment"] = getDvar( "class_" + classType + "_secondary_attachment" ); + } + + if ( !isDefined( self.pers[classType] ) || !isDefined( self.pers[classType]["loadout_grenade"] ) ) + { + if ( validClass( classType, get_config( CLASS_GRENADE ), "loadout_grenade" ) ) + self.pers[classType]["loadout_grenade"] = get_config( CLASS_GRENADE ); + else + self.pers[classType]["loadout_grenade"] = getDvar( "class_" + classType + "_grenade" ); + } + + if ( !isDefined( self.pers[classType] ) || !isDefined( self.pers[classType]["loadout_camo"] ) ) + { + if ( validClass( classType, get_config( CLASS_CAMO ), "loadout_camo" ) ) + self.pers[classType]["loadout_camo"] = get_config( CLASS_CAMO ); + else + self.pers[classType]["loadout_camo"] = getDvar( "class_" + classType + "_camo" ); + } +} + +validClass( classType, preServed, type ) +{ + if ( preServed == "" ) + return false; + + loadout_primary = ""; + loadout_primary_attachment = ""; + loadout_secondary = ""; + loadout_secondary_attachment = ""; + loadout_grenade = ""; + loadout_camo = ""; + + if ( classType == "assault" ) + loadout_primary = strTok( "m16,ak47,m4,g3,g36c,m14,mp44", "," ); + else if ( classType == "specops" ) + loadout_primary = strTok( "mp5,uzi,ak74u", "," ); + else if ( classType == "demolitions" ) + loadout_primary = strTok( "winchester1200,m1014", "," ); + else if ( classType == "sniper" ) + loadout_primary = strTok( "m40a3,remington700", "," ); + + loadout_primary_attachment = strTok( "none,silencer", "," ); + loadout_secondary = strTok( "deserteaglegold,deserteagle,colt45,usp,beretta", "," ); + loadout_secondary_attachment = strTok( "none,silencer", "," ); + loadout_grenade = strTok( "flash_grenade,smoke_grenade", "," ); + loadout_camo = strTok( "camo_none,camo_brockhaurd,camo_bushdweller,camo_blackwhitemarpat,camo_tigerred,camo_stagger,camo_gold", "," ); + + switch ( type ) + { + case "loadout_primary": + for ( i = 0; i < loadout_primary.size; i++ ) + { + exp = loadout_primary[i]; + + if ( exp == preServed ) + if ( getDvarInt( "weap_allow_" + preServed ) ) + return true; + } + break; + + case "loadout_primary_attachment": + if ( classType == "assault" || classType == "specops" ) + { + for ( i = 0; i < loadout_primary_attachment.size; i++ ) + { + exp = loadout_primary_attachment[i]; + + if ( exp == preServed ) + if ( getDvarInt( "attach_allow" + "_" + classType + "_" + preServed ) ) + return true; + } + } + break; + + case "loadout_secondary": + for ( i = 0; i < loadout_secondary.size; i++ ) + { + exp = loadout_secondary[i]; + + if ( exp == preServed ) + if ( getDvarInt( "weap_allow_" + preServed ) ) + return true; + } + break; + + case "loadout_secondary_attachment": + for ( i = 0; i < loadout_secondary_attachment.size; i++ ) + { + exp = loadout_secondary_attachment[i]; + + if ( exp == preServed ) + if ( getDvarInt( "attach_allow_pistol_" + preServed ) ) + return true; + } + break; + + case "loadout_grenade": + for ( i = 0; i < loadout_grenade.size; i++ ) + { + exp = loadout_grenade[i]; + + if ( exp == preServed ) + if ( getDvarInt( "weap_allow_" + preServed ) ) + return true; + } + break; + + case "loadout_camo": + for ( i = 0; i < loadout_camo.size; i++ ) + { + exp = loadout_camo[i]; + + if ( exp == preServed ) + return true; + } + break; + + default: + return false; + } + + return false; +} + +setDvarsFromClass( classType ) +{ + self setClientDvars( + "loadout_primary", self.pers[classType]["loadout_primary"], + "loadout_primary_attachment", self.pers[classType]["loadout_primary_attachment"], + "loadout_secondary", self.pers[classType]["loadout_secondary"], + "loadout_secondary_attachment", self.pers[classType]["loadout_secondary_attachment"], + "loadout_grenade", self.pers[classType]["loadout_grenade"], + "loadout_camo", self.pers[classType]["loadout_camo"] ); +} + +processLoadoutResponse( respString ) +{ + if ( !isDefined( self.pers["class"] ) ) + return; + + commandTokens = strTok( respString, "," ); + + for ( i = 0; i < commandTokens.size; i++ ) + { + subTokens = strTok( commandTokens[i], ":" ); + if( subTokens.size < 2 ) + return; + + switch ( subTokens[0] ) + { + case "loadout_primary": + case "loadout_secondary": + if ( getDvarInt( "weap_allow_" + subTokens[1] ) && self verifyWeaponChoice( subTokens[1], self.class ) ) + { + self.pers[self.class][subTokens[0]] = subTokens[1]; + self setClientDvar( subTokens[0], subTokens[1] ); + if ( subTokens[1] == "mp44" ) + { + self.pers[self.class]["loadout_primary_attachment"] = "none"; + self setClientDvar( "loadout_primary_attachment", "none" ); + } + else if ( subTokens[1] == "deserteagle" || subTokens[1] == "deserteaglegold" ) + { + self.pers[self.class]["loadout_secondary_attachment"] = "none"; + self setClientDvar( "loadout_secondary_attachment", "none" ); + } + } + else + self setClientDvar( subTokens[0], self.pers[self.class][subTokens[0]] ); + break; + + case "loadout_primary_attachment": + case "loadout_secondary_attachment": + if ( ( subTokens[1] == "assault" || subTokens[1] == "specops" || subTokens[1] == "pistol" ) && ( subTokens[2] == "none" || subTokens[2] == "silencer" ) ) + { + if ( subTokens[0] == "loadout_primary_attachment" && self.pers[self.class]["loadout_primary"] == "mp44" ) + { + self.pers[self.class]["loadout_primary_attachment"] = "none"; + self setClientDvar( "loadout_primary_attachment", "none" ); + } + else if ( getDvarInt( "attach_allow_" + subTokens[1] + "_" + subTokens[2] ) ) + { + self.pers[self.class][subTokens[0]] = subTokens[2]; + self setClientDvar( subTokens[0], subTokens[2] ); + } + else + self setClientDvar( subTokens[0], self.pers[self.class][subTokens[0]] ); + break; + } + else + return; + + case "loadout_grenade": + switch ( subTokens[1] ) + { + case "flash_grenade": + case "smoke_grenade": + if ( getDvarInt( "weap_allow_" + subTokens[1] ) ) + { + self.pers[self.class][subTokens[0]] = subTokens[1]; + self setClientDvar( subTokens[0], subTokens[1] ); + } + else + self setClientDvar( subTokens[0], self.pers[self.class][subTokens[0]] ); + break; + default: + return; + } + + case "loadout_camo": + switch ( subTokens[1] ) + { + case "camo_none": + case "camo_brockhaurd": + case "camo_bushdweller": + case "camo_blackwhitemarpat": + case "camo_tigerred": + case "camo_stagger": + case "camo_gold": + self.pers[self.class][subTokens[0]] = subTokens[1]; + break; + default: + return; + } + } + } +} + +verifyWeaponChoice( weaponName, classType ) +{ + if ( tableLookup( "mp/statsTable.csv", 4, weaponName, 2 ) == "weapon_pistol" ) + return true; + + switch ( classType ) + { + case "assault": + case "sniper": + if ( tableLookup( "mp/statsTable.csv", 4, weaponName, 2 ) == "weapon_"+classType ) + return true; + break; + case "specops": + if ( tableLookup( "mp/statsTable.csv", 4, weaponName, 2 ) == "weapon_smg" ) + return true; + break; + case "demolitions": + if ( tableLookup( "mp/statsTable.csv", 4, weaponName, 2 ) == "weapon_shotgun" ) + return true; + break; + } + + return false; +} + +verifyClassChoice( teamName, classType ) +{ + if ( teamName == "allies" || teamName == "axis" ) + { + if ( isDefined( self.pers["class"] ) && self.pers["class"] == classType ) + return true; + + game[teamName + "_" + classType + "_count"] = 0; + for ( i = 0; i < level.players.size; i++ ) + if ( level.players[i].team == teamName && isDefined( level.players[i].class ) && level.players[i].class == classType ) + game[teamName + "_" + classType + "_count"]++; + + return ( game[teamName + "_" + classType + "_count"] < getDvarInt( "class_" + classType + "_limit" ) ); + } + + return false; +} + +updateClassAvailability( teamName ) +{ + game[teamName + "_assault_count"] = 0; + game[teamName + "_specops_count"] = 0; + game[teamName + "_demolitions_count"] = 0; + game[teamName + "_sniper_count"] = 0; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( player.team == teamName && isDefined( player.class ) && player.class == "assault" ) + game[teamName + "_assault_count"]++; + + if ( player.team == teamName && isDefined( player.class ) && player.class == "specops" ) + game[teamName + "_specops_count"]++; + + if ( player.team == teamName && isDefined( player.class ) && player.class == "demolitions" ) + game[teamName + "_demolitions_count"]++; + + if ( player.team == teamName && isDefined( player.class ) && player.class == "sniper" ) + game[teamName + "_sniper_count"]++; + } + + setDvarWrapper( teamName + "_allow_assault", game[teamName + "_assault_count"] < getDvarInt( "class_assault_limit" ) ); + setDvarWrapper( teamName + "_allow_specops", game[teamName + "_specops_count"] < getDvarInt( "class_specops_limit" ) ); + setDvarWrapper( teamName + "_allow_demolitions", game[teamName + "_demolitions_count"] < getDvarInt( "class_demolitions_limit" ) ); + setDvarWrapper( teamName + "_allow_sniper", game[teamName + "_sniper_count"] < getDvarInt( "class_sniper_limit" ) ); +} + +menuAcceptClass( response ) +{ + if ( !isDefined( self.pers["class"] ) ) + return; + + if ( !isDefined( response ) || response != "back" ) + self maps\mp\gametypes\_globallogic::closeMenus(); + + if ( !isDefined( self.pers["team"] ) || ( self.pers["team"] != "allies" && self.pers["team"] != "axis" ) ) + return; + + if ( self.sessionstate == "playing" ) + { + if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" || isDefined( level.rdyup ) && level.rdyup || isDefined( level.strat_over ) && !level.strat_over ) + self maps\mp\gametypes\_class::giveLoadout( self.pers["team"], self.pers["class"] ); + else + { + self iprintlnbold( game["strings"]["change_class"] ); + self setClientDvar( "loadout_curclass", self.pers["class"] ); + } + + if ( isDefined( response ) ) + self thread maps\mp\gametypes\_class::preserveClass( self.pers["class"] ); + } + else + { + self setClientDvar( "loadout_curclass", self.pers["class"] ); + + if ( isDefined( response) && response == "go" ) + self thread maps\mp\gametypes\_class::preserveClass( self.pers["class"] ); + + if ( isDefined( game["state"] ) && game["state"] == "postgame" ) + return; + + if ( isDefined( game["state"] ) && game["state"] == "playing" ) + self thread [[level.spawnClient]](); + } + + self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); +} + +updateServerDvars() +{ + self endon ( "disconnect" ); + + dvarKeys = getArrayKeys( level.serverDvars ); + for ( i = 0; i < dvarKeys.size; i++ ) + { + self setClientDvar( dvarKeys[i], level.serverDvars[dvarKeys[i]] ); + wait 0.05; + } +} + +get_config( dataName ) +{ + dataValue = self getStat( int( tableLookup( "promod/customStatsTable.csv", 1, dataName, 0 ) ) ); + dataString = tablelookup( "promod/customStatsTable.csv", 0, dataValue, 1 ); + + return dataString; +} \ No newline at end of file diff --git a/maps/mp/gametypes/_quickmessages.gsc b/maps/mp/gametypes/_quickmessages.gsc new file mode 100644 index 0000000..603b4ec --- /dev/null +++ b/maps/mp/gametypes/_quickmessages.gsc @@ -0,0 +1,269 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + level.saytext[0] = &"QUICKMESSAGE_FOLLOW_ME"; + level.saytext[1] = &"QUICKMESSAGE_MOVE_IN"; + level.saytext[2] = &"QUICKMESSAGE_FALL_BACK"; + level.saytext[3] = &"QUICKMESSAGE_SUPPRESSING_FIRE"; + level.saytext[4] = &"QUICKMESSAGE_ATTACK_LEFT_FLANK"; + level.saytext[5] = &"QUICKMESSAGE_ATTACK_RIGHT_FLANK"; + level.saytext[6] = &"QUICKMESSAGE_HOLD_THIS_POSITION"; + level.saytext[7] = &"QUICKMESSAGE_REGROUP"; + level.saytext[8] = &"QUICKMESSAGE_ENEMY_SPOTTED"; + level.saytext[9] = &"QUICKMESSAGE_ENEMIES_SPOTTED"; + level.saytext[10] = &"QUICKMESSAGE_IM_IN_POSITION"; + level.saytext[11] = &"QUICKMESSAGE_AREA_SECURE"; + level.saytext[12] = &"QUICKMESSAGE_WATCH_SIX"; + level.saytext[13] = &"QUICKMESSAGE_SNIPER"; + level.saytext[14] = &"QUICKMESSAGE_NEED_REINFORCEMENTS"; + level.saytext[15] = &"QUICKMESSAGE_YES_SIR"; + level.saytext[16] = &"QUICKMESSAGE_NO_SIR"; + level.saytext[17] = &"QUICKMESSAGE_IM_ON_MY_WAY"; + level.saytext[18] = &"QUICKMESSAGE_SORRY"; + level.saytext[19] = &"QUICKMESSAGE_GREAT_SHOT"; + level.saytext[20] = &"QUICKMESSAGE_COME_ON"; + for(i=0;i<21;i++) precacheString(level.saytext[i]); + level.soundalias = strtok("followme|movein|fallback|suppressfire|attackleftflank|attackrightflank|holdposition|regroup|enemyspotted|enemiesspotted|iminposition|areasecure|watchsix|sniper|needreinforcements|yessir|nosir|onmyway|sorry|greatshot|comeon", "|"); +} + +getSoundPrefixForTeam() +{ + a = ""; + if ( self.pers["team"] == "allies" ) + { + if ( game["allies"] == "sas" ) + a = "UK"; + else + a = "US"; + } + else + { + if ( game["axis"] == "russian" ) + a = "RU"; + else + a = "AB"; + } + return a+"_"; +} + +doQuickMessage( t, i ) +{ + if( self.sessionstate == "playing" && isdefined(self.pers["team"]) && self.pers["team"] != "spectator" && !isdefined(self.spamdelay) ) + { + maxsize = 7; + offset = 8; + type = "stm"; + + if(t == "quickcommands") + { + maxsize = 8; + offset = 0; + type = "cmd"; + } + else if(t == "quickresponses") + { + maxsize = 6; + offset = 15; + type = "rsp"; + } + if( i >= 0 && i < maxsize ) + { + self.spamdelay = true; + + self playSound( self getSoundPrefixForTeam()+"mp_"+type+"_"+level.soundalias[offset+i] ); + saytext = level.saytext[offset+i]; + if(isdefined(level.QuickMessageToAll) && level.QuickMessageToAll) + self sayAll( saytext ); + else + { + self sayTeam( saytext ); + self pingPlayer(); + } + wait 3; + self.spamdelay = undefined; + } + } +} + +quickpromod(response) +{ + self endon ( "disconnect" ); + + switch(response) + { + case "1": + if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" ) + return; + + self thread promod\timeout::timeoutCall(); + break; + + case "2": + if ( self.sessionstate == "playing" && (!isDefined( self.isPlanting ) || !self.isPlanting) && !level.gameEnded && isDefined( self.carryObject ) ) + self.carryObject thread maps\mp\gametypes\_gameobjects::setDropped(); + break; + + case "3": + self suicide(); + break; + + case "4": + a = "en"; + if ( self promod\client::toggle("PROMOD_RECORD") ) + a = "dis"; + self iprintln("Record reminder has been "+a+"abled"); + break; + + case "5": + self maps\mp\gametypes\_weapons::printStats(); + break; + + case "silencer": + if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" || !isDefined( self.pers["class"] ) || !getDvarInt( "attach_allow_" + self.pers["class"] + "_silencer" ) || self.pers[self.pers["class"]]["loadout_primary"] == "mp44" || self.pers["class"] == "sniper" || self.pers["class"] == "demolitions" ) + return; + + attach = "none"; + if(self.pers[self.pers["class"]]["loadout_primary_attachment"] == "none") + { + attach = "silencer"; + self iprintln("Silencer attached"); + } + else + self iprintln("Silencer detached"); + + self.pers[self.pers["class"]]["loadout_primary_attachment"] = attach; + + self maps\mp\gametypes\_promod::menuAcceptClass( "go" ); + break; + + case "grenade": + if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" || !isDefined( self.pers["class"] ) ) + return; + + classType = self.pers["class"]; + + if ( self.pers[classType]["loadout_grenade"] == "smoke_grenade" && getDvarInt( "weap_allow_flash_grenade" ) ) + { + self.pers[classType]["loadout_grenade"] = "flash_grenade"; + self iprintln("Flash selected"); + } + else if ( self.pers[classType]["loadout_grenade"] == "flash_grenade" && getDvarInt( "weap_allow_smoke_grenade" ) ) + { + self.pers[classType]["loadout_grenade"] = "smoke_grenade"; + self iprintln("Smoke selected"); + } + else + return; + + self maps\mp\gametypes\_promod::menuAcceptClass( "go" ); + break; + + case "assault": + case "specops": + case "demolitions": + case "sniper": + if ( ( self.pers["team"] != "axis" && self.pers["team"] != "allies" ) ) + return; + + if ( !self maps\mp\gametypes\_promod::verifyClassChoice( self.pers["team"], response ) ) + { + self iprintln(chooseClassName(response)+" is unavailable"); + return; + } + + if ( !isDefined( self.pers["class"] ) || self.pers["class"] != response ) + self iprintln(chooseClassName(response)+" selected"); + + self maps\mp\gametypes\_promod::setClassChoice( response ); + self maps\mp\gametypes\_promod::menuAcceptClass(); + break; + + case "X": + if ( self.pers["team"] == "axis" || self.pers["team"] == "allies" ) + self openMenu( game["menu_changeclass_" + self.pers["team"] ] ); + break; + + case "shoutcaster": + if ( self.pers["team"] == "spectator" ) + self openMenu( game["menu_shoutcast"] ); + break; + + case "overview": + if ( self.pers["team"] == "spectator" ) + self openmenu( game["menu_shoutcast_map"] ); + break; + + case "controls": + self openMenu("quickpromod"); + break; + + case "graphics": + self openMenu("quickpromodgfx"); + break; + + case "killspec": + self [[level.killspec]](); + break; + } +} + +quickpromodgfx(response) +{ + self endon ( "disconnect" ); + + switch(response) + { + case "1": + self promod\client::setsunlight(self promod\client::loopthrough("PROMOD_SUNLIGHT", 2)); + break; + + case "2": + self setclientdvar("r_filmusetweaks", self promod\client::toggle("PROMOD_FILMTWEAK")); + break; + + case "3": + self setclientdvar("r_texfilterdisable", self promod\client::toggle("PROMOD_TEXTURE")); + break; + + case "4": + self setclientdvar("r_normalmap", self promod\client::toggle("PROMOD_NORMALMAP")); + break; + + case "5": + self setclientdvar("cg_fovscale", 1 + int(!self promod\client::toggle("PROMOD_FOVSCALE")) * 0.125); + break; + + case "6": + self setclientdvar("r_blur", 0.2 * self promod\client::loopthrough("PROMOD_GFXBLUR", 5)); + break; + } +} + +chooseClassName( classname ) +{ + if ( !isDefined( classname ) ) + return ""; + + switch( classname ) + { + case "assault": + return "Assault"; + case "specops": + return "Spec Ops"; + case "demolitions": + return "Demolitions"; + case "sniper": + return "Sniper"; + default: + return ""; + } +} \ No newline at end of file diff --git a/maps/mp/gametypes/_rank.gsc b/maps/mp/gametypes/_rank.gsc new file mode 100644 index 0000000..aac440d --- /dev/null +++ b/maps/mp/gametypes/_rank.gsc @@ -0,0 +1,167 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + level.scoreInfo = []; + level.rankTable = []; + + registerScoreInfo( "kill", 5 ); + registerScoreInfo( "headshot", 5 ); + registerScoreInfo( "assist", 3 ); + registerScoreInfo( "suicide", 0 ); + registerScoreInfo( "teamkill", 0 ); + registerScoreInfo( "win", 2 ); + registerScoreInfo( "loss", 1 ); + registerScoreInfo( "tie", 1.5 ); + registerScoreInfo( "plant", 3 ); + registerScoreInfo( "defuse", 3 ); + registerScoreInfo( "capture", 3 ); + registerScoreInfo( "assault", 3 ); + registerScoreInfo( "assault_assist", 1 ); + registerScoreInfo( "defend", 3 ); + registerScoreInfo( "defend_assist", 1 ); + + level thread onPlayerConnect(); +} + +registerScoreInfo( type, value ) +{ + level.scoreInfo[type]["value"] = value; +} + +getScoreInfoValue( type ) +{ + return ( level.scoreInfo[type]["value"] ); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill( "connected", player ); + player.rankUpdateTotal = 0; + + player thread onPlayerSpawned(); + player thread onJoinedTeam(); + player thread onJoinedSpectators(); + } +} + +onJoinedTeam() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("joined_team"); + self thread removeRankHUD(); + } +} + +onJoinedSpectators() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("joined_spectators"); + self thread removeRankHUD(); + } +} + +onPlayerSpawned() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("spawned_player"); + + if(!isdefined(self.hud_rankscroreupdate)) + { + self.hud_rankscroreupdate = newClientHudElem(self); + self.hud_rankscroreupdate.horzAlign = "center"; + self.hud_rankscroreupdate.vertAlign = "middle"; + self.hud_rankscroreupdate.alignX = "center"; + self.hud_rankscroreupdate.alignY = "middle"; + self.hud_rankscroreupdate.x = 0; + self.hud_rankscroreupdate.y = -60; + self.hud_rankscroreupdate.font = "default"; + self.hud_rankscroreupdate.fontscale = 2; + self.hud_rankscroreupdate.archived = false; + self.hud_rankscroreupdate.color = (0.5,0.5,0.5); + self.hud_rankscroreupdate maps\mp\gametypes\_hud::fontPulseInit(); + } + } +} + +giveRankXP( type, value ) +{ + self endon("disconnect"); + + if ( !isDefined( value ) ) + value = getScoreInfoValue( type ); + + if ( getDvarInt( "scr_enable_scoretext" ) ) + { + if ( type == "teamkill" ) + self thread updateRankScoreHUD( 0 - getScoreInfoValue( "kill" ) ); + else + self thread updateRankScoreHUD( value ); + } +} + +updateRankScoreHUD( amount ) +{ + self endon( "disconnect" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + + if ( !amount ) + return; + + self notify( "update_score" ); + self endon( "update_score" ); + + self.rankUpdateTotal += amount; + + wait 0.05; + + if( isDefined( self.hud_rankscroreupdate ) ) + { + if ( self.rankUpdateTotal < 0 ) + { + self.hud_rankscroreupdate.label = &""; + self.hud_rankscroreupdate.color = (1,0,0); + } + else + { + self.hud_rankscroreupdate.label = &"MP_PLUS"; + self.hud_rankscroreupdate.color = (1,1,0.5); + } + + self.hud_rankscroreupdate setValue(self.rankUpdateTotal); + self.hud_rankscroreupdate.alpha = 0.85; + self.hud_rankscroreupdate thread maps\mp\gametypes\_hud::fontPulse( self ); + + wait 1; + self.hud_rankscroreupdate fadeOverTime( 0.75 ); + self.hud_rankscroreupdate.alpha = 0; + + self.rankUpdateTotal = 0; + } +} + +removeRankHUD() +{ + if(isDefined(self.hud_rankscroreupdate)) + self.hud_rankscroreupdate.alpha = 0; +} \ No newline at end of file diff --git a/maps/mp/gametypes/_scoreboard.gsc b/maps/mp/gametypes/_scoreboard.gsc new file mode 100644 index 0000000..dbf961f --- /dev/null +++ b/maps/mp/gametypes/_scoreboard.gsc @@ -0,0 +1,62 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + switch(game["allies"]) + { + case "sas": + precacheShader("faction_128_sas"); + setdvar("g_TeamIcon_Allies", "faction_128_sas"); + setdvar("g_TeamColor_Allies", "0.5 0.5 0.5"); + setdvar("g_ScoresColor_Allies", "0 0 0"); + break; + + default: + precacheShader("faction_128_usmc"); + setdvar("g_TeamIcon_Allies", "faction_128_usmc"); + setdvar("g_TeamColor_Allies", "0.6 0.64 0.69"); + setdvar("g_ScoresColor_Allies", "0.6 0.64 0.69"); + break; + } + + switch(game["axis"]) + { + case "russian": + precacheShader("faction_128_ussr"); + setdvar("g_TeamIcon_Axis", "faction_128_ussr"); + setdvar("g_TeamColor_Axis", "0.52 0.28 0.28"); + setdvar("g_ScoresColor_Axis", "0.52 0.28 0.28"); + break; + + default: + precacheShader("faction_128_arab"); + setdvar("g_TeamIcon_Axis", "faction_128_arab"); + setdvar("g_TeamColor_Axis", "0.65 0.57 0.41"); + setdvar("g_ScoresColor_Axis", "0.65 0.57 0.41"); + break; + } + + if ( game["attackers"] == "allies" && game["defenders"] == "axis" ) + { + setdvar("g_TeamName_Allies", "Attack"); + setdvar("g_TeamName_Axis", "Defence"); + } + else + { + setdvar("g_TeamName_Allies", "Defence"); + setdvar("g_TeamName_Axis", "Attack"); + } + + setdvar("g_ScoresColor_Spectator", "0.25 0.25 0.25"); + setdvar("g_ScoresColor_Free", "0.76 0.78 0.1"); + setdvar("g_teamColor_MyTeam", "0.6 0.8 0.6" ); + setdvar("g_teamColor_EnemyTeam", "1 0.45 0.5" ); +} \ No newline at end of file diff --git a/maps/mp/gametypes/_spawnlogic.gsc b/maps/mp/gametypes/_spawnlogic.gsc new file mode 100644 index 0000000..98ae1e0 --- /dev/null +++ b/maps/mp/gametypes/_spawnlogic.gsc @@ -0,0 +1,701 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\_utility; + +onPlayerConnect() +{ + for(;;) + level waittill("connected", player); +} + +findBoxCenter( mins, maxs ) +{ + center = ( 0, 0, 0 ); + center = maxs - mins; + center = ( center[0]/2, center[1]/2, center[2]/2 ) + mins; + return center; +} + +expandMins( mins, point ) +{ + if ( mins[0] > point[0] ) + mins = ( point[0], mins[1], mins[2] ); + if ( mins[1] > point[1] ) + mins = ( mins[0], point[1], mins[2] ); + if ( mins[2] > point[2] ) + mins = ( mins[0], mins[1], point[2] ); + return mins; +} + +expandMaxs( maxs, point ) +{ + if ( maxs[0] < point[0] ) + maxs = ( point[0], maxs[1], maxs[2] ); + if ( maxs[1] < point[1] ) + maxs = ( maxs[0], point[1], maxs[2] ); + if ( maxs[2] < point[2] ) + maxs = ( maxs[0], maxs[1], point[2] ); + return maxs; +} + +addSpawnPoints( team, spawnPointName ) +{ + oldSpawnPoints = []; + if ( level.teamSpawnPoints[team].size ) + oldSpawnPoints = level.teamSpawnPoints[team]; + + level.teamSpawnPoints[team] = getEntArray( spawnPointName, "classname" ); + + if ( !level.teamSpawnPoints[team].size ) + { + if ( isDefined( level.restarting ) ) + { + setdvar("g_gametype", "dm"); + setDvar( "o_gametype", "dm" ); + } + else + maps\mp\gametypes\_callbacksetup::AbortLevel(); + + wait 1; + return; + } + + if ( !isDefined( level.spawnpoints ) ) + level.spawnpoints = []; + + for ( i = 0; i < level.teamSpawnPoints[team].size; i++ ) + { + spawnpoint = level.teamSpawnPoints[team][i]; + + if ( !isdefined( spawnpoint.inited ) ) + { + spawnpoint spawnPointInit(); + level.spawnpoints[ level.spawnpoints.size ] = spawnpoint; + } + } + + for ( i = 0; i < oldSpawnPoints.size; i++ ) + { + origin = oldSpawnPoints[i].origin; + + level.spawnMins = expandMins( level.spawnMins, origin ); + level.spawnMaxs = expandMaxs( level.spawnMaxs, origin ); + + level.teamSpawnPoints[team][ level.teamSpawnPoints[team].size ] = oldSpawnPoints[i]; + } +} + +placeSpawnPoints( spawnPointName ) +{ + spawnPoints = getEntArray( spawnPointName, "classname" ); + + if ( !spawnPoints.size ) + { + if ( isDefined( level.restarting ) ) + { + setdvar("g_gametype", "dm"); + setDvar( "o_gametype", "dm" ); + } + else + maps\mp\gametypes\_callbacksetup::AbortLevel(); + + wait 1; + return; + } + + for( i = 0; i < spawnPoints.size; i++ ) + spawnPoints[i] spawnPointInit(); +} + +spawnPointInit() +{ + spawnpoint = self; + origin = spawnpoint.origin; + + level.spawnMins = expandMins( level.spawnMins, origin ); + level.spawnMaxs = expandMaxs( level.spawnMaxs, origin ); + + spawnpoint placeSpawnpoint(); + spawnpoint.forward = anglesToForward( spawnpoint.angles ); + spawnpoint.sightTracePoint = spawnpoint.origin + (0,0,50); + + spawnpoint.inited = true; +} + +getTeamSpawnPoints( team ) +{ + return level.teamSpawnPoints[team]; +} + +getSpawnpoint_Final( spawnpoints, useweights ) +{ + prof_begin( "spawn_final" ); + + bestspawnpoint = undefined; + + if ( !isdefined( spawnpoints ) || !spawnpoints.size ) + return undefined; + + if ( !isdefined( useweights ) ) + useweights = true; + + if ( useweights ) + bestspawnpoint = getBestWeightedSpawnpoint( spawnpoints ); + else + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if( ( isdefined( self.lastspawnpoint ) && self.lastspawnpoint == spawnpoints[i] ) || positionWouldTelefrag( spawnpoints[i].origin ) ) + continue; + + bestspawnpoint = spawnpoints[i]; + break; + } + if ( !isdefined( bestspawnpoint ) && isdefined( self.lastspawnpoint ) && !positionWouldTelefrag( self.lastspawnpoint.origin ) ) + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( spawnpoints[i] == self.lastspawnpoint ) + { + bestspawnpoint = spawnpoints[i]; + break; + } + } + } + } + + if ( !isdefined( bestspawnpoint ) ) + { + if ( useweights ) + bestspawnpoint = spawnpoints[randomint(spawnpoints.size)]; + else + bestspawnpoint = spawnpoints[0]; + } + + time = getTime(); + + self.lastspawnpoint = bestspawnpoint; + self.lastspawntime = time; + bestspawnpoint.lastspawnedplayer = self; + bestspawnpoint.lastspawntime = time; + + prof_end( "spawn_final" ); + + return bestspawnpoint; +} + +getBestWeightedSpawnpoint( spawnpoints ) +{ + maxSightTracedSpawnpoints = 3; + for ( try = 0; try <= maxSightTracedSpawnpoints; try++ ) + { + bestspawnpoints = []; + bestweight = undefined; + bestspawnpoint = undefined; + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( !isdefined( bestweight ) || spawnpoints[i].weight > bestweight ) + { + if ( positionWouldTelefrag( spawnpoints[i].origin ) ) + continue; + + bestspawnpoints = []; + bestspawnpoints[0] = spawnpoints[i]; + bestweight = spawnpoints[i].weight; + } + else if ( spawnpoints[i].weight == bestweight ) + { + if ( positionWouldTelefrag( spawnpoints[i].origin ) ) + continue; + + bestspawnpoints[bestspawnpoints.size] = spawnpoints[i]; + } + } + if ( !bestspawnpoints.size ) + return undefined; + + bestspawnpoint = bestspawnpoints[randomint( bestspawnpoints.size )]; + + if ( try == maxSightTracedSpawnpoints || ( isdefined( bestspawnpoint.lastSightTraceTime ) && bestspawnpoint.lastSightTraceTime == gettime() ) || !lastMinuteSightTraces( bestspawnpoint ) ) + return bestspawnpoint; + + penalty = getLosPenalty(); + + bestspawnpoint.weight -= penalty; + + bestspawnpoint.lastSightTraceTime = gettime(); + } +} + +getSpawnpoint_Random(spawnpoints) +{ + if(!isdefined(spawnpoints)) + return undefined; + + for(i = 0; i < spawnpoints.size; i++) + { + j = randomInt(spawnpoints.size); + spawnpoint = spawnpoints[i]; + spawnpoints[i] = spawnpoints[j]; + spawnpoints[j] = spawnpoint; + } + + return getSpawnpoint_Final(spawnpoints, false); +} + +getAllOtherPlayers() +{ + aliveplayers = []; + + for(i = 0; i < level.players.size; i++) + { + if ( !isdefined( level.players[i] ) || ( level.players[i].sessionstate != "playing" || level.players[i] == self ) ) + continue; + + aliveplayers[aliveplayers.size] = level.players[i]; + } + return aliveplayers; +} + +getAllAlliedAndEnemyPlayers( obj ) +{ + if ( level.teambased ) + { + if ( self.pers["team"] == "allies" ) + { + obj.allies = level.alivePlayers["allies"]; + obj.enemies = level.alivePlayers["axis"]; + } + else + { + obj.allies = level.alivePlayers["axis"]; + obj.enemies = level.alivePlayers["allies"]; + } + } + else + { + obj.allies = []; + obj.enemies = level.activePlayers; + } +} + +initWeights(spawnpoints) +{ + for (i = 0; i < spawnpoints.size; i++) + spawnpoints[i].weight = 0; +} + +getSpawnpoint_NearTeam( spawnpoints, favoredspawnpoints ) +{ + if(!isdefined(spawnpoints)) + return undefined; + + prof_begin("basic_spawnlogic"); + + initWeights(spawnpoints); + + prof_begin("getteams"); + obj = spawnstruct(); + getAllAlliedAndEnemyPlayers(obj); + prof_end("getteams"); + + numplayers = obj.allies.size + obj.enemies.size; + + alliedDistanceWeight = 2; + + prof_begin("sumdists"); + myTeam = self.pers["team"]; + enemyTeam = getOtherTeam( myTeam ); + for (i = 0; i < spawnpoints.size; i++) + { + spawnpoint = spawnpoints[i]; + + if ( isDefined( spawnpoint.numPlayersAtLastUpdate ) && spawnpoint.numPlayersAtLastUpdate > 0 ) + { + allyDistSum = spawnpoint.distSum[ myTeam ]; + enemyDistSum = spawnpoint.distSum[ enemyTeam ]; + + spawnpoint.weight = (enemyDistSum - alliedDistanceWeight*allyDistSum) / spawnpoint.numPlayersAtLastUpdate; + } + else + spawnpoint.weight = 0; + } + prof_end("sumdists"); + + if (isdefined(favoredspawnpoints)) + for (i = 0; i < favoredspawnpoints.size; i++) + favoredspawnpoints[i].weight += 25000; + + prof_end("basic_spawnlogic"); + + prof_begin("complex_spawnlogic"); + + avoidSameSpawn(spawnpoints); + avoidSpawnReuse(spawnpoints, true); + avoidWeaponDamage(spawnpoints); + avoidVisibleEnemies(spawnpoints, true); + + prof_end("complex_spawnlogic"); + + result = getSpawnpoint_Final(spawnpoints); + + return result; +} + +getSpawnpoint_DM(spawnpoints) +{ + if(!isdefined(spawnpoints)) + return undefined; + + initWeights(spawnpoints); + + aliveplayers = getAllOtherPlayers(); + + idealDist = 1600; + badDist = 1200; + + if (aliveplayers.size > 0) + { + for (i = 0; i < spawnpoints.size; i++) + { + totalDistFromIdeal = 0; + nearbyBadAmount = 0; + for (j = 0; j < aliveplayers.size; j++) + { + dist = distance(spawnpoints[i].origin, aliveplayers[j].origin); + + if (dist < badDist) + nearbyBadAmount += (badDist - dist) / badDist; + + distfromideal = abs(dist - idealDist); + totalDistFromIdeal += distfromideal; + } + avgDistFromIdeal = totalDistFromIdeal / aliveplayers.size; + + wellDistancedAmount = (idealDist - avgDistFromIdeal) / idealDist; + + spawnpoints[i].weight = wellDistancedAmount - nearbyBadAmount * 2 + randomfloat(0.2); + } + } + + avoidSameSpawn(spawnpoints); + avoidSpawnReuse(spawnpoints, false); + avoidWeaponDamage(spawnpoints); + avoidVisibleEnemies(spawnpoints, false); + + return getSpawnpoint_Final(spawnpoints); +} + +init() +{ + level.spawnlogic_deaths = []; + + level.players = []; + level.grenades = []; + level.pipebombs = []; + + level thread onPlayerConnect(); + level thread trackGrenades(); +} + +updateDeathInfo() +{ + prof_begin("updateDeathInfo"); + + time = getTime(); + for (i = 0; i < level.spawnlogic_deaths.size; i++) + { + deathInfo = level.spawnlogic_deaths[i]; + + if (time - deathInfo.time > 90000 || + !isdefined(deathInfo.killer) || + !isalive(deathInfo.killer) || + (deathInfo.killer.pers["team"] != "axis" && deathInfo.killer.pers["team"] != "allies") || + distance(deathInfo.killer.origin, deathInfo.killOrg) > 400) { + level.spawnlogic_deaths[i].remove = true; + } + } + + oldarray = level.spawnlogic_deaths; + level.spawnlogic_deaths = []; + + start = 0; + if (oldarray.size - 1024 > 0) start = oldarray.size - 1024; + + for (i = start; i < oldarray.size; i++) + { + if (!isdefined(oldarray[i].remove)) + level.spawnlogic_deaths[level.spawnlogic_deaths.size] = oldarray[i]; + } + + prof_end("updateDeathInfo"); +} + +trackGrenades() +{ + for(;;) + { + level.grenades = getentarray("grenade", "classname"); + wait 0.05; + } +} + +isPointVulnerable(playerorigin) +{ + pos = self.origin + level.claymoremodelcenteroffset; + playerpos = playerorigin + (0,0,32); + distsqrd = distancesquared(pos, playerpos); + + forward = anglestoforward(self.angles); + + if (distsqrd < level.claymoreDetectionRadius*level.claymoreDetectionRadius) + { + playerdir = vectornormalize(playerpos - pos); + angle = acos(vectordot(playerdir, forward)); + if (angle < level.claymoreDetectionConeAngle) + return true; + } + return false; +} + +avoidWeaponDamage(spawnpoints) +{ + prof_begin("spawn_grenade"); + + for (i = 0; i < spawnpoints.size; i++) + { + for (j = 0; j < level.grenades.size; j++) + { + if ( !isdefined( level.grenades[j] ) ) + continue; + + if (distancesquared(spawnpoints[i].origin, level.grenades[j].origin) < 62500) + spawnpoints[i].weight -= 100000; + } + } + + prof_end("spawn_grenade"); +} + +spawnPerFrameUpdate() +{ + spawnpointindex = 0; + + prevspawnpoint = undefined; + + for(;;) + { + wait 0.05; + + prof_begin("spawn_sight_checks"); + + if ( !isDefined( level.spawnPoints ) ) + return; + + spawnpointindex = (spawnpointindex + 1) % level.spawnPoints.size; + spawnpoint = level.spawnPoints[spawnpointindex]; + + if ( level.teambased ) + { + spawnpoint.sights["axis"] = 0; + spawnpoint.sights["allies"] = 0; + + spawnpoint.nearbyPlayers["axis"] = []; + spawnpoint.nearbyPlayers["allies"] = []; + } + else + { + spawnpoint.sights = 0; + + spawnpoint.nearbyPlayers["all"] = []; + } + + spawnpointdir = spawnpoint.forward; + + spawnpoint.distSum["all"] = 0; + spawnpoint.distSum["allies"] = 0; + spawnpoint.distSum["axis"] = 0; + + spawnpoint.numPlayersAtLastUpdate = 0; + + for (i = 0; i < level.players.size; i++) + { + player = level.players[i]; + + if ( player.sessionstate != "playing" ) + continue; + + diff = player.origin - spawnpoint.origin; + dist = length( diff ); + + team = "all"; + if ( level.teambased ) + team = player.pers["team"]; + + if ( dist < 1024 ) + spawnpoint.nearbyPlayers[team][spawnpoint.nearbyPlayers[team].size] = player; + + spawnpoint.distSum[ team ] += dist; + spawnpoint.numPlayersAtLastUpdate++; + + pdir = anglestoforward(player.angles); + if (vectordot(spawnpointdir, diff) < 0 && vectordot(pdir, diff) > 0) + continue; + + losExists = bullettracepassed(player.origin + (0,0,50), spawnpoint.sightTracePoint, false, undefined); + + spawnpoint.lastSightTraceTime = gettime(); + + if (losExists) + { + if ( level.teamBased ) + spawnpoint.sights[player.pers["team"]]++; + else + spawnpoint.sights++; + } + } + + prof_end("spawn_sight_checks"); + } +} + +getLosPenalty() +{ + return 100000; +} + +lastMinuteSightTraces( spawnpoint ) +{ + prof_begin("spawn_lastminutesc"); + + team = "all"; + if ( level.teambased ) + team = getOtherTeam( self.pers["team"] ); + + if ( !isdefined( spawnpoint.nearbyPlayers ) ) + return false; + + closest = undefined; + closestDistsq = undefined; + secondClosest = undefined; + secondClosestDistsq = undefined; + for ( i = 0; i < spawnpoint.nearbyPlayers[team].size; i++ ) + { + player = spawnpoint.nearbyPlayers[team][i]; + + if ( !isdefined( player ) || player.sessionstate != "playing" || player == self ) + continue; + + distsq = distanceSquared( spawnpoint.origin, player.origin ); + if ( !isdefined( closest ) || distsq < closestDistsq ) + { + secondClosest = closest; + secondClosestDistsq = closestDistsq; + + closest = player; + closestDistSq = distsq; + } + else if ( !isdefined( secondClosest ) || distsq < secondClosestDistSq ) + { + secondClosest = player; + secondClosestDistSq = distsq; + } + } + + if ( isdefined( closest ) && bullettracepassed( closest.origin + (0,0,50), spawnpoint.sightTracePoint, false, undefined) || ( isdefined( secondClosest ) && bullettracepassed( secondClosest.origin + (0,0,50), spawnpoint.sightTracePoint, false, undefined) ) ) + return true; + + return false; +} + +avoidVisibleEnemies(spawnpoints, teambased) +{ + lospenalty = getLosPenalty(); + + otherteam = "axis"; + if ( self.pers["team"] == "axis" ) + otherteam = "allies"; + + if ( teambased ) + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( !isdefined(spawnpoints[i].sights) ) + continue; + + penalty = lospenalty * spawnpoints[i].sights[otherteam]; + spawnpoints[i].weight -= penalty; + } + } + else + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( !isdefined(spawnpoints[i].sights) ) + continue; + + penalty = lospenalty * spawnpoints[i].sights; + spawnpoints[i].weight -= penalty; + } + } +} + +avoidSpawnReuse(spawnpoints, teambased) +{ + prof_begin("spawn_reuse"); + + time = getTime(); + + maxtime = 10000; + maxdistSq = 640000; + + for (i = 0; i < spawnpoints.size; i++) + { + if (!isdefined(spawnpoints[i].lastspawnedplayer) || !isdefined(spawnpoints[i].lastspawntime) || !isalive(spawnpoints[i].lastspawnedplayer) || spawnpoints[i].lastspawnedplayer == self || ( teambased && spawnpoints[i].lastspawnedplayer.pers["team"] == self.pers["team"] ) ) + continue; + + timepassed = time - spawnpoints[i].lastspawntime; + if (timepassed < maxtime) + { + distSq = distanceSquared(spawnpoints[i].lastspawnedplayer.origin, spawnpoints[i].origin); + if (distSq < maxdistSq) + { + worsen = 1000 * (1 - distSq/maxdistSq) * (1 - timepassed/maxtime); + spawnpoints[i].weight -= worsen; + } + else + spawnpoints[i].lastspawnedplayer = undefined; + } + else + spawnpoints[i].lastspawnedplayer = undefined; + } + + prof_end("spawn_reuse"); +} + +avoidSameSpawn(spawnpoints) +{ + prof_begin("spawn_samespwn"); + + if (!isdefined(self.lastspawnpoint)) + return; + + for (i = 0; i < spawnpoints.size; i++) + { + if (spawnpoints[i] == self.lastspawnpoint) + { + spawnpoints[i].weight -= 50000; + break; + } + } + + prof_end("spawn_samespwn"); +} \ No newline at end of file diff --git a/maps/mp/gametypes/_spectating.gsc b/maps/mp/gametypes/_spectating.gsc new file mode 100644 index 0000000..70d1ffd --- /dev/null +++ b/maps/mp/gametypes/_spectating.gsc @@ -0,0 +1,132 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + level.spectateOverride["allies"] = spawnstruct(); + level.spectateOverride["axis"] = spawnstruct(); + + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill("connecting", player); + + player thread onJoinedTeam(); + player thread onJoinedSpectators(); + player thread onPlayerSpawned(); + } +} + +onPlayerSpawned() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("spawned_player"); + self setSpectatePermissions(); + } +} + +onJoinedTeam() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("joined_team"); + self setSpectatePermissions(); + } +} + +onJoinedSpectators() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("joined_spectators"); + self setSpectatePermissions(); + } +} + +updateSpectateSettings() +{ + level endon ( "game_ended" ); + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] setSpectatePermissions(); +} + +getOtherTeam( team ) +{ + if ( team == "axis" ) + return "allies"; + else if ( team == "allies" ) + return "axis"; + else + return "none"; +} + +setSpectatePermissions() +{ + team = self.sessionteam; + spectateType = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "spectatetype" ); + + switch( spectateType ) + { + case 0: + self allowSpectateTeam( "allies", false ); + self allowSpectateTeam( "axis", false ); + self allowSpectateTeam( "freelook", false ); + self allowSpectateTeam( "none", false ); + break; + case 1: + if ( !level.teamBased ) + { + self allowSpectateTeam( "allies", true ); + self allowSpectateTeam( "axis", true ); + self allowSpectateTeam( "none", true ); + self allowSpectateTeam( "freelook", true ); + } + else if ( isDefined( team ) && ( team == "allies" || team == "axis" ) ) + { + self allowSpectateTeam( team, true ); + self allowSpectateTeam( getOtherTeam( team ), false ); + self allowSpectateTeam( "freelook", false ); + self allowSpectateTeam( "none", false ); + } + else if ( isDefined( team ) && ( team == "spectator" ) ) + { + self allowSpectateTeam( "allies", true ); + self allowSpectateTeam( "axis", true ); + self allowSpectateTeam( "freelook", true ); + self allowSpectateTeam( "none", true ); + } + else + { + self allowSpectateTeam( "allies", false ); + self allowSpectateTeam( "axis", false ); + self allowSpectateTeam( "freelook", false ); + self allowSpectateTeam( "none", false ); + } + break; + case 2: + self allowSpectateTeam( "allies", true ); + self allowSpectateTeam( "axis", true ); + self allowSpectateTeam( "freelook", true ); + self allowSpectateTeam( "none", true ); + break; + } +} \ No newline at end of file diff --git a/maps/mp/gametypes/_teams.gsc b/maps/mp/gametypes/_teams.gsc new file mode 100644 index 0000000..00bfbd6 --- /dev/null +++ b/maps/mp/gametypes/_teams.gsc @@ -0,0 +1,190 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + setPlayerModels(); +} + +setPlayerModels() +{ + game["allies_model"] = []; + game["axis_model"] = []; + + alliesCharSet = tableLookup( "mp/mapsTable.csv", 0, getDvar( "mapname" ), 1 ); + if ( isDefined( alliesCharSet ) && alliesCharSet != "" ) + game["allies_soldiertype"] = alliesCharSet; + else if ( !isDefined( game["allies_soldiertype"] ) || !isDefined( game["allies"] ) ) + { + game["allies_soldiertype"] = "desert"; + game["allies"] = "marines"; + } + + axisCharSet = tableLookup( "mp/mapsTable.csv", 0, getDvar( "mapname" ), 2 ); + if ( isDefined( axisCharSet ) && axisCharSet != "" ) + game["axis_soldiertype"] = axisCharSet; + else if ( !isDefined( game["axis_soldiertype"] ) || !isDefined( game["axis"] ) ) + { + game["axis_soldiertype"] = "desert"; + game["axis"] = "arab"; + } + + if ( game["allies_soldiertype"] == "desert" ) + { + mptype\mptype_ally_cqb::precache(); + mptype\mptype_ally_sniper::precache(); + mptype\mptype_ally_engineer::precache(); + mptype\mptype_ally_rifleman::precache(); + mptype\mptype_ally_support::precache(); + + game["allies_model"]["SNIPER"] = mptype\mptype_ally_sniper::main; + game["allies_model"]["SUPPORT"] = mptype\mptype_ally_support::main; + game["allies_model"]["ASSAULT"] = mptype\mptype_ally_rifleman::main; + game["allies_model"]["RECON"] = mptype\mptype_ally_engineer::main; + game["allies_model"]["SPECOPS"] = mptype\mptype_ally_cqb::main; + } + else if ( game["allies_soldiertype"] == "urban" ) + { + mptype\mptype_ally_urban_sniper::precache(); + mptype\mptype_ally_urban_support::precache(); + mptype\mptype_ally_urban_assault::precache(); + mptype\mptype_ally_urban_recon::precache(); + mptype\mptype_ally_urban_specops::precache(); + + game["allies_model"]["SNIPER"] = mptype\mptype_ally_urban_sniper::main; + game["allies_model"]["SUPPORT"] = mptype\mptype_ally_urban_support::main; + game["allies_model"]["ASSAULT"] = mptype\mptype_ally_urban_assault::main; + game["allies_model"]["RECON"] = mptype\mptype_ally_urban_recon::main; + game["allies_model"]["SPECOPS"] = mptype\mptype_ally_urban_specops::main; + } + else + { + mptype\mptype_ally_woodland_assault::precache(); + mptype\mptype_ally_woodland_recon::precache(); + mptype\mptype_ally_woodland_sniper::precache(); + mptype\mptype_ally_woodland_specops::precache(); + mptype\mptype_ally_woodland_support::precache(); + + game["allies_model"]["SNIPER"] = mptype\mptype_ally_woodland_sniper::main; + game["allies_model"]["SUPPORT"] = mptype\mptype_ally_woodland_support::main; + game["allies_model"]["ASSAULT"] = mptype\mptype_ally_woodland_assault::main; + game["allies_model"]["RECON"] = mptype\mptype_ally_woodland_recon::main; + game["allies_model"]["SPECOPS"] = mptype\mptype_ally_woodland_specops::main; + } + + if ( game["axis_soldiertype"] == "desert" ) + { + mptype\mptype_axis_cqb::precache(); + mptype\mptype_axis_sniper::precache(); + mptype\mptype_axis_engineer::precache(); + mptype\mptype_axis_rifleman::precache(); + mptype\mptype_axis_support::precache(); + + game["axis_model"]["SNIPER"] = mptype\mptype_axis_sniper::main; + game["axis_model"]["SUPPORT"] = mptype\mptype_axis_support::main; + game["axis_model"]["ASSAULT"] = mptype\mptype_axis_rifleman::main; + game["axis_model"]["RECON"] = mptype\mptype_axis_engineer::main; + game["axis_model"]["SPECOPS"] = mptype\mptype_axis_cqb::main; + } + else if ( game["axis_soldiertype"] == "urban" ) + { + mptype\mptype_axis_urban_sniper::precache(); + mptype\mptype_axis_urban_support::precache(); + mptype\mptype_axis_urban_assault::precache(); + mptype\mptype_axis_urban_engineer::precache(); + mptype\mptype_axis_urban_cqb::precache(); + + game["axis_model"]["SNIPER"] = mptype\mptype_axis_urban_sniper::main; + game["axis_model"]["SUPPORT"] = mptype\mptype_axis_urban_support::main; + game["axis_model"]["ASSAULT"] = mptype\mptype_axis_urban_assault::main; + game["axis_model"]["RECON"] = mptype\mptype_axis_urban_engineer::main; + game["axis_model"]["SPECOPS"] = mptype\mptype_axis_urban_cqb::main; + } + else + { + mptype\mptype_axis_woodland_rifleman::precache(); + mptype\mptype_axis_woodland_cqb::precache(); + mptype\mptype_axis_woodland_sniper::precache(); + mptype\mptype_axis_woodland_engineer::precache(); + mptype\mptype_axis_woodland_support::precache(); + + game["axis_model"]["SNIPER"] = mptype\mptype_axis_woodland_sniper::main; + game["axis_model"]["SUPPORT"] = mptype\mptype_axis_woodland_support::main; + game["axis_model"]["ASSAULT"] = mptype\mptype_axis_woodland_rifleman::main; + game["axis_model"]["RECON"] = mptype\mptype_axis_woodland_engineer::main; + game["axis_model"]["SPECOPS"] = mptype\mptype_axis_woodland_cqb::main; + } +} + +playerModelForWeapon( weapon ) +{ + self detachAll(); + + weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 ); + + switch ( weaponClass ) + { + case "weapon_smg": + [[game[self.pers["team"]+"_model"]["SPECOPS"]]](); + break; + case "weapon_assault": + [[game[self.pers["team"]+"_model"]["ASSAULT"]]](); + break; + case "weapon_sniper": + [[game[self.pers["team"]+"_model"]["SNIPER"]]](); + break; + case "weapon_shotgun": + [[game[self.pers["team"]+"_model"]["RECON"]]](); + break; + default: + [[game[self.pers["team"]+"_model"]["ASSAULT"]]](); + break; + } +} + +CountPlayers() +{ + players = level.players; + allies = 0; + axis = 0; + for(i = 0; i < players.size; i++) + { + if ( players[i] == self ) + continue; + + if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "allies")) + allies++; + else if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "axis")) + axis++; + } + players["allies"] = allies; + players["axis"] = axis; + return players; +} + +getJoinTeamPermissions( team ) +{ + level.maxClients = getDvarInt( "sv_maxclients" ); + level.teamLimit = level.maxclients / 2; + teamcount = 0; + + for(i = 0; i < level.players.size; i++) + { + player = level.players[i]; + + if((isdefined(player.pers["team"])) && (player.pers["team"] == team)) + teamcount++; + } + + if( teamCount < level.teamLimit ) + return true; + else + return false; +} \ No newline at end of file diff --git a/maps/mp/gametypes/_weapons.gsc b/maps/mp/gametypes/_weapons.gsc new file mode 100644 index 0000000..0fdeb71 --- /dev/null +++ b/maps/mp/gametypes/_weapons.gsc @@ -0,0 +1,315 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +init() +{ + precacheItem( "ak47_mp" ); + precacheItem( "ak47_silencer_mp" ); + precacheItem( "ak74u_mp" ); + precacheItem( "ak74u_silencer_mp" ); + precacheItem( "beretta_mp" ); + precacheItem( "beretta_silencer_mp" ); + precacheItem( "colt45_mp" ); + precacheItem( "colt45_silencer_mp" ); + precacheItem( "deserteagle_mp" ); + precacheItem( "deserteaglegold_mp" ); + precacheItem( "frag_grenade_mp" ); + precacheItem( "frag_grenade_short_mp" ); + precacheItem( "g3_mp" ); + precacheItem( "g3_silencer_mp" ); + precacheItem( "g36c_mp" ); + precacheItem( "g36c_silencer_mp" ); + precacheItem( "m4_mp" ); + precacheItem( "m4_silencer_mp" ); + precacheItem( "m14_mp" ); + precacheItem( "m14_silencer_mp" ); + precacheItem( "m16_mp" ); + precacheItem( "m16_silencer_mp" ); + precacheItem( "m40a3_mp" ); + precacheItem( "m1014_mp" ); + precacheItem( "mp5_mp" ); + precacheItem( "mp5_silencer_mp" ); + precacheItem( "mp44_mp" ); + precacheItem( "remington700_mp" ); + precacheItem( "usp_mp" ); + precacheItem( "usp_silencer_mp" ); + precacheItem( "uzi_mp" ); + precacheItem( "uzi_silencer_mp" ); + precacheItem( "winchester1200_mp" ); + precacheItem( "smoke_grenade_mp" ); + precacheItem( "flash_grenade_mp" ); + precacheItem( "destructible_car" ); + precacheShellShock( "default" ); + thread maps\mp\_flashgrenades::main(); + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill("connecting", player); + player thread onPlayerSpawned(); + } +} + +onPlayerSpawned() +{ + self endon("disconnect"); + + for(;;) + { + self waittill("spawned_player"); + + self.hasDoneCombat = false; + self thread watchWeaponUsage(); + self thread watchGrenadeUsage(); + self thread watchGrenadeAmmo(); + + if(!isDefined(self.pers["shots"])) + self.pers["shots"] = 0; + self thread shotCounter(); + } +} + +watchGrenadeAmmo() +{ + self endon("death"); + self endon("disconnect"); + self endon("game_ended"); + + prim = true; + sec = true; + + while(prim || sec) + { + self waittill("grenade_fire"); + + if((isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"]) || (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat") || getDvarInt("sv_cheats")) + break; + + wait 0.25; // 5 frames, ought to be enough + + pg = ""; + if(self hasWeapon("frag_grenade_mp")) + pg = "frag_grenade_mp"; + else if(self hasWeapon("frag_grenade_short_mp")) + pg = "frag_grenade_short_mp"; + else + prim = false; + + sg = ""; + if(self hasWeapon("flash_grenade_mp")) + sg = "flash_grenade_mp"; + else if(self hasWeapon("smoke_grenade_mp")) + sg = "smoke_grenade_mp"; + else + sec = false; + + if(prim && pg != "" && self GetAmmoCount(pg) < 1) + { + self TakeWeapon(pg); + prim = false; + } + + if(sec && sg != "" && self GetAmmoCount(sg) < 1) + { + self TakeWeapon(sg); + sec = false; + } + } +} + +shotCounter() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + for(;;) + { + self waittill("weapon_fired"); + if(!isDefined( level.rdyup ) || !level.rdyup) + self.pers["shots"]++; + } +} + +printStats() +{ + if(isDefined(game["PROMOD_MATCH_MODE"]) && game["PROMOD_MATCH_MODE"] == "match" && isDefined(self.hasDoneCombat) && self.hasDoneCombat && isDefined(level.gameEnded) && !level.gameEnded && (!isDefined( game["promod_do_readyup"] ) || !game["promod_do_readyup"])) + self iprintln("Can't display stats. Wait for the round to end."); + else + { + if ( !isDefined( self.pers["damage_done"] ) ) + self.pers["damage_done"] = 0; + + if ( !isDefined( self.pers["damage_taken"] ) ) + self.pers["damage_taken"] = 0; + + if ( !isDefined( self.pers["friendly_damage_done"] ) ) + self.pers["friendly_damage_done"] = 0; + + if ( !isDefined( self.pers["friendly_damage_taken"] ) ) + self.pers["friendly_damage_taken"] = 0; + + if ( !isDefined( self.pers["shots"] ) ) + self.pers["shots"] = 0; + + if ( !isDefined( self.pers["hits"] ) ) + self.pers["hits"] = 0; + + // Log, print, reset + if(self.pers["damage_done"] > 0 || self.pers["damage_taken"] > 0 || self.pers["friendly_damage_done"] > 0 || self.pers["friendly_damage_taken"] > 0 || self.pers["shots"] > 0 || self.pers["hits"] > 0) + logPrint("P_A;" + self getGuid() + ";" + self getEntityNumber() + ";" + self.name + ";" + self.pers["shots"] + ";" + self.pers["hits"] + ";" + self.pers["damage_done"] + ";" + self.pers["damage_taken"] + ";" + self.pers["friendly_damage_done"] + ";" + self.pers["friendly_damage_taken"] + "\n"); + + self iprintln("^3" + self.name); + self iprintln("Damage Done: ^2" + self.pers["damage_done"] + "^7 Damage Taken: ^1" + self.pers["damage_taken"]); + if( level.teamBased ) + self iprintln("Friendly Damage Done: ^2" + self.pers["friendly_damage_done"] + "^7 Friendly Damage Taken: ^1" + self.pers["friendly_damage_taken"]); + acc = 0; + if(self.pers["shots"] > 0) // avoid division by 0 + acc = int(self.pers["hits"]/self.pers["shots"]*10000)/100; + self iprintln("Shots Fired: ^2" + self.pers["shots"] + "^7 Shots Hit: ^2" + self.pers["hits"] + "^7 Accuracy: ^1" + acc + " pct"); + + // Reset the stats afterwards + self.pers["damage_done"] = 0; + self.pers["damage_taken"] = 0; + self.pers["friendly_damage_done"] = 0; + self.pers["friendly_damage_taken"] = 0; + self.pers["shots"] = 0; + self.pers["hits"] = 0; + } +} + +dropWeaponForDeath( attacker ) +{ + weapon = self getCurrentWeapon(); + + if ( !isDefined( weapon ) || !self hasWeapon( weapon ) ) + return; + + switch ( weapon ) + { + case "m16_mp": + case "m16_silencer_mp": + case "ak47_mp": + case "ak47_silencer_mp": + case "m4_mp": + case "m4_silencer_mp": + case "g3_mp": + case "g3_silencer_mp": + case "g36c_mp": + case "g36c_silencer_mp": + case "m14_mp": + case "m14_silencer_mp": + case "mp44_mp": + if ( !getDvarInt( "class_assault_allowdrop" ) ) + return; + break; + case "mp5_mp": + case "mp5_silencer_mp": + case "uzi_mp": + case "uzi_silencer_mp": + case "ak74u_mp": + case "ak74u_silencer_mp": + if ( !getDvarInt( "class_specops_allowdrop" ) ) + return; + break; + case "m40a3_mp": + case "remington700_mp": + if ( !getDvarInt( "class_sniper_allowdrop" ) ) + return; + break; + case "winchester1200_mp": + case "m1014_mp": + if ( !getDvarInt( "class_demolitions_allowdrop" ) ) + return; + break; + default: + return; + } + + clipAmmo = self GetWeaponAmmoClip( weapon ); + + if ( !clipAmmo ) + return; + + stockAmmo = self GetWeaponAmmoStock( weapon ); + stockMax = WeaponMaxAmmo( weapon ); + if ( stockAmmo > stockMax ) + stockAmmo = stockMax; + + item = self dropItem( weapon ); + + item ItemWeaponSetAmmo( clipAmmo, stockAmmo ); + + if( !isDefined(game["PROMOD_MATCH_MODE"]) || game["PROMOD_MATCH_MODE"] != "match" || (game["PROMOD_MATCH_MODE"] == "match" && level.gametype != "sd") || game["promod_do_readyup"] ) + item thread deletePickupAfterAWhile(); +} + +deletePickupAfterAWhile() +{ + self endon("death"); + + wait 180; + + if ( !isDefined( self ) ) + return; + + self delete(); +} + +watchWeaponUsage() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + self waittill ( "begin_firing" ); + self.hasDoneCombat = true; +} + +watchGrenadeUsage() +{ + self endon( "death" ); + self endon( "disconnect" ); + + self.throwingGrenade = false; + + for(;;) + { + self waittill ( "grenade_pullback", weaponName ); + + self.hasDoneCombat = true; + self.throwingGrenade = true; + self beginGrenadeTracking(); + } +} + +beginGrenadeTracking() +{ + self endon ( "death" ); + self endon ( "disconnect" ); + + self waittill ( "grenade_fire", grenade, weaponName ); + + if ( weaponName == "frag_grenade_mp" || weaponName == "frag_grenade_short_mp" ) + grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake(); + + self.throwingGrenade = false; +} + +onWeaponDamage( eInflictor, sWeapon, meansOfDeath, damage ) +{ + self endon ( "death" ); + self endon ( "disconnect" ); + + maps\mp\gametypes\_shellshock::shellshockOnDamage( meansOfDeath, damage ); +} \ No newline at end of file diff --git a/maps/mp/gametypes/dm.gsc b/maps/mp/gametypes/dm.gsc new file mode 100644 index 0000000..e9e3e3d --- /dev/null +++ b/maps/mp/gametypes/dm.gsc @@ -0,0 +1,67 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::SetupCallbacks(); + maps\mp\gametypes\_globallogic::SetupCallbacks(); + + level.onStartGameType = ::onStartGameType; + level.onSpawnPlayer = ::onSpawnPlayer; +} + +onStartGameType() +{ + setClientNameMode("auto_change"); + + maps\mp\gametypes\_globallogic::setObjectiveText( "allies", &"OBJECTIVES_DM" ); + maps\mp\gametypes\_globallogic::setObjectiveText( "axis", &"OBJECTIVES_DM" ); + + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_DM_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_DM_SCORE" ); + + maps\mp\gametypes\_globallogic::setObjectiveHintText( "allies", &"OBJECTIVES_DM_HINT" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "axis", &"OBJECTIVES_DM_HINT" ); + + level.spawnMins = ( 0, 0, 0 ); + level.spawnMaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dm_spawn" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_dm_spawn" ); + level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); + setMapCenter( level.mapCenter ); + + allowed[0] = "dm"; + maps\mp\gametypes\_gameobjects::main(allowed); + + level.displayRoundEndText = false; + level.QuickMessageToAll = true; + + if ( level.roundLimit != 1 && level.numLives ) + { + level.overridePlayerScore = true; + level.displayRoundEndText = true; + level.onEndGame = ::onEndGame; + } +} + +onSpawnPlayer() +{ + spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] ); + spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_DM( spawnPoints ); + + self spawn( spawnPoint.origin, spawnPoint.angles ); +} + +onEndGame( winningPlayer ) +{ + if ( isDefined( winningPlayer ) ) + [[level._setPlayerScore]]( winningPlayer, winningPlayer [[level._getPlayerScore]]() + 1 ); +} \ No newline at end of file diff --git a/maps/mp/gametypes/dom.gsc b/maps/mp/gametypes/dom.gsc new file mode 100644 index 0000000..fa81e6e --- /dev/null +++ b/maps/mp/gametypes/dom.gsc @@ -0,0 +1,627 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\_utility; + +main() +{ + if(getdvar("mapname") == "mp_background") + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::SetupCallbacks(); + maps\mp\gametypes\_globallogic::SetupCallbacks(); + + level.teamBased = true; + level.overrideTeamScore = true; + level.onStartGameType = ::onStartGameType; + level.onSpawnPlayer = ::onSpawnPlayer; + level.onPlayerKilled = ::onPlayerKilled; + level.onPrecacheGameType = ::onPrecacheGameType; + level.onRoundSwitch = ::onRoundSwitch; + + level.displayRoundEndText = false; +} + +onPrecacheGameType() +{ + precacheShader( "compass_waypoint_captureneutral" ); + precacheShader( "compass_waypoint_capture" ); + precacheShader( "compass_waypoint_defend" ); + precacheShader( "compass_waypoint_captureneutral_a" ); + precacheShader( "compass_waypoint_capture_a" ); + precacheShader( "compass_waypoint_defend_a" ); + precacheShader( "compass_waypoint_captureneutral_b" ); + precacheShader( "compass_waypoint_capture_b" ); + precacheShader( "compass_waypoint_defend_b" ); + precacheShader( "compass_waypoint_captureneutral_c" ); + precacheShader( "compass_waypoint_capture_c" ); + precacheShader( "compass_waypoint_defend_c" ); + precacheShader( "compass_waypoint_captureneutral_d" ); + precacheShader( "compass_waypoint_capture_d" ); + precacheShader( "compass_waypoint_defend_d" ); + precacheShader( "compass_waypoint_captureneutral_e" ); + precacheShader( "compass_waypoint_capture_e" ); + precacheShader( "compass_waypoint_defend_e" ); + + precacheShader( "waypoint_captureneutral" ); + precacheShader( "waypoint_capture" ); + precacheShader( "waypoint_defend" ); + precacheShader( "waypoint_captureneutral_a" ); + precacheShader( "waypoint_capture_a" ); + precacheShader( "waypoint_defend_a" ); + precacheShader( "waypoint_captureneutral_b" ); + precacheShader( "waypoint_capture_b" ); + precacheShader( "waypoint_defend_b" ); + precacheShader( "waypoint_captureneutral_c" ); + precacheShader( "waypoint_capture_c" ); + precacheShader( "waypoint_defend_c" ); + precacheShader( "waypoint_captureneutral_d" ); + precacheShader( "waypoint_capture_d" ); + precacheShader( "waypoint_defend_d" ); + precacheShader( "waypoint_captureneutral_e" ); + precacheShader( "waypoint_capture_e" ); + precacheShader( "waypoint_defend_e" ); + + flagBaseFX = []; + flagBaseFX["marines"] = "misc/ui_flagbase_silver"; + flagBaseFX["sas"] = "misc/ui_flagbase_black"; + flagBaseFX["russian"] = "misc/ui_flagbase_red"; + flagBaseFX["opfor"] = "misc/ui_flagbase_gold"; + + game["flagBaseFXid"] = []; + game["flagBaseFXid"][ "allies" ] = loadfx( flagBaseFX[ game[ "allies" ] ] ); + game["flagBaseFXid"][ "axis" ] = loadfx( flagBaseFX[ game[ "axis" ] ] ); +} + +onStartGameType() +{ + maps\mp\gametypes\_globallogic::setObjectiveText( "allies", &"OBJECTIVES_DOM" ); + maps\mp\gametypes\_globallogic::setObjectiveText( "axis", &"OBJECTIVES_DOM" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_DOM_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_DOM_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "allies", &"OBJECTIVES_DOM_HINT" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "axis", &"OBJECTIVES_DOM_HINT" ); + + setClientNameMode("auto_change"); + + level.spawnMins = ( 0, 0, 0 ); + level.spawnMaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_allies_start" ); + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_axis_start" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dom_spawn" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_dom_spawn" ); + + level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); + setMapCenter( level.mapCenter ); + + level.spawn_all = getentarray( "mp_dom_spawn", "classname" ); + level.spawn_axis_start = getentarray("mp_dom_spawn_axis_start", "classname" ); + level.spawn_allies_start = getentarray("mp_dom_spawn_allies_start", "classname" ); + + level.startPos["allies"] = level.spawn_allies_start[0].origin; + level.startPos["axis"] = level.spawn_axis_start[0].origin; + + allowed[0] = "dom"; + + maps\mp\gametypes\_gameobjects::main(allowed); + + thread domFlags(); + thread updateDomScores(); +} + +onSpawnPlayer() +{ + spawnpoint = undefined; + + if ( !level.useStartSpawns ) + { + flagsOwned = 0; + enemyFlagsOwned = 0; + myTeam = self.pers["team"]; + enemyTeam = getOtherTeam( myTeam ); + for ( i = 0; i < level.flags.size; i++ ) + { + team = level.flags[i] getFlagTeam(); + if ( team == myTeam ) + flagsOwned++; + else if ( team == enemyTeam ) + enemyFlagsOwned++; + } + + if ( flagsOwned == level.flags.size ) + { + enemyBestSpawnFlag = level.bestSpawnFlag[ getOtherTeam( self.pers["team"] ) ]; + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getSpawnsBoundingFlag( enemyBestSpawnFlag ) ); + } + else if ( flagsOwned > 0 ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getBoundaryFlagSpawns( myTeam ) ); + else + { + bestFlag = undefined; + if ( enemyFlagsOwned > 0 && enemyFlagsOwned < level.flags.size ) + bestFlag = getUnownedFlagNearestStart( myTeam ); + if ( !isdefined( bestFlag ) ) + bestFlag = level.bestSpawnFlag[ self.pers["team"] ]; + + level.bestSpawnFlag[ self.pers["team"] ] = bestFlag; + + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, bestFlag.nearbyspawns ); + } + } + + if ( !isdefined( spawnpoint ) ) + { + if (self.pers["team"] == "axis") + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start); + } + + self spawn(spawnpoint.origin, spawnpoint.angles); +} + +domFlags() +{ + level.lastStatus["allies"] = 0; + level.lastStatus["axis"] = 0; + + game["flagmodels"] = []; + game["flagmodels"]["neutral"] = "prop_flag_neutral"; + if ( game["allies"] == "marines" ) + game["flagmodels"]["allies"] = "prop_flag_american"; + else + game["flagmodels"]["allies"] = "prop_flag_brit"; + + if ( game["axis"] == "russian" ) + game["flagmodels"]["axis"] = "prop_flag_russian"; + else + game["flagmodels"]["axis"] = "prop_flag_opfor"; + + precacheModel( game["flagmodels"]["neutral"] ); + precacheModel( game["flagmodels"]["allies"] ); + precacheModel( game["flagmodels"]["axis"] ); + + precacheString( &"MP_CAPTURING_FLAG" ); + precacheString( &"MP_LOSING_FLAG" ); + precacheString( &"MP_DOM_YOUR_FLAG_WAS_CAPTURED" ); + precacheString( &"MP_DOM_ENEMY_FLAG_CAPTURED" ); + precacheString( &"MP_DOM_NEUTRAL_FLAG_CAPTURED" ); + + precacheString( &"MP_ENEMY_FLAG_CAPTURED_BY" ); + precacheString( &"MP_NEUTRAL_FLAG_CAPTURED_BY" ); + precacheString( &"MP_FRIENDLY_FLAG_CAPTURED_BY" ); + + primaryFlags = getEntArray( "flag_primary", "targetname" ); + secondaryFlags = getEntArray( "flag_secondary", "targetname" ); + + if ( (primaryFlags.size + secondaryFlags.size) < 2 ) + { + if ( isDefined( level.restarting ) ) + { + setdvar("g_gametype", "dm"); + setDvar( "o_gametype", "dm" ); + } + else + maps\mp\gametypes\_callbacksetup::AbortLevel(); + return; + } + + level.flags = []; + for ( i = 0; i < primaryFlags.size; i++ ) + level.flags[level.flags.size] = primaryFlags[i]; + + for ( i = 0; i < secondaryFlags.size; i++ ) + level.flags[level.flags.size] = secondaryFlags[i]; + + level.domFlags = []; + for ( i = 0; i < level.flags.size; i++ ) + { + trigger = level.flags[i]; + if ( isDefined( trigger.target ) ) + visuals[0] = getEnt( trigger.target, "targetname" ); + else + { + visuals[0] = spawn( "script_model", trigger.origin ); + visuals[0].angles = trigger.angles; + } + + visuals[0] setModel( game["flagmodels"]["neutral"] ); + + domFlag = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", trigger, visuals, (0,0,100) ); + domFlag maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); + domFlag maps\mp\gametypes\_gameobjects::setUseTime( 10 ); + domFlag maps\mp\gametypes\_gameobjects::setUseText( &"MP_CAPTURING_FLAG" ); + label = domFlag maps\mp\gametypes\_gameobjects::getLabel(); + domFlag.label = label; + domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" + label ); + domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" + label ); + domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_captureneutral" + label ); + domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_captureneutral" + label ); + domFlag maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + domFlag.onUse = ::onUse; + domFlag.onBeginUse = ::onBeginUse; + domFlag.onEndUse = ::onEndUse; + + traceStart = visuals[0].origin + (0,0,32); + traceEnd = visuals[0].origin + (0,0,-32); + trace = bulletTrace( traceStart, traceEnd, false, undefined ); + + upangles = vectorToAngles( trace["normal"] ); + domFlag.baseeffectforward = anglesToForward( upangles ); + domFlag.baseeffectright = anglesToRight( upangles ); + + domFlag.baseeffectpos = trace["position"]; + + level.flags[i].useObj = domFlag; + level.flags[i].adjflags = []; + level.flags[i].nearbyspawns = []; + + domFlag.levelFlag = level.flags[i]; + + level.domFlags[level.domFlags.size] = domFlag; + } + + level.bestSpawnFlag = []; + level.bestSpawnFlag[ "allies" ] = getUnownedFlagNearestStart( "allies", undefined ); + level.bestSpawnFlag[ "axis" ] = getUnownedFlagNearestStart( "axis", level.bestSpawnFlag[ "allies" ] ); + + flagSetup(); +} + +onRoundSwitch() +{ + level.halftimeType = "halftime"; +} + +getUnownedFlagNearestStart( team, excludeFlag ) +{ + best = undefined; + bestdistsq = undefined; + for ( i = 0; i < level.flags.size; i++ ) + { + flag = level.flags[i]; + + if ( flag getFlagTeam() != "neutral" ) + continue; + + distsq = distanceSquared( flag.origin, level.startPos[team] ); + if ( (!isDefined( excludeFlag ) || flag != excludeFlag) && (!isdefined( best ) || distsq < bestdistsq) ) + { + bestdistsq = distsq; + best = flag; + } + } + return best; +} + +onBeginUse( player ) +{ + ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); + setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel() + "_flash", 1 ); + + if ( ownerTeam == "neutral" ) + { + self.objPoints[player.pers["team"]] thread maps\mp\gametypes\_objpoints::startFlashing(); + return; + } + + if ( ownerTeam == "allies" ) + otherTeam = "axis"; + else + otherTeam = "allies"; + + self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::startFlashing(); + self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::startFlashing(); +} + +onEndUse( team, player, success ) +{ + setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel() + "_flash", 0 ); + + self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::stopFlashing(); + self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::stopFlashing(); +} + +resetFlagBaseEffect() +{ + if ( isdefined( self.baseeffect ) ) + self.baseeffect delete(); + + team = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); + + if ( team != "axis" && team != "allies" ) + return; + + fxid = game["flagBaseFXid"][ team ]; + + self.baseeffect = spawnFx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); + triggerFx( self.baseeffect ); +} + +onUse( player ) +{ + team = player.pers["team"]; + oldTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); + label = self maps\mp\gametypes\_gameobjects::getLabel(); + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "captured" + self.label + "" + player.name; + + logPrint("P_F;" + player getGuid() + ";" + player getEntityNumber() + ";" + player.name + "\n"); + + self maps\mp\gametypes\_gameobjects::setOwnerTeam( team ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_capture" + label ); + self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_capture" + label ); + self.visuals[0] setModel( game["flagmodels"][team] ); + setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel(), team ); + + self resetFlagBaseEffect(); + + level.useStartSpawns = false; + + if ( oldTeam == "neutral" ) + { + otherTeam = getOtherTeam( team ); + thread printAndSoundOnEveryone( team, otherTeam, &"MP_NEUTRAL_FLAG_CAPTURED_BY", &"MP_NEUTRAL_FLAG_CAPTURED_BY", "mp_war_objective_taken", undefined, player ); + } + else + { + thread printAndSoundOnEveryone( team, oldTeam, &"MP_ENEMY_FLAG_CAPTURED_BY", &"MP_FRIENDLY_FLAG_CAPTURED_BY", "mp_war_objective_taken", "mp_war_objective_lost", player ); + level.bestSpawnFlag[ oldTeam ] = self.levelFlag; + } + + thread giveFlagCaptureXP( self.touchList[team] ); +} + +giveFlagCaptureXP( touchList ) +{ + wait 0.05; + maps\mp\gametypes\_globallogic::WaitTillSlowProcessAllowed(); + + players = getArrayKeys( touchList ); + for ( i = 0; i < players.size; i++ ) + { + touchList[players[i]].player thread [[level.onXPEvent]]( "capture" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "capture", touchList[players[i]].player ); + } +} + +updateDomScores() +{ + level.endGameOnScoreLimit = false; + + while ( !level.gameEnded ) + { + numFlags = getTeamFlagCount( "allies" ); + if ( numFlags ) + [[level._setTeamScore]]( "allies", [[level._getTeamScore]]( "allies" ) + numFlags ); + + numFlags = getTeamFlagCount( "axis" ); + if ( numFlags ) + [[level._setTeamScore]]( "axis", [[level._getTeamScore]]( "axis" ) + numFlags ); + + level.endGameOnScoreLimit = true; + maps\mp\gametypes\_globallogic::checkScoreLimit(); + level.endGameOnScoreLimit = false; + wait 5; + } +} + +onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) +{ + if ( self.touchTriggers.size && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + triggerIds = getArrayKeys( self.touchTriggers ); + ownerTeam = self.touchTriggers[triggerIds[0]].useObj.ownerTeam; + team = self.pers["team"]; + + if ( team == ownerTeam ) + { + attacker thread [[level.onXPEvent]]( "assault" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "assault", attacker ); + } + else + { + attacker thread [[level.onXPEvent]]( "defend" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "defend", attacker ); + } + } +} + +getTeamFlagCount( team ) +{ + score = 0; + for (i = 0; i < level.flags.size; i++) + { + if ( level.domFlags[i] maps\mp\gametypes\_gameobjects::getOwnerTeam() == team ) + score++; + } + return score; +} + +getFlagTeam() +{ + return self.useObj maps\mp\gametypes\_gameobjects::getOwnerTeam(); +} + +getBoundaryFlags() +{ + bflags = []; + for (i = 0; i < level.flags.size; i++) + { + for (j = 0; j < level.flags[i].adjflags.size; j++) + { + if (level.flags[i].useObj maps\mp\gametypes\_gameobjects::getOwnerTeam() != level.flags[i].adjflags[j].useObj maps\mp\gametypes\_gameobjects::getOwnerTeam() ) + { + bflags[bflags.size] = level.flags[i]; + break; + } + } + } + + return bflags; +} + +getBoundaryFlagSpawns(team) +{ + spawns = []; + + bflags = getBoundaryFlags(); + for (i = 0; i < bflags.size; i++) + { + if (isdefined(team) && bflags[i] getFlagTeam() != team) + continue; + + for (j = 0; j < bflags[i].nearbyspawns.size; j++) + spawns[spawns.size] = bflags[i].nearbyspawns[j]; + } + + return spawns; +} + +getSpawnsBoundingFlag( avoidflag ) +{ + spawns = []; + + for (i = 0; i < level.flags.size; i++) + { + flag = level.flags[i]; + if ( flag == avoidflag ) + continue; + + isbounding = false; + for (j = 0; j < flag.adjflags.size; j++) + { + if ( flag.adjflags[j] == avoidflag ) + { + isbounding = true; + break; + } + } + + if ( !isbounding ) + continue; + + for (j = 0; j < flag.nearbyspawns.size; j++) + spawns[spawns.size] = flag.nearbyspawns[j]; + } + + return spawns; +} + +getOwnedAndBoundingFlagSpawns(team) +{ + spawns = []; + + for (i = 0; i < level.flags.size; i++) + { + if ( level.flags[i] getFlagTeam() == team ) + { + for (s = 0; s < level.flags[i].nearbyspawns.size; s++) + spawns[spawns.size] = level.flags[i].nearbyspawns[s]; + } + else + { + for (j = 0; j < level.flags[i].adjflags.size; j++) + { + if ( level.flags[i].adjflags[j] getFlagTeam() == team ) + { + for (s = 0; s < level.flags[i].nearbyspawns.size; s++) + spawns[spawns.size] = level.flags[i].nearbyspawns[s]; + break; + } + } + } + } + + return spawns; +} + +getOwnedFlagSpawns(team) +{ + spawns = []; + + for (i = 0; i < level.flags.size; i++) + { + if ( level.flags[i] getFlagTeam() == team ) + { + for (s = 0; s < level.flags[i].nearbyspawns.size; s++) + spawns[spawns.size] = level.flags[i].nearbyspawns[s]; + } + } + + return spawns; +} + +flagSetup() +{ + descriptorsByLinkname = []; + + descriptors = getentarray("flag_descriptor", "targetname"); + + flags = level.flags; + + for (i = 0; i < level.domFlags.size; i++) + { + closestdist = undefined; + closestdesc = undefined; + for (j = 0; j < descriptors.size; j++) + { + dist = distance(flags[i].origin, descriptors[j].origin); + if (!isdefined(closestdist) || dist < closestdist) { + closestdist = dist; + closestdesc = descriptors[j]; + } + } + + flags[i].descriptor = closestdesc; + closestdesc.flag = flags[i]; + descriptorsByLinkname[closestdesc.script_linkname] = closestdesc; + } + + for (i = 0; i < flags.size; i++) + { + if (isdefined(flags[i].descriptor.script_linkto)) + adjdescs = strtok(flags[i].descriptor.script_linkto, " "); + else + adjdescs = []; + + for (j = 0; j < adjdescs.size; j++) + { + otherdesc = descriptorsByLinkname[adjdescs[j]]; + adjflag = otherdesc.flag; + flags[i].adjflags[flags[i].adjflags.size] = adjflag; + } + } + + spawnpoints = getentarray("mp_dom_spawn", "classname"); + for (i = 0; i < spawnpoints.size; i++) + { + if (isdefined(spawnpoints[i].script_linkto)) { + desc = descriptorsByLinkname[spawnpoints[i].script_linkto]; + nearestflag = desc.flag; + } + else { + nearestflag = undefined; + nearestdist = undefined; + for (j = 0; j < flags.size; j++) + { + dist = distancesquared(flags[j].origin, spawnpoints[i].origin); + if (!isdefined(nearestflag) || dist < nearestdist) + { + nearestflag = flags[j]; + nearestdist = dist; + } + } + } + nearestflag.nearbyspawns[nearestflag.nearbyspawns.size] = spawnpoints[i]; + } +} \ No newline at end of file diff --git a/maps/mp/gametypes/koth.gsc b/maps/mp/gametypes/koth.gsc new file mode 100644 index 0000000..8de7029 --- /dev/null +++ b/maps/mp/gametypes/koth.gsc @@ -0,0 +1,709 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + +main() +{ + if ( getdvar("mapname") == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::SetupCallbacks(); + maps\mp\gametypes\_globallogic::SetupCallbacks(); + + level.teamBased = true; + level.doPrematch = true; + level.overrideTeamScore = true; + level.onStartGameType = ::onStartGameType; + level.onSpawnPlayer = ::onSpawnPlayer; + level.onPlayerKilled = ::onPlayerKilled; + level.onRoundSwitch = ::onRoundSwitch; + + precacheShader( "compass_waypoint_captureneutral" ); + precacheShader( "compass_waypoint_capture" ); + precacheShader( "compass_waypoint_defend" ); + + precacheShader( "waypoint_targetneutral" ); + precacheShader( "waypoint_captureneutral" ); + precacheShader( "waypoint_capture" ); + precacheShader( "waypoint_defend" ); + + precacheString( &"MP_WAITING_FOR_HQ" ); + + level.hqAutoDestroyTime = getdvarint("koth_autodestroytime"); + level.hqSpawnTime = getdvarint("koth_spawntime"); + level.kothMode = getdvarint("koth_kothmode"); + level.captureTime = getdvarint("koth_captureTime"); + level.destroyTime = getdvarint("koth_destroyTime"); + level.delayPlayer = getdvarint("koth_delayPlayer"); + level.spawnDelay = getdvarint("koth_spawnDelay"); + + level.iconoffset = (0,0,32); + + level.onRespawnDelay = ::getRespawnDelay; +} + +updateObjectiveHintMessages( alliesObjective, axisObjective ) +{ + game["strings"]["objective_hint_allies"] = alliesObjective; + game["strings"]["objective_hint_axis"] = axisObjective; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if ( isDefined( player.pers["team"] ) && player.pers["team"] != "spectator" ) + { + hintText = maps\mp\gametypes\_globallogic::getObjectiveHintText( player.pers["team"] ); + player thread maps\mp\gametypes\_hud_message::hintMessage( hintText ); + } + } +} + +getRespawnDelay() +{ + self.lowerMessageOverride = undefined; + + if ( !isDefined( level.radioObject ) ) + return undefined; + + hqOwningTeam = level.radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam(); + if ( self.pers["team"] == hqOwningTeam ) + { + if ( !isDefined( level.hqDestroyTime ) ) + return undefined; + + timeRemaining = (level.hqDestroyTime - gettime()) / 1000; + + if (!level.spawnDelay ) + return undefined; + + if ( level.spawnDelay >= level.hqAutoDestroyTime ) + self.lowerMessageOverride = &"MP_WAITING_FOR_HQ"; + + if ( level.delayPlayer ) + return min( level.spawnDelay, timeRemaining ); + else + return (int(timeRemaining) % level.spawnDelay); + } +} + +onStartGameType() +{ + maps\mp\gametypes\_globallogic::setObjectiveText( "allies", &"OBJECTIVES_KOTH" ); + maps\mp\gametypes\_globallogic::setObjectiveText( "axis", &"OBJECTIVES_KOTH" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_KOTH_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_KOTH_SCORE" ); + + level.objectiveHintPrepareHQ = &"MP_CONTROL_HQ"; + level.objectiveHintCaptureHQ = &"MP_CAPTURE_HQ"; + level.objectiveHintDestroyHQ = &"MP_DESTROY_HQ"; + level.objectiveHintDefendHQ = &"MP_DEFEND_HQ"; + + precacheString( level.objectiveHintPrepareHQ ); + precacheString( level.objectiveHintCaptureHQ ); + precacheString( level.objectiveHintDestroyHQ ); + precacheString( level.objectiveHintDefendHQ ); + + if ( level.kothmode ) + level.objectiveHintDestroyHQ = level.objectiveHintCaptureHQ; + + if ( level.hqSpawnTime ) + updateObjectiveHintMessages( level.objectiveHintPrepareHQ, level.objectiveHintPrepareHQ ); + else + updateObjectiveHintMessages( level.objectiveHintCaptureHQ, level.objectiveHintCaptureHQ ); + + setClientNameMode("auto_change"); + + level.spawnMins = ( 0, 0, 0 ); + level.spawnMaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" ); + + level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); + setMapCenter( level.mapCenter ); + + level.spawn_all = getentarray( "mp_tdm_spawn", "classname" ); + if ( !level.spawn_all.size ) + { + if ( isDefined( level.restarting ) ) + { + setdvar("g_gametype", "dm"); + setDvar( "o_gametype", "dm" ); + } + else + maps\mp\gametypes\_callbacksetup::AbortLevel(); + return; + } + + allowed[0] = "hq"; + maps\mp\gametypes\_gameobjects::main(allowed); + + thread SetupRadios(); + + thread HQMainLoop(); +} + +onRoundSwitch() +{ + level.halftimeType = "halftime"; +} + +HQMainLoop() +{ + level endon("game_ended"); + + level.hqRevealTime = -100000; + + hqSpawningInStr = &"MP_HQ_AVAILABLE_IN"; + if ( level.kothmode ) + { + hqDestroyedInFriendlyStr = &"MP_HQ_DESPAWN_IN"; + hqDestroyedInEnemyStr = &"MP_HQ_DESPAWN_IN"; + } + else + { + hqDestroyedInFriendlyStr = &"MP_HQ_REINFORCEMENTS_IN"; + hqDestroyedInEnemyStr = &"MP_HQ_DESPAWN_IN"; + } + + precacheString( hqSpawningInStr ); + precacheString( hqDestroyedInFriendlyStr ); + precacheString( hqDestroyedInEnemyStr ); + precacheString( &"MP_CAPTURING_HQ" ); + precacheString( &"MP_DESTROYING_HQ" ); + + if ( isDefined( game["promod_do_readyup"] ) && game["promod_do_readyup"] || game["PROMOD_MATCH_MODE"] == "strat") + return; + + while ( level.inPrematchPeriod ) + wait 0.05; + + wait 5; + + timerDisplay = []; + timerDisplay["allies"] = createServerTimer( "objective", 1.4, "allies" ); + timerDisplay["allies"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); + timerDisplay["allies"].label = hqSpawningInStr; + timerDisplay["allies"].alpha = 0; + timerDisplay["allies"].archived = false; + timerDisplay["allies"].hideWhenInMenu = true; + + timerDisplay["axis"] = createServerTimer( "objective", 1.4, "axis" ); + timerDisplay["axis"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); + timerDisplay["axis"].label = hqSpawningInStr; + timerDisplay["axis"].alpha = 0; + timerDisplay["axis"].archived = false; + timerDisplay["axis"].hideWhenInMenu = true; + + thread hideTimerDisplayOnGameEnd( timerDisplay["allies"] ); + thread hideTimerDisplayOnGameEnd( timerDisplay["axis"] ); + + locationObjID = maps\mp\gametypes\_gameobjects::getNextObjID(); + + objective_add( locationObjID, "invisible", (0,0,0) ); + + for(;;) + { + radio = PickRadioToSpawn(); + + iPrintLn( &"MP_HQ_REVEALED" ); + playSoundOnPlayers( "mp_suitcase_pickup" ); + + radioObject = radio.gameobject; + level.radioObject = radioObject; + + radioObject maps\mp\gametypes\_gameobjects::setModelVisibility( true ); + + level.hqRevealTime = gettime(); + + if ( level.hqSpawnTime ) + { + nextObjPoint = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_next_hq", radio.origin + level.iconoffset, "all", "waypoint_targetneutral" ); + nextObjPoint setWayPoint( true, "waypoint_targetneutral" ); + objective_position( locationObjID, radio.trigorigin ); + objective_icon( locationObjID, "compass_waypoint_captureneutral" ); + objective_state( locationObjID, "active" ); + + updateObjectiveHintMessages( level.objectiveHintPrepareHQ, level.objectiveHintPrepareHQ ); + + timerDisplay["allies"].label = hqSpawningInStr; + timerDisplay["allies"] setTimer( level.hqSpawnTime ); + timerDisplay["allies"].alpha = 1; + timerDisplay["axis"].label = hqSpawningInStr; + timerDisplay["axis"] setTimer( level.hqSpawnTime ); + timerDisplay["axis"].alpha = 1; + + wait level.hqSpawnTime; + + maps\mp\gametypes\_objpoints::deleteObjPoint( nextObjPoint ); + objective_state( locationObjID, "invisible" ); + } + + timerDisplay["allies"].alpha = 0; + timerDisplay["axis"].alpha = 0; + + waittillframeend; + + updateObjectiveHintMessages( level.objectiveHintCaptureHQ, level.objectiveHintCaptureHQ ); + playSoundOnPlayers( "mp_killstreak_radar" ); + + radioObject maps\mp\gametypes\_gameobjects::enableObject(); + + radioObject maps\mp\gametypes\_gameobjects::allowUse( "any" ); + radioObject maps\mp\gametypes\_gameobjects::setUseTime( level.captureTime ); + radioObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_CAPTURING_HQ" ); + + radioObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_captureneutral" ); + radioObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_captureneutral" ); + radioObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + radioObject maps\mp\gametypes\_gameobjects::setModelVisibility( true ); + + radioObject.onUse = ::onRadioCapture; + radioObject.onBeginUse = ::onBeginUse; + radioObject.onEndUse = ::onEndUse; + + level waittill( "hq_captured" ); + + ownerTeam = radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam(); + otherTeam = getOtherTeam( ownerTeam ); + + if ( level.hqAutoDestroyTime ) + { + thread DestroyHQAfterTime( level.hqAutoDestroyTime ); + timerDisplay[ownerTeam] setTimer( level.hqAutoDestroyTime ); + timerDisplay[otherTeam] setTimer( level.hqAutoDestroyTime ); + } + else + level.hqDestroyedByTimer = false; + + for(;;) + { + ownerTeam = radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam(); + otherTeam = getOtherTeam( ownerTeam ); + + if ( ownerTeam == "allies" ) + updateObjectiveHintMessages( level.objectiveHintDefendHQ, level.objectiveHintDestroyHQ ); + else + updateObjectiveHintMessages( level.objectiveHintDestroyHQ, level.objectiveHintDefendHQ ); + + radioObject maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); + radioObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" ); + radioObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" ); + radioObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_capture" ); + radioObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_capture" ); + + if ( !level.kothMode ) + radioObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DESTROYING_HQ" ); + + radioObject.onUse = ::onRadioDestroy; + + if ( level.hqAutoDestroyTime ) + { + timerDisplay[ownerTeam].label = hqDestroyedInFriendlyStr; + timerDisplay[ownerTeam].alpha = 1; + timerDisplay[otherTeam].label = hqDestroyedInEnemyStr; + timerDisplay[otherTeam].alpha = 1; + } + + level waittill( "hq_destroyed" ); + + if ( !level.kothmode || level.hqDestroyedByTimer ) + break; + + thread forceSpawnTeam( ownerTeam ); + + radioObject maps\mp\gametypes\_gameobjects::setOwnerTeam( getOtherTeam( ownerTeam ) ); + } + + level notify("hq_reset"); + + radioObject maps\mp\gametypes\_gameobjects::disableObject(); + radioObject maps\mp\gametypes\_gameobjects::allowUse( "none" ); + radioObject maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" ); + radioObject maps\mp\gametypes\_gameobjects::setModelVisibility( false ); + + timerDisplay["allies"].alpha = 0; + timerDisplay["axis"].alpha = 0; + + level.radioObject = undefined; + + wait 0.05; + + thread forceSpawnTeam( ownerTeam ); + + wait 3; + } +} + +hideTimerDisplayOnGameEnd( timerDisplay ) +{ + level waittill("game_ended"); + timerDisplay.alpha = 0; +} + +forceSpawnTeam( team ) +{ + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if ( !isdefined( player ) ) + continue; + + if ( player.pers["team"] == team ) + { + player.lowerMessageOverride = undefined; + player notify( "force_spawn" ); + wait 0.1; + } + } +} + +onBeginUse( player ) +{ + ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); + + if ( ownerTeam == "neutral" ) + self.objPoints[player.pers["team"]] thread maps\mp\gametypes\_objpoints::startFlashing(); + else + { + self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::startFlashing(); + self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::startFlashing(); + } +} + +onEndUse( team, player, success ) +{ + self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::stopFlashing(); + self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::stopFlashing(); +} + +onRadioCapture( player ) +{ + team = player.pers["team"]; + + player thread [[level.onXPEvent]]( "capture" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "capture", player ); + + oldTeam = maps\mp\gametypes\_gameobjects::getOwnerTeam(); + self maps\mp\gametypes\_gameobjects::setOwnerTeam( team ); + if ( !level.kothMode ) + self maps\mp\gametypes\_gameobjects::setUseTime( level.destroyTime ); + + otherTeam = "axis"; + if ( team == "axis" ) + otherTeam = "allies"; + + thread printOnTeamArg( &"MP_HQ_CAPTURED_BY", team, player ); + thread printOnTeam( &"MP_HQ_CAPTURED_BY_ENEMY", otherTeam ); + thread playSoundOnPlayers( "mp_war_objective_taken", team ); + thread playSoundOnPlayers( "mp_war_objective_lost", otherTeam ); + + level thread awardHQPoints( team ); + + level notify( "hq_captured" ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "hq_captured" + player.name; + + logPrint("P_HQC;" + player getGuid() + ";" + player getEntityNumber() + ";" + player.name + "\n"); +} + +onRadioDestroy( player ) +{ + team = player.pers["team"]; + otherTeam = "axis"; + if ( team == "axis" ) + otherTeam = "allies"; + + player thread [[level.onXPEvent]]( "capture" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "capture", player ); + + if ( level.kothmode ) + { + thread printOnTeamArg( &"MP_HQ_CAPTURED_BY", team, player ); + thread printOnTeam( &"MP_HQ_CAPTURED_BY_ENEMY", otherTeam ); + } + else + { + thread printOnTeamArg( &"MP_HQ_DESTROYED_BY", team, player ); + thread printOnTeam( &"MP_HQ_DESTROYED_BY_ENEMY", otherTeam ); + } + thread playSoundOnPlayers( "mp_war_objective_taken", team ); + thread playSoundOnPlayers( "mp_war_objective_lost", otherTeam ); + + level notify( "hq_destroyed" ); + + if ( level.kothmode ) + level thread awardHQPoints( team ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "hq_destroyed" + player.name; + + logPrint("P_HQD;" + player getGuid() + ";" + player getEntityNumber() + ";" + player.name + "\n"); +} + +DestroyHQAfterTime( time ) +{ + level endon( "game_ended" ); + level endon( "hq_reset" ); + + level.hqDestroyTime = gettime() + time * 1000; + level.hqDestroyedByTimer = false; + + wait time; + + level.hqDestroyedByTimer = true; + level notify( "hq_destroyed" ); +} + +awardHQPoints( team ) +{ + level endon( "game_ended" ); + level endon( "hq_destroyed" ); + + level notify("awardHQPointsRunning"); + level endon("awardHQPointsRunning"); + + seconds = 5; + + while ( !level.gameEnded ) + { + [[level._setTeamScore]]( team, [[level._getTeamScore]]( team ) + seconds ); + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( player.pers["team"] == team ) + { + player thread [[level.onXPEvent]]( "defend" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "defend", player ); + } + } + + wait seconds; + } +} + +onSpawnPlayer() +{ + spawnpoint = undefined; + + if ( isdefined( level.radioObject ) ) + { + hqOwningTeam = level.radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam(); + if ( self.pers["team"] == hqOwningTeam ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, level.radioObject.nearSpawns ); + else if ( level.spawnDelay >= level.hqAutoDestroyTime && gettime() > level.hqRevealTime + 10000 ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all ); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, level.radioObject.outerSpawns ); + } + + if ( !isDefined( spawnpoint ) ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all ); + + self.lowerMessageOverride = undefined; + + self spawn( spawnpoint.origin, spawnpoint.angles ); +} + +SetupRadios() +{ + radios = getentarray( "hq_hardpoint", "targetname" ); + + trigs = getentarray("radiotrigger", "targetname"); + for ( i = 0; i < radios.size; i++ ) + { + radio = radios[i]; + radio.trig = undefined; + for ( j = 0; j < trigs.size; j++ ) + { + if ( radio istouching( trigs[j] ) ) + { + radio.trig = trigs[j]; + break; + } + } + + radio.trigorigin = radio.trig.origin; + + visuals = []; + visuals[0] = radio; + + otherVisuals = getEntArray( radio.target, "targetname" ); + for ( j = 0; j < otherVisuals.size; j++ ) + visuals[visuals.size] = otherVisuals[j]; + + radio.gameObject = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", radio.trig, visuals, (radio.origin - radio.trigorigin) + level.iconoffset ); + radio.gameObject maps\mp\gametypes\_gameobjects::disableObject(); + radio.gameObject maps\mp\gametypes\_gameobjects::setModelVisibility( false ); + radio.trig.useObj = radio.gameObject; + + radio setUpNearbySpawns(); + } + + level.radios = radios; + + level.prevradio = undefined; + level.prevradio2 = undefined; + + return true; +} + +setUpNearbySpawns() +{ + spawns = level.spawn_all; + + for ( i = 0; i < spawns.size; i++ ) + spawns[i].distsq = distanceSquared( spawns[i].origin, self.origin ); + + for ( i = 1; i < spawns.size; i++ ) + { + thespawn = spawns[i]; + for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[j].distsq; j-- ) + spawns[j + 1] = spawns[j]; + spawns[j + 1] = thespawn; + } + + first = []; + second = []; + third = []; + outer = []; + + thirdSize = spawns.size / 3; + for ( i = 0; i <= thirdSize; i++ ) + first[ first.size ] = spawns[i]; + for ( ; i < spawns.size; i++ ) + { + outer[ outer.size ] = spawns[i]; + if ( i <= (thirdSize*2) ) + second[ second.size ] = spawns[i]; + else + third[ third.size ] = spawns[i]; + } + + self.gameObject.nearSpawns = first; + self.gameObject.midSpawns = second; + self.gameObject.farSpawns = third; + self.gameObject.outerSpawns = outer; +} + +PickRadioToSpawn() +{ + avgpos["allies"] = (0,0,0); + avgpos["axis"] = (0,0,0); + num["allies"] = 0; + num["axis"] = 0; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if ( isalive( player ) ) + { + avgpos[ player.pers["team"] ] += player.origin; + num[ player.pers["team"] ]++; + } + } + + if ( !num["allies"] || !num["axis"] ) + { + radio = level.radios[ randomint( level.radios.size) ]; + while ( isDefined( level.prevradio ) && radio == level.prevradio ) + radio = level.radios[ randomint( level.radios.size) ]; + + level.prevradio2 = level.prevradio; + level.prevradio = radio; + + return radio; + } + + avgpos["allies"] = avgpos["allies"] / num["allies"]; + avgpos["axis"] = avgpos["axis"] / num["axis"]; + + bestradio = undefined; + lowestcost = undefined; + for ( i = 0; i < level.radios.size; i++ ) + { + radio = level.radios[i]; + + cost = abs( distance( radio.origin, avgpos["allies"] ) - distance( radio.origin, avgpos["axis"] ) ); + + if ( isdefined( level.prevradio ) && radio == level.prevradio ) + continue; + if ( isdefined( level.prevradio2 ) && radio == level.prevradio2 ) + { + if ( level.radios.size > 2 ) + continue; + else + cost += 512; + } + + if ( !isdefined( lowestcost ) || cost < lowestcost ) + { + lowestcost = cost; + bestradio = radio; + } + } + + level.prevradio2 = level.prevradio; + level.prevradio = bestradio; + + return bestradio; +} + +onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) +{ + if ( !isPlayer( attacker ) || (!self.touchTriggers.size && !attacker.touchTriggers.size) || attacker.pers["team"] == self.pers["team"] ) + return; + + if ( self.touchTriggers.size ) + { + triggerIds = getArrayKeys( self.touchTriggers ); + ownerTeam = self.touchTriggers[triggerIds[0]].useObj.ownerTeam; + + if ( ownerTeam != "neutral" ) + { + team = self.pers["team"]; + if ( team == ownerTeam ) + { + attacker thread [[level.onXPEvent]]( "assault" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "assault", attacker ); + } + else + { + attacker thread [[level.onXPEvent]]( "defend" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "defend", attacker ); + } + } + } + + if ( attacker.touchTriggers.size ) + { + triggerIds = getArrayKeys( attacker.touchTriggers ); + ownerTeam = attacker.touchTriggers[triggerIds[0]].useObj.ownerTeam; + + if ( ownerTeam != "neutral" ) + { + team = attacker.pers["team"]; + if ( team == ownerTeam ) + { + attacker thread [[level.onXPEvent]]( "defend" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "defend", attacker ); + } + else + { + attacker thread [[level.onXPEvent]]( "assault" ); + maps\mp\gametypes\_globallogic::givePlayerScore( "assault", attacker ); + } + } + } +} \ No newline at end of file diff --git a/maps/mp/gametypes/sab.gsc b/maps/mp/gametypes/sab.gsc new file mode 100644 index 0000000..3a42095 --- /dev/null +++ b/maps/mp/gametypes/sab.gsc @@ -0,0 +1,625 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\_utility; + +main() +{ + if ( getdvar("mapname") == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::SetupCallbacks(); + maps\mp\gametypes\_globallogic::SetupCallbacks(); + + level.teamBased = true; + level.overrideTeamScore = true; + + if ( !game["tiebreaker"] ) + { + level.onPrecacheGameType = ::onPrecacheGameType; + level.onStartGameType = ::onStartGameType; + level.onSpawnPlayer = ::onSpawnPlayer; + level.onTimeLimit = ::onTimeLimit; + level.onDeadEvent = ::onDeadEvent; + level.onRoundSwitch = ::onRoundSwitch; + level.endGameOnScoreLimit = false; + } + else + { + level.onStartGameType = ::onStartGameType; + level.onSpawnPlayer = ::onSpawnPlayer; + level.onEndGame = ::onEndGame; + level.endGameOnScoreLimit = false; + + level.numLives = 1; + level.timeLimit = 0; + } + + badtrig = getent( "sab_bomb_defuse_allies", "targetname" ); + if ( isdefined( badtrig ) ) + badtrig delete(); + + badtrig = getent( "sab_bomb_defuse_axis", "targetname" ); + if ( isdefined( badtrig ) ) + badtrig delete(); +} + +onPrecacheGameType() +{ + game["bomb_dropped_sound"] = "mp_war_objective_lost"; + game["bomb_recovered_sound"] = "mp_war_objective_taken"; + + precacheShader("waypoint_bomb"); + precacheShader("waypoint_kill"); + precacheShader("waypoint_bomb_enemy"); + precacheShader("waypoint_defend"); + precacheShader("waypoint_defuse"); + precacheShader("waypoint_target"); + precacheShader("compass_waypoint_bomb"); + precacheShader("compass_waypoint_defend"); + precacheShader("compass_waypoint_defuse"); + precacheShader("compass_waypoint_target"); + precacheShader("hud_suitcase_bomb"); + + precacheString(&"MP_EXPLOSIVES_RECOVERED_BY"); + precacheString(&"MP_EXPLOSIVES_DROPPED_BY"); + precacheString(&"MP_EXPLOSIVES_PLANTED_BY"); + precacheString(&"MP_EXPLOSIVES_DEFUSED_BY"); + precacheString(&"MP_YOU_HAVE_RECOVERED_THE_BOMB"); + precacheString(&"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES"); + precacheString(&"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES"); + precacheString(&"MP_PLANTING_EXPLOSIVE"); + precacheString(&"MP_DEFUSING_EXPLOSIVE"); + precacheString(&"MP_TARGET_DESTROYED"); + precacheString(&"MP_NO_RESPAWN"); + precacheString(&"MP_TIE_BREAKER"); + precacheString(&"MP_NO_RESPAWN"); + precacheString(&"MP_SUDDEN_DEATH"); +} + +onRoundSwitch() +{ + if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 ) + { + level.halftimeType = "overtime"; + level.halftimeSubCaption = &"MP_TIE_BREAKER"; + game["tiebreaker"] = true; + } + else + level.halftimeType = "halftime"; +} + +onStartGameType() +{ + setClientNameMode("auto_change"); + + game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED"; + + if ( !game["tiebreaker"] ) + { + maps\mp\gametypes\_globallogic::setObjectiveText( "allies", &"OBJECTIVES_SAB" ); + maps\mp\gametypes\_globallogic::setObjectiveText( "axis", &"OBJECTIVES_SAB" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_SAB_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_SAB_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "allies", &"OBJECTIVES_SAB_HINT" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "axis", &"OBJECTIVES_SAB_HINT" ); + } + else + { + maps\mp\gametypes\_globallogic::setObjectiveText( "allies", &"OBJECTIVES_WAR" ); + maps\mp\gametypes\_globallogic::setObjectiveText( "axis", &"OBJECTIVES_WAR" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_WAR_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_WAR_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "allies", &"OBJECTIVES_WAR_HINT" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "axis", &"OBJECTIVES_WAR_HINT" ); + } + + level.spawnMins = ( 0, 0, 0 ); + level.spawnMaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_allies_start" ); + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_axis_start" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_sab_spawn_allies" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_sab_spawn_axis" ); + + level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); + setMapCenter( level.mapCenter ); + + level.spawn_axis = getentarray("mp_sab_spawn_axis", "classname"); + level.spawn_allies = getentarray("mp_sab_spawn_allies", "classname"); + level.spawn_axis_start = getentarray("mp_sab_spawn_axis_start", "classname"); + level.spawn_allies_start = getentarray("mp_sab_spawn_allies_start", "classname"); + + if ( game["tiebreaker"] ) + { + allowed[0] = "war"; + maps\mp\gametypes\_gameobjects::main(allowed); + return; + } + + allowed[0] = "sab"; + maps\mp\gametypes\_gameobjects::main(allowed); + + thread updateGametypeDvars(); + + thread sabotage(); +} + +onTimeLimit() +{ + if ( level.inOvertime ) + return; + + thread onOvertime(); +} + +onOvertime() +{ + level endon ( "game_ended" ); + + level.timeLimitOverride = true; + level.inOvertime = true; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + player notify("force_spawn"); + player thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_SUDDEN_DEATH", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" ); + player setClientDvar( "g_compassShowEnemies", 1 ); + } + + waitTime = 0; + while ( waitTime < 90 ) + { + if ( !level.bombPlanted ) + { + waitTime += 1; + setGameEndTime( getTime() + ((90-waitTime)*1000) ); + } + wait 1; + } + + thread maps\mp\gametypes\_globallogic::endGame( "tie", game["strings"]["tie"] ); +} + +onDeadEvent( team ) +{ + if ( level.bombExploded ) + return; + + if ( team == "all" ) + { + if ( level.bombPlanted ) + { + [[level._setTeamScore]]( level.bombPlantedBy, [[level._getTeamScore]]( level.bombPlantedBy ) + 1 ); + thread maps\mp\gametypes\_globallogic::endGame( level.bombPlantedBy, game["strings"][level.bombPlantedBy+"_mission_accomplished"] ); + } + else + thread maps\mp\gametypes\_globallogic::endGame( "tie", game["strings"]["tie"] ); + } + else if ( level.bombPlanted ) + { + if ( team == level.bombPlantedBy ) + { + level.plantingTeamDead = true; + return; + } + + [[level._setTeamScore]]( level.bombPlantedBy, [[level._getTeamScore]]( level.bombPlantedBy ) + 1 ); + thread maps\mp\gametypes\_globallogic::endGame( level.bombPlantedBy, game["strings"][level.otherTeam[level.bombPlantedBy]+"_eliminated"] ); + } + else + { + [[level._setTeamScore]]( level.otherTeam[team], [[level._getTeamScore]]( level.otherTeam[team] ) + 1 ); + thread maps\mp\gametypes\_globallogic::endGame( level.otherTeam[team], game["strings"][team+"_eliminated"] ); + } +} + +onSpawnPlayer() +{ + self.isPlanting = false; + self.isDefusing = false; + + spawnteam = self.pers["team"]; + + if ( level.useStartSpawns ) + { + if (spawnteam == "axis") + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start); + } + else + { + if (spawnteam == "axis") + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_axis); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_allies); + } + + if ( game["tiebreaker"] ) + { + self thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_TIE_BREAKER", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" ); + + hintMessage = maps\mp\gametypes\_globallogic::getObjectiveHintText( self.pers["team"] ); + if ( isDefined( hintMessage ) ) + self thread maps\mp\gametypes\_hud_message::hintMessage( hintMessage ); + + self setClientDvar( "g_compassShowEnemies", 1 ); + } + + self spawn( spawnpoint.origin, spawnpoint.angles ); +} + +updateGametypeDvars() +{ + level.plantTime = dvarFloatValue( "planttime", 5, 0, 20 ); + level.defuseTime = dvarFloatValue( "defusetime", 5, 0, 20 ); + level.bombTimer = dvarFloatValue( "bombtimer", 45, 1, 300 ); + level.hotPotato = dvarIntValue( "hotpotato", 1, 0, 1 ); +} + +sabotage() +{ + level.bombPlanted = false; + level.bombExploded = false; + + level._effect["bombexplosion"] = loadfx("explosions/tanker_explosion"); + + trigger = getEnt( "sab_bomb_pickup_trig", "targetname" ); + if ( !isDefined( trigger ) ) + return; + + visuals[0] = getEnt( "sab_bomb", "targetname" ); + if ( !isDefined( visuals[0] ) ) + return; + + precacheModel( "prop_suitcase_bomb" ); + visuals[0] setModel( "prop_suitcase_bomb" ); + + if ( ( !isDefined( game["promod_do_readyup"] ) || isDefined( game["promod_do_readyup"] ) && !game["promod_do_readyup"] ) && ( !isDefined( game["PROMOD_MATCH_MODE"] ) || isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] != "strat" ) ) + { + level.sabBomb = maps\mp\gametypes\_gameobjects::createCarryObject( "neutral", trigger, visuals, (0,0,32) ); + level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" ); + level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_bomb" ); + level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" ); + level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_bomb" ); + level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" ); + level.sabBomb maps\mp\gametypes\_gameobjects::setCarryIcon( "hud_suitcase_bomb" ); + level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + level.sabBomb.objIDPingEnemy = true; + level.sabBomb.onPickup = ::onPickup; + level.sabBomb.onDrop = ::onDrop; + level.sabBomb.objPoints["allies"].archived = true; + level.sabBomb.objPoints["axis"].archived = true; + level.sabBomb.autoResetTime = 60; + } + else + { + trigger delete(); + visuals[0] delete(); + } + + if ( !isDefined( getEnt( "sab_bomb_axis", "targetname" ) ) || !isDefined( getEnt( "sab_bomb_allies", "targetname" ) ) ) + return; + + level.bombZones["allies"] = createBombZone( "allies", getEnt( "sab_bomb_allies", "targetname" ) ); + level.bombZones["axis"] = createBombZone( "axis", getEnt( "sab_bomb_axis", "targetname" ) ); +} + +createBombZone( team, trigger ) +{ + visuals = getEntArray( trigger.target, "targetname" ); + + bombZone = maps\mp\gametypes\_gameobjects::createUseObject( team, trigger, visuals, (0,0,64) ); + bombZone resetBombsite(); + bombZone.onUse = ::onUse; + bombZone.onBeginUse = ::onBeginUse; + bombZone.onEndUse = ::onEndUse; + bombZone.onCantUse = ::onCantUse; + + for ( i = 0; i < visuals.size; i++ ) + { + if ( isDefined( visuals[i].script_exploder ) ) + { + bombZone.exploderIndex = visuals[i].script_exploder; + break; + } + } + + return bombZone; +} + +onBeginUse( player ) +{ + if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) + { + player playSound( "mp_bomb_plant" ); + player.isPlanting = true; + } + else + { + player playSound( "mp_bomb_defuse" ); + player.isDefusing = true; + } +} + +onEndUse( team, player, result ) +{ + if ( isAlive( player ) ) + { + player.isDefusing = false; + player.isPlanting = false; + } +} + +onPickup( player ) +{ + level notify ( "bomb_picked_up" ); + + self.autoResetTime = 60; + + level.useStartSpawns = false; + + team = player.pers["team"]; + + if ( team == "allies" ) + otherTeam = "axis"; + else + otherTeam = "allies"; + + player playLocalSound( "mp_suitcase_pickup" ); + + if ( isDefined( level.scorebot ) && level.scorebot && isDefined( player ) && isDefined( player.name ) ) + game["promod_scorebot_ticker_buffer"] += "pickup_bomb" + player.name; + + excludeList[0] = player; + + if ( team == self maps\mp\gametypes\_gameobjects::getOwnerTeam() ) + { + printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player ); + playSoundOnPlayers( game["bomb_recovered_sound"], team ); + } + else + { + printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player ); + playSoundOnPlayers( game["bomb_recovered_sound"] ); + } + + self maps\mp\gametypes\_gameobjects::setOwnerTeam( team ); + self maps\mp\gametypes\_gameobjects::setVisibleTeam( "friendly" ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" ); + self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_kill" ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" ); + self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" ); + + level.bombZones[team] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + level.bombZones[otherTeam] maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); +} + +onDrop( player ) +{ + if ( !level.bombPlanted ) + { + if ( isDefined( player ) ) + printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", self maps\mp\gametypes\_gameobjects::getOwnerTeam(), player ); + + if ( isDefined( level.scorebot ) && level.scorebot && isDefined( player ) && isDefined( player.name ) ) + game["promod_scorebot_ticker_buffer"] += "dropped_bomb" + player.name; + + playSoundOnPlayers( game["bomb_dropped_sound"], self maps\mp\gametypes\_gameobjects::getOwnerTeam() ); + + thread abandonmentThink(); + } +} + +abandonmentThink() +{ + level endon ( "bomb_picked_up" ); + + if ( isDefined( self.carrier ) ) + return; + + if ( self maps\mp\gametypes\_gameobjects::getOwnerTeam() == "allies" ) + otherTeam = "axis"; + else + otherTeam = "allies"; + + playSoundOnPlayers( game["bomb_dropped_sound"], otherTeam ); + + self maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" ); + self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_bomb" ); + self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_bomb" ); + self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" ); + + level.bombZones["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + level.bombZones["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); +} + +onUse( player ) +{ + team = player.pers["team"]; + otherTeam = level.otherTeam[team]; + + if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) + { + if ( !level.hardcoreMode ) + iPrintLn( &"MP_EXPLOSIVES_PLANTED_BY", player.name ); + + maps\mp\gametypes\_globallogic::givePlayerScore( "plant", player ); + + playSoundOnPlayers("promod_planted"); + + player thread [[level.onXPEvent]]( "plant" ); + level thread bombPlanted( self, player.pers["team"] ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "planted_by" + player.name; + + logPrint("P_P;" + player getGuid() + ";" + player getEntityNumber() + ";" + player.name + "\n"); + + level.bombOwner = player; + + level.sabBomb.autoResetTime = undefined; + level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); + level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + level.sabBomb maps\mp\gametypes\_gameobjects::setDropped(); + + self setUpForDefusing(); + } + else + { + level notify ( "bomb_defused" ); + + if ( !level.hardcoreMode ) + iPrintLn( &"MP_EXPLOSIVES_DEFUSED_BY", player.name ); + + maps\mp\gametypes\_globallogic::givePlayerScore( "defuse", player ); + + playSoundOnPlayers("promod_defused"); + + player thread [[level.onXPEvent]]( "defuse" ); + level thread bombDefused( self ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "defused_by" + player.name; + + logPrint("P_D;" + player getGuid() + ";" + player getEntityNumber() + ";" + player.name + "\n"); + + if ( level.inOverTime && isDefined( level.plantingTeamDead ) ) + { + thread maps\mp\gametypes\_globallogic::endGame( player.pers["team"], game["strings"][level.bombPlantedBy+"_eliminated"] ); + return; + } + + self resetBombsite(); + + level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" ); + level.sabBomb maps\mp\gametypes\_gameobjects::setPickedUp( player ); + } +} + +onCantUse( player ) +{ + player iPrintLnBold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); +} + +bombPlanted( destroyedObj, team ) +{ + maps\mp\gametypes\_globallogic::pauseTimer(); + level.bombPlanted = true; + level.bombPlantedBy = team; + level.timeLimitOverride = true; + setDvar( "ui_bomb_timer", 1 ); + + setGameEndTime( int( getTime() + (level.bombTimer * 1000) ) ); + + destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic::playTickingSound(); + + starttime = gettime(); + bombTimerWait(); + + setDvar( "ui_bomb_timer", 0 ); + destroyedObj.visuals[0] maps\mp\gametypes\_globallogic::stopTickingSound(); + + if ( !level.bombPlanted ) + { + if ( level.hotPotato ) + { + timePassed = (gettime() - starttime) / 1000; + level.bombTimer -= timePassed; + } + return; + } + + explosionOrigin = level.sabBomb.visuals[0].origin; + level.bombExploded = true; + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "bomb_exploded"; + + if ( isdefined( level.bombowner ) ) + destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, level.bombowner ); + else + destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20 ); + + rot = randomfloat(360); + explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); + triggerFx( explosionEffect ); + + thread playSoundinSpace( "exp_suitcase_bomb_main", explosionOrigin ); + + [[level._setTeamScore]]( team, [[level._getTeamScore]]( team ) + 1 ); + + setGameEndTime( 0 ); + + wait 3; + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] playLocalSound("promod_destroyed"); + + thread maps\mp\gametypes\_globallogic::endGame( team, game["strings"]["target_destroyed"] ); +} + +playSoundinSpace( alias, origin ) +{ + org = spawn( "script_origin", origin ); + org.origin = origin; + org playSound( alias ); + wait 10; + org delete(); +} + +bombTimerWait() +{ + level endon("bomb_defused"); + wait level.bombTimer; +} + +resetBombsite() +{ + self maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); + self maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime ); + self maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" ); + self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + self maps\mp\gametypes\_gameobjects::setKeyObject( level.sabBomb ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" ); + self maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); +} + +setUpForDefusing() +{ + self maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); + self maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); + self maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); + self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + self maps\mp\gametypes\_gameobjects::setKeyObject( undefined ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" ); + self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" ); + self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); +} + +bombDefused( object ) +{ + setDvar( "ui_bomb_timer", 0 ); + maps\mp\gametypes\_globallogic::resumeTimer(); + level.bombPlanted = false; + if ( !level.inOvertime ) + level.timeLimitOverride = false; +} + +onEndGame( winningTeam ) +{ + if ( isdefined( winningTeam ) && (winningTeam == "allies" || winningTeam == "axis") ) + [[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 ); +} \ No newline at end of file diff --git a/maps/mp/gametypes/sd.gsc b/maps/mp/gametypes/sd.gsc new file mode 100644 index 0000000..5bf2001 --- /dev/null +++ b/maps/mp/gametypes/sd.gsc @@ -0,0 +1,584 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + +main() +{ + if(getdvar("mapname") == "mp_background") + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::SetupCallbacks(); + maps\mp\gametypes\_globallogic::SetupCallbacks(); + + level.teamBased = true; + level.overrideTeamScore = true; + level.onPrecacheGameType = ::onPrecacheGameType; + level.onStartGameType = ::onStartGameType; + level.onSpawnPlayer = ::onSpawnPlayer; + level.onDeadEvent = ::onDeadEvent; + level.onTimeLimit = ::onTimeLimit; + level.onRoundSwitch = ::onRoundSwitch; + + level.endGameOnScoreLimit = false; +} + +onPrecacheGameType() +{ + game["bomb_dropped_sound"] = "mp_war_objective_lost"; + game["bomb_recovered_sound"] = "mp_war_objective_taken"; + + precacheShader("waypoint_bomb"); + precacheShader("hud_suitcase_bomb"); + precacheShader("waypoint_target"); + precacheShader("waypoint_target_a"); + precacheShader("waypoint_target_b"); + precacheShader("waypoint_defend"); + precacheShader("waypoint_defend_a"); + precacheShader("waypoint_defend_b"); + precacheShader("waypoint_defuse"); + precacheShader("waypoint_defuse_a"); + precacheShader("waypoint_defuse_b"); + precacheShader("compass_waypoint_target"); + precacheShader("compass_waypoint_target_a"); + precacheShader("compass_waypoint_target_b"); + precacheShader("compass_waypoint_defend"); + precacheShader("compass_waypoint_defend_a"); + precacheShader("compass_waypoint_defend_b"); + precacheShader("compass_waypoint_defuse"); + precacheShader("compass_waypoint_defuse_a"); + precacheShader("compass_waypoint_defuse_b"); + + precacheString( &"MP_EXPLOSIVES_RECOVERED_BY" ); + precacheString( &"MP_EXPLOSIVES_DROPPED_BY" ); + precacheString( &"MP_EXPLOSIVES_PLANTED_BY" ); + precacheString( &"MP_EXPLOSIVES_DEFUSED_BY" ); + precacheString( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + precacheString( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + precacheString( &"MP_CANT_PLANT_WITHOUT_BOMB" ); + precacheString( &"MP_PLANTING_EXPLOSIVE" ); + precacheString( &"MP_DEFUSING_EXPLOSIVE" ); +} + +onRoundSwitch() +{ + level.halftimeType = "halftime"; +} + +getBetterTeam() +{ + kills["allies"] = 0; + kills["axis"] = 0; + deaths["allies"] = 0; + deaths["axis"] = 0; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + team = player.pers["team"]; + if ( isDefined( team ) && (team == "allies" || team == "axis") ) + { + kills[ team ] += player.kills; + deaths[ team ] += player.deaths; + } + } + + if ( kills["allies"] > kills["axis"] ) + return "allies"; + else if ( kills["axis"] > kills["allies"] ) + return "axis"; + + if ( deaths["allies"] < deaths["axis"] ) + return "allies"; + else if ( deaths["axis"] < deaths["allies"] ) + return "axis"; + + if ( randomint(2) == 0 ) + return "allies"; + + return "axis"; +} + +onStartGameType() +{ + setClientNameMode("manual_change"); + game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED"; + game["strings"]["bomb_defused"] = &"MP_BOMB_DEFUSED"; + + precacheString( game["strings"]["target_destroyed"] ); + precacheString( game["strings"]["bomb_defused"] ); + + level._effect["bombexplosion"] = loadfx("explosions/tanker_explosion"); + + maps\mp\gametypes\_globallogic::setObjectiveText( game["attackers"], &"OBJECTIVES_SD_ATTACKER" ); + maps\mp\gametypes\_globallogic::setObjectiveText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" ); + + maps\mp\gametypes\_globallogic::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_SCORE" ); + + maps\mp\gametypes\_globallogic::setObjectiveHintText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_HINT" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_HINT" ); + + level.spawnMins = ( 0, 0, 0 ); + level.spawnMaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sd_spawn_attacker" ); + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sd_spawn_defender" ); + + level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); + setMapCenter( level.mapCenter ); + + allowed[0] = "sd"; + allowed[1] = "bombzone"; + allowed[2] = "blocker"; + maps\mp\gametypes\_gameobjects::main(allowed); + + thread updateGametypeDvars(); + + thread bombs(); +} + +onSpawnPlayer() +{ + self.isPlanting = false; + self.isDefusing = false; + + if ( self.pers["team"] == game["attackers"] ) + spawnPointName = "mp_sd_spawn_attacker"; + else + spawnPointName = "mp_sd_spawn_defender"; + + self setclientdvar("ui_drawbombicon", 0); + if ( level.multiBomb && !isDefined( self.carryIcon ) && self.pers["team"] == game["attackers"] && !level.bombPlanted ) + { + self.carryIcon = createIcon( "hud_suitcase_bomb", 50, 50 ); + self.carryIcon setPoint( "CENTER", "CENTER", 223, 167 ); + self.carryIcon.alpha = 0.75; + self setclientdvar("ui_drawbombicon", 1); + } + + spawnPoints = getEntArray( spawnPointName, "classname" ); + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); + + self spawn( spawnpoint.origin, spawnpoint.angles ); + + level notify ( "spawned_player" ); +} + +sd_endGame( winningTeam, endReasonText ) +{ + if ( isdefined( winningTeam ) ) + [[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 ); + + thread maps\mp\gametypes\_globallogic::endGame( winningTeam, endReasonText ); +} + +onDeadEvent( team ) +{ + if ( level.bombExploded || level.bombDefused ) + return; + + if ( team == "all" ) + { + if ( level.bombPlanted ) + sd_endGame( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] ); + else + sd_endGame( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] ); + } + else if ( team == game["attackers"] ) + { + if ( level.bombPlanted ) + return; + + sd_endGame( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] ); + } + else if ( team == game["defenders"] ) + sd_endGame( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] ); +} + +onTimeLimit() +{ + if ( level.teamBased ) + sd_endGame( game["defenders"], game["strings"]["time_limit_reached"] ); + else + sd_endGame( undefined, game["strings"]["time_limit_reached"] ); +} + +updateGametypeDvars() +{ + level.plantTime = dvarFloatValue( "planttime", 5, 0, 20 ); + level.defuseTime = dvarFloatValue( "defusetime", 7, 0, 20 ); + level.bombTimer = dvarFloatValue( "bombtimer", 45, 1, 300 ); + level.multiBomb = dvarIntValue( "multibomb", 0, 0, 1 ); +} + +bombs() +{ + level.bombPlanted = false; + level.bombDefused = false; + level.bombExploded = false; + + trigger = getEnt( "sd_bomb_pickup_trig", "targetname" ); + if ( !isDefined( trigger ) ) + return; + + visuals[0] = getEnt( "sd_bomb", "targetname" ); + if ( !isDefined( visuals[0] ) ) + return; + + precacheModel( "prop_suitcase_bomb" ); + visuals[0] setModel( "prop_suitcase_bomb" ); + + if ( !level.multiBomb && !game["promod_do_readyup"] && !game["promod_timeout_called"] && !game["PROMOD_KNIFEROUND"] && isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] != "strat" ) + { + level.sdBomb = maps\mp\gametypes\_gameobjects::createCarryObject( game["attackers"], trigger, visuals, (0,0,32) ); + level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "friendly" ); + level.sdBomb maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_bomb" ); + level.sdBomb maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" ); + level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "friendly" ); + level.sdBomb maps\mp\gametypes\_gameobjects::setCarryIcon( "hud_suitcase_bomb" ); + level.sdBomb.onPickup = ::onPickup; + level.sdBomb.onDrop = ::onDrop; + } + else + { + trigger delete(); + visuals[0] delete(); + } + + level.bombZones = []; + + bombZones = getEntArray( "bombzone", "targetname" ); + + for ( i = 0; i < bombZones.size; i++ ) + { + trigger = bombZones[i]; + visuals = getEntArray( bombZones[i].target, "targetname" ); + + bombZone = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,64) ); + bombZone maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); + bombZone maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime ); + bombZone maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" ); + bombZone maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + if ( !level.multiBomb ) + bombZone maps\mp\gametypes\_gameobjects::setKeyObject( level.sdBomb ); + label = bombZone maps\mp\gametypes\_gameobjects::getLabel(); + bombZone.label = label; + bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" + label ); + bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" + label ); + + bombZone maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + + bombZone.onBeginUse = ::onBeginUse; + bombZone.onEndUse = ::onEndUse; + bombZone.onUse = ::onUsePlantObject; + bombZone.onCantUse = ::onCantUse; + + for ( j = 0; j < visuals.size; j++ ) + { + if ( isDefined( visuals[j].script_exploder ) ) + { + bombZone.exploderIndex = visuals[j].script_exploder; + break; + } + } + + level.bombZones[level.bombZones.size] = bombZone; + + bombZone.bombDefuseTrig = getent( visuals[0].target, "targetname" ); + bombZone.bombDefuseTrig.origin += (0,0,-10000); + bombZone.bombDefuseTrig.label = label; + } + + for ( i = 0; i < level.bombZones.size; i++ ) + { + array = []; + for ( j = 0; j < level.bombZones.size; j++ ) + { + if ( j != i ) + array[ array.size ] = level.bombZones[j]; + } + + level.bombZones[i].otherBombZones = array; + } +} + +onBeginUse( player ) +{ + if ( self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) + { + player playSound( "mp_bomb_defuse" ); + player.isDefusing = true; + + if ( isDefined( level.sdBombModel ) ) + level.sdBombModel hide(); + } + else + { + player playSound( "mp_bomb_plant" ); + player.isPlanting = true; + + if ( level.multibomb ) + { + for ( i = 0; i < self.otherBombZones.size; i++ ) + self.otherBombZones[i] maps\mp\gametypes\_gameobjects::disableObject(); + } + } +} + +onEndUse( team, player, result ) +{ + if ( isAlive( player ) ) + { + player.isDefusing = false; + player.isPlanting = false; + } + + if ( self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) + { + if ( isDefined( level.sdBombModel ) && !result ) + level.sdBombModel show(); + } + else + { + if ( level.multibomb && !result ) + { + for ( i = 0; i < self.otherBombZones.size; i++ ) + self.otherBombZones[i] maps\mp\gametypes\_gameobjects::enableObject(); + } + } +} + +onCantUse( player ) +{ + player iPrintLnBold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); +} + +onUsePlantObject( player ) +{ + if ( level.gameEnded ) + return; + + if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) + { + if ( !level.hardcoreMode ) + iPrintLn( &"MP_EXPLOSIVES_PLANTED_BY", player.name ); + + maps\mp\gametypes\_globallogic::givePlayerScore( "plant", player ); + + for ( i = 0; i < level.bombZones.size; i++ ) + { + if ( level.bombZones[i] == self ) + continue; + + level.bombZones[i] maps\mp\gametypes\_gameobjects::disableObject(); + } + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] playLocalSound("promod_planted"); + + player thread [[level.onXPEvent]]( "plant" ); + level thread bombPlanted( self, player ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "planted_by" + player.name; + + logPrint("P_P;" + player getGuid() + ";" + player getEntityNumber() + ";" + player.name + "\n"); + } +} + +onUseDefuseObject( player ) +{ + if ( level.gameEnded || level.bombExploded ) + return; + + level thread bombDefused(); + self maps\mp\gametypes\_gameobjects::disableObject(); + + playSoundOnPlayers("promod_defused"); + + if ( !level.hardcoreMode ) + iPrintLn( &"MP_EXPLOSIVES_DEFUSED_BY", player.name ); + + maps\mp\gametypes\_globallogic::givePlayerScore( "defuse", player ); + player thread [[level.onXPEvent]]( "defuse" ); + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "defused_by" + player.name; + + logPrint("P_D;" + player getGuid() + ";" + player getEntityNumber() + ";" + player.name + "\n"); +} + +onDrop( player ) +{ + if ( !level.bombPlanted ) + { + if ( isDefined( player ) && isDefined( player.name ) ) + printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", game["attackers"], player ); + + if ( isDefined( level.scorebot ) && level.scorebot && isDefined( player ) && isDefined( player.name ) ) + game["promod_scorebot_ticker_buffer"] += "dropped_bomb" + player.name; + } + + self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" ); + + if ( !level.bombPlanted ) + playSoundOnPlayers( game["bomb_dropped_sound"], game["attackers"] ); +} + +onPickup( player ) +{ + self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" ); + + if ( !level.bombDefused ) + { + if ( isDefined( player ) && isDefined( player.name ) ) + printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", game["attackers"], player ); + + if ( isDefined( level.scorebot ) && level.scorebot && isDefined( player ) && isDefined( player.name ) ) + game["promod_scorebot_ticker_buffer"] += "pickup_bomb" + player.name; + } + + playSoundOnPlayers( game["bomb_recovered_sound"], game["attackers"] ); +} + +bombPlanted( destroyedObj, player ) +{ + maps\mp\gametypes\_globallogic::pauseTimer(); + level.bombPlanted = true; + + destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic::playTickingSound(); + level.tickingObject = destroyedObj.visuals[0]; + + level.timeLimitOverride = true; + setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) ); + setDvar( "ui_bomb_timer", 1 ); + + if ( !level.multiBomb ) + { + level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); + level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + level.sdBomb maps\mp\gametypes\_gameobjects::setDropped(); + level.sdBombModel = level.sdBomb.visuals[0]; + } + else + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( isDefined( level.players[i].carryIcon ) ) + level.players[i].carryIcon destroyElem(); + } + + trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player ); + + tempAngle = randomfloat( 360 ); + forward = (cos( tempAngle ), sin( tempAngle ), 0); + forward = vectornormalize( forward - vector_scale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); + dropAngles = vectortoangles( forward ); + + level.sdBombModel = spawn( "script_model", trace["position"] ); + level.sdBombModel.angles = dropAngles; + level.sdBombModel setModel( "prop_suitcase_bomb" ); + } + + destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); + destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + + label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel(); + + trigger = destroyedObj.bombDefuseTrig; + trigger.origin = level.sdBombModel.origin; + visuals = []; + defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,32) ); + defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); + defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); + defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); + defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + label ); + defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + label ); + + defuseObject.label = label; + defuseObject.onBeginUse = ::onBeginUse; + defuseObject.onEndUse = ::onEndUse; + defuseObject.onUse = ::onUseDefuseObject; + + BombTimerWait(); + setDvar( "ui_bomb_timer", 0 ); + + destroyedObj.visuals[0] maps\mp\gametypes\_globallogic::stopTickingSound(); + + if ( level.gameEnded || level.bombDefused ) + return; + + level.bombExploded = true; + + if ( isDefined( level.scorebot ) && level.scorebot ) + game["promod_scorebot_ticker_buffer"] += "bomb_exploded"; + + explosionOrigin = level.sdBombModel.origin; + level.sdBombModel hide(); + + if ( isdefined( player ) ) + destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player ); + else + destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20 ); + + rot = randomfloat(360); + explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); + triggerFx( explosionEffect ); + + thread playSoundinSpace( "exp_suitcase_bomb_main", explosionOrigin ); + + for ( i = 0; i < level.bombZones.size; i++ ) + level.bombZones[i] maps\mp\gametypes\_gameobjects::disableObject(); + + defuseObject maps\mp\gametypes\_gameobjects::disableObject(); + + setGameEndTime( 0 ); + + playSoundOnPlayers("promod_destroyed"); + + wait 0.05; + + sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); +} + +BombTimerWait() +{ + level endon("game_ended"); + level endon("bomb_defused"); + + wait level.bombTimer; +} + +playSoundinSpace( alias, origin ) +{ + org = spawn( "script_origin", origin ); + org.origin = origin; + org playSound( alias ); + wait 10; + org delete(); +} + +bombDefused() +{ + level.tickingObject maps\mp\gametypes\_globallogic::stopTickingSound(); + level.bombDefused = true; + level notify("bomb_defused"); + + setGameEndTime( 0 ); + setDvar( "ui_bomb_timer", 0 ); + + wait 0.05; + + sd_endGame( game["defenders"], game["strings"]["bomb_defused"] ); +} \ No newline at end of file diff --git a/maps/mp/gametypes/war.gsc b/maps/mp/gametypes/war.gsc new file mode 100644 index 0000000..e694b1d --- /dev/null +++ b/maps/mp/gametypes/war.gsc @@ -0,0 +1,96 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + if(getdvar("mapname") == "mp_background") + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::SetupCallbacks(); + maps\mp\gametypes\_globallogic::SetupCallbacks(); + + level.teamBased = true; + level.onStartGameType = ::onStartGameType; + level.onSpawnPlayer = ::onSpawnPlayer; + level.onRoundSwitch = ::onRoundSwitch; +} + +onStartGameType() +{ + setClientNameMode("auto_change"); + maps\mp\gametypes\_globallogic::setObjectiveText( "allies", &"OBJECTIVES_WAR" ); + maps\mp\gametypes\_globallogic::setObjectiveText( "axis", &"OBJECTIVES_WAR" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_WAR_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_WAR_SCORE" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "allies", &"OBJECTIVES_WAR_HINT" ); + maps\mp\gametypes\_globallogic::setObjectiveHintText( "axis", &"OBJECTIVES_WAR_HINT" ); + + level.spawnMins = ( 0, 0, 0 ); + level.spawnMaxs = ( 0, 0, 0 ); + + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_allies_start" ); + maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_axis_start" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" ); + maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" ); + + level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); + setMapCenter( level.mapCenter ); + + allowed[0] = "war"; + + level.displayRoundEndText = false; + maps\mp\gametypes\_gameobjects::main(allowed); + + if ( level.roundLimit != 1 && level.numLives ) + { + level.overrideTeamScore = true; + level.displayRoundEndText = true; + level.onEndGame = ::onEndGame; + } +} + +onRoundSwitch() +{ + level.halftimeType = "halftime"; +} + +onSpawnPlayer() +{ + self.usingObj = undefined; + if ( level.inGracePeriod ) + { + spawnPoints = getentarray("mp_tdm_spawn_" + self.pers["team"] + "_start", "classname"); + + if ( !spawnPoints.size ) + spawnPoints = getentarray("mp_sab_spawn_" + self.pers["team"] + "_start", "classname"); + + if ( !spawnPoints.size ) + { + spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] ); + spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints ); + } + else + spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); + } + else + { + spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] ); + spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints ); + } + + self spawn( spawnPoint.origin, spawnPoint.angles ); +} + +onEndGame( winningTeam ) +{ + if ( isdefined( winningTeam ) && (winningTeam == "allies" || winningTeam == "axis") ) + [[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 ); +} \ No newline at end of file diff --git a/maps/mp/mp_backlot.gsc b/maps/mp/mp_backlot.gsc new file mode 100644 index 0000000..4e18ad8 --- /dev/null +++ b/maps/mp/mp_backlot.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_backlot"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 1.3; +} \ No newline at end of file diff --git a/maps/mp/mp_bloc.gsc b/maps/mp/mp_bloc.gsc new file mode 100644 index 0000000..6ccd897 --- /dev/null +++ b/maps/mp/mp_bloc.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_bloc"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 0.9; +} \ No newline at end of file diff --git a/maps/mp/mp_bog.gsc b/maps/mp/mp_bog.gsc new file mode 100644 index 0000000..9b8406d --- /dev/null +++ b/maps/mp/mp_bog.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_bog"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 0.8; +} \ No newline at end of file diff --git a/maps/mp/mp_broadcast.gsc b/maps/mp/mp_broadcast.gsc new file mode 100644 index 0000000..c20a813 --- /dev/null +++ b/maps/mp/mp_broadcast.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_broadcast"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 1.4; +} \ No newline at end of file diff --git a/maps/mp/mp_carentan.gsc b/maps/mp/mp_carentan.gsc new file mode 100644 index 0000000..a22ab7b --- /dev/null +++ b/maps/mp/mp_carentan.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_carentan"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "urban"; + game["axis_soldiertype"] = "urban"; + + level.sunlight = 0.75; +} \ No newline at end of file diff --git a/maps/mp/mp_cargoship.gsc b/maps/mp/mp_cargoship.gsc new file mode 100644 index 0000000..69a3f2b --- /dev/null +++ b/maps/mp/mp_cargoship.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_cargoship"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.3; +} \ No newline at end of file diff --git a/maps/mp/mp_citystreets.gsc b/maps/mp/mp_citystreets.gsc new file mode 100644 index 0000000..faabea6 --- /dev/null +++ b/maps/mp/mp_citystreets.gsc @@ -0,0 +1,26 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_citystreets"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 0.78; + + maps\mp\_explosive_barrels::main(); +} \ No newline at end of file diff --git a/maps/mp/mp_convoy.gsc b/maps/mp/mp_convoy.gsc new file mode 100644 index 0000000..a0a5254 --- /dev/null +++ b/maps/mp/mp_convoy.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_convoy"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 1.6; +} \ No newline at end of file diff --git a/maps/mp/mp_countdown.gsc b/maps/mp/mp_countdown.gsc new file mode 100644 index 0000000..29b85a5 --- /dev/null +++ b/maps/mp/mp_countdown.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_countdown"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.5; +} \ No newline at end of file diff --git a/maps/mp/mp_crash.gsc b/maps/mp/mp_crash.gsc new file mode 100644 index 0000000..52494fb --- /dev/null +++ b/maps/mp/mp_crash.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_crash"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 1.3; +} \ No newline at end of file diff --git a/maps/mp/mp_crash_snow.gsc b/maps/mp/mp_crash_snow.gsc new file mode 100644 index 0000000..62600ed --- /dev/null +++ b/maps/mp/mp_crash_snow.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_crash_snow"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 0.25; +} \ No newline at end of file diff --git a/maps/mp/mp_creek.gsc b/maps/mp/mp_creek.gsc new file mode 100644 index 0000000..f6596db --- /dev/null +++ b/maps/mp/mp_creek.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_creek"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.5; +} \ No newline at end of file diff --git a/maps/mp/mp_crossfire.gsc b/maps/mp/mp_crossfire.gsc new file mode 100644 index 0000000..4bfc90c --- /dev/null +++ b/maps/mp/mp_crossfire.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_crossfire"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 1; +} \ No newline at end of file diff --git a/maps/mp/mp_farm.gsc b/maps/mp/mp_farm.gsc new file mode 100644 index 0000000..a4d8077 --- /dev/null +++ b/maps/mp/mp_farm.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_farm"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1; +} \ No newline at end of file diff --git a/maps/mp/mp_killhouse.gsc b/maps/mp/mp_killhouse.gsc new file mode 100644 index 0000000..c9bff5e --- /dev/null +++ b/maps/mp/mp_killhouse.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_killhouse"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.5; +} \ No newline at end of file diff --git a/maps/mp/mp_overgrown.gsc b/maps/mp/mp_overgrown.gsc new file mode 100644 index 0000000..30b8f08 --- /dev/null +++ b/maps/mp/mp_overgrown.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_overgrown"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.1; +} \ No newline at end of file diff --git a/maps/mp/mp_pipeline.gsc b/maps/mp/mp_pipeline.gsc new file mode 100644 index 0000000..da91da2 --- /dev/null +++ b/maps/mp/mp_pipeline.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_pipeline"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.15; +} \ No newline at end of file diff --git a/maps/mp/mp_shipment.gsc b/maps/mp/mp_shipment.gsc new file mode 100644 index 0000000..3398460 --- /dev/null +++ b/maps/mp/mp_shipment.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_shipment"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.3; +} \ No newline at end of file diff --git a/maps/mp/mp_showdown.gsc b/maps/mp/mp_showdown.gsc new file mode 100644 index 0000000..7058676 --- /dev/null +++ b/maps/mp/mp_showdown.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_showdown"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 1.6; +} \ No newline at end of file diff --git a/maps/mp/mp_strike.gsc b/maps/mp/mp_strike.gsc new file mode 100644 index 0000000..0e688bf --- /dev/null +++ b/maps/mp/mp_strike.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_strike"); + + game["allies"] = "marines"; + game["axis"] = "opfor"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "desert"; + game["axis_soldiertype"] = "desert"; + + level.sunlight = 1; +} \ No newline at end of file diff --git a/maps/mp/mp_vacant.gsc b/maps/mp/mp_vacant.gsc new file mode 100644 index 0000000..76dc70c --- /dev/null +++ b/maps/mp/mp_vacant.gsc @@ -0,0 +1,24 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + maps\mp\_load::main(); + maps\mp\_compass::setupMiniMap("compass_map_mp_vacant"); + + game["allies"] = "sas"; + game["axis"] = "russian"; + game["attackers"] = "allies"; + game["defenders"] = "axis"; + game["allies_soldiertype"] = "woodland"; + game["axis_soldiertype"] = "woodland"; + + level.sunlight = 1.3; +} \ No newline at end of file diff --git a/mod.csv b/mod.csv new file mode 100644 index 0000000..ebaea0d --- /dev/null +++ b/mod.csv @@ -0,0 +1,124 @@ +# Copyright (c) 2009-2017 Andreas Göransson +# Copyright (c) 2009-2017 Indrek Ardel +# +# This file is part of Call of Duty 4 Promod. +# +# Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. +# Terms of license can be found in LICENSE.md document bundled with the project. + +localize,cgame + +menufile,ui_mp/promod.txt +menufile,ui_mp/scriptmenus/changeclass_marines_mw.menu +menufile,ui_mp/scriptmenus/changeclass_mw.menu +menufile,ui_mp/scriptmenus/changeclass_opfor_mw.menu +menufile,ui_mp/scriptmenus/class.menu +menufile,ui_mp/scriptmenus/demo.menu +menufile,ui_mp/scriptmenus/echo.menu +menufile,ui_mp/scriptmenus/quickpromod.menu +menufile,ui_mp/scriptmenus/quickpromodgfx.menu +menufile,ui_mp/scriptmenus/scoreboard.menu +menufile,ui_mp/scriptmenus/shoutcast.menu +menufile,ui_mp/scriptmenus/shoutcast_map.menu +menufile,ui_mp/scriptmenus/shoutcast_setup.menu +menufile,ui_mp/scriptmenus/shoutcast_setup_binds.menu +menufile,ui_mp/scriptmenus/team_marinesopfor.menu +menufile,ui_mp/scriptmenus/team_marinesopfor_flipped.menu + +rawfile,maps/createfx/mp_backlot_fx.gsc +rawfile,maps/createfx/mp_bloc_fx.gsc +rawfile,maps/createfx/mp_bog_fx.gsc +rawfile,maps/createfx/mp_broadcast_fx.gsc +rawfile,maps/createfx/mp_carentan_fx.gsc +rawfile,maps/createfx/mp_cargoship_fx.gsc +rawfile,maps/createfx/mp_citystreets_fx.gsc +rawfile,maps/createfx/mp_convoy_fx.gsc +rawfile,maps/createfx/mp_countdown_fx.gsc +rawfile,maps/createfx/mp_crash_fx.gsc +rawfile,maps/createfx/mp_crash_snow_fx.gsc +rawfile,maps/createfx/mp_creek_fx.gsc +rawfile,maps/createfx/mp_crossfire_fx.gsc +rawfile,maps/createfx/mp_farm_fx.gsc +rawfile,maps/createfx/mp_killhouse_fx.gsc +rawfile,maps/createfx/mp_overgrown_fx.gsc +rawfile,maps/createfx/mp_pipeline_fx.gsc +rawfile,maps/createfx/mp_shipment_fx.gsc +rawfile,maps/createfx/mp_showdown_fx.gsc +rawfile,maps/createfx/mp_strike_fx.gsc +rawfile,maps/createfx/mp_vacant_fx.gsc + +rawfile,maps/mp/_destructible.gsc +rawfile,maps/mp/_explosive_barrels.gsc +rawfile,maps/mp/_flashgrenades.gsc +rawfile,maps/mp/_load.gsc + +rawfile,maps/mp/gametypes/_class.gsc +rawfile,maps/mp/gametypes/_gameobjects.gsc +rawfile,maps/mp/gametypes/_globallogic.gsc +rawfile,maps/mp/gametypes/_healthoverlay.gsc +rawfile,maps/mp/gametypes/_hud.gsc +rawfile,maps/mp/gametypes/_hud_message.gsc +rawfile,maps/mp/gametypes/_killcam.gsc +rawfile,maps/mp/gametypes/_menus.gsc +rawfile,maps/mp/gametypes/_missions.gsc +rawfile,maps/mp/gametypes/_promod.gsc +rawfile,maps/mp/gametypes/_quickmessages.gsc +rawfile,maps/mp/gametypes/_rank.gsc +rawfile,maps/mp/gametypes/_scoreboard.gsc +rawfile,maps/mp/gametypes/_spawnlogic.gsc +rawfile,maps/mp/gametypes/_spectating.gsc +rawfile,maps/mp/gametypes/_teams.gsc +rawfile,maps/mp/gametypes/_weapons.gsc +rawfile,maps/mp/gametypes/dm.gsc +rawfile,maps/mp/gametypes/dom.gsc +rawfile,maps/mp/gametypes/koth.gsc +rawfile,maps/mp/gametypes/sab.gsc +rawfile,maps/mp/gametypes/sd.gsc +rawfile,maps/mp/gametypes/war.gsc + +rawfile,maps/mp/mp_backlot.gsc +rawfile,maps/mp/mp_bloc.gsc +rawfile,maps/mp/mp_bog.gsc +rawfile,maps/mp/mp_broadcast.gsc +rawfile,maps/mp/mp_carentan.gsc +rawfile,maps/mp/mp_cargoship.gsc +rawfile,maps/mp/mp_citystreets.gsc +rawfile,maps/mp/mp_convoy.gsc +rawfile,maps/mp/mp_countdown.gsc +rawfile,maps/mp/mp_crash.gsc +rawfile,maps/mp/mp_crash_snow.gsc +rawfile,maps/mp/mp_creek.gsc +rawfile,maps/mp/mp_crossfire.gsc +rawfile,maps/mp/mp_farm.gsc +rawfile,maps/mp/mp_killhouse.gsc +rawfile,maps/mp/mp_overgrown.gsc +rawfile,maps/mp/mp_pipeline.gsc +rawfile,maps/mp/mp_shipment.gsc +rawfile,maps/mp/mp_showdown.gsc +rawfile,maps/mp/mp_strike.gsc +rawfile,maps/mp/mp_vacant.gsc + +rawfile,mp/playeranim.script + +rawfile,promod/client.gsc +rawfile,promod/comp.gsc +rawfile,promod/dvarmon.gsc +rawfile,promod/messagecenter.gsc +rawfile,promod/modes.gsc +rawfile,promod/readyup.gsc +rawfile,promod/scorebot.gsc +rawfile,promod/servercheck.gsc +rawfile,promod/setvariables.gsc +rawfile,promod/shoutcast.gsc +rawfile,promod/stratmode.gsc +rawfile,promod/strattime.gsc +rawfile,promod/timeout.gsc + +rawfile,shock/damage_mp.shock + +sound,promod,,all_mp + +stringtable,promod/customStatsTable.csv +stringtable,promod/destructible.csv + +xmodel,com_floodlight_on \ No newline at end of file diff --git a/mp/playeranim.script b/mp/playeranim.script new file mode 100644 index 0000000..5d1de4a --- /dev/null +++ b/mp/playeranim.script @@ -0,0 +1,1558 @@ +DEFINES + +set weaponclass autofire = mg AND smg +set movetype moving = walk AND walkcr AND walkcrbk AND walkbk AND run AND runbk AND runcr AND runcrbk AND walkprone AND walkpronebk +set movetype crouching = idlecr AND runcr AND runcrbk AND walkcr AND walkcrbk +set movetype prone = idleprone AND walkprone AND walkpronebk +set movetype backstep = walkbk AND runbk AND walkcrbk AND walkpronebk + +ANIMATIONS + +STATE COMBAT +{ + idle + { + mounted mg42, firing + { + both standSAWgunner_aim turretanim + } + mounted mg42 + { + both standSAWgunner_aim turretanim + } + perk laststand + { + both pb_laststand_idle + } + playerAnimType none + { + both pb_stand_alert + } + playerAnimType briefcase + { + both pb_stand_bombplant + } + playerAnimType hold + { + both pb_hold_idle + } + weaponclass pistol, weapon_position ads + { + both pb_stand_ads_pistol + } + weaponclass pistol + { + both pb_stand_alert_pistol + } + weaponclass rocketlauncher, weapon_position ads + { + both pb_stand_ads_RPG + } + weaponclass rocketlauncher + { + both pb_stand_alert_RPG + } + weapon_position ads + { + both pb_stand_ads + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_stand_grenade_pullpin + } + default + { + both pb_stand_alert + } + } + idlecr + { + mounted mg42, firing + { + both crouchSAWgunner_aim turretanim + } + mounted mg42 + { + both crouchSAWgunner_aim turretanim + } + perk laststand + { + both pb_laststand_idle + } + playerAnimType none + { + both pb_crouch_bombplant + } + playerAnimType briefcase + { + both pb_crouch_bombplant + } + playerAnimType hold + { + both pb_crouch_hold_idle + } + weaponclass pistol, weapon_position ads + { + both pb_crouch_ads_pistol + } + weaponclass pistol + { + both pb_crouch_alert_pistol + } + weaponclass rocketlauncher, weapon_position ads + { + both pb_crouch_ads_RPG + } + weaponclass rocketlauncher + { + both pb_crouch_alert_RPG + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_crouch_grenade_pullpin + } + weapon_position ads + { + both pb_crouch_ads + } + default + { + both pb_crouch_alert + } + } + idleprone + { + mounted mg42, firing + { + both proneSAWgunner_aim turretanim + } + mounted mg42 + { + both proneSAWgunner_aim turretanim + } + perk laststand + { + both pb_laststand_idle + } + playerAnimType briefcase + { + both pb_prone_bombplant + } + playerAnimType hold + { + both pb_prone_hold + } + playerAnimType none + { + both pb_prone_bombplant + } + weaponclass pistol + { + both pb_prone_aim_pistol + } + weaponclass rocketlauncher + { + both pb_prone_aim_RPG + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_prone_aim_grenade + } + default + { + both pb_prone_aim + } + } + flinch_forward + { + weaponclass pistol + { + } + weaponclass grenade, playerAnimType all NOT m203 + { + } + default + { + } + } + flinch_backward + { + weaponclass pistol + { + } + weaponclass grenade, playerAnimType all NOT m203 + { + } + default + { + } + } + flinch_left + { + weaponclass pistol + { + } + weaponclass grenade, playerAnimType all NOT m203 + { + } + default + { + } + } + flinch_right + { + weaponclass pistol + { + } + weaponclass grenade, playerAnimType all NOT m203 + { + } + default + { + } + } + stumble_forward + { + weaponclass pistol, strafing left + { + both pb_stumble_pistol_left + } + weaponclass pistol, strafing right + { + both pb_stumble_pistol_right + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_stumble_grenade_left + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_stumble_grenade_right + } + weaponclass pistol + { + both pb_stumble_pistol_forward + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_stumble_grenade_forward + } + strafing left + { + both pb_stumble_left + } + strafing right + { + both pb_stumble_right + } + default + { + both pb_stumble_forward + } + } + stumble_backward + { + weaponclass pistol, strafing left + { + both pb_stumble_pistol_left + } + weaponclass pistol, strafing right + { + both pb_stumble_pistol_right + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_stumble_grenade_left + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_stumble_grenade_right + } + weaponclass pistol + { + both pb_stumble_pistol_back + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_stumble_grenade_back + } + strafing left + { + both pb_stumble_left + } + strafing right + { + both pb_stumble_right + } + default + { + both pb_stumble_back + } + } + stumble_walk_forward + { + weaponclass pistol AND grenade, strafing left, playerAnimType all NOT m203 + { + both pb_stumble_pistol_walk_left + } + weaponclass pistol AND grenade, strafing right, playerAnimType all NOT m203 + { + both pb_stumble_pistol_walk_right + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + both pb_stumble_pistol_walk_forward + } + strafing left + { + both pb_stumble_walk_left + } + strafing right + { + both pb_stumble_walk_right + } + default + { + both pb_stumble_walk_forward + } + } + stumble_walk_backward + { + weaponclass pistol AND grenade, strafing left, playerAnimType all NOT m203 + { + both pb_stumble_pistol_walk_left + } + weaponclass pistol AND grenade, strafing right, playerAnimType all NOT m203 + { + both pb_stumble_pistol_walk_right + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + both pb_stumble_pistol_walk_back + } + strafing left + { + both pb_stumble_walk_left + } + strafing right + { + both pb_stumble_walk_right + } + default + { + both pb_stumble_walk_back + } + } + stumble_crouch_forward + { + weaponclass pistol AND grenade, strafing left, playerAnimType all NOT m203 + { + both pb_stumble_pistol_left + } + weaponclass pistol AND grenade, strafing right, playerAnimType all NOT m203 + { + both pb_stumble_pistol_right + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + both pb_stumble_pistol_forward + } + strafing left + { + both pb_stumble_left + } + strafing right + { + both pb_stumble_right + } + default + { + both pb_stumble_forward + } + } + stumble_crouch_backward + { + weaponclass pistol AND grenade, strafing left, playerAnimType all NOT m203 + { + both pb_stumble_pistol_left + } + weaponclass pistol AND grenade, strafing right, playerAnimType all NOT m203 + { + both pb_stumble_pistol_right + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + both pb_stumble_pistol_back + } + strafing left + { + both pb_stumble_left + } + strafing right + { + both pb_stumble_right + } + default + { + both pb_stumble_back + } + } + walk + { + playerAnimType none + { + both pb_stand_shoot_walk_forward_unarmed + } + playerAnimType hold + { + both pb_hold_run + } + weaponclass rocketlauncher, strafing left + { + both pb_walk_left_RPG_ads + } + weaponclass rocketlauncher, strafing right + { + both pb_walk_right_RPG_ads + } + weaponclass rocketlauncher + { + both pb_walk_forward_RPG_ads + } + weaponclass pistol , strafing left + { + both pb_combatwalk_left_loop_pistol + } + weaponclass pistol, strafing right + { + both pb_combatwalk_right_loop_pistol + } + weaponclass pistol + { + both pb_combatwalk_forward_loop_pistol + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_combatrun_left_loop_grenade + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_combatrun_right_loop_grenade + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_combatrun_forward_loop_stickgrenade + } + strafing left + { + both pb_stand_shoot_walk_left + } + strafing right + { + both pb_stand_shoot_walk_right + } + default + { + both pb_stand_shoot_walk_forward + } + } + walkbk + { + playerAnimType none + { + both pb_stand_shoot_walk_forward_unarmed + } + playerAnimType hold + { + both pb_hold_run_back + } + weaponclass rocketlauncher + { + both pb_walk_back_RPG_ads + } + weaponclass pistol, strafing left + { + both pb_combatwalk_left_loop_pistol + } + weaponclass pistol, strafing right + { + both pb_combatwalk_right_loop_pistol + } + weaponclass pistol + { + both pb_combatwalk_back_loop_pistol + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_combatrun_back_loop_grenade + } + strafing left + { + both pb_stand_shoot_walk_left + } + strafing right + { + both pb_stand_shoot_walk_right + } + default + { + both pb_stand_shoot_walk_back + } + } + walkcr + { + playerAnimType none + { + both pb_crouch_walk_forward_unarmed + } + playerAnimType hold, strafing left + { + both pb_crouch_hold_run_left + } + playerAnimType hold, strafing right + { + both pb_crouch_hold_run_right + } + playerAnimType hold + { + both pb_crouch_hold_run + } + weaponclass rocketlauncher, strafing left + { + both pb_crouch_walk_left_RPG + } + weaponclass rocketlauncher, strafing right + { + both pb_crouch_walk_right_RPG + } + weaponclass rocketlauncher + { + both pb_crouch_walk_forward_RPG + } + weaponclass pistol AND grenade, strafing left, playerAnimType all NOT m203 + { + both pb_crouch_walk_left_pistol + } + weaponclass pistol AND grenade, strafing right, playerAnimType all NOT m203 + { + both pb_crouch_walk_right_pistol + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + both pb_crouch_walk_forward_pistol + } + strafing left + { + both pb_crouch_shoot_run_left + } + strafing right + { + both pb_crouch_shoot_run_right + } + default + { + both pb_crouch_shoot_run_forward + } + } + walkcrbk + { + playerAnimType none + { + both pb_crouch_walk_forward_unarmed + } + playerAnimType hold + { + both pb_crouch_hold_run_back + } + weaponclass rocketlauncher + { + both pb_crouch_walk_back_RPG + } + weaponclass pistol AND grenade, strafing left, playerAnimType all NOT m203 + { + both pb_crouch_walk_left_pistol + } + weaponclass pistol AND grenade, strafing right, playerAnimType all NOT m203 + { + both pb_crouch_walk_right_pistol + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + both pb_crouch_walk_back_pistol + } + strafing left + { + both pb_crouch_shoot_run_left + } + strafing right + { + both pb_crouch_shoot_run_right + } + default + { + both pb_crouch_shoot_run_back + } + } + walkprone + { + weaponclass pistol, strafing left + { + both pb_prone_crawl_left + } + weaponclass pistol, strafing right + { + both pb_prone_crawl_right + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_prone_grenade_crawl_left + } + playerAnimType hold, strafing left + { + both pb_prone_crawl_left_hold + } + playerAnimType hold, strafing right + { + both pb_prone_crawl_right_hold + } + playerAnimType hold + { + both pb_prone_crawl_hold + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_prone_grenade_crawl_right + } + weaponclass pistol + { + both pb_prone_crawl + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_prone_grenade_crawl + } + strafing left + { + both pb_prone_crawl_left + } + strafing right + { + both pb_prone_crawl_right + } + default + { + both pb_prone_crawl + } + } + walkpronebk + { + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_prone_grenade_crawl_left + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_prone_grenade_crawl_right + } + playerAnimType hold + { + both pb_prone_crawl_back_hold + } + weaponclass pistol + { + both pb_prone_crawl_back + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_prone_grenade_crawl_back + } + default + { + both pb_prone_crawl_back + } + } + run + { + playerAnimType none + { + both pb_pistol_run_fast + } + playerAnimType hold, strafing left + { + both pb_hold_run_left + } + playerAnimType hold, strafing right + { + both pb_hold_run_right + } + playerAnimType hold + { + both pb_hold_run + } + weaponclass rocketlauncher, strafing left + { + both pb_combatrun_left_RPG + } + weaponclass rocketlauncher, strafing right + { + both pb_combatrun_right_RPG + } + weaponclass rocketlauncher + { + both pb_combatrun_forward_RPG + } + weaponclass pistol, strafing left + { + both pb_combatrun_left_loop_pistol + } + weaponclass pistol, strafing right + { + both pb_combatrun_right_loop_pistol + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_combatrun_left_loop_grenade + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_combatrun_right_loop_grenade + } + strafing left + { + both pb_combatrun_left_loop + } + strafing right + { + both pb_combatrun_right_loop + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_combatrun_forward_loop_stickgrenade + } + weaponclass pistol + { + both pb_pistol_run_fast + } + default + { + both pb_combatrun_forward_loop + } + } + stumble_sprint_forward + { + default + { + both pb_stumble_forward + } + } + sprint + { + playerAnimType none + { + both pb_sprint + } + playerAnimType hold + { + both pb_sprint_hold + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_sprint + } + weaponclass pistol + { + both pb_sprint_pistol + } + weaponclass rocketlauncher + { + both pb_sprint_RPG + } + default + { + both pb_sprint + } + } + runbk + { + playerAnimType none + { + both pb_combatrun_back_loop_grenade + } + playerAnimType hold + { + both pb_hold_run_back + } + weaponclass pistol, strafing left + { + both pb_combatrun_left_loop_pistol + } + weaponclass pistol, strafing right + { + both pb_combatrun_right_loop_pistol + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_combatrun_left_loop_grenade + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_combatrun_right_loop_grenade + } + weaponclass pistol + { + both pb_combatrun_back_loop_pistol + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_combatrun_back_loop_grenade + } + weaponclass rocketlauncher + { + both pb_combatrun_back_RPG + } + strafing left + { + both pb_combatrun_left_loop + } + strafing right + { + both pb_combatrun_right_loop + } + default + { + both pb_combatrun_back_loop + } + } + runcr + { + playerAnimType none + { + both pb_crouch_run_forward_grenade + } + weaponclass rocketlauncher, strafing left + { + both pb_crouch_run_left_RPG + } + weaponclass rocketlauncher, strafing right + { + both pb_crouch_run_right_RPG + } + weaponclass rocketlauncher + { + both pb_crouch_run_forward_RPG + } + weaponclass pistol, strafing left + { + both pb_crouch_run_left_pistol + } + weaponclass pistol, strafing right + { + both pb_crouch_run_right_pistol + } + playerAnimType hold, strafing left + { + both pb_crouch_hold_run_left + } + playerAnimType hold, strafing right + { + both pb_crouch_hold_run_right + } + playerAnimType hold + { + both pb_crouch_hold_run + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_crouch_run_left_grenade + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_crouch_run_right_grenade + } + weaponclass pistol + { + both pb_crouch_run_forward_pistol + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_crouch_run_forward_grenade + } + strafing left + { + both pb_crouch_run_left + } + strafing right + { + both pb_crouch_run_right + } + default + { + both pb_crouch_run_forward + } + } + runcrbk + { + playerAnimType none + { + both pb_crouch_run_back_grenade + } + weaponclass rocketlauncher + { + both pb_crouch_run_back_RPG + } + weaponclass pistol, strafing left + { + both pb_crouch_run_left_pistol + } + weaponclass pistol, strafing right + { + both pb_crouch_run_right_pistol + } + playerAnimType hold + { + both pb_crouch_hold_run_back + } + weaponclass grenade, strafing left, playerAnimType all NOT m203 + { + both pb_crouch_run_left_grenade + } + weaponclass grenade, strafing right, playerAnimType all NOT m203 + { + both pb_crouch_run_right_grenade + } + weaponclass pistol + { + both pb_crouch_run_back_pistol + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_crouch_run_back_grenade + } + strafing left + { + both pb_crouch_run_left + } + strafing right + { + both pb_crouch_run_right + } + default + { + both pb_crouch_run_back + } + } + climbup + { + default + { + both pb_climbup + } + } + climbdown + { + default + { + both pb_climbdown + } + } + turnrightcr + { + movetype idlecr AND turnrightcr + { + legs pl_crouchturn_90right + } + } + turnleftcr + { + movetype idlecr AND turnleftcr + { + legs pl_crouchturn_90left + } + } + mantle_up_57 + { + default + { + both mp_mantle_up_57 + } + } + mantle_up_51 + { + default + { + both mp_mantle_up_51 + } + } + mantle_up_45 + { + default + { + both mp_mantle_up_45 + } + } + mantle_up_39 + { + default + { + both mp_mantle_up_39 + } + } + mantle_up_33 + { + default + { + both mp_mantle_up_33 + } + } + mantle_up_27 + { + default + { + legs mp_mantle_up_27 + } + } + mantle_up_21 + { + default + { + legs mp_mantle_up_21 + } + } + mantle_over_high + { + default + { + both mp_mantle_over_high + } + } + mantle_over_mid + { + default + { + both mp_mantle_over_mid + } + } + mantle_over_low + { + default + { + legs mp_mantle_over_low + } + } +} + +EVENTS + +fireweapon +{ + mounted mg42 + { + } + perk laststand + { + torso pt_laststand_fire + } + weaponclass pistol, movetype prone + { + torso pt_prone_shoot_pistol + } + weaponclass pistol, movetype moving + { + } + weaponclass pistol, movetype crouching, weapon_position ads + { + torso pt_crouch_shoot_ads_pistol + } + weaponclass pistol, movetype crouching + { + torso pt_crouch_shoot_pistol + } + weaponclass pistol, weapon_position ads + { + torso pb_stand__shoot_ads_pistol + } + weaponclass pistol + { + torso pt_stand_shoot_pistol + } + weaponclass autofire, movetype prone + { + torso pt_prone_shoot_auto duration 150 + } + weaponclass autofire, movetype moving + { + } + weaponclass autofire, movetype crouching, weapon_position ads + { + torso pt_crouch_shoot_auto_ads duration 150 + } + weaponclass autofire, movetype crouching + { + torso pt_crouch_shoot_auto duration 150 + } + weaponclass autofire, weapon_position ads + { + torso pt_stand_shoot_auto_ads duration 150 + } + weaponclass autofire + { + torso pt_stand_shoot_auto duration 150 + } + weaponclass rocketlauncher, movetype moving + { + } + weaponclass rocketlauncher, movetype crouching + { + torso pt_crouch_shoot_ads + } + weaponclass rocketlauncher, movetype prone + { + torso pt_prone_shoot_RPG + } + weaponclass rocketlauncher + { + torso pt_stand_shoot_RPG + } + weaponclass grenade, movetype prone, playerAnimType hold + { + torso pt_hold_prone_throw + } + weaponclass grenade, movetype idlecr, playerAnimType hold + { + torso pt_hold_throw + } + weaponclass grenade, playerAnimType hold + { + torso pt_hold_throw + } + weaponclass grenade, movetype prone, playerAnimType all NOT m203 + { + torso pt_prone_grenade_throw + } + weaponclass grenade, movetype idlecr, playerAnimType all NOT m203 + { + both pb_crouch_grenade_throw + } + weaponclass grenade, movetype crouching, playerAnimType all NOT m203 + { + torso pt_crouch_grenade_throw + } + weaponclass grenade, movetype idle, playerAnimType all NOT m203 + { + both pb_stand_grenade_throw blendtime 10 + } + weaponclass grenade, playerAnimType all NOT m203 + { + torso pt_stand_grenade_throw blendtime 10 + } + playerAnimType sniper, movetype prone + { + torso pt_prone_shoot_auto + } + playerAnimType sniper, movetype moving + { + } + playerAnimType sniper, movetype crouching, weapon_position ads + { + torso pt_crouch_shoot_ads + } + playerAnimType sniper, movetype crouching + { + torso pt_crouch_shoot + } + playerAnimType sniper, weapon_position ads + { + torso pt_rifle_fire_ads + } + playerAnimType sniper + { + torso pt_rifle_fire + } + playerAnimType other, movetype prone + { + torso pt_prone_shoot_auto + } + playerAnimType other + { + torso pt_stand_shoot_shotgun + } + movetype prone + { + torso pt_prone_shoot_auto + } + movetype moving + { + } + movetype crouching, weapon_position ads + { + torso pt_crouch_shoot_ads + } + movetype crouching + { + torso pt_crouch_shoot + } + weapon_position ads + { + torso pt_stand_shoot_ads + } + default + { + torso pt_stand_shoot + } +} + +prone_to_crouch +{ + movetype moving + { + both pb_prone2crouchrun + } + default + { + both pb_prone2crouch + } +} + +crouch_to_prone +{ + default + { + both pb_crouch2prone + } +} + +meleeattack +{ + weaponclass pistol AND grenade, movetype prone, playerAnimType all NOT m203 + { + torso pt_melee_prone_pistol + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + torso pt_melee_prone_pistol + } + movetype prone + { + torso pt_melee_prone + } + movetype crouching + { + torso pt_melee_crouch_left2left + torso pt_melee_crouch_left2right + torso pt_melee_crouch_right2left + } + default + { + torso pt_melee_right2right_1 duration 400 + torso pt_melee_right2right_2 duration 400 + torso pt_melee_right2left duration 300 + torso pt_melee_left2left_1 duration 400 + torso pt_melee_left2right duration 300 + } +} + +knife_melee +{ + movetype prone + { + torso pt_melee_prone_pistol + } + default + { + torso pt_melee_pistol_1 + } +} + +knife_melee_charge +{ + movetype prone + { + torso pt_melee_prone_pistol + } + default + { + torso pt_melee_pistol_2 + } +} + +dropweapon +{ + movetype prone + { + torso pt_prone_pullout_pose + } + movetype crouching + { + torso pt_crouch_pullout_pose + } + default + { + torso pt_stand_pullout_pose + } +} + +raiseweapon +{ +} + +reload +{ + perk laststand + { + torso pt_laststand_reload + } + weaponclass pistol, movetype idlecr + { + torso pt_reload_crouch_pistol + } + weaponclass pistol, movetype crouching + { + torso pt_reload_crouchwalk_pistol + } + weaponclass pistol, movetype prone + { + torso pt_reload_prone_pistol + } + weaponclass rocketlauncher, movetype prone + { + torso pt_reload_prone_RPG + } + weaponclass rocketlauncher + { + torso pt_reload_stand_RPG + } + weaponclass pistol + { + torso pt_reload_stand_pistol + } + playerAnimType smg, movetype prone + { + torso pt_reload_prone_auto + } + playerAnimType smg, movetype idlecr + { + torso pt_reload_stand_auto_mp40 + } + playerAnimType smg, movetype crouching + { + torso pt_reload_crouchwalk + } + playerAnimType smg + { + torso pt_reload_stand_auto_mp40 + } + playerAnimType autorifle, movetype prone + { + torso pt_reload_prone_auto + } + playerAnimType autorifle, movetype idlecr + { + torso pt_reload_crouch_rifle + } + playerAnimType autorifle, movetype crouching + { + torso pt_reload_crouchwalk + } + playerAnimType autorifle + { + torso pt_reload_stand_auto + } + movetype idlecr + { + torso pt_reload_crouch_rifle + } + movetype crouching + { + torso pt_reload_crouch_rifle + } + movetype prone + { + torso pt_reload_prone_auto + } + default + { + torso pt_reload_stand_rifle + } +} + +jump +{ + playerAnimType none, movetype run + { + both pb_runjump_takeoff duration 5 blendtime 100 + } + playerAnimType none + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher, movetype run + { + both pb_runjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + movetype run + { + both pb_runjump_takeoff duration 5 blendtime 100 + } + default + { + both pb_standjump_takeoff duration 5 blendtime 100 + } +} + +jumpbk +{ + movetype crouching AND prone + { + both pb_chicken_dance_crouch duration 5 blendtime 100 + } + playerAnimType none, movetype run + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + playerAnimType none + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher, movetype run + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + weaponclass grenade, movetype run, playerAnimType all NOT m203 + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + weaponclass grenade, playerAnimType all NOT m203 + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + movetype run + { + both pb_standjump_takeoff duration 5 blendtime 100 + } + default + { + both pb_standjump_takeoff duration 5 blendtime 100 + } +} + +land +{ + movetype run + { + both pb_runjump_land duration 100 blendtime 50 + } + weaponclass pistol AND grenade, playerAnimType all NOT m203 + { + both pb_standjump_land_pistol duration 5 + } + default + { + both pb_standjump_land duration 100 blendtime 50 + } +} + +shellshock +{ + movetype prone + { + } + movetype moving + { + torso pb_stand_shellshock duration 5000 blendtime 50 + } + movetype idle + { + torso pb_stand_shellshock duration 5000 blendtime 50 + } + movetype crouching + { + torso pb_stand_shellshock duration 5000 blendtime 50 + } +} + +DEATH +{ + movetype crouching, perk laststand + { + both pb_laststand_death + } + movetype prone, perk laststand + { + both pb_laststand_death + } + perk laststand + { + both pb_laststand_death + } + movetype prone + { + both pb_prone_death_quickdeath + } + movetype idlecr + { + both pb_crouch_death_headshot_front + both pb_crouch_death_clutchchest + both pb_crouch_death_flip + both pb_crouch_death_fetal + both pb_crouch_death_falltohands + } + movetype runbk + { + both pb_death_run_back + } + movetype run AND runcr, strafing left + { + both pb_death_run_left + } + movetype run AND runcr, strafing right + { + both pb_death_run_right + } + movetype runcr + { + both pb_crouchrun_death_drop + both pb_crouchrun_death_crumple + } + movetype run + { + both pb_death_run_forward_crumple + both pb_death_run_onfront + both pb_death_run_stumble + } + default + { + both pb_stand_death_neckdeath + both pb_stand_death_headchest_topple + both pb_stand_death_frontspin + both pb_stand_death_nervedeath + both pb_stand_death_legs + both pb_stand_death_lowerback + both pb_stand_death_head_collapse + both pb_stand_death_neckdeath_thrash + } +} + +pain +{ + movetype prone + { + both pb_prone_painA_holdchest + both pb_prone_painB_holdhead + } + movetype crouching + { + both pb_crouch_pain_holdStomach + } + default + { + both pb_crouch_pain_holdStomach + } +} \ No newline at end of file diff --git a/pb/pbsvuser.cfg b/pb/pbsvuser.cfg new file mode 100644 index 0000000..8082f63 --- /dev/null +++ b/pb/pbsvuser.cfg @@ -0,0 +1,2 @@ +pb_sv_load stock_iwd_md5.cfg // stock-iwd checksum control, remove the "//" to enable and put stock_iwd_md5.cfg in your pb folder +pb_sv_load promod_iwd_md5.cfg // promod-iwd-file checksum control, remove the "//" to enable and put promod_iwd_md5.cfg in your pb folder \ No newline at end of file diff --git a/pb/promod_iwd_md5.cfg b/pb/promod_iwd_md5.cfg new file mode 100644 index 0000000..9ae10d0 --- /dev/null +++ b/pb/promod_iwd_md5.cfg @@ -0,0 +1 @@ +pb_sv_md5tool a "" v pml220.iwd SZ276308 AT0 LEN2048 21D42AD2AA596B92C6AFB0B25C1BC9AB diff --git a/pb/stock_iwd_md5.cfg b/pb/stock_iwd_md5.cfg new file mode 100644 index 0000000..5637114 --- /dev/null +++ b/pb/stock_iwd_md5.cfg @@ -0,0 +1,14 @@ +pb_sv_md5tool a "" v main/iw_00.iwd SZ167780172 AT0 LEN2048 BC02FE65F2C013DB4C1480D59F1CB93F +pb_sv_md5tool a "" v main/iw_01.iwd SZ167885112 AT0 LEN2048 "55EFD479424E487756BC3EE3A7AF3799 4FDB703797393D3493E4B4BAE0B0A3CF" +pb_sv_md5tool a "" v main/iw_02.iwd SZ166957774 AT0 LEN2048 "8067C044C6A133C2F5D1B3E2B3E59CDC 1438B3EAED4FD8D654326933263C6C9F" +pb_sv_md5tool a "" v main/iw_03.iwd SZ166904484 AT0 LEN2048 "724442AC8D8E6415425C0B3E9FE6AC5A E47150F42B30F5F4F928F7AA8B6ACBEC" +pb_sv_md5tool a "" v main/iw_04.iwd SZ167682009 AT0 LEN2048 "5688EA7D04308440876DE31B84484419 70199C90F845078AE6B3EC53DAA1BDF8" +pb_sv_md5tool a "" v main/iw_05.iwd SZ167489996 AT0 LEN2048 "4865724D59BB73514DCBF557A9B21CFE A74997AFC0FE4A2BB9E9CB78DD0E1C05" +pb_sv_md5tool a "" v main/iw_06.iwd SZ167754503 AT0 LEN2048 "8CD0E80D88FD95AE3D5DF80D0AD29EB7 D74754503B511CDCA5B146DB3D9A24E8" +pb_sv_md5tool a "" v main/iw_07.iwd SZ162987361 AT0 LEN2048 E20C159359BED1E6BD9C23FC6D52631F +pb_sv_md5tool a "" v main/iw_08.iwd SZ167544651 AT0 LEN2048 F5B2959EDFED674AB47E59CFA1B2A3DA +pb_sv_md5tool a "" v main/iw_09.iwd SZ167076481 AT0 LEN2048 310374CB0F5ABF3880AEE5798FE269C9 +pb_sv_md5tool a "" v main/iw_10.iwd SZ165389824 AT0 LEN2048 9D53044FAD09B8BAF10FE4E9F08DFA59 +pb_sv_md5tool a "" v main/iw_11.iwd SZ151420446 AT0 LEN2048 3D429842C2F904EB13C5129E8A77582B +pb_sv_md5tool a "" v main/iw_12.iwd SZ5559373 AT0 LEN2048 6A0F0960BA6BCE04A8134A5B2E88D3EE +pb_sv_md5tool a "" v main/iw_13.iwd SZ28644036 AT0 LEN2048 89BD98431CD72ED0FD3E08DB87952BD5 \ No newline at end of file diff --git a/promod/client.gsc b/promod/client.gsc new file mode 100644 index 0000000..704c42e --- /dev/null +++ b/promod/client.gsc @@ -0,0 +1,92 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +get_config( dataName ) +{ + return self getStat( int( tableLookup( "promod/customStatsTable.csv", 1, dataName, 0 ) ) ); +} + +set_config( dataName, value ) +{ + self setStat( int( tableLookup( "promod/customStatsTable.csv", 1, dataName, 0 ) ), value ); + return value; +} + +toggle(name) +{ + return self set_config( name, int(!self get_config(name)) ); +} + +loopthrough(name, limit) +{ + value = self get_config(name)+1; + if(value > limit) value = 0; + return self set_config(name, value); +} + +setsunlight(n) +{ + sl = 0; + slsetting = "Off"; + if ( !n ) + { + sl = 1.2; + slsetting = 1.2; + } + else if ( n == 1 && isDefined(level.sunlight) ) + { + slsetting = "Stock"; + sl = level.sunlight; + } + self setclientdvars("r_lighttweaksunlight", sl, "sunlight", slsetting); +} + +use_config() +{ + self setsunlight(self get_config("PROMOD_SUNLIGHT")); + self setClientDvars( + "aim_automelee_enabled", 0, + "aim_automelee_range", 0, + "dynent_active", 0, + "snaps", 30, + "cg_nopredict", 0, + "cg_crosshairenemycolor", 0, + "sm_enable", 0, + "r_dlightlimit", 0, + "r_lodscalerigid", 1, + "r_lodscaleskinned", 1, + "cg_drawcrosshairnames", 0, + "cg_descriptivetext", 0, + "cg_viewzsmoothingmin", 1, + "cg_viewzsmoothingmax", 16, + "cg_viewzsmoothingtime", 0.1, + "cg_huddamageiconheight", 64, + "cg_huddamageiconwidth", 128, + "cg_huddamageiconinscope", 0, + "cg_huddamageiconoffset", 128, + "cg_huddamageicontime", 2000, + "ragdoll_enable", 0, + "r_filmtweakinvert", 0, + "r_desaturation", 0, + "r_dlightlimit", 0, + "r_fog", 0, + "r_specularcolorscale", 0, + "r_zfeather", 0, + "fx_drawclouds", 0, + "rate", 25000, + "cl_maxpackets", 100, + "developer", 0, + "phys_gravity", -800, + "r_normalmap", self get_config("PROMOD_NORMALMAP"), + "r_texfilterdisable", self get_config("PROMOD_TEXTURE"), + "r_filmusetweaks", self get_config("PROMOD_FILMTWEAK"), + "r_blur", 0.2*self get_config("PROMOD_GFXBLUR"), + "cg_fovscale", 1+int(!self get_config("PROMOD_FOVSCALE"))*0.125); +} \ No newline at end of file diff --git a/promod/comp.gsc b/promod/comp.gsc new file mode 100644 index 0000000..d4cd87c --- /dev/null +++ b/promod/comp.gsc @@ -0,0 +1,189 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + setDvar( "scr_sd_bombtimer", 45 ); + setDvar( "scr_sd_defusetime", 7 ); + setDvar( "scr_sd_multibomb", 0 ); + setDvar( "scr_sd_numlives", 1 ); + setDvar( "scr_sd_planttime", 5 ); + setDvar( "scr_sd_playerrespawndelay", 0 ); + setDvar( "scr_sd_roundlimit", 20 ); + setDvar( "scr_sd_roundswitch", 10 ); + setDvar( "scr_sd_scorelimit", 0 ); + setDvar( "scr_sd_timelimit", 1.75 ); + setDvar( "scr_sd_waverespawndelay", 0 ); + + setDvar( "scr_dom_numlives", 0 ); + setDvar( "scr_dom_playerrespawndelay", 7 ); + setDvar( "scr_dom_roundlimit", 2 ); + setDvar( "scr_dom_roundswitch", 1 ); + setDvar( "scr_dom_scorelimit", 0 ); + setDvar( "scr_dom_timelimit", 15 ); + setDvar( "scr_dom_waverespawndelay", 0 ); + + setDvar( "koth_autodestroytime", 120 ); + setDvar( "koth_capturetime", 20 ); + setDvar( "koth_delayPlayer", 0 ); + setDvar( "koth_destroytime", 10 ); + setDvar( "koth_kothmode", 0 ); + setDvar( "koth_spawnDelay", 45 ); + setDvar( "koth_spawntime", 10 ); + setDvar( "scr_koth_numlives", 0 ); + setDvar( "scr_koth_playerrespawndelay", 0 ); + setDvar( "scr_koth_roundlimit", 2 ); + setDvar( "scr_koth_roundswitch", 1 ); + setDvar( "scr_koth_scorelimit", 0 ); + setDvar( "scr_koth_timelimit", 20 ); + setDvar( "scr_koth_waverespawndelay", 0 ); + + setDvar( "scr_sab_bombtimer", 45 ); + setDvar( "scr_sab_defusetime", 5 ); + setDvar( "scr_sab_hotpotato", 0 ); + setDvar( "scr_sab_numlives", 0 ); + setDvar( "scr_sab_planttime", 5 ); + setDvar( "scr_sab_playerrespawndelay", 7 ); + setDvar( "scr_sab_roundlimit", 4 ); + setDvar( "scr_sab_roundswitch", 2 ); + setDvar( "scr_sab_scorelimit", 0 ); + setDvar( "scr_sab_timelimit", 10 ); + setDvar( "scr_sab_waverespawndelay", 0 ); + + setDvar( "scr_war_numlives", 0 ); + setDvar( "scr_war_playerrespawndelay", 0 ); + setDvar( "scr_war_roundlimit", 2 ); + setDvar( "scr_war_scorelimit", 0 ); + setDvar( "scr_war_roundswitch", 1 ); + setDvar( "scr_war_timelimit", 15 ); + setDvar( "scr_war_waverespawndelay", 0 ); + + setDvar( "scr_dm_numlives", 0 ); + setDvar( "scr_dm_playerrespawndelay", 0 ); + setDvar( "scr_dm_roundlimit", 1 ); + setDvar( "scr_dm_scorelimit", 0 ); + setDvar( "scr_dm_timelimit", 10 ); + setDvar( "scr_dm_waverespawndelay", 0 ); + + setDvar( "class_assault_limit", 64 ); + setDvar( "class_specops_limit", 2 ); + setDvar( "class_demolitions_limit", 1 ); + setDvar( "class_sniper_limit", 1 ); + + setDvar( "class_assault_allowdrop", 1 ); + setDvar( "class_specops_allowdrop", 1 ); + setDvar( "class_demolitions_allowdrop", 0 ); + setDvar( "class_sniper_allowdrop", 0 ); + + setDvar( "weap_allow_m16", 1 ); + setDvar( "weap_allow_ak47", 1 ); + setDvar( "weap_allow_m4", 1 ); + setDvar( "weap_allow_g3", 1 ); + setDvar( "weap_allow_g36c", 1 ); + setDvar( "weap_allow_m14", 1 ); + setDvar( "weap_allow_mp44", 1 ); + + setDvar( "attach_allow_assault_none", 1 ); + setDvar( "attach_allow_assault_silencer", 1 ); + + setDvar( "weap_allow_mp5", 1 ); + setDvar( "weap_allow_uzi", 1 ); + setDvar( "weap_allow_ak74u", 1 ); + + setDvar( "attach_allow_specops_none", 1 ); + setDvar( "attach_allow_specops_silencer", 1 ); + + setDvar( "weap_allow_m1014", 1 ); + setDvar( "weap_allow_winchester1200", 1 ); + + setDvar( "weap_allow_m40a3", 1 ); + setDvar( "weap_allow_remington700", 1 ); + + setDvar( "weap_allow_beretta", 1 ); + setDvar( "weap_allow_colt45", 1 ); + setDvar( "weap_allow_usp", 1 ); + setDvar( "weap_allow_deserteagle", 1 ); + setDvar( "weap_allow_deserteaglegold", 1 ); + + setDvar( "attach_allow_pistol_none", 1 ); + setDvar( "attach_allow_pistol_silencer", 1 ); + + setDvar( "weap_allow_flash_grenade", 1 ); + setDvar( "weap_allow_frag_grenade", 1 ); + setDvar( "weap_allow_smoke_grenade", 1 ); + + setDvar( "class_assault_primary", "ak47" ); + setDvar( "class_assault_primary_attachment", "none" ); + setDvar( "class_assault_secondary", "deserteagle" ); + setDvar( "class_assault_secondary_attachment", "none" ); + setDvar( "class_assault_grenade", "smoke_grenade" ); + setDvar( "class_assault_camo", "camo_none" ); + + setDvar( "class_specops_primary", "ak74u" ); + setDvar( "class_specops_primary_attachment", "none" ); + setDvar( "class_specops_secondary", "deserteagle" ); + setDvar( "class_specops_secondary_attachment", "none" ); + setDvar( "class_specops_grenade", "smoke_grenade" ); + setDvar( "class_specops_camo", "camo_none" ); + + setDvar( "class_demolitions_primary", "winchester1200" ); + setDvar( "class_demolitions_primary_attachment", "none" ); + setDvar( "class_demolitions_secondary", "deserteagle" ); + setDvar( "class_demolitions_secondary_attachment", "none" ); + setDvar( "class_demolitions_grenade", "smoke_grenade" ); + setDvar( "class_demolitions_camo", "camo_none" ); + + setDvar( "class_sniper_primary", "m40a3" ); + setDvar( "class_sniper_primary_attachment", "none" ); + setDvar( "class_sniper_secondary", "deserteagle" ); + setDvar( "class_sniper_secondary_attachment", "none" ); + setDvar( "class_sniper_grenade", "smoke_grenade" ); + setDvar( "class_sniper_camo", "camo_none" ); + + setDvar( "scr_team_fftype", 1 ); + setDvar( "scr_team_teamkillpointloss", 5 ); + setDvar( "scr_game_deathpointloss", 0 ); + setDvar( "scr_game_suicidepointloss", 0 ); + setDvar( "scr_player_suicidespawndelay", 0 ); + setDvar( "scr_player_forcerespawn", 1 ); + + setDvar( "bg_fallDamageMinHeight", 140 ); + setDvar( "bg_fallDamageMaxHeight", 350 ); + + setDvar( "scr_game_matchstarttime", 10 ); + setDvar( "scr_enable_hiticon", 2 ); + setDvar( "scr_enable_scoretext", 1 ); + + setDvar( "logfile", 1 ); + setDvar( "g_log", "games_mp.log" ); + setDvar( "g_logSync", 0 ); + + setDvar( "g_inactivity", 0 ); + setDvar( "g_no_script_spam", 1 ); + setDvar( "g_antilag", 1 ); + setDvar( "g_smoothClients", 1 ); + setDvar( "sv_allowDownload", 1 ); + setDvar( "sv_maxPing", 0 ); + setDvar( "sv_minPing", 0 ); + setDvar( "sv_reconnectlimit", 3 ); + setDvar( "sv_timeout", 240 ); + setDvar( "sv_zombietime", 2 ); + setDvar( "sv_floodprotect", 4 ); + setDvar( "sv_kickBanTime", 0 ); + setDvar( "sv_disableClientConsole", 0 ); + setDvar( "sv_voice", 0 ); + setDvar( "sv_clientarchive", 1 ); + setDvar( "timescale", 1 ); + + setDvar( "g_allowVote", 0 ); + setDvar( "scr_game_allowkillcam", 0 ); + setDvar( "scr_game_spectatetype", 1 ); + setDvar( "scr_hardcore", 0 ); +} \ No newline at end of file diff --git a/promod/customStatsTable.csv b/promod/customStatsTable.csv new file mode 100644 index 0000000..7f4d11f --- /dev/null +++ b/promod/customStatsTable.csv @@ -0,0 +1,81 @@ +# Copyright (c) 2009-2017 Andreas Göransson +# Copyright (c) 2009-2017 Indrek Ardel +# +# This file is part of Call of Duty 4 Promod. +# +# Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. +# Terms of license can be found in LICENSE.md document bundled with the project. + +0,PROMOD_RECORD +1,PROMOD_SUNLIGHT +2,PROMOD_TEXTURE +3,PROMOD_FILMTWEAK +4,PROMOD_FOVSCALE +5,PROMOD_NORMALMAP +6,PROMOD_GFXBLUR + +7,ASSAULT_PRIMARY +8,ASSAULT_PRIMARY_ATTACHMENT +9,ASSAULT_SECONDARY +10,ASSAULT_SECONDARY_ATTACHMENT +11,ASSAULT_GRENADE +12,ASSAULT_CAMO + +13,SPECOPS_PRIMARY +14,SPECOPS_PRIMARY_ATTACHMENT +15,SPECOPS_SECONDARY +16,SPECOPS_SECONDARY_ATTACHMENT +17,SPECOPS_GRENADE +18,SPECOPS_CAMO + +19,DEMOLITIONS_PRIMARY +20,DEMOLITIONS_PRIMARY_ATTACHMENT +21,DEMOLITIONS_SECONDARY +22,DEMOLITIONS_SECONDARY_ATTACHMENT +23,DEMOLITIONS_GRENADE +24,DEMOLITIONS_CAMO + +25,SNIPER_PRIMARY +26,SNIPER_PRIMARY_ATTACHMENT +27,SNIPER_SECONDARY +28,SNIPER_SECONDARY_ATTACHMENT +29,SNIPER_GRENADE +30,SNIPER_CAMO + +31,m16 +32,ak47 +33,m4 +34,g3 +35,g36c +36,m14 +37,mp44 + +38,mp5 +39,uzi +40,ak74u + +41,winchester1200 +42,m1014 + +43,m40a3 +44,remington700 + +45,none +46,silencer + +47,deserteaglegold +48,deserteagle +49,colt45 +50,usp +51,beretta + +52,flash_grenade +53,smoke_grenade + +54,camo_none +55,camo_brockhaurd +56,camo_bushdweller +57,camo_blackwhitemarpat +58,camo_tigerred +59,camo_stagger +60,camo_gold \ No newline at end of file diff --git a/promod/destructible.csv b/promod/destructible.csv new file mode 100644 index 0000000..d9b72c0 --- /dev/null +++ b/promod/destructible.csv @@ -0,0 +1,31 @@ +# Copyright (c) 2009-2017 Andreas Göransson +# Copyright (c) 2009-2017 Indrek Ardel +# +# This file is part of Call of Duty 4 Promod. +# +# Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. +# Terms of license can be found in LICENSE.md document bundled with the project. + +0,white_smoke,smoke/car_damage_whitesmoke +1,black_smoke,smoke/car_damage_blacksmoke +2,black_smoke_fire,smoke/car_damage_blacksmoke_fire +3,small_vehicle_explosion,explosions/small_vehicle_explosion +4,car_glass_large,props/car_glass_large +5,car_glass_medium,props/car_glass_med +6,light_front,props/car_glass_headlight +7,light_back,props/car_glass_brakelight + +8,tag_glass_left_front +9,tag_glass_right_front +10,tag_glass_left_back +11,tag_glass_right_back +12,tag_glass_front +13,tag_glass_back +14,tag_glass_left_back2 +15,tag_glass_right_back2 +16,tag_light_left_front +17,tag_light_right_front +18,tag_light_left_back +19,tag_light_right_back +20,tag_mirror_right +21,tag_mirror_left \ No newline at end of file diff --git a/promod/dvarmon.gsc b/promod/dvarmon.gsc new file mode 100644 index 0000000..2fc8892 --- /dev/null +++ b/promod/dvarmon.gsc @@ -0,0 +1,58 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + level endon ( "restarting" ); + + level thread dvarHistory(); + + level.dvarmon = []; + + dvars = strTok( "class_assault_allowdrop|class_assault_limit|class_assault_primary|class_demolitions_allowdrop|class_demolitions_limit|class_demolitions_primary|class_sniper_allowdrop|class_sniper_limit|class_sniper_primary|class_specops_allowdrop|class_specops_limit|class_specops_primary|scr_game_allowkillcam|scr_game_spectatetype|scr_" + level.gametype + "_timelimit|scr_" + level.gametype + "_numlives|scr_" + level.gametype + "_playerrespawndelay|scr_" + level.gametype + "_roundswitch|scr_" + level.gametype + "_bombtimer|scr_" + level.gametype + "_defusetime|scr_" + level.gametype + "_planttime|scr_hardcore|scr_sd_multibomb|scr_sab_hotpotato|scr_team_fftype|scr_enable_hiticon|koth_autodestroytime|koth_delayplayer|koth_destroytime|koth_spawnDelay|koth_spawntime", "|" ); + + current_values = []; + for( d = 0; d < dvars.size; d++ ) + current_values[d] = getDvar(dvars[d]); + + for(;;wait 0.05) + for ( c = 0; c < dvars.size; c++ ) + if ( getDvar(dvars[c]) != current_values[c] ) + { + level.dvarmon[level.dvarmon.size] = "^1" + dvars[c] + " ^3" + current_values[c] + " ^1--> ^3" + getDvar(dvars[c]); + iprintln("^1Warning: ^3DVAR Change Detected: ^1" + dvars[c] + " ^3" + current_values[c] + " ^1--> ^3" + getDvar(dvars[c])); + current_values[c] = getDvar(dvars[c]); + + if ( isSubStr( dvars[c], "_limit" ) ) + { + thread maps\mp\gametypes\_promod::updateClassAvailability( "allies" ); + thread maps\mp\gametypes\_promod::updateClassAvailability( "axis" ); + } + } +} + +dvarHistory() +{ + level endon ( "restarting" ); + + wait 0.1; + + if ( isDefined( level.rdyup ) && level.rdyup ) + { + for(;!isDefined( game["state"] ) || game["state"] != "postgame";wait 0.5){} + if ( level.dvarmon.size ) + { + iprintln("^3DVAR Change History:"); + + for ( i = 0; i < level.dvarmon.size; i++ ) + iprintln(level.dvarmon[i]); + } + } +} \ No newline at end of file diff --git a/promod/messagecenter.gsc b/promod/messagecenter.gsc new file mode 100644 index 0000000..da7a3a5 --- /dev/null +++ b/promod/messagecenter.gsc @@ -0,0 +1,199 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + if ( (isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match") || getDvar("promod_mc_enable") == "" || getDvarInt("promod_mc_enable") < 1 ) + return; + + if (getDvarInt("promod_mc_rs_every_round") ) + setDvar("mc_current_msg", "0"); + + if (getDvar("mc_current_msg") == "") + setDvar("mc_current_msg", "0"); + + Run_Messages(); +} + +Run_Messages() +{ + level endon("mc_restart"); + + if(getDvar("promod_mc_delay") == "") + setDvar("promod_mc_delay", "20"); + generic_delay = 20; + + if (getDvar("promod_mc_maxmessages") == "") + setDvar("promod_mc_maxmessages" , 20); + + for(;;) + { + max = getDvarInt("promod_mc_maxmessages") +1; + + last_message = getDvarInt("mc_current_msg"); + + for (i=last_message;i") + message = Get_Next_Map(); + + if (!isDefined(message)) + { + wait 0.05; + continue; + } + + wait delay; + + iprintln(message); + + next_msg = i+1; + setDvar("mc_current_msg", next_msg); + } + } + + setDvar("mc_current_msg", "0"); + + loopdelay = getDvarInt("promod_mc_loopdelay"); + if (loopdelay < 5) + { + setDvar("promod_mc_loopdelay" , "5"); + loopdelay = 5; + } + + wait loopdelay; + } +} + +Get_Next_Map() +{ + maprot = ""; + + maprot = strip(getDvar("sv_maprotationcurrent")); + + if(maprot == "") + maprot = strip(getDvar("sv_maprotation")); + + if(maprot == "") + return undefined; + + j=0; + temparr2[j] = ""; + for(i=0;i0) + i--; + + for(j=0;j<=i;j++) + s3 += s2[j]; + + return s3; +} \ No newline at end of file diff --git a/promod/modes.gsc b/promod/modes.gsc new file mode 100644 index 0000000..53f399e --- /dev/null +++ b/promod/modes.gsc @@ -0,0 +1,342 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + mode = toLower( getDvar( "promod_mode" ) ); + if ( !validMode( mode ) ) + { + mode = "comp_public"; + setDvar( "promod_mode", mode ); + } + + setMode(mode); +} + +validMode( mode ) +{ + switch ( mode ) + { + case "comp_public": + case "comp_public_hc": + case "custom_public": + case "comp_public_lan": + case "comp_public_hc_lan": + case "custom_public_lan": + case "strat": + case "match": + case "knockout": + return true; + } + + keys = strtok(mode, "_"); + if(keys.size <= 1) return false; + switches = []; + switches["match_knockout"] = false; + switches["1v1_2v2"] = false; + switches["lan_pb"] = false; + switches["hc_done"] = false; + switches["knife_done"] = false; + switches["mr_done"] = false; + switches["scores_done"] = false; + + for(i=0;i 0 && !switches["mr_done"]) + switches["mr_done"] = true; + else if ( ( isSubStr( keys[i], ":" ) ) && strtok( keys[i], ":" ).size == 2 && int(strtok( keys[i], ":" )[0]) >= 0 && int(strtok( keys[i], ":" )[1]) >= 0 && !switches["scores_done"] && !switches["knife_done"] ) + switches["scores_done"] = true; + else + return false; + break; + } + } + return switches["match_knockout"]; +} + +monitorMode() +{ + o_mode = toLower( getDvar( "promod_mode" ) ); + o_cheats = getDvarInt( "sv_cheats" ); + + for(;;) + { + mode = toLower( getDvar( "promod_mode" ) ); + cheats = getDvarInt( "sv_cheats" ); + + if ( mode != o_mode ) + { + if ( isDefined( game["state"] ) && game["state"] == "postgame" ) + { + setDvar( "promod_mode", o_mode ); + continue; + } + + if ( validMode( mode ) ) + { + level notify ( "restarting" ); + + iPrintLN( "Changing To Mode: ^1" + mode + "\nPlease Wait While It Loads..." ); + setMode( mode ); + + wait 2; + + map_restart( false ); + setDvar( "promod_mode", mode ); + } + else + { + if ( isDefined( mode ) && mode != "" ) + iPrintLN( "Error Changing To Mode: ^1" + mode + "\nSyntax: match|knockout_lan|pb_hc_knife_1v1|2v2_mr#_#:#,\nNormal Modes: comp_public(_lan), comp_public_hc(_lan), custom_public(_lan), strat" ); + + setDvar( "promod_mode", o_mode ); + } + } + else if ( cheats != o_cheats ) + { + map_restart( false ); + break; + } + + wait 0.1; + } +} + +setMode( mode ) +{ + limited_mode = 0; + knockout_mode = 0; + mr_rating = 0; + + game["CUSTOM_MODE"] = 0; + game["LAN_MODE"] = 0; + game["HARDCORE_MODE"] = 0; + game["PROMOD_STRATTIME"] = 6; + game["PROMOD_MODE_HUD"] = ""; + game["PROMOD_MATCH_MODE"] = ""; + game["PROMOD_PB_OFF"] = 0; + game["PROMOD_KNIFEROUND"] = 0; + game["SCORES_ATTACK"] = 0; + game["SCORES_DEFENCE"] = 0; + + if ( mode == "comp_public" ) + { + promod\comp::main(); + game["PROMOD_MATCH_MODE"] = "pub"; + game["PROMOD_MODE_HUD"] = "^4Competitive ^3Public"; + pub(); + } + else if ( mode == "comp_public_hc" ) + { + promod\comp::main(); + game["PROMOD_MATCH_MODE"] = "pub"; + game["HARDCORE_MODE"] = 1; + game["PROMOD_MODE_HUD"] = "^4Competitive ^3Public ^6HC"; + pub(); + } + else if ( mode == "custom_public" ) + { + promod_ruleset\custom_public::main(); + game["CUSTOM_MODE"] = 1; + game["PROMOD_MATCH_MODE"] = "pub"; + game["PROMOD_MODE_HUD"] = "^4Custom ^3Public"; + game["PROMOD_KNIFEROUND"] = getDvarInt("promod_kniferound"); + } + else if ( mode == "comp_public_lan" ) + { + promod\comp::main(); + game["PROMOD_MATCH_MODE"] = "pub"; + game["PROMOD_MODE_HUD"] = "^4Competitive ^3Public"; + game["LAN_MODE"] = 1; + pub(); + } + else if ( mode == "comp_public_hc_lan" ) + { + promod\comp::main(); + game["PROMOD_MATCH_MODE"] = "pub"; + game["HARDCORE_MODE"] = 1; + game["PROMOD_MODE_HUD"] = "^4Competitive ^3Public ^6HC"; + game["LAN_MODE"] = 1; + pub(); + } + else if ( mode == "custom_public_lan" ) + { + promod_ruleset\custom_public::main(); + game["CUSTOM_MODE"] = 1; + game["PROMOD_MATCH_MODE"] = "pub"; + game["PROMOD_MODE_HUD"] = "^4Custom ^3Public"; + game["PROMOD_KNIFEROUND"] = getDvarInt("promod_kniferound"); + game["LAN_MODE"] = 1; + } + else if ( mode == "strat" ) + { + promod\comp::main(); + game["PROMOD_MODE_HUD"] = "^4Strat ^3Mode"; + game["PROMOD_MATCH_MODE"] = "strat"; + setDvar( "class_specops_limit", 64 ); + setDvar( "class_demolitions_limit", 64 ); + setDvar( "class_sniper_limit", 64 ); + } + + if ( game["PROMOD_MATCH_MODE"] == "" ) + { + exploded = StrTok( mode, "_" ); + for ( i = 0; i < exploded.size; i++ ) + { + switch(exploded[i]) + { + case "match": + game["PROMOD_MATCH_MODE"] = "match"; + break; + case "knockout": + knockout_mode = 1; + game["PROMOD_MATCH_MODE"] = "match"; + break; + case "lan": + game["LAN_MODE"] = 1; + break; + case "1v1": + case "2v2": + limited_mode = int(strtok(exploded[i],"v")[0]); + break; + case "knife": + game["PROMOD_KNIFEROUND"] = 1; + break; + case "pb": + game["PROMOD_PB_OFF"] = 1; + break; + case "hc": + game["HARDCORE_MODE"] = 1; + break; + default: + if ( isSubStr( exploded[i], "mr" ) ) + mr_rating = int(strtok(exploded[i], "mr")[0]); + else if ( isSubStr( exploded[i], ":" ) ) + { + game["SCORES_ATTACK"] = int(strtok( exploded[i], ":" )[0]); + game["SCORES_DEFENCE"] = int(strtok( exploded[i], ":" )[1]); + } + break; + } + } + } + + if ( game["PROMOD_MATCH_MODE"] == "match" ) + promod\comp::main(); + + if ( knockout_mode && !mr_rating ) + mr_rating = 10; + + if ( limited_mode ) + { + setDvar( "class_demolitions_limit", 0 ); + setDvar( "class_sniper_limit", 0 ); + game["PROMOD_MODE_HUD"] += "^2"+limited_mode+"V"+limited_mode+" "; + } + + if( knockout_mode ) + game["PROMOD_MODE_HUD"] += "^4Knockout"; + else if ( game["PROMOD_MATCH_MODE"] == "match" ) + game["PROMOD_MODE_HUD"] += "^4Match"; + + if ( game["PROMOD_KNIFEROUND"] && game["PROMOD_MATCH_MODE"] == "match" && level.gametype == "sd" ) + game["PROMOD_MODE_HUD"] += " ^5Knife"; + + if ( game["LAN_MODE"] ) + { + setDvar( "g_antilag", 0 ); + setDvar( "g_smoothClients", 0 ); + game["PROMOD_MODE_HUD"] += " ^4LAN"; + if( knockout_mode ) + game["PROMOD_STRATTIME"] = 10; + } + + if ( game["HARDCORE_MODE"] ) + { + if(game["PROMOD_MATCH_MODE"] == "match") + game["PROMOD_MODE_HUD"] += " ^6HC"; + setDvar( "scr_hardcore", 1 ); + } + + maxscore = 0; + if ( mr_rating > 0 && ( level.gametype == "sd" || level.gametype == "sab" ) ) + { + maxscore = mr_rating * ( 2 - 1 * knockout_mode ) + ( - 1 * !knockout_mode ); + + game["PROMOD_MODE_HUD"] += " " + "^3MR" + mr_rating; + + setDvar( "scr_" + level.gametype + "_roundswitch", mr_rating ); + setDvar( "scr_" + level.gametype + "_roundlimit", mr_rating * 2 ); + + if ( knockout_mode && level.gametype == "sd" ) + setDvar( "scr_sd_scorelimit", mr_rating + 1 ); + } + else if ( game["PROMOD_MATCH_MODE"] == "match" ) + { + game["PROMOD_MODE_HUD"] += " ^3Standard"; + mr_rating = 10; + maxscore = mr_rating * ( 2 - 1 * knockout_mode ) + ( - 1 * !knockout_mode ); + } + + if ( level.gametype != "sd" || !knockout_mode && game["SCORES_ATTACK"] + game["SCORES_DEFENCE"] > maxscore || knockout_mode && ( ( game["SCORES_ATTACK"] > maxscore || game["SCORES_DEFENCE"] > maxscore ) || ( game["SCORES_ATTACK"] + game["SCORES_DEFENCE"] >= int( mr_rating ) * 2 ) ) ) + { + game["SCORES_ATTACK"] = 0; + game["SCORES_DEFENCE"] = 0; + } + + if( game["PROMOD_PB_OFF"] && getDvarInt( "sv_cheats" ) && !getDvarInt( "sv_punkbuster" ) ) + game["PROMOD_MODE_HUD"] += " ^1PB: OFF & CHEATS"; + else if( game["PROMOD_PB_OFF"] && !getDvarInt( "sv_punkbuster" ) ) + game["PROMOD_MODE_HUD"] += " ^1PB: OFF"; + else if ( getDvarInt( "sv_cheats" ) ) + game["PROMOD_MODE_HUD"] += " ^1CHEATS"; + + if(level.gametype != "sd") game["PROMOD_KNIFEROUND"] = 0; +} + +pub() +{ + setDvar( "scr_team_fftype", 0 ); + setDvar( "scr_team_teamkillpointloss", 0 ); + setDvar( "scr_war_roundswitch", 0 ); + setDvar( "scr_war_roundlimit", 1 ); + setDvar( "weap_allow_flash_grenade", 0 ); + setDvar( "weap_allow_frag_grenade", 0 ); + setDvar( "weap_allow_smoke_grenade", 0 ); + setDvar( "class_specops_limit", 64 ); + setDvar( "class_assault_grenade", "none" ); + setDvar( "class_specops_grenade", "none" ); + setDvar( "class_demolitions_grenade", "none" ); + setDvar( "class_sniper_grenade", "none" ); +} \ No newline at end of file diff --git a/promod/readyup.gsc b/promod/readyup.gsc new file mode 100644 index 0000000..9c1a431 --- /dev/null +++ b/promod/readyup.gsc @@ -0,0 +1,376 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\gametypes\_hud_util; + +main() +{ + if ( isDefined( level.scorebot ) && level.scorebot ) + { + + if( game["promod_in_timeout"] ) + sb_text = "timeout"; + else + { + if( game["promod_first_readyup_done"] ) + sb_text = "2nd_half"; + else + sb_text = "1st_half"; + } + + game["promod_scorebot_ticker_buffer"] += "" + sb_text+"_ready_up"; + } + + level.timeLimitOverride = true; + level.rdyup = true; + level.rup_txt_fx = true; + + setDvar( "g_deadChat", 1 ); + setClientNameMode( "auto_change" ); + setGameEndTime( 0 ); + + thread periodAnnounce(); + + level.ready_up_over = false; + previous_not_ready_count = 0; + + thread updatePlayerHUDInterval(); + thread lastPlayerReady(); + + while ( !level.ready_up_over ) + { + all_players_ready = true; + level.not_ready_count = 0; + + if ( level.players.size < 1 ) + { + all_players_ready = false; + + wait 0.2; + continue; + } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + if ( !isDefined( player.looped ) ) + { + player setclientdvar("self_ready", 0); + + player.looped = true; + player.ready = false; + player.update = false; + player.statusicon = "compassping_enemy"; + player thread selfLoop(); + } + + player.oldready = player.update; + + if ( player.ready ) + { + player.update = true; + + if ( !isDefined( player.pers["record_reminder_done"] ) && ( isAlive( player ) && isDefined( player.pers["class"] ) && !isDefined( player.inrecmenu ) && !player promod\client::get_config( "PROMOD_RECORD" ) ) ) + { + player.pers["record_reminder_done"] = true; + + player openMenu( game["menu_demo"] ); + player.inrecmenu = true; + } + } + + if ( !player.ready || isDefined( player.inrecmenu ) && player.inrecmenu && !player promod\client::get_config( "PROMOD_RECORD" ) ) + { + level.not_ready_count++; + all_players_ready = false; + player.update = false; + } + + player.newready = player.update; + + if ( player.oldready != player.newready && ( !isDefined( player.inrecmenu ) || !player.inrecmenu ) ) + { + player setclientdvar("self_ready", int(player.ready)); + player.oldready = player.newready; + + if ( player.ready ) + player.statusicon = "compassping_friendlyfiring_mp"; + else + player.statusicon = "compassping_enemy"; + } + } + + if(previous_not_ready_count != level.not_ready_count) + { + for(i=0;i 1 && maxwait <= 5 ) + { + wait 0.05; + maxwait += 0.05; + } + + if( level.not_ready_count == 1 && level.players.size > 1 ) + { + for(i=0;i player.soundplayed ) && ( !isDefined( player.timesplayed ) || player.timesplayed < 4 ) && ( !isDefined( player.inrecmenu ) || !player.inrecmenu ) ) + { + player PlayLocalSound( player maps\mp\gametypes\_quickmessages::getSoundPrefixForTeam()+"1mc_lastalive" ); + player.soundplayed = gettime(); + + if ( isDefined( player.timesplayed ) ) + player.timesplayed++; + else + player.timesplayed = 1; + } + } + } + } + + wait 0.05; + } +} + +updatePlayerHUDInterval() +{ + level endon("kill_ru_period"); + + while ( !level.ready_up_over ) + { + wait 5; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isDefined( player ) ) + { + if ( isDefined( player.ready ) && !isDefined( player.inrecmenu ) ) + player setclientdvar("self_ready", int(player.ready)); + + if ( isDefined( level.not_ready_count ) ) + player setclientdvar("waiting_on", level.not_ready_count); + } + } + } +} + +selfLoop() +{ + self endon("disconnect"); + + self thread onSpawn(); + self thread clientHUD(); + + self setClientDvar( "self_kills", "" ); + + while ( !level.ready_up_over ) + { + while ( !isDefined( self.pers["team"] ) || self.pers["team"] == "none" ) + wait 0.05; + + wait 0.05; + + if ( self useButtonPressed() ) + self.ready = !self.ready; + + while ( self useButtonPressed() ) + wait 0.1; + } +} + +clientHUD() +{ + self endon("disconnect"); + + if ( !game["promod_first_readyup_done"] ) + self waittill("spawned_player"); + + text = ""; + if ( !game["promod_first_readyup_done"] ) + text = "Pre-Match"; + else if ( game["promod_in_timeout"] ) + text = "Timeout"; + else + text = "Half-Time"; + + self.periodtext = createFontString( "objective", 1.6 ); + self.periodtext setPoint( "CENTER", "CENTER", 0, -75 ); + self.periodtext.sort = 1001; + self.periodtext setText( text + " Ready-Up Period" ); + self.periodtext.foreground = false; + self.periodtext.hidewheninmenu = true; + + self.halftimetext = createFontString( "objective", 1.5 ); + self.halftimetext.alpha = 0; + self.halftimetext setPoint( "CENTER", "CENTER", 0, 200 ); + self.halftimetext.sort = 1001; + + self.halftimetext.foreground = false; + self.halftimetext.hidewheninmenu = true; + + if ( game["promod_first_readyup_done"] && game["promod_in_timeout"] && (!isDefined( game["LAN_MODE"] ) || !game["LAN_MODE"]) ) + text = "Remaining"; + else + text = "Elapsed"; + + self.halftimetext setText( "Time " + text ); + + self thread moveOver(); + + level waittill("kill_ru_period"); + + if ( isDefined( self.periodtext ) ) + self.periodtext destroy(); + + if ( isDefined( self.halftimetext ) ) + self.halftimetext destroy(); + +} + +onSpawn() +{ + self endon("disconnect"); + + while ( !level.ready_up_over ) + { + self waittill("spawned_player"); + self iprintlnbold("Press ^3[{+activate}] ^7to Ready-Up"); + } +} + +periodAnnounce() +{ + level.halftimetimer = createServerTimer( "objective", 1.4 ); + level.halftimetimer.alpha = 0; + level.halftimetimer setPoint( "CENTER", "CENTER", 0, 215 ); + + if ( !game["promod_in_timeout"] || isDefined( game["LAN_MODE"] ) && game["LAN_MODE"] ) + level.halftimetimer setTimerUp( 0 ); + else + level.halftimetimer setTimer( 300 ); + + level.halftimetimer.sort = 1001; + level.halftimetimer.foreground = false; + level.halftimetimer.hideWhenInMenu = true; + + level waittill("kill_ru_period"); + + if ( isDefined( level.halftimetimer ) ) + level.halftimetimer destroy(); +} + +moveOver() +{ + level endon("kill_ru_period"); + self endon("disconnect"); + + if( level.rup_txt_fx ) + { + wait 3; + self.periodtext MoveOverTime( 2.5 ); + } + + self.periodtext setPoint( "CENTER", "CENTER", 0, 185 ); + + if( level.rup_txt_fx ) + { + wait 2.6; + if( isDefined( level.halftimetimer ) ) + level.halftimetimer.alpha = 1; + level.rup_txt_fx = false; + } + + if( isDefined( self.halftimetext ) ) + self.halftimetext.alpha = 1; +} diff --git a/promod/scorebot.gsc b/promod/scorebot.gsc new file mode 100644 index 0000000..fa5f85c --- /dev/null +++ b/promod/scorebot.gsc @@ -0,0 +1,73 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + if ( getDvar( "promod_enable_scorebot" ) == "" ) + setDvar( "promod_enable_scorebot", 0 ); + + level.scorebot = getDvarInt( "promod_enable_scorebot" ) && isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" && level.teambased; + + if ( level.scorebot ) + { + thread updateTimer(); + thread actionTicker(); + } +} + +updateTimer() +{ + if ( !isDefined( game["prevtime"] ) ) + game["prevtime"] = gettime(); + + for(;;) + { + game["passedtime"] = gettime() - game["prevtime"]; + if ( game["passedtime"] >= 10000 ) + { + level notify("update_ticker"); + game["prevtime"] = gettime(); + } + + wait 0.05; + } +} + +actionTicker() +{ + while ( !isDefined( game["promod_scorebot_attack_ticker_buffer"] ) || !isDefined( game["promod_scorebot_defence_ticker_buffer"] ) ) + wait 0.05; + + setDvar( "__promod_attack_score", game["promod_scorebot_attack_ticker_buffer"], true ); + setDvar( "__promod_defence_score", game["promod_scorebot_defence_ticker_buffer"], true ); + setDvar( "__promod_mode", toLower( getDvar( "promod_mode" ) ), true ); + setDvar( "__promod_ticker", getDvar( "__promod_ticker" ), true ); + setDvar( "__promod_version", "Promod LIVE V2.20 EU", true ); + + for(;;) + { + level waittill( "update_ticker" ); + + num = getDvarInt( "promod_scorebot_ticker_num" ) + 1; + + if ( num == 10 ) + num = 0; + + setDvar( "promod_scorebot_ticker_num", num ); + + if ( isDefined( game["promod_scorebot_ticker_buffer"] ) ) + { + setDvar( "__promod_ticker", game["promod_scorebot_ticker_buffer"], true ); + setDvar( "__promod_attack_score", game["promod_scorebot_attack_ticker_buffer"], true ); + setDvar( "__promod_defence_score", game["promod_scorebot_defence_ticker_buffer"], true ); + game["promod_scorebot_ticker_buffer"] = num; + } + } +} \ No newline at end of file diff --git a/promod/servercheck.gsc b/promod/servercheck.gsc new file mode 100644 index 0000000..f1a3f46 --- /dev/null +++ b/promod/servercheck.gsc @@ -0,0 +1,160 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + level endon( "restarting" ); + + thread errorMessage(); + + for(;;) + { + if ( getDvarInt( "sv_cheats" ) || isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" ) + break; + + forceDvar( "authServerName", "cod4master.activision.com" ); + forceDvar( "sv_disableClientConsole", "0" ); + forceDvar( "sv_fps", "20" ); + forceDvar( "sv_pure", "1" ); + forceDvar( "sv_maxrate", "25000" ); + forceDvar( "g_gravity", "800" ); + forceDvar( "g_speed", "190" ); + forceDvar( "g_knockback", "1000" ); + forceDvar( "g_playercollisionejectspeed", "25" ); + forceDvar( "g_dropforwardspeed", "10" ); + forceDvar( "g_drophorzspeedrand", "100" ); + forceDvar( "g_dropupspeedbase", "10" ); + forceDvar( "g_dropupspeedrand", "5" ); + forceDvar( "g_useholdtime", "0" ); + + if( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" ) + { + forceDvar( "g_maxdroppedweapons", "16" ); + + if ( !game["LAN_MODE"] ) + forceDvar( "g_smoothclients", "1" ); + } + + wait 0.1; + } +} + +forceDvar(dvar, value) +{ + val = getDvar( dvar ); + if( val != value ) + { + setDvar( dvar, value ); + iprintln("^3"+dvar+" has been changed back to '"+value+"' (was '"+val+"')"); + } +} + +errorMessage() +{ + level endon( "restarting" ); + + for(;;) + { + if ( getDvarInt( "sv_cheats" ) || isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "strat" ) + break; + + if ( !getDvarInt( "sv_punkbuster" ) && !game["LAN_MODE"] && !game["PROMOD_PB_OFF"] ) + iprintlnbold("^1Server Violation^7: Punkbuster Disabled"); + + if ( getDvarInt( "scr_player_maxhealth" ) != 100 && game["HARDCORE_MODE"] != 1 && game["CUSTOM_MODE"] != 1 || getDvarInt( "scr_player_maxhealth" ) != 30 && game["HARDCORE_MODE"] == 1 && game["CUSTOM_MODE"] != 1 ) + iprintlnbold("^1Server Violation^7: Modified Player Health"); + + antilag = getDvarInt( "g_antilag" ); + dedicated = getDvar( "dedicated" ); + if ( (antilag && dedicated == "dedicated LAN server") || (!antilag && dedicated == "dedicated internet server" && !game["PROMOD_PB_OFF"])) + iprintlnbold("^1Server Violation^7: Modified Connection"); + + if( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" || toLower( getDvar( "fs_game" ) ) == "mods/pml220" ) + { + if( toLower(getDvar("fs_game")) != "mods/pml220" ) + iprintlnbold("^1Server Violation^7: Invalid fs_game value"); + + iwdnames = strToK( getDvar( "sv_iwdnames" ), " " ); + iwdsums = strToK( getDvar( "sv_iwds" ), " " ); + iwd_loaded = false; + for(i=0;i + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + setDvar( "bg_bobMax", 0 ); + setDvar( "player_sustainAmmo", 0 ); + setDvar( "player_throwBackInnerRadius", 0 ); + setDvar( "player_throwBackOuterRadius", 0 ); + setDvar( "loc_warnings", 0 ); + + game["allies_assault_count"] = 0; + game["allies_specops_count"] = 0; + game["allies_demolitions_count"] = 0; + game["allies_sniper_count"] = 0; + + game["axis_assault_count"] = 0; + game["axis_specops_count"] = 0; + game["axis_demolitions_count"] = 0; + game["axis_sniper_count"] = 0; + + game["promod_timeout_called"] = false; + game["promod_in_timeout"] = 0; + game["allies_timeout_called"] = 0; + game["axis_timeout_called"] = 0; + + game["promod_first_readyup_done"] = 0; + game["PROMOD_VERSION"] = "Promod ^1LIVE ^7V2.20 EU"; +} \ No newline at end of file diff --git a/promod/shoutcast.gsc b/promod/shoutcast.gsc new file mode 100644 index 0000000..100ea6c --- /dev/null +++ b/promod/shoutcast.gsc @@ -0,0 +1,147 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +addPlayer() +{ + if(isDefined(self.pers["class"]) && !isDefined(self.pers["shoutnum"]) && (self.pers["team"] == "allies" || self.pers["team"] == "axis")) + { + offset = int(self.pers["team"] == "axis")*5; + for(i=0;i<5;i++) + if(!isDefined(level.shoutbars[i+offset])) + { + self.pers["shoutnum"] = i+offset; + level.shoutbars[self.pers["shoutnum"]] = self; + self updatePlayer(); + break; + } + } +} + +removePlayer() +{ + if(isDefined(self.pers["shoutnum"])) + { + level.shoutbars[self.pers["shoutnum"]] = undefined; + self.pers["shoutnum"] = undefined; + + // Find replacements for current slots. + for(i=0;i level.players.size) + self.specpos = 0; + + if(!isDefined(self.followclass)) + self.followclass = []; + + if(self.followclass.size > 0) + { + temp = []; + for(i=0;i 0) + { + num = self.followclass[self.followclass.size-1] getEntityNumber(); + self.followclass[self.followclass.size-1] = undefined; + + if ( num != -1 ) + { + self.spectatorclient = num; + self.spectatorlast = num; + self.freelook = false; + wait 0.05; + self.spectatorclient = -1; + } + } + } +} \ No newline at end of file diff --git a/promod/stratmode.gsc b/promod/stratmode.gsc new file mode 100644 index 0000000..d9b7cf6 --- /dev/null +++ b/promod/stratmode.gsc @@ -0,0 +1,495 @@ +/* + Copyright (c) 2008 Matthias Lorenz + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +main() +{ + precacheItem( "radar_mp" ); + thread onPlayerConnect(); + thread createServerHUD(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill("connecting", player); + player thread nadeTraining(); + player thread createHUD(); + player thread monitorKeys(); + if(getDvar("dedicated") == "listen server" && !getDvarInt( "sv_punkbuster" )) + player thread bots(); + } +} + +spawnthing() +{ + self endon("disconnect"); + + for(;;) + { + if(!self HasWeapon("radar_mp")) + { + self SetActionSlot( 1, "weapon", "radar_mp" ); + self giveWeapon("radar_mp"); + } + + wait 0.5; + } +} + +bots() +{ + self endon("disconnect"); + + self thread spawnthing(); + lastWeapon = undefined; + + for(;;) + { + if ( self getCurrentWeapon() != "radar_mp" ) + lastWeapon = self getCurrentWeapon(); + + if ( self getCurrentWeapon() == "radar_mp" && ( ( !isDefined(self.inAction) || !self.inAction) && self isOnGround() ) ) + { + self SwitchToWeapon( lastWeapon ); + + origin = self getOrigin(); + angles = self getPlayerAngles(); + self.inAction = true; + + if(isDefined(self.bot)) + { + wait 0.55; + + if ( distanceSquared( self.origin, origin ) < 4096 ) + { + self iprintln("Move away to spawn dummy!"); + + while ( distanceSquared( self.origin, origin ) < 4096 ) + wait 0.05; + } + + self.bot setOrigin( origin ); + self.bot SetPlayerAngles( angles ); + } + else + { + newBot = addTestClient(); + + wait 0.05; + + if(isdefined(newBot)) + { + wait 0.5; + + if ( distanceSquared( self.origin, origin ) < 4096 ) + { + self iprintln("Move away to spawn dummy!"); + + while ( distanceSquared( self.origin, origin ) < 4096 ) + wait 0.05; + } + + newBot.pers["isBot"] = true; + self.bot = newBot; + while( !isDefined( newBot.pers ) || !isDefined( newBot.pers["team"] ) ) + wait 0.05; + newBot notify( "menuresponse", game["menu_team"], self.pers["team"] ); + while(newBot.pers["team"] != "axis" && newBot.pers["team"] != "allies") + wait 0.05; + newBot notify( "menuresponse", game["menu_changeclass_" + newBot.pers["team"] ], "assault" ); + while(!isDefined(newBot.pers["class"])) + wait 0.05; + newBot notify( "menuresponse", game["menu_changeclass"], "go" ); + while(!isAlive(newBot)) + wait 0.05; + + newBot SetMoveSpeedScale( 0 ); + newBot freezeControls( true ); + newBot setOrigin( origin ); + newBot SetPlayerAngles( angles ); + newBot.maxhealth = 999999999; + newBot.health = newBot.maxhealth; + self.hint6 setText( "Move: Press ^3[{+actionslot 1}]" ); + } + else + self iprintln("Couldn't add bot, server full?"); + } + self.inAction = false; + } + + wait 0.05; + } +} + +monitorKeys() +{ + self endon("disconnect"); + + for(;;) + { + wait 0.05; + + if ( self.sessionstate != "playing" ) + continue; + + if ( self useButtonPressed() && !self meleeButtonPressed() ) + { + useButtonTime = 0; + while ( self useButtonPressed() && !self meleeButtonPressed() ) + { + useButtonTime += 0.05; + wait 0.05; + } + + if ( useButtonTime > 0.5 || !useButtonTime ) + continue; + + for ( i = 0; i < 0.5; i += 0.1 ) + { + wait 0.1; + + if ( self useButtonPressed() && !self meleeButtonPressed() ) + { + loadPos(); + break; + } + } + } + + if ( self meleeButtonPressed() && !self useButtonPressed() ) + { + meleeButtonTime = 0; + while ( self meleeButtonPressed() && !self useButtonPressed() ) + { + meleeButtonTime += 0.05; + wait 0.05; + } + + if ( meleeButtonTime > 0.5 || !meleeButtonTime ) + continue; + + for ( i = 0; i < 0.5; i += 0.1 ) + { + wait 0.1; + + if ( self meleeButtonPressed() && !self useButtonPressed() ) + { + savePos(); + break; + } + } + } + + if ( self meleeButtonPressed() || self useButtonPressed() ) + { + wait 0.1; + + bothButtonTime = 0; + while ( bothButtonTime < 0.5 && self meleeButtonPressed() && self useButtonPressed() ) + { + bothButtonTime += 0.05; + wait 0.05; + } + + if ( bothButtonTime > 0.35 ) + { + if ( !isDefined( self.nofly ) ) + { + self.nofly = true; + self.hint1 setText( "Enable: Hold ^3[{+melee}] ^7+ ^3[{+activate}]" ); + self.hint2.color = (0.5, 0.5, 0.5); + self.hint3.color = (0.5, 0.5, 0.5); + } + else + { + self.nofly = undefined; + self.hint1 setText( "Disable: Hold ^3[{+melee}] ^7+ ^3[{+activate}]" ); + self.hint2.color = (0.8, 1, 1); + self.hint3.color = (0.8, 1, 1); + } + } + + while ( self meleeButtonPressed() && self useButtonPressed() ) + wait 0.05; + } + } +} + +loadPos() +{ + self endon( "disconnect" ); + + if ( !isDefined( self.savedorg ) ) + self iprintln("No Previous Position Saved"); + else + { + self freezecontrols( true ); + + wait 0.05; + + self setOrigin( self.savedorg ); + self SetPlayerAngles ( self.savedang ); + self freezecontrols( false ); + self iprintln("Position Loaded"); + } +} + +savePos() +{ + if ( !self isOnGround() ) + return; + + self.savedorg = self.origin; + self.savedang = self GetPlayerAngles(); + self iprintln("Position Saved"); +} + +nadeTraining() +{ + self endon( "disconnect" ); + + for(;;) + { + self waittill ( "grenade_fire", grenade, weaponName ); + + grenades = getentarray("grenade","classname"); + for ( i = 0; i < grenades.size; i++ ) + { + self giveWeapon( weaponName ); + self setWeaponAmmoClip( weaponName, 1 ); + + if ( isDefined( grenades[i].origin ) && !isDefined( self.flying ) && !isDefined( self.nofly ) ) + { + if ( distance( grenades[i].origin, self.origin ) < 140 ) + { + self.flying = true; + grenades[i] thread nadeFlying( self, weaponName ); + } + } + } + + wait 0.1; + } +} + +nadeFlying( player, weaponName ) +{ + player endon( "disconnect" ); + + time = 3; + + if ( weaponName == "frag_grenade_mp" ) + time = 3; + else if ( weaponName == "flash_grenade_mp" ) + time = 1.5; + else + time = 1; + + old_player_origin = player.origin; + + player.flyobject = spawn( "script_model", player.origin ); + player.flyobject linkto( self ); + + player linkto( player.flyobject ); + + stop_flying = false; + return_flying = false; + + while ( isDefined( self ) ) + { + if ( player attackButtonPressed() ) + { + stop_flying = true; + break; + } + + if ( player useButtonPressed() ) + { + return_flying = true; + break; + } + + wait 0.05; + } + + if ( stop_flying || return_flying ) + wait 0.1; + else + { + for ( i = 0; i < time - 0.5; i += 0.1 ) + { + wait 0.1; + + if ( player useButtonPressed() ) + break; + } + } + + player.flyobject unlink(); + + if ( stop_flying ) + { + for ( i = 0; i < time + 0.4; i += 0.1 ) + { + wait 0.1; + + if ( player useButtonPressed() ) + break; + } + } + + player.flyobject moveto( old_player_origin, 0.1 ); + + wait 0.2; + + player unlink(); + player.flying = undefined; + + if ( isDefined( player.flyobject ) ) + player.flyobject delete(); +} + +createHUD() +{ + self.hint1 = newClientHudElem(self); + self.hint1.x = -7; + self.hint1.y = 100; + self.hint1.horzAlign = "right"; + self.hint1.vertAlign = "top"; + self.hint1.alignX = "right"; + self.hint1.alignY = "middle"; + self.hint1.fontScale = 1.4; + self.hint1.font = "default"; + self.hint1.color = (0.8, 1, 1); + self.hint1.hidewheninmenu = true; + self.hint1 setText( "Disable: Hold ^3[{+melee}] ^7+ ^3[{+activate}]" ); + + self.hint2 = newClientHudElem(self); + self.hint2.x = -7; + self.hint2.y = 115; + self.hint2.horzAlign = "right"; + self.hint2.vertAlign = "top"; + self.hint2.alignX = "right"; + self.hint2.alignY = "middle"; + self.hint2.fontScale = 1.4; + self.hint2.font = "default"; + self.hint2.color = (0.8, 1, 1); + self.hint2.hidewheninmenu = true; + self.hint2 setText( "Stop: Press ^3[{+attack}]" ); + + self.hint3 = newClientHudElem(self); + self.hint3.x = -7; + self.hint3.y = 130; + self.hint3.horzAlign = "right"; + self.hint3.vertAlign = "top"; + self.hint3.alignX = "right"; + self.hint3.alignY = "middle"; + self.hint3.fontScale = 1.4; + self.hint3.font = "default"; + self.hint3.color = (0.8, 1, 1); + self.hint3.hidewheninmenu = true; + self.hint3 setText( "Return: Press ^3[{+activate}]" ); + + self.hint4 = newClientHudElem(self); + self.hint4.x = -7; + self.hint4.y = 175; + self.hint4.horzAlign = "right"; + self.hint4.vertAlign = "top"; + self.hint4.alignX = "right"; + self.hint4.alignY = "middle"; + self.hint4.fontScale = 1.4; + self.hint4.font = "default"; + self.hint4.color = (0.8, 1, 1); + self.hint4.hidewheninmenu = true; + self.hint4 setText( "Save: Press ^3[{+melee}] ^7twice" ); + + self.hint5 = newClientHudElem(self); + self.hint5.x = -7; + self.hint5.y = 190; + self.hint5.horzAlign = "right"; + self.hint5.vertAlign = "top"; + self.hint5.alignX = "right"; + self.hint5.alignY = "middle"; + self.hint5.fontScale = 1.4; + self.hint5.font = "default"; + self.hint5.color = (0.8, 1, 1); + self.hint5.hidewheninmenu = true; + self.hint5 setText( "Load: Press ^3[{+activate}] ^7twice" ); + + if(getDvar("dedicated") == "listen server") + { + self.hint6 = newClientHudElem(self); + self.hint6.x = -7; + self.hint6.y = 235; + self.hint6.horzAlign = "right"; + self.hint6.vertAlign = "top"; + self.hint6.alignX = "right"; + self.hint6.alignY = "middle"; + self.hint6.fontScale = 1.4; + self.hint6.font = "default"; + self.hint6.color = (0.8, 1, 1); + self.hint6.hidewheninmenu = true; + + if(!getDvarInt( "sv_punkbuster" )) + self.hint6 setText( "Spawn: Press ^3[{+actionslot 1}]" ); + else + { + self.hint6 setText( "Spawn: Disable Punkbuster" ); + self.hint6.color = (0.5, 0.5, 0.5); + } + } +} + +createServerHUD() +{ + nadetraining = newHudElem(); + nadetraining.x = -7; + nadetraining.y = 80; + nadetraining.horzAlign = "right"; + nadetraining.vertAlign = "top"; + nadetraining.alignX = "right"; + nadetraining.alignY = "middle"; + nadetraining.fontScale = 1.4; + nadetraining.font = "default"; + nadetraining.color = (0.8, 1, 1); + nadetraining.hidewheninmenu = true; + nadetraining setText( "Nadetraining" ); + + position = newHudElem(); + position.x = -7; + position.y = 155; + position.horzAlign = "right"; + position.vertAlign = "top"; + position.alignX = "right"; + position.alignY = "middle"; + position.fontScale = 1.4; + position.font = "default"; + position.color = (0.8, 1, 1); + position.hidewheninmenu = true; + position setText( "Position" ); + + if(getDvar("dedicated") == "listen server") + { + traindummy = newHudElem(); + traindummy.x = -7; + traindummy.y = 215; + traindummy.horzAlign = "right"; + traindummy.vertAlign = "top"; + traindummy.alignX = "right"; + traindummy.alignY = "middle"; + traindummy.fontScale = 1.4; + traindummy.font = "default"; + traindummy.color = (0.8, 1, 1); + traindummy.hidewheninmenu = true; + traindummy setText( "Training Dummy" ); + } +} \ No newline at end of file diff --git a/promod/strattime.gsc b/promod/strattime.gsc new file mode 100644 index 0000000..fd9a12f --- /dev/null +++ b/promod/strattime.gsc @@ -0,0 +1,129 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\gametypes\_hud_util; + +main() +{ + if ( game["promod_timeout_called"] ) + { + thread promod\timeout::main(); + return; + } + + thread stratTime(); + + level waittill( "strat_over" ); + + players = getentarray("player", "classname"); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + classType = player.pers["class"]; + + if ( ( player.pers["team"] == "allies" || player.pers["team"] == "axis" ) && player.sessionstate == "playing" && isDefined( player.pers["class"] ) ) + { + if ( isDefined( game["PROMOD_KNIFEROUND"] ) && !game["PROMOD_KNIFEROUND"] || !isDefined( game["PROMOD_KNIFEROUND"] ) ) + { + if ( level.hardcoreMode && getDvarInt("weap_allow_frag_grenade") ) + player giveWeapon( "frag_grenade_short_mp" ); + else if ( getDvarInt( "weap_allow_frag_grenade" ) ) + player giveWeapon( "frag_grenade_mp" ); + + if ( player.pers[classType]["loadout_grenade"] == "flash_grenade" && getDvarInt("weap_allow_flash_grenade") ) + { + player setOffhandSecondaryClass("flash"); + player giveWeapon( "flash_grenade_mp" ); + } + else if ( player.pers[classType]["loadout_grenade"] == "smoke_grenade" && getDvarInt("weap_allow_smoke_grenade") ) + { + player setOffhandSecondaryClass("smoke"); + player giveWeapon( "smoke_grenade_mp" ); + } + + player maps\mp\gametypes\_class::sidearmWeapon(); + player maps\mp\gametypes\_class::primaryWeapon(); + } + else + player thread maps\mp\gametypes\_globallogic::removeWeapons(); + + player allowsprint(true); + player setMoveSpeedScale( 1.0 - 0.05 * int( isDefined( player.curClass ) && player.curClass == "assault" ) * int( isDefined( game["PROMOD_KNIFEROUND"] ) && !game["PROMOD_KNIFEROUND"] || !isDefined( game["PROMOD_KNIFEROUND"] ) ) ); + player allowjump(true); + } + } + + UpdateClientNames(); + + if ( game["promod_timeout_called"] ) + { + thread promod\timeout::main(); + return; + } +} + +stratTime() +{ + thread stratTimer(); + + level.strat_over = false; + strat_time_left = game["PROMOD_STRATTIME"] + level.prematchPeriod * int( getDvarInt( "promod_allow_strattime" ) && isDefined( game["CUSTOM_MODE"] ) && game["CUSTOM_MODE"] && level.gametype == "sd" ); + + while ( !level.strat_over ) + { + players = getentarray("player", "classname"); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( ( player.pers["team"] == "allies" || player.pers["team"] == "axis" ) && !isDefined( player.pers["class"] ) ) + player.statusicon = "hud_status_dead"; + } + + wait 0.25; + + strat_time_left -= 0.25; + + if ( strat_time_left <= 0 || game["promod_timeout_called"] ) + level.strat_over = true; + } + + level notify( "strat_over" ); +} + +stratTimer() +{ + matchStartText = createServerFontString( "objective", 1.5 ); + matchStartText setPoint( "CENTER", "CENTER", 0, -60 ); + matchStartText.sort = 1001; + + if( isDefined(game["PROMOD_KNIFEROUND"]) && game["PROMOD_KNIFEROUND"] ) + matchStartText setText( "Knife Round" ); + else + matchStartText setText( "Strat Time" ); + + matchStartText.foreground = false; + matchStartText.hidewheninmenu = false; + + matchStartTimer = createServerTimer( "objective", 1.4 ); + matchStartTimer setPoint( "CENTER", "CENTER", 0, -45 ); + matchStartTimer setTimer( game["PROMOD_STRATTIME"] + level.prematchPeriod * int( getDvarInt( "promod_allow_strattime" ) && isDefined( game["CUSTOM_MODE"] ) && game["CUSTOM_MODE"] && level.gametype == "sd" ) ); + matchStartTimer.sort = 1001; + matchStartTimer.foreground = false; + matchStartTimer.hideWhenInMenu = false; + + level waittill( "strat_over" ); + + if ( isDefined( matchStartText ) ) + matchStartText destroy(); + + if ( isDefined( matchStartTimer ) ) + matchStartTimer destroy(); +} \ No newline at end of file diff --git a/promod/timeout.gsc b/promod/timeout.gsc new file mode 100644 index 0000000..9465a09 --- /dev/null +++ b/promod/timeout.gsc @@ -0,0 +1,144 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include maps\mp\gametypes\_hud_util; + +main() +{ + game["promod_in_timeout"] = 1; + + thread maps\mp\gametypes\_globallogic::disableBombsites(); + thread promod\readyup::main(); + thread disableBombBag(); + + level.timeout_over = false; + level.timeout_time_left = 300; + + thread timeoutLoop(); +} + +disableBombBag() +{ + if ( level.gametype == "sd" ) + { + trigger = getEnt( "sd_bomb_pickup_trig", "targetname" ); + visuals = getEnt( "sd_bomb", "targetname" ); + + if ( isDefined( trigger ) ) + trigger delete(); + + if ( isDefined( visuals ) ) + visuals delete(); + + if ( isDefined( level.sdBomb ) ) + level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + } +} + +timeoutLoop() +{ + if ( !isDefined( game["LAN_MODE"] ) || !game["LAN_MODE"] ) + thread timeoutLeft(); + + if ( !isDefined( level.ready_up_over ) ) + level.ready_up_over = false; + + while ( !level.timeout_over ) + { + wait 0.25; + + if ( level.timeout_time_left <= 0 || level.ready_up_over ) + { + level.timeout_over = true; + level.ready_up_over = 1; + + game["promod_timeout_called"] = false; + } + } +} + +timeoutLeft() +{ + while( !level.timeout_over ) + { + wait 0.25; + level.timeout_time_left -= 0.25; + } +} + +timeoutCall() +{ + if ( (isDefined( level.ready_up_over ) && !level.ready_up_over || isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] != "match") || ( level.gametype != "sd" && level.gametype != "sab" ) ) + { + self iprintln("^3Timeout is not available right now"); + return; + } + + if ( game["promod_timeout_called"] ) + { + if ( isDefined( game["promod_timeout_called_by"] ) ) + { + if ( self == game["promod_timeout_called_by"] ) + { + iprintln("^3Timeout cancelled by " + self.name); + + if ( level.gametype == "sd" ) + game[self.pers["team"] + "_timeout_called"] = 0; + + game["promod_timeout_called"] = false; + + if ( isDefined( level.scorebot ) && level.scorebot ) + { + timeout_team = ""; + if ( self.pers["team"] == game["attackers"] ) + timeout_team = "attack"; + else if ( self.pers["team"] == game["defenders"] ) + timeout_team = "defence"; + + game["promod_scorebot_ticker_buffer"] += "timeout_cancelled" + timeout_team + "" + self.name; + } + } + else + self iprintln("^3Timeout already called by " + game["promod_timeout_called_by"].name); + } + else + self iprintln("^3Timeout already called"); + + return; + } + + if ( game[self.pers["team"] + "_timeout_called"] && (!isDefined( game["LAN_MODE"] ) || !game["LAN_MODE"]) ) + { + self iprintln("^3Only one timeout per team/half allowed"); + return; + } + + game["promod_timeout_called_by"] = self; + iprintln("^3Timeout called by " + self.name); + + if ( !isDefined( level.strat_over ) || level.strat_over ) + self iprintln("^3Call timeout again to cancel"); + + if ( isDefined( level.scorebot ) && level.scorebot ) + { + timeout_team = ""; + if ( self.pers["team"] == game["attackers"] ) + timeout_team = "attack"; + else if ( self.pers["team"] == game["defenders"] ) + timeout_team = "defence"; + + game["promod_scorebot_ticker_buffer"] += "timeout_called" + timeout_team + "" + self.name; + } + + if ( level.gametype == "sd" ) + game[self.pers["team"] + "_timeout_called"] = 1; + + game["promod_timeout_called"] = true; +} \ No newline at end of file diff --git a/promod_ruleset/custom_public.gsc b/promod_ruleset/custom_public.gsc new file mode 100644 index 0000000..e66120a --- /dev/null +++ b/promod_ruleset/custom_public.gsc @@ -0,0 +1,229 @@ +main() +{ + // custom_public ruleset, promod live v2 + // boolean logic, 0 = false, 1 or higher = true + + // sd + setDvar( "scr_sd_bombtimer", 45 ); // [1->] (seconds) + setDvar( "scr_sd_defusetime", 7 ); // [1->] (seconds) + setDvar( "scr_sd_multibomb", 0 ); // [0-1] (everyone can plant) + setDvar( "scr_sd_numlives", 1 ); // [0->] (amount of lives) + setDvar( "scr_sd_planttime", 5 ); // [1->] (seconds) + setDvar( "scr_sd_playerrespawndelay", 0 ); // [0->] (seconds) + setDvar( "scr_sd_roundlimit", 20 ); // [0->] (points) + setDvar( "scr_sd_roundswitch", 10 ); // [0->] (points) + setDvar( "scr_sd_scorelimit", 0 ); // [0->] (points) + setDvar( "scr_sd_timelimit", 1.75 ); // [0->] (minutes) + setDvar( "scr_sd_waverespawndelay", 0 ); // [0->] (seconds) + + // dom + setDvar( "scr_dom_numlives", 0 ); // [0->] (amount of lives) + setDvar( "scr_dom_playerrespawndelay", 7 ); // [0->] (seconds) + setDvar( "scr_dom_roundlimit", 2 ); // [0->] (points) + setDvar( "scr_dom_roundswitch", 1 ); // [0->] (points) + setDvar( "scr_dom_scorelimit", 0 ); // [0->] (points) + setDvar( "scr_dom_timelimit", 15 ); // [0->] (minutes) + setDvar( "scr_dom_waverespawndelay", 0 ); // [0->] (seconds) + + // koth + setDvar( "koth_autodestroytime", 120 ); // [1->] (hq online time in seconds) + setDvar( "koth_capturetime", 20 ); // [1->] (time to capture hq in seconds) + setDvar( "koth_delayPlayer", 0 ); // [0-1] (override default respawn delay in seconds) + setDvar( "koth_destroytime", 10 ); // [1->] (time to destroy hq in seconds) + setDvar( "koth_kothmode", 0 ); // [0-1] (classic mode, non-classic) + setDvar( "koth_spawnDelay", 45 ); // [0->] (default respawn delay in seconds) + setDvar( "koth_spawntime", 10 ); // [0->] (hq spawn time in seconds) + setDvar( "scr_koth_numlives", 0 ); // [0->] (amount of lives) + setDvar( "scr_koth_playerrespawndelay", 0 ); // [0->] (seconds) + setDvar( "scr_koth_roundlimit", 2 ); // [0->] (points) + setDvar( "scr_koth_roundswitch", 1 ); // [0->] (points) + setDvar( "scr_koth_scorelimit", 0 ); // [0->] (points) + setDvar( "scr_koth_timelimit", 15 ); // [0->] (minutes) + setDvar( "scr_koth_waverespawndelay", 0 ); // [0->] (seconds) + + // sab + setDvar( "scr_sab_bombtimer", 45 ); // [1->] (seconds) + setDvar( "scr_sab_defusetime", 5 ); // [1->] (seconds) + setDvar( "scr_sab_hotpotato", 0 ); // [0-1] (shared bomb timer) + setDvar( "scr_sab_numlives", 0 ); // [0->] (amount of lives) + setDvar( "scr_sab_planttime", 5 ); // [1->] (seconds) + setDvar( "scr_sab_playerrespawndelay", 7 ); // [0->] (seconds) + setDvar( "scr_sab_roundlimit", 4 ); // [0->] (points) + setDvar( "scr_sab_roundswitch", 2 ); // [0->] (points) + setDvar( "scr_sab_scorelimit", 0 ); // [0->] (points) + setDvar( "scr_sab_timelimit", 10 ); // [0->] (minutes) + setDvar( "scr_sab_waverespawndelay", 0 ); // [0->] (seconds) + + // tdm + setDvar( "scr_war_numlives", 0 ); // [0->] (amount of lives) + setDvar( "scr_war_playerrespawndelay", 0 ); // [0->] (seconds) + setDvar( "scr_war_roundlimit", 2 ); // [0->] (points) + setDvar( "scr_war_scorelimit", 0 ); // [0->] (points) + setDvar( "scr_war_roundswitch", 1 ); // [0->] (points) + setDvar( "scr_war_timelimit", 15 ); // [0->] (minutes) + setDvar( "scr_war_waverespawndelay", 0 ); // [0->] (seconds) + + // dm + setDvar( "scr_dm_numlives", 0 ); // [0->] (amount of lives) + setDvar( "scr_dm_playerrespawndelay", 0 ); // [0->] (seconds) + setDvar( "scr_dm_roundlimit", 1 ); // [0->] (points) + setDvar( "scr_dm_scorelimit", 0 ); // [0->] (points) + setDvar( "scr_dm_timelimit", 10 ); // [0->] (points) + setDvar( "scr_dm_waverespawndelay", 0 ); // [0->] (seconds) + + // class limits + setDvar( "class_assault_limit", 64 ); + setDvar( "class_specops_limit", 2 ); + setDvar( "class_demolitions_limit", 1 ); + setDvar( "class_sniper_limit", 1 ); + + setDvar( "class_assault_allowdrop", 1 ); + setDvar( "class_specops_allowdrop", 1 ); + setDvar( "class_demolitions_allowdrop", 0 ); + setDvar( "class_sniper_allowdrop", 0 ); + + // assault + setDvar( "weap_allow_m16", 1 ); + setDvar( "weap_allow_ak47", 1 ); + setDvar( "weap_allow_m4", 1 ); + setDvar( "weap_allow_g3", 1 ); + setDvar( "weap_allow_g36c", 1 ); + setDvar( "weap_allow_m14", 1 ); + setDvar( "weap_allow_mp44", 1 ); + + // assault attachments + setDvar( "attach_allow_assault_none", 1 ); + setDvar( "attach_allow_assault_silencer", 1 ); + + // smg + setDvar( "weap_allow_mp5", 1 ); + setDvar( "weap_allow_uzi", 1 ); + setDvar( "weap_allow_ak74u", 1 ); + + // smg attachments + setDvar( "attach_allow_specops_none", 1 ); + setDvar( "attach_allow_specops_silencer", 1 ); + + // shotgun + setDvar( "weap_allow_m1014", 1 ); + setDvar( "weap_allow_winchester1200", 1 ); + + // sniper + setDvar( "weap_allow_m40a3", 1 ); + setDvar( "weap_allow_remington700", 1 ); + + // pistol + setDvar( "weap_allow_beretta", 1 ); + setDvar( "weap_allow_colt45", 1 ); + setDvar( "weap_allow_usp", 1 ); + setDvar( "weap_allow_deserteagle", 1 ); + setDvar( "weap_allow_deserteaglegold", 1 ); + + // pistol attachments + setDvar( "attach_allow_pistol_none", 1 ); + setDvar( "attach_allow_pistol_silencer", 1 ); + + // grenades + setDvar( "weap_allow_flash_grenade", 1 ); + setDvar( "weap_allow_frag_grenade", 1 ); + setDvar( "weap_allow_smoke_grenade", 1 ); + + // assault class default loadout (preserved) + setDvar( "class_assault_primary", "ak47" ); + setDvar( "class_assault_primary_attachment", "none" ); + setDvar( "class_assault_secondary", "deserteagle" ); + setDvar( "class_assault_secondary_attachment", "none" ); + setDvar( "class_assault_grenade", "smoke_grenade" ); + setDvar( "class_assault_camo", "camo_none" ); + + // specops class default loadout (preserved) + setDvar( "class_specops_primary", "ak74u" ); + setDvar( "class_specops_primary_attachment", "none" ); + setDvar( "class_specops_secondary", "deserteagle" ); + setDvar( "class_specops_secondary_attachment", "none" ); + setDvar( "class_specops_grenade", "smoke_grenade" ); + setDvar( "class_specops_camo", "camo_none" ); + + // demolitions class default loadout (preserved) + setDvar( "class_demolitions_primary", "winchester1200" ); + setDvar( "class_demolitions_primary_attachment", "none" ); + setDvar( "class_demolitions_secondary", "deserteagle" ); + setDvar( "class_demolitions_secondary_attachment", "none" ); + setDvar( "class_demolitions_grenade", "smoke_grenade" ); + setDvar( "class_demolitions_camo", "camo_none" ); + + // sniper class default loadout (preserved) + setDvar( "class_sniper_primary", "m40a3" ); + setDvar( "class_sniper_primary_attachment", "none" ); + setDvar( "class_sniper_secondary", "deserteagle" ); + setDvar( "class_sniper_secondary_attachment", "none" ); + setDvar( "class_sniper_grenade", "smoke_grenade" ); + setDvar( "class_sniper_camo", "camo_none" ); + + // team killing + setDvar( "scr_team_fftype", 1 ); // [0-3] (disabled, enabled, reflect, shared) + setDvar( "scr_team_teamkillpointloss", 5 ); // [0->] (points) + + // player death/respawn settings + setDvar( "scr_player_forcerespawn", 1 ); // [0-1] (require player to press use key to spawn, do not require use key to spawn) + setDvar( "scr_game_deathpointloss", 0 ); // [0->] (points) + setDvar( "scr_game_suicidepointloss", 0 ); // [0->] (points) + setDvar( "scr_player_suicidespawndelay", 0 ); // [0->] (points) + + // player fall damage + setDvar( "bg_fallDamageMinHeight", 140 ); // [1->] (min height to inflict min fall damage) + setDvar( "bg_fallDamageMaxHeight", 350 ); // [1->] (max height to inflict max fall damage) + + // logging (not likely to be changed) + setDvar( "logfile", 1 ); + setDvar( "g_log", "games_mp.log" ); + setDvar( "g_logSync", 0 ); + + // server issues (not likely to be changed) + setDvar( "g_inactivity", 0 ); + setDvar( "g_no_script_spam", 1 ); + setDvar( "g_antilag", 1 ); + setDvar( "g_smoothClients", 1 ); + setDvar( "sv_allowDownload", 1 ); + setDvar( "sv_maxPing", 0 ); + setDvar( "sv_minPing", 0 ); + setDvar( "sv_reconnectlimit", 3 ); + setDvar( "sv_timeout", 240 ); + setDvar( "sv_zombietime", 2 ); + setDvar( "sv_floodprotect", 4 ); + setDvar( "sv_kickBanTime", 0 ); + setDvar( "sv_disableClientConsole", 0 ); + setDvar( "sv_voice", 0 ); + setDvar( "sv_clientarchive", 1 ); + setDvar( "timescale", 1 ); + + // various + setDvar( "g_allowVote", 0 ); // [0-1] + setDvar( "g_deadChat", 1 ); // [0-1] + setDvar( "scr_game_allowkillcam", 0 ); // [0-1] + setDvar( "scr_game_spectatetype", 1 ); // [0-2] (disabled, team only, all) + setDvar( "scr_game_matchstarttime", 10 ); // [0->] (seconds) + setDvar( "scr_enable_hiticon", 2 ); // [0-2] (disabled, hit icon on, hit icon on but not through walls) + setDvar( "scr_enable_scoretext", 1 ); // [0-1] (exp popups, +5 etc) + setDvar( "promod_allow_strattime", 0 ); // [0-1] (sd only) + setDvar( "promod_allow_readyup", 0 ); // [0-1] + setDvar( "promod_kniferound", 0 ); // [0-1] (sd only) + setDvar( "g_maxDroppedWeapons", 16 ); // [2-32] (maximum number of dropped weapons before recycling) + setDvar( "scr_hardcore", 0 ); // [0-1] + + // website + setDvar( "promod_hud_website", "www.codpromod.com" ); // (avoid "//" here) + + // messagecenter + setDvar( "promod_mc_enable", 0 ); // [0-1] + setDvar( "promod_mc_rs_every_round", 0 ); // [0-1] (restarts messages on round-based gametypes) + setDvar( "promod_mc_delay", 45 ); // [1->] (default delay in seconds between messages) + setDvar( "promod_mc_loopdelay", 45 ); // [1->] (delay in seconds until it starting over) + setDvar( "promod_mc_maxmessages", 3 ); // [1->] (set this equivalent to number of messages) + setDvar( "promod_mc_message_1", "Message Center ON" ); + setDvar( "promod_mc_message_2", "Set Me Up Or Turn Me OFF" ); + setDvar( "promod_mc_message_3", "<*nextmap*>" ); + setDvar( "promod_mc_messagedelay_1", 0 ); // [1->] (overrides default delay in seconds between messages, e.g special messages) + setDvar( "promod_mc_messagedelay_2", 0 ); + setDvar( "promod_mc_messagedelay_3", 0 ); +} \ No newline at end of file diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..eb5b372 --- /dev/null +++ b/readme.txt @@ -0,0 +1,366 @@ +Promod LIVE V2.20 EU - README +http://www.codpromod.com +2014-05-13 +#codpromod @ QuakeNet + +Maintained by Ingram + +Sponsored by FragNet +http://www.fragnet.net + +Zip-package (promodlive220_eu.zip) contains: + +LICENSE +pml220\mod.ff +pml220\pml220.iwd +pml220\z_c_r.iwd +pb\stock_iwd_md5.cfg +pb\promod_iwd_md5.cfg +pb\pbsvuser.cfg +readme.txt +server_setup.txt +server.cfg + +LIVE V2.20: +- Fixed issues with vehicle damage source being different compared to previous releases + +LIVE V2.19: +- Fixed a server crash related to damage inflicted via exploding barrels +- Re-implemented vehicle handling. This fixes two known issues: + 1) Cars would keep burning and not explode after a while + 2) Throwing a grenade to one of the headlights would explode the car + +LIVE V2.18: +- Fixed the exploit where players could hide behind floodlights (solution found by Gunner) +- Removed the flashbang blinding effect during kniferound + +LIVE V2.17: +- Shortened file and folder names in order to fix (or avoid) "file sum/name mismatch" error. Please note that fs_game naming scheme is slighly different from now on. +- Added timer to pre-match ready up period. + +Public server owners should rename their z_custom_ruleset.iwd to the new shorter version of z_c_r.iwd, nothing inside is changed. + +LIVE V2.16: +- Fixed a small bug that appeared during 2.15. We're sorry about that! + +LIVE V2.15: +- Fixed a bug where players could fall silently by holding down a grenade key and not having any grenades in inventory +- Reworked damage logic, no changes in damage values, but minimal performance boost +- Included a reworked version of damage and accuracy statistics (B-4-6), counters will reset after displaying current values +- Included new log prints: + Accuracy and damage: P_A;;;;;;;;; + Bomb plants (SD & SAB): P_P;;; + Bomb defuses (SD & SAB): P_D;;; + Flag captures (DOM): P_F;;; + Headquarters captures (KOTH): P_HQC;;; + Headquarters destroys (KOTH): P_HQD;;; + +LIVE V2.14: +- Fixed boosting with modified g_knockback value +- Game will message all players if any serverside DVars are being modified +- Added comp_public_lan, comp_public_hc_lan and custom_public_lan modes +- Fixed an issue with scorebot messages being generated incorrectly + +LIVE V2.13: + +- Implemented MOTD (message of the day), can be set via dvar "scr_motd" +- Various fixes and improvements to the shoutcaster UI +- Fixed problems with loading preserved classes +- Invalid gametypes on custom maps will no longer cause server to crash +- Added possibility to set scores with promod_mode (more info in promod modes section) +- Removed flinching animation when player get shot +- Removed ability to shoot during strat time +- Improved custom maps compability +- Player is immune to flashbangs in ready up and start mode flying +- Main menu changes (not much) +- Serverside performance improvements +- Knife round fixes, weapon abuse eliminated +- Fixed ready-up messages +- Other various UI tweaks and improvements + +LIVE V2.12: + +- Protection against clientside executable modification +- Fixed knife-round to always remove the weapons and ammo, all other damage than from the knife is disabled as an extra measure +- Record-menu will no longer appear twice in knife-rounds +- Fixed choosing team menu on custom maps +- Various fixes which improve server performance + +LIVE V2.11: + +- Soften smoke edges (also known as r_zfeather) is back to being forced off +- Dead chat is no longer automatically handled in public-modes +- Promod will properly force player to reconnect to the server if "vid_restart" was called +- The "You killed..." text's Y-position can be modified in devmap for movie-makers (see below) +- Removed player head-icons from Marines and SAS (stock bug, as opposing teams don't have head-icons) +- Fixed planted/defused/destroyed announcer sounds +- Promod header will inform about the usage of knife round feature +- Specular effect on car-glasses made transparent +- Better overall handling of player status icons +- The bomb-briefcase is no longer visible in timeout or knife-round +- Ability to cancel timeouts by the caller (by calling another timeout) +- Ready-up hud will always display own status (important for shoutcasters) +- Shoutcaster will automatically follow another player when current player dies +- Shoutcasters have ability to spectate another shoutcaster when that shoutcaster is using follow-player-binds +- Full map restart is called when server admin changes game type and issues a fast restart +- Fixed a bug where a player could sprint longer after planting/defusing +- Ragdolls removed because of random behaviour +- Added an option for custom map developers to specify default sunlight (level.sunlight) in map script to correctly set with Promod "stock" sunlight option +- Strattime and knife round in public-modes are now working properly +- Scorebot improvements and fixes, see FAQ for comprehensive documentation +- Different game menu adjustments +- Dvar-monitor will now display both the old and the new value when change is detected +- Before a match starts, a list of dvar changes during ready-up mode is displayed +- Some additions to strictly forced server settings +- Fixed several issues with bomb-drop +- Added training-dummy feature for strat mode, which will only work on listen/local servers with PunkBuster turned off +- Added a record-menu which will popup once a player is ready, this menu can optionally be disabled in the quickmessage menu: B-4-5 +- Added a sound notification to the last player to ready-up + +LIVE V2.10: + +- Game code optimizations which reduce the size of mod over 50% compared to V2.04 +- Killspec mode. Commits suicide, releases current class spot and does not respawn the player before a class is selected again. Can be activated through quickmessage menu: B-4-4 or by console command openscriptmenu quickpromod killspec +- Moved game timer closer to the edge of the screen for shoutcasters +- Improved server integrity checks +- Defaulted "promod_mode" to strat when starting a new server from main menu +- Knife round. For match modes adds an extra round and ready-up mode, in public games it will be the first round of map. It can be toggled via knife keyword in promod_mode (for example match_mr10_knife) or dvar "promod_kniferound" in public games. Scorebot announces knife round via knife_round keyword +- Ready-up mode is more responsive +- Improved promod_mode, for use see below +- Increased dropped weapon disappearing time to 3 minutes +- Promod Commands and Promod Graphics menus can be accessed via openscriptmenu quickpromod controls / graphics respectively +- Added tactical timeouts for lan mode. It is possible to take unlimited amount of timeouts for unlimited time +- Improved strat mode +- Fixed public server weapons glitch +- Forced fs_game for match modes. If you don't know how to change fs_game setting, please contact your Game Server Provider +- Removed red enemy dots from large map +- Included with package: PunkBuster MD5Tool checks for main/iw_##.iwd files. This needs to be set up manually, see below +- Added echo command, which will display text only to yourself in game message box. Usage: openscriptmenu echo text_I_want_to_display - note that underscores are replaced with spaces. Works also with colors. However stacking two openscriptmenu commands to one bind will not work +- Shoutcasters can now choose who to follow using binds and even toggle players by their current class + +Plus many other visual, non-gameplay related improvements. + +LIVE V2.04: + +- Reintroduced "cl_maxpackets" enforcement to "100" +- Small fix in the scorebot +- Weapon class availability fixed on halftime + +FAQ + +Q: What about the hardcore, and support for all gametypes, how do I use them? +A: For a complete list of "promod_modes", see below. + +Q: I want to run my own custom Promod-server with skins etc, how? +A: In order to run your own custom Promod-server you'll need to change the fs_game to anything besides "mods/pml220" as well as not using match-modes. You will now be able to modify the Promod IWDs and add additional iwd-files. + +Q: Can I use this mod as a movie mod? +A: Yes, you can! Commands (which are important for movie-making) are only forced on the clients once connected. Demos needs to be loaded using devmap before starting a demo ("devmap mp_crash;disconnect"). + +Q: How do I get the scorebot running? +A: See below how to enable scorebot. + +Q: Class related binds, how do they work? +A: See below for a list of commands. + +Q: What's the difference between the EU and NE version of Promod? +A: The NE version of Promod has rate and cl_maxpackets settings unlocked and radar does not display enemy indicators while shooting. NE stands for Non-Europe. + +Q: My question is not answered here. +A: Easiest way to contact us is via mail or join #codpromod @ QuakeNet. + +Q: How do I get the training-dummy to work? +A: First put up a local home-hosted server without PB (set sv_punkbuster to "0" in your config, start game, launch Promod from the mods-menu and load a map with the console or menu). The default button for spawning a bot is the "N" button (bind X "+actionslot 1"). + +PROMOD MODES + +The promod_mode dvar follows a specific syntax. However the game accepts the bits between underscores ( _ ) in any order. + +match: standard match mode, may not be used with knockout mode. Round limit = mr#*2 +knockout: knockout match mode, may not be used with standard match mode. Score limit = mr#+1 +mr#: maxrounds - see above for use. Default is 10. Works only in Search & Destroy and Sabotage. +lan: lan mode - g_antilag 0, PunkBuster messages turned off, may not be used with pb mode. +hc: hardcore mode (disables some HUD elements and reduces health level to 30). +knife: knife round - adds a knife round and an extra ready-up mode to Search & Destroy matches. +1v1/2v2: used for 1v1 and 2v2 matches, disables Demolitions and Sniper classes. +pb: disables PunkBuster warnings for online modes, may not be used with lan mode. +#:#: will set match score in S&D using A:D format - useful in case of a restart, may not be used with knife mode. + +For example "promod_mode match_mr10_knife_pb" will enable knife round and disable PunkBuster warnings in standard maxrounds 10 mode. + +There are also some other modes, these can not be combined with the tags above. + +comp_public - the default mode for competitive public +comp_public_lan - same as above, but for LAN servers +comp_public_hc - competitive public in hardcore mode +comp_public_hc_lan - same as above, but for LAN servers +custom_public - custom public mode reading settings from z_c_r.iwd +custom_public_lan - same as above, but for LAN servers +strat - strategy mode for practicing + +SCOREBOT + +The "ticker" is updating events every 10 seconds, each event is starting with a number from 0-9. +Messages are delimited by the "SOH" character (start of header). +To enable scorebot, add this line to the server-config: + +seta promod_enable_scorebot "1" + +Static info: + +attack_score "SOH" player_name "SOH" player_alive "SOH" player_kills "SOH" player_assists "SOH" player_deaths "SOH" player_bombcarrier +defence_score "SOH" player_name "SOH" player_alive "SOH" player_kills "SOH" player_assists "SOH" player_deaths "SOH" player_bombcarrier + +Ticker events: + +"SOH" "round_winner" "SOH" winners "SOH" attack_score "SOH" defence_score +"SOH" "map_complete" "SOH" "attack" "SOH" attack_score "SOH" "defence" "SOH" defence_score +"SOH" "knife_round" +"SOH" start_text "SOH" starting_round +"SOH" "map" "SOH" mapname "SOH" gametype +"SOH" "kill" "SOH" killer_name "SOH" weapon "SOH" killed_name "SOH" headshot +"SOH" "assist_by" "SOH" player_name +"SOH" rdy_text +"SOH" "timeout_cancelled" "SOH" timeout_team "SOH" player_name +"SOH" "timeout_called" "SOH" timeout_team "SOH" player_name +"SOH" "captured" label "SOH" player_name //dom +"SOH" "hq_captured" "SOH" player_name //hq +"SOH" "hq_destroyed" "SOH" player_name //hq +"SOH" "pickup_bomb" "SOH" player_name //sab, sd +"SOH" "dropped_bomb" "SOH" player_name //sab, sd +"SOH" "defused_by" "SOH" player_name //sab, sd +"SOH" "bomb_exploded" //sab, sd +"SOH" "planted_by" "SOH" player_name // sab, sd + +Definitions: + +attack_score = score of the attacking side, integer +defence_score = score of the defending side, integer +player_name = name of the player +player_alive = if player is alive, integer +player_assists = number of assists, integer +player_deaths = number of deaths, integer +player_bombcarrier = if player is carrying bomb, integer +winners = attack, defence or tie +start_text = "1st_half_started", "2nd_half_started", "match_resumed" (from timeout), "round_start" +starting_round = the round starting, integer +mapname = the map name in "mp_" format +gametype = the gametype in short format +killer_name = the name of the killer +weapon = weapon used by the killer +killed_name = the name of the player who got killed +headshot = if it was a headshot, integer +rdy_text = 1st_half_ready_up, 2nd_half_ready_up, timeout_ready_up +timeout_team = the team of the player who made a timeout +label = A, B, C etc + +Broadcasted dvars: + +__promod_attack_score +__promod_defence_score +__promod_mode +__promod_ticker +__promod_version + +FORCED COMMANDS + +All these dvars are forced by Promod (automatically), make sure they stay untouched/within range to avoid being punished! +Note that these does not apply in Shoutcaster mode. + +dynent_active 0 +rate 25000 +cg_nopredict 0 +sm_enable 0 +r_dlightLimit 0 +r_lodscalerigid 1 +r_lodscaleskinned 1 +r_filmtweakInvert 0 +r_zfeather 0 +cg_viewzsmoothingmin 1 +cg_viewzsmoothingmax 16 +cg_viewzsmoothingtime 0.1 +cg_huddamageiconheight 64 +cg_huddamageiconwidth 128 +cg_huddamageiconinscope 0 +cg_huddamageiconoffset 128 +cg_huddamageicontime 2000 +developer 0 +phys_gravity -800 + +com_maxfps 40 - 250 +cl_maxpackets 60 - 100 +compassplayerwidth EQUAL TO compassplayerheight +compassfriendlywidth EQUAL TO compassfriendlyheight + +DEMO VIEWING + +There are some special dvars made to control hud-elements for demo/movie purposes. +They will only work in maps loaded with cheats (devmap). Don't forget the "set" prefix to add new dvars in the console. + +These include: + +promod_movie_hidescorebar // [0-1] (hides the mini-scorebar completely including timer) +promod_centermessage_position // [x+-] (overrides default Y-position of the "You killed..." text) + +CLASS BINDS + +It is possible to bind these via the in-game menu (Controls - Multiplayer Controls...). +Alternatively you can manually bind them in the console/config. + +bind [KEY] [COMMAND] + +Commands: + +openscriptmenu quickpromod assault +openscriptmenu quickpromod specops +openscriptmenu quickpromod demolitions +openscriptmenu quickpromod sniper +openscriptmenu quickpromod silencer +openscriptmenu quickpromod grenade + +SHOUTCASTER BINDS + +You can bind them via the in-game menu (Shoutcast Setup). +Alternatively you can manually bind them in the console/config. + +bind [KEY] [COMMAND] + +Commands: + +openscriptmenu shoutcast_setup number +openscriptmenu shoutcast_setup assault +openscriptmenu shoutcast_setup specops +openscriptmenu shoutcast_setup demolitions +openscriptmenu shoutcast_setup sniper + +Number being 1-10 for players, it's very easy to understand which player corresponds the correct number. +1-5 symbolizes players on Attacking side from top to bottom looking at the Shoutcaster-bars. +6-10 being on the Defending side. + +Setting a class (lowercase) instead of a number will cycle through players using that class. + +CUSTOM MAPS + +In case Promod is throwing an error while playing on custom maps, make sure the IWD-files inside "usermaps/mapname" folder have the same map name in them. +For example map "mp_dahman_b3" contains a file called "mp_dahman_b3.iwd" and therefore it is not marked as a violation. + +NOTES FOR SERVER-ADMINS AND SERVER-HOSTING COMPANIES + +The dvar fs_game "mods/pml220" is forced for match-servers and do not rename any files or modify contents of them. +However custom servers with skins etc. must use something else than "mods/pml220" for example "mods/pml220_custom", it's not restricted and you are free to add additional iwd files or modify existing ones. + +Included with Promod are two PunkBuster MD5 configs, "stock_iwd_md5.cfg" and "promod_iwd_md5.cfg" which you can put in the pb-folder on your server, it contains checksums for the stock IWD-files as well as Promod-IWD for use with PunkBuster MD5 facility to prevent custom skins and other forms of cheating and abusing and can be loaded in-game by typing "\rcon pb_sv_load stock_iwd_md5.cfg" and "\rcon pb_sv_load promod_iwd_md5.cfg". + +In order to be automatically-executed, the list of checks needs to be included into the automatically-executed PunkBuster configuration files on your server (pbsv.cfg or pbsvuser.cfg): + +pb_sv_load stock_iwd_md5.cfg +pb_sv_load promod_iwd_md5.cfg // match-server only + +In case your server doesn't have any pbsv.cfg file, go in-game and type: "\rcon pb_sv_writecfg". Depending on if your server is streaming to any third-party anti-cheat site(s) you may or may not already have a pbsvuser.cfg, if you don't you can just copy all three files included to your server's PB-folder, or if the file exist add above lines to it. + +We STRONGLY encourage use of these MD5-checks! (This goes for leagues as well!) + +Due to several game engine exploits, we recommend to specify the rcon-password in the command-line of your server. If this is not possible, rename the server-config to something other than server.cfg, which would make finding rcon password more difficult. + +On another note of security, the IWD-file "z_c_r.iwd" is now running integrity checks if server is running match-mode which means you have to decide whether the server should run "promod_mode custom_public" or not. +If you later want to run match-modes you will have to use the original unmodified "z_c_r.iwd" supplied in this package. Sorry for any inconvenience caused. \ No newline at end of file diff --git a/server.cfg b/server.cfg new file mode 100644 index 0000000..d90ec2f --- /dev/null +++ b/server.cfg @@ -0,0 +1,35 @@ +// promod live v2 - sample server config v1.4 +// for public ruleset customizations, see z_c_r.iwd + +// info strings +sets _Admin "" +sets _Email "" +sets _Website "" +sets _Location "" +sets _Irc "" +sets sv_hostname "Another Promod ^1LIVE ^7V2.20 ^7Server is Born" + +// welcome message, message of the day (motd) +seta scr_motd "Please visit us at www.codpromod.com, also visit our IRC channel #codpromod @ QuakeNet" + +// password settings +//set rcon_password "" // read server_setup.txt why we don't specify rcon password here +set sv_privatePassword "" // private slots password +set g_password "" // server password + +// player slots, maxclients - privateclients = public slots +set sv_maxclients "12" // maximum number of clients +set sv_privateclients "" // number of private slots + +// client download settings +seta sv_wwwDownload "0" // enable download redirection +seta sv_wwwBaseURL "" // defines url to download from +seta sv_wwwDlDisconnected "0" // disconnect clients while downloading + +// map rotation +set sv_maprotationcurrent "" // leave empty +set sv_mapRotation "gametype war map mp_backlot gametype dom map mp_crash gametype koth map mp_crossfire gametype sab map mp_citystreets gametype sd map mp_strike gametype dm map mp_killhouse" + +// promod settings +set promod_mode "custom_public" // promod mode, for a list of promod modes see attached readme +set promod_enable_scorebot "0" // match-modes only \ No newline at end of file diff --git a/server_setup.txt b/server_setup.txt new file mode 100644 index 0000000..2fa8913 --- /dev/null +++ b/server_setup.txt @@ -0,0 +1,28 @@ +1. Create a shortcut to the COD4 executable (iw3mp.exe). +2. Right click on the shortcut and hit properties. In the target field add the command-line (sample below). +3. Click "OK" to save, click the shortcut and if you did everything right the server should now be running. + +This is a sample command-line for starting and using Promod LIVE V2 under Windows: + + +set dedicated 2 +set net_ip localhost +set net_port 28960 +set sv_punkbuster 1 +set fs_game mods/pml220 +exec server.cfg +set rcon_password password +map_rotate + +dedicated [0-2] (listen, LAN, internet) +net_ip [xxx.xxx.xxx.xxx] +net_port [1-65535] (standard is 28960) + +Make sure you put the server config (server.cfg) in the main-folder or specify correct path to it. +Please note that we also define the rcon password to the server here to prevent someone from downloading your config from server and thus view ("hack") your rcon password. + +The dvar fs_game "mods/pml220" is forced for match-servers and do not rename any files or modify contents of them. +However custom servers with skins etc. must use something else than "mods/pml220" for example "mods/pml220_custom", it's not restricted and you are free to add additional iwd files or modify existing ones. + +Included with Promod is two PunkBuster MD5 configs, "stock_iwd_md5.cfg" and "promod_iwd_md5.cfg" which you can put in the pb-folder on your server, it contains checksums for the stock IWD-files as well as Promod-IWD for use with PunkBuster MD5 facility to prevent custom skins and other forms of cheating and abusing and can be loaded in-game by typing "\rcon pb_sv_load stock_iwd_md5.cfg" and "\rcon pb_sv_load promod_iwd_md5.cfg". + +In order to be automatically-executed, the list of checks needs to be included into the automatically-executed PunkBuster configuration files on your server (pbsv.cfg or pbsvuser.cfg): + +pb_sv_load stock_iwd_md5.cfg +pb_sv_load promod_iwd_md5.cfg // match-server only + +In case your server doesn't have any pbsv.cfg, go in-game and type: "\rcon pb_sv_writecfg". Depending on if your server is streaming to any third-party anti-cheat site(s) you may or may not already have a pbsvuser.cfg, if you don't you can just copy all three files included to your servers PB-folder, or if the file exist add above lines to it. + +We STRONGLY encourage use of these MD5-checks! (This goes for leagues as well!) \ No newline at end of file diff --git a/shock/damage_mp.shock b/shock/damage_mp.shock new file mode 100644 index 0000000..d2ef7e5 --- /dev/null +++ b/shock/damage_mp.shock @@ -0,0 +1,60 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.4" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" +bg_shock_viewKickPeriod "0.001" +bg_shock_viewKickRadius "0" +bg_shock_viewKickFadeTime "0.001" +bg_shock_sound "0" +bg_shock_soundLoop "shellshock_loop" +bg_shock_soundLoopSilent "shellshock_loop_silent" +bg_shock_soundEnd "shellshock_end" +bg_shock_soundEndAbort "shellshock_end_abort" +bg_shock_soundFadeInTime "0.25" +bg_shock_soundFadeOutTime "2.5" +bg_shock_soundLoopFadeTime "2" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "underwater" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "0.50" +bg_shock_soundModEndDelay "-0.75" +bg_shock_volume_physics "0.1" +bg_shock_volume_auto "0.1" +bg_shock_volume_auto2 "0.1" +bg_shock_volume_autodog "0.1" +bg_shock_volume_bulletimpact "0.1" +bg_shock_volume_bulletwhizby "0.1" +bg_shock_volume_element "0.1" +bg_shock_volume_auto2d "0.1" +bg_shock_volume_vehicle "0.1" +bg_shock_volume_vehiclelimited "0.1" +bg_shock_volume_menu "1.0" +bg_shock_volume_body "0.1" +bg_shock_volume_body2d "0.1" +bg_shock_volume_reload "0.1" +bg_shock_volume_reload2d "0.1" +bg_shock_volume_item "0.1" +bg_shock_volume_effects1 "0.1" +bg_shock_volume_effects2 "0.1" +bg_shock_volume_weapon "0.5" +bg_shock_volume_weapon2d "0.1" +bg_shock_volume_nonshock "0.5" +bg_shock_volume_voice "0.2" +bg_shock_volume_local "0.1" +bg_shock_volume_local2 "0.1" +bg_shock_volume_ambient "0.1" +bg_shock_volume_hurt "0.1" +bg_shock_volume_player1 "0.1" +bg_shock_volume_player2 "0.1" +bg_shock_volume_music "0.1" +bg_shock_volume_musicnopause "0.1" +bg_shock_volume_mission "0.2" +bg_shock_volume_announcer "1.0" +bg_shock_volume_shellshock "1.0" +bg_shock_lookControl "1" +bg_shock_lookControl_maxpitchspeed "35" +bg_shock_lookControl_maxyawspeed "35" +bg_shock_lookControl_mousesensitivityscale "0.1" +bg_shock_lookControl_fadeTime "2" +bg_shock_movement "1" \ No newline at end of file diff --git a/sound/promod/defused.wav b/sound/promod/defused.wav new file mode 100644 index 0000000000000000000000000000000000000000..5f25952e289eedd02b8b872e652e19fb8e4449ea GIT binary patch literal 71656 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

JpbHhOgffw>$R9;sf&& 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 literal 0 HcmV?d00001 diff --git a/sound/promod/planted.wav b/sound/promod/planted.wav new file mode 100644 index 0000000000000000000000000000000000000000..742f423c11a243c734654863595b5fd6417788ef GIT binary patch literal 65158 zcmb6AWn5I<_XiB`bEXHFp}V^z6cH3LKx_=`7Q5Taxa{uk?vBesMHEp{38lLk7?|!l zvG4u+KQEs9?ah4PGjqw*xfIDdnA8(uB7odLT8P0!tNFcoq-7)VjF4ECn12}y48caTaf5NC0n=yc zmg+|6{?p#l)T{aG>uPW95uKmTM|(iCL33MOq>5J+$Z2_+`n`Uk$=&!#$JI2c>~$J* zDDYyu!~Ug}gpEZ{2pB5`eDA#IgM+7xj7+^9yTRR_yPq-4E;mwwgn zUTa_*x}VO4ol z?5-(p`_j3gWp251(b|HnKiA7vRSd7{Q#Gj7UnwGXlXY@Y^SHY1CMU@p!)%t7{hg3a zqd80Gt-3$4IP41jtixY*!>xLVc&1@Sdit*Z-60d4XY!Vi2}-}tlU)*B7$u=IEjg`ry`)+Uwl49^=AYV(^&Q&_AB;jwfvrY)D6cA64j*$lYOe z{uwS8tsgVqk#`OCs#9_o$(zny?blmRwU)G|h^BTirL!f=#LgWF9a)lNx=e6}UugTy zF~RAplatc`ds3jZzAilE^u%+yAM`ovGSVuIUZP8syLZ14FYmh2J+OO<*s9&XkzGBs zjQT?sEh@ArYA?F;r>Hcb(x+xk?W@|K^|D4&)0_s!TC3V6b(@-7JEnBUOE!yBI!ql! z-B%S^@;CA!lFW|I4!*8W@W(0Pt1c|LJ0MfY?mS$!U0&s|tJjWESH|$uV*CCLdg;=| zDN?=`g?2cpHexfaYpmZhOd45tl=6)!2pi4q#y0AXccj+BCXQk%813N|eWOo!;?0O6 zkB?SemhZ-&v@<{0{c^yM;EW)>`%u9~Y^Qdm^jcSY=Tz~!ju|b=hNX2ujV+yvR4UUt z@{wV>{9x=1v@hT(aKl0cWmK)O&WRcmQXpn{##o|m!SJ(XTR3_b#KZnh2r1a ziw{*DYZ)ZrD3g^jiWjnUX+U>t*Ld-k?(33#$+_-dqORr#4Q`V44(=n_YkgNJ(pK4B zXvoR$S9Y818@_OOk8uY^ol2S#KEb_!`ADT}scTr(jniAL%k4EBSL45uKHV2JFQAFJ z5C5buZ5>?UQ)X)Xr28&h74o~!*+f~?KCd0zfktE(umU$u>qT1T)9`x z~1hh`G(#rOo(+SHCGbu(-Cv{h@La-F>T^%&Rtaoo+w zU%u;|R@*$XPO|5D4h!lPHa=vnkIM0i)otc2>Z1OYw6m?Wen8!Z#&VH^tVnfUGf=7T z9^RJSu)lU^eMmcBoeFYnlARshE;@;=*E2kb#|GS3NgT#6ao<~S5_ns+F%yZ2>e=Fk zrlYlzs)U-MwUUM%O-~vR*X2}fF7Ya|`b`!ODvzqMZP2%T?fNNckoA@=Bz}9krBh36 zR{t8)?2)6N+`LV9!E^c`(~O*X12bIGs-u6q`SLns7whLVrnZ|+_qeSrJ33pUYp`vM zX!Y&BuREu@)n(Omq9VJ7FaBZ*wr>xc*IS(QzE42#WM`bcgBEe_*{l5a#0JN8^i+hG zy0mka8U}O+iwBCPiu!g;YMNi2Usn6~cID2d37w;46_N?<9`z?HJF7rTm2wf|xJzE> zy}0OpnMt}nYoj~@zkAepOz>w%_K4roXKxHUpu+9|KGd{XA?p~`m{93fvAG6oj_ABA zwrwBPm{={SYOmf{H?^s~JzL_dUyc8;(K_CD+A3`09$_p-5iSpA;1#@oY#%z8Ifn^U z*gB1KM_Nm8bA7#Ut!r8G-}@zf%5PWtln*W72Jxs<$?T)!(WPuIn!{s8%rx zA{#S?t%_e2HvU0yIsDljW*OnVE%o36=JK7HyE5)3Mg=^!IV){$XsB^)`la54vW0Dy zsE)z4Z)&XTB%<%K$gTq|gDUfic2r<(+YPw=+7Pn0X<$~;(CEEBMw@}0+14K&&j

&A{m(Tk=}wNtCYs;yhb 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 + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 34 + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#undef BUTTON_BG_COLOR +#define BUTTON_BG_COLOR 0 0 0 0 + +#define ORIGIN_STATUS 390 64 +#define MENU_FONT_COLOR2 1 1 1 0.5 + +#include "ui_mp/stats_info.inc" + +menuDef { + name CAC_MENU_NAME + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 7 + onESC { scriptMenuResponse "back"; } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + CHOICE_MENU_TITLE( "INVENTORY" ) + + #define BACK_OPEN; + #include "ui_mp/navcontrols.inc" + + #define CAC_SETUP_ACTION1 \ + play "mouse_click"; \ + execOnDvarStringValue loadout_class assault "set selected_weapon_class assault;set ui_weapon_class_selected @MPUI_ASSAULT_RIFLES"; \ + execOnDvarStringValue loadout_class specops "set selected_weapon_class specops;set ui_weapon_class_selected @MPUI_SUB_MACHINE_GUNS"; \ + execOnDvarStringValue loadout_class demolitions "set selected_weapon_class demolitions;set ui_weapon_class_selected @MPUI_SHOTGUNS"; \ + execOnDvarStringValue loadout_class sniper "set selected_weapon_class sniper;set ui_weapon_class_selected @MPUI_SNIPER_RIFLES"; \ + uiScript openMenuOnDvar loadout_class assault "ocd_popup_cac_assault"; \ + uiScript openMenuOnDvar loadout_class specops "ocd_popup_cac_SMG"; \ + uiScript openMenuOnDvar loadout_class demolitions "ocd_popup_cac_shotgun"; \ + uiScript openMenuOnDvar loadout_class sniper "ocd_popup_cac_sniper"; + + CHOICE_BUTTON( 1, "1. Primary Weapon", CAC_SETUP_ACTION1 ) + execKey "1" { CAC_SETUP_ACTION1; } + + #define CAC_SETUP_ACTION_ATTACHMENT \ + play "mouse_click"; \ + uiScript openMenuOnDvar loadout_class assault "ocd_attachment_popup_assault"; \ + uiScript openMenuOnDvar loadout_class specops "ocd_attachment_popup_SMG"; + + CHOICE_BUTTON_VIS( 2, "2. Primary Attachment", CAC_SETUP_ACTION_ATTACHMENT, when( dvarString( loadout_primary ) != "mp44" && dvarString( loadout_class ) != "demolitions" && dvarString( loadout_class ) != "sniper" ) ) + CHOICE_DBUTTON_VIS( 2, "2. Primary Attachment", when( dvarString( loadout_primary ) == "mp44" || dvarString( loadout_class ) == "demolitions" || dvarString( loadout_class ) == "sniper" ) ) + execKey "2" { CAC_SETUP_ACTION_ATTACHMENT; } + + #define CAC_SETUP_ACTION2 \ + play "mouse_click"; \ + open "ocd_popup_cac_secondary"; + + CHOICE_BUTTON( 3, "3. Side Arm", CAC_SETUP_ACTION2 ) + execKey "3" { CAC_SETUP_ACTION2; } + + #define CAC_SETUP_ACTION3 \ + play "mouse_click"; \ + open "ocd_popup_cac_extra"; + + CHOICE_BUTTON( 4, "4. Grenade", CAC_SETUP_ACTION3 ) + execKey "4" { CAC_SETUP_ACTION3 } + + #define CAC_SETUP_CAMOX \ + open "ocd_popup_cac_camo"; + + CHOICE_BUTTON( 5, "5. Camo", CAC_SETUP_CAMOX ) + execKey "5" { CAC_SETUP_CAMOX; } + + #define CAC_SETUP_ACTIONGO \ + play "mouse_click"; \ + scriptMenuResponse "go"; + + CHOICE_BUTTON( 6, "6. Start!", CAC_SETUP_ACTIONGO ) + execKey "6" { CAC_SETUP_ACTIONGO; } + + #define STAT_CAC_PRIMARY tableLookup("mp/statstable.csv", 4, dvarString( loadout_primary ), 0) + #define STAT_CAC_PRIMARY_ATTACHMENT tableLookup("mp/attachmentTable.csv", 4, dvarString( loadout_primary_attachment ), 9) + #define STAT_CAC_SECONDARY tableLookup("mp/statstable.csv", 4, dvarString( loadout_secondary ), 0) + #define STAT_CAC_SECONDARY_ATTACHMENT tableLookup("mp/attachmentTable.csv", 4, dvarString( loadout_secondary_attachment ), 9) + #define STAT_CAC_CAMO tableLookup("mp/attachmentTable.csv", 4, dvarString( loadout_camo ), 11) + + #include "ui_mp/cac_loadout_ingame.inc" +} + +#define PREPROC_ATTACH_CLOSEALL \ +close "ocd_popup_cac_primary"; \ +close "ocd_popup_cac_secondary"; \ +close "ocd_popup_cac_assault"; \ +close "ocd_popup_cac_SMG"; \ +close "ocd_popup_cac_sniper"; \ +close "ocd_popup_cac_shotgun"; \ +close "ocd_attachment_popup_assault"; \ +close "ocd_attachment_popup_SMG"; \ +close "ocd_attachment_popup_pistol"; \ +close "ocd_popup_cac_camo"; \ + +#include "ui_mp/weaponinfo.menu" +#include "ui_mp/popupstyle.inc" +#include "ui/choices_setup_popmenu.menu" + +#undef CHOICE_SIZE_X +#define CHOICE_SIZE_X 216 + +#undef NEW_X_OFFSET +#define NEW_X_OFFSET (0-CHOICE_SIZE_X) + +#undef NEW_Y_OFFSET +#define NEW_Y_OFFSET (0-2) + +#define LOCAL_WEAPON_INFO_WINDOW( highlight_dvar ) \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH-6) -4 280 CHOICE_POPUP_HEIGHT( 7 ) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "white", CHOICE_POPUP_BORDER_COLOR, 1, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "attachment" && dvarString(ui_inside_popup) != "camo" ); ) \ + LOADOUT_PLATING_RAW( CHOICE_POPUP_WIDTH 8, -2, 0, 280, (CHOICE_POPUP_HEIGHT( 7 )-4), CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN visible when( dvarString(ui_inside_popup) != "attachment" && dvarString(ui_inside_popup) != "camo" );, 0, 0 )\ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+6) 30 256 48 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "gradient_bottom", 1 1 1 0.3, 0, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "attachment" && dvarString(ui_inside_popup) != "camo" ); ) \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+72) -6 180 90 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, tablelookup("mp/statsTable.csv",4,dvarString(highlight_dvar),6), 1 1 1 1, 0, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "attachment" && dvarString(ui_inside_popup) != "camo" ); ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 58 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/statstable.csv",4,dvarString(highlight_dvar),3), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE visible when( dvarString(ui_inside_popup) != "attachment" && dvarString(ui_inside_popup) != "camo" ); ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 80 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/statstable.csv",4,dvarString(highlight_dvar),7), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) \ + +#define LOCAL_PRIMARY_WEAPON_ACTION( suffix, weapClass, weapRef ) \ + play "mouse_click"; \ + execOnDvarStringValue loadout_primary_attachment gl ""; \ + scriptMenuResponse "loadout_primary:"weapRef;\ + setdvar loadout_primary weapRef; \ + close self; + +#define WI_FOCUS_ACTION( weaponRef ) \ + exec "set ui_primary_highlighted "weaponRef; + +#define LOCAL_WEAPON_ITEM( suffix, itemNum, weaponName, weaponClass, weaponRef )\ + CHOICE_BUTTON_FOCUS_VIS_NOHI( itemNum, "", ;, WI_FOCUS_ACTION( weaponRef ), ;, when( !dvarBool( "weap_allow_"weaponRef ) ); ) \ + CHOICE_DBUTTON_VIS( itemNum, weaponName, when( 1 ); ) \ + CHOICE_BUTTON_FOCUS_VIS_ADV( itemNum, weaponName, LOCAL_PRIMARY_WEAPON_ACTION( suffix, weaponClass, weaponRef ), \ + WI_FOCUS_ACTION( weaponRef ), ;, when( dvarBool( "weap_allow_"weaponRef ) );, \ + dvarBool( "weap_allow_"weaponRef ) ) \ + +menuDef +{ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_primary", 5, (CHOICE_X( 1 )-2), (CHOICE_Y( 1 )-4), ;, execnow "set ui_inside_popup weapon_class; set ui_show_preview 1";, 1 ) + onClose{ execnow "set ui_show_preview 0; set ui_primary_highlighted 0; set ui_attachment_highlighted 0"; } + + #define LOCAL_WEAPON_CLASS( itemNum, ptext, plabel ) \ + CHOICE_BUTTON_EX( itemNum, plabel, play "mouse_click"; execnow "set selected_weapon_class "ptext"; set ui_weapon_class_selected "plabel; open "ocd_popup_cac_"ptext;, name ptext ) + + LOCAL_WEAPON_CLASS( 1, "assault", "@MPUI_ASSAULT_RIFLES" ) + LOCAL_WEAPON_CLASS( 2, "SMG", "@MPUI_SUB_MACHINE_GUNS" ) + LOCAL_WEAPON_CLASS( 4, "shotgun", "@MPUI_SHOTGUNS" ) + LOCAL_WEAPON_CLASS( 5, "sniper", "@MPUI_SNIPER_RIFLES" ) +} + +#undef UI_FOCUSFIRST +#define UI_FOCUSFIRST "ui_primary_highlighted" + +#define LOCAL_MASTER_WEAPON_GROUP( suffix, pos, y_offset )\ +menuDef {\ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_assault"suffix, 7, (CHOICE_X( pos )-2), (CHOICE_Y( pos )-28+y_offset), ;, execnow "set "UI_FOCUSFIRST" "REF_AK47"; set ui_inside_popup assault";, 0 )\ + LOCAL_WEAPON_INFO_WINDOW( "ui_primary_highlighted" )\ + LOCAL_WEAPON_ITEM( suffix, 1, "1. M16A4", "assault", REF_M16 )\ + LOCAL_WEAPON_ITEM( suffix, 2, "2. AK-47", "assault", REF_AK47 )\ + LOCAL_WEAPON_ITEM( suffix, 3, "3. M4 Carbine", "assault", REF_M4 )\ + LOCAL_WEAPON_ITEM( suffix, 4, "4. G3", "assault", REF_G3 )\ + LOCAL_WEAPON_ITEM( suffix, 5, "5. G36C", "assault", REF_G36C )\ + LOCAL_WEAPON_ITEM( suffix, 6, "6. M14", "assault", REF_M14 )\ + LOCAL_WEAPON_ITEM( suffix, 7, "7. MP44", "assault", REF_MP44 )\ + execKey "1" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "assault", REF_M16 ); }\ + execKey "2" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "assault", REF_AK47 ); }\ + execKey "3" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "assault", REF_M4 ); }\ + execKey "4" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "assault", REF_G3 ); }\ + execKey "5" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "assault", REF_G36C ); }\ + execKey "6" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "assault", REF_M14 ); }\ + execKey "7" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "assault", REF_MP44 ); }\ +}\ +menuDef {\ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_SMG"suffix, 7, (CHOICE_X( pos )-2), (CHOICE_Y( pos )-28+y_offset), ;, execnow "set "UI_FOCUSFIRST" "REF_MP5";set ui_inside_popup smg";, 0 )\ + LOCAL_WEAPON_INFO_WINDOW( "ui_primary_highlighted" )\ + LOCAL_WEAPON_ITEM( suffix, 1, "1. MP5", "SMG", REF_MP5 )\ + LOCAL_WEAPON_ITEM( suffix, 2, "2. Mini-Uzi", "SMG", REF_UZI )\ + LOCAL_WEAPON_ITEM( suffix, 3, "3. AK-74u", "SMG", REF_AK74U )\ + execKey "1" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "SMG", REF_MP5 ); }\ + execKey "2" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "SMG", REF_UZI ); }\ + execKey "3" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "SMG", REF_AK74U ); }\ +}\ +menuDef {\ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_shotgun"suffix, 7, (CHOICE_X( pos )-2), (CHOICE_Y( pos )-28+y_offset), ;, execnow "set "UI_FOCUSFIRST" "REF_WINCHESTER1200"; set ui_inside_popup shotgun";, 0 )\ + LOCAL_WEAPON_INFO_WINDOW( "ui_primary_highlighted" )\ + LOCAL_WEAPON_ITEM( suffix, 1, "1. W1200", "shotgun", REF_WINCHESTER1200 )\ + LOCAL_WEAPON_ITEM( suffix, 2, "2. M1014", "shotgun", REF_BENELLIM4 )\ + execKey "1" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "shotgun", REF_WINCHESTER1200 ); }\ + execKey "2" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "shotgun", REF_BENELLIM4 ); }\ +}\ +menuDef {\ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_sniper"suffix, 7, (CHOICE_X( pos )-2), (CHOICE_Y( pos )-28+y_offset), ;, execnow "set "UI_FOCUSFIRST" "REF_M40A3"; set ui_inside_popup sniper";, 0 )\ + LOCAL_WEAPON_INFO_WINDOW( "ui_primary_highlighted" )\ + LOCAL_WEAPON_ITEM( suffix, 1, "1. M40A3", "sniper", REF_M40A3 )\ + LOCAL_WEAPON_ITEM( suffix, 2, "2. R700", "sniper", REF_REMINGTON700 )\ + execKey "1" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "sniper", REF_M40A3 ); }\ + execKey "2" { LOCAL_PRIMARY_WEAPON_ACTION( suffix, "sniper", REF_REMINGTON700 ); }\ +} + +LOCAL_MASTER_WEAPON_GROUP( "", 1, 0 ) + +#define LOCAL_ATTACHMENT_INFO_WINDOW( parentDvar ) \ + \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH-6) -4 280 CHOICE_POPUP_HEIGHT( 6 ) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "white", CHOICE_POPUP_BORDER_COLOR, 1, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "camo" ); ) \ + LOADOUT_PLATING_RAW( CHOICE_POPUP_WIDTH 8, -2, 0, 280, (CHOICE_POPUP_HEIGHT( 6 )-4), CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN visible when( dvarString(ui_inside_popup) != "camo" );, 0, 0 ) \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+6) 30 256 48 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "gradient_bottom", 1 1 1 0.3, 0, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "camo" ); ) \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+182) 6 64 64 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, tablelookup("mp/attachmentTable.csv",4,dvarString(ui_attachment_highlighted),6), 1 1 1 1, 0, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "camo" ); ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 58 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/attachmentTable.csv",4,dvarString(ui_attachment_highlighted),3), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE visible when( dvarString(ui_inside_popup) != "camo" ); ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 80 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/attachmentTable.csv",4,dvarString(ui_attachment_highlighted),7), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR )\ + +#define LOCAL_ATTACHMENT_ACTION( attachmentDvar, attachmentName, paction, groupArg ) \ + setdvar loadout_primary_attachment attachmentName; \ + scriptMenuResponse "loadout_primary_attachment:"groupArg":"attachmentName;\ + PREPROC_ATTACH_CLOSEALL + +#define LOCAL_ATTACHMENT_ACTION2( attachmentDvar, attachmentName, paction, groupArg ) \ + setdvar loadout_secondary_attachment attachmentName; \ + scriptMenuResponse "loadout_secondary_attachment:"groupArg":"attachmentName;\ + PREPROC_ATTACH_CLOSEALL + +#define AI_FOCUS_ACTION( groupArg, weaponRef ) \ + exec "set ui_attachment_highlighted "weaponRef; + +#define LOCAL_ATTACHMENT_ITEM( itemNum, buttonText, p_setstat, groupArg ,p_numref, pname, paction, ptype, statDvar, bitMask)\ + CHOICE_BUTTON_FOCUS_VIS_ADV( itemNum, buttonText, LOCAL_ATTACHMENT_ACTION( statDvar, pname, paction, groupArg );, AI_FOCUS_ACTION(groupArg,pname), ;, when( ptype == "primary" && dvarBool( "attach_allow_"groupArg"_"pname ) ), ptype == "primary" && dvarBool( "attach_allow_"groupArg"_"pname ) ) \ + CHOICE_BUTTON_FOCUS_VIS_ADV( itemNum, buttonText, LOCAL_ATTACHMENT_ACTION2( statDvar, pname, paction, groupArg );, AI_FOCUS_ACTION(groupArg,pname), ;, when( ptype == "secondary" && dvarBool( "attach_allow_"groupArg"_"pname ) ), ptype == "primary" && dvarBool( "attach_allow_"groupArg"_"pname ) ) \ + CHOICE_BUTTON_FOCUS_VIS_NOHI( itemNum, "", ;, AI_FOCUS_ACTION(groupArg,pname), ;, when( !dvarBool( "attach_allow_"groupArg"_"pname ) ); ) \ + CHOICE_DBUTTON_VIS( itemNum, buttonText, when( !dvarBool( "attach_allow_"groupArg"_"pname ) ); ) + +#undef UI_FOCUSFIRST +#define UI_FOCUSFIRST "ui_attachment_highlighted" + +#define LOCAL_MASTER_ATTACHMENT_GROUP( stat_slot, suffix, pos, ptype, y_offset, statDvar )\ +menuDef { \ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_attachment_popup_assault"suffix, 6, (CHOICE_X( pos )-2), (CHOICE_Y( pos )+26+y_offset), ;, execnow "set "UI_FOCUSFIRST" "REF_ATTACHMENT_NONE"; set ui_inside_popup attachment";, 0 )\ + onClose{execnow "set ui_inside_popup 0";} \ + LOCAL_ATTACHMENT_INFO_WINDOW( "loadout_"ptype )\ + LOCAL_ATTACHMENT_ITEM( 1, "1. No Attachment", stat_slot, "assault", NUM_NONE, "none", ;, ptype, statDvar, 0 )\ + LOCAL_ATTACHMENT_ITEM( 2, "2. Silencer", stat_slot, "assault", NUM_SUPPRESSOR, "silencer", ;, ptype, statDvar, SILENCER_NEW_BITMASK )\ + execKey "1" { LOCAL_ATTACHMENT_ACTION( 1, "none", 1, "assault" ); }\ + execKey "2" { LOCAL_ATTACHMENT_ACTION( 2, "silencer", 1, "assault" ); }\ +}\ +menuDef { \ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_attachment_popup_SMG"suffix, 6, (CHOICE_X( pos )-2), (CHOICE_Y( pos )+26+y_offset), ;, execnow "set "UI_FOCUSFIRST" "REF_ATTACHMENT_NONE"; set ui_inside_popup attachment";, 0 )\ + onClose{execnow "set ui_inside_popup 0";} \ + LOCAL_ATTACHMENT_INFO_WINDOW( "loadout_"ptype )\ + LOCAL_ATTACHMENT_ITEM( 1, "1. No Attachment", stat_slot, "specops", NUM_NONE, "none", ;, ptype, statDvar, 0 )\ + LOCAL_ATTACHMENT_ITEM( 2, "2. Silencer", stat_slot, "specops", NUM_SUPPRESSOR, "silencer", ;, ptype, statDvar, SILENCER_NEW_BITMASK )\ + execKey "1" { LOCAL_ATTACHMENT_ACTION( 1, "none", 1, "specops" ); }\ + execKey "2" { LOCAL_ATTACHMENT_ACTION( 2, "silencer", 1, "specops" ); }\ +} +menuDef { + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_attachment_popup_pistol", 6, (CHOICE_X( 2 )-2), (CHOICE_Y( 2 )), ;, execnow "set "UI_FOCUSFIRST" "REF_ATTACHMENT_NONE"; set ui_inside_popup attachment";, 0 ) + onClose{execnow "set ui_inside_popup 0";} + LOCAL_ATTACHMENT_INFO_WINDOW( "loadout_secondary" ) + LOCAL_ATTACHMENT_ITEM( 1, "1. No Attachment", CAC_SECONDARY_ATTACHMENT, "pistol", NUM_NONE, "none", ;, "secondary", "ui_secondary_weapon", 0 ) + LOCAL_ATTACHMENT_ITEM( 2, "2. Silencer", CAC_SECONDARY_ATTACHMENT, "pistol", NUM_SUPPRESSOR, "silencer", ;, "secondary", "ui_secondary_weapon", SILENCER_NEW_BITMASK ) + execKey "1" { LOCAL_ATTACHMENT_ACTION2( 1, "none", 1, "pistol" ); } + execKey "2" { LOCAL_ATTACHMENT_ACTION2( 2, "silencer", 1, "pistol" ); } +} + +LOCAL_MASTER_ATTACHMENT_GROUP( CAC_PRIMARY_ATTACHMENT, "", 1, "primary", -30, "loadout_primary_attachment" ) + +#define LOCAL_SIDEARM_INFO_WINDOW( highlight_dvar ) \ + \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH-6) -4 280 CHOICE_POPUP_HEIGHT( 6 ) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "white", CHOICE_POPUP_BORDER_COLOR, 1, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "attachment" ); ) \ + LOADOUT_PLATING_RAW( CHOICE_POPUP_WIDTH 8, -2, 0, 280, (CHOICE_POPUP_HEIGHT( 6 )-4), CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN visible when( dvarString(ui_inside_popup) != "attachment" );, 0, 0 )\ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+6) 30 256 48 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "gradient_bottom", 1 1 1 0.3, 0, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "attachment" ); ) \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+138) -12 90 90 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, tablelookup("mp/statsTable.csv",4,dvarString(highlight_dvar),6), 1 1 1 1, 0, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "attachment" ); ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 58 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/statstable.csv",4,dvarString(highlight_dvar),3), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE visible when( dvarString(ui_inside_popup) != "attachment" ); ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 80 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/statstable.csv",4,dvarString(highlight_dvar),7), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR )\ + +#define LOCAL_SIDEARM_ACTION( pstat, weaponRef ) \ + play "mouse_click"; \ + setdvar loadout_secondary weaponRef; \ + setdvar loadout_secondary_attachment none; \ + scriptMenuResponse "loadout_secondary:"weaponRef;\ + PREPROC_ATTACH_CLOSEALL + +#define LOCAL_SIDEARM_ACTION2( pstat, weaponRef ) \ + play "mouse_click"; \ + setdvar loadout_secondary weaponRef; \ + setdvar loadout_secondary_attachment none; \ + scriptMenuResponse "loadout_secondary:"weaponRef;\ + uiScript openMenuOnDvar "selected_weapon_class" pistol "ocd_attachment_popup_pistol"; + +#define SI_FOCUS_ACTION( weaponRef ) \ + exec "set ui_sidearm_highlighted "weaponRef; + +#define LOCAL_SIDEARM_ITEM( itemNum, weaponName, weaponStat, weaponRef, highlight_dvar )\ + CHOICE_BUTTON_FOCUS_VIS_ADV( itemNum, weaponName, LOCAL_SIDEARM_ACTION( weaponStat, weaponRef ), SI_FOCUS_ACTION( weaponRef ), ;, \ + when( dvarBool( "weap_allow_"weaponRef ) && ( weaponRef == REF_DESERTEAGLE || weaponRef == REF_DESERTEAGLEGOLD ) );, \ + dvarBool( "weap_allow_"weaponRef ) && ( weaponRef == REF_DESERTEAGLE || weaponRef == REF_DESERTEAGLEGOLD ) ) \ + CHOICE_BUTTON_FOCUS_VIS_ADV( itemNum, weaponName, LOCAL_SIDEARM_ACTION2( weaponStat, weaponRef ), SI_FOCUS_ACTION( weaponRef ), ;, \ + when( dvarBool( "weap_allow_"weaponRef ) && weaponRef != REF_DESERTEAGLE && weaponRef != REF_DESERTEAGLEGOLD );, \ + dvarBool( "weap_allow_"weaponRef ) && weaponRef != REF_DESERTEAGLE && weaponRef != REF_DESERTEAGLEGOLD ) \ + CHOICE_BUTTON_FOCUS_VIS_NOHI( itemNum, "", ;, SI_FOCUS_ACTION( weaponRef ), ;, when( !dvarBool( "weap_allow_"weaponRef ) ); ) \ + CHOICE_DBUTTON_VIS( itemNum, weaponName, when( !dvarBool( "weap_allow_"weaponRef ) ); ) + +#undef UI_FOCUSFIRST +#define UI_FOCUSFIRST "ui_sidearm_highlighted" + +menuDef +{ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_secondary", 6, (CHOICE_X( 2 )-2), (CHOICE_Y( 2 )), ;, execnow "set "UI_FOCUSFIRST" "REF_M9BERETTA"; set selected_weapon_class pistol; set ui_inside_popup pistol";, 0 ) + onClose{execnow "set ui_inside_popup 0";} + LOCAL_SIDEARM_INFO_WINDOW( "ui_sidearm_highlighted" ) + LOCAL_SIDEARM_ITEM( 1, "1. Gold Desert Eagle", STAT_PISTOL_DESERTEAGLEGOLD, REF_DESERTEAGLEGOLD, "ui_sidearm_highlighted" ) + LOCAL_SIDEARM_ITEM( 2, "2. Desert Eagle", STAT_PISTOL_DESERTEAGLE, REF_DESERTEAGLE, "ui_sidearm_highlighted" ) + LOCAL_SIDEARM_ITEM( 3, "3. M1911 .45", STAT_PISTOL_COLT45, REF_COLT45, "ui_sidearm_highlighted" ) + LOCAL_SIDEARM_ITEM( 4, "4. USP .45", STAT_PISTOL_USP, REF_USP, "ui_sidearm_highlighted" ) + LOCAL_SIDEARM_ITEM( 5, "5. M9", STAT_PISTOL_M9BERETTA, REF_M9BERETTA, "ui_sidearm_highlighted" ) + + execKey "1" { LOCAL_SIDEARM_ACTION(STAT_PISTOL_DESERTEAGLEGOLD,REF_DESERTEAGLEGOLD); } + execKey "2" { LOCAL_SIDEARM_ACTION(STAT_PISTOL_DESERTEAGLE,REF_DESERTEAGLE); } + execKey "3" { LOCAL_SIDEARM_ACTION2(STAT_PISTOL_COLT45,REF_COLT45); } + execKey "4" { LOCAL_SIDEARM_ACTION2(STAT_PISTOL_USP,REF_USP); } + execKey "5" { LOCAL_SIDEARM_ACTION2(STAT_PISTOL_M9BERETTA,REF_M9BERETTA); } +} + +#define LOCAL_SGRENADE_INFO_WINDOW( highlight_dvar ) \ + \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH-6) -4 280 CHOICE_POPUP_HEIGHT(5) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "white", CHOICE_POPUP_BORDER_COLOR, 1, 2, CHOICE_POPUP_BORDER_COLOR ) \ + LOADOUT_PLATING_RAW( CHOICE_POPUP_WIDTH 8, -2, 0, 280, (CHOICE_POPUP_HEIGHT( 5 )-4), CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN visible when( dvarString(ui_inside_popup) != "attachment" );, 0, 0 )\ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+6) 6 256 48 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "gradient_bottom", 1 1 1 0.3, 0, 2, CHOICE_POPUP_BORDER_COLOR visible when( dvarString(ui_inside_popup) != "attachment" ); ) \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+178) -6 64 64 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, tablelookup("mp/statsTable.csv",4,dvarString(highlight_dvar),6), 1 1 1 1, 0, 2, CHOICE_POPUP_BORDER_COLOR ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 34 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/statstable.csv",4,dvarString(highlight_dvar),3), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 56 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/statstable.csv",4,dvarString(highlight_dvar),7), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) + +#define LOCAL_SGRENADE_ACTION( weaponRef ) \ + play "mouse_click"; \ + setdvar loadout_grenade weaponRef; \ + scriptMenuResponse "loadout_grenade:"weaponRef;\ + close "ocd_popup_cac_extra" + +#define LOCAL_SGRENADE_ITEM( itemNum, weaponName, weaponStat, weaponRef, highlight_dvar )\ + CHOICE_BUTTON_FOCUS_VIS_ADV( itemNum, weaponName, LOCAL_SGRENADE_ACTION( weaponRef ), execnow "set "highlight_dvar" "weaponRef, ;, when( dvarBool("weap_allow_"weaponRef) );, dvarBool("weap_allow_"weaponRef) ) \ + CHOICE_DBUTTON_VIS( itemNum, weaponName, when( !dvarBool("weap_allow_"weaponRef) ); ) + +#undef UI_FOCUSFIRST +#define UI_FOCUSFIRST "ui_sgrenade_highlighted" + +menuDef +{ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_extra", 5, (CHOICE_X( 3 )-2), (CHOICE_Y( 3 )+4), ;, execnow "set "UI_FOCUSFIRST" "REF_FLASH_X1"; set ui_inside_popup sgrenade";, 0 ) + onClose{ execnow "set ui_inside_popup 0"; } + LOCAL_SGRENADE_INFO_WINDOW( "ui_sgrenade_highlighted" ) + LOCAL_SGRENADE_ITEM( 1, "1. Flash", STAT_FLASH_X1, REF_FLASH_X1, "ui_sgrenade_highlighted" ) + LOCAL_SGRENADE_ITEM( 2, "2. Smoke", STAT_SMOKE_X1, REF_SMOKE_X1, "ui_sgrenade_highlighted" ) + execKey "1" { LOCAL_SGRENADE_ACTION(REF_FLASH_X1); } + execKey "2" { LOCAL_SGRENADE_ACTION(REF_SMOKE_X1); } +} + + #define LOCAL_CAMO_INFO_WINDOW( highlight_dvar ) \ + \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH-6) -4 280 CHOICE_POPUP_HEIGHT( 7 ) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "white", CHOICE_POPUP_BORDER_COLOR, 1, 2, CHOICE_POPUP_BORDER_COLOR ) \ + LOADOUT_PLATING_RAW( CHOICE_POPUP_WIDTH 8, -2, 0, 280, (CHOICE_POPUP_HEIGHT( 7 )-4), CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0, 0 )\ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+6) 30 256 48 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "gradient_bottom", 1 1 1 0.3, 0, 2, CHOICE_POPUP_BORDER_COLOR ) \ + PREPROC_SHADER_DRAW_ALIGNED( (CHOICE_POPUP_WIDTH+184) 0 64 64 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, tablelookup("mp/attachmentTable.csv",4,dvarString(highlight_dvar),6), 1 1 1 0.75, 1, 7, 0.2 0.2 0.225 1 ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 58 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/attachmenttable.csv",4,dvarString(highlight_dvar),3), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE ) \ + PREPROC_TEXT_DRAW_ALIGNED_EXP( (CHOICE_POPUP_WIDTH+10) 80 256 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@"+tablelookup("mp/attachmenttable.csv",4,dvarString(highlight_dvar),7), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR )\ + +#define LOCAL_CAMO_ACTION( camoRef ) \ + play "mouse_click"; \ + setdvar loadout_camo camoRef;\ + scriptMenuResponse "loadout_camo:" camoRef;\ + PREPROC_ATTACH_CLOSEALL + +#define LOCAL_CAMO_ITEM( itemNum, camoName, pnum, camoRef, highlight_dvar, bitMask, visArg )\ + CHOICE_BUTTON_FOCUS( itemNum, camoName, LOCAL_CAMO_ACTION( camoRef );, execnow "set "highlight_dvar" "camoRef;, ; ); + +#define LOCAL_CAMO_ITEM2( itemNum, camoName, pnum, camoRef, highlight_dvar, bitMask, visArg )\ + CHOICE_BUTTON_FOCUS_VIS( itemNum, camoName, LOCAL_CAMO_ACTION( camoRef );, execnow "set "highlight_dvar" "camoRef;, ;, when( dvarString( loadout_primary ) == "ak47" || dvarString( loadout_primary ) == "uzi" || dvarString( loadout_primary ) == "m1014" ) ) \ + CHOICE_DBUTTON_VIS( itemNum, camoName, when( dvarString( loadout_primary ) != "ak47" && dvarString( loadout_primary ) != "uzi" && dvarString( loadout_primary ) != "m1014" ) ) + +#undef UI_FOCUSFIRST +#define UI_FOCUSFIRST "ui_camo_highlighted" + +#define LOCAL_CAMO_GROUP( prefix, onLeave )\ +menuDef \ +{\ + IMPROVED_POPUP_SETUP_ONOPEN( "ocd_popup_cac_camo"prefix, 7, (CHOICE_X( 1 )-2), (CHOICE_Y( 1 )+68), ;, execnow "set "UI_FOCUSFIRST" "REF_CAMO_NONE"; set ui_inside_popup camo";, 0 )\ + onClose{onLeave;} \ + LOCAL_CAMO_INFO_WINDOW( "ui_camo_highlighted" )\ + LOCAL_CAMO_ITEM( 1, "1. None", CAMO_NONE, REF_CAMO_NONE, "ui_camo_highlighted", 0, 1 )\ + LOCAL_CAMO_ITEM( 2, "2. Desert", CAMO_BROCKHUARD, REF_BROCKHUARD, "ui_camo_highlighted", DESERT_NEW_BITMASK, 1 )\ + LOCAL_CAMO_ITEM( 3, "3. Woodland", CAMO_BUSHDWELLER, REF_BUSHDWELLER, "ui_camo_highlighted", WOODLAND_NEW_BITMASK, 1 )\ + LOCAL_CAMO_ITEM( 4, "4. Digital", CAMO_BLACKWHITEMARPAT, REF_BLACKWHITEMARPAT, "ui_camo_highlighted", DIGITAL_NEW_BITMASK, 1 )\ + LOCAL_CAMO_ITEM( 5, "5. Red Tiger", CAMO_TIGERRED, REF_TIGERRED, "ui_camo_highlighted", REDTIGER_NEW_BITMASK, 1 )\ + LOCAL_CAMO_ITEM( 6, "6. Blue Tiger", CAMO_STAGGER, REF_STAGGER, "ui_camo_highlighted", BLUETIGER_NEW_BITMASK, 1 )\ + LOCAL_CAMO_ITEM2( 7, "7. Golden", CAMO_GOLDEN, REF_GOLDEN, "ui_camo_highlighted", GOLDEN_NEW_BITMASK, 1 )\ + execKey "1" { LOCAL_CAMO_ACTION(REF_CAMO_NONE); }\ + execKey "2" { LOCAL_CAMO_ACTION(REF_BROCKHUARD); }\ + execKey "3" { LOCAL_CAMO_ACTION(REF_BUSHDWELLER); }\ + execKey "4" { LOCAL_CAMO_ACTION(REF_BLACKWHITEMARPAT); }\ + execKey "5" { LOCAL_CAMO_ACTION(REF_TIGERRED); }\ + execKey "6" { LOCAL_CAMO_ACTION(REF_STAGGER); }\ + execKey "7" { LOCAL_CAMO_ACTION(REF_GOLDEN); }\ +} + +LOCAL_CAMO_GROUP( "", execnow "set ui_inside_popup attachment" ) \ No newline at end of file diff --git a/ui_mp/cac_loadout_ingame.inc b/ui_mp/cac_loadout_ingame.inc new file mode 100644 index 0000000..46cad0b --- /dev/null +++ b/ui_mp/cac_loadout_ingame.inc @@ -0,0 +1,52 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#define LOADOUT_WIDTH 270 +#define ORIGIN_LOADOUT ((-(LOADOUT_WIDTH - RIGHTITEM_OFFSET))-80) 38 +#define LOADOUT_ALIGN RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP +#define LOADOUT_PLATING( py, ph, vis_gradient_top, vis_gradient_bottom ) \ + LOADOUT_PLATING_RAW( ORIGIN_LOADOUT, 0, py, (LOADOUT_WIDTH+8), ph, LOADOUT_ALIGN, vis_gradient_top, vis_gradient_bottom ) + +PREPROC_SHADER_DRAW_ALIGNED( -4 0 (LOADOUT_WIDTH+8) 210 LOADOUT_ALIGN, ORIGIN_LOADOUT, "gradient_center", 0.3 0.3 0.325 0.6, 0, 0, 0 0 0 0 ) +PREPROC_SHADER_DRAW_ALIGNED( 274 -4 20 222 LOADOUT_ALIGN, ORIGIN_LOADOUT, "gradient", 1 1 1 0.65, 0, 0, 0 0 0 0 ) +PREPROC_SHADER_DRAW_ALIGNED( -24 -4 -20 222 LOADOUT_ALIGN, ORIGIN_LOADOUT, "gradient", 1 1 1 0.65, 0, 0, 0 0 0 0 ) + +PREPROC_SHADER_DRAW_ALIGNED( -4 4 ((LOADOUT_WIDTH+8)/4) 80 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/attachmenttable.csv", 11, STAT_CAC_CAMO, 6 ), 1 1 1 0.5, 0, 1, 1 1 1 1) +PREPROC_SHADER_DRAW_ALIGNED( (((LOADOUT_WIDTH+8)/4)-4) 4 ((LOADOUT_WIDTH+8)/4) 80 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/attachmenttable.csv", 11, STAT_CAC_CAMO, 6 ), 1 1 1 0.5, 0, 1, 1 1 1 1) +PREPROC_SHADER_DRAW_ALIGNED( (((LOADOUT_WIDTH+8)/2)-4) 4 ((LOADOUT_WIDTH+8)/4) 80 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/attachmenttable.csv", 11, STAT_CAC_CAMO, 6 ), 1 1 1 0.5, 0, 1, 1 1 1 1) +PREPROC_SHADER_DRAW_ALIGNED( ((((LOADOUT_WIDTH+8)/4)*3)-4) 4 ((LOADOUT_WIDTH+8)/4) 80 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/attachmenttable.csv", 11, STAT_CAC_CAMO, 6 ), 1 1 1 0.5, 0, 1, 1 1 1 1) + +LOADOUT_PLATING( 4, 8, 0, 1 ) +LOADOUT_PLATING( 218, 8, 1, 0 ) +LOADOUT_PLATING( 92, 8, 1, 1 ) +LOADOUT_PLATING( 180, 8, 1, 1 ) + +PREPROC_TEXT_DRAW_ALIGNED_EXP( 0 8 (LOADOUT_WIDTH+8) 20 LOADOUT_ALIGN, ORIGIN_LOADOUT, "@"+tablelookup("mp/statstable.csv", 0, STAT_CAC_PRIMARY, 3), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE ) + +PREPROC_TEXT_DRAW_ALIGNED_EXP( 0 62 (LOADOUT_WIDTH+8) 20 LOADOUT_ALIGN, ORIGIN_LOADOUT, "@"+tablelookup("mp/attachmenttable.csv", 9, STAT_CAC_PRIMARY_ATTACHMENT, 3), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) + +PREPROC_SHADER_DRAW_ALIGNED( 74 -2 180 90 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/statstable.csv", 0, STAT_CAC_PRIMARY, 6 ), 1 1 1 1, 0, 1, 1 1 1 1) + +PREPROC_SHADER_DRAW_ALIGNED( 2 30 32 32 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/attachmenttable.csv", 9, STAT_CAC_PRIMARY_ATTACHMENT, 6 ), 1 1 1 1, 0, 1, 1 1 1 1) + +PREPROC_TEXT_DRAW_ALIGNED_EXP( 0 (20+76) (LOADOUT_WIDTH+8) 20 LOADOUT_ALIGN, ORIGIN_LOADOUT, "@" + tablelookup("mp/statstable.csv", 0, STAT_CAC_SECONDARY, 3), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE ) + +PREPROC_TEXT_DRAW_ALIGNED_EXP( 0 (74+76) (LOADOUT_WIDTH+8) 20 LOADOUT_ALIGN, ORIGIN_LOADOUT, "@"+tablelookup("mp/attachmenttable.csv", 9, STAT_CAC_SECONDARY_ATTACHMENT, 3), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) + +PREPROC_SHADER_DRAW_ALIGNED( 160 (6+80) 90 90 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/statstable.csv", 0, STAT_CAC_SECONDARY, 6 ), 1 1 1 1, 0, 1, 1 1 1 1 ) + +PREPROC_SHADER_DRAW_ALIGNED( 2 118 32 32 LOADOUT_ALIGN, ORIGIN_LOADOUT, tablelookup( "mp/attachmenttable.csv", 9, STAT_CAC_SECONDARY_ATTACHMENT, 6 ), 1 1 1 1, 0, 1, 1 1 1 1) + +PREPROC_SHADER_DRAW_ALIGNED( 3 178 32 32 LOADOUT_ALIGN, ORIGIN_LOADOUT, "weapon_fraggrenade", 1 1 1 1, 0, 1, 1 1 1 1 visible when( dvarInt( weap_allow_frag_grenade ) != "0" ) ) +PREPROC_SHADER_DRAW_ALIGNED( 32 178 32 32 LOADOUT_ALIGN, ORIGIN_LOADOUT, "weapon_smokegrenade", 1 1 1 1, 0, 1, 1 1 1 1 visible when( dvarInt( weap_allow_smoke_grenade ) != 0 && dvarString( loadout_grenade ) == "smoke_grenade" ) ) +PREPROC_SHADER_DRAW_ALIGNED( 32 178 32 32 LOADOUT_ALIGN, ORIGIN_LOADOUT, "weapon_flashbang", 1 1 1 1, 0, 1, 1 1 1 1 visible when( dvarInt( weap_allow_flash_grenade ) != 0 && dvarString( loadout_grenade ) == "flash_grenade" ) ) + +PREPROC_TEXT_DRAW_ALIGNED_EXP( 0 183 (LOADOUT_WIDTH+8) 20 LOADOUT_ALIGN, ORIGIN_LOADOUT, 1, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE visible when( dvarInt( weap_allow_frag_grenade ) != "0" ) ) +PREPROC_TEXT_DRAW_ALIGNED_EXP( 30 183 (LOADOUT_WIDTH+8) 20 LOADOUT_ALIGN, ORIGIN_LOADOUT, 1, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, COLOR_TITLE visible when( dvarInt( weap_allow_flash_grenade ) != "0" && dvarInt( weap_allow_smoke_grenade ) != "0" ) ) \ No newline at end of file diff --git a/ui_mp/connect.menu b/ui_mp/connect.menu new file mode 100644 index 0000000..9493caf --- /dev/null +++ b/ui_mp/connect.menu @@ -0,0 +1,44 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +{ + menuDef + { + name "connect" + style WINDOW_STYLE_FILLED + fullScreen MENU_FALSE + focusColor COLOR_FOCUSED + visible MENU_FALSE + backcolor 1 1 1 1 + background "$levelBriefing" + rect FULLSCREEN_WIDE + + itemDef + { + style WINDOW_STYLE_FILLED + rect -128 -40 260 4 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_BOTTOM + origin 107 0 + backcolor 0 0 0 0.8 + visible 1 + decoration + } + itemDef + { + name "loadbar" + style WINDOW_STYLE_LOADBAR + rect -127 -39 258 2 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_BOTTOM + origin 107 0 + background "white" + visible 1 + decoration + } + } +} \ No newline at end of file diff --git a/ui_mp/controls_multi.menu b/ui_mp/controls_multi.menu new file mode 100644 index 0000000..0b98675 --- /dev/null +++ b/ui_mp/controls_multi.menu @@ -0,0 +1,73 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" +#define CHOICE_SEP_1 26 +#define CHOICE_SEP_2 33 +#define OPTIONS_STYLE 1 +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +{ + menuDef + { + name "controls_multi" + fullScreen 0 + rect 0 0 640 480 + focusColor COLOR_FOCUSED + onOpen + { + setLocalVarBool ui_hideBack 1; + } + onClose + { + setLocalVarBool ui_hideBack 0; + } + onESC + { + close self; + } + + #include "ui_mp/leftside_controls.inc" + + #undef CHOICE_SIZE_Y + #define CHOICE_SIZE_Y 20 + + CHOICE_SECTION_TITLE( 21, "@MENU_MULTIPLAYER_CONTROLS" ) + + CHOICE_BIND( 22, "@MENU_VOTE_YES", "vote yes", ; ) + CHOICE_BIND( 23, "@MENU_VOTE_NO", "vote no", ; ) + CHOICE_BIND( 24, "@MENU_CHAT", "chatmodepublic", ; ) + CHOICE_BIND( 25, "@MENU_TEAM_CHAT", "chatmodeteam", ; ) + CHOICE_BIND( 26, "@MENU_QUICK_CHAT", "mp_QuickMessage", ; ) + + CHOICE_SEPARATOR( CHOICE_SEP_1 ) + + CHOICE_BIND( 27, "Assault Class", "openscriptmenu quickpromod assault", ; ) + CHOICE_BIND( 28, "Spec Ops Class", "openscriptmenu quickpromod specops", ; ) + CHOICE_BIND( 29, "Demolitions Class", "openscriptmenu quickpromod demolitions", ; ) + CHOICE_BIND( 30, "Sniper Class", "openscriptmenu quickpromod sniper", ; ) + CHOICE_BIND( 31, "Change Class Menu", "openscriptmenu quickpromod X", ; ) + CHOICE_BIND( 32, "Call Timeout", "openscriptmenu quickpromod 1", ; ) + CHOICE_BIND( 33, "Drop Bomb", "openscriptmenu quickpromod 2", ; ) + + CHOICE_SEPARATOR( CHOICE_SEP_2 ) + + CHOICE_BIND( 34, "Toggle Grenade", "openscriptmenu quickpromod grenade", ; ) + CHOICE_BIND( 35, "Toggle Silencer", "openscriptmenu quickpromod silencer", ; ) + CHOICE_BIND( 36, "Toggle Lighting", "openscriptmenu quickpromodgfx 1", ; ) + CHOICE_BIND( 37, "Toggle Film Tweaks", "openscriptmenu quickpromodgfx 2", ; ) + CHOICE_BIND( 38, "Toggle Normal Map", "openscriptmenu quickpromodgfx 4", ; ) + CHOICE_BIND( 39, "Toggle FOV Scale", "openscriptmenu quickpromodgfx 5", ; ) + + CHOICE_KEYBINDHELP + } +} \ No newline at end of file diff --git a/ui_mp/hud.menu b/ui_mp/hud.menu new file mode 100644 index 0000000..b097ab5 --- /dev/null +++ b/ui_mp/hud.menu @@ -0,0 +1,1216 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +#define TEAM_IS_MARINES (localVarString( ui_team ) == "marines") +#define TEAM_IS_OPFOR (localVarString( ui_team ) == "opfor") +#define NOT_SPECTATING (!spectatingClient()) +#define DVAR_ENFORCER ( !dvarint( sv_cheats ) && team( name ) != "TEAM_SPECTATOR" && ( dvarint( com_maxfps ) > 250 || dvarint( com_maxfps ) < 40 || dvarint( cl_maxpackets ) != 100 || dvarint( rate ) != 25000 || dvarint( dynent_active ) || dvarfloat( cg_hudDamageIconWidth ) != 128 || dvarfloat( cg_hudDamageIconHeight ) != 64 || dvarint( cg_huddamageiconinscope ) || dvarfloat( cg_huddamageiconoffset ) != 128 || dvarint( cg_huddamageicontime ) != 2000 || dvarfloat( cg_viewZSmoothingMin ) != 1 || dvarfloat( cg_viewZSmoothingMax ) != 16 || dvarfloat( cg_viewZSmoothingTime ) != 0.1 || dvarint( r_filmtweakInvert ) || dvarint( r_dlightlimit ) || dvarfloat( r_lodscalerigid ) != 1 || dvarfloat( r_lodscaleskinned ) != 1 || dvarint( sm_enable ) || dvarint( cg_nopredict ) || dvarint( developer ) || dvarint( r_zfeather ) || dvarfloat( phys_gravity ) != "-800" ) ) +#define DVAR_ENFORCER_NOSND ( !dvarint( sv_cheats ) && team( name ) != "TEAM_SPECTATOR" && ( dvarint( aim_automelee_enabled ) || dvarfloat( compassplayerwidth ) != dvarfloat( compassplayerheight ) || dvarfloat( compassfriendlywidth ) != dvarfloat( compassfriendlyheight ) ) ) +#define DVAR_BLANK ( dvarString( ui_showmenuonly ) == "" ) +#define HUD_ALPHA 0.65 +#define HUD_FOREGROUND_ALPHA 0.75 + +#define ENFORCE( condition, txt, position ) \ + itemDef \ + { \ + rect 0 position 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ + origin 107 0 \ + forecolor 1 0 0 1 \ + backcolor 1 0 0 1 \ + exp text( txt ); \ + textfont UI_FONT_OBJECTIVE \ + textscale 0.5 \ + textalign ITEM_ALIGN_CENTER \ + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE \ + visible when( condition ) \ + decoration \ + } + +#define HEALTHBAR( dvarName, mat, n, num ) \ + itemDef \ + { \ + style WINDOW_STYLE_SHADER \ + origin 0 0 \ + rect 0 0 128 16 HB_RECT 1 \ + exp rect X( (-128 * int(dvarName == "allies")) + (127 * (2*int(dvarName == "allies")-1) * dvarfloat("shout_health"+num) ) ); \ + exp rect Y( 207 + n * 18 ); \ + exp material( mat ); \ + textalign SHOUT_TEXT_ALIGN \ + visible when( dvarString( "shout_name"+num ) != "" ) \ + decoration \ + } \ + itemDef \ + { \ + rect 0 0 1 1 HB_RECT 1 \ + origin 0 0 \ + exp rect X( (2*int(dvarName == "allies")-1) * 5 - 2* int(dvarName == "axis") ); \ + exp rect Y( 223 + n * 18 ); \ + forecolor 1 1 1 1 \ + exp text( dvarString( "shout_name"+num ) ); \ + textstyle ITEM_TEXTSTYLE_SHADOWED \ + textalign SHOUT_TEXT_ALIGN \ + textscale 0.36 \ + textfont UI_FONT_DEFAULT \ + visible when( dvarString( "shout_name"+num ) != "" && dvarFloat( "shout_health"+num ) != "0" ) \ + decoration \ + } \ + itemDef \ + { \ + rect 0 0 1 1 HB_RECT 1 \ + origin 0 0 \ + exp rect X( (2*int(dvarName == "allies")-1) * 5 - 2* int(dvarName == "axis") ); \ + exp rect Y( 223 + n * 18 ); \ + forecolor 0.5 0.5 0.5 1 \ + exp text( dvarString( "shout_name"+num ) ); \ + textstyle ITEM_TEXTSTYLE_SHADOWED \ + textalign SHOUT_TEXT_ALIGN \ + textscale 0.36 \ + textfont UI_FONT_DEFAULT \ + visible when( dvarString( "shout_name"+num ) != "" && dvarFloat( "shout_health"+num ) == "0" ) \ + decoration \ + } + +#define BOTTOM_RECT_X 0 +#define BOTTOM_RECT_Y 0 + +#define MINIMAP_ORIGIN 2 11 +{ + assetGlobalDef + { + fadeClamp 1 + fadeCycle 1 + fadeAmount 0.1 + } + + menuDef + { + name "Low Health" + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + fullScreen 0 + visible 1 + + itemDef + { + name "healthoverlay" + rect 0 0 640 480 + forecolor 1 1 1 1 + background "overlay_low_health" + ownerdraw CG_PLAYER_LOW_HEALTH_OVERLAY + visible 1 + decoration + } + } + + menuDef + { + name "MantleHint" + rect 0 105 40 40 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER + fullScreen 0 + visible when( !dvarInt( ui_hud_hardcore ) && NOT_SPECTATING ) + + itemDef + { + name "chRect" + rect 0 0 40 40 + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + ownerdraw CG_MANTLE_HINT + visible 1 + decoration + } + } + + menuDef + { + name "Cursorhints" + rect 0 60 40 40 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER + fullScreen 0 + visible when( !dvarInt( ui_hud_hardcore ) && !ui_active() && NOT_SPECTATING ) + + itemDef + { + name "chRect" + rect 0 0 40 40 + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + ownerdraw CG_CURSORHINT + visible 1 + decoration + } + } + + menuDef + { + name "InvalidCmdHint" + rect 0 -150 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER + fullScreen 0 + visible when( NOT_SPECTATING ) + + itemDef + { + name "chRect" + rect 0 0 0 0 + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + ownerdraw CG_INVALID_CMD_HINT + textfont UI_FONT_NORMAL + visible 1 + decoration + } + } + + menuDef + { + name "stance" + rect -1000 -1000 48 48 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + fullScreen 0 + visible when( !flashbanged() && !ui_active() && NOT_SPECTATING ); + + itemDef + { + name "chRect" + rect 0 0 80 80 + ownerdraw CG_PLAYER_STANCE + textfont UI_FONT_OBJECTIVE + visible when( !inkillcam() && !dvarint( ui_hud_hardcore ) ); + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + forecolor 1 1 1 HUD_ALPHA + decoration + } + } + + #define RECT_COMPASS 0 0 COMPASS_SIZE_MP COMPASS_SIZE_MP HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + #undef MINIMAP_ORIGIN + #define MINIMAP_ORIGIN 6 6 + + menuDef + { + name "Compass_old" + rect RECT_COMPASS + fullScreen 0 + visible when ( !inkillcam() && !flashbanged() && !ui_active() && !scoped() && DVAR_BLANK && (!dvarint( ui_hud_hardcore ) || dvarInt( g_compassShowEnemies ) ) ); + + itemDef + { + name "minimapBG" + rect (MINIMAP_X_MP - 14) (MINIMAP_Y_MP - 6) COMPASS_SIZE_MP COMPASS_SIZE_MP + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + background "minimap_background" + ownerdraw CG_PLAYER_COMPASS_BACK + visible 1 + decoration + } + itemDef + { + name "minimapTickerBorder" + rect MINIMAP_X_MP (MINIMAP_Y_MP - 15) MINIMAP_W_MP 14 + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + background "minimap_tickertape_background" + ownerdraw CG_PLAYER_COMPASS_BACK + visible 1 + decoration + } + itemDef + { + name "minimapTicker" + rect MINIMAP_X_MP (MINIMAP_Y_MP - 12) MINIMAP_W_MP 9 + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + background "minimap_tickertape_mp" + ownerdraw CG_PLAYER_COMPASS_TICKERTAPE_NO_OBJ + visible 1 + decoration + } + itemDef + { + name "mini_map" + rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + background "compass_map_default" + ownerdraw CG_PLAYER_COMPASS_MAP + visible 1 + decoration + } + itemDef + { + name "compasspointers" + rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + background "objective_line" + ownerdraw CG_PLAYER_COMPASS_POINTERS + visible when ( dvarint( ui_hud_showobjicons ) > 0 ); + decoration + } + itemDef + { + name "compassfriendlies" + rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_COMPASS_FRIENDS + visible 1 + } + itemDef + { + name "compassenemies" + rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_COMPASS_ENEMIES + visible 1 + } + itemDef + { + name "compassplayer" + rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP + origin MINIMAP_ORIGIN + forecolor 1 1 1 1 + background "compassping_player" + ownerdraw CG_PLAYER_COMPASS_PLAYER + visible 1 + } + } + + menuDef + { + name "DPad" + backcolor 1 1 1 1 + background "$levelBriefing" + rect FULLSCREEN_WIDE + style WINDOW_STYLE_FILLED + fullScreen MENU_FALSE + visible when( team( name ) == "TEAM_FREE" && dvarString( g_gametype ) != "dm" ) + } + + menuDef + { + name "xpbar" + fullScreen 0 + visible when( DVAR_ENFORCER ); + soundloop "weap_ak47_fire_plr" + } + + menuDef + { + name "FullScreenMap" + fullScreen 0 + visible when( dvarString( self_ready ) != "" && !ui_active() ); + + itemDef + { + rect -37 88 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Waiting On" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.8 1 1 1 + visible 1 + decoration + } + itemDef + { + rect -37 108 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + exp text(dvarint(waiting_on)) + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.98 0.98 0.6 1 + visible 1 + decoration + } + itemDef + { + rect -37 128 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Players" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.8 1 1 1 + visible when( dvarInt( waiting_on ) > 1 ) + decoration + } + itemDef + { + rect -37 128 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Player" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.8 1 1 1 + visible when( dvarInt( waiting_on ) < 2 ) + decoration + } + itemDef + { + rect -37 153 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Status" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.8 1 1 1 + visible 1 + decoration + } + itemDef + { + rect -37 168 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Ready" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.73 0.99 0.73 1 + visible when ( dvarInt( self_ready ) ) + decoration + } + itemDef + { + rect -37 168 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Not Ready" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 1 0.66 0.66 1 + visible when ( !dvarInt( self_ready ) ) + decoration + } + itemDef + { + rect -37 318 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Killing" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.8 1 1 1 + visible when ( dvarString( self_kills ) == "" && team( name ) != "TEAM_SPECTATOR" ) + decoration + } + itemDef + { + rect -37 333 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Disabled" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 1 0.66 0.66 1 + visible when ( dvarString( self_kills ) == "" && team( name ) != "TEAM_SPECTATOR" ) + decoration + } + itemDef + { + rect -37 318 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + text "Kills" + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 0.8 1 1 1 + visible when ( dvarString( self_kills ) != "" && team( name ) != "TEAM_SPECTATOR" ) + decoration + } + itemDef + { + rect -37 333 2 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + exp text(dvarint(self_kills)) + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale 0.35 + textfont UI_FONT_DEFAULT + forecolor 1 0.66 0.66 1 + visible when ( dvarString( self_kills ) != "" && team( name ) != "TEAM_SPECTATOR" ) + decoration + } + } + + #define SCORE_OFFSET_X 4 + #define SCORE_OFFSET_Y 2 + + #define TEAM_IS_LOSING (team(score) < otherteam(score)) + #define PLAYER_IS_LOSING (player(score) < scoreatrank(1)) + + #define SHOULD_DISPLAY_SCOREBAR ( team( name ) != "TEAM_SPECTATOR" ) + #define PROMOD_SB ( dvarBool( cg_voiceIconSize ) ) + + menuDef + { + name "scorebars" + rect (BOTTOM_RECT_X+SCORE_OFFSET_X) (BOTTOM_RECT_Y+SCORE_OFFSET_Y) 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + exp rect Y( BOTTOM_RECT_Y - 10 ); + fullScreen 0 + visible when( !inkillcam() && !ui_active() && !dvarint( ui_hud_hardcore ) && (!dvarint( sv_cheats ) || dvarint( sv_cheats ) && !dvarint( promod_movie_hidescorebar ) ) ); + + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -45 128 64 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -45 + (TEAM_IS_LOSING*20) ); + exp rect H( 64 - (TEAM_IS_LOSING*128) ); + forecolor 1 1 1 HUD_ALPHA + background "scorebar_backdrop" + visible when( team( name ) != "TEAM_FREE" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -45 128 64 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -45 + (PLAYER_IS_LOSING*20) ); + exp rect H( 64 - (PLAYER_IS_LOSING*128) ); + forecolor 1 1 1 HUD_ALPHA + background "scorebar_backdrop" + visible when( team( name ) == "TEAM_FREE" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -36 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 5 -5 + exp material( dvarString( "g_TeamIcon_Allies" ) ); + visible when ( team( name ) == "TEAM_ALLIES" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -36 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 5 -5 + exp material( dvarString( "g_TeamIcon_Allies" ) ); + visible when ( team( name ) == "TEAM_SPECTATOR" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -36 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 5 -5 + exp material( dvarString( "g_TeamIcon_Axis" ) ); + visible when ( team( name ) == "TEAM_AXIS" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -36 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 5 -5 + exp material( dvarString( "g_TeamIcon_Allies" ) ); + visible when ( team( name ) == "TEAM_FREE" && TEAM_IS_MARINES && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -36 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 5 -5 + exp material( dvarString( "g_TeamIcon_Axis" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( team( name ) == "TEAM_FREE" && TEAM_IS_OPFOR && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 46 -41 80 12 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -41 + 0-(TEAM_IS_LOSING*24) ); + background "white" + forecolor 1 1 1 0.25 + visible when ( team( name ) != "TEAM_FREE" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 46 -41 80 12 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -41 + 0-(PLAYER_IS_LOSING*24) ); + background "white" + forecolor 1 1 1 0.25 + visible when ( team( name ) == "TEAM_FREE" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 128 -47 24 24 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -47 + 0-(TEAM_IS_LOSING*24) ); + background "hud_arrow_left" + forecolor 1 1 1 HUD_ALPHA + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 128 -47 24 24 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -47 + 0-(PLAYER_IS_LOSING*24) ); + background "hud_arrow_left" + forecolor 1 1 1 HUD_ALPHA + visible when ( team( name ) == "TEAM_FREE" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -39 76 8 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -39 + 0-(TEAM_IS_LOSING*24) ); + exp rect W( 76 * (team( score ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_allies" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_SPECTATOR") && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -39 76 8 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -39 + 0-(TEAM_IS_LOSING*24) ); + exp rect W( 76 * (team( score ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_axis" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( team( name ) == "TEAM_AXIS" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -39 76 8 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -39 + 0-(PLAYER_IS_LOSING*24) ); + exp rect W( 76 * (player( score ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_axis" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_FREE") && TEAM_IS_OPFOR && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -39 76 8 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -39 + 0-(PLAYER_IS_LOSING*24) ); + exp rect W( 76 * (player( score ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_allies" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_FREE") && TEAM_IS_MARINES && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + rect 50 -27 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -27 + 0-(TEAM_IS_LOSING*24) ); + exp text( team( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + rect 50 -27 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -27 + 0-(PLAYER_IS_LOSING*24) ); + exp text( player( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( team( name ) == "TEAM_FREE" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 46 -22 80 10 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -22 + (TEAM_IS_LOSING*12) ); + background "white" + forecolor 1 1 1 0.25 + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 46 -22 80 10 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -22 + (PLAYER_IS_LOSING*12) ); + background "white" + forecolor 1 1 1 0.25 + visible when ( team( name ) == "TEAM_FREE" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -20 76 6 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -20 + (TEAM_IS_LOSING*12) ); + exp rect W( 76 * (otherteam( score ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_allies" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( team( name ) == "TEAM_AXIS" && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -20 76 6 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -20 + (TEAM_IS_LOSING*12) ); + exp rect W( 76 * (otherteam( score ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_axis" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_SPECTATOR") && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -20 76 6 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -20 + (PLAYER_IS_LOSING*12) ); + exp rect W( 76 * (scoreatrank( 2 ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_allies" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_FREE") && TEAM_IS_OPFOR && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 48 -20 76 6 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -20 + (PLAYER_IS_LOSING*12) ); + exp rect W( 76 * (scoreatrank( 2 ) / dvarInt( "ui_scorelimit" ) ) ); + exp material( "scorebar_" + dvarString( "scr_axis" ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_FREE") && TEAM_IS_MARINES && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + rect 50 -8 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -8 + (TEAM_IS_LOSING*12) ); + exp text( otherteam( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + rect 50 -8 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -8 + (PLAYER_IS_LOSING*12) ); + exp text( scoreatrank( 2 ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( team( name ) == "TEAM_FREE" && player( score ) == scoreatrank( 1 ) && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + rect 50 -8 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp rect Y( -8 + (PLAYER_IS_LOSING*12) ); + exp text( scoreatrank( 1 ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + visible when ( team( name ) == "TEAM_FREE" && player( score ) != scoreatrank( 1 ) && SHOULD_DISPLAY_SCOREBAR && PROMOD_SB ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 134 -53 48 48 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 5 6 + exp material( "hud_suitcase_bomb" ); + visible when ( dvarBool( ui_bomb_timer ) && PROMOD_SB && SHOULD_DISPLAY_SCOREBAR ); + forecolor 1 1 1 0.25 + decoration + } + itemDef + { + rect 134 -3 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 6 0 + exp text( secondsAsCountdown( timeLeft() ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( timeLeft() >= 60 && !dvarBool( ui_bomb_timer ) && PROMOD_SB && SHOULD_DISPLAY_SCOREBAR ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + decoration + } + itemDef + { + rect 134 -3 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 6 0 + exp text( secondsAsCountdown( timeLeft() ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 0.75 0 HUD_FOREGROUND_ALPHA + visible when ( timeLeft() >= 30 && timeLeft() < 60 && !dvarBool( ui_bomb_timer ) && PROMOD_SB && SHOULD_DISPLAY_SCOREBAR ); + decoration + } + itemDef + { + rect 134 -3 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 6 0 + exp text( secondsAsCountdown( timeLeft() ) + "." + (9 - int( (milliseconds() / 100)%10 )) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 0.5 0 1 + visible when ( PROMOD_SB && SHOULD_DISPLAY_SCOREBAR && ( (timeLeft() >= 0 && timeLeft() < 30) || dvarBool( ui_bomb_timer ) ) ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -53 48 48 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 5 6 + exp material( "hud_suitcase_bomb" ); + visible when ( dvarBool( ui_bomb_timer ) && ( !PROMOD_SB || SHOULD_DISPLAY_SCOREBAR == false ) ); + forecolor 1 1 1 0.25 + decoration + } + itemDef + { + rect 0 -3 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 6 0 + exp text( secondsAsCountdown( timeLeft() ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( timeLeft() >= 60 && !dvarBool( ui_bomb_timer ) && ( !PROMOD_SB || SHOULD_DISPLAY_SCOREBAR == false ) ); + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + decoration + } + itemDef + { + rect 0 -3 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 6 0 + exp text( secondsAsCountdown( timeLeft() ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 0.75 0 HUD_FOREGROUND_ALPHA + visible when ( timeLeft() >= 30 && timeLeft() < 60 && !dvarBool( ui_bomb_timer ) && ( !PROMOD_SB || SHOULD_DISPLAY_SCOREBAR == false ) ); + decoration + } + itemDef + { + rect 0 -3 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + origin 6 0 + exp text ( secondsAsCountdown( timeLeft() ) + "." + (9 - int( (milliseconds() / 100)%10 )) ); + textfont UI_FONT_OBJECTIVE + textscale 0.35 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 0.5 0 1 + visible when ( ((timeLeft() >= 0 && timeLeft() < 30) || dvarBool( ui_bomb_timer )) && ( !PROMOD_SB || SHOULD_DISPLAY_SCOREBAR == false ) ); + decoration + } + itemDef + { + rect 0 0 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + exp text( dvarString( "promod_hud_website" ) ); + exp rect X( 3 + 65 * !PROMOD_SB ) + exp rect Y( -4 -43 * PROMOD_SB ) + textscale 0.35 + forecolor 0.99 0.99 0.75 1 + textstyle ITEM_TEXTSTYLE_SHADOWED + visible when ( dvarString( "promod_hud_website" ) != "" ) + } + } + + #define WEAPINFO_X -4 + #define WEAPINFO_Y -36 + + menuDef + { + name "weaponinfo" + rect BOTTOM_RECT_X (BOTTOM_RECT_Y - 10) 0 0 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM + fullScreen 0 + visible when( !inkillcam() && !dvarBool( ammoCounterHide ) && !flashbanged() && !ui_active() && !dvarint( ui_hud_hardcore ) && DVAR_BLANK && team( name ) != "TEAM_SPECTATOR" && NOT_SPECTATING ); + + itemDef + { + name "ammotext" + rect (WEAPINFO_X - 65) (WEAPINFO_Y + 33) 57 0 + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + textfont UI_FONT_OBJECTIVE + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + visible when ( dvarint( cg_drawBreathHint ) ) + decoration + } + itemDef + { + name "clipGraphic" + rect (WEAPINFO_X - 33) (WEAPINFO_Y + 26) 1 1 + forecolor 1 1 1 HUD_ALPHA + ownerdraw CG_PLAYER_WEAPON_AMMO_CLIP_GRAPHIC + visible when ( !dvarint( cg_drawBreathHint ) ) + decoration + } + itemDef + { + name "ammoStock" + rect (WEAPINFO_X - 31) (WEAPINFO_Y + 34) 1 1 + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + textfont UI_FONT_OBJECTIVE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + ownerdraw CG_PLAYER_WEAPON_AMMO_STOCK + visible when ( !dvarint( cg_drawBreathHint ) ) + decoration + } + itemDef + { + name "offhandFragIcon" + rect (WEAPINFO_X -36) (WEAPINFO_Y -11) 24 24 + forecolor 1 1 1 HUD_ALPHA + ownerdraw CG_OFFHAND_WEAPON_ICON_FRAG + background "hud_us_grenade" + visible 1 + decoration + } + itemDef + { + name "offhandSmokeIcon" + rect (WEAPINFO_X -66) (WEAPINFO_Y -11) 24 24 + forecolor 1 1 1 HUD_ALPHA + ownerdraw CG_OFFHAND_WEAPON_ICON_SMOKEFLASH + background "hud_us_smokegrenade" + visible 1 + decoration + } + itemDef + { + name "offHandSmokeAmmo" + rect (WEAPINFO_X -45) (WEAPINFO_Y +14) 25 25 + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + textfont UI_FONT_OBJECTIVE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + ownerdraw CG_OFFHAND_WEAPON_AMMO_SMOKEFLASH + visible 1 + decoration + } + itemDef + { + name "offHandFragAmmo" + rect (WEAPINFO_X -14) (WEAPINFO_Y +14) 25 25 + textscale TEXTSIZE_SMALL + textstyle ITEM_TEXTSTYLE_SHADOWED + textfont UI_FONT_OBJECTIVE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + ownerdraw CG_OFFHAND_WEAPON_AMMO_FRAG + visible 1 + decoration + } + itemDef + { + name "weapname" + rect (WEAPINFO_X - 40) (WEAPINFO_Y + 14) 1 1 + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textfont UI_FONT_OBJECTIVE + forecolor 1 1 1 HUD_FOREGROUND_ALPHA + ownerdraw CG_PLAYER_WEAPON_NAME + visible 1 + decoration + } + } + + menuDef + { + name "amitalking" + rect 0 45 1 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM + fullScreen 0 + visible when ( dvarint( hud_enable ) && !dvarint( ui_hud_hardcore ) && !ui_active() && DVAR_BLANK && ( team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS" ) ) + + itemDef + { + rect -60 -107 1 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM + origin 0 0 + forecolor 0.73 0.99 0.73 1 + exp text( dvarint(self_alive) ); + textfont TEXTSIZE_SMALL + textscale 0.48 + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + visible 1 + decoration + } + itemDef + { + rect -29 -107 1 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM + origin 0 0 + forecolor 1 0.66 0.66 1 + exp text( dvarint(opposing_alive) ); + textfont TEXTSIZE_SMALL + textscale 0.48 + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWED + visible 1 + decoration + } + } + + menuDef + { + name "talkers" + backcolor 1 1 1 1 + background "$levelBriefing" + rect FULLSCREEN_WIDE + style WINDOW_STYLE_FILLED + fullScreen MENU_FALSE + visible when( DVAR_ENFORCER || DVAR_ENFORCER_NOSND ) + + ENFORCE( dvarint( cl_maxpackets ) != 100, "SET CL_MAXPACKETS TO 100", -210 ); + ENFORCE( dvarint( r_dlightlimit ), "SET R_DLIGHTLIMIT TO 0", -190 ); + ENFORCE( dvarint( com_maxfps ) < 40 || dvarint( com_maxfps ) > 250, "SET COM_MAXFPS WITHIN 40-250", -170 ); + ENFORCE( dvarfloat( r_lodscaleskinned ) != 1, "SET R_LODSCALESKINNED TO 1", -150 ); + ENFORCE( dvarfloat( r_lodscalerigid ) != 1, "SET R_LODSCALERIGID TO 1", -130 ); + ENFORCE( dvarint( rate ) != 25000, "SET RATE TO 25000", -110 ); + ENFORCE( dvarint( dynent_active ), "SET DYNENT_ACTIVE TO 0", -90 ); + ENFORCE( dvarfloat( cg_hudDamageIconHeight ) != 64, "SET CG_HUDDAMAGEICONHEIGHT TO 64", -70 ); + ENFORCE( dvarfloat( cg_hudDamageIconWidth ) != 128, "SET CG_HUDDAMAGEICONWIDTH TO 128", -50 ); + ENFORCE( dvarint( cg_huddamageiconinscope ), "SET CG_HUDDAMAGEICONINSCOPE TO 0", -30 ); + ENFORCE( dvarfloat( cg_huddamageiconoffset ) != 128, "SET CG_HUDDAMAGEICONOFFSET TO 128", -10 ); + ENFORCE( dvarint( cg_huddamageicontime ) != 2000, "SET CG_HUDDAMAGEICONTIME TO 2000", 10 ); + ENFORCE( dvarfloat( cg_viewZSmoothingMin ) != 1 || dvarfloat( cg_viewZSmoothingMax ) != 16 || dvarfloat( cg_viewZSmoothingTime ) != 0.1, "SET CG_VIEWZSMOOTHING VALUES TO STOCK", 30 ); + ENFORCE( dvarint( r_filmtweakInvert ), "SET R_FILMTWEAKINVERT TO 0", 50 ); + ENFORCE( dvarint( sm_enable ), "SET SM_ENABLE TO 0", 70 ); + ENFORCE( dvarint( cg_nopredict ), "SET CG_NOPREDICT TO 0", 90 ); + ENFORCE( dvarfloat( compassplayerwidth ) != dvarfloat( compassplayerheight ), "SET COMPASSPLAYERHEIGHT/WIDTH EQUAL", 110 ); + ENFORCE( dvarfloat( compassfriendlywidth ) != dvarfloat( compassfriendlyheight ), "SET COMPASSFRIENDLYHEIGHT/WIDTH EQUAL", 130 ); + ENFORCE( dvarint( developer ), "SET DEVELOPER TO 0", 150 ); + ENFORCE( dvarint( r_zfeather ), "SET R_ZFEATHER TO 0", 170 ); + ENFORCE( dvarfloat( phys_gravity ) != "-800", "SET PHYS_GRAVITY TO -800", 190 ); + ENFORCE( dvarint( aim_automelee_enabled ), "PLEASE RECONNECT TO THE SERVER", 210 ); + } + + menuDef + { + name "killcam" + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + fullScreen 0 + visible when ( inkillcam() ); + + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 640 112 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + background "white" + forecolor 0.49 0.05 0.03 0.5 + visible 1 + decoration + } + + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 368 640 112 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + background "white" + forecolor 0.49 0.05 0.03 0.5 + visible 1 + decoration + } + + itemDef + { + rect 0 45 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + origin 0 0 + exp text( "KILLCAM" ); + textfont UI_FONT_OBJECTIVE + textscale 0.9 + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible 1 + decoration + } + } + + menuDef + { + name "CenterObituary" + rect 0 0 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER + fullScreen 0 + visible 1 + exp rect Y(180 + dvarInt(sv_cheats) * dvarint(promod_centermessage_position)); + + itemDef + { + name "chRect" + rect 0 0 0 0 + textscale TEXTSIZE_DEFAULT + textstyle ITEM_TEXTSTYLE_SHADOWED + ownerdraw CG_CENTER_MESSAGE + visible 1 + decoration + } + } + + menuDef + { + name "scorebar" + fullscreen 0 + visible when ( team( name ) == "TEAM_SPECTATOR" && !ui_active() ) + rect 0 0 640 480 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + + itemDef + { + origin 0 0 + exp rect X( -125 ) + exp rect Y( 20 ) + forecolor 0.99 0.99 0.75 1 + exp text( "Attack: " + dvarString( shout_scores_attack ) ); + textstyle ITEM_TEXTSTYLE_SHADOWED + textalign ITEM_ALIGN_CENTER + textscale 0.45 + textfont UI_FONT_DEFAULT + visible 1 + decoration + } + itemDef + { + origin 0 0 + exp rect X( 125 ) + exp rect Y( 20 ) + forecolor 0.99 0.99 0.75 1 + exp text( "Defence: " + dvarString( shout_scores_defence ) ); + textstyle ITEM_TEXTSTYLE_SHADOWED + textalign ITEM_ALIGN_CENTER + textscale 0.45 + textfont UI_FONT_DEFAULT + visible 1 + decoration + } + } + + menuDef + { + name "HoldBreathHint" + fullScreen 0 + visible when ( team( name ) == "TEAM_SPECTATOR" && !ui_active() ) + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + + #define SHOUT_TEXT_ALIGN 0 + #define HB_RECT 1 + HEALTHBAR( "allies", "rank_sgt1", 0, 0 ); + HEALTHBAR( "allies", "rank_sgt1", 1, 1 ); + HEALTHBAR( "allies", "rank_sgt1", 2, 2 ); + HEALTHBAR( "allies", "rank_sgt1", 3, 3 ); + HEALTHBAR( "allies", "rank_sgt1", 4, 4 ); + + #undef SHOUT_TEXT_ALIGN + #define SHOUT_TEXT_ALIGN 2 + #undef HB_RECT + #define HB_RECT 3 + HEALTHBAR( "axis", "rank_rec1", 0, 5 ); + HEALTHBAR( "axis", "rank_rec1", 1, 6 ); + HEALTHBAR( "axis", "rank_rec1", 2, 7 ); + HEALTHBAR( "axis", "rank_rec1", 3, 8 ); + HEALTHBAR( "axis", "rank_rec1", 4, 9 ); + } + + menuDef + { + name "gamemessages" + rect 6 -65 10 10 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM + fullScreen 0 + visible when( !inkillcam() && dvarint( ui_hud_obituaries ) && !ui_active() ); + + itemDef + { + origin 0 0 + type ITEM_TYPE_GAME_MESSAGE_WINDOW + gamemsgwindowindex 0 + gamemsgwindowmode MODE_BOTTOMUP_ALIGN_BOTTOM + textfont UI_FONT_DEFAULT + textstyle ITEM_TEXTSTYLE_SHADOWED + textalign ITEM_ALIGN_LEFT + textscale (TEXTSIZE_SMALL*0.75) + visible 1 + } + } + + menuDef + { + name "boldgamemessages" + rect 0 -60 10 10 HORIZONTAL_ALIGN_CENTER_SAFEAREA VERTICAL_ALIGN_CENTER_SAFEAREA + fullScreen 0 + visible when( !inkillcam() && dvarint( ui_hud_obituaries ) && !ui_active() ); + + itemDef + { + origin 0 0 + type ITEM_TYPE_GAME_MESSAGE_WINDOW + gamemsgwindowindex 1 + gamemsgwindowmode MODE_BOTTOMUP_ALIGN_BOTTOM + textfont UI_FONT_OBJECTIVE + textstyle ITEM_TEXTSTYLE_SHADOWED + textalign ITEM_ALIGN_CENTER + textscale 0.417 + visible 1 + } + } + + menuDef + { + name "subtitles" + rect 200 400 10 10 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + fullScreen 0 + visible when( !inkillcam() && dvarint( ui_hud_obituaries ) && !ui_active() && !dvarint( ui_hud_hardcore ) ); + + itemDef + { + origin 0 0 + type ITEM_TYPE_GAME_MESSAGE_WINDOW + gamemsgwindowindex 2 + gamemsgwindowmode MODE_BOTTOMUP_ALIGN_BOTTOM + textfont UI_FONT_DEFAULT + textstyle ITEM_TEXTSTYLE_SHADOWED + textalign ITEM_ALIGN_LEFT + textscale TEXTSIZE_SMALL + visible 1 + } + } +} \ No newline at end of file diff --git a/ui_mp/main.menu b/ui_mp/main.menu new file mode 100644 index 0000000..bb58516 --- /dev/null +++ b/ui_mp/main.menu @@ -0,0 +1,243 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 168 + +#define CHOICE_GROUP "main" +#define CHOICE_SEP_1 2 +#define CHOICE_SEP_2 4 +#define CHOICE_SEP_3 8 + +#define STYLE_PC 1 +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +{ + menuDef + { + name "cdkey_menu" + } + + assetGlobalDef + { + fadeClamp 1 + fadeCycle 1 + fadeAmount 0.1 + } + menuDef + { + name "main" + fullScreen 1 + rect 0 0 640 480 + focusColor COLOR_FOCUSED + onOpen + { + open main_text; + uiScript addPlayerProfiles; + uiScript openMenuOnDvar com_playerProfile "" player_profile; + uiScript openMenuOnDvarNot ui_playerProfileCount 1 player_profile; + uiScript stopRefresh; + setdvar ui_showEndOfGame "0"; + setdvar sv_cheats "1"; + setdvar promod_mode "strat"; + } + } + + menuDef + { + name "main_text" + fullScreen 1 + rect 0 0 640 480 + focusColor COLOR_FOCUSED + + itemDef + { + style WINDOW_STYLE_SHADER + rect FULLSCREEN_WIDE + background "animbg_back" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect FULLSCREEN_WIDE + background "animbg_front" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect FULLSCREEN_WIDE + background "animbg_front2" + visible 1 + decoration + } + itemDef + { + visible 1 + rect 324 56 278 68 + forecolor 1 1 1 1 + style WINDOW_STYLE_SHADER + background "logo_cod2" + visible when( !localvarBool( ui_hideBack ) ); + decoration + } + + CHOICE_BUTTON_VIS( 1, "@MENU_AUTO_UPDATE", open auconfirm;, when( dvarbool( cl_updateAvailable ) && !localvarBool( ui_hideBack ) ) ) + + itemDef + { + group grpControlbutton + rect 220 173 212 95 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 0.5 0.5 0.5 0.5 + forecolor 1 1 1 1 + backcolor 0 0 0 0.85 + visible when( localvarBool( ui_about ) ); + decoration + } + itemDef + { + text "Call of Duty 4 Promod" + style 0 + textscale 0.3 + textstyle 3 + rect 325 191 110 20 + textalign ITEM_ALIGN_CENTER + textalignx -55 + textaligny 0 + textfont UI_FONT_NORMAL + forecolor 1 1 1 1 + visible when( localvarBool( ui_about ) ); + decoration + } + itemDef + { + text "www.codpromod.com" + style 0 + textscale 0.2 + textstyle 3 + rect 325 199 110 20 + textalign ITEM_ALIGN_CENTER + textalignx -55 + textaligny 0 + textfont UI_FONT_NORMAL + forecolor 1 1 1 1 + visible when( localvarBool( ui_about ) ); + decoration + } + itemDef + { + text "Current Promod Version: LIVE V2.20 EU" + style 0 + textscale 0.25 + textstyle 3 + rect 239 216 95 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 0 + textfont UI_FONT_NORMAL + forecolor 1 1 1 1 + visible when( localvarBool( ui_about ) ); + decoration + } + itemDef + { + text "Maintained by Ingram" + style 0 + textscale 0.25 + textstyle 3 + rect 239 227 95 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 0 + textfont UI_FONT_NORMAL + forecolor 1 1 1 1 + visible when( localvarBool( ui_about ) ); + decoration + } + itemDef + { + text "Former developers: raf1, MavLP, bulletworm, Trivve" + style 0 + textscale 0.25 + textstyle 3 + rect 230 246 95 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 0 + textfont UI_FONT_NORMAL + forecolor 1 1 1 1 + visible when( localvarBool( ui_about ) ); + decoration + } + itemDef + { + text "Also thanks to everyone else involved in Promod!" + style 0 + textscale 0.25 + textstyle 3 + rect 325 264 110 20 + textalign ITEM_ALIGN_CENTER + textalignx -55 + textaligny 0 + textfont UI_FONT_NORMAL + forecolor 1 1 1 1 + visible when( localvarBool( ui_about ) ); + decoration + } + + CHOICE_BUTTON_BG( 2, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_HIGHLIGHT( 2, 2 ) + itemDef + { + type ITEM_TYPE_BUTTON + rect CHOICE_RECT( 2 ) + exp text( "About Promod" ); + textfont CHOICE_TEXTFONT + textscale CHOICE_TEXTSIZE + textstyle CHOICE_TEXTSTYLE + textAlign CHOICE_TEXTALIGN + textAlignX CHOICE_TEXT_OFFSET_X + forecolor CHOICE_TEXTCOLOR + visible when( !localvarBool( ui_hideBack ) ) + onFocus + { + play CHOICE_FOCUS_SOUND; + setLocalVarInt ui_highlight 2; + setLocalVarString ui_choicegroup CHOICE_GROUP; + setLocalvarBool ui_about 1; + } + leaveFocus + { + setLocalVarInt ui_highlight 0; + setLocalvarBool ui_about 0; + } + } + CHOICE_SEPARATOR_VIS( CHOICE_SEP_1, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_BUTTON_VIS( 3, "@MENU_JOIN_GAME", open pc_join_unranked;, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_BUTTON_VIS( 4, "@MENU_START_NEW_SERVER", close self; open createserver;, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_SEPARATOR_VIS( CHOICE_SEP_2, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_BUTTON_VIS( 5, "@MENU_SELECT_PROFILE", setdvar ui_playerProfileAlreadyChosen 0; open player_profile;, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_BUTTON_VIS( 6, "@MENU_CONTROLS", open main_controls;, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_BUTTON_VIS( 7, "@MENU_OPTIONS", open main_options;, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_BUTTON_VIS( 8, "@MENU_MODS", close self; open mods_menu;, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_SEPARATOR_VIS( CHOICE_SEP_3, when( !localvarBool( ui_hideBack ) ) ) + CHOICE_BUTTON_VIS( 9, "@MENU_QUIT", open quit_popmenu, when( !localvarBool( ui_hideBack ) ) ) + } + + #include "ui/choices_setup_popmenu.menu" +} \ No newline at end of file diff --git a/ui_mp/options_multi.menu b/ui_mp/options_multi.menu new file mode 100644 index 0000000..c41356f --- /dev/null +++ b/ui_mp/options_multi.menu @@ -0,0 +1,67 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" +#define OPTIONS_STYLE 1 +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +{ + menuDef + { + name "options_multi" + fullScreen 0 + rect 0 0 640 480 + focusColor COLOR_FOCUSED + onOpen + { + setLocalVarBool ui_hideBack 1; + exec "setfromdvar ui_name name"; + exec "setfromdvar ui_sensitivity sensitivity"; + } + onClose + { + setLocalVarBool ui_hideBack 0; + exec "setfromdvar name ui_name"; + exec "setfromdvar sensitivity ui_sensitivity"; + } + onESC + { + close self; + } + + #include "ui_mp/leftside_options.inc" + + CHOICE_SECTION_TITLE( 21, "@MENU_MULTIPLAYER_OPTIONS" ) + + CHOICE_DVARYESNO( 22, "@MPUI_PUNKBUSTER", cl_punkbuster, ; ) + CHOICE_DVARYESNO( 23, "@MENU_ALLOW_DOWNLOAD", cl_allowdownload, ; ) + CHOICE_DVAREDIT( 24, "@MENU_PLAYER_NAME", ui_name, ; ) + + CHOICE_SECTION_TITLE( 25, "Performance Settings" ) + CHOICE_DVARYESNO( 26, "Draw Decals", r_drawDecals, ; ) + CHOICE_DVARYESNO( 27, "Draw Sun", r_drawSun, ; ) + CHOICE_DVARYESNO( 28, "Explosion Distortion", r_distortion, ; ) + CHOICE_DVARYESNO( 29, "Eject Brass", cg_brass, ; ) + + CHOICE_SECTION_TITLE( 30, "Network Settings" ) + CHOICE_DVARYESNO( 31, "Draw Lagometer", cg_drawLagometer, ; ) + CHOICE_DVARSTRINGLIST( 32, "FPS Counter", cg_drawFPS, { "Off" Off "Simple" Simple "Simple+Ranges" SimpleRanges "Verbose" Verbose }, ; ) + CHOICE_DVARFLOATLIST( 33, "Duplicate Packets", cl_packetdup, { "0" 0 "1" 1 "2" 2 "3" 3 "4" 4 "5" 5 }, ; ) + + CHOICE_SECTION_TITLE( 34, "Visual Settings" ) + CHOICE_DVARYESNO( 35, "Numerical Ammo Counter", cg_drawBreathHint, ; ) + CHOICE_DVARFLOATLIST( 36, "Field Of View", cg_fov, { "65" 65 "71.1111" 71.1111 "80" 80 }, ;) + CHOICE_DVARFLOATLIST( 37, "Max FPS", com_maxfps, { "100 FPS" 100 "125 FPS" 125 "200 FPS" 200 "250 FPS" 250 }, ;) + CHOICE_DVARYESNO( 38, "Draw Mini-Scorebar", cg_voiceIconSize, ; ) + CHOICE_DVAREDIT( 39, "Mouse Sensitivity", ui_sensitivity, ; ) + } +} diff --git a/ui_mp/promod.txt b/ui_mp/promod.txt new file mode 100644 index 0000000..a23e4f0 --- /dev/null +++ b/ui_mp/promod.txt @@ -0,0 +1,18 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +{ + loadMenu { "ui_mp/connect.menu" } + loadMenu { "ui_mp/controls_multi.menu" } + loadMenu { "ui_mp/hud.menu" } + loadMenu { "ui_mp/main.menu" } + loadMenu { "ui_mp/options_multi.menu" } + loadMenu { "ui_mp/wm_quickmessage.menu" } +} \ No newline at end of file diff --git a/ui_mp/scoreboard.inc b/ui_mp/scoreboard.inc new file mode 100644 index 0000000..07fe219 --- /dev/null +++ b/ui_mp/scoreboard.inc @@ -0,0 +1,76 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#undef CHOICE_Y_SPACING +#define CHOICE_Y_SPACING 20 + +#define SCOREBOARD_MENU( itemIndex, textArg, colorArg, visArg ) \ +itemDef \ +{ \ + type ITEM_TYPE_BUTTON \ + rect CHOICE_RECT( itemIndex ) \ + exp text( textArg ); \ + textfont CHOICE_TEXTFONT \ + textscale TEXTSIZE_SMALL \ + textstyle CHOICE_TEXTSTYLE \ + textAlign CHOICE_TEXTALIGN \ + textAlignX CHOICE_TEXT_OFFSET_X \ + forecolor colorArg \ + visible when( team( name ) == "TEAM_FREE" && visArg ) \ + decoration \ +} \ + +#define SCOREBOARD_TITLE( itemIndex, titleArg ) \ +itemDef \ +{ \ + style WINDOW_STYLE_SHADER \ + rect (SECTION_X_OFFSET+40) 7 180 0.5 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ + origin CHOICE_ORIGIN( itemIndex ) \ + background "line_horizontal" \ + forecolor 1 1 1 0.85 \ + visible when( team( name ) == "TEAM_FREE" ) \ + decoration \ +} \ +itemDef \ +{ \ + style WINDOW_STYLE_SHADER \ + rect (SECTION_X_OFFSET+40) 8 180 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ + origin CHOICE_ORIGIN( itemIndex ) \ + background "line_horizontal" \ + forecolor 0.5 0.5 0.5 0.8 \ + visible when( team( name ) == "TEAM_FREE" ) \ + decoration \ +} \ +itemDef \ +{ \ + style WINDOW_STYLE_SHADER \ + rect (SECTION_X_OFFSET+40) 19 180 0.5 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ + origin CHOICE_ORIGIN( itemIndex ) \ + background "line_horizontal" \ + forecolor 1 1 1 0.85 \ + visible when( team( name ) == "TEAM_FREE" ) \ + decoration \ +} \ +itemDef \ +{ \ + type ITEM_TYPE_TEXT \ + rect (SECTION_X_OFFSET+150) -1 240 24 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ + origin CHOICE_ORIGIN( itemIndex ) \ + forecolor 1 1 1 0.8 \ + exp text( titleArg );\ + textstyle ITEM_TEXTSTYLE_SHADOWED \ + textfont UI_FONT_NORMAL \ + textscale TEXTSIZE_SMALL \ + textstyle CHOICE_TEXTSTYLE \ + textAlign ITEM_ALIGN_MIDDLE_LEFT \ + textAlignX SECTION_TEXT_OFFSET_X \ + visible when( team( name ) == "TEAM_FREE" ) \ + decoration \ +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/changeclass_marines_mw.menu b/ui_mp/scriptmenus/changeclass_marines_mw.menu new file mode 100644 index 0000000..bd36939 --- /dev/null +++ b/ui_mp/scriptmenus/changeclass_marines_mw.menu @@ -0,0 +1,105 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +#define CHOICE_SIZE_X +#define CHOICE_SIZE_Y 22 + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 34 + +#define CHOICE_SEP_OFFSET_Y -2 + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#undef BUTTON_BG_COLOR +#define BUTTON_BG_COLOR 0 0 0 0 + +#define MENU_LOCKED_COLOR 0.25 0.25 0.25 1 + +#define ORIGIN_BUTTON_BACK 52 438 +#define ORIGIN_MENU_TREE 54 64 +#define ORIGIN_MENU_TITLE_MARINES 178 64 +#define ORIGIN_MENU_TITLE_OPFOR 170 64 +#define TREE_COLOR 1 1 1 0.5 +#define LABEL_TEXT_COLOR 0.7 0.75 0.75 1 + +{ + menuDef + { + name "changeclass_marines_mw" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 7 + onOpen + { + setLocalVarInt ui_highlight ""; + setLocalVarString ui_team "marines" + } + onEsc + { + close self; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + CHOICE_MENU_TITLE( "@MPUI_CHOOSE_CLASS_CAP" ) + + #define BACK_OPEN; + #include "ui_mp/navcontrols.inc" + #include "ui_mp/teamicon.inc" + + CHOICE_BUTTON_VIS( 1, "1. Assault", scriptMenuResponse "assault";, when( dvarBool( allies_allow_assault ) || dvarString( loadout_curclass ) == "assault" ) ) + CHOICE_DBUTTON_VIS( 1, "1. Assault", when( !dvarBool( allies_allow_assault ) && dvarString( loadout_curclass ) != "assault" ) ) + + CHOICE_BUTTON_VIS( 2, "2. Spec Ops", scriptMenuResponse "specops";, when( dvarBool( allies_allow_specops ) || dvarString( loadout_curclass ) == "specops" ) ) + CHOICE_DBUTTON_VIS( 2, "2. Spec Ops", when( !dvarBool( allies_allow_specops ) && dvarString( loadout_curclass ) != "specops" ) ) + + CHOICE_BUTTON_VIS( 3, "3. Demolitions", scriptMenuResponse "demolitions";, when( dvarBool( allies_allow_demolitions ) || dvarString( loadout_curclass ) == "demolitions" ) ) + CHOICE_DBUTTON_VIS( 3, "3. Demolitions", when( !dvarBool( allies_allow_demolitions ) && dvarString( loadout_curclass ) != "demolitions" ) ) + + CHOICE_BUTTON_VIS( 4, "4. Sniper", scriptMenuResponse "sniper";, when( dvarBool( allies_allow_sniper ) || dvarString( loadout_curclass ) == "sniper" ) ) + CHOICE_DBUTTON_VIS( 4, "4. Sniper", when( !dvarBool( allies_allow_sniper ) && dvarString( loadout_curclass ) != "sniper" ) ) + + CHOICE_BUTTON( 6, "5. Spectate Team", scriptMenuResponse "killspec"; ) + + execKey "1" { scriptMenuResponse "assault"; } + execKey "2" { scriptMenuResponse "specops"; } + execKey "3" { scriptMenuResponse "demolitions"; } + execKey "4" { scriptMenuResponse "sniper"; } + execKey "5" { scriptMenuResponse "killspec"; } + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/changeclass_mw.menu b/ui_mp/scriptmenus/changeclass_mw.menu new file mode 100644 index 0000000..665116d --- /dev/null +++ b/ui_mp/scriptmenus/changeclass_mw.menu @@ -0,0 +1,42 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#define CAC_CLASS 200 +#define CAC_PRIMARY 201 +#define CAC_PRIMARY_ATTACHMENT 202 +#define CAC_SECONDARY 203 +#define CAC_SECONDARY_ATTACHMENT 204 +#define CAC_SPECIALTY_EQUIPMENT 205 +#define CAC_SPECIALTY_WEAPON 206 +#define CAC_SPECIALTY_ABILITY 207 +#define CAC_SPECIAL_GRENADE 208 +#define CAC_CAMO 209 + +#define CAC_S_CLASS "200" +#define CAC_S_PRIMARY "201" +#define CAC_S_PRIMARY_ATTACHMENT "202" +#define CAC_S_SECONDARY "203" +#define CAC_S_SECONDARY_ATTACHMENT "204" +#define CAC_S_SPECIALTY_EQUIPMENT "205" +#define CAC_S_SPECIALTY_WEAPON "206" +#define CAC_S_SPECIALTY_ABILITY "207" +#define CAC_S_SPECIAL_GRENADE "208" +#define CAC_S_CAMO "209" + +#define CAC_MENU_NAME "changeclass_mw" +#define CAC_PREFIX "mw_" +#define CAC_CUSTOM_NAME "customclass1" + +{ + #include "ui_mp/cac_ingame.inc" +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/changeclass_opfor_mw.menu b/ui_mp/scriptmenus/changeclass_opfor_mw.menu new file mode 100644 index 0000000..00a99f8 --- /dev/null +++ b/ui_mp/scriptmenus/changeclass_opfor_mw.menu @@ -0,0 +1,105 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +#define CHOICE_SIZE_X +#define CHOICE_SIZE_Y 22 + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 34 + +#define CHOICE_SEP_OFFSET_Y -2 + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#undef BUTTON_BG_COLOR +#define BUTTON_BG_COLOR 0 0 0 0 + +#define MENU_LOCKED_COLOR 0.25 0.25 0.25 1 + +#define ORIGIN_BUTTON_BACK 52 438 +#define ORIGIN_MENU_TREE 54 64 +#define ORIGIN_MENU_TITLE_MARINES 178 64 +#define ORIGIN_MENU_TITLE_OPFOR 170 64 +#define TREE_COLOR 1 1 1 0.5 +#define LABEL_TEXT_COLOR 0.7 0.75 0.75 1 + +{ + menuDef + { + name "changeclass_opfor_mw" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 7 + onOpen + { + setLocalVarInt ui_highlight ""; + setLocalVarString ui_team "opfor" + } + onEsc + { + close self; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + CHOICE_MENU_TITLE( "@MPUI_CHOOSE_CLASS_CAP" ) + + #define BACK_OPEN; + #include "ui_mp/navcontrols.inc" + #include "ui_mp/teamicon.inc" + + CHOICE_BUTTON_VIS( 1, "1. Assault", scriptMenuResponse "assault";, when( dvarBool( axis_allow_assault ) || dvarString( loadout_curclass ) == "assault" ) ) + CHOICE_DBUTTON_VIS( 1, "1. Assault", when( !dvarBool( axis_allow_assault ) && dvarString( loadout_curclass ) != "assault" ) ) + + CHOICE_BUTTON_VIS( 2, "2. Spec Ops", scriptMenuResponse "specops";, when( dvarBool( axis_allow_specops ) || dvarString( loadout_curclass ) == "specops" ) ) + CHOICE_DBUTTON_VIS( 2, "2. Spec Ops", when( !dvarBool( axis_allow_specops ) && dvarString( loadout_curclass ) != "specops" ) ) + + CHOICE_BUTTON_VIS( 3, "3. Demolitions", scriptMenuResponse "demolitions";, when( dvarBool( axis_allow_demolitions ) || dvarString( loadout_curclass ) == "demolitions" ) ) + CHOICE_DBUTTON_VIS( 3, "3. Demolitions", when( !dvarBool( axis_allow_demolitions ) && dvarString( loadout_curclass ) != "demolitions" ) ) + + CHOICE_BUTTON_VIS( 4, "4. Sniper", scriptMenuResponse "sniper";, when( dvarBool( axis_allow_sniper ) || dvarString( loadout_curclass ) == "sniper" ) ) + CHOICE_DBUTTON_VIS( 4, "4. Sniper", when( !dvarBool( axis_allow_sniper ) && dvarString( loadout_curclass ) != "sniper" ) ) + + CHOICE_BUTTON( 6, "5. Spectate Team", scriptMenuResponse "killspec"; ) + + execKey "1" { scriptMenuResponse "assault"; } + execKey "2" { scriptMenuResponse "specops"; } + execKey "3" { scriptMenuResponse "demolitions"; } + execKey "4" { scriptMenuResponse "sniper"; } + execKey "5" { scriptMenuResponse "killspec"; } + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/class.menu b/ui_mp/scriptmenus/class.menu new file mode 100644 index 0000000..c41ceee --- /dev/null +++ b/ui_mp/scriptmenus/class.menu @@ -0,0 +1,149 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#define CHOICE_SIZE_X 150 +#define CHOICE_SIZE_Y 22 + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 204 + +#define CHOICE_GROUP "class" +#define CHOICE_SEP_1 4 + +#include "ui_mp/menustyle.inc" +#include "ui_mp/choices_setup_teams.menu" + +#undef BUTTON_BG_COLOR +#define BUTTON_BG_COLOR 0 0 0 0 + +#define ORIGIN_DESCRIPTION (CHOICE_X_START + 15) 190 + +{ + menuDef + { + name "class" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 7 + onOpen + { + focusFirst; + } + onEsc + { + close self; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + #include "ui_mp/tactical_map.inc"; + #define ORIGIN_BANNER 108 48 + + itemDef { + style WINDOW_STYLE_SHADER + rect ORIGIN_BANNER 400 0.5 + background "line_horizontal" + forecolor 1 1 1 0.85 + visible 1 decoration } + itemDef { + style WINDOW_STYLE_SHADER + rect ORIGIN_BANNER 340 10 + origin 30 1 + background "line_horizontal" + forecolor OBJECTIVE_COLOR_MARINES + visible 1 + decoration } + itemDef { + style WINDOW_STYLE_SHADER + rect ORIGIN_BANNER 400 0.5 + origin 0 12 + background "line_horizontal" + forecolor 1 1 1 0.85 + visible 1 decoration } + + itemDef { + rect -400 64 800 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_TITLE + textalign ITEM_ALIGN_CENTER + forecolor 1 1 1 0.85 + exp text ( gametypename() ); + visible 1 decoration } + itemDef { + rect -250 84 500 60 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textalign ITEM_ALIGN_CENTER + forecolor 1 1 1 0.75 + exp text( gametypedescription() ); + autowrapped + visible 1 decoration } + + CHOICE_MENU_TITLE( "@MENU_OPTIONS_UPPER_CASE" ) + + #define BACK_OPEN; + #include "ui_mp/navcontrols.inc" + #include "ui_mp/teamicon.inc" + + #undef CHOICE_X_START + #define CHOICE_X_START -320 + + #undef CHOICE_HORIZONTAL_ALIGN + #define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER + + CHOICE_BUTTON_BG( 1, when( (TEAM_IS_MARINES || TEAM_IS_OPFOR) && MAY_CHOOSE_CLASS ) ) + CHOICE_HIGHLIGHT( 1, (TEAM_IS_MARINES || TEAM_IS_OPFOR) && MAY_CHOOSE_CLASS ) + CHOICE_BUTTON_VIS_NOHI( 1, "@MPUI_CHOOSE_CLASS", scriptMenuResponse "changeclass_marines", when( TEAM_IS_MARINES && MAY_CHOOSE_CLASS ) ) + CHOICE_BUTTON_VIS_NOHI( 1, "@MPUI_CHOOSE_CLASS", scriptMenuResponse "changeclass_opfor", when( TEAM_IS_OPFOR && MAY_CHOOSE_CLASS ) ) + + CHOICE_BUTTON( 2, "@MPUI_CHANGE_TEAM", scriptMenuResponse "changeteam"; ) + + CHOICE_SEPARATOR( CHOICE_SEP_1 ) + + CHOICE_BUTTON( 3, "@MENU_CONTROLS", close self; open main_controls ) + CHOICE_BUTTON( 4, "@MENU_OPTIONS", close self; open main_options; execnow "set ui_allow_graphic_change 0"; ) + + CHOICE_BUTTON_VIS( 5, "@MPUI_CALL_VOTE", open callvote; close self;, when( dvarbool( ui_allowvote ) ); ) + CHOICE_DBUTTON_VIS( 5, "@MPUI_CALL_VOTE", when( !dvarbool( ui_allowvote ) ); ) + + CHOICE_BUTTON( 6, "@MPUI_MUTE_PLAYERS", open muteplayer; close self; ) + + CHOICE_BUTTON( 7, "@MENU_LEAVE_GAME", open popup_leavegame; ) + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/demo.menu b/ui_mp/scriptmenus/demo.menu new file mode 100644 index 0000000..809b6c9 --- /dev/null +++ b/ui_mp/scriptmenus/demo.menu @@ -0,0 +1,72 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#include "ui_mp/popupstyle.inc" +#include "ui/choices_setup_popmenu.menu" + +#undef CHOICE_HORIZONTAL_ALIGN +#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER +#undef CHOICE_VERTICAL_ALIGN +#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER + +#undef CHOICE_SIZE_X +#define CHOICE_SIZE_X 325 + +#undef CHOICE_SIZE_Y +#define CHOICE_SIZE_Y 18 + +#undef CHOICE_POPUP_TITLE_HEIGHT +#define CHOICE_POPUP_TITLE_HEIGHT 20 + +{ + menuDef + { + CENTER_POPUP_SETUP_ONOPEN( demo, 5, ;, setDvar ui_demo "record "; setfocus demo;, 1 ) + + CHOICE_POPMENU_TITLE( "Record Demo" ) + CHOICE_POPMENU_SUBTITLE( " Note: Don't remove 'record' in front of the demo name" ) + + name "demo" + + onClose + { + scriptMenuResponse "demo"; + } + + itemDef + { + name demo + type ITEM_TYPE_EDITFIELD + text "Demo Name:" + dvar "ui_demo" + rect CHOICE_ORIGIN( 3 ) (CHOICE_SIZE_X) 20 + origin 0 -12 + textaligny 0 + textalignx 1 + maxpaintchars 30 + textalign ITEM_ALIGN_MIDDLE_LEFT + textfont UI_FONT_NORMAL + textscale TEXTSIZE_SMALL + forecolor .9 .9 .9 1 + style WINDOW_STYLE_FILLED + backcolor 0 0 0 .3 + visible 1 + accept { exec "stoprecord"; exec "vstr ui_demo"; close self } + } + + CHOICE_BUTTON( 4, "Start Recording", exec "stoprecord"; exec "vstr ui_demo"; close self ) + CHOICE_BUTTON( 5, "Cancel", close self; ) + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/echo.menu b/ui_mp/scriptmenus/echo.menu new file mode 100644 index 0000000..e69de29 diff --git a/ui_mp/scriptmenus/quickpromod.menu b/ui_mp/scriptmenus/quickpromod.menu new file mode 100644 index 0000000..6bdebbb --- /dev/null +++ b/ui_mp/scriptmenus/quickpromod.menu @@ -0,0 +1,155 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#include "ui_mp/popupstyle.inc" +#include "ui/choices_setup_popmenu.menu" + +#undef CHOICE_SIZE_X +#define CHOICE_SIZE_X 186 + +#undef CHOICE_POPUP_BACKCOLOR +#define CHOICE_POPUP_BACKCOLOR 0.2 0.2 0.22 0.65 + +#define ORIGIN_QUICKMESSAGEWINDOW 0 16 + +{ + menuDef + { + IMPROVED_POPUP_SETUP_ONOPEN( quickpromod, 10, 4, 210, ;, setDvar cl_bypassMouseInput "1";, 0 ) + onClose{ setDvar cl_bypassMouseInput "0" } + + CHOICE_POPMENU_TITLE( "Promod Controls" ) + + itemDef + { + name "window" + group ingamebox + rect 16 20 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "1. Timeout" + visible 1 + decoration + } + execKey "1" { scriptMenuResponse "1"; close quickpromod } + + itemDef + { + name "window" + group ingamebox + rect 16 36 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "2. Drop Bomb" + visible 1 + decoration + } + execKey "2" { scriptMenuResponse "2"; close quickpromod } + + itemDef + { + name "window" + group ingamebox + rect 16 52 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "3. Suicide" + visible 1 + decoration + } + execKey "3" { scriptMenuResponse "3"; close quickpromod } + + itemDef + { + name "window" + group ingamebox + rect 16 68 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "4. Spectate Team" + visible 1 + decoration + } + execKey "4" { scriptMenuResponse "killspec"; close quickpromod } + + + itemDef + { + name "window" + group ingamebox + rect 16 84 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "5. Record Reminder" + visible 1 + decoration + } + execKey "5" { scriptMenuResponse "4"; close quickpromod } + + itemDef + { + name "window" + group ingamebox + rect 16 100 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "6. Statistics" + visible 1 + decoration + } + execKey "6" { scriptMenuResponse "5"; close quickpromod } + + itemDef + { + name "window" + group ingamebox + rect 16 164 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "Esc. Exit" + visible 1 + decoration + } + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/quickpromodgfx.menu b/ui_mp/scriptmenus/quickpromodgfx.menu new file mode 100644 index 0000000..dcc44f4 --- /dev/null +++ b/ui_mp/scriptmenus/quickpromodgfx.menu @@ -0,0 +1,229 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#include "ui_mp/popupstyle.inc" +#include "ui/choices_setup_popmenu.menu" + +#undef CHOICE_SIZE_X +#define CHOICE_SIZE_X 186 + +#undef CHOICE_POPUP_BACKCOLOR +#define CHOICE_POPUP_BACKCOLOR 0.2 0.2 0.22 0.65 + +#define ORIGIN_QUICKMESSAGEWINDOW 0 16 + +{ + menuDef + { + IMPROVED_POPUP_SETUP_ONOPEN( quickpromodgfx, 11.5, 4, 180, ;, setDvar cl_bypassMouseInput "1";, 0 ) + onClose{ setDvar cl_bypassMouseInput "0" } + + CHOICE_POPMENU_TITLE( "Promod Graphics" ) + + itemDef + { + name "window" + group ingamebox + rect 16 20 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 0.7 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "Visibility:" + visible 1 + decoration + } + itemDef + { + name "window" + group ingamebox + rect 16 38 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + exp text "1. Lighting: " + dvarString( sunlight ) + visible 1 + decoration + } + execKey "1" { scriptMenuResponse "1"; close quickpromodgfx } + + itemDef + { + name "window" + group ingamebox + rect 16 54 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "2. Film Tweaks: Off" + visible when ( !dvarInt( r_filmusetweaks ) ) + decoration + } + itemDef + { + name "window" + group ingamebox + rect 16 54 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "2. Film Tweaks: On" + visible when ( dvarInt( r_filmusetweaks ) ) + decoration + } + execKey "2" { scriptMenuResponse "2"; close quickpromodgfx } + + itemDef + { + name "window" + group ingamebox + rect 16 74 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 0.7 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "Textures:" + visible 1 + decoration + } + itemDef + { + name "window" + group ingamebox + rect 16 92 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "3. Texture Filtering: On" + visible when ( !dvarInt( r_texfilterdisable ) ) + decoration + } + itemDef + { + name "window" + group ingamebox + rect 16 92 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "3. Texture Filtering: Off" + visible when ( dvarInt( r_texfilterdisable) ) + decoration + } + execKey "3" { scriptMenuResponse "3"; close quickpromodgfx } + + itemDef + { + name "window" + group ingamebox + rect 16 108 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + exp text "4. Normal Map: " + dvarString( r_normalmap ) + visible 1 + decoration + } + execKey "4" { scriptMenuResponse "4"; close quickpromodgfx } + + itemDef + { + name "window" + group ingamebox + rect 16 128 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 0.7 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "Miscellaneous:" + visible 1 + decoration + } + itemDef + { + name "window" + group ingamebox + rect 16 146 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + exp text ( "5. FOV Scale: " + dvarString( cg_fovscale ) + " (" + int( dvarFloat( cg_fov ) * dvarFloat( cg_fovscale ) ) + ")" ) + visible 1 + decoration + } + execKey "5" { scriptMenuResponse "5"; close quickpromodgfx } + + itemDef + { + name "window" + group ingamebox + rect 16 162 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + exp text ( "6. Screen Blur: " + dvarString( r_blur ) ) + visible 1 + decoration + } + execKey "6" { scriptMenuResponse "6"; close quickpromodgfx } + + itemDef + { + name "window" + group ingamebox + rect 16 194 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "Esc. Exit" + visible 1 + decoration + } + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/scoreboard.menu b/ui_mp/scriptmenus/scoreboard.menu new file mode 100644 index 0000000..5eed463 --- /dev/null +++ b/ui_mp/scriptmenus/scoreboard.menu @@ -0,0 +1,322 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +{ + menuDef + { + name "scoreboard" + rect 0 0 640 480 + + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 640 2 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 2 640 1 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 0 0 0 0.5 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 3 640 18 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 0 0 0 1 + visible when( team( name ) == "TEAM_ALLIES" && dvarString( "scr_allies" ) == "sas" && !isIntermission() ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 3 640 18 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 0.6 0.64 0.69 1 + visible when( team( name ) == "TEAM_ALLIES" && dvarString( "scr_allies" ) == "usmc" && !isIntermission() ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 3 640 18 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 0.52 0.28 0.28 1 + visible when( team( name ) == "TEAM_AXIS" && dvarString( "scr_axis" ) == "ussr" && !isIntermission() ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 3 640 18 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 0.65 0.57 0.41 1 + visible when( team( name ) == "TEAM_AXIS" && dvarString( "scr_axis" ) == "arab" && !isIntermission() ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 3 640 18 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 0.1 0.1 0.1 1 + visible when( isIntermission() ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 21 640 1 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 0 0 0 0.5 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 22 640 2 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_TOP + origin 0 4 + background "line_horizontal_scorebar" + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -4 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp material( dvarString( "g_TeamIcon_Allies" ) ); + visible when ( team( name ) == "TEAM_ALLIES" ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -4 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp material( dvarString( "g_TeamIcon_Allies" ) ); + visible when ( team( name ) == "TEAM_SPECTATOR" ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -4 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp material( dvarString( "g_TeamIcon_Axis" ) ); + visible when ( team( name ) == "TEAM_AXIS" ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 -4 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp material( dvarString( "g_TeamIcon_Allies" ) ); + visible when ( team( name ) == "TEAM_FREE" ); + decoration + } + itemDef + { + rect 36 22 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp text ( team( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") ) + decoration + } + itemDef + { + rect 36 22 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp text ( team( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") ) + decoration + } + itemDef + { + rect 36 22 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp text ( player( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( team( name ) == "TEAM_FREE" ) + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 95 -4 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp material( dvarString( "g_TeamIcon_Allies" ) ); + visible when ( team( name ) == "TEAM_AXIS" ); + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 95 -4 36 36 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp material( dvarString( "g_TeamIcon_Axis" ) ); + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_SPECTATOR") ); + decoration + } + itemDef + { + rect 134 22 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp text ( otherteam( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") ) + decoration + } + itemDef + { + rect 0 22 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + origin 0 4 + exp text( locString( "@MENU_SCORE_WINNING_WITH", team( score ), dvarint( "ui_scorelimit" ) ) ); + textfont UI_FONT_NORMAL + textscale TEXTSIZE_SMALL + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") && team( score ) > otherteam( score ) && timeLeft() % 8 > 3 && !isIntermission() ) + decoration + } + itemDef + { + rect 0 22 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + origin 0 4 + exp text( locString( "@MENU_SCORE_LOSING_WITH", team( score ), dvarint( "ui_scorelimit" ) ) ); + textfont UI_FONT_NORMAL + textscale TEXTSIZE_SMALL + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") && team( score ) < otherteam( score ) && timeLeft() % 8 > 3 && !isIntermission() ) + decoration + } + itemDef + { + rect 0 22 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + origin 0 4 + exp text( locString( "@MENU_SCORE_TIED_WITH", team( score ), dvarint( "ui_scorelimit" ) ) ); + textfont UI_FONT_NORMAL + textscale TEXTSIZE_SMALL + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") && team( score ) == otherteam( score ) && timeLeft() % 8 > 3 && !isIntermission() ) + decoration + } + itemDef + { + rect 0 22 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_TOP + origin 0 4 + exp text ( gameTypeName() ); + textfont UI_FONT_NORMAL + textscale TEXTSIZE_SMALL + textalign ITEM_ALIGN_CENTER + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when( (timeLeft() % 8 < 4 || timeLeft() < 0) && !isIntermission() ) + decoration + } + itemDef + { + rect 36 22 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp text ( marinesfield( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( team( name ) == "TEAM_SPECTATOR" ) + decoration + } + itemDef + { + rect 134 22 1 1 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP + origin 0 4 + exp text ( opforfield( score ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_LEFT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( team( name ) == "TEAM_SPECTATOR" ) + decoration + } + itemDef + { + rect -3 4 1 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + origin 0 22 + exp text ( secondsAsCountdown( timeLeft() ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_RIGHT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + visible when ( timeLeft() >= 60 ); + decoration + } + itemDef + { + rect -3 4 1 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + origin 0 22 + exp text ( secondsAsCountdown( timeLeft() ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_RIGHT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 0.75 0 1 + visible when ( timeLeft() >= 10 && timeLeft() < 60 ); + decoration + } + itemDef + { + rect -3 4 1 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP + origin 0 22 + exp text ( secondsAsCountdown( timeLeft() ) ); + textfont UI_FONT_OBJECTIVE + textscale 0.4 + textalign ITEM_ALIGN_RIGHT + textstyle ITEM_TEXTSTYLE_SHADOWEDMORE + forecolor 1 0.5 0 1 + visible when ( timeLeft() >= 0 && timeLeft() < 10 ); + decoration + } + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/shoutcast.menu b/ui_mp/scriptmenus/shoutcast.menu new file mode 100644 index 0000000..32c06a0 --- /dev/null +++ b/ui_mp/scriptmenus/shoutcast.menu @@ -0,0 +1,83 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +#define CHOICE_SIZE_X 150 +#define CHOICE_SIZE_Y 22 + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 204 + +#define CHOICE_SEP_OFFSET_Y -2 + +#define CHOICE_SEP_1 3 + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#undef BUTTON_BG_COLOR +#define BUTTON_BG_COLOR 0 0 0 0 + +{ + menuDef + { + name "shoutcast" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 0 + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + CHOICE_MENU_TITLE( "Shoutcast" ) + + #define BACK_OPEN; + #include "ui_mp/navcontrols.inc"; + + #undef CHOICE_X_START + #define CHOICE_X_START -320 + + #undef CHOICE_HORIZONTAL_ALIGN + #define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER + + CHOICE_BUTTON( 1, "Spectate", close self; ) + CHOICE_BUTTON( 2, "Shoutcast Setup", scriptMenuResponse "shoutcast_setup"; ) + CHOICE_BUTTON( 3, "Overview Map", close self; open shoutcast_map; setDvar cl_bypassMouseInput "1"; ) + CHOICE_BUTTON( 4, "Promod Graphics", open quickpromodgfx; ) + CHOICE_BUTTON( 5, "@MPUI_CHANGE_TEAM", scriptMenuResponse "changeteam"; ) + CHOICE_BUTTON( 6, "@MENU_CONTROLS", close self; open main_controls; ) + CHOICE_BUTTON( 7, "@MENU_OPTIONS", close self; open main_options; execnow "set ui_allow_graphic_change 0"; ) + CHOICE_BUTTON( 8, "@MPUI_LEAVE_GAME", open popup_endgame; ) + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/shoutcast_map.menu b/ui_mp/scriptmenus/shoutcast_map.menu new file mode 100644 index 0000000..6cfffd8 --- /dev/null +++ b/ui_mp/scriptmenus/shoutcast_map.menu @@ -0,0 +1,65 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#define BACK_ENABLE 0 +#define UI_MAP_NAME "@"+tablelookup("mp/mapsTable.csv",0,dvarString(mapname),3) + +{ + menuDef + { + name "shoutcast_map" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 7 + onEsc + { + close self; + } + onClose + { + setDvar cl_bypassMouseInput "0"; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + CHOICE_MENU_TITLE (UI_MAP_NAME) + + #include "ui_mp/tactical_map_s.inc"; + #include "ui_mp/navcontrols.inc"; + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/shoutcast_setup.inc b/ui_mp/scriptmenus/shoutcast_setup.inc new file mode 100644 index 0000000..6140a0f --- /dev/null +++ b/ui_mp/scriptmenus/shoutcast_setup.inc @@ -0,0 +1,23 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#define BACK_OPEN; +#include "ui_mp/navcontrols.inc" + +CHOICE_MENU_TITLE( "Shoutcast Setup" ) + +#undef CHOICE_X_START +#define CHOICE_X_START -247 + +#undef CHOICE_HORIZONTAL_ALIGN +#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER + +CHOICE_BUTTON( 14, "Players...", close self; open shoutcast_setup ) +CHOICE_BUTTON( 15, "Binds...", close self; open shoutcast_setup_binds ) \ No newline at end of file diff --git a/ui_mp/scriptmenus/shoutcast_setup.menu b/ui_mp/scriptmenus/shoutcast_setup.menu new file mode 100644 index 0000000..395d6ad --- /dev/null +++ b/ui_mp/scriptmenus/shoutcast_setup.menu @@ -0,0 +1,115 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 31 + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +{ + menuDef + { + name "shoutcast_setup" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + onOpen + { + setLocalVarInt ui_highlight ""; + scriptMenuResponse "getdetails"; + } + onEsc + { + close self; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + #include "ui_mp/scriptmenus/shoutcast_setup.inc" + + CHOICE_SECTION_TITLE( 1, dvarString("shout_attack_name") ) + + CHOICE_BUTTON_VIS( 2, "1. " + dvarString("shout_name0") + " (" + dvarString("shout_class0") + ")", scriptMenuResponse "1", when( dvarString("shout_name0") != "" && dvarString("shout_health0") != "0" ) ) + CHOICE_BUTTON_VIS( 3, "2. " + dvarString("shout_name1") + " (" + dvarString("shout_class1") + ")", scriptMenuResponse "2", when( dvarString("shout_name1") != "" && dvarString("shout_health1") != "0" ) ) + CHOICE_BUTTON_VIS( 4, "3. " + dvarString("shout_name2") + " (" + dvarString("shout_class2") + ")", scriptMenuResponse "3", when( dvarString("shout_name2") != "" && dvarString("shout_health2") != "0" ) ) + CHOICE_BUTTON_VIS( 5, "4. " + dvarString("shout_name3") + " (" + dvarString("shout_class3") + ")", scriptMenuResponse "4", when( dvarString("shout_name3") != "" && dvarString("shout_health3") != "0" ) ) + CHOICE_BUTTON_VIS( 6, "5. " + dvarString("shout_name4") + " (" + dvarString("shout_class4") + ")", scriptMenuResponse "5", when( dvarString("shout_name4") != "" && dvarString("shout_health4") != "0" ) ) + + CHOICE_DBUTTON_VIS( 2, "1. " + dvarString("shout_name0") + " (" + dvarString("shout_class0") + ")", when( dvarString("shout_name0") != "" && dvarString("shout_health0") == "0" ) ) + CHOICE_DBUTTON_VIS( 3, "2. " + dvarString("shout_name1") + " (" + dvarString("shout_class1") + ")", when( dvarString("shout_name1") != "" && dvarString("shout_health1") == "0" ) ) + CHOICE_DBUTTON_VIS( 4, "3. " + dvarString("shout_name2") + " (" + dvarString("shout_class2") + ")", when( dvarString("shout_name2") != "" && dvarString("shout_health2") == "0" ) ) + CHOICE_DBUTTON_VIS( 5, "4. " + dvarString("shout_name3") + " (" + dvarString("shout_class3") + ")", when( dvarString("shout_name3") != "" && dvarString("shout_health3") == "0" ) ) + CHOICE_DBUTTON_VIS( 6, "5. " + dvarString("shout_name4") + " (" + dvarString("shout_class4") + ")", when( dvarString("shout_name4") != "" && dvarString("shout_health4") == "0" ) ) + + CHOICE_DBUTTON_VIS( 2, "1. No Player", when( dvarString("shout_name0") == "" ) ) + CHOICE_DBUTTON_VIS( 3, "2. No Player", when( dvarString("shout_name1") == "" ) ) + CHOICE_DBUTTON_VIS( 4, "3. No Player", when( dvarString("shout_name2") == "" ) ) + CHOICE_DBUTTON_VIS( 5, "4. No Player", when( dvarString("shout_name3") == "" ) ) + CHOICE_DBUTTON_VIS( 6, "5. No Player", when( dvarString("shout_name4") == "" ) ) + + CHOICE_SECTION_TITLE( 7, dvarString("shout_defence_name") ) + + CHOICE_BUTTON_VIS( 8, "6. " + dvarString("shout_name5") + " (" + dvarString("shout_class5") + ")", scriptMenuResponse "6", when( dvarString("shout_name5") != "" && dvarString("shout_health5") != "0" ) ) + CHOICE_BUTTON_VIS( 9, "7. " + dvarString("shout_name6") + " (" + dvarString("shout_class6") + ")", scriptMenuResponse "7", when( dvarString("shout_name6") != "" && dvarString("shout_health6") != "0" ) ) + CHOICE_BUTTON_VIS( 10, "8. " + dvarString("shout_name7") + " (" + dvarString("shout_class7") + ")", scriptMenuResponse "8", when( dvarString("shout_name7") != "" && dvarString("shout_health7") != "0" ) ) + CHOICE_BUTTON_VIS( 11, "9. " + dvarString("shout_name8") + " (" + dvarString("shout_class8") + ")", scriptMenuResponse "9", when( dvarString("shout_name8") != "" && dvarString("shout_health8") != "0" ) ) + CHOICE_BUTTON_VIS( 12, "0. " + dvarString("shout_name9") + " (" + dvarString("shout_class9") + ")", scriptMenuResponse "10", when( dvarString("shout_name9") != "" && dvarString("shout_health9") != "0" ) ) + + CHOICE_DBUTTON_VIS( 8, "6. " + dvarString("shout_name5") + " (" + dvarString("shout_class5") + ")", when( dvarString("shout_name5") != "" && dvarString("shout_health5") == "0" ) ) + CHOICE_DBUTTON_VIS( 9, "7. " + dvarString("shout_name6") + " (" + dvarString("shout_class6") + ")", when( dvarString("shout_name6") != "" && dvarString("shout_health6") == "0" ) ) + CHOICE_DBUTTON_VIS( 10, "8. " + dvarString("shout_name7") + " (" + dvarString("shout_class7") + ")", when( dvarString("shout_name7") != "" && dvarString("shout_health7") == "0" ) ) + CHOICE_DBUTTON_VIS( 11, "9. " + dvarString("shout_name8") + " (" + dvarString("shout_class8") + ")", when( dvarString("shout_name8") != "" && dvarString("shout_health8") == "0" ) ) + CHOICE_DBUTTON_VIS( 12, "0. " + dvarString("shout_name9") + " (" + dvarString("shout_class9") + ")", when( dvarString("shout_name9") != "" && dvarString("shout_health9") == "0" ) ) + + CHOICE_DBUTTON_VIS( 8, "6. No Player", when( dvarString("shout_name5") == "" ) ) + CHOICE_DBUTTON_VIS( 9, "7. No Player", when( dvarString("shout_name6") == "" ) ) + CHOICE_DBUTTON_VIS( 10, "8. No Player", when( dvarString("shout_name7") == "" ) ) + CHOICE_DBUTTON_VIS( 11, "9. No Player", when( dvarString("shout_name8") == "" ) ) + CHOICE_DBUTTON_VIS( 12, "0. No Player", when( dvarString("shout_name9") == "" ) ) + + CHOICE_SECTION_TITLE( 21, "Class" ) + + CHOICE_BUTTON_VIS( 22, "Cycle Assault Players", scriptMenuResponse "assault", when( dvarInt("shout_class_assault") > 0 ) ) + CHOICE_BUTTON_VIS( 23, "Cycle Spec Ops Players", scriptMenuResponse "specops", when( dvarInt("shout_class_specops") > 0 ) ) + CHOICE_BUTTON_VIS( 24, "Cycle Demolitions Players", scriptMenuResponse "demolitions", when( dvarInt("shout_class_demolitions") > 0 ) ) + CHOICE_BUTTON_VIS( 25, "Cycle Sniper Players", scriptMenuResponse "sniper", when( dvarInt("shout_class_sniper") > 0 ) ) + + CHOICE_DBUTTON_VIS( 22, "Cycle Assault Players", when( dvarInt("shout_class_assault") == 0 ) ) + CHOICE_DBUTTON_VIS( 23, "Cycle Spec Ops Players", when( dvarInt("shout_class_specops") == 0 ) ) + CHOICE_DBUTTON_VIS( 24, "Cycle Demolitions Players", when( dvarInt("shout_class_demolitions") == 0 ) ) + CHOICE_DBUTTON_VIS( 25, "Cycle Sniper Players", when( dvarInt("shout_class_sniper") == 0 ) ) + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/shoutcast_setup_binds.menu b/ui_mp/scriptmenus/shoutcast_setup_binds.menu new file mode 100644 index 0000000..c2d41f0 --- /dev/null +++ b/ui_mp/scriptmenus/shoutcast_setup_binds.menu @@ -0,0 +1,91 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#define CHOICE_SEP_1 25 + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 31 + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +{ + menuDef + { + name "shoutcast_setup_binds" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + onEsc + { + close self; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + #include "ui_mp/scriptmenus/shoutcast_setup.inc" + + CHOICE_SECTION_TITLE( 1, dvarString("shout_attack_name") ) + + CHOICE_BIND( 2, "Player 1", "openscriptmenu shoutcast_setup 1", ; ) + CHOICE_BIND( 3, "Player 2", "openscriptmenu shoutcast_setup 2", ; ) + CHOICE_BIND( 4, "Player 3", "openscriptmenu shoutcast_setup 3", ; ) + CHOICE_BIND( 5, "Player 4", "openscriptmenu shoutcast_setup 4", ; ) + CHOICE_BIND( 6, "Player 5", "openscriptmenu shoutcast_setup 5", ; ) + + CHOICE_SECTION_TITLE( 7, dvarString("shout_defence_name") ) + + CHOICE_BIND( 8, "Player 1", "openscriptmenu shoutcast_setup 6", ; ) + CHOICE_BIND( 9, "Player 2", "openscriptmenu shoutcast_setup 7", ; ) + CHOICE_BIND( 10, "Player 3", "openscriptmenu shoutcast_setup 8", ; ) + CHOICE_BIND( 11, "Player 4", "openscriptmenu shoutcast_setup 9", ; ) + CHOICE_BIND( 12, "Player 5", "openscriptmenu shoutcast_setup 10", ; ) + + CHOICE_SECTION_TITLE( 21, "Class" ) + + CHOICE_BIND( 22, "Assault", "openscriptmenu shoutcast_setup assault", ; ) + CHOICE_BIND( 23, "Spec Ops", "openscriptmenu shoutcast_setup specops", ; ) + CHOICE_BIND( 24, "Demolitions", "openscriptmenu shoutcast_setup demolitions", ; ) + CHOICE_BIND( 25, "Sniper", "openscriptmenu shoutcast_setup sniper", ; ) + + CHOICE_SEPARATOR( CHOICE_SEP_1 ) + + CHOICE_BIND( 26, "Shoutcaster Menu", "openscriptmenu quickpromod shoutcaster", ; ) + CHOICE_BIND( 27, "Overview Map", "openscriptmenu quickpromod overview", ; ) + + CHOICE_KEYBINDHELP + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/team_marinesopfor.menu b/ui_mp/scriptmenus/team_marinesopfor.menu new file mode 100644 index 0000000..55a85ff --- /dev/null +++ b/ui_mp/scriptmenus/team_marinesopfor.menu @@ -0,0 +1,150 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#define CHOICE_SIZE_X 150 +#define CHOICE_SIZE_Y 22 + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 204 + +#define CHOICE_SEP_OFFSET_Y -2 + +#define CHOICE_SEP_1 3 + +#include "ui_mp/menustyle.inc" +#include "ui_mp/choices_setup_teams.menu" + +#undef BUTTON_BG_COLOR +#define BUTTON_BG_COLOR 0 0 0 0 + +{ + menuDef + { + name "team_marinesopfor" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 7 + legacySplitScreenScale + onOpen + { + setLocalVarInt ui_highlight ""; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + CHOICE_MENU_TITLE( "@MPUI_CHOOSE_TEAM" ) + + itemDef + { + style WINDOW_STYLE_FILLED + rect 48 72 285 117 + backcolor 0 0 0 .5 + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + } + itemDef + { + rect 50 92 270 117 + type ITEM_TYPE_BUTTON + textfont UI_FONT_DEFAULT + dvar "ui_motd" + textalign ITEM_ALIGN_LEFT + textscale TEXTSIZE_SMALL + forecolor 1 1 1 1 + backcolor 0 0 0 0 + textalignx 5 + textaligny 0 + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + autowrapped + } + itemDef + { + type ITEM_TYPE_TEXT + visible 1 + rect 55 72 0 0 + forecolor 1 0.8 0.4 1 + text "Message of the Day" + textfont UI_FONT_DEFAULT + textscale TEXTSIZE_DEFAULT + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + } + itemDef + { + + style WINDOW_STYLE_SHADER + rect 48 72 283 115 + background "white" + forecolor .5 .5 .5 0.15 + border 1 + bordersize 1 + bordercolor 0.5 0.5 0.5 0.7 + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + } + + #include "ui_mp/navcontrols.inc"; + #include "ui_mp/tactical_map.inc"; + + #undef CHOICE_X_START + #define CHOICE_X_START -320 + + #undef CHOICE_HORIZONTAL_ALIGN + #define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER + + CHOICE_BUTTON_VIS( 1, "1. Attack", scriptMenuResponse "allies";, when( team( name ) == "TEAM_AXIS" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) ) + CHOICE_DBUTTON_VIS( 1, "1. Attack", when( team( name ) == "TEAM_ALLIES" ) ) + + CHOICE_BUTTON_VIS( 2, "2. Defence", scriptMenuResponse "axis";, when( team( name ) == "TEAM_ALLIES" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) ) + CHOICE_DBUTTON_VIS( 2, "2. Defence", when( team( name ) == "TEAM_AXIS" ) ) + + CHOICE_BUTTON( 3, "3. Auto-Assign", scriptMenuResponse "autoassign"; ) + + CHOICE_SEPARATOR( CHOICE_SEP_1 ) + + CHOICE_BUTTON_VIS( 4, "4. Shoutcaster", scriptMenuResponse "shoutcast";, when( team( name ) != "TEAM_SPECTATOR" ) ) + CHOICE_DBUTTON_VIS( 4, "4. Shoutcaster", when( team( name ) == "TEAM_SPECTATOR" ) ) + + CHOICE_BUTTON_VIS( 5, "@MPUI_LEAVE_GAME", open popup_endgame, when( team( name ) == "TEAM_FREE" ) ) + + execKey "1" { scriptMenuResponse "allies"; } + execKey "2" { scriptMenuResponse "axis"; } + execKey "3" { scriptMenuResponse "autoassign"; } + execKey "4" { scriptMenuResponse "shoutcast"; } + } +} \ No newline at end of file diff --git a/ui_mp/scriptmenus/team_marinesopfor_flipped.menu b/ui_mp/scriptmenus/team_marinesopfor_flipped.menu new file mode 100644 index 0000000..2bfef41 --- /dev/null +++ b/ui_mp/scriptmenus/team_marinesopfor_flipped.menu @@ -0,0 +1,150 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#define CHOICE_SIZE_X 150 +#define CHOICE_SIZE_Y 22 + +#define CHOICE_X_START 0 +#define CHOICE_Y_START 204 + +#define CHOICE_SEP_OFFSET_Y -2 + +#define CHOICE_SEP_1 3 + +#include "ui_mp/menustyle.inc" +#include "ui_mp/choices_setup_teams.menu" + +#undef BUTTON_BG_COLOR +#define BUTTON_BG_COLOR 0 0 0 0 + +{ + menuDef + { + name "team_marinesopfor_flipped" + rect 0 0 640 480 + focuscolor COLOR_FOCUSED + style WINDOW_STYLE_EMPTY + blurWorld 7 + legacySplitScreenScale + onOpen + { + setLocalVarInt ui_highlight ""; + } + + itemDef + { + style WINDOW_STYLE_FILLED + rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN + backcolor 0 0 0 0.75 + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 0 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_top" + visible 1 + decoration + } + itemDef + { + style WINDOW_STYLE_SHADER + rect 0 405 854 75 HORIZONTAL_ALIGN_FULLSCREEN 0 + background "gradient_bottom" + visible 1 + decoration + } + + CHOICE_MENU_TITLE( "@MPUI_CHOOSE_TEAM" ) + + itemDef + { + style WINDOW_STYLE_FILLED + rect 48 72 285 117 + backcolor 0 0 0 .5 + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + } + itemDef + { + rect 50 92 270 117 + type ITEM_TYPE_BUTTON + textfont UI_FONT_DEFAULT + dvar "ui_motd" + textalign ITEM_ALIGN_LEFT + textscale TEXTSIZE_SMALL + forecolor 1 1 1 1 + backcolor 0 0 0 0 + textalignx 5 + textaligny 0 + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + autowrapped + } + itemDef + { + type ITEM_TYPE_TEXT + visible 1 + rect 55 72 0 0 + forecolor 1 0.8 0.4 1 + text "Message of the Day" + textfont UI_FONT_DEFAULT + textscale TEXTSIZE_DEFAULT + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + } + itemDef + { + + style WINDOW_STYLE_SHADER + rect 48 72 283 115 + background "white" + forecolor .5 .5 .5 0.15 + border 1 + bordersize 1 + bordercolor 0.5 0.5 0.5 0.7 + visible when( team( name ) == "TEAM_FREE" && dvarString("ui_motd") != "" ) + decoration + } + + #include "ui_mp/navcontrols.inc"; + #include "ui_mp/tactical_map.inc"; + + #undef CHOICE_X_START + #define CHOICE_X_START -320 + + #undef CHOICE_HORIZONTAL_ALIGN + #define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER + + CHOICE_BUTTON_VIS( 1, "1. Attack", scriptMenuResponse "axis";, when( team( name ) == "TEAM_ALLIES" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) ) + CHOICE_DBUTTON_VIS( 1, "1. Attack", when( team( name ) == "TEAM_AXIS" ) ) + + CHOICE_BUTTON_VIS( 2, "2. Defence", scriptMenuResponse "allies";, when( team( name ) == "TEAM_AXIS" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) ) + CHOICE_DBUTTON_VIS( 2, "2. Defence", when( team( name ) == "TEAM_ALLIES" ) ) + + CHOICE_BUTTON( 3, "3. Auto-Assign", scriptMenuResponse "autoassign"; ) + + CHOICE_SEPARATOR( CHOICE_SEP_1 ) + + CHOICE_BUTTON_VIS( 4, "4. Shoutcaster", scriptMenuResponse "shoutcast";, when( team( name ) != "TEAM_SPECTATOR" ) ) + CHOICE_DBUTTON_VIS( 4, "4. Shoutcaster", when( team( name ) == "TEAM_SPECTATOR" ) ) + + CHOICE_BUTTON_VIS( 5, "@MPUI_LEAVE_GAME", open popup_endgame, when( team( name ) == "TEAM_FREE" ) ) + + execKey "1" { scriptMenuResponse "axis"; } + execKey "2" { scriptMenuResponse "allies"; } + execKey "3" { scriptMenuResponse "autoassign"; } + execKey "4" { scriptMenuResponse "shoutcast"; } + } +} \ No newline at end of file diff --git a/ui_mp/tactical_map.inc b/ui_mp/tactical_map.inc new file mode 100644 index 0000000..539e0c3 --- /dev/null +++ b/ui_mp/tactical_map.inc @@ -0,0 +1,98 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#define MAP_X (- (MAP_WIDTH - RIGHTITEM_OFFSET + 20 )) +#define MAP_Y 114 +#define MAP_WIDTH 240 +#define MAP_HEIGHT 268 +#define ORIGIN_MAP_FRAME MAP_X MAP_Y +#define MAP_WIDTH2 (MAP_WIDTH+5) + +#define UI_MAP_NAME "@"+tablelookup("mp/mapsTable.csv",0,dvarString(mapname),3) +#define MAP_OFFSET 0 21 + +itemDef +{ + name "mini_map2" + rect ORIGIN_MAP_FRAME MAP_WIDTH MAP_WIDTH RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compass_map_default" + ownerdraw CG_PLAYER_FULLMAP_MAP + visible 1 + decoration +} + +itemDef +{ + style WINDOW_STYLE_SHADER + name "mini_map2_overlay" + rect ORIGIN_MAP_FRAME MAP_WIDTH MAP_WIDTH RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP + origin MAP_OFFSET + forecolor 1 1 1 1 + exp material( tableLookup( "mp/mapsTable.csv", 0, dvarString( mapname ), 7 ) ) + visible 1 + decoration +} + +itemDef +{ + name "compasspointers2" + rect ORIGIN_MAP_FRAME MAP_WIDTH MAP_WIDTH RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP + origin MAP_OFFSET + forecolor 1 1 1 1 + background "objective_line" + ownerdraw CG_PLAYER_FULLMAP_POINTERS + visible 1 + decoration +} +itemDef +{ + name "compassfriendlies2" + rect ORIGIN_MAP_FRAME MAP_WIDTH MAP_WIDTH RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compassping_friendly" + ownerdraw CG_PLAYER_FULLMAP_FRIENDS + visible 1 + decoration +} +itemDef +{ + name "compassenemies2" + rect ORIGIN_MAP_FRAME MAP_WIDTH MAP_WIDTH RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compassping_enemy" + ownerdraw CG_PLAYER_FULLMAP_ENEMIES + visible when( dvarInt( g_compassShowEnemies ) ); + decoration +} +itemDef +{ + name "compassplayer2" + rect ORIGIN_MAP_FRAME MAP_WIDTH MAP_WIDTH RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compassping_player" + ownerdraw CG_PLAYER_FULLMAP_PLAYER + visible when( team( name ) != "TEAM_FREE" ) + decoration +} + +PREPROC_SHADER_DRAW_ALIGNED( ORIGIN_MAP_FRAME (-(MAP_WIDTH)) 20 RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP, 5 0, "white", 0 0 0 0.3, 0, 0, 0 0 0 0 ) +PREPROC_SHADER_DRAW_ALIGNED( ORIGIN_MAP_FRAME (-(MAP_WIDTH)) 20 RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP, 5 0, "gradient_fadein", 0.9 0.95 1 0.4, 0, 0, 0 0 0 0 ) + +UI_EDGE_REVERSE( ORIGIN_MAP_FRAME, RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP, 0, 0, 0 0 0 0.3 ) +UI_EDGE_REVERSE( ORIGIN_MAP_FRAME, RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP, 0, 0, 0.9 0.95 1 0.4 ) + +PREPROC_SHADER_DRAW_ALIGNED( ORIGIN_MAP_FRAME (-(MAP_WIDTH2)) 6 RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP, 0 (MAP_HEIGHT-6), "gradient_fadein",0.9 0.95 1 0.35, 0, 0, 0 0 0 0 ) +PREPROC_SHADER_DRAW_ALIGNED( ORIGIN_MAP_FRAME -80 20 RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP, (MAP_WIDTH-78) 0, "ui_perforation", 1 1 1 1, 0, 0, 0 0 0 0 ) +PREPROC_TEXT_DRAW_ALIGNED_EXP( ORIGIN_MAP_FRAME MAP_WIDTH 0 RIGHTITEM_ALIGN VERTICAL_ALIGN_TOP, 5 20, UI_MAP_NAME, TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_LEFT, 1 1 1 0.7 ) \ No newline at end of file diff --git a/ui_mp/tactical_map_s.inc b/ui_mp/tactical_map_s.inc new file mode 100644 index 0000000..9dbf093 --- /dev/null +++ b/ui_mp/tactical_map_s.inc @@ -0,0 +1,79 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#define MAP_OFFSET 0 0 +#define FULL_SCREEN 0 30 640 420 + +itemDef +{ + name "mini_map2" + rect FULL_SCREEN + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compass_map_default" + ownerdraw CG_PLAYER_FULLMAP_MAP + visible 1 + decoration +} +itemDef +{ + style WINDOW_STYLE_SHADER + name "mini_map2_overlay" + rect FULL_SCREEN + origin MAP_OFFSET + forecolor 1 1 1 1 + exp material( tableLookup( "mp/mapsTable.csv", 0, dvarString( mapname ), 7 ) ) + visible 1 + decoration +} +itemDef +{ + name "compasspointers2" + rect FULL_SCREEN + origin MAP_OFFSET + forecolor 1 1 1 1 + background "objective_line" + ownerdraw CG_PLAYER_FULLMAP_POINTERS + visible 1 + decoration +} +itemDef +{ + name "compassfriendlies2" + rect FULL_SCREEN + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compassping_friendly" + ownerdraw CG_PLAYER_FULLMAP_FRIENDS + visible 1 + decoration +} +itemDef +{ + name "compassenemies2" + rect FULL_SCREEN + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compassping_enemy" + ownerdraw CG_PLAYER_FULLMAP_ENEMIES + visible 1 + decoration +} +itemDef +{ + name "compassplayer2" + rect FULL_SCREEN + origin MAP_OFFSET + forecolor 1 1 1 1 + background "compassping_player" + ownerdraw CG_PLAYER_FULLMAP_PLAYER + visible 1 + decoration +} \ No newline at end of file diff --git a/ui_mp/wm_quickmessage.menu b/ui_mp/wm_quickmessage.menu new file mode 100644 index 0000000..a4a4119 --- /dev/null +++ b/ui_mp/wm_quickmessage.menu @@ -0,0 +1,131 @@ +/* + Copyright (c) 2009-2017 Andreas Göransson + Copyright (c) 2009-2017 Indrek Ardel + + This file is part of Call of Duty 4 Promod. + + Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License. + Terms of license can be found in LICENSE.md document bundled with the project. +*/ + +#include "ui/menudef.h" +#include "ui_mp/common_macro.inc" + +#include "ui_mp/menustyle.inc" +#include "ui/choices_setup_common.menu" + +#include "ui_mp/popupstyle.inc" +#include "ui/choices_setup_popmenu.menu" + +#undef CHOICE_SIZE_X +#define CHOICE_SIZE_X 186 + +#undef CHOICE_POPUP_BACKCOLOR +#define CHOICE_POPUP_BACKCOLOR 0.2 0.2 0.22 0.65 + +#define ORIGIN_QUICKMESSAGEWINDOW 0 16 + +{ + menuDef + { + IMPROVED_POPUP_SETUP_ONOPEN( quickmessage, 7.6, 4, 258, ;, setDvar cl_bypassMouseInput "1";, 0 ) + onClose{ setDvar cl_bypassMouseInput "0" } + + CHOICE_POPMENU_TITLE( "@QUICKMESSAGE_QUICK_MESSAGE" ) + + itemDef + { + name "window" + visible 1 + rect 16 20 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "@QUICKMESSAGE_1_COMMANDS" + decoration + } + execKey "1" { close quickmessage; open quickcommands } + + itemDef + { + name "window" + visible 1 + rect 16 36 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "@QUICKMESSAGE_2_STATEMENTS" + decoration + } + execKey "2" { close quickmessage; open quickstatements } + + itemDef + { + name "window" + visible 1 + rect 16 52 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "@QUICKMESSAGE_3_RESPONSES" + decoration + } + execKey "3" { close quickmessage; open quickresponses } + + itemDef + { + name "window" + visible 1 + rect 16 68 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "4. Promod Controls" + decoration + } + execKey "4" { close quickmessage; open quickpromod } + + itemDef + { + name "window" + visible 1 + rect 16 84 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "5. Promod Graphics" + decoration + } + execKey "5" { close quickmessage; open quickpromodgfx } + + itemDef + { + name "window" + visible 1 + rect 16 116 0 0 + origin ORIGIN_QUICKMESSAGEWINDOW + forecolor 1 1 1 1 + textfont UI_FONT_NORMAL + textstyle ITEM_TEXTSTYLE_SHADOWED + textscale TEXTSIZE_SMALL + textaligny 8 + text "Esc. Exit" + decoration + } + } +} \ No newline at end of file diff --git a/weapons/mp/ak47_mp b/weapons/mp/ak47_mp new file mode 100644 index 0000000..c081919 --- /dev/null +++ b/weapons/mp/ak47_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_AK47\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 39 mm\maxAmmo\180\startAmmo\90\clipName\ak47_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\30\meleeDamage\135\maxDamageRange\1500\minDamageRange\2000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.085\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.5\reloadEmptyTime\3.25\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.6\raiseTime\0.95\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\1.4\emptyDropTime\0.6\emptyRaiseTime\0.95\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\1\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\60\hipViewKickYawMax\-60\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\60\adsViewKickYawMax\-60\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.14\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_ak47_mp\gunModel2\viewmodel_ak47_mp_brock\gunModel3\viewmodel_ak47_mp_bshdwl\gunModel4\viewmodel_ak47_mp_bwmrpt\gunModel5\viewmodel_ak47_mp_cmdtgr\gunModel6\viewmodel_ak47_mp_stagger\gunModel7\viewmodel_ak47_gold_mp\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_ak47\worldModel2\weapon_ak47_mp_brock\worldModel3\weapon_ak47_mp_bshdwl\worldModel4\weapon_ak47_mp_bwmrpt\worldModel5\weapon_ak47_mp_cmdtgr\worldModel6\weapon_ak47_mp_stagger\worldModel7\weapon_ak47_gold\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_ak47_idle\emptyIdleAnim\\fireAnim\viewmodel_ak47_fire\lastShotAnim\viewmodel_ak47_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_ak47_reload\reloadEmptyAnim\viewmodel_ak47_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_ak47_pullout\dropAnim\viewmodel_ak47_putaway\firstRaiseAnim\viewmodel_ak47_first_time_pullout\altRaiseAnim\viewmodel_ak47_pullout\altDropAnim\viewmodel_ak47_putaway\quickRaiseAnim\viewmodel_ak47_pullout_quick\quickDropAnim\viewmodel_ak47_putaway_quick\emptyRaiseAnim\viewmodel_ak47_pullout\emptyDropAnim\viewmodel_ak47_putaway\sprintInAnim\viewmodel_ak47_sprint_in\sprintLoopAnim\viewmodel_ak47_sprint_loop\sprintOutAnim\viewmodel_ak47_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_ak47_fire_ads\adsLastShotAnim\viewmodel_ak47_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_ak47_ADS_up\adsDownAnim\viewmodel_ak47_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_ak47_fire_npc\fireSoundPlayer\weap_ak47_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_swing_large\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_ak47_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_ak47_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_ak47\killIcon\hud_icon_ak47\dpadIcon\\ammoCounterIcon\hud_icon_ak47\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\assault_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\15\hideTags\tag_reflex_sight +tag_acog +tag_ak47_mount\notetrackSoundMap\weap_ak47_lift_plr weap_ak47_lift_plr +weap_ak47_clipout_plr weap_ak47_clipout_plr +weap_ak47_clipin_plr weap_ak47_clipin_plr +weap_ak47_chamber_plr weap_ak47_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/ak47_silencer_mp b/weapons/mp/ak47_silencer_mp new file mode 100644 index 0000000..05de1b1 --- /dev/null +++ b/weapons/mp/ak47_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_AK47\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 39 mm\maxAmmo\180\startAmmo\90\clipName\ak47_silencer_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\20\meleeDamage\135\maxDamageRange\500\minDamageRange\1000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.085\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.5\reloadEmptyTime\3.25\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.6\raiseTime\0.95\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\1.4\emptyDropTime\0.6\emptyRaiseTime\0.95\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\1\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\60\hipViewKickYawMax\-6\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\60\adsViewKickYawMax\-60\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.14\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_ak47_and_silencer_mp\gunModel2\viewmodel_ak47_and_silencer_mp_brock\gunModel3\viewmodel_ak47_and_silencer_mp_bshdwl\gunModel4\viewmodel_ak47_and_silencer_mp_bwmrpt\gunModel5\viewmodel_ak47_and_silencer_mp_cmdtgr\gunModel6\viewmodel_ak47_and_silencer_mp_stagger\gunModel7\viewmodel_ak47_gold_and_silencer_mp\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_ak47_silencer\worldModel2\weapon_ak47SD_mp_brock\worldModel3\weapon_ak47sd_mp_bwmrpt\worldModel4\weapon_ak47sd_mp_bwmrpt\worldModel5\weapon_ak47sd_mp_cmdtgr\worldModel6\weapon_ak47sd_mp_stagger\worldModel7\weapon_ak47_silencer_gold\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_ak47_idle\emptyIdleAnim\\fireAnim\viewmodel_ak47_fire\lastShotAnim\viewmodel_ak47_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_ak47_reload\reloadEmptyAnim\viewmodel_ak47_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_ak47_pullout\dropAnim\viewmodel_ak47_putaway\firstRaiseAnim\viewmodel_ak47_first_time_pullout\altRaiseAnim\viewmodel_ak47_pullout\altDropAnim\viewmodel_ak47_putaway\quickRaiseAnim\viewmodel_ak47_pullout_quick\quickDropAnim\viewmodel_ak47_putaway_quick\emptyRaiseAnim\viewmodel_ak47_pullout\emptyDropAnim\viewmodel_ak47_putaway\sprintInAnim\viewmodel_ak47_sprint_in\sprintLoopAnim\viewmodel_ak47_sprint_loop\sprintOutAnim\viewmodel_ak47_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_ak47_fire_ads\adsLastShotAnim\viewmodel_ak47_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_ak47_ADS_up\adsDownAnim\viewmodel_ak47_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4silenced_fire_npc\fireSoundPlayer\weap_m4silenced_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_swing_large\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_ak47_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_ak47_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_ak47\killIcon\hud_icon_ak47\dpadIcon\\ammoCounterIcon\hud_icon_ak47\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\15\hideTags\\notetrackSoundMap\weap_ak47_lift_plr weap_ak47_lift_plr +weap_ak47_clipout_plr weap_ak47_clipout_plr +weap_ak47_clipin_plr weap_ak47_clipin_plr +weap_ak47_chamber_plr weap_ak47_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/ak74u_mp b/weapons/mp/ak74u_mp new file mode 100644 index 0000000..21db188 --- /dev/null +++ b/weapons/mp/ak74u_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_AK74U\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.45 × 39 mm\maxAmmo\180\startAmmo\90\clipName\ak74u_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\50\minDamage\5\meleeDamage\135\maxDamageRange\1\minDamageRange\1500\playerDamage\50\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1.4\locTorsoUpper\1.4\locTorsoLower\1.2\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.078\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.5\reloadEmptyTime\3.25\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.6\raiseTime\0.95\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\1.4\emptyDropTime\0.6\emptyRaiseTime\0.95\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\1\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\2\hipSpreadDuckedMin\1.75\hipSpreadProneMin\1.5\hipSpreadMax\5\hipSpreadDuckedMax\4.5\hipSpreadProneMax\4\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-20\hipViewKickPitchMax\65\hipViewKickYawMin\65\hipViewKickYawMax\-65\hipViewKickCenterSpeed\1600\adsViewKickPitchMin\-20\adsViewKickPitchMax\65\adsViewKickYawMin\65\adsViewKickYawMax\-65\adsViewKickCenterSpeed\1600\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.25\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_ak74u_mp\gunModel2\viewmodel_ak74u_mp_brock\gunModel3\viewmodel_ak74u_mp_bshdwl\gunModel4\viewmodel_ak74u_mp_bwmrpt\gunModel5\viewmodel_ak74u_mp_cmdtgr\gunModel6\viewmodel_ak74u_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_ak74u\worldModel2\weapon_ak74u_mp_brock\worldModel3\weapon_ak74u_mp_bshdwl\worldModel4\weapon_ak74u_mp_bwmrpt\worldModel5\weapon_ak74u_mp_cmdtgr\worldModel6\weapon_ak74u_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_ak74u_idle\emptyIdleAnim\\fireAnim\viewmodel_ak74u_fire\lastShotAnim\viewmodel_ak74u_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_ak74u_reload\reloadEmptyAnim\viewmodel_ak74u_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_ak74u_pullout\dropAnim\viewmodel_ak74u_putaway\firstRaiseAnim\viewmodel_ak74u_pullout_first\altRaiseAnim\viewmodel_ak74u_pullout\altDropAnim\viewmodel_ak74u_putaway\quickRaiseAnim\viewmodel_ak74u_pullout_quick\quickDropAnim\viewmodel_ak74u_putaway_quick\emptyRaiseAnim\viewmodel_ak74u_pullout\emptyDropAnim\viewmodel_ak74u_putaway\sprintInAnim\viewmodel_ak74u_sprint_in\sprintLoopAnim\viewmodel_ak74u_sprint_loop\sprintOutAnim\viewmodel_ak74u_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_ak74u_fire_ads\adsLastShotAnim\viewmodel_ak74u_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_ak74u_ADS_up\adsDownAnim\viewmodel_ak74u_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_ak74_fire_npc\fireSoundPlayer\weap_ak74_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_ak74_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_ak74_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_ak74_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_ak74u\killIcon\hud_icon_ak74u\dpadIcon\\ammoCounterIcon\hud_icon_ak74u\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\smg_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\12\hideTags\tag_reflex_sight +tag_acog +tag_ak47_mount\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_ak47_lift_plr weap_ak47_lift_plr +weap_ak47_clipout_plr weap_ak47_clipout_plr +weap_ak47_clipin_plr weap_ak47_clipin_plr +weap_ak47_chamber_plr weap_ak47_chamber_plr \ No newline at end of file diff --git a/weapons/mp/ak74u_silencer_mp b/weapons/mp/ak74u_silencer_mp new file mode 100644 index 0000000..306db0f --- /dev/null +++ b/weapons/mp/ak74u_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_AK74U\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.45 × 39 mm\maxAmmo\180\startAmmo\90\clipName\ak74u_silencer_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\5\meleeDamage\135\maxDamageRange\1\minDamageRange\700\playerDamage\50\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1.4\locTorsoUpper\1.4\locTorsoLower\1.2\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.075\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.5\reloadEmptyTime\3.25\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.6\raiseTime\0.95\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\1.4\emptyDropTime\0.6\emptyRaiseTime\0.95\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\1\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-20\hipViewKickPitchMax\65\hipViewKickYawMin\65\hipViewKickYawMax\-65\hipViewKickCenterSpeed\1600\adsViewKickPitchMin\-20\adsViewKickPitchMax\65\adsViewKickYawMin\65\adsViewKickYawMax\-65\adsViewKickCenterSpeed\1600\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.25\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_ak74u_silencer\gunModel2\viewmodel_ak74usd_mp_brock\gunModel3\viewmodel_ak74usd_mp_bshdwl\gunModel4\viewmodel_ak74usd_mp_bwmrpt\gunModel5\viewmodel_ak74usd_mp_cmdtgr\gunModel6\viewmodel_ak74usd_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_ak74u_supressed\worldModel2\weapon_ak74usd_mp_brock\worldModel3\weapon_ak74usd_mp_bshdwl\worldModel4\weapon_ak74usd_mp_bwmrpt\worldModel5\weapon_ak74usd_mp_cmdtgr\worldModel6\weapon_ak74usd_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_ak74u_idle\emptyIdleAnim\\fireAnim\viewmodel_ak74u_fire\lastShotAnim\viewmodel_ak74u_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_ak74u_reload\reloadEmptyAnim\viewmodel_ak74u_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_ak74u_pullout\dropAnim\viewmodel_ak74u_putaway\firstRaiseAnim\viewmodel_ak74u_pullout_first\altRaiseAnim\viewmodel_ak74u_pullout\altDropAnim\viewmodel_ak74u_putaway\quickRaiseAnim\viewmodel_ak74u_pullout_quick\quickDropAnim\viewmodel_ak74u_putaway_quick\emptyRaiseAnim\viewmodel_ak74u_pullout\emptyDropAnim\viewmodel_ak74u_putaway\sprintInAnim\viewmodel_ak74u_sprint_in\sprintLoopAnim\viewmodel_ak74u_sprint_loop\sprintOutAnim\viewmodel_ak74u_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_ak74u_fire_ads\adsLastShotAnim\viewmodel_ak74u_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_ak74u_ADS_up\adsDownAnim\viewmodel_ak74u_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4silenced_fire_npc\fireSoundPlayer\weap_m4silenced_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_ak74_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_ak74_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_ak74_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_ak74u\killIcon\hud_icon_ak74u\dpadIcon\\ammoCounterIcon\hud_icon_ak74u\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\12\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_ak47_lift_plr weap_ak47_lift_plr +weap_ak47_clipout_plr weap_ak47_clipout_plr +weap_ak47_clipin_plr weap_ak47_clipin_plr +weap_ak47_chamber_plr weap_ak47_chamber_plr \ No newline at end of file diff --git a/weapons/mp/beretta_mp b/weapons/mp/beretta_mp new file mode 100644 index 0000000..d93efc8 --- /dev/null +++ b/weapons/mp/beretta_mp @@ -0,0 +1,4 @@ +WEAPONFILE\displayName\WEAPON_BERETTA\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\9 × 19 mm\maxAmmo\90\startAmmo\45\clipName\beretta_mp\clipSize\15\shotCount\1\dropAmmoMin\1\dropAmmoMax\15\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\20\meleeDamage\135\maxDamageRange\250\minDamageRange\500\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.63\reloadEmptyTime\1.917\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.5\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.1\adsTransOutTime\0.1\adsTransBlendTime\0.1\adsReloadTransTime\0.15\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\6\hipSpreadDuckedMax\5\hipSpreadProneMax\4\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\100\hipGunKickPitchMin\-30\hipGunKickPitchMax\-35\hipGunKickYawMin\-2\hipGunKickYawMax\18\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\15\hipViewKickPitchMax\35\hipViewKickYawMin\25\hipViewKickYawMax\-25\hipViewKickCenterSpeed\750\adsViewKickPitchMin\15\adsViewKickPitchMax\35\adsViewKickYawMin\25\adsViewKickYawMax\-25\adsViewKickCenterSpeed\750\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.25\adsSwayVertScale\0.25\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_beretta_mp\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_beretta\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_beretta_idle\emptyIdleAnim\viewmodel_beretta_idle\fireAnim\viewmodel_beretta_fire\lastShotAnim\viewmodel_beretta_lastfire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_beretta_reload\reloadEmptyAnim\viewmodel_beretta_reload_empty2\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_beretta_pullout\dropAnim\viewmodel_beretta_putaway\firstRaiseAnim\viewmodel_beretta_pullout\altRaiseAnim\viewmodel_beretta_pullout\altDropAnim\viewmodel_beretta_putaway\quickRaiseAnim\viewmodel_beretta_pullout\quickDropAnim\viewmodel_beretta_putaway\emptyRaiseAnim\viewmodel_beretta_pullout_empty\emptyDropAnim\viewmodel_beretta_putaway_empty\sprintInAnim\viewmodel_beretta_sprint_in\sprintLoopAnim\viewmodel_beretta_sprint_loop\sprintOutAnim\viewmodel_beretta_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_beretta_fire_ads\adsLastShotAnim\viewmodel_beretta_lastfire\adsRechamberAnim\\adsUpAnim\viewmodel_beretta_ADS_up\adsDownAnim\viewmodel_beretta_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m9_fire_npc\fireSoundPlayer\weap_m9_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_m9_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m9_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m9_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m9beretta\killIcon\hud_icon_m9beretta\dpadIcon\\ammoCounterIcon\hud_icon_m9beretta\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\pistol_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\8\adsDofEnd\12\hideTags\\notetrackSoundMap\weap_m9_clipout_plr weap_m9_clipout_plr +weap_m9_clipin_plr weap_m9_clipin_plr +weap_m9_chamber_plr weap_m9_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/beretta_silencer_mp b/weapons/mp/beretta_silencer_mp new file mode 100644 index 0000000..4b0fab5 --- /dev/null +++ b/weapons/mp/beretta_silencer_mp @@ -0,0 +1,4 @@ +WEAPONFILE\displayName\WEAPON_BERETTA\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\9 × 19 mm \maxAmmo\90\startAmmo\45\clipName\beretta_silencer_mp\clipSize\15\shotCount\1\dropAmmoMin\1\dropAmmoMax\15\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\20\meleeDamage\135\maxDamageRange\150\minDamageRange\350\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.63\reloadEmptyTime\1.917\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.5\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.1\adsTransOutTime\0.1\adsTransBlendTime\0.1\adsReloadTransTime\0.15\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\6\hipSpreadDuckedMax\5\hipSpreadProneMax\4\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\100\hipGunKickPitchMin\-30\hipGunKickPitchMax\-35\hipGunKickYawMin\-2\hipGunKickYawMax\18\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\15\hipViewKickPitchMax\35\hipViewKickYawMin\25\hipViewKickYawMax\-25\hipViewKickCenterSpeed\750\adsViewKickPitchMin\15\adsViewKickPitchMax\35\adsViewKickYawMin\25\adsViewKickYawMax\-25\adsViewKickCenterSpeed\750\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.25\adsSwayVertScale\0.25\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_beretta_and_silencer_mp\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_beretta_silencer\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_beretta_idle\emptyIdleAnim\viewmodel_beretta_idle\fireAnim\viewmodel_beretta_fire\lastShotAnim\viewmodel_beretta_lastfire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_beretta_reload\reloadEmptyAnim\viewmodel_beretta_reload_empty2\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_beretta_pullout\dropAnim\viewmodel_beretta_putaway\firstRaiseAnim\viewmodel_beretta_pullout\altRaiseAnim\viewmodel_beretta_pullout\altDropAnim\viewmodel_beretta_putaway\quickRaiseAnim\viewmodel_beretta_pullout\quickDropAnim\viewmodel_beretta_putaway\emptyRaiseAnim\viewmodel_beretta_pullout_empty\emptyDropAnim\viewmodel_beretta_putaway_empty\sprintInAnim\viewmodel_beretta_sprint_in\sprintLoopAnim\viewmodel_beretta_sprint_loop\sprintOutAnim\viewmodel_beretta_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_beretta_fire_ads\adsLastShotAnim\viewmodel_beretta_lastfire\adsRechamberAnim\\adsUpAnim\viewmodel_beretta_ADS_up\adsDownAnim\viewmodel_beretta_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_usp45sd_fire_npc\fireSoundPlayer\weap_usp45sd_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_m9_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m9_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m9_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m9beretta\killIcon\hud_icon_m9beretta\dpadIcon\\ammoCounterIcon\hud_icon_m9beretta\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\8\adsDofEnd\12\hideTags\\notetrackSoundMap\weap_m9_clipout_plr weap_m9_clipout_plr +weap_m9_clipin_plr weap_m9_clipin_plr +weap_m9_chamber_plr weap_m9_chamber_plr +melee_knife_stab melee_knife_stab diff --git a/weapons/mp/colt45_mp b/weapons/mp/colt45_mp new file mode 100644 index 0000000..362e176 --- /dev/null +++ b/weapons/mp/colt45_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_COLT45\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\.45 ACP\maxAmmo\64\startAmmo\32\clipName\colt45_mp\clipSize\8\shotCount\1\dropAmmoMin\1\dropAmmoMax\8\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\20\meleeDamage\135\maxDamageRange\350\minDamageRange\900\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.63\reloadEmptyTime\1.917\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.6\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.15\adsTransOutTime\0.15\adsTransBlendTime\0.1\adsReloadTransTime\0.15\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\6\hipSpreadDuckedMax\5\hipSpreadProneMax\4\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\0\hipGunKickPitchMax\0\hipGunKickYawMin\0\hipGunKickYawMax\0\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\25\hipViewKickPitchMax\45\hipViewKickYawMin\35\hipViewKickYawMax\-35\hipViewKickCenterSpeed\1100\adsViewKickPitchMin\25\adsViewKickPitchMax\45\adsViewKickYawMin\35\adsViewKickYawMax\-35\adsViewKickCenterSpeed\1100\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.12\adsSwayVertScale\0.2\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_colt45_mp\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_colt1911_black\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_colt45_idle\emptyIdleAnim\viewmodel_colt45_idle\fireAnim\viewmodel_colt45_fire\lastShotAnim\viewmodel_colt45_lastfire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_colt45_reload\reloadEmptyAnim\viewmodel_colt45_reload_empty2\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_colt45_pullout2\dropAnim\viewmodel_colt45_putaway\firstRaiseAnim\viewmodel_colt45_pullout2\altRaiseAnim\viewmodel_colt45_pullout2\altDropAnim\viewmodel_colt45_putaway\quickRaiseAnim\viewmodel_colt45_pullout2\quickDropAnim\viewmodel_colt45_putaway\emptyRaiseAnim\viewmodel_colt45_pullout2\emptyDropAnim\viewmodel_colt45_putaway\sprintInAnim\viewmodel_colt45_sprint_in\sprintLoopAnim\viewmodel_colt45_sprint_loop\sprintOutAnim\viewmodel_colt45_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_colt45_fire_ads\adsLastShotAnim\viewmodel_colt45_lastfire\adsRechamberAnim\\adsUpAnim\viewmodel_colt45_ADS_up\adsDownAnim\viewmodel_colt45_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m1911colt45_fire_npc\fireSoundPlayer\weap_m1911colt45_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_m1911colt45_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m1911colt_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m1911colt_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_colt_45\killIcon\hud_icon_colt_45\dpadIcon\\ammoCounterIcon\hud_icon_colt_45\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\1:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\pistol_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\8\adsDofEnd\12\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_m1911colt_clift_plr weap_m1911colt_clift_plr +weap_m1911colt_clipout_plr weap_m1911colt_clipout_plr +weap_m1911colt_clipin_plr weap_m1911colt_clipin_plr +weap_m1911colt_chamber_plr weap_m1911colt_chamber_plr \ No newline at end of file diff --git a/weapons/mp/colt45_silencer_mp b/weapons/mp/colt45_silencer_mp new file mode 100644 index 0000000..17f6438 --- /dev/null +++ b/weapons/mp/colt45_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_COLT45\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\.45 ACP\maxAmmo\64\startAmmo\32\clipName\colt45_silencer_mp\clipSize\8\shotCount\1\dropAmmoMin\1\dropAmmoMax\8\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\20\meleeDamage\135\maxDamageRange\250\minDamageRange\500\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.63\reloadEmptyTime\1.917\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.6\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.15\adsTransOutTime\0.15\adsTransBlendTime\0.1\adsReloadTransTime\0.15\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\6\hipSpreadDuckedMax\5\hipSpreadProneMax\4\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\0\hipGunKickPitchMax\0\hipGunKickYawMin\0\hipGunKickYawMax\0\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\25\hipViewKickPitchMax\45\hipViewKickYawMin\35\hipViewKickYawMax\-35\hipViewKickCenterSpeed\1100\adsViewKickPitchMin\25\adsViewKickPitchMax\45\adsViewKickYawMin\35\adsViewKickYawMax\-35\adsViewKickCenterSpeed\1100\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.12\adsSwayVertScale\0.2\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_colt45_and_silencer_mp\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_colt1911_silencer\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_colt45_idle\emptyIdleAnim\viewmodel_colt45_idle\fireAnim\viewmodel_colt45_fire\lastShotAnim\viewmodel_colt45_lastfire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_colt45_reload\reloadEmptyAnim\viewmodel_colt45_reload_empty2\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_colt45_pullout2\dropAnim\viewmodel_colt45_putaway\firstRaiseAnim\viewmodel_colt45_pullout2\altRaiseAnim\viewmodel_colt45_pullout2\altDropAnim\viewmodel_colt45_putaway\quickRaiseAnim\viewmodel_colt45_pullout2\quickDropAnim\viewmodel_colt45_putaway\emptyRaiseAnim\viewmodel_colt45_pullout2\emptyDropAnim\viewmodel_colt45_putaway\sprintInAnim\viewmodel_colt45_sprint_in\sprintLoopAnim\viewmodel_colt45_sprint_loop\sprintOutAnim\viewmodel_colt45_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_colt45_fire_ads\adsLastShotAnim\viewmodel_colt45_lastfire\adsRechamberAnim\\adsUpAnim\viewmodel_colt45_ADS_up\adsDownAnim\viewmodel_colt45_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_usp45sd_fire_npc\fireSoundPlayer\weap_usp45sd_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_m1911colt45_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m1911colt_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m1911colt_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_colt_45\killIcon\hud_icon_colt_45\dpadIcon\\ammoCounterIcon\hud_icon_pistol\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\0\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_m1911colt_clift_plr weap_m1911colt_clift_plr +weap_m1911colt_clipout_plr weap_m1911colt_clipout_plr +weap_m1911colt_clipin_plr weap_m1911colt_clipin_plr +weap_m1911colt_chamber_plr weap_m1911colt_chamber_plr \ No newline at end of file diff --git a/weapons/mp/deserteagle_mp b/weapons/mp/deserteagle_mp new file mode 100644 index 0000000..d946e8e --- /dev/null +++ b/weapons/mp/deserteagle_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_DESERTEAGLE\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\.357 Magnum\maxAmmo\42\startAmmo\21\clipName\deserteagle_mp\clipSize\7\shotCount\1\dropAmmoMin\1\dropAmmoMax\7\reloadAmmoAdd\0\reloadStartAdd\0\damage\50\minDamage\30\meleeDamage\135\maxDamageRange\350\minDamageRange\1200\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.96\reloadEmptyTime\2.1\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.43\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.15\adsTransOutTime\0.15\adsTransBlendTime\0.1\adsReloadTransTime\0.6\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\2\hipSpreadDuckedMin\1.5\hipSpreadProneMin\1\hipSpreadMax\4\hipSpreadDuckedMax\3\hipSpreadProneMax\2\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\100\hipGunKickPitchMin\-30\hipGunKickPitchMax\-35\hipGunKickYawMin\-2\hipGunKickYawMax\18\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\60\hipViewKickPitchMax\80\hipViewKickYawMin\-40\hipViewKickYawMax\-50\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\60\adsViewKickPitchMax\80\adsViewKickYawMin\-40\adsViewKickYawMax\-50\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.16\adsSwayVertScale\0.25\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_desert_eagle\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_desert_eagle_silver\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_desert_eagle_idle\emptyIdleAnim\viewmodel_desert_eagle_idle\fireAnim\viewmodel_desert_eagle_fire\lastShotAnim\viewmodel_desert_eagle_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_desert_eagle_reload\reloadEmptyAnim\viewmodel_desert_eagle_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_desert_eagle_pullout\dropAnim\viewmodel_desert_eagle_putaway\firstRaiseAnim\viewmodel_desert_eagle_pullout\altRaiseAnim\viewmodel_desert_eagle_pullout\altDropAnim\viewmodel_desert_eagle_putaway\quickRaiseAnim\viewmodel_desert_eagle_pullout\quickDropAnim\viewmodel_desert_eagle_putaway\emptyRaiseAnim\viewmodel_desert_eagle_pullout\emptyDropAnim\viewmodel_desert_eagle_putaway\sprintInAnim\viewmodel_desert_eagle_sprint_in\sprintLoopAnim\viewmodel_desert_eagle_sprint_loop\sprintOutAnim\viewmodel_desert_eagle_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_desert_eagle_ADS_fire\adsLastShotAnim\viewmodel_desert_eagle_ADS_fire\adsRechamberAnim\\adsUpAnim\viewmodel_desert_eagle_ADS_up\adsDownAnim\viewmodel_desert_eagle_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_deserteagle_fire_npc\fireSoundPlayer\weap_deserteagle_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_deserteagle_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_de50_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_de50_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_desert_eagle\killIcon\hud_icon_desert_eagle\dpadIcon\\ammoCounterIcon\hud_icon_desert_eagle\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\pistol_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\8\adsDofEnd\12\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_de50_clift_plr weap_de50_clift_plr +weap_de50_clipout_plr weap_de50_clipout_plr +weap_de50_clipin_plr weap_de50_clipin_plr +weap_de50_chamber_plr weap_de50_chamber_plr \ No newline at end of file diff --git a/weapons/mp/deserteaglegold_mp b/weapons/mp/deserteaglegold_mp new file mode 100644 index 0000000..a29803a --- /dev/null +++ b/weapons/mp/deserteaglegold_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_DESERTEAGLEGOLD\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\.357 Magnum\maxAmmo\42\startAmmo\21\clipName\deserteaglegold_mp\clipSize\7\shotCount\1\dropAmmoMin\1\dropAmmoMax\7\reloadAmmoAdd\0\reloadStartAdd\0\damage\50\minDamage\30\meleeDamage\135\maxDamageRange\350\minDamageRange\1200\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.96\reloadEmptyTime\2.1\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.43\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.15\adsTransOutTime\0.15\adsTransBlendTime\0.1\adsReloadTransTime\0.6\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\2\hipSpreadDuckedMin\1.5\hipSpreadProneMin\1\hipSpreadMax\4\hipSpreadDuckedMax\3\hipSpreadProneMax\2\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\100\hipGunKickPitchMin\-30\hipGunKickPitchMax\-35\hipGunKickYawMin\-2\hipGunKickYawMax\18\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\60\hipViewKickPitchMax\80\hipViewKickYawMin\-40\hipViewKickYawMax\-50\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\60\adsViewKickPitchMax\80\adsViewKickYawMin\-40\adsViewKickYawMax\-50\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.16\adsSwayVertScale\0.25\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_desert_eagle_gold_mp\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_desert_eagle_gold\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_desert_eagle_idle\emptyIdleAnim\viewmodel_desert_eagle_idle\fireAnim\viewmodel_desert_eagle_fire\lastShotAnim\viewmodel_desert_eagle_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_desert_eagle_reload\reloadEmptyAnim\viewmodel_desert_eagle_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_desert_eagle_pullout\dropAnim\viewmodel_desert_eagle_putaway\firstRaiseAnim\viewmodel_desert_eagle_pullout\altRaiseAnim\viewmodel_desert_eagle_pullout\altDropAnim\viewmodel_desert_eagle_putaway\quickRaiseAnim\viewmodel_desert_eagle_pullout\quickDropAnim\viewmodel_desert_eagle_putaway\emptyRaiseAnim\viewmodel_desert_eagle_pullout\emptyDropAnim\viewmodel_desert_eagle_putaway\sprintInAnim\viewmodel_desert_eagle_sprint_in\sprintLoopAnim\viewmodel_desert_eagle_sprint_loop\sprintOutAnim\viewmodel_desert_eagle_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_desert_eagle_ADS_fire\adsLastShotAnim\viewmodel_desert_eagle_ADS_fire\adsRechamberAnim\\adsUpAnim\viewmodel_desert_eagle_ADS_up\adsDownAnim\viewmodel_desert_eagle_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_deserteagle_fire_npc\fireSoundPlayer\weap_deserteagle_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_deserteagle_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_de50_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_de50_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_desert_eagle\killIcon\hud_icon_desert_eagle\dpadIcon\\ammoCounterIcon\hud_icon_desert_eagle\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\pistol_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\0\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_de50_clift_plr weap_de50_clift_plr +weap_de50_clipout_plr weap_de50_clipout_plr +weap_de50_clipin_plr weap_de50_clipin_plr +weap_de50_chamber_plr weap_de50_chamber_plr \ No newline at end of file diff --git a/weapons/mp/flash_grenade_mp b/weapons/mp/flash_grenade_mp new file mode 100644 index 0000000..388a53b --- /dev/null +++ b/weapons/mp/flash_grenade_mp @@ -0,0 +1 @@ +WEAPONFILE\weaponType\grenade\weaponClass\grenade\offhandClass\Flash Grenade\impactType\none\inventoryType\offhand\displayName\WEAPON_FLASH_GRENADE\modeName\\playerAnimType\grenade\AIOverlayDescription\\gunModel\viewmodel_m84\handModel\viewmodel_base_viewhands\isHandModelOverridable\1\idleAnim\viewmodel_m84_idle\emptyIdleAnim\viewmodel_m84_idle\fireAnim\viewmodel_m84_throw\holdFireAnim\viewmodel_m84_pullpin\lastShotAnim\viewmodel_m84_throw\detonateAnim\\meleeAnim\viewmodel_m84_idle\meleeChargeAnim\\raiseAnim\viewmodel_m84_idle\dropAnim\viewmodel_m84_idle\firstRaiseAnim\\altRaiseAnim\viewmodel_m84_idle\altDropAnim\viewmodel_m84_idle\quickRaiseAnim\\quickDropAnim\\emptyRaiseAnim\\emptyDropAnim\\sprintInAnim\\sprintLoopAnim\\sprintOutAnim\\nightVisionWearAnim\\nightVisionRemoveAnim\\autoAimRange\0\aimAssistRange\0\aimAssistRangeAds\0\moveSpeedScale\1.2\sprintDurationScale\1\lowAmmoWarningThreshold\0.33\damage\15\meleeDamage\135\fireDelay\0.15\meleeDelay\0.1\meleeChargeDelay\0\fireTime\0.7\holdFireTime\0.6\detonateTime\0.1\detonateDelay\0.1\meleeTime\0.66\meleeChargeTime\0\reloadTime\2\dropTime\0\raiseTime\0\altDropTime\0\altRaiseTime\0\quickDropTime\0.5\quickRaiseTime\0.5\firstRaiseTime\0.5\emptyDropTime\0.5\emptyRaiseTime\0.5\sprintInTime\0.5\sprintLoopTime\0.5\sprintOutTime\0.5\nightVisionWearTime\0.5\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\fuseTime\1.5\aiFuseTime\2\stickiness\Don't stick\hasDetonator\0\timedDetonation\1\rotate\1\holdButtonToThrow\0\freezeMovementWhenFiring\0\clipOnly\1\hipIdleAmount\80\hipIdleSpeed\0\idleCrouchFactor\0.5\idleProneFactor\0.15\parallelDefaultBounce\0.5\parallelBarkBounce\0.6\parallelBrickBounce\0.6\parallelCarpetBounce\0.6\parallelClothBounce\0.2\parallelConcreteBounce\0.6\parallelDirtBounce\0.45\parallelFleshBounce\0.2\parallelFoliageBounce\0.05\parallelGlassBounce\0.4\parallelGrassBounce\0.35\parallelGravelBounce\0.5\parallelIceBounce\0.6\parallelMetalBounce\0.6\parallelMudBounce\0.2\parallelPaperBounce\0.2\parallelPlasterBounce\0.5\parallelRockBounce\0.6\parallelSandBounce\0.3\parallelSnowBounce\0.2\parallelWaterBounce\0.2\parallelWoodBounce\0.6\parallelAsphaltBounce\0.6\parallelCeramicBounce\0.5\parallelPlasticBounce\0.5\parallelRubberBounce\0.5\parallelCushionBounce\0.5\parallelFruitBounce\0.5\parallelPaintedMetalBounce\0.5\perpendicularDefaultBounce\0.25\perpendicularBarkBounce\0.25\perpendicularBrickBounce\0.25\perpendicularCarpetBounce\0.25\perpendicularClothBounce\0.2\perpendicularConcreteBounce\0.25\perpendicularDirtBounce\0.225\perpendicularFleshBounce\0.2\perpendicularFoliageBounce\0.05\perpendicularGlassBounce\0.2\perpendicularGrassBounce\0.15\perpendicularGravelBounce\0.25\perpendicularIceBounce\0.3\perpendicularMetalBounce\0.25\perpendicularMudBounce\0.1\perpendicularPaperBounce\0.2\perpendicularPlasterBounce\0.25\perpendicularRockBounce\0.25\perpendicularSandBounce\0.1\perpendicularSnowBounce\0.1\perpendicularWaterBounce\0.2\perpendicularWoodBounce\0.25\perpendicularAsphaltBounce\0.25\perpendicularCeramicBounce\0.5\perpendicularPlasticBounce\0.5\perpendicularRubberBounce\0.5\perpendicularCushionBounce\0.5\perpendicularFruitBounce\0.5\perpendicularPaintedMetalBounce\0.5\swayMaxAngle\30\swayLerpSpeed\6\swayPitchScale\0.1\swayYawScale\0.1\swayHorizScale\0.1\swayVertScale\0.1\swayShellShockScale\5\worldModel\weapon_m84_flashbang_grenade\knifeModel\\worldKnifeModel\\ammoName\flashgrenade\maxAmmo\4\startAmmo\1\clipName\flashgrenade\clipSize\4\sharedAmmoCapName\WEAPON_FLASHGRENADE\sharedAmmoCap\4\dropAmmoMin\1\dropAmmoMax\1\pickupSound\grenade_pickup\pickupSoundPlayer\grenade_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\pullbackSound\weap_fraggrenade_pin\pullbackSoundPlayer\weap_fraggrenade_pin\fireSound\weap_fraggrenade_fire\fireSoundPlayer\weap_fraggrenade_fire\lastShotSound\\lastShotSoundPlayer\\meleeSwipeSound\\meleeSwipeSoundPlayer\\reloadSound\\reloadSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\detonateSound\\detonateSoundPlayer\\raiseSound\\raiseSoundPlayer\\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\bounceSound\grenade_bounce\reticleCenter\reticle_center_cross\reticleSide\\reticleCenterSize\32\reticleSideSize\16\reticleMinOfs\4\altWeapon\\blocksProne\0\cookOffHold\0\hudIcon\hud_us_flashgrenade\killIcon\\dpadIcon\\ammoCounterIcon\\hudIconRatio\1:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\None\flipKillIcon\1\standMoveF\0\standMoveR\1\standMoveU\-1.5\standRotP\0\standRotY\0\standRotR\0\duckedOfsF\-2\duckedOfsR\2\duckedOfsU\-0.2\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\proneOfsF\-6\proneOfsR\3.5\proneOfsU\0.8\proneMoveF\0\proneMoveR\1\proneMoveU\-1.5\proneRotP\0\proneRotY\0\proneRotR\0\posMoveRate\4\posProneMoveRate\10\standMoveMinSpeed\110\duckedMoveMinSpeed\60\proneMoveMinSpeed\0\posRotRate\5\posProneRotRate\10\standRotMinSpeed\110\duckedRotMinSpeed\60\proneRotMinSpeed\0\explosionRadius\800\explosionRadiusMin\200\explosionInnerDamage\0\explosionOuterDamage\0\damageConeAngle\180\projectileSpeed\940\projectileSpeedUp\120\projectileSpeedForward\0\projectileModel\projectile_m84_flashbang_grenade\projExplosionType\flashbang\projExplosionEffect\explosions/flashbang\projExplosionEffectForceNormalUp\0\projExplosionSound\flashbang_explode_default\projectileTrail\none\projectileTrailTime\1\projectileTrailRadius\32\projImpactExplode\0\adsDofStart\0\adsDofEnd\0\notetrackSoundMap\ \ No newline at end of file diff --git a/weapons/mp/frag_grenade_mp b/weapons/mp/frag_grenade_mp new file mode 100644 index 0000000..dc182ea --- /dev/null +++ b/weapons/mp/frag_grenade_mp @@ -0,0 +1 @@ +WEAPONFILE\weaponType\grenade\weaponClass\grenade\offhandClass\Frag Grenade\impactType\grenade_explode\inventoryType\offhand\displayName\WEAPON_M2FRAGGRENADE\modeName\\playerAnimType\grenade\AIOverlayDescription\\gunModel\viewmodel_m67\handModel\viewmodel_base_viewhands\isHandModelOverridable\1\idleAnim\viewmodel_m67_idle\emptyIdleAnim\viewmodel_m67_idle\fireAnim\viewmodel_m67_throw\holdFireAnim\viewmodel_m67_pullpin\lastShotAnim\viewmodel_m67_throw\detonateAnim\\meleeAnim\viewmodel_m67_idle\meleeChargeAnim\\raiseAnim\viewmodel_m67_idle\dropAnim\viewmodel_m67_idle\firstRaiseAnim\\altRaiseAnim\viewmodel_m67_pickup_livenade\altDropAnim\viewmodel_m67_idle\quickRaiseAnim\\quickDropAnim\\emptyRaiseAnim\\emptyDropAnim\\sprintInAnim\\sprintLoopAnim\\sprintOutAnim\\nightVisionWearAnim\\nightVisionRemoveAnim\\autoAimRange\0\aimAssistRange\0\aimAssistRangeAds\0\moveSpeedScale\1\sprintDurationScale\1\lowAmmoWarningThreshold\0.33\damage\15\meleeDamage\135\fireDelay\0.13\meleeDelay\0.1\meleeChargeDelay\0\fireTime\0.36\holdFireTime\0.6\detonateTime\0.1\detonateDelay\0.1\meleeTime\0.66\meleeChargeTime\0\reloadTime\2\dropTime\0\raiseTime\0\altDropTime\0\altRaiseTime\0.6\quickDropTime\0.5\quickRaiseTime\0.5\firstRaiseTime\0.5\emptyDropTime\0.5\emptyRaiseTime\0.5\sprintInTime\0.5\sprintLoopTime\0.5\sprintOutTime\0.5\nightVisionWearTime\0.5\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\fuseTime\3.5\aiFuseTime\5\stickiness\Don't stick\hasDetonator\0\timedDetonation\1\rotate\1\holdButtonToThrow\0\freezeMovementWhenFiring\0\clipOnly\1\hipIdleAmount\80\hipIdleSpeed\0\idleCrouchFactor\0.5\idleProneFactor\0.15\parallelDefaultBounce\0.5\parallelBarkBounce\0.6\parallelBrickBounce\0.6\parallelCarpetBounce\0.6\parallelClothBounce\0.2\parallelConcreteBounce\0.6\parallelDirtBounce\0.45\parallelFleshBounce\0.2\parallelFoliageBounce\0.05\parallelGlassBounce\0.4\parallelGrassBounce\0.35\parallelGravelBounce\0.5\parallelIceBounce\0.6\parallelMetalBounce\0.6\parallelMudBounce\0.2\parallelPaperBounce\0.2\parallelPlasterBounce\0.5\parallelRockBounce\0.6\parallelSandBounce\0.3\parallelSnowBounce\0.2\parallelWaterBounce\0.2\parallelWoodBounce\0.6\parallelAsphaltBounce\0.6\parallelCeramicBounce\0.5\parallelPlasticBounce\0.5\parallelRubberBounce\0.5\parallelCushionBounce\0.5\parallelFruitBounce\0.5\parallelPaintedMetalBounce\0.5\perpendicularDefaultBounce\0.25\perpendicularBarkBounce\0.25\perpendicularBrickBounce\0.25\perpendicularCarpetBounce\0.25\perpendicularClothBounce\0.2\perpendicularConcreteBounce\0.25\perpendicularDirtBounce\0.225\perpendicularFleshBounce\0.2\perpendicularFoliageBounce\0.05\perpendicularGlassBounce\0.2\perpendicularGrassBounce\0.15\perpendicularGravelBounce\0.25\perpendicularIceBounce\0.3\perpendicularMetalBounce\0.25\perpendicularMudBounce\0.1\perpendicularPaperBounce\0.2\perpendicularPlasterBounce\0.25\perpendicularRockBounce\0.25\perpendicularSandBounce\0.1\perpendicularSnowBounce\0.1\perpendicularWaterBounce\0.2\perpendicularWoodBounce\0.25\perpendicularAsphaltBounce\0.25\perpendicularCeramicBounce\0.5\perpendicularPlasticBounce\0.5\perpendicularRubberBounce\0.5\perpendicularCushionBounce\0.5\perpendicularFruitBounce\0.5\perpendicularPaintedMetalBounce\0.5\swayMaxAngle\30\swayLerpSpeed\6\swayPitchScale\0.1\swayYawScale\0.1\swayHorizScale\0.1\swayVertScale\0.1\swayShellShockScale\5\worldModel\weapon_m67_grenade\knifeModel\\worldKnifeModel\\ammoName\usgrenade\maxAmmo\4\startAmmo\1\clipName\usgrenade\clipSize\4\sharedAmmoCapName\WEAPON_FRAGGRENADE\sharedAmmoCap\4\dropAmmoMin\1\dropAmmoMax\1\pickupSound\grenade_pickup\pickupSoundPlayer\grenade_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\pullbackSound\weap_fraggrenade_pin\pullbackSoundPlayer\weap_fraggrenade_pin\fireSound\weap_fraggrenade_fire\fireSoundPlayer\weap_fraggrenade_fire\lastShotSound\\lastShotSoundPlayer\\meleeSwipeSound\\meleeSwipeSoundPlayer\\reloadSound\\reloadSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\detonateSound\\detonateSoundPlayer\\raiseSound\\raiseSoundPlayer\\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\bounceSound\grenade_bounce\reticleCenter\reticle_center_cross\reticleSide\\reticleCenterSize\32\reticleSideSize\16\reticleMinOfs\4\altWeapon\\blocksProne\0\cookOffHold\0\hudIcon\hud_us_grenade\killIcon\hud_us_grenade\dpadIcon\\ammoCounterIcon\\hudIconRatio\1:1\killIconRatio\1:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\None\flipKillIcon\1\standMoveF\0\standMoveR\1\standMoveU\-1.5\standRotP\0\standRotY\0\standRotR\0\duckedOfsF\-2\duckedOfsR\2\duckedOfsU\-0.2\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\proneOfsF\-6\proneOfsR\3.5\proneOfsU\0.8\proneMoveF\0\proneMoveR\1\proneMoveU\-1.5\proneRotP\0\proneRotY\0\proneRotR\0\posMoveRate\4\posProneMoveRate\10\standMoveMinSpeed\110\duckedMoveMinSpeed\60\proneMoveMinSpeed\0\posRotRate\5\posProneRotRate\10\standRotMinSpeed\110\duckedRotMinSpeed\60\proneRotMinSpeed\0\explosionRadius\256\explosionRadiusMin\0\explosionInnerDamage\270\explosionOuterDamage\67.5\damageConeAngle\180\projectileSpeed\940\projectileSpeedUp\120\projectileSpeedForward\0\projectileModel\projectile_m67fraggrenade\projExplosionType\grenade\projExplosionEffect\\projExplosionEffectForceNormalUp\0\projExplosionSound\\projectileTrail\grenade\projectileTrailTime\1\projectileTrailRadius\32\projImpactExplode\0\adsDofStart\0\adsDofEnd\0\notetrackSoundMap\ \ No newline at end of file diff --git a/weapons/mp/frag_grenade_short_mp b/weapons/mp/frag_grenade_short_mp new file mode 100644 index 0000000..3ca512c --- /dev/null +++ b/weapons/mp/frag_grenade_short_mp @@ -0,0 +1 @@ +WEAPONFILE\weaponType\grenade\weaponClass\grenade\offhandClass\Frag Grenade\impactType\grenade_explode\inventoryType\offhand\displayName\WEAPON_M2FRAGGRENADE\modeName\\playerAnimType\grenade\AIOverlayDescription\\gunModel\viewmodel_m67\handModel\viewmodel_base_viewhands\isHandModelOverridable\1\idleAnim\viewmodel_m67_idle\emptyIdleAnim\viewmodel_m67_idle\fireAnim\viewmodel_m67_throw\holdFireAnim\viewmodel_m67_pullpin\lastShotAnim\viewmodel_m67_throw\detonateAnim\\meleeAnim\viewmodel_m67_idle\meleeChargeAnim\\raiseAnim\viewmodel_m67_idle\dropAnim\viewmodel_m67_idle\firstRaiseAnim\\altRaiseAnim\viewmodel_m67_pickup_livenade\altDropAnim\viewmodel_m67_idle\quickRaiseAnim\\quickDropAnim\\emptyRaiseAnim\\emptyDropAnim\\sprintInAnim\\sprintLoopAnim\\sprintOutAnim\\nightVisionWearAnim\\nightVisionRemoveAnim\\autoAimRange\0\aimAssistRange\0\aimAssistRangeAds\0\moveSpeedScale\1\sprintDurationScale\1\lowAmmoWarningThreshold\0.33\damage\15\meleeDamage\135\fireDelay\0.13\meleeDelay\0.1\meleeChargeDelay\0\fireTime\0.36\holdFireTime\0.6\detonateTime\0.1\detonateDelay\0.1\meleeTime\0.66\meleeChargeTime\0\reloadTime\2\dropTime\0\raiseTime\0\altDropTime\0\altRaiseTime\0.6\quickDropTime\0.5\quickRaiseTime\0.5\firstRaiseTime\0.5\emptyDropTime\0.5\emptyRaiseTime\0.5\sprintInTime\0.5\sprintLoopTime\0.5\sprintOutTime\0.5\nightVisionWearTime\0.5\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\fuseTime\3.5\aiFuseTime\5\stickiness\Don't stick\hasDetonator\0\timedDetonation\1\rotate\1\holdButtonToThrow\0\freezeMovementWhenFiring\0\clipOnly\1\hipIdleAmount\80\hipIdleSpeed\0\idleCrouchFactor\0.5\idleProneFactor\0.15\parallelDefaultBounce\0.5\parallelBarkBounce\0.6\parallelBrickBounce\0.6\parallelCarpetBounce\0.6\parallelClothBounce\0.2\parallelConcreteBounce\0.6\parallelDirtBounce\0.45\parallelFleshBounce\0.2\parallelFoliageBounce\0.05\parallelGlassBounce\0.4\parallelGrassBounce\0.35\parallelGravelBounce\0.5\parallelIceBounce\0.6\parallelMetalBounce\0.6\parallelMudBounce\0.2\parallelPaperBounce\0.2\parallelPlasterBounce\0.5\parallelRockBounce\0.6\parallelSandBounce\0.3\parallelSnowBounce\0.2\parallelWaterBounce\0.2\parallelWoodBounce\0.6\parallelAsphaltBounce\0.6\parallelCeramicBounce\0.5\parallelPlasticBounce\0.5\parallelRubberBounce\0.5\parallelCushionBounce\0.5\parallelFruitBounce\0.5\parallelPaintedMetalBounce\0.5\perpendicularDefaultBounce\0.25\perpendicularBarkBounce\0.25\perpendicularBrickBounce\0.25\perpendicularCarpetBounce\0.25\perpendicularClothBounce\0.2\perpendicularConcreteBounce\0.25\perpendicularDirtBounce\0.225\perpendicularFleshBounce\0.2\perpendicularFoliageBounce\0.05\perpendicularGlassBounce\0.2\perpendicularGrassBounce\0.15\perpendicularGravelBounce\0.25\perpendicularIceBounce\0.3\perpendicularMetalBounce\0.25\perpendicularMudBounce\0.1\perpendicularPaperBounce\0.2\perpendicularPlasterBounce\0.25\perpendicularRockBounce\0.25\perpendicularSandBounce\0.1\perpendicularSnowBounce\0.1\perpendicularWaterBounce\0.2\perpendicularWoodBounce\0.25\perpendicularAsphaltBounce\0.25\perpendicularCeramicBounce\0.5\perpendicularPlasticBounce\0.5\perpendicularRubberBounce\0.5\perpendicularCushionBounce\0.5\perpendicularFruitBounce\0.5\perpendicularPaintedMetalBounce\0.5\swayMaxAngle\30\swayLerpSpeed\6\swayPitchScale\0.1\swayYawScale\0.1\swayHorizScale\0.1\swayVertScale\0.1\swayShellShockScale\5\worldModel\weapon_m67_grenade\knifeModel\\worldKnifeModel\\ammoName\usgrenade\maxAmmo\4\startAmmo\1\clipName\usgrenade\clipSize\4\sharedAmmoCapName\WEAPON_FRAGGRENADE\sharedAmmoCap\4\dropAmmoMin\1\dropAmmoMax\1\pickupSound\grenade_pickup\pickupSoundPlayer\grenade_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\pullbackSound\weap_fraggrenade_pin\pullbackSoundPlayer\weap_fraggrenade_pin\fireSound\weap_fraggrenade_fire\fireSoundPlayer\weap_fraggrenade_fire\lastShotSound\\lastShotSoundPlayer\\meleeSwipeSound\\meleeSwipeSoundPlayer\\reloadSound\\reloadSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\detonateSound\\detonateSoundPlayer\\raiseSound\\raiseSoundPlayer\\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\bounceSound\grenade_bounce\reticleCenter\reticle_center_cross\reticleSide\\reticleCenterSize\32\reticleSideSize\16\reticleMinOfs\4\altWeapon\\blocksProne\0\cookOffHold\1\hudIcon\hud_us_grenade\killIcon\hud_us_grenade\dpadIcon\\ammoCounterIcon\\hudIconRatio\1:1\killIconRatio\1:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\None\flipKillIcon\1\standMoveF\0\standMoveR\1\standMoveU\-1.5\standRotP\0\standRotY\0\standRotR\0\duckedOfsF\-2\duckedOfsR\2\duckedOfsU\-0.2\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\proneOfsF\-6\proneOfsR\3.5\proneOfsU\0.8\proneMoveF\0\proneMoveR\1\proneMoveU\-1.5\proneRotP\0\proneRotY\0\proneRotR\0\posMoveRate\4\posProneMoveRate\10\standMoveMinSpeed\110\duckedMoveMinSpeed\60\proneMoveMinSpeed\0\posRotRate\5\posProneRotRate\10\standRotMinSpeed\110\duckedRotMinSpeed\60\proneRotMinSpeed\0\explosionRadius\256\explosionRadiusMin\0\explosionInnerDamage\270\explosionOuterDamage\67.5\damageConeAngle\180\projectileSpeed\940\projectileSpeedUp\120\projectileSpeedForward\0\projectileModel\projectile_m67fraggrenade\projExplosionType\grenade\projExplosionEffect\\projExplosionEffectForceNormalUp\0\projExplosionSound\\projectileTrail\grenade\projectileTrailTime\1\projectileTrailRadius\32\projImpactExplode\0\adsDofStart\0\adsDofEnd\0\notetrackSoundMap\ \ No newline at end of file diff --git a/weapons/mp/g36c_mp b/weapons/mp/g36c_mp new file mode 100644 index 0000000..5ceaaf3 --- /dev/null +++ b/weapons/mp/g36c_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_G36C\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.56 × 45 mm NATO\maxAmmo\180\startAmmo\90\clipName\g36c_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\30\minDamage\20\meleeDamage\135\maxDamageRange\1500\minDamageRange\2000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.08\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.1\reloadEmptyTime\2.967\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.25\raiseTime\0.4\altDropTime\0\altRaiseTime\0.66\quickDropTime\0.25\quickRaiseTime\0.76\firstRaiseTime\0.5\emptyDropTime\0.25\emptyRaiseTime\0.4\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\50\hipViewKickYawMax\-50\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\50\adsViewKickYawMax\-50\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0\swayVertScale\0.15\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.05\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_g36c_mp\gunModel2\viewmodel_g36c_mp_brock\gunModel3\viewmodel_g36c_mp_bshdwl\gunModel4\viewmodel_g36c_mp_bwmrpt\gunModel5\viewmodel_g36c_mp_cmdtgr\gunModel6\viewmodel_g36c_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_g36_mp\worldModel2\weapon_g36_mp_brock\worldModel3\weapon_g36_mp_bshdwl\worldModel4\weapon_g36_mp_bwmrpt\worldModel5\weapon_g36_mp_cmdtgr\worldModel6\weapon_g36_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_g36_idle\emptyIdleAnim\\fireAnim\viewmodel_g36_fire\lastShotAnim\viewmodel_g36_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_g36_reload\reloadEmptyAnim\viewmodel_g36_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_g36_pullout\dropAnim\viewmodel_g36_putaway_fast\firstRaiseAnim\viewmodel_g36_pullout\altRaiseAnim\viewmodel_g36_pullout\altDropAnim\viewmodel_g36_putaway_fast\quickRaiseAnim\viewmodel_g36_pullout_fast\quickDropAnim\viewmodel_g36_putaway_fast\emptyRaiseAnim\viewmodel_g36_pullout\emptyDropAnim\viewmodel_g36_putaway_fast\sprintInAnim\viewmodel_g36_sprint_in\sprintLoopAnim\viewmodel_g36_sprint_loop\sprintOutAnim\viewmodel_g36_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_g36_fire_ads\adsLastShotAnim\viewmodel_g36_idle\adsRechamberAnim\\adsUpAnim\viewmodel_g36_ironsites_ADS_up\adsDownAnim\viewmodel_g36_ironsites_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_g36c_fire_npc\fireSoundPlayer\weap_g36c_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_g36c_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_g36_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_g36_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_g36c_mp\killIcon\hud_icon_g36c_mp\dpadIcon\\ammoCounterIcon\hud_icon_g36c_mp\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\assault_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\3\adsDofEnd\12\hideTags\tag_acog +tag_g36_scope +tag_reflex_sight\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_g36_lift_plr weap_g36_lift_plr +weap_g36_clipout_plr weap_g36_clipout_plr +weap_g36_clipin_plr weap_g36_clipin_plr +weap_g36_chamber_plr weap_g36_chamber_plr \ No newline at end of file diff --git a/weapons/mp/g36c_silencer_mp b/weapons/mp/g36c_silencer_mp new file mode 100644 index 0000000..196fe5d --- /dev/null +++ b/weapons/mp/g36c_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_G36C\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.56 × 45 mm NATO\maxAmmo\180\startAmmo\90\clipName\g36c_silencer_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\30\minDamage\20\meleeDamage\135\maxDamageRange\500\minDamageRange\1000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.08\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.1\reloadEmptyTime\2.967\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.25\raiseTime\0.4\altDropTime\0\altRaiseTime\0.66\quickDropTime\0.25\quickRaiseTime\0.76\firstRaiseTime\0.5\emptyDropTime\0.25\emptyRaiseTime\0.4\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\70\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\50\hipViewKickYawMax\-50\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\50\adsViewKickYawMax\-50\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.2\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_g36c_silencer\gunModel2\viewmodel_g36csd_mp_brock\gunModel3\viewmodel_g36csd_mp_bshdwl\gunModel4\viewmodel_g36csd_mp_bwmrpt\gunModel5\viewmodel_g36csd_mp_cmdtgr\gunModel6\viewmodel_g36csd_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_g36csd_mp\worldModel2\weapon_g36csd_mp_brock\worldModel3\weapon_g36csd_mp_bshdwl\worldModel4\weapon_g36csd_mp_bwmrpt\worldModel5\weapon_g36csd_mp_cmdtgr\worldModel6\weapon_g36csd_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_g36_idle\emptyIdleAnim\\fireAnim\viewmodel_g36_fire\lastShotAnim\viewmodel_g36_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_g36_reload\reloadEmptyAnim\viewmodel_g36_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_g36_pullout\dropAnim\viewmodel_g36_putaway_fast\firstRaiseAnim\viewmodel_g36_pullout\altRaiseAnim\viewmodel_g36_pullout\altDropAnim\viewmodel_g36_putaway_fast\quickRaiseAnim\viewmodel_g36_pullout_fast\quickDropAnim\viewmodel_g36_putaway_fast\emptyRaiseAnim\viewmodel_g36_pullout\emptyDropAnim\viewmodel_g36_putaway_fast\sprintInAnim\viewmodel_g36_sprint_in\sprintLoopAnim\viewmodel_g36_sprint_loop\sprintOutAnim\viewmodel_g36_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_g36_fire_ads\adsLastShotAnim\viewmodel_g36_idle\adsRechamberAnim\\adsUpAnim\viewmodel_g36_ironsites_ADS_up\adsDownAnim\viewmodel_g36_ironsites_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4silenced_fire_npc\fireSoundPlayer\weap_m4silenced_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_g36c_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_g36_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_g36_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_g36c_mp\killIcon\hud_icon_g36c_mp\dpadIcon\\ammoCounterIcon\hud_icon_g36c_mp\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\3\adsDofEnd\12\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_g36_lift_plr weap_g36_lift_plr +weap_g36_clipout_plr weap_g36_clipout_plr +weap_g36_clipin_plr weap_g36_clipin_plr +weap_g36_chamber_plr weap_g36_chamber_plr \ No newline at end of file diff --git a/weapons/mp/g3_mp b/weapons/mp/g3_mp new file mode 100644 index 0000000..27c8016 --- /dev/null +++ b/weapons/mp/g3_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_G3\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\1\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 51 mm NATO\maxAmmo\120\startAmmo\60\clipName\g3_mp\clipSize\20\shotCount\1\dropAmmoMin\1\dropAmmoMax\20\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\30\meleeDamage\135\maxDamageRange\1500\minDamageRange\2000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.75\reloadEmptyTime\3.75\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.6\raiseTime\0.85\altDropTime\0.55\altRaiseTime\0.85\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\1.1\emptyDropTime\0.6\emptyRaiseTime\0.85\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\0\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\50\hipViewKickYawMax\-50\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\50\adsViewKickYawMax\-50\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.12\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_G3_mp\gunModel2\viewmodel_G3_mp_brock\gunModel3\viewmodel_G3_mp_bshdwl\gunModel4\viewmodel_G3_mp_bwmrpt\gunModel5\viewmodel_G3_mp_cmdtgr\gunModel6\viewmodel_G3_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_g3\worldModel2\weapon_G3_mp_brock\worldModel3\weapon_G3_mp_bshdwl\worldModel4\weapon_G3_mp_bwmrpt\worldModel5\weapon_G3_mp_cmdtgr\worldModel6\weapon_G3_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_G3_idle\emptyIdleAnim\viewmodel_G3_idle\fireAnim\viewmodel_G3_fire\lastShotAnim\viewmodel_G3_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_G3_reload\reloadEmptyAnim\viewmodel_G3_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_G3_pullout\dropAnim\viewmodel_G3_putaway\firstRaiseAnim\viewmodel_G3_first_time_pullout\altRaiseAnim\viewmodel_G3_pullout\altDropAnim\viewmodel_G3_putaway\quickRaiseAnim\viewmodel_G3_quick_pullout\quickDropAnim\viewmodel_G3_quick_putaway\emptyRaiseAnim\viewmodel_G3_pullout\emptyDropAnim\viewmodel_G3_putaway\sprintInAnim\viewmodel_G3_sprint_in\sprintLoopAnim\viewmodel_G3_sprint_loop\sprintOutAnim\viewmodel_G3_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_G3_ADS_fire\adsLastShotAnim\viewmodel_G3_ADS_fire\adsRechamberAnim\\adsUpAnim\viewmodel_G3_ADS_up\adsDownAnim\viewmodel_G3_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_g3_fire_npc\fireSoundPlayer\weap_g3_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_g3_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_g3_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_g3_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_g3\killIcon\hud_icon_g3\dpadIcon\\ammoCounterIcon\hud_icon_g3\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\assault_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\10\hideTags\tag_acog +tag_ak47_mount +tag_reflex_sight\notetrackSoundMap\weap_g3_lift_plr weap_g3_lift_plr +weap_g3_clipout_plr weap_g3_clipout_plr +weap_g3_clipin_plr weap_g3_clipin_plr +weap_g3_chamber_plr weap_g3_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/g3_silencer_mp b/weapons/mp/g3_silencer_mp new file mode 100644 index 0000000..f912fa6 --- /dev/null +++ b/weapons/mp/g3_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_G3\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\1\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 51 mm NATO\maxAmmo\120\startAmmo\60\clipName\g3_silencer_mp\clipSize\20\shotCount\1\dropAmmoMin\1\dropAmmoMax\20\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\30\meleeDamage\135\maxDamageRange\500\minDamageRange\1000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.75\reloadEmptyTime\3.75\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.6\raiseTime\0.85\altDropTime\0.55\altRaiseTime\0.85\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\1.1\emptyDropTime\0.6\emptyRaiseTime\0.85\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\0\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\50\hipViewKickYawMax\-50\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\50\adsViewKickYawMax\-50\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.12\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_G3_silencer\gunModel2\viewmodel_g3_and_silencer_mp_brock\gunModel3\viewmodel_g3_and_silencer_mp_bshdwl\gunModel4\viewmodel_g3_and_sliencer_mp_bwmrpt\gunModel5\viewmodel_g3_and_silencer_mp_cmdtgr\gunModel6\viewmodel_g3_and_silencer_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_g3_silencer\worldModel2\weapon_g3SD_mp_brock\worldModel3\weapon_g3SD_mp_bshdwl\worldModel4\weapon_g3SD_mp_bwmrpt\worldModel5\weapon_g3SD_mp_cmdtgr\worldModel6\weapon_g3SD_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_G3_idle\emptyIdleAnim\viewmodel_G3_idle\fireAnim\viewmodel_G3_fire\lastShotAnim\viewmodel_G3_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_G3_reload\reloadEmptyAnim\viewmodel_G3_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_G3_pullout\dropAnim\viewmodel_G3_putaway\firstRaiseAnim\viewmodel_G3_first_time_pullout\altRaiseAnim\viewmodel_G3_pullout\altDropAnim\viewmodel_G3_putaway\quickRaiseAnim\viewmodel_G3_quick_pullout\quickDropAnim\viewmodel_G3_quick_putaway\emptyRaiseAnim\viewmodel_G3_pullout\emptyDropAnim\viewmodel_G3_putaway\sprintInAnim\viewmodel_G3_sprint_in\sprintLoopAnim\viewmodel_G3_sprint_loop\sprintOutAnim\viewmodel_G3_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_G3_ADS_fire\adsLastShotAnim\viewmodel_G3_ADS_fire\adsRechamberAnim\\adsUpAnim\viewmodel_G3_ADS_up\adsDownAnim\viewmodel_G3_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4silenced_fire_npc\fireSoundPlayer\weap_m4silenced_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_g3_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_g3_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_g3_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_g3\killIcon\hud_icon_g3\dpadIcon\\ammoCounterIcon\hud_icon_g3\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0.2\adsDofEnd\9.9\hideTags\\notetrackSoundMap\weap_g3_lift_plr weap_g3_lift_plr +weap_g3_clipout_plr weap_g3_clipout_plr +weap_g3_clipin_plr weap_g3_clipin_plr +weap_g3_chamber_plr weap_g3_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/m1014_mp b/weapons/mp/m1014_mp new file mode 100644 index 0000000..9d4f7b3 --- /dev/null +++ b/weapons/mp/m1014_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_BENELLI\modeName\\playerAnimType\other\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\spread\penetrateType\small\impactType\shotgun\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\0\noPartialReload\0\segmentedReload\1\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\1000\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\80\gunMaxYaw\15\lowAmmoWarningThreshold\0.33\ammoName\12 gauge\maxAmmo\40\startAmmo\20\clipName\m1014_mp\clipSize\4\shotCount\8\dropAmmoMin\1\dropAmmoMax\4\reloadAmmoAdd\1\reloadStartAdd\1\damage\30\minDamage\10\meleeDamage\135\maxDamageRange\300\minDamageRange\600\playerDamage\30\locNone\1\locHelmet\1\locHead\1\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.2\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\0.567\reloadEmptyTime\0.567\reloadStartTime\1\reloadEndTime\0.36\reloadAddTime\0.25\reloadStartAddTime\0.6\rechamberTime\0\rechamberBoltTime\0.55\dropTime\0.43\raiseTime\0.75\altDropTime\0\altRaiseTime\0.6\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.6\emptyDropTime\0.43\emptyRaiseTime\0.75\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.7\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.1\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-100\proneMoveR\3\proneMoveU\-105\proneRotP\0\proneRotY\220\proneRotR\-300\proneOfsF\-0.5\proneOfsR\2\proneOfsU\0.8\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.8\idleProneFactor\0.4\adsSpread\5.5\adsAimPitch\-0.1\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.5\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\5\hipSpreadDuckedMin\5\hipSpreadProneMin\5\hipSpreadMax\5\hipSpreadDuckedMax\5\hipSpreadProneMax\5\hipSpreadFireAdd\0\hipSpreadTurnAdd\0\hipSpreadMoveAdd\0.1\hipSpreadDecayRate\5\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\50\hipGunKickPitchMax\60\hipGunKickYawMin\-30\hipGunKickYawMax\30\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\35\adsGunKickPitchMax\45\adsGunKickYawMin\-25\adsGunKickYawMax\25\adsGunKickAccel\260\adsGunKickSpeedMax\600\adsGunKickSpeedDecay\50\adsGunKickStaticDecay\10\hipViewKickPitchMin\85\hipViewKickPitchMax\95\hipViewKickYawMin\-45\hipViewKickYawMax\45\hipViewKickCenterSpeed\1000\adsViewKickPitchMin\85\adsViewKickPitchMax\95\adsViewKickYawMin\-45\adsViewKickYawMax\45\adsViewKickCenterSpeed\1000\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\8\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.12\adsSwayVertScale\0.2\fightDist\720\maxDist\680\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\3\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_benelli_m4_mp\gunModel2\viewmodel_benelli_m4_mp_brock\gunModel3\viewmodel_benelli_m4_mp_bshdwl\gunModel4\viewmodel_benelli_m4_mp_bwmrpt\gunModel5\viewmodel_benelli_m4_mp_cmdtgr\gunModel6\viewmodel_benelli_m4_mp_stagger\gunModel7\viewmodel_benelli_m4_gold_mp\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_benelli_super_90\worldModel2\weapon_benelli_super_90_mp_brock\worldModel3\weapon_benelli_super_90_mp_bshdwl\worldModel4\weapon_benelli_super_90_mp_bwmrpt\worldModel5\weapon_benelli_super_90_mp_cmdtgr\worldModel6\weapon_benelli_super_90_mp_stagger\worldModel7\weapon_benelli_super_90_gold\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_benelliM4_idle\emptyIdleAnim\viewmodel_benelliM4_idle\fireAnim\viewmodel_benelliM4_fire\lastShotAnim\viewmodel_benelliM4_fire_last\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_benelliM4_reload_loop\reloadEmptyAnim\\reloadStartAnim\viewmodel_benelliM4_reload_intro\reloadEndAnim\viewmodel_benelliM4_reload_out\raiseAnim\viewmodel_benelliM4_pullout\dropAnim\viewmodel_benelliM4_putaway\firstRaiseAnim\viewmodel_benelliM4_pullout\altRaiseAnim\viewmodel_benelliM4_pullout\altDropAnim\viewmodel_benelliM4_putaway\quickRaiseAnim\viewmodel_benelliM4_pullout_quick\quickDropAnim\viewmodel_benelliM4_putaway_quick\emptyRaiseAnim\viewmodel_benelliM4_pullout\emptyDropAnim\viewmodel_benelliM4_putaway\sprintInAnim\viewmodel_benelliM4_sprint_in\sprintLoopAnim\viewmodel_benelliM4_sprint_loop\sprintOutAnim\viewmodel_benelliM4_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_benelliM4_fire_ads\adsLastShotAnim\viewmodel_benelliM4_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_benelliM4_ADS_up\adsDownAnim\viewmodel_benelliM4_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/shotgun_view\worldShellEjectEffect\shellejects/shotgun\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m1014_fire_npc\fireSoundPlayer\weap_m1014_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_rifle_npc\emptyFireSoundPlayer\weap_dryfire_rifle_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m1014_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m4benelli_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m4benelli_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_benelli_m4\killIcon\hud_icon_benelli_m4\dpadIcon\\ammoCounterIcon\hud_icon_benelli_m4\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Shotgun\flipKillIcon\1\fireRumble\shotgun_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\0\hideTags\tag_foregrip +tag_reflex_sight\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_m4benelli_start_plr weap_m4benelli_start_plr +weap_m4benelli_loop_plr weap_m4benelli_loop_plr +weap_m4benelli_end_plr weap_m4benelli_end_plr \ No newline at end of file diff --git a/weapons/mp/m14_mp b/weapons/mp/m14_mp new file mode 100644 index 0000000..ce62034 --- /dev/null +++ b/weapons/mp/m14_mp @@ -0,0 +1,8 @@ +WEAPONFILE\displayName\WEAPON_M14\modeName\\playerAnimType\sniper\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\large\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\30\gunMaxYaw\15\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 51 mm NATO\maxAmmo\120\startAmmo\60\clipName\m14_mp\clipSize\20\shotCount\1\dropAmmoMin\1\dropAmmoMax\20\reloadAmmoAdd\0\reloadStartAdd\1\damage\50\minDamage\40\meleeDamage\135\maxDamageRange\1500\minDamageRange\2000\playerDamage\30\locNone\1\locHelmet\1.5\locHead\1.5\locNeck\1.5\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.5\reloadEmptyTime\3.06\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\1\rechamberBoltTime\0\dropTime\0.7\raiseTime\0.8\altDropTime\0.75\altRaiseTime\0.1\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.8\emptyDropTime\0.7\emptyRaiseTime\0.8\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-2.2\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.7\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.5\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-55\proneMoveR\3\proneMoveU\-145\proneRotP\0\proneRotY\220\proneRotR\-200\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0.8\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1.5\idleCrouchFactor\1\idleProneFactor\1\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.6\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\5\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\80\hipGunKickPitchMax\85\hipGunKickYawMin\-35\hipGunKickYawMax\35\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\600\adsGunKickSpeedMax\600\adsGunKickSpeedDecay\100\adsGunKickStaticDecay\100\hipViewKickPitchMin\40\hipViewKickPitchMax\80\hipViewKickYawMin\40\hipViewKickYawMax\-40\hipViewKickCenterSpeed\1200\adsViewKickPitchMin\40\adsViewKickPitchMax\80\adsViewKickYawMin\40\adsViewKickYawMax\-40\adsViewKickCenterSpeed\1200\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.12\adsSwayVertScale\0.25\fightDist\720\maxDist\730\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\3\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_m14_mp\gunModel2\viewmodel_m14_mp_brock\gunModel3\viewmodel_m14_mp_bshdwl\gunModel4\viewmodel_m14_mp_bwmrpt\gunModel5\viewmodel_m14_mp_cmdtgr\gunModel6\viewmodel_m14_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_m14_scout_mp\worldModel2\weapon_m14_scout_mp_brock\worldModel3\weapon_m14_scout_mp_bshdwl\worldModel4\weapon_m14_scout_mp_bwmrpt\worldModel5\weapon_m14_scout_mp_cmdtgr\worldModel6\weapon_m14_scout_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_M14_idle\emptyIdleAnim\viewmodel_M14_idle\fireAnim\viewmodel_M14_fire\lastShotAnim\viewmodel_M14_last_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_M14_reload\reloadEmptyAnim\viewmodel_M14_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_M14_pullout\dropAnim\viewmodel_M14_putaway\firstRaiseAnim\viewmodel_M14_pullout\altRaiseAnim\viewmodel_M14_pullout\altDropAnim\viewmodel_M14_putaway\quickRaiseAnim\viewmodel_M14_pullout_quick\quickDropAnim\viewmodel_M14_putaway_quick\emptyRaiseAnim\viewmodel_M14_pullout\emptyDropAnim\viewmodel_M14_putaway\sprintInAnim\viewmodel_M14_sprint_in\sprintLoopAnim\viewmodel_M14_sprint_loop\sprintOutAnim\viewmodel_M14_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_M14_fire_ads\adsLastShotAnim\viewmodel_M14_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_M14_ironsites_ADS_up\adsDownAnim\viewmodel_M14_ironsites_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m14sniper_fire_npc\fireSoundPlayer\weap_m14sniper_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_rifle_npc\emptyFireSoundPlayer\weap_dryfire_rifle_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m14sniper_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m14sniper_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m14sniper_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m14\killIcon\hud_icon_m14\dpadIcon\\ammoCounterIcon\hud_icon_m14\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\assault_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\3\adsDofEnd\12\hideTags\TAG_ACOG +TAG_REFLEX_SIGHT +\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_m14sniper_lift_plr weap_m14sniper_lift_plr +weap_m14sniper_clipout_plr weap_m14sniper_clipout_plr +weap_m14sniper_clipin_plr weap_m14sniper_clipin_plr +weap_m14sniper_chamber_close_plr weap_m14sniper_chamber_close_plr +weap_m14sniper_clipin_tac_plr weap_m14sniper_clipin_tac_plr \ No newline at end of file diff --git a/weapons/mp/m14_silencer_mp b/weapons/mp/m14_silencer_mp new file mode 100644 index 0000000..247b94c --- /dev/null +++ b/weapons/mp/m14_silencer_mp @@ -0,0 +1,6 @@ +WEAPONFILE\displayName\WEAPON_M14\modeName\\playerAnimType\sniper\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\large\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\2500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\30\gunMaxYaw\15\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 51 mm NATO\maxAmmo\120\startAmmo\60\clipName\m14_silencer_mp\clipSize\20\shotCount\1\dropAmmoMin\1\dropAmmoMax\20\reloadAmmoAdd\0\reloadStartAdd\1\damage\50\minDamage\40\meleeDamage\135\maxDamageRange\500\minDamageRange\1000\playerDamage\30\locNone\1\locHelmet\1.5\locHead\1.5\locNeck\1.5\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.5\reloadEmptyTime\3.06\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\1\rechamberBoltTime\0\dropTime\0.7\raiseTime\0.8\altDropTime\0.75\altRaiseTime\0.1\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.8\emptyDropTime\0.7\emptyRaiseTime\0.8\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-2.2\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.7\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.5\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-55\proneMoveR\3\proneMoveU\-145\proneRotP\0\proneRotY\220\proneRotR\-200\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0.8\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1.5\idleCrouchFactor\1\idleProneFactor\1\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.6\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\4\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\5\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\80\hipGunKickPitchMax\85\hipGunKickYawMin\-35\hipGunKickYawMax\35\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\600\adsGunKickSpeedMax\600\adsGunKickSpeedDecay\100\adsGunKickStaticDecay\100\hipViewKickPitchMin\40\hipViewKickPitchMax\80\hipViewKickYawMin\40\hipViewKickYawMax\-40\hipViewKickCenterSpeed\1200\adsViewKickPitchMin\40\adsViewKickPitchMax\80\adsViewKickYawMin\40\adsViewKickYawMax\-40\adsViewKickCenterSpeed\1200\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.12\adsSwayVertScale\0.25\fightDist\720\maxDist\730\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\3\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_m14SD_mp\gunModel2\viewmodel_m14SD_mp_brock\gunModel3\viewmodel_m14SD_mp_bshdwl\gunModel4\viewmodel_m14SD_mp_bwmrpt\gunModel5\viewmodel_m14SD_mp_cmdtgr\gunModel6\viewmodel_m14SD_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_m14SD_scout\worldModel2\weapon_m14SD_scout_brock\worldModel3\weapon_m14SD_scout_bshdwl\worldModel4\weapon_m14SD_scout_bwmrpt\worldModel5\weapon_m14SD_scout_cmdtgr\worldModel6\weapon_m14SD_scout_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_M14_idle\emptyIdleAnim\viewmodel_M14_idle\fireAnim\viewmodel_M14_fire\lastShotAnim\viewmodel_M14_last_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_M14_reload\reloadEmptyAnim\viewmodel_M14_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_M14_pullout\dropAnim\viewmodel_M14_putaway\firstRaiseAnim\viewmodel_M14_pullout\altRaiseAnim\viewmodel_M14_pullout\altDropAnim\viewmodel_M14_putaway\quickRaiseAnim\viewmodel_M14_pullout_quick\quickDropAnim\viewmodel_M14_putaway_quick\emptyRaiseAnim\viewmodel_M14_pullout\emptyDropAnim\viewmodel_M14_putaway\sprintInAnim\viewmodel_M14_sprint_in\sprintLoopAnim\viewmodel_M14_sprint_loop\sprintOutAnim\viewmodel_M14_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_M14_fire_ads\adsLastShotAnim\viewmodel_M14_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_M14_ironsites_ADS_up\adsDownAnim\viewmodel_M14_ironsites_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4silenced_fire_npc\fireSoundPlayer\weap_m4silenced_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_rifle_npc\emptyFireSoundPlayer\weap_dryfire_rifle_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m14sniper_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m14sniper_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m14sniper_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m14\killIcon\hud_icon_m14\dpadIcon\\ammoCounterIcon\hud_icon_m14\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\3\adsDofEnd\12\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_m14sniper_lift_plr weap_m14sniper_lift_plr +weap_m14sniper_clipout_plr weap_m14sniper_clipout_plr +weap_m14sniper_clipin_plr weap_m14sniper_clipin_plr +weap_m14sniper_chamber_close_plr weap_m14sniper_chamber_close_plr +weap_m14sniper_clipin_tac_plr weap_m14sniper_clipin_tac_plr \ No newline at end of file diff --git a/weapons/mp/m16_mp b/weapons/mp/m16_mp new file mode 100644 index 0000000..21f7bab --- /dev/null +++ b/weapons/mp/m16_mp @@ -0,0 +1,6 @@ +WEAPONFILE\displayName\WEAPON_M16\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\3-Round Burst\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.56 × 45 mm NATO\maxAmmo\180\startAmmo\90\clipName\m16_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\30\meleeDamage\135\maxDamageRange\1500\minDamageRange\2000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.065\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2\reloadEmptyTime\2.365\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.5\raiseTime\0.35\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.3\quickRaiseTime\0.75\firstRaiseTime\0.5\emptyDropTime\0.5\emptyRaiseTime\0.35\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\70\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\45\hipViewKickYawMax\-45\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\45\adsViewKickYawMax\-45\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.14\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_m16_mp\gunModel2\viewmodel_m16_mp_brock\gunModel3\viewmodel_m16_mp_bshdwl\gunModel4\viewmodel_m16_mp_bwmrpt\gunModel5\viewmodel_m16_mp_cmdtgr\gunModel6\viewmodel_m16_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_m16_mp\worldModel2\weapon_m16_mp_brock\worldModel3\weapon_m16_mp_bshdwl\worldModel4\weapon_m16_mp_bwmrpt\worldModel5\weapon_m16_mp_cmdtgr\worldModel6\weapon_m16_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_m16_idle\emptyIdleAnim\\fireAnim\viewmodel_m16_fire\lastShotAnim\viewmodel_m16_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_m16_reload\reloadEmptyAnim\viewmodel_m16_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_m16_pullout\dropAnim\viewmodel_m16_putaway\firstRaiseAnim\viewmodel_m16_pullout\altRaiseAnim\viewmodel_m16_pullout\altDropAnim\viewmodel_m16_putaway\quickRaiseAnim\viewmodel_m16_pullout_quick\quickDropAnim\viewmodel_m16_putaway\emptyRaiseAnim\viewmodel_m16_pullout\emptyDropAnim\viewmodel_m16_putaway\sprintInAnim\viewmodel_m16_sprint_in\sprintLoopAnim\viewmodel_m16_sprint_loop\sprintOutAnim\viewmodel_m16_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_m16_fire_ads\adsLastShotAnim\viewmodel_m16_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_m16_ADS_up\adsDownAnim\viewmodel_m16_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m16_fire_npc\fireSoundPlayer\weap_m16_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m16_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m16_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m16_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m16a4_grenade\killIcon\hud_icon_m16a4_grenade\dpadIcon\\ammoCounterIcon\hud_icon_m16a4\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\assault_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\2\adsDofEnd\8\hideTags\tag_acog +tag_reflex_sight\notetrackSoundMap\weap_m16_lift_plr weap_m16_lift_plr +weap_m16_clipout_plr weap_m16_clipout_plr +weap_m16_clipin_plr weap_m16_clipin_plr +weap_m16_chamber_close_plr weap_m16_chamber_close_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/m16_silencer_mp b/weapons/mp/m16_silencer_mp new file mode 100644 index 0000000..39d9820 --- /dev/null +++ b/weapons/mp/m16_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_M16\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\3-Round Burst\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.56 × 45 mm NATO\maxAmmo\180\startAmmo\90\clipName\m16_silencer_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\30\meleeDamage\135\maxDamageRange\500\minDamageRange\1000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.065\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2\reloadEmptyTime\2.365\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.5\raiseTime\0.35\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.3\quickRaiseTime\0.75\firstRaiseTime\0.5\emptyDropTime\0.5\emptyRaiseTime\0.35\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\70\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\60\hipViewKickYawMin\45\hipViewKickYawMax\-45\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\60\adsViewKickYawMin\45\adsViewKickYawMax\-45\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.14\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_m16_and_silencer_mp\gunModel2\viewmodel_m16_and_silencer_mp_brock\gunModel3\viewmodel_m16_and_silencer_mp_bshdwl\gunModel4\viewmodel_m16_and_silencer_mp_bwmrpt\gunModel5\viewmodel_m16_and_silencer_mp_cmdtgr\gunModel6\viewmodel_m16_and_silencer_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_m16_silencer_mp\worldModel2\weapon_m16sd_mp_brock\worldModel3\weapon_m16sd_mp_bshdwl\worldModel4\weapon_m16sd_mp_bwmrpt\worldModel5\weapon_m16sd_mp_cmdtgr\worldModel6\weapon_m16sd_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_m16_idle\emptyIdleAnim\\fireAnim\viewmodel_m16_fire\lastShotAnim\viewmodel_m16_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_m16_reload\reloadEmptyAnim\viewmodel_m16_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_m16_pullout\dropAnim\viewmodel_m16_putaway\firstRaiseAnim\viewmodel_m16_pullout\altRaiseAnim\viewmodel_m16_pullout\altDropAnim\viewmodel_m16_putaway\quickRaiseAnim\viewmodel_m16_pullout_quick\quickDropAnim\viewmodel_m16_putaway\emptyRaiseAnim\viewmodel_m16_pullout\emptyDropAnim\viewmodel_m16_putaway\sprintInAnim\viewmodel_m16_sprint_in\sprintLoopAnim\viewmodel_m16_sprint_loop\sprintOutAnim\viewmodel_m16_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_m16_fire_ads\adsLastShotAnim\viewmodel_m16_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_m16_ADS_up\adsDownAnim\viewmodel_m16_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4silenced_fire_npc\fireSoundPlayer\weap_m4silenced_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m16_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m16_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m16_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m16a4_grenade\killIcon\hud_icon_m16a4_grenade\dpadIcon\\ammoCounterIcon\hud_icon_m16a4\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\2\adsDofEnd\8\hideTags\\notetrackSoundMap\weap_m16_lift_plr weap_m16_lift_plr +weap_m16_clipout_plr weap_m16_clipout_plr +weap_m16_clipin_plr weap_m16_clipin_plr +weap_m16_chamber_close_plr weap_m16_chamber_close_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/m40a3_mp b/weapons/mp/m40a3_mp new file mode 100644 index 0000000..ff1c52f --- /dev/null +++ b/weapons/mp/m40a3_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_M40A3\modeName\\playerAnimType\sniper\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\large\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\1\aimDownSight\1\rechamberWhileAds\0\noPartialReload\0\segmentedReload\1\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\2500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\30\gunMaxYaw\15\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 51 mm NATO\maxAmmo\40\startAmmo\20\clipName\m40a3_mp\clipSize\5\shotCount\1\dropAmmoMin\1\dropAmmoMax\5\reloadAmmoAdd\1\reloadStartAdd\1\damage\70\minDamage\70\meleeDamage\135\maxDamageRange\4000\minDamageRange\5000\playerDamage\30\locNone\1\locHelmet\4.5\locHead\4.5\locNeck\4.5\locTorsoUpper\4.5\locTorsoLower\4.5\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.05\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\0.43333\reloadEmptyTime\0.15\reloadStartTime\1.13\reloadEndTime\0.76666\reloadAddTime\0.26\reloadStartAddTime\0.96\rechamberTime\1\rechamberBoltTime\0.65\dropTime\0.66\raiseTime\0.9\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.9\emptyDropTime\0.5\emptyRaiseTime\0.5\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-2.2\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.7\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.5\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-55\proneMoveR\3\proneMoveU\-145\proneRotP\0\proneRotY\220\proneRotR\-200\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0.8\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0\idleCrouchFactor\1\idleProneFactor\1\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.4\adsTransBlendTime\0.1\adsReloadTransTime\0.6\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\15\adsZoomInFrac\0.05\adsZoomOutFrac\0.05\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3.8\hipSpreadDuckedMin\3.4\hipSpreadProneMin\3\hipSpreadMax\8\hipSpreadDuckedMax\7\hipSpreadProneMax\6.5\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\5\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\80\hipGunKickPitchMax\85\hipGunKickYawMin\-35\hipGunKickYawMax\35\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\600\adsGunKickSpeedMax\600\adsGunKickSpeedDecay\100\adsGunKickStaticDecay\100\hipViewKickPitchMin\80\hipViewKickPitchMax\100\hipViewKickYawMin\50\hipViewKickYawMax\-55\hipViewKickCenterSpeed\500\adsViewKickPitchMin\10\adsViewKickPitchMax\65\adsViewKickYawMin\50\adsViewKickYawMax\-55\adsViewKickCenterSpeed\500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0\adsSwayYawScale\0\adsSwayHorizScale\0\adsSwayVertScale\0\fightDist\720\maxDist\730\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\3\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\scope_overlay_m40a3\adsOverlayShaderLowRes\scope_overlay_m40a3_low_res\adsOverlayReticle\crosshair\adsOverlayWidth\480\adsOverlayHeight\480\gunModel\viewmodel_m40a3_mp\gunModel2\viewmodel_m40a3_mp_brock\gunModel3\viewmodel_m40a3_mp_bshdwl\gunModel4\viewmodel_m40a3_mp_bwmrpt\gunModel5\viewmodel_m40a3_mp_cmdtgr\gunModel6\viewmodel_m40a3_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_m40a3\worldModel2\weapon_m40a3_mp_brock\worldModel3\weapon_m40a3_mp_bshdwl\worldModel4\weapon_m40a3_mp_bwmrpt\worldModel5\weapon_m40a3_mp_cmdtgr\worldModel6\weapon_m40a3_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_M40a3_idle\emptyIdleAnim\\fireAnim\viewmodel_M40a3_fire\lastShotAnim\viewmodel_M40a3_fire\rechamberAnim\viewmodel_M40a3_rechamber\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_M40a3_reload_loop\reloadEmptyAnim\viewmodel_M40a3_reload_loop\reloadStartAnim\viewmodel_M40a3_reload_intro\reloadEndAnim\viewmodel_M40a3_reload_out\raiseAnim\viewmodel_M40a3_pullout\dropAnim\viewmodel_M40a3_putaway\firstRaiseAnim\viewmodel_M40a3_pullout\altRaiseAnim\viewmodel_M40a3_pullout\altDropAnim\viewmodel_M40a3_putaway\quickRaiseAnim\viewmodel_M40a3_pullout_quick\quickDropAnim\viewmodel_M40a3_putaway_quick\emptyRaiseAnim\viewmodel_M40a3_pullout\emptyDropAnim\viewmodel_M40a3_putaway\sprintInAnim\viewmodel_M40a3_sprint_in\sprintLoopAnim\viewmodel_M40a3_sprint_loop\sprintOutAnim\viewmodel_M40a3_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_M40a3_fire\adsLastShotAnim\viewmodel_M40a3_fire\adsRechamberAnim\viewmodel_M40a3_rechamber\adsUpAnim\viewmodel_M40a3_ADS_up\adsDownAnim\viewmodel_M40a3_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m40a3sniper_fire_npc\fireSoundPlayer\weap_m40a3sniper_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_rifle_npc\emptyFireSoundPlayer\weap_dryfire_rifle_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m40a3sniper_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\weap_m40a3sniper_rechamber_npc\rechamberSoundPlayer\weap_m40a3sniper_rechamber_plr\reloadSound\weap_m40a3sniper_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m40a3sniper_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m40a3\killIcon\hud_icon_m40a3\dpadIcon\\ammoCounterIcon\hud_icon_m40a3\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\ShortMagazine\flipKillIcon\1\fireRumble\sniper_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\4\adsDofEnd\30\hideTags\tag_acog\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_m40a3sniper_start_plr weap_m40a3sniper_start_plr +weap_m40a3sniper_loop_plr weap_m40a3sniper_loop_plr +weap_m40a3sniper_end_plr weap_m40a3sniper_end_plr +weap_m40a3sniper_rechamber_plr weap_m40a3sniper_rechamber_plr \ No newline at end of file diff --git a/weapons/mp/m4_mp b/weapons/mp/m4_mp new file mode 100644 index 0000000..d395c93 --- /dev/null +++ b/weapons/mp/m4_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_M4_CARBINE\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.56 × 45 mm NATO\maxAmmo\180\startAmmo\90\clipName\m4_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\30\minDamage\20\meleeDamage\135\maxDamageRange\1500\minDamageRange\2000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.07\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.03\reloadEmptyTime\2.36\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.75\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.85\emptyDropTime\0.45\emptyRaiseTime\0.75\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1.5\idleCrouchFactor\1\idleProneFactor\1\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\50\hipViewKickYawMin\40\hipViewKickYawMax\-40\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\50\adsViewKickYawMin\40\adsViewKickYawMax\-40\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.14\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_M4_mp\gunModel2\viewmodel_M4_mp_brock\gunModel3\viewmodel_M4_mp_bshdwl\gunModel4\viewmodel_M4_mp_bwmrpt\gunModel5\viewmodel_M4_mp_cmdtgr\gunModel6\viewmodel_M4_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_m4_mp\worldModel2\weapon_m4_mp_brock\worldModel3\weapon_m4_mp_bshdwl\worldModel4\weapon_m4_mp_bwmrpt\worldModel5\weapon_m4_mp_cmdtgr\worldModel6\weapon_m4_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\weapon_m16_clip\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_M4_idle\emptyIdleAnim\viewmodel_M4_idle\fireAnim\viewmodel_M4_fire\lastShotAnim\viewmodel_M4_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_M4_reload\reloadEmptyAnim\viewmodel_M4_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_M4_pullout\dropAnim\viewmodel_M4_putaway\firstRaiseAnim\viewmodel_m4_first_time_pullout\altRaiseAnim\viewmodel_M4_idle\altDropAnim\viewmodel_M4_idle\quickRaiseAnim\viewmodel_M4silencer_quick_pullout\quickDropAnim\viewmodel_M4silencer_quick_putaway\emptyRaiseAnim\viewmodel_M4_pullout\emptyDropAnim\viewmodel_M4_putaway\sprintInAnim\viewmodel_M4_sprint_in\sprintLoopAnim\viewmodel_M4_sprint_loop\sprintOutAnim\viewmodel_M4_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_M4_fire_ads\adsLastShotAnim\viewmodel_M4_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_M4_iron_ADS_up\adsDownAnim\viewmodel_M4_iron_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4carbine_fire_npc\fireSoundPlayer\weap_m4carbine_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m4carbine_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m4carbine_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m4carbine_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m4carbine\killIcon\hud_icon_m4carbine\dpadIcon\\ammoCounterIcon\hud_icon_m4carbine\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\assault_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\2\adsDofEnd\8\hideTags\tag_acog +tag_g36_scope +tag_reflex_sight\notetrackSoundMap\weap_m4carbine_clipout_plr weap_m4carbine_clipout_plr +weap_m4carbine_clipin_plr weap_m4carbine_clipin_plr +weap_m4carbine_chamber_close_plr weap_m4carbine_chamber_close_plr +weap_ak47_chamber_plr weap_ak47_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/m4_silencer_mp b/weapons/mp/m4_silencer_mp new file mode 100644 index 0000000..de46a7a --- /dev/null +++ b/weapons/mp/m4_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_M4_CARBINE\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\5.56 × 45 mm NATO\maxAmmo\180\startAmmo\90\clipName\m4_silencer_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\30\minDamage\20\meleeDamage\135\maxDamageRange\500\minDamageRange\1000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.07\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.03\reloadEmptyTime\2.36\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.75\altDropTime\0\altRaiseTime\0.35\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.85\emptyDropTime\0.45\emptyRaiseTime\0.75\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1.5\idleCrouchFactor\1\idleProneFactor\1\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-30\hipViewKickPitchMax\50\hipViewKickYawMin\40\hipViewKickYawMax\-40\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-30\adsViewKickPitchMax\50\adsViewKickYawMin\40\adsViewKickYawMax\-40\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.14\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_m4_and_silencer_mp\gunModel2\viewmodel_m4_and_silencer_mp_brock\gunModel3\viewmodel_m4_and_silencer_mp_bshdwl\gunModel4\viewmodel_m4_and_silencer_mp_bwmrpt\gunModel5\viewmodel_m4_and_silencer_mp_cmdtgr\gunModel6\viewmodel_m4_and_silencer_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_m4_silencer_mp\worldModel2\weapon_m4sd_mp_brock\worldModel3\weapon_m4sd_mp_bshdwl\worldModel4\weapon_m4sd_mp_bwmrpt\worldModel5\weapon_m4sd_mp_cmdtgr\worldModel6\weapon_m4sd_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\weapon_m16_clip\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_M4_idle\emptyIdleAnim\viewmodel_M4_idle\fireAnim\viewmodel_M4_fire\lastShotAnim\viewmodel_M4_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_M4_reload\reloadEmptyAnim\viewmodel_M4_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_M4_pullout\dropAnim\viewmodel_M4_putaway\firstRaiseAnim\viewmodel_m4_first_time_pullout\altRaiseAnim\viewmodel_M4_idle\altDropAnim\viewmodel_M4_idle\quickRaiseAnim\viewmodel_M4silencer_quick_pullout\quickDropAnim\viewmodel_M4silencer_quick_putaway\emptyRaiseAnim\viewmodel_M4_pullout\emptyDropAnim\viewmodel_M4_putaway\sprintInAnim\viewmodel_M4_sprint_in\sprintLoopAnim\viewmodel_M4_sprint_loop\sprintOutAnim\viewmodel_M4_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_M4_fire_ads\adsLastShotAnim\viewmodel_M4_fire_ads\adsRechamberAnim\\adsUpAnim\viewmodel_M4_iron_ADS_up\adsDownAnim\viewmodel_M4_iron_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_m4silenced_fire_npc\fireSoundPlayer\weap_m4silenced_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_m4carbine_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_m4carbine_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_m4carbine_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_m4carbine\killIcon\hud_icon_m4carbine\dpadIcon\\ammoCounterIcon\hud_icon_m4carbine\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\2\adsDofEnd\8\hideTags\\notetrackSoundMap\weap_m4carbine_clipout_plr weap_m4carbine_clipout_plr +weap_m4carbine_clipin_plr weap_m4carbine_clipin_plr +weap_m4carbine_chamber_close_plr weap_m4carbine_chamber_close_plr +weap_ak47_chamber_plr weap_ak47_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/mp44_mp b/weapons/mp/mp44_mp new file mode 100644 index 0000000..f0bb5f3 --- /dev/null +++ b/weapons/mp/mp44_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_MP44\modeName\\playerAnimType\autorifle\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\medium\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\1000\aimAssistRangeAds\1500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\8\gunMaxYaw\25\lowAmmoWarningThreshold\0.33\ammoName\7.92 x 33 mm\maxAmmo\180\startAmmo\90\clipName\mp44_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\30\meleeDamage\135\maxDamageRange\1500\minDamageRange\2000\playerDamage\100\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.75\reloadEmptyTime\3.5\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.5\reloadStartAddTime\0\rechamberTime\0\rechamberBoltTime\0\dropTime\0.6\raiseTime\0.95\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\1.4\emptyDropTime\0.6\emptyRaiseTime\0.95\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\6\posRotRate\6\duckedMoveF\-1\duckedMoveR\0\duckedMoveU\-1\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-160\proneMoveR\3\proneMoveU\-120\proneRotP\0\proneRotY\300\proneRotR\-300\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.25\adsTransBlendTime\0.1\adsReloadTransTime\0.45\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\50\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\7\hipSpreadDuckedMax\6\hipSpreadProneMax\5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\5\hipGunKickPitchMax\-15\hipGunKickYawMin\5\hipGunKickYawMax\-5\hipGunKickAccel\800\hipGunKickSpeedMax\2000\hipGunKickSpeedDecay\16\hipGunKickStaticDecay\20\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\800\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\32\adsGunKickStaticDecay\40\hipViewKickPitchMin\-40\hipViewKickPitchMax\80\hipViewKickYawMin\70\hipViewKickYawMax\-70\hipViewKickCenterSpeed\1500\adsViewKickPitchMin\-40\adsViewKickPitchMax\80\adsViewKickYawMin\70\adsViewKickYawMax\-70\adsViewKickCenterSpeed\1500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.05\adsSwayVertScale\0.25\fightDist\720\maxDist\590\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\150\adsOverlayHeight\150\gunModel\viewmodel_mp44_mp\gunModel2\viewmodel_mp44_mp_brock\gunModel3\viewmodel_mp44_mp_bshdwl\gunModel4\viewmodel_mp44_mp_bwmrpt\gunModel5\viewmodel_mp44_mp_cmdtgr\gunModel6\viewmodel_mp44_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_mp44\worldModel2\weapon_mp44_mp_brock\worldModel3\weapon_mp44_mp_bshdwl\worldModel4\weapon_mp44_mp_bwmrpt\worldModel5\weapon_mp44_mp_cmdtgr\worldModel6\weapon_mp44_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_mp44_idle\emptyIdleAnim\\fireAnim\viewmodel_mp44_fire\lastShotAnim\viewmodel_mp44_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_mp44_reload\reloadEmptyAnim\viewmodel_mp44_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_mp44_pullout\dropAnim\viewmodel_mp44_putaway\firstRaiseAnim\viewmodel_mp44_first_time_pullout\altRaiseAnim\viewmodel_mp44_pullout\altDropAnim\viewmodel_mp44_putaway\quickRaiseAnim\viewmodel_mp44_quick_pullout\quickDropAnim\viewmodel_mp44_quick_putaway\emptyRaiseAnim\viewmodel_mp44_pullout\emptyDropAnim\viewmodel_mp44_putaway\sprintInAnim\viewmodel_mp44_sprint_in\sprintLoopAnim\viewmodel_mp44_sprint_loop\sprintOutAnim\viewmodel_mp44_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_mp44_ADS_fire\adsLastShotAnim\viewmodel_mp44_ADS_fire\adsRechamberAnim\\adsUpAnim\viewmodel_mp44_ADS_up\adsDownAnim\viewmodel_mp44_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_mp44_fire_npc\fireSoundPlayer\weap_mp44_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_mp44_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_mp44_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_mp44_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_mp44\killIcon\hud_icon_mp44\dpadIcon\\ammoCounterIcon\hud_icon_mp44\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\2:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\assault_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\3\adsDofEnd\20\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_mp44_lift_plr weap_mp44_lift_plr +weap_mp44_clipout_plr weap_mp44_clipout_plr +weap_mp44_clipin_plr weap_mp44_clipin_plr +weap_mp44_chamber_close_plr weap_mp44_chamber_close_plr \ No newline at end of file diff --git a/weapons/mp/mp5_mp b/weapons/mp/mp5_mp new file mode 100644 index 0000000..6a77fe8 --- /dev/null +++ b/weapons/mp/mp5_mp @@ -0,0 +1,6 @@ +WEAPONFILE\displayName\WEAPON_MP5\modeName\\playerAnimType\smg\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\smg\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\750\aimAssistRangeAds\1000\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\6\gunMaxYaw\6\lowAmmoWarningThreshold\0.33\ammoName\9 × 19 mm Luger\maxAmmo\180\startAmmo\90\clipName\mp5_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\50\minDamage\5\meleeDamage\135\maxDamageRange\1\minDamageRange\1500\playerDamage\30\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1.4\locTorsoUpper\1.4\locTorsoLower\1.2\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.075\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.33\reloadEmptyTime\3.3\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.77\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.25\raiseTime\0.666\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.666\emptyDropTime\0.25\emptyRaiseTime\0.666\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-50\proneMoveR\3\proneMoveU\-105\proneRotP\0\proneRotY\280\proneRotR\-300\proneOfsF\0\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.9\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.3\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.7\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\2\hipSpreadDuckedMin\1.75\hipSpreadProneMin\1.5\hipSpreadMax\5\hipSpreadDuckedMax\4.5\hipSpreadProneMax\4\hipSpreadFireAdd\0.52\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\35\hipGunKickPitchMax\40\hipGunKickYawMin\-25\hipGunKickYawMax\25\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\700\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\35\adsGunKickStaticDecay\10\hipViewKickPitchMin\-30\hipViewKickPitchMax\70\hipViewKickYawMin\70\hipViewKickYawMax\-80\hipViewKickCenterSpeed\1700\adsViewKickPitchMin\-30\adsViewKickPitchMax\70\adsViewKickYawMin\70\adsViewKickYawMax\-80\adsViewKickCenterSpeed\1700\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.15\adsSwayVertScale\0.2\fightDist\720\maxDist\340\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\8\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_mp5_mp\gunModel2\viewmodel_mp5_mp_brock\gunModel3\viewmodel_mp5_mp_bshdwl\gunModel4\viewmodel_mp5_mp_bwmrpt\gunModel5\viewmodel_mp5_mp_cmdtgr\gunModel6\viewmodel_mp5_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_mp5\worldModel2\weapon_mp5_mp_brock\worldModel3\weapon_mp5_mp_bshdwl\worldModel4\weapon_mp5_mp_bwmrpt\worldModel5\weapon_mp5_mp_cmdtgr\worldModel6\weapon_mp5_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_mp5_idle\emptyIdleAnim\\fireAnim\viewmodel_mp5_fire\lastShotAnim\viewmodel_mp5_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_mp5_reload\reloadEmptyAnim\viewmodel_mp5_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_mp5_pullout\dropAnim\viewmodel_mp5_putaway\firstRaiseAnim\viewmodel_mp5_pullout\altRaiseAnim\viewmodel_mp5_pullout\altDropAnim\viewmodel_mp5_putaway\quickRaiseAnim\viewmodel_mp5_pullout_quick\quickDropAnim\viewmodel_mp5_putaway_quick\emptyRaiseAnim\viewmodel_mp5_pullout\emptyDropAnim\viewmodel_mp5_putaway\sprintInAnim\viewmodel_mp5_sprint_in\sprintLoopAnim\viewmodel_mp5_sprint_loop\sprintOutAnim\viewmodel_mp5_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_mp5_ads_fire\adsLastShotAnim\viewmodel_mp5_fire\adsRechamberAnim\\adsUpAnim\viewmodel_mp5_ads_up\adsDownAnim\viewmodel_mp5_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_mp5_fire_npc\fireSoundPlayer\weap_mp5_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_mp5_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_mp5_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_mp5_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_mp5\killIcon\hud_icon_mp5\dpadIcon\\ammoCounterIcon\hud_icon_mp5\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\smg_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\10\hideTags\tag_acog +tag_ak47_mount +tag_reflex_sight\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_mp5_clipout_plr weap_mp5_clipout_plr +weap_mp5_clipin_plr weap_mp5_clipin_plr +weap_mp5_chamber_plr weap_mp5_chamber_plr \ No newline at end of file diff --git a/weapons/mp/mp5_silencer_mp b/weapons/mp/mp5_silencer_mp new file mode 100644 index 0000000..5aa15de --- /dev/null +++ b/weapons/mp/mp5_silencer_mp @@ -0,0 +1,4 @@ +WEAPONFILE\displayName\WEAPON_MP5\modeName\\playerAnimType\smg\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\smg\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\750\aimAssistRangeAds\1000\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\6\gunMaxYaw\6\lowAmmoWarningThreshold\0.33\ammoName\9 × 19 mm Luger\maxAmmo\180\startAmmo\90\clipName\mp5_silencer_mp\clipSize\30\shotCount\1\dropAmmoMin\1\dropAmmoMax\30\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\5\meleeDamage\135\maxDamageRange\1\minDamageRange\1500\playerDamage\30\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.075\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.33\reloadEmptyTime\3.3\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.77\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.25\raiseTime\0.666\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.666\emptyDropTime\0.25\emptyRaiseTime\0.666\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-50\proneMoveR\3\proneMoveU\-105\proneRotP\0\proneRotY\280\proneRotR\-300\proneOfsF\0\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.9\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.3\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.7\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\2\hipSpreadDuckedMin\1.75\hipSpreadProneMin\1.5\hipSpreadMax\5\hipSpreadDuckedMax\4.5\hipSpreadProneMax\4\hipSpreadFireAdd\0.52\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\35\hipGunKickPitchMax\40\hipGunKickYawMin\-25\hipGunKickYawMax\25\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\700\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\35\adsGunKickStaticDecay\10\hipViewKickPitchMin\-30\hipViewKickPitchMax\70\hipViewKickYawMin\70\hipViewKickYawMax\-80\hipViewKickCenterSpeed\1700\adsViewKickPitchMin\-30\adsViewKickPitchMax\70\adsViewKickYawMin\70\adsViewKickYawMax\-80\adsViewKickCenterSpeed\1700\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.15\adsSwayVertScale\0.2\fightDist\720\maxDist\340\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\8\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_mp5_silencer_mp\gunModel2\viewmodel_mp5_silencer_mp_brock\gunModel3\viewmodel_mp5_silencer_mp_bshdwl\gunModel4\viewmodel_mp5_silencer_mp_bwmrpt\gunModel5\viewmodel_mp5_silencer_mp_cmdtgr\gunModel6\viewmodel_mp5_silencer_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_mp5sd\worldModel2\weapon_mp5sd_mp_brock\worldModel3\weapon_mp5sd_mp_bshdwl\worldModel4\weapon_mp5sd_mp_bwmrpt\worldModel5\weapon_mp5sd_mp_cmdtgr\worldModel6\weapon_mp5sd_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_mp5_sd_idle\emptyIdleAnim\\fireAnim\viewmodel_mp5_sd_fire\lastShotAnim\viewmodel_mp5_sd_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_mp5_sd_reload\reloadEmptyAnim\viewmodel_mp5_sd_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_mp5_sd_pullout\dropAnim\viewmodel_mp5_sd_putaway\firstRaiseAnim\viewmodel_mp5_sd_pullout\altRaiseAnim\viewmodel_mp5_sd_pullout\altDropAnim\viewmodel_mp5_sd_putaway\quickRaiseAnim\viewmodel_mp5_sd_pullout\quickDropAnim\viewmodel_mp5_sd_putaway\emptyRaiseAnim\viewmodel_mp5_sd_pullout\emptyDropAnim\viewmodel_mp5_sd_putaway\sprintInAnim\viewmodel_mp5_sd_sprint_in\sprintLoopAnim\viewmodel_mp5_sd_sprint_loop\sprintOutAnim\viewmodel_mp5_sd_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_mp5_sd_ads_fire\adsLastShotAnim\viewmodel_mp5_sd_fire\adsRechamberAnim\\adsUpAnim\viewmodel_mp5_sd_ads_up\adsDownAnim\viewmodel_mp5_sd_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_mp5sd_fire_npc\fireSoundPlayer\weap_mp5sd_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_smg_npc\emptyFireSoundPlayer\weap_dryfire_smg_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_mp5_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_mp5_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_mp5_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_mp5\killIcon\hud_icon_mp5\dpadIcon\\ammoCounterIcon\hud_icon_mp5\hudIconRatio\2:1\killIconRatio\2:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\10\hideTags\\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_mp5sd_clipout_plr weap_mp5sd_clipout_plr +weap_mp5sd_clipin_plr weap_mp5sd_clipin_plr +weap_mp5sd_chamber_plr weap_mp5sd_chamber_plr \ No newline at end of file diff --git a/weapons/mp/radar_mp b/weapons/mp/radar_mp new file mode 100644 index 0000000..5ad716a --- /dev/null +++ b/weapons/mp/radar_mp @@ -0,0 +1 @@ +WEAPONFILE\inventoryType\offhand\moveSpeedScale\1\sprintDurationScale\1\gunModel\viewmodel_ak47\idleAnim\viewmodel_mk2_idle \ No newline at end of file diff --git a/weapons/mp/remington700_mp b/weapons/mp/remington700_mp new file mode 100644 index 0000000..cc41ba7 --- /dev/null +++ b/weapons/mp/remington700_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_REMINGTON700\modeName\\playerAnimType\sniper\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\rifle\penetrateType\large\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\1\armorPiercing\0\boltAction\1\aimDownSight\1\rechamberWhileAds\0\noPartialReload\0\segmentedReload\1\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\2500\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\1\sprintDurationScale\1\gunMaxPitch\30\gunMaxYaw\15\lowAmmoWarningThreshold\0.33\ammoName\7.62 × 51 mm NATO\maxAmmo\32\startAmmo\16\clipName\remington700_mp\clipSize\4\shotCount\1\dropAmmoMin\1\dropAmmoMax\4\reloadAmmoAdd\1\reloadStartAdd\1\damage\70\minDamage\70\meleeDamage\135\maxDamageRange\4000\minDamageRange\5000\playerDamage\30\locNone\1\locHelmet\4.5\locHead\4.5\locNeck\4.5\locTorsoUpper\4.5\locTorsoLower\4.5\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.05\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\0.43333\reloadEmptyTime\0.15\reloadStartTime\1.13\reloadEndTime\0.7666\reloadAddTime\0.26\reloadStartAddTime\0.96\rechamberTime\1\rechamberBoltTime\0.65\dropTime\0.66\raiseTime\0.9\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.9\emptyDropTime\0.66\emptyRaiseTime\0.9\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-2.2\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.7\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.5\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-55\proneMoveR\3\proneMoveU\-145\proneRotP\0\proneRotY\220\proneRotR\-200\proneOfsF\-2\proneOfsR\1.5\proneOfsU\0.8\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0\idleCrouchFactor\1\idleProneFactor\1\adsSpread\0\adsAimPitch\0\adsTransInTime\0.25\adsTransOutTime\0.4\adsTransBlendTime\0.1\adsReloadTransTime\0.6\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\15\adsZoomInFrac\0.05\adsZoomOutFrac\0.05\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3.8\hipSpreadDuckedMin\3.4\hipSpreadProneMin\3\hipSpreadMax\8\hipSpreadDuckedMax\7\hipSpreadProneMax\6.5\hipSpreadFireAdd\0.6\hipSpreadTurnAdd\0\hipSpreadMoveAdd\5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1.05\hipSpreadProneDecay\1.1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\80\hipGunKickPitchMax\85\hipGunKickYawMin\-35\hipGunKickYawMax\35\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\600\adsGunKickSpeedMax\600\adsGunKickSpeedDecay\100\adsGunKickStaticDecay\100\hipViewKickPitchMin\80\hipViewKickPitchMax\100\hipViewKickYawMin\-50\hipViewKickYawMax\-55\hipViewKickCenterSpeed\500\adsViewKickPitchMin\30\adsViewKickPitchMax\85\adsViewKickYawMin\70\adsViewKickYawMax\-75\adsViewKickCenterSpeed\500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0\adsSwayYawScale\0\adsSwayHorizScale\0\adsSwayVertScale\0\fightDist\720\maxDist\730\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\3\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\scope_overlay_m40a3\adsOverlayShaderLowRes\scope_overlay_m40a3_low_res\adsOverlayReticle\crosshair\adsOverlayWidth\480\adsOverlayHeight\480\gunModel\viewmodel_remington700_mp\gunModel2\viewmodel_remington700_mp_brock\gunModel3\viewmodel_remington700_mp_bshdwl\gunModel4\viewmodel_remington700_mp_bwmrpt\gunModel5\viewmodel_remington700_mp_cmdtgr\gunModel6\viewmodel_remington700_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_remington700\worldModel2\weapon_remington700_mp_brock\worldModel3\weapon_remington700_mp_bshdwl\worldModel4\weapon_remington700_mp_bwmrpt\worldModel5\weapon_remington700_mp_cmdtgr\worldModel6\weapon_remington700_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_remington_idle\emptyIdleAnim\\fireAnim\viewmodel_remington_fire\lastShotAnim\viewmodel_remington_fire\rechamberAnim\viewmodel_remington_rechamber\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_remington_reload_loop\reloadEmptyAnim\viewmodel_remington_reload_loop\reloadStartAnim\viewmodel_remington_reload_intro\reloadEndAnim\viewmodel_remington_reload_out\raiseAnim\viewmodel_remington_pullout\dropAnim\viewmodel_remington_putaway\firstRaiseAnim\viewmodel_remington_pullout\altRaiseAnim\viewmodel_remington_pullout\altDropAnim\viewmodel_remington_putaway\quickRaiseAnim\viewmodel_remington_quick_pullout\quickDropAnim\viewmodel_remington_quick_putaway\emptyRaiseAnim\viewmodel_remington_pullout\emptyDropAnim\viewmodel_remington_putaway\sprintInAnim\viewmodel_remington_sprint_in\sprintLoopAnim\viewmodel_remington_sprint_loop\sprintOutAnim\viewmodel_remington_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_remington_fire\adsLastShotAnim\viewmodel_remington_fire\adsRechamberAnim\viewmodel_remington_rechamber\adsUpAnim\viewmodel_remington_ADS_up\adsDownAnim\viewmodel_remington_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/rifle_view\worldShellEjectEffect\shellejects/rifle\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_rem700sniper_fire_npc\fireSoundPlayer\weap_rem700sniper_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_rifle_npc\emptyFireSoundPlayer\weap_dryfire_rifle_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_rem700sniper_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\weap_rem700_rechamber_npc\rechamberSoundPlayer\weap_rem700_rechamber_plr\reloadSound\weap_rem700_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_rem700_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_remington700\killIcon\hud_icon_remington700\dpadIcon\\ammoCounterIcon\hud_icon_sniperrifle\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\ShortMagazine\flipKillIcon\1\fireRumble\\meleeImpactRumble\\adsDofStart\0\adsDofEnd\10\hideTags\tag_acog\notetrackSoundMap\weap_rem700_start_plr weap_rem700_start_plr +weap_rem700_loop_plr weap_rem700_loop_plr +weap_rem700_end_plr weap_rem700_end_plr +weap_rem700_rechamber_plr weap_rem700_rechamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/smoke_grenade_mp b/weapons/mp/smoke_grenade_mp new file mode 100644 index 0000000..ef23dfc --- /dev/null +++ b/weapons/mp/smoke_grenade_mp @@ -0,0 +1 @@ +WEAPONFILE\weaponType\grenade\weaponClass\grenade\offhandClass\Smoke Grenade\impactType\none\inventoryType\offhand\displayName\WEAPON_SMOKE_GRENADE\modeName\\playerAnimType\grenade\AIOverlayDescription\\gunModel\viewmodel_ussmokegrenade\handModel\viewmodel_base_viewhands\isHandModelOverridable\1\idleAnim\viewmodel_ussmokegrenade_idle\emptyIdleAnim\viewmodel_ussmokegrenade_idle\fireAnim\viewmodel_ussmokegrenade_throw\holdFireAnim\viewmodel_ussmokegrenade_pullpin\lastShotAnim\viewmodel_ussmokegrenade_throw\detonateAnim\\meleeAnim\viewmodel_ussmokegrenade_idle\meleeChargeAnim\\raiseAnim\viewmodel_ussmokegrenade_idle\dropAnim\viewmodel_ussmokegrenade_idle\firstRaiseAnim\\altRaiseAnim\viewmodel_ussmokegrenade_idle\altDropAnim\viewmodel_ussmokegrenade_idle\quickRaiseAnim\\quickDropAnim\\emptyRaiseAnim\\emptyDropAnim\\sprintInAnim\\sprintLoopAnim\\sprintOutAnim\\nightVisionWearAnim\\nightVisionRemoveAnim\\autoAimRange\0\aimAssistRange\0\aimAssistRangeAds\0\moveSpeedScale\1.2\sprintDurationScale\1\lowAmmoWarningThreshold\0.33\damage\15\meleeDamage\135\fireDelay\0.13\meleeDelay\0.1\meleeChargeDelay\0\fireTime\0.36\holdFireTime\0.6\detonateTime\0.1\detonateDelay\0.1\meleeTime\0.66\meleeChargeTime\0\reloadTime\2\dropTime\0\raiseTime\0\altDropTime\0\altRaiseTime\0.6\quickDropTime\0.5\quickRaiseTime\0.5\firstRaiseTime\0.5\emptyDropTime\0.5\emptyRaiseTime\0.5\sprintInTime\0.5\sprintLoopTime\0.5\sprintOutTime\0.5\nightVisionWearTime\0.5\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\fuseTime\1\aiFuseTime\1\stickiness\Don't stick\hasDetonator\0\timedDetonation\1\rotate\1\holdButtonToThrow\0\freezeMovementWhenFiring\0\clipOnly\1\hipIdleAmount\80\hipIdleSpeed\0\idleCrouchFactor\0.5\idleProneFactor\0.15\parallelDefaultBounce\0.5\parallelBarkBounce\0.6\parallelBrickBounce\0.6\parallelCarpetBounce\0.6\parallelClothBounce\0.2\parallelConcreteBounce\0.6\parallelDirtBounce\0.45\parallelFleshBounce\0.2\parallelFoliageBounce\0.05\parallelGlassBounce\0.4\parallelGrassBounce\0.35\parallelGravelBounce\0.5\parallelIceBounce\0.6\parallelMetalBounce\0.6\parallelMudBounce\0.2\parallelPaperBounce\0.2\parallelPlasterBounce\0.5\parallelRockBounce\0.6\parallelSandBounce\0.3\parallelSnowBounce\0.2\parallelWaterBounce\0.2\parallelWoodBounce\0.6\parallelAsphaltBounce\0.6\parallelCeramicBounce\0.5\parallelPlasticBounce\0.5\parallelRubberBounce\0.5\parallelCushionBounce\0.5\parallelFruitBounce\0.5\parallelPaintedMetalBounce\0.5\perpendicularDefaultBounce\0.25\perpendicularBarkBounce\0.25\perpendicularBrickBounce\0.25\perpendicularCarpetBounce\0.25\perpendicularClothBounce\0.2\perpendicularConcreteBounce\0.25\perpendicularDirtBounce\0.225\perpendicularFleshBounce\0.2\perpendicularFoliageBounce\0.05\perpendicularGlassBounce\0.2\perpendicularGrassBounce\0.15\perpendicularGravelBounce\0.25\perpendicularIceBounce\0.3\perpendicularMetalBounce\0.25\perpendicularMudBounce\0.1\perpendicularPaperBounce\0.2\perpendicularPlasterBounce\0.25\perpendicularRockBounce\0.25\perpendicularSandBounce\0.1\perpendicularSnowBounce\0.1\perpendicularWaterBounce\0.2\perpendicularWoodBounce\0.25\perpendicularAsphaltBounce\0.25\perpendicularCeramicBounce\0.5\perpendicularPlasticBounce\0.5\perpendicularRubberBounce\0.5\perpendicularCushionBounce\0.5\perpendicularFruitBounce\0.5\perpendicularPaintedMetalBounce\0.5\swayMaxAngle\30\swayLerpSpeed\6\swayPitchScale\0.1\swayYawScale\0.1\swayHorizScale\0.1\swayVertScale\0.1\swayShellShockScale\5\worldModel\weapon_us_smoke_grenade\knifeModel\\worldKnifeModel\\ammoName\smokegrenade_american\maxAmmo\4\startAmmo\1\clipName\smokegrenade_american\clipSize\4\sharedAmmoCapName\WEAPON_SMOKEGRENADE\sharedAmmoCap\4\dropAmmoMin\1\dropAmmoMax\1\pickupSound\grenade_pickup\pickupSoundPlayer\grenade_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\pullbackSound\weap_fraggrenade_pin\pullbackSoundPlayer\weap_fraggrenade_pin\fireSound\weap_fraggrenade_fire\fireSoundPlayer\weap_fraggrenade_fire\lastShotSound\\lastShotSoundPlayer\\meleeSwipeSound\\meleeSwipeSoundPlayer\\reloadSound\\reloadSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\detonateSound\\detonateSoundPlayer\\raiseSound\\raiseSoundPlayer\\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\bounceSound\grenade_bounce\reticleCenter\reticle_center_cross\reticleSide\\reticleCenterSize\32\reticleSideSize\16\reticleMinOfs\4\altWeapon\\blocksProne\0\cookOffHold\0\hudIcon\hud_us_smokegrenade\killIcon\hud_us_grenade\dpadIcon\\ammoCounterIcon\\hudIconRatio\1:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\None\flipKillIcon\1\standMoveF\0\standMoveR\1\standMoveU\-1.5\standRotP\0\standRotY\0\standRotR\0\duckedOfsF\-2\duckedOfsR\2\duckedOfsU\-0.2\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\proneOfsF\-6\proneOfsR\3.5\proneOfsU\0.8\proneMoveF\0\proneMoveR\1\proneMoveU\-1.5\proneRotP\0\proneRotY\0\proneRotR\0\posMoveRate\4\posProneMoveRate\10\standMoveMinSpeed\110\duckedMoveMinSpeed\60\proneMoveMinSpeed\0\posRotRate\5\posProneRotRate\10\standRotMinSpeed\110\duckedRotMinSpeed\60\proneRotMinSpeed\0\explosionRadius\0\explosionRadiusMin\0\explosionInnerDamage\0\explosionOuterDamage\0\damageConeAngle\180\projectileSpeed\960\projectileSpeedUp\120\projectileSpeedForward\0\projectileModel\projectile_us_smoke_grenade\projExplosionType\smoke\projExplosionEffect\props/american_smoke_grenade_mp\projExplosionEffectForceNormalUp\0\projExplosionSound\smokegrenade_explode_default\projectileTrail\none\projectileTrailTime\1\projectileTrailRadius\32\projImpactExplode\0\adsDofStart\0\adsDofEnd\0\notetrackSoundMap\ \ No newline at end of file diff --git a/weapons/mp/usp_mp b/weapons/mp/usp_mp new file mode 100644 index 0000000..240bbf0 --- /dev/null +++ b/weapons/mp/usp_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_USP\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\.45 ACP\maxAmmo\72\startAmmo\36\clipName\usp_mp\clipSize\12\shotCount\1\dropAmmoMin\1\dropAmmoMax\12\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\20\meleeDamage\135\maxDamageRange\450\minDamageRange\1000\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.625\reloadEmptyTime\1.917\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.6\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.15\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\8\hipSpreadDuckedMax\8\hipSpreadProneMax\8\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\0\hipGunKickPitchMax\0\hipGunKickYawMin\0\hipGunKickYawMax\0\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\0\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\25\hipViewKickPitchMax\45\hipViewKickYawMin\35\hipViewKickYawMax\-35\hipViewKickCenterSpeed\1000\adsViewKickPitchMin\25\adsViewKickPitchMax\45\adsViewKickYawMin\35\adsViewKickYawMax\-35\adsViewKickCenterSpeed\1000\swayMaxAngle\5\swayLerpSpeed\4\swayPitchScale\0.1\swayYawScale\0.1\swayHorizScale\0.3\swayVertScale\0.5\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.1\adsSwayVertScale\0.25\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_usp_mp\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_USP\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_USP_idle\emptyIdleAnim\viewmodel_USP_idle\fireAnim\viewmodel_USP_fire\lastShotAnim\viewmodel_USP_lastfire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_USP_reload\reloadEmptyAnim\viewmodel_USP_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_USP_pullout2\dropAnim\viewmodel_USP_putaway\firstRaiseAnim\viewmodel_USP_pullout2\altRaiseAnim\viewmodel_USP_pullout2\altDropAnim\viewmodel_USP_putaway\quickRaiseAnim\viewmodel_USP_pullout2\quickDropAnim\viewmodel_USP_putaway\emptyRaiseAnim\viewmodel_USP_pullout2\emptyDropAnim\viewmodel_USP_putaway\sprintInAnim\viewmodel_USP_sprint_in\sprintLoopAnim\viewmodel_USP_sprint_loop\sprintOutAnim\viewmodel_USP_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_USP_fire_ads\adsLastShotAnim\viewmodel_USP_lastfire\adsRechamberAnim\\adsUpAnim\viewmodel_USP_ADS_up\adsDownAnim\viewmodel_USP_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_usp45_fire_npc\fireSoundPlayer\weap_usp45_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_usp45_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_usp45_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_usp45_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_usp_45\killIcon\hud_icon_usp_45\dpadIcon\\ammoCounterIcon\hud_icon_usp_45\hudIconRatio\1:1\killIconRatio\1:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\pistol_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\8\adsDofEnd\12\hideTags\\notetrackSoundMap\weap_usp45_clipout_plr weap_usp45_clipout_plr +weap_usp45_clipin_plr weap_usp45_clipin_plr +weap_m9_chamber_plr weap_m9_chamber_plr +weap_usp45_lift_plr weap_usp45_lift_plr +melee_knife_stab melee_knife_stab + + \ No newline at end of file diff --git a/weapons/mp/usp_silencer_mp b/weapons/mp/usp_silencer_mp new file mode 100644 index 0000000..6385c87 --- /dev/null +++ b/weapons/mp/usp_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_USP\modeName\\playerAnimType\pistol\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\pistol\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Single Shot\twoHanded\0\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\600\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\2\gunMaxYaw\8\lowAmmoWarningThreshold\0.33\ammoName\.45 ACP\maxAmmo\72\startAmmo\36\clipName\usp_silencer_mp\clipSize\12\shotCount\1\dropAmmoMin\1\dropAmmoMax\12\reloadAmmoAdd\0\reloadStartAdd\0\damage\40\minDamage\20\meleeDamage\135\maxDamageRange\250\minDamageRange\650\playerDamage\150\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.1\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\1.625\reloadEmptyTime\1.917\reloadStartTime\0\reloadEndTime\0\reloadAddTime\1.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.45\raiseTime\0.55\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.25\firstRaiseTime\0.25\emptyDropTime\0.45\emptyRaiseTime\0.25\sprintInTime\0.3\sprintLoopTime\0.6\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\1\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\0\standRotMinSpeed\0\posMoveRate\5\posRotRate\6\duckedMoveF\0\duckedMoveR\1\duckedMoveU\-2\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.8\duckedOfsR\1.2\duckedOfsU\-1\duckedMoveMinSpeed\0\duckedRotMinSpeed\0\proneMoveF\-20\proneMoveR\-25\proneMoveU\-95\proneRotP\0\proneRotY\270\proneRotR\-300\proneOfsF\2\proneOfsR\2\proneOfsU\-1.6\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\1\idleCrouchFactor\0.8\idleProneFactor\0.6\adsSpread\0\adsAimPitch\0\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.15\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\65\adsZoomInFrac\0.42\adsZoomOutFrac\0.08\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\3\hipSpreadDuckedMin\2.5\hipSpreadProneMin\2\hipSpreadMax\8\hipSpreadDuckedMax\8\hipSpreadProneMax\8\hipSpreadFireAdd\1\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4.5\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\0\hipGunKickPitchMax\0\hipGunKickYawMin\0\hipGunKickYawMax\0\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\0\adsGunKickPitchMax\0\adsGunKickYawMin\0\adsGunKickYawMax\0\adsGunKickAccel\0\adsGunKickSpeedMax\0\adsGunKickSpeedDecay\25\adsGunKickStaticDecay\50\hipViewKickPitchMin\25\hipViewKickPitchMax\45\hipViewKickYawMin\35\hipViewKickYawMax\-35\hipViewKickCenterSpeed\1000\adsViewKickPitchMin\25\adsViewKickPitchMax\45\adsViewKickYawMin\35\adsViewKickYawMax\-35\adsViewKickCenterSpeed\1000\swayMaxAngle\5\swayLerpSpeed\4\swayPitchScale\0.1\swayYawScale\0.1\swayHorizScale\0.3\swayVertScale\0.5\swayShellShockScale\5\adsSwayMaxAngle\6\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.1\adsSwayVertScale\0.25\fightDist\720\maxDist\250\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\4\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_usp_silencer_mp\gunModel2\\gunModel3\\gunModel4\\gunModel5\\gunModel6\\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_usp_silencer\worldModel2\\worldModel3\\worldModel4\\worldModel5\\worldModel6\\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_USP_idle\emptyIdleAnim\viewmodel_USP_idle\fireAnim\viewmodel_USP_fire\lastShotAnim\viewmodel_USP_lastfire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_USP_reload\reloadEmptyAnim\viewmodel_USP_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_USP_pullout2\dropAnim\viewmodel_USP_putaway\firstRaiseAnim\viewmodel_USP_pullout2\altRaiseAnim\viewmodel_USP_pullout2\altDropAnim\viewmodel_USP_putaway\quickRaiseAnim\viewmodel_USP_pullout2\quickDropAnim\viewmodel_USP_putaway\emptyRaiseAnim\viewmodel_USP_pullout2\emptyDropAnim\viewmodel_USP_putaway\sprintInAnim\viewmodel_USP_sprint_in\sprintLoopAnim\viewmodel_USP_sprint_loop\sprintOutAnim\viewmodel_USP_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_USP_fire_ads\adsLastShotAnim\viewmodel_USP_lastfire\adsRechamberAnim\\adsUpAnim\viewmodel_USP_ADS_up\adsDownAnim\viewmodel_USP_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_usp45sd_fire_npc\fireSoundPlayer\weap_usp45sd_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_usp45_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_usp45_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_usp45_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_usp_45\killIcon\hud_icon_usp_45\dpadIcon\\ammoCounterIcon\hud_icon_usp_45\hudIconRatio\1:1\killIconRatio\1:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\8\adsDofEnd\12\hideTags\\notetrackSoundMap\weap_usp45_clipout_plr weap_usp45_clipout_plr +weap_usp45_clipin_plr weap_usp45_clipin_plr +weap_m9_chamber_plr weap_m9_chamber_plr +weap_usp45_lift_plr weap_usp45_lift_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/uzi_mp b/weapons/mp/uzi_mp new file mode 100644 index 0000000..bbd7053 --- /dev/null +++ b/weapons/mp/uzi_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_UZI\modeName\\playerAnimType\smg\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\smg\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\750\aimAssistRangeAds\1000\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\6\gunMaxYaw\6\lowAmmoWarningThreshold\0.33\ammoName\9 × 19 mm Luger\maxAmmo\192\startAmmo\96\clipName\uzi_mp\clipSize\32\shotCount\1\dropAmmoMin\1\dropAmmoMax\32\reloadAmmoAdd\0\reloadStartAdd\0\damage\30\minDamage\20\meleeDamage\135\maxDamageRange\750\minDamageRange\1000\playerDamage\30\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.063\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.4\reloadEmptyTime\3.5\reloadStartTime\0\reloadEndTime\0\reloadAddTime\2.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.42\raiseTime\0.8\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.55\firstRaiseTime\0.8\emptyDropTime\0.5\emptyRaiseTime\0.5\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-50\proneMoveR\3\proneMoveU\-105\proneRotP\0\proneRotY\280\proneRotR\-300\proneOfsF\0\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.9\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.3\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.7\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\2\hipSpreadDuckedMin\1.75\hipSpreadProneMin\1.5\hipSpreadMax\5\hipSpreadDuckedMax\4.5\hipSpreadProneMax\4\hipSpreadFireAdd\0.52\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\35\hipGunKickPitchMax\40\hipGunKickYawMin\-25\hipGunKickYawMax\25\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\700\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\35\adsGunKickStaticDecay\10\hipViewKickPitchMin\-50\hipViewKickPitchMax\80\hipViewKickYawMin\75\hipViewKickYawMax\-75\hipViewKickCenterSpeed\1600\adsViewKickPitchMin\-50\adsViewKickPitchMax\80\adsViewKickYawMin\75\adsViewKickYawMax\-75\adsViewKickCenterSpeed\1600\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.3\adsSwayVertScale\0.2\fightDist\720\maxDist\340\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\8\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_miniUZI_mp\gunModel2\viewmodel_miniUZI_mp_brock\gunModel3\viewmodel_miniUZI_mp_bshdwl\gunModel4\viewmodel_miniUZI_mp_bwmrpt\gunModel5\viewmodel_miniUZI_mp_cmdtgr\gunModel6\viewmodel_miniUZI_mp_stagger\gunModel7\viewmodel_miniUZI_gold_mp\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_mini_uzi\worldModel2\weapon_mini_uzi_mp_brock\worldModel3\weapon_mini_uzi_mp_bshdwl\worldModel4\weapon_mini_uzi_mp_bwmrpt\worldModel5\weapon_mini_uzi_mp_cmdtgr\worldModel6\weapon_mini_uzi_mp_stagger\worldModel7\weapon_mini_uzi_gold\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_miniUZI_idle\emptyIdleAnim\viewmodel_miniUZI_idle\fireAnim\viewmodel_miniUZI_fire\lastShotAnim\viewmodel_miniUZI_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_miniUZI_reload\reloadEmptyAnim\viewmodel_miniUZI_attachment_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_miniUZI_pullout\dropAnim\viewmodel_miniUZI_putaway\firstRaiseAnim\viewmodel_miniUZI_pullout\altRaiseAnim\viewmodel_miniUZI_pullout\altDropAnim\viewmodel_miniUZI_putaway\quickRaiseAnim\viewmodel_miniUZI_pullout\quickDropAnim\viewmodel_miniUZI_putaway\emptyRaiseAnim\viewmodel_miniUZI_pullout\emptyDropAnim\viewmodel_miniUZI_putaway\sprintInAnim\viewmodel_miniUZI_sprint_in\sprintLoopAnim\viewmodel_miniUZI_sprint_loop\sprintOutAnim\viewmodel_miniUZI_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_miniUZI_ADS_fire\adsLastShotAnim\viewmodel_miniUZI_ADS_fire\adsRechamberAnim\\adsUpAnim\viewmodel_miniUZI_ADS_up\adsDownAnim\viewmodel_miniUZI_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_miniuzi_fire_npc\fireSoundPlayer\weap_miniuzi_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_miniuzi_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_miniuzi_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_miniuzi_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_mini_uzi\killIcon\hud_icon_mini_uzi\dpadIcon\\ammoCounterIcon\hud_icon_mini_uzi\hudIconRatio\1:1\killIconRatio\1:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\smg_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\10\hideTags\tag_acog +tag_ak47_mount +tag_reflex_sight\notetrackSoundMap\weap_miniuzi_lift_plr weap_miniuzi_lift_plr +weap_miniuzi_clipout_plr weap_miniuzi_clipout_plr +weap_miniuzi_clipin_plr weap_miniuzi_clipin_plr +weap_miniuzi_chamber_plr weap_miniuzi_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/uzi_silencer_mp b/weapons/mp/uzi_silencer_mp new file mode 100644 index 0000000..fc8c147 --- /dev/null +++ b/weapons/mp/uzi_silencer_mp @@ -0,0 +1,5 @@ +WEAPONFILE\displayName\WEAPON_UZI\modeName\\playerAnimType\smg\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\smg\penetrateType\small\impactType\bullet_small\inventoryType\primary\fireType\Full Auto\twoHanded\1\rifleBullet\0\armorPiercing\0\boltAction\0\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\0\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\1\autoAimRange\0\aimAssistRange\750\aimAssistRangeAds\1000\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\6\gunMaxYaw\6\lowAmmoWarningThreshold\0.33\ammoName\9 × 19 mm Luger\maxAmmo\192\startAmmo\96\clipName\uzi_silencer_mp\clipSize\32\shotCount\1\dropAmmoMin\1\dropAmmoMax\32\reloadAmmoAdd\0\reloadStartAdd\0\damage\30\minDamage\20\meleeDamage\135\maxDamageRange\350\minDamageRange\700\playerDamage\30\locNone\1\locHelmet\1.4\locHead\1.4\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.063\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\2.4\reloadEmptyTime\3.5\reloadStartTime\0\reloadEndTime\0\reloadAddTime\2.2\reloadStartAddTime\0\rechamberTime\0.1\rechamberBoltTime\0\dropTime\0.42\raiseTime\0.8\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.55\firstRaiseTime\0.8\emptyDropTime\0.5\emptyRaiseTime\0.5\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.5\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-1\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-50\proneMoveR\3\proneMoveU\-105\proneRotP\0\proneRotY\280\proneRotR\-300\proneOfsF\0\proneOfsR\1.5\proneOfsU\0\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.9\idleCrouchFactor\0.75\idleProneFactor\0.4\adsSpread\0\adsAimPitch\0\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.3\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.7\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\2\hipSpreadDuckedMin\1.75\hipSpreadProneMin\1.5\hipSpreadMax\5\hipSpreadDuckedMax\4.5\hipSpreadProneMax\4\hipSpreadFireAdd\0.52\hipSpreadTurnAdd\0\hipSpreadMoveAdd\4\hipSpreadDecayRate\4\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\35\hipGunKickPitchMax\40\hipGunKickYawMin\-25\hipGunKickYawMax\25\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\100\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\75\adsGunKickPitchMin\5\adsGunKickPitchMax\15\adsGunKickYawMin\-5\adsGunKickYawMax\10\adsGunKickAccel\700\adsGunKickSpeedMax\2000\adsGunKickSpeedDecay\35\adsGunKickStaticDecay\10\hipViewKickPitchMin\-50\hipViewKickPitchMax\80\hipViewKickYawMin\75\hipViewKickYawMax\-75\hipViewKickCenterSpeed\1600\adsViewKickPitchMin\-50\adsViewKickPitchMax\80\adsViewKickYawMin\75\adsViewKickYawMax\-75\adsViewKickCenterSpeed\1600\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.3\adsSwayVertScale\0.2\fightDist\720\maxDist\340\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\8\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_miniUZI_silencer\gunModel2\viewmodel_miniUZI_supressed_mp_brock\gunModel3\viewmodel_miniUZI_supressed_mp_bshdwl\gunModel4\viewmodel_miniUZI_supressed_mp_bwmrpt\gunModel5\viewmodel_miniUZI_supressed_mp_cmdtgr\gunModel6\viewmodel_miniUZI_supressed_mp_stagger\gunModel7\viewmodel_miniuzi_supressed_gold_mp\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_mini_uzi_silencer\worldModel2\weapon_mini_uzi_sd_mp_brock\worldModel3\weapon_mini_uzi_sd_mp_bshdwl\worldModel4\weapon_mini_uzi_sd_mp_bwmrpt\worldModel5\weapon_mini_uzi_sd_mp_cmdtgr\worldModel6\weapon_mini_uzi_sd_mp_stagger\worldModel7\weapon_mini_uzi_silencer_gold\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_miniUZI_idle\emptyIdleAnim\viewmodel_miniUZI_idle\fireAnim\viewmodel_miniUZI_fire\lastShotAnim\viewmodel_miniUZI_fire\rechamberAnim\\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_miniUZI_reload\reloadEmptyAnim\viewmodel_miniUZI_attachment_reload_empty\reloadStartAnim\\reloadEndAnim\\raiseAnim\viewmodel_miniUZI_pullout\dropAnim\viewmodel_miniUZI_putaway\firstRaiseAnim\viewmodel_miniUZI_pullout\altRaiseAnim\viewmodel_miniUZI_pullout\altDropAnim\viewmodel_miniUZI_putaway\quickRaiseAnim\viewmodel_miniUZI_pullout\quickDropAnim\viewmodel_miniUZI_putaway\emptyRaiseAnim\viewmodel_miniUZI_pullout\emptyDropAnim\viewmodel_miniUZI_putaway\sprintInAnim\viewmodel_miniUZI_sprint_in\sprintLoopAnim\viewmodel_miniUZI_sprint_loop\sprintOutAnim\viewmodel_miniUZI_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_miniUZI_ADS_fire\adsLastShotAnim\viewmodel_miniUZI_ADS_fire\adsRechamberAnim\\adsUpAnim\viewmodel_miniUZI_ADS_up\adsDownAnim\viewmodel_miniUZI_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/pistol_view\worldShellEjectEffect\shellejects/pistol\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_miniuzisd_fire_npc\fireSoundPlayer\weap_miniuzisd_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_pistol_npc\emptyFireSoundPlayer\weap_dryfire_pistol_plr\meleeSwipeSound\melee_swing_small\meleeSwipeSoundPlayer\melee_miniuzi_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\\rechamberSoundPlayer\\reloadSound\weap_miniuzi_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_miniuzi_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_mini_uzi\killIcon\hud_icon_mini_uzi\dpadIcon\\ammoCounterIcon\hud_icon_mini_uzi\hudIconRatio\1:1\killIconRatio\1:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Magazine\flipKillIcon\1\fireRumble\silencer_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\10\hideTags\\notetrackSoundMap\weap_miniuzi_lift_plr weap_miniuzi_lift_plr +weap_miniuzi_clipout_plr weap_miniuzi_clipout_plr +weap_miniuzi_clipin_plr weap_miniuzi_clipin_plr +weap_miniuzi_chamber_plr weap_miniuzi_chamber_plr +melee_knife_stab melee_knife_stab \ No newline at end of file diff --git a/weapons/mp/winchester1200_mp b/weapons/mp/winchester1200_mp new file mode 100644 index 0000000..671aef6 --- /dev/null +++ b/weapons/mp/winchester1200_mp @@ -0,0 +1,7 @@ +WEAPONFILE\displayName\WEAPON_WINCHESTER1200\modeName\\playerAnimType\other\altWeapon\\AIOverlayDescription\\weaponType\bullet\weaponClass\spread\penetrateType\small\impactType\shotgun\inventoryType\primary\fireType\Single Shot\twoHanded\1\rifleBullet\0\armorPiercing\0\boltAction\1\aimDownSight\1\rechamberWhileAds\1\noPartialReload\0\segmentedReload\1\adsFire\0\noAdsWhenMagEmpty\0\avoidDropCleanup\0\enhanced\0\cancelAutoHolsterWhenEmpty\0\suppressAmmoReserveDisplay\0\laserSightDuringNightvision\0\blocksProne\0\silenced\0\autoAimRange\0\aimAssistRange\600\aimAssistRangeAds\1000\enemyCrosshairRange\0\crosshairColorChange\0\moveSpeedScale\1\adsMoveSpeedScale\2\sprintDurationScale\1\gunMaxPitch\80\gunMaxYaw\15\lowAmmoWarningThreshold\0.33\ammoName\12 gauge\maxAmmo\56\startAmmo\28\clipName\winchester1200_mp\clipSize\7\shotCount\8\dropAmmoMin\1\dropAmmoMax\7\reloadAmmoAdd\1\reloadStartAdd\1\damage\40\minDamage\10\meleeDamage\135\maxDamageRange\300\minDamageRange\500\playerDamage\30\locNone\1\locHelmet\1\locHead\1\locNeck\1\locTorsoUpper\1\locTorsoLower\1\locRightArmUpper\1\locRightArmLower\1\locRightHand\1\locLeftArmUpper\1\locLeftArmLower\1\locLeftHand\1\locRightLegUpper\1\locRightLegLower\1\locRightFoot\1\locLeftLegUpper\1\locLeftLegLower\1\locLeftFoot\1\locGun\0\fireTime\0.283\fireDelay\0\meleeTime\0.8\meleeChargeTime\1.16\meleeDelay\0.13\meleeChargeDelay\0.16\reloadTime\0.567\reloadEmptyTime\0.567\reloadStartTime\1\reloadEndTime\0.767\reloadAddTime\0.25\reloadStartAddTime\0.6\rechamberTime\0.467\rechamberBoltTime\0\dropTime\0.33\raiseTime\0.625\altDropTime\0\altRaiseTime\0\quickDropTime\0.25\quickRaiseTime\0.75\firstRaiseTime\0.625\emptyDropTime\0.33\emptyRaiseTime\0.65\sprintInTime\0.3\sprintLoopTime\0.7\sprintOutTime\0.3\nightVisionWearTime\0\nightVisionWearTimeFadeOutEnd\0\nightVisionWearTimePowerUp\0\nightVisionRemoveTime\0\nightVisionRemoveTimePowerDown\0\nightVisionRemoveTimeFadeInStart\0\standMoveF\0\standMoveR\0\standMoveU\-1.7\standRotP\0\standRotY\0\standRotR\0\standMoveMinSpeed\80\standRotMinSpeed\80\posMoveRate\6\posRotRate\6\duckedMoveF\0\duckedMoveR\0\duckedMoveU\-1.7\duckedRotP\0\duckedRotY\0\duckedRotR\0\duckedOfsF\-0.1\duckedOfsR\0.8\duckedOfsU\-0.2\duckedMoveMinSpeed\20\duckedRotMinSpeed\20\proneMoveF\-100\proneMoveR\3\proneMoveU\-105\proneRotP\0\proneRotY\220\proneRotR\-300\proneOfsF\-0.5\proneOfsR\2\proneOfsU\0.8\posProneMoveRate\25\posProneRotRate\30\proneMoveMinSpeed\0\proneRotMinSpeed\0\hipIdleAmount\30\adsIdleAmount\0\hipIdleSpeed\1\adsIdleSpeed\0.8\idleCrouchFactor\0.8\idleProneFactor\0.4\adsSpread\5.5\adsAimPitch\-0.1\adsTransInTime\0.2\adsTransOutTime\0.2\adsTransBlendTime\0.1\adsReloadTransTime\0.5\adsCrosshairInFrac\1\adsCrosshairOutFrac\0.2\adsZoomFov\55\adsZoomInFrac\0.5\adsZoomOutFrac\0.4\adsBobFactor\0\adsViewBobMult\0\adsViewErrorMin\0\adsViewErrorMax\0\hipSpreadStandMin\4\hipSpreadDuckedMin\4\hipSpreadProneMin\4\hipSpreadMax\4\hipSpreadDuckedMax\4\hipSpreadProneMax\4\hipSpreadFireAdd\0\hipSpreadTurnAdd\0\hipSpreadMoveAdd\0.1\hipSpreadDecayRate\5\hipSpreadDuckedDecay\1\hipSpreadProneDecay\1\hipGunKickReducedKickBullets\0\hipGunKickReducedKickPercent\0\hipGunKickPitchMin\50\hipGunKickPitchMax\60\hipGunKickYawMin\-30\hipGunKickYawMax\30\hipGunKickAccel\1000\hipGunKickSpeedMax\1200\hipGunKickSpeedDecay\100\hipGunKickStaticDecay\2\adsGunKickReducedKickBullets\0\adsGunKickReducedKickPercent\0\adsGunKickPitchMin\35\adsGunKickPitchMax\45\adsGunKickYawMin\-25\adsGunKickYawMax\25\adsGunKickAccel\260\adsGunKickSpeedMax\600\adsGunKickSpeedDecay\50\adsGunKickStaticDecay\10\hipViewKickPitchMin\95\hipViewKickPitchMax\100\hipViewKickYawMin\-75\hipViewKickYawMax\-85\hipViewKickCenterSpeed\500\adsViewKickPitchMin\95\adsViewKickPitchMax\100\adsViewKickYawMin\-75\adsViewKickYawMax\-85\adsViewKickCenterSpeed\500\swayMaxAngle\20\swayLerpSpeed\4\swayPitchScale\-1\swayYawScale\-1\swayHorizScale\0.3\swayVertScale\0.1\swayShellShockScale\5\adsSwayMaxAngle\2\adsSwayLerpSpeed\6\adsSwayPitchScale\0.1\adsSwayYawScale\0.1\adsSwayHorizScale\0.2\adsSwayVertScale\0.25\fightDist\720\maxDist\680\aiVsAiAccuracyGraph\\aiVsPlayerAccuracyGraph\\reticleCenter\\reticleSide\reticle_side_small\reticleCenterSize\3\reticleSideSize\8\reticleMinOfs\0\hipReticleSidePos\0\adsOverlayShader\\adsOverlayShaderLowRes\\adsOverlayReticle\none\adsOverlayWidth\220\adsOverlayHeight\220\gunModel\viewmodel_winchester1200_mp\gunModel2\viewmodel_winchester1200_mp_brock\gunModel3\viewmodel_winchester1200_mp_bshdwl\gunModel4\viewmodel_winchester1200_mp_bwmrpt\gunModel5\viewmodel_winchester1200_mp_cmdtgr\gunModel6\viewmodel_winchester1200_mp_stagger\gunModel7\\gunModel8\\gunModel9\\gunModel10\\gunModel11\\gunModel12\\gunModel13\\gunModel14\\gunModel15\\gunModel16\\handModel\viewmodel_base_viewhands\worldModel\weapon_winchest1200\worldModel2\weapon_winchest1200_mp_brock\worldModel3\weapon_winchest1200_mp_bshdwl\worldModel4\weapon_winchest1200_mp_bwmrpt\worldModel5\weapon_winchest1200_mp_cmdtgr\worldModel6\weapon_winchest1200_mp_stagger\worldModel7\\worldModel8\\worldModel9\\worldModel10\\worldModel11\\worldModel12\\worldModel13\\worldModel14\\worldModel15\\worldModel16\\worldClipModel\\knifeModel\viewmodel_knife\worldKnifeModel\weapon_parabolic_knife\idleAnim\viewmodel_winchester_idle\emptyIdleAnim\viewmodel_winchester_idle\fireAnim\viewmodel_winchester_fire\lastShotAnim\viewmodel_winchester_fire\rechamberAnim\viewmodel_winchester_rechamber\meleeAnim\viewmodel_M4m203_knife_melee_1\meleeChargeAnim\viewmodel_M4m203_knife_melee_2\reloadAnim\viewmodel_winchester_reload_loop\reloadEmptyAnim\\reloadStartAnim\viewmodel_winchester_reload_intro\reloadEndAnim\viewmodel_winchester_reload_end\raiseAnim\viewmodel_winchester_pullout_quick\dropAnim\viewmodel_winchester_putaway_quick\firstRaiseAnim\viewmodel_winchester_pullout_quick\altRaiseAnim\viewmodel_winchester_pullout_quick\altDropAnim\viewmodel_winchester_putaway_quick\quickRaiseAnim\viewmodel_winchester_pullout_quick\quickDropAnim\viewmodel_winchester_putaway_quick\emptyRaiseAnim\viewmodel_winchester_pullout\emptyDropAnim\viewmodel_winchester_putaway\sprintInAnim\viewmodel_winchester_sprint_in\sprintLoopAnim\viewmodel_winchester_sprint_loop\sprintOutAnim\viewmodel_winchester_sprint_out\nightVisionWearAnim\\nightVisionRemoveAnim\\adsFireAnim\viewmodel_winchester_fire_ads\adsLastShotAnim\viewmodel_winchester_fire\adsRechamberAnim\viewmodel_winchester_rechamber\adsUpAnim\viewmodel_winchester_ADS_up\adsDownAnim\viewmodel_winchester_ADS_down\viewFlashEffect\\worldFlashEffect\\viewShellEjectEffect\shellejects/shotgun_view\worldShellEjectEffect\shellejects/shotgun\viewLastShotEjectEffect\\worldLastShotEjectEffect\\worldClipDropEffect\\pickupSound\weap_pickup\pickupSoundPlayer\weap_pickup\ammoPickupSound\\ammoPickupSoundPlayer\\fireSound\weap_winch1200_fire_npc\fireSoundPlayer\weap_winch1200_fire_plr\lastShotSound\\lastShotSoundPlayer\\emptyFireSound\weap_dryfire_rifle_npc\emptyFireSoundPlayer\weap_dryfire_rifle_plr\meleeSwipeSound\melee_swing_large\meleeSwipeSoundPlayer\melee_winch1200_swing_plr\meleeHitSound\\meleeMissSound\\rechamberSound\weap_winch1200_pump_npc\rechamberSoundPlayer\\reloadSound\weap_winch1200_reload_npc\reloadSoundPlayer\\reloadEmptySound\weap_winch1200_reload_npc\reloadEmptySoundPlayer\\reloadStartSound\\reloadStartSoundPlayer\\reloadEndSound\\reloadEndSoundPlayer\\altSwitchSound\\altSwitchSoundPlayer\\raiseSound\weap_raise\raiseSoundPlayer\weap_raise_plr\firstRaiseSound\\firstRaiseSoundPlayer\\putawaySound\\putawaySoundPlayer\\nightVisionWearSound\\nightVisionWearSoundPlayer\\nightVisionRemoveSound\\nightVisionRemoveSoundPlayer\\hudIcon\hud_icon_winchester_1200\killIcon\hud_icon_winchester_1200\dpadIcon\\ammoCounterIcon\hud_icon_winchester_1200\hudIconRatio\4:1\killIconRatio\4:1\dpadIconRatio\4:1\ammoCounterIconRatio\4:1\ammoCounterClip\Shotgun\flipKillIcon\1\fireRumble\shotgun_fire\meleeImpactRumble\defaultweapon_melee\adsDofStart\0\adsDofEnd\10\hideTags\tag_ak47_mount +tag_reflex_sight +tag_foregrip\notetrackSoundMap\melee_knife_stab melee_knife_stab +weap_winch1200_start_plr weap_winch1200_start_plr +weap_winch1200_loop_plr weap_winch1200_loop_plr +weap_winch1200_end_plr weap_winch1200_end_plr +weap_winch1200_pump_plr weap_winch1200_pump_plr \ No newline at end of file diff --git a/xmodel/com_floodlight_on b/xmodel/com_floodlight_on new file mode 100644 index 0000000000000000000000000000000000000000..dbe0bfda23a6adaac2bb1d8e53d7d6aaf0fb0d22 GIT binary patch literal 95326 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≀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