Jump to content
  • 0

pomoc Dini => Y_ini


Mivčo

Dotaz

Pre robievam Denisov HS z DOF2 do Y_INI a mám tento code dobre?

 

 

 

 

 

stock CreateHouse(Float:HX,Float:HY,Float:HZ,CENA)
{
HouseCount++;

if(HouseCount > MAX_HOUSES)
{
print("MAX. Počet domov bol prekročený. Server bol vypnutý !");
SendRconCommand("exit");
}
HouseInfo[HouseCount][p_X] = HX;
HouseInfo[HouseCount][p_Y] = HY;
HouseInfo[HouseCount][p_Z] = HZ;
HouseInfo[HouseCount][Cena]= CENA;
HouseInfo[HouseCount][VW] = HouseCount;

new s[100];
format(s,100,"Houses/House%d.txt",HouseCount);
if(!fexist(s))
{

new INI:File = INI_Open(s));
INI_WriteInt(File,"Owner","none");
INI_WriteInt(File,"Pass","none");
INI_WriteInt(File,"Locked",false);
INI_WriteInt(File,"Interior",3);
INI_WriteInt(File,"Money",0);

INI_WriteInt(File,"Camera",0);
INI_WriteInt(File,"Dog",0);
INI_WriteInt(File,"TermoSenzor",0);
INI_WriteInt(File,"WalkSenzor",0);
INI_WriteInt(File,"StrongDoors",0);

new asdf[15];
for(new i;i <= MAX_WEAPON_SLOT;i++)
{
format(asdf,10,"Weapon%d",i);
INI_WriteInt(File,asdf,0);
format(asdf,15,"WeaponAmmo%d",i);
INI_WriteInt(File,asdf,0);
}

for(new i;i <= MAX_SKIN_SLOT;i++)
{
format(asdf,10,"Skin%d",i);
INI_WriteInt(File,asdf,-1);
}
INI_Close(File);
}
HouseInfo[HouseCount][IntTyp] = INI_String(s,"Interior");
HouseInfo[HouseCount][HousePick] = CreatePickup(1277,1,HouseInterior[HouseInfo[HouseCount][IntTyp]][P_X],HouseInterior[HouseInfo[HouseCount][IntTyp]][P_Y],HouseInterior[HouseInfo[HouseCount][IntTyp]][P_Z],HouseInfo[HouseCount][VW]);
format(HouseInfo[HouseCount][Password],32,INI_String(s,"Pass"));
new asdf[15];
for(new i;i < MAX_WEAPON_SLOT;i++)
{
format(asdf,10,"Weapon%d",i);
HouseInfo[HouseCount][Weapon][i] = INI_String(s,asdf);
format(asdf,15,"WeaponAmmo%d",i);
HouseInfo[HouseCount][Ammo][i] = INI_String(s,asdf);
}
for(new i;i < MAX_SKIN_SLOT;i++)
{
format(asdf,10,"Skin%d",i);
HouseInfo[HouseCount][Skins][i] = INI_String(s,asdf);
}
new sx[200];
if(IsHouseForSale(HouseCount))
{
format(HouseInfo[HouseCount][Owner],MAX_PLAYER_NAME,"Nikto");
HouseInfo[HouseCount][Zamek] = false;
HouseInfo[HouseCount][Pickup] = CreatePickup(1273,1,HX, HY, HZ);
format(sx,200,"{FFFFFF}Dom {0000FF}č.%d\r\n{FFFFFF}Majiteľ: {0000FF}Nikto\r\n{FFFFFF}Cena: {0000FF}%d",HouseCount,CENA);
HouseInfo[HouseCount][Text] = Create3DTextLabel(sx,0xFF0000FF,HX,HY,HZ+1,50,0);

}else{
if(INI_String(s,"Locked")) HouseInfo[HouseCount][Zamek] = true;
else HouseInfo[HouseCount][Zamek]=false;
HouseInfo[HouseCount][Pickup] = CreatePickup(1272,1,HX, HY, HZ);
format(HouseInfo[HouseCount][Owner],MAX_PLAYER_NAME,"%s",dini_Get(s,"Owner"));
format(sx,200,"{FFFFFF}Dom {0000FF}\tč.%d\r\n{FFFFFF}Majiteľ: {0000FF}\t%s\r\n{FFFFFF}Park. miest: {0000FF}\t%d\r\n{FFFFFF}Locked: {0000FF}\t%s",HouseCount,HouseInfo[HouseCount][Owner],HouseInfo[HouseCount][CarSlots]+1,YesNo(HouseInfo[HouseCount][Zamek]));
HouseInfo[HouseCount][Text] = Create3DTextLabel(sx,0xFF0000FF,HX,HY,HZ+1,50,0);
}
return HouseCount;
} 

 

 

Edited by Jozef Tiso
Link to comment
Share on other sites

7 odpovědí na tuto otázku

Recommended Posts

  • 0

Ahoj, ako píše NeoRevCrew, problém je v tom, že tam máš zátvorku navyše.
Píše ti to aj sám compiler - očakával ';', ale našiel ')'. Ten samý problém máš aj v kóde, ktorý je v spoileri. Do budúcna (snáď) už budeš vedieť podobný problém vyriešiť.
 
Čo sa týka tej dĺžky: Povedzme, že by si mal max. ID domu 999, potom "Houses/House999.txt" je 19 znakov, takže by ti stačilo new s[20];

(stringy v pawne potrebujú jeden znak navyše - koncová nula). https://en.wikipedia.org/wiki/Null-terminated_string
 
S INI som ešte nikdy nepracoval, ale myslím si, že INI_WriteInt(File,"Owner","none"); a INI_WriteInt(File,"Locked",false); bude problém. 
Používaš INI_WriteInt na zapísanie reťazca / boolu. Google mi vyhodil, že na to slúžia INI_WriteString / INI_WriteBool.
Problém bude zrejme aj v riadkoch podobným tomuto: INI_String(s,"Interior"); - Podľa tutorialu INI_String neberie ako argument cestu k súboru, ale do toho sa neodvážim vŕtať (ako som spomínal, s y_ini som nikdy nerobil).

Link na tutorial: http://forum.sa-mp.com/showthread.php?t=570912
 
PS:
HouseCount nemusí byť global, môžeš použiť:
static HouseCount; // na začiatku stocku
HouseCount++; // na konci stocku
http://wiki.sa-mp.com/wiki/Scripting_Basics#static_local

Edited by DuFF
Link to comment
Share on other sites

  • 0

Teď si sám moc nejsem jistý, jak by to mělo fungovat, Duffe.

 

Pokud by to neměl jako globální ale jako lokální, tak by se mu vždy vytvořila nová proměnná, a já předpokládám, že to je ten slavný HS, který při spuštění zavolá několik-set krát fci na vytvoření domů, vždy by se mu teda vrátila hodnota 1 (nová proměnná na začátku + 1 na konci fce).

 

K tomu pokud by dělal nějaké příkazy na přidání či odebrání domů, tak by se mu hůř pracovalo s počtem již vytvořených domů.

 

Nebo mi něco ušlo?

Link to comment
Share on other sites

  • 0
				new s[128];
				format(s,128,"Houses/House%d.txt",houseid);
                                new INI:File = INI_Open(s);
				new camera = INI_Int(File,"Camera");
				new dog = dini_Int(s,"Dog");
				new termo = dini_Int(s,"TermoSenzor");
				new walk = dini_Int(s,"WalkSenzor");
				new door = dini_Int(s,"StrongDoors");

pri tomto mi ukaže Pawno neodpovedá.... robím podla tutorialu z dini na y_ini

Link to comment
Share on other sites

  • 0

Teď si sám moc nejsem jistý, jak by to mělo fungovat, Duffe.

 

Pokud by to neměl jako globální ale jako lokální, tak by se mu vždy vytvořila nová proměnná, a já předpokládám, že to je ten slavný HS, který při spuštění zavolá několik-set krát fci na vytvoření domů, vždy by se mu teda vrátila hodnota 1 (nová proměnná na začátku + 1 na konci fce).

 

K tomu pokud by dělal nějaké příkazy na přidání či odebrání domů, tak by se mu hůř pracovalo s počtem již vytvořených domů.

 

Nebo mi něco ušlo?

Schválne som priložil link na sa-mp wiki pre prípad, že by niekomu nebolo jasné, ako funguje static, keď sa použije v kombinácii s lokálnou premennou.

Takáto premenná si pamätá svoju hodnotu z predchádzajúceho volania aj v ďalšom volaní. V tom, v čom som navrhoval, by sa inicializovala na 0, potom by sa vykonal kód pre HouseCount = 0, hodnota by sa zvýšila na 1. V ďalšom volaní by bola hodnota HouseCount na začiatku stocku 1, vykonal by sa kód pre HouseCount = 1 a na konci by sa hodnota zvýšila na 2... Tým pádom by stock ani nemusel vracať žiadnu hodnotu (ktorú zrejme aktuálna verzia scriptu ukladá naspäť do globalu). Možno by v tomto prípade bolo vhodnejšie pomenovať premennú ako HouseMaxID, či nejak podobne (indexujeme od 0. teda počet domov by bol HouseMaxID + 1). Ak niekto preferuje indexovanie od 1, HouseCount++ by mohlo nasledovať hneď po static HouseCount na začiatku stocku.

 

Samozrejme, tento topic sa nemá zaoberať tým, čo robí "static". S daným problémom to nemá nič spoločné a keďže si s y_ini veľmi netykám, nechám priestor skúsenejším YSI používateľom.

Link to comment
Share on other sites

  • 0

Je vidět, že kdokoliv dělal na tomhle HS, tak znalosti YSI má extrémně malé. Kromě teoretických chyb(navíc závorka, chybějící středník), je tam využití knihovny srovnatelné asi s použitím návratových hodnot...

(plus hádám, že autor to načítá z alternativní cesty. Lepší je to načítat z přímé, tak kdybys neměl...)

#include <YSI_Storage\y_ini>
#include <YSI_Data\y_iterate>
+

#include <sprintf>
Jestli ti můžu něco doporučit, tak můj ověřený způsob s tagy a iterátory(funkční ovšem) a k tomu sprintf(). Pokud budeš dělat desítky souboru a cyklovat je, tak stačí drobná chyba v zápisu a celý systém se ti začne hroutit.

Navíc je to mnohem jednodušší. Takže, začneš přidáním iterátoru pro své domy. Tak můžeš rovnou cyklit domy a ne vlastní cykly a proměnné(makro na maximum domů můžeš zachovat) : 

new Interator: Houses<MAX_HOUSES>;
Taky nezapomeň a další proměnné(informace) o domě jako pozice, jméno majitele, cena apod.

 

Pak samozřejmě vyčistíme iterátor. Nechceme, aby nám tam lítali nežádoucí informace:

 

public 
OnFilterScriptExit() {
Iter_Clear(Houses);
Teď přichází ta dokonalost icon_e_biggrin.gif. Stačí jenom nalézt volný iterátor a začlenit do něj náš další dům. Číslo nalezeného volného iterátoru můžeš použít i jako id domu!

 

 

new
house_id = Iter_Free(Houses);
Iter_Add(Houses, Iter_Free(Houses));
protože máš id volného baráku, můžeš mu rovnou přiřazovat údaje jaké jméno majitele, cena apod.

 

PS: jestli chceš zjistit počet přidaných domů, nemusíš nic cyklit, deklarovat proměnnou, nic takového, stačí jenom zjistit počet vložených interátorů:

if (Iter_Count(Houses) == MAX_HOUSES) ...
Vybereš si nějaký(jeden), kam budeš všechno ukládat:

new
INI:Soubor = INI_Open("Baraky.sav");
A nakonec ukládání údajů. K tomu ještě použiješ tag. Tag ti zajistí, aby se všechny údaje ukládali pod daný barák do seznamu. A abys ses nezdržoval s formátováním, použiješ sprintf(je to i nakonec kratší):

INI_SetTag(Soubor, sprintf("House%i", house_id));
INI_WriteString(Soubor, ...);
INI_WriteInt(Soubor, ...);
INI_WriteString(Soubor, ...);
INI_WriteInt(Soubor, ...);
INI_WriteInt(Soubor, ...);
INI_WriteInt(Soubor, ...);
INI_Close(Soubor);
Načítání není o nic těžší. Stačí při načítání všech údaju přidat i načítání tagů. V samotném callbacku pak při načítání hledat jejich tag nejdříve. To stačí hledat jenom slovo House a číslo. Poté přidávat i dané iterátory(protože to jsou jejich id):

Zjištěný id pak můžeš používat i rovnou do proměnných.

 

INI_ParseFile("Baraky.sav" , "NahratData", .bPassTag = true);

public NahratData(tag[], name[], value[]) {

	new
		sstr[14];
 	strmid(sstr, tag, 5, strlen(tag));
	new 
		i = strval(sstr);
	INI_String(...);
	INI_Int(...);
	INI_String(...);
	Iter_Add(Admins, i);
	INI_Int(...)
	return (false);
 }
POZOR Nepřidávat iterátor jako poslední. Návr. hodnoty načítání ti to znemoží
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...