HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Plugin generated by AMXX-Studio */
  2.  
  3. #include <amxmodx>
  4. #include <fakemeta>
  5. #include <hamsandwich>
  6. #include <xs>
  7.  
  8. //#define ZOBMIE_PLAGUE
  9.  
  10. #if defined ZOBMIE_PLAGUE
  11.  
  12. #include <zombieplague>
  13. #define GET_MONEY(%1) zp_get_user_ammo_packs(%1)
  14. #define SET_MONEY(%1,%2) zp_set_user_ammo_packs(%1, %2)
  15.  
  16. #else
  17.  
  18. #include <cstrike>
  19. #define GET_MONEY(%1) cs_get_user_money(%1)
  20. #define SET_MONEY(%1,%2) cs_set_user_money(%1, %2)
  21.  
  22. #endif
  23.  
  24.  
  25. #define PLUGIN "Build Teleport"
  26. #define VERSION "0.1.1"
  27. #define AUTHOR "PomanoB"
  28.  
  29. #define INPUT_MODEL "models/tp_by_xranitel.mdl"
  30. #define BREAK_MODEL "models/metalplategibs.mdl"
  31.  
  32. #define HEALTH_OFFSET 1000
  33.  
  34.  
  35. #define TP_TEAM pev_iuser3
  36. #define TP_STATE pev_iuser1
  37. #define TP_PLAYER pev_iuser2
  38. #define TP_OWNER pev_euser1
  39. #define TP_TYPE pev_iuser4
  40. #define TP_TIME pev_fuser1
  41. #define TP_LAST_TOUCH pev_fuser2
  42. #define TP_LAST_HEALTH pev_fuser3
  43.  
  44.  
  45. new const g_damage_sound[2][] =
  46. {
  47. "buttons/spark5.wav",
  48. "buttons/spark6.wav"
  49. }
  50.  
  51. new g_teleports[33][2]
  52.  
  53. new g_info_target_string
  54.  
  55. new const g_tp_class_name[] = "my_teleport_class_name"
  56.  
  57. enum BUILD_STATE
  58. {
  59. STATE_BUILDING,
  60. STATE_NORMAL,
  61. STATE_CHARGING,
  62. STATE_TELEPORTING,
  63. STATE_NO_EXIT,
  64. STATE_EXIT
  65. }
  66.  
  67. new g_maxplayers
  68.  
  69. new g_cvar_tp_cost, g_cvar_tp_health
  70. new g_cvar_team_attack, g_cvar_repair_hp_cost
  71. new g_cvar_heal_distance, g_cvar_teleport_enemy
  72. new g_cvar_tp_time, g_cvar_build_speed
  73. new g_cvar_charging_time, g_cvar_one_round
  74. new g_cvar_tp_anonce, g_cvar_admin_flag
  75.  
  76. new g_break_model
  77.  
  78. new g_buildMenu
  79.  
  80. public plugin_init()
  81. {
  82. register_plugin(PLUGIN, VERSION, AUTHOR)
  83.  
  84. register_clcmd("say /tb", "cmdShowMenu")
  85.  
  86. register_forward(FM_Think, "fwdThink")
  87. register_forward(FM_TraceLine, "fwdTraceLine", 1)
  88. register_forward(FM_Touch, "fwdTouch")
  89.  
  90. RegisterHam(Ham_TakeDamage, "info_target", "fwdTakeDamage", 1)
  91.  
  92. register_event("TextMsg", "deleteAllTeleports", "a", "2&#Game_C", "2&#Game_w")
  93. register_event("TextMsg", "deleteAllTeleports", "a", "2&#Game_will_restart_in")
  94. register_event("TeamInfo", "eventTeamInfo", "a")
  95.  
  96. register_logevent("roundEnd", 2, "1=Round_End")
  97.  
  98. new callback = menu_makecallback("buildMenuCallback")
  99. g_buildMenu = menu_create("Build Menu", "buildMenuHandler")
  100. menu_additem(g_buildMenu, "Build Input", "0", _, callback)
  101. menu_additem(g_buildMenu, "Build Output", "1", _, callback)
  102. menu_additem(g_buildMenu, "Repair Input", "2", _, callback)
  103. menu_additem(g_buildMenu, "Repair Output", "3", _, callback)
  104.  
  105. register_dictionary("tp_dollar.txt")
  106.  
  107. g_info_target_string = engfunc(EngFunc_AllocString,"info_target")
  108.  
  109. g_maxplayers = get_maxplayers()
  110.  
  111. g_cvar_tp_cost = register_cvar("tp_cost", "1000")
  112. g_cvar_tp_health = register_cvar("tp_health", "2000.0")
  113. g_cvar_team_attack = register_cvar("tp_team_attack", "1")
  114. g_cvar_repair_hp_cost = register_cvar("tp_repair_hp_cost", "5")
  115. g_cvar_heal_distance = register_cvar("tp_heal_distance", "100.0")
  116. g_cvar_teleport_enemy = register_cvar("tp_teleport_enemy", "0")
  117. g_cvar_tp_time = register_cvar("tp_teleport_time", "2.0")
  118. g_cvar_build_speed = register_cvar("tp_teleport_build_speed", "5.1")
  119. g_cvar_charging_time = register_cvar("tp_teleport_charging_time", "5.0")
  120. g_cvar_one_round = register_cvar("tp_teleport_one_round", "0")
  121. g_cvar_tp_anonce = register_cvar("tp_anonce", "15.0")
  122. g_cvar_admin_flag = register_cvar("tp_admin_flag", "")
  123. }
  124.  
  125. public plugin_precache()
  126. {
  127. precache_model(INPUT_MODEL)
  128. g_break_model= precache_model(BREAK_MODEL)
  129.  
  130. new i
  131. for (i = 0; i < sizeof g_damage_sound; i++)
  132. precache_sound(g_damage_sound[i])
  133. }
  134.  
  135. public cmdShowMenu(id)
  136. {
  137. new adminFlags[32]
  138. get_pcvar_string(g_cvar_admin_flag, adminFlags, charsmax(adminFlags))
  139.  
  140. new iAdminFlag = read_flags(adminFlags)
  141.  
  142. if (!iAdminFlag || (get_user_flags(id)&iAdminFlag))
  143. menu_display(id, g_buildMenu)
  144. else
  145. client_print(id, print_chat, "%L", id, "TP_NO_ACCESS")
  146. }
  147.  
  148. public buildMenuCallback(id, menu, item)
  149. {
  150. new _access, command[3], cmd, callback
  151. menu_item_getinfo(menu, item, _access, command, 2, _, _, callback)
  152.  
  153. cmd = str_to_num(command)
  154.  
  155. new itemName[64]
  156.  
  157. if (cmd <= 1)
  158. {
  159. new ent = g_teleports[id][cmd]
  160. if (ent)
  161. {
  162. format(itemName, charsmax(itemName),
  163. "%L", id, "TP_DESTROY", id, (cmd ? "TP_EXIT" : "TP_INPUT"), pev(ent, pev_health) - HEALTH_OFFSET)
  164. }
  165. else
  166. {
  167. format(itemName, charsmax(itemName),
  168. "%L", id, "TP_BUILD", id, (cmd ? "TP_EXIT" : "TP_INPUT"),
  169. get_pcvar_num(g_cvar_tp_cost))
  170. }
  171. }
  172. else
  173. {
  174. cmd -=2
  175. new ent = g_teleports[id][cmd], health = 0
  176. if (ent)
  177. health = HEALTH_OFFSET + get_pcvar_num(g_cvar_tp_health) - pev(ent, pev_health)
  178.  
  179. if (health)
  180. {
  181. format(itemName, charsmax(itemName),
  182. "%L", id, "TP_REPAIR", id, (cmd ? "TP_EXIT" : "TP_INPUT"),
  183. health * get_pcvar_num(g_cvar_repair_hp_cost))
  184. }
  185. else
  186. {
  187. format(itemName, charsmax(itemName),
  188. "%L", id, "TP_NO_REPAIR", id, (cmd ? "TP_EXIT" : "TP_INPUT"))
  189. }
  190. }
  191. menu_item_setname(menu, item, itemName)
  192. }
  193.  
  194. public buildMenuHandler(id, menu, item)
  195. {
  196. if(item == MENU_EXIT)
  197. return PLUGIN_HANDLED
  198.  
  199. new _access, command[3], cmd, callback
  200. menu_item_getinfo(menu, item, _access, command, 2, _, _, callback)
  201.  
  202. cmd = str_to_num(command)
  203.  
  204. if (cmd < 2)
  205. {
  206. new building = g_teleports[id][cmd]
  207.  
  208. if (building)
  209. destroyObject(id, cmd)
  210. else
  211. buildObjetc(id, cmd)
  212. }
  213. else
  214. {
  215. cmd -= 2
  216. new building = g_teleports[id][cmd]
  217. if (building)
  218. {
  219. new Float:tpOrigin[3], Float:youOrigin[3]
  220. pev(building, pev_origin, tpOrigin)
  221. pev(id, pev_origin, youOrigin)
  222.  
  223. if (get_distance_f(tpOrigin, youOrigin) <= get_pcvar_float(g_cvar_heal_distance))
  224. {
  225. new health = HEALTH_OFFSET + get_pcvar_num(g_cvar_tp_health)
  226. if (checkCost(id, (health - pev(building, pev_health)) * get_pcvar_num(g_cvar_repair_hp_cost)))
  227. {
  228. set_pev(building, pev_health, float(health))
  229. }
  230. }
  231. else
  232. client_print(id, print_chat, "%L", id, "TP_LONG")
  233. }
  234. }
  235.  
  236. return PLUGIN_HANDLED
  237. }
  238.  
  239. public destroyObject(id, object)
  240. {
  241. new tp = g_teleports[id][object]
  242. if (tp)
  243. {
  244.  
  245. new Float:origin[3]
  246. pev(tp ,pev_origin, origin)
  247. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
  248. write_byte(TE_BREAKMODEL) // TE id
  249. engfunc(EngFunc_WriteCoord, origin[0])
  250. engfunc(EngFunc_WriteCoord, origin[1])
  251. engfunc(EngFunc_WriteCoord, origin[2])
  252. write_coord(16) // size x
  253. write_coord(16) // size y
  254. write_coord(16) // size z
  255. write_coord(random_num(-20, 20)) // velocity x
  256. write_coord(random_num(-20, 20)) // velocity y
  257. write_coord(10) // velocity z
  258. write_byte(10) // random velocity
  259. write_short(g_break_model) // model
  260. write_byte(10) // count
  261. write_byte(25) // life
  262. write_byte(2) // flags
  263. message_end()
  264.  
  265. g_teleports[id][object] = 0
  266. engfunc(EngFunc_RemoveEntity, tp)
  267.  
  268. if (object)
  269. {
  270. new input = g_teleports[id][0]
  271. if (pev_valid(input))
  272. set_pev(input, TP_STATE, STATE_NO_EXIT)
  273. }
  274. }
  275. }
  276.  
  277. public buildObjetc(id, object)
  278. {
  279. if (!checkCost(id, get_pcvar_num(g_cvar_tp_cost)))
  280. return
  281.  
  282. new ent = engfunc(EngFunc_CreateNamedEntity, g_info_target_string)
  283. set_pev(ent,pev_classname, g_tp_class_name)
  284.  
  285. engfunc(EngFunc_SetModel, ent, INPUT_MODEL)
  286.  
  287. new Float:mins[3] = {-16.0,-16.0, -8.0}
  288. new Float:maxs[3] = {16.0,16.0,8.0}
  289. set_pev(ent, pev_mins, mins)
  290. set_pev(ent, pev_maxs, maxs)
  291. engfunc(EngFunc_SetSize, ent, mins, maxs)
  292.  
  293.  
  294. set_pev(ent, pev_animtime, 0.0)
  295. set_pev(ent, pev_framerate, 0.0)
  296. set_pev(ent, pev_sequence, 0)
  297. set_pev(ent, pev_gaitsequence, 0)
  298.  
  299. set_pev(ent, pev_solid, SOLID_BBOX)
  300. set_pev(ent, pev_movetype, MOVETYPE_FLY)
  301.  
  302. set_pev(ent, pev_rendermode, kRenderTransAdd)
  303. set_pev(ent, pev_rendercolor, Float:{0.0, 255.0, 0.0})
  304. set_pev(ent ,pev_renderamt,0.0)
  305.  
  306. new Float:health = HEALTH_OFFSET + get_pcvar_float(g_cvar_tp_health)
  307. set_pev(ent, pev_health, health)
  308.  
  309. set_pev(ent, pev_takedamage, 1.0)
  310. set_pev(ent,pev_flags, FL_MONSTER|FL_MONSTERCLIP)
  311.  
  312.  
  313. new Float:origin[3], Float:angle[3]
  314. pev(id ,pev_angles, angle)
  315. // angle[2] = 0.0
  316. // set_pev(ent, pev_angles, angle)
  317. // pev(id ,pev_v_angle, angle)
  318. // set_pev(ent, pev_v_angle, angle)
  319.  
  320. engfunc(EngFunc_MakeVectors, angle)
  321. global_get(glb_v_forward, angle)
  322. angle[2] = 0.0
  323. xs_vec_mul_scalar(angle, 50.0, angle)
  324. pev(id, pev_origin, origin)
  325. xs_vec_add(angle, origin ,origin)
  326. set_pev(ent, pev_origin, origin)
  327.  
  328. engfunc(EngFunc_DropToFloor, ent)
  329.  
  330. set_pev(ent, TP_OWNER, id)
  331. set_pev(ent, TP_TEAM, get_user_team(id))
  332.  
  333. set_pev(ent, TP_STATE, STATE_BUILDING)
  334.  
  335. set_pev(ent, pev_nextthink,get_gametime() + 0.1)
  336.  
  337. set_pev(ent, TP_TYPE, object)
  338.  
  339. g_teleports[id][object] = ent
  340. }
  341.  
  342. public fwdThink(ent)
  343. {
  344. static classname[32]
  345. pev(ent ,pev_classname, classname, 31)
  346. if (equal(classname, g_tp_class_name))
  347. {
  348. switch(pev(ent, TP_STATE))
  349. {
  350. case STATE_BUILDING:
  351. {
  352. static Float:current
  353. pev(ent, pev_renderamt, current)
  354. if (current < 255.0)
  355. {
  356. current += get_pcvar_float(g_cvar_build_speed)
  357. if (current > 255.0)
  358. current = 255.0
  359. set_pev(ent, pev_renderamt, current)
  360.  
  361. }
  362. else
  363. {
  364. if (pev(ent, TP_TYPE))
  365. {
  366. set_pev(ent, TP_STATE, STATE_EXIT)
  367. static input
  368. input = g_teleports[pev(ent, TP_OWNER)][0]
  369. if (pev_valid(input) && BUILD_STATE:pev(input, TP_STATE) == STATE_NO_EXIT)
  370. set_pev(input, TP_STATE, STATE_NORMAL)
  371.  
  372. }
  373. else
  374. {
  375. static exitTp
  376. exitTp = g_teleports[pev(ent, TP_OWNER)][1]
  377. if (pev_valid(exitTp) && BUILD_STATE:pev(exitTp, TP_STATE) == STATE_EXIT)
  378. set_pev(ent, TP_STATE, STATE_NORMAL)
  379. else
  380. set_pev(ent, TP_STATE, STATE_NO_EXIT)
  381. }
  382. set_pev(ent, pev_rendermode, kRenderNormal)
  383. set_pev(ent, pev_renderfx, kRenderFxGlowShell)
  384. set_pev(ent, pev_renderamt, 30.0)
  385.  
  386. if (pev(ent, TP_TEAM) == 1)
  387. set_pev(ent, pev_rendercolor, Float:{255.0, 0.0, 0.0})
  388. else
  389. set_pev(ent, pev_rendercolor, Float:{0.0, 0.0, 255.0})
  390. }
  391. }
  392. case STATE_TELEPORTING:
  393. {
  394. static Float:lastTouchTime
  395. pev(ent, TP_LAST_TOUCH, lastTouchTime)
  396. if (get_gametime() - lastTouchTime > 0.1)
  397. {
  398. set_pev(ent, TP_STATE, STATE_NORMAL)
  399. }
  400. }
  401. case STATE_CHARGING:
  402. {
  403. static Float:readyTime
  404. pev(ent, TP_TIME, readyTime)
  405. if (get_gametime() >= readyTime)
  406. {
  407. set_pev(ent, TP_STATE, STATE_NORMAL)
  408. }
  409. }
  410. }
  411. set_pev(ent, pev_nextthink,get_gametime() + 0.1)
  412. }
  413. }
  414.  
  415. public fwdTraceLine(Float:v1[3], Float:v2[3], fNoMonsters, entToSkip, tr)
  416. {
  417. static pHit
  418. pHit = get_tr2(tr, TR_pHit)
  419. if (pev_valid(pHit))
  420. {
  421. static classname[32]
  422. pev(pHit ,pev_classname, classname, 31)
  423. if (equal(classname, g_tp_class_name))
  424. {
  425.  
  426. static message[256]
  427.  
  428. static const states[BUILD_STATE][] =
  429. {
  430. "TP_STATUS_BUILDING",
  431. "TP_STATUS_READY",
  432. "TP_STATUS_CHARGING",
  433. "TP_STATUS_TELEPORTING",
  434. "TP_STATUS_NO_EXIT",
  435. "TP_STATUS_EXIT"
  436. }
  437.  
  438. format(message, charsmax(message),
  439. "%L", entToSkip, "TP_STATUS", entToSkip,
  440. (pev(pHit, TP_TYPE) ? "TP_EXIT" : "TP_INPUT"),
  441. entToSkip, states[BUILD_STATE:pev(pHit, TP_STATE)],
  442. (pev(pHit, pev_health) - HEALTH_OFFSET))
  443.  
  444. client_print(entToSkip, print_center, message)
  445. }
  446. }
  447. }
  448.  
  449. public fwdTouch(id, ent)
  450. {
  451. if (1 <= id <= g_maxplayers && pev_valid(ent))
  452. {
  453. static classname[32]
  454. pev(ent ,pev_classname, classname, 31)
  455. if (equal(classname, g_tp_class_name) && ent == pev(id, pev_groundentity))
  456. {
  457. static BUILD_STATE:tpState
  458. tpState = BUILD_STATE:pev(ent, TP_STATE)
  459. if (tpState == STATE_NORMAL && (get_pcvar_num(g_cvar_teleport_enemy) || get_user_team(id) == pev(ent, TP_TEAM)))
  460. {
  461. set_pev(ent, TP_STATE, STATE_TELEPORTING)
  462. set_pev(ent, TP_PLAYER, id)
  463. set_pev(ent, TP_TIME, get_gametime() + get_pcvar_float(g_cvar_tp_time))
  464. }
  465. else
  466. if (tpState == STATE_TELEPORTING && pev(ent, TP_PLAYER) == id)
  467. {
  468. static Float:tpTime
  469. pev(ent, TP_TIME, tpTime)
  470. if (tpTime <= get_gametime())
  471. {
  472. static Float:origin[3], tp
  473. tp = g_teleports[pev(ent, TP_OWNER)][1]
  474. pev(tp, pev_origin, origin)
  475.  
  476. origin[2]+=50.0
  477.  
  478.  
  479. static tr
  480. tr = 0
  481. engfunc(EngFunc_TraceHull, origin, origin, 0, pev(id, pev_flags) & FL_DUCKING ? HULL_HEAD : HULL_HUMAN, 0, tr)
  482. if (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen))
  483. {
  484. createEffect(id)
  485. set_pev(id, pev_origin, origin)
  486. /*
  487. set_pev(id, pev_fixangle, 1)
  488. pev(tp, pev_angles, origin)
  489. set_pev(id ,pev_angles, origin)
  490. pev(tp, pev_v_angle, origin)
  491. set_pev(id ,pev_v_angle, origin)
  492. set_pev(id, pev_fixangle, 1)
  493. */
  494. set_pev(ent, TP_STATE, STATE_CHARGING)
  495. set_pev(ent, TP_TIME, get_gametime() + get_pcvar_float(g_cvar_charging_time))
  496. }
  497. else
  498. {
  499. client_print(id, print_center, "%L", id, "TP_NO_SPACE")
  500. set_pev(ent, TP_STATE, STATE_NORMAL)
  501. }
  502. free_tr2(tr)
  503.  
  504.  
  505. }
  506. else
  507. set_pev(ent, TP_LAST_TOUCH, get_gametime())
  508. }
  509. }
  510. }
  511. }
  512.  
  513. public fwdTakeDamage(ent, idinflictor, idattacker, Float:damage, damagebits)
  514. {
  515. static classname[32]
  516. pev(ent, pev_classname, classname, 31)
  517. if (equal(classname, g_tp_class_name))
  518. {
  519. static owner
  520. owner = pev(ent, TP_OWNER)
  521.  
  522. if (!get_pcvar_num(g_cvar_team_attack) && get_user_team(idattacker) == pev(ent, TP_TEAM))
  523. return HAM_SUPERCEDE
  524.  
  525. static health
  526. health = pev(ent, pev_health)
  527. if (health - HEALTH_OFFSET - damage < 0.0)
  528. {
  529. static type
  530. type = pev(ent, TP_TYPE)
  531. set_hudmessage(255, 0, 0, 0.04, -1.0, 0, 6.0, 3.0)
  532. show_hudmessage(owner, "%L", owner, "TP_DESTROYED", owner,
  533. (type ? "TP_EXIT" : "TP_INPUT"))
  534.  
  535. destroyObject(owner, type)
  536. }
  537. else
  538. {
  539. set_hudmessage(255, 0, 0, 0.04, -1.0, 0, 6.0, 1.0)
  540. show_hudmessage(owner, "%L", owner, "TP_ATTACKED", owner,
  541. (pev(ent, TP_TYPE) ? "TP_EXIT" : "TP_INPUT"))
  542.  
  543. static Float:origin[3]
  544. pev(ent, pev_origin, origin)
  545.  
  546. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
  547. write_byte(TE_SPARKS)
  548. engfunc(EngFunc_WriteCoord, origin[0])
  549. engfunc(EngFunc_WriteCoord, origin[1])
  550. engfunc(EngFunc_WriteCoord, origin[2])
  551. message_end()
  552.  
  553. emit_sound(ent, CHAN_VOICE,
  554. g_damage_sound[random_num(0, sizeof g_damage_sound - 1)],
  555. random_float(0.7, 1.0),
  556. ATTN_NORM, 0, PITCH_NORM)
  557. }
  558. }
  559. return HAM_IGNORED
  560. }
  561.  
  562. public client_disconnect(id)
  563. {
  564. destroyObject(id, 0)
  565. destroyObject(id, 1)
  566.  
  567. remove_task(id)
  568. }
  569.  
  570. public createEffect(id)
  571. {
  572. static msgScreenFade
  573. if (!msgScreenFade)
  574. msgScreenFade = get_user_msgid("ScreenFade")
  575.  
  576. message_begin(MSG_ONE, msgScreenFade, _, id)
  577. write_short(1000)
  578. write_short(1000)
  579. write_short(0x0)
  580. write_byte(200)
  581. write_byte(200)
  582. write_byte(200)
  583. write_byte(255)
  584. message_end()
  585. }
  586.  
  587. public deleteAllTeleports()
  588. {
  589. new i
  590. for (i = 1; i <= g_maxplayers; i++)
  591. {
  592. destroyObject(i, 0)
  593. destroyObject(i, 1)
  594. }
  595. }
  596.  
  597. public eventTeamInfo()
  598. {
  599. new id = read_data(1)
  600. new team[10], iTeam
  601. read_data(2, team, 9)
  602. static teams[33]
  603. if (team[0] == 'C')
  604. iTeam = 2
  605. else
  606. if (team[0] == 'T')
  607. iTeam = 1
  608. else
  609. iTeam = 3
  610.  
  611. if (iTeam != teams[id])
  612. {
  613. destroyObject(id, 0)
  614. destroyObject(id, 1)
  615. }
  616. teams[id] = iTeam
  617. }
  618.  
  619. public roundEnd()
  620. {
  621. if (get_pcvar_num(g_cvar_one_round))
  622. deleteAllTeleports()
  623. }
  624.  
  625. public client_putinserver(id)
  626. {
  627. new Float:anonce = get_pcvar_float(g_cvar_tp_anonce)
  628. if (anonce)
  629. set_task(anonce, "showMessage", id)
  630. }
  631.  
  632. public showMessage(id)
  633. {
  634. client_print(id, print_chat, "%L", id, "TP_WELCOME")
  635. }
  636.  
  637. public bool:checkCost(id, cost)
  638. {
  639. new money = GET_MONEY(id)
  640. if (money >= cost)
  641. {
  642. money -= cost
  643. SET_MONEY(id, money)
  644. return true
  645. }
  646.  
  647. client_print(id, print_center, "%L", id, "TP_NOT_MONEY")
  648. return false
  649. }
  650.  
  651. /* Portal gun is cooming soon */
  652.