Advertisement
Guest User

bb

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