Player Exp/level not saving
#1

hi guys, I've made a exp/level system

You get one exp each hour, once you hit 6/6 you can level up.

There are the following codes I added on my server

In-game It works fine like you can level up each hour/with command /buylevel you can level up.

but when i relog they're all gone so i want them to be saved.

Код:
enum Info
{
   
	pLevel,
	pExp,

};
Код:
new ScoreOld; 
new levelexp = 1;
Код:
forward ScoreUpdate();
forward PayDay(playerid);
Код:
public ScoreUpdate()
{
	new Score;
	new name[MAX_PLAYER_NAME];
	//new string[256];
	for(new i=0; i<MAX_PLAYERS; i++)
	{
		if (IsPlayerConnected(i))
		{
			GetPlayerName(i, name, sizeof(name));
   			Score = PlayerInfo[i][pLevel];
			SetPlayerScore(i, Score);
			if (Score > ScoreOld)
			{
				ScoreOld = Score;
			}
		}
	}
}
Код:
public OnPlayerConnect(playerid)
{
	PlayerInfo[playerid][pLevel] = 1;
	PlayerInfo[playerid][pExp] = 0;
	return 1;
}
Код:
COMMAND:buylevel(playerid,params[])
{
        new nxtlevel = PlayerInfo[playerid][pLevel]+5;
        new expamount = nxtlevel*levelexp;
        new string[30]; // String.
        if(IsPlayerConnected(playerid) == 1) // Checks if player is connected.
        {
            new points[248]; // Points.
          
            if(PlayerInfo[playerid][pExp] < expamount) // Checks if player's exp amount is above the required one or not.
            {
                format(points,sizeof(points)," You need [%d] Exp Points in order to level up, You currently have [%d]",expamount,PlayerInfo[playerid][pExp]); // Format, This is pretty obvious.
                SendClientMessage(playerid,COLOR_GREEN,points); // Sends the message.
                return 1;
            }
            else
            {
                PlayerInfo[playerid][pExp] = 0; //  Sets the EXP amount to 0 as you level'd up.
                PlayerInfo[playerid][pLevel]++; // Adds a level.
                format(string,sizeof(string),"~g~Your now level:[%d]",PlayerInfo[playerid][pLevel]); // Format.
                GameTextForPlayer(playerid,string,6000,1); // Sends gametext about his new level'ing up.
                return 1;
            }
        }
        return 1;
}
Код:
forward OnPlayerLogin(playerid,password[]);
Код:
public OnPlayerLogin(playerid,password[])
{

	if(GetPVarInt(playerid, "PlayerLogged") != 0) return true;
    new string[128];
	format(string, sizeof(string), "users/%s.ini", PlayerName(playerid));
	Hash(password);
    if(strcmp(DOF2_GetString(string, "Key"), password, true) == 0)
    {
        if(DOF2_GetInt(string, "Convert") != 5) return Kick(playerid);
		// Load Ints //
		SetPVarInt(playerid, "pLevel", DOF2_GetInt(string, "level"));
		SetPVarInt(playerid, "pExp", DOF2_GetInt(string, "Exp"));
         new score = PlayerInfo[playerid][pLevel];
        SetPlayerScore(playerid, score);
// END brackets are all fine no syntax errors.
Код:
forward OnPlayerDataSave(playerid);
Код:
public OnPlayerDataSave(playerid)
{
    if(IsPlayerConnected(playerid) && GetPVarInt(playerid, "PlayerLogged") == 1)
    {
	    new string[128];
	    format(string, sizeof(string), "users/%s.ini", PlayerName(playerid));
		if(DOF2_FileExists(string))
		{
                       DOF2_SetInt(string, "level", GetPVarInt(playerid, "level"));
			DOF2_SetInt(string, "Exp", GetPVarInt(playerid, "Exp"));
                  }
 return 0
    }
}
Yes, these are it, Just the player data isn't saving on my ini file it shows me level,exp but the value is always 0 doesn't update at all.

Can someone tell me what I did wrong or fix it for me?
http://pastebin.com/kFj8J9FF -> The place where I've got this system, can someone convert it to my function.
Once again screw if you find syntax errors, I get only warnings, in game the level system works fine, just the thing is it doesn't save at all!
Reply
#2

Use this variables when saving instead of the pvars:
pawn Код:
PlayerInfo[playerid][pExp]
PlayerInfo[playerid][pLevel]
Reply
#3

Quote:
Originally Posted by -Prodigy-
Посмотреть сообщение
Use this variables when saving instead of the pvars:
pawn Код:
PlayerInfo[playerid][pExp]
PlayerInfo[playerid][pLevel]
On onplayerdatasave? Do you think that might be reason why it was not saving
Reply
#4

Quote:
Originally Posted by JasonTurkey
Посмотреть сообщение
pawn Код:
enum Info
{
    pLevel,
    pExp,
};
new PlayerInfo[MAX_PLAYERS][Info]; // You must have this.

// Loading
SetPVarInt(playerid, "pLevel", DOF2_GetInt(string, "level"));
SetPVarInt(playerid, "pExp", DOF2_GetInt(string, "Exp"));

// Saving
DOF2_SetInt(string, "level", GetPVarInt(playerid, "level"));
DOF2_SetInt(string, "Exp", GetPVarInt(playerid, "Exp"));
First of all, as you see, you are loading it via PVars, while you earlier used normal variables.
Second, you are using "pLevel" and "pExp" to load the variables, while using "level" and "Exp" to save them.

This way you will save everything with "pLevel" and "pExp" and loading from unsigned names.
I'd suggest you to use one type of var, and also put the same names when loading and saving data:
pawn Код:
public OnPlayerLogin(playerid,password[])
{
    if(GetPVarInt(playerid, "PlayerLogged") != 0) return true;
    new string[128];
    format(string, sizeof(string), "users/%s.ini", PlayerName(playerid));
    Hash(password);
    if(strcmp(DOF2_GetString(string, "Key"), password, true) == 0)
    {
        if(DOF2_GetInt(string, "Convert") != 5) return Kick(playerid);
        // Load Ints //
        SetPVarInt(playerid, "Level", DOF2_GetInt(string, "pLevel"));
        SetPVarInt(playerid, "Exp", DOF2_GetInt(string, "pExp"));
        new score = PlayerInfo[playerid][pLevel];
        SetPlayerScore(playerid, score);
    }
}

public OnPlayerDataSave(playerid)
{
    if(IsPlayerConnected(playerid) && GetPVarInt(playerid, "PlayerLogged") == 1)
    {
        new string[128];
        format(string, sizeof(string), "users/%s.ini", PlayerName(playerid));
        if(DOF2_FileExists(string))
        {
            DOF2_SetInt(string, "pLevel", GetPVarInt(playerid, "Level"));
            DOF2_SetInt(string, "pExp", GetPVarInt(playerid, "Exp"));
        }
        return 0;
    }
}
Reply
#5

Quote:
Originally Posted by Dragonsaurus
Посмотреть сообщение
First of all, as you see, you are loading it via PVars, while you earlier used normal variables.
Second, you are using "pLevel" and "pExp" to load the variables, while using "level" and "Exp" to save them.

This way you will save everything with "pLevel" and "pExp" and loading from unsigned names.
I'd suggest you to use one type of var, and also put the same names when loading and saving data:
pawn Код:
public OnPlayerLogin(playerid,password[])
{
    if(GetPVarInt(playerid, "PlayerLogged") != 0) return true;
    new string[128];
    format(string, sizeof(string), "users/%s.ini", PlayerName(playerid));
    Hash(password);
    if(strcmp(DOF2_GetString(string, "Key"), password, true) == 0)
    {
        if(DOF2_GetInt(string, "Convert") != 5) return Kick(playerid);
        // Load Ints //
        SetPVarInt(playerid, "Level", DOF2_GetInt(string, "pLevel"));
        SetPVarInt(playerid, "Exp", DOF2_GetInt(string, "pExp"));
        new score = PlayerInfo[playerid][pLevel];
        SetPlayerScore(playerid, score);
    }
}

public OnPlayerDataSave(playerid)
{
    if(IsPlayerConnected(playerid) && GetPVarInt(playerid, "PlayerLogged") == 1)
    {
        new string[128];
        format(string, sizeof(string), "users/%s.ini", PlayerName(playerid));
        if(DOF2_FileExists(string))
        {
            DOF2_SetInt(string, "pLevel", GetPVarInt(playerid, "Level"));
            DOF2_SetInt(string, "pExp", GetPVarInt(playerid, "Exp"));
        }
        return 0;
    }
}
It still doesn't save..
Reply
#6

This is weird it still doesn't save when I changed the varaibles. Can someone like translate the pastbin and help me put it on my script? Cus nothing is being saved I mean exp/level.
Reply
#7

still seeking for help!
Reply
#8

since pastbin is not working here is the code I want it translated to mine
Код:
#include <a_samp>

#define white 0xFFFFFFAA
#define white 0xFFFFFFAA
#define yellow 0xFFFFF00AA
#define red 0x660000AA
#define pink 0xFF66FFAA
#define lightblue 0x33CCFFAA
#define darkred 0x660000AA
#define grey 0xAFAFAFAA
#define error 0xD2691EAA
#define orange 0xFF9900AA
#define nicepink 0xEC13COFF
#define grad1 0xB4B5B7AA
#define lightgreen 0x7CFC00AA

enum Info
{
    pPassword[128],
	pLevel,
	pExp,
	pCash,
};
new PlayerInfo[MAX_PLAYERS][Info];
new levelexp = 1;
new gPlayerLogged[MAX_PLAYERS];
new gPlayerAccount[MAX_PLAYERS];
new ScoreOld;
forward OnPlayerLogin(playerid,const string[]);
forward String(string[]);
forward ScoreUpdate();
forward PayDay(playerid);
forward PlayerPlayMusic(playerid);
forward StopMusic();

public ScoreUpdate()
{
	new Score;
	new name[MAX_PLAYER_NAME];
	//new string[256];
	for(new i=0; i<MAX_PLAYERS; i++)
	{
		if (IsPlayerConnected(i))
		{
			GetPlayerName(i, name, sizeof(name));
   			Score = PlayerInfo[i][pLevel];
			SetPlayerScore(i, Score);
			if (Score > ScoreOld)
			{
				ScoreOld = Score;
			}
		}
	}
}
// This is a comment
// uncomment the line below if you want to write a filterscript
#define FILTERSCRIPT

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
	SetTimer("PayDay",10000,1);//600000
	SetTimer("ScoreUpdate", 1000, 1);
	print("\n--------------------------------------");
	print(" Blank Filterscript by your name here");
	print("--------------------------------------\n");
	return 1;
}

public OnFilterScriptExit()
{
	return 1;
}
#endif
public OnPlayerConnect(playerid)
{
	PlayerInfo[playerid][pLevel] = 1;
	PlayerInfo[playerid][pExp] = 0;
	return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
	return 1;
}

public OnPlayerSpawn(playerid)
{
	return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
	return 1;
}

public OnVehicleSpawn(vehicleid)
{
	return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
	return 1;
}

public OnPlayerText(playerid, text[])
{
	return 1;
}

public OnPlayerPrivmsg(playerid, recieverid, text[])
{
	return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    new cmd[256];
    new idx;
    cmd = strtok(cmdtext, idx);
   	new tmp[256];
	new playername[MAX_PLAYER_NAME];
	GetPlayerName(playerid,playername,sizeof(playername));
    new nxtlevel = PlayerInfo[playerid][pLevel]+1;
    new expamount = nxtlevel*levelexp;
    new info[248];
    if (strcmp(cmd, "/login", true) ==0 )
	{
	    if(IsPlayerConnected(playerid))
	    {
	        new tmppass[64];
			if(gPlayerLogged[playerid] == 1)
			{
				SendClientMessage(playerid, grey, "	You are already logged in.");
				return 1;
			}
			tmp = strtok(cmdtext, idx);
			if(!strlen(tmp))
			{
				SendClientMessage(playerid, grey, "	USAGE: /login [password]");
				return 1;
			}
			strmid(tmppass, tmp, 0, strlen(cmdtext), 255);
			String(tmppass);
			OnPlayerLogin(playerid,tmppass);
		}
		return 1;
	}
	if (strcmp(cmd, "/register", true)==0)
	{
		new string[265];
		tmp = strtok(cmdtext, idx);
		if(!strlen(tmp))
		{
			SendClientMessage(playerid, grey, "USAGE: /register [password]");
			return 1;
		}
		if (gPlayerAccount[playerid] == 1)
		{
			SendClientMessage(playerid, grey, "   That nickname is already registered");
			return 1;
		}

		strmid(PlayerInfo[playerid][pPassword], tmp, 0, strlen(cmdtext), 255);
		String(PlayerInfo[playerid][pPassword]);
		GetPlayerName(playerid, playername, sizeof(playername));
		format(string, sizeof(string), "%s.cer", playername);
		new File: file = fopen(string, io_read);
		if (file)
		{
			SendClientMessage(playerid, grey, "   That name is already registered");
			fclose(file);
			return 1;
		}
		new File:hFile;
		hFile = fopen(string, io_append);
		new var[32];//
        format(var, 32, "%s\n", PlayerInfo[playerid][pPassword]);fwrite(hFile, var);
        format(var, 32, "Level:%d\n",PlayerInfo[playerid][pLevel]);fwrite(hFile, var);
        format(var, 32, "Exp:%d\n",PlayerInfo[playerid][pExp]);fwrite(hFile, var);
        PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
        format(var, 32, "Cash:%d\n",PlayerInfo[playerid][pCash]);fwrite(hFile, var);
		fclose(hFile);
		SendClientMessage(playerid, white, "Succesfully Registered!");
		SendClientMessage(playerid, white, "Next time when you come , use /login [ password ].");
		OnPlayerLogin(playerid,PlayerInfo[playerid][pPassword]);
		return 1;
	}
	if (strcmp("/buylevel", cmd, true, 10) == 0)
	{
		if(IsPlayerConnected(playerid) == 1)
	    {
	        new points[248];
	        if(PlayerInfo[playerid][pExp] < expamount)
	        {
				format(points,sizeof(points)," You need [%d] Exp Points! You cureently have [%d]",expamount,PlayerInfo[playerid][pExp]);
				SendClientMessage(playerid,white,points);
				return 1;
			}
			else
			{
				PlayerInfo[playerid][pExp] = 0;
				PlayerInfo[playerid][pLevel]++;
				format(info,sizeof(info)," ~g~ Level Up! ~w~ Your now level: [%d]",PlayerInfo[playerid][pLevel]);
				GameTextForPlayer(playerid,info,6000,1);
				return 1;
			}
		}
		return 1;
	}
	if(strcmp("/level", cmd, true, 10)  == 0)
	{
	    if(gPlayerLogged[playerid] == 0)
	    {
	        SendClientMessage(playerid,white," Error: You must be logged in to use this!");
	        return 1;
		}
		else if(gPlayerLogged[playerid] == 1)
		{
	    	new stats[248];
	    	format(stats, sizeof(stats), "_______________________");
	    	SendClientMessage(playerid,lightgreen,stats);
			format(stats, sizeof(stats), " *** %s ***",playername);
			SendClientMessage(playerid,white,stats);
    		format(stats, sizeof(stats), " General: Level [%d], Exp [%d/%d]",PlayerInfo[playerid][pLevel],PlayerInfo[playerid][pExp],expamount);
    		SendClientMessage(playerid,white,stats);
		}
		return 1;
	}
	return 0;
}
public String(string[])
{
	for(new x=0; x < strlen(string); x++)
	  {
		  string[x] += (3^x) * (x % 15);
		  if(string[x] > (0xff))
		  {
			  string[x] -= 64;
		  }
	  }
	return 1;
}
strtok(const string[], &index)
{
	new length = strlen(string);
	while ((index < length) && (string[index] <= ' '))
	{
		index++;
	}

	new offset = index;
	new result[20];
	while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
	{
		result[index - offset] = string[index];
		index++;
	}
	result[index - offset] = EOS;
	return result;
}
public OnPlayerLogin(playerid,const string[])
{
    new pname2[MAX_PLAYER_NAME];
	new pname3[MAX_PLAYER_NAME];
	new string2[64];
	new string3[128];
	GetPlayerName(playerid, pname2, sizeof(pname2));
	format(string2, sizeof(string2), "%s.cer", pname2);
	new File: UserFile = fopen(string2, io_read);

	if (UserFile)
	{
		new valtmp[128];
		fread(UserFile, valtmp);strmid(PlayerInfo[playerid][pPassword], valtmp, 0, strlen(valtmp)-1, 255);

		if ((strcmp(PlayerInfo[playerid][pPassword], string, true, strlen(valtmp)-1) == 0))
		{
			new key[128],val[128];
 			new Data[128];
 			while(fread(UserFile,Data,sizeof(Data)))
			{
				key = ini_GetKey(Data);
                if( strcmp( key , "Level" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pLevel] = strval( val ); }
                if( strcmp( key , "Exp" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pExp] = strval( val ); }
                if( strcmp( key , "Cash" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pCash] = strval( val ); }
                GivePlayerMoney(playerid,PlayerInfo[playerid][pCash]);
			}
			fclose(UserFile);
			gPlayerLogged[playerid] = 1;
			gPlayerAccount[playerid] = 1;
		    new score = PlayerInfo[playerid][pLevel];
            SetPlayerScore(playerid, score);
			GetPlayerName(playerid, pname3, sizeof(pname3));
			format(string3, sizeof(string3), "Succesfully logged in!");
			SendClientMessage(playerid, white,string3);
		}
		else
		{
			SendClientMessage(playerid, grey, "Invalid Password");
			fclose(UserFile);
		}
	}
	return 1;
}
stock ini_GetKey( line[] )
{
	new keyRes[128];
	keyRes[0] = 0;
    if ( strfind( line , "=" , true ) == -1 ) return keyRes;
    strmid( keyRes , line , 0 , strfind( line , "=" , true ) , sizeof( keyRes) );
    return keyRes;
}
stock ini_GetValue( line[] )
{
	new valRes[128];
	valRes[0]=0;
	if ( strfind( line , "=" , true ) == -1 ) return valRes;
	strmid( valRes , line , strfind( line , "=" , true )+1 , strlen( line ) , sizeof( valRes ) );
	return valRes;
}
public OnPlayerUpdate(playerid)
{
	if(IsPlayerConnected(playerid))
	{
		if(gPlayerLogged[playerid])
		{
			new string3[32];
			new pname3[MAX_PLAYER_NAME];
			GetPlayerName(playerid, pname3, sizeof(pname3));
			format(string3, sizeof(string3), "%s.cer", pname3);
			new File: pFile = fopen(string3, io_write);
			if (pFile)
			{
				new var[32];
				format(var, 32, "%s\n", PlayerInfo[playerid][pPassword]);fwrite(pFile, var);
				fclose(pFile);
				new File: hFile = fopen(string3, io_append);
				PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
				format(var, 32, "Kills:%d\n",PlayerInfo[playerid][pLevel]);fwrite(hFile, var);
				format(var, 32, "Deaths:%d\n",PlayerInfo[playerid][pExp]);fwrite(hFile, var);
				format(var, 32, "Cash:%d\n",PlayerInfo[playerid][pCash]);fwrite(hFile, var);
				fclose(hFile);
			}
		}
	}
	return 1;
}
public OnPlayerInfoChange(playerid)
{
	return 1;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
	return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
	return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
	return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
	return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
	return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
	return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
	return 1;
}

public OnRconCommand(cmd[])
{
	return 1;
}

public OnObjectMoved(objectid)
{
	return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
	return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
	return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
	return 1;
}

public OnPlayerExitedMenu(playerid)
{
	return 1;
}
public PayDay(playerid)
{
	for (new i; i < MAX_PLAYERS; i++)
	{
		if (IsPlayerConnected(i))
		{
		    new nxtlevel = PlayerInfo[playerid][pLevel];
		    new payday = nxtlevel*1000;
			GivePlayerMoney(i,payday);
			PlayerInfo[playerid][pExp]++;
			GameTextForPlayer(i,"  ~p~ PayDay",6,5000);
			PlayerPlayMusic(playerid);
		}
	}
}
public PlayerPlayMusic(playerid)
{
	for(new i = 0; i < MAX_PLAYERS; i++)
	{
		if(IsPlayerConnected(i))
		{
			SetTimer("StopMusic", 5000, 0);
			PlayerPlaySound(i, 1068, 0.0, 0.0, 0.0);
		}
	}
}
public StopMusic()
{
	for(new i = 0; i < MAX_PLAYERS; i++)
	{
		if(IsPlayerConnected(i))
		{
			PlayerPlaySound(i, 1069, 0.0, 0.0, 0.0);
		}
	}
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)