Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 84.32 KB | None | 0 0
  1. /*
  2. Base Builder Zombie Mod
  3. Tirant
  4.  
  5. Version 6.5 Pub
  6. */
  7.  
  8. #include <amxmodx>
  9. #include <amxmisc>
  10. #include <credits>
  11. #include <cstrike>
  12. #include <fun>
  13. #include <hamsandwich>
  14. #include <fakemeta>
  15. #include <engine>
  16. #include <csx>
  17.  
  18. //Enable this only if you have bought the credits plugin
  19. //#define BB_CREDITS
  20.  
  21. #define FLAGS_BUILD ADMIN_IMMUNITY
  22. #define FLAGS_LOCK ADMIN_LEVEL_A
  23. #define FLAGS_BUILDBAN ADMIN_KICK
  24. #define FLAGS_SWAP ADMIN_KICK
  25. #define FLAGS_REVIVE ADMIN_LEVEL_B
  26. #define FLAGS_GUNS ADMIN_LEVEL_A
  27. #define FLAGS_RELEASE ADMIN_BAN
  28. #define FLAGS_OVERRIDE ADMIN_LEVEL_A
  29.  
  30. #define VERSION ""
  31. #define MODNAME "^x01 [^x04 PerfectList^x01 ]"
  32.  
  33. #define LockBlock(%1,%2) ( entity_set_int( %1, EV_INT_iuser1, %2 ) )
  34. #define UnlockBlock(%1) ( entity_set_int( %1, EV_INT_iuser1, 0 ) )
  35. #define BlockLocker(%1) ( entity_get_int( %1, EV_INT_iuser1 ) )
  36.  
  37. #define MovingEnt(%1) ( entity_set_int( %1, EV_INT_iuser2, 1 ) )
  38. #define UnmovingEnt(%1) ( entity_set_int( %1, EV_INT_iuser2, 0 ) )
  39. #define IsMovingEnt(%1) ( entity_get_int( %1, EV_INT_iuser2 ) == 1 )
  40.  
  41. #define SetEntMover(%1,%2) ( entity_set_int( %1, EV_INT_iuser3, %2 ) )
  42. #define UnsetEntMover(%1) ( entity_set_int( %1, EV_INT_iuser3, 0 ) )
  43. #define GetEntMover(%1) ( entity_get_int( %1, EV_INT_iuser3 ) )
  44.  
  45. #define SetLastMover(%1,%2) ( entity_set_int( %1, EV_INT_iuser4, %2 ) )
  46. #define UnsetLastMover(%1) ( entity_set_int( %1, EV_INT_iuser4, 0 ) )
  47. #define GetLastMover(%1) ( entity_get_int( %1, EV_INT_iuser4 ) )
  48.  
  49. #define MAXPLAYERS 32
  50. #define MAXENTS 1024
  51. #define AMMO_SLOT 376
  52. #define MODELCHANGE_DELAY 0.5
  53. #define AUTO_TEAM_JOIN_DELAY 0.1
  54. #define TEAM_SELECT_VGUI_MENU_ID 2
  55. #define OBJECT_PUSHPULLRATE 4.0
  56. #define HUD_FRIEND_HEIGHT 0.30
  57.  
  58. #define BARRIER_COLOR 0.0, 0.0, 0.0
  59. #define BARRIER_RENDERAMT 150.0
  60.  
  61. #define BLOCK_RENDERAMT 150.0
  62.  
  63. #define LOCKED_COLOR 125.0, 0.0, 0.0
  64. #define LOCKED_RENDERAMT 225.0
  65.  
  66. const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)
  67. #define OFFSET_WPN_WIN 41
  68. #define OFFSET_WPN_LINUX 4
  69.  
  70. #define OFFSET_ACTIVE_ITEM 373
  71. #define OFFSET_LINUX 5
  72.  
  73. #if cellbits == 32
  74. #define OFFSET_BUYZONE 235
  75. #else
  76. #define OFFSET_BUYZONE 268
  77. #endif
  78.  
  79. new g_iMaxPlayers
  80. new g_msgSayText, g_msgStatusText
  81. new g_HudSync
  82.  
  83. new g_isConnected[MAXPLAYERS+1]
  84. new g_isAlive[MAXPLAYERS+1]
  85. new g_isZombie[MAXPLAYERS+1]
  86. new g_isBuildBan[MAXPLAYERS+1]
  87. new g_isCustomModel[MAXPLAYERS+1]
  88.  
  89. enum (+= 5000)
  90. {
  91. TASK_BUILD = 10000,
  92. TASK_PREPTIME,
  93. TASK_MODELSET,
  94. TASK_RESPAWN,
  95. TASK_HEALTH,
  96. TASK_IDLESOUND
  97. }
  98.  
  99. //Custom Sounds
  100. new g_szRoundStart[][] =
  101. {
  102. "basebuilder/round_start.wav",
  103. "basebuilder/round_start2.wav"
  104. }
  105.  
  106. #define WIN_ZOMBIES "basebuilderen/win_zombies2.wav"
  107. #define WIN_BUILDERS "basebuilderen/win_builders2.wav"
  108.  
  109. #define PHASE_PREP "basebuilderen/phase_prep3.wav"
  110. #define PHASE_BUILD "basebuilderen/phase_build3.wav"
  111.  
  112. #define LOCK_OBJECT "buttons/lightswitch2.wav"
  113. #define LOCK_FAIL "buttons/button10.wav"
  114.  
  115. #define GRAB_START "basebuilderen/block_grab.wav"
  116. #define GRAB_STOP "basebuilderen/block_drop.wav"
  117.  
  118. #define INFECTION "basebuilderen/zombie_kill1.wav"
  119. #define INFECTION2 "basebuilderen/zombie_kill2.wav"
  120. #define INFECTION3 "basebuilderen/zombie_kill3.wav"
  121.  
  122. new const g_szZombiePain[][] =
  123. {
  124. "basebuilderen/zombie/pain/pain1.wav",
  125. "basebuilderen/zombie/pain/pain2.wav",
  126. "basebuilderen/zombie/pain/pain3.wav"
  127. }
  128.  
  129. new const g_szZombieDie[][] =
  130. {
  131. "basebuilderen/zombie/death/death1.wav",
  132. "basebuilderen/zombie/death/death2.wav",
  133. "basebuilderen/zombie/death/death3.wav"
  134. }
  135.  
  136. new const g_szZombieIdle[][] =
  137. {
  138. "basebuilderen/zombie/idle/idle1.wav",
  139. "basebuilderen/zombie/idle/idle2.wav",
  140. "basebuilderen/zombie/idle/idle3.wav"
  141. }
  142.  
  143. new const g_szZombieHit[][] =
  144. {
  145. "basebuilderen/zombie/hit/hit1.wav",
  146. "basebuilderen/zombie/hit/hit1.wav",
  147. "basebuilderen/zombie/hit/hit1.wav"
  148. }
  149.  
  150. new const g_szZombieMiss[][] =
  151. {
  152. "basebuilderen/zombie/miss/miss1.wav",
  153. "basebuilderen/zombie/miss/miss2.wav",
  154. "basebuilderen/zombie/miss/miss3.wav"
  155. }
  156.  
  157. //Custom Player Models
  158. new Float:g_fModelsTargetTime, Float:g_fRoundStartTime
  159. new g_szPlayerModel[MAXPLAYERS+1][32]
  160.  
  161. //Game Name
  162. new g_szModName[32]
  163.  
  164. new g_iCountDown, g_iEntBarrier
  165. new bool:g_boolCanBuild, bool:g_boolPrepTime, bool:g_boolRoundEnded
  166. new g_iFriend[MAXPLAYERS+1]
  167. new CsTeams:g_iTeam[MAXPLAYERS+1], CsTeams:g_iCurTeam[MAXPLAYERS+1]
  168. new bool:g_boolFirstTeam[MAXPLAYERS+1]
  169.  
  170. //Building Stores
  171. new Float:g_fOffset1[MAXPLAYERS+1], Float:g_fOffset2[MAXPLAYERS+1], Float:g_fOffset3[MAXPLAYERS+1]
  172. new g_iOwnedEnt[MAXPLAYERS+1], g_iOwnedEntities[MAXPLAYERS+1]
  173. new Float:g_fEntDist[MAXPLAYERS+1]
  174.  
  175. static const g_szWpnEntNames[][] = { "", "weapon_hegrenade", "weapon_c4",
  176. "weapon_aug", "weapon_awp", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven",
  177. "weapon_galil", "weapon_usp", "weapon_glock18",
  178. "weapon_m4a1", "weapon_flashbang", "weapon_deagle",
  179. "weapon_ak47", "weapon_knife"}
  180.  
  181. //Weapon Names (For Guns Menu)
  182. static const szWeaponNames[24][23] = { "Schmidt Scout", "XM1014 M4", "Ingram MAC-10", "Steyr AUG A1", "UMP 45", "SG-550 Auto-Sniper",
  183. "IMI Galil", "Famas", "AWP Magnum Sniper", "MP5 Navy", "M249 Para Machinegun", "M3 Super 90", "M4A1 Carbine",
  184. "Schmidt TMP", "G3SG1 Auto-Sniper", "SG-552 Commando", "AK-47 Kalashnikov", "ES P90", "P228 Compact",
  185. "Dual Elite Berettas", "Fiveseven", "USP .45 ACP Tactical", "Glock 18C", "Desert Eagle .50 AE" }
  186.  
  187. #define MAX_COLORS 24
  188. new const Float:g_fColor[MAX_COLORS][3] =
  189. {
  190. {200.0, 000.0, 000.0},
  191. {255.0, 083.0, 073.0},
  192. {255.0, 117.0, 056.0},
  193. {255.0, 174.0, 066.0},
  194. {255.0, 207.0, 171.0},
  195. {252.0, 232.0, 131.0},
  196. {254.0, 254.0, 034.0},
  197. {059.0, 176.0, 143.0},
  198. {197.0, 227.0, 132.0},
  199. {000.0, 150.0, 000.0},
  200. {120.0, 219.0, 226.0},
  201. {135.0, 206.0, 235.0},
  202. {128.0, 218.0, 235.0},
  203. {000.0, 000.0, 255.0},
  204. {146.0, 110.0, 174.0},
  205. {255.0, 105.0, 180.0},
  206. {246.0, 100.0, 175.0},
  207. {205.0, 074.0, 076.0},
  208. {250.0, 167.0, 108.0},
  209. {234.0, 126.0, 093.0},
  210. {180.0, 103.0, 077.0},
  211. {149.0, 145.0, 140.0},
  212. {000.0, 000.0, 000.0},
  213. {255.0, 255.0, 255.0}
  214. }
  215.  
  216. new const Float:g_fRenderAmt[MAX_COLORS] =
  217. {
  218. 100.0, //Red
  219. 135.0, //Red Orange
  220. 140.0, //Orange
  221. 120.0, //Yellow Orange
  222. 140.0, //Peach
  223. 125.0, //Yellow
  224. 100.0, //Lemon Yellow
  225. 125.0, //Jungle Green
  226. 135.0, //Yellow Green
  227. 100.0, //Green
  228. 125.0, //Aquamarine
  229. 150.0, //Baby Blue
  230. 090.0, //Sky Blue
  231. 075.0, //Blue
  232. 175.0, //Violet
  233. 150.0, //Hot Pink
  234. 175.0, //Magenta
  235. 140.0, //Mahogany
  236. 140.0, //Tan
  237. 140.0, //Light Brown
  238. 165.0, //Brown
  239. 175.0, //Gray
  240. 125.0, //Black
  241. 125.0 //White
  242. }
  243.  
  244. new const g_szColorName[MAX_COLORS][] =
  245. {
  246. "Red",
  247. "Red Orange",
  248. "Orange",
  249. "Yellow Orange",
  250. "Peach",
  251. "Yellow",
  252. "Lemon Yellow",
  253. "Jungle Green",
  254. "Yellow Green",
  255. "Green",
  256. "Aquamarine",
  257. "Baby Blue",
  258. "Sky Blue",
  259. "Blue",
  260. "Violet",
  261. "Hot Pink",
  262. "Magenta",
  263. "Mahogany",
  264. "Tan",
  265. "Light Brown",
  266. "Brown",
  267. "Gray",
  268. "Black",
  269. "White"
  270. }
  271.  
  272. enum
  273. {
  274. COLOR_RED = 0, //200, 000, 000
  275. COLOR_REDORANGE, //255, 083, 073
  276. COLOR_ORANGE, //255, 117, 056
  277. COLOR_YELLOWORANGE, //255, 174, 066
  278. COLOR_PEACH, //255, 207, 171
  279. COLOR_YELLOW, //252, 232, 131
  280. COLOR_LEMONYELLOW, //254, 254, 034
  281. COLOR_JUNGLEGREEN, //059, 176, 143
  282. COLOR_YELLOWGREEN, //197, 227, 132
  283. COLOR_GREEN, //000, 200, 000
  284. COLOR_AQUAMARINE, //120, 219, 226
  285. COLOR_BABYBLUE, //135, 206, 235
  286. COLOR_SKYBLUE, //128, 218, 235
  287. COLOR_BLUE, //000, 000, 200
  288. COLOR_VIOLET, //146, 110, 174
  289. COLOR_PINK, //255, 105, 180
  290. COLOR_MAGENTA, //246, 100, 175
  291. COLOR_MAHOGANY, //205, 074, 076
  292. COLOR_TAN, //250, 167, 108
  293. COLOR_LIGHTBROWN, //234, 126, 093
  294. COLOR_BROWN, //180, 103, 077
  295. COLOR_GRAY, //149, 145, 140
  296. COLOR_BLACK, //000, 000, 000
  297. COLOR_WHITE //255, 255, 255
  298. }
  299.  
  300. new g_iColor[MAXPLAYERS+1]
  301. new g_iColorOwner[MAX_COLORS]
  302.  
  303. //Color Menu
  304. new g_iMenuOffset[MAXPLAYERS+1], g_iMenuOptions[MAXPLAYERS+1][8], g_iWeaponPicked[2][MAXPLAYERS+1],
  305. g_iPrimaryWeapon[MAXPLAYERS+1]
  306.  
  307. new bool:g_boolFirstTime[MAXPLAYERS+1], bool:g_boolRepick[MAXPLAYERS+1]
  308.  
  309. new Float:g_fBuildDelay[MAXPLAYERS+1]
  310. #define BUILD_DELAY 0.75
  311.  
  312. #define KEYS_GENERIC (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)
  313.  
  314. enum
  315. {
  316. ATT_HEALTH = 0,
  317. ATT_SPEED,
  318. ATT_GRAVITY
  319. }
  320.  
  321. //Zombie Classes
  322. new g_iZClasses
  323. new g_iZombieClass[MAXPLAYERS+1]
  324. new bool:g_boolFirstSpawn[MAXPLAYERS+1]
  325. new g_szPlayerClass[MAXPLAYERS+1][32]
  326. new g_iNextClass[MAXPLAYERS+1]
  327. new Float:g_fPlayerSpeed[MAXPLAYERS+1]
  328. new bool:g_boolArraysCreated
  329. new Array:g_zclass_name
  330. new Array:g_zclass_info
  331. new Array:g_zclass_modelsstart // start position in models array
  332. new Array:g_zclass_modelsend // end position in models array
  333. new Array:g_zclass_playermodel // player models array
  334. new Array:g_zclass_modelindex // model indices array
  335. new Array:g_zclass_clawmodel
  336. new Array:g_zclass_hp
  337. new Array:g_zclass_spd
  338. new Array:g_zclass_grav
  339. new Array:g_zclass_admin
  340. new Array:g_zclass_credits
  341. //new Float:g_fClassMultiplier[MAXPLAYERS+1][3]
  342.  
  343. new Array:g_zclass2_realname, Array:g_zclass2_name, Array:g_zclass2_info,
  344. Array:g_zclass2_modelsstart, Array:g_zclass2_modelsend, Array:g_zclass2_playermodel,
  345. Array:g_zclass2_clawmodel, Array:g_zclass2_hp, Array:g_zclass2_spd,
  346. Array:g_zclass2_grav, Array:g_zclass2_admin, Array:g_zclass2_credits, Array:g_zclass_new
  347.  
  348. //Forwards
  349. new g_fwRoundStart, g_fwPrepStarted, g_fwBuildStarted, g_fwClassPicked, g_fwClassSet,
  350. g_fwPushPull, g_fwGrabEnt_Pre, g_fwGrabEnt_Post, g_fwDropEnt_Pre,
  351. g_fwDropEnt_Post, g_fwNewColor, g_fwLockEnt_Pre, g_fwLockEnt_Post, g_fwDummyResult
  352.  
  353. //Cvars
  354. new g_pcvar_buildtime, g_iBuildTime,
  355. g_pcvar_preptime, g_iPrepTime,
  356. g_pcvar_givenades, g_iGrenadeHE, g_iGrenadeFLASH, g_iGrenadeSMOKE,
  357. g_pcvar_entmindist, Float: g_fEntMinDist,
  358. g_pcvar_entsetdist, Float: g_fEntSetDist,
  359. g_pcvar_entmaxdist, Float: g_fEntMaxDist,
  360. g_pcvar_resetent, g_iResetEnt,
  361. g_pcvar_showmovers, g_iShowMovers,
  362. g_pcvar_lockblocks, g_iLockBlocks,
  363. g_pcvar_lockmax, g_iLockMax,
  364. g_pcvar_colormode, g_iColorMode,
  365. g_pcvar_zombietime, g_iZombieTime,
  366. g_pcvar_infecttime, g_iInfectTime,
  367. g_pcvar_supercut, g_iSupercut,
  368. g_pcvar_gunsmenu, g_iGunsMenu,
  369. g_pcvar_enabled,
  370. g_pcvar_allowedweps
  371.  
  372. public plugin_precache()
  373. {
  374. server_cmd("bb_credits_active 0")
  375.  
  376. register_plugin("Base Builder", VERSION, "Tirant")
  377. register_cvar("base_builder", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
  378. set_cvar_string("base_builder", VERSION)
  379.  
  380. g_pcvar_enabled = register_cvar("bb_enabled", "1")
  381.  
  382. if (!get_pcvar_num(g_pcvar_enabled))
  383. return;
  384.  
  385. new szCache[64], i;
  386.  
  387. g_pcvar_buildtime = register_cvar("bb_buildtime", "210") //Build Time
  388. g_iBuildTime = clamp(get_pcvar_num(g_pcvar_buildtime), 30, 300)
  389. g_pcvar_preptime = register_cvar("bb_preptime", "60") //Prep Time
  390. g_iPrepTime = clamp(get_pcvar_num(g_pcvar_preptime), 0, 60)
  391. g_pcvar_zombietime = register_cvar("bb_zombie_respawn_delay", "3") //Zombie Respawn Delay
  392. g_iZombieTime = clamp(get_pcvar_num(g_pcvar_zombietime), 1, 30)
  393. g_pcvar_infecttime = register_cvar("bb_infection_respawn", "5") //Survivor Respawn Infection Delay
  394. g_iInfectTime = clamp(get_pcvar_num(g_pcvar_infecttime), 0, 30)
  395. g_pcvar_showmovers = register_cvar("bb_showmovers", "1") //Show Movers
  396. g_iShowMovers = clamp(get_pcvar_num(g_pcvar_showmovers), 0, 1)
  397. g_pcvar_lockblocks = register_cvar("bb_lockblocks", "1") //Lock blocks
  398. g_iLockBlocks = clamp(get_pcvar_num(g_pcvar_lockblocks), 0, 1)
  399. g_pcvar_lockmax = register_cvar("bb_lockmax", "10") //Lock max
  400. g_iLockMax = clamp(get_pcvar_num(g_pcvar_lockmax), 0, 50)
  401. g_pcvar_colormode = register_cvar("bb_colormode", "1") //Color mode <0/1/2> Menu, one color per player, random
  402. g_iColorMode = clamp(get_pcvar_num(g_pcvar_colormode), 0, 2)
  403. g_pcvar_entmaxdist = register_cvar("bb_max_move_dist", "768") //Push ceiling
  404. g_fEntMaxDist = get_pcvar_float(g_pcvar_entmaxdist)
  405. g_pcvar_entmindist = register_cvar("bb_min_move_dist", "32") //Pull floor
  406. g_fEntMinDist = get_pcvar_float(g_pcvar_entmindist)
  407. g_pcvar_entsetdist = register_cvar("bb_min_dist_set", "64") //Grab set
  408. g_fEntSetDist = get_pcvar_float(g_pcvar_entsetdist)
  409. g_pcvar_resetent = register_cvar("bb_resetblocks", "1") //Reset blocks on new round
  410. g_iResetEnt = clamp(get_pcvar_num(g_pcvar_resetent), 0, 1)
  411. g_pcvar_supercut = register_cvar("bb_zombie_supercut", "0") //One hit kill for zombies
  412. g_iSupercut = clamp(get_pcvar_num(g_pcvar_supercut), 0, 1)
  413. g_pcvar_gunsmenu = register_cvar("bb_gunsmenu", "1") //Use the internal guns menu
  414. g_iGunsMenu = clamp(get_pcvar_num(g_pcvar_gunsmenu), 0, 1)
  415.  
  416. g_pcvar_givenades = register_cvar("bb_roundnades","hsf") //Grenades
  417. g_pcvar_allowedweps = register_cvar("bb_weapons","abcdeghijlmnqrstuvwx")
  418.  
  419. get_pcvar_string(g_pcvar_givenades, szCache, sizeof szCache - 1)
  420. for (i=0; i<strlen(szCache);i++)
  421. {
  422. switch(szCache[i])
  423. {
  424. case 'h': g_iGrenadeHE++
  425. case 'f': g_iGrenadeFLASH++
  426. case 's': g_iGrenadeSMOKE++
  427. }
  428. }
  429.  
  430. for (i=0; i<sizeof g_szRoundStart; i++) precache_sound(g_szRoundStart[i])
  431. for (i=0; i<sizeof g_szZombiePain;i++) precache_sound(g_szZombiePain[i])
  432. for (i=0; i<sizeof g_szZombieDie;i++) precache_sound(g_szZombieDie[i])
  433. for (i=0; i<sizeof g_szZombieIdle;i++) precache_sound(g_szZombieIdle[i])
  434. for (i=0; i<sizeof g_szZombieHit;i++) precache_sound(g_szZombieHit[i])
  435. for (i=0; i<sizeof g_szZombieMiss;i++) precache_sound(g_szZombieMiss[i])
  436.  
  437. precache_sound(WIN_ZOMBIES)
  438. precache_sound(WIN_BUILDERS)
  439. precache_sound(PHASE_BUILD)
  440. precache_sound(PHASE_PREP)
  441. precache_sound(LOCK_OBJECT)
  442. precache_sound(LOCK_FAIL)
  443. precache_sound(GRAB_START)
  444. precache_sound(GRAB_STOP)
  445. if (g_iInfectTime)
  446. precache_sound(INFECTION)
  447.  
  448. i = create_entity("info_bomb_target");
  449. entity_set_origin(i, Float:{8192.0,8192.0,8192.0})
  450.  
  451. i = create_entity("info_map_parameters");
  452. DispatchKeyValue(i, "buying", "3");
  453. DispatchKeyValue(i, "bombradius", "1");
  454. DispatchSpawn(i);
  455.  
  456. g_zclass_name = ArrayCreate(32, 1)
  457. g_zclass_info = ArrayCreate(32, 1)
  458. g_zclass_modelsstart = ArrayCreate(1, 1)
  459. g_zclass_modelsend = ArrayCreate(1, 1)
  460. g_zclass_playermodel = ArrayCreate(32, 1)
  461. g_zclass_modelindex = ArrayCreate(1, 1)
  462. g_zclass_clawmodel = ArrayCreate(32, 1)
  463. g_zclass_hp = ArrayCreate(1, 1)
  464. g_zclass_spd = ArrayCreate(1, 1)
  465. g_zclass_grav = ArrayCreate(1, 1)
  466. g_zclass_admin = ArrayCreate(1, 1)
  467. g_zclass_credits = ArrayCreate(1, 1)
  468.  
  469. g_zclass2_realname = ArrayCreate(32, 1)
  470. g_zclass2_name = ArrayCreate(32, 1)
  471. g_zclass2_info = ArrayCreate(32, 1)
  472. g_zclass2_modelsstart = ArrayCreate(1, 1)
  473. g_zclass2_modelsend = ArrayCreate(1, 1)
  474. g_zclass2_playermodel = ArrayCreate(32, 1)
  475. g_zclass2_clawmodel = ArrayCreate(32, 1)
  476. g_zclass2_hp = ArrayCreate(1, 1)
  477. g_zclass2_spd = ArrayCreate(1, 1)
  478. g_zclass2_grav = ArrayCreate(1, 1)
  479. g_zclass2_admin = ArrayCreate(1, 1)
  480. g_zclass2_credits = ArrayCreate(1, 1)
  481. g_zclass_new = ArrayCreate(1, 1)
  482.  
  483. g_boolArraysCreated = true
  484.  
  485. return;
  486. }
  487.  
  488. public plugin_cfg()
  489. {
  490. g_boolArraysCreated = false
  491. }
  492.  
  493. public plugin_init()
  494. {
  495. if (!get_pcvar_num(g_pcvar_enabled))
  496. return;
  497.  
  498. formatex(g_szModName, charsmax(g_szModName), "PerfectList %s", VERSION)
  499.  
  500. register_clcmd("say", "cmdSay");
  501. register_clcmd("say_team", "cmdSay");
  502.  
  503. //Added for old users
  504. register_clcmd("+grab", "cmdGrabEnt");
  505. register_clcmd("-grab", "cmdStopEnt");
  506.  
  507. register_clcmd("bb_lock", "cmdLockBlock",0, " - Aim at a block to lock it");
  508. register_clcmd("bb_claim", "cmdLockBlock",0, " - Aim at a block to lock it");
  509.  
  510. register_clcmd("bb_buildban", "cmdBuildBan",0, " <player>");
  511. register_clcmd("bb_unbban", "cmdBuildBan",0, " <player>");
  512. register_clcmd("bb_bban", "cmdBuildBan",0, " <player>");
  513.  
  514. register_clcmd("bb_swap", "cmdSwap",0, " <player>");
  515. register_clcmd("bb_revive", "cmdRevive",0, " <player>");
  516. if (g_iGunsMenu) register_clcmd("bb_guns", "cmdGuns",0, " <player>");
  517. register_clcmd("bb_startround", "cmdStartRound",0, " - Starts the round");
  518.  
  519. register_logevent("logevent_round_start",2, "1=Round_Start")
  520. register_logevent("logevent_round_end", 2, "1=Round_End")
  521.  
  522. register_message(get_user_msgid("TextMsg"), "msgRoundEnd")
  523. register_message(get_user_msgid("TextMsg"), "msgSendAudio")
  524. register_message(get_user_msgid("StatusIcon"), "msgStatusIcon");
  525. register_message(get_user_msgid("Health"), "msgHealth");
  526. register_message(get_user_msgid("StatusValue"), "msgStatusValue")
  527. register_message(get_user_msgid("TeamInfo"), "msgTeamInfo");
  528.  
  529. register_menucmd(register_menuid("ColorsSelect"),KEYS_GENERIC,"colors_pushed")
  530. register_menucmd(register_menuid("ZClassSelect"),KEYS_GENERIC,"zclass_pushed")
  531. if (g_iGunsMenu)
  532. {
  533. register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
  534. register_menucmd(register_menuid("PrimaryWeaponSelect"),KEYS_GENERIC,"prim_weapons_pushed")
  535. register_menucmd(register_menuid("SecWeaponSelect"),KEYS_GENERIC,"sec_weapons_pushed")
  536. }
  537.  
  538. register_event("HLTV", "ev_RoundStart", "a", "1=0", "2=0")
  539. register_event("AmmoX", "ev_AmmoX", "be", "1=1", "1=2", "1=3", "1=4", "1=5", "1=6", "1=7", "1=8", "1=9", "1=10")
  540. register_event("Health", "ev_Health", "be", "1>0");
  541. register_event("StatusValue", "ev_SetTeam", "be", "1=1");
  542. register_event("StatusValue", "ev_ShowStatus", "be", "1=2", "2!0");
  543. register_event("StatusValue", "ev_HideStatus", "be", "1=1", "2=0");
  544.  
  545. RegisterHam(Ham_Touch, "weapon_shield","ham_WeaponCleaner_Post", 1)
  546. RegisterHam(Ham_Touch, "weaponbox", "ham_WeaponCleaner_Post", 1)
  547. RegisterHam(Ham_Spawn, "player", "ham_PlayerSpawn_Post", 1)
  548. RegisterHam(Ham_TakeDamage, "player", "ham_TakeDamage")
  549. for (new i = 1; i < sizeof g_szWpnEntNames; i++)
  550. if (g_szWpnEntNames[i][0]) RegisterHam(Ham_Item_Deploy, g_szWpnEntNames[i], "ham_ItemDeploy_Post", 1)
  551.  
  552. register_forward(FM_GetGameDescription, "fw_GetGameDescription")
  553. register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
  554. register_forward(FM_ClientUserInfoChanged, "fw_ClientUserInfoChanged")
  555. register_forward(FM_CmdStart, "fw_CmdStart");
  556. register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
  557. register_forward(FM_EmitSound, "fw_EmitSound")
  558. register_forward(FM_ClientKill, "fw_Suicide")
  559. if (g_iShowMovers)
  560. register_forward(FM_TraceLine, "fw_Traceline")
  561.  
  562. register_clcmd("drop", "clcmd_drop")
  563. register_clcmd("buy", "clcmd_buy")
  564.  
  565. //Team Handlers
  566. register_clcmd("chooseteam", "clcmd_changeteam")
  567. register_clcmd("jointeam", "clcmd_changeteam")
  568. register_message(get_user_msgid("ShowMenu"), "message_show_menu")
  569. register_message(get_user_msgid("VGUIMenu"), "message_vgui_menu")
  570.  
  571. set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
  572.  
  573. g_iMaxPlayers = get_maxplayers()
  574. g_HudSync = CreateHudSyncObj();
  575. g_msgSayText = get_user_msgid("SayText")
  576. g_msgStatusText = get_user_msgid("StatusText");
  577.  
  578. g_iEntBarrier = find_ent_by_tname( -1, "barrier" );
  579.  
  580. //Custom Forwards
  581. g_fwRoundStart = CreateMultiForward("bb_round_started", ET_IGNORE)
  582. g_fwPrepStarted = CreateMultiForward("bb_prepphase_started", ET_IGNORE)
  583. g_fwBuildStarted = CreateMultiForward("bb_buildphase_started", ET_IGNORE)
  584. g_fwClassPicked = CreateMultiForward("bb_zombie_class_picked", ET_IGNORE, FP_CELL, FP_CELL)
  585. g_fwClassSet = CreateMultiForward("bb_zombie_class_set", ET_IGNORE, FP_CELL, FP_CELL)
  586. g_fwPushPull = CreateMultiForward("bb_block_pushpull", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
  587. g_fwGrabEnt_Pre = CreateMultiForward("bb_grab_pre", ET_IGNORE, FP_CELL, FP_CELL)
  588. g_fwGrabEnt_Post = CreateMultiForward("bb_grab_post", ET_IGNORE, FP_CELL, FP_CELL)
  589. g_fwDropEnt_Pre = CreateMultiForward("bb_drop_pre", ET_IGNORE, FP_CELL, FP_CELL)
  590. g_fwDropEnt_Post = CreateMultiForward("bb_drop_post", ET_IGNORE, FP_CELL, FP_CELL)
  591. g_fwNewColor = CreateMultiForward("bb_new_color", ET_IGNORE, FP_CELL, FP_CELL)
  592. g_fwLockEnt_Pre = CreateMultiForward("bb_lock_pre", ET_IGNORE, FP_CELL, FP_CELL)
  593. g_fwLockEnt_Post = CreateMultiForward("bb_lock_post", ET_IGNORE, FP_CELL, FP_CELL)
  594.  
  595. register_dictionary("basebuilder.txt");
  596. }
  597.  
  598. public plugin_natives()
  599. {
  600. register_native("bb_register_zombie_class","native_register_zombie_class", 1)
  601.  
  602. register_native("bb_get_class_cost","native_get_class_cost", 1)
  603. register_native("bb_get_user_zombie_class","native_get_user_zombie_class", 1)
  604. register_native("bb_get_user_next_class","native_get_user_next_class", 1)
  605. register_native("bb_set_user_zombie_class","native_set_user_zombie_class", 1)
  606.  
  607.  
  608. register_native("bb_is_user_zombie","native_is_user_zombie", 1)
  609. register_native("bb_is_user_banned","native_is_user_banned", 1)
  610.  
  611. register_native("bb_is_build_phase","native_bool_buildphase", 1)
  612. register_native("bb_is_prep_phase","native_bool_prepphase", 1)
  613.  
  614. register_native("bb_get_build_time","native_get_build_time", 1)
  615. register_native("bb_set_build_time","native_set_build_time", 1)
  616.  
  617. register_native("bb_get_user_color","native_get_user_color", 1)
  618. register_native("bb_set_user_color","native_set_user_color", 1)
  619.  
  620. register_native("bb_drop_user_block","native_drop_user_block", 1)
  621. register_native("bb_get_user_block","native_get_user_block", 1)
  622. register_native("bb_set_user_block","native_set_user_block", 1)
  623.  
  624. register_native("bb_is_locked_block","native_is_locked_block", 1)
  625. register_native("bb_lock_block","native_lock_block", 1)
  626. register_native("bb_unlock_block","native_unlock_block", 1)
  627.  
  628. register_native("bb_release_zombies","native_release_zombies", 1)
  629.  
  630. register_native("bb_set_user_primary","native_set_user_primary", 1)
  631. register_native("bb_get_user_primary","native_get_user_primary", 1)
  632.  
  633. register_native("bb_get_flags_build","native_get_flags_build", 1)
  634. register_native("bb_get_flags_lock","native_get_flags_lock", 1)
  635. register_native("bb_get_flags_buildban","native_get_flags_buildban", 1)
  636. register_native("bb_get_flags_swap","native_get_flags_swap", 1)
  637. register_native("bb_get_flags_revive","native_get_flags_revive", 1)
  638. register_native("bb_get_flags_guns","native_get_flags_guns", 1)
  639. register_native("bb_get_flags_release","native_get_flags_release", 1)
  640. register_native("bb_get_flags_override","native_get_flags_override", 1)
  641.  
  642. //register_native("bb_set_user_mult","native_set_user_mult", 1)
  643.  
  644. //ZP Natives Converted
  645. register_native("zp_register_zombie_class","native_register_zombie_class", 1)
  646. register_native("zp_get_user_zombie_class","native_get_user_zombie_class", 1)
  647. register_native("zp_get_user_next_class","native_get_user_next_class", 1)
  648. register_native("zp_set_user_zombie_class","native_set_user_zombie_class", 1)
  649. register_native("zp_get_user_zombie","native_is_user_zombie", 1)
  650. }
  651.  
  652. public fw_GetGameDescription()
  653. {
  654. forward_return(FMV_STRING, g_szModName)
  655. return FMRES_SUPERCEDE;
  656. }
  657.  
  658. public client_putinserver(id)
  659. {
  660. if (!is_user_connected(id))
  661. return PLUGIN_HANDLED;
  662.  
  663. g_isConnected[id] = true
  664. g_isAlive[id] = false
  665. g_isZombie[id] = false
  666. g_isBuildBan[id] = false
  667. g_isCustomModel[id] = false
  668. g_boolFirstSpawn[id] = true
  669. g_boolFirstTeam[id] = false
  670. g_boolFirstTime[id] = true
  671. g_boolRepick[id] = true
  672.  
  673. g_iZombieClass[id] = 0
  674. g_iNextClass[id] = g_iZombieClass[id]
  675. //for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
  676.  
  677. set_task(7.0,"Respawn_Player",id+TASK_RESPAWN);
  678.  
  679. return PLUGIN_CONTINUE;
  680. }
  681.  
  682. public client_disconnect(id)
  683. {
  684. if (g_iOwnedEnt[id])
  685. cmdStopEnt(id)
  686.  
  687. g_isConnected[id] = false
  688. g_isAlive[id] = false
  689. g_isZombie[id] = false
  690. g_isBuildBan[id] = false
  691. g_isCustomModel[id] = false
  692. g_boolFirstSpawn[id] = false
  693. g_boolFirstTeam[id] = false
  694. g_boolFirstTime[id] = false
  695. g_boolRepick[id] = false
  696.  
  697. g_iZombieClass[id] = 0
  698. g_iNextClass[id] = 0
  699. //for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
  700.  
  701. g_iOwnedEntities[id] = 0
  702.  
  703. remove_task(id+TASK_RESPAWN)
  704. remove_task(id+TASK_HEALTH)
  705. remove_task(id+TASK_IDLESOUND)
  706.  
  707. for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
  708. {
  709. if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
  710. {
  711. UnlockBlock(iEnt)
  712. set_pev(iEnt,pev_rendermode,kRenderNormal)
  713.  
  714. UnsetLastMover(iEnt);
  715. UnsetEntMover(iEnt);
  716. }
  717. }
  718. }
  719.  
  720. public ev_RoundStart()
  721. {
  722. remove_task(TASK_BUILD)
  723. remove_task(TASK_PREPTIME)
  724.  
  725. arrayset(g_iOwnedEntities, 0, MAXPLAYERS+1)
  726. arrayset(g_iColor, 0, MAXPLAYERS+1)
  727. arrayset(g_iColorOwner, 0, MAX_COLORS)
  728. arrayset(g_boolRepick, true, MAXPLAYERS+1)
  729.  
  730. g_boolRoundEnded = false
  731. g_boolCanBuild = true
  732. g_fRoundStartTime = get_gametime()
  733.  
  734. if (g_iResetEnt)
  735. {
  736. new szClass[10], szTarget[7];
  737. for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
  738. {
  739. if (is_valid_ent(iEnt))
  740. {
  741. entity_get_string(iEnt, EV_SZ_classname, szClass, 9);
  742. entity_get_string(iEnt, EV_SZ_targetname, szTarget, 6);
  743. if (!BlockLocker(iEnt) && iEnt != g_iEntBarrier && equal(szClass, "func_wall") && !equal(szTarget, "ignore"))
  744. {
  745. set_pev(iEnt,pev_rendermode,kRenderNormal)
  746. engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
  747.  
  748. UnsetLastMover(iEnt);
  749. UnsetEntMover(iEnt);
  750. }
  751. else if (g_iLockBlocks && BlockLocker(iEnt))
  752. {
  753. UnlockBlock(iEnt)
  754. set_pev(iEnt,pev_rendermode,kRenderNormal)
  755. engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
  756.  
  757. UnsetLastMover(iEnt);
  758. UnsetEntMover(iEnt);
  759. }
  760. }
  761. }
  762. }
  763. }
  764.  
  765. public ev_AmmoX(id)
  766. set_pdata_int(id, AMMO_SLOT + read_data(1), 200, 5)
  767.  
  768. public ev_Health(taskid)
  769. {
  770. if (taskid>g_iMaxPlayers)
  771. taskid-=TASK_HEALTH
  772.  
  773. if (is_user_alive(taskid))
  774. {
  775. new szGoal[32]
  776. //if (is_credits_active())
  777. #if defined BB_CREDITS
  778. format(szGoal, 31, "^n%L: %d", LANG_SERVER, "HUD_GOAL", credits_get_user_goal(taskid))
  779. #endif
  780.  
  781. set_hudmessage(255, 255, 255, -1.0, 0.9, 0, 12.0, 12.0, 0.1, 0.2, 4);
  782. if (g_isZombie[taskid])
  783. {
  784. static szCache1[32]
  785. ArrayGetString(g_zclass_name, g_iZombieClass[taskid], szCache1, charsmax(szCache1))
  786.  
  787. show_hudmessage(taskid, "%L: %d^n%L: %s%s", LANG_SERVER, "HUD_HEALTH", pev(taskid, pev_health), LANG_SERVER, "HUD_CLASS", szCache1, szGoal);
  788. }
  789. else
  790. {
  791. show_hudmessage(taskid, "%L: %d%s", LANG_SERVER, "HUD_HEALTH", pev(taskid, pev_health), szGoal);
  792. }
  793.  
  794. set_task(11.9, "ev_Health", taskid+TASK_HEALTH);
  795. }
  796. }
  797.  
  798. public msgStatusIcon(const iMsgId, const iMsgDest, const iPlayer)
  799. {
  800. if(g_isAlive[iPlayer] && g_isConnected[iPlayer])
  801. {
  802. static szMsg[8]
  803. get_msg_arg_string(2, szMsg, 7)
  804.  
  805. if(equal(szMsg, "buyzone"))
  806. {
  807. set_pdata_int(iPlayer, OFFSET_BUYZONE, get_pdata_int(iPlayer, OFFSET_BUYZONE) & ~(1<<0))
  808. return PLUGIN_HANDLED
  809. }
  810. }
  811. return PLUGIN_CONTINUE
  812. }
  813.  
  814. public msgHealth(msgid, dest, id)
  815. {
  816. if(!g_isAlive[id])
  817. return PLUGIN_CONTINUE;
  818.  
  819. static hp;
  820. hp = get_msg_arg_int(1);
  821.  
  822. if(hp > 255 && (hp % 256) == 0)
  823. set_msg_arg_int(1, ARG_BYTE, ++hp);
  824.  
  825. return PLUGIN_CONTINUE;
  826. }
  827.  
  828. public msgRoundEnd(const MsgId, const MsgDest, const MsgEntity)
  829. {
  830. static Message[192]
  831. get_msg_arg_string(2, Message, 191)
  832.  
  833. if (equal(Message, "#Terrorists_Win"))
  834. {
  835. g_boolRoundEnded = true
  836. set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
  837. show_hudmessage(0, "%L", LANG_SERVER, "WIN_ZOMBIE")
  838. set_msg_arg_string(2, "")
  839. client_cmd(0, "spk %s", WIN_ZOMBIES)
  840.  
  841. return PLUGIN_HANDLED
  842. }
  843. else if (equal(Message, "#Target_Saved") || equal(Message, "#CTs_Win"))
  844. {
  845. g_boolRoundEnded = true
  846. set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
  847. show_hudmessage(0, "%L", LANG_SERVER, "WIN_BUILDER")
  848. set_msg_arg_string(2, "")
  849. client_cmd(0, "spk %s", WIN_BUILDERS)
  850.  
  851. return PLUGIN_HANDLED
  852. }
  853. return PLUGIN_HANDLED
  854. }
  855.  
  856. public msgSendAudio(const MsgId, const MsgDest, const MsgEntity)
  857. {
  858. static szSound[17]
  859. get_msg_arg_string(2,szSound,16)
  860. if(equal(szSound[7], "terwin") || equal(szSound[7], "ctwin") || equal(szSound[7], "rounddraw")) return PLUGIN_HANDLED
  861. return PLUGIN_CONTINUE
  862. }
  863.  
  864. public ham_WeaponCleaner_Post(iEnt)
  865. {
  866. call_think(iEnt)
  867. }
  868.  
  869. public ham_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
  870. {
  871. if (!is_valid_ent(victim) || !g_isAlive[victim] || !is_user_connected(attacker))
  872. return HAM_IGNORED
  873.  
  874. if(g_boolCanBuild || g_boolRoundEnded || g_boolPrepTime)
  875. return HAM_SUPERCEDE;
  876.  
  877. if (victim == attacker)
  878. return HAM_SUPERCEDE;
  879.  
  880. if (g_iSupercut)
  881. {
  882. damage*=99.0
  883. }
  884.  
  885. SetHamParamFloat(4, damage)
  886. return HAM_HANDLED
  887. }
  888.  
  889. public ham_ItemDeploy_Post(weapon_ent)
  890. {
  891. static owner
  892. owner = get_pdata_cbase(weapon_ent, OFFSET_WPN_WIN, OFFSET_WPN_LINUX);
  893.  
  894. static weaponid
  895. weaponid = cs_get_weapon_id(weapon_ent)
  896.  
  897. if (g_isZombie[owner] && weaponid == CSW_KNIFE)
  898. {
  899. static szClawModel[100]
  900. ArrayGetString(g_zclass_clawmodel, g_iZombieClass[owner], szClawModel, charsmax(szClawModel))
  901. format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
  902. entity_set_string( owner , EV_SZ_viewmodel , szClawModel )
  903. entity_set_string( owner , EV_SZ_weaponmodel , "" )
  904. }
  905.  
  906. if (g_isZombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM))
  907. {
  908. engclient_cmd(owner, "weapon_knife")
  909. }
  910. else if (g_boolCanBuild)
  911. {
  912. engclient_cmd(owner, "weapon_knife")
  913. client_print(owner, print_center, "%L", LANG_SERVER, "FAIL_KNIFE");
  914. }
  915. }
  916.  
  917. public logevent_round_start()
  918. {
  919. set_pev(g_iEntBarrier,pev_solid,SOLID_BSP)
  920. set_pev(g_iEntBarrier,pev_rendermode,kRenderTransColor)
  921. set_pev(g_iEntBarrier,pev_rendercolor, Float:{ BARRIER_COLOR })
  922. set_pev(g_iEntBarrier,pev_renderamt, Float:{ BARRIER_RENDERAMT })
  923.  
  924. print_color(0, "^x04 ---[ PerfectList %s ]---", VERSION);
  925. print_color(0, "^x03 %L", LANG_SERVER, "ROUND_MESSAGE");
  926.  
  927. client_cmd(0, "spk %s", PHASE_BUILD)
  928.  
  929. remove_task(TASK_BUILD)
  930. set_task(1.0, "task_CountDown", TASK_BUILD,_, _, "a", g_iBuildTime);
  931. g_iCountDown = (g_iBuildTime-1);
  932.  
  933. ExecuteForward(g_fwBuildStarted, g_fwDummyResult);
  934. }
  935.  
  936. public task_CountDown()
  937. {
  938. g_iCountDown--
  939. new mins = g_iCountDown/60, secs = g_iCountDown%60
  940. if (g_iCountDown>=0)
  941. client_print(0, print_center, "%L - %d:%s%d", LANG_SERVER, "BUILD_TIMER", mins, (secs < 10 ? "0" : ""), secs)
  942. else
  943. {
  944. if (g_iPrepTime)
  945. {
  946. g_boolCanBuild = false
  947. g_boolPrepTime = true
  948. g_iCountDown = g_iPrepTime+1
  949. set_task(1.0, "task_PrepTime", TASK_PREPTIME,_, _, "a", g_iCountDown);
  950.  
  951. set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
  952. show_hudmessage(0, "%L", LANG_SERVER, "PREP_ANNOUNCE");
  953.  
  954. new players[32], num
  955. get_players(players, num)
  956. for (new i = 0; i < num; i++)
  957. {
  958. if (g_isAlive[players[i]] && !g_isZombie[players[i]])
  959. {
  960. ExecuteHamB(Ham_CS_RoundRespawn, players[i])
  961.  
  962. if (g_iOwnedEnt[players[i]])
  963. cmdStopEnt(players[i])
  964. }
  965. }
  966. print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "PREP_ANNOUNCE")
  967.  
  968. client_cmd(0, "spk %s", PHASE_PREP)
  969.  
  970. ExecuteForward(g_fwPrepStarted, g_fwDummyResult);
  971. }
  972. else
  973. Release_Zombies()
  974.  
  975. remove_task(TASK_BUILD);
  976. return PLUGIN_HANDLED;
  977. }
  978.  
  979. new szTimer[32]
  980. if (g_iCountDown>10)
  981. {
  982. if (mins && !secs) num_to_word(mins, szTimer, charsmax( szTimer ) );
  983. else if (!mins && secs == 30) num_to_word(secs, szTimer, charsmax( szTimer ) );
  984. else return PLUGIN_HANDLED;
  985.  
  986. client_cmd(0, "spk ^"fvox/%s %s remaining^"", szTimer, (mins ? "minutes" : "seconds"))
  987. }
  988. else
  989. {
  990. num_to_word(g_iCountDown, szTimer, charsmax( szTimer ) );
  991. client_cmd(0, "spk ^"fvox/%s^"", szTimer)
  992. }
  993. return PLUGIN_CONTINUE;
  994. }
  995.  
  996. public task_PrepTime()
  997. {
  998. g_iCountDown--
  999.  
  1000. if (g_iCountDown>=0)
  1001. client_print(0, print_center, "%L - 0:%s%d", LANG_SERVER, "PREP_TIMER", (g_iCountDown < 10 ? "0" : ""), g_iCountDown)
  1002.  
  1003. if (0<g_iCountDown<11)
  1004. {
  1005. new szTimer[32]
  1006. num_to_word(g_iCountDown, szTimer, charsmax( szTimer ) );
  1007. client_cmd(0, "spk ^"fvox/%s^"", szTimer)
  1008. }
  1009. else if (g_iCountDown == 0)
  1010. {
  1011. Release_Zombies()
  1012. remove_task(TASK_PREPTIME);
  1013. return PLUGIN_HANDLED
  1014. }
  1015.  
  1016. return PLUGIN_CONTINUE;
  1017. }
  1018.  
  1019. public logevent_round_end()
  1020. {
  1021. if (g_boolRoundEnded)
  1022. {
  1023. new players[32], num, player
  1024. get_players(players, num)
  1025. for (new i = 0; i < num; i++)
  1026. {
  1027. player = players[i]
  1028.  
  1029. if (g_iCurTeam[player] == g_iTeam[player] )
  1030. cs_set_user_team(player, (g_iTeam[player] = (g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T)))
  1031. else
  1032. g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T
  1033. }
  1034. print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "SWAP_ANNOUNCE")
  1035. }
  1036. remove_task(TASK_BUILD)
  1037. return PLUGIN_HANDLED
  1038. }
  1039.  
  1040. public client_death(g_attacker, g_victim, wpnindex, hitplace, TK)
  1041. {
  1042. if (is_user_alive(g_victim))
  1043. return PLUGIN_HANDLED;
  1044. remove_task(g_victim+TASK_IDLESOUND)
  1045.  
  1046. g_isAlive[g_victim] = false;
  1047.  
  1048. if (TK == 0 && g_attacker != g_victim && g_isZombie[g_attacker])
  1049. {
  1050. switch(random_num(0,2)){
  1051. case 0: {
  1052. client_cmd(0, "spk %s", INFECTION)
  1053. new szPlayerName[32]
  1054. get_user_name(g_victim, szPlayerName, charsmax( szPlayerName ) );
  1055. set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 5.0, 0.1, 0.2, 1)
  1056. show_hudmessage(0, "%L", LANG_SERVER, "INFECT_ANNOUNCE", szPlayerName);
  1057. }
  1058. case 1: {
  1059. client_cmd(0, "spk %s", INFECTION2)
  1060. new szPlayerName[32]
  1061. get_user_name(g_victim, szPlayerName, charsmax( szPlayerName ) );
  1062. set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 5.0, 0.1, 0.2, 1)
  1063. show_hudmessage(0, "%L", LANG_SERVER, "INFECT_ANNOUNCE", szPlayerName);
  1064. }
  1065. case 2: {
  1066. client_cmd(0, "spk %s", INFECTION3)
  1067. new szPlayerName[32]
  1068. get_user_name(g_victim, szPlayerName, charsmax( szPlayerName ) );
  1069. set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 5.0, 0.1, 0.2, 1)
  1070. show_hudmessage(0, "%L", LANG_SERVER, "INFECT_ANNOUNCE", szPlayerName);
  1071. }
  1072. }
  1073. }
  1074.  
  1075.  
  1076. set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
  1077. if (g_isZombie[g_victim])
  1078. {
  1079. show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_ZOMBIE", g_iZombieTime);
  1080. set_task(float(g_iZombieTime), "Respawn_Player", g_victim+TASK_RESPAWN)
  1081. }
  1082. else if (g_iInfectTime)
  1083. {
  1084. show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_HUMAN", g_iInfectTime);
  1085. cs_set_user_team(g_victim, CS_TEAM_T)
  1086. g_isZombie[g_victim] = true
  1087. set_task(float(g_iInfectTime), "Respawn_Player", g_victim+TASK_RESPAWN)
  1088. }
  1089.  
  1090. return PLUGIN_CONTINUE;
  1091. }
  1092.  
  1093. public Respawn_Player(id)
  1094. {
  1095. id-=TASK_RESPAWN
  1096.  
  1097. if (!is_user_connected(id))
  1098. return PLUGIN_HANDLED
  1099.  
  1100. if (((g_boolCanBuild || g_boolPrepTime) && cs_get_user_team(id) == CS_TEAM_CT) || cs_get_user_team(id) == CS_TEAM_T)
  1101. {
  1102. ExecuteHamB(Ham_CS_RoundRespawn, id)
  1103.  
  1104. //Loop the task until they have successfully spawned
  1105. if (!g_isAlive[id])
  1106. set_task(3.0,"Respawn_Human",id+TASK_RESPAWN)
  1107. }
  1108. return PLUGIN_HANDLED
  1109. }
  1110.  
  1111. public ham_PlayerSpawn_Post(id)
  1112. {
  1113. if (is_user_alive(id))
  1114. {
  1115. g_isAlive[id] = true;
  1116.  
  1117. g_isZombie[id] = (cs_get_user_team(id) == CS_TEAM_T ? true : false)
  1118.  
  1119. remove_task(id + TASK_RESPAWN)
  1120. remove_task(id + TASK_MODELSET)
  1121. remove_task(id + TASK_IDLESOUND)
  1122. if (g_isZombie[id])
  1123. {
  1124. if (g_boolFirstSpawn[id])
  1125. {
  1126. print_color(id, "This server is running Base Builder v%s by Record", VERSION);
  1127. show_zclass_menu(id, 0)
  1128. g_boolFirstSpawn[id] = false
  1129. }
  1130.  
  1131. if (g_iNextClass[id] != g_iZombieClass[id])
  1132. g_iZombieClass[id] = g_iNextClass[id]
  1133.  
  1134. set_pev(id, pev_health, float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_HEALTH]*/)
  1135. set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_iZombieClass[id])/**g_fClassMultiplier[id][ATT_GRAVITY]*/)
  1136. g_fPlayerSpeed[id] = float(ArrayGetCell(g_zclass_spd, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_SPEED]*/
  1137.  
  1138. //Handles the knife and claw model
  1139. strip_user_weapons(id)
  1140. give_item(id, "weapon_knife")
  1141.  
  1142. static szClawModel[100]
  1143. ArrayGetString(g_zclass_clawmodel, g_iZombieClass[id], szClawModel, charsmax(szClawModel))
  1144. format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
  1145. entity_set_string( id , EV_SZ_viewmodel , szClawModel )
  1146. entity_set_string( id , EV_SZ_weaponmodel , "" )
  1147.  
  1148. ArrayGetString(g_zclass_name, g_iZombieClass[id], g_szPlayerClass[id], charsmax(g_szPlayerClass[]))
  1149.  
  1150. set_task(random_float(60.0, 360.0), "task_ZombieIdle", id+TASK_IDLESOUND, _, _, "b")
  1151.  
  1152. ArrayGetString(g_zclass_playermodel, g_iZombieClass[id], g_szPlayerModel[id], charsmax(g_szPlayerModel[]))
  1153. new szCurrentModel[32]
  1154. fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
  1155. if (!equal(szCurrentModel, g_szPlayerModel[id]))
  1156. {
  1157. if (get_gametime() - g_fRoundStartTime < 5.0)
  1158. set_task(5.0 * MODELCHANGE_DELAY, "fm_user_model_update", id + TASK_MODELSET)
  1159. else
  1160. fm_user_model_update(id + TASK_MODELSET)
  1161. }
  1162.  
  1163. ExecuteForward(g_fwClassSet, g_fwDummyResult, id, g_iZombieClass[id]);
  1164. }
  1165. else if (g_isCustomModel[id])
  1166. {
  1167. fm_reset_user_model(id)
  1168. }
  1169.  
  1170. if (!g_isZombie[id])
  1171. {
  1172. entity_set_string( id , EV_SZ_viewmodel , "models/v_knife.mdl" )
  1173.  
  1174. if (((/*g_boolPrepTime && */g_iPrepTime && !g_boolCanBuild) || (g_boolCanBuild && !g_iPrepTime)) && g_iGunsMenu)
  1175. {
  1176. //if (is_credits_active())
  1177. #if defined BB_CREDITS
  1178. credits_show_gunsmenu(id)
  1179. #else
  1180. show_method_menu(id)
  1181. #endif
  1182. }
  1183.  
  1184. if (!g_iColor[id])
  1185. {
  1186. new i = random(MAX_COLORS)
  1187. if (g_iColorMode)
  1188. {
  1189. while (g_iColorOwner[i])
  1190. {
  1191. i = random(MAX_COLORS)
  1192. }
  1193. }
  1194. print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_PICKED", g_szColorName[i]);
  1195. g_iColor[id] = i
  1196. g_iColorOwner[i] = id
  1197.  
  1198. if (g_iOwnedEnt[id])
  1199. {
  1200. set_pev(g_iOwnedEnt[id],pev_rendercolor, g_fColor[g_iColor[id]] )
  1201. set_pev(g_iOwnedEnt[id],pev_renderamt, g_fRenderAmt[g_iColor[id]] )
  1202. }
  1203. }
  1204. }
  1205.  
  1206. ev_Health(id)
  1207. }
  1208. }
  1209.  
  1210. public task_ZombieIdle(taskid)
  1211. {
  1212. taskid-=TASK_IDLESOUND
  1213. if (g_isAlive[taskid] && g_isConnected[taskid] && !g_isZombie[taskid])
  1214. emit_sound(taskid, CHAN_VOICE, g_szZombieIdle[random(sizeof g_szZombieIdle - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  1215. }
  1216.  
  1217. public fw_SetClientKeyValue(id, const infobuffer[], const key[])
  1218. {
  1219. if (g_isCustomModel[id] && equal(key, "model"))
  1220. return FMRES_SUPERCEDE
  1221. return FMRES_IGNORED
  1222. }
  1223.  
  1224. public fw_ClientUserInfoChanged(id)
  1225. {
  1226. if (!g_isCustomModel[id])
  1227. return FMRES_IGNORED
  1228. static szCurrentModel[32]
  1229. fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
  1230. if (!equal(szCurrentModel, g_szPlayerModel[id]) && !task_exists(id + TASK_MODELSET))
  1231. fm_set_user_model(id + TASK_MODELSET)
  1232. return FMRES_IGNORED
  1233. }
  1234.  
  1235. public fm_user_model_update(taskid)
  1236. {
  1237. static Float:fCurTime
  1238. fCurTime = get_gametime()
  1239.  
  1240. if (fCurTime - g_fModelsTargetTime >= MODELCHANGE_DELAY)
  1241. {
  1242. fm_set_user_model(taskid)
  1243. g_fModelsTargetTime = fCurTime
  1244. }
  1245. else
  1246. {
  1247. set_task((g_fModelsTargetTime + MODELCHANGE_DELAY) - fCurTime, "fm_set_user_model", taskid)
  1248. g_fModelsTargetTime += MODELCHANGE_DELAY
  1249. }
  1250. }
  1251.  
  1252. public fm_set_user_model(player)
  1253. {
  1254. player -= TASK_MODELSET
  1255. engfunc(EngFunc_SetClientKeyValue, player, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", g_szPlayerModel[player])
  1256. g_isCustomModel[player] = true
  1257. }
  1258.  
  1259. stock fm_get_user_model(player, model[], len)
  1260. {
  1261. engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", model, len)
  1262. }
  1263.  
  1264. stock fm_reset_user_model(player)
  1265. {
  1266. g_isCustomModel[player] = false
  1267. dllfunc(DLLFunc_ClientUserInfoChanged, player, engfunc(EngFunc_GetInfoKeyBuffer, player))
  1268. }
  1269.  
  1270. public message_show_menu(msgid, dest, id)
  1271. {
  1272. if (!(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))
  1273. return PLUGIN_CONTINUE
  1274.  
  1275. static team_select[] = "#Team_Select"
  1276. static menu_text_code[sizeof team_select]
  1277. get_msg_arg_string(4, menu_text_code, sizeof menu_text_code - 1)
  1278. if (!equal(menu_text_code, team_select))
  1279. return PLUGIN_CONTINUE
  1280.  
  1281. static param_menu_msgid[2]
  1282. param_menu_msgid[0] = msgid
  1283. set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)
  1284.  
  1285. return PLUGIN_HANDLED
  1286. }
  1287.  
  1288. public message_vgui_menu(msgid, dest, id)
  1289. {
  1290. if (get_msg_arg_int(1) != TEAM_SELECT_VGUI_MENU_ID || !(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))//
  1291. return PLUGIN_CONTINUE
  1292.  
  1293. static param_menu_msgid[2]
  1294. param_menu_msgid[0] = msgid
  1295. set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)
  1296.  
  1297. return PLUGIN_HANDLED
  1298. }
  1299.  
  1300. public task_force_team_join(menu_msgid[], id)
  1301. {
  1302. if (get_user_team(id))
  1303. return
  1304.  
  1305. static msg_block
  1306. msg_block = get_msg_block(menu_msgid[0])
  1307. set_msg_block(menu_msgid[0], BLOCK_SET)
  1308. engclient_cmd(id, "jointeam", "5")
  1309. engclient_cmd(id, "joinclass", "5")
  1310. set_msg_block(menu_msgid[0], msg_block)
  1311. }
  1312.  
  1313. public msgTeamInfo(msgid, dest)
  1314. {
  1315. if (dest != MSG_ALL && dest != MSG_BROADCAST)
  1316. return;
  1317.  
  1318. static id, team[2]
  1319. id = get_msg_arg_int(1)
  1320.  
  1321. get_msg_arg_string(2, team, charsmax(team))
  1322. switch (team[0])
  1323. {
  1324. case 'T' : // TERRORIST
  1325. {
  1326. g_iCurTeam[id] = CS_TEAM_T;
  1327. }
  1328. case 'C' : // CT
  1329. {
  1330. g_iCurTeam[id] = CS_TEAM_CT;
  1331. }
  1332. case 'S' : // SPECTATOR
  1333. {
  1334. g_iCurTeam[id] = CS_TEAM_SPECTATOR;
  1335. }
  1336. default : g_iCurTeam[id] = CS_TEAM_UNASSIGNED;
  1337. }
  1338. if (!g_boolFirstTeam[id])
  1339. {
  1340. g_boolFirstTeam[id] = true
  1341. g_iTeam[id] = g_iCurTeam[id]
  1342. }
  1343. }
  1344.  
  1345. public clcmd_changeteam(id)
  1346. {
  1347. static CsTeams:team
  1348. team = cs_get_user_team(id)
  1349.  
  1350. if (team == CS_TEAM_SPECTATOR || team == CS_TEAM_UNASSIGNED)
  1351. return PLUGIN_CONTINUE;
  1352.  
  1353. show_zclass_menu(id, 0)
  1354. return PLUGIN_HANDLED;
  1355. }
  1356.  
  1357. public clcmd_drop(id)
  1358. {
  1359. client_print (id, print_center, "%L", LANG_SERVER, "FAIL_DROP")
  1360. return PLUGIN_HANDLED
  1361. }
  1362.  
  1363. public clcmd_buy(id)
  1364. {
  1365. client_print (id, print_center, "%L", LANG_SERVER, "FAIL_BUY")
  1366. return PLUGIN_HANDLED
  1367. }
  1368.  
  1369. public msgStatusValue()
  1370. set_msg_block(g_msgStatusText, BLOCK_SET);
  1371.  
  1372. public ev_SetTeam(id)
  1373. g_iFriend[id] = read_data(2)
  1374.  
  1375. public ev_ShowStatus(id) //called when id looks at someone
  1376. {
  1377. new szName[32], pid = read_data(2);
  1378. get_user_name(pid, szName, charsmax( szName ) );
  1379.  
  1380. if (g_iFriend[id] == 1) // friend
  1381. {
  1382. new clip, ammo, wpnid = get_user_weapon(pid, clip, ammo), szWpnName[32];
  1383.  
  1384. if (wpnid)
  1385. xmod_get_wpnname(wpnid, szWpnName, charsmax( szWpnName ) );
  1386.  
  1387. set_hudmessage(0, 225, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
  1388. new nLen, szStatus[512]
  1389. if (!g_isZombie[pid])
  1390. nLen += format( szStatus[nLen], 511-nLen, "%s^nHealth: %d | Weapon: %s^nColor: %s", szName, pev(pid, pev_health), szWpnName, g_szColorName[g_iColor[pid]]);
  1391. else
  1392. {
  1393. nLen += format( szStatus[nLen], 511-nLen, "%s^nClass: %s^nHealth: %d", szName, g_szPlayerClass[pid], pev(pid, pev_health));
  1394.  
  1395. /*if (is_credits_active())
  1396. {
  1397. nLen += format( szStatus[nLen], 511-nLen, "^n^nClass Multipliers:", szName, g_szPlayerClass[pid], pev(pid, pev_health));
  1398. nLen += format( szStatus[nLen], 511-nLen, "^nHealth: %f", g_fClassMultiplier[pid][ATT_HEALTH]);
  1399. nLen += format( szStatus[nLen], 511-nLen, "^nSpeed: %f", g_fClassMultiplier[pid][ATT_SPEED]);
  1400. nLen += format( szStatus[nLen], 511-nLen, "^nGravity: %f", g_fClassMultiplier[pid][ATT_GRAVITY]);
  1401. }*/
  1402. }
  1403. ShowSyncHudMsg(id, g_HudSync, szStatus);
  1404. }
  1405. if (g_iFriend[id] != 1) //enemy
  1406. {
  1407. set_hudmessage(225, 0, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
  1408. if (g_isZombie[pid])
  1409. ShowSyncHudMsg(id, g_HudSync, "%s", szName);
  1410. else
  1411. ShowSyncHudMsg(id, g_HudSync, "%s^nColor: %s", szName, g_szColorName[g_iColor[pid]]);
  1412. }
  1413. }
  1414.  
  1415. public ev_HideStatus(id)
  1416. ClearSyncHud(id, g_HudSync);
  1417.  
  1418. public cmdSay(id)
  1419. {
  1420. if (!g_isConnected[id])
  1421. return PLUGIN_HANDLED;
  1422.  
  1423. new szMessage[32]
  1424. read_args(szMessage, charsmax(szMessage));
  1425. remove_quotes(szMessage);
  1426.  
  1427. if(szMessage[0] == '/')
  1428. {
  1429. if (equali(szMessage, "/commands") == 1 || equali(szMessage, "/cmd") == 1 )
  1430. {
  1431. print_color(id, "%s /class, /respawn, /random, /mycolor, /gun%s%s%s", MODNAME, (g_iColorMode ? ", /whois <color>": ""), (g_iColorMode != 2 ? ", /colors":""), (access(id, FLAGS_LOCK) ? ", /lock":"") );
  1432. }
  1433. else if (equali(szMessage, "/class") == 1)
  1434. {
  1435. show_zclass_menu(id, 0)
  1436. }
  1437. else if (equali(szMessage, "/respawn") == 1 || equali(szMessage, "/revive") == 1 || equali(szMessage, "/fixspawn") == 1)
  1438. {
  1439. if (g_boolCanBuild && !g_isZombie[id])
  1440. ExecuteHamB(Ham_CS_RoundRespawn, id)
  1441. else if (g_isZombie[id])
  1442. {
  1443. if (pev(id, pev_health) == float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id])) || !is_user_alive(id))
  1444. ExecuteHamB(Ham_CS_RoundRespawn, id)
  1445. else
  1446. client_print(id, print_center, "%L", LANG_SERVER, "FAIL_SPAWN");
  1447. }
  1448. }
  1449. else if (equali(szMessage, "/lock") == 1 || equali(szMessage, "/claim") == 1 && g_isAlive[id])
  1450. {
  1451. if (access(id, FLAGS_LOCK))
  1452. cmdLockBlock(id)
  1453. else
  1454. client_print(id, print_center, "%L", LANG_SERVER, "FAIL_ACCESS");
  1455. return PLUGIN_HANDLED;
  1456. }
  1457. else if (equal(szMessage, "/whois",6) && g_iColorMode)
  1458. {
  1459. for ( new i=0; i<MAX_COLORS; i++)
  1460. {
  1461. if (equali(szMessage[7], g_szColorName[i]) == 1)
  1462. {
  1463. if (g_iColorOwner[i])
  1464. {
  1465. new szPlayerName[32]
  1466. get_user_name(g_iColorOwner[i], szPlayerName, charsmax( szPlayerName ) );
  1467. print_color(id, "%s^x04 %s^x01's color is^x04 %s", MODNAME, szPlayerName, g_szColorName[i]);
  1468. }
  1469. else
  1470. print_color(id, "%s %L^x04 %s", MODNAME, LANG_SERVER, "COLOR_NONE", g_szColorName[i]);
  1471.  
  1472. break;
  1473. }
  1474. }
  1475. }
  1476. else if (equali(szMessage, "/colors") == 1 && !g_isZombie[id] && g_boolCanBuild && g_iColorMode != 2)
  1477. {
  1478. show_colors_menu(id, 0)
  1479. }
  1480. else if (equali(szMessage, "/mycolor") == 1 && !g_isZombie[id])
  1481. {
  1482. print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_YOURS", g_szColorName[g_iColor[id]]);
  1483. return PLUGIN_HANDLED
  1484. }
  1485. else if (equali(szMessage, "/random") == 1 && !g_isZombie[id] && g_boolCanBuild)
  1486. {
  1487. new i = random(MAX_COLORS)
  1488. if (g_iColorMode)
  1489. {
  1490. while (g_iColorOwner[i])
  1491. {
  1492. i = random(MAX_COLORS)
  1493. }
  1494. }
  1495. print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_RANDOM", g_szColorName[i]);
  1496. g_iColorOwner[g_iColor[id]] = 0
  1497. g_iColor[id] = i
  1498. g_iColorOwner[i] = id
  1499.  
  1500. for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
  1501. {
  1502. if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
  1503. set_pev(iEnt,pev_rendercolor,g_fColor[g_iColor[id]])
  1504. }
  1505.  
  1506. ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
  1507. }
  1508. if (equali(szMessage, "/weapons") == 1 || equali(szMessage, "/guns") == 1 )
  1509. {
  1510. show_method_menu( id )
  1511. }
  1512. else if (equali(szMessage, "/gun", 5) && g_iGunsMenu)
  1513. {
  1514. if(!g_isAlive[id] || g_isZombie[id])
  1515. return PLUGIN_HANDLED
  1516.  
  1517. if (access(id, FLAGS_GUNS))
  1518. {
  1519. new player = cmd_target(id, szMessage[6], 0)
  1520.  
  1521. if (!player)
  1522. {
  1523. //if (is_credits_active())
  1524. #if defined BB_CREDITS
  1525. credits_show_gunsmenu(id)
  1526. #else
  1527. show_method_menu(id)
  1528. #endif
  1529. return PLUGIN_CONTINUE
  1530. }
  1531.  
  1532. cmdGuns(id, player)
  1533. return PLUGIN_HANDLED;
  1534. }
  1535. else
  1536. {
  1537. if(!g_boolCanBuild || !g_boolRepick[id])
  1538. return PLUGIN_HANDLED
  1539.  
  1540. //if (is_credits_active())
  1541. #if defined BB_CREDITS
  1542. credits_show_gunsmenu(id)
  1543. #else
  1544. show_method_menu(id)
  1545. #endif
  1546. return PLUGIN_HANDLED
  1547. }
  1548. }
  1549. else if (equal(szMessage, "/swap",5) && access(id, FLAGS_SWAP))
  1550. {
  1551. new player = cmd_target(id, szMessage[6], 0)
  1552.  
  1553. if (!player)
  1554. {
  1555. print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
  1556. return PLUGIN_CONTINUE
  1557. }
  1558.  
  1559. cmdSwap(id, player)
  1560. }
  1561. else if (equal(szMessage, "/revive",7) && access(id, FLAGS_REVIVE))
  1562. {
  1563. new player = cmd_target(id, szMessage[8], 0)
  1564.  
  1565. if (!player)
  1566. {
  1567. print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
  1568. return PLUGIN_CONTINUE
  1569. }
  1570.  
  1571. cmdRevive(id, player)
  1572. }
  1573. else if (equal(szMessage, "/ban",4) && access(id, FLAGS_BUILDBAN))
  1574. {
  1575. new player = cmd_target(id, szMessage[5], 0)
  1576.  
  1577. if (!player)
  1578. {
  1579. print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
  1580. return PLUGIN_CONTINUE
  1581. }
  1582.  
  1583. cmdBuildBan(id, player)
  1584. }
  1585. else if (equal(szMessage, "/releasezombies",5) && access(id, FLAGS_RELEASE))
  1586. {
  1587. cmdStartRound(id)
  1588. }
  1589. }
  1590. return PLUGIN_CONTINUE
  1591. }
  1592.  
  1593. public cmdSwap(id, target)
  1594. {
  1595. if (access(id, FLAGS_SWAP))
  1596. {
  1597. new player
  1598.  
  1599. if (target) player = target
  1600. else
  1601. {
  1602. new arg[32]
  1603. read_argv(1, arg, charsmax( arg ) );
  1604. player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
  1605. }
  1606.  
  1607. if (!player || !is_user_connected(player))
  1608. return client_print(id, print_console, "[PerfectList] %L", LANG_SERVER, "FAIL_NAME");
  1609.  
  1610. cs_set_user_team(player,( g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T))
  1611.  
  1612. if (is_user_alive(player))
  1613. ExecuteHamB(Ham_CS_RoundRespawn, player)
  1614.  
  1615. new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
  1616. get_user_name(id,szAdminName, charsmax( szAdminName ) )
  1617. get_user_authid (id,szAdminAuthid, charsmax( szAdminAuthid ) )
  1618. get_user_name(player, szPlayerName, charsmax( szPlayerName ) )
  1619. get_user_authid (player,szPlayerID, charsmax( szPlayerID ) )
  1620.  
  1621. client_print(id, print_console, "[PerfectList] Player %s was swapped from the %s team to the %s team", szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "zombie":"builder", g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
  1622. Log("[SWAP] Admin: %s || SteamID: %s swapped Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
  1623.  
  1624. set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
  1625. show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_SWAP");
  1626.  
  1627. print_color(0, "%s Player^x04 %s^x01 has been^x04 swapped^x01 to the^x04 %s^x01 team", MODNAME, szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
  1628. }
  1629. return PLUGIN_HANDLED
  1630. }
  1631.  
  1632. public cmdRevive(id, target)
  1633. {
  1634. if (access(id, FLAGS_REVIVE))
  1635. {
  1636. new player
  1637. if (target) player = target
  1638. else
  1639. {
  1640. new arg[32]
  1641. read_argv(1, arg, charsmax( arg ) )
  1642. player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
  1643. }
  1644.  
  1645. if (!player || !is_user_connected(player))
  1646. return client_print(id, print_console, "[PerfectList] %L", LANG_SERVER, "FAIL_NAME");
  1647.  
  1648. ExecuteHamB(Ham_CS_RoundRespawn, player)
  1649.  
  1650. new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
  1651. get_user_name(id,szAdminName,charsmax( szAdminName ))
  1652. get_user_authid (id,szAdminAuthid, charsmax( szAdminAuthid ))
  1653. get_user_name(player, szPlayerName, charsmax( szPlayerName ))
  1654. get_user_authid (player,szPlayerID, charsmax( szPlayerID ) )
  1655.  
  1656. client_print(id, print_console, "[PerfectList] Player %s has been^x04 revived", szPlayerName)
  1657. Log("[REVIVE] Admin: %s || SteamID: %s revived Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
  1658.  
  1659. set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
  1660. show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_REVIVE");
  1661.  
  1662. print_color(0, "%s Player^x04 %s^x01 has been^x04 revived^x01 by an admin", MODNAME, szPlayerName)
  1663. }
  1664. return PLUGIN_HANDLED
  1665. }
  1666.  
  1667. public cmdGuns(id, target)
  1668. {
  1669. if (access(id, FLAGS_GUNS))
  1670. {
  1671. new player
  1672. if (target) player = target
  1673. else
  1674. {
  1675. new arg[32]
  1676. read_argv(1, arg, charsmax( arg ))
  1677. player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
  1678. }
  1679.  
  1680. if (!player || !is_user_connected(player))
  1681. {
  1682. client_print(id, print_console, "[PerfectList] %L", LANG_SERVER, "FAIL_NAME");
  1683. return PLUGIN_HANDLED;
  1684. }
  1685.  
  1686. if (g_isZombie[player])
  1687. {
  1688. return PLUGIN_HANDLED;
  1689. }
  1690.  
  1691. if (!g_isAlive[player])
  1692. {
  1693. client_print(id, print_console, "[PerfectList] %L", LANG_SERVER, "FAIL_DEAD");
  1694. return PLUGIN_HANDLED;
  1695. }
  1696.  
  1697. //if (is_credits_active())
  1698. #if defined BB_CREDITS
  1699. credits_show_gunsmenu(player)
  1700. #else
  1701. show_method_menu(player)
  1702. #endif
  1703.  
  1704. new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
  1705. get_user_name(id,szAdminName,charsmax( szAdminName ) )
  1706. get_user_authid (id,szAdminAuthid, charsmax( szAdminAuthid ))
  1707. get_user_name(player, szPlayerName, charsmax( szPlayerName ))
  1708. get_user_authid (player,szPlayerID, charsmax( szPlayerID ))
  1709.  
  1710. client_print(id, print_console, "[PerfectList] Player %s has had his weapons menu re-opened", szPlayerName);
  1711. Log("[GUNS] Admin: %s || SteamID: %s opened the guns menu for Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID);
  1712.  
  1713. set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
  1714. show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_GUNS");
  1715.  
  1716. print_color(0, "%s Player^x04 %s^x01 has had their^x04 guns^x01 menu^x04 re-opened", MODNAME, szPlayerName)
  1717. }
  1718. return PLUGIN_HANDLED
  1719. }
  1720.  
  1721. public cmdStartRound(id)
  1722. {
  1723. if (access(id, FLAGS_RELEASE))
  1724. {
  1725. native_release_zombies()
  1726. }
  1727. }
  1728.  
  1729. public Release_Zombies()
  1730. {
  1731. g_boolCanBuild = false
  1732. remove_task(TASK_BUILD);
  1733.  
  1734. g_boolPrepTime = false
  1735. remove_task(TASK_PREPTIME);
  1736.  
  1737. new players[32], num, player, szWeapon[32]
  1738. get_players(players, num, "a")
  1739. for(new i = 0; i < num; i++)
  1740. {
  1741. player = players[i]
  1742.  
  1743. if (!g_isZombie[player])
  1744. {
  1745. if (g_iOwnedEnt[player])
  1746. cmdStopEnt(player)
  1747.  
  1748. if(g_iGrenadeHE ) give_item(player,"weapon_hegrenade" ), cs_set_user_bpammo(player,CSW_HEGRENADE, g_iGrenadeHE)
  1749. if(g_iGrenadeFLASH ) give_item(player,"weapon_flashbang" ), cs_set_user_bpammo(player,CSW_FLASHBANG, g_iGrenadeFLASH)
  1750. if(g_iGrenadeSMOKE ) give_item(player,"weapon_smokegrenade" ), cs_set_user_bpammo(player,CSW_SMOKEGRENADE, g_iGrenadeSMOKE)
  1751.  
  1752. if (g_iPrimaryWeapon[player])
  1753. {
  1754. get_weaponname(g_iPrimaryWeapon[player],szWeapon,sizeof szWeapon - 1)
  1755. engclient_cmd(player, szWeapon);
  1756. }
  1757. }
  1758. }
  1759.  
  1760. set_pev(g_iEntBarrier,pev_solid,SOLID_NOT)
  1761. set_pev(g_iEntBarrier,pev_renderamt,Float:{ 0.0 })
  1762.  
  1763. set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
  1764. show_hudmessage(0, "%L", LANG_SERVER, "RELEASE_ANNOUNCE");
  1765. client_cmd(0, "spk %s", g_szRoundStart[ random( sizeof g_szRoundStart ) ] )
  1766.  
  1767. ExecuteForward(g_fwRoundStart, g_fwDummyResult);
  1768. }
  1769.  
  1770. public fw_CmdStart( id, uc_handle, randseed )
  1771. {
  1772. if (!g_isConnected[id] || !g_isAlive[id])
  1773. return FMRES_IGNORED
  1774.  
  1775. //new button = pev(id, pev_button)
  1776. new button = get_uc( uc_handle , UC_Buttons );
  1777. new oldbutton = pev(id, pev_oldbuttons)
  1778.  
  1779. if( button & IN_USE && !(oldbutton & IN_USE) && !g_iOwnedEnt[id])
  1780. cmdGrabEnt(id)
  1781. else if( oldbutton & IN_USE && !(button & IN_USE) && g_iOwnedEnt[id])
  1782. cmdStopEnt(id)
  1783.  
  1784. return FMRES_IGNORED;
  1785. }
  1786.  
  1787. public cmdGrabEnt(id)
  1788. {
  1789. if (g_fBuildDelay[id] + BUILD_DELAY > get_gametime())
  1790. {
  1791. g_fBuildDelay[id] = get_gametime()
  1792. client_print (id, print_center, "%L", LANG_SERVER, "BUILD_SPAM")
  1793. return PLUGIN_HANDLED
  1794. }
  1795. else
  1796. g_fBuildDelay[id] = get_gametime()
  1797.  
  1798. if (g_isBuildBan[id])
  1799. {
  1800. client_print (id, print_center, "%L", LANG_SERVER, "BUILD_BANNED")
  1801. client_cmd(id, "spk %s", LOCK_FAIL);
  1802. return PLUGIN_HANDLED;
  1803. }
  1804.  
  1805. if (g_isZombie[id] && !access(id, FLAGS_OVERRIDE))
  1806. return PLUGIN_HANDLED
  1807.  
  1808. if (!g_boolCanBuild && !access(id, FLAGS_BUILD) && !access(id, FLAGS_OVERRIDE))
  1809. {
  1810. client_print (id, print_center, "%L", LANG_SERVER, "BUILD_NOTIME")
  1811. return PLUGIN_HANDLED
  1812. }
  1813.  
  1814. if (g_iOwnedEnt[id] && is_valid_ent(g_iOwnedEnt[id]))
  1815. cmdStopEnt(id)
  1816.  
  1817. new ent, bodypart
  1818. get_user_aiming (id,ent,bodypart)
  1819.  
  1820. if (!is_valid_ent(ent) || ent == g_iEntBarrier || is_user_alive(ent) || IsMovingEnt(ent))
  1821. return PLUGIN_HANDLED;
  1822.  
  1823. if ((BlockLocker(ent) && BlockLocker(ent) != id) || (BlockLocker(ent) && !access(id, FLAGS_OVERRIDE)))
  1824. return PLUGIN_HANDLED;
  1825.  
  1826. new szClass[10], szTarget[7];
  1827. entity_get_string(ent, EV_SZ_classname, szClass, 9);
  1828. entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
  1829. if (!equal(szClass, "func_wall") || equal(szTarget, "ignore"))
  1830. return PLUGIN_HANDLED;
  1831.  
  1832. ExecuteForward(g_fwGrabEnt_Pre, g_fwDummyResult, id, ent);
  1833.  
  1834. new Float:fOrigin[3], iAiming[3], Float:fAiming[3]
  1835.  
  1836. get_user_origin(id, iAiming, 3);
  1837. IVecFVec(iAiming, fAiming);
  1838. entity_get_vector(ent, EV_VEC_origin, fOrigin);
  1839.  
  1840. g_fOffset1[id] = fOrigin[0] - fAiming[0];
  1841. g_fOffset2[id] = fOrigin[1] - fAiming[1];
  1842. g_fOffset3[id] = fOrigin[2] - fAiming[2];
  1843.  
  1844. g_fEntDist[id] = get_user_aiming(id, ent, bodypart);
  1845.  
  1846. if (g_fEntMinDist)
  1847. {
  1848. if (g_fEntDist[id] < g_fEntMinDist)
  1849. g_fEntDist[id] = g_fEntSetDist;
  1850. }
  1851. else if (g_fEntMaxDist)
  1852. {
  1853. if (g_fEntDist[id] > g_fEntMaxDist)
  1854. return PLUGIN_HANDLED
  1855. }
  1856.  
  1857. set_pev(ent,pev_rendermode,kRenderTransColor)
  1858. set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]] )
  1859. set_pev(ent,pev_renderamt, g_fRenderAmt[g_iColor[id]] )
  1860.  
  1861. MovingEnt(ent);
  1862. SetEntMover(ent, id);
  1863. g_iOwnedEnt[id] = ent
  1864.  
  1865. //Checked after object is successfully grabbed
  1866. if (!g_boolCanBuild && (access(id, FLAGS_BUILD) || access(id, FLAGS_OVERRIDE)))
  1867. {
  1868. new adminauthid[32],adminname[32]
  1869. get_user_authid (id,adminauthid,charsmax( adminauthid ) );
  1870. get_user_name(id,adminname,charsmax( adminname ) );
  1871. Log("[MOVE] Admin: %s || SteamID: %s moved an entity", adminname, adminauthid)
  1872. }
  1873.  
  1874. client_cmd(id, "spk %s", GRAB_START);
  1875.  
  1876. ExecuteForward(g_fwGrabEnt_Post, g_fwDummyResult, id, ent);
  1877.  
  1878. return PLUGIN_HANDLED
  1879. }
  1880.  
  1881. public cmdStopEnt(id)
  1882. {
  1883. if (!g_iOwnedEnt[id])
  1884. return PLUGIN_HANDLED;
  1885.  
  1886. new ent = g_iOwnedEnt[id]
  1887.  
  1888. ExecuteForward(g_fwDropEnt_Pre, g_fwDummyResult, id, ent);
  1889.  
  1890. if (BlockLocker(ent))
  1891. {
  1892. switch(g_iLockBlocks)
  1893. {
  1894. case 0:
  1895. {
  1896. set_pev(ent,pev_rendermode,kRenderTransColor)
  1897. set_pev(ent,pev_rendercolor, Float:{ LOCKED_COLOR })
  1898. set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
  1899. }
  1900. case 1:
  1901. {
  1902. set_pev(ent,pev_rendermode,kRenderTransColor)
  1903. set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]])
  1904. set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
  1905. }
  1906. }
  1907. }
  1908. else
  1909. set_pev(ent,pev_rendermode,kRenderNormal)
  1910.  
  1911. UnsetEntMover(ent);
  1912. SetLastMover(ent,id);
  1913. g_iOwnedEnt[id] = 0;
  1914. UnmovingEnt(ent);
  1915.  
  1916. client_cmd(id, "spk %s", GRAB_STOP);
  1917.  
  1918. ExecuteForward(g_fwDropEnt_Post, g_fwDummyResult, id, ent);
  1919.  
  1920. return PLUGIN_HANDLED;
  1921. }
  1922.  
  1923. public cmdLockBlock(id)
  1924. {
  1925. if (!g_boolCanBuild && g_iLockBlocks)
  1926. {
  1927. client_print(id, print_center, "%L", LANG_SERVER, "FAIL_LOCK");
  1928. return PLUGIN_HANDLED;
  1929. }
  1930.  
  1931. if (!access(id, FLAGS_LOCK) || (g_isZombie[id] && !access(id, FLAGS_OVERRIDE)))
  1932. return PLUGIN_HANDLED;
  1933.  
  1934. new ent, bodypart
  1935. get_user_aiming (id,ent,bodypart)
  1936.  
  1937. new szTarget[7], szClass[10];
  1938. entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
  1939. entity_get_string(ent, EV_SZ_classname, szClass, 9);
  1940. if (!ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(szClass, "func_wall") || equal(szTarget, "ignore"))
  1941. return PLUGIN_HANDLED;
  1942.  
  1943. ExecuteForward(g_fwLockEnt_Pre, g_fwDummyResult, id, ent);
  1944.  
  1945. switch (g_iLockBlocks)
  1946. {
  1947. case 0:
  1948. {
  1949. if (!BlockLocker(ent) && !IsMovingEnt(ent))
  1950. {
  1951. LockBlock(ent, id);
  1952. set_pev(ent,pev_rendermode,kRenderTransColor)
  1953. set_pev(ent,pev_rendercolor,Float:{LOCKED_COLOR})
  1954. set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
  1955. client_cmd(id, "spk %s", LOCK_OBJECT);
  1956. }
  1957. else if (BlockLocker(ent))
  1958. {
  1959. UnlockBlock(ent)
  1960. set_pev(ent,pev_rendermode,kRenderNormal)
  1961. client_cmd(id, "spk %s", LOCK_OBJECT);
  1962. }
  1963. }
  1964. case 1:
  1965. {
  1966. if (!BlockLocker(ent) && !IsMovingEnt(ent))
  1967. {
  1968. if (g_iOwnedEntities[id]<g_iLockMax || !g_iLockMax)
  1969. {
  1970. LockBlock(ent, id)
  1971. g_iOwnedEntities[id]++
  1972. set_pev(ent,pev_rendermode,kRenderTransColor)
  1973. set_pev(ent,pev_rendercolor,g_fColor[g_iColor[id]])
  1974. set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
  1975.  
  1976. client_print(id, print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_NEW", g_iOwnedEntities[id], g_iLockMax)
  1977. client_cmd(id, "spk %s", LOCK_OBJECT);
  1978. }
  1979. else if (g_iOwnedEntities[id]>=g_iLockMax)
  1980. {
  1981. client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_MAX", g_iLockMax)
  1982. client_cmd(id, "spk %s", LOCK_FAIL);
  1983. }
  1984. }
  1985. else if (BlockLocker(ent))
  1986. {
  1987. if (BlockLocker(ent) == id || access(id, FLAGS_OVERRIDE))
  1988. {
  1989. g_iOwnedEntities[BlockLocker(ent)]--
  1990. set_pev(ent,pev_rendermode,kRenderNormal)
  1991.  
  1992. client_print(BlockLocker(ent), print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_LOST", g_iOwnedEntities[BlockLocker(ent)], g_iLockMax)
  1993.  
  1994. UnlockBlock(ent)
  1995. client_cmd(id, "spk %s", LOCK_OBJECT);
  1996. }
  1997. else
  1998. {
  1999. client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_FAIL")
  2000. client_cmd(id, "spk %s", LOCK_FAIL);
  2001. }
  2002. }
  2003. }
  2004. }
  2005.  
  2006. ExecuteForward(g_fwLockEnt_Post, g_fwDummyResult, id, ent);
  2007.  
  2008. return PLUGIN_HANDLED
  2009. }
  2010.  
  2011. public cmdBuildBan(id, target)
  2012. {
  2013. if (access(id, FLAGS_BUILDBAN))
  2014. {
  2015. new player
  2016. if (target) player = target
  2017. else
  2018. {
  2019. new arg[32]
  2020. read_argv(1, arg, charsmax( arg ))
  2021. player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY)
  2022. }
  2023.  
  2024. if (!player)
  2025. return client_print(id, print_console, "[PerfectList] %L", LANG_SERVER, "FAIL_NAME");
  2026.  
  2027. new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
  2028. get_user_name(id,szAdminName,charsmax( szAdminName ) );
  2029. get_user_authid (id,szAdminAuthid,charsmax( szAdminAuthid ) );
  2030. get_user_name(player, szPlayerName, charsmax( szPlayerName ) );
  2031. get_user_authid (player,szPlayerID,charsmax( szPlayerID ) );
  2032.  
  2033. g_isBuildBan[player] = g_isBuildBan[player] ? false : true
  2034.  
  2035. if (g_isBuildBan[player] && g_iOwnedEnt[player])
  2036. cmdStopEnt(player)
  2037.  
  2038. client_print(id, print_console, "[PerfectList] Player %s was %s from building", szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
  2039. Log("[MOVE] Admin: %s || SteamID: %s banned Player: %s || SteamID: %s from building", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
  2040.  
  2041. set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
  2042. show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_BUILDBAN", g_isBuildBan[player] ? "disabled":"re-enabled");
  2043.  
  2044. print_color(0, "%s Player^x04 %s^x01 has been^x04 %s^x01 from building", MODNAME, szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
  2045. }
  2046.  
  2047. return PLUGIN_HANDLED;
  2048. }
  2049.  
  2050. public fw_PlayerPreThink(id)
  2051. {
  2052. if (!is_user_connected(id))
  2053. {
  2054. cmdStopEnt(id)
  2055. return PLUGIN_HANDLED
  2056. }
  2057.  
  2058. if (g_isZombie[id])
  2059. set_pev(id, pev_maxspeed, g_fPlayerSpeed[id])
  2060.  
  2061. if (!g_iOwnedEnt[id] || !is_valid_ent(g_iOwnedEnt[id]))
  2062. return FMRES_HANDLED
  2063.  
  2064. new buttons = pev(id, pev_button)
  2065. if (buttons & IN_ATTACK)
  2066. {
  2067. g_fEntDist[id] += OBJECT_PUSHPULLRATE;
  2068.  
  2069. if (g_fEntDist[id] > g_fEntMaxDist)
  2070. {
  2071. g_fEntDist[id] = g_fEntMaxDist
  2072. client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MAX")
  2073. }
  2074. else
  2075. client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PUSH")
  2076.  
  2077. ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 1);
  2078. }
  2079. else if (buttons & IN_ATTACK2)
  2080. {
  2081. g_fEntDist[id] -= OBJECT_PUSHPULLRATE;
  2082.  
  2083. if (g_fEntDist[id] < g_fEntSetDist)
  2084. {
  2085. g_fEntDist[id] = g_fEntSetDist
  2086. client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MIN")
  2087. }
  2088. else
  2089. client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PULL")
  2090.  
  2091. ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 2);
  2092. }
  2093.  
  2094. new iOrigin[3], iLook[3], Float:fOrigin[3], Float:fLook[3], Float:vMoveTo[3], Float:fLength
  2095.  
  2096. get_user_origin(id, iOrigin, 1);
  2097. IVecFVec(iOrigin, fOrigin);
  2098. get_user_origin(id, iLook, 3);
  2099. IVecFVec(iLook, fLook);
  2100.  
  2101. fLength = get_distance_f(fLook, fOrigin);
  2102. if (fLength == 0.0) fLength = 1.0;
  2103.  
  2104. vMoveTo[0] = (fOrigin[0] + (fLook[0] - fOrigin[0]) * g_fEntDist[id] / fLength) + g_fOffset1[id];
  2105. vMoveTo[1] = (fOrigin[1] + (fLook[1] - fOrigin[1]) * g_fEntDist[id] / fLength) + g_fOffset2[id];
  2106. vMoveTo[2] = (fOrigin[2] + (fLook[2] - fOrigin[2]) * g_fEntDist[id] / fLength) + g_fOffset3[id];
  2107. vMoveTo[2] = float(floatround(vMoveTo[2], floatround_floor));
  2108.  
  2109. entity_set_origin(g_iOwnedEnt[id], vMoveTo);
  2110.  
  2111. return FMRES_HANDLED
  2112. }
  2113.  
  2114. public fw_Traceline(Float:start[3], Float:end[3], conditions, id, trace)
  2115. {
  2116. if (!is_user_alive(id))
  2117. return PLUGIN_HANDLED
  2118.  
  2119. new ent = get_tr2(trace, TR_pHit)
  2120.  
  2121. if (is_valid_ent(ent))
  2122. {
  2123. new ent,body
  2124. get_user_aiming(id,ent,body)
  2125.  
  2126. new szClass[10], szTarget[7];
  2127. entity_get_string(ent, EV_SZ_classname, szClass, 9);
  2128. entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
  2129. if (equal(szClass, "func_wall") && !equal(szTarget, "ignore") && ent != g_iEntBarrier && g_iShowMovers == 1)
  2130. {
  2131. if (g_boolCanBuild || access(id, ADMIN_KICK))
  2132. {
  2133. set_hudmessage(0, 50, 255, -1.0, 0.55, 1, 0.01, 3.0, 0.01, 0.01);
  2134. if (!BlockLocker(ent))
  2135. {
  2136. new szCurMover[32], szLastMover[32]
  2137. if (GetEntMover(ent))
  2138. {
  2139. get_user_name(GetEntMover(ent),szCurMover, charsmax( szCurMover ) )
  2140. if (!GetLastMover(ent))
  2141. ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: NONE", szCurMover);
  2142. }
  2143. if (GetLastMover(ent))
  2144. {
  2145. get_user_name(GetLastMover(ent),szLastMover, charsmax( szLastMover ) )
  2146. if (!GetEntMover(ent))
  2147. ShowSyncHudMsg(id, g_HudSync, "Current Mover: NONE^nLast Mover: %s", szLastMover);
  2148. }
  2149. if (GetEntMover(ent) && GetLastMover(ent))
  2150. ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: %s", szCurMover, szLastMover);
  2151. else if (!GetEntMover(ent) && !GetLastMover(ent))
  2152. ShowSyncHudMsg(id, g_HudSync, "This object hasn't been moved");
  2153. }
  2154. else
  2155. {
  2156. new szEntOwner[32]
  2157. get_user_name(BlockLocker(ent),szEntOwner, charsmax( szEntOwner) )
  2158. ShowSyncHudMsg(id, g_HudSync, "Claimed by: %s", szEntOwner);
  2159. }
  2160. }
  2161. }
  2162. }
  2163. else ClearSyncHud(id, g_HudSync);
  2164.  
  2165. return PLUGIN_HANDLED
  2166. }
  2167.  
  2168. public fw_EmitSound(id,channel,const sample[],Float:volume,Float:attn,flags,pitch)
  2169. {
  2170. if (!is_user_connected(id) || !g_isZombie[id] || g_boolCanBuild || g_boolPrepTime || g_boolRoundEnded)
  2171. return FMRES_IGNORED;
  2172.  
  2173. if(equal(sample[7], "die", 3) || equal(sample[7], "dea", 3))
  2174. {
  2175. emit_sound(id,channel,g_szZombieDie[random(sizeof g_szZombieDie - 1)],volume,attn,flags,pitch)
  2176. return FMRES_SUPERCEDE
  2177. }
  2178.  
  2179. if(equal(sample[7], "bhit", 4))
  2180. {
  2181. emit_sound(id,channel,g_szZombiePain[random(sizeof g_szZombiePain - 1)],volume,attn,flags,pitch)
  2182. return FMRES_SUPERCEDE
  2183. }
  2184.  
  2185. // Zombie attacks with knife
  2186. if (equal(sample[8], "kni", 3))
  2187. {
  2188. if (equal(sample[14], "sla", 3)) // slash
  2189. {
  2190. emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
  2191. return FMRES_SUPERCEDE;
  2192. }
  2193. if (equal(sample[14], "hit", 3)) // hit
  2194. {
  2195. if (sample[17] == 'w') // wall
  2196. {
  2197. emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
  2198. return FMRES_SUPERCEDE;
  2199. }
  2200. else
  2201. {
  2202. emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
  2203. return FMRES_SUPERCEDE;
  2204. }
  2205. }
  2206. if (equal(sample[14], "sta", 3)) // stab
  2207. {
  2208. emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
  2209. return FMRES_SUPERCEDE;
  2210. }
  2211. }
  2212.  
  2213. return FMRES_IGNORED
  2214. }
  2215.  
  2216. public fw_Suicide(id) return FMRES_SUPERCEDE
  2217.  
  2218. public show_colors_menu(id,offset)
  2219. {
  2220. if(offset<0) offset = 0
  2221.  
  2222. new keys, curnum, menu[2048]
  2223. for(new i=offset;i<MAX_COLORS;i++)
  2224. {
  2225. if (g_iColorMode == 0 || (g_iColorMode == 1 && !g_iColorOwner[i]))
  2226. {
  2227. g_iMenuOptions[id][curnum] = i
  2228. keys += (1<<curnum)
  2229.  
  2230. curnum++
  2231. format(menu,2047,"%s^n%d. %s", menu, curnum, g_szColorName[i])
  2232.  
  2233. if(curnum==8)
  2234. break;
  2235. }
  2236. }
  2237.  
  2238. format(menu,2047,"\wSelect Your Color:^nCurrent: \r%s\w^n^n%s^n", g_szColorName[g_iColor[id]], menu)
  2239. if(curnum==8 && offset<12)
  2240. {
  2241. keys += (1<<8)
  2242. format(menu,2047,"%s^n9. Next",menu)
  2243. }
  2244. if(offset)
  2245. {
  2246. keys += (1<<9)
  2247. format(menu,2047,"%s^n0. Back",menu)
  2248. }
  2249.  
  2250. show_menu(id,keys,menu,-1,"ColorsSelect")
  2251. }
  2252.  
  2253. public colors_pushed(id,key)
  2254. {
  2255. if(key<8)
  2256. {
  2257. g_iColorOwner[g_iMenuOptions[id][key]] = id
  2258. g_iColorOwner[g_iColor[id]] = 0
  2259. g_iColor[id] = g_iMenuOptions[id][key]
  2260. print_color(id, "%s You have picked^x04 %s^x01 as your color", MODNAME, g_szColorName[g_iColor[id]])
  2261. g_iMenuOffset[id] = 0
  2262.  
  2263. ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
  2264. }
  2265. else
  2266. {
  2267. if(key==8)
  2268. g_iMenuOffset[id] += 8
  2269. if(key==9)
  2270. g_iMenuOffset[id] -= 8
  2271. show_colors_menu(id,g_iMenuOffset[id])
  2272. }
  2273.  
  2274. return ;
  2275. }
  2276.  
  2277. public show_zclass_menu(id,offset)
  2278. {
  2279. if(offset<0) offset = 0
  2280.  
  2281. new keys, curnum, menu[512], szCache1[32], szCache2[32], iCache3
  2282. for(new i=offset;i<g_iZClasses;i++)
  2283. {
  2284. ArrayGetString(g_zclass_name, i, szCache1, charsmax(szCache1))
  2285. ArrayGetString(g_zclass_info, i, szCache2, charsmax(szCache2))
  2286. iCache3 = ArrayGetCell(g_zclass_admin, i)
  2287.  
  2288. // Add to menu
  2289. if (i == g_iZombieClass[id])
  2290. format(menu,511,"%s^n\d%d. %s %s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "" : "(Admin Only)")
  2291. else
  2292. format(menu,511,"%s^n\w%d. %s \y%s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "" : "(Admin Only)")
  2293.  
  2294. g_iMenuOptions[id][curnum] = i
  2295. keys += (1<<curnum)
  2296.  
  2297. curnum++
  2298.  
  2299. if(curnum==8)
  2300. break;
  2301. }
  2302.  
  2303. format(menu,511,"\ySelect Your Class:^n\w%s^n", menu)
  2304. if(curnum==8 && offset<12)
  2305. {
  2306. keys += (1<<8)
  2307. format(menu,511,"%s^n\w9. Next",menu)
  2308. }
  2309. if(offset)
  2310. {
  2311. keys += (1<<9)
  2312. format(menu,511,"%s^n\w0. Back",menu)
  2313. }
  2314.  
  2315. show_menu(id,keys,menu,-1,"ZClassSelect")
  2316. }
  2317.  
  2318. public zclass_pushed(id,key)
  2319. {
  2320. if(key<8)
  2321. {
  2322. if (g_iMenuOptions[id][key] == g_iZombieClass[id])
  2323. {
  2324. client_cmd(id, "spk %s", LOCK_FAIL);
  2325.  
  2326. print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_CURRENT")
  2327. show_zclass_menu(id,g_iMenuOffset[id])
  2328. return ;
  2329. }
  2330.  
  2331. new iCache3 = ArrayGetCell(g_zclass_admin, g_iMenuOptions[id][key])
  2332.  
  2333. if ((iCache3 != ADMIN_ALL || !iCache3) && !access(id, iCache3))
  2334. {
  2335. print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_NO_ACCESS")
  2336. show_zclass_menu(id,g_iMenuOffset[id])
  2337. return ;
  2338. }
  2339.  
  2340. g_iNextClass[id] = g_iMenuOptions[id][key]
  2341.  
  2342. new szCache1[32]
  2343. ArrayGetString(g_zclass_name, g_iMenuOptions[id][key], szCache1, charsmax(szCache1))
  2344.  
  2345. if (!g_isZombie[id] || (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime)))
  2346. print_color(id, "%s You have selected^x04 %s^x01 as your next class", MODNAME, szCache1)
  2347. if (!g_isAlive[id])
  2348. print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_RESPAWN")
  2349. g_iMenuOffset[id] = 0
  2350.  
  2351. if (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime))
  2352. ExecuteHamB(Ham_CS_RoundRespawn, id)
  2353.  
  2354. ExecuteForward(g_fwClassPicked, g_fwDummyResult, id, g_iZombieClass[id]);
  2355. }
  2356. else
  2357. {
  2358. if(key==8)
  2359. g_iMenuOffset[id] += 8
  2360. if(key==9)
  2361. g_iMenuOffset[id] -= 8
  2362. show_zclass_menu(id,g_iMenuOffset[id])
  2363. }
  2364.  
  2365. return ;
  2366. }
  2367.  
  2368. /*------------------------------------------------------------------------------------------------*/
  2369. public show_method_menu(id)
  2370. {
  2371. if(g_boolFirstTime[id])
  2372. {
  2373. g_boolFirstTime[id] = false
  2374. show_primary_menu(id,0)
  2375. }
  2376. else
  2377. {
  2378. g_iMenuOffset[id] = 0
  2379. show_menu(id,(1<<0)|(1<<1),"\r[\yPerfectList\r] \wChoose Your Weapon^n\d- NOTE:\w Type /guns to oepn again this menu^n\y1. \wNew Guns^n\y2. \wLast Guns",-1,"WeaponMethodMenu")
  2380. }
  2381. }
  2382.  
  2383. public weapon_method_pushed(id,key)
  2384. {
  2385. switch(key)
  2386. {
  2387. case 0: show_primary_menu(id,0)
  2388. case 1: give_weapons(id)
  2389. }
  2390. return ;
  2391. }
  2392.  
  2393. public show_primary_menu(id,offset)
  2394. {
  2395. if(offset<0) offset = 0
  2396.  
  2397. new cvar_value[32]
  2398. get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
  2399. new flags = read_flags(cvar_value)
  2400.  
  2401. new keys, curnum, menu[2048]
  2402. for(new i=offset;i<19;i++)
  2403. {
  2404. if(flags & power(2,i))
  2405. {
  2406. g_iMenuOptions[id][curnum] = i
  2407. keys += (1<<curnum)
  2408.  
  2409. curnum++
  2410. format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
  2411.  
  2412. if(curnum==8)
  2413. break;
  2414. }
  2415. }
  2416.  
  2417. format(menu,2047,"\r[\yPerfectList\r] \wPrimary Weapon:\w^n%s^n",menu)
  2418. if(curnum==8 && offset<12)
  2419. {
  2420. keys += (1<<8)
  2421. format(menu,2047,"%s^n9. Next",menu)
  2422. }
  2423. if(offset)
  2424. {
  2425. keys += (1<<9)
  2426. format(menu,2047,"%s^n0. Back",menu)
  2427. }
  2428.  
  2429. show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
  2430. }
  2431.  
  2432. public prim_weapons_pushed(id,key)
  2433. {
  2434. if(key<8)
  2435. {
  2436. g_iWeaponPicked[0][id] = g_iMenuOptions[id][key]
  2437. g_iMenuOffset[id] = 0
  2438. show_secondary_menu(id,0)
  2439. }
  2440. else
  2441. {
  2442. if(key==8)
  2443. g_iMenuOffset[id] += 8
  2444. if(key==9)
  2445. g_iMenuOffset[id] -= 8
  2446. show_primary_menu(id,g_iMenuOffset[id])
  2447. }
  2448. return ;
  2449. }
  2450.  
  2451. public show_secondary_menu(id,offset)
  2452. {
  2453. if(offset<0) offset = 0
  2454.  
  2455. new cvar_value[32]
  2456. get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
  2457. new flags = read_flags(cvar_value)
  2458.  
  2459. new keys, curnum, menu[2048]
  2460. for(new i=18;i<24;i++)
  2461. {
  2462. if(flags & power(2,i))
  2463. {
  2464. g_iMenuOptions[id][curnum] = i
  2465. keys += (1<<curnum)
  2466.  
  2467. curnum++
  2468. format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
  2469. }
  2470. }
  2471.  
  2472. format(menu,2047,"\r[\yPerfectList\r] \wSecondary Weapon:\w^n%s",menu)
  2473.  
  2474. show_menu(id,keys,menu,-1,"SecWeaponSelect")
  2475. }
  2476.  
  2477. public sec_weapons_pushed(id,key)
  2478. {
  2479. if(key<8)
  2480. {
  2481. g_iWeaponPicked[1][id] = g_iMenuOptions[id][key]
  2482. }
  2483. give_weapons(id)
  2484. return ;
  2485. }
  2486.  
  2487. public give_weapons(id)
  2488. {
  2489. strip_user_weapons(id)
  2490. give_item(id,"weapon_knife")
  2491.  
  2492. new szWeapon[32], csw
  2493. csw = csw_contant(g_iWeaponPicked[0][id])
  2494. get_weaponname(csw,szWeapon, charsmax( szWeapon ))
  2495. give_item(id,szWeapon)
  2496. cs_set_user_bpammo(id,csw,999)
  2497. g_iPrimaryWeapon[id] = csw
  2498.  
  2499. csw = csw_contant(g_iWeaponPicked[1][id])
  2500. get_weaponname(csw,szWeapon, charsmax( szWeapon ) )
  2501. give_item(id,szWeapon)
  2502. cs_set_user_bpammo(id,csw,999)
  2503.  
  2504. g_boolRepick[id] = false
  2505. }
  2506.  
  2507. stock csw_contant(weapon)
  2508. {
  2509. new num = 29
  2510. switch(weapon)
  2511. {
  2512. case 0: num = 3
  2513. case 1: num = 5
  2514. case 2: num = 7
  2515. case 3: num = 8
  2516. case 4: num = 12
  2517. case 5: num = 13
  2518. case 6: num = 14
  2519. case 7: num = 15
  2520. case 8: num = 18
  2521. case 9: num = 19
  2522. case 10: num = 20
  2523. case 11: num = 21
  2524. case 12: num = 22
  2525. case 13: num = 23
  2526. case 14: num = 24
  2527. case 15: num = 27
  2528. case 16: num = 28
  2529. case 17: num = 30
  2530. case 18: num = 1
  2531. case 19: num = 10
  2532. case 20: num = 11
  2533. case 21: num = 16
  2534. case 22: num = 17
  2535. case 23: num = 26
  2536. case 24:
  2537. {
  2538. new s_weapon[32]
  2539.  
  2540. get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
  2541.  
  2542. new flags = read_flags(s_weapon)
  2543. do
  2544. {
  2545. num = random_num(0,18)
  2546. if(!(num & flags))
  2547. {
  2548. num = -1
  2549. }
  2550. }
  2551. while(num==-1)
  2552. num = csw_contant(num)
  2553. }
  2554. case 25:
  2555. {
  2556. new s_weapon[32]
  2557.  
  2558. get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
  2559.  
  2560. new flags = read_flags(s_weapon)
  2561. do
  2562. {
  2563. num = random_num(18,23)
  2564. if(!(num & flags))
  2565. {
  2566. num = -1
  2567. }
  2568. }
  2569. while(num==-1)
  2570. num = csw_contant(num)
  2571. }
  2572. }
  2573. return num;
  2574. }
  2575. /*------------------------------------------------------------------------------------------------*/
  2576.  
  2577. Log(const message_fmt[], any:...)
  2578. {
  2579. static message[256];
  2580. vformat(message, sizeof(message) - 1, message_fmt, 2);
  2581.  
  2582. static filename[96];
  2583. static dir[64];
  2584. if( !dir[0] )
  2585. {
  2586. get_basedir(dir, sizeof(dir) - 1);
  2587. add(dir, sizeof(dir) - 1, "/logs");
  2588. }
  2589.  
  2590. format_time(filename, sizeof(filename) - 1, "%m-%d-%Y");
  2591. format(filename, sizeof(filename) - 1, "%s/BaseBuilder_%s.log", dir, filename);
  2592.  
  2593. log_to_file(filename, "%s", message);
  2594. }
  2595.  
  2596. print_color(target, const message[], any:...)
  2597. {
  2598. static buffer[512], i, argscount
  2599. argscount = numargs()
  2600.  
  2601. // Send to everyone
  2602. if (!target)
  2603. {
  2604. static player
  2605. for (player = 1; player <= g_iMaxPlayers; player++)
  2606. {
  2607. // Not connected
  2608. if (!g_isConnected[player])
  2609. continue;
  2610.  
  2611. // Remember changed arguments
  2612. static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
  2613. changedcount = 0
  2614.  
  2615. // Replace LANG_PLAYER with player id
  2616. for (i = 2; i < argscount; i++)
  2617. {
  2618. if (getarg(i) == LANG_PLAYER)
  2619. {
  2620. setarg(i, 0, player)
  2621. changed[changedcount] = i
  2622. changedcount++
  2623. }
  2624. }
  2625.  
  2626. // Format message for player
  2627. vformat(buffer, charsmax(buffer), message, 3)
  2628.  
  2629. // Send it
  2630. message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
  2631. write_byte(player)
  2632. write_string(buffer)
  2633. message_end()
  2634.  
  2635. // Replace back player id's with LANG_PLAYER
  2636. for (i = 0; i < changedcount; i++)
  2637. setarg(changed[i], 0, LANG_PLAYER)
  2638. }
  2639. }
  2640. // Send to specific target
  2641. else
  2642. {
  2643. // Format message for player
  2644. vformat(buffer, charsmax(buffer), message, 3)
  2645.  
  2646. // Send it
  2647. message_begin(MSG_ONE, g_msgSayText, _, target)
  2648. write_byte(target)
  2649. write_string(buffer)
  2650. message_end()
  2651. }
  2652. }
  2653.  
  2654. stock fm_cs_get_current_weapon_ent(id)
  2655. return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX);
  2656.  
  2657. public native_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback, adminflags, credits)
  2658. {
  2659. if (!g_boolArraysCreated)
  2660. return 0;
  2661.  
  2662. // Strings passed byref
  2663. param_convert(1)
  2664. param_convert(2)
  2665. param_convert(3)
  2666. param_convert(4)
  2667.  
  2668. // Add the class
  2669. ArrayPushString(g_zclass_name, name)
  2670. ArrayPushString(g_zclass_info, info)
  2671.  
  2672. ArrayPushCell(g_zclass_modelsstart, ArraySize(g_zclass_playermodel))
  2673. ArrayPushString(g_zclass_playermodel, model)
  2674. ArrayPushCell(g_zclass_modelsend, ArraySize(g_zclass_playermodel))
  2675. ArrayPushCell(g_zclass_modelindex, -1)
  2676.  
  2677. ArrayPushString(g_zclass_clawmodel, clawmodel)
  2678. ArrayPushCell(g_zclass_hp, hp)
  2679. ArrayPushCell(g_zclass_spd, speed)
  2680. ArrayPushCell(g_zclass_grav, gravity)
  2681. ArrayPushCell(g_zclass_admin, adminflags)
  2682. ArrayPushCell(g_zclass_credits, credits)
  2683.  
  2684. // Set temporary new class flag
  2685. ArrayPushCell(g_zclass_new, 1)
  2686.  
  2687. // Override zombie classes data with our customizations
  2688. new i, k, buffer[32], Float:buffer2, nummodels_custom, nummodels_default, prec_mdl[100], size = ArraySize(g_zclass2_realname)
  2689. for (i = 0; i < size; i++)
  2690. {
  2691. ArrayGetString(g_zclass2_realname, i, buffer, charsmax(buffer))
  2692.  
  2693. // Check if this is the intended class to override
  2694. if (!equal(name, buffer))
  2695. continue;
  2696.  
  2697. // Remove new class flag
  2698. ArraySetCell(g_zclass_new, g_iZClasses, 0)
  2699.  
  2700. // Replace caption
  2701. ArrayGetString(g_zclass2_name, i, buffer, charsmax(buffer))
  2702. ArraySetString(g_zclass_name, g_iZClasses, buffer)
  2703.  
  2704. // Replace info
  2705. ArrayGetString(g_zclass2_info, i, buffer, charsmax(buffer))
  2706. ArraySetString(g_zclass_info, g_iZClasses, buffer)
  2707.  
  2708. nummodels_custom = ArrayGetCell(g_zclass2_modelsend, i) - ArrayGetCell(g_zclass2_modelsstart, i)
  2709. nummodels_default = ArrayGetCell(g_zclass_modelsend, g_iZClasses) - ArrayGetCell(g_zclass_modelsstart, g_iZClasses)
  2710.  
  2711. // Replace each player model and model index
  2712. for (k = 0; k < min(nummodels_custom, nummodels_default); k++)
  2713. {
  2714. ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
  2715. ArraySetString(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, buffer)
  2716.  
  2717. // Precache player model and replace its modelindex with the real one
  2718. formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
  2719. ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, engfunc(EngFunc_PrecacheModel, prec_mdl))
  2720. }
  2721.  
  2722. // We have more custom models than what we can accommodate,
  2723. // Let's make some space...
  2724. if (nummodels_custom > nummodels_default)
  2725. {
  2726. for (k = nummodels_default; k < nummodels_custom; k++)
  2727. {
  2728. ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
  2729. ArrayInsertStringAfter(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, buffer)
  2730.  
  2731. // Precache player model and retrieve its modelindex
  2732. formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
  2733. ArrayInsertCellAfter(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, engfunc(EngFunc_PrecacheModel, prec_mdl))
  2734. }
  2735.  
  2736. // Fix models end index for this class
  2737. ArraySetCell(g_zclass_modelsend, g_iZClasses, ArrayGetCell(g_zclass_modelsend, g_iZClasses) + (nummodels_custom - nummodels_default))
  2738. }
  2739.  
  2740. // Replace clawmodel
  2741. ArrayGetString(g_zclass2_clawmodel, i, buffer, charsmax(buffer))
  2742. ArraySetString(g_zclass_clawmodel, g_iZClasses, buffer)
  2743.  
  2744. // Precache clawmodel
  2745. formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", buffer)
  2746. engfunc(EngFunc_PrecacheModel, prec_mdl)
  2747.  
  2748. // Replace health
  2749. buffer[0] = ArrayGetCell(g_zclass2_hp, i)
  2750. ArraySetCell(g_zclass_hp, g_iZClasses, buffer[0])
  2751.  
  2752. // Replace speed
  2753. buffer[0] = ArrayGetCell(g_zclass2_spd, i)
  2754. ArraySetCell(g_zclass_spd, g_iZClasses, buffer[0])
  2755.  
  2756. // Replace gravity
  2757. buffer2 = Float:ArrayGetCell(g_zclass2_grav, i)
  2758. ArraySetCell(g_zclass_grav, g_iZClasses, buffer2)
  2759.  
  2760. // Replace admin flags
  2761. buffer2 = ArrayGetCell(g_zclass2_admin, i)
  2762. ArraySetCell(g_zclass_admin, g_iZClasses, buffer2)
  2763.  
  2764. // Replace credits
  2765. buffer2 = ArrayGetCell(g_zclass2_credits, i)
  2766. ArraySetCell(g_zclass_credits, g_iZClasses, buffer2)
  2767. }
  2768.  
  2769. // If class was not overriden with customization data
  2770. if (ArrayGetCell(g_zclass_new, g_iZClasses))
  2771. {
  2772. // Precache default class model and replace modelindex with the real one
  2773. formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", model, model)
  2774. ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses), engfunc(EngFunc_PrecacheModel, prec_mdl))
  2775.  
  2776. // Precache default clawmodel
  2777. formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", clawmodel)
  2778. engfunc(EngFunc_PrecacheModel, prec_mdl)
  2779. }
  2780.  
  2781. g_iZClasses++
  2782.  
  2783. return g_iZClasses-1
  2784. }
  2785.  
  2786. public native_get_class_cost(classid)
  2787. {
  2788. if (classid < 0 || classid >= g_iZClasses)
  2789. return -1;
  2790.  
  2791. return ArrayGetCell(g_zclass_credits, classid)
  2792. }
  2793.  
  2794. public native_get_user_zombie_class(id) return g_iZombieClass[id];
  2795. public native_get_user_next_class(id) return g_iNextClass[id];
  2796. public native_set_user_zombie_class(id, classid)
  2797. {
  2798. if (classid < 0 || classid >= g_iZClasses)
  2799. return 0;
  2800.  
  2801. g_iNextClass[id] = classid
  2802. return 1;
  2803. }
  2804.  
  2805. public native_is_user_zombie(id) return g_isZombie[id]
  2806. public native_is_user_banned(id) return g_isBuildBan[id]
  2807.  
  2808. public native_bool_buildphase() return g_boolCanBuild
  2809. public native_bool_prepphase() return g_boolPrepTime
  2810.  
  2811. public native_get_build_time()
  2812. {
  2813. if (g_boolCanBuild)
  2814. return g_iCountDown
  2815.  
  2816. return 0;
  2817. }
  2818.  
  2819. public native_set_build_time(time)
  2820. {
  2821. if (g_boolCanBuild)
  2822. {
  2823. g_iCountDown = time
  2824. return 1
  2825. }
  2826.  
  2827. return 0;
  2828. }
  2829.  
  2830. public native_get_user_color(id) return g_iColor[id]
  2831. public native_set_user_color(id, color)
  2832. {
  2833. g_iColor[id] = color
  2834. }
  2835.  
  2836. public native_drop_user_block(id)
  2837. {
  2838. cmdStopEnt(id)
  2839. }
  2840. public native_get_user_block(id)
  2841. {
  2842. if (g_iOwnedEnt[id])
  2843. return g_iOwnedEnt[id]
  2844.  
  2845. return 0;
  2846. }
  2847. public native_set_user_block(id, entity)
  2848. {
  2849. if (is_valid_ent(entity) && !is_user_alive(entity) && !MovingEnt(entity))
  2850. g_iOwnedEnt[id] = entity
  2851. }
  2852.  
  2853. public native_is_locked_block(entity)
  2854. {
  2855. if (is_valid_ent(entity) && !is_user_alive(entity))
  2856. return BlockLocker(entity) ? true : false
  2857.  
  2858. return -1;
  2859. }
  2860. public native_lock_block(entity)
  2861. {
  2862. if (is_valid_ent(entity) && !is_user_alive(entity) && !BlockLocker(entity))
  2863. {
  2864. LockBlock(entity, 33);
  2865. set_pev(entity,pev_rendermode,kRenderTransColor)
  2866. set_pev(entity,pev_rendercolor,Float:{LOCKED_COLOR})
  2867. set_pev(entity,pev_renderamt,Float:{LOCKED_RENDERAMT})
  2868. }
  2869. }
  2870. public native_unlock_block(entity)
  2871. {
  2872. if (is_valid_ent(entity) && !is_user_alive(entity) && BlockLocker(entity))
  2873. {
  2874. UnlockBlock(entity)
  2875. set_pev(entity,pev_rendermode,kRenderNormal)
  2876. }
  2877. }
  2878.  
  2879. public native_release_zombies()
  2880. {
  2881. if (g_boolCanBuild || g_boolPrepTime)
  2882. {
  2883. Release_Zombies()
  2884. return 1;
  2885. }
  2886. return 0;
  2887. }
  2888.  
  2889. public native_set_user_primary(id, csw_primary)
  2890. {
  2891. if (CSW_P228<=csw_primary<=CSW_P90)
  2892. {
  2893. g_iPrimaryWeapon[id] = csw_primary
  2894. return g_iPrimaryWeapon[id];
  2895. }
  2896.  
  2897. return -1;
  2898. }
  2899.  
  2900. public native_get_user_primary(id) return g_iPrimaryWeapon[id]
  2901.  
  2902. public native_get_flags_build() return FLAGS_BUILD
  2903. public native_get_flags_lock() return FLAGS_LOCK
  2904. public native_get_flags_buildban() return FLAGS_BUILDBAN
  2905. public native_get_flags_swap() return FLAGS_SWAP
  2906. public native_get_flags_revive() return FLAGS_REVIVE
  2907. public native_get_flags_guns() return FLAGS_GUNS
  2908. public native_get_flags_release() return FLAGS_RELEASE
  2909. public native_get_flags_override() return FLAGS_OVERRIDE
  2910.  
  2911. /*public native_set_user_mult(id, attribute, Float: amount)
  2912. {
  2913. if (attribute < ATT_HEALTH || attribute > ATT_GRAVITY)
  2914. return 0;
  2915.  
  2916. if (amount < 1.0)
  2917. amount = 1.0
  2918.  
  2919. g_fClassMultiplier[id][attribute] = amount
  2920.  
  2921. return 1;
  2922. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement