FlacoBey

Untitled

Jul 18th, 2019
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <sourcemod>
  2. #include <sdktools>
  3.  
  4. #define MAXLIST 11
  5.  
  6. #pragma newdecls required
  7. #pragma semicolon 1
  8.  
  9. static bool ignoreNextDamageDealt[MAXPLAYERS+1] = false;
  10.  
  11. static const char gModelsItemsList[MAXLIST][] =
  12. {
  13. "models/weapons/melee/v_katana.mdl", //0
  14. "models/weapons/melee/v_fireaxe.mdl", //1
  15. "models/weapons/melee/v_machete.mdl", //2
  16. "models/weapons/melee/v_crowbar.mdl", //3
  17. "models/v_models/v_knife_t.mdl", //4
  18. "models/weapons/melee/v_frying_pan.mdl", //5
  19. "models/weapons/melee/v_bat.mdl", //6
  20. "models/weapons/melee/v_cricket_bat.mdl", //7
  21. "models/weapons/melee/v_tonfa.mdl", //8
  22. "models/weapons/melee/v_electric_guitar.mdl", //9
  23. "models/weapons/melee/v_golfclub.mdl" //10
  24. };
  25.  
  26. static const char gGeneralMelee[MAXLIST - 6][] =
  27. {
  28. "katana",
  29. "fireaxe",
  30. "machete",
  31. "crowbar",
  32. "knife"
  33. };
  34.  
  35. static const float gMeleeModifier[MAXLIST - 5] =
  36. {
  37. 1.0,
  38. 1.0,
  39. 0.99,
  40. 0.9,
  41. 0.7,
  42. 0.6
  43. };
  44.  
  45. public void OnPluginStart()
  46. {
  47. HookEvent("infected_hurt", iInfectedHurt);
  48. }
  49.  
  50. public Action iInfectedHurt(Event event, const char[] name, bool dontBroadcast)
  51. {
  52. char weaponname[56];
  53.  
  54. int attacker = GetClientOfUserId(event.GetInt("attacker"));
  55. int entity = event.GetInt("entityid");
  56.  
  57. if (!attacker || !IsValidEntity(entity) || ignoreNextDamageDealt[attacker]) return;
  58.  
  59. int dmg_health = GetEventInt(event,"amount");
  60. int eventhealth = GetEntProp(entity, Prop_Data, "m_iHealth");
  61. int damagedelta;
  62.  
  63. int iCurrentWeapon = GetEntPropEnt(attacker, Prop_Send, "m_hActiveWeapon");
  64.  
  65. if(!IsValidEntity(iCurrentWeapon)) return;
  66.  
  67. GetEntityClassname(iCurrentWeapon, weaponname, sizeof(weaponname));
  68. if (strcmp(weaponname, "weapon_melee") == 0)
  69. GetEntPropString(iCurrentWeapon, Prop_Data, "m_strMapSetScriptName", weaponname, sizeof weaponname);
  70. else return;
  71.  
  72.  
  73. if(weaponname[0] == 0)
  74. {
  75. char ModelName[128], sExplodeString[MAXLIST - 6][36];
  76. int iNum;
  77. GetEntPropString(iCurrentWeapon, Prop_Data, "m_ModelName", ModelName, sizeof ModelName);
  78. for(int i; i < MAXLIST; i++)
  79. {
  80. if(strcmp(ModelName, gModelsItemsList[i]) == 0)
  81. {
  82. iNum = ExplodeString(gModelsItemsList[i], "/", sExplodeString, sizeof sExplodeString, sizeof sExplodeString[]);
  83. ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "v_", "");
  84. if(StrContains(sExplodeString[iNum - 1], "knife") > 0)
  85. ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "_t.mdl", "");
  86. else
  87. ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], ".mdl", "");
  88. TrimString(sExplodeString[iNum - 1]);
  89. Format(weaponname, sizeof weaponname, "%s", sExplodeString[iNum - 1]);
  90. break;
  91. }
  92. }
  93. }
  94.  
  95. damagedelta = RoundToNearest((dmg_health * gMeleeModifier[5]) - dmg_health);
  96.  
  97. for(int i; i < 5; i++)
  98. {
  99. if(strcmp(weaponname, gGeneralMelee[i]) == 0)
  100. {
  101. damagedelta = RoundToNearest((dmg_health * gMeleeModifier[i]) - dmg_health);
  102. break;
  103. }
  104. }
  105.  
  106. if(damagedelta > 0)
  107. applyDamage(damagedelta, entity, attacker);
  108. else
  109. {
  110. int health = eventhealth - damagedelta;
  111.  
  112. if (health < 1)
  113. {
  114. damagedelta += (health - 1);
  115. health = 1;
  116. }
  117. SetEntProp(entity, Prop_Data, "m_iHealth", health);
  118. SetEventInt(event, "amount", damagedelta);
  119. }
  120. }
  121.  
  122. static void applyDamage(int damage, int victim, int attacker)
  123. {
  124. Handle dataPack = CreateDataPack();
  125. WritePackCell(dataPack, damage);
  126. WritePackCell(dataPack, victim);
  127. WritePackCell(dataPack, attacker);
  128.  
  129. CreateTimer(0.1, timer_stock_applyDamage, dataPack);
  130. ignoreNextDamageDealt[attacker] = true;
  131. CreateTimer(0.2, timer_resetStop, attacker);
  132. }
  133.  
  134. public Action timer_resetStop(Handle timer, any client)
  135. {
  136. ignoreNextDamageDealt[client] = false;
  137. }
  138.  
  139. public Action timer_stock_applyDamage(Handle timer, Handle dataPack)
  140. {
  141. ResetPack(dataPack);
  142. int damage = ReadPackCell(dataPack);
  143. int victim = ReadPackCell(dataPack);
  144. int attacker = ReadPackCell(dataPack);
  145. CloseHandle(dataPack);
  146.  
  147. float victimPos[3]; char strDamage[16], strDamageTarget[16];
  148.  
  149. if (victim < 20 && IsClientInGame(victim))
  150. {
  151. GetClientEyePosition(victim, victimPos);
  152. }
  153. else if (IsValidEntity(victim))
  154. {
  155. GetEntityAbsOrigin(victim, victimPos);
  156. }
  157. else return;
  158.  
  159. IntToString(damage, strDamage, sizeof(strDamage));
  160. Format(strDamageTarget, sizeof(strDamageTarget), "hurtme%d", victim);
  161.  
  162. int entPointHurt = CreateEntityByName("point_hurt");
  163. if(!entPointHurt) return;
  164.  
  165. DispatchKeyValue(victim, "targetname", strDamageTarget);
  166. DispatchKeyValue(entPointHurt, "DamageTarget", strDamageTarget);
  167. DispatchKeyValue(entPointHurt, "Damage", strDamage);
  168. DispatchKeyValue(entPointHurt, "DamageType", "0");
  169. DispatchSpawn(entPointHurt);
  170.  
  171. TeleportEntity(entPointHurt, victimPos, NULL_VECTOR, NULL_VECTOR);
  172. AcceptEntityInput(entPointHurt, "Hurt", (attacker && attacker < 20 && IsClientInGame(attacker)) ? attacker : -1);
  173.  
  174. DispatchKeyValue(entPointHurt, "classname", "point_hurt");
  175. DispatchKeyValue(victim, "targetname", "null");
  176. AcceptEntityInput(entPointHurt, "kill");
  177. }
  178.  
  179. stock void GetEntityAbsOrigin( int entity, float origin[3])
  180. {
  181. if (entity > 0 && IsValidEntity(entity))
  182. {
  183. float mins[3], maxs[3];
  184. GetEntPropVector(entity,Prop_Send,"m_vecOrigin",origin);
  185. GetEntPropVector(entity,Prop_Send,"m_vecMins",mins);
  186. GetEntPropVector(entity,Prop_Send,"m_vecMaxs",maxs);
  187.  
  188. origin[0] += (mins[0] + maxs[0]) * 0.5;
  189. origin[1] += (mins[1] + maxs[1]) * 0.5;
  190. origin[2] += (mins[2] + maxs[2]) * 0.5;
  191. }
  192. }
Advertisement
Add Comment
Please, Sign In to add comment