Advertisement
Guest User

pbgun

a guest
Apr 23rd, 2014
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.31 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4.  
  5. #define PLUGIN "Paintball Gun"
  6. #define VERSION "3.4"
  7. #define AUTHOR "WhooKid"
  8.  
  9. #define MAX_PAINTBALLS  200
  10. #define TASK_PB_RESET   1000
  11. #define TASK_RELOAD 2000
  12.  
  13. #define PB_RELOAD_FLAG ADMIN_LEVEL_H
  14.  
  15. new g_paintballs[MAX_PAINTBALLS], g_pbstatus[MAX_PAINTBALLS], g_pbcount, Float:lastshot[33], Float:nextattack[33], freezetime;
  16. new pbgun, pbusp, pbglock, color, shots, veloc, speed, blife, sound, bglow, damge, friendlyfire, tgun, ctgun, beamspr;
  17.  
  18. static const g_shot_anim[4] = {0, 3, 9, 5};
  19. static const g_pbgun_models[11][] = {"models/v_pbgun.mdl", "models/v_pbgun1.mdl", "models/v_pbgun2.mdl", "models/v_pbgun3.mdl", "models/v_pbgun4.mdl", "models/v_pbgun5.mdl", "models/v_pbgun6.mdl", "models/v_pbgun7.mdl", "models/v_pbgun8.mdl", "models/v_pbgun9.mdl", "models/v_pbgun10.mdl"};
  20.  
  21. public plugin_init()
  22. {
  23.     register_plugin(PLUGIN, VERSION, AUTHOR);
  24.     register_cvar("paintballgun", VERSION, FCVAR_SERVER|FCVAR_UNLOGGED);
  25.     register_clcmd("say /ent", "ent_info", ADMIN_SLAY);
  26.     pbgun = register_cvar("amx_pbgun", "1");
  27.     pbusp = register_cvar("amx_pbusp", "1");
  28.     pbglock = register_cvar("amx_pbglock", "1");
  29.  
  30.     if (get_pcvar_num(pbgun) || get_pcvar_num(pbusp) || get_pcvar_num(pbglock))
  31.     {
  32.         register_event("CurWeapon", "ev_curweapon", "be");
  33.         register_logevent("ev_roundstart", 2, "0=World triggered", "1=Round_Start");
  34.         if (get_cvar_num("mp_freezetime") > 0)
  35.             register_event("HLTV", "ev_freezetime", "a", "1=0", "2=0");
  36.  
  37.         register_forward(FM_Touch, "fw_touch");
  38.         register_forward(FM_SetModel, "fw_setmodel");
  39.         register_forward(FM_PlayerPreThink, "fw_playerprethink", 1);
  40.         register_forward(FM_UpdateClientData, "fw_updateclientdata", 1);
  41.        
  42.         RegisterHam(Ham_Killed, "player", "PlayerKilled")
  43.  
  44.         color = register_cvar("pbgun_color", "2");
  45.         shots = register_cvar("pbgun_shots", "100");
  46.         veloc = register_cvar("pbgun_velocity", "2000");
  47.         speed = register_cvar("pbgun_speed", "0.08");
  48.         blife = register_cvar("pbgun_life", "15");
  49.         sound = register_cvar("pbgun_sound", "1");
  50.         bglow = register_cvar("pbgun_glow", "a");
  51.         damge = register_cvar("pbgun_damage", "100");
  52.         friendlyfire = get_cvar_pointer("mp_friendlyfire");
  53.  
  54.         new a, max_ents_allow = global_get(glb_maxEntities) - 5;
  55.         for (a = 1; a <= get_pcvar_num(shots); a++)
  56.             if (a < MAX_PAINTBALLS)
  57.                 if (engfunc(EngFunc_NumberOfEntities) < max_ents_allow)
  58.                 {
  59.                     g_paintballs[a] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
  60.                     if (pev_valid(g_paintballs[a]))
  61.                     {
  62.                         set_pev(g_paintballs[a], pev_effects, pev(g_paintballs[a], pev_effects) | EF_NODRAW);
  63.                         g_pbcount++;
  64.                     }
  65.                 }
  66.         if (g_pbcount < 1)
  67.             set_fail_state("[AMXX] Failed to load Paintball Gun (unable to create ents)");
  68.  
  69.         server_print("*** %s v%s by %s Enabled ***", PLUGIN, VERSION, AUTHOR);
  70.     }
  71. }
  72.  
  73. public plugin_precache()
  74. {
  75.     register_cvar("amx_pbgun", "1");
  76.     register_cvar("amx_pbusp", "1");
  77.     register_cvar("amx_pbglock", "1");
  78.     register_cvar("pbgun_tgun", "3");
  79.     register_cvar("pbgun_ctgun", "7");
  80.     tgun = get_cvar_num("pbgun_tgun");
  81.     ctgun = get_cvar_num("pbgun_ctgun");
  82.     if (get_cvar_num("amx_pbgun")) {
  83.         precache_model(g_pbgun_models[tgun]);
  84.         precache_model(g_pbgun_models[ctgun]);
  85.         precache_model((ctgun) ? "models/p_pbgun1.mdl" : "models/p_pbgun.mdl");
  86.         precache_model("models/w_pbgun.mdl");
  87.     }
  88.     if (get_cvar_num("amx_pbusp")) {
  89.         precache_model("models/v_pbusp.mdl");
  90.         precache_model("models/p_pbusp.mdl");
  91.     }
  92.     if (get_cvar_num("amx_pbglock")) {
  93.         precache_model("models/v_pbglock.mdl");
  94.         precache_model("models/p_pbglock.mdl");
  95.     }
  96.     if (get_cvar_num("amx_pbgun") || get_cvar_num("amx_pbusp") || get_cvar_num("amx_pbglock")) {
  97.         precache_sound("misc/pb1.wav");
  98.         precache_sound("misc/pb2.wav");
  99.         precache_sound("misc/pb3.wav");
  100.         precache_sound("misc/pb4.wav");
  101.         precache_sound("misc/pbg.wav");
  102.         precache_model("models/w_paintball.mdl");
  103.         precache_model("sprites/paintball.spr");
  104.     }
  105.     beamspr = precache_model("sprites/laserbeam.spr");
  106. }
  107.  
  108. public ent_info(id)
  109.     client_print(id, print_chat, "[AMXX] [Ent Info (Current/Max)] Paintballs: (%d/%d)   Entities: (%d/%d)", g_pbcount, get_pcvar_num(shots), engfunc(EngFunc_NumberOfEntities), global_get(glb_maxEntities));
  110.  
  111. public ev_curweapon(id)
  112. {
  113.     new model[25];
  114.     pev(id, pev_viewmodel2, model, 24);
  115.     if (equali(model, "models/v_mp5.mdl") && get_pcvar_num(pbgun))
  116.     {
  117.         set_pev(id, pev_viewmodel2, (get_user_team(id) == 1) ? g_pbgun_models[tgun] : g_pbgun_models[ctgun]);
  118.         set_pev(id, pev_weaponmodel2, (ctgun) ? "models/p_pbgun1.mdl" : "models/p_pbgun.mdl");
  119.     }
  120.     else if (equali(model, "models/v_usp.mdl") && get_pcvar_num(pbusp))
  121.     {
  122.         set_pev(id, pev_viewmodel2, "models/v_pbusp.mdl");
  123.         set_pev(id, pev_weaponmodel2, "models/p_pbusp.mdl");
  124.     }
  125.     else if (equali(model, "models/v_glock18.mdl") && get_pcvar_num(pbglock))
  126.     {
  127.         set_pev(id, pev_viewmodel2, "models/v_pbglock.mdl");
  128.         set_pev(id, pev_weaponmodel2, "models/p_pbglock.mdl");
  129.     }
  130. }
  131.  
  132. public fw_setmodel(ent, model[])
  133. {
  134.     if (equali(model, "models/w_mp5.mdl"))
  135.         if (get_pcvar_num(pbgun))
  136.         {
  137.             engfunc(EngFunc_SetModel, ent, "models/w_pbgun.mdl");
  138.             return FMRES_SUPERCEDE;
  139.         }
  140.     return FMRES_IGNORED;
  141. }
  142.  
  143. public fw_updateclientdata(id, sw, cd_handle)
  144. {
  145.     if (user_has_pbgun(id) && cd_handle)
  146.     {
  147.         set_cd(cd_handle, CD_ID, 1);
  148.         get_cd(cd_handle, CD_flNextAttack, nextattack[id]);
  149.         //set_cd(cd_handle, CD_flNextAttack, 10.0);
  150.         return FMRES_HANDLED;
  151.     }
  152.     return FMRES_IGNORED;
  153. }
  154.  
  155. public fw_playerprethink(id)
  156. {
  157.     new my_pbgun = user_has_pbgun(id);
  158.     if (my_pbgun)
  159.     {
  160.         new buttons = pev(id, pev_button);
  161.         if (buttons & IN_ATTACK)
  162.         {
  163.             new ammo, null = get_user_weapon(id, ammo, null);
  164.             if (ammo)
  165.             {
  166.                 set_pev(id, pev_button, buttons & ~IN_ATTACK);
  167.                 new Float:gametime = get_gametime(), Float:g_speed;
  168.                 if (my_pbgun == 1)
  169.                     g_speed = get_pcvar_float(speed);
  170.                 else
  171.                     g_speed = (my_pbgun == 2) ? get_pcvar_float(speed) * 2.0 : get_pcvar_float(speed) * 3.0;
  172.                 if (gametime-lastshot[id] > g_speed  && nextattack[id] < 0.0 && !freezetime)
  173.                 {
  174.                     if (paint_fire(id))
  175.                     {
  176.                         lastshot[id] = gametime;
  177.                         set_user_clip(id, ammo - 1);
  178.                         set_pev(id, pev_punchangle, Float:{-0.5, 0.0, 0.0});
  179.                         message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id);
  180.                         write_byte(g_shot_anim[my_pbgun]);
  181.                         write_byte(0);
  182.                         message_end();
  183.                         if (get_pcvar_num(sound))
  184.                             emit_sound(id, CHAN_AUTO, "misc/pbg.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
  185.                     }
  186.                 }
  187.             }
  188.         }
  189.     }
  190.     return FMRES_IGNORED;
  191. }
  192.  
  193. public paint_fire(id)
  194. {
  195.     new a, ent;
  196.     while (a++ < g_pbcount - 1 && !ent)
  197.         if (g_pbstatus[a] == 0)
  198.             ent = g_pbstatus[a] = g_paintballs[a];
  199.     if (!ent)
  200.         while (a-- > 1 && !ent)
  201.             if (g_pbstatus[a] == 2)
  202.                 ent = g_pbstatus[a] = g_paintballs[a];
  203.  
  204.     if (pev_valid(ent) && is_user_alive(id))
  205.     {
  206.         new Float:vangles[3], Float:nvelocity[3], Float:voriginf[3], vorigin[3], clr;
  207.         set_pev(ent, pev_classname, "pbBullet");
  208.         set_pev(ent, pev_owner, id);
  209.         engfunc(EngFunc_SetModel, ent, "models/w_paintball.mdl");
  210.         engfunc(EngFunc_SetSize, ent, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0});
  211.  
  212.         switch (get_pcvar_num(color))
  213.         {
  214.             case 2: clr = (get_user_team(id) == 1) ? 0 : 1;
  215.             case 3: clr = (get_user_team(id) == 1) ? 4 : 3;
  216.             case 4: clr = (get_user_team(id) == 1) ? 2 : 5;
  217.             default: clr = random_num(0, 6);
  218.         }
  219.         set_pev(ent, pev_skin, clr);
  220.        
  221.         get_user_origin(id, vorigin, 1);
  222.         IVecFVec(vorigin, voriginf);
  223.         engfunc(EngFunc_SetOrigin, ent, voriginf);
  224.  
  225.         vangles[0] = random_float(-180.0, 180.0);
  226.         vangles[1] = random_float(-180.0, 180.0);
  227.         set_pev(ent, pev_angles, vangles);
  228.  
  229.         pev(id, pev_v_angle, vangles);
  230.         set_pev(ent, pev_v_angle, vangles);
  231.         pev(id, pev_view_ofs, vangles);
  232.         set_pev(ent, pev_view_ofs, vangles);
  233.  
  234.         set_pev(ent, pev_solid, 2);
  235.         set_pev(ent, pev_movetype, 5);
  236.  
  237.         velocity_by_aim(id, get_pcvar_num(veloc), nvelocity);
  238.         set_pev(ent, pev_velocity, nvelocity);
  239.         set_pev(ent, pev_effects, pev(ent, pev_effects) & ~EF_NODRAW);
  240.  
  241.         set_task(0.1, "paint_glow", ent);
  242.         set_task(15.0 , "paint_reset", ent+TASK_PB_RESET);
  243.     }
  244.  
  245.     return ent;
  246. }
  247.  
  248. public fw_touch(bullet, ent)
  249. {
  250.     new class[20];
  251.     pev(bullet, pev_classname, class, 19);
  252.     if (!equali(class, "pbBullet"))
  253.         return FMRES_IGNORED;
  254.  
  255.     new Float:origin[3], class2[20], owner = pev(bullet, pev_owner), is_ent_alive = is_user_alive(ent);
  256.    
  257.     pev(ent, pev_classname, class2, 19);
  258.     pev(bullet, pev_origin, origin);
  259.  
  260.     if (is_ent_alive)
  261.     {
  262.         if (owner == ent || pev(ent, pev_takedamage) == DAMAGE_NO)
  263.             return FMRES_IGNORED;
  264.         if (get_user_team(owner) == get_user_team(ent))
  265.             if (!get_pcvar_num(friendlyfire))
  266.                 return FMRES_IGNORED;
  267.  
  268.                
  269.         if(equali(class2, "hostage_entity"))
  270.             return FMRES_IGNORED;
  271.            
  272.         ExecuteHam(Ham_TakeDamage, ent, owner, owner, float(get_pcvar_num(damge)), 4098);
  273.     }
  274.  
  275.     if (!equali(class, class2))
  276.     {  
  277.         set_pev(bullet, pev_velocity, Float:{0.0, 0.0, 0.0});
  278.         set_pev(bullet, pev_classname, "pbPaint");
  279.         set_pev(bullet, pev_solid, 0);
  280.         set_pev(bullet, pev_movetype, 0);
  281.         engfunc(EngFunc_SetModel, bullet, "sprites/paintball.spr");
  282.  
  283.         new a, findpb = 0;
  284.         while (a++ < g_pbcount && !findpb)
  285.             if (g_paintballs[a] == bullet)
  286.                 findpb = g_pbstatus[a] = 2;
  287.  
  288.         remove_task(bullet);
  289.         remove_task(bullet+TASK_PB_RESET);
  290.  
  291.         if (get_pcvar_num(sound))
  292.         {
  293.             static wav[20];
  294.             formatex(wav, 20, is_ent_alive ? "player/pl_pain%d.wav" : "misc/pb%d.wav", is_ent_alive ? random_num(4,7) : random_num(1,4));
  295.             emit_sound(bullet, CHAN_AUTO, wav, 1.0, ATTN_NORM, 0, PITCH_NORM);
  296.         }
  297.  
  298.         new bool:valid_surface = (is_ent_alive || containi(class2, "door") != -1) ? false : true;
  299. new const boxes [] =
  300. {
  301.     14,
  302.     15,
  303.     16,
  304.     44,
  305.     49,
  306.     51,
  307.     52,
  308.     53,
  309.     54
  310. }      
  311. if (pev(ent, pev_health) && !is_ent_alive)
  312. {
  313.     new bool:isbox = false
  314.  
  315.     for(new i = 0; i < sizeof(boxes); i++)
  316.         if(ent = boxes[i])
  317.         {
  318.             isbox = true
  319.             break
  320.         }
  321.  
  322.     if(!isbox)
  323.         ExecuteHam(Ham_TakeDamage, ent, owner, owner, float(pev(ent, pev_health)), 0);
  324.     valid_surface = false;  
  325. }  
  326.         if (valid_surface)
  327.         {
  328.             paint_splat(bullet);
  329.             set_task(float(get_pcvar_num(blife)), "paint_reset", bullet+TASK_PB_RESET);
  330.         }
  331.         else
  332.             paint_reset(bullet+TASK_PB_RESET);
  333.  
  334.         return FMRES_HANDLED;
  335.     }
  336.  
  337.     return FMRES_IGNORED;
  338. }
  339.  
  340. public PlayerKilled(victim, killer)
  341. {
  342.     if(!is_user_connected(killer))
  343.         return HAM_IGNORED;
  344.    
  345.     if(get_user_flags(killer) & PB_RELOAD_FLAG)
  346.         set_user_clip(killer, 30)
  347.    
  348.     return HAM_IGNORED;
  349. }
  350.  
  351. public paint_splat(ent)
  352. {
  353.     new Float:origin[3], Float:norigin[3], Float:viewofs[3], Float:angles[3], Float:normal[3], Float:aiming[3];
  354.     pev(ent, pev_origin, origin);
  355.     pev(ent, pev_view_ofs, viewofs);
  356.     pev(ent, pev_v_angle, angles);
  357.  
  358.     norigin[0] = origin[0] + viewofs[0];
  359.     norigin[1] = origin[1] + viewofs[1];
  360.     norigin[2] = origin[2] + viewofs[2];
  361.     aiming[0] = norigin[0] + floatcos(angles[1], degrees) * 1000.0;
  362.     aiming[1] = norigin[1] + floatsin(angles[1], degrees) * 1000.0;
  363.     aiming[2] = norigin[2] + floatsin(-angles[0], degrees) * 1000.0;
  364.  
  365.     engfunc(EngFunc_TraceLine, norigin, aiming, 0, ent, 0);
  366.     get_tr2(0, TR_vecPlaneNormal, normal);
  367.  
  368.     vector_to_angle(normal, angles);
  369.     angles[1] += 180.0;
  370.     if (angles[1] >= 360.0) angles[1] -= 360.0;
  371.     set_pev(ent, pev_angles, angles);
  372.     set_pev(ent, pev_v_angle, angles);
  373.  
  374.     origin[0] += (normal[0] * random_float(0.3, 2.7));
  375.     origin[1] += (normal[1] * random_float(0.3, 2.7));
  376.     origin[2] += (normal[2] * random_float(0.3, 2.7));
  377.     engfunc(EngFunc_SetOrigin, ent, origin);
  378.     set_pev(ent, pev_frame, float(random_num( (pev(ent, pev_skin) * 18), (pev(ent, pev_skin) * 18) + 17 ) ));
  379.     if (pev(ent, pev_renderfx) != kRenderFxNone)
  380.         set_rendering(ent);
  381. }
  382.  
  383. public paint_glow(ent)
  384. {
  385.     if (pev_valid(ent))
  386.     {
  387.         static pbglow[5], clr[3];
  388.         get_pcvar_string(bglow, pbglow, 4);
  389.         switch (get_pcvar_num(color))
  390.         {
  391.             case 2: clr = (get_user_team(pev(ent, pev_owner))==1) ? {255, 0, 0} : {0, 0, 255};
  392.             default: clr = {255, 255, 255};
  393.         }
  394.         if (read_flags(pbglow) & (1 << 0))
  395.             set_rendering(ent, kRenderFxGlowShell, clr[0], clr[1], clr[2], kRenderNormal, 255);
  396.         if (read_flags(pbglow) & (1 << 1))
  397.         {
  398.             message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
  399.             write_byte(TE_BEAMFOLLOW);
  400.             write_short(ent);
  401.             write_short(beamspr);
  402.             write_byte(4);
  403.             write_byte(2);
  404.             write_byte(clr[0]);
  405.             write_byte(clr[1]);
  406.             write_byte(clr[2]);
  407.             write_byte(255);
  408.             message_end();
  409.         }
  410.     }
  411. }
  412.  
  413. public paint_reset(ent)
  414. {
  415.     remove_task(ent);
  416.     ent -= TASK_PB_RESET;
  417.     new a, findpb = 1;
  418.     while (a++ <= g_pbcount && findpb)
  419.         if (g_paintballs[a] == ent)
  420.             findpb = g_pbstatus[a] = 0;
  421.  
  422.     set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW);
  423.     engfunc(EngFunc_SetSize, ent, Float:{0.0, 0.0, 0.0}, Float:{0.0, 0.0, 0.0});
  424.     set_pev(ent, pev_velocity, Float:{0.0, 0.0, 0.0});
  425.     engfunc(EngFunc_SetOrigin, ent, Float:{-2000.0, -2000.0, -2000.0});
  426.     if (pev(ent, pev_renderfx) != kRenderFxNone)
  427.         set_rendering(ent);
  428. }
  429.  
  430. public ev_roundstart()
  431. {
  432.     for (new a = 1; a <= g_pbcount; a++)
  433.         if (g_pbstatus[a] != 0)
  434.             paint_reset(g_paintballs[a]+TASK_PB_RESET);
  435.     if (freezetime)
  436.         freezetime = 0;
  437. }
  438.  
  439. public ev_freezetime()
  440.     freezetime = 1;
  441.  
  442. stock user_has_pbgun(id)
  443. {
  444.     if (is_user_alive(id))
  445.     {
  446.         new model[25];
  447.         pev(id, pev_viewmodel2, model, 24);
  448.         if (containi(model, "models/v_pbgun") != -1)
  449.             return 1;
  450.         else if (equali(model, "models/v_pbusp.mdl"))
  451.             return 2;
  452.         else if (equali(model, "models/v_pbglock.mdl"))
  453.             return 3;
  454.     }
  455.     return 0;
  456. }
  457.  
  458. stock set_user_clip(id, ammo)
  459. {
  460.     new weaponname[32], weaponid = -1, weapon = get_user_weapon(id, _, _);
  461.     get_weaponname(weapon, weaponname, 31);
  462.     while ((weaponid = engfunc(EngFunc_FindEntityByString, weaponid, "classname", weaponname)) != 0)
  463.         if (pev(weaponid, pev_owner) == id) {
  464.             set_pdata_int(weaponid, 51, ammo, 4);
  465.             return weaponid;
  466.         }
  467.     return 0;
  468. }
  469.  
  470. // teame06's function
  471. stock set_rendering(index, fx=kRenderFxNone, r=0, g=0, b=0, render=kRenderNormal, amount=16)
  472. {
  473.     set_pev(index, pev_renderfx, fx);
  474.     new Float:RenderColor[3];
  475.     RenderColor[0] = float(r);
  476.     RenderColor[1] = float(g);
  477.     RenderColor[2] = float(b);
  478.     set_pev(index, pev_rendercolor, RenderColor);
  479.     set_pev(index, pev_rendermode, render);
  480.     set_pev(index, pev_renderamt, float(amount));
  481. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement