Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.11 KB | None | 0 0
  1. /*================================================================================
  2.  
  3. -------------------------
  4. -*- [ZP] Class: Human -*-
  5. -------------------------
  6.  
  7. This plugin is part of Zombie Plague Mod and is distributed under the
  8. terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
  9.  
  10. ================================================================================*/
  11.  
  12. #include <amxmodx>
  13. #include <fun>
  14. #include <fakemeta>
  15. #include <amx_settings_api>
  16. #include <cs_player_models_api>
  17. #include <cs_weap_models_api>
  18. #include <cs_maxspeed_api>
  19. #include <cs_weap_restrict_api>
  20. #include <zp50_core>
  21. #include <zp50_colorchat>
  22. #include <zp50_class_human_const>
  23.  
  24. // Human Classes file
  25. new const ZP_HUMANCLASSES_FILE[] = "zp_humanclasses.ini"
  26.  
  27. // Settings file
  28. new const ZP_SETTINGS_FILE[] = "zombieplague.ini"
  29.  
  30. #define MODEL_MAX_LENGTH 64
  31.  
  32. // Models
  33. new g_model_vknife_human[MODEL_MAX_LENGTH] = "models/v_knife.mdl"
  34.  
  35. #define MAXPLAYERS 32
  36.  
  37. #define HUMANS_DEFAULT_NAME "Human"
  38. #define HUMANS_DEFAULT_DESCRIPTION "Default"
  39. #define HUMANS_DEFAULT_HEALTH 100
  40. #define HUMANS_DEFAULT_SPEED 1.0
  41. #define HUMANS_DEFAULT_GRAVITY 1.0
  42.  
  43. // CS Player PData Offsets (win32)
  44. const OFFSET_CSMENUCODE = 205
  45.  
  46. // For class list menu handlers
  47. #define MENU_PAGE_CLASS g_menu_data[id]
  48. new g_menu_data[MAXPLAYERS+1]
  49.  
  50. enum _:TOTAL_FORWARDS
  51. {
  52. FW_CLASS_SELECT_PRE = 0,
  53. FW_CLASS_SELECT_POST
  54. }
  55. new g_Forwards[TOTAL_FORWARDS]
  56. new g_ForwardResult
  57.  
  58. new g_HumanClassCount
  59. new Array:g_HumanClassRealName
  60. new Array:g_HumanClassName
  61. new Array:g_HumanClassDesc
  62. new Array:g_HumanClassHealth
  63. new Array:g_HumanClassSpeed
  64. new Array:g_HumanClassGravity
  65. new Array:g_HumanClassModelsFile
  66. new Array:g_HumanClassModelsHandle
  67. new g_HumanClass[MAXPLAYERS+1]
  68. new g_HumanClassNext[MAXPLAYERS+1]
  69. new g_AdditionalMenuText[32]
  70.  
  71. public plugin_init()
  72. {
  73. register_plugin("[ZP] Class: Human", ZP_VERSION_STRING, "ZP Dev Team")
  74.  
  75. register_clcmd("say /hclass", "show_menu_humanclass")
  76. register_clcmd("say /class", "show_class_menu")
  77.  
  78. g_Forwards[FW_CLASS_SELECT_PRE] = CreateMultiForward("zp_fw_class_human_select_pre", ET_CONTINUE, FP_CELL, FP_CELL)
  79. g_Forwards[FW_CLASS_SELECT_POST] = CreateMultiForward("zp_fw_class_human_select_post", ET_CONTINUE, FP_CELL, FP_CELL)
  80. }
  81.  
  82. public plugin_cfg()
  83. {
  84. // No classes loaded, add default human class
  85. if (g_HumanClassCount < 1)
  86. {
  87. ArrayPushString(g_HumanClassRealName, HUMANS_DEFAULT_NAME)
  88. ArrayPushString(g_HumanClassName, HUMANS_DEFAULT_NAME)
  89. ArrayPushString(g_HumanClassDesc, HUMANS_DEFAULT_DESCRIPTION)
  90. ArrayPushCell(g_HumanClassHealth, HUMANS_DEFAULT_HEALTH)
  91. ArrayPushCell(g_HumanClassSpeed, HUMANS_DEFAULT_SPEED)
  92. ArrayPushCell(g_HumanClassGravity, HUMANS_DEFAULT_GRAVITY)
  93. ArrayPushCell(g_HumanClassModelsFile, false)
  94. ArrayPushCell(g_HumanClassModelsHandle, Invalid_Array)
  95. g_HumanClassCount++
  96. }
  97. }
  98.  
  99. public plugin_precache()
  100. {
  101. // Load from external file, save if not found
  102. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "V_KNIFE HUMAN", g_model_vknife_human, charsmax(g_model_vknife_human)))
  103. amx_save_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "V_KNIFE HUMAN", g_model_vknife_human)
  104.  
  105. // Precache models
  106. precache_model(g_model_vknife_human)
  107. }
  108.  
  109. public plugin_natives()
  110. {
  111. register_library("zp50_class_human")
  112. register_native("zp_class_human_get_current", "native_class_human_get_current")
  113. register_native("zp_class_human_get_next", "native_class_human_get_next")
  114. register_native("zp_class_human_set_next", "native_class_human_set_next")
  115. register_native("zp_class_human_get_max_health", "_class_human_get_max_health")
  116. register_native("zp_class_human_register", "native_class_human_register")
  117. register_native("zp_class_human_register_model", "_class_human_register_model")
  118. register_native("zp_class_human_get_id", "native_class_human_get_id")
  119. register_native("zp_class_human_get_name", "native_class_human_get_name")
  120. register_native("zp_class_human_get_real_name", "_class_human_get_real_name")
  121. register_native("zp_class_human_get_desc", "native_class_human_get_desc")
  122. register_native("zp_class_human_get_count", "native_class_human_get_count")
  123. register_native("zp_class_human_show_menu", "native_class_human_show_menu")
  124. register_native("zp_class_human_menu_text_add", "_class_human_menu_text_add")
  125.  
  126. // Initialize dynamic arrays
  127. g_HumanClassRealName = ArrayCreate(32, 1)
  128. g_HumanClassName = ArrayCreate(32, 1)
  129. g_HumanClassDesc = ArrayCreate(32, 1)
  130. g_HumanClassHealth = ArrayCreate(1, 1)
  131. g_HumanClassSpeed = ArrayCreate(1, 1)
  132. g_HumanClassGravity = ArrayCreate(1, 1)
  133. g_HumanClassModelsFile = ArrayCreate(1, 1)
  134. g_HumanClassModelsHandle = ArrayCreate(1, 1)
  135. }
  136.  
  137. public client_putinserver(id)
  138. {
  139. g_HumanClass[id] = ZP_INVALID_HUMAN_CLASS
  140. g_HumanClassNext[id] = ZP_INVALID_HUMAN_CLASS
  141. }
  142.  
  143. public client_disconnect(id)
  144. {
  145. // Reset remembered menu pages
  146. MENU_PAGE_CLASS = 0
  147. }
  148.  
  149. public show_class_menu(id)
  150. {
  151. if (!zp_core_is_zombie(id))
  152. show_menu_humanclass(id)
  153. }
  154.  
  155. public show_menu_humanclass(id)
  156. {
  157. static menu[128], name[32], description[32], transkey[64]
  158. new menuid, itemdata[2], index
  159.  
  160. formatex(menu, charsmax(menu), "%L\r", id, "MENU_HCLASS")
  161. menuid = menu_create(menu, "menu_humanclass")
  162.  
  163. for (index = 0; index < g_HumanClassCount; index++)
  164. {
  165. // Additional text to display
  166. g_AdditionalMenuText[0] = 0
  167.  
  168. // Execute class select attempt forward
  169. ExecuteForward(g_Forwards[FW_CLASS_SELECT_PRE], g_ForwardResult, id, index)
  170.  
  171. // Show class to player?
  172. if (g_ForwardResult >= ZP_CLASS_DONT_SHOW)
  173. continue;
  174.  
  175. ArrayGetString(g_HumanClassName, index, name, charsmax(name))
  176. ArrayGetString(g_HumanClassDesc, index, description, charsmax(description))
  177.  
  178. // ML support for class name + description
  179. formatex(transkey, charsmax(transkey), "HUMANDESC %s", name)
  180. if (GetLangTransKey(transkey) != TransKey_Bad) formatex(description, charsmax(description), "%L", id, transkey)
  181. formatex(transkey, charsmax(transkey), "HUMANNAME %s", name)
  182. if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
  183.  
  184. // Class available to player?
  185. if (g_ForwardResult >= ZP_CLASS_NOT_AVAILABLE)
  186. formatex(menu, charsmax(menu), "\d%s %s %s", name, description, g_AdditionalMenuText)
  187. // Class is current class?
  188. else if (index == g_HumanClassNext[id])
  189. formatex(menu, charsmax(menu), "\r%s \y%s \w%s", name, description, g_AdditionalMenuText)
  190. else
  191. formatex(menu, charsmax(menu), "%s \y%s \w%s", name, description, g_AdditionalMenuText)
  192.  
  193. itemdata[0] = index
  194. itemdata[1] = 0
  195. menu_additem(menuid, menu, itemdata)
  196. }
  197.  
  198. // No classes to display?
  199. if (menu_items(menuid) <= 0)
  200. {
  201. zp_colored_print(id, "%L", id, "NO_CLASSES")
  202. menu_destroy(menuid)
  203. return;
  204. }
  205.  
  206. // Back - Next - Exit
  207. formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
  208. menu_setprop(menuid, MPROP_BACKNAME, menu)
  209. formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
  210. menu_setprop(menuid, MPROP_NEXTNAME, menu)
  211. formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
  212. menu_setprop(menuid, MPROP_EXITNAME, menu)
  213.  
  214. // If remembered page is greater than number of pages, clamp down the value
  215. MENU_PAGE_CLASS = min(MENU_PAGE_CLASS, menu_pages(menuid)-1)
  216.  
  217. // Fix for AMXX custom menus
  218. set_pdata_int(id, OFFSET_CSMENUCODE, 0)
  219. menu_display(id, menuid, MENU_PAGE_CLASS)
  220. }
  221.  
  222. public menu_humanclass(id, menuid, item)
  223. {
  224. // Menu was closed
  225. if (item == MENU_EXIT)
  226. {
  227. MENU_PAGE_CLASS = 0
  228. menu_destroy(menuid)
  229. return PLUGIN_HANDLED;
  230. }
  231.  
  232. // Remember class menu page
  233. MENU_PAGE_CLASS = item / 7
  234.  
  235. // Retrieve class index
  236. new itemdata[2], dummy, index
  237. menu_item_getinfo(menuid, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
  238. index = itemdata[0]
  239.  
  240. // Execute class select attempt forward
  241. ExecuteForward(g_Forwards[FW_CLASS_SELECT_PRE], g_ForwardResult, id, index)
  242.  
  243. // Class available to player?
  244. if (g_ForwardResult >= ZP_CLASS_NOT_AVAILABLE)
  245. {
  246. menu_destroy(menuid)
  247. return PLUGIN_HANDLED;
  248. }
  249.  
  250. // Make selected class next class for player
  251. g_HumanClassNext[id] = index
  252.  
  253. new name[32], transkey[64]
  254. new Float:maxspeed = Float:ArrayGetCell(g_HumanClassSpeed, g_HumanClassNext[id])
  255. ArrayGetString(g_HumanClassName, g_HumanClassNext[id], name, charsmax(name))
  256. // ML support for class name
  257. formatex(transkey, charsmax(transkey), "HUMANNAME %s", name)
  258. if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
  259.  
  260. // Show selected human class
  261. zp_colored_print(id, "%L: %s", id, "HUMAN_SELECT", name)
  262. zp_colored_print(id, "%L: %d %L: %d %L: %.2fx", id, "ZOMBIE_ATTRIB1", ArrayGetCell(g_HumanClassHealth, g_HumanClassNext[id]), id, "ZOMBIE_ATTRIB2", cs_maxspeed_display_value(maxspeed), id, "ZOMBIE_ATTRIB3", Float:ArrayGetCell(g_HumanClassGravity, g_HumanClassNext[id]))
  263.  
  264. // Execute class select post forward
  265. ExecuteForward(g_Forwards[FW_CLASS_SELECT_POST], g_ForwardResult, id, index)
  266.  
  267. menu_destroy(menuid)
  268. return PLUGIN_HANDLED;
  269. }
  270.  
  271. public zp_fw_core_cure_post(id, attacker)
  272. {
  273. // Show human class menu if they haven't chosen any (e.g. just connected)
  274. if (g_HumanClassNext[id] == ZP_INVALID_HUMAN_CLASS)
  275. {
  276. if (g_HumanClassCount > 1)
  277. show_menu_humanclass(id)
  278. else // If only one class is registered, choose it automatically
  279. g_HumanClassNext[id] = 0
  280. }
  281.  
  282. // Bots pick class automatically
  283. if (is_user_bot(id))
  284. {
  285. // Try choosing class
  286. new index, start_index = random_num(0, g_HumanClassCount - 1)
  287. for (index = start_index + 1; /* no condition */; index++)
  288. {
  289. // Start over when we reach the end
  290. if (index >= g_HumanClassCount)
  291. index = 0
  292.  
  293. // Execute class select attempt forward
  294. ExecuteForward(g_Forwards[FW_CLASS_SELECT_PRE], g_ForwardResult, id, index)
  295.  
  296. // Class available to player?
  297. if (g_ForwardResult < ZP_CLASS_NOT_AVAILABLE)
  298. {
  299. g_HumanClassNext[id] = index
  300. break;
  301. }
  302.  
  303. // Loop completed, no class could be chosen
  304. if (index == start_index)
  305. break;
  306. }
  307. }
  308.  
  309. // Set selected human class. If none selected yet, use the first one
  310. g_HumanClass[id] = g_HumanClassNext[id]
  311. if (g_HumanClass[id] == ZP_INVALID_HUMAN_CLASS) g_HumanClass[id] = 0
  312.  
  313. // Apply human attributes
  314. set_user_health(id, ArrayGetCell(g_HumanClassHealth, g_HumanClass[id]))
  315. set_user_gravity(id, Float:ArrayGetCell(g_HumanClassGravity, g_HumanClass[id]))
  316. cs_set_player_maxspeed_auto(id, Float:ArrayGetCell(g_HumanClassSpeed, g_HumanClass[id]))
  317.  
  318. // Apply human player model
  319. new Array:class_models = ArrayGetCell(g_HumanClassModelsHandle, g_HumanClass[id])
  320. if (class_models != Invalid_Array)
  321. {
  322. new index = random_num(0, ArraySize(class_models) - 1)
  323. new player_model[32]
  324. ArrayGetString(class_models, index, player_model, charsmax(player_model))
  325. cs_set_player_model(id, player_model)
  326. }
  327. else
  328. {
  329. // No models registered for current class, use default model
  330. cs_reset_player_model(id)
  331. }
  332.  
  333. // Set custom knife model
  334. cs_set_player_view_model(id, CSW_KNIFE, g_model_vknife_human)
  335. }
  336.  
  337. public zp_fw_core_infect(id, attacker)
  338. {
  339. // Remove custom knife model
  340. cs_reset_player_view_model(id, CSW_KNIFE)
  341. }
  342.  
  343. public native_class_human_get_current(plugin_id, num_params)
  344. {
  345. new id = get_param(1)
  346.  
  347. if (!is_user_connected(id))
  348. {
  349. log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
  350. return ZP_INVALID_HUMAN_CLASS;
  351. }
  352.  
  353. return g_HumanClass[id];
  354. }
  355.  
  356. public native_class_human_get_next(plugin_id, num_params)
  357. {
  358. new id = get_param(1)
  359.  
  360. if (!is_user_connected(id))
  361. {
  362. log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
  363. return ZP_INVALID_HUMAN_CLASS;
  364. }
  365.  
  366. return g_HumanClassNext[id];
  367. }
  368.  
  369. public native_class_human_set_next(plugin_id, num_params)
  370. {
  371. new id = get_param(1)
  372.  
  373. if (!is_user_connected(id))
  374. {
  375. log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
  376. return false;
  377. }
  378.  
  379. new classid = get_param(2)
  380.  
  381. if (classid < 0 || classid >= g_HumanClassCount)
  382. {
  383. log_error(AMX_ERR_NATIVE, "[ZP] Invalid human class id (%d)", classid)
  384. return false;
  385. }
  386.  
  387. g_HumanClassNext[id] = classid
  388. return true;
  389. }
  390.  
  391. public _class_human_get_max_health(plugin_id, num_params)
  392. {
  393. new id = get_param(1)
  394.  
  395. if (!is_user_connected(id))
  396. {
  397. log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
  398. return -1;
  399. }
  400.  
  401. new classid = get_param(2)
  402.  
  403. if (classid < 0 || classid >= g_HumanClassCount)
  404. {
  405. log_error(AMX_ERR_NATIVE, "[ZP] Invalid human class id (%d)", classid)
  406. return -1;
  407. }
  408.  
  409. return ArrayGetCell(g_HumanClassHealth, classid);
  410. }
  411.  
  412. public native_class_human_register(plugin_id, num_params)
  413. {
  414. new name[32]
  415. get_string(1, name, charsmax(name))
  416.  
  417. if (strlen(name) < 1)
  418. {
  419. log_error(AMX_ERR_NATIVE, "[ZP] Can't register human class with an empty name")
  420. return ZP_INVALID_HUMAN_CLASS;
  421. }
  422.  
  423. new index, humanclass_name[32]
  424. for (index = 0; index < g_HumanClassCount; index++)
  425. {
  426. ArrayGetString(g_HumanClassRealName, index, humanclass_name, charsmax(humanclass_name))
  427. if (equali(name, humanclass_name))
  428. {
  429. log_error(AMX_ERR_NATIVE, "[ZP] Human class already registered (%s)", name)
  430. return ZP_INVALID_HUMAN_CLASS;
  431. }
  432. }
  433.  
  434. new description[32]
  435. get_string(2, description, charsmax(description))
  436. new health = get_param(3)
  437. new Float:speed = get_param_f(4)
  438. new Float:gravity = get_param_f(5)
  439.  
  440. // Load settings from human classes file
  441. new real_name[32]
  442. copy(real_name, charsmax(real_name), name)
  443. ArrayPushString(g_HumanClassRealName, real_name)
  444.  
  445. // Name
  446. if (!amx_load_setting_string(ZP_HUMANCLASSES_FILE, real_name, "NAME", name, charsmax(name)))
  447. amx_save_setting_string(ZP_HUMANCLASSES_FILE, real_name, "NAME", name)
  448. ArrayPushString(g_HumanClassName, name)
  449.  
  450. // Description
  451. if (!amx_load_setting_string(ZP_HUMANCLASSES_FILE, real_name, "INFO", description, charsmax(description)))
  452. amx_save_setting_string(ZP_HUMANCLASSES_FILE, real_name, "INFO", description)
  453. ArrayPushString(g_HumanClassDesc, description)
  454.  
  455. // Models
  456. new Array:class_models = ArrayCreate(32, 1)
  457. amx_load_setting_string_arr(ZP_HUMANCLASSES_FILE, real_name, "MODELS", class_models)
  458. if (ArraySize(class_models) > 0)
  459. {
  460. ArrayPushCell(g_HumanClassModelsFile, true)
  461.  
  462. // Precache player models
  463. new index, player_model[32], model_path[128]
  464. for (index = 0; index < ArraySize(class_models); index++)
  465. {
  466. ArrayGetString(class_models, index, player_model, charsmax(player_model))
  467. formatex(model_path, charsmax(model_path), "models/player/%s/%s.mdl", player_model, player_model)
  468. precache_model(model_path)
  469. // Support modelT.mdl files
  470. formatex(model_path, charsmax(model_path), "models/player/%s/%sT.mdl", player_model, player_model)
  471. if (file_exists(model_path)) precache_model(model_path)
  472. }
  473. }
  474. else
  475. {
  476. ArrayPushCell(g_HumanClassModelsFile, false)
  477. ArrayDestroy(class_models)
  478. amx_save_setting_string(ZP_HUMANCLASSES_FILE, real_name, "MODELS", "")
  479. }
  480. ArrayPushCell(g_HumanClassModelsHandle, class_models)
  481.  
  482. // Health
  483. if (!amx_load_setting_int(ZP_HUMANCLASSES_FILE, real_name, "HEALTH", health))
  484. amx_save_setting_int(ZP_HUMANCLASSES_FILE, real_name, "HEALTH", health)
  485. ArrayPushCell(g_HumanClassHealth, health)
  486.  
  487. // Speed
  488. if (!amx_load_setting_float(ZP_HUMANCLASSES_FILE, real_name, "SPEED", speed))
  489. amx_save_setting_float(ZP_HUMANCLASSES_FILE, real_name, "SPEED", speed)
  490. ArrayPushCell(g_HumanClassSpeed, speed)
  491.  
  492. // Gravity
  493. if (!amx_load_setting_float(ZP_HUMANCLASSES_FILE, real_name, "GRAVITY", gravity))
  494. amx_save_setting_float(ZP_HUMANCLASSES_FILE, real_name, "GRAVITY", gravity)
  495. ArrayPushCell(g_HumanClassGravity, gravity)
  496.  
  497. g_HumanClassCount++
  498. return g_HumanClassCount - 1;
  499. }
  500.  
  501. public _class_human_register_model(plugin_id, num_params)
  502. {
  503. new classid = get_param(1)
  504.  
  505. if (classid < 0 || classid >= g_HumanClassCount)
  506. {
  507. log_error(AMX_ERR_NATIVE, "[ZP] Invalid human class id (%d)", classid)
  508. return false;
  509. }
  510.  
  511. // Player models already loaded from file
  512. if (ArrayGetCell(g_HumanClassModelsFile, classid))
  513. return true;
  514.  
  515. new player_model[32]
  516. get_string(2, player_model, charsmax(player_model))
  517.  
  518. new model_path[128]
  519. formatex(model_path, charsmax(model_path), "models/player/%s/%s.mdl", player_model, player_model)
  520.  
  521. precache_model(model_path)
  522.  
  523. // Support modelT.mdl files
  524. formatex(model_path, charsmax(model_path), "models/player/%s/%sT.mdl", player_model, player_model)
  525. if (file_exists(model_path)) precache_model(model_path)
  526.  
  527. new Array:class_models = ArrayGetCell(g_HumanClassModelsHandle, classid)
  528.  
  529. // No models registered yet?
  530. if (class_models == Invalid_Array)
  531. {
  532. class_models = ArrayCreate(32, 1)
  533. ArraySetCell(g_HumanClassModelsHandle, classid, class_models)
  534. }
  535. ArrayPushString(class_models, player_model)
  536.  
  537. // Save models to file
  538. new real_name[32]
  539. ArrayGetString(g_HumanClassRealName, classid, real_name, charsmax(real_name))
  540. amx_save_setting_string_arr(ZP_HUMANCLASSES_FILE, real_name, "MODELS", class_models)
  541.  
  542. return true;
  543. }
  544.  
  545. public native_class_human_get_id(plugin_id, num_params)
  546. {
  547. new real_name[32]
  548. get_string(1, real_name, charsmax(real_name))
  549.  
  550. // Loop through every class
  551. new index, humanclass_name[32]
  552. for (index = 0; index < g_HumanClassCount; index++)
  553. {
  554. ArrayGetString(g_HumanClassRealName, index, humanclass_name, charsmax(humanclass_name))
  555. if (equali(real_name, humanclass_name))
  556. return index;
  557. }
  558.  
  559. return ZP_INVALID_HUMAN_CLASS;
  560. }
  561.  
  562. public native_class_human_get_name(plugin_id, num_params)
  563. {
  564. new classid = get_param(1)
  565.  
  566. if (classid < 0 || classid >= g_HumanClassCount)
  567. {
  568. log_error(AMX_ERR_NATIVE, "[ZP] Invalid human class id (%d)", classid)
  569. return false;
  570. }
  571.  
  572. new name[32]
  573. ArrayGetString(g_HumanClassName, classid, name, charsmax(name))
  574.  
  575. new len = get_param(3)
  576. set_string(2, name, len)
  577. return true;
  578. }
  579.  
  580. public _class_human_get_real_name(plugin_id, num_params)
  581. {
  582. new classid = get_param(1)
  583.  
  584. if (classid < 0 || classid >= g_HumanClassCount)
  585. {
  586. log_error(AMX_ERR_NATIVE, "[ZP] Invalid human class id (%d)", classid)
  587. return false;
  588. }
  589.  
  590. new real_name[32]
  591. ArrayGetString(g_HumanClassRealName, classid, real_name, charsmax(real_name))
  592.  
  593. new len = get_param(3)
  594. set_string(2, real_name, len)
  595. return true;
  596. }
  597.  
  598. public native_class_human_get_desc(plugin_id, num_params)
  599. {
  600. new classid = get_param(1)
  601.  
  602. if (classid < 0 || classid >= g_HumanClassCount)
  603. {
  604. log_error(AMX_ERR_NATIVE, "[ZP] Invalid human class id (%d)", classid)
  605. return false;
  606. }
  607.  
  608. new description[32]
  609. ArrayGetString(g_HumanClassDesc, classid, description, charsmax(description))
  610.  
  611. new len = get_param(3)
  612. set_string(2, description, len)
  613. return true;
  614. }
  615.  
  616. public native_class_human_get_count(plugin_id, num_params)
  617. {
  618. return g_HumanClassCount;
  619. }
  620.  
  621. public native_class_human_show_menu(plugin_id, num_params)
  622. {
  623. new id = get_param(1)
  624.  
  625. if (!is_user_connected(id))
  626. {
  627. log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
  628. return false;
  629. }
  630.  
  631. show_menu_humanclass(id)
  632. return true;
  633. }
  634.  
  635. public _class_human_menu_text_add(plugin_id, num_params)
  636. {
  637. static text[32]
  638. get_string(1, text, charsmax(text))
  639. format(g_AdditionalMenuText, charsmax(g_AdditionalMenuText), "%s%s", g_AdditionalMenuText, text)
  640. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement