Advertisement
FlacoBey

Untitled

Feb 3rd, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.27 KB | None | 0 0
  1. #include sdktools
  2. #include sdkhooks
  3.  
  4. new bool:IsHealer[MAXPLAYERS+1] = false;
  5. new bool:IsUsing = false;
  6. static Handle hHealCount, hMaxHealth, hDurationRing, hDistance;
  7.  
  8. Handle HealTimer[MAXPLAYERS+1];
  9.  
  10. int g_HaloSprite;
  11. int g_BeamSprite;
  12. int yourColor[4] = {220, 20, 60, 255};
  13.  
  14. public OnPluginStart()
  15. {
  16.     hHealCount = CreateConVar("hCvarHealCount", "5", "Кол-во лечения", FCVAR_NONE, true, 1.0, true, 50000.0);
  17.     hMaxHealth = CreateConVar("hCvarMaxHeal", "75", "Максимальный прохил", FCVAR_NONE);
  18.     hDurationRing = CreateConVar("hCvarDuration", "15.0", "Время жизни кольца", FCVAR_NONE, true, 1.0, true, 25.0)
  19.     hDistance = CreateConVar("hCvarDuration", "600.0", "Дистаннция", FCVAR_NONE)
  20.     //CoolDown = CreateConVar("hCvarCoolDown", "15.0", "Кул даун юзания", FCVAR_NONE)
  21.     AutoExecConfig(true, "hMedicPlug");
  22. }
  23.  
  24. public OnMapStart()
  25. {
  26.     HookEvent("bullet_impact", hImpact)
  27.     HookEvent("player_afk", hAfkFix)
  28.     HookEvent("player_death", hDeath)
  29.     CreateTimer(30.0, hSetMedic, TIMER_FLAG_NO_MAPCHANGE)
  30.    
  31.     g_BeamSprite = PrecacheModel("materials/sprites/laserbeam.vmt", true);
  32.     g_HaloSprite = PrecacheModel("materials/sprites/halo01.vmt", true);
  33. }
  34.  
  35. public hDeath(Handle:event, const String:name[], bool:dontBroadcast)
  36. {
  37.     new client = GetClientOfUserId(GetEventInt(event, "userid"));
  38.     if(IsHealer[client])
  39.     {
  40.         PrintToChatAll("Медик погиб в перестрелке(земля ему пухом)", client)
  41.     }
  42. }
  43.  
  44. public hAfkFix(Handle:event, const String:name[], bool:dontBroadcast)
  45. {
  46.     new client = GetClientOfUserId(GetEventInt(event, "player"));
  47.     if(IsHealer[client])
  48.     {
  49.         IsHealer[client] = false;
  50.         new healer = GetAnyRandomSurvivor()
  51.         IsHealer[healer] = true;
  52.         PrintToChatAll("Медик %N отошёл от игры", client);
  53.         PrintToChatAll("%N стал новым медиком", healer);
  54.     }
  55. }
  56.  
  57. public hImpact(Handle:event, const String:name[], bool:dontBroadcast)
  58. {
  59.     new client = GetClientOfUserId(GetEventInt(event, "userid"));
  60.     new Float:f_Pos[3];
  61.     f_Pos[0] = GetEventFloat(event, "x");
  62.     f_Pos[1] = GetEventFloat(event, "y");
  63.     f_Pos[2] = GetEventFloat(event, "z");
  64.    
  65.     f_Pos[2] += 15;
  66.     if(IsUsing != true)
  67.     {
  68.         if(bIsSurvivor(client))
  69.         {
  70.             new weap = GetPlayerWeaponSlot(client, 1)
  71.             char sWeaponEx[32];
  72.             GetEntityClassname(weap, sWeaponEx, sizeof(sWeaponEx))
  73.             if(StrEqual(sWeaponEx, "weapon_pistol_magnum"))
  74.             {
  75.                 if(IsHealer[client])
  76.                 {
  77.                     TE_SetupBeamRingPoint(f_Pos, 600.0, 605.0, g_BeamSprite, g_HaloSprite, 0, 66, GetConVarFloat(hDurationRing), 4.2, 1.0, yourColor, 20, 0)
  78.                     TE_SendToAll();
  79.                     new Handle:vPosition;
  80.                     CreateDataTimer(3.0, TimerRing, vPosition, TIMER_REPEAT)
  81.                
  82.                     WritePackFloat(vPosition, f_Pos[0]);
  83.                     WritePackFloat(vPosition, f_Pos[1]);
  84.                     WritePackFloat(vPosition, f_Pos[2]);
  85.                    
  86.                     new Handle:pack;
  87.                     HealTimer[client] = CreateDataTimer(1.0, Healing, pack, TIMER_REPEAT);
  88.                     IsUsing = true;
  89.                     WritePackCell(pack, client);
  90.                     WritePackFloat(pack, f_Pos[0]);
  91.                     WritePackFloat(pack, f_Pos[1]);
  92.                     WritePackFloat(pack, f_Pos[2]);
  93.                     WritePackFloat(pack, GetEngineTime());
  94.                    
  95.                    
  96.                 //  CreateTimer(GetConVarFloat(hDurationRing), KillHeal, client);
  97.                 }
  98.             }
  99.         }
  100.     }
  101. }
  102.  
  103. public Action:TimerRing(Handle:timer, vPosition)
  104. {
  105.     float vPos[3];
  106.     ResetPack(vPosition);
  107.     vPos[0] = ReadPackFloat(vPosition);
  108.     vPos[1] = ReadPackFloat(vPosition);
  109.     vPos[2] = ReadPackFloat(vPosition);
  110.    
  111.     TE_SetupBeamRingPoint(vPos, 0.0, 600.0, g_BeamSprite, g_HaloSprite, 0, 66, 4, 4.2, 1.0, yourColor, 90, 0)
  112.     TE_SendToAll();
  113. }
  114.  
  115. public Action:Healing(Handle:timer, Handle:pack)
  116. {
  117.     float bPos[3], vPos[3];
  118.    
  119.     ResetPack(pack);
  120.     new client = ReadPackCell(pack);
  121.     bPos[0] = ReadPackFloat(pack);
  122.     bPos[1] = ReadPackFloat(pack);
  123.     bPos[2] = ReadPackFloat(pack);
  124.     new Float:time=ReadPackFloat(pack);
  125.    
  126.     if(GetEngineTime() - time < GetConVarFloat(hDurationRing))
  127.     {
  128.         for (new i = 1; i <= MaxClients; i++)
  129.         {
  130.             if(bIsSurvivor(i))
  131.             {
  132.                 GetEntPropVector(i, Prop_Send, "m_vecOrigin", vPos);
  133.                 float fTargetDistance = GetVectorDistance(bPos, vPos);
  134.                 if (fTargetDistance > GetConVarFloat(hDistance)) continue;
  135.                 new HP = GetClientHealth(i);
  136.                 if(HP < GetConVarInt(hMaxHealth))
  137.                 {
  138.                     SetEntityHealth(client, HP + GetConVarInt(hHealCount))
  139.                 }
  140.             }
  141.         }
  142.     }
  143.     else
  144.     {
  145.         IsUsing = false;
  146.         KillTimer(HealTimer[client]);
  147.         HealTimer[client] = INVALID_HANDLE;
  148.     }
  149. }
  150.  
  151. public Action:hSetMedic(Handle timer, any fuck)
  152. {
  153.     new client = GetAnyRandomSurvivor()
  154.     if(client > 0)
  155.     {
  156.         IsHealer[client] = true;
  157.         GiveFunction(client, "pistol_magnum")
  158.         PrintToChatAll("%N стал медиком", client);
  159.     }
  160. }
  161.  
  162. public OnClientPutInServer(client)
  163. {
  164.     //SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
  165.     SDKHook(client, SDKHook_WeaponCanUse, WeaponCanUse);
  166. }
  167.  
  168. public OnClientDisconnect(client)
  169. {
  170.     //SDKUnhook(client, SDKHook_OnTakeDamage, OnTakeDamage);
  171.     SDKUnhook(client, SDKHook_WeaponCanUse, WeaponCanUse);
  172.     if(IsHealer[client] == true)
  173.     {
  174.         IsHealer[client] = false;
  175.         new healer = GetAnyRandomSurvivor()
  176.         IsHealer[healer] = true;
  177.         PrintToChatAll("Медик %N покинул игру", client);
  178.         PrintToChatAll("%N стал новым медиком", healer);
  179.     }
  180.    
  181.     if (HealTimer[client] != INVALID_HANDLE)
  182.     {
  183.         KillTimer(HealTimer[client]);
  184.         HealTimer[client] = INVALID_HANDLE;
  185.     }
  186. }
  187.  
  188. public Action:WeaponCanUse(client, weapon)
  189. {
  190.     if(bIsSurvivor(client))
  191.     {
  192.         if(IsHealer[client])
  193.         {
  194.             new wepn = GetPlayerWeaponSlot(client, 1)
  195.             if (!IsValidEntity(wepn))
  196.             {
  197.                 return Plugin_Continue;
  198.             }
  199.             decl String:sWeaponEx[32];
  200.             GetEntityClassname(wepn, sWeaponEx, sizeof(sWeaponEx));
  201.            
  202.             new String:sClassName[64];
  203.             GetEntityClassname(weapon, sClassName, sizeof(sClassName));
  204.            
  205.             if(StrEqual(sWeaponEx, "weapon_pistol_magnum"))
  206.             {
  207.                 if(StrEqual(sClassName, "weapon_melee") || StrEqual(sClassName, "weapon_pistol"))
  208.                 {
  209.                     return Plugin_Handled;
  210.                 }
  211.             }
  212.         }
  213.     }
  214.     return Plugin_Continue;
  215. }
  216.  
  217. /*
  218. public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)  
  219. {
  220.     if(bIsSurvivor(victim) && bIsSurvivor(attacker))
  221.     {
  222.         if(IsHealer[attacker] == true)
  223.         {
  224.             decl String:classname[64];
  225.             GetClientWeapon(attacker, classname, sizeof(classname));
  226.             if(StrEqual(classname, "weapon_pistol_magnum"))
  227.             {
  228.                 damage = 0.0
  229.                 int heal = GetClientHealth(victim)
  230.                 if(GetConVarInt(hMaxHealth) < heal)
  231.                 {
  232.                     SetEntityHealth(victim, GetConVarInt(hHealCount) + 4);
  233.                 }
  234.             }
  235.         }
  236.     }
  237. }
  238. */
  239.  
  240. stock GetAnyRandomSurvivor()
  241. {
  242.     new electables = 0, pool[4];
  243.     for (new player = 1; player <= MaxClients; player++)
  244.     {
  245.         if (player > 0 && bIsSurvivor(player))
  246.         {
  247.             pool[electables] = player;
  248.             electables += 1;
  249.         }
  250.     }
  251.     return pool[GetRandomInt(0, electables)];
  252. }
  253.  
  254. void GiveFunction(int client, char[] name)
  255. {
  256.     char sBuf[32];
  257.     int flags = GetCommandFlags("give");
  258.     SetCommandFlags("give", flags & ~FCVAR_CHEAT);
  259.     FormatEx(sBuf, sizeof sBuf, "give %s", name);
  260.     FakeClientCommand(client, sBuf);
  261. }
  262.  
  263. stock bool bIsSurvivor(int client)
  264. {
  265.     return client > 0 && client <= MaxClients && IsClientInGame(client) && GetClientTeam(client) == 2 && !IsClientInKickQueue(client) && !IsFakeClient(client) && IsPlayerAlive(client);
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement