FlacoBey

Untitled

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