#include <a_samp>
#include <bfx_iStream>
#define MAX_HH 100 // 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()
{
iGameModeInit_X();
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] = iAddStreamIcon(HausDaten[_cache_haus][ax],HausDaten[_cache_haus][ay],HausDaten[_cache_haus][az],(HausDaten[_cache_haus][nicht_zum_kauf]) ? (32) : (31),0);
haus_index = 0;
_cache_haus++;
}
fclose(hausx);
}
return 1;
}
public OnFilterScriptExit()
{
iGameModeExit_X();
SaveCache();
return 1;
}
public OnPlayerConnect(playerid)
{
iPlayerConnect_X(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]);
break;
}
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);
iRemoveStreamIcon(HausDaten[i][icon_id]);
HausDaten[i][icon_id] = iAddStreamIcon(HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az],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);
iRemoveStreamIcon(HausDaten[i][icon_id]);
HausDaten[i][icon_id] = iAddStreamIcon(HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az],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.");
iRemoveStreamIcon(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] = iAddStreamIcon(nowPos[0],nowPos[1],nowPos[2],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;
}
Das ist das filterscript.