Advertisement
Guest User

Cops.inc

a guest
Jan 29th, 2019
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.16 KB | None | 0 0
  1. //Made by lokii.
  2.  
  3. #if !defined _inc_a_samp
  4. #error COPS.inc: Please include a_samp before COPS
  5. #endif
  6.  
  7. #if !defined _inc_fcnpc
  8. #error COPS.inc: Please include FCNPC before COPS
  9. #endif
  10.  
  11. #if FCNPC_INCLUDE_VERSION < 200
  12. #error COPS.inc: Please download fcnpc 2.0.0
  13. #endif
  14.  
  15. #if !defined MAX_COPS
  16. #define MAX_COPS (50)
  17. #endif
  18.  
  19. #define cops_version 10
  20.  
  21. /*
  22. native Natives();
  23. native
  24. native CreateCop(skinid, name[], Float:detection_area, Float:health, Float:x, Float:y, Float:z, Float:angle, weapon, Float:accuracy);
  25. native IsCopDead(cop_id);
  26. native IsCopInvulnerable(cop_id);
  27. native IsCopMoving(cop_id);
  28. native IsCopValid(cop_id);
  29. native GetCopHealth(cop_id);
  30. native GetCopTarget(cop_id);
  31. native GetClosestPlayerToCop(cop_id);
  32. native GetCopDetectionArea(cop_id);
  33. native GetCopPos(cop_id, &Float:x, &Float:y, &Float:z);
  34. native GetCopAngle(cop_id, &Float:angle);
  35. native GetCopCreationPos(cop_id, &Float:x, &Float:y, &Float:z);
  36. native GetCopCreationAngle(cop_id, &Float:angle);
  37. native GetCopInterior(cop_id);
  38. native GetCopVirtualWorld(cop_id);
  39. native GetCopSkin(cop_id);
  40. native GetCopCustomSkin(cop_id);
  41. native GetCopWeapon(cop_id);
  42. native SetCopWeapon(cop_id, weaponid);
  43. native SetCopInvulnerable(cop_id, bool:invulnerable);
  44. native SetCopSkin(cop_id, skinid);
  45. native SetCopInterior(cop_id, interiorid);
  46. native SetCopVirtualWorld(cop_id, worldid);
  47. native SetCopHealth(cop_id, Float:health);
  48. native RespawnCop(cop_id);
  49. native DestroyCop(cop_id);
  50. native DestroyAllCops();
  51. native
  52. native Callbacks();
  53. native
  54. native OnCopDeath(cop_id, killerid, weaponid);
  55. native OnCopTakeDamage(cop_id, damagerid, weaponid, bodypart, Float:health_loss);
  56. native OnCopKillPlayer(cop_id, playerid);
  57. native OnCrimeHappenNearCop(playerid, crime);
  58. */
  59.  
  60. #define CRIME_KILL 0
  61. #define CRIME_SHOOT 1
  62. #define CRIME_DAMAGE 2
  63.  
  64. static g_CopReferences[MAX_PLAYERS] = { -1, ... };
  65.  
  66. enum ee_cops
  67. {
  68. bool:cop_exist,
  69. cop_time,
  70. copid,
  71. cop_target,
  72. Float:cop_detection,
  73. Float:cop_pos_x,
  74. Float:cop_pos_y,
  75. Float:cop_pos_z,
  76. Float:cop_angle
  77. }
  78. static e_cops[MAX_COPS][ee_cops];
  79.  
  80. stock SetCopInterior(cop_id, interiorid)
  81. {
  82. if(IsCopValid(cop_id))
  83. {
  84. FCNPC_SetInterior(e_cops[cop_id][copid], interiorid);
  85. return 1;
  86. }
  87. return 0;
  88. }
  89.  
  90. stock GetCopInterior(cop_id)
  91. {
  92. if(IsCopValid(cop_id))
  93. {
  94. return FCNPC_GetInterior(e_cops[cop_id][copid]);
  95. }
  96. return 0;
  97. }
  98.  
  99. stock SetCopVirtualWorld(cop_id, worldid)
  100. {
  101. if(IsCopValid(cop_id))
  102. {
  103. FCNPC_SetVirtualWorld(e_cops[cop_id][copid], worldid);
  104. return 1;
  105. }
  106. return 0;
  107. }
  108.  
  109. stock GetCopVirtualWorld(cop_id)
  110. {
  111. if(IsCopValid(cop_id))
  112. {
  113. return FCNPC_GetVirtualWorld(e_cops[cop_id][copid]);
  114. }
  115. return 0;
  116. }
  117.  
  118. stock GetCopCreationPos(cop_id, &Float:x, &Float:y, &Float:z)
  119. {
  120. if(IsCopValid(cop_id))
  121. {
  122. x = e_cops[cop_id][cop_pos_x];
  123. y = e_cops[cop_id][cop_pos_y];
  124. z = e_cops[cop_id][cop_pos_z];
  125. return 1;
  126. }
  127. return 0;
  128. }
  129.  
  130. stock GetCopCreationAngle(cop_id, &Float:angle)
  131. {
  132. if(IsCopValid(cop_id))
  133. {
  134. angle = e_cops[cop_id][cop_angle];
  135. return 1;
  136. }
  137. return 0;
  138. }
  139.  
  140. stock GetCopAngle(cop_id, &Float:angle)
  141. {
  142. if(IsCopValid(cop_id))
  143. {
  144. angle = FCNPC_GetAngle(e_cops[cop_id][copid]);
  145. return 1;
  146. }
  147. return 0;
  148. }
  149.  
  150. stock bool:IsCopMoving(cop_id)
  151. {
  152. if(IsCopValid(cop_id))
  153. {
  154. return FCNPC_IsMoving(e_cops[cop_id][copid]);
  155. }
  156. return false;
  157. }
  158.  
  159. Float:GetCopDetectionArea(cop_id)
  160. {
  161. if(IsCopValid(cop_id))
  162. {
  163. return e_cops[cop_id][cop_detection];
  164. }
  165. return 0.0;
  166. }
  167.  
  168. IsCopValid(cop_id)
  169. {
  170. if(cop_id < 0 || cop_id >= MAX_COPS) return 0;
  171. return e_cops[cop_id][cop_exist];
  172. }
  173.  
  174. stock CreateCop(skinid, name[], Float:detection_area, Float:health, Float:x, Float:y, Float:z, Float:angle, weapon, Float:accuracy)
  175. {
  176. new id;
  177. for(new i = 0; i < MAX_COPS; i++)
  178. {
  179. if(IsCopValid(i)) continue;
  180. id = FCNPC_Create(name);
  181. if(FCNPC_IsValid(id))
  182. {
  183. e_cops[i][copid] = id;
  184. g_CopReferences[e_cops[i][copid]] = i;
  185. FCNPC_Spawn(e_cops[i][copid], skinid, x, y, z);
  186. FCNPC_SetHealth(e_cops[i][copid], health);
  187. FCNPC_SetAngle(e_cops[i][copid], angle);
  188. FCNPC_SetWeaponAccuracy(e_cops[i][copid], weapon, accuracy);
  189. FCNPC_SetWeapon(e_cops[i][copid], weapon);
  190. FCNPC_UseInfiniteAmmo(e_cops[i][copid], true);
  191. e_cops[i][cop_pos_x] = x;
  192. e_cops[i][cop_pos_y] = y;
  193. e_cops[i][cop_pos_z] = z;
  194. e_cops[i][cop_angle] = angle;
  195. e_cops[i][cop_detection] = detection_area;
  196. e_cops[i][cop_target] = 0xFFFF;
  197. e_cops[i][cop_exist] = true;
  198. return i;
  199. }
  200. }
  201. return 0xFFFF;
  202. }
  203.  
  204. stock SetCopWeapon(cop_id, weaponid)
  205. {
  206. if(IsCopValid(cop_id))
  207. {
  208. FCNPC_SetWeapon(e_cops[cop_id][copid], weaponid);
  209. return 1;
  210. }
  211. return 0;
  212. }
  213.  
  214. stock GetCopWeapon(cop_id)
  215. {
  216. if(IsCopValid(cop_id))
  217. {
  218. return FCNPC_GetWeapon(e_cops[cop_id][copid]);
  219. }
  220. return 0;
  221. }
  222.  
  223. stock GetCopPos(cop_id, &Float:x, &Float:y, &Float:z)
  224. {
  225. if(IsCopValid(cop_id))
  226. {
  227. FCNPC_GetPosition(e_cops[cop_id][copid], x, y, z);
  228. return 1;
  229. }
  230. return 0;
  231. }
  232.  
  233. stock Float:GetCopHealth(cop_id)
  234. {
  235. if(IsCopValid(cop_id))
  236. {
  237. return FCNPC_GetHealth(e_cops[cop_id][copid]);
  238. }
  239. return 0.0;
  240. }
  241.  
  242. stock bool:IsCopDead(cop_id)
  243. {
  244. if(IsCopValid(cop_id))
  245. {
  246. return FCNPC_IsDead(e_cops[cop_id][copid]);
  247. }
  248. return false;
  249. }
  250.  
  251. stock RespawnCop(cop_id)
  252. {
  253. if(IsCopValid(cop_id))
  254. {
  255. FCNPC_Respawn(e_cops[cop_id][copid]);
  256. FCNPC_SetPosition(e_cops[cop_id][copid], e_cops[cop_id][cop_pos_x], e_cops[cop_id][cop_pos_y], e_cops[cop_id][cop_pos_z]);
  257. FCNPC_SetAngle(e_cops[cop_id][copid], e_cops[cop_id][cop_angle]);
  258. return 1;
  259. }
  260. return 0;
  261. }
  262.  
  263. stock DestroyCop(cop_id)
  264. {
  265. if(IsCopValid(cop_id))
  266. {
  267. FCNPC_Destroy(e_cops[cop_id][copid]);
  268. e_cops[cop_id][cop_pos_x] = 0.0;
  269. e_cops[cop_id][cop_pos_y] = 0.0;
  270. e_cops[cop_id][cop_pos_z] = 0.0;
  271. e_cops[cop_id][cop_angle] = 0.0;
  272. e_cops[cop_id][cop_detection] = 0.0;
  273. e_cops[cop_id][cop_target] = 0xFFFF;
  274. g_CopReferences[cop_id] = -1;
  275. e_cops[cop_id][cop_exist] = false;
  276. return 1;
  277. }
  278. return 0;
  279. }
  280.  
  281. CopAttackPlayer(cop_id, playerid)
  282. {
  283. if(IsCopValid(cop_id) && IsPlayerConnected(playerid))
  284. {
  285. FCNPC_AimAtPlayer(e_cops[cop_id][copid], playerid, true, -1, true, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
  286. e_cops[cop_id][cop_target] = playerid;
  287. return playerid;
  288. }
  289. return 0xFFFF;
  290. }
  291.  
  292. stock SetCopHealth(cop_id, Float:health)
  293. {
  294. if(IsCopValid(cop_id))
  295. {
  296. FCNPC_SetHealth(e_cops[cop_id][copid], health);
  297. return 1;
  298. }
  299. return 0;
  300. }
  301.  
  302. GetCopTarget(cop_id)
  303. {
  304. if(cop_id < 0 || cop_id >= MAX_COPS) return 0xFFFF;
  305. if(IsCopValid(cop_id))
  306. {
  307. return e_cops[cop_id][cop_target];
  308. }
  309. return 0xFFFF;
  310. }
  311.  
  312. forward OnCopDeath(cop_id, killerid, weaponid);
  313.  
  314. public FCNPC_OnDeath(npcid, killerid, reason)
  315. {
  316. if(g_CopReferences[npcid] != -1 && killerid != 0xFFFF)
  317. CallLocalFunction("OnCopDeath", "iii", g_CopReferences[npcid], killerid, reason);
  318.  
  319. #if defined cops_FCNPC_OnDeath
  320. return cops_FCNPC_OnDeath(npcid, killerid, weaponid);
  321. #else
  322. return 1;
  323. #endif
  324. }
  325. #if defined _ALS_FCNPC_OnDeath
  326. #undef FCNPC_OnDeath
  327. #else
  328. #define _ALS_FCNPC_OnDeath
  329. #endif
  330. #define FCNPC_OnDeath cops_FCNPC_OnDeath
  331. #if defined cops_FCNPC_OnDeath
  332. forward cops_FCNPC_OnDeath(npcid, killerid, weaponid);
  333. #endif
  334.  
  335. stock GetClosestPlayerToCop(cop_id)
  336. {
  337. new id = -1, Float:tmp, Float:last = 99999, Float:x, Float:y, Float:z;
  338. if(IsCopValid(cop_id))
  339. {
  340. FCNPC_GetPosition(e_cops[copid][copid], x, y, z);
  341. for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
  342. {
  343. if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
  344. tmp = GetPlayerDistanceFromPoint(i, x, y, z);
  345. if(tmp >= last) continue;
  346. last = tmp;
  347. id = i;
  348. }
  349. }
  350. return id;
  351. }
  352.  
  353. public FCNPC_OnUpdate(npcid)
  354. {
  355. new Float:x, Float:y, Float:z;
  356. if(g_CopReferences[npcid] != -1)
  357. {
  358. if(e_cops[g_CopReferences[npcid]][cop_time] != gettime())
  359. {
  360. FCNPC_GetPosition(e_cops[g_CopReferences[npcid]][copid], x, y, z);
  361. for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
  362. {
  363. if(!IsPlayerConnected(i) || IsPlayerNPC(i) || GetPlayerInterior(i) != GetCopInterior(g_CopReferences[npcid]) || GetPlayerVirtualWorld(i) != GetCopVirtualWorld(g_CopReferences[npcid])) continue;
  364. if(GetCopTarget(g_CopReferences[npcid]) == i && GetPlayerWantedLevel(i) == 0 || GetCopTarget(g_CopReferences[npcid]) == i && GetPlayerDistanceFromPoint(i, x, y, z) > GetCopDetectionArea(g_CopReferences[npcid]))
  365. {
  366. FCNPC_Stop(e_cops[g_CopReferences[npcid]][copid]);
  367. FCNPC_StopAim(e_cops[g_CopReferences[npcid]][copid]);
  368. e_cops[g_CopReferences[npcid]][cop_target] = 0xFFFF;
  369. e_cops[g_CopReferences[npcid]][cop_time] = gettime();
  370. }
  371. else
  372. {
  373. if(GetPlayerWantedLevel(i) >= 1 && GetPlayerDistanceFromPoint(i, x, y, z) <= GetCopDetectionArea(g_CopReferences[npcid]))
  374. {
  375. CopAttackPlayer(g_CopReferences[npcid], i);
  376. if(GetPlayerDistanceFromPoint(i, x, y, z) >= GetCopDetectionArea(g_CopReferences[npcid])/2)
  377. {
  378. FCNPC_GoToPlayer(e_cops[g_CopReferences[npcid]][copid], i, FCNPC_MOVE_TYPE_AUTO, FCNPC_MOVE_SPEED_AUTO, FCNPC_MOVE_MODE_COLANDREAS, FCNPC_MOVE_PATHFINDING_RAYCAST, 5.0, true, 3.0, 1.5, 250);
  379. e_cops[g_CopReferences[npcid]][cop_time] = gettime();
  380. }
  381. e_cops[g_CopReferences[npcid]][cop_time] = gettime();
  382. }
  383. }
  384. }
  385. }
  386. }
  387.  
  388. #if defined cops_FCNPC_OnUpdate
  389. return cops_FCNPC_OnUpdate(npcid);
  390. #else
  391. return 1;
  392. #endif
  393. }
  394. #if defined _ALS_FCNPC_OnUpdate
  395. #undef FCNPC_OnUpdate
  396. #else
  397. #define _ALS_FCNPC_OnUpdate
  398. #endif
  399. #define FCNPC_OnUpdate cops_FCNPC_OnUpdate
  400. #if defined cops_FCNPC_OnUpdate
  401. forward cops_FCNPC_OnUpdate(npcid);
  402. #endif
  403.  
  404. forward OnCopTakeDamage(cop_id, damagerid, weaponid, bodypart, Float:health_loss);
  405.  
  406. public FCNPC_OnTakeDamage(npcid, issuerid, Float:amount, weaponid, bodypart)
  407. {
  408. if(issuerid == 0xFFFF) return 1;
  409. if(g_CopReferences[npcid] != -1)
  410. {
  411. CallLocalFunction("OnCopTakeDamage", "iiiif", g_CopReferences[npcid], issuerid, weaponid, bodypart, amount);
  412. }
  413.  
  414. #if defined cops_FCNPC_OnTakeDamage
  415. return cops_FCNPC_OnTakeDamage(npcid, issuerid, Float:amount, weaponid, bodypart);
  416. #else
  417. return 1;
  418. #endif
  419. }
  420. #if defined _ALS_FCNPC_OnTakeDamage
  421. #undef FCNPC_OnTakeDamage
  422. #else
  423. #define _ALS_FCNPC_OnTakeDamage
  424. #endif
  425. #define FCNPC_OnTakeDamage cops_FCNPC_OnTakeDamage
  426. #if defined cops_FCNPC_OnTakeDamage
  427. forward cops_FCNPC_OnTakeDamage(npcid, issuerid, Float:amount, weaponid, bodypart);
  428. #endif
  429.  
  430. forward OnCopKillPlayer(cop_id, playerid);
  431.  
  432. public OnPlayerDeath(playerid, killerid, reason)
  433. {
  434. new Float:x, Float:y, Float:z;
  435. if(killerid == 0xFFFF) return 1;
  436. for(new i = 0; i < MAX_COPS; i ++)
  437. {
  438. if(!IsCopValid(i)) continue;
  439. if(!IsPlayerNPC(killerid))
  440. {
  441. GetCopPos(i, x, y, z);
  442. if(!IsPlayerInRangeOfPoint(playerid, GetCopDetectionArea(i), x, y, z)) continue;
  443. CallLocalFunction("OnCrimeHappenNearCop", "ii", killerid, CRIME_KILL);
  444. break;
  445. }
  446. if(IsPlayerNPC(killerid))
  447. {
  448. CallLocalFunction("OnCopKillPlayer", "ii", i, playerid);
  449. break;
  450. }
  451. }
  452.  
  453. #if defined cops_OnPlayerDeath
  454. return cops_OnPlayerDeath(playerid, killerid, reason);
  455. #else
  456. return 1;
  457. #endif
  458. }
  459. #if defined _ALS_OnPlayerDeath
  460. #undef OnPlayerDeath
  461. #else
  462. #define _ALS_OnPlayerDeath
  463. #endif
  464. #define OnPlayerDeath cops_OnPlayerDeath
  465. #if defined cops_OnPlayerDeath
  466. forward cops_OnPlayerDeath(playerid, killerid, reason);
  467. #endif
  468.  
  469. forward OnCrimeHappenNearCop(playerid, crime);
  470.  
  471. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  472. {
  473. new Float:x, Float:y, Float:z;
  474. for(new i = 0; i < MAX_COPS; i ++)
  475. {
  476. if(!IsCopValid(i)) continue;
  477. GetCopPos(i, x, y, z);
  478. if(!IsPlayerInRangeOfPoint(playerid, GetCopDetectionArea(i), x, y, z)) continue;
  479. CallLocalFunction("OnCrimeHappenNearCop", "ii", playerid, CRIME_SHOOT);
  480. break;
  481. }
  482.  
  483. #if defined cops_OnPlayerWeaponShot
  484. return cops_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
  485. #else
  486. return 1;
  487. #endif
  488. }
  489. #if defined _ALS_OnPlayerWeaponShot
  490. #undef OnPlayerWeaponShot
  491. #else
  492. #define _ALS_OnPlayerWeaponShot
  493. #endif
  494. #define OnPlayerWeaponShot cops_OnPlayerWeaponShot
  495. #if defined cops_OnPlayerWeaponShot
  496. forward cops_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
  497. #endif
  498.  
  499. public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
  500. {
  501. new Float:x, Float:y, Float:z;
  502. if(issuerid == 0xFFFF || IsPlayerNPC(issuerid)) return 0;
  503. for(new i = 0; i < MAX_COPS; i ++)
  504. {
  505. if(!IsCopValid(i)) continue;
  506. GetCopPos(i, x, y, z);
  507. if(!IsPlayerInRangeOfPoint(playerid, GetCopDetectionArea(i), x, y, z)) continue;
  508. CallLocalFunction("OnCrimeHappenNearCop", "ii", issuerid, CRIME_DAMAGE);
  509. break;
  510. }
  511.  
  512. #if defined cops_OnPlayerTakeDamage
  513. return cops_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart);
  514. #else
  515. return 0;
  516. #endif
  517. }
  518. #if defined _ALS_OnPlayerTakeDamage
  519. #undef OnPlayerTakeDamage
  520. #else
  521. #define _ALS_OnPlayerTakeDamage
  522. #endif
  523. #define OnPlayerTakeDamage cops_OnPlayerTakeDamage
  524. #if defined cops_OnPlayerTakeDamage
  525. forward cops_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart);
  526. #endif
  527.  
  528. DestroyAllCops()
  529. {
  530. for(new i = 0; i < MAX_COPS; i++)
  531. {
  532. if(!IsCopValid(i)) continue;
  533. DestroyCop(i);
  534. }
  535. return 1;
  536. }
  537.  
  538. stock SetCopInvulnerable(cop_id, bool:invulnerable)
  539. {
  540. if(IsCopValid(cop_id))
  541. {
  542. FCNPC_SetInvulnerable(e_cops[cop_id][copid], invulnerable);
  543. return 1;
  544. }
  545. return 0;
  546. }
  547.  
  548. stock bool:IsCopInvulnerable(cop_id)
  549. {
  550. if(IsCopValid(cop_id))
  551. {
  552. return FCNPC_IsInvulnerable(e_cops[cop_id][copid]);
  553. }
  554. return false;
  555. }
  556.  
  557. stock SetCopSkin(cop_id, skinid)
  558. {
  559. if(IsCopValid(cop_id))
  560. {
  561. FCNPC_SetSkin(e_cops[cop_id][copid], skinid);
  562. return 1;
  563. }
  564. return 0;
  565. }
  566.  
  567. stock GetCopSkin(cop_id)
  568. {
  569. if(IsCopValid(cop_id))
  570. {
  571. return FCNPC_GetSkin(e_cops[cop_id][copid]);
  572. }
  573. return -1;
  574. }
  575.  
  576. stock GetCopCustomSkin(cop_id)
  577. {
  578. if(IsCopValid(cop_id))
  579. {
  580. return FCNPC_GetCustomSkin(e_cops[cop_id][copid]);
  581. }
  582. return -1;
  583. }
  584.  
  585. #if defined FILTERSCRIPT
  586.  
  587. public OnFilterScriptExit()
  588. {
  589. DestroyAllCops();
  590.  
  591. #if defined cops_OnFilterScriptExit
  592. return cops_OnFilterScriptExit();
  593. #else
  594. return 1;
  595. #endif
  596. }
  597. #if defined _ALS_OnFilterScriptExit
  598. #undef OnFilterScriptExit
  599. #else
  600. #define _ALS_OnFilterScriptExit
  601. #endif
  602. #define OnFilterScriptExit cops_OnFilterScriptExit
  603. #if defined cops_OnFilterScriptExit
  604. forward cops_OnFilterScriptExit();
  605. #endif
  606.  
  607. #else
  608.  
  609. public OnGameModeExit()
  610. {
  611. DestroyAllCops();
  612.  
  613. #if defined cops_OnGameModeExit
  614. return cops_OnGameModeExit();
  615. #else
  616. return 1;
  617. #endif
  618. }
  619. #if defined _ALS_OnGameModeExit
  620. #undef OnGameModeExit
  621. #else
  622. #define _ALS_OnGameModeExit
  623. #endif
  624. #define OnGameModeExit cops_OnGameModeExit
  625. #if defined cops_OnGameModeExit
  626. forward cops_OnGameModeExit();
  627. #endif
  628.  
  629. #endif
  630.  
  631.  
  632. //EOF.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement