Advertisement
Guest User

Untitled

a guest
Nov 17th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.84 KB | None | 0 0
  1. /*================================================================================
  2.  
  3. ---------------------------
  4. -*- [ZP] Grenade: Frost -*-
  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 <engine>
  15. #include <fakemeta>
  16. #include <hamsandwich>
  17. #include <amx_settings_api>
  18. #include <cs_weap_models_api>
  19. #include <cs_ham_bots_api>
  20. #include <zp50_core>
  21. #include <zp50_class_nemesis>
  22.  
  23. // Settings file
  24. new const ZP_SETTINGS_FILE[] = "zombieplague.ini"
  25.  
  26. // Default sounds
  27. new const sound_grenade_frost_explode[][] = { "warcraft3/frostnova.wav" }
  28. new const sound_grenade_frost_player[][] = { "warcraft3/impalehit.wav" }
  29. new const sound_grenade_frost_break[][] = { "warcraft3/impalelaunch1.wav" }
  30.  
  31. #define MODEL_MAX_LENGTH 64
  32. #define SOUND_MAX_LENGTH 64
  33. #define SPRITE_MAX_LENGTH 64
  34.  
  35. // Models
  36. new g_model_grenade_frost[MODEL_MAX_LENGTH] = "models/zombie_plague/v_grenade_frost.mdl"
  37. new g_model_pgrenade_frost[MODEL_MAX_LENGTH] = "models/zombie_plague/p_grenade_frost.mdl"
  38. new g_model_wgrenade_frost[MODEL_MAX_LENGTH] = "models/zombie_plague/w_grenade_frost.mdl"
  39.  
  40. // Sprites
  41. new g_sprite_grenade_trail[SPRITE_MAX_LENGTH] = "sprites/lgtning.spr"
  42. new g_sprite_grenade_ring[SPRITE_MAX_LENGTH] = "sprites/shockwave.spr"
  43. new g_sprite_grenade_glass[SPRITE_MAX_LENGTH] = "models/glassgibs.mdl"
  44. new g_sprite_grenade_frost_exp[SPRITE_MAX_LENGTH] = "sprites/felix/frost_exp.spr"
  45.  
  46. new const ice_model[] = "models/zombie_plague/dd_iceblock.mdl"
  47.  
  48. new Array:g_sound_grenade_frost_explode
  49. new Array:g_sound_grenade_frost_player
  50. new Array:g_sound_grenade_frost_break
  51.  
  52. #define GRAVITY_HIGH 999999.9
  53. #define GRAVITY_NONE 0.000001
  54.  
  55. #define TASK_FROST_REMOVE 100
  56. #define ID_FROST_REMOVE (taskid - TASK_FROST_REMOVE)
  57.  
  58. #define MAXPLAYERS 32
  59.  
  60. #define flag_get(%1,%2) (%1 & (1 << (%2 & 31)))
  61. #define flag_get_boolean(%1,%2) (flag_get(%1,%2) ? true : false)
  62. #define flag_set(%1,%2) %1 |= (1 << (%2 & 31))
  63. #define flag_unset(%1,%2) %1 &= ~(1 << (%2 & 31))
  64.  
  65. // Hack to be able to use Ham_Player_ResetMaxSpeed (by joaquimandrade)
  66. new Ham:Ham_Player_ResetMaxSpeed = Ham_Item_PreFrame
  67.  
  68. // Explosion radius for custom grenades
  69. const Float:NADE_EXPLOSION_RADIUS = 240.0
  70.  
  71. // HACK: pev_ field used to store custom nade types and their values
  72. const PEV_NADE_TYPE = pev_flTimeStepSound
  73. const NADE_TYPE_FROST = 3333
  74.  
  75. // Some constants
  76. const UNIT_SECOND = (1<<12)
  77. const BREAK_GLASS = 0x01
  78. const FFADE_IN = 0x0000
  79. const FFADE_STAYOUT = 0x0004
  80.  
  81. // Custom Forwards
  82. enum _:TOTAL_FORWARDS
  83. {
  84. FW_USER_FREEZE_PRE = 0,
  85. FW_USER_UNFROZEN
  86. }
  87. new g_Forwards[TOTAL_FORWARDS]
  88. new g_ForwardResult
  89.  
  90. new g_IsFrozen
  91. new Float:g_FrozenGravity[MAXPLAYERS+1]
  92. new g_FrozenRenderingFx[MAXPLAYERS+1]
  93. new Float:g_FrozenRenderingColor[MAXPLAYERS+1][3]
  94. new g_FrozenRenderingRender[MAXPLAYERS+1]
  95. new Float:g_FrozenRenderingAmount[MAXPLAYERS+1]
  96. new IceEntity[MAXPLAYERS+1]
  97.  
  98. new g_MsgDamage, g_MsgScreenFade
  99. new g_trailSpr, g_exploSpr, g_glassSpr, g_frost_gibs
  100. new g_frostexpSpr;
  101. new g_frostgibsSpr;
  102.  
  103. new cvar_grenade_frost_duration, cvar_grenade_frost_hudicon
  104.  
  105. public plugin_init()
  106. {
  107. register_plugin("[ZP] Grenade: Frost", ZP_VERSION_STRING, "ZP Dev Team")
  108.  
  109. RegisterHam(Ham_Player_ResetMaxSpeed, "player", "fw_ResetMaxSpeed_Post", 1)
  110. RegisterHamBots(Ham_Player_ResetMaxSpeed, "fw_ResetMaxSpeed_Post", 1)
  111. RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
  112. RegisterHamBots(Ham_TakeDamage, "fw_TakeDamage")
  113. RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
  114. RegisterHamBots(Ham_TraceAttack, "fw_TraceAttack")
  115. RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
  116. RegisterHamBots(Ham_Killed, "fw_PlayerKilled")
  117. //register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
  118. register_forward(FM_SetModel, "fw_SetModel")
  119. RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade")
  120.  
  121. g_MsgDamage = get_user_msgid("Damage")
  122. g_MsgScreenFade = get_user_msgid("ScreenFade")
  123.  
  124. cvar_grenade_frost_duration = register_cvar("zp_grenade_frost_duration", "3")
  125. cvar_grenade_frost_hudicon = register_cvar("zp_grenade_frost_hudicon", "1")
  126.  
  127. g_Forwards[FW_USER_FREEZE_PRE] = CreateMultiForward("zp_fw_grenade_frost_pre", ET_CONTINUE, FP_CELL)
  128. g_Forwards[FW_USER_UNFROZEN] = CreateMultiForward("zp_fw_grenade_frost_unfreeze", ET_IGNORE, FP_CELL)
  129. }
  130.  
  131. public plugin_natives()
  132. {
  133. register_library("zp50_grenade_frost")
  134. register_native("zp_grenade_frost_get", "native_grenade_frost_get")
  135. register_native("zp_grenade_frost_set", "native_grenade_frost_set")
  136. }
  137.  
  138. public native_grenade_frost_get(plugin_id, num_params)
  139. {
  140. new id = get_param(1)
  141.  
  142. if (!is_user_alive(id))
  143. {
  144. log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
  145. return false;
  146. }
  147.  
  148. return flag_get_boolean(g_IsFrozen, id);
  149. }
  150.  
  151. public native_grenade_frost_set(plugin_id, num_params)
  152. {
  153. new id = get_param(1)
  154.  
  155. if (!is_user_alive(id))
  156. {
  157. log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
  158. return false;
  159. }
  160.  
  161. new set = get_param(2)
  162.  
  163. // Unfreeze
  164. if (!set)
  165. {
  166. // Not frozen
  167. if (!flag_get(g_IsFrozen, id))
  168. return true;
  169.  
  170. // Remove freeze right away and stop the task
  171. remove_freeze(id+TASK_FROST_REMOVE)
  172. remove_task(id+TASK_FROST_REMOVE)
  173. return true;
  174. }
  175.  
  176. return set_freeze(id);
  177. }
  178.  
  179. public plugin_precache()
  180. {
  181. // Initialize arrays
  182. g_sound_grenade_frost_explode = ArrayCreate(SOUND_MAX_LENGTH, 1)
  183. g_sound_grenade_frost_player = ArrayCreate(SOUND_MAX_LENGTH, 1)
  184. g_sound_grenade_frost_break = ArrayCreate(SOUND_MAX_LENGTH, 1)
  185.  
  186. // Load from external file
  187. amx_load_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FROST EXPLODE", g_sound_grenade_frost_explode)
  188. amx_load_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FROST PLAYER", g_sound_grenade_frost_player)
  189. amx_load_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FROST BREAK", g_sound_grenade_frost_break)
  190.  
  191. // If we couldn't load custom sounds from file, use and save default ones
  192. new index
  193. if (ArraySize(g_sound_grenade_frost_explode) == 0)
  194. {
  195. for (index = 0; index < sizeof sound_grenade_frost_explode; index++)
  196. ArrayPushString(g_sound_grenade_frost_explode, sound_grenade_frost_explode[index])
  197.  
  198. // Save to external file
  199. amx_save_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FROST EXPLODE", g_sound_grenade_frost_explode)
  200. }
  201. if (ArraySize(g_sound_grenade_frost_player) == 0)
  202. {
  203. for (index = 0; index < sizeof sound_grenade_frost_player; index++)
  204. ArrayPushString(g_sound_grenade_frost_player, sound_grenade_frost_player[index])
  205.  
  206. // Save to external file
  207. amx_save_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FROST PLAYER", g_sound_grenade_frost_player)
  208. }
  209. if (ArraySize(g_sound_grenade_frost_break) == 0)
  210. {
  211. for (index = 0; index < sizeof sound_grenade_frost_break; index++)
  212. ArrayPushString(g_sound_grenade_frost_break, sound_grenade_frost_break[index])
  213.  
  214. // Save to external file
  215. amx_save_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FROST BREAK", g_sound_grenade_frost_break)
  216. }
  217.  
  218. // Load from external file, save if not found
  219. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "V_GRENADE FROST", g_model_grenade_frost, charsmax(g_model_grenade_frost)))
  220. amx_save_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "V_GRENADE FROST", g_model_grenade_frost)
  221. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "P_GRENADE FROST", g_model_pgrenade_frost, charsmax(g_model_pgrenade_frost)))
  222. amx_save_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "P_GRENADE FROST", g_model_pgrenade_frost)
  223. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "W_GRENADE FROST", g_model_wgrenade_frost, charsmax(g_model_wgrenade_frost)))
  224. amx_save_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "W_GRENADE FROST", g_model_wgrenade_frost)
  225. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "TRAIL", g_sprite_grenade_trail, charsmax(g_sprite_grenade_trail)))
  226. amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "TRAIL", g_sprite_grenade_trail)
  227. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "RING_FROST", g_sprite_grenade_ring, charsmax(g_sprite_grenade_ring)))
  228. amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "RING_FROST", g_sprite_grenade_ring)
  229. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "GLASS", g_sprite_grenade_glass, charsmax(g_sprite_grenade_glass)))
  230. amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "GLASS", g_sprite_grenade_glass)
  231. if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "FROST EXP", g_sprite_grenade_frost_exp, charsmax(g_sprite_grenade_frost_exp)))
  232. amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "FROST EXP", g_sprite_grenade_frost_exp)
  233.  
  234. // Precache sounds
  235. new sound[SOUND_MAX_LENGTH]
  236. for (index = 0; index < ArraySize(g_sound_grenade_frost_explode); index++)
  237. {
  238. ArrayGetString(g_sound_grenade_frost_explode, index, sound, charsmax(sound))
  239. precache_sound(sound)
  240. }
  241. for (index = 0; index < ArraySize(g_sound_grenade_frost_player); index++)
  242. {
  243. ArrayGetString(g_sound_grenade_frost_player, index, sound, charsmax(sound))
  244. precache_sound(sound)
  245. }
  246. for (index = 0; index < ArraySize(g_sound_grenade_frost_break); index++)
  247. {
  248. ArrayGetString(g_sound_grenade_frost_break, index, sound, charsmax(sound))
  249. precache_sound(sound)
  250. }
  251.  
  252. // Precache models
  253. g_frostexpSpr = precache_model(g_sprite_grenade_frost_exp)
  254.  
  255. precache_model(g_model_grenade_frost)
  256. precache_model(g_model_pgrenade_frost)
  257. precache_model(g_model_wgrenade_frost)
  258. g_trailSpr = precache_model(g_sprite_grenade_trail)
  259. g_exploSpr = precache_model(g_sprite_grenade_ring)
  260. g_glassSpr = precache_model(g_sprite_grenade_glass)
  261. g_frost_gibs = precache_model("sprites/frost_gibs.spr")
  262.  
  263. precache_model(ice_model)
  264. }
  265.  
  266. public zp_fw_core_cure_post(id, attacker)
  267. {
  268. // Set custom grenade model
  269. cs_set_player_view_model(id, CSW_FLASHBANG, g_model_grenade_frost)
  270. cs_set_player_weap_model(id, CSW_FLASHBANG, g_model_pgrenade_frost)
  271.  
  272. // If frozen, remove freeze after player is cured
  273. if (flag_get(g_IsFrozen, id))
  274. {
  275. // Update gravity and rendering values first
  276. ApplyFrozenGravity(id)
  277. //ApplyFrozenRendering(id)
  278.  
  279. // Remove freeze right away and stop the task
  280. remove_freeze(id+TASK_FROST_REMOVE)
  281. remove_task(id+TASK_FROST_REMOVE)
  282. ice_entity(id, 0)
  283. }
  284. }
  285.  
  286. public zp_fw_core_infect(id, attacker)
  287. {
  288. // Remove custom grenade model
  289. cs_reset_player_view_model(id, CSW_FLASHBANG)
  290. cs_reset_player_weap_model(id, CSW_FLASHBANG)
  291. }
  292.  
  293. public zp_fw_core_infect_post(id, attacker)
  294. {
  295. // If frozen, update gravity and rendering
  296. if (flag_get(g_IsFrozen, id))
  297. {
  298. ApplyFrozenGravity(id)
  299. //ApplyFrozenRendering(id)
  300. }
  301. }
  302.  
  303. public client_connect(id) IceEntity[id] = -1
  304. public client_disconnected(id)
  305. {
  306. flag_unset(g_IsFrozen, id)
  307. remove_task(id+TASK_FROST_REMOVE)
  308. ice_entity(id, 0)
  309. }
  310.  
  311. public fw_ResetMaxSpeed_Post(id)
  312. {
  313. // Dead or not frozen
  314. if (!is_user_alive(id) || !flag_get(g_IsFrozen, id))
  315. return;
  316.  
  317. // Prevent from moving
  318. set_user_maxspeed(id, 0.1)
  319. }
  320.  
  321. // Ham Trace Attack Forward
  322. public fw_TraceAttack(victim, attacker)
  323. {
  324. // Non-player damage or self damage
  325. if (victim == attacker || !is_user_alive(attacker))
  326. return HAM_IGNORED;
  327.  
  328. // Block damage while frozen, as it makes killing zombies too easy
  329. if (flag_get(g_IsFrozen, victim))
  330. return HAM_SUPERCEDE;
  331.  
  332. return HAM_IGNORED;
  333. }
  334.  
  335. // Ham Take Damage Forward (needed to block explosion damage too)
  336. public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
  337. {
  338. // Non-player damage or self damage
  339. if (victim == attacker || !is_user_alive(attacker))
  340. return HAM_IGNORED;
  341.  
  342. // Block damage while frozen, as it makes killing zombies too easy
  343. if (flag_get(g_IsFrozen, victim))
  344. return HAM_SUPERCEDE;
  345.  
  346. return HAM_IGNORED;
  347. }
  348.  
  349. // Ham Player Killed Forward
  350. public fw_PlayerKilled(victim, attacker, shouldgib)
  351. {
  352. // Frozen player being killed (usually caused by a 3rd party plugin, e.g. lasermines)
  353. if (flag_get(g_IsFrozen, victim))
  354. {
  355. // Remove freeze right away and stop the task
  356. remove_freeze(victim+TASK_FROST_REMOVE)
  357. remove_task(victim+TASK_FROST_REMOVE)
  358. ice_entity(victim, 0)
  359. }
  360. }
  361.  
  362. // Forward Player PreThink
  363. public fw_PlayerPreThink(id)
  364. {
  365. // Not alive or not frozen
  366. if (!is_user_alive(id) || !flag_get(g_IsFrozen, id))
  367. return;
  368.  
  369. // Stop motion
  370. new Float: vel[3];pev(id, pev_velocity, vel);vel[ 0 ] = 0.0;vel[ 1 ] = 0.0;set_pev(id, pev_velocity, vel);
  371. //set_pev(id, pev_velocity, Float:{0.0,0.0,0.0})
  372. }
  373.  
  374. // Forward Set Model
  375. public fw_SetModel(entity, const model[])
  376. {
  377. // We don't care
  378. if (strlen(model) < 8)
  379. return FMRES_IGNORED;
  380.  
  381. // Narrow down our matches a bit
  382. if (model[7] != 'w' || model[8] != '_')
  383. return FMRES_IGNORED;
  384.  
  385. // Get damage time of grenade
  386. static Float:dmgtime
  387. pev(entity, pev_dmgtime, dmgtime)
  388.  
  389. // Grenade not yet thrown
  390. if (dmgtime == 0.0)
  391. return FMRES_IGNORED;
  392.  
  393. // Grenade's owner is zombie?
  394. if (zp_core_is_zombie(pev(entity, pev_owner)))
  395. return FMRES_IGNORED;
  396.  
  397. // Flashbang
  398. if (model[9] == 'f' && model[10] == 'l')
  399. {
  400. // Give it a glow
  401. fm_set_rendering(entity, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 16);
  402.  
  403. // And a colored trail
  404. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  405. write_byte(TE_BEAMFOLLOW) // TE id
  406. write_short(entity) // entity
  407. write_short(g_trailSpr) // sprite
  408. write_byte(10) // life
  409. write_byte(10) // width
  410. write_byte(0) // r
  411. write_byte(100) // g
  412. write_byte(200) // b
  413. write_byte(200) // brightness
  414. message_end()
  415.  
  416. // Set grenade type on the thrown grenade entity
  417. set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FROST)
  418. engfunc(EngFunc_SetModel, entity, g_model_wgrenade_frost)
  419. return FMRES_SUPERCEDE
  420. }
  421. return FMRES_IGNORED
  422. }
  423.  
  424. // Ham Grenade Think Forward
  425. public fw_ThinkGrenade(entity)
  426. {
  427. // Invalid entity
  428. if (!pev_valid(entity)) return HAM_IGNORED;
  429.  
  430. // Get damage time of grenade
  431. static Float:dmgtime
  432. pev(entity, pev_dmgtime, dmgtime)
  433.  
  434. // Check if it's time to go off
  435. if (dmgtime > get_gametime())
  436. return HAM_IGNORED;
  437.  
  438. // Check if it's one of our custom nades
  439. switch (pev(entity, PEV_NADE_TYPE))
  440. {
  441. case NADE_TYPE_FROST: // Frost Grenade
  442. {
  443. frost_explode(entity)
  444. return HAM_SUPERCEDE;
  445. }
  446. }
  447.  
  448. return HAM_IGNORED;
  449. }
  450.  
  451. // Frost Grenade Explosion
  452. frost_explode(ent)
  453. {
  454. // Get origin
  455. static Float:origin[3]
  456. pev(ent, pev_origin, origin)
  457.  
  458. // Make the explosion
  459. create_blast3(origin)
  460. message_begin (MSG_BROADCAST,SVC_TEMPENTITY)
  461. write_byte( TE_SPRITETRAIL ) // Throws a shower of sprites or models
  462. engfunc(EngFunc_WriteCoord, origin[ 0 ]) // start pos
  463. engfunc(EngFunc_WriteCoord, origin[ 1 ])
  464. engfunc(EngFunc_WriteCoord, origin[ 2 ] + 200.0)
  465. engfunc(EngFunc_WriteCoord, origin[ 0 ]) // velocity
  466. engfunc(EngFunc_WriteCoord, origin[ 1 ])
  467. engfunc(EngFunc_WriteCoord, origin[ 2 ] + 30.0)
  468. write_short(g_frost_gibs) // spr
  469. write_byte(50) // (count)
  470. write_byte(random_num(27,30)) // (life in 0.1's)
  471. write_byte(4) // byte (scale in 0.1's)
  472. write_byte(50) // (velocity along vector in 10's)
  473. write_byte(10) // (randomness of velocity in 10's)
  474. message_end()
  475.  
  476. // Frost nade explode sound
  477. static sound[SOUND_MAX_LENGTH]
  478. ArrayGetString(g_sound_grenade_frost_explode, random_num(0, ArraySize(g_sound_grenade_frost_explode) - 1), sound, charsmax(sound))
  479. emit_sound(ent, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  480.  
  481. // Collisions
  482. new victim = -1
  483.  
  484. while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, origin, NADE_EXPLOSION_RADIUS)) != 0)
  485. {
  486. // Only effect alive zombies
  487. if (!is_user_alive(victim) || !zp_core_is_zombie(victim))
  488. continue;
  489.  
  490. set_freeze(victim)
  491. }
  492.  
  493. // Get rid of the grenade
  494. engfunc(EngFunc_RemoveEntity, ent)
  495. }
  496.  
  497. set_freeze(victim)
  498. {
  499. // Already frozen
  500. if (flag_get(g_IsFrozen, victim))
  501. return false;
  502.  
  503. // Allow other plugins to decide whether player should be frozen or not
  504. ExecuteForward(g_Forwards[FW_USER_FREEZE_PRE], g_ForwardResult, victim)
  505. if (g_ForwardResult >= PLUGIN_HANDLED)
  506. {
  507. // Get player's origin
  508. static origin2[3]
  509. get_user_origin(victim, origin2)
  510.  
  511. // Broken glass sound
  512. static sound[SOUND_MAX_LENGTH]
  513. ArrayGetString(g_sound_grenade_frost_break, random_num(0, ArraySize(g_sound_grenade_frost_break) - 1), sound, charsmax(sound))
  514. emit_sound(victim, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  515.  
  516. // Glass shatter
  517. message_begin(MSG_PVS, SVC_TEMPENTITY, origin2)
  518. write_byte(TE_BREAKMODEL) // TE id
  519. write_coord(origin2[0]) // x
  520. write_coord(origin2[1]) // y
  521. write_coord(origin2[2]+24) // z
  522. write_coord(16) // size x
  523. write_coord(16) // size y
  524. write_coord(16) // size z
  525. write_coord(random_num(-50, 50)) // velocity x
  526. write_coord(random_num(-50, 50)) // velocity y
  527. write_coord(25) // velocity z
  528. write_byte(10) // random velocity
  529. write_short(g_glassSpr) // model
  530. write_byte(10) // count
  531. write_byte(25) // life
  532. write_byte(BREAK_GLASS) // flags
  533. message_end()
  534.  
  535. return false;
  536. }
  537.  
  538. // Freeze icon?
  539. if (get_pcvar_num(cvar_grenade_frost_hudicon))
  540. {
  541. message_begin(MSG_ONE_UNRELIABLE, g_MsgDamage, _, victim)
  542. write_byte(0) // damage save
  543. write_byte(0) // damage take
  544. write_long(DMG_DROWN) // damage type - DMG_FREEZE
  545. write_coord(0) // x
  546. write_coord(0) // y
  547. write_coord(0) // z
  548. message_end()
  549. }
  550.  
  551. // Set frozen flag
  552. flag_set(g_IsFrozen, victim)
  553.  
  554. set_pev(victim, pev_flags, pev(victim, pev_flags) | FL_FROZEN)
  555.  
  556. // Freeze sound
  557. static sound[SOUND_MAX_LENGTH]
  558. ArrayGetString(g_sound_grenade_frost_player, random_num(0, ArraySize(g_sound_grenade_frost_player) - 1), sound, charsmax(sound))
  559. emit_sound(victim, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  560.  
  561. // Add a blue tint to their screen
  562. message_begin(MSG_ONE, g_MsgScreenFade, _, victim)
  563. write_short(0) // duration
  564. write_short(0) // hold time
  565. write_short(FFADE_STAYOUT) // fade type
  566. write_byte(0) // red
  567. write_byte(50) // green
  568. write_byte(200) // blue
  569. write_byte(100) // alpha
  570. message_end()
  571.  
  572. // Update player entity rendering
  573. //ApplyFrozenRendering(victim)
  574.  
  575. // Block gravity
  576. ApplyFrozenGravity(victim)
  577.  
  578. // Update player's maxspeed
  579. ExecuteHamB(Ham_Player_ResetMaxSpeed, victim)
  580.  
  581. // Frost effect
  582. ice_entity(victim, 1)
  583.  
  584. // Set a task to remove the freeze
  585. set_task(get_pcvar_float(cvar_grenade_frost_duration), "remove_freeze", victim+TASK_FROST_REMOVE)
  586. return true;
  587. }
  588.  
  589. ApplyFrozenGravity(id)
  590. {
  591. // Get current gravity
  592. new Float:gravity = get_user_gravity(id)
  593.  
  594. // Already set, no worries...
  595. if (gravity == GRAVITY_HIGH || gravity == GRAVITY_NONE)
  596. return;
  597.  
  598. // Save player's old gravity
  599. g_FrozenGravity[id] = gravity
  600.  
  601. // Prevent from jumping
  602. if (pev(id, pev_flags) & FL_ONGROUND)
  603. set_user_gravity(id, GRAVITY_HIGH) // set really high
  604. //else
  605. //set_user_gravity(id, GRAVITY_NONE) // no gravity
  606. }
  607.  
  608. /*ApplyFrozenRendering(id)
  609. {
  610. // Get current rendering
  611. new rendering_fx = pev(id, pev_renderfx)
  612. new Float:rendering_color[3]
  613. pev(id, pev_rendercolor, rendering_color)
  614. new rendering_render = pev(id, pev_rendermode)
  615. new Float:rendering_amount
  616. pev(id, pev_renderamt, rendering_amount)
  617.  
  618. // Already set, no worries...
  619. if (rendering_fx == kRenderFxGlowShell && rendering_color[0] == 0.0 && rendering_color[1] == 100.0
  620. && rendering_color[2] == 200.0 && rendering_render == kRenderNormal && rendering_amount == 25.0)
  621. return;
  622.  
  623. // Save player's old rendering
  624. g_FrozenRenderingFx[id] = pev(id, pev_renderfx)
  625. pev(id, pev_rendercolor, g_FrozenRenderingColor[id])
  626. g_FrozenRenderingRender[id] = pev(id, pev_rendermode)
  627. pev(id, pev_renderamt, g_FrozenRenderingAmount[id])
  628.  
  629. // Light blue glow while frozen
  630. //fm_set_rendering(id, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
  631. }*/
  632.  
  633. // Remove freeze task
  634. public remove_freeze(taskid)
  635. {
  636. // Remove frozen flag
  637. flag_unset(g_IsFrozen, ID_FROST_REMOVE)
  638.  
  639. // Remove frost entity
  640. ice_entity(ID_FROST_REMOVE, 0)
  641.  
  642. // Restore gravity
  643. set_pev(ID_FROST_REMOVE, pev_gravity, g_FrozenGravity[ID_FROST_REMOVE])
  644. set_pev(ID_FROST_REMOVE, pev_flags, pev( ID_FROST_REMOVE, pev_flags ) & ~FL_FROZEN)
  645.  
  646. // Update player's maxspeed
  647. ExecuteHamB(Ham_Player_ResetMaxSpeed, ID_FROST_REMOVE)
  648.  
  649. // Restore rendering
  650. fm_set_rendering_float(ID_FROST_REMOVE, g_FrozenRenderingFx[ID_FROST_REMOVE], g_FrozenRenderingColor[ID_FROST_REMOVE], g_FrozenRenderingRender[ID_FROST_REMOVE], g_FrozenRenderingAmount[ID_FROST_REMOVE])
  651.  
  652. // Gradually remove screen's blue tint
  653. message_begin(MSG_ONE, g_MsgScreenFade, _, ID_FROST_REMOVE)
  654. write_short(UNIT_SECOND) // duration
  655. write_short(0) // hold time
  656. write_short(FFADE_IN) // fade type
  657. write_byte(0) // red
  658. write_byte(50) // green
  659. write_byte(200) // blue
  660. write_byte(100) // alpha
  661. message_end()
  662.  
  663. // Broken glass sound
  664. static sound[SOUND_MAX_LENGTH]
  665. ArrayGetString(g_sound_grenade_frost_break, random_num(0, ArraySize(g_sound_grenade_frost_break) - 1), sound, charsmax(sound))
  666. emit_sound(ID_FROST_REMOVE, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  667.  
  668. // Get player's origin
  669. static origin[3]
  670. get_user_origin(ID_FROST_REMOVE, origin)
  671.  
  672. // Glass shatter
  673. message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
  674. write_byte(TE_BREAKMODEL) // TE id
  675. write_coord(origin[0]) // x
  676. write_coord(origin[1]) // y
  677. write_coord(origin[2]+24) // z
  678. write_coord(16) // size x
  679. write_coord(16) // size y
  680. write_coord(16) // size z
  681. write_coord(random_num(-50, 50)) // velocity x
  682. write_coord(random_num(-50, 50)) // velocity y
  683. write_coord(25) // velocity z
  684. write_byte(10) // random velocity
  685. write_short(g_glassSpr) // model
  686. write_byte(10) // count
  687. write_byte(25) // life
  688. write_byte(BREAK_GLASS) // flags
  689. message_end()
  690.  
  691. ExecuteForward(g_Forwards[FW_USER_UNFROZEN], g_ForwardResult, ID_FROST_REMOVE)
  692. }
  693.  
  694. // Frost Grenade: Freeze Blast
  695. create_blast3(const Float:originF[3])
  696. {
  697. // Frost Sprite
  698. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  699. write_byte(TE_EXPLOSION) // TE ID
  700. engfunc(EngFunc_WriteCoord, originF[0]) // Position X
  701. engfunc(EngFunc_WriteCoord, originF[1]) // Y
  702. engfunc(EngFunc_WriteCoord, originF[2] + 50.0) // Z
  703. write_short(g_frostexpSpr) // Sprite index
  704. write_byte(20) // Size of sprite
  705. write_byte(30) // Framerate
  706. write_byte(TE_EXPLFLAG_NOSOUND)
  707. message_end()
  708.  
  709. // Smallest ring
  710. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
  711. write_byte(TE_BEAMCYLINDER) // TE id
  712. engfunc(EngFunc_WriteCoord, originF[0]) // x
  713. engfunc(EngFunc_WriteCoord, originF[1]) // y
  714. engfunc(EngFunc_WriteCoord, originF[2]) // z
  715. engfunc(EngFunc_WriteCoord, originF[0]) // x axis
  716. engfunc(EngFunc_WriteCoord, originF[1]) // y axis
  717. engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis
  718. write_short(g_exploSpr) // sprite
  719. write_byte(0) // startframe
  720. write_byte(0) // framerate
  721. write_byte(4) // life
  722. write_byte(60) // width
  723. write_byte(0) // noise
  724. write_byte(0) // red
  725. write_byte(100) // green
  726. write_byte(200) // blue
  727. write_byte(200) // brightness
  728. write_byte(0) // speed
  729. message_end()
  730.  
  731. // Medium ring
  732. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
  733. write_byte(TE_BEAMCYLINDER) // TE id
  734. engfunc(EngFunc_WriteCoord, originF[0]) // x
  735. engfunc(EngFunc_WriteCoord, originF[1]) // y
  736. engfunc(EngFunc_WriteCoord, originF[2]) // z
  737. engfunc(EngFunc_WriteCoord, originF[0]) // x axis
  738. engfunc(EngFunc_WriteCoord, originF[1]) // y axis
  739. engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis
  740. write_short(g_exploSpr) // sprite
  741. write_byte(0) // startframe
  742. write_byte(0) // framerate
  743. write_byte(4) // life
  744. write_byte(60) // width
  745. write_byte(0) // noise
  746. write_byte(0) // red
  747. write_byte(100) // green
  748. write_byte(200) // blue
  749. write_byte(200) // brightness
  750. write_byte(0) // speed
  751. message_end()
  752.  
  753. // Largest ring
  754. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
  755. write_byte(TE_BEAMCYLINDER) // TE id
  756. engfunc(EngFunc_WriteCoord, originF[0]) // x
  757. engfunc(EngFunc_WriteCoord, originF[1]) // y
  758. engfunc(EngFunc_WriteCoord, originF[2]) // z
  759. engfunc(EngFunc_WriteCoord, originF[0]) // x axis
  760. engfunc(EngFunc_WriteCoord, originF[1]) // y axis
  761. engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis
  762. write_short(g_exploSpr) // sprite
  763. write_byte(0) // startframe
  764. write_byte(0) // framerate
  765. write_byte(4) // life
  766. write_byte(60) // width
  767. write_byte(0) // noise
  768. write_byte(0) // red
  769. write_byte(100) // green
  770. write_byte(200) // blue
  771. write_byte(200) // brightness
  772. write_byte(0) // speed
  773. message_end()
  774.  
  775. message_begin (MSG_BROADCAST,SVC_TEMPENTITY)
  776. write_byte( TE_SPRITETRAIL ) // Throws a shower of sprites or models
  777. engfunc(EngFunc_WriteCoord, originF[ 0 ]) // start pos
  778. engfunc(EngFunc_WriteCoord, originF[ 1 ])
  779. engfunc(EngFunc_WriteCoord, originF[ 2 ] + 200.0)
  780. engfunc(EngFunc_WriteCoord, originF[ 0 ]) // velocity
  781. engfunc(EngFunc_WriteCoord, originF[ 1 ])
  782. engfunc(EngFunc_WriteCoord, originF[ 2 ] + 30.0)
  783. write_short(g_frostgibsSpr) // spr
  784. write_byte(20) // (count)
  785. write_byte(5) // (life in 0.1's)
  786. write_byte(2) // byte (scale in 0.1's)
  787. write_byte(50) // (velocity along vector in 10's)
  788. write_byte(10) // (randomness of velocity in 10's)
  789. message_end()
  790. }
  791.  
  792. // Set entity's rendering type (from fakemeta_util)
  793. stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
  794. {
  795. static Float:color[3]
  796. color[0] = float(r)
  797. color[1] = float(g)
  798. color[2] = float(b)
  799.  
  800. set_pev(entity, pev_renderfx, fx)
  801. set_pev(entity, pev_rendercolor, color)
  802. set_pev(entity, pev_rendermode, render)
  803. set_pev(entity, pev_renderamt, float(amount))
  804. }
  805.  
  806. // Set entity's rendering type (float parameters version)
  807. stock fm_set_rendering_float(entity, fx = kRenderFxNone, Float:color[3], render = kRenderNormal, Float:amount = 16.0)
  808. {
  809. set_pev(entity, pev_renderfx, fx)
  810. set_pev(entity, pev_rendercolor, color)
  811. set_pev(entity, pev_rendermode, render)
  812. set_pev(entity, pev_renderamt, amount)
  813. }
  814.  
  815. stock ice_entity( id, status )
  816. {
  817. if(status)
  818. {
  819. static ent, Float:o[3]
  820. pev( id, pev_origin, o )
  821. if( pev( id, pev_flags ) & FL_DUCKING ) o[2] -= 15.0
  822. else o[2] -= 35.0
  823. ent = create_entity("info_target")
  824. set_pev( ent, pev_classname, "DareDevil" )
  825.  
  826. entity_set_model(ent, ice_model)
  827. dllfunc(DLLFunc_Spawn, ent)
  828. set_pev(ent, pev_solid, SOLID_NOT)
  829. set_pev(ent, pev_movetype, MOVETYPE_FLY)
  830. entity_set_origin(ent, o)
  831. entity_set_size(ent, Float:{ -3.0, -3.0, -3.0 }, Float:{ 3.0, 3.0, 3.0 } )
  832. set_pev( ent, pev_iuser3, id )
  833. set_pev( ent, pev_team, 6969 )
  834. set_rendering(ent, kRenderFxNone, 255, 255, 255, kRenderTransAdd, 100)
  835. IceEntity[id] = ent
  836. }
  837. else
  838. {
  839. if( is_valid_ent(IceEntity[id]) )
  840. {
  841. if( pev(IceEntity[id], pev_team) == 6969 ) remove_entity(IceEntity[id])
  842. IceEntity[id] = -1
  843. }
  844. }
  845. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement