Jump to content
Geplaatst:
comment_996696

[Mini Tutorial]Communiceren met files

(Is toch niet zo 'mini' geworden als ik van te voren gedacht had

:7)

Zo, ik heb weer eventjes wat tijd uitgetrokken om een nieuwe tutje te maken. :puh:

Ditkeer zal ik (proberen) uit te leggen hoe je kan communiceren met bestanden.

Allereerst moet natuurlijk de maker van dini en dutils bedankt worden: 'Dracoblue'

Dini is een systeem dat het communiceren makkelijker maakt.

Er zijn 4 soorten 'waarden':

- Strings: Dit zijn zinnen/teksten (zoals namen van spelers)

- Integers: Dit zijn getallen zonder decimalen. (Bijvoorbeeld 1 of 2 of 56)

- Floats: Dit zijn getallen mét decimalen. (Bijvoorbeeld 4.22 of 8.1 of 694.124959)

- Bools: Deze kan maar 2 waarden hebben: '0' of '1' (True of False)

Strings:

Strings zijn teksten, dit kan bijvoorbeeld de naam van een speler zijn.

Om een string in een file te zetten gebruik je deze functie:

dini_Set(naam van file, key, waarde);

Voorbeeld:

new teststring[128];
format(teststring, 128, "Hallo dit is een string.");
dini_Set("Testfile.txt", "Tekst", teststring);

De uitkomst is dan in de file 'Testfile.txt':

Tekst=Hallo dit is een string.

Om een string UIT een file te halen gebruik je de functie:

dini_Get(naam van file, key);

Strings moeten altijd worden opgeslagen in array's:

Voorbeeld:

new Zinnetje[256];
Zinnetje =  dini_Get("Testfile.txt", "Tekst");

Let op: Als je de bovenstaande manier gebruikt, MOET de size van de nieuwe variabele minimaal '255' zijn!!

Anders krijg je een error ("array sizes do not match, or destination array is too small")

Als je de size echt kleiner wilt hebben, moet je 'format' gebruiken:

new Zinnetje[64];
format(Zinnetje, 64, "%s", dini_Get("Testfile.txt", "Tekst"));

Integers:

Integers zijn getallen zonder een decimaal erachter.

Voorbeelden van integers zijn: ID's van bijvoorbeeld wapens, spelers, voertuigen. Ook het geld van een speler is een integer.

Om integers op te slaan gebruik je de volgende functie:

dini_IntSet(Naam van file, key, waarde);

Voorbeeld:

new Geldbedrag;
Geldbedrag = GetPlayerMoney(playerid);
dini_IntSet("Testfile.txt", "Money", Geldbedrag);

Voorbeeld resultaat in 'Testfile.txt':

Money=43128

Om integers UIT een file te lezen, gebruik je:

dini_Int(Naam van file, key);

Voorbeeld:

New Geldbedrag;
Geldbedrag = dini_Int("Testfile.txt", "Money");
GivePlayerMoney(playerid, Geldbedrag);

Floats:

Floats zijn getallen met een cijfer achter de komma (in pawno een punt).

Voorbeelden van floats die gebruikt worden in sa:mp:

- Coordinaten

- Health (van spelers en voertuigen)

- Armour

Om een float op te slaan gebruik je deze functie:

dini_FloatSet(Naam van file, key, waarde);

Voorbeeld:

new Float:LastX, Float:LastY, Float:LastZ;
GetPlayerPos(playerid, LastX, LastY, LastZ);
dini_FloatSet("Testfile.txt", "X", LastX);
dini_FloatSet("Testfile.txt", "Y", LastY);
dini_FloatSet("Testfile.txt", "Z", LastZ);

Voorbeeld resultaat in 'Testfile.txt':

X=452.9612

Y=3499.9153

Z=55.1272

Om floats uit een file te halen gebruik je:

dini_Bool(Naam van file, key);

Voorbeeld:

new Float:NewX, Float:NewY, Float:NewZ;
NewX = dini_Float("Testfile.txt", "X");
NewY = dini_Float("Testfile.txt", "Y");
NewZ = dini_Float("Testfile.txt", "Z");
SetPlayerPos(playerid, NewX, NewY, NewZ);

Bools (Booleaans):

Booleaans zijn variabelen die maar 2 waarden kunnen hebben: '0' of '1' (True of False)

Ik heb hier eerlijk gezegd nog nooit gebruik van gemaakt en weet niet zo goed waarvoor je dit zou kunnen gebruiken, maar ik doe toch maar een voorbeeldje:

Om booleaans in een file te zetten, gebruik je:

dini_BoolSet(Naam van file, key, waarde);

En om ze eruit te halen gebruik je:

dini_Bool(Naam van file, key);

Dit waren de methoden om een bepaalde waarde in en uit files te halen.

Nu zijn er nog 3 functies die belangrijk zijn:

dini_Create(naam van file);

Deze functie kan een nieuwe file aanmaken in de map 'scriptfiles'

Voorbeeld:

dini_Create("Testfile.txt");

Als je een file in een aparte sub-map wilt plaatsen gebruik je een slash:

dini_Create("Map1/Testfile.txt");

dini_Exists(naam van file);

Deze functie checkt of het opgegeven bestand wel of niet bestaat.

De functie 'returnt' '0' als de file niet bestaat, en '1' als de file wel bestaat.

Voorbeeld:

if(dini_Exists("Testfile.txt") == 0)
{
dini_Create("Testfile.txt");
}

dini_Remove(Naam van file);

Deze functie kan het opgegeven bestand verwijderen.

Voorbeeld (Compleet commando):

if(strcmp(cmdtext, "/removefile", true, 11)==0)
{
new FileName[64];
if(!strlen(cmdtext[12]))
{
	SendClientMessage(playerid, 0xFF0000AA, "Use: /removefile [naam van file]");
	return 1;
}
format(FileName, 64, "%s", cmdtext[12]);
if(dini_Exists(FileName) == 1)
{
	dini_Remove(FileName);
	SendClientMessage(playerid, 0xFF000AA, "File succesfully removed!");
}
else
{
	SendClientMessage(playerid, 0xFF0000AA, "This file does not exists!");
}
return 1;
}

Nou, dit waren de belangrijkste functies van Dini. Hiermee kan je heel veel expirimenteren!!

Voor meer voorbeelden kan je kijken in mijn tutorial over Accounts: Daarin worden ook deze functies gebruikt!

Ohja, je hebt natuurlijk wel de include-files 'dini.inc' en 'dutils.inc' nodig.

En je moet bovenaan je script hebben staan:

#include <dini>

Ik heb de files eventjes geüpload (voor het geval je ze nog niet had gedownload):

=>Klik<=

Er zit ook nog het bestand 'DUDB.inc' bij. Die kan je gebruiken om strings te coderen.

Dit word vaak gebruikt bij het maken van files die de naam van spelers moeten hebben.

(Want als files met tekens zoals ']' of '[' of '-' kunnen problemen geven.)

Zo zal de naam 'Sandra[NL]' worden veranderd naar: Sandra_05NL_06

Je gebruikt het zo:

new PName[MAX_PLAYER_NAME];
GetPlayerName(playerid, PName, sizeof(PName));\
dini_Create(udb_encode(PName));
dini_IntSet(udb_encode(PName), "Money", 10000);

Dit was het voor deze keer, als je nog vragen hebt, stel ze gerust.

Groetjes =>Sandra<=

Bewerkt: door =>Sandra<=

  • Reacties 33
  • Bezichtigingen 5.8k
  • Created
  • Laatste reactie

Top Posters In This Topic

Featured Replies

Geplaatst:
comment_1351629
Hé, gossie. Ik moet weer eens om hulp vragen. :$

Ik ben bezig met een RPG script, en ik wil de UserFiles opslaan in de map Users(goh, wat logisch). Alleen mijn probleem is dat het niet lukt. Kan iemand helpen? Vast wel. :engel:

Mijn script:

if (!dini_Exists(udb_encode(Users/FileName)))
		{
			dini_Create(udb_encode(Users/FileName));
			dini_IntSet(udb_encode(Users/FileName), "Password/n", udb_hash(tmp));
			dini_IntSet(udb_encode(Users/FileName), "Money", 0);
			dini_IntSet(udb_encode(Users/FileName), "Bank", 0);
			dini_IntSet(udb_encode(Users/FileName), "Rank", 0);
			dini_IntSet(udb_encode(Users/FileName), "Exp", 0);
			dini_IntSet(udb_encode(Users/FileName), "Level", 0);
			dini_IntSet(udb_encode(Users/FileName), "Team", 0);
			dini_IntSet(udb_encode(Users/FileName), "Skin", GetPlayerSkin(playerid));
			dini_Set(udb_encode(Users/FileName), "Job", "Jobless");
			dini_FloatSet(udb_encode(Users/FileName), "Health", 100.0);
			dini_FloatSet(udb_encode(Users/FileName), "Armour", 0);
			dini_IntSet(udb_encode(Users/FileName), "Adminlevel", 0);
			dini_IntSet(udb_encode(Users/FileName), "Housekey", 999);
			dini_IntSet(udb_encode(Users/FileName), "Bizzkey", 999);
			dini_IntSet(udb_encode(Users/FileName), "Carkey1", 999);
			dini_IntSet(udb_encode(Users/FileName), "Carkey2", 999);
			dini_IntSet(udb_encode(Users/FileName), "Gun1", 0);
			dini_IntSet(udb_encode(Users/FileName), "Gun2", 0);
			dini_IntSet(udb_encode(Users/FileName), "Gun3", 0);
			dini_IntSet(udb_encode(Users/FileName), "Gun4", 0);
			dini_IntSet(udb_encode(Users/FileName), "Gun5", 0);
			dini_IntSet(udb_encode(Users/FileName), "Gun6", 0);
			dini_IntSet(udb_encode(Users/FileName), "Gun7", 0);
			dini_IntSet(udb_encode(Users/FileName), "Gun8", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo1", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo2", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo3", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo4", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo5", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo6", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo7", 0);
			dini_IntSet(udb_encode(Users/FileName), "Ammo8", 0);
			dini_IntSet(udb_encode(Users/FileName), "Weed", 0);
			dini_IntSet(udb_encode(Users/FileName), "Cocain", 0);
			dini_IntSet(udb_encode(Users/FileName), "XTC", 0);
			dini_IntSet(udb_encode(Users/FileName), "Beer", 0);
			dini_IntSet(udb_encode(Users/FileName), "Wiskey", 0);
			dini_IntSet(udb_encode(Users/FileName), "Condom", 0);
			dini_IntSet(udb_encode(Users/FileName), "Apple", 0);
			dini_IntSet(udb_encode(Users/FileName), "Banana", 0);
			dini_IntSet(udb_encode(Users/FileName), "Orange", 0);
			dini_IntSet(udb_encode(Users/FileName), "Kiwi", 0);
			dini_IntSet(udb_encode(Users/FileName), "Pineapple", 0);
			dini_IntSet(udb_encode(Users/FileName), "Coconut", 0);

Errors:

C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(168) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(170) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(171) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(172) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(173) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(174) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(175) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(176) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(177) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(178) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(179) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(180) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(181) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(182) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(183) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(184) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(185) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(186) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(187) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(188) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(189) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(190) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(191) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(192) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(193) : error 017: undefined symbol "Users"
C:\Documents and Settings\remco.ASUS\Bureaublad\SAMP\gamemodes\AccountSysteem.pwn(194) : error 017: undefined symbol "Users"

Je bent volgens mij de " vergeten.

dus het wordt zoiets (kan zijn dat ik ze niet percies op de goede lpek heb gezet) :

dini_IntSet(udb_encode("Users/FileName")

Ik heb nog bijna geen ervaring hier mee, maar toch denk ik dat dit het oplost.

Geplaatst:
comment_1352239
Windows gebruikt backslashes ;)

dini_IntSet(udb_encode("Users\FileName")

Dat is hem, denk ik :).

Dan heeft Sandra het fout in haar tutorial staan. Maar het werkt nu. Dankje.

Misschien gebruikt Sandra Linux, dat systeem werkt namelijk wel met 'gewone' slashes.

  • 1 maand later...
Geplaatst:
comment_1394801

Hey,

Ik wou dat als je in mijn roleplay server een baan nam dat dat dan wer opgeslagen.

Op en ander topic gaf iemand mij de link naar deze tutorial,

En ik begon er direct aan, Het ging op het begin allemaal goed, (De tutorial was heel duidelijk) en als snel had ik als je een tekstcomando intypt dat hij dan de spelernaam en job invult

Bij: Job.txt stond dus :

(playername)=Cop

Maar nu had ik dit staan in mijn script:

public OnPlayerConnect(playerid)
{
   if dini_Get("Job.txt", (playername), "Cop");
{
	gTeam[playerid] = TEAM_COP0;
	SetPlayerColor(playerid, 0xCAEBFFFF);
	SetPlayerPos(playerid, 1553.2588,-1676.1017,16.1953);
	GivePlayerWeapon(playerid, 41, 200);
	GivePlayerWeapon(playerid, 3, 1);
	SetPlayerSkin(playerid, 280);
	SendClientMessage(playerid, COLOR_RED1, "You are now an offcial police member type /pcommands for a list of commands");
	return 1;
}
}

Maar hij pakt die ''Cop'' niet,

Dus mijn vraag is wat moet in

if dini_Get("Job.txt", (playername), "Cop");

staan zodat hij wat achter (playername) staat ziet,

De errors waren:

C:\Documents and Settings\gisela seip\Bureaublad\bjorn\Server B\filterscripts\ini.pwn(30) : warning 202: number of arguments does not match definition

C:\Documents and Settings\gisela seip\Bureaublad\bjorn\Server B\filterscripts\ini.pwn(30) : error 001: expected token: "*then", but found ";"

C:\Documents and Settings\gisela seip\Bureaublad\bjorn\Server B\filterscripts\ini.pwn(30) : error 036: empty statement

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

2 Errors.

Geplaatst:
comment_1394956

De job als een integer op slaan met dini_IntSet gezien je de job gedefined hebt. Vervolgens gebruik je deze code om ze er weer uit te halen:

public OnPlayerConnect(playerid)
{
gTeam[playerid] = dini_Int("Job.txt", (playername));
if(gTeam[playerid] == TEAM_COP0)
{
	SetPlayerColor(...);
	// ...
}
return 1;
}


Dan, wat betreft die mappen een paar posts hierboven:

new UserFile[256];
format(UserFile, sizeof(UserFile), "/Users/%s.txt", playername);

dini_IntSet(UserFile, "key", "value");

Geplaatst:
comment_1395447

Ik ben er mee bezig geweest maar het lukt me maar niet,

Via jouwn manier pakt hij niet diegene die ik heb aangemaakt,

Ik heb het daarna geprobeerd met

SetPlayerTeam(playerid)

en met .ini:

GetPlayerTeam maar hij slaat of 0 op of 255,

dus hoe moet ik hem opslaan zodat hij hem leest via jouwn manier?

dat je via een commando de team opslaat en het word gelezen met jouwn manier.

Alvast bedankt

Geplaatst:
comment_1396244

Bedankt!

Het opslaan is gelukt,

Daarna had ik er eerst een tekstcommando van gemaakt en als je dan team cop0 was veranderde je sklin en dat werkte,

De skin veranderde niet toen ik een ander team opsloeg.

Maar nu heb ik nog een probleempje...

Ik had het bij OnPlayerConnect gezet maar als ik de server binnenkom kom ik eerst in die skinselectie uit.

En daarna is er niks veranderd,.

Ik weet niet hoe ik dat moet oplossen,

dit heb ik in m'n jobfilterscript bij OnPlayerConnect staan:

public OnPlayerConnect(playerid)
{
gTeam[playerid] = dini_Int("Job.txt", (playername));
if(gTeam[playerid] == TEAM_COP0)
{
			gTeam[playerid] = TEAM_COP0;
	SetPlayerColor(playerid, 0xCAEBFFFF);
	SetPlayerPos(playerid, 1553.2588,-1676.1017,16.1953);
	GivePlayerWeapon(playerid, 41, 200);
	GivePlayerWeapon(playerid, 3, 1);
	SetPlayerSkin(playerid, 280);
	}

	SendClientMessage(playerid, COLOR_YELLOW, "Have fun in the server!");
	jailed[playerid] = 0;
  		new PName[MAX_PLAYER_NAME];
	GetPlayerName(playerid,PName,sizeof(PName));
	DSchool=fopen("DSchool",io_readwrite);
	if(strcmp(dini_Get("DSchool",PName),"Y",false)==0)
	{
		if(strlen(dini_Get("DSchool",PName))==1) // seems streams with no data also run through this part.
		{
			fclose(DSchool);
			}
			else // If there is no data present,
			{
				Dschool_No(playerid); // Make some!
			}
	}
	else if(strcmp(dini_Get("DSchool",PName),"N",false)==0)
	{
		fclose(DSchool);
	}
	else if(strcmp(dini_Get("DSchool",PName),"D",false)==0)
	{
		fclose(DSchool);
	}
	else
	{
			Dschool_No(playerid);
	}
	return 1;
}


public OnGameModeExit()
{
return 1;
}

  • 4 weken later...
  • 2 maanden later...
Geplaatst:
comment_1512380

Hoe kan ik maken dat ik bijvoorbeeld /saveposition type, dat er in een bestand komt te staan:

AddPlayerClass(poppetje,x,y,z...);

en /savecar

AddStaticVehicle(modelid...);

En hoe die dat laad in OnGameModeInit();

Ik weet wel dat ik dit zo'n beetje moet hebben:

new Float:GetX, Float:GetY, Float:GetZ, Float:GetA, string[256], auto;
GetPlayerPos(playerid, Float:GetX, Float:GetY, Float:GetZ);
GetPlayerFacingAngle(playerid, Float:GetA);
auto = GetVehicleModel(GetVehicleID(playerid));
format(string, sizeof(string), "AddStaticVehicle(%d, %f, %f, %f, %f, 0, 0);", auto, Float:GetX, Float:GetY, Float:GetZ, Float:GetA);

Maar dan precies zo in een bestand zetten en in OnGameModeInit() laden...

Bewerkt: door CAR

  • 2 maanden later...
Geplaatst:
comment_1572383

Hey, ten eerste wil ik ff zeggen dat je weer een zeer goede tutorial hebt gemaakt ;)

Om dit te oefenen heb ik een filterscript gemaakt dat coördinaten opslaat, en ik heb er een klein probleempje mee:

Het gaat in grote lijnen ongeveer zo:

new amount = 1; //maak de global amount aan

//in de /savepos functie
Gedoe om coördinaten te krijgen
Formateer string met coords
Formateer amount van int naar string
dini_Set("savedcoords.txt", stramount, string);
amount++;

Hierdoor word dus niet steeds dezelfde regel overschreven.

Maar als ik mijn server herstart staat amount vanzelfsprekend weer op 0, enig idee hoe ik dit kan oplossen?

Edit: ik denk dat ik al een oplossing heb, in savedcoords zet ik een key amount. en als het fs laad word de variabele daarmee gelijk gezet, en als hij afsluit word de key weer gelijk gezet met de variabele

Bewerkt: door goudewup

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

Recent actief 0

  • Er zijn hier geen geregistreerde gebruikers aanwezig.