[Tutorial] Simple Easy House
#1

I learnt how to use these stuff and i applied each piece info i knew to create this house info
Needed foreach,sscanf2,streamer,zcmd
Simple
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;
}
/enter & /exit
Код:
CMD:enter(playerid, params[])//cmd
{
	for(new idx=1; idx<MAX_HOUSES; idx++) //house and there ids
	{
		if(IsPlayerInRangeOfPoint(playerid, 2, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ]))//is player in range of door
	    {
		    if(!HouseInfo[idx][hStatus] && PlayerInfo[playerid][pHouseKey] != idx) return SendClientMessage(playerid, COLOR_PURPLE, "This house is locked.");//if house iz locked
	        SetPlayerVirtualWorld(playerid, idx+500);//set the person world 500+ids=id
			{
				SetPlayerPos(playerid, X,Y,Z);//input the XYZ you want
		        SetPlayerFacingAngle(playerid, Angle);//angle you want
		        SetCameraBehindPlayer(playerid);//sets camera behind player
		        SetPlayerInterior(playerid, interior);//input interior you want <<<^^^^^ if the following inputs were inputed it will not compile
			}
	   }
	   return 1;
}


CMD:exit(playerid, params[])//cmd
{
	new fin;//house
	if(IsPlayerInRangeOfPoint(playerid, range, X,Y,Z)//input player xyz n range
	{
	    new idx;//house ids
		idx = GetPlayerVirtualWorld(playerid)-500;//set back the player virtual world 2 50less
		if(!fin && idx < MAX_HOUSES && HouseInfo[idx]])//if the player is in house
		{
	        SetPlayerPos(playerid, HouseInfo[idx][hX], HouseInfo[idx][hY], HouseInfo[idx][hZ]);//sets player in the house XYZ position/where house iz created
	        SetPlayerInterior(playerid, 0);//sets player int
	        SetPlayerVirtualWorld(playerid, 0);//sets player virtual world
	        fin = 1;//house
        }
	}
	return 1;//return value = true
}
Reply
#2

I know we're supposed to give constructive criticism, but really..? There's nothing good about this tutorial because it's not a tutorial to begin with!
Reply
#3

imma pm u
Reply
#4

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--.
Reply
#5

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
Reply
#6

From now on if i see a bad tutorial i will just post this link for them -> https://sampforum.blast.hk/showthread.php?tid=65567
Reply
#7

i didnt click link and i just know itz ****** thing inside of bugging y not help me
Reply
#8

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.
Reply
#9

People like you make ppl go nowhere, But fcreate iz easy n simple for nubs 2 iz 4 nubs 2 use
Reply
#10

This isn't a tutorial.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)