Advertisement
Pedro_Sousa6

[Filterscript] Airdrop v1.0

Mar 3rd, 2016
1,710
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.73 KB | None | 0 0
  1. #include <a_samp> //Carrega include a_samp
  2. #include <streamer> //Carrega include streamer
  3. #define PRECO_AIRDROP 2000 //Aqui esta o preço que custa um AirDrop (Mude para o preço preferido)
  4. #define BALAS_KIT 100 //Aqui coloque a quantidade de balas que o player recebera para cada arma (no meu caso coloquei 100)
  5. #define COR_SELECIONAR 0xFF230AFF //Aqui define a cor que a textdraw ficara quando o mouse passar por cima (mude para a preferida)
  6. new Text:ADTD[13][MAX_PLAYERS]; //Variavel dos TextDraws
  7. new bool:PediuAirDrop[MAX_PLAYERS]; //Variavel boliviana que verifica se o player ja pediu ou não um AirDrop
  8. new TaNoPainel[MAX_PLAYERS]; //Variavel que verifica se o player esta no painel
  9. new KitEscolhido[MAX_PLAYERS]; //Variavel que seta o kit que o player escolheu
  10. new AirDropO[MAX_PLAYERS]; //Variavel de identificação do objeto do AirDrop!
  11. forward SaqueandoAirDrop(playerid);
  12. new SaqueandoAD[MAX_PLAYERS]; //Timer
  13. new bool:Saqueando[MAX_PLAYERS];//Variavel que define se player esta saqueando ou não
  14.  
  15.  
  16. public OnGameModeInit()
  17. {
  18. //Cria os textdraws do painel..
  19. for(new i=0; i<MAX_PLAYERS; i++)
  20. {
  21. ADTD[0][i] = TextDrawCreate(464.430450, 102.416671, "usebox");
  22. TextDrawLetterSize(ADTD[0][i], 0.000000, 33.711109);
  23. TextDrawTextSize(ADTD[0][i], 123.563690, 0.000000);
  24. TextDrawAlignment(ADTD[0][i], 1);
  25. TextDrawColor(ADTD[0][i], 0);
  26. TextDrawUseBox(ADTD[0][i], true);
  27. TextDrawBoxColor(ADTD[0][i], 102);
  28. TextDrawSetShadow(ADTD[0][i], 0);
  29. TextDrawSetOutline(ADTD[0][i], 0);
  30. TextDrawFont(ADTD[0][i], 0);
  31.  
  32. ADTD[1][i] = TextDrawCreate(460.213775, 107.666671, "usebox");
  33. TextDrawLetterSize(ADTD[1][i], 0.000000, 32.609256);
  34. TextDrawTextSize(ADTD[1][i], 127.780380, 0.000000);
  35. TextDrawAlignment(ADTD[1][i], 1);
  36. TextDrawColor(ADTD[1][i], 0);
  37. TextDrawUseBox(ADTD[1][i], true);
  38. TextDrawBoxColor(ADTD[1][i], 102);
  39. TextDrawSetShadow(ADTD[1][i], 0);
  40. TextDrawSetOutline(ADTD[1][i], 0);
  41. TextDrawFont(ADTD[1][i], 0);
  42.  
  43. ADTD[2][i] = TextDrawCreate(383.376403, 114.666664, "usebox");
  44. TextDrawLetterSize(ADTD[2][i], 0.000000, 1.822221);
  45. TextDrawTextSize(ADTD[2][i], 202.743774, 0.000000);
  46. TextDrawAlignment(ADTD[2][i], 1);
  47. TextDrawColor(ADTD[2][i], 0);
  48. TextDrawUseBox(ADTD[2][i], true);
  49. TextDrawBoxColor(ADTD[2][i], 16711935);
  50. TextDrawSetShadow(ADTD[2][i], 0);
  51. TextDrawSetOutline(ADTD[2][i], 0);
  52. TextDrawFont(ADTD[2][i], 0);
  53.  
  54. ADTD[3][i] = TextDrawCreate(260.497833, 114.916671, "AirDrop");
  55. TextDrawLetterSize(ADTD[3][i], 0.449999, 1.600000);
  56. TextDrawAlignment(ADTD[3][i], 1);
  57. TextDrawColor(ADTD[3][i], -1);
  58. TextDrawSetShadow(ADTD[3][i], 0);
  59. TextDrawSetOutline(ADTD[3][i], 1);
  60. TextDrawBackgroundColor(ADTD[3][i], 51);
  61. TextDrawFont(ADTD[3][i], 1);
  62. TextDrawSetProportional(ADTD[3][i], 1);
  63.  
  64. ADTD[4][i] = TextDrawCreate(206.149261, 186.083328, "M4,Sniper,Pistola,Kit Medico");
  65. TextDrawLetterSize(ADTD[4][i], 0.308975, 1.401666);
  66. TextDrawAlignment(ADTD[4][i], 1);
  67. TextDrawColor(ADTD[4][i], -1);
  68. TextDrawSetShadow(ADTD[4][i], 0);
  69. TextDrawSetOutline(ADTD[4][i], 1);
  70. TextDrawBackgroundColor(ADTD[4][i], 51);
  71. TextDrawFont(ADTD[4][i], 2);
  72. TextDrawSetProportional(ADTD[4][i], 1);
  73.  
  74. ADTD[5][i] = TextDrawCreate(201.121536, 160.750030, "usebox");
  75. TextDrawLetterSize(ADTD[5][i], 0.000000, 6.229629);
  76. TextDrawTextSize(ADTD[5][i], 146.521240, 0.000000);
  77. TextDrawAlignment(ADTD[5][i], 1);
  78. TextDrawColor(ADTD[5][i], 0);
  79. TextDrawUseBox(ADTD[5][i], true);
  80. TextDrawBoxColor(ADTD[5][i], -1);
  81. TextDrawSetShadow(ADTD[5][i], 0);
  82. TextDrawSetOutline(ADTD[5][i], 0);
  83. TextDrawFont(ADTD[5][i], 0);
  84.  
  85. ADTD[6][i] = TextDrawCreate(153.674942, 164.499984, "K-1");
  86. TextDrawLetterSize(ADTD[6][i], 0.772811, 5.432499);
  87. TextDrawAlignment(ADTD[6][i], 1);
  88. TextDrawColor(ADTD[6][i], -1);
  89. TextDrawSetShadow(ADTD[6][i], 0);
  90. TextDrawSetOutline(ADTD[6][i], 1);
  91. TextDrawBackgroundColor(ADTD[6][i], 51);
  92. TextDrawFont(ADTD[6][i], 1);
  93. TextDrawSetProportional(ADTD[6][i], 1);
  94. TextDrawSetSelectable(ADTD[6][i], 1);
  95. TextDrawTextSize(ADTD[6][i], 192.158142, 40.000000);
  96.  
  97. ADTD[7][i] = TextDrawCreate(201.653015, 244.583343, "usebox");
  98. TextDrawLetterSize(ADTD[7][i], 0.000000, 6.229629);
  99. TextDrawTextSize(ADTD[7][i], 146.052719, 0.000000);
  100. TextDrawAlignment(ADTD[7][i], 1);
  101. TextDrawColor(ADTD[7][i], 0);
  102. TextDrawUseBox(ADTD[7][i], true);
  103. TextDrawBoxColor(ADTD[7][i], -1);
  104. TextDrawSetShadow(ADTD[7][i], 0);
  105. TextDrawSetOutline(ADTD[7][i], 0);
  106. TextDrawFont(ADTD[7][i], 0);
  107.  
  108. ADTD[8][i] = TextDrawCreate(152.332336, 247.750015, "K-2");
  109. TextDrawLetterSize(ADTD[8][i], 0.772811, 5.432499);
  110. TextDrawAlignment(ADTD[8][i], 1);
  111. TextDrawColor(ADTD[8][i], -1);
  112. TextDrawSetShadow(ADTD[8][i], 0);
  113. TextDrawSetOutline(ADTD[8][i], 1);
  114. TextDrawBackgroundColor(ADTD[8][i], 51);
  115. TextDrawFont(ADTD[8][i], 1);
  116. TextDrawSetProportional(ADTD[8][i], 1);
  117. TextDrawSetSelectable(ADTD[8][i], 1);
  118. TextDrawTextSize(ADTD[8][i], 192.158142, 40.000000);
  119.  
  120. ADTD[9][i] = TextDrawCreate(205.275177, 265.833312, "m4, Sniper, Pistola, Kit Medico, Colete");
  121. TextDrawLetterSize(ADTD[9][i], 0.262122, 1.740000);
  122. TextDrawAlignment(ADTD[9][i], 1);
  123. TextDrawColor(ADTD[9][i], -1);
  124. TextDrawSetShadow(ADTD[9][i], 0);
  125. TextDrawSetOutline(ADTD[9][i], 1);
  126. TextDrawBackgroundColor(ADTD[9][i], 51);
  127. TextDrawFont(ADTD[9][i], 2);
  128. TextDrawSetProportional(ADTD[9][i], 1);
  129.  
  130. ADTD[10][i] = TextDrawCreate(202.653015, 328.416717, "usebox");
  131. TextDrawLetterSize(ADTD[10][i], 0.000000, 6.229629);
  132. TextDrawTextSize(ADTD[10][i], 146.052719, 0.000000);
  133. TextDrawAlignment(ADTD[10][i], 1);
  134. TextDrawColor(ADTD[10][i], 0);
  135. TextDrawUseBox(ADTD[10][i], true);
  136. TextDrawBoxColor(ADTD[10][i], -1);
  137. TextDrawSetShadow(ADTD[10][i], 0);
  138. TextDrawSetOutline(ADTD[10][i], 0);
  139. TextDrawFont(ADTD[10][i], 0);
  140.  
  141. ADTD[11][i] = TextDrawCreate(151.926773, 332.750030, "K-3");
  142. TextDrawLetterSize(ADTD[11][i], 0.772811, 5.432499);
  143. TextDrawAlignment(ADTD[11][i], 1);
  144. TextDrawColor(ADTD[11][i], -1);
  145. TextDrawSetShadow(ADTD[11][i], 0);
  146. TextDrawSetOutline(ADTD[11][i], 1);
  147. TextDrawBackgroundColor(ADTD[11][i], 51);
  148. TextDrawFont(ADTD[11][i], 1);
  149. TextDrawSetProportional(ADTD[11][i], 1);
  150. TextDrawSetSelectable(ADTD[11][i], 1);
  151. TextDrawTextSize(ADTD[11][i], 192.158142, 40.000000);
  152.  
  153. ADTD[12][i] = TextDrawCreate(204.869613, 351.416656, "Ak47, Sniper, Shotgun, Kit Medico, Colete");
  154. TextDrawLetterSize(ADTD[12][i], 0.245256, 1.751666);
  155. TextDrawAlignment(ADTD[12][i], 1);
  156. TextDrawColor(ADTD[12][i], -1);
  157. TextDrawSetShadow(ADTD[12][i], 0);
  158. TextDrawSetOutline(ADTD[12][i], 1);
  159. TextDrawBackgroundColor(ADTD[12][i], 51);
  160. TextDrawFont(ADTD[12][i], 2);
  161. TextDrawSetProportional(ADTD[12][i], 1);
  162. }
  163. return 1;
  164. }
  165.  
  166. public OnPlayerUpdate(playerid)
  167. {
  168. if(PediuAirDrop[playerid] == true)
  169. {
  170. if(Saqueando[playerid] == true)
  171. {
  172. return 1;
  173. }
  174. new Float:ObjetoP[3];
  175. GetDynamicObjectPos(AirDropO[playerid], ObjetoP[0], ObjetoP[1], ObjetoP[2]);
  176. if(IsPlayerInRangeOfPoint(playerid, 10.0, ObjetoP[0], ObjetoP[1], ObjetoP[2]))
  177. {
  178. GameTextForPlayer(playerid,"~w~Air~g~Drop~w~~n~Aperte ~r~F~w~ para saquea-lo",5000,1);
  179. }
  180. }
  181. return 1;
  182. }
  183.  
  184. public OnPlayerClickTextDraw(playerid, Text:clickedid)
  185. {
  186. if(clickedid == Text:INVALID_TEXT_DRAW)
  187. {
  188. if(TaNoPainel[playerid] == 1)
  189. {
  190. SelectTextDraw(playerid, COR_SELECIONAR);
  191. return 1;
  192. }
  193. }
  194. if(clickedid == Text:ADTD[6][playerid])
  195. {
  196. if(GetPlayerMoney(playerid) >= PRECO_AIRDROP)
  197. {
  198. if(PediuAirDrop[playerid] == true)
  199. {
  200. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você ja pediu um AirDrop! aguarde..");
  201. return 1;
  202. }
  203. new Float:PosP[3];
  204. KitEscolhido[playerid] = 1;
  205. GetPlayerPos(playerid, PosP[0], PosP[1], PosP[2]);
  206. AirDropO[playerid] = CreateDynamicObject(18849, PosP[0], PosP[1], PosP[2]+100, 0.0, 0.0, 0.0);
  207. MoveDynamicObject(AirDropO[playerid], PosP[0], PosP[1], PosP[2]+6, 3.0);
  208. SendClientMessage(playerid, -1, "< {00FF00}!{FFFFFF} > Você selecionou K-1! aguarde até o AirDrop cair.");
  209. PediuAirDrop[playerid] = true;
  210. TextDrawBoxColor(ADTD[2][playerid], 0xFF230AFF);
  211. FecharADP(playerid);
  212. return 1;
  213. }
  214. else
  215. {
  216. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você não tem dinheiro suficiente para comprar este Kit!");
  217. }
  218. return 1;
  219. }
  220. if(clickedid == Text:ADTD[8][playerid])
  221. {
  222. if(GetPlayerMoney(playerid) >= PRECO_AIRDROP)
  223. {
  224. if(PediuAirDrop[playerid] == true)
  225. {
  226. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você ja pediu um AirDrop! aguarde..");
  227. return 1;
  228. }
  229. new Float:PosP[3];
  230. KitEscolhido[playerid] = 2;
  231. GetPlayerPos(playerid, PosP[0], PosP[1], PosP[2]);
  232. AirDropO[playerid] = CreateDynamicObject(18849, PosP[0], PosP[1], PosP[2]+100, 0.0, 0.0, 0.0);
  233. MoveDynamicObject(AirDropO[playerid], PosP[0], PosP[1], PosP[2]+6, 3.0);
  234. PediuAirDrop[playerid] = true;
  235. SendClientMessage(playerid, -1, "< {00FF00}!{FFFFFF} > Você selecionou K-2! aguarde até o AirDrop cair.");
  236. TextDrawBoxColor(ADTD[2][playerid], 0xFF230AFF);
  237. FecharADP(playerid);
  238. return 1;
  239. }
  240. else
  241. {
  242. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você não tem dinheiro suficiente para comprar este Kit!");
  243. }
  244. return 1;
  245. }
  246. if(clickedid == Text:ADTD[11][playerid])
  247. {
  248. if(GetPlayerMoney(playerid) >= PRECO_AIRDROP)
  249. {
  250. if(PediuAirDrop[playerid] == true)
  251. {
  252. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você ja pediu um AirDrop! aguarde..");
  253. return 1;
  254. }
  255. new Float:PosP[3];
  256. KitEscolhido[playerid] = 3;
  257. GetPlayerPos(playerid, PosP[0], PosP[1], PosP[2]);
  258. AirDropO[playerid] = CreateDynamicObject(18849, PosP[0], PosP[1], PosP[2]+100, 0.0, 0.0, 0.0);
  259. MoveDynamicObject(AirDropO[playerid], PosP[0], PosP[1], PosP[2]+6, 3.0);
  260. PediuAirDrop[playerid] = true;
  261. SendClientMessage(playerid, -1, "< {00FF00}!{FFFFFF} > Você selecionou K-3! aguarde até o AirDrop cair.");
  262. TextDrawBoxColor(ADTD[2][playerid], 0xFF230AFF);
  263. FecharADP(playerid);
  264. return 1;
  265. }
  266. else
  267. {
  268. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você não tem dinheiro suficiente para comprar este Kit!");
  269. }
  270. return 1;
  271. }
  272. return 1;
  273. }
  274.  
  275. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  276. {
  277. if(newkeys == 16)
  278. {
  279. if(Saqueando[playerid] == true)
  280. {
  281. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você ja está saqueando o AirDrop!");
  282. return 1;
  283. }
  284. if(PediuAirDrop[playerid] == true)
  285. {
  286. new Float:ObjetoP[3];
  287. GetDynamicObjectPos(AirDropO[playerid], ObjetoP[0], ObjetoP[1], ObjetoP[2]);
  288. if(IsPlayerInRangeOfPoint(playerid, 10.0, ObjetoP[0], ObjetoP[1], ObjetoP[2]))
  289. {
  290. ApplyAnimation(playerid, "BOMBER", "BOM_Plant_Crouch_In", 4.0, 1, 0, 0, 0, 0);
  291. SaqueandoAD[playerid] = SetTimerEx("SaqueandoAirDrop", 20000, false, "i", playerid);
  292. GameTextForPlayer(playerid,"~g~Saqueando~w~~n~Aguarde",20000,1);
  293. Saqueando[playerid] = true;
  294. GameTextForPlayer(playerid,"~g~Saqueando~w~~n~Aguarde",20000,1);
  295. }
  296. }
  297. }
  298. return 1;
  299. }
  300.  
  301. public OnPlayerCommandText(playerid, cmdtext[])
  302. {
  303. //---------=============[ COMANDOS DO SISTEMA ]=================-------------
  304. if (strcmp("/airdrop", cmdtext, true, 10) == 0)
  305. {
  306. if(IsPlayerInAnyVehicle(playerid)) //Caso player esteja em um carro no momento que digitou o comando
  307. {
  308. SendClientMessage(playerid, -1, "< {FF0000}!{FFFFFF} > Você não pode usar este comando em um carro!"); //Envia mensagem avisando o player
  309. return 1;
  310. }
  311. if(TaNoPainel[playerid] == 0) //Se ele não estiver no painel no caso 0 ..
  312. {
  313. AbrirADP(playerid);//Chama a função de abrir o painel
  314. }
  315. else if(TaNoPainel[playerid] == 1) //Se ele estiver no painel no caso 1 ..
  316. {
  317. FecharADP(playerid);//Chama a função de fechar o painel
  318. return 1;
  319. }
  320. return 1;
  321. }
  322. return 0;
  323. }
  324. stock AbrirADP(playerid)//Função para abrir o painel!
  325. {
  326. TaNoPainel[playerid] = 1; //Seta a variavel que verifica se esta no painel para 1
  327. SelectTextDraw(playerid, COR_SELECIONAR); //Coloca o ponteiro do mouse na tela do jogador (para mudar de cor mude a cor de COR_SELECIONAR)
  328. TextDrawShowForPlayer(playerid, ADTD[0][playerid]);
  329. TextDrawShowForPlayer(playerid, ADTD[1][playerid]);
  330. TextDrawShowForPlayer(playerid, ADTD[2][playerid]);
  331. TextDrawShowForPlayer(playerid, ADTD[3][playerid]);
  332. TextDrawShowForPlayer(playerid, ADTD[4][playerid]);
  333. TextDrawShowForPlayer(playerid, ADTD[5][playerid]);
  334. TextDrawShowForPlayer(playerid, ADTD[6][playerid]);
  335. TextDrawShowForPlayer(playerid, ADTD[7][playerid]);
  336. TextDrawShowForPlayer(playerid, ADTD[8][playerid]);
  337. TextDrawShowForPlayer(playerid, ADTD[9][playerid]);
  338. TextDrawShowForPlayer(playerid, ADTD[10][playerid]);
  339. TextDrawShowForPlayer(playerid, ADTD[11][playerid]);
  340. TextDrawShowForPlayer(playerid, ADTD[12][playerid]);
  341. return 1;
  342. }
  343. stock FecharADP(playerid) //Função para fechar o painel
  344. {
  345. TaNoPainel[playerid] = 0; //Seta a variavel de verificar se esta no painel para 0
  346. CancelSelectTextDraw(playerid); //Retira o ponteiro do mouse
  347. TextDrawHideForPlayer(playerid, ADTD[0][playerid]);
  348. TextDrawHideForPlayer(playerid, ADTD[1][playerid]);
  349. TextDrawHideForPlayer(playerid, ADTD[2][playerid]);
  350. TextDrawHideForPlayer(playerid, ADTD[3][playerid]);
  351. TextDrawHideForPlayer(playerid, ADTD[4][playerid]);
  352. TextDrawHideForPlayer(playerid, ADTD[5][playerid]);
  353. TextDrawHideForPlayer(playerid, ADTD[6][playerid]);
  354. TextDrawHideForPlayer(playerid, ADTD[7][playerid]);
  355. TextDrawHideForPlayer(playerid, ADTD[8][playerid]);
  356. TextDrawHideForPlayer(playerid, ADTD[9][playerid]);
  357. TextDrawHideForPlayer(playerid, ADTD[10][playerid]);
  358. TextDrawHideForPlayer(playerid, ADTD[11][playerid]);
  359. TextDrawHideForPlayer(playerid, ADTD[12][playerid]);
  360. return 1;
  361. }
  362. public SaqueandoAirDrop(playerid)
  363. {
  364. KillTimer(SaqueandoAD[playerid]);
  365. DarKit(playerid);
  366. ClearAnimations(playerid);
  367. return 1;
  368. }
  369. stock DarKit(playerid)
  370. {
  371. if(KitEscolhido[playerid] == 1)
  372. {
  373. GivePlayerWeapon(playerid, 24,BALAS_KIT);
  374. GivePlayerWeapon(playerid, 31,BALAS_KIT);
  375. GivePlayerWeapon(playerid, 34,BALAS_KIT);
  376. new Float:Vida[MAX_PLAYERS];
  377. GetPlayerHealth(playerid, Vida[playerid]);
  378. SetPlayerHealth(playerid, Vida[playerid]+40);
  379. PediuAirDrop[playerid] = false;
  380. KitEscolhido[playerid] = 0;
  381. Saqueando[playerid] = false;
  382. TextDrawBoxColor(ADTD[2][playerid], 16711935);
  383. return 1;
  384. }
  385. if(KitEscolhido[playerid] == 2)
  386. {
  387. GivePlayerWeapon(playerid, 24,BALAS_KIT);
  388. GivePlayerWeapon(playerid, 31,BALAS_KIT);
  389. GivePlayerWeapon(playerid, 34,BALAS_KIT);
  390. new Float:Vida[MAX_PLAYERS],Float:Colete[MAX_PLAYERS];
  391. GetPlayerHealth(playerid, Vida[playerid]);
  392. GetPlayerArmour(playerid, Colete[playerid]);
  393. SetPlayerHealth(playerid, Vida[playerid]+40);
  394. SetPlayerArmour(playerid, Colete[playerid]+100);
  395. PediuAirDrop[playerid] = false;
  396. KitEscolhido[playerid] = 0;
  397. Saqueando[playerid] = false;
  398. TextDrawBoxColor(ADTD[2][playerid], 16711935);
  399. return 1;
  400. }
  401. if(KitEscolhido[playerid] == 3)
  402. {
  403. GivePlayerWeapon(playerid, 25,BALAS_KIT);
  404. GivePlayerWeapon(playerid, 30,BALAS_KIT);
  405. GivePlayerWeapon(playerid, 34,BALAS_KIT);
  406. new Float:Vida[MAX_PLAYERS],Float:Colete[MAX_PLAYERS];
  407. GetPlayerHealth(playerid, Vida[playerid]);
  408. GetPlayerArmour(playerid, Colete[playerid]);
  409. SetPlayerHealth(playerid, Vida[playerid]+40);
  410. SetPlayerArmour(playerid, Colete[playerid]+100);
  411. PediuAirDrop[playerid] = false;
  412. KitEscolhido[playerid] = 0;
  413. Saqueando[playerid] = false;
  414. TextDrawBoxColor(ADTD[2][playerid], 16711935);
  415. return 1;
  416. }
  417. return 1;
  418. }
  419.  
  420.  
  421. // Para funcionar, é necessário a [INCLUDE] Streamer;
  422. // www.homehots.com.br
  423. //Todos os direitos reservados a ZéPaulo pela criação do filterscript.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement