HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Plugin generated by AMXX-Studio */
  2.  
  3. #include <amxmodx>
  4. #include <amxmisc>
  5. #include <zombieplague>
  6. #include <fakemeta>
  7. #include <hamsandwich>
  8.  
  9. #define PLUGIN "ZP: Bat"
  10. #define VERSION "1.0"
  11. #define AUTHOR "Sn!ff3r"
  12.  
  13. #define fm_precache_model(%1) engfunc(EngFunc_PrecacheModel,%1)
  14. #define fm_precache_sound(%1) engfunc(EngFunc_PrecacheSound,%1)
  15. #define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1)
  16. #define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1)
  17. #define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
  18. #define fm_set_user_gravity(%1,%2) set_pev(%1,pev_gravity,%2)
  19.  
  20. #define PET_FLAG pev_flTimeStepSound
  21. #define PET_KILLED 389
  22.  
  23. static const pet_model[] = "models/stukabat.mdl"
  24. static const pet_sounds[][] = { "bullchicken/bc_die1.wav", "bullchicken/bc_die2.wav", "bullchicken/bc_die3.wav", "bullchicken/bc_idle1.wav", "bullchicken/bc_pain3.wav" }
  25. static const pet_idle = 13
  26. static const pet_run = 13
  27. static const pet_die = 5
  28. static const pet_cost = 5
  29. static const Float:pet_idle_speed = 0.5
  30. static const Float:pet_run_speed = 13.0
  31. static const Float:player_gravity = 0.8
  32.  
  33. new item_id
  34. new item_pet[33]
  35. new item_have[33]
  36. new item_at_spawn[33]
  37. new Float:item_leaptime[33]
  38.  
  39. new maxplayers
  40.  
  41. public plugin_init()
  42. {
  43. register_plugin(PLUGIN, VERSION, AUTHOR)
  44.  
  45. register_event("DeathMsg","DeathMsg","a")
  46. register_event("HLTV","HLTV", "a","1=0", "2=0")
  47.  
  48. register_forward(FM_Think,"FM_Think_hook")
  49. register_forward(FM_PlayerPreThink, "FM_PlayerPreThink_hook")
  50.  
  51. RegisterHam(Ham_Spawn, "player", "player_spawn", 1)
  52. RegisterHam(Ham_Touch, "info_target", "player_touch")
  53.  
  54. register_dictionary("zombieaddons.txt")
  55.  
  56. item_id = zp_register_extra_item("Bat", pet_cost, ZP_TEAM_HUMAN)
  57.  
  58. maxplayers = get_maxplayers()
  59. }
  60.  
  61. public plugin_precache()
  62. {
  63. new i = 0
  64.  
  65. for(i = 0; i < sizeof pet_sounds; i++)
  66. fm_precache_sound(pet_sounds[i])
  67.  
  68. fm_precache_model(pet_model)
  69. }
  70.  
  71. public HLTV()
  72. {
  73. new entid = -1
  74. while((entid = fm_find_ent_by_class(entid, "zp_bat")))
  75. {
  76. if(pev(entid,PET_FLAG) == PET_KILLED)
  77. {
  78. fm_remove_entity(entid)
  79. }
  80. }
  81. }
  82.  
  83. public DeathMsg()
  84. {
  85. new id = read_data(2)
  86.  
  87. if(item_have[id])
  88. {
  89. kill_pet(id)
  90. }
  91. }
  92.  
  93. public zp_user_infected_post(id,infector)
  94. {
  95. if(item_have[id])
  96. {
  97. kill_pet(id)
  98. }
  99. }
  100.  
  101. public kill_pet(id)
  102. {
  103. if(pev_valid(item_pet[id]))
  104. {
  105. set_pev(item_pet[id],pev_sequence,pet_die)
  106. set_pev(item_pet[id],pev_gaitsequence,pet_die)
  107. set_pev(item_pet[id],pev_framerate,1.0)
  108.  
  109. set_pev(item_pet[id],PET_FLAG,PET_KILLED)
  110.  
  111. fm_drop_to_floor(item_pet[id])
  112.  
  113. item_have[id] = 0
  114. }
  115. item_pet[id] = 0
  116. }
  117.  
  118. public zp_extra_item_selected(player, itemid)
  119. {
  120. if(itemid == item_id)
  121. {
  122. create_pet(player)
  123. }
  124. }
  125.  
  126. public player_spawn(player)
  127. {
  128. if(is_user_alive(player))
  129. {
  130. if(item_have[player])
  131. {
  132. set_task(get_cvar_float("zp_delay") + 1.0,"new_round_gravity",player)
  133. }
  134.  
  135. else if(item_at_spawn[player])
  136. {
  137. create_pet(player)
  138. item_at_spawn[player] = 0
  139. }
  140. }
  141. }
  142.  
  143. public player_touch(this,idother)
  144. {
  145. if(!this || !idother)
  146. return HAM_IGNORED
  147.  
  148. new classname[32]
  149. pev(this,pev_classname,classname,31)
  150. if(equal(classname,"zp_bat") && is_a_player(idother) && !item_have[idother] && !zp_get_user_zombie(idother))
  151. {
  152. if(pev(this,PET_FLAG) == PET_KILLED)
  153. {
  154. remove_pet(this)
  155. create_pet(idother)
  156. }
  157. }
  158. return HAM_IGNORED
  159. }
  160.  
  161. public new_round_gravity(id)
  162. {
  163. fm_set_user_gravity(id,player_gravity)
  164. }
  165.  
  166. public create_pet(id)
  167. {
  168. if(item_have[id])
  169. {
  170. client_print(id,print_chat,"%L",LANG_PLAYER,"ALREADY_HAVE_BAT")
  171. return PLUGIN_HANDLED
  172. }
  173. else if(!is_user_alive(id))
  174. {
  175. client_print(id,print_chat,"%L",LANG_PLAYER,"BAT_ON_NEXT_SPAWN")
  176. item_at_spawn[id] = 1
  177. return PLUGIN_HANDLED
  178. }
  179. else
  180. {
  181. item_pet[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString,"info_target"))
  182. set_pev(item_pet[id],pev_classname,"zp_bat")
  183.  
  184. engfunc(EngFunc_SetModel,item_pet[id],pet_model)
  185.  
  186. new Float:origin[3]
  187. pev(id,pev_origin,origin)
  188.  
  189. set_pev(item_pet[id],pev_origin,origin)
  190. set_pev(item_pet[id],pev_solid,SOLID_TRIGGER)
  191. set_pev(item_pet[id],pev_movetype,MOVETYPE_FLY)
  192. set_pev(item_pet[id],pev_owner,33)
  193. set_pev(item_pet[id],pev_nextthink,1.0)
  194. set_pev(item_pet[id],pev_sequence,0)
  195. set_pev(item_pet[id],pev_gaitsequence,0)
  196. set_pev(item_pet[id],pev_framerate,1.0)
  197.  
  198. fm_set_user_gravity(id,player_gravity)
  199.  
  200. engfunc(EngFunc_EmitSound,item_pet[id],CHAN_AUTO,pet_sounds[random_num(0,sizeof pet_sounds - 1)],1.0, 1.2, 0, PITCH_NORM)
  201.  
  202. client_print(id,print_chat,"%L",LANG_PLAYER,"GIVE_BAT")
  203.  
  204. item_have[id] = 1
  205. }
  206. return PLUGIN_HANDLED
  207. }
  208.  
  209. public FM_Think_hook(ent)
  210. {
  211. for(new i = 0; i <= maxplayers; i++)
  212. {
  213. if(ent == item_pet[i])
  214. {
  215. static Float:origin[3]
  216. static Float:origin2[3]
  217. static Float:velocity[3]
  218. pev(ent,pev_origin,origin2)
  219. get_offset_origin_body(i,Float:{50.0,0.0,0.0},origin)
  220.  
  221. if(get_distance_f(origin,origin2) > 300.0)
  222. {
  223. set_pev(ent,pev_origin,origin)
  224. }
  225.  
  226. else if(get_distance_f(origin,origin2) > 80.0)
  227. {
  228. get_speed_vector(origin2,origin,250.0,velocity)
  229. set_pev(ent,pev_velocity,velocity)
  230. if(pev(ent,pev_sequence) != pet_run || pev(ent,pev_framerate) != pet_run_speed)
  231. {
  232. set_pev(ent,pev_sequence,pet_run)
  233. set_pev(ent,pev_gaitsequence,pet_run)
  234. set_pev(ent,pev_framerate,pet_run_speed)
  235. }
  236. }
  237.  
  238. else if(get_distance_f(origin,origin2) < 75.0)
  239. {
  240. if(pev(ent,pev_sequence) != pet_idle || pev(ent,pev_framerate) != pet_idle_speed)
  241. {
  242. set_pev(ent,pev_sequence,pet_idle)
  243. set_pev(ent,pev_gaitsequence,pet_idle)
  244. set_pev(ent,pev_framerate,pet_idle_speed)
  245. }
  246. set_pev(ent,pev_velocity,Float:{0.0,0.0,0.0})
  247. }
  248. pev(i,pev_origin,origin)
  249. origin[2] = origin2[2]
  250. entity_set_aim(ent,origin)
  251. set_pev(ent,pev_nextthink,1.0)
  252. break
  253. }
  254. }
  255. }
  256.  
  257. public FM_PlayerPreThink_hook(id)
  258. {
  259. if (!is_user_alive(id))
  260. return
  261.  
  262. if(allowed_leap(id))
  263. {
  264. static Float:velocity[3]
  265. velocity_by_aim(id, get_cvar_num("zp_leap_force"), velocity)
  266.  
  267. velocity[2] = get_cvar_float("zp_leap_height")
  268.  
  269. set_pev(id, pev_velocity, velocity)
  270.  
  271. item_leaptime[id] = get_gametime()
  272. }
  273. }
  274.  
  275. public allowed_leap(id)
  276. {
  277. if(zp_get_user_zombie(id))
  278. return false
  279.  
  280. if(!item_have[id])
  281. return false
  282.  
  283. if (!(pev(id, pev_flags) & FL_ONGROUND) || fm_get_speed(id) < 80)
  284. return false
  285.  
  286. static buttons
  287. buttons = pev(id, pev_button)
  288.  
  289. if (!is_user_bot(id) && (!(buttons & IN_JUMP) || !(buttons & IN_DUCK)))
  290. return false
  291.  
  292. if (get_gametime() - item_leaptime[id] < get_cvar_float("zp_leap_cooldown"))
  293. return false
  294.  
  295. return true
  296. }
  297.  
  298. public is_a_player(ent)
  299. {
  300. if(ent > 0 && ent < 33)
  301. return true
  302.  
  303. return false
  304. }
  305.  
  306. public remove_pet(ent)
  307. {
  308. if(pev_valid(ent))
  309. {
  310. fm_remove_entity(ent)
  311. }
  312. }
  313.  
  314. // Get entity's speed (from fakemeta_util)
  315. stock fm_get_speed(entity)
  316. {
  317. static Float:velocity[3]
  318. pev(entity, pev_velocity, velocity)
  319.  
  320. return floatround(vector_length(velocity));
  321. }
  322. stock get_offset_origin_body(ent,const Float:offset[3],Float:origin[3])
  323. {
  324. if(!pev_valid(ent))
  325. return 0;
  326.  
  327. new Float:angle[3]
  328. pev(ent,pev_angles,angle)
  329.  
  330. pev(ent,pev_origin,origin)
  331.  
  332. origin[0] += floatcos(angle[1],degrees) * offset[0]
  333. origin[1] += floatsin(angle[1],degrees) * offset[0]
  334.  
  335. origin[1] += floatcos(angle[1],degrees) * offset[1]
  336. origin[0] += floatsin(angle[1],degrees) * offset[1]
  337.  
  338. return 1;
  339. }
  340.  
  341. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  342. {
  343. new_velocity[0] = origin2[0] - origin1[0]
  344. new_velocity[1] = origin2[1] - origin1[1]
  345. new_velocity[2] = origin2[2] - origin1[2]
  346. new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  347. new_velocity[0] *= num
  348. new_velocity[1] *= num
  349. new_velocity[2] *= num
  350.  
  351. return 1;
  352. }
  353.  
  354. stock entity_set_aim(ent,const Float:origin2[3],bone=0)
  355. {
  356. if(!pev_valid(ent))
  357. return 0;
  358.  
  359. static Float:origin[3]
  360. origin[0] = origin2[0]
  361. origin[1] = origin2[1]
  362. origin[2] = origin2[2]
  363.  
  364. static Float:ent_origin[3], Float:angles[3]
  365.  
  366. if(bone)
  367. engfunc(EngFunc_GetBonePosition,ent,bone,ent_origin,angles)
  368. else
  369. pev(ent,pev_origin,ent_origin)
  370.  
  371. origin[0] -= ent_origin[0]
  372. origin[1] -= ent_origin[1]
  373. origin[2] -= ent_origin[2]
  374.  
  375. static Float:v_length
  376. v_length = vector_length(origin)
  377.  
  378. static Float:aim_vector[3]
  379. aim_vector[0] = origin[0] / v_length
  380. aim_vector[1] = origin[1] / v_length
  381. aim_vector[2] = origin[2] / v_length
  382.  
  383. static Float:new_angles[3]
  384. vector_to_angle(aim_vector,new_angles)
  385.  
  386. new_angles[0] *= -1
  387.  
  388. if(new_angles[1]>180.0) new_angles[1] -= 360
  389. if(new_angles[1]<-180.0) new_angles[1] += 360
  390. if(new_angles[1]==180.0 || new_angles[1]==-180.0) new_angles[1]=-179.999999
  391.  
  392. set_pev(ent,pev_angles,new_angles)
  393. set_pev(ent,pev_fixangle,1)
  394.  
  395. return 1;
  396. }
  397.