Hello. I started making a house system for my gamemode i'm developing and ofcourse I once again massively failed at it
Код:
#define HOUSE_PATH "/Houses/%d.ini"
enum hInfo
{
Float:hx,
Float:hy,
Float:hz,
Price,
Level,
Owner
}
new HouseInfo[MAX_HOUSES][hInfo],House[MAX_HOUSES];
under ongamemodeinit..
LoadHouses();
stock HousePath(cameraid)
{
new string[40];
format(string,sizeof(string), HOUSE_PATH, cameraid);
return string;
}
stock GetNextHouseID()
{
for(new i = 0; i < MAX_HOUSES; i++)
{
if(fexist(HousePath(i))) continue;
return i;
}
return -1;
}
stock LoadHouses()
{
new file[40];
for(new i = 0; i < MAX_HOUSES; i++)
{
format(file, sizeof(file), HOUSE_PATH, i);
if(fexist(file))
{
new string[128];
INI_ParseFile(file, "LoadHouseData_%s", .bExtra = true, .extra = i);
House[i] = CreateDynamicPickup(1272, 1, HouseInfo[i][hx], HouseInfo[i][hy], HouseInfo[i][hz]-0.5, -1, -1, -1, 50.0); //line 1458
format(string,sizeof(string),"{00FF00}Buy this house using /buyhouse\nHouse Price = %i\nHouse Level = %i\nHouse ID: %d",HouseInfo[i][Price],HouseInfo[i][Level],i);
HouseLabel[i] = CreateDynamic3DTextLabel(string, 0xFFFFFFFFFF, HouseInfo[i][hx], HouseInfo[i][hy], HouseInfo[i][hz]+0.3,50.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,100.0);
}
}
return 1;
}
forward LoadHouseData_Main(houseid, name[], value[]);
public LoadHouseData_Main(houseid, name[], value[])
{
new INI:File = INI_Open(HousePath(houseid));
INI_SetTag(File, "Main");
INI_Float("X", HouseInfo[houseid][hx]);
INI_Float("Y", HouseInfo[houseid][hy]);
INI_Float("Z", HouseInfo[houseid][hz]);
INI_Int("Price", HouseInfo[houseid][Price]);
INI_Int("Level", HouseInfo[houseid][Level]);
INI_Int("Owner", HouseInfo[houseid][Owner]);
INI_Close(File);
return 1;
}
CMD:createhouse(playerid,params[])
{
if(PlayerInfo[playerid][pLevel] < 3) return error
new price,level;
if(sscanf(params,"ii",price,level)) return SendClientMessage(playerid, COLOR_RED,"USAGE: /createhouse <price> <level>");
if(level < 1 || level > 10) return SendClientMessage(playerid, COLOR_RED,"Minimum house level: 1\nMaximum house level: 10");
if(price < 100000) return SendClientMessage(playerid, COLOR_RED,"Too cheap! Please choose a higher value!");
new Float:x,Float:y,Float:z,string[128];
GetPlayerPos(playerid,x,y,z); //line 1447
new nextid = GetNextHouseID();
if(nextid == -1) return SendClientMessage(playerid, COLOR_RED, "You have reached the maximum amount of houses, please delete one before continuing.");
new INI:File = INI_Open(HousePath(nextid)); //line 1450
INI_SetTag(File, "Main");
INI_WriteFloat(File, "X", x);
INI_WriteFloat(File, "Y", y);
INI_WriteFloat(File, "Z", z);
INI_WriteInt(File, "Price", price);
INI_WriteInt(File, "Level", level);
INI_WriteInt(File, "Owner", 0);
INI_Close(File);
HouseInfo[nextid][hx] = x;
HouseInfo[nextid][hy] = y;
HouseInfo[nextid][hz] = z;
HouseInfo[nextid][Price] = price;
HouseInfo[nextid][Level] = level;
HouseInfo[nextid][Owner] = 0;
House[nextid] = CreateDynamicPickup(1272, 1, x, y, z-0.5, -1, -1, -1, 50.0); //line 1458
format(string,sizeof(string),"{00FF00}Buy this house using /buyhouse\nHouse Price = %i\nHouse Level = %i\nHouse ID: %d",HouseInfo[nextid][Price],HouseInfo[nextid][Level],nextid);
HouseLabel[nextid] = CreateDynamic3DTextLabel(string, 0xFFFFFFFFFF, HouseInfo[nextid][hx], HouseInfo[nextid][hy], HouseInfo[nextid][hz]+0.3,50.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,100.0);
SendClientMessage(playerid, COLOR_LIMEGREEN,"House successfully created!");
return 1;
}
CMD:delhouse(playerid,params[])
{
if(PlayerInfo[playerid][pLevel] < 3) return error
for(new i = 0; i < MAX_HOUSES; i++)
{
if(!fexist(HousePath(i))) continue;
if(IsPlayerInRangeOfPoint(playerid, 5.0, HouseInfo[i][hx], HouseInfo[i][hy], HouseInfo[i][hz]))
{
new string[40];
format(string,sizeof(string),"House (ID:%d) removed!",i);
fremove(HousePath(i));
DestroyDynamicPickup(House[i]);
DestroyDynamic3DTextLabel(HouseLabel[i]);
SendClientMessage(playerid,COLOR_RED,string);
break;
}
}
return 1;
}
Код:
CMD:buyhouse(playerid,params[])
{
for(new i = 0;i<MAX_HOUSES;i++)
{
if(HouseInfo[i][Owner] == playerid) return SendClientMessage(playerid, COLOR_RED,"You already own a house!");
if(IsPlayerInRangeOfPoint(playerid, 5.0,HouseInfo[i][hx],HouseInfo[i][hy],HouseInfo[i][hz]))
{
if(HouseInfo[i][Owner] != -1) return SendClientMessage(playerid,COLOR_RED,"That house is already owned!");
if(GetPlayerMoney(playerid) < HouseInfo[i][Price]) return SendClientMessage(playerid,COLOR_RED,"Insufficient funds!");
new INI:File = INI_Open(HousePath(i)); //line 1450
INI_SetTag(File, "Main");
INI_WriteString(File, "Owner", PlayerName(playerid));
INI_Close(File);
GivePlayerMoney(playerid,-HouseInfo[i][Price]);
SendClientMessage(playerid,COLOR_LIMEGREEN,"House successfully bought!");
}
}
return 1;
}
I just realised that his house script was the thing that bugged my commands.. For example /Createhouse with all the parametres created an empty .ini file and said Unknown command in the chat.. Pretty much the same happened with /setlevel which has nothing to do with the house system except for the fact that I use zcmd..