Advertisement
FlacoBey

Untitled

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