2. [ZP] Anti Infect Bomb
3. - other name -
4. Gas Mask
5. Description:
6. [ Removes bombs that is thrown at zombie ]
7. [ (it will remove everything in range of 150) ]
8. Credits to :
9. [ AmineKyo ]
10. [ Nick Haldem ]
11. [ Excalibur ]
12. [ micapat ]
13. [ Y060N ]
14. Version :
15. [2.1 - Final modifying]
16. */
17. #include < amxmodx >
18. #include < hamsandwich >
19. #include < engine >
20. #include < zombieplague >
21. #define _PLUGIN "[ZP] Extra item: Gas Mask"
22. #define _VERSION "2.1"
23. #define _AUTHOR "H.RED.ZONE"
24. #define _MarkPlayerInMask(%0) _bitPlayerInMask |= (1 << (%0 & 31))
25. #define _ClearPlayerInMask(%0) _bitPlayerInMask &= ~(1 << (%0 & 31))
26. #define _IsPlayerInMask(%0) _bitPlayerInMask & (1 << (%0 & 31))
27. #define _MarkPlayerConnected(%0) _bitPlayerConnected |= (1 << (%0 & 31))
28. #define _ClearPlayerConnected(%0) _bitPlayerConnected &= ~(1 << (%0 & 31))
29. #define _IsPlayerConnected(%0) _bitPlayerConnected & (1 << (%0 & 31))
30. #define _MarkPlayerAlive(%0) _bitPlayerAlive |= (1 << (%0 & 31))
31. #define _ClearPlayerAlive(%0) _bitPlayerAlive &= ~(1 << (%0 & 31))
32. #define _IsPlayerAlive(%0) _bitPlayerAlive & (1 << (%0 & 31))
33. #define EV_INT_nadetype EV_INT_flTimeStepSound
34. #define NADETYPE_INFECTION 1111
35. #define COST 90 // Item Cost
36. new g_itemid_buyremoverh
37. new g_icon
38. new _pcvar_range
39. ,_pcvar_after_remove
40. ,_pcvar_prefix
41. new _bitPlayerInMask
42. ,_bitPlayerAlive
43. ,_bitPlayerConnected
44. new g_MsgSayText
45. ,g_MaxPlayers
46. new const plr_command[][] = {
47. "say /mask",
48. "say_team /mask"
49. }
50. public plugin_init() {
51. register_plugin( "[ZP] Extra item: Gas Mask", "2.1", "H.RED.ZONE" )
52. RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
53. RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn", 1 )
54. RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade", 1)
55. g_itemid_buyremoverh = zp_register_extra_item("Gazmaszk \r(Fertozes ellen)" , COST , ZP_TEAM_HUMAN )
56. register_event( "HLTV", "NewRound", "a", "1=0", "2=0" )
57. for ( new Index; Index < sizeof plr_command; Index++)
58. register_clcmd(plr_command[Index], "buy_mask")
59. _pcvar_range = register_cvar( "zp_gas_remover_range", "200" )
60. _pcvar_after_remove = register_cvar( "zp_gas_remover_after", "1" )
61. _pcvar_prefix = register_cvar("zp_gas_mask_prefix", "Mask", 0, 0.0)
62. g_MsgSayText = get_user_msgid("SayText");
63. g_MaxPlayers = get_maxplayers()
64. g_icon = get_user_msgid("StatusIcon")
65. }
66. public zp_extra_item_selected( plr, itemid ) {
67. if ( itemid == g_itemid_buyremoverh ) {
68. if( ~_IsPlayerInMask( plr ) ) {
69. _MarkPlayerInMask( plr )
70. ProtoChat(plr, "Gázmaszkot vásároltál.")
71. Icon_On(plr)
72. }
73. }
74. }
75. public buy_mask(id) {
76. new ammopacks = zp_get_user_ammo_packs(id)
77. if( _IsPlayerInMask( id ) ) {
78. ProtoChat(id, "Felvetted a Gázmaszkot.")
79. }
80. else if( ammopacks > COST) {
81. _MarkPlayerInMask(id)
82. zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - COST);
83. }
84. else {
85. ProtoChat(id, "Most nem vásárolhatsz Gázmaszkot.")
86. }
87. }
88. public fw_ThinkGrenade( entity ) {
89. if( is_valid_ent( entity ) && entity_get_int( entity, EV_INT_nadetype ) == NADETYPE_INFECTION ) {
90. new _cvar_range = get_pcvar_num( _pcvar_range )
91. new _cvar_after_remove = get_pcvar_num( _pcvar_after_remove )
92. for( new id = 1 ; id <= g_MaxPlayers ; id++ ) {
93. if( _IsPlayerAlive( id ) && _IsPlayerInMask( id )) {
94. if( get_entity_distance( entity, id ) <= _cvar_range ) {
95. remove_entity( entity )
96. if( _cvar_after_remove ) {
97. _ClearPlayerInMask( id )
98. Icon_Off(id)
99. ProtoChat(id, "A fertőző gránát melleted robbant és a Gáz Maszkod elrohadt.")
100. }
101. }
102. }
103. }
104. }
105. return HAM_IGNORED;
106. }
107. public NewRound() {
108. _bitPlayerInMask = 0
109. }
110. public client_connect( plr ) {
111. _MarkPlayerConnected( plr )
112. }
113. public client_disconnect( plr ) {
114. _ClearPlayerConnected( plr )
115. Icon_Off( plr )
116. }
117. public zp_user_infected_post( id ) {
118. _ClearPlayerInMask( id )
119. Icon_Off( id )
120. }
121. public zp_user_infected_pre( id ) {
122. _ClearPlayerInMask( id )
123. Icon_Off( id )
124. }
125. public Icon_On(plr) {
126. message_begin( MSG_ONE_UNRELIABLE, g_icon, { 0, 0, 0 }, plr );
127. write_byte( 1 );
128. write_string( "dmg_gas" );
129. write_byte( 0 );
130. write_byte( 255 );
131. write_byte( 0 );
132. message_end( );
133. }
134. public Icon_Off(plr) {
135. message_begin( MSG_ONE_UNRELIABLE, g_icon, { 0, 0, 0 }, plr );
136. write_byte( 0 );
137. write_string( "dmg_gas" );
138. write_byte( 0 );
139. write_byte( 255 );
140. write_byte( 0 );
141. message_end( );
142. }
143. public fw_PlayerKilled(plr, attacker, shouldgib) {
144. if(_IsPlayerConnected(plr)) {
145. _ClearPlayerAlive(plr)
146. }
147. }
148. public fw_PlayerSpawn(plr) {
149. if(_IsPlayerConnected(plr)) {
150. _MarkPlayerAlive(plr)
151. }
152. }
153. ProtoChat (plr, const sFormat[], any:...) {
154. static i; i = plr ? plr : get_player();
155. if ( !i ) {
156. return PLUGIN_HANDLED;
157. }
158. new sPrefix[16];
159. get_pcvar_string(_pcvar_prefix, sPrefix, 15);
160. new sMessage[256];
161. new len = formatex(sMessage, 255, "^x01[^x04%s^x01] ", sPrefix);
162. vformat(sMessage[len], 255-len, sFormat, 3)
163. sMessage[192] = '^0'
164. Make_SayText(plr, i, sMessage)
165. return PLUGIN_CONTINUE;
166. }
167. get_player() {
168. for ( new plr; plr <= g_MaxPlayers; plr++) {
169. if (_IsPlayerConnected(plr)) {
170. return plr;
171. }
172. }
173. return PLUGIN_HANDLED
174. }
175. Make_SayText(Receiver, Sender, sMessage[]) {
176. if (!Sender) {
177. return PLUGIN_HANDLED;
178. }
179. message_begin(Receiver ? MSG_ONE_UNRELIABLE : MSG_ALL, g_MsgSayText, {0,0,0}, Receiver)
180. write_byte(Sender)
181. write_string(sMessage)
182. message_end()
183. return PLUGIN_CONTINUE;
184. }
185. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
186. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang10266\\ f0\\ fs16 \n\\ par }
187. */