callbacks.inc 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  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[75][e_VENDING_MACHINES] = {
  168. {VENDING_TYPE_SPRUNK, 2326.0273, -1645.9480, 14.8270},
  169. {VENDING_TYPE_SPRUNK, 2060.1038, -1898.4542, 13.5538},
  170. {VENDING_TYPE_SPRUNK, 1729.8389, -1943.8608, 13.5687},
  171. {VENDING_TYPE_SPRUNK, 1929.5480, -1772.3799, 13.5469},
  172. {VENDING_TYPE_SPRUNK, 1788.3971, -1369.2784, 15.7578},
  173. {VENDING_TYPE_SPRUNK, 2352.9934, -1357.0977, 24.3984},
  174. {VENDING_TYPE_SPRUNK, 1153.9095, -1460.9143, 15.7969},
  175. {VENDING_TYPE_SPRUNK, 200.2008, -107.6411, 1.5513},
  176. {VENDING_TYPE_SPRUNK, 1278.5946, 372.2171, 19.5547},
  177. {VENDING_TYPE_SPRUNK, 2320.0242, 2532.0378, 10.8203},
  178. {VENDING_TYPE_SPRUNK, 2086.5876, 2071.3574, 11.0579},
  179. {VENDING_TYPE_SPRUNK, 1519.3347, 1055.2349, 10.8203},
  180. {VENDING_TYPE_SPRUNK, 2503.1370, 1244.5089, 10.8203},
  181. {VENDING_TYPE_SPRUNK, 373.8246, -178.9297, 1000.6328},
  182. {VENDING_TYPE_SPRUNK, 2575.9084, -1284.4164, 1060.9844},
  183. {VENDING_TYPE_SPRUNK, 495.9450, -23.5309, 1000.6797},
  184. {VENDING_TYPE_SPRUNK, 501.8352, -2.2189, 1000.6797},
  185. {VENDING_TYPE_SPRUNK, 2224.4141, -1153.4738, 1025.7969},
  186. {VENDING_TYPE_SPRUNK, 2156.6990, 1606.7858, 999.9718},
  187. {VENDING_TYPE_SPRUNK, 2209.1143, 1607.1713, 999.9691},
  188. {VENDING_TYPE_SPRUNK, 2222.9924, 1606.8201, 999.9758},
  189. {VENDING_TYPE_SPRUNK, -14.7329, 1176.1732, 19.5634},
  190. {VENDING_TYPE_SPRUNK, -862.8334, 1537.4231, 22.5870},
  191. {VENDING_TYPE_SPRUNK, -252.9273, 2597.9426, 62.8582},
  192. {VENDING_TYPE_SPRUNK, -2419.5483, 985.9162, 45.2969},
  193. {VENDING_TYPE_SPRUNK, -2419.5837, 984.5789, 45.2969},
  194. {VENDING_TYPE_SPRUNK, -1349.3037, 492.3072, 11.1953},
  195. {VENDING_TYPE_SPRUNK, -1981.6035, 142.6650, 27.6875},
  196. {VENDING_TYPE_SPRUNK, -2005.6317, -490.8682, 35.5313},
  197. {VENDING_TYPE_SPRUNK, -2034.4124, -490.8690, 35.5313},
  198. {VENDING_TYPE_SPRUNK, -2063.2695, -490.8681, 35.5313},
  199. {VENDING_TYPE_SPRUNK, -2092.0920, -490.8683, 35.5313},
  200. {VENDING_TYPE_SPRUNK, -2119.7566, -423.4371, 35.5313},
  201. {VENDING_TYPE_SPRUNK, -2119.4058, -422.2168, 35.5313},
  202. {VENDING_TYPE_SPRUNK, -2097.2969, -397.5224, 35.5313},
  203. {VENDING_TYPE_SPRUNK, -2068.5955, -397.5209, 35.5313},
  204. {VENDING_TYPE_SPRUNK, -2039.8862, -397.5221, 35.5313},
  205. {VENDING_TYPE_SPRUNK, -2011.1857, -397.5218, 35.5313},
  206. {VENDING_TYPE_SPRUNK, -32.5050, -185.9060, 1003.5469},
  207. {VENDING_TYPE_SPRUNK, -16.1550, -90.8514, 1003.5469},
  208. {VENDING_TYPE_SPRUNK, -15.1533, -139.4374, 1003.5469},
  209. {VENDING_TYPE_SPRUNK, -35.7115, -139.4262, 1003.5469},
  210. {VENDING_TYPE_SPRUNK, -19.0527, -57.0465, 1003.5469},
  211. {VENDING_TYPE_CANDY, -75.2803, 1227.9558, 19.7359},
  212. {VENDING_TYPE_CANDY, -252.9929, 2599.7952, 62.8582},
  213. {VENDING_TYPE_CANDY, -1455.1244, 2592.4136, 55.8359},
  214. {VENDING_TYPE_CANDY, -1349.3669, 493.8326, 11.1953},
  215. {VENDING_TYPE_CANDY, -2229.1858, 287.1634, 35.3203},
  216. {VENDING_TYPE_CANDY, -33.9020, -186.0259, 1003.5469},
  217. {VENDING_TYPE_CANDY, -17.5500, -90.9689, 1003.5469},
  218. {VENDING_TYPE_CANDY, -16.4742, -139.5535, 1003.5469},
  219. {VENDING_TYPE_CANDY, -36.1270, -57.1352, 1003.5469},
  220. {VENDING_TYPE_CANDY, 1634.0918, -2238.2810, 13.5078},
  221. {VENDING_TYPE_CANDY, 2480.8667, -1958.5234, 13.5830},
  222. {VENDING_TYPE_CANDY, 2140.2676, -1161.4753, 23.9922},
  223. {VENDING_TYPE_CANDY, 2153.8462, -1015.7134, 62.8837},
  224. {VENDING_TYPE_CANDY, 662.4010, -551.4146, 16.3359},
  225. {VENDING_TYPE_CANDY, 2271.7383, -77.2105, 26.5812},
  226. {VENDING_TYPE_CANDY, 2845.7246, 1294.2957, 11.3906},
  227. {VENDING_TYPE_CANDY, 1398.8699, 2223.3665, 11.0234},
  228. {VENDING_TYPE_CANDY, 1659.4425, 1722.1097, 10.8281},
  229. {VENDING_TYPE_CANDY, 2647.6428, 1128.9147, 11.1797},
  230. {VENDING_TYPE_CANDY, 374.8246, 188.2364, 1008.3893},
  231. {VENDING_TYPE_CANDY, 361.5366, 159.3573, 1008.3828},
  232. {VENDING_TYPE_CANDY, 351.6461, 206.0936, 1008.3828},
  233. {VENDING_TYPE_CANDY, 371.5602, 177.7127, 1019.9844},
  234. {VENDING_TYPE_CANDY, 331.9078, 177.7589, 1019.9912},
  235. {VENDING_TYPE_CANDY, 330.6430, 177.7591, 1019.9912},
  236. {VENDING_TYPE_CANDY, 378.2992, -178.8477, 1000.6328},
  237. {VENDING_TYPE_CANDY, 316.2407, -140.3572, 999.6016},
  238. {VENDING_TYPE_CANDY, 500.6049, -2.1070, 1000.6797},
  239. {VENDING_TYPE_CANDY, 2156.5854, 1607.8103, 999.9692},
  240. {VENDING_TYPE_CANDY, 2202.4285, 1617.7483, 999.9766},
  241. {VENDING_TYPE_CANDY, 2209.2668, 1620.4711, 999.9827},
  242. {VENDING_TYPE_CANDY, 2223.1074, 1602.5835, 999.9734}
  243. },
  244. s_aVehicleGarages[][e_VEHICLE_GARAGES] = {
  245. {GARAGE_PAYNSPRAY, -100.0488, 1117.3574, 19.7417},
  246. {GARAGE_PAYNSPRAY, -1420.5437, 2585.5051, 55.8433},
  247. {GARAGE_PAYNSPRAY, -2425.8203, 1022.0131, 50.3977},
  248. {GARAGE_PAYNSPRAY, -1904.3649, 284.2363, 41.0469},
  249. {GARAGE_PAYNSPRAY, 2065.1960, -1831.4946, 13.5469},
  250. {GARAGE_PAYNSPRAY, 1025.0665, -1024.4612, 32.1016},
  251. {GARAGE_PAYNSPRAY, 720.1285, -457.2187, 16.3359},
  252. {GARAGE_PAYNSPRAY, 487.4250, -1739.0385, 10.8542},
  253. {GARAGE_PAYNSPRAY, 1974.4723, 2162.3350, 11.0703},
  254. {GARAGE_BOMBSHOP, 1849.0271, -1856.3948, 13.3828},
  255. {GARAGE_BOMBSHOP, 2005.9357, 2312.9939, 10.8203}
  256. }
  257. ;
  258. // --------------------------------------------------
  259. // Callbacks
  260. // --------------------------------------------------
  261. forward OnPlayerPause(playerid);
  262. forward OnPlayerResume(playerid, time);
  263. forward OnPlayerHoldingKey(playerid, keys);
  264. forward OnPlayerReleaseKey(playerid, keys, time);
  265. forward OnPlayerFall(playerid, Float:damage);
  266. forward OnPlayerPacketLoss(playerid, Float:oldloss, Float:newloss);
  267. forward OnPlayerCrashVehicle(playerid, vehicleid, Float:damage);
  268. forward OnPlayerUseVending(playerid, type);
  269. forward OnPlayerFPSChange(playerid, oldfps, newfps);
  270. forward OnPlayerJackVehicle(playerid, targetid, vehicleid);
  271. forward OnPlayerEmptyWeapon(playerid, weaponid);
  272. forward OnPlayerFriendlyFire(playerid, targetid, weaponid);
  273. forward OnPlayerTargetPlayer(playerid, targetid, weaponid);
  274. forward OnPlayerHideCursor(playerid, hovercolor);
  275. forward OnPlayerAntiReload(playerid, weaponid);
  276. forward OnPlayerAnimationPlay(playerid, animlib[], animname[]);
  277. forward OnPlayerReloadWeapon(playerid, weaponid, ammo);
  278. forward OnPlayerActionChange(playerid, oldaction, newaction);
  279. forward OnPlayerRamPlayer(playerid, driverid, vehicleid, Float:damage);
  280. forward OnPlayerSprayAtVehicle(playerid, vehicleid);
  281. forward OnPlayerStartBurn(playerid);
  282. forward OnPlayerStopBurn(playerid);
  283. forward OnPlayerStartAim(playerid, weaponid);
  284. forward OnPlayerStopAim(playerid);
  285. forward OnPlayerUseCamera(playerid);
  286. forward OnPlayerJump(playerid);
  287. forward OnPlayerUseGarage(playerid, vehicleid, type);
  288. forward OnVehicleCreated(vehicleid, color1, color2);
  289. // --------------------------------------------------
  290. // Internal functions
  291. // --------------------------------------------------
  292. stock static Callback_GetFlag(playerid, e_PLAYER_FLAGS:flag)
  293. {
  294. return s_aPlayerInfo[playerid][e_bFlags] & flag;
  295. }
  296. stock static Callback_SetFlag(playerid, e_PLAYER_FLAGS:flag, status)
  297. {
  298. if(status)
  299. return s_aPlayerInfo[playerid][e_bFlags] |= flag;
  300. else
  301. return s_aPlayerInfo[playerid][e_bFlags] &= ~flag;
  302. }
  303. stock static Callback_GetDriver(vehicleid)
  304. {
  305. // Returns the driver of a vehicle (obvious).
  306. for(new i = 0, l = GetPlayerPoolSize(); i <= l; i ++)
  307. {
  308. if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
  309. {
  310. return i;
  311. }
  312. }
  313. return INVALID_PLAYER_ID;
  314. }
  315. stock static Callback_GetMaxClip(weaponid)
  316. {
  317. // Returns the clip capacity for the specified weapon (required by OnPlayerAntiReload).
  318. switch(weaponid)
  319. {
  320. case 22:
  321. return 34;
  322. case 23:
  323. return 17;
  324. case 24, 27:
  325. return 7;
  326. case 28, 32:
  327. return 100;
  328. case 29, 30:
  329. return 30;
  330. case 26:
  331. return 4;
  332. case 31:
  333. return 50;
  334. }
  335. return 0;
  336. }
  337. stock static Float:Callback_GetSpeed(vehicleid)
  338. {
  339. // This is only for basic speed calculations. No need to get the real speed.
  340. new
  341. Float:fX,
  342. Float:fY,
  343. Float:fZ
  344. ;
  345. GetVehicleVelocity(vehicleid, fX, fY, fZ);
  346. return (floatsqroot((fX * fX) + (fY * fY) + (fZ * fZ)) * 100);
  347. }
  348. stock static Callback_IsVehicleInPoint(vehicleid, Float:range, Float:x, Float:y, Float:z)
  349. {
  350. // Checks if a vehicle is in range of a point.
  351. new
  352. Float:fX,
  353. Float:fY,
  354. Float:fZ
  355. ;
  356. GetVehiclePos(vehicleid, fX, fY, fZ);
  357. fX -= x;
  358. fY -= y;
  359. fZ -= z;
  360. return ((fX * fX) + (fY * fY) + (fZ * fZ)) < (range * range);
  361. }
  362. // --------------------------------------------------
  363. // External functions
  364. // --------------------------------------------------
  365. stock IsPlayerPaused(playerid)
  366. {
  367. return Callback_GetFlag(playerid, e_bPaused);
  368. }
  369. stock IsPlayerBurning(playerid)
  370. {
  371. return Callback_GetFlag(playerid, e_bBurning);
  372. }
  373. stock IsPlayerAiming(playerid)
  374. {
  375. return Callback_GetFlag(playerid, e_bAiming);
  376. }
  377. stock IsPlayerSwimming(playerid)
  378. {
  379. return (1538 <= GetPlayerAnimationIndex(playerid) <= 1544);
  380. }
  381. stock IsPlayerSkydiving(playerid)
  382. {
  383. return (GetPlayerWeapon(playerid) == 46 && GetPlayerAnimationIndex(playerid) == 1134);
  384. }
  385. stock IsPlayerJumping(playerid)
  386. {
  387. new
  388. index = GetPlayerAnimationIndex(playerid),
  389. keys,
  390. ud,
  391. lr
  392. ;
  393. GetPlayerKeys(playerid, keys, ud, lr);
  394. return (keys & KEY_JUMP) && (1196 <= index <= 1198);
  395. }
  396. stock GetPlayerFPS(playerid)
  397. {
  398. return s_aPlayerInfo[playerid][e_iFrames];
  399. }
  400. stock GetPlayerPausedTime(playerid)
  401. {
  402. return (GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_TICK]);
  403. }
  404. stock Float:GetPlayerPacketLoss(playerid)
  405. {
  406. return s_aPlayerInfo[playerid][e_fPacket];
  407. }
  408. stock GetPlayerAction(playerid)
  409. {
  410. return s_aPlayerInfo[playerid][e_iAction];
  411. }
  412. stock GetConnectedTime(playerid)
  413. {
  414. return NetStats_GetConnectedTime(playerid);
  415. }
  416. stock IsPlayerNearVending(playerid, type)
  417. {
  418. for(new i = 0; i < sizeof(s_aVehicleGarages); i ++)
  419. {
  420. 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]))
  421. {
  422. return 1;
  423. }
  424. }
  425. return 0;
  426. }
  427. stock IsPlayerNearGarage(playerid, type)
  428. {
  429. for(new i = 0; i < sizeof(s_aVehicleGarages); i ++)
  430. {
  431. 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]))
  432. {
  433. return 1;
  434. }
  435. }
  436. return 0;
  437. }
  438. stock IsPlayerSprayingVehicle(playerid, vehicleid)
  439. {
  440. new
  441. index = GetPlayerAnimationIndex(playerid),
  442. Float:x,
  443. Float:y,
  444. Float:z,
  445. Float:a
  446. ;
  447. if(IsVehicleStreamedIn(vehicleid, playerid))
  448. {
  449. GetPlayerPos(playerid, x, y, z);
  450. GetPlayerFacingAngle(playerid, a);
  451. x += 2.0 * floatsin(-a, degrees);
  452. y += 2.0 * floatcos(-a, degrees);
  453. if(Callback_IsVehicleInPoint(vehicleid, 2.0, x, y, z))
  454. {
  455. return (1160 <= index <= 1163) || index == 1167 || index == 640;
  456. }
  457. }
  458. return 0;
  459. }
  460. // --------------------------------------------------
  461. // Native hooks
  462. // --------------------------------------------------
  463. stock CB_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay, addsiren = 0)
  464. {
  465. new
  466. vehicleid = CreateVehicle(modelid, x, y, z, rotation, color1, color2, respawn_delay, addsiren);
  467. if(vehicleid != INVALID_VEHICLE_ID)
  468. {
  469. CallLocalFunction("OnVehicleCreated", "iii", vehicleid, color1, color2);
  470. }
  471. return vehicleid;
  472. }
  473. stock CB_AddStaticVehicle(modelid, Float:x, Float:y, Float:z, Float:rotation, color1, color2)
  474. {
  475. new
  476. vehicleid = AddStaticVehicle(modelid, x, y, z, rotation, color1, color2);
  477. if(vehicleid != INVALID_VEHICLE_ID)
  478. {
  479. CallLocalFunction("OnVehicleCreated", "iii", vehicleid, color1, color2);
  480. }
  481. return vehicleid;
  482. }
  483. stock CB_AddStaticVehicleEx(modelid, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay, addsiren = 0)
  484. {
  485. new
  486. vehicleid = AddStaticVehicleEx(modelid, x, y, z, rotation, color1, color2, respawn_delay, addsiren);
  487. if(vehicleid != INVALID_VEHICLE_ID)
  488. {
  489. CallLocalFunction("OnVehicleCreated", "iii", vehicleid, color1, color2);
  490. }
  491. return vehicleid;
  492. }
  493. stock CB_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
  494. {
  495. new
  496. ret = ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync);
  497. if(ret)
  498. {
  499. SetTimerEx("Callback_CheckAnimation", 100, false, "i", playerid);
  500. }
  501. return ret;
  502. }
  503. stock CB_SelectTextDraw(playerid, hovercolor)
  504. {
  505. new
  506. ret = SelectTextDraw(playerid, hovercolor);
  507. if(ret)
  508. {
  509. s_aPlayerInfo[playerid][e_iHoverColor] = hovercolor;
  510. Callback_SetFlag(playerid, e_bSelectTD, true);
  511. }
  512. return ret;
  513. }
  514. stock CB_CancelSelectTextDraw(playerid)
  515. {
  516. new
  517. ret = CancelSelectTextDraw(playerid);
  518. if(ret)
  519. {
  520. s_aPlayerInfo[playerid][e_iHoverColor] = 0;
  521. Callback_SetFlag(playerid, e_bSelectTD, false);
  522. }
  523. return ret;
  524. }
  525. // --------------------------------------------------
  526. // SA-MP Callbacks
  527. // --------------------------------------------------
  528. public OnPlayerDisconnect(playerid, reason)
  529. {
  530. if(Callback_GetFlag(playerid, e_bHoldKey))
  531. {
  532. KillTimer(s_aPlayerInfo[playerid][e_iHoldTimer]);
  533. }
  534. for(new i = 0; i < e_PLAYER_TICK_ENUM; i ++)
  535. {
  536. s_aPlayerTickInfo[playerid][i] = 0;
  537. }
  538. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  539. s_aPlayerInfo[playerid][e_iLastGun] = 0;
  540. s_aPlayerInfo[playerid][e_iLastAmmo] = 0;
  541. s_aPlayerInfo[playerid][e_iFrames] = 0;
  542. s_aPlayerInfo[playerid][e_iDrunk] = 0;
  543. s_aPlayerInfo[playerid][e_iMoney] = 0;
  544. s_aPlayerInfo[playerid][e_iTargetID] = 0;
  545. s_aPlayerInfo[playerid][e_iAnimIndex] = 0;
  546. s_aPlayerInfo[playerid][e_iHoverColor] = 0;
  547. s_aPlayerInfo[playerid][e_fPacket] = 0.0;
  548. s_aPlayerInfo[playerid][e_iVehicleID] = INVALID_VEHICLE_ID;
  549. s_aPlayerInfo[playerid][e_bFlags] = e_PLAYER_FLAGS:0;
  550. for(new i = 0; i < 12; i ++)
  551. {
  552. s_aPlayerInfo[playerid][e_iShotsFired][i] = 0;
  553. }
  554. #if defined CB_OnPlayerDisconnect
  555. return CB_OnPlayerDisconnect(playerid, reason);
  556. #else
  557. return 1;
  558. #endif
  559. }
  560. public OnFilterScriptInit()
  561. {
  562. SetTimer("Callback_TabCheck", 600, true);
  563. #if defined CB_OnFilterScriptInit
  564. return CB_OnFilterScriptInit();
  565. #else
  566. return 1;
  567. #endif
  568. }
  569. public OnGameModeInit()
  570. {
  571. SetTimer("Callback_TabCheck", 600, true);
  572. #if defined CB_OnGameModeInit
  573. return CB_OnGameModeInit();
  574. #else
  575. return 1;
  576. #endif
  577. }
  578. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  579. {
  580. new
  581. capacity = Callback_GetMaxClip(weaponid),
  582. teamid = GetPlayerTeam(playerid);
  583. if((teamid != NO_TEAM && hittype == BULLET_HIT_TYPE_PLAYER) && GetPlayerTeam(hitid) == teamid)
  584. {
  585. CallLocalFunction("OnPlayerFriendlyFire", "iii", playerid, hitid, weaponid);
  586. }
  587. if(GetPlayerWeaponState(playerid) == WEAPONSTATE_LAST_BULLET && GetPlayerAmmo(playerid) == 1)
  588. {
  589. CallLocalFunction("OnPlayerEmptyWeapon", "ii", playerid, weaponid);
  590. }
  591. if((WEAPON_COLT45 <= weaponid <= WEAPON_TEC9) && weaponid != WEAPON_SHOTGUN)
  592. {
  593. new
  594. index = (weaponid - WEAPON_COLT45);
  595. s_aPlayerInfo[playerid][e_iShotsFired][index]++;
  596. if(s_aPlayerInfo[playerid][e_iShotsFired][index] - capacity >= MAX_ACCUMULATED_SHOTS)
  597. {
  598. CallLocalFunction("OnPlayerAntiReload", "ii", playerid, weaponid);
  599. s_aPlayerInfo[playerid][e_iShotsFired][index] = 0;
  600. }
  601. }
  602. if(s_aPlayerInfo[playerid][e_iAction] != PLAYER_ACTION_SHOOTING)
  603. {
  604. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_SHOOTING);
  605. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SHOOTING;
  606. }
  607. s_aPlayerTickInfo[playerid][e_PLAYER_LAST_SHOT] = GetConnectedTime(playerid);
  608. #if defined CB_OnPlayerWeaponShot
  609. return CB_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
  610. #else
  611. return 1;
  612. #endif
  613. }
  614. public OnPlayerUpdate(playerid)
  615. {
  616. new
  617. weaponid = GetPlayerWeapon(playerid),
  618. level = GetPlayerDrunkLevel(playerid),
  619. Float:health,
  620. animlib[32],
  621. animname[32];
  622. if(IsPlayerSkydiving(playerid) && s_aPlayerInfo[playerid][e_iAction] != PLAYER_ACTION_SKYDIVING)
  623. {
  624. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_SKYDIVING);
  625. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SKYDIVING;
  626. }
  627. else if(!IsPlayerSkydiving(playerid) && s_aPlayerInfo[playerid][e_iAction] == PLAYER_ACTION_SKYDIVING)
  628. {
  629. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_NONE);
  630. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SKYDIVING;
  631. }
  632. else if(IsPlayerSwimming(playerid) && s_aPlayerInfo[playerid][e_iAction] != PLAYER_ACTION_SWIMMING)
  633. {
  634. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_SWIMMING);
  635. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_SWIMMING;
  636. }
  637. else if(!IsPlayerSwimming(playerid) && s_aPlayerInfo[playerid][e_iAction] == PLAYER_ACTION_SWIMMING)
  638. {
  639. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_NONE);
  640. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  641. }
  642. else if(s_aPlayerInfo[playerid][e_iAction] == PLAYER_ACTION_SHOOTING && (GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_LAST_SHOT]) > 1200)
  643. {
  644. CallLocalFunction("OnPlayerActionChange", "iii", playerid, s_aPlayerInfo[playerid][e_iAction], PLAYER_ACTION_NONE);
  645. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  646. }
  647. if((GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_BURN_TICK]) >= 1500 && Callback_GetFlag(playerid, e_bBurning))
  648. {
  649. Callback_SetFlag(playerid, e_bBurning, false);
  650. CallLocalFunction("OnPlayerStopBurn", "i", playerid);
  651. }
  652. switch(GetPlayerState(playerid))
  653. {
  654. case PLAYER_STATE_ONFOOT:
  655. {
  656. if(!s_aPlayerInfo[playerid][e_iTargetID] && GetPlayerTargetPlayer(playerid) == INVALID_PLAYER_ID)
  657. {
  658. s_aPlayerInfo[playerid][e_iTargetID] = INVALID_PLAYER_ID;
  659. }
  660. else if(GetPlayerTargetPlayer(playerid) != s_aPlayerInfo[playerid][e_iTargetID])
  661. {
  662. CallLocalFunction("OnPlayerTargetPlayer", "iii", playerid, s_aPlayerInfo[playerid][e_iTargetID], GetPlayerWeapon(playerid));
  663. s_aPlayerInfo[playerid][e_iTargetID] = GetPlayerTargetPlayer(playerid);
  664. }
  665. if(!Callback_GetFlag(playerid, e_bReloading) && (WEAPON_COLT45 <= weaponid <= WEAPON_SNIPER) && GetPlayerWeaponState(playerid) == WEAPONSTATE_RELOADING)
  666. {
  667. Callback_SetFlag(playerid, e_bReloading, true);
  668. CallLocalFunction("OnPlayerReloadWeapon", "iii", playerid, weaponid, GetPlayerAmmo(playerid));
  669. }
  670. else if(GetPlayerWeaponState(playerid) != WEAPONSTATE_RELOADING)
  671. {
  672. Callback_SetFlag(playerid, e_bReloading, false);
  673. }
  674. for(new i = 0; i < sizeof(s_aVendingMachines); i ++)
  675. {
  676. 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]))
  677. {
  678. if(GetPlayerAnimationIndex(playerid) == 1660 && (GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_VENDING_TICK]) > 3500)
  679. {
  680. CallLocalFunction("OnPlayerUseVending", "ii", playerid, s_aVendingMachines[i][e_VENDING_MACHINE_TYPE]);
  681. s_aPlayerTickInfo[playerid][e_PLAYER_VENDING_TICK] = GetConnectedTime(playerid);
  682. return 1;
  683. }
  684. }
  685. }
  686. if((GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_LAST_JUMP] >= 1000) && IsPlayerJumping(playerid))
  687. {
  688. CallLocalFunction("OnPlayerJump", "i", playerid);
  689. s_aPlayerTickInfo[playerid][e_PLAYER_LAST_JUMP] = GetConnectedTime(playerid);
  690. }
  691. }
  692. case PLAYER_STATE_DRIVER:
  693. {
  694. new
  695. money = GetPlayerMoney(playerid);
  696. if(s_aPlayerInfo[playerid][e_iMoney] != money)
  697. {
  698. if(GetPlayerCameraMode(playerid) == 15)
  699. {
  700. switch(s_aPlayerInfo[playerid][e_iMoney] - money)
  701. {
  702. case 100:
  703. {
  704. if(IsPlayerNearGarage(playerid, GARAGE_PAYNSPRAY))
  705. {
  706. CallLocalFunction("OnPlayerUseGarage", "iii", playerid, GetPlayerVehicleID(playerid), GARAGE_PAYNSPRAY);
  707. }
  708. }
  709. case 500:
  710. {
  711. if(IsPlayerNearGarage(playerid, GARAGE_BOMBSHOP))
  712. {
  713. CallLocalFunction("OnPlayerUseGarage", "iii", playerid, GetPlayerVehicleID(playerid), GARAGE_BOMBSHOP);
  714. }
  715. }
  716. }
  717. }
  718. s_aPlayerInfo[playerid][e_iMoney] = money;
  719. }
  720. new
  721. vehicleid = GetPlayerVehicleID(playerid),
  722. panels,
  723. doors,
  724. lights,
  725. tires
  726. ;
  727. GetVehicleHealth(vehicleid, health);
  728. 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)
  729. {
  730. GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires);
  731. if(s_aVehicleInfo[vehicleid][e_iPanels] != panels || s_aVehicleInfo[vehicleid][e_iDoors] != doors || s_aVehicleInfo[vehicleid][e_iLights] != lights)
  732. {
  733. CallLocalFunction("OnPlayerCrashVehicle", "iif", playerid, vehicleid, floatsub(s_aVehicleInfo[vehicleid][e_fHealth], health));
  734. }
  735. GetVehicleDamageStatus(vehicleid, s_aVehicleInfo[vehicleid][e_iPanels], s_aVehicleInfo[vehicleid][e_iDoors], s_aVehicleInfo[vehicleid][e_iLights], tires);
  736. }
  737. s_aVehicleInfo[vehicleid][e_fHealth] = health;
  738. s_aVehicleInfo[vehicleid][e_fSpeed] = Callback_GetSpeed(vehicleid);
  739. }
  740. }
  741. new
  742. difference = s_aPlayerInfo[playerid][e_iDrunk] - level;
  743. if(GetPlayerDrunkLevel(playerid) < 100)
  744. {
  745. SetPlayerDrunkLevel(playerid, 2000);
  746. }
  747. else if(s_aPlayerInfo[playerid][e_iDrunk] != level)
  748. {
  749. if((0 <= difference <= 200) && s_aPlayerInfo[playerid][e_iFrames] != difference)
  750. {
  751. if(s_aPlayerInfo[playerid][e_iFrames] < 0)
  752. {
  753. s_aPlayerInfo[playerid][e_iFrames] = 0;
  754. }
  755. CallLocalFunction("OnPlayerFPSChange", "iii", playerid, s_aPlayerInfo[playerid][e_iFrames], difference);
  756. }
  757. s_aPlayerInfo[playerid][e_iFrames] = difference;
  758. s_aPlayerInfo[playerid][e_iDrunk] = level;
  759. }
  760. new
  761. Float:packet = NetStats_PacketLossPercent(playerid);
  762. if(floatcmp(packet, 0.0) != 0 && floatcmp(packet, s_aPlayerInfo[playerid][e_fPacket]) != 0)
  763. {
  764. CallLocalFunction("OnPlayerPacketLoss", "iff", playerid, s_aPlayerInfo[playerid][e_fPacket], packet);
  765. s_aPlayerInfo[playerid][e_fPacket] = packet;
  766. }
  767. if(Callback_GetFlag(playerid, e_bAnimSet) && s_aPlayerInfo[playerid][e_iAnimIndex] != GetPlayerAnimationIndex(playerid))
  768. {
  769. Callback_SetFlag(playerid, e_bAnimSet, false);
  770. GetAnimationName(s_aPlayerInfo[playerid][e_iAnimIndex], animlib, sizeof(animlib), animname, sizeof(animname));
  771. if(strlen(animlib) > 0 && strlen(animname) > 0)
  772. {
  773. CallLocalFunction("OnPlayerAnimationPlay", "iss", playerid, animlib, animname);
  774. }
  775. }
  776. new
  777. ammo = GetPlayerAmmo(playerid);
  778. if(s_aPlayerInfo[playerid][e_iLastAmmo] != ammo)
  779. {
  780. if(GetPlayerWeapon(playerid) == WEAPON_CAMERA && s_aPlayerInfo[playerid][e_iLastAmmo] > ammo)
  781. {
  782. CallLocalFunction("OnPlayerUseCamera", "i", playerid);
  783. }
  784. else if(GetPlayerWeapon(playerid) == WEAPON_SPRAYCAN && s_aPlayerInfo[playerid][e_iLastAmmo] > ammo)
  785. {
  786. for(new i = 1, l = GetVehiclePoolSize(); i <= l; i ++)
  787. {
  788. if(IsPlayerSprayingVehicle(playerid, i))
  789. {
  790. CallLocalFunction("OnPlayerSprayAtVehicle", "ii", playerid, i);
  791. break;
  792. }
  793. }
  794. }
  795. s_aPlayerInfo[playerid][e_iLastAmmo] = ammo;
  796. }
  797. if(s_aPlayerInfo[playerid][e_iLastGun] != weaponid)
  798. {
  799. new
  800. lastweapon = s_aPlayerInfo[playerid][e_iLastGun];
  801. if((WEAPON_COLT45 <= lastweapon <= WEAPON_TEC9) && lastweapon != WEAPON_SHOTGUN)
  802. {
  803. s_aPlayerInfo[playerid][e_iShotsFired][lastweapon - WEAPON_COLT45] = 0;
  804. }
  805. s_aPlayerInfo[playerid][e_iLastGun] = weaponid;
  806. }
  807. else
  808. {
  809. if((WEAPON_COLT45 <= weaponid <= WEAPON_TEC9) && weaponid != WEAPON_SHOTGUN && GetPlayerWeaponState(playerid) == WEAPONSTATE_RELOADING)
  810. {
  811. s_aPlayerInfo[playerid][e_iShotsFired][weaponid - WEAPON_COLT45] = 0;
  812. }
  813. }
  814. if(!Callback_GetFlag(playerid, e_bUpdate))
  815. {
  816. Callback_SetFlag(playerid, e_bUpdate, true);
  817. }
  818. s_aPlayerTickInfo[playerid][e_PLAYER_LAST_UPDATE] = GetConnectedTime(playerid);
  819. #if defined CB_OnPlayerUpdate
  820. return CB_OnPlayerUpdate(playerid);
  821. #else
  822. return 1;
  823. #endif
  824. }
  825. public OnPlayerStateChange(playerid, newstate, oldstate)
  826. {
  827. new
  828. vehicleid = GetPlayerVehicleID(playerid);
  829. switch(newstate)
  830. {
  831. case PLAYER_STATE_DRIVER:
  832. {
  833. GetVehicleHealth(vehicleid, s_aVehicleInfo[vehicleid][e_fHealth]);
  834. s_aPlayerInfo[playerid][e_iVehicleID] = vehicleid;
  835. }
  836. case PLAYER_STATE_WASTED:
  837. {
  838. s_aPlayerInfo[playerid][e_iAction] = PLAYER_ACTION_NONE;
  839. }
  840. case PLAYER_STATE_ONFOOT:
  841. {
  842. if(oldstate == PLAYER_STATE_DRIVER && GetVehicleModel(s_aPlayerInfo[playerid][e_iVehicleID]))
  843. {
  844. new
  845. driverid = Callback_GetDriver(s_aPlayerInfo[playerid][e_iVehicleID]);
  846. if(driverid != INVALID_PLAYER_ID)
  847. {
  848. CallLocalFunction("OnPlayerJackVehicle", "iii", driverid, playerid, s_aPlayerInfo[playerid][e_iVehicleID]);
  849. }
  850. s_aPlayerInfo[playerid][e_iVehicleID] = INVALID_VEHICLE_ID;
  851. }
  852. }
  853. }
  854. #if defined CB_OnPlayerStateChange
  855. return CB_OnPlayerStateChange(playerid, newstate, oldstate);
  856. #else
  857. return 1;
  858. #endif
  859. }
  860. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  861. {
  862. new
  863. weaponid = GetPlayerWeapon(playerid);
  864. if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING && GetPlayerState(playerid) != PLAYER_STATE_SPAWNED && GetPlayerState(playerid) != PLAYER_STATE_WASTED)
  865. {
  866. if(!Callback_GetFlag(playerid, e_bHoldKey))
  867. {
  868. Callback_SetFlag(playerid, e_bHoldKey, true);
  869. s_aPlayerTickInfo[playerid][e_PLAYER_TICK] = GetConnectedTime(playerid);
  870. s_aPlayerInfo[playerid][e_iHoldTimer] = SetTimerEx("Callback_HoldTimer", 200, true, "ii", playerid, newkeys);
  871. }
  872. if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
  873. {
  874. if((WEAPON_COLT45 <= weaponid <= WEAPON_CAMERA) && weaponid != WEAPON_BOMB)
  875. {
  876. if(!Callback_GetFlag(playerid, e_bAiming) && (newkeys & KEY_HANDBRAKE) & KEY_HANDBRAKE)
  877. {
  878. Callback_SetFlag(playerid, e_bAiming, true);
  879. CallLocalFunction("OnPlayerStartAim", "ii", playerid, weaponid);
  880. }
  881. else if((newkeys & KEY_HANDBRAKE) != KEY_HANDBRAKE && (oldkeys & KEY_HANDBRAKE) == KEY_HANDBRAKE)
  882. {
  883. Callback_SetFlag(playerid, e_bAiming, false);
  884. CallLocalFunction("OnPlayerStopAim", "i", playerid);
  885. }
  886. }
  887. }
  888. }
  889. #if defined CB_OnPlayerKeyStateChange
  890. return CB_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  891. #else
  892. return 1;
  893. #endif
  894. }
  895. public OnPlayerClickTextDraw(playerid, Text:clickedid)
  896. {
  897. if(clickedid == Text:INVALID_TEXT_DRAW && Callback_GetFlag(playerid, e_bSelectTD))
  898. {
  899. Callback_SetFlag(playerid, e_bSelectTD, false);
  900. CallLocalFunction("OnPlayerHideCursor", "ii", playerid, s_aPlayerInfo[playerid][e_iHoverColor]);
  901. }
  902. #if defined CB_OnPlayerClickTextDraw
  903. return CB_OnPlayerClickTextDraw(playerid, clickedid);
  904. #else
  905. return 0;
  906. #endif
  907. }
  908. public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
  909. {
  910. if(weaponid == WEAPON_COLLISION && issuerid == INVALID_PLAYER_ID && amount >= 4.95)
  911. {
  912. CallLocalFunction("OnPlayerFall", "if", playerid, amount);
  913. }
  914. if(weaponid == WEAPON_VEHICLE && issuerid != INVALID_PLAYER_ID)
  915. {
  916. CallLocalFunction("OnPlayerRamPlayer", "iiif", playerid, issuerid, GetPlayerVehicleID(issuerid), amount);
  917. }
  918. if(weaponid == WEAPON_FLAMETHROWER)
  919. {
  920. if(!Callback_GetFlag(playerid, e_bBurning))
  921. {
  922. Callback_SetFlag(playerid, e_bBurning, true);
  923. CallLocalFunction("OnPlayerStartBurn", "i", playerid);
  924. }
  925. s_aPlayerTickInfo[playerid][e_PLAYER_BURN_TICK] = GetConnectedTime(playerid);
  926. }
  927. #if defined CB_OnPlayerTakeDamage
  928. return CB_OnPlayerTakeDamage(playerid, issuerid, amount, weaponid, bodypart);
  929. #else
  930. return 1;
  931. #endif
  932. }
  933. // --------------------------------------------------
  934. // Timers
  935. // --------------------------------------------------
  936. forward Callback_CheckAnimation(playerid);
  937. public Callback_CheckAnimation(playerid)
  938. {
  939. s_aPlayerInfo[playerid][e_iAnimIndex] = GetPlayerAnimationIndex(playerid);
  940. Callback_SetFlag(playerid, e_bAnimSet, true);
  941. }
  942. forward Callback_HoldTimer(playerid, key);
  943. public Callback_HoldTimer(playerid, key)
  944. {
  945. new
  946. keys,
  947. ud,
  948. lr;
  949. GetPlayerKeys(playerid, keys, ud, lr);
  950. if(keys & key)
  951. {
  952. Callback_SetFlag(playerid, e_bKeyPress, true);
  953. CallLocalFunction("OnPlayerHoldingKey", "ii", playerid, key);
  954. }
  955. else
  956. {
  957. if(Callback_GetFlag(playerid, e_bKeyPress))
  958. {
  959. CallLocalFunction("OnPlayerReleaseKey", "iii", playerid, key, GetConnectedTime(playerid) - s_aPlayerTickInfo[playerid][e_PLAYER_TICK]);
  960. }
  961. KillTimer(s_aPlayerInfo[playerid][e_iHoldTimer]);
  962. Callback_SetFlag(playerid, e_bKeyPress, false);
  963. Callback_SetFlag(playerid, e_bHoldKey, false);
  964. }
  965. }
  966. forward Callback_TabCheck();
  967. public Callback_TabCheck()
  968. {
  969. for(new i = 0, l = GetPlayerPoolSize(); i <= l; i ++)
  970. {
  971. switch(GetPlayerState(i))
  972. {
  973. case PLAYER_STATE_ONFOOT, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER:
  974. {
  975. if(Callback_GetFlag(i, e_bUpdate))
  976. {
  977. if(Callback_GetFlag(i, e_bPaused))
  978. {
  979. CallLocalFunction("OnPlayerResume", "ii", i, GetConnectedTime(i) - s_aPlayerTickInfo[i][e_PLAYER_TICK]);
  980. }
  981. Callback_SetFlag(i, e_bUpdate, false);
  982. Callback_SetFlag(i, e_bPaused, false);
  983. }
  984. if(!Callback_GetFlag(i, e_bPaused) && (GetConnectedTime(i) - s_aPlayerTickInfo[i][e_PLAYER_LAST_UPDATE]) >= 4000)
  985. {
  986. CallLocalFunction("OnPlayerPause", "i", i);
  987. s_aPlayerTickInfo[i][e_PLAYER_TICK] = GetConnectedTime(i);
  988. Callback_SetFlag(i, e_bPaused, true);
  989. }
  990. }
  991. }
  992. }
  993. }
  994. // --------------------------------------------------
  995. // Native hooks
  996. // --------------------------------------------------
  997. #if defined _ALS_CreateVehicle
  998. #undef CreateVehicle
  999. #else
  1000. #define _ALS_CreateVehicle
  1001. #endif
  1002. #if defined _ALS_AddStaticVehicle
  1003. #undef AddStaticVehicle
  1004. #else
  1005. #define _ALS_AddStaticVehicle
  1006. #endif
  1007. #if defined _ALS_AddStaticVehicleEx
  1008. #undef AddStaticVehicleEx
  1009. #else
  1010. #define _ALS_AddStaticVehicleEx
  1011. #endif
  1012. #if defined _ALS_ApplyAnimation
  1013. #undef ApplyAnimation
  1014. #else
  1015. #define _ALS_ApplyAnimation
  1016. #endif
  1017. #if defined _ALS_SelectTextDraw
  1018. #undef SelectTextDraw
  1019. #else
  1020. #define _ALS_SelectTextDraw
  1021. #endif
  1022. #if defined _ALS_CancelSelectTextDraw
  1023. #undef CancelSelectTextDraw
  1024. #else
  1025. #define _ALS_CancelSelectTextDraw
  1026. #endif
  1027. #define CreateVehicle CB_CreateVehicle
  1028. #define AddStaticVehicle CB_AddStaticVehicle
  1029. #define AddStaticVehicleEx CB_AddStaticVehicleEx
  1030. #define ApplyAnimation CB_ApplyAnimation
  1031. #define SelectTextDraw CB_SelectTextDraw
  1032. #define CancelSelectTextDraw CB_CancelSelectTextDraw
  1033. // --------------------------------------------------
  1034. // Callback hooks
  1035. // --------------------------------------------------
  1036. #if defined _ALS_OnFilterScriptInit
  1037. #undef OnFilterScriptInit
  1038. #else
  1039. #define _ALS_OnFilterScriptInit
  1040. #endif
  1041. #if defined _ALS_OnGameModeInit
  1042. #undef OnGameModeInit
  1043. #else
  1044. #define _ALS_OnGameModeInit
  1045. #endif
  1046. #if defined _ALS_OnPlayerDisconnect
  1047. #undef OnPlayerDisconnect
  1048. #else
  1049. #define _ALS_OnPlayerDisconnect
  1050. #endif
  1051. #if defined _ALS_OnPlayerStateChange
  1052. #undef OnPlayerStateChange
  1053. #else
  1054. #define _ALS_OnPlayerStateChange
  1055. #endif
  1056. #if defined _ALS_OnPlayerKeyStateChange
  1057. #undef OnPlayerKeyStateChange
  1058. #else
  1059. #define _ALS_OnPlayerKeyStateChange
  1060. #endif
  1061. #if defined _ALS_OnPlayerUpdate
  1062. #undef OnPlayerUpdate
  1063. #else
  1064. #define _ALS_OnPlayerUpdate
  1065. #endif
  1066. #if defined _ALS_OnPlayerWeaponShot
  1067. #undef OnPlayerWeaponShot
  1068. #else
  1069. #define _ALS_OnPlayerWeaponShot
  1070. #endif
  1071. #if defined _ALS_OnPlayerClickTextDraw
  1072. #undef OnPlayerClickTextDraw
  1073. #else
  1074. #define _ALS_OnPlayerClickTextDraw
  1075. #endif
  1076. #if defined _ALS_OnPlayerTakeDamage
  1077. #undef OnPlayerTakeDamage
  1078. #else
  1079. #define _ALS_OnPlayerTakeDamage
  1080. #endif
  1081. #define OnFilterScriptInit CB_OnFilterScriptInit
  1082. #define OnGameModeInit CB_OnGameModeInit
  1083. #define OnPlayerDisconnect CB_OnPlayerDisconnect
  1084. #define OnPlayerUpdate CB_OnPlayerUpdate
  1085. #define OnPlayerStateChange CB_OnPlayerStateChange
  1086. #define OnPlayerKeyStateChange CB_OnPlayerKeyStateChange
  1087. #define OnPlayerWeaponShot CB_OnPlayerWeaponShot
  1088. #define OnPlayerClickTextDraw CB_OnPlayerClickTextDraw
  1089. #define OnPlayerTakeDamage CB_OnPlayerTakeDamage
  1090. #if defined CB_OnPlayerUpdate
  1091. forward CB_OnPlayerUpdate(playerid);
  1092. #endif
  1093. #if defined CB_OnFilterScriptInit
  1094. forward CB_OnFilterScriptInit();
  1095. #endif
  1096. #if defined CB_OnGameModeInit
  1097. forward CB_OnGameModeInit();
  1098. #endif
  1099. #if defined CB_OnPlayerDisconnect
  1100. forward CB_OnPlayerDisconnect(playerid, reason);
  1101. #endif
  1102. #if defined CB_OnPlayerStateChange
  1103. forward CB_OnPlayerStateChange(playerid, newstate, oldstate);
  1104. #endif
  1105. #if defined CB_OnPlayerKeyStateChange
  1106. forward CB_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  1107. #endif
  1108. #if defined CB_OnPlayerWeaponShot
  1109. forward CB_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
  1110. #endif
  1111. #if defined CB_OnPlayerClickTextDraw
  1112. forward CB_OnPlayerClickTextDraw(playerid, Text:clickedid);
  1113. #endif
  1114. #if defined CB_OnPlayerTakeDamage
  1115. forward CB_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart);
  1116. #endif