Guest User

Untitled

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