callbacks.inc 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322
  1. /*
  2. New SA-MP callbacks by Emmet_
  3. Description:
  4. An include which offers a wide selection of callbacks for scripters to use.
  5. Start Date:
  6. 01/26/2014 @ 11:58 AM.
  7. Last Update:
  8. 02/29/2016 @ 12:00 AM
  9. Callbacks:
  10. OnPlayerPause(playerid)
  11. Description: Called when a player is paused.
  12. OnPlayerResume(playerid, time)
  13. Description: Called when a player has resumed.
  14. OnPlayerHoldingKey(playerid, keys)
  15. Description: Called when a player begins holding a specific key.
  16. OnPlayerReleaseKey(playerid, keys)
  17. Description: Called when a player releases a key.
  18. OnPlayerFall(playerid, Float:damage)
  19. Description: Called when a player falls and loses damage.
  20. OnPlayerPacketLoss(playerid, Float:newpacket, Float:oldpacket)
  21. Description: Called when a player experiences packet loss.
  22. OnPlayerUseVending(playerid, type)
  23. Description: Called when a player uses a vending machine.
  24. OnPlayerCrashVehicle(playerid, vehicleid, Float:damage)
  25. Description: Called when a player crashes a vehicle.
  26. OnPlayerFPSChange(playerid, oldfps, newfps)
  27. Description: Called when a player's FPS rate changes.
  28. OnPlayerJackVehicle(playerid, targetid, vehicleid)
  29. Description: Called when a player jacks another player's vehicle.
  30. OnPlayerEmptyWeapon(playerid, weaponid)
  31. Description: Called when a player depletes all ammo in a weapon.
  32. OnPlayerFriendlyFire(playerid, targetid, weaponid)
  33. Description: Called when a player shoots at a teammate.
  34. OnPlayerTargetPlayer(playerid, targetid, weaponid)
  35. Description: Called when a player targets a player with their weapon.
  36. OnPlayerHideCursor(playerid, hovercolor)
  37. Description: Called when a player cancels textdraw selection.
  38. OnPlayerAntiReload(playerid, weaponid)
  39. Description: Called when a player shoots without reloading their weapon.
  40. OnPlayerAnimationPlay(playerid, animlib[], animname[])
  41. Description: Called when an animation is played.
  42. OnPlayerReloadWeapon(playerid, weaponid, ammo)
  43. Description: Called when a player reloads their weapon.
  44. OnPlayerActionChange(playerid, oldaction, newaction)
  45. Description: Called when a player's action change (see action list).
  46. OnPlayerRamPlayer(playerid, driverid, vehicleid, Float:damage)
  47. Description: Called when a player rams another player.
  48. OnPlayerSprayAtVehicle(playerid, vehicleid)
  49. Description: Called wehn a player is spraying at a vehicle.
  50. OnPlayerStartBurn(playerid)
  51. Description: Called when a player is burning from fire.
  52. OnPlayerStopBurn(playerid)
  53. Description: Called when a player stops burning.
  54. OnPlayerStartAim(playerid, weaponid)
  55. Description: Called when a player is aiming a weapon.
  56. OnPlayerStopAim(playerid)
  57. Description: Called when a player stops aiming.
  58. OnPlayerUseCamera(playerid)
  59. Description: Called when a player snaps a picture with a camera (weapon ID: 43).
  60. OnPlayerJump(playerid)
  61. Description: Called when a player jumps (SHIFT key).
  62. OnPlayerUseGarage(playerid, vehicleid, type)
  63. Description: Called when a player uses a Pay'n'Spray or bomb shop.
  64. OnVehicleCreated(vehicleid, color1, color2)
  65. Description: Called when a vehicle is created by the server.
  66. Definitions:
  67. POTENTIAL_CRASH_DAMAGE
  68. Description: The maximum amount of damage a vehicle must take before being ruled as a crash.
  69. MAX_ACCUMULATED_SHOTS
  70. Description: The maximum amount of shots the player fired without reloading before calling OnPlayerAntiReload.
  71. */
  72. /*
  73. native IsPlayerPaused(playerid);
  74. native IsPlayerBurning(playerid);
  75. native IsPlayerAiming(playerid);
  76. native IsPlayerSwimming(playerid);
  77. native IsPlayerSkydiving(playerid);
  78. native IsPlayerJumping(playerid);
  79. native IsPlayerNearVending(playerid);
  80. native IsPlayerNearGarage(playerid, type);
  81. native IsPlayerSprayingVehicle(playerid, vehicleid);
  82. native GetPlayerFPS(playerid);
  83. native GetPlayerAction(playerid);
  84. native GetPlayerPausedTime(playerid);
  85. native GetConnectedTime(playerid);
  86. native GetPlayerPacketLoss(playerid);
  87. */
  88. #if !defined POTENTIAL_CRASH_DAMAGE
  89. #define POTENTIAL_CRASH_DAMAGE 55.0
  90. #endif
  91. #if !defined MAX_ACCUMULATED_SHOTS
  92. #define MAX_ACCUMULATED_SHOTS 5
  93. #endif
  94. #define PLAYER_ACTION_NONE 0
  95. #define PLAYER_ACTION_SHOOTING 1
  96. #define PLAYER_ACTION_SWIMMING 2
  97. #define PLAYER_ACTION_SKYDIVING 3
  98. #define VENDING_TYPE_SPRUNK 1
  99. #define VENDING_TYPE_CANDY 2
  100. #define GARAGE_BOMBSHOP 1
  101. #define GARAGE_PAYNSPRAY 2
  102. // --------------------------------------------------
  103. // Enumerators
  104. // --------------------------------------------------
  105. enum _:e_PLAYER_TICK_ENUM {
  106. e_PLAYER_TICK,
  107. e_PLAYER_LAST_UPDATE,
  108. e_PLAYER_LAST_SHOT,
  109. e_PLAYER_LAST_JUMP,
  110. e_PLAYER_BURN_TICK,
  111. e_PLAYER_VENDING_TICK
  112. };
  113. enum e_PLAYER_DATA {
  114. e_PLAYER_FLAGS:e_bFlags,
  115. Float:e_fPacket,
  116. e_iHoldTimer,
  117. e_iFrames,
  118. e_iDrunk,
  119. e_iMoney,
  120. e_iTargetID,
  121. e_iAction,
  122. e_iAnimIndex,
  123. e_iHoverColor,
  124. e_iShotsFired[12],
  125. e_iLastGun,
  126. e_iLastAmmo,
  127. e_iVehicleID
  128. };
  129. enum e_VEHICLE_DATA {
  130. e_iPanels,
  131. e_iDoors,
  132. e_iLights,
  133. Float:e_fHealth,
  134. Float:e_fSpeed
  135. };
  136. enum e_PLAYER_FLAGS (<<= 1) {
  137. e_bUpdate = 1,
  138. e_bPaused,
  139. e_bHoldKey,
  140. e_bSelectTD,
  141. e_bAnimSet,
  142. e_bKeyPress,
  143. e_bReloading,
  144. e_bBurning,
  145. e_bAiming
  146. };
  147. static
  148. s_aPlayerInfo[MAX_PLAYERS][e_PLAYER_DATA],
  149. s_aPlayerTickInfo[MAX_PLAYERS][e_PLAYER_TICK_ENUM],
  150. s_aVehicleInfo[MAX_VEHICLES][e_VEHICLE_DATA];
  151. // --------------------------------------------------
  152. // Arrays
  153. // --------------------------------------------------
  154. enum e_VENDING_MACHINES {
  155. e_VENDING_MACHINE_TYPE,
  156. Float:e_VENDING_MACHINE_X,
  157. Float:e_VENDING_MACHINE_Y,
  158. Float:e_VENDING_MACHINE_Z,
  159. };
  160. enum e_VEHICLE_GARAGES {
  161. e_VEHICLE_GARAGE_TYPE,
  162. Float:e_VEHICLE_GARAGE_X,
  163. Float:e_VEHICLE_GARAGE_Y,
  164. Float:e_VEHICLE_GARAGE_Z
  165. };
  166. static
  167. s_aVendingMachines[84][e_VENDING_MACHINES] = {
  168. {VENDING_TYPE_SPRUNK, 1153.7322,-1461.0480,15.7969},
  169. {VENDING_TYPE_CANDY, -1455.2928,2592.6465,55.8359}, // candy
  170. {VENDING_TYPE_SPRUNK, 1929.7653,-1772.2271,13.5469}, // sprunk
  171. {VENDING_TYPE_SPRUNK, 2060.3145,-1898.6770,13.5538}, // sprunk
  172. {VENDING_TYPE_CANDY, 2480.6538,-1958.3058,13.5848}, // candy
  173. {VENDING_TYPE_SPRUNK, 2326.2078,-1646.1168,14.8270}, // sprunk
  174. {VENDING_TYPE_SPRUNK, 1788.2222,-1369.4314,15.7578}, // sprunk
  175. {VENDING_TYPE_CANDY, 2153.8999,-1015.4236,62.8926}, // candy
  176. {VENDING_TYPE_CANDY, 2140.4973,-1161.2883,23.9922}, // candy
  177. {VENDING_TYPE_SPRUNK, 2353.1555,-1356.9226,24.3984}, // sprunk
  178. {VENDING_TYPE_SPRUNK, -14.70, 1175.36, 18.95}, //Sprunk
  179. {VENDING_TYPE_SPRUNK, 201.02, -107.62, 0.90}, //Sprunk
  180. {VENDING_TYPE_CANDY, 662.43, -552.16, 15.71}, //Candy
  181. {VENDING_TYPE_CANDY, -76.03, 1227.99, 19.13}, //Candy
  182. {VENDING_TYPE_SPRUNK, 1154.73, -1460.89, 15.16}, //Sprunk
  183. {VENDING_TYPE_SPRUNK, 1277.84, 372.52, 18.95}, //Sprunk
  184. {VENDING_TYPE_CANDY, 1398.84, 2222.61, 10.42}, //Candy
  185. {VENDING_TYPE_SPRUNK, 1520.15, 1055.27, 10.00}, //Sprunk
  186. {VENDING_TYPE_CANDY, 1634.11, -2237.53, 12.89}, //Candy
  187. {VENDING_TYPE_CANDY, 1659.46, 1722.86, 10.22}, //Candy
  188. {VENDING_TYPE_SPRUNK, 1729.79, -1943.05, 12.95}, //Sprunk
  189. {VENDING_TYPE_SPRUNK, 1789.21, -1369.27, 15.16}, //Sprunk
  190. {VENDING_TYPE_SPRUNK, 1928.73, -1772.45, 12.95}, //Sprunk
  191. {VENDING_TYPE_SPRUNK, 2060.12, -1897.64, 12.93}, //Sprunk
  192. {VENDING_TYPE_SPRUNK, 2085.77, 2071.36, 10.45}, //Sprunk
  193. {VENDING_TYPE_CANDY, 2139.52, -1161.48, 23.36}, //Candy
  194. {VENDING_TYPE_CANDY, 2153.23, -1016.15, 62.23}, //Candy
  195. {VENDING_TYPE_CANDY, 2271.73, -76.46, 25.96}, //Candy
  196. {VENDING_TYPE_SPRUNK, 2319.99, 2532.85, 10.22}, //Sprunk
  197. {VENDING_TYPE_SPRUNK, 2325.98, -1645.13, 14.21}, //Sprunk
  198. {VENDING_TYPE_SPRUNK, 2352.18, -1357.16, 23.77}, //Sprunk
  199. {VENDING_TYPE_CANDY, 2480.86, -1959.27, 12.96}, //Candy
  200. {VENDING_TYPE_SPRUNK, 2503.14, 1243.70, 10.22}, //Sprunk
  201. {VENDING_TYPE_SPRUNK, -253.74, 2597.95, 62.24}, //Sprunk
  202. {VENDING_TYPE_CANDY, -253.74, 2599.76, 62.24}, //Candy
  203. {VENDING_TYPE_CANDY, 2647.70, 1129.66, 10.22}, //Candy
  204. {VENDING_TYPE_CANDY, 2845.73, 1295.05, 10.79}, //Candy
  205. {VENDING_TYPE_SPRUNK, -862.83, 1536.61, 21.98}, //Sprunk
  206. {VENDING_TYPE_SPRUNK, -1350.12, 492.29, 10.59}, //Sprunk
  207. {VENDING_TYPE_CANDY, -1350.12, 493.86, 10.59}, //Candy
  208. {VENDING_TYPE_CANDY, -1455.12, 2591.66, 55.23}, //Candy
  209. {VENDING_TYPE_SPRUNK, -1980.79, 142.66, 27.07}, //Sprunk
  210. {VENDING_TYPE_SPRUNK, -2005.65, -490.05, 34.73}, //Sprunk
  211. {VENDING_TYPE_SPRUNK, -2011.14, -398.34, 34.73}, //Sprunk
  212. {VENDING_TYPE_SPRUNK, -2034.46, -490.05, 34.73}, //Sprunk
  213. {VENDING_TYPE_SPRUNK, -2039.85, -398.34, 34.73}, //Sprunk
  214. {VENDING_TYPE_SPRUNK, -2063.27, -490.05, 34.73}, //Sprunk
  215. {VENDING_TYPE_SPRUNK, -2068.56, -398.34, 34.73}, //Sprunk
  216. {VENDING_TYPE_SPRUNK, -2092.09, -490.05, 34.73}, //Sprunk
  217. {VENDING_TYPE_SPRUNK, -2097.27, -398.34, 34.73}, //Sprunk
  218. {VENDING_TYPE_SPRUNK, -2118.62, -422.41, 34.73}, //Sprunk
  219. {VENDING_TYPE_SPRUNK, -2118.97, -423.65, 34.73}, //Sprunk
  220. {VENDING_TYPE_CANDY, -2229.19, 286.41, 34.70}, //Candy
  221. {VENDING_TYPE_SPRUNK, -2420.18, 985.95, 44.30}, //Sprunk
  222. {VENDING_TYPE_SPRUNK, -2420.22, 984.58, 44.30}, //Sprunk
  223. {VENDING_TYPE_CANDY, 2155.84, 1607.88, 1000.06}, // Vending - Caligula's basement
  224. {VENDING_TYPE_SPRUNK, 2155.91, 1606.77, 1000.05}, // Sprunk - Caligula's basement
  225. {VENDING_TYPE_CANDY, 2202.45, 1617.01, 1000.06}, // Vending - Caligula's basement
  226. {VENDING_TYPE_CANDY, 2209.24, 1621.21, 1000.06}, // Vending - Caligula's basement
  227. {VENDING_TYPE_SPRUNK, 2209.91, 1607.20, 1000.05}, // Sprunk - Caligula's basement
  228. {VENDING_TYPE_SPRUNK, 2222.20, 1606.77, 1000.05}, // Sprunk - Caligula's basement
  229. {VENDING_TYPE_CANDY, 2222.37, 1602.64, 1000.06}, // Vending - Caligula's basement
  230. {VENDING_TYPE_SPRUNK, 2225.20, -1153.42, 1025.91}, // Sprunk - Jefferson Hotel
  231. {VENDING_TYPE_SPRUNK, -15.10, -140.23, 1003.63}, // Sprunk - 24/7
  232. {VENDING_TYPE_SPRUNK, -16.12, -91.64, 1003.63}, // Sprunk - 24/7
  233. {VENDING_TYPE_CANDY, -16.53, -140.30, 1003.63}, // Vending - 24/7
  234. {VENDING_TYPE_CANDY, -17.55, -91.71, 1003.63}, // Vending - 24/7
  235. {VENDING_TYPE_SPRUNK, -19.04, -57.84, 1003.63}, // Sprunk - 24/7
  236. {VENDING_TYPE_SPRUNK, -32.45, -186.70, 1003.63}, // Sprunk - 24/7
  237. {VENDING_TYPE_CANDY, -33.88, -186.77, 1003.63}, // Vending - 24/7
  238. {VENDING_TYPE_CANDY, 330.68, 178.50, 1020.07}, // Vending - City Hall
  239. {VENDING_TYPE_CANDY, 331.92, 178.50, 1020.07}, // Vending - City Hall
  240. {VENDING_TYPE_SPRUNK, -35.73, -140.23, 1003.63}, // Sprunk - 24/7
  241. {VENDING_TYPE_CANDY, 350.91, 206.09, 1008.48}, // Vending - City Hall
  242. {VENDING_TYPE_CANDY, -36.15, -57.88, 1003.63}, // Vending - 24/7
  243. {VENDING_TYPE_CANDY, 361.56, 158.62, 1008.48}, // Vending - City Hall
  244. {VENDING_TYPE_CANDY, 371.59, 178.45, 1020.07}, // Vending - City Hall
  245. {VENDING_TYPE_SPRUNK, 373.83, -178.14, 1000.73}, // Sprunk - Donuts
  246. {VENDING_TYPE_CANDY, 374.89, 188.98, 1008.48}, // Vending - City Hall
  247. {VENDING_TYPE_CANDY, 379.04, -178.88, 1000.73}, // Vending - Donuts
  248. {VENDING_TYPE_SPRUNK, 495.97, -24.32, 1000.73}, // Sprunk - Nightclub
  249. {VENDING_TYPE_CANDY, 500.56, -1.37, 1000.73}, // Vending - Nightclub
  250. {VENDING_TYPE_SPRUNK, 501.83, -1.43, 1000.73}, // Sprunk - Nightclub
  251. {VENDING_TYPE_SPRUNK, 2576.70, -1284.43, 1061.09} // Sprunk - Big Smoke Int
  252. },
  253. s_aVehicleGarages[][e_VEHICLE_GARAGES] = {
  254. {GARAGE_PAYNSPRAY, -100.0488, 1117.3574, 19.7417},
  255. {GARAGE_PAYNSPRAY, -1420.5437, 2585.5051, 55.8433},
  256. {GARAGE_PAYNSPRAY, -2425.8203, 1022.0131, 50.3977},
  257. {GARAGE_PAYNSPRAY, -1904.3649, 284.2363, 41.0469},
  258. {GARAGE_PAYNSPRAY, 2065.1960, -1831.4946, 13.5469},
  259. {GARAGE_PAYNSPRAY, 1025.0665, -1024.4612, 32.1016},
  260. {GARAGE_PAYNSPRAY, 720.1285, -457.2187, 16.3359},
  261. {GARAGE_PAYNSPRAY, 487.4250, -1739.0385, 10.8542},
  262. {GARAGE_PAYNSPRAY, 1974.4723, 2162.3350, 11.0703},
  263. {GARAGE_BOMBSHOP, 1849.0271, -1856.3948, 13.3828},
  264. {GARAGE_BOMBSHOP, 2005.9357, 2312.9939, 10.8203}
  265. }
  266. ;
  267. // --------------------------------------------------
  268. // Callbacks
  269. // --------------------------------------------------
  270. forward OnPlayerPause(playerid);
  271. forward OnPlayerResume(playerid, time);
  272. forward OnPlayerHoldingKey(playerid, keys);
  273. forward OnPlayerReleaseKey(playerid, keys, time);
  274. forward OnPlayerFall(playerid, Float:damage);
  275. forward OnPlayerPacketLoss(playerid, Float:oldloss, Float:newloss);
  276. forward OnPlayerCrashVehicle(playerid, vehicleid, Float:damage);
  277. forward OnPlayerUseVending(playerid, type);
  278. forward OnPlayerFPSChange(playerid, oldfps, newfps);
  279. forward OnPlayerJackVehicle(playerid, targetid, vehicleid);
  280. forward OnPlayerEmptyWeapon(playerid, weaponid);
  281. forward OnPlayerFriendlyFire(playerid, targetid, weaponid);
  282. forward OnPlayerTargetPlayer(playerid, targetid, weaponid);
  283. forward OnPlayerHideCursor(playerid, hovercolor);
  284. forward OnPlayerAntiReload(playerid, weaponid);
  285. forward OnPlayerAnimationPlay(playerid, animlib[], animname[]);
  286. forward OnPlayerReloadWeapon(playerid, weaponid, ammo);
  287. forward OnPlayerActionChange(playerid, oldaction, newaction);
  288. forward OnPlayerRamPlayer(playerid, driverid, vehicleid, Float:damage);
  289. forward OnPlayerSprayAtVehicle(playerid, vehicleid);
  290. forward OnPlayerStartBurn(playerid);
  291. forward OnPlayerStopBurn(playerid);
  292. forward OnPlayerStartAim(playerid, weaponid);
  293. forward OnPlayerStopAim(playerid);
  294. forward OnPlayerUseCamera(playerid);
  295. forward OnPlayerJump(playerid);
  296. forward OnPlayerUseGarage(playerid, vehicleid, type);
  297. forward OnVehicleCreated(vehicleid, color1, color2);
  298. // --------------------------------------------------
  299. // Internal functions
  300. // --------------------------------------------------
  301. stock static Callback_GetFlag(playerid, e_PLAYER_FLAGS:flag)
  302. {
  303. return s_aPlayerInfo[playerid][e_bFlags] & flag;
  304. }
  305. stock static Callback_SetFlag(playerid, e_PLAYER_FLAGS:flag, status)
  306. {
  307. if(status)
  308. return s_aPlayerInfo[playerid][e_bFlags] |= flag;
  309. else
  310. return s_aPlayerInfo[playerid][e_bFlags] &= ~flag;
  311. }
  312. stock static Callback_GetDriver(vehicleid)
  313. {
  314. // Returns the driver of a vehicle (obvious).
  315. for(new i = 0, l = GetPlayerPoolSize(); i <= l; i ++)
  316. {
  317. if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
  318. {
  319. return i;
  320. }
  321. }
  322. return INVALID_PLAYER_ID;
  323. }
  324. stock static Callback_GetMaxClip(weaponid)
  325. {
  326. // Returns the clip capacity for the specified weapon (required by OnPlayerAntiReload).
  327. switch(weaponid)
  328. {
  329. case 22:
  330. return 34;
  331. case 23:
  332. return 17;
  333. case 24, 27:
  334. return 7;
  335. case 28, 32:
  336. return 100;
  337. case 29, 30:
  338. return 30;
  339. case 26:
  340. return 4;
  341. case 31:
  342. return 50;
  343. }
  344. return 0;
  345. }
  346. stock static Float:Callback_GetSpeed(vehicleid)
  347. {
  348. // This is only for basic speed calculations. No need to get the real speed.
  349. new
  350. Float:fX,
  351. Float:fY,
  352. Float:fZ
  353. ;
  354. GetVehicleVelocity(vehicleid, fX, fY, fZ);
  355. return (floatsqroot((fX * fX) + (fY * fY) + (fZ * fZ)) * 100);
  356. }
  357. stock static Callback_IsVehicleInPoint(vehicleid, Float:range, Float:x, Float:y, Float:z)
  358. {
  359. // Checks if a vehicle is in range of a point.
  360. new
  361. Float:fX,
  362. Float:fY,
  363. Float:fZ
  364. ;
  365. GetVehiclePos(vehicleid, fX, fY, fZ);
  366. fX -= x;
  367. fY -= y;
  368. fZ -= z;
  369. return ((fX * fX) + (fY * fY) + (fZ * fZ)) < (range * range);
  370. }
  371. // --------------------------------------------------
  372. // External functions
  373. // --------------------------------------------------
  374. stock IsPlayerPaused(playerid)
  375. {
  376. return Callback_GetFlag(playerid, e_bPaused);
  377. }
  378. stock IsPlayerBurning(playerid)
  379. {
  380. return Callback_GetFlag(playerid, e_bBurning);
  381. }
  382. stock IsPlayerAiming(playerid)
  383. {
  384. return Callback_GetFlag(playerid, e_bAiming);
  385. }
  386. stock IsPlayerSwimming(playerid)
  387. {
  388. return (1538 <= GetPlayerAnimationIndex(playerid) <= 1544);
  389. }
  390. stock IsPlayerSkydiving(playerid)
  391. {
  392. return (GetPlayerWeapon(playerid) == 46 && GetPlayerAnimationIndex(playerid) == 1134);
  393. }
  394. stock IsPlayerJumping(playerid)
  395. {
  396. new
  397. index = GetPlayerAnimationIndex(playerid),
  398. keys,
  399. ud,
  400. lr
  401. ;
  402. GetPlayerKeys(playerid, keys, ud, lr);
  403. return (keys & KEY_JUMP) && (1196 <= index <= 1198);
  404. }
  405. stock GetPlayerFPS(playerid)
  406. {
  407. return s_aPlayerInfo[playerid][e_iFrames];
  408. }
  409. stock GetPlayerPausedTime(playerid)
  410. {
  411. return (GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_TICK]);
  412. }
  413. stock Float:GetPlayerPacketLoss(playerid)
  414. {
  415. return s_aPlayerInfo[playerid][e_fPacket];
  416. }
  417. stock GetPlayerAction(playerid)
  418. {
  419. return s_aPlayerInfo[playerid][e_iAction];
  420. }
  421. stock GetConnectedTime(playerid)
  422. {
  423. return NetStats_GetConnectedTime(playerid);
  424. }
  425. stock IsPlayerNearVending(playerid, type)
  426. {
  427. for(new i = 0; i < sizeof(s_aVehicleGarages); i ++)
  428. {
  429. if(s_aVendingMachines[i][e_VENDING_MACHINE_TYPE] == type && IsPlayerInRangeOfPoint(playerid, 2.0, s_aVendingMachines[i][e_VENDING_MACHINE_X], s_aVendingMachines[i][e_VENDING_MACHINE_Y], s_aVendingMachines[i][e_VENDING_MACHINE_Z]))
  430. {
  431. return 1;
  432. }
  433. }
  434. return 0;
  435. }
  436. stock IsPlayerNearGarage(playerid, type)
  437. {
  438. for(new i = 0; i < sizeof(s_aVehicleGarages); i ++)
  439. {
  440. if(s_aVehicleGarages[i][e_VEHICLE_GARAGE_TYPE] == type && IsPlayerInRangeOfPoint(playerid, 8.0, s_aVehicleGarages[i][e_VEHICLE_GARAGE_X], s_aVehicleGarages[i][e_VEHICLE_GARAGE_Y], s_aVehicleGarages[i][e_VEHICLE_GARAGE_Z]))
  441. {
  442. return 1;
  443. }
  444. }
  445. return 0;
  446. }
  447. stock IsPlayerSprayingVehicle(playerid, vehicleid)
  448. {
  449. new
  450. index = GetPlayerAnimationIndex(playerid),
  451. Float:x,
  452. Float:y,
  453. Float:z,
  454. Float:a
  455. ;
  456. if(IsVehicleStreamedIn(vehicleid, playerid))
  457. {
  458. GetPlayerPos(playerid, x, y, z);
  459. GetPlayerFacingAngle(playerid, a);
  460. x += 2.0 * floatsin(-a, degrees);
  461. y += 2.0 * floatcos(-a, degrees);
  462. if(Callback_IsVehicleInPoint(vehicleid, 2.0, x, y, z))
  463. {
  464. return (1160 <= index <= 1163) || index == 1167 || index == 640;
  465. }
  466. }
  467. return 0;
  468. }
  469. // --------------------------------------------------
  470. // Native hooks
  471. // --------------------------------------------------
  472. stock CB_AddStaticVehicle(modelid, Float:x, Float:y, Float:z, Float:rotation, color1, color2)
  473. {
  474. new
  475. vehicleid = AddStaticVehicle(modelid, x, y, z, rotation, color1, color2);
  476. if(vehicleid != INVALID_VEHICLE_ID)
  477. {
  478. CallLocalFunction("OnVehicleCreated", "iii", vehicleid, color1, color2);
  479. }
  480. return vehicleid;
  481. }
  482. stock CB_AddStaticVehicleEx(modelid, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay, addsiren = 0)
  483. {
  484. new
  485. vehicleid = AddStaticVehicleEx(modelid, x, y, z, rotation, color1, color2, respawn_delay, addsiren);
  486. if(vehicleid != INVALID_VEHICLE_ID)
  487. {
  488. CallLocalFunction("OnVehicleCreated", "iii", vehicleid, color1, color2);
  489. }
  490. return vehicleid;
  491. }
  492. stock CB_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
  493. {
  494. new
  495. ret = ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync);
  496. if(ret)
  497. {
  498. SetTimerEx("Callback_CheckAnimation", 100, false, "i", playerid);
  499. }
  500. return ret;
  501. }
  502. stock CB_SelectTextDraw(playerid, hovercolor)
  503. {
  504. new
  505. ret = SelectTextDraw(playerid, hovercolor);
  506. if(ret)
  507. {
  508. s_aPlayerInfo[playerid][e_iHoverColor] = hovercolor;
  509. Callback_SetFlag(playerid, e_bSelectTD, true);
  510. }
  511. return ret;
  512. }
  513. stock CB_CancelSelectTextDraw(playerid)
  514. {
  515. new
  516. ret = CancelSelectTextDraw(playerid);
  517. if(ret)
  518. {
  519. s_aPlayerInfo[playerid][e_iHoverColor] = 0;
  520. Callback_SetFlag(playerid, e_bSelectTD, false);
  521. }
  522. return ret;
  523. }
  524. // --------------------------------------------------
  525. // SA-MP Callbacks
  526. // --------------------------------------------------
  527. public OnPlayerDisconnect(playerid, reason)
  528. {
  529. if(Callback_GetFlag(playerid, e_bHoldKey))
  530. {
  531. KillTimer(s_aPlayerInfo[playerid][e_iHoldTimer]);
  532. }
  533. for(new i = 0; i < e_PLAYER_TICK_ENUM; i ++)
  534. {
  535. s_aPlayerTickInfo[playerid][i] = 0;
  536. }
  537. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  538. s_aPlayerInfo[playerid][e_iLastGun] = 0;
  539. s_aPlayerInfo[playerid][e_iLastAmmo] = 0;
  540. s_aPlayerInfo[playerid][e_iFrames] = 0;
  541. s_aPlayerInfo[playerid][e_iDrunk] = 0;
  542. s_aPlayerInfo[playerid][e_iMoney] = 0;
  543. s_aPlayerInfo[playerid][e_iTargetID] = 0;
  544. s_aPlayerInfo[playerid][e_iAnimIndex] = 0;
  545. s_aPlayerInfo[playerid][e_iHoverColor] = 0;
  546. s_aPlayerInfo[playerid][e_fPacket] = 0.0;
  547. s_aPlayerInfo[playerid][e_iVehicleID] = INVALID_VEHICLE_ID;
  548. s_aPlayerInfo[playerid][e_bFlags] = e_PLAYER_FLAGS:0;
  549. for(new i = 0; i < 12; i ++)
  550. {
  551. s_aPlayerInfo[playerid][e_iShotsFired][i] = 0;
  552. }
  553. #if defined CB_OnPlayerDisconnect
  554. return CB_OnPlayerDisconnect(playerid, reason);
  555. #else
  556. return 1;
  557. #endif
  558. }
  559. public OnFilterScriptInit()
  560. {
  561. SetTimer("Callback_TabCheck", 600, true);
  562. #if defined CB_OnFilterScriptInit
  563. return CB_OnFilterScriptInit();
  564. #else
  565. return 1;
  566. #endif
  567. }
  568. public OnGameModeInit()
  569. {
  570. SetTimer("Callback_TabCheck", 600, true);
  571. #if defined CB_OnGameModeInit
  572. return CB_OnGameModeInit();
  573. #else
  574. return 1;
  575. #endif
  576. }
  577. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  578. {
  579. new
  580. capacity = Callback_GetMaxClip(weaponid),
  581. teamid = GetPlayerTeam(playerid);
  582. if((teamid != NO_TEAM && hittype == BULLET_HIT_TYPE_PLAYER) && GetPlayerTeam(hitid) == teamid)
  583. {
  584. CallLocalFunction("OnPlayerFriendlyFire", "iii", playerid, hitid, weaponid);
  585. }
  586. if(GetPlayerWeaponState(playerid) == WEAPONSTATE_LAST_BULLET && GetPlayerAmmo(playerid) == 1)
  587. {
  588. CallLocalFunction("OnPlayerEmptyWeapon", "ii", playerid, weaponid);
  589. }
  590. if((WEAPON_COLT45 <= weaponid <= WEAPON_TEC9) && weaponid != WEAPON_SHOTGUN)
  591. {
  592. new
  593. index = (weaponid - WEAPON_COLT45);
  594. s_aPlayerInfo[playerid][e_iShotsFired][index]++;
  595. if(s_aPlayerInfo[playerid][e_iShotsFired][index] - capacity >= MAX_ACCUMULATED_SHOTS)
  596. {
  597. CallLocalFunction("OnPlayerAntiReload", "ii", playerid, weaponid);
  598. s_aPlayerInfo[playerid][e_iShotsFired][index] = 0;
  599. }
  600. }
  601. if(s_aPlayerInfo[playerid][e_iAction] != PLAYER_ACTION_SHOOTING)
  602. {
  603. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_SHOOTING);
  604. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SHOOTING;
  605. }
  606. s_aPlayerTickInfo[playerid][e_PLAYER_LAST_SHOT] = GetConnectedTime(playerid);
  607. #if defined CB_OnPlayerWeaponShot
  608. return CB_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
  609. #else
  610. return 1;
  611. #endif
  612. }
  613. public OnPlayerUpdate(playerid)
  614. {
  615. new
  616. weaponid = GetPlayerWeapon(playerid),
  617. level = GetPlayerDrunkLevel(playerid),
  618. Float:health,
  619. animlib[32],
  620. animname[32];
  621. if(IsPlayerSkydiving(playerid) && s_aPlayerInfo[playerid][e_iAction] != PLAYER_ACTION_SKYDIVING)
  622. {
  623. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_SKYDIVING);
  624. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SKYDIVING;
  625. }
  626. else if(!IsPlayerSkydiving(playerid) && s_aPlayerInfo[playerid][e_iAction] == PLAYER_ACTION_SKYDIVING)
  627. {
  628. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_NONE);
  629. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SKYDIVING;
  630. }
  631. else if(IsPlayerSwimming(playerid) && s_aPlayerInfo[playerid][e_iAction] != PLAYER_ACTION_SWIMMING)
  632. {
  633. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_SWIMMING);
  634. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SWIMMING;
  635. }
  636. else if(!IsPlayerSwimming(playerid) && s_aPlayerInfo[playerid][e_iAction] == PLAYER_ACTION_SWIMMING)
  637. {
  638. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_NONE);
  639. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  640. }
  641. else if(s_aPlayerInfo[playerid][e_iAction] == PLAYER_ACTION_SHOOTING && (GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_LAST_SHOT]) > 1200)
  642. {
  643. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_NONE);
  644. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  645. }
  646. if((GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_BURN_TICK]) >= 1500 && Callback_GetFlag(playerid, e_bBurning))
  647. {
  648. Callback_SetFlag(playerid, e_bBurning, false);
  649. CallLocalFunction("OnPlayerStopBurn", "i", playerid);
  650. }
  651. switch(GetPlayerState(playerid))
  652. {
  653. case PLAYER_STATE_ONFOOT:
  654. {
  655. if(!s_aPlayerInfo[playerid][e_iTargetID] && GetPlayerTargetPlayer(playerid) == INVALID_PLAYER_ID)
  656. {
  657. s_aPlayerInfo[playerid][e_iTargetID] = INVALID_PLAYER_ID;
  658. }
  659. else if(GetPlayerTargetPlayer(playerid) != s_aPlayerInfo[playerid][e_iTargetID])
  660. {
  661. CallLocalFunction("OnPlayerTargetPlayer", "iii", playerid, s_aPlayerInfo[playerid][e_iTargetID], GetPlayerWeapon(playerid));
  662. s_aPlayerInfo[playerid][e_iTargetID] = GetPlayerTargetPlayer(playerid);
  663. }
  664. if(!Callback_GetFlag(playerid, e_bReloading) && (WEAPON_COLT45 <= weaponid <= WEAPON_SNIPER) && GetPlayerWeaponState(playerid) == WEAPONSTATE_RELOADING)
  665. {
  666. Callback_SetFlag(playerid, e_bReloading, true);
  667. CallLocalFunction("OnPlayerReloadWeapon", "iii", playerid, weaponid, GetPlayerAmmo(playerid));
  668. }
  669. else if(GetPlayerWeaponState(playerid) != WEAPONSTATE_RELOADING)
  670. {
  671. Callback_SetFlag(playerid, e_bReloading, false);
  672. }
  673. for(new i = 0; i < sizeof(s_aVendingMachines); i ++)
  674. {
  675. if(IsPlayerInRangeOfPoint(playerid, 2.0, s_aVendingMachines[i][e_VENDING_MACHINE_X], s_aVendingMachines[i][e_VENDING_MACHINE_Y], s_aVendingMachines[i][e_VENDING_MACHINE_Z]))
  676. {
  677. if(GetPlayerAnimationIndex(playerid) == 1660 && (GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_VENDING_TICK]) > 3500)
  678. {
  679. CallLocalFunction("OnPlayerUseVending", "ii", playerid, s_aVendingMachines[i][e_VENDING_MACHINE_TYPE]);
  680. s_aPlayerTickInfo[playerid][e_PLAYER_VENDING_TICK] = GetConnectedTime(playerid);
  681. return 1;
  682. }
  683. }
  684. }
  685. if((GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_LAST_JUMP] >= 1000) && IsPlayerJumping(playerid))
  686. {
  687. CallLocalFunction("OnPlayerJump", "i", playerid);
  688. s_aPlayerTickInfo[playerid][e_PLAYER_LAST_JUMP] = GetConnectedTime(playerid);
  689. }
  690. }
  691. case PLAYER_STATE_DRIVER:
  692. {
  693. new
  694. money = GetPlayerMoney(playerid);
  695. if(s_aPlayerInfo[playerid][e_iMoney] != money)
  696. {
  697. if(GetPlayerCameraMode(playerid) == 15)
  698. {
  699. switch(s_aPlayerInfo[playerid][e_iMoney] - money)
  700. {
  701. case 100:
  702. {
  703. if(IsPlayerNearGarage(playerid, GARAGE_PAYNSPRAY))
  704. {
  705. CallLocalFunction("OnPlayerUseGarage", "iii", playerid, GetPlayerVehicleID(playerid), GARAGE_PAYNSPRAY);
  706. }
  707. }
  708. case 500:
  709. {
  710. if(IsPlayerNearGarage(playerid, GARAGE_BOMBSHOP))
  711. {
  712. CallLocalFunction("OnPlayerUseGarage", "iii", playerid, GetPlayerVehicleID(playerid), GARAGE_BOMBSHOP);
  713. }
  714. }
  715. }
  716. }
  717. s_aPlayerInfo[playerid][e_iMoney] = money;
  718. }
  719. new
  720. vehicleid = GetPlayerVehicleID(playerid),
  721. panels,
  722. doors,
  723. lights,
  724. tires
  725. ;
  726. GetVehicleHealth(vehicleid, health);
  727. if(s_aVehicleInfo[vehicleid][e_fHealth] > health && floatabs(s_aVehicleInfo[vehicleid][e_fHealth] - health) >= POTENTIAL_CRASH_DAMAGE && floatabs(s_aVehicleInfo[vehicleid][e_fSpeed] - Callback_GetSpeed(vehicleid)) >= 5.0)
  728. {
  729. GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires);
  730. if(s_aVehicleInfo[vehicleid][e_iPanels] != panels || s_aVehicleInfo[vehicleid][e_iDoors] != doors || s_aVehicleInfo[vehicleid][e_iLights] != lights)
  731. {
  732. CallLocalFunction("OnPlayerCrashVehicle", "iif", playerid, vehicleid, floatsub(s_aVehicleInfo[vehicleid][e_fHealth], health));
  733. }
  734. GetVehicleDamageStatus(vehicleid, s_aVehicleInfo[vehicleid][e_iPanels], s_aVehicleInfo[vehicleid][e_iDoors], s_aVehicleInfo[vehicleid][e_iLights], tires);
  735. }
  736. s_aVehicleInfo[vehicleid][e_fHealth] = health;
  737. s_aVehicleInfo[vehicleid][e_fSpeed] = Callback_GetSpeed(vehicleid);
  738. }
  739. }
  740. new
  741. difference = s_aPlayerInfo[playerid][e_iDrunk] - level;
  742. if(GetPlayerDrunkLevel(playerid) < 100)
  743. {
  744. SetPlayerDrunkLevel(playerid, 2000);
  745. }
  746. else if(s_aPlayerInfo[playerid][e_iDrunk] != level)
  747. {
  748. if((0 <= difference <= 200) && s_aPlayerInfo[playerid][e_iFrames] != difference)
  749. {
  750. if(s_aPlayerInfo[playerid][e_iFrames] < 0)
  751. {
  752. s_aPlayerInfo[playerid][e_iFrames] = 0;
  753. }
  754. CallLocalFunction("OnPlayerFPSChange", "iii", playerid, s_aPlayerInfo[playerid][e_iFrames], difference);
  755. }
  756. s_aPlayerInfo[playerid][e_iFrames] = difference;
  757. s_aPlayerInfo[playerid][e_iDrunk] = level;
  758. }
  759. new
  760. Float:packet = NetStats_PacketLossPercent(playerid);
  761. if(floatcmp(packet, 0.0) != 0 && floatcmp(packet, s_aPlayerInfo[playerid][e_fPacket]) != 0)
  762. {
  763. CallLocalFunction("OnPlayerPacketLoss", "iff", playerid, s_aPlayerInfo[playerid][e_fPacket], packet);
  764. s_aPlayerInfo[playerid][e_fPacket] = packet;
  765. }
  766. if(Callback_GetFlag(playerid, e_bAnimSet) && s_aPlayerInfo[playerid][e_iAnimIndex] != GetPlayerAnimationIndex(playerid))
  767. {
  768. Callback_SetFlag(playerid, e_bAnimSet, false);
  769. GetAnimationName(s_aPlayerInfo[playerid][e_iAnimIndex], animlib, sizeof(animlib), animname, sizeof(animname));
  770. if(strlen(animlib) > 0 && strlen(animname) > 0)
  771. {
  772. CallLocalFunction("OnPlayerAnimationPlay", "iss", playerid, animlib, animname);
  773. }
  774. }
  775. new
  776. ammo = GetPlayerAmmo(playerid);
  777. if(s_aPlayerInfo[playerid][e_iLastAmmo] != ammo)
  778. {
  779. if(GetPlayerWeapon(playerid) == WEAPON_CAMERA && s_aPlayerInfo[playerid][e_iLastAmmo] > ammo)
  780. {
  781. CallLocalFunction("OnPlayerUseCamera", "i", playerid);
  782. }
  783. else if(GetPlayerWeapon(playerid) == WEAPON_SPRAYCAN && s_aPlayerInfo[playerid][e_iLastAmmo] > ammo)
  784. {
  785. for(new i = 1, l = GetVehiclePoolSize(); i <= l; i ++)
  786. {
  787. if(IsPlayerSprayingVehicle(playerid, i))
  788. {
  789. CallLocalFunction("OnPlayerSprayAtVehicle", "ii", playerid, i);
  790. break;
  791. }
  792. }
  793. }
  794. s_aPlayerInfo[playerid][e_iLastAmmo] = ammo;
  795. }
  796. if(s_aPlayerInfo[playerid][e_iLastGun] != weaponid)
  797. {
  798. new
  799. lastweapon = s_aPlayerInfo[playerid][e_iLastGun];
  800. if((WEAPON_COLT45 <= lastweapon <= WEAPON_TEC9) && lastweapon != WEAPON_SHOTGUN)
  801. {
  802. s_aPlayerInfo[playerid][e_iShotsFired][lastweapon - WEAPON_COLT45] = 0;
  803. }
  804. s_aPlayerInfo[playerid][e_iLastGun] = weaponid;
  805. }
  806. else
  807. {
  808. if((WEAPON_COLT45 <= weaponid <= WEAPON_TEC9) && weaponid != WEAPON_SHOTGUN && GetPlayerWeaponState(playerid) == WEAPONSTATE_RELOADING)
  809. {
  810. s_aPlayerInfo[playerid][e_iShotsFired][weaponid - WEAPON_COLT45] = 0;
  811. }
  812. }
  813. if(!Callback_GetFlag(playerid, e_bUpdate))
  814. {
  815. Callback_SetFlag(playerid, e_bUpdate, true);
  816. }
  817. s_aPlayerTickInfo[playerid][e_PLAYER_LAST_UPDATE] = GetConnectedTime(playerid);
  818. #if defined CB_OnPlayerUpdate
  819. return CB_OnPlayerUpdate(playerid);
  820. #else
  821. return 1;
  822. #endif
  823. }
  824. public OnPlayerStateChange(playerid, newstate, oldstate)
  825. {
  826. new
  827. vehicleid = GetPlayerVehicleID(playerid);
  828. switch(newstate)
  829. {
  830. case PLAYER_STATE_DRIVER:
  831. {
  832. GetVehicleHealth(vehicleid, s_aVehicleInfo[vehicleid][e_fHealth]);
  833. s_aPlayerInfo[playerid][e_iVehicleID] = vehicleid;
  834. }
  835. case PLAYER_STATE_WASTED:
  836. {
  837. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  838. }
  839. case PLAYER_STATE_ONFOOT:
  840. {
  841. if(oldstate == PLAYER_STATE_DRIVER && GetVehicleModel(s_aPlayerInfo[playerid][e_iVehicleID]))
  842. {
  843. new
  844. driverid = Callback_GetDriver(s_aPlayerInfo[playerid][e_iVehicleID]);
  845. if(driverid != INVALID_PLAYER_ID)
  846. {
  847. CallLocalFunction("OnPlayerJackVehicle", "iii", driverid, playerid, s_aPlayerInfo[playerid][e_iVehicleID]);
  848. }
  849. s_aPlayerInfo[playerid][e_iVehicleID] = INVALID_VEHICLE_ID;
  850. }
  851. }
  852. }
  853. #if defined CB_OnPlayerStateChange
  854. return CB_OnPlayerStateChange(playerid, newstate, oldstate);
  855. #else
  856. return 1;
  857. #endif
  858. }
  859. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  860. {
  861. new
  862. weaponid = GetPlayerWeapon(playerid);
  863. if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING && GetPlayerState(playerid) != PLAYER_STATE_SPAWNED && GetPlayerState(playerid) != PLAYER_STATE_WASTED)
  864. {
  865. if(!Callback_GetFlag(playerid, e_bHoldKey))
  866. {
  867. Callback_SetFlag(playerid, e_bHoldKey, true);
  868. s_aPlayerTickInfo[playerid][e_PLAYER_TICK] = GetConnectedTime(playerid);
  869. s_aPlayerInfo[playerid][e_iHoldTimer] = SetTimerEx("Callback_HoldTimer", 200, true, "ii", playerid, newkeys);
  870. }
  871. if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
  872. {
  873. if((WEAPON_COLT45 <= weaponid <= WEAPON_CAMERA) && weaponid != WEAPON_BOMB)
  874. {
  875. if(!Callback_GetFlag(playerid, e_bAiming) && (newkeys & KEY_HANDBRAKE) & KEY_HANDBRAKE)
  876. {
  877. Callback_SetFlag(playerid, e_bAiming, true);
  878. CallLocalFunction("OnPlayerStartAim", "ii", playerid, weaponid);
  879. }
  880. else if((newkeys & KEY_HANDBRAKE) != KEY_HANDBRAKE && (oldkeys & KEY_HANDBRAKE) == KEY_HANDBRAKE)
  881. {
  882. Callback_SetFlag(playerid, e_bAiming, false);
  883. CallLocalFunction("OnPlayerStopAim", "i", playerid);
  884. }
  885. }
  886. }
  887. }
  888. #if defined CB_OnPlayerKeyStateChange
  889. return CB_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  890. #else
  891. return 1;
  892. #endif
  893. }
  894. public OnPlayerClickTextDraw(playerid, Text:clickedid)
  895. {
  896. if(clickedid == Text:INVALID_TEXT_DRAW && Callback_GetFlag(playerid, e_bSelectTD))
  897. {
  898. Callback_SetFlag(playerid, e_bSelectTD, false);
  899. CallLocalFunction("OnPlayerHideCursor", "ii", playerid, s_aPlayerInfo[playerid][e_iHoverColor]);
  900. }
  901. #if defined CB_OnPlayerClickTextDraw
  902. return CB_OnPlayerClickTextDraw(playerid, clickedid);
  903. #else
  904. return 0;
  905. #endif
  906. }
  907. public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
  908. {
  909. if(weaponid == WEAPON_COLLISION && issuerid == INVALID_PLAYER_ID && amount >= 4.95)
  910. {
  911. CallLocalFunction("OnPlayerFall", "if", playerid, amount);
  912. }
  913. if(weaponid == WEAPON_VEHICLE && issuerid != INVALID_PLAYER_ID)
  914. {
  915. CallLocalFunction("OnPlayerRamPlayer", "iiif", playerid, issuerid, GetPlayerVehicleID(issuerid), amount);
  916. }
  917. if(weaponid == WEAPON_FLAMETHROWER)
  918. {
  919. if(!Callback_GetFlag(playerid, e_bBurning))
  920. {
  921. Callback_SetFlag(playerid, e_bBurning, true);
  922. CallLocalFunction("OnPlayerStartBurn", "i", playerid);
  923. }
  924. s_aPlayerTickInfo[playerid][e_PLAYER_BURN_TICK] = GetConnectedTime(playerid);
  925. }
  926. #if defined CB_OnPlayerTakeDamage
  927. return CB_OnPlayerTakeDamage(playerid, issuerid, amount, weaponid, bodypart);
  928. #else
  929. return 1;
  930. #endif
  931. }
  932. // --------------------------------------------------
  933. // Timers
  934. // --------------------------------------------------
  935. forward Callback_CheckAnimation(playerid);
  936. public Callback_CheckAnimation(playerid)
  937. {
  938. s_aPlayerInfo[playerid][e_iAnimIndex] = GetPlayerAnimationIndex(playerid);
  939. Callback_SetFlag(playerid, e_bAnimSet, true);
  940. }
  941. forward Callback_HoldTimer(playerid, key);
  942. public Callback_HoldTimer(playerid, key)
  943. {
  944. new
  945. keys,
  946. ud,
  947. lr;
  948. GetPlayerKeys(playerid, keys, ud, lr);
  949. if(keys & key)
  950. {
  951. Callback_SetFlag(playerid, e_bKeyPress, true);
  952. CallLocalFunction("OnPlayerHoldingKey", "ii", playerid, key);
  953. }
  954. else
  955. {
  956. if(Callback_GetFlag(playerid, e_bKeyPress))
  957. {
  958. CallLocalFunction("OnPlayerReleaseKey", "iii", playerid, key, GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_TICK]);
  959. }
  960. KillTimer(s_aPlayerInfo[playerid][e_iHoldTimer]);
  961. Callback_SetFlag(playerid, e_bKeyPress, false);
  962. Callback_SetFlag(playerid, e_bHoldKey, false);
  963. }
  964. }
  965. forward Callback_TabCheck();
  966. public Callback_TabCheck()
  967. {
  968. for(new i = 0, l = GetPlayerPoolSize(); i <= l; i ++)
  969. {
  970. switch(GetPlayerState(i))
  971. {
  972. case PLAYER_STATE_ONFOOT, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER:
  973. {
  974. if(Callback_GetFlag(i, e_bUpdate))
  975. {
  976. if(Callback_GetFlag(i, e_bPaused))
  977. {
  978. CallLocalFunction("OnPlayerResume", "ii", i, GetConnectedTime(i) - s_aPlayerTickInfo[i][e_PLAYER_TICK]);
  979. }
  980. Callback_SetFlag(i, e_bUpdate, false);
  981. Callback_SetFlag(i, e_bPaused, false);
  982. }
  983. if(!Callback_GetFlag(i, e_bPaused) && (GetConnectedTime(i) - s_aPlayerTickInfo[i][e_PLAYER_LAST_UPDATE]) >= 4000)
  984. {
  985. CallLocalFunction("OnPlayerPause", "i", i);
  986. s_aPlayerTickInfo[i][e_PLAYER_TICK] = GetConnectedTime(i);
  987. Callback_SetFlag(i, e_bPaused, true);
  988. }
  989. }
  990. }
  991. }
  992. }
  993. // --------------------------------------------------
  994. // Native hooks
  995. // --------------------------------------------------
  996. #if defined _ALS_AddStaticVehicle
  997. #undef AddStaticVehicle
  998. #else
  999. #define _ALS_AddStaticVehicle
  1000. #endif
  1001. #if defined _ALS_AddStaticVehicleEx
  1002. #undef AddStaticVehicleEx
  1003. #else
  1004. #define _ALS_AddStaticVehicleEx
  1005. #endif
  1006. #if defined _ALS_ApplyAnimation
  1007. #undef ApplyAnimation
  1008. #else
  1009. #define _ALS_ApplyAnimation
  1010. #endif
  1011. #if defined _ALS_SelectTextDraw
  1012. #undef SelectTextDraw
  1013. #else
  1014. #define _ALS_SelectTextDraw
  1015. #endif
  1016. #if defined _ALS_CancelSelectTextDraw
  1017. #undef CancelSelectTextDraw
  1018. #else
  1019. #define _ALS_CancelSelectTextDraw
  1020. #endif
  1021. #define AddStaticVehicle CB_AddStaticVehicle
  1022. #define AddStaticVehicleEx CB_AddStaticVehicleEx
  1023. #define ApplyAnimation CB_ApplyAnimation
  1024. #define SelectTextDraw CB_SelectTextDraw
  1025. #define CancelSelectTextDraw CB_CancelSelectTextDraw
  1026. // --------------------------------------------------
  1027. // Callback hooks
  1028. // --------------------------------------------------
  1029. #if defined _ALS_OnFilterScriptInit
  1030. #undef OnFilterScriptInit
  1031. #else
  1032. #define _ALS_OnFilterScriptInit
  1033. #endif
  1034. #if defined _ALS_OnGameModeInit
  1035. #undef OnGameModeInit
  1036. #else
  1037. #define _ALS_OnGameModeInit
  1038. #endif
  1039. #if defined _ALS_OnPlayerDisconnect
  1040. #undef OnPlayerDisconnect
  1041. #else
  1042. #define _ALS_OnPlayerDisconnect
  1043. #endif
  1044. #if defined _ALS_OnPlayerStateChange
  1045. #undef OnPlayerStateChange
  1046. #else
  1047. #define _ALS_OnPlayerStateChange
  1048. #endif
  1049. #if defined _ALS_OnPlayerKeyStateChange
  1050. #undef OnPlayerKeyStateChange
  1051. #else
  1052. #define _ALS_OnPlayerKeyStateChange
  1053. #endif
  1054. #if defined _ALS_OnPlayerUpdate
  1055. #undef OnPlayerUpdate
  1056. #else
  1057. #define _ALS_OnPlayerUpdate
  1058. #endif
  1059. #if defined _ALS_OnPlayerWeaponShot
  1060. #undef OnPlayerWeaponShot
  1061. #else
  1062. #define _ALS_OnPlayerWeaponShot
  1063. #endif
  1064. #if defined _ALS_OnPlayerClickTextDraw
  1065. #undef OnPlayerClickTextDraw
  1066. #else
  1067. #define _ALS_OnPlayerClickTextDraw
  1068. #endif
  1069. #if defined _ALS_OnPlayerTakeDamage
  1070. #undef OnPlayerTakeDamage
  1071. #else
  1072. #define _ALS_OnPlayerTakeDamage
  1073. #endif
  1074. #define OnFilterScriptInit CB_OnFilterScriptInit
  1075. #define OnGameModeInit CB_OnGameModeInit
  1076. #define OnPlayerDisconnect CB_OnPlayerDisconnect
  1077. #define OnPlayerUpdate CB_OnPlayerUpdate
  1078. #define OnPlayerStateChange CB_OnPlayerStateChange
  1079. #define OnPlayerKeyStateChange CB_OnPlayerKeyStateChange
  1080. #define OnPlayerWeaponShot CB_OnPlayerWeaponShot
  1081. #define OnPlayerClickTextDraw CB_OnPlayerClickTextDraw
  1082. #define OnPlayerTakeDamage CB_OnPlayerTakeDamage
  1083. #if defined CB_OnPlayerUpdate
  1084. forward CB_OnPlayerUpdate(playerid);
  1085. #endif
  1086. #if defined CB_OnFilterScriptInit
  1087. forward CB_OnFilterScriptInit();
  1088. #endif
  1089. #if defined CB_OnGameModeInit
  1090. forward CB_OnGameModeInit();
  1091. #endif
  1092. #if defined CB_OnPlayerDisconnect
  1093. forward CB_OnPlayerDisconnect(playerid, reason);
  1094. #endif
  1095. #if defined CB_OnPlayerStateChange
  1096. forward CB_OnPlayerStateChange(playerid, newstate, oldstate);
  1097. #endif
  1098. #if defined CB_OnPlayerKeyStateChange
  1099. forward CB_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  1100. #endif
  1101. #if defined CB_OnPlayerWeaponShot
  1102. forward CB_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
  1103. #endif
  1104. #if defined CB_OnPlayerClickTextDraw
  1105. forward CB_OnPlayerClickTextDraw(playerid, Text:clickedid);
  1106. #endif
  1107. #if defined CB_OnPlayerTakeDamage
  1108. forward CB_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart);
  1109. #endif