16.07.2014, 12:50
Hi guys, I would put that in my server after disconnecting the player buys a property that is not saved.
If you need more information please contact the meantime, I leave you my filescript.

If you need more information please contact the meantime, I leave you my filescript.

PHP код:
#include <a_samp>
#include <dini>
#define MAX_PROPERTIES 100
#define MAX_PROPERTIES_PER_PLAYER 4
#define UNBUYABLETIME 900
#define ENABLE_LOGIN_SYSTEM 1
#define ENABLE_MAP_ICON_STREAMER 1
#define REGISTER_COMMAND "/pr" //do not use this
#define LOGIN_COMMAND "/pl" //do not use this
new PropertiesAmount;
new MP;
enum propinfo
{
PropName[64],
Float:PropX,
Float:PropY,
Float:PropZ,
PropIsBought,
PropUnbuyableTime,
PropOwner[MAX_PLAYER_NAME],
PropValue,
PropEarning,
PickupNr,
}
new PropInfo[MAX_PROPERTIES][propinfo]; //CarInfo
new PlayerProps[MAX_PLAYERS];
new EarningsForPlayer[MAX_PLAYERS];
new Logged[MAX_PLAYERS];
public OnFilterScriptInit()
{
LoadProperties();
MP = GetMaxPlayers();
for(new i; i<MP; i++)
{
if(IsPlayerConnected(i))
{
new pName[MAX_PLAYER_NAME];
GetPlayerName(i, pName, MAX_PLAYER_NAME);
for(new propid; propid < PropertiesAmount; propid++)
{
if(PropInfo[propid][PropIsBought] == 1)
{
if(strcmp(PropInfo[propid][PropOwner], pName, true)==0)
{
EarningsForPlayer[i] += PropInfo[propid][PropEarning];
PlayerProps[i]++;
}
}
}
}
}
SetTimer("UpdateUnbuyableTime", 60000, 1);
#if ENABLE_MAP_ICON_STREAMER == 1
SetTimer("MapIconStreamer", 500, 1);
#endif
SetTimer("PropertyPayout", 60000, 1);
print("-------------------------------------------------");
print("Property-System by =>Sandra<= Succesfully loaded!");
print("-------------------------------------------------");
return 1;
}
public OnFilterScriptExit()
{
return 1;
}
public OnPlayerConnect(playerid)
{
PlayerProps[playerid] = 0;
Logged[playerid] = 1;
EarningsForPlayer[playerid] = 0;
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, MAX_PLAYER_NAME);
for(new propid; propid < PropertiesAmount; propid++)
{
if(PropInfo[propid][PropIsBought] == 1)
{
if(strcmp(PropInfo[propid][PropOwner], pName, true)==0)
{
EarningsForPlayer[playerid] += PropInfo[propid][PropEarning];
PlayerProps[playerid]++;
}
}
}
#if ENABLE_LOGIN_SYSTEM == 0
if(PlayerProps[playerid] > 0)
{
new str[128];
format(str, 128, "You currently own %d properties. Type /myproperties for more info about them.", PlayerProps[playerid]);
SendClientMessage(playerid, 0x99FF66AA, str);
}
#endif
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
new pName[MAX_PLAYER_NAME];
new propid = IsPlayerNearProperty(playerid);
GetPlayerName(playerid, pName, sizeof(pName));
format(PropInfo[propid][PropOwner], MAX_PLAYER_NAME, "Nobody");
PropInfo[propid][PropIsBought] = 0;
PropInfo[propid][PropUnbuyableTime] = 0;
GivePlayerMoney(playerid, (PropInfo[propid][PropValue]/2));
PlayerProps[playerid] = 0;
return 1;
}
public OnPlayerText(playerid, text[])
{
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[256], idx, tmp[256];
cmd = strtok(cmdtext, idx);
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
if(strcmp(cmd, "/propertyhelp", true)==0 || strcmp(cmd, "/prophelp", true)==0)
{
SendClientMessage(playerid, 0x6699FFAA, "|=========================================================|");
new str[128];
SendClientMessage(playerid, 0x6699FFAA, "Property-related commands:");
#if ENABLE_LOGIN_SYSTEM == 1
format(str, 128, "%s ==>> To register your name in our property-database", REGISTER_COMMAND);
SendClientMessage(playerid, 0x66CCFFAA, str);
format(str, 128, "%s ==>> To log into our property-database", LOGIN_COMMAND);
SendClientMessage(playerid, 0x66CCFFAA, str);
#endif
SendClientMessage(playerid, 0x66CCFFAA, "/buyproperty or /buyprop ==>> To buy a property");
SendClientMessage(playerid, 0x66CCFFAA, "/sellproperty or /sellprop ==>> To sell one of your properties");
SendClientMessage(playerid, 0x66CCFFAA, "/myproperties or /myprops ==>> To see a list of all properties you own");
if(IsPlayerAdmin(playerid))
{
SendClientMessage(playerid, 0x66CCFFAA, "/sellallproperties [Admin Only] ==>> To sell all properties for all players");
}
SendClientMessage(playerid, 0x6699FFAA, "|=========================================================|");
return 1;
}
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
if(strcmp(cmd, "/buyproperty", true)==0 || strcmp(cmd, "/buyprop", true)==0)
{
new str[128];
#if ENABLE_LOGIN_SYSTEM == 1
if(Logged[playerid] == 0)
{
format(str, 128, "You have to login before you can buy or sell properties! Use: %s", LOGIN_COMMAND);
SendClientMessage(playerid, 0xFF0000AA, str);
return 1;
}
#endif
new propid = IsPlayerNearProperty(playerid);
if(propid == -1)
{
SendClientMessage(playerid, 0xFF0000AA, "You're not close enough to a property");
return 1;
}
if(PlayerProps[playerid] == MAX_PROPERTIES_PER_PLAYER)
{
format(str, 128, "You already have %d properties, you can't buy more properties!", PlayerProps[playerid]);
SendClientMessage(playerid, 0xFF0000AA, str);
return 1;
}
if(PropInfo[propid][PropIsBought] == 1)
{
new ownerid = GetPlayerID(PropInfo[propid][PropOwner]);
if(ownerid == playerid)
{
SendClientMessage(playerid, 0xFF0000AA, "You already own this property!");
return 1;
}
else
{
if(PropInfo[propid][PropUnbuyableTime] > 0)
{
format(str, 128, "This property is already bought by %s.", PropInfo[propid][PropOwner], PropInfo[propid][PropUnbuyableTime]);
SendClientMessage(playerid, 0xFF0000AA, str);
return 1;
}
}
}
if(GetPlayerMoney(playerid) < PropInfo[propid][PropValue])
{
format(str, 128, "You don't have enough money! You need $%d,-", PropInfo[propid][PropValue]);
SendClientMessage(playerid, 0xFF0000AA, str);
return 1;
}
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, sizeof(pName));
if(PropInfo[propid][PropIsBought] && PropInfo[propid][PropUnbuyableTime] == 0)
{
new ownerid = GetPlayerID(PropInfo[propid][PropOwner]);
format(str, 128, "%s has bought your property \"%s\". You recieved 50 percent of it's value ($%d)", pName, PropInfo[propid][PropName], (PropInfo[propid][PropValue]/2));
GivePlayerMoney(ownerid, (PropInfo[propid][PropValue]/2));
SendClientMessage(ownerid, 0xFFFF00AA, str);
PlayerProps[ownerid]--;
}
PropInfo[propid][PropOwner] = pName;
PropInfo[propid][PropIsBought] = 1;
PropInfo[propid][PropUnbuyableTime] = UNBUYABLETIME;
EarningsForPlayer[playerid] += PropInfo[propid][PropEarning];
GivePlayerMoney(playerid, (0-PropInfo[propid][PropValue]));
format(str, 128, "You have bought the property \"%s\" for $%d", PropInfo[propid][PropName], PropInfo[propid][PropValue]);
SendClientMessage(playerid, 0xFFFF00AA, str);
format(str, 128, "%s has bought the property \"%s\".", pName, PropInfo[propid][PropName]);
SendClientMessageToAllEx(playerid, 0xFFFF00AA, str);
PlayerProps[playerid]++;
return 1;
}
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
if(strcmp(cmd, "/sellproperty", true) == 0 || strcmp(cmd, "/sellprop", true) == 0)
{
new str[128];
#if ENABLE_LOGIN_SYSTEM == 1
if(Logged[playerid] == 0)
{
format(str, 128, "You have to login before you can buy or sell properties! Use: %s", LOGIN_COMMAND);
SendClientMessage(playerid, 0xFF0000AA, str);
return 1;
}
#endif
new propid = IsPlayerNearProperty(playerid);
if(propid == -1)
{
SendClientMessage(playerid, 0xFF0000AA, "You're not close enough to a property");
return 1;
}
if(PropInfo[propid][PropIsBought] == 1)
{
new ownerid = GetPlayerID(PropInfo[propid][PropOwner]);
if(ownerid != playerid)
{
SendClientMessage(playerid, 0xFF0000AA, "You don't own this property!");
return 1;
}
}
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, sizeof(pName));
format(PropInfo[propid][PropOwner], MAX_PLAYER_NAME, "Nobody");
PropInfo[propid][PropIsBought] = 0;
PropInfo[propid][PropUnbuyableTime] = 0;
GivePlayerMoney(playerid, (PropInfo[propid][PropValue]/2));
format(str, 128, "You have sold your property \"%s\" for 50 percents of its value: $%d,-", PropInfo[propid][PropName], PropInfo[propid][PropValue]/2);
SendClientMessage(playerid, 0xFFFF00AA, str);
format(str, 128, "%s has sold the property \"%s\".", pName, PropInfo[propid][PropName]);
SendClientMessageToAllEx(playerid, 0xFFFF00AA, str);
PlayerProps[playerid]--;
EarningsForPlayer[playerid] -= PropInfo[propid][PropEarning];
return 1;
}
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
if(strcmp(cmd, "/myproperties", true) == 0 || strcmp(cmd, "/myprops", true) == 0)
{
new str[128], ownerid;
#if ENABLE_LOGIN_SYSTEM == 1
if(Logged[playerid] == 0)
{
format(str, 128, "You have to login before you can buy or sell properties! Use: %s", LOGIN_COMMAND);
SendClientMessage(playerid, 0xFF0000AA, str);
return 1;
}
#endif
if(PlayerProps[playerid] == 0)
{
SendClientMessage(playerid, 0xFF0000AA, "You don't own a property!");
return 1;
}
format(str, 128, "|============ Your %d Properties: =============|", PlayerProps[playerid]);
SendClientMessage(playerid, 0x99FF66AA, str);
for(new propid; propid < PropertiesAmount; propid++)
{
if(PropInfo[propid][PropIsBought] == 1)
{
ownerid = GetPlayerID(PropInfo[propid][PropOwner]);
if(ownerid == playerid)
{
format(str, 128, ">> \"%s\" Value: $%d,- Earnings: $%d,-", PropInfo[propid][PropName], PropInfo[propid][PropValue], PropInfo[propid][PropEarning]);
SendClientMessage(playerid, 0x99FF66AA, str);
}
}
}
SendClientMessage(playerid, 0x99FF66AA, "|============================================|");
return 1;
}
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
#if ENABLE_LOGIN_SYSTEM == 1
if(strcmp(cmd, REGISTER_COMMAND, true) == 0)
{
new str[128];
if(Logged[playerid] == 1) return SendClientMessage(playerid, 0xFF0000AA, "You're already logged in!");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
format(str, 128, "Use: %s 'Your Password'", REGISTER_COMMAND);
SendClientMessage(playerid, 0xFF9966AA, str);
return 1;
}
if(strlen(tmp) < 5) return SendClientMessage(playerid, 0xFF9966AA, "Password too short! At least 5 characters.");
if(strlen(tmp) > 20) return SendClientMessage(playerid, 0xFF9966AA, "Password too long! Max 20 characters.");
new pName[MAX_PLAYER_NAME], pass;
GetPlayerName(playerid, pName, MAX_PLAYER_NAME);
pass = dini_Int("PropertySystem/PlayerAccounts.txt", pName);
if(pass == 0)
{
dini_IntSet("PropertySystem/PlayerAccounts.txt", pName, encodepass(tmp));
Logged[playerid] = 1;
format(str, 128, "Your name is now registered in our property-database. Next time use \"%s %s\" to login", LOGIN_COMMAND, tmp);
SendClientMessage(playerid, 0x99FF66AA, str);
}
else
{
format(str, 128, "This name is already registered! Use %s to login!", LOGIN_COMMAND);
SendClientMessage(playerid, 0xFF9966AA, str);
}
return 1;
}
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
if(strcmp(cmd, LOGIN_COMMAND, true) == 0)
{
new str[128];
if(Logged[playerid] == 1) return SendClientMessage(playerid, 0xFF0000AA, "You're already logged in!");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
format(str, 128, "Use: %s 'Your Password'", LOGIN_COMMAND);
SendClientMessage(playerid, 0xFF9966AA, str);
return 1;
}
new pName[MAX_PLAYER_NAME], pass;
GetPlayerName(playerid, pName, MAX_PLAYER_NAME);
pass = dini_Int("PropertySystem/PlayerAccounts.txt", pName);
if(pass == 0)
{
format(str, 128, "This name is not registered yet! Use %s to register this name!", REGISTER_COMMAND);
SendClientMessage(playerid, 0xFF9966AA, str);
}
else
{
if(pass == encodepass(tmp))
{
Logged[playerid] = 1;
SendClientMessage(playerid, 0x99FF66AA, "You're now logged in! You can now buy and sell properties!");
}
else
{
SendClientMessage(playerid, 0xFF0000AA, "Wrong Password");
}
}
#if ENABLE_LOGIN_SYSTEM == 1
if(PlayerProps[playerid] > 0)
{
format(str, 128, "You currently own %d properties. Type /myproperties for more info about them.", PlayerProps[playerid]);
SendClientMessage(playerid, 0x99FF66AA, str);
}
#endif
return 1;
}
#endif
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
if(strcmp(cmd, "/sellallproperties", true)==0)
{
if(IsPlayerAdmin(playerid))
{
for(new propid; propid<PropertiesAmount; propid++)
{
format(PropInfo[propid][PropOwner], MAX_PLAYER_NAME, "Nobody");
PropInfo[propid][PropIsBought] = 0;
PropInfo[propid][PropUnbuyableTime] = 0;
}
for(new i; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
PlayerProps[i] = 0;
}
}
new str[128], pName[24];
GetPlayerName(playerid, pName, 24);
format(str, 128, "Admin %s has reset all properties!", pName);
SendClientMessageToAll(0xFFCC66AA, str);
}
return 1;
}
//================================================================================================================================
//================================================================================================================================
//================================================================================================================================
return 0;
}
public OnPlayerPickUpPickup(playerid, pickupid)
{
new propid = -1;
for(new id; id<MAX_PROPERTIES; id++)
{
if(PropInfo[id][PickupNr] == pickupid)
{
propid = id;
break;
}
}
if(propid != -1)
{
new str[128];
format(str, 128, "~y~\"%s\"~n~~r~Value: ~y~$%d~n~~r~Earning: ~y~$%d~n~~r~Owner: ~y~%s", PropInfo[propid][PropName], PropInfo[propid][PropValue], PropInfo[propid][PropEarning], PropInfo[propid][PropOwner]);
GameTextForPlayer(playerid, str, 6000, 3);
}
return 1;
}
stock LoadProperties()
{
if(fexist("PropertySystem/PropertyInfoo.txt"))
{
CountProperties();
new Argument[9][70];
new entry[256], BoughtProps;
new File: propfile = fopen("PropertySystem/PropertyInfoo.txt", io_read);
if (propfile)
{
for(new id; id<PropertiesAmount; id++)
{
fread(propfile, entry);
split(entry, Argument, ',');
format(PropInfo[id][PropName], 64, "%s", Argument[0]);
PropInfo[id][PropX] = floatstr(Argument[1]);
PropInfo[id][PropY] = floatstr(Argument[2]);
PropInfo[id][PropZ] = floatstr(Argument[3]);
PropInfo[id][PropValue] = strval(Argument[4]);
PropInfo[id][PropEarning] = strval(Argument[5]);
format(PropInfo[id][PropOwner], MAX_PLAYER_NAME, "%s", Argument[6]);
PropInfo[id][PropIsBought] = strval(Argument[7]);
PropInfo[id][PropUnbuyableTime] = strval(Argument[8]);
PropInfo[id][PickupNr] = CreatePickup(1273, 1, PropInfo[id][PropX], PropInfo[id][PropY], PropInfo[id][PropZ]);
if(PropInfo[id][PropIsBought] == 1)
{
BoughtProps++;
}
}
fclose(propfile);
printf("===================================");
printf("|| Created %d Properties ||", PropertiesAmount);
printf("||%d of the properties are bought||", BoughtProps);
printf("===================================");
}
}
}
stock SaveProperties()
{
if(fexist("PropertySystem/PropertyInfo.txt"))
{
CountProperties();
new Argument[9][70];
new entry[256], BoughtProps;
new File: propfile = fopen("PropertySystem/PropertyInfo.txt", io_read);
if (propfile)
{
for(new id; id<PropertiesAmount; id++)
{
fread(propfile, entry);
split(entry, Argument, ',');
format(PropInfo[id][PropName], 64, "%s", Argument[0]);
PropInfo[id][PropX] = floatstr(Argument[1]);
PropInfo[id][PropY] = floatstr(Argument[2]);
PropInfo[id][PropZ] = floatstr(Argument[3]);
PropInfo[id][PropValue] = strval(Argument[4]);
PropInfo[id][PropEarning] = strval(Argument[5]);
format(PropInfo[id][PropOwner], MAX_PLAYER_NAME, "%s", Argument[6]);
PropInfo[id][PropIsBought] = strval(Argument[7]);
PropInfo[id][PropUnbuyableTime] = strval(Argument[8]);
PropInfo[id][PickupNr] = CreatePickup(1273, 1, PropInfo[id][PropX], PropInfo[id][PropY], PropInfo[id][PropZ]);
if(PropInfo[id][PropIsBought] == 1)
{
BoughtProps++;
}
}
fclose(propfile);
printf("===================================");
printf("|| Created %d Properties ||", PropertiesAmount);
printf("||%d of the properties are bought||", BoughtProps);
printf("===================================");
}
}
}
forward split(const strsrc[], strdest[][], delimiter);
public split(const strsrc[], strdest[][], delimiter)
{
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;
}
stock CountProperties()
{
new entry[256];
new File: propfile = fopen("PropertySystem/PropertyInfo.txt", io_read);
while(fread(propfile, entry, 256))
{
PropertiesAmount++;
}
fclose(propfile);
}
forward IsPlayerNearProperty(playerid);
public IsPlayerNearProperty(playerid)
{
new Float:Distance;
for(new prop; prop<PropertiesAmount; prop++)
{
Distance = GetDistanceToProperty(playerid, prop);
if(Distance < 5.0)
{
return prop;
}
}
return -1;
}
forward Float:GetDistanceToProperty(playerid, Property);
public Float:GetDistanceToProperty(playerid, Property)
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
GetPlayerPos(playerid,x1,y1,z1);
x2 = PropInfo[Property][PropX];
y2 = PropInfo[Property][PropY];
z2 = PropInfo[Property][PropZ];
return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
stock GetPlayerID(const Name[])
{
for(new i; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
new pName[MAX_PLAYER_NAME];
GetPlayerName(i, pName, sizeof(pName));
if(strcmp(Name, pName, true)==0)
{
return i;
}
}
}
return -1;
}
stock SendClientMessageToAllEx(exeption, color, const message[])
{
for(new i; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(i != exeption)
{
SendClientMessage(i, color, message);
}
}
}
}
forward UpdateUnbuyableTime();
public UpdateUnbuyableTime()
{
for(new propid; propid<PropertiesAmount; propid++)
{
if(PropInfo[propid][PropIsBought] == 1)
{
if(PropInfo[propid][PropUnbuyableTime] > 0)
{
PropInfo[propid][PropUnbuyableTime]--;
}
}
}
}
stock encodepass(buf[]) {
new length=strlen(buf);
new s1 = 1;
new s2 = 0;
new n;
for (n=0; n<length; n++)
{
s1 = (s1 + buf[n]) % 65521;
s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
}
forward MapIconStreamer();
public MapIconStreamer()
{
for(new i; i<MP; i++)
{
if(IsPlayerConnected(i))
{
new Float:SmallestDistance = 99999.9;
new CP, Float:OldDistance;
for(new propid; propid<PropertiesAmount; propid++)
{
OldDistance = GetDistanceToProperty(i, propid);
if(OldDistance < SmallestDistance)
{
SmallestDistance = OldDistance;
CP = propid;
}
}
RemovePlayerMapIcon(i, 31);
if(PropInfo[CP][PropIsBought] == 1)
{
SetPlayerMapIcon(i, 31, PropInfo[CP][PropX], PropInfo[CP][PropY], PropInfo[CP][PropZ], 32, 0);
}
else
{
SetPlayerMapIcon(i, 31, PropInfo[CP][PropX], PropInfo[CP][PropY], PropInfo[CP][PropZ], 31, 0);
}
}
}
}
forward PropertyPayout();
public PropertyPayout()
{
new str[64];
for(new i; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(PlayerProps[i] > 0)
{
GivePlayerMoney(i, EarningsForPlayer[i]);
format(str, 64, "You earned $%d,- from your properties!", EarningsForPlayer[i]);
SendClientMessage(i, 0xFFFF00AA, str);
}
}
}
}
