Advertisement
FlacoBey

Untitled

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