Mivčo 90 Odesláno: 12. Listopad, 2017 Share Odesláno: 12. Listopad, 2017 (upraveno) 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 13. Listopad, 2017 by Jozef Tiso Link to comment Share on other sites More sharing options...
0 NeoRevCrew 4 Odesláno: 12. Listopad, 2017 Share Odesláno: 12. Listopad, 2017 Ahoj, zkus new INI:File = INI_Open(s); Jinak podle mého je zbytečně velká délka řetězce. Link to comment Share on other sites More sharing options...
0 DuFF 81 Odesláno: 13. Listopad, 2017 Share Odesláno: 13. Listopad, 2017 (upraveno) 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 stockuHouseCount++; // na konci stockuhttp://wiki.sa-mp.com/wiki/Scripting_Basics#static_local Edited 13. Listopad, 2017 by DuFF Link to comment Share on other sites More sharing options...
0 NeoRevCrew 4 Odesláno: 13. Listopad, 2017 Share Odesláno: 13. Listopad, 2017 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 More sharing options...
0 Mivčo 90 Odesláno: 13. Listopad, 2017 Author Share Odesláno: 13. Listopad, 2017 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 More sharing options...
0 DuFF 81 Odesláno: 13. Listopad, 2017 Share Odesláno: 13. Listopad, 2017 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 More sharing options...
0 Scydo 397 Odesláno: 13. Listopad, 2017 Share Odesláno: 13. Listopad, 2017 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 . 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 More sharing options...
0 Mivčo 90 Odesláno: 13. Listopad, 2017 Author Share Odesláno: 13. Listopad, 2017 Možné to je... ale robil som to podla tvojho návodu kde je prechod z dini do DOF2/y_INI https://pastebin.com/bE7jMGDF skus sa pozrieť či je to dobre.... Link to comment Share on other sites More sharing options...
Dotaz
Mivčo 90
Pre robievam Denisov HS z DOF2 do Y_INI a mám tento code dobre?
Link to comment
Share on other sites
7 odpovědí na tuto otázku
Recommended Posts