Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.11 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. 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. {
  108. applyDamage(damagedelta, entity, attacker);
  109. }
  110. else
  111. {
  112. int health = eventhealth - damagedelta;
  113.  
  114. if (health < 1)
  115. {
  116. damagedelta += (health - 1);
  117. health = 1;
  118. }
  119. SetEntProp(entity, Prop_Data, "m_iHealth", health);
  120. SetEventInt(event, "amount", damagedelta);
  121. }
  122. }
  123.  
  124. static void applyDamage(int damage, int victim, int attacker)
  125. {
  126. Handle dataPack = CreateDataPack();
  127. WritePackCell(dataPack, damage);
  128. WritePackCell(dataPack, victim);
  129. WritePackCell(dataPack, attacker);
  130.  
  131. CreateTimer(0.1, timer_stock_applyDamage, dataPack);
  132. ignoreNextDamageDealt[attacker] = true;
  133. CreateTimer(0.2, timer_resetStop, attacker);
  134. }
  135.  
  136. public Action timer_resetStop(Handle timer, any client)
  137. {
  138. ignoreNextDamageDealt[client] = false;
  139. }
  140.  
  141. public Action timer_stock_applyDamage(Handle timer, Handle dataPack)
  142. {
  143. ResetPack(dataPack);
  144. int damage = ReadPackCell(dataPack);
  145. int victim = ReadPackCell(dataPack);
  146. int attacker = ReadPackCell(dataPack);
  147. CloseHandle(dataPack);
  148.  
  149. float victimPos[3]; char strDamage[16], strDamageTarget[16];
  150.  
  151. if (victim < 20 && IsClientInGame(victim))
  152. {
  153. GetClientEyePosition(victim, victimPos);
  154. }
  155. else if (IsValidEntity(victim))
  156. {
  157. GetEntityAbsOrigin(victim, victimPos);
  158. }
  159. else return;
  160.  
  161. IntToString(damage, strDamage, sizeof(strDamage));
  162. Format(strDamageTarget, sizeof(strDamageTarget), "hurtme%d", victim);
  163.  
  164. int entPointHurt = CreateEntityByName("point_hurt");
  165. if(!entPointHurt) return;
  166.  
  167. DispatchKeyValue(victim, "targetname", strDamageTarget);
  168. DispatchKeyValue(entPointHurt, "DamageTarget", strDamageTarget);
  169. DispatchKeyValue(entPointHurt, "Damage", strDamage);
  170. DispatchKeyValue(entPointHurt, "DamageType", "0");
  171. DispatchSpawn(entPointHurt);
  172.  
  173. TeleportEntity(entPointHurt, victimPos, NULL_VECTOR, NULL_VECTOR);
  174. AcceptEntityInput(entPointHurt, "Hurt", (attacker && attacker < 20 && IsClientInGame(attacker)) ? attacker : -1);
  175.  
  176. DispatchKeyValue(entPointHurt, "classname", "point_hurt");
  177. DispatchKeyValue(victim, "targetname", "null");
  178. AcceptEntityInput(entPointHurt, "kill");
  179.  
  180. PushCommonInfected(attacker, victim, victimPos);
  181. }
  182.  
  183. stock void GetEntityAbsOrigin( int entity, float origin[3])
  184. {
  185. if (entity > 0 && IsValidEntity(entity))
  186. {
  187. float mins[3], maxs[3];
  188. GetEntPropVector(entity,Prop_Send,"m_vecOrigin",origin);
  189. GetEntPropVector(entity,Prop_Send,"m_vecMins",mins);
  190. GetEntPropVector(entity,Prop_Send,"m_vecMaxs",maxs);
  191.  
  192. origin[0] += (mins[0] + maxs[0]) * 0.5;
  193. origin[1] += (mins[1] + maxs[1]) * 0.5;
  194. origin[2] += (mins[2] + maxs[2]) * 0.5;
  195. }
  196. }
  197.  
  198. void PushCommonInfected(int client, int target, float vPos[3])
  199. {
  200. int entity = CreateEntityByName("point_hurt");
  201. DispatchKeyValue(target, "targetname", "silvershot");
  202. DispatchKeyValue(entity, "DamageTarget", "silvershot");
  203. DispatchKeyValue(entity, "Damage", "0");
  204. DispatchKeyValue(entity, "DamageType", "33554432"); // DMG_AIRBOAT (1<<25)
  205. TeleportEntity(entity, vPos, NULL_VECTOR, NULL_VECTOR);
  206. DispatchSpawn(entity);
  207. AcceptEntityInput(entity, "Hurt", client, client);
  208. RemoveEdict(entity);
  209. DispatchKeyValue(target, "targetname", "");
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement