I learnt how to use these stuff and i applied each piece info i knew to create this house info
Everythings is pratically self explain if you reach care fully you will know what to do and have 0 errors like i did if you did not follow 100% then you will have errors
Код:
#include <a_samp> //this is for the main publics we use
#include <streamer> //Streamer for objects
#include <sscanf2> //sscanf for cmds
#include <zcmd> //zcmd for creating cmds
#include <foreach>//for cmds
#define COLOR_PURPLE 0x8A2BE2AA //colour purple..This iz needed to send player(s) message in that particular colour
#define MAX_HOUSES 1//define max amount houses you want to have
//add b4 gamemodeint
enum pInfo
{
pHouseKey, // playerhouse key
pCash//Player Money
}
new PlayerInfo[MAX_PLAYERS][pInfo];//where are we loading the info from
//add b4 gaemodeint
enum houseInfo
{
hPrice, //price for house
hStatus, //lock or unlock house
hOwner[32], //owner name of the house
Float:hX,//house pickup position X
Float:hY,//house pickup position Y
Float:hZ,//house pickup position Z
hPickup, //house pickup iz
Text3D:hText//the textdraw the house iz going to have
}
new HouseInfo[MAX_HOUSES][houseInfo];
//Add @ the bottom of the script
stock LoadHouses()
{
new tstar[21][32];//for the file
new string[256];//string
new File:file = fopen("houses.cfg", io_read);//check the file for the information
if(file)//for the files
{
new idx = 1;//ids
while(idx < MAX_HOUSES)//while iz 2 check #define MAX_HOUSES to max sure the house ids arent over the limit
{
fread(file, string);//reading the files
split(string, tstar, '|');//split to get file info
HouseInfo[idx][hPrice] = strval(tstar[1]);//getting house price
HouseInfo[idx][hStatus] = strval(tstar[2]);//getting house name
format(HouseInfo[idx][hOwner], 32, "%s", tstar[3]);
HouseInfo[idx][hX] = floatstr(tstar[4]);//floatin pos x
HouseInfo[idx][hY] = floatstr(tstar[5]);//floatin pos y
HouseInfo[idx][hZ] = floatstr(tstar[6]);//floatin pos z
{//creating pickup and labeling it, i use the id system so it would be easier to edit
HouseInfo[idx][hPickup] = CreateDynamicPickup(1273, 1, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ], 0);
if(!strcmp("trapstar2020", HouseInfo[idx][hOwner])) format(string, sizeof(string), "ID: %d\nOwner: %s\nStatus: For Sale\nPrice: $%d", idx, HouseInfo[idx][hOwner], HouseInfo[idx][hPrice]);
else format(string, sizeof(string), "ID: %d\nOwner: %s\nStatus: %s", idx, HouseInfo[idx][hOwner], hlock(idx));
HouseInfo[idx][hText] = CreateDynamic3DTextLabel(string, COLOR_PURPLE, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ]+0.3, 15);
}
idx++;//house ids
}
}
print("trapstar2020 loaded you houses.");
return 1;
}
stock SaveHouses()
{
new idx = 1, File:file;
new string[256];
while(idx < MAX_HOUSES)
{
format(string, sizeof(string), "%d|%d|%s|%f|%f|%f\r\n",//%d iz use for info %s iz used for player names && %f iz for floating positions
HouseInfo[idx][hPrice],//price
HouseInfo[idx][hStatus],//locks
HouseInfo[idx][hOwner],//owner name
HouseInfo[idx][hX],//pos X
HouseInfo[idx][hY],//pos Y
HouseInfo[idx][hZ]//pos Z
);
if(idx == 1)
{
file = fopen("houses.cfg", io_write);//creates files
}
else
{
file = fopen("houses.cfg", io_append);
}
fwrite(file, string);//updates info and
fclose(file);//then closes
idx++;//writes house ids
}
print("Houses saved successfully.");
}
//creating the file
stock fcreate(filename[])
{
if (fexist(filename)) return false;//search to see if file exsist
new File:fhnd;
fhnd=fopen(filename,io_write);//open file
if (fhnd) {//if file found
fclose(fhnd);//close it
return true;//end if itz true
}
return false;//create file if itz false
}
//split
stock split(const strsrc[], strdest[][], delimiter)//used for reading files
{
new i, li;
new aNum;
new len;
while(i <= strlen(strsrc))
{
if(strsrc[i] == delimiter || i == strlen(strsrc))
{
len = strmid(strdest[aNum], strsrc, li, i, 128);
strdest[aNum][len] = 0;
li = i+1;
aNum++;
}
i++;
}
return 1;
}
//creating house lock
stock hlock(hid)
{
new string[16];//string we going to use
if(!HouseInfo[hid][hStatus]) format(string, sizeof(string), "Closed");
else if(HouseInfo[hid][hStatus]) format(string, sizeof(string), "Open");
return string;
}
//saving and loading houses
public OnGameModeInit()
{
LoadHouses();//load houses when GM Start
return 1;
}
public OnGameModeExit()
{
SaveHouses();//save house info when GM closed/Restarts(GMX)
return 1;
}
//CMD-TIME(ADMINS) /creating a house,deleting the houses and going to the house
CMD:createhouse(playerid, params[])//cmd /createhouse
{
new string[128];//new for the string we are going to create
if(IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_PURPLE, "You are not an authorized to use this command.");//if the player Isnt Rcon admin he cannot createhouse
for(new idx=1; idx<MAX_HOUSES; idx++)//set house id +1 everyone a house iz create
{
new Float:X, Float:Y, Float:Z;//float the positions
GetPlayerPos(playerid, X, Y, Z);//Search for player X Y Z position
// Making House
HouseInfo[idx][hPrice] = 1; //price the house would be when created
HouseInfo[idx][hStatus] = 0; //the lock status of the houses
format(HouseInfo[idx][hOwner], 32, "Trapstar2020 House");//the name the will appear when house iz created
HouseInfo[idx][hX] = X;//position X of house creation
HouseInfo[idx][hY] = Y;//position Y of house creation
HouseInfo[idx][hZ] = Z;//position Z of house creation
HouseInfo[idx][hPickup] = CreateDynamicPickup(1273, 1, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ], 0);//create house ticket in the player XYZ postion
format(string, sizeof(string), "ID: %d\nOwner: %s\nStatus: For Sale\nPrice: $%d", HouseInfo[idx][hOwner], HouseInfo[idx][hPrice]);//house going to shown on houseticket
HouseInfo[idx][hText] = CreateDynamic3DTextLabel(string, COLOR_PURPLE, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ]+0.3, 15);//showing the info
idx = MAX_HOUSES;
}
return 1;
}
CMD:deletehouse(playerid, params[])
{
new id, string[128];//the house id n the string
if(IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_PURPLE, "You are not an authorized to use this command.");//if player not rcon admin
if(sscanf(params, "i", id)) return SendClientMessage(playerid, COLOR_PURPLE, "USAGE: /deletehouse [houseid]");//if player didnt input right contanent
foreach(Player, i)//
{
PlayerInfo[i][pHouseKey] = 0;//checks for online if he ownes house
format(string, sizeof(string), " Admin %s has deleted your house.", playername(playerid));//tells player his house his delete
SendClientMessage(i, COLOR_PURPLE, string);//sends the player the above string
}
if(!strcmp("Trapstar2020 House", HouseInfo[id][hOwner]))//if trapstar2020 house send the below strings
{
format(string, sizeof(string), ": %s has deleted house ID %d.", playername(playerid), id);//if no one owns it send this message
}
else
{
format(string, sizeof(string), "%s has deleted %s's house. (ID %d)", playername(playerid), HouseInfo[id][hOwner], id);//string saying admin & who house iz delete n the id
}
//the following will delete all house info
HouseInfo[id][hPrice] = 0;//sets house info price 2 0
HouseInfo[id][hStatus] = 0;//sets house info lock 2 0
format(HouseInfo[id][hOwner], 32, "");//delete house name
HouseInfo[id][hX] = 0;//sets X position 2 0
HouseInfo[id][hY] = 0;//sets Y position 2 0
HouseInfo[id][hZ] = 0;//sets Z position 2 0
DestroyDynamicPickup(HouseInfo[id][hPickup]);//delete pick
DestroyDynamic3DTextLabel(HouseInfo[id][hText]);//no more house text
return 1;
}
CMD:gotohouse(playerid, params[])
{
new idx, string[128];//house ids n string for messages
if(IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_PURPLE, "You are not an authorized to use this command.");//if player isnt rcon admin
if(sscanf(params, "i", idx)) return SendClientMessage(playerid, COLOR_PURPLE, "USAGE: /gotohouse [houseid]");//if player didnt imput text right
SetPlayerVirtualWorld(playerid, 0);//setiing player virtual world to go to
SetPlayerInterior(playerid, 0);//setting player interior world to go to
SetPlayerPos(playerid, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ]);//setting player XYZ psotion to go to
format(string, sizeof(string), " You have teleported to house ID %d.", idx);//string for telling player hes there
SendClientMessage(playerid, COLOR_PURPLE, string);//sending the string
return 1;
}
stock playername(playerid)//getting player name
{
new name[MAX_PLAYER_NAME];//what to call the search (new name0
GetPlayerName(playerid,name,sizeof(name));//searches for player name
for(new i = 0; i < MAX_PLAYER_NAME; i++)//search all players for the name
{
if(name[i] == '_') name[i] = ' ';//get the player name
}
return name;//closes once name gotton
}
CMD:buyhouse(playerid, params[])//cmd
{
new string[128], done;//if itz done and string
for(new idx=1; idx<MAX_HOUSES; idx++)//house ids
{
if(IsPlayerInRangeOfPoint(playerid, 2, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ]))//once player in range of house XYZ
{
if(!strcmp("Trapstar2020 House", HouseInfo[idx][hOwner], false))//if the owner of this house has this name it is not owned
{
if(PlayerInfo[playerid][pCash] < HouseInfo[idx][hPrice]) return SendClientMessage(playerid, COLOR_PURPLE, "You don't have enough money to buy this house.");//if player dont have enough money
GivePlayerMoney(playerid, -HouseInfo[idx][hPrice]);//give player -houseprice money
PlayerInfo[playerid][pHouseKey] = idx;//writes that player has house key
format(HouseInfo[idx][hOwner], 32, "%s", playername(playerid));//gets player name and change owner file to playername
format(string, sizeof(string), "ID: %d\nOwner: %s\nStatus: %s", idx, HouseInfo[idx][hOwner], hlock(idx));//sets house info
UpdateDynamic3DTextLabelText(HouseInfo[idx][hText], COLOR_PURPLE, string);//writes the abouse tex
SendClientMessage(playerid, COLOR_PURPLE, " You have successfully bought a house.");//sends message to player that the bought a house
idx = MAX_HOUSES;
done = 1;
}
if(idx == MAX_HOUSES-1 && !done)
{
SendClientMessage(playerid, COLOR_PURPLE, "This house is owned by someone else.");//if house has a different name then a player ownes it
}
}
if(idx == MAX_HOUSES-1 && !done)
{
SendClientMessage(playerid, COLOR_PURPLE, "You are not near a buyable house.");//player not in range of the house
}
}
return 1;
}
CMD:hlock(playerid, params[])//cmd
{
new string[128], idx, lockdone;//string for text,houseid,lock
if(PlayerInfo[playerid][pHouseKey])//checks for phousekey
{
idx = PlayerInfo[playerid][pHouseKey];//phousekey and
if(IsPlayerInRangeOfPoint(playerid, 2, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ]))//if player in range of house XYZ position
{
if(!HouseInfo[PlayerInfo[playerid][pHouseKey]][hStatus])//checks house stats
{
HouseInfo[PlayerInfo[playerid][pHouseKey]][hStatus] = 1;//sets the locks stats to 1 check stock hlock to see
format(string, sizeof(string), "ID: %d\nOwner: %s\nStatus: %s", idx, HouseInfo[idx][hOwner], playername(idx));//changes the text
UpdateDynamic3DTextLabelText(HouseInfo[PlayerInfo[playerid][pHouseKey]][hText], COLOR_PURPLE, string);//applies the change
GameTextForPlayer(playerid, "~g~House Unlocked", 3500, 3);//sends a message to player the his house iz unlock in the colour green 3.5seconds
}
else if(HouseInfo[PlayerInfo[playerid][pHouseKey]][hStatus])//checks house status once again
{
HouseInfo[PlayerInfo[playerid][pHouseKey]][hStatus] = 0;//changes the lock stats check stock hlock for it
format(string, sizeof(string), "ID: %d\nOwner: %s\nStatus: %s", idx, HouseInfo[idx][hOwner], playername(idx));//changes the pick info
UpdateDynamic3DTextLabelText(HouseInfo[PlayerInfo[playerid][pHouseKey]][hText], COLOR_PURPLE, string);//applies the change
GameTextForPlayer(playerid, "~r~House Locked", 3500, 3);//marks lock in the colour red for 3.5secs
}
lockdone = 1;//itz lock
}
}
if(!lockdone)//player not near house to lock it
{
SendClientMessage(playerid, COLOR_PURPLE, "You are not near something you can lock/unlock.");//sends the player a message saying so
}
return 1;//return true/false 1 = true
}
CMD:sellhousetomarket(playerid, params[])//
{
new string[128], done;//string and if sell 2 market iz done
if(!PlayerInfo[playerid][pHouseKey] ) return SendClientMessage(playerid, COLOR_PURPLE, "You don't own a house.");//if playerinfo player doesnt have house key
if(sscanf(params, "s[8]", params)) return SendClientMessage(playerid, COLOR_PURPLE, "USAGE: /sellhousetomarket [confirm]");//house to succesfull sell your to the market
if(!strcmp(params, "confirm", true))//apply the salee
{
new idx = PlayerInfo[playerid][pHouseKey];//checks player for house key
if(IsPlayerInRangeOfPoint(playerid, 2, HouseInfo[PlayerInfo[playerid][pHouseKey]][hX], HouseInfo[PlayerInfo[playerid][pHouseKey]][hY], HouseInfo[PlayerInfo[playerid][pHouseKey]][hZ]))//checks to see if player is in point of house positions
{
GivePlayerMoney(playerid, (75*HouseInfo[PlayerInfo[playerid][pHouseKey]][hPrice])/100);//gives player 75% of his money back
HouseInfo[PlayerInfo[playerid][pHouseKey]][hStatus] = 0;//sets player house key 2 0
format(HouseInfo[PlayerInfo[playerid][pHouseKey]][hOwner], 32, "Trapstar2020 House");//change the house name back to the non house owner name
format(string, sizeof(string), "ID: %d\nOwner: %s\nStatus: For Sale\nPrice: $%d", idx, HouseInfo[idx][hOwner], HouseInfo[idx][hPrice]);//changing text info
UpdateDynamic3DTextLabelText(HouseInfo[PlayerInfo[playerid][pHouseKey]][hText], COLOR_PURPLE, string);//applying text info
PlayerInfo[playerid][pHouseKey] = 0;
SendClientMessage(playerid, COLOR_PURPLE, " You have successfully sold your house to The State. (75 percent of the original price was paid back)");//telling player how much they for 4 the house
done = 1;//sale done
}
if(!done)//if itz not done itz gonna send a message
{
SendClientMessage(playerid, COLOR_PURPLE, "You are not near your house.");//if it isnt dont message sent
return 1;
}
}
return 1;
}
I know we're supposed to give constructive criticism, but really..? There's nothing good about this tutorial because it's
This is a really REALLY BAD tutorial, it doesn't use an effiecient DB system(it uses fopen LMAO), you should learn using Y_INI/MySQL.You used code tags(not pawn), did NOT EXPLAIN a thing, and I wish that right now that there was a button of REP--.
i explain what each line does and no i didnt implent a saving system..... i dont use .db cuz itz msql idk how to completly use msql yet...... copy n paste it in ur pawn and read it tell u what each lines does
i didnt click link and i just know itz ****** thing inside of bugging y not help me
Well, you said you do not know how to use MySQL, THEN STICK with your slow "DataBase" system, with the fopen method, but do not teach newbies such things, this way they'll never become experienced programmers, unlike you.
People like you make ppl go nowhere, But fcreate iz easy n simple for nubs 2 iz 4 nubs 2 use