Advertisement
IsraelNevo

[PAWN] Frost Trap

May 14th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 9.62 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <celltrie>
  4. #include <fakemeta>
  5. #include <fun>
  6. #include <cstrike>
  7. #include <hamsandwich>
  8.  
  9. #define MAX_TRAPS 70
  10.  
  11. #define OVERRIDE_NADE_CLASS "grenade"
  12. #define OVERRIDE_NADE_MODEL "w_smokegrenade.mdl"
  13.  
  14. #define SOUND_FREEZE "squeek/sqk_blast1.wav"
  15. #define SOUND_RESOTRE "common/bodydrop1.wav"
  16.  
  17. #define TASK_REMOVE_FROZE 1000
  18.  
  19. new const gszClasses[][]={
  20.     "func_button",
  21.     "func_rot_button",
  22.     "button_target"
  23. };
  24.  
  25. new Trie:gTraps;
  26. new giEntsTrigger[MAX_TRAPS];
  27. new giPointer=0;
  28. new smokeSpr, exploSpr, trailSpr;
  29. new gcvarDistance, gcvarTime;
  30. new giGrenades[33];
  31.  
  32. public plugin_init() {
  33.     register_plugin("FrostTrap", "v2.0", "Edited By Shon")
  34.     register_cvar("freezetrap",VERSION,FCVAR_SERVER|FCVAR_SPONLY);
  35.    
  36.     register_event( "TextMsg", "eventRound", "a", "2&#Game_will_restart_in" );
  37.     register_event("TextMsg", "eventRound", "a", "2&#Game_C")
  38.     register_logevent( "eventRound",2, "1=Round_Start");
  39.    
  40.     register_forward(FM_SetModel, "fwSetModel",1);
  41.     register_forward(FM_Think, "fwThink",1);
  42.    
  43.     gcvarDistance=register_cvar("freezetrap_distance","150.0",0,150.0);
  44.     gcvarTime=register_cvar("freezetrap_time","10.0",0,10.0);
  45.    
  46.     gTraps = TrieCreate();
  47. }
  48. public eventRound(){
  49.     new tid;
  50.     //512? i`m not sure, so doubled
  51.     for(new i=0;i<=1024;i++){
  52.         tid=i+TASK_REMOVE_FROZE;
  53.         if(task_exists(tid)){
  54.             remove_task(tid);
  55.             restoreTrap(tid);
  56.         }
  57.     }
  58.     for(new i=1;i<33;i++)
  59.         giGrenades[i]=0;
  60. }
  61. public fwUse(this, idcaller, idactivator, use_type, Float:value){
  62.     if(task_exists(this+TASK_REMOVE_FROZE)){
  63.         return HAM_SUPERCEDE;
  64.     }
  65.     return HAM_IGNORED;
  66. }
  67.  
  68. public plugin_precache(){
  69.     precache_sound("warcraft3/frostnova.wav");
  70.     precache_sound(SOUND_FREEZE);
  71.     precache_sound(SOUND_RESOTRE);
  72.     precache_sound("items/gunpickup2.wav");
  73.    
  74.     trailSpr = precache_model("sprites/laserbeam.spr");
  75.     smokeSpr = precache_model("sprites/steam1.spr");
  76.     exploSpr = precache_model("sprites/shockwave.spr");
  77. }
  78. public fwThink(ent){
  79.     if(!pev_valid(ent))
  80.         return FMRES_IGNORED;
  81.     if(isWhatIWaitFor(ent) && pev(ent, pev_iuser3)){
  82.         new Float:dmgtime;
  83.         pev(ent,pev_dmgtime,dmgtime);
  84.         if(dmgtime > get_gametime()) return FMRES_IGNORED;
  85.         frostTraps(ent);
  86.     }
  87.     return FMRES_IGNORED;
  88. }
  89. public fwSetModel(ent, const model[]){
  90.     if(!pev_valid(ent))
  91.         return FMRES_IGNORED;
  92.    
  93.     if(isWhatIWaitFor(ent) && equal(model[7], OVERRIDE_NADE_MODEL)){
  94.         set_pev(ent, pev_iuser3, 1);
  95.        
  96.         // glowshell
  97.         set_pev(ent,pev_rendermode,kRenderNormal);
  98.         set_pev(ent,pev_renderfx,kRenderFxGlowShell);
  99.         set_pev(ent,pev_rendercolor,Float:{0.0, 200.0, 200.0});
  100.         set_pev(ent,pev_renderamt,16.0);
  101.        
  102.         set_beamfollow(ent,10,10,Float:{0.0, 200.0, 200.0},170);
  103.     }
  104.     return FMRES_IGNORED;
  105. }
  106. isWhatIWaitFor(ent){
  107.     new szClass[32];
  108.     pev(ent, pev_classname, szClass, 31);
  109.     return equal(szClass, OVERRIDE_NADE_CLASS);
  110. }
  111.  
  112. public frostTraps(ent){
  113.     if(!pev_valid(ent))
  114.         return;
  115.     new Float:fOrigin[3];
  116.     pev(ent, pev_origin, fOrigin);
  117.     fOrigin[2] += 30.0;
  118.     makeExplosion(ent, fOrigin);
  119.     engfunc(EngFunc_RemoveEntity, ent);
  120.    
  121.     new szTargetName[32];
  122.     new ent2=-1, item;
  123.     do{
  124.         ent2 = engfunc(EngFunc_FindEntityInSphere, ent2, fOrigin, get_pcvar_float(gcvarDistance));
  125.         if(pev_valid(ent2)){
  126.             pev(ent2, pev_targetname, szTargetName, 31);
  127.            
  128.             if(TrieGetCell(gTraps, szTargetName,item)){
  129.                 bufferSets(ent2);
  130.                 if(!task_exists(ent2+TASK_REMOVE_FROZE))
  131.                     frostTrap(ent2, item);
  132.             }
  133.         }
  134.     }while(ent2);
  135. }
  136. frostTrap(ent, item){
  137.     RegisterHamFromEntity(Ham_Use, ent, "fwUse", 0)
  138.    
  139.     new Float:iRestore=get_pcvar_float(gcvarTime);
  140.     bufferSets(ent);
  141.    
  142.     frost(ent, iRestore, 150.0);
  143.     frost(giEntsTrigger[item],iRestore, 255.0);
  144.    
  145.     emit_sound(ent,CHAN_BODY,SOUND_FREEZE,VOL_NORM,ATTN_NORM,0,PITCH_NORM);
  146. }
  147. public restoreTrap(ent){
  148.     ent-=TASK_REMOVE_FROZE;
  149.     if(pev_valid(ent)){
  150.         new Float:fVec[3];
  151.         set_pev(ent, pev_rendermode, pev(ent, pev_iuser1));
  152.         set_pev(ent, pev_renderfx, pev(ent, pev_iuser2));
  153.         pev(ent, pev_vuser1, fVec)
  154.         set_pev(ent, pev_rendercolor, fVec);
  155.        
  156.         pev(ent, pev_fuser1, fVec[0]);
  157.         set_pev(ent, pev_renderamt, fVec[0]);
  158.        
  159.         emit_sound(ent,CHAN_BODY,SOUND_RESOTRE,VOL_NORM,ATTN_NORM,0,PITCH_NORM);
  160.     }
  161. }
  162. bufferSets(ent){
  163.     //Buffer
  164.     new Float:fVec[3];
  165.     set_pev(ent, pev_iuser1, pev(ent, pev_rendermode));
  166.     set_pev(ent, pev_iuser2, pev(ent, pev_renderfx));
  167.    
  168.     pev(ent, pev_rendercolor, fVec);
  169.     set_pev(ent, pev_vuser1, fVec);
  170.    
  171.     pev(ent, pev_renderamt, fVec[0]);
  172.     set_pev(ent, pev_fuser1, fVec[0]);
  173. }
  174. frost(ent, Float:fRestore=10.0, Float:fAmount=16.0){
  175.     set_pev(ent,pev_rendermode,kRenderTransColor);
  176.     set_pev(ent,pev_renderfx,kRenderFxExplode);
  177.     set_pev(ent,pev_rendercolor,Float:{0.0, 200.0, 200.0});
  178.     set_pev(ent,pev_renderamt,fAmount);
  179.     if(!task_exists(ent+TASK_REMOVE_FROZE)){
  180.         set_task(fRestore, "restoreTrap",ent+TASK_REMOVE_FROZE);
  181.     }
  182. }
  183. makeExplosion(ent, const Float:fOrigin[3]){
  184.     // make the smoke
  185.     message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  186.     write_byte(TE_SMOKE);
  187.     write_coord(floatround(fOrigin[0])); // x
  188.     write_coord(floatround(fOrigin[1])); // y
  189.     write_coord(floatround(fOrigin[2])); // z
  190.     write_short(smokeSpr); // sprite
  191.     write_byte(random_num(30,40)); // scale
  192.     write_byte(5); // framerate
  193.     message_end();
  194.    
  195.     create_blast(fOrigin);
  196.    
  197.     emit_sound(ent,CHAN_BODY,"warcraft3/frostnova.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM);
  198. }
  199. //Las Machinas de la muerte
  200.  
  201. ArobCoChcesz(const szClass[]){
  202.     new szTarget[32];
  203.     new ent=-1;
  204.     do{
  205.         if(giPointer >= MAX_TRAPS)
  206.             break;
  207.         ent = engfunc(EngFunc_FindEntityByString, ent, "classname", szClass);
  208.         if(pev_valid(ent)){
  209.             pev(ent, pev_target, szTarget, 31);
  210.             if(szTarget[0]){
  211.                 TrieSetCell(gTraps, szTarget, giPointer);
  212.                 giEntsTrigger[giPointer] =ent;
  213.                 giPointer++;
  214.             }
  215.         }
  216.     }while(ent);
  217. }
  218. public plugin_cfg(){
  219.     for(new i=0; i<sizeof gszClasses; i++){
  220.         ArobCoChcesz(gszClasses[i]);
  221.     }
  222. }
  223. //Effect
  224. create_blast(const Float:originF[3])
  225. {
  226. new origin[3];
  227. FVecIVec(originF,origin);
  228.  
  229. // smallest ring
  230. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  231. write_byte(TE_BEAMCYLINDER);
  232. write_coord(origin[0]); // x
  233. write_coord(origin[1]); // y
  234. write_coord(origin[2]); // z
  235. write_coord(origin[0]); // x axis
  236. write_coord(origin[1]); // y axis
  237. write_coord(origin[2] + 385); // z axis
  238. write_short(exploSpr); // sprite
  239. write_byte(0); // start frame
  240. write_byte(0); // framerate
  241. write_byte(4); // life
  242. write_byte(60); // width
  243. write_byte(0); // noise
  244. write_byte(0); // red
  245. write_byte(0); // green//200
  246. write_byte(255); // blue//200
  247. write_byte(100); // brightness
  248. write_byte(0); // speed
  249. message_end();
  250.  
  251. // medium ring
  252. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  253. write_byte(TE_BEAMCYLINDER);
  254. write_coord(origin[0]); // x
  255. write_coord(origin[1]); // y
  256. write_coord(origin[2]); // z
  257. write_coord(origin[0]); // x axis
  258. write_coord(origin[1]); // y axis
  259. write_coord(origin[2] + 470); // z axis
  260. write_short(exploSpr); // sprite
  261. write_byte(0); // start frame
  262. write_byte(0); // framerate
  263. write_byte(4); // life
  264. write_byte(60); // width
  265. write_byte(0); // noise
  266. write_byte(0); // red
  267. write_byte(0); // green
  268. write_byte(255); // blue
  269. write_byte(100); // brightness
  270. write_byte(0); // speed
  271. message_end();
  272.  
  273. // largest ring
  274. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  275. write_byte(TE_BEAMCYLINDER);
  276. write_coord(origin[0]); // x
  277. write_coord(origin[1]); // y
  278. write_coord(origin[2]); // z
  279. write_coord(origin[0]); // x axis
  280. write_coord(origin[1]); // y axis
  281. write_coord(origin[2] + 555); // z axis
  282. write_short(exploSpr); // sprite
  283. write_byte(0); // start frame
  284. write_byte(0); // framerate
  285. write_byte(4); // life
  286. write_byte(60); // width
  287. write_byte(0); // noise
  288. write_byte(0); // red
  289. write_byte(0); // green
  290. write_byte(255); // blue
  291. write_byte(100); // brightness
  292. write_byte(0); // speed
  293. message_end();
  294.  
  295. // light effect
  296. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  297. write_byte(TE_DLIGHT);
  298. write_coord(origin[0]); // x
  299. write_coord(origin[1]); // y
  300. write_coord(origin[2]); // z
  301. write_byte(floatround(get_pcvar_float(gcvarDistance)/5.0)); // radius
  302. write_byte(0); // r
  303. write_byte(0) // g
  304. write_byte(255); // b
  305. write_byte(8); // life
  306. write_byte(60); // decay rate
  307. message_end();
  308. }
  309. // give an entity a beam trail
  310. set_beamfollow(ent,life,width,Float:rgb[3],brightness)
  311. {
  312. clear_beamfollow(ent);
  313.  
  314. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  315. write_byte(TE_BEAMFOLLOW);
  316. write_short(ent); // entity
  317. write_short(trailSpr); // sprite
  318. write_byte(life); // life
  319. write_byte(width); // width
  320. write_byte(floatround(rgb[0])); // red
  321. write_byte(floatround(rgb[1])); // green
  322. write_byte(floatround(rgb[2])); // blue
  323. write_byte(brightness); // brightness
  324. message_end();
  325. }
  326.  
  327. // removes beam trails from an entity
  328. clear_beamfollow(ent)
  329. {
  330. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  331. write_byte(TE_KILLBEAM);
  332. write_short(ent); // entity
  333. message_end();
  334. }
  335. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  336. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
  337. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement