Advertisement
Guest User

basebuilder 6.5

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