HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4.  
  5. #define VERSION "1.0.0"
  6.  
  7. #define MAXPLAYERS 32 + 1
  8.  
  9. #define MAX_WEAPONS_INAIR 64
  10.  
  11. #define HANDLER_THINK_TIME 0.01
  12.  
  13. #define MIN_ROT_SPEED 1
  14. #define MAX_ROT_SPEED 7
  15.  
  16. #define MAX_DIFF_FROM_HEAD 10.0
  17.  
  18. #define MIN_TOUCH_GMT 0.1
  19.  
  20. #define NULL 0.0
  21.  
  22. enum Data
  23. {
  24. EntID,
  25. bFirstThink,
  26. RotAngle,
  27. RotSpeed,
  28. WeaponIndex
  29. }
  30.  
  31. enum iCvars
  32. {
  33. BaseSpeed,
  34. UseDamage,
  35. UseThrowing,
  36. DropType,
  37. DropC4,
  38. OnlyUse
  39. }
  40.  
  41. enum fCvars
  42. {
  43. Float:MinBaseDamage,
  44. Float:MaxBaseDamage,
  45.  
  46. Float:HeadMulti
  47. }
  48.  
  49. enum sCvars
  50. {
  51. BaseDamage
  52. }
  53.  
  54. new const Float:g_WeaponWeight[CSW_P90 + 1] = {
  55.  
  56. NULL,
  57. 1.0, //p228
  58. NULL, //shield
  59. 0.7, //scout
  60. NULL, //he
  61. 0.7, //xm1014
  62. 0.75, //c4
  63. 0.9, //mac10
  64. 0.65, //aug
  65. NULL, //smoke
  66. 0.8, //elite
  67. 1.0, //fiveseven
  68. 0.9, //ump45
  69. 0.6, //sg550
  70. 0.7, //galil
  71. 0.7, //famas
  72. 1.0, //usp
  73. 1.0, //glock
  74. 0.5, //awp
  75. 0.9, //mp5
  76. 0.5, //m249
  77. 0.6, //m3
  78. 0.7, //m4a1
  79. 1.0, //tmp
  80. 0.65, //g3sg1
  81. NULL, //flash
  82. 0.9, //deagle
  83. 0.65, //sg552
  84. 0.7, //ak47
  85. NULL, //knife
  86. 0.85 //p90
  87. }
  88.  
  89. new c_sCvars[sCvars]
  90. new c_fCvars[fCvars], Float:g_fCvars[fCvars]
  91. new c_Cvars[iCvars], g_Cvars[iCvars]
  92.  
  93. new g_DeathMsg
  94.  
  95. new g_WeaponsOnGround
  96.  
  97. new g_WeaponData[MAX_WEAPONS_INAIR][Data]
  98. new g_WeaponName[MAX_WEAPONS_INAIR][12]
  99.  
  100. new Float:g_WeaponDropGmt[MAX_WEAPONS_INAIR]
  101. new Float:g_WeaponAngles[MAX_WEAPONS_INAIR][3]
  102.  
  103. new g_HandlerEnt
  104.  
  105. new cp_FF
  106.  
  107. public plugin_init() {
  108.  
  109. register_plugin("Weapon Throwing",VERSION,"shine")
  110.  
  111. register_cvar("weapon_throwing",VERSION,FCVAR_SERVER|FCVAR_SPONLY)
  112.  
  113. c_sCvars[sCvars:BaseDamage] = register_cvar("amx_wp_base_damage","20 40")
  114.  
  115. c_fCvars[fCvars:HeadMulti] = register_cvar("amx_wp_headshot_multi","3.0")
  116.  
  117. c_Cvars[iCvars:DropC4] = register_cvar("amx_wp_throw_c4","0")
  118. c_Cvars[iCvars:OnlyUse] = register_cvar("amx_wp_use_e","1")
  119. c_Cvars[iCvars:DropType] = register_cvar("amx_wp_throw_type","2")
  120. c_Cvars[iCvars:UseDamage] = register_cvar("amx_wp_use_for_damage","1")
  121. c_Cvars[iCvars:BaseSpeed] = register_cvar("amx_wp_base_throw_speed","1000")
  122. c_Cvars[iCvars:UseThrowing] = register_cvar("amx_wp_use_for_throw_speed","1")
  123.  
  124. //Events
  125. register_event("HLTV","RoundStart","a","1=0","2=0")
  126.  
  127. //Ham Forwards
  128. RegisterHam(Ham_Touch,"weaponbox","HookTouch")
  129. RegisterHam(Ham_Spawn,"weaponbox","HookSpawn",1)
  130. RegisterHam(Ham_Think,"info_target","HandlerThink")
  131.  
  132. //Messages
  133. g_DeathMsg = get_user_msgid("DeathMsg")
  134.  
  135. //Cvar Pointers
  136. cp_FF = get_cvar_pointer("mp_friendlyfire")
  137.  
  138. //Load Cvars
  139. LoadCvars()
  140.  
  141. //Make Handler
  142. MakeHandler()
  143. }
  144.  
  145. public MakeHandler() {
  146.  
  147. g_HandlerEnt = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
  148.  
  149. set_pev(g_HandlerEnt,pev_classname,"wpnTHandler")
  150.  
  151. set_pev(g_HandlerEnt,pev_nextthink,get_gametime() + HANDLER_THINK_TIME)
  152. }
  153.  
  154. public HookTouch(Ent,id) {
  155.  
  156. static WeaponID
  157. WeaponID = GetWeaponByEnt(Ent)
  158.  
  159. if(WeaponID > -1) {
  160.  
  161. static Owner
  162. Owner = pev(Ent,pev_owner)
  163.  
  164. if(get_gametime() - g_WeaponDropGmt[WeaponID] <= MIN_TOUCH_GMT && id == Owner) {
  165.  
  166. return HAM_IGNORED
  167. }
  168. else {
  169.  
  170. if
  171. (
  172. Owner != id
  173. &&
  174. is_user_alive(id)
  175. &&
  176. (
  177. (
  178. get_pcvar_num(cp_FF)
  179. &&
  180. get_user_team(id) == get_user_team(Owner)
  181. )
  182. ||
  183. (
  184. get_user_team(id) != get_user_team(Owner)
  185. )
  186. )
  187. ) {
  188.  
  189. static bool:HeadShot
  190. static Float:Vel[3], Float:KnockVel[3], Float:EntOrigin[3], Float:HeadOrigin[3], Float:Damage, Float:rDamage
  191.  
  192. pev(Ent,pev_velocity,Vel)
  193. pev(Ent,pev_origin,EntOrigin)
  194. pev(id,pev_origin,HeadOrigin)
  195.  
  196. set_pev(Ent,pev_velocity,Float:{0.0, 0.0, 0.0})
  197.  
  198. HeadOrigin[2] += (pev(id,pev_button) & IN_DUCK) ? 6.0 : 22.0
  199.  
  200. HeadShot = (floatabs(HeadOrigin[2] - EntOrigin[2]) < MAX_DIFF_FROM_HEAD) ? true : false
  201.  
  202. //30.0 * 1.0 / 1.0 = 30.0
  203. //30.0 * 3.0 / 1.0 = 90.0
  204. //30.0 * 1.0 / 0.5 = 60.0
  205. //20.0 * 1.0 / 0.5 = 40.0
  206. //40.0 * 3.0 / 0.5 = 240.0
  207.  
  208. Damage =
  209. (
  210. random_float(g_fCvars[fCvars:MinBaseDamage],g_fCvars[fCvars:MaxBaseDamage])
  211. ) * (
  212. HeadShot ? (g_fCvars[fCvars:HeadMulti]) : 1.0
  213. ) / (
  214. g_Cvars[iCvars:UseDamage] ? (g_WeaponWeight[g_WeaponData[WeaponID][Data:WeaponIndex]]) : 1.0
  215. )
  216.  
  217. rDamage = get_user_team(id) == get_user_team(Owner) ? Damage / 2.9 : Damage
  218.  
  219. if(pev(id,pev_health) - rDamage <= 0.0) {
  220.  
  221. user_silentkill2(id)
  222.  
  223. message_begin(MSG_ALL,g_DeathMsg)
  224. write_byte(Owner)
  225. write_byte(id)
  226. write_byte(HeadShot ? 1 : 0)
  227. write_string(g_WeaponName[WeaponID])
  228. message_end()
  229. }
  230. else {
  231.  
  232. VecMulti(Vel,KnockVel,0.1)
  233.  
  234. ExecuteHam(Ham_TakeDamage,id,Owner,Owner,Damage,DMG_BULLET)
  235.  
  236. set_pev(id,pev_velocity,KnockVel)
  237. }
  238. }
  239.  
  240. //ClearVec(g_WeaponAngles[WeaponID])
  241.  
  242. g_WeaponAngles[WeaponID][0] = 0.0
  243. g_WeaponAngles[WeaponID][2] = 0.0
  244.  
  245. set_pev(g_WeaponData[WeaponID][Data:EntID],pev_angles,g_WeaponAngles[WeaponID])
  246.  
  247. MoveWeaponIDDown(WeaponID)
  248. }
  249. }
  250.  
  251. return HAM_IGNORED
  252. }
  253.  
  254. public RoundStart() {
  255.  
  256. static i, x
  257.  
  258. for(i = 0; i < MAX_WEAPONS_INAIR; i++) {
  259.  
  260. for(x = 0; x < _:Data; x++) {
  261.  
  262. g_WeaponData[i][Data:x] = 0
  263. }
  264.  
  265. ClearVec(g_WeaponAngles[i])
  266. }
  267.  
  268. g_WeaponsOnGround = 0
  269.  
  270. //Load Cvars
  271. LoadCvars()
  272. }
  273.  
  274. public HookSpawn(Ent) {
  275.  
  276. static Owner
  277. Owner = pev(Ent,pev_owner)
  278.  
  279. if
  280. (
  281. is_user_alive(Owner)
  282. &&
  283. (
  284. (
  285. g_Cvars[iCvars:OnlyUse]
  286. &&
  287. pev(Owner,pev_button) & IN_USE
  288. )
  289. ||
  290. (
  291. !g_Cvars[iCvars:OnlyUse]
  292. )
  293. )
  294. ) {
  295.  
  296. static Float:PlayerAngles[3], Type
  297. pev(Owner,pev_v_angle,PlayerAngles)
  298.  
  299. g_WeaponData[g_WeaponsOnGround][Data:EntID] = Ent
  300. g_WeaponData[g_WeaponsOnGround][Data:bFirstThink] = 1
  301.  
  302. g_WeaponDropGmt[g_WeaponsOnGround] = get_gametime()
  303.  
  304. Type = (g_Cvars[iCvars:DropType] == 2 ? random(2) : g_Cvars[iCvars:DropType])
  305.  
  306. if(Type) {
  307.  
  308. g_WeaponAngles[g_WeaponsOnGround][1] = PlayerAngles[1]
  309. g_WeaponAngles[g_WeaponsOnGround][2] = 90.0
  310.  
  311. g_WeaponData[g_WeaponsOnGround][Data:RotAngle] = 0
  312. g_WeaponData[g_WeaponsOnGround][Data:RotSpeed] = -random_num(MIN_ROT_SPEED,MAX_ROT_SPEED)
  313. }
  314. else {
  315.  
  316. g_WeaponAngles[g_WeaponsOnGround][2] = PlayerAngles[2]
  317.  
  318. g_WeaponData[g_WeaponsOnGround][Data:RotAngle] = 1
  319. g_WeaponData[g_WeaponsOnGround][Data:RotSpeed] = random_num(MIN_ROT_SPEED,MAX_ROT_SPEED)
  320. }
  321.  
  322. g_WeaponsOnGround++
  323. }
  324. }
  325.  
  326. public HandlerThink(Ent) {
  327.  
  328. if(Ent == g_HandlerEnt) {
  329.  
  330. static Item, i
  331.  
  332. for(i = 0; i < g_WeaponsOnGround; i++) {
  333.  
  334. if(pev_valid(g_WeaponData[i][Data:EntID])) {
  335.  
  336. if(g_WeaponData[i][Data:bFirstThink]) {
  337.  
  338. static Float:Vel[3], Float:PlayerVel[3], Model[64], WeaponName[33], Owner
  339.  
  340. pev(g_WeaponData[i][Data:EntID],pev_model,Model,63)
  341.  
  342. replace(Model,63,"models/w_","")
  343. replace(Model,63,".mdl","")
  344. replace(Model,63,"backpack","c4")
  345.  
  346. if(equal(Model,"c4") && !g_Cvars[iCvars:DropC4]) {
  347.  
  348. Item = i + 1
  349.  
  350. continue
  351. }
  352.  
  353. copy(g_WeaponName[i],11,Model)
  354.  
  355. formatex(WeaponName,32,"weapon_%s",Model)
  356.  
  357. Owner = pev(g_WeaponData[i][Data:EntID],pev_owner)
  358.  
  359. pev(Owner,pev_velocity,PlayerVel)
  360.  
  361. g_WeaponData[i][Data:WeaponIndex] = get_weaponid(WeaponName)
  362.  
  363. velocity_by_aim(Owner,floatround(g_Cvars[iCvars:BaseSpeed] * (g_Cvars[iCvars:UseThrowing] == 1 ? (g_WeaponWeight[g_WeaponData[i][Data:WeaponIndex]]) : 1.0)),Vel)
  364.  
  365. VecAdd(Vel,PlayerVel,Vel)
  366.  
  367. set_pev(g_WeaponData[i][Data:EntID],pev_velocity,Vel)
  368.  
  369. g_WeaponData[i][Data:bFirstThink] = 0
  370. }
  371.  
  372. g_WeaponAngles[i][g_WeaponData[i][Data:RotAngle]] += g_WeaponData[i][Data:RotSpeed]
  373.  
  374. if(g_WeaponAngles[i][g_WeaponData[i][Data:RotAngle]] >= float(degrees)) {
  375.  
  376. g_WeaponAngles[i][g_WeaponData[i][Data:RotAngle]] -= float(degrees)
  377. }
  378.  
  379. set_pev(g_WeaponData[i][Data:EntID],pev_angles,g_WeaponAngles[i])
  380. }
  381. }
  382.  
  383. if(Item) {
  384.  
  385. MoveWeaponIDDown(Item - 1)
  386.  
  387. Item = 0
  388. }
  389.  
  390. set_pev(Ent,pev_nextthink,get_gametime() + HANDLER_THINK_TIME)
  391. }
  392. }
  393.  
  394. public user_silentkill2(id) {
  395.  
  396. static MsgBlock
  397. MsgBlock = get_msg_block(g_DeathMsg)
  398.  
  399. set_msg_block(g_DeathMsg,BLOCK_ONCE)
  400. user_kill(id,1)
  401. set_msg_block(g_DeathMsg,MsgBlock)
  402. }
  403.  
  404. LoadCvars() {
  405.  
  406. //Load Cvars
  407.  
  408. static Cvar[10], Damage[2][5], i
  409.  
  410. get_pcvar_string(c_sCvars[sCvars:BaseDamage],Cvar,9)
  411.  
  412. parse(Cvar,Damage[0],4,Damage[1],4)
  413.  
  414. g_fCvars[fCvars:MinBaseDamage] = str_to_float(Damage[0])
  415. g_fCvars[fCvars:MaxBaseDamage] = str_to_float(Damage[1])
  416.  
  417. for(i = 0; i < _:iCvars; i++) g_Cvars[iCvars:i] = get_pcvar_num(c_Cvars[iCvars:i])
  418.  
  419. for(i = 2; i < _:fCvars; i++) g_fCvars[fCvars:i] = get_pcvar_float(c_fCvars[fCvars:i])
  420. }
  421.  
  422. ClearVec(Float:Vec[3]) {
  423.  
  424. Vec[0] = 0.0
  425. Vec[1] = 0.0
  426. Vec[2] = 0.0
  427. }
  428.  
  429. CopyVec(Float:Vec[3],Float:eVec[3]) {
  430.  
  431. eVec[0] = Vec[0]
  432. eVec[1] = Vec[1]
  433. eVec[2] = Vec[2]
  434. }
  435.  
  436. VecMulti(Float:Vec[3],Float:oVec[3],Float:Multi) {
  437.  
  438. oVec[0] = Vec[0] * Multi
  439. oVec[1] = Vec[1] * Multi
  440. oVec[2] = Vec[2] * Multi
  441. }
  442.  
  443. VecAdd(Float:Vec[3],Float:aVec[3],Float:oVec[3]) {
  444.  
  445. oVec[0] = Vec[0] + aVec[0]
  446. oVec[1] = Vec[1] + aVec[1]
  447. oVec[2] = Vec[2] + aVec[2]
  448. }
  449.  
  450. MoveWeaponIDDown(StartFrom) {
  451.  
  452. static i, x
  453.  
  454. for(i = StartFrom; i < g_WeaponsOnGround; i++) {
  455.  
  456. for(x = 0; x < _:Data; x++) {
  457.  
  458. g_WeaponData[i][Data:x] = g_WeaponData[i + 1][Data:x]
  459. }
  460.  
  461. g_WeaponDropGmt[i] = g_WeaponDropGmt[i + 1]
  462.  
  463. copy(g_WeaponName[i + 1],15,g_WeaponName[i])
  464.  
  465. CopyVec(g_WeaponAngles[i + 1],g_WeaponAngles[i])
  466. }
  467.  
  468. g_WeaponsOnGround--
  469. }
  470.  
  471. GetWeaponByEnt(Ent) {
  472.  
  473. static i
  474.  
  475. for(i = 0; i < g_WeaponsOnGround; i++) {
  476.  
  477. if(g_WeaponData[i][Data:EntID] == Ent) return i
  478. }
  479.  
  480. return -1
  481. }
  482. ////
  483.