diff --git a/7za.exe b/7za.exe new file mode 100644 index 0000000..7f6bf86 Binary files /dev/null and b/7za.exe differ diff --git a/End User License Agreement (Release of Map Tools to the Public for Call of Duty 4-PC).doc b/End User License Agreement (Release of Map Tools to the Public for Call of Duty 4-PC).doc new file mode 100644 index 0000000..622976e Binary files /dev/null and b/End User License Agreement (Release of Map Tools to the Public for Call of Duty 4-PC).doc differ 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 0000000..d61f0d5 Binary files /dev/null and b/images/rank_rec1.iwi differ diff --git a/images/rank_sgt1.iwi b/images/rank_sgt1.iwi new file mode 100644 index 0000000..02d8944 Binary files /dev/null and b/images/rank_sgt1.iwi differ 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 0000000..350b93d Binary files /dev/null and b/images/~80s_econ_glass_spc-rgb&80s_e~29444396.iwi differ 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 0000000..5f25952 Binary files /dev/null and b/sound/promod/defused.wav differ diff --git a/sound/promod/destroyed.wav b/sound/promod/destroyed.wav new file mode 100644 index 0000000..b69f67f Binary files /dev/null and b/sound/promod/destroyed.wav differ diff --git a/sound/promod/planted.wav b/sound/promod/planted.wav new file mode 100644 index 0000000..742f423 Binary files /dev/null and b/sound/promod/planted.wav differ diff --git a/soundaliases/promod.csv b/soundaliases/promod.csv new file mode 100644 index 0000000..72a37c9 --- /dev/null +++ b/soundaliases/promod.csv @@ -0,0 +1,4 @@ +name,file,type,dist_min,dist_max,channel,loadspec,startdelay,speakermap +promod_defused,promod/defused.wav,streamed,80,5000,announcer,all_mp,,announcer +promod_destroyed,promod/destroyed.wav,streamed,80,5000,announcer,all_mp,1400,announcer +promod_planted,promod/planted.wav,streamed,80,5000,announcer,all_mp,,announcer \ No newline at end of file diff --git a/ui_mp/cac_ingame.inc b/ui_mp/cac_ingame.inc new file mode 100644 index 0000000..4f77ce0 --- /dev/null +++ b/ui_mp/cac_ingame.inc @@ -0,0 +1,436 @@ +/* + 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 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 0000000..dbe0bfd Binary files /dev/null and b/xmodel/com_floodlight_on differ