Advertisement
Guest User

Untitled

a guest
Jan 31st, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.14 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3. #pragma semicolon 1
  4.  
  5.  
  6. #define PLUGIN_VERSION "0.8.9"
  7. #define TEST_DEBUG 0
  8. #define TEST_DEBUG_LOG 1
  9.  
  10.  
  11. #define PISTOL 1
  12. #define SMG 2
  13. #define PUMPSHOTGUN 3
  14. #define AUTOSHOTGUN 4
  15. #define RIFLE 5
  16. #define HUNTING_RIFLE 6
  17. #define SMG_SILENCED 7
  18. #define SHOTGUN_CHROME 8
  19. #define RIFLE_DESERT 9
  20. #define SNIPER_MILITARY 10
  21. #define SHOTGUN_SPAS 11
  22. #define MOLOTOV 13
  23. #define PIPE_BOMB 14
  24. #define VOMITJAR 25
  25. #define RIFLE_AK47 26
  26. #define PISTOL_MAGNUM 32
  27. #define SMG_MP5 33
  28. #define RIFLE_SG552 34
  29. #define SNIPER_AWP 35
  30. #define SNIPER_SCOUT 36
  31.  
  32.  
  33. static const Float:PLUGINSTART_DELAY = 1.0;
  34. static const Float:ROUNDSTART_DELAY = 6.0;
  35. static const Float:LOCATION_ERROR_MARGIN = 4.0;
  36.  
  37. // chances weapons getting transformed into CSS brethren are 1:X - X being the value set here. 1:1 is 100%, 1:2 is 50%, 1:3 is 33%, 1:4 is 25%, 1:5 is 20%...
  38. static const SG552_LOTTERY_CHANCE = 4;
  39. static const MP5_LOTTERY_CHANCE = 3;
  40. static const AWP_LOTTERY_CHANCE = 2;
  41. static const SCOUT_LOTTERY_CHANCE = 2;
  42.  
  43. // other chances, again in 1:X format
  44. static const PISTOL_IS_MAGNUM_CHANCE = 3;
  45. static const RIFLE_IS_DESERT_ED_CHANCE = 3;
  46. static const GRENADE_KEEPS_CLASS_CHANCE = 3;
  47. static const SPAS_IS_AUTOSHOTGUN_CHANCE = 2;
  48. static const PUMPSHOT_IS_CHROME_CHANCE = 2;
  49. static const SMG_IS_SILENCED_CHANCE = 2;
  50.  
  51.  
  52. static const String:VEC_ORIGIN_ENTPROP[] = "m_vecOrigin";
  53. static const String:ANG_ROTATION_ENTPROP[] = "m_angRotation";
  54. static const String:WEAPON_ID_ENTPROP[] = "m_weaponID";
  55.  
  56.  
  57. static Handle:cvarEnabled = INVALID_HANDLE;
  58. static Handle:cvarAWPEnabled = INVALID_HANDLE;
  59. static Handle:cvarMP5Enabled = INVALID_HANDLE;
  60. static Handle:cvarScoutEnabled = INVALID_HANDLE;
  61. static Handle:cvarSG552Enabled = INVALID_HANDLE;
  62.  
  63. static WeaponSpawn_ID[64] = 0;
  64. static WeaponSpawn_IDMod[64] = 0;
  65. static Float:WeaponOrigin[64][3];
  66. static Float:WeaponAngles[64][3];
  67.  
  68. static bool:InitFinished = false;
  69. //Used to keep spawns the same for both teams on competitive modes.
  70. static bool:g_bNewMap = false;
  71. static bool:g_bScavengeHalftime = false;
  72.  
  73. forward SRS_OnItemsHandled(bool:justIndexed);
  74.  
  75. public Plugin:myinfo =
  76. {
  77. name = "[L4D2] Weapon Unlock",
  78. author = "Crimson_Fox & AtomicStryker",
  79. description = "Unlocks the hidden CSS weapons.",
  80. version = PLUGIN_VERSION,
  81. url = "http://forums.alliedmods.net/showthread.php?p=1041458"
  82. }
  83.  
  84. public OnPluginStart()
  85. {
  86. decl String:game[16];
  87. GetGameFolderName(game, sizeof(game)); //Look up what game we're running, and don't load if it's not L4D2.
  88. if (!StrEqual(game, "left4dead2", false))
  89. {
  90. SetFailState("Plugin supports Left 4 Dead 2 only.");
  91. }
  92.  
  93. //Set up cvars and event hooks.
  94. CreateConVar( "l4d2_WeaponUnlock", PLUGIN_VERSION, "Weapon Unlock version.", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
  95. cvarEnabled = CreateConVar("l4d2_wu_enable", "1", "Is Weapon Unlock plug-in enabled?", FCVAR_PLUGIN|FCVAR_DONTRECORD);
  96. cvarAWPEnabled = CreateConVar("l4d2_wu_awp", "1", "Enable AWP sniper rifle?", FCVAR_PLUGIN);
  97. cvarMP5Enabled = CreateConVar("l4d2_wu_mp5", "1", "Enable MP5 submachine gun?", FCVAR_PLUGIN);
  98. cvarScoutEnabled = CreateConVar("l4d2_wu_scout", "1", "Enable Scout sniper rifle?", FCVAR_PLUGIN);
  99. cvarSG552Enabled = CreateConVar("l4d2_wu_sg552", "1", "Enable SG552 assault rifle?", FCVAR_PLUGIN);
  100.  
  101. AutoExecConfig(true, "l4d2_WeaponUnlock");
  102.  
  103. HookEvent("round_start", Event_RoundStart);
  104. HookEvent("scavenge_round_halftime", Event_ScavengeRoundHalftime);
  105.  
  106. HookConVarChange(cvarEnabled, ConVarChange_Enabled);
  107.  
  108. //Precache hidden weapon models and initialize them after one second.
  109. PrecacheWeaponModels();
  110. CreateTimer(PLUGINSTART_DELAY, InitHiddenWeaponsDelayed);
  111. }
  112.  
  113. public ConVarChange_Enabled(Handle:convar, const String:oldValue[], const String:newValue[])
  114. {
  115. if ((StringToInt(oldValue) == 1) && (StringToInt(newValue) == 0))
  116. {
  117. RestoreWeaponSpawns();
  118. }
  119. if ((StringToInt(oldValue) == 0) && (StringToInt(newValue) == 1))
  120. {
  121. CreateTimer(ROUNDSTART_DELAY, RoundStartDelayed);
  122. }
  123. }
  124.  
  125. public OnMapStart()
  126. {
  127. g_bNewMap = true;
  128. g_bScavengeHalftime = false;
  129. for (new i = 0; i < sizeof(WeaponSpawn_ID); i++)
  130. {
  131. WeaponSpawn_ID[i] = -1;
  132. }
  133. }
  134.  
  135. public Action:Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
  136. {
  137. if (!GetConVarBool(cvarEnabled)) return;
  138. CreateTimer(ROUNDSTART_DELAY, RoundStartDelayed);
  139. }
  140.  
  141. public SRS_OnItemsHandled(bool:justIndexed)
  142. {
  143. DebugPrintToAll("SRS_OnItemsHandled fired, justIndexed: %b", justIndexed);
  144.  
  145. if (!GetConVarBool(cvarEnabled)
  146. || !IsAllowedMap())
  147. {
  148. return;
  149. }
  150.  
  151. if (justIndexed)
  152. {
  153. IndexWeaponSpawns();
  154. }
  155.  
  156. SpawnIndexedWeapons();
  157. }
  158.  
  159. static bool:IsSRSMODactive()
  160. {
  161. new Handle:cvar = FindConVar("srs_remove_enabled");
  162. if (cvar != INVALID_HANDLE)
  163. {
  164. if (GetConVarBool(cvar))
  165. {
  166. return true;
  167. }
  168. }
  169. return false;
  170. }
  171.  
  172. static bool:IsAllowedMap()
  173. {
  174. decl String:GameMode[16];
  175. GetConVarString(FindConVar("mp_gamemode"), GameMode, sizeof(GameMode));
  176.  
  177. decl String:Map[56];
  178. GetCurrentMap(Map, sizeof(Map));
  179. //If we're in a coop mode and running c4m1-4, don't modify spawns as it causes crashes on transitions.
  180. if (
  181. (StrEqual(GameMode, "coop") ||
  182. StrEqual(GameMode, "realism"))
  183. &&
  184. (StrEqual(Map, "c4m1_milltown_a") ||
  185. StrEqual(Map, "c4m2_sugarmill_a") ||
  186. StrEqual(Map, "c4m3_sugarmill_b") ||
  187. StrEqual(Map, "c4m4_milltown_b")))
  188. {
  189. return false;
  190. }
  191.  
  192. return true;
  193. }
  194.  
  195. public Action:RoundStartDelayed(Handle:timer)
  196. {
  197. if (!InitFinished || !IsAllowedMap()) return;
  198.  
  199. if (IsSRSMODactive())
  200. {
  201. DebugPrintToAll("Active srsmod Item Module found, aborting automatic Weapon exchange");
  202. return;
  203. }
  204.  
  205. //Look up the map and type of game we're running.
  206. decl String:GameMode[16];
  207. GetConVarString(FindConVar("mp_gamemode"), GameMode, sizeof(GameMode));
  208.  
  209. if (StrEqual(GameMode, "survival"))
  210. {
  211. return;
  212. }
  213.  
  214. if (StrEqual(GameMode, "scavenge"))
  215. {
  216. if (g_bScavengeHalftime)
  217. {
  218. g_bScavengeHalftime = false;
  219. }
  220. else
  221. {
  222. IndexWeaponSpawns();
  223. }
  224. }
  225.  
  226. //if (StrEqual(GameMode, "versus") || StrEqual(GameMode, "teamversus") || StrEqual(GameMode, "mutation12"))
  227. if (g_bNewMap)
  228. {
  229. IndexWeaponSpawns();
  230. g_bNewMap = false;
  231. }
  232.  
  233. SpawnIndexedWeapons();
  234. }
  235.  
  236. public Action:Event_ScavengeRoundHalftime(Handle:event, const String:name[], bool:dontBroadcast)
  237. {
  238. g_bScavengeHalftime = true;
  239. }
  240.  
  241. static IndexWeaponSpawns()
  242. {
  243. //Search for dynamic weapon spawns,
  244. decl String:EdictClassName[32];
  245. new count = 0;
  246. new entcount = GetEntityCount();
  247. for (new i = 32; i <= entcount; i++)
  248. {
  249. if (IsValidEdict(i))
  250. {
  251. GetEdictClassname(i, EdictClassName, sizeof(EdictClassName));
  252. if (StrEqual(EdictClassName, "weapon_spawn"))
  253. {
  254. //and record their position.
  255. GetEntPropVector(i, Prop_Send, VEC_ORIGIN_ENTPROP, WeaponOrigin[count]);
  256. GetEntPropVector(i, Prop_Send, ANG_ROTATION_ENTPROP, WeaponAngles[count]);
  257. WeaponSpawn_ID[count] = GetEntProp(i, Prop_Send, WEAPON_ID_ENTPROP);
  258.  
  259. DebugPrintToAll("Indexed dynamic %s, spawnid %i, index %i - removing entid %i now", EdictClassName, WeaponSpawn_ID[count], count, i);
  260. RemoveEdict(i);
  261.  
  262. count++;
  263. }
  264. }
  265. }
  266.  
  267. //If dynamic spawns were found, and we're not running scavenge, modify the stored spawns like this:
  268. decl String:GameMode[16];
  269. GetConVarString(FindConVar("mp_gamemode"), GameMode, sizeof(GameMode));
  270. if (!StrEqual(GameMode, "scavenge"))
  271. {
  272. for (new i = 0; i <= count; i++)
  273. {
  274. WeaponSpawn_IDMod[i] = WeaponSpawn_ID[i];
  275. switch(WeaponSpawn_ID[i])
  276. {
  277. case RIFLE_AK47: if ((GetConVarBool(cvarSG552Enabled)) && (GetRandomInt(1, SG552_LOTTERY_CHANCE) == 1)) WeaponSpawn_IDMod[i] = RIFLE_SG552;
  278. case SNIPER_MILITARY: if ((GetConVarBool(cvarAWPEnabled)) && (GetRandomInt(1, AWP_LOTTERY_CHANCE) == 1)) WeaponSpawn_IDMod[i] = SNIPER_AWP;
  279. case RIFLE_DESERT: if ((GetConVarBool(cvarSG552Enabled)) && (GetRandomInt(1, SG552_LOTTERY_CHANCE) == 1)) WeaponSpawn_IDMod[i] = RIFLE_SG552;
  280. case SMG_SILENCED: if ((GetConVarBool(cvarMP5Enabled)) && (GetRandomInt(1, MP5_LOTTERY_CHANCE) == 1)) WeaponSpawn_IDMod[i] = SMG_MP5;
  281. case HUNTING_RIFLE: if ((GetConVarBool(cvarScoutEnabled)) && (GetRandomInt(1, SCOUT_LOTTERY_CHANCE) == 1)) WeaponSpawn_IDMod[i] = SNIPER_SCOUT;
  282. case RIFLE: if ((GetConVarBool(cvarSG552Enabled)) && (GetRandomInt(1, SG552_LOTTERY_CHANCE) == 1)) WeaponSpawn_IDMod[i] = RIFLE_SG552;
  283. case SMG: if ((GetConVarBool(cvarMP5Enabled)) && (GetRandomInt(1, MP5_LOTTERY_CHANCE) == 1)) WeaponSpawn_IDMod[i] = SMG_MP5;
  284. }
  285. }
  286. }
  287. //Otherwise, search for static spawns,
  288. else
  289. {
  290. new dynamiccount = count;
  291.  
  292. for (new i = 32; i <= entcount; i++)
  293. {
  294. if (IsValidEdict(i))
  295. {
  296. GetEdictClassname(i, EdictClassName, sizeof(EdictClassName));
  297. if (IsWantedGunEntity(EdictClassName))
  298. {
  299. //and record their position.
  300. GetEntPropVector(i, Prop_Send, VEC_ORIGIN_ENTPROP, WeaponOrigin[count]);
  301. GetEntPropVector(i, Prop_Send, ANG_ROTATION_ENTPROP, WeaponAngles[count]);
  302. WeaponSpawn_ID[count] = GetEntProp(i, Prop_Send, WEAPON_ID_ENTPROP);
  303.  
  304. DebugPrintToAll("Indexed static %s, spawnid %i, index %i - removing entid %i now", EdictClassName, WeaponSpawn_ID[count], count, i);
  305. RemoveEdict(i);
  306.  
  307. count++;
  308. }
  309. }
  310. }
  311. //and modify them like this:
  312. for (new i = dynamiccount; i <= count; i++)
  313. {
  314. WeaponSpawn_IDMod[i] = WeaponSpawn_ID[i];
  315. switch(WeaponSpawn_ID[i])
  316. {
  317. case PISTOL_MAGNUM:
  318. if (GetRandomInt(1, PISTOL_IS_MAGNUM_CHANCE) == 1)
  319. {
  320. WeaponSpawn_IDMod[i] = PISTOL;
  321. }
  322. case RIFLE_AK47:
  323. if (GetConVarBool(cvarSG552Enabled))
  324. {
  325. switch(GetRandomInt(1, SG552_LOTTERY_CHANCE))
  326. {
  327. case 3: WeaponSpawn_IDMod[i] = RIFLE;
  328. case 2: WeaponSpawn_IDMod[i] = RIFLE_DESERT;
  329. case 1: WeaponSpawn_IDMod[i] = RIFLE_SG552;
  330. }
  331. }
  332. else
  333. {
  334. switch(GetRandomInt(1, RIFLE_IS_DESERT_ED_CHANCE) == 1)
  335. {
  336. case 2: WeaponSpawn_IDMod[i] = RIFLE;
  337. case 1: WeaponSpawn_IDMod[i] = RIFLE_DESERT;
  338. }
  339. }
  340. case VOMITJAR:
  341. switch(GetRandomInt(1, GRENADE_KEEPS_CLASS_CHANCE))
  342. {
  343. case 2: WeaponSpawn_IDMod[i] = PIPE_BOMB;
  344. case 1: WeaponSpawn_IDMod[i] = MOLOTOV;
  345. }
  346. case PIPE_BOMB:
  347. switch(GetRandomInt(1, GRENADE_KEEPS_CLASS_CHANCE))
  348. {
  349. case 2: WeaponSpawn_IDMod[i] = MOLOTOV;
  350. case 1: WeaponSpawn_IDMod[i] = VOMITJAR;
  351. }
  352. case MOLOTOV:
  353. switch(GetRandomInt(1, GRENADE_KEEPS_CLASS_CHANCE))
  354. {
  355. case 2: WeaponSpawn_IDMod[i] = VOMITJAR;
  356. case 1: WeaponSpawn_IDMod[i] = PIPE_BOMB;
  357. }
  358. case SHOTGUN_SPAS:
  359. if (GetRandomInt(1, SPAS_IS_AUTOSHOTGUN_CHANCE) == 1)
  360. {
  361. WeaponSpawn_IDMod[i] = AUTOSHOTGUN;
  362. }
  363. case SNIPER_MILITARY:
  364. if ((GetConVarBool(cvarAWPEnabled)) && (GetRandomInt(1, AWP_LOTTERY_CHANCE) == 1))
  365. {
  366. WeaponSpawn_IDMod[i] = SNIPER_AWP;
  367. }
  368. case RIFLE_DESERT:
  369. if (GetConVarBool(cvarSG552Enabled))
  370. {
  371. switch(GetRandomInt(1, SG552_LOTTERY_CHANCE))
  372. {
  373. case 3: WeaponSpawn_IDMod[i] = RIFLE;
  374. case 2: WeaponSpawn_IDMod[i] = RIFLE_AK47;
  375. case 1: WeaponSpawn_IDMod[i] = RIFLE_SG552;
  376. }
  377. }
  378. else
  379. {
  380. switch(GetRandomInt(1, RIFLE_IS_DESERT_ED_CHANCE) == 1)
  381. {
  382. case 2: WeaponSpawn_IDMod[i] = RIFLE;
  383. case 1: WeaponSpawn_IDMod[i] = RIFLE_AK47;
  384. }
  385. }
  386. case SHOTGUN_CHROME:
  387. if (GetRandomInt(1, PUMPSHOT_IS_CHROME_CHANCE) == 1)
  388. {
  389. WeaponSpawn_IDMod[i] = PUMPSHOTGUN;
  390. }
  391. case SMG_SILENCED:
  392. if (GetConVarBool(cvarMP5Enabled))
  393. {
  394. switch(GetRandomInt(1, MP5_LOTTERY_CHANCE))
  395. {
  396. case 2: WeaponSpawn_IDMod[i] = SMG;
  397. case 1: WeaponSpawn_IDMod[i] = SMG_MP5;
  398. }
  399. }
  400. else if (GetRandomInt(1, SMG_IS_SILENCED_CHANCE) == 1)
  401. {
  402. WeaponSpawn_IDMod[i] = SMG;
  403. }
  404. //Since the hunting rifle is a T1 weapon in L4D2, we'll upgrade it to a T2 sniper rifle for L4D1 maps.
  405. case HUNTING_RIFLE:
  406. if (GetConVarBool(cvarAWPEnabled))
  407. {
  408. switch(GetRandomInt(1, AWP_LOTTERY_CHANCE))
  409. {
  410. case 2: WeaponSpawn_IDMod[i] = SNIPER_MILITARY;
  411. case 1: WeaponSpawn_IDMod[i] = SNIPER_AWP;
  412. }
  413. }
  414. else WeaponSpawn_IDMod[i] = SNIPER_MILITARY;
  415. case RIFLE:
  416. if (GetConVarBool(cvarSG552Enabled))
  417. {
  418. switch(GetRandomInt(1, SG552_LOTTERY_CHANCE))
  419. {
  420. case 3: WeaponSpawn_IDMod[i] = RIFLE_AK47;
  421. case 2: WeaponSpawn_IDMod[i] = RIFLE_DESERT;
  422. case 1: WeaponSpawn_IDMod[i] = RIFLE_SG552;
  423. }
  424. }
  425. else
  426. {
  427. switch(GetRandomInt(1, RIFLE_IS_DESERT_ED_CHANCE) == 1)
  428. {
  429. case 2: WeaponSpawn_IDMod[i] = RIFLE_AK47;
  430. case 1: WeaponSpawn_IDMod[i] = RIFLE_DESERT;
  431. }
  432. }
  433. case AUTOSHOTGUN:
  434. if (GetRandomInt(1, SPAS_IS_AUTOSHOTGUN_CHANCE) == 1)
  435. {
  436. WeaponSpawn_IDMod[i] = SHOTGUN_SPAS;
  437. }
  438. case PUMPSHOTGUN:
  439. if (GetRandomInt(1, PUMPSHOT_IS_CHROME_CHANCE) == 1)
  440. {
  441. WeaponSpawn_IDMod[i] = SHOTGUN_CHROME;
  442. }
  443. case SMG:
  444. if (GetConVarBool(cvarMP5Enabled))
  445. {
  446. switch(GetRandomInt(1, MP5_LOTTERY_CHANCE))
  447. {
  448. case 2: WeaponSpawn_IDMod[i] = SMG_SILENCED;
  449. case 1: WeaponSpawn_IDMod[i] = SMG_MP5;
  450. }
  451. }
  452. else if (GetRandomInt(1, SMG_IS_SILENCED_CHANCE) == 1)
  453. {
  454. WeaponSpawn_IDMod[i] = SMG_SILENCED;
  455. }
  456. case PISTOL:
  457. if (GetRandomInt(1, PISTOL_IS_MAGNUM_CHANCE) == 1)
  458. {
  459. WeaponSpawn_IDMod[i] = PISTOL_MAGNUM;
  460. }
  461. }
  462. }
  463. }
  464. }
  465.  
  466. static SetModelForWeaponId(weaponent, id)
  467. {
  468. switch(id)
  469. {
  470. case SNIPER_SCOUT: SetEntityModel(weaponent, "models/w_models/weapons/w_sniper_scout.mdl");
  471. case SNIPER_AWP: SetEntityModel(weaponent, "models/w_models/weapons/w_sniper_awp.mdl");
  472. case RIFLE_SG552: SetEntityModel(weaponent, "models/w_models/weapons/w_rifle_sg552.mdl");
  473. case SMG_MP5: SetEntityModel(weaponent, "models/w_models/weapons/w_smg_mp5.mdl");
  474. case PISTOL_MAGNUM: SetEntityModel(weaponent, "models/w_models/weapons/w_desert_eagle.mdl");
  475. case RIFLE_AK47: SetEntityModel(weaponent, "models/w_models/weapons/w_rifle_ak47.mdl");
  476. case VOMITJAR: SetEntityModel(weaponent, "models/w_models/weapons/w_eq_bile_flask.mdl");
  477. case PIPE_BOMB: SetEntityModel(weaponent, "models/w_models/weapons/w_eq_pipebomb.mdl");
  478. case MOLOTOV: SetEntityModel(weaponent, "models/w_models/weapons/w_eq_molotov.mdl");
  479. case SHOTGUN_SPAS: SetEntityModel(weaponent, "models/w_models/weapons/w_shotgun_spas.mdl");
  480. case SNIPER_MILITARY: SetEntityModel(weaponent, "models/w_models/weapons/w_sniper_military.mdl");
  481. case RIFLE_DESERT: SetEntityModel(weaponent, "models/w_models/weapons/w_desert_rifle.mdl");
  482. case SHOTGUN_CHROME: SetEntityModel(weaponent, "models/w_models/weapons/w_pumpshotgun_a.mdl");
  483. case SMG_SILENCED: SetEntityModel(weaponent, "models/w_models/weapons/w_smg_a.mdl");
  484. case HUNTING_RIFLE: SetEntityModel(weaponent, "models/w_models/weapons/w_sniper_mini14.mdl");
  485. case RIFLE: SetEntityModel(weaponent, "models/w_models/weapons/w_rifle_m16a2.mdl");
  486. case AUTOSHOTGUN: SetEntityModel(weaponent, "models/w_models/weapons/w_autoshot_m4super.mdl");
  487. case PUMPSHOTGUN: SetEntityModel(weaponent, "models/w_models/weapons/w_shotgun.mdl");
  488. case SMG: SetEntityModel(weaponent, "models/w_models/weapons/w_smg_uzi.mdl");
  489. case PISTOL: SetEntityModel(weaponent, "models/w_models/weapons/w_pistol_a.mdl");
  490. }
  491. }
  492.  
  493. static SpawnIndexedWeapons()
  494. {
  495. PrecacheWeaponModels();
  496. WipeStoredWeapons();
  497.  
  498. DebugPrintToAll("Commencing to spawn indexed weapons now");
  499.  
  500. new spawnedent;
  501.  
  502. for (new i = 0; i < sizeof(WeaponSpawn_ID); i++)
  503. {
  504. if (WeaponSpawn_ID[i] == -1) break;
  505.  
  506. spawnedent = CreateEntityByName("weapon_spawn");
  507. SetModelForWeaponId(spawnedent, WeaponSpawn_IDMod[i]);
  508. SetEntProp(spawnedent, Prop_Send, WEAPON_ID_ENTPROP, WeaponSpawn_IDMod[i]);
  509. TeleportEntity(spawnedent, WeaponOrigin[i], WeaponAngles[i], NULL_VECTOR);
  510.  
  511. if (
  512. WeaponSpawn_IDMod[i] == VOMITJAR ||
  513. WeaponSpawn_IDMod[i] == PIPE_BOMB ||
  514. WeaponSpawn_IDMod[i] == MOLOTOV)
  515. {
  516. DispatchKeyValue(spawnedent, "count", "1");
  517. }
  518. else
  519. {
  520. DispatchKeyValue(spawnedent, "count", "4");
  521. }
  522.  
  523. DebugPrintToAll("Spawning indexed gun %i, new ent %i, original id %i, modid %i", i, spawnedent, WeaponSpawn_ID[i], WeaponSpawn_IDMod[i]);
  524. DispatchSpawn(spawnedent);
  525. }
  526.  
  527. DebugPrintToAll("Finished Spawning indexed weapons");
  528. }
  529.  
  530. static WipeStoredWeapons()
  531. {
  532. DebugPrintToAll("WipeStoredWeapons() was called. Removing stored Weapon Spawns on map");
  533.  
  534. decl String:GameMode[16];
  535. GetConVarString(FindConVar("mp_gamemode"), GameMode, sizeof(GameMode));
  536. new bool:wipestaticspawns = (StrEqual(GameMode, "scavenge"));
  537. if (wipestaticspawns) DebugPrintToAll("Gamemode is Scavenge, also wiping static Spawns");
  538.  
  539. new entcount = GetEntityCount();
  540. decl String:EdictClassName[64];
  541. decl Float:origin[3];
  542.  
  543. for (new i = 32; i <= entcount; i++)
  544. {
  545. if (IsValidEdict(i) && IsValidEntity(i)) // because people still got me logs of "Is invalid edict" after IsValidEdict ... WTFFFF
  546. {
  547. GetEdictClassname(i, EdictClassName, sizeof(EdictClassName));
  548. if (StrEqual(EdictClassName, "weapon_spawn") || (wipestaticspawns && IsWantedGunEntity(EdictClassName)))
  549. {
  550. GetEntPropVector(i, Prop_Send, VEC_ORIGIN_ENTPROP, origin);
  551. if (IsIndexedOrigin(origin))
  552. {
  553. DebugPrintToAll("WipeStoredWeapons: About to wipe ent %i of class %s", i, EdictClassName);
  554. RemoveEdict(i);
  555. }
  556. }
  557. }
  558. }
  559. }
  560.  
  561. static bool:IsIndexedOrigin(Float:origin[3])
  562. {
  563. for (new i = 0; i < sizeof(WeaponSpawn_ID); i++)
  564. {
  565. if (WeaponSpawn_ID[i] == -1) break;
  566.  
  567. if (origin[0] >= WeaponOrigin[i][0] - LOCATION_ERROR_MARGIN && origin[0] <= WeaponOrigin[i][0] + LOCATION_ERROR_MARGIN
  568. && origin[1] >= WeaponOrigin[i][1] - LOCATION_ERROR_MARGIN && origin[1] <= WeaponOrigin[i][1] + LOCATION_ERROR_MARGIN
  569. && origin[2] >= WeaponOrigin[i][2] - LOCATION_ERROR_MARGIN && origin[2] <= WeaponOrigin[i][2] + LOCATION_ERROR_MARGIN)
  570. {
  571. return true;
  572. }
  573. }
  574. return false;
  575. }
  576.  
  577. static bool:IsWantedGunEntity(const String:EdictClassName[])
  578. {
  579. return (
  580. StrEqual(EdictClassName, "weapon_spawn") ||
  581. StrEqual(EdictClassName, "weapon_autoshotgun_spawn") ||
  582. StrEqual(EdictClassName, "weapon_hunting_rifle_spawn") ||
  583. StrEqual(EdictClassName, "weapon_molotov_spawn") ||
  584. StrEqual(EdictClassName, "weapon_pipe_bomb_spawn") ||
  585. StrEqual(EdictClassName, "weapon_pistol_magnum_spawn") ||
  586. StrEqual(EdictClassName, "weapon_pistol_spawn") ||
  587. StrEqual(EdictClassName, "weapon_pumpshotgun_spawn") ||
  588. StrEqual(EdictClassName, "weapon_rifle_ak47_spawn") ||
  589. StrEqual(EdictClassName, "weapon_rifle_desert_spawn") ||
  590. StrEqual(EdictClassName, "weapon_rifle_spawn") ||
  591. StrEqual(EdictClassName, "weapon_shotgun_chrome_spawn") ||
  592. StrEqual(EdictClassName, "weapon_shotgun_spas_spawn") ||
  593. StrEqual(EdictClassName, "weapon_smg_spawn") ||
  594. StrEqual(EdictClassName, "weapon_smg_silenced_spawn") ||
  595. StrEqual(EdictClassName, "weapon_sniper_military_spawn") ||
  596. StrEqual(EdictClassName, "weapon_vomitjar_spawn"));
  597. }
  598.  
  599. static RestoreWeaponSpawns()
  600. {
  601. WipeStoredWeapons();
  602.  
  603. DebugPrintToAll("Commencing to restore default indexed weapons now");
  604.  
  605. new spawnedent;
  606.  
  607. for (new i = 0; i < sizeof(WeaponSpawn_ID); i++)
  608. {
  609. if (WeaponSpawn_ID[i] == -1) break;
  610.  
  611. spawnedent = CreateEntityByName("weapon_spawn");
  612. SetModelForWeaponId(spawnedent, WeaponSpawn_ID[i]);
  613. SetEntProp(spawnedent, Prop_Send, WEAPON_ID_ENTPROP, WeaponSpawn_ID[i]);
  614. TeleportEntity(spawnedent, WeaponOrigin[i], WeaponAngles[i], NULL_VECTOR);
  615.  
  616. if (
  617. WeaponSpawn_IDMod[i] == VOMITJAR ||
  618. WeaponSpawn_IDMod[i] == PIPE_BOMB ||
  619. WeaponSpawn_IDMod[i] == MOLOTOV)
  620. {
  621. DispatchKeyValue(spawnedent, "count", "1");
  622. }
  623. else
  624. {
  625. DispatchKeyValue(spawnedent, "count", "4");
  626. }
  627.  
  628. DebugPrintToAll("Spawning default indexed gun %i, new ent %i, original id %i, unused modid %i", i, spawnedent, WeaponSpawn_ID[i], WeaponSpawn_IDMod[i]);
  629. DispatchSpawn(spawnedent);
  630. }
  631.  
  632. DebugPrintToAll("Finished Spawning default indexed weapons");
  633. }
  634.  
  635. static PrecacheWeaponModels()
  636. {
  637. //Precache weapon models if they're not loaded.
  638. CheckModelPreCache("models/w_models/weapons/w_rifle_sg552.mdl");
  639. CheckModelPreCache("models/w_models/weapons/w_smg_mp5.mdl");
  640. CheckModelPreCache("models/w_models/weapons/w_sniper_awp.mdl");
  641. CheckModelPreCache("models/w_models/weapons/w_sniper_scout.mdl");
  642. CheckModelPreCache("models/w_models/weapons/w_eq_bile_flask.mdl");
  643. CheckModelPreCache("models/v_models/v_rif_sg552.mdl");
  644. CheckModelPreCache("models/v_models/v_smg_mp5.mdl");
  645. CheckModelPreCache("models/v_models/v_snip_awp.mdl");
  646. CheckModelPreCache("models/v_models/v_snip_scout.mdl");
  647. CheckModelPreCache("models/v_models/v_bile_flask.mdl");
  648. CheckModelPreCache("models/w_models/weapons/w_m60.mdl");
  649. CheckModelPreCache("models/v_models/v_m60.mdl");
  650. }
  651.  
  652. stock CheckModelPreCache(const String:Modelfile[])
  653. {
  654. if (!IsModelPrecached(Modelfile))
  655. {
  656. PrecacheModel(Modelfile);
  657. }
  658. }
  659.  
  660. public Action:InitHiddenWeaponsDelayed(Handle:timer, any:client)
  661. {
  662. //Spawn and delete the hidden weapons,
  663. PreCacheGun("weapon_rifle_sg552");
  664. PreCacheGun("weapon_smg_mp5");
  665. PreCacheGun("weapon_sniper_awp");
  666. PreCacheGun("weapon_sniper_scout");
  667. PreCacheGun("weapon_rifle_m60");
  668.  
  669. InitFinished = true;
  670. decl String:Map[56];
  671. GetCurrentMap(Map, sizeof(Map));
  672. ForceChangeLevel(Map, "Hidden weapon initialization.");
  673. }
  674.  
  675. static PreCacheGun(const String:GunEntity[])
  676. {
  677. new index = CreateEntityByName(GunEntity);
  678. DispatchSpawn(index);
  679. RemoveEdict(index);
  680. }
  681.  
  682. stock DebugPrintToAll(const String:format[], any:...)
  683. {
  684. #if (TEST_DEBUG || TEST_DEBUG_LOG)
  685. decl String:buffer[256];
  686.  
  687. VFormat(buffer, sizeof(buffer), format, 2);
  688.  
  689. #if TEST_DEBUG
  690. PrintToChatAll("[GUNUNLOCK] %s", buffer);
  691. PrintToConsole(0, "[GUNUNLOCK] %s", buffer);
  692. #endif
  693.  
  694. LogMessage("%s", buffer);
  695. #else
  696. //suppress "format" never used warning
  697. if(format[0])
  698. return;
  699. else
  700. return;
  701. #endif
  702. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement