FlacoBey

Untitled

Jun 3rd, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.77 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3.  
  4. #pragma newdecls required
  5. #pragma semicolon 1
  6.  
  7. static bool ignoreNextDamageDealt[MAXPLAYERS+1] = false;
  8.  
  9. float FotAllMelee = 1.0;
  10. float KatanaAndFireAxe = 1.0;
  11. float MacheteAndCrowbar = 1.0;
  12. float Knife = 1.0;
  13.  
  14. public void OnPluginStart()
  15. {
  16.     HookEvent("infected_hurt", iInfectedHurt);
  17. }
  18.  
  19. public Action iInfectedHurt(Handle event, const char[] name, bool dontBroadcast)
  20. {
  21.     char weaponname[64];
  22.  
  23.     int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
  24.     int entity = (GetEventInt(event, "entityid"));
  25.    
  26.     if (!attacker || !IsValidEntity(entity) || ignoreNextDamageDealt[attacker]) return;
  27.  
  28.     char entname[32];
  29.     GetEdictClassname(entity, entname, sizeof(entname));
  30.  
  31.     int dmg_health = GetEventInt(event,"amount");
  32.     int eventhealth = GetEntProp(entity, Prop_Data, "m_iHealth");
  33.     int damagedelta;
  34.    
  35.     if (dmg_health < 1 || eventhealth < 1) return;
  36.  
  37.     GetClientWeapon(attacker, weaponname, sizeof(weaponname));
  38.  
  39.     if (StrEqual(weaponname, "weapon_melee"))
  40.     {
  41.         GetEntPropString(GetPlayerWeaponSlot(attacker, 1), Prop_Data, "m_strMapSetScriptName", weaponname, sizeof(weaponname));
  42.     }
  43.     else return;
  44.    
  45.     PrintToChatAll("%s", weaponname);
  46.     if(StrContains(weaponname, "knife") > 0)
  47.     {
  48.         damagedelta = RoundToNearest((dmg_health * Knife) - dmg_health);
  49.     }
  50.     else if(StrContains(weaponname, "katana") > 0 || StrContains(weaponname, "fireaxe") > 0)
  51.     {
  52.         damagedelta = RoundToNearest((dmg_health * KatanaAndFireAxe) - dmg_health);
  53.     }
  54.     else if(StrContains(weaponname, "machete") > 0 || StrContains(weaponname, "crowbar") > 0)
  55.     {
  56.         damagedelta = RoundToNearest((dmg_health * MacheteAndCrowbar) - dmg_health);
  57.     }
  58.     else
  59.     {
  60.         damagedelta = RoundToNearest((dmg_health * FotAllMelee) - dmg_health);
  61.     }
  62.    
  63.     switch (damagedelta > 0)
  64.     {
  65.         case true:
  66.         {
  67.             applyDamage(damagedelta, entity, attacker);
  68.         }
  69.         case false:
  70.         {
  71.             int health = eventhealth - damagedelta;
  72.            
  73.             if (health < 1)
  74.             {
  75.                 damagedelta += (health - 1);
  76.                 health = 1;
  77.             }
  78.                
  79.             SetEntProp(entity, Prop_Data, "m_iHealth", health);
  80.             SetEventInt(event, "amount", damagedelta);
  81.         }
  82.     }
  83. }
  84.  
  85. static void applyDamage(int damage, int victim, int attacker)
  86. {
  87.     Handle dataPack = CreateDataPack();
  88.     WritePackCell(dataPack, damage);  
  89.     WritePackCell(dataPack, victim);
  90.     WritePackCell(dataPack, attacker);
  91.    
  92.     CreateTimer(0.1, timer_stock_applyDamage, dataPack);
  93.     ignoreNextDamageDealt[attacker] = true;
  94.     CreateTimer(0.2, timer_resetStop, attacker);
  95. }
  96.  
  97. public Action timer_resetStop(Handle timer, any client)
  98. {
  99.     ignoreNextDamageDealt[client] = false;
  100. }
  101.  
  102. public Action timer_stock_applyDamage(Handle timer, Handle dataPack)
  103. {
  104.     ResetPack(dataPack);
  105.     int damage = ReadPackCell(dataPack);  
  106.     int victim = ReadPackCell(dataPack);
  107.     int attacker = ReadPackCell(dataPack);
  108.     CloseHandle(dataPack);  
  109.  
  110.     float victimPos[3]; char strDamage[16], strDamageTarget[16];
  111.    
  112.     if (victim < 20 && IsClientInGame(victim))
  113.     {
  114.         GetClientEyePosition(victim, victimPos);
  115.     }
  116.     else if (IsValidEntity(victim))
  117.     {
  118.         GetEntityAbsOrigin(victim, victimPos);
  119.     }
  120.     else return;
  121.    
  122.     IntToString(damage, strDamage, sizeof(strDamage));
  123.     Format(strDamageTarget, sizeof(strDamageTarget), "hurtme%d", victim);
  124.    
  125.     int entPointHurt = CreateEntityByName("point_hurt");
  126.     if(!entPointHurt) return;
  127.  
  128.     DispatchKeyValue(victim, "targetname", strDamageTarget);
  129.     DispatchKeyValue(entPointHurt, "DamageTarget", strDamageTarget);
  130.     DispatchKeyValue(entPointHurt, "Damage", strDamage);
  131.     DispatchKeyValue(entPointHurt, "DamageType", "0");
  132.     DispatchSpawn(entPointHurt);
  133.  
  134.     TeleportEntity(entPointHurt, victimPos, NULL_VECTOR, NULL_VECTOR);
  135.     AcceptEntityInput(entPointHurt, "Hurt", (attacker && attacker < 20 && IsClientInGame(attacker)) ? attacker : -1);
  136.  
  137.     DispatchKeyValue(entPointHurt, "classname", "point_hurt");
  138.     DispatchKeyValue(victim, "targetname", "null");
  139.     RemoveEdict(entPointHurt);
  140. }
  141.  
  142. stock void GetEntityAbsOrigin( int entity, float origin[3])
  143. {
  144.     if (entity > 0 && IsValidEntity(entity))
  145.     {
  146.         float mins[3], maxs[3];
  147.         GetEntPropVector(entity,Prop_Send,"m_vecOrigin",origin);
  148.         GetEntPropVector(entity,Prop_Send,"m_vecMins",mins);
  149.         GetEntPropVector(entity,Prop_Send,"m_vecMaxs",maxs);
  150.        
  151.         origin[0] += (mins[0] + maxs[0]) * 0.5;
  152.         origin[1] += (mins[1] + maxs[1]) * 0.5;
  153.         origin[2] += (mins[2] + maxs[2]) * 0.5;
  154.     }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment