DUDB was released to have an easy to handle library to save and load data about users.
Even the commands are really damned simple, but still some guys around here, which just copy and paste and can't get it to work then. If you can't add a own command, if you don't know how to call functions (I don't mean Copy n' Paste, I mean
know what each line of your source does!) - then please
stop reading, get somebody to pay and create the source for you. Its a pitty to see guys not beeing able to code anything and then complaining about not beeing able to cut and paste this. Sorry guys, but this makes somebody angry who thought that this library is really easy as hell.
Example implementation wich saves money (the result of the howto is this script)
o DNick :
http://forum.sa-mp.com/index.php?topic=4799
How to add "Position Saving?" - Read the second how to.
How to add "Save kills/death?" - Read the third how to.
How to use "myfolder/name.sav folder structure?" - Read the third how to.
I won't stick at the slow command handling in all default gamemodes, I will use the
fast command processor here. So if you are not able to convert your OnPlayerCommandText-Code to the fast command processor-structure, stop and just don't use saving data.
I suggest you read the following text
ones to understand how it works. Don't forget to create a folder called 'scriptfiles' in your samp directory to enable file access for the server.
We will develop a simple filterscript with all these features, so you can use this stub-file.
pawn Код:
#include <a_samp>
// for the samp stuff
#include <dutils>
// for the functions dini and dudb need
#include <dudb>
// for the userdatabase, get dudb version 2.0 for this.
#define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
#define COLOR_SYSTEM 0xEFEFF7AA
stock SystemMsg(playerid,msg[]) {
if ((IsPlayerConnected(playerid))&&(strlen(msg)>0)) {
SendClientMessage(playerid,COLOR_SYSTEM,msg);
}
return 1;
}
public OnPlayerCommandText(playerid,cmdtext[]) {
return false;
}
public OnPlayerConnect(playerid) {
return false;
}
/*
* This function will be useful when we need the playername
* © by DracoBlue 2006
*/
stock PlayerName(playerid) {
new name[255];
GetPlayerName(playerid, name, 255);
return name;
}
We will use SystemMsg for things the system sends. The dcmd-macro is what we use for the fast command processing later.
First of all we need a login/register method.
Nothing easier then this.
pawn Код:
/*
* /register password
*
*/
dcmd_register(playerid,params[]) {
// The command shouldn't work if we already are authed
if (PLAYERLIST_authed[playerid]) return SystemMsg(playerid,"Already authed.");
// The command shouldn't work if an account with this
// nick already exists
if (udb_Exists(PlayerName(playerid))) return SystemMsg(playerid,"Account already exists, please use '/login password'.");
// Did he forgot the password?
if (strlen(params)==0) return SystemMsg(playerid,"Correct usage: '/register password'");
// We save the money to the accstate
if (udb_Create(PlayerName(playerid),params)) return SystemMsg(playerid,"Account successfully created. Login with '/login password' now.");
return true;
}
Thats it? Yes thats it!
Want to see the /login?
pawn Код:
/*
* /login password
*
*/
dcmd_login(playerid,params[]) {
// The command shouldn't work if we already are authed
if (PLAYERLIST_authed[playerid]) return SystemMsg(playerid,"Already authed.");
// The command shouldn't work if an account with this
// nick does not exists
if (!udb_Exists(PlayerName(playerid))) return SystemMsg(playerid,"Account doesn't exist, please use '/register password'.");
// Did he forgot the password?
if (strlen(params)==0) return SystemMsg(playerid,"Correct usage: '/login password'");
if (udb_CheckLogin(PlayerName(playerid),params)) {
// Login was correct
// Following thing is the same like the missing SetPlayerCommand
GivePlayerMoney(playerid,dUserINT(PlayerName(playerid)).("money")-GetPlayerMoney(playerid));
PLAYERLIST_authed[playerid]=true;
return SystemMsg(playerid,"Successfully authed!");
}
// Login was incorrect
return SystemMsg(playerid,"Login failed!");
}
Of course we need to put a
pawn Код:
new PLAYERLIST_authed[MAX_PLAYERS];
at the beginning, because this will see if the player is authed or not.
We want to set this PLAYERLIST_authed for the player to false, if he enters the game.
pawn Код:
public OnPlayerConnect(playerid) {
PLAYERLIST_authed[playerid]=false;
return false;
}
Now we need to register the two commands and we are ready to use the filterscript!
pawn Код:
public OnPlayerCommandText(playerid,cmdtext[]) {
dcmd(login,5,cmdtext); // because login has 5 characters
dcmd(register,8,cmdtext); // because register has 8 characters
return false;
}
One thing is missing, we need to save the money if the player leaves the server.
pawn Код:
public OnPlayerDisconnect(playerid) {
if (PLAYERLIST_authed[playerid]) {
// Was loggedin, so save the data!
dUserSetINT(PlayerName(playerid)).("money",GetPlayerMoney(playerid));
}
PLAYERLIST_authed[playerid]=false;
return false;
}
Thats it.