Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.60 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3. #include sdkhooks
  4.  
  5. #pragma tabsize 0
  6.  
  7. float GrenadeDamage = 200.0
  8. float PipeBombDamage = 200.0
  9. float BarrelDamage = 200.0
  10.  
  11. float GrenadeRadius = 50.0
  12. float PipeRadius = 50.0
  13. float BarrelRadius = 50.0
  14.  
  15. float GrenadeFling = 450.0
  16. float PipeFling = 450.0
  17. float BarrelFling = 450.0
  18.  
  19. float RadiusFlingGrenade = 100.0
  20. float RadiusFlingPipe = 100.0
  21. float RadiusFlingBarrel = 100.0
  22.  
  23. float ShakeGrenade = 1000.0
  24. float ShakePipe = 1000.0
  25. float ShakeBarrel = 1000.0
  26.  
  27. float PowerShakeG = 10.0
  28. float PowerShakeP = 10.0
  29. float PowerShakeB = 10.0
  30.  
  31. Handle sdkCallPushPlayer;
  32.  
  33. public OnPluginStart()
  34. {
  35. Handle GameConf = LoadGameConfigFile("added_explosion-for-survivor");
  36.  
  37. if(GameConf == INVALID_HANDLE)
  38. {
  39. SetFailState("Couldn't find the offsets and signatures file. Please, check that it is installed correctly.");
  40. }
  41.  
  42. StartPrepSDKCall(SDKCall_Player);
  43. PrepSDKCall_SetFromConf(GameConf, SDKConf_Signature, "CTerrorPlayer_Fling");
  44. PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  45. PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
  46. PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer);
  47. PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
  48. sdkCallPushPlayer = EndPrepSDKCall();
  49. }
  50.  
  51. bool IsAllow = false;
  52.  
  53. public OnMapStart()
  54. {
  55. IsAllow = false;
  56. CreateTimer(3.0, allow)
  57. }
  58.  
  59. public Action allow(Handle timer)
  60. {
  61. IsAllow = true;
  62. }
  63.  
  64. public void OnEntityDestroyed(int entity)
  65. {
  66. if(!IsAllow) return;
  67.  
  68. if (IsValidEntity(entity) && IsValidEdict(entity))
  69. {
  70. char classname[128];
  71. GetEdictClassname(entity, classname, 128);
  72. if (StrEqual(classname, "grenade_launcher_projectile", false))
  73. {
  74. GrenadeTouch(entity);
  75. }
  76. if (StrEqual(classname, "pipe_bomb_projectile", false))
  77. {
  78. BombTouch(entity);
  79. }
  80. if (StrEqual(classname, "prop_fuel_barrel", false))
  81. {
  82. BarrelTouch(entity);
  83. }
  84. }
  85. }
  86.  
  87. public int GrenadeTouch(int entity)
  88. {
  89. float pos[3];
  90. GetEntPropVector(entity, PropType:0, "m_vecOrigin", pos, 0);
  91. GranadeExplode(pos);
  92. }
  93.  
  94. public int BombTouch(int entity)
  95. {
  96. float pos[3];
  97. GetEntPropVector(entity, PropType:0, "m_vecOrigin", pos, 0);
  98. BombExplode(pos)
  99. }
  100.  
  101. public int BarrelTouch(int entity)
  102. {
  103. float pos[3];
  104. GetEntPropVector(entity, PropType:0, "m_vecOrigin", pos, 0);
  105. BarrelExplode(pos);
  106. }
  107.  
  108. int GranadeExplode(float pos[3])
  109. {
  110. float fDistance = 0.0;
  111. float pos2[3];
  112. for( int i = 0; i < 32; i++ )
  113. {
  114. if(IsValidClient(i) && GetClientTeam(i) == 2)
  115. {
  116. int vClass = GetEntProp(i, Prop_Send, "m_zombieClass")
  117. if(vClass == 9)
  118. {
  119. GetClientAbsOrigin(i, pos2);
  120. fDistance = GetVectorDistance(pos, pos2);
  121. if(fDistance < RadiusFlingGrenade && IsVisibleTo(pos, pos2))
  122. {
  123. Fly(i, i, GrenadeFling)
  124. }
  125. if(fDistance < GrenadeRadius && IsVisibleTo(pos, pos2))
  126. {
  127. float iOne = GrenadeRadius - fDistance
  128. float vForward = GrenadeRadius / iOne
  129. int iDamage = RoundToCeil(GrenadeDamage / (vForward * vForward * vForward))
  130. float HealBuf = GetEntPropFloat(i, Prop_Send, "m_healthBuffer");
  131. int flHealth = GetClientHealth(i)
  132. if(RoundToCeil(HealBuf) - iDamage < 0 || flHealth - iDamage < 0 || (RoundToCeil(HealBuf) + flHealth) - iDamage < 0)
  133. {
  134. int iPoint = RoundToCeil(HealBuf) + flHealth;
  135. int iTransit = iPoint - iDamage;
  136. SetEntProp(i, Prop_Send, "m_isIncapacitated", 1);
  137. ForceDamageEntity(i, iTransit, i)
  138. }
  139. else
  140. {
  141. ForceDamageEntity(i, iDamage, i)
  142. }
  143. }
  144. if(fDistance < ShakeGrenade)
  145. {
  146. float iOne = ShakeGrenade - fDistance
  147. float vForward = ShakeGrenade / iOne
  148. float iDamage = (PowerShakeG / (vForward * vForward * vForward)) * 1.0
  149. ScreenShake(i, iDamage)
  150. }
  151. }
  152. }
  153. }
  154. }
  155.  
  156. int BombExplode(float pos[3])
  157. {
  158. float fDistance = 0.0;
  159. float pos2[3];
  160. for( int i = 0; i < 32; i++ )
  161. {
  162. if(IsValidClient(i) && GetClientTeam(i) == 2)
  163. {
  164. int vClass = GetEntProp(i, Prop_Send, "m_zombieClass")
  165. if(vClass == 9)
  166. {
  167. GetClientAbsOrigin(i, pos2);
  168. fDistance = GetVectorDistance(pos, pos2);
  169. if(fDistance < RadiusFlingPipe && IsVisibleTo(pos, pos2))
  170. {
  171. Fly(i, i, PipeFling)
  172. }
  173. if(fDistance < PipeRadius && IsVisibleTo(pos, pos2))
  174. {
  175. float iOne = PipeRadius - fDistance
  176. float vForward = PipeRadius / iOne
  177. int iDamage = RoundToCeil(PipeBombDamage / (vForward * vForward * vForward))
  178. float HealBuf = GetEntPropFloat(i, Prop_Send, "m_healthBuffer");
  179. int flHealth = GetClientHealth(i)
  180. if(RoundToCeil(HealBuf) - iDamage < 0 || flHealth - iDamage < 0 || (RoundToCeil(HealBuf) + flHealth) - iDamage < 0)
  181. {
  182. int iPoint = RoundToCeil(HealBuf) + flHealth;
  183. int iTransit = iPoint - iDamage;
  184. SetEntProp(i, Prop_Send, "m_isIncapacitated", 1);
  185. ForceDamageEntity(i, iTransit, i)
  186. }
  187. else
  188. {
  189. ForceDamageEntity(i, iDamage, i)
  190. }
  191. }
  192. if(fDistance < ShakePipe)
  193. {
  194. float iOne = ShakePipe - fDistance
  195. float vForward = ShakePipe / iOne
  196. float iDamage = (PowerShakeP / (vForward * vForward * vForward)) * 1.0
  197. ScreenShake(i, iDamage)
  198. }
  199. }
  200. }
  201. }
  202. }
  203.  
  204. int BarrelExplode(float pos[3])
  205. {
  206. float fDistance = 0.0;
  207. float pos2[3];
  208. for( int i = 0; i < 32; i++ )
  209. {
  210. if(IsValidClient(i) && GetClientTeam(i) == 2)
  211. {
  212. int vClass = GetEntProp(i, Prop_Send, "m_zombieClass")
  213. if(vClass == 9)
  214. {
  215. GetClientAbsOrigin(i, pos2);
  216. fDistance = GetVectorDistance(pos, pos2);
  217. if(fDistance < RadiusFlingBarrel && IsVisibleTo(pos, pos2))
  218. {
  219. Fly(i, i, BarrelFling)
  220. }
  221. if(fDistance < BarrelRadius && IsVisibleTo(pos, pos2))
  222. {
  223. float iOne = BarrelRadius - fDistance
  224. float vForward = BarrelRadius / iOne
  225. int iDamage = RoundToCeil(BarrelDamage / (vForward * vForward * vForward))
  226. float HealBuf = GetEntPropFloat(i, Prop_Send, "m_healthBuffer");
  227. int flHealth = GetClientHealth(i)
  228. if(RoundToCeil(HealBuf) - iDamage < 0 || flHealth - iDamage < 0 || (RoundToCeil(HealBuf) + flHealth) - iDamage < 0)
  229. {
  230. int iPoint = RoundToCeil(HealBuf) + flHealth;
  231. int iTransit = iPoint - iDamage;
  232. SetEntProp(i, Prop_Send, "m_isIncapacitated", 1);
  233. ForceDamageEntity(i, iTransit, i)
  234. }
  235. else
  236. {
  237. ForceDamageEntity(i, iDamage, i)
  238. }
  239. }
  240. if(fDistance < ShakeBarrel)
  241. {
  242. float iOne = ShakeBarrel - fDistance
  243. float vForward = ShakeBarrel / iOne
  244. float iDamage = (PowerShakeB / (vForward * vForward * vForward)) * 1.0
  245. ScreenShake(i, iDamage)
  246. }
  247. }
  248. }
  249. }
  250. }
  251.  
  252. public Fly(explosion, int target, float power)
  253. {
  254. if(target <= 0 || !IsValidEntity(target) || !IsValidEdict(target)) return;
  255.  
  256. float targetPos[3], explosionPos[3], traceVec[3], resultingFling[3];
  257.  
  258. GetEntPropVector(target, Prop_Data, "m_vecOrigin", targetPos);
  259. GetEntPropVector(explosion, Prop_Data,"m_vecOrigin", explosionPos);
  260.  
  261. float fDistance = GetVectorDistance(targetPos, explosionPos)
  262. float iOne = GrenadeRadius - fDistance
  263. float iDamage = GrenadeRadius / iOne
  264. power = (GrenadeDamage / (iDamage * iDamage * iDamage)) * 1.0
  265. if(power < 1)
  266. return;
  267.  
  268. MakeVectorFromPoints(explosionPos, targetPos, traceVec);
  269. GetVectorAngles(traceVec, resultingFling);
  270.  
  271. resultingFling[0] = Cosine(DegToRad(resultingFling[1])) * power;
  272. resultingFling[1] = Sine(DegToRad(resultingFling[1])) * power;
  273. resultingFling[2] = power + (power * 0.5);
  274. if (GetClientTeam(target) == 2)
  275. {
  276. SDKCall(sdkCallPushPlayer, target, resultingFling, 76, target, 2.0);
  277. }
  278. else
  279. {
  280. SDKCall(sdkCallPushPlayer, target, resultingFling, 2, target, 2.0);
  281. }
  282. }
  283.  
  284. public void ScreenShake(int target, float power)
  285. {
  286. Handle msg;
  287. msg = StartMessageOne("Shake", target);
  288. BfWriteByte(msg, 0);
  289. BfWriteFloat(msg, power);
  290. BfWriteFloat(msg, 10.0);
  291. BfWriteFloat(msg, 3.0);
  292. EndMessage();
  293. }
  294.  
  295. static bool IsVisibleTo(float position[3], float targetposition[3])
  296. {
  297. float vAngles[3], vLookAt[3];
  298.  
  299. MakeVectorFromPoints(position, targetposition, vLookAt); // compute vector from start to target
  300. GetVectorAngles(vLookAt, vAngles); // get angles from vector for trace
  301.  
  302. // execute Trace
  303. Handle trace = TR_TraceRayFilterEx(position, vAngles, MASK_SHOT, RayType_Infinite, _TraceFilter);
  304.  
  305. bool isVisible = false;
  306. if (TR_DidHit(trace))
  307. {
  308. float vStart[3];
  309. TR_GetEndPosition(vStart, trace); // retrieve our trace endpoint
  310.  
  311. if ((GetVectorDistance(position, vStart, false) + 25.0) >= GetVectorDistance(position, targetposition))
  312. {
  313. isVisible = true; // if trace ray length plus tolerance equal or bigger absolute distance, you hit the target
  314. }
  315. }
  316.  
  317. return isVisible;
  318. }
  319.  
  320. public bool _TraceFilter(int entity, int contentsMask)
  321. {
  322. if (!entity || entity <= MaxClients || !IsValidEntity(entity)) // dont let WORLD, or invalid entities be hit
  323. {
  324. return false;
  325. }
  326. return true;
  327. }
  328. stock void ForceDamageEntity(int causer, int damage, int victim) // thanks to &#36798;&#26031;*&#32500;&#36798;
  329. {
  330. float victim_origin[3];
  331. char rupture[32];
  332. char damage_victim[32];
  333. IntToString(damage, rupture, sizeof(rupture));
  334. Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);
  335. GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);
  336. int entity = CreateEntityByName("point_hurt");
  337. DispatchKeyValue(victim, "targetname", damage_victim);
  338. DispatchKeyValue(entity, "DamageTarget", damage_victim);
  339. DispatchKeyValue(entity, "Damage", rupture);
  340. DispatchSpawn(entity);
  341. TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);
  342. AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);
  343. DispatchKeyValue(entity, "classname", "point_hurt");
  344. DispatchKeyValue(victim, "targetname", "null");
  345. AcceptEntityInput(entity, "Kill");
  346. }
  347.  
  348. stock bool IsValidClient(int client)
  349. {
  350. if ( client < 1 || client > MaxClients ) return false;
  351. if( !IsClientInGame(client)) return false;
  352. if ( !IsPlayerAlive( client )) return false;
  353. return true;
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement