Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Dynamisches Haus System (c) 2010 by BlackFoX_UD_
- * Credits *
- - Sa-mp Team for GTA San Andreas Multiplayer
- - BlackFoX_UD_ ( This Script ) and BFX iStream
- - strtok by Compu Phase
- -= DONT REMOVE CREDITS =-
- * Features *
- - Häuser im Spiel erstellen ( Rcon )
- - Vorschau Funktion ( Rcon )
- - Häuser können betreten & verlassen werden ( Benutzer && > )
- - Definierte Häuser + Innenraum Daten
- - Für jedes Haus wird eine gewisse Spielzeit verlangt. ( [[h]] Stunden )
- - Häuser können von jedem betreten werden
- - Häuser können verschlossen werden
- - Optisch angepasst
- ** Changes ( 1. März 2010 ) **
- - Häuser können gelöscht werden
- - Es kann bestimmt werden ob Score oder Spielzeit verwendet werden soll
- - Maximale Anzahl der Häuser für den Spieler einstellbar
- - Der kleine Logikfehler für hkaufen & verkaufen wurde behoben ( Nun wird Geld genommen & dazugegeben wie es sein sollte )
- - Index der Maximalen Häuser Dynamisch gestaltet ( for ex. werden Häuser gelöscht, wird/werden diese Plätze mit dem nächsten neuen Haus besetzt ohne das FS/GM neuzustarten )
- ** Changes ( 2. März 2010 ) **
- - /hlöschen ( Bug Fix )
- - Interior 0 = Ungültig
- ** Changes ( 5. März 2010 ) **
- - Spielzeit komplett entfernt nur noch Score!
- - Spielerdaten werden nicht mehr geladen ( Haus Spawn wird durch Skript übernommen )
- */
- #include <a_samp>
- #include <bfx_imStream>
- #define MAX_HH 500 // Maximale Häuser Anzahl
- #define HAUS_DATEI "haus_daten.cfg" // Datei wo die Häuser gespeichert werden
- #define INFO_TAFEL // Informationen durch Pickup , einfach kommentieren oder löschen wenn nicht nötig
- #define MAX_SPIELER_HAUS 1 // Maximale Häuser Anzahl die der Spieler besitzen darf
- forward ZeitTimer();
- forward SaveCache();
- forward initSlot();
- new _cache_haus;
- enum haus
- {
- Float:ax,
- Float:ay,
- Float:az,
- Float:ix,
- Float:iy,
- Float:iz,
- interior,
- virtual_world,
- Besitzer[MAX_PLAYER_NAME],
- kosten,
- play_time,
- Text3D:lbl_haus,
- nicht_zum_kauf,
- verschlossen,
- #if defined INFO_TAFEL
- pickid,
- #endif
- icon_id
- }
- new HausDaten[MAX_HH][haus];
- enum haus_typ
- {
- interior,
- Float:haus_x,
- Float:haus_y,
- Float:haus_z
- }
- new Typen[][haus_typ] = { // Wenn nötig neue Haus Typen bzw. vorgegebene Räume hinzufügen...
- {3,235.508994,1189.169897,1080.339966},
- {2,225.756989,1240.000000,1082.149902},
- {1,223.043991,1289.259888,1082.199951},
- {7,225.630997,1022.479980,1084.069946},
- {15,295.138977,1474.469971,1080.519897},
- {15,328.493988,1480.589966,1084.449951},
- {15,385.803986,1471.769897,1080.209961},
- {1,244.411987,305.032989,999.148437},
- {2,271.884979,306.631988,999.148437},
- {3,291.282989,310.031982,999.148437},
- {4,302.180999,300.722991,999.148437},
- {3,1527.229980,-11.574499,1002.097106},
- {3,513.882507,-11.269994,1001.565307},
- {2,2454.717041,-1700.871582,1013.515197}
- };
- enum spieler_daten
- {
- haus_schau,
- Float:h_schaux,
- Float:h_schauy,
- Float:h_schauz,
- last_int,
- last_vw,
- haus_zahl
- }
- new Player[MAX_PLAYERS][spieler_daten];
- public OnFilterScriptInit()
- {
- new line[255],File:hausx = fopen(HAUS_DATEI,io_read),
- haus_index;
- if(hausx)
- {
- while(fread(hausx,line))
- {
- if(line[strlen(line)-2] == '\r')line[strlen(line)-2] = '\0';
- if(line[strlen(line)-1] == '\n')line[strlen(line)-1] = '\0';
- strmid(HausDaten[_cache_haus][Besitzer],strtok(line,haus_index,','),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
- HausDaten[_cache_haus][ax] = floatstr(strtok(line,haus_index,','));
- HausDaten[_cache_haus][ay] = floatstr(strtok(line,haus_index,','));
- HausDaten[_cache_haus][az] = floatstr(strtok(line,haus_index,','));
- HausDaten[_cache_haus][ix] = floatstr(strtok(line,haus_index,','));
- HausDaten[_cache_haus][iy] = floatstr(strtok(line,haus_index,','));
- HausDaten[_cache_haus][iz] = floatstr(strtok(line,haus_index,','));
- HausDaten[_cache_haus][interior] = strval(strtok(line,haus_index,','));
- HausDaten[_cache_haus][virtual_world] = strval(strtok(line,haus_index,','));
- HausDaten[_cache_haus][kosten] = strval(strtok(line,haus_index,','));
- HausDaten[_cache_haus][play_time] = strval(strtok(line,haus_index,','));
- HausDaten[_cache_haus][nicht_zum_kauf] = strval(strtok(line,haus_index,','));
- HausDaten[_cache_haus][verschlossen] = strval(strtok(line,haus_index,','));
- format(line,sizeof line,"Besitzer : %s\nScore : %d\nKosten : %d$",HausDaten[_cache_haus][Besitzer],HausDaten[_cache_haus][play_time],HausDaten[_cache_haus][kosten]);
- HausDaten[_cache_haus][lbl_haus] = Create3DTextLabel(line,(!HausDaten[_cache_haus][nicht_zum_kauf]) ? (0x00FF00FF) : (0xFF0000FF),HausDaten[_cache_haus][ax],HausDaten[_cache_haus][ay],HausDaten[_cache_haus][az],10.0,0,0);
- HausDaten[_cache_haus][pickid] = CreatePickup(1273,1,HausDaten[_cache_haus][ax],HausDaten[_cache_haus][ay],HausDaten[_cache_haus][az],0);
- HausDaten[_cache_haus][icon_id] = bCreateMapIcon(HausDaten[_cache_haus][ax],HausDaten[_cache_haus][ay],_,(HausDaten[_cache_haus][nicht_zum_kauf]) ? (32) : (31),0);
- haus_index = 0;
- _cache_haus++;
- }
- fclose(hausx);
- }
- return 1;
- }
- public OnFilterScriptExit()
- {
- SaveCache();
- return 1;
- }
- public OnPlayerConnect(playerid)
- {
- return 1;
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- Player[playerid][haus_schau] = 0;
- Player[playerid][h_schaux] = (0.0);
- Player[playerid][h_schauy] = (0.0);
- Player[playerid][h_schauz] = (0.0);
- Player[playerid][last_int] = 0;
- Player[playerid][last_vw] = 0;
- Player[playerid][haus_zahl] = 0;
- return 1;
- }
- public OnPlayerSpawn(playerid)
- {
- for(new i = 0;i<_cache_haus;i++)
- {
- if(!strcmp(HausDaten[i][Besitzer],spielername(playerid)))
- {
- SetPlayerPos(playerid,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]);
- break;
- }
- }
- return 1;
- }
- spielername(playerid)
- {
- new xname[MAX_PLAYER_NAME];
- GetPlayerName(playerid,xname,sizeof xname);
- return xname;
- }
- public OnPlayerCommandText(playerid, cmdtext[])
- {
- new idx,cmd[128];
- cmd = strtok(cmdtext,idx);
- if(!strcmp(cmd,"/enter",true))
- {
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][interior] == 0)continue;
- if(!IsPlayerInRangeOfPoint(playerid,1.5,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]))continue;
- if(HausDaten[i][verschlossen]){SendClientMessage(playerid,0xFF0000FF,"Dieses Haus ist verschlossen!");break;}
- SetPlayerInterior(playerid,HausDaten[i][interior]);
- SetPlayerVirtualWorld(playerid,HausDaten[i][virtual_world]);
- SetPlayerPos(playerid,HausDaten[i][ix],HausDaten[i][iy],HausDaten[i][iz]);
- }
- return 1;
- }
- if(!strcmp(cmd,"/hlock",true))
- {
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][interior] == 0)continue;
- if(!IsPlayerInRangeOfPoint(playerid,1.2,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]) && !(IsPlayerInRangeOfPoint(playerid,1.5,HausDaten[i][ix],HausDaten[i][iy],HausDaten[i][iz]) && GetPlayerInterior(playerid) == HausDaten[i][interior] && GetPlayerVirtualWorld(playerid) == HausDaten[i][virtual_world]))continue;
- if(strcmp(HausDaten[i][Besitzer],spielername(playerid))){SendClientMessage(playerid,0xFF0000FF,"Dieses Haus gehört nicht dir!");break;}
- if(!HausDaten[i][verschlossen])GameTextForPlayer(playerid,"~b~Haus ~r~verschlossen.",2000,3);
- else GameTextForPlayer(playerid,"~b~Haus ~g~aufgeschlossen.",2000,3);
- HausDaten[i][verschlossen] = (HausDaten[i][verschlossen]) ? (0) : (1);
- SaveCache();
- break;
- }
- return 1;
- }
- if(!strcmp(cmd,"/hkaufen",true))
- {
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][interior] == 0)continue;
- if(!IsPlayerInRangeOfPoint(playerid,1.5,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]))continue;
- if(HausDaten[i][nicht_zum_kauf]){SendClientMessage(playerid,0xFF0000FF,"Haus kann nicht gekauft werden!");break;}
- if(Player[playerid][haus_zahl] >= MAX_SPIELER_HAUS){SendClientMessage(playerid,0xFF0000FF,"Du hast bereits die Maximale Anzahl der kaufbaren Häuser erreicht!");break;}
- if(GetPlayerScore(playerid) < HausDaten[i][play_time]){SendClientMessage(playerid,0xFF0000FF,"Du brauchst mehr Score!");break;}
- if(GetPlayerMoney(playerid) < HausDaten[i][kosten]){SendClientMessage(playerid,0xFF0000FF,"Du brauchst mehr Geld!");break;}
- strmid(HausDaten[i][Besitzer],spielername(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
- HausDaten[i][nicht_zum_kauf] = 1;
- format(cmd,sizeof cmd,"Besitzer : %s\nScore : %d\nKosten : %d$",spielername(playerid),HausDaten[i][play_time],HausDaten[i][kosten]);
- Update3DTextLabelText(HausDaten[i][lbl_haus],0xFF0000FF,cmd);
- bRemoveMapIcon(HausDaten[i][icon_id]);
- HausDaten[i][icon_id] = bCreateMapIcon(HausDaten[i][ax],HausDaten[i][ay],_,32,0);
- GivePlayerMoney(playerid,-HausDaten[i][kosten]);
- Player[playerid][haus_zahl]++;
- SaveCache();
- break;
- }
- return 1;
- }
- if(!strcmp(cmd,"/setowner",true))
- {
- if(!IsPlayerAdmin(playerid))return 1;
- cmd = strtok(cmdtext,idx);
- if(!cmd[0])return SendClientMessage(playerid,0xFF0000FF,"Nutze /setowner [Besitzername]");
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][interior] == 0)continue;
- if(!IsPlayerInRangeOfPoint(playerid,1.5,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]))continue;
- strmid(HausDaten[i][Besitzer],cmd,0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
- format(cmd,sizeof cmd,"Besitzer : %s\nScore : %d\nKosten : %d$",cmd,HausDaten[i][play_time],HausDaten[i][kosten]);
- Update3DTextLabelText(HausDaten[i][lbl_haus],0xFF0000FF,cmd);
- SaveCache();
- break;
- }
- return 1;
- }
- if(!strcmp(cmd,"/hverkaufen",true))
- {
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][interior] == 0)continue;
- if(!IsPlayerInRangeOfPoint(playerid,1.5,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]))continue;
- if(!HausDaten[i][nicht_zum_kauf]){SendClientMessage(playerid,0xFF0000FF,"Haus kann nicht verkauft werden!");break;}
- if(strcmp(HausDaten[i][Besitzer],spielername(playerid))){SendClientMessage(playerid,0xFF0000FF,"Dieses Haus gehört nicht dir!");break;}
- strmid(HausDaten[i][Besitzer],"Keiner",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
- HausDaten[i][nicht_zum_kauf] = 0;
- format(cmd,sizeof cmd,"Besitzer : Keiner\nScore : %d\nKosten : %d$",HausDaten[i][play_time],HausDaten[i][kosten]);
- Update3DTextLabelText(HausDaten[i][lbl_haus],0x00FF00FF,cmd);
- bRemoveMapIcon(HausDaten[i][icon_id]);
- HausDaten[i][icon_id] = bCreateMapIcon(HausDaten[i][ax],HausDaten[i][ay],_,31,0);
- Player[playerid][haus_zahl]--;
- GivePlayerMoney(playerid,(HausDaten[i][kosten]/2));
- SaveCache();
- break;
- }
- return 1;
- }
- if(!strcmp(cmd,"/exit",true))
- {
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][interior] == 0)continue;
- if(IsPlayerInRangeOfPoint(playerid,5.0,HausDaten[i][ix],HausDaten[i][iy],HausDaten[i][iz]) && GetPlayerInterior(playerid) == HausDaten[i][interior] && GetPlayerVirtualWorld(playerid) == HausDaten[i][virtual_world])
- {
- if(HausDaten[i][verschlossen]){SendClientMessage(playerid,0xFF0000FF,"Dieses Haus ist verschlossen!");break;}
- SetPlayerPos(playerid,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]);
- SetPlayerInterior(playerid,0);
- SetPlayerVirtualWorld(playerid,0);
- break;
- }
- }
- return 1;
- }
- if(!strcmp(cmd,"/hlöschen",true))
- {
- if(!IsPlayerAdmin(playerid))return 1;
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][interior] == 0)continue;
- if(!IsPlayerInRangeOfPoint(playerid,5.0,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]))continue;
- HausDaten[i][interior] = 0;
- DestroyPickup(HausDaten[i][pickid]);
- Delete3DTextLabel(HausDaten[i][lbl_haus]);
- SendClientMessage(playerid,0x00FF00FF,"Haus gelöscht.");
- bRemoveMapIcon(HausDaten[i][icon_id]);
- HausDaten[i][ax] = (0.0);
- HausDaten[i][ay] = (0.0);
- HausDaten[i][az] = (0.0);
- HausDaten[i][play_time] = 0;
- HausDaten[i][kosten] = 0;
- HausDaten[i][interior] = 0;
- HausDaten[i][ix] = (0.0);
- HausDaten[i][iy] = (0.0);
- HausDaten[i][iz] = (0.0);
- HausDaten[i][virtual_world] = 0;
- HausDaten[i][verschlossen] = 0;
- strmid(HausDaten[i][Besitzer],"",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
- HausDaten[i][pickid] = -1;
- HausDaten[i][lbl_haus] = Text3D:-1;
- HausDaten[i][icon_id] = -1;
- HausDaten[i][nicht_zum_kauf] = 0;
- SaveCache();
- break;
- }
- return 1;
- }
- if(!strcmp(cmd,"/chaus",true))
- {
- if(!IsPlayerAdmin(playerid))return 1;
- cmd = strtok(cmdtext,idx);
- if(!cmd[0])return SendClientMessage(playerid,0xFF0000FF,"Nutze : /chaus [kosten] [spielzeit in h] [haus] [Virtual World]");
- new hkosten = strval(cmd);
- cmd = strtok(cmdtext,idx);
- if(!cmd[0])return SendClientMessage(playerid,0xFF0000FF,"Nutze : /chaus [kosten] [spielzeit in h] [haus] [Virtual World]");
- new spielzeit = strval(cmd);
- if(spielzeit < 0)return SendClientMessage(playerid,0xFF0000FF,"Die Spielzeit muss minimal bei 0 Stunden liegen!");
- cmd = strtok(cmdtext,idx);
- if(!cmd[0])return SendClientMessage(playerid,0xFF0000FF,"Nutze : /chaus [kosten] [spielzeit in h] [haus] [Virtual World]");
- new hhaus = strval(cmd);
- if(hhaus > sizeof(Typen) || hhaus < 0)return SendClientMessage(playerid,0xFF0000FF,"Ungültiges Haus!");
- cmd = strtok(cmdtext,idx);
- if(!cmd[0])return SendClientMessage(playerid,0xFF0000FF,"Nutze : /chaus [kosten] [spielzeit in h] [haus] [Virtual World]");
- new hvw = strval(cmd);
- new Float:nowPos[3];
- new slotid = initSlot();
- new fullid = (slotid==-1) ? (_cache_haus) : (slotid);
- GetPlayerPos(playerid,nowPos[0],nowPos[1],nowPos[2]);
- HausDaten[fullid][ax] = nowPos[0];
- HausDaten[fullid][ay] = nowPos[1];
- HausDaten[fullid][az] = nowPos[2];
- HausDaten[fullid][play_time] = spielzeit;
- HausDaten[fullid][kosten] = hkosten;
- HausDaten[fullid][interior] = Typen[hhaus][interior];
- HausDaten[fullid][ix] = Typen[hhaus][haus_x];
- HausDaten[fullid][iy] = Typen[hhaus][haus_y];
- HausDaten[fullid][iz] = Typen[hhaus][haus_z];
- HausDaten[fullid][virtual_world] = hvw;
- HausDaten[fullid][verschlossen] = 1;
- HausDaten[fullid][nicht_zum_kauf] = 0;
- strmid(HausDaten[fullid][Besitzer],"Keiner",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
- HausDaten[fullid][pickid] = CreatePickup(1273,1,nowPos[0],nowPos[1],nowPos[2],0);
- format(cmd,sizeof cmd,"Besitzer : Keiner\nScore : %d\nKosten : %d$",spielzeit,hkosten);
- HausDaten[fullid][lbl_haus] = Create3DTextLabel(cmd,0x00FF00FF,nowPos[0],nowPos[1],nowPos[2],10.0,0,0);
- HausDaten[fullid][icon_id] = bCreateMapIcon(nowPos[0],nowPos[1],_,31,0);
- if(slotid==-1)_cache_haus++;
- SaveCache();
- return 1;
- }
- if(!strcmp(cmd,"/hvorschau",true))
- {
- if(!IsPlayerAdmin(playerid))return 1;
- if(Player[playerid][haus_schau])return SendClientMessage(playerid,0xFF0000FF,"Nutze vorher /evorschau um die derzeitige Vorschau zu beenden!");
- cmd = strtok(cmdtext,idx);
- if(!cmd[0])return SendClientMessage(playerid,0xFF0000FF,"Nutze /hvorschau [haustyp id]");
- new hhaus = strval(cmd);
- if(hhaus > sizeof(Typen) || hhaus < 0)return SendClientMessage(playerid,0xFF0000FF,"Ungültiges Haus!");
- GetPlayerPos(playerid,Player[playerid][h_schaux],Player[playerid][h_schauy],Player[playerid][h_schauz]);
- Player[playerid][last_int] = GetPlayerInterior(playerid);
- Player[playerid][last_vw] = GetPlayerVirtualWorld(playerid);
- SetPlayerInterior(playerid,Typen[hhaus][interior]);
- SetPlayerPos(playerid,Typen[hhaus][haus_x],Typen[hhaus][haus_y],Typen[hhaus][haus_z]);
- Player[playerid][haus_schau] = 1;
- return SendClientMessage(playerid,0x00FF00FF,"Nutze /evorschau um die Vorschau zu beenden.");
- }
- if(!strcmp(cmd,"/evorschau",true))
- {
- if(!IsPlayerAdmin(playerid))return 1;
- if(!Player[playerid][haus_schau])return SendClientMessage(playerid,0xFF0000FF,"Du bist derzeit in keinem Vorzeige Haus!");
- SetPlayerInterior(playerid,Player[playerid][last_int]);
- SetPlayerVirtualWorld(playerid,Player[playerid][last_vw]);
- SetPlayerPos(playerid,Player[playerid][h_schaux],Player[playerid][h_schauy],Player[playerid][h_schauz]);
- Player[playerid][h_schaux] = (0.0);
- Player[playerid][h_schauy] = (0.0);
- Player[playerid][h_schauz] = (0.0);
- Player[playerid][last_int] = 0;
- Player[playerid][last_vw] = 0;
- Player[playerid][haus_schau] = 0;
- return SendClientMessage(playerid,0x00FF00FF,"Vorschau wurde beendet.");
- }
- return 0;
- }
- strtok(const string[], &index, trenner = ' ')
- {
- new length = strlen(string);
- while ((index < length) && (string[index] <= trenner))
- {
- index++;
- }
- new offset = index;
- new result[20];
- while ((index < length) && (string[index] > trenner) && ((index - offset) < (sizeof(result) - 1)))
- {
- result[index - offset] = string[index];
- index++;
- }
- result[index - offset] = EOS;
- return result;
- }
- public SaveCache()
- {
- new fm[255],File:hausx = fopen(HAUS_DATEI,io_write);
- for(new i = 0;i<_cache_haus;i++)
- {
- if(!HausDaten[i][interior])continue;
- format(fm,sizeof fm,"%s,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d\r\n",
- HausDaten[i][Besitzer],
- HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az],
- HausDaten[i][ix],HausDaten[i][iy],HausDaten[i][iz],
- HausDaten[i][interior],HausDaten[i][virtual_world],
- HausDaten[i][kosten],HausDaten[i][play_time],
- HausDaten[i][nicht_zum_kauf],HausDaten[i][verschlossen]);
- fwrite(hausx,fm);
- }
- fclose(hausx);
- return 1;
- }
- public OnPlayerPickUpPickup(playerid, pickupid)
- {
- #if defined INFO_TAFEL
- new showme[128];
- for(new i = 0;i<_cache_haus;i++)
- {
- if(pickupid!=HausDaten[i][pickid])continue;
- format(showme,sizeof showme,
- (!HausDaten[i][nicht_zum_kauf]) ? ("~w~Besitzer : ~b~%s~n~~w~Kosten : ~b~%d$~n~~w~Score : ~b~%dh~n~~w~Nutze ~g~ /hkaufen ~w~um es zu erwerben") :
- ("~w~Besitzer : ~b~%s~n~~w~Kosten : ~b~%d$~n~~w~Score : ~b~%d~n~"),
- HausDaten[i][Besitzer],HausDaten[i][kosten],HausDaten[i][play_time]);
- GameTextForPlayer(playerid,showme,3000,3);
- break;
- }
- #endif
- return 1;
- }
- public initSlot()
- {
- new foundx = -1;
- for(new i = 0;i<_cache_haus;i++)
- {
- if(HausDaten[i][Besitzer] == '\0'){foundx = i;break;}
- }
- return foundx;
- }
- // EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement