Advertisement
Guest User

Untitled

a guest
May 20th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.72 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3.  
  4. //Survivors
  5. int iDamageGrenadeLauncherS = 500;
  6. float iPowerSFling = 150.0;
  7. float iRadiusSdie = 200.0
  8. float iRadiusSFling = 400.0
  9. float iRadiusSDamage = 400.0
  10.  
  11. //Survivors Pipe Bomb
  12. int iDamagePipeS = 400;
  13. float iPowerSFlingPipe = 150.0;
  14. float iRadiusSdiePipe = 200.0
  15. float iRadiusSFlingPipe = 400.0
  16. float iRadiusSDamagePipe = 400.0
  17.  
  18. //Tank
  19. int iDamageGrenadeLauncherT = 500;
  20. float iPowerTFling = 10.0
  21. float iRadiusTDamage = 700.0
  22. float iRadiusTFling = 700.0
  23.  
  24. //Tank Pipe
  25. int iDamagePipeT = 400
  26. float iPowerTFlingPipe = 10.0
  27. float iRadiusTDamagePipe = 700.0
  28. float iRadiusTFlingPipe = 700.0
  29.  
  30. //Charger
  31. int iDamageGrenadeLauncherC = 500
  32. float iPowerCFling = 300.0
  33. float iRadiusCDamage = 400.0
  34. float iRadiusCFling = 300.0
  35.  
  36. //Charger Pipe
  37. int iDamagePipeC = 400;
  38. float iPowerCFlingPipe = 300.0
  39. float iRadiusCDamagePipe = 400.0
  40. float iRadiusCFlingPipe = 300.0
  41.  
  42. //Other Inf
  43. int iDamageGrenadeLauncherI = 500
  44. float iPowerIFling = 150.0
  45. float iRadiusIDamage = 200.0
  46. float iRadiusIFling = 400.0
  47.  
  48. //Other Inf Pipe
  49. int iDamagePipeI = 500;
  50. float iPowerIFlingPipe = 150.0
  51. float iRadiusIDamagePipe = 200.0
  52. float iRadiusIFlingPipe = 400.0
  53.  
  54. Handle sdkCallPushPlayer;
  55.  
  56. public OnPluginStart()
  57. {
  58. Handle hGameConf = LoadGameConfigFile("gamedata_stager");
  59. if( hGameConf == null )
  60. SetFailState("Couldn't find the offsets and signatures file. Please, check that it is installed correctly.");
  61. StartPrepSDKCall(SDKCall_Static);
  62. if( PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "CTerrorPlayer_OnStaggered") == false )
  63. SetFailState("Could not load the \"CTerrorPlayer_OnStaggered\" gamedata signature.");
  64. PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  65. PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  66. PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  67. PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  68. PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer);
  69. PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
  70. PrepSDKCall_SetReturnInfo(SDKType_CBaseEntity, SDKPass_Pointer);
  71. sdkCallPushPlayer = EndPrepSDKCall();
  72. if( sdkCallPushPlayer == null )
  73. SetFailState("Could not prep the \"CTerrorPlayer_OnStaggered\" function.");
  74. }
  75.  
  76. public OnEntityDetroyed(entity)
  77. {
  78. if(IsValidEntity(entity))
  79. {
  80. char sCls[32]
  81. GetEntityClassname(entity, sCls, sizeof(sCls))
  82. if(StrEqual(sCls, "grenade_launcher_projectile"))
  83. {
  84. for(int i = 1; i <= MaxClients; ++i)
  85. {
  86. if(IsValidClient(i))
  87. {
  88. float vPos[3], vDamager[3];
  89. GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vDamager);
  90. GetEntPropVector(i, Prop_Send, "m_vecOrigin", vPos);
  91. float fTargetDistance = GetVectorDistance(vDamager, vPos);
  92.  
  93. if(GetClientTeam(i) == 3)
  94. {
  95. int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
  96. if (vClass == 8)
  97. {
  98. if (!IsVisibleTo(vDamager, vPos)) return;
  99. if (fTargetDistance > iRadiusTDamage)
  100. {
  101. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  102. ForceDamageEntity(iOwn, iDamageGrenadeLauncherT, i)
  103. }
  104. if (fTargetDistance > iRadiusTFling)
  105. {
  106. Fly(entity, i, iPowerTFling)
  107. }
  108. }
  109. else if (vClass == 6)
  110. {
  111. if (!IsVisibleTo(vDamager, vPos)) return;
  112. if (fTargetDistance > iRadiusCDamage)
  113. {
  114. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  115. ForceDamageEntity(iOwn, iDamageGrenadeLauncherC, i)
  116. }
  117. if (fTargetDistance > iRadiusCFling)
  118. {
  119. Fly(entity, i, iPowerCFling)
  120. }
  121. }
  122. else
  123. {
  124. if (!IsVisibleTo(vDamager, vPos)) return;
  125. if (fTargetDistance > iRadiusIDamage)
  126. {
  127. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  128. ForceDamageEntity(iOwn, iDamageGrenadeLauncherI, i)
  129. }
  130. if (fTargetDistance > iRadiusIFling)
  131. {
  132. Fly(entity, i, iPowerIFling)
  133. }
  134. }
  135. }
  136. else
  137. {
  138. if (!IsVisibleTo(vDamager, vPos)) return;
  139. if (fTargetDistance > iRadiusSdie)
  140. {
  141. ForcePlayerSuicide(i)
  142. }
  143. if (fTargetDistance > iRadiusSFling)
  144. {
  145. Fly(entity, i, iPowerSFling)
  146. }
  147. if (fTargetDistance > iRadiusSDamage)
  148. {
  149. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  150. int iDamage = RoundToCeil(fTargetDistance - iDamageGrenadeLauncherS)
  151. ForceDamageEntity(iOwn, iDamage, i)
  152. }
  153. }
  154. }
  155. }
  156. }
  157. else if(StrEqual(sCls, "pipe_bomb_projectile"))
  158. {
  159. for(int i = 1; i <= MaxClients; ++i)
  160. {
  161. if(IsValidClient(i))
  162. {
  163. float vPos[3], vDamager[3];
  164. GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vDamager);
  165. GetEntPropVector(i, Prop_Send, "m_vecOrigin", vPos);
  166. float fTargetDistance = GetVectorDistance(vDamager, vPos);
  167.  
  168. if(GetClientTeam(i) == 3)
  169. {
  170. int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
  171. if (vClass == 8)
  172. {
  173. if (!IsVisibleTo(vDamager, vPos)) return;
  174. if (fTargetDistance > iRadiusTDamagePipe)
  175. {
  176. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  177. ForceDamageEntity(iOwn, iDamagePipeT, i)
  178. }
  179. if (fTargetDistance > iRadiusTFlingPipe)
  180. {
  181. Fly(entity, i, iPowerTFlingPipe)
  182. }
  183. }
  184. else if (vClass == 6)
  185. {
  186. if (!IsVisibleTo(vDamager, vPos)) return;
  187. if (fTargetDistance > iRadiusCDamagePipe)
  188. {
  189. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  190. ForceDamageEntity(iOwn, iDamagePipeC, i)
  191. }
  192. if (fTargetDistance > iRadiusCFlingPipe)
  193. {
  194. Fly(entity, i, iPowerCFlingPipe)
  195. }
  196. }
  197. else
  198. {
  199. if (!IsVisibleTo(vDamager, vPos)) return;
  200. if (fTargetDistance > iRadiusIDamagePipe)
  201. {
  202. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  203. ForceDamageEntity(iOwn, iDamagePipeI, i)
  204. }
  205. if (fTargetDistance > iRadiusIFlingPipe)
  206. {
  207. Fly(entity, i, iPowerIFlingPipe)
  208. }
  209. }
  210. }
  211. else
  212. {
  213. if (!IsVisibleTo(vDamager, vPos)) return;
  214. if (fTargetDistance > iRadiusSdiePipe)
  215. {
  216. ForcePlayerSuicide(i)
  217. }
  218. if (fTargetDistance > iRadiusSFlingPipe)
  219. {
  220. Fly(entity, i, iPowerSFlingPipe)
  221. }
  222. if (fTargetDistance > iRadiusSDamagePipe)
  223. {
  224. int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  225. int iDamage = RoundToCeil(fTargetDistance - iDamagePipeS)
  226. ForceDamageEntity(iOwn, iDamage, i)
  227. }
  228. }
  229. }
  230. }
  231. }
  232. }
  233. }
  234.  
  235. stock void ForceDamageEntity(int causer, int damage, int victim) // thanks to 达斯*维达
  236. {
  237. float victim_origin[3];
  238. char rupture[32];
  239. char damage_victim[32];
  240. IntToString(damage, rupture, sizeof(rupture));
  241. Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);
  242. GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);
  243. int entity = CreateEntityByName("point_hurt");
  244. DispatchKeyValue(victim, "targetname", damage_victim);
  245. DispatchKeyValue(entity, "DamageTarget", damage_victim);
  246. DispatchKeyValue(entity, "Damage", rupture);
  247. DispatchSpawn(entity);
  248. TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);
  249. AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);
  250. DispatchKeyValue(entity, "classname", "point_hurt");
  251. DispatchKeyValue(victim, "targetname", "null");
  252. AcceptEntityInput(entity, "Kill");
  253. }
  254.  
  255. static bool IsVisibleTo(float position[3], float targetposition[3])
  256. {
  257. float vAngles[3], vLookAt[3];
  258.  
  259. MakeVectorFromPoints(position, targetposition, vLookAt); // compute vector from start to target
  260. GetVectorAngles(vLookAt, vAngles); // get angles from vector for trace
  261.  
  262. // execute Trace
  263. Handle trace = TR_TraceRayFilterEx(position, vAngles, MASK_SHOT, RayType_Infinite, _TraceFilter);
  264.  
  265. bool isVisible = false;
  266. if (TR_DidHit(trace))
  267. {
  268. float vStart[3];
  269. TR_GetEndPosition(vStart, trace); // retrieve our trace endpoint
  270.  
  271. if ((GetVectorDistance(position, vStart, false) + 25.0) >= GetVectorDistance(position, targetposition))
  272. {
  273. isVisible = true; // if trace ray length plus tolerance equal or bigger absolute distance, you hit the target
  274. }
  275. }
  276.  
  277. return isVisible;
  278. }
  279.  
  280. public bool _TraceFilter(int entity, int contentsMask)
  281. {
  282. if (!entity || entity <= MaxClients || !IsValidEntity(entity)) // dont let WORLD, or invalid entities be hit
  283. {
  284. return false;
  285. }
  286. return true;
  287. }
  288. public Fly(explosion, int target, float power)
  289. {
  290. if(target <= 0 || !IsValidEntity(target) || !IsValidEdict(target)) return;
  291.  
  292. float targetPos[3], explosionPos[3], traceVec[3], resultingFling[3];
  293.  
  294. GetEntPropVector(target, Prop_Data, "m_vecOrigin", targetPos);
  295. GetEntPropVector(explosion, Prop_Data,"m_vecOrigin", explosionPos);
  296.  
  297. power = power - GetVectorDistance(targetPos,explosionPos);
  298.  
  299. if(power < 1)
  300. return;
  301.  
  302. MakeVectorFromPoints(explosionPos, targetPos, traceVec);
  303. GetVectorAngles(traceVec, resultingFling);
  304.  
  305. resultingFling[0] = Cosine(DegToRad(resultingFling[1])) * power;
  306. resultingFling[1] = Sine(DegToRad(resultingFling[1])) * power;
  307. resultingFling[2] = power + (power * 0.5);
  308.  
  309. if (GetClientTeam(target) == 2)
  310. {
  311. SDKCall(sdkCallPushPlayer, target, resultingFling, 76, target, 2.0);
  312. }
  313. else
  314. {
  315. SDKCall(sdkCallPushPlayer, target, resultingFling, 2, target, 2.0);
  316. }
  317.  
  318. }
  319.  
  320. stock bool IsValidClient(int client)
  321. {
  322. if ( client < 1 || client > MaxClients ) return false;
  323. if ( !IsClientConnected( client )) return false;
  324. if ( !IsClientInGame( client )) return false;
  325. if ( !IsPlayerAlive( client )) return false;
  326. return true;
  327. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement