HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2. Plugin generated by AMXX-Studio
  3.  
  4. Plugin: ComboSprites
  5. Creator: Chrescoe1
  6. Version: 0.5
  7.  
  8. Changelog:
  9. v.0.1 - First code
  10. v.0.2 - First Release
  11. v.0.3 - 0.4 - Testing...
  12. v.0.5 - BugFixing - optimize code - New Release
  13.  
  14.  
  15.  
  16. */
  17.  
  18. #include <amxmodx>
  19. #include <fakemeta>
  20.  
  21. #define PLUGIN "ComboSprites"
  22. #define VERSION "0.5"
  23. #define AUTHOR "Chrescoe1" //Thanks for sprites Thomas von Winkler
  24.  
  25.  
  26. //Cvar's
  27. const Float:ComboTime=5.0 //Time to combo ending
  28.  
  29.  
  30. //Engine forward register
  31. native register_think(const classname[],const func[])
  32.  
  33. //Resource
  34. new const sprite_score[]="sprites/npc/combos1-19.spr"
  35. new const sprite_bonus[]="sprites/npc/ef_zombiekill.spr"
  36. new const sprite_classname[]="ef_combo"
  37.  
  38. new info_target
  39. new sprindex_combo[33],sprindex_head[33],sprindex_knife[33],spriteindex_grenade[33],Float:LastKill[33],kill_count[33]
  40.  
  41. enum
  42. {
  43.  
  44. Combo=0,
  45. Head,
  46. Knife,
  47. Grenade
  48. }
  49.  
  50. public plugin_precache()precache_model(sprite_score),precache_model(sprite_bonus)
  51. public plugin_init()
  52. {
  53. register_plugin(PLUGIN, VERSION, AUTHOR)
  54.  
  55. info_target=engfunc(EngFunc_AllocString, "info_target")
  56. register_think(sprite_classname,"delete")
  57.  
  58. register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
  59.  
  60. // Add your code here...
  61. }
  62. //Engine
  63. public delete(ent)if(pev_valid(ent))engfunc(EngFunc_RemoveEntity, ent)
  64.  
  65. //Msg
  66. public message_DeathMsg()
  67. {
  68. static Weapon_Msg[16], attacker, victim,head,bool:grenade
  69. attacker=read_data(1)
  70. victim=read_data(2)
  71. head=read_data(3)
  72. read_data(4,Weapon_Msg,charsmax(Weapon_Msg))
  73. //client_print(0,print_chat,"%d %d %d %s",attacker,victim,head,Weapon_Msg) //my test message
  74.  
  75. //Killing with grenade?
  76. contain(Weapon_Msg,"grenade")!=-1?(grenade=true):(grenade=false)
  77.  
  78. if(!is_user_connected(attacker))return
  79. if(!is_user_connected(victim))return
  80.  
  81. static Float:Origin[3],Float:RGB[3],i
  82. pev(victim,pev_origin,Origin);Origin[2]=Origin[2]+90.0
  83.  
  84. //Random color
  85. for(i=0;i<3;i++)RGB[i]=random_float(0.0,255.0)
  86.  
  87. //Don't dark color!
  88. if(RGB[0]<150.0&&RGB[1]<150.0&&RGB[2]<150.0)RGB[random_num(0,2)]=255.0
  89.  
  90. //Remove old sprites
  91. static ent
  92. ent=sprindex_head[attacker];if(ef_valid(ent,attacker))engfunc(EngFunc_RemoveEntity, ent)
  93. ent=sprindex_knife[attacker];if(ef_valid(ent,attacker))engfunc(EngFunc_RemoveEntity, ent)
  94. if(!grenade) //Don't remove old sprites after GrenadeKill
  95. {
  96. ent=sprindex_combo[attacker];if(ef_valid(ent,attacker))engfunc(EngFunc_RemoveEntity, ent)
  97. ent=spriteindex_grenade[attacker];if(ef_valid(ent,attacker))engfunc(EngFunc_RemoveEntity, ent)
  98. }
  99. static Float:gametime;gametime=get_gametime()
  100. if(LastKill[attacker]-gametime>0.0)kill_count[attacker]++;else kill_count[attacker]=1
  101. LastKill[attacker]=gametime+ComboTime
  102.  
  103. //Combo Sprite
  104. sprindex_combo[attacker]=ef_spr(Combo,Origin,kill_count[attacker]<20?(kill_count[attacker]-1.0):(19.0),RGB,attacker)
  105.  
  106. //Bonus Sprite
  107. RGB[0]=255.0;RGB[1]=0.0;RGB[2]=0.0 //Red Color!
  108. if (grenade)
  109. Origin[2]=Origin[2]-30.0,
  110. spriteindex_grenade[attacker]=ef_spr(Grenade,Origin,2.0,RGB,attacker)
  111. else
  112. {
  113. if(head)
  114. Origin[2]=Origin[2]-30.0,
  115. sprindex_head[attacker]=ef_spr(Head,Origin,0.0,RGB,attacker)
  116. if (contain(Weapon_Msg,"knife")!=-1)
  117. Origin[2]=Origin[2]-30.0,
  118. sprindex_knife[attacker]=ef_spr(Knife,Origin,1.0,RGB,attacker)
  119. }
  120. }
  121. //Stock
  122. stock ef_spr(type,Float:Origin[3],Float:frame,Float:Color[3],attacker)
  123. {
  124. new ient =
  125. engfunc(EngFunc_CreateNamedEntity, info_target)
  126. switch(type)
  127. {
  128. case Combo:engfunc(EngFunc_SetModel,ient, sprite_score)
  129. case Head:engfunc(EngFunc_SetModel,ient, sprite_bonus)
  130. case Knife:engfunc(EngFunc_SetModel,ient, sprite_bonus)
  131. case Grenade:engfunc(EngFunc_SetModel,ient, sprite_bonus)
  132. }
  133. set_pev(ient, pev_classname, sprite_classname)
  134. set_pev(ient, pev_movetype, MOVETYPE_NOCLIP)
  135. set_pev(ient,pev_gravity,0.0001)
  136. set_pev(ient,pev_solid,SOLID_TRIGGER)
  137. set_pev(ient, pev_rendermode, kRenderTransAdd)
  138. set_pev(ient, pev_renderamt, 250.0)
  139. set_pev(ient, pev_nextthink,get_gametime()+ComboTime)
  140. set_pev(ient,pev_origin,Origin)
  141. set_pev(ient,pev_iuser1,attacker)
  142. set_pev(ient,pev_rendercolor,Color)
  143. set_pev(ient, pev_scale, 0.4)
  144. set_pev(ient, pev_framerate, 0.0)
  145. set_pev(ient, pev_frame,frame)
  146. return ient
  147. }
  148. stock bool: ef_valid(ent,id)
  149. {
  150. if(!ent||!id)return false
  151. if(!pev_valid(ent))return false
  152. if(pev(ent,pev_iuser1)!=id)return false
  153.  
  154. static ClassName[30]
  155. pev(ent, pev_classname, ClassName, charsmax(ClassName))
  156. if (contain(ClassName, sprite_classname ) != -1)return true
  157. return false
  158. }
  159.