Advertisement
FlacoBey

Untitled

Jul 16th, 2019
159
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) return;
  69.  
  70.  
  71. char ModelName[128], sExplodeString[MAXLIST - 6][36];
  72. int iNum;
  73. for(int i; i < MAXLIST; i++)
  74. {
  75. if(strcmp(ModelName, gModelsItemsList[i]) == 0)
  76. {
  77. iNum = ExplodeString(gModelsItemsList[i], "/", sExplodeString, sizeof sExplodeString, sizeof sExplodeString[]);
  78. ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "v_", "");
  79. if(StrContains(sExplodeString[iNum - 1], "knife") > 0)
  80. ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "_t.mdl", "");
  81. else
  82. ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], ".mdl", "");
  83. TrimString(sExplodeString[iNum - 1]);
  84. Format(weaponname, sizeof weaponname, "%s", sExplodeString[iNum - 1]);
  85. break;
  86. }
  87. }
  88.  
  89. damagedelta = RoundToNearest((dmg_health * gMeleeModifier[5]) - dmg_health);
  90.  
  91. for(int i; i < 5; i++)
  92. {
  93. if(strcmp(weaponname, gGeneralMelee[i]) == 0)
  94. {
  95. damagedelta = RoundToNearest((dmg_health * gMeleeModifier[i]) - dmg_health);
  96. break;
  97. }
  98. }
  99.  
  100. if(damagedelta > 0)
  101. applyDamage(damagedelta, entity, attacker);
  102. else
  103. {
  104. int health = eventhealth - damagedelta;
  105.  
  106. if (health < 1)
  107. {
  108. damagedelta += (health - 1);
  109. health = 1;
  110. }
  111. SetEntProp(entity, Prop_Data, "m_iHealth", health);
  112. SetEventInt(event, "amount", damagedelta);
  113. }
  114. }
  115.  
  116. static void applyDamage(int damage, int victim, int attacker)
  117. {
  118. Handle dataPack = CreateDataPack();
  119. WritePackCell(dataPack, damage);
  120. WritePackCell(dataPack, victim);
  121. WritePackCell(dataPack, attacker);
  122.  
  123. CreateTimer(0.1, timer_stock_applyDamage, dataPack);
  124. ignoreNextDamageDealt[attacker] = true;
  125. CreateTimer(0.2, timer_resetStop, attacker);
  126. }
  127.  
  128. public Action timer_resetStop(Handle timer, any client)
  129. {
  130. ignoreNextDamageDealt[client] = false;
  131. }
  132.  
  133. public Action timer_stock_applyDamage(Handle timer, Handle dataPack)
  134. {
  135. ResetPack(dataPack);
  136. int damage = ReadPackCell(dataPack);
  137. int victim = ReadPackCell(dataPack);
  138. int attacker = ReadPackCell(dataPack);
  139. CloseHandle(dataPack);
  140.  
  141. float victimPos[3]; char strDamage[16], strDamageTarget[16];
  142.  
  143. if (victim < 20 && IsClientInGame(victim))
  144. {
  145. GetClientEyePosition(victim, victimPos);
  146. }
  147. else if (IsValidEntity(victim))
  148. {
  149. GetEntityAbsOrigin(victim, victimPos);
  150. }
  151. else return;
  152.  
  153. IntToString(damage, strDamage, sizeof(strDamage));
  154. Format(strDamageTarget, sizeof(strDamageTarget), "hurtme%d", victim);
  155.  
  156. int entPointHurt = CreateEntityByName("point_hurt");
  157. if(!entPointHurt) return;
  158.  
  159. DispatchKeyValue(victim, "targetname", strDamageTarget);
  160. DispatchKeyValue(entPointHurt, "DamageTarget", strDamageTarget);
  161. DispatchKeyValue(entPointHurt, "Damage", strDamage);
  162. DispatchKeyValue(entPointHurt, "DamageType", "0");
  163. DispatchSpawn(entPointHurt);
  164.  
  165. TeleportEntity(entPointHurt, victimPos, NULL_VECTOR, NULL_VECTOR);
  166. AcceptEntityInput(entPointHurt, "Hurt", (attacker && attacker < 20 && IsClientInGame(attacker)) ? attacker : -1);
  167.  
  168. DispatchKeyValue(entPointHurt, "classname", "point_hurt");
  169. DispatchKeyValue(victim, "targetname", "null");
  170. AcceptEntityInput(entPointHurt, "kill");
  171. }
  172. stock void GetEntityAbsOrigin( int entity, float origin[3])
  173. {
  174. if (entity > 0 && IsValidEntity(entity))
  175. {
  176. float mins[3], maxs[3];
  177. GetEntPropVector(entity,Prop_Send,"m_vecOrigin",origin);
  178. GetEntPropVector(entity,Prop_Send,"m_vecMins",mins);
  179. GetEntPropVector(entity,Prop_Send,"m_vecMaxs",maxs);
  180.  
  181. origin[0] += (mins[0] + maxs[0]) * 0.5;
  182. origin[1] += (mins[1] + maxs[1]) * 0.5;
  183. origin[2] += (mins[2] + maxs[2]) * 0.5;
  184. }
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement