Jump to content

Arcturus Ini (AIni)


Recommended Posts

Arcturus Ini (AIni.inc)

Patrím k scripterom ktorí sa snažia všetko programovať a nie kopírovať. Dini, Dof, Dof2 poznám a mal som tú česť opravovať scripty ktoré ich využívali. Z toho mi príde Dof2 asi najnovší a najprepracovanejší. Je to pekná práca a autorovi skladám rešpekt.

Škoda že script je 5 rokov starý a autor script ďalej nerozvíjal. Škoda že autor vynechal velmi podstatnú časť toho čím Ini sú.

Nakolko som nechcel používať cudziu prácu, napísal som si Files.inc čo bola vlastne prvá verzia so základnými funkciami na prácu s textovými súbormi file.inc.

A že ich tam bolo požehnane.

Druhá verzia IniFiles.inc už pracovala s konceptom klúč=data a pozostávala z troch príkazov. Ukladanie, zápis a mazanie.

Ale bez sekcií ktoré k Ini neoddelitelne patria to proste stále nebolo ono a verzia 2.5 (vylepšená dvojka) teda po prvýkrát obsahovala aj rozdelenie do sekcii.

 

Dámy a páni, dovolte mi predstaviť Vám Arcturus Ini.

Tretiu verziu ktorá vznikla. Mocný nástroj na editáciu súborov obsahujúcich údaje pridelené ku klúčom a kategorizovaným do sekcí.

A ako to funguje? 

IniFile("Súbor.ini","Sekcia","Kluc_x","Údaj",2);

vytvorí textový Súbor.ini s následovným obsahom:

[Sekcia]

Kluc_x=Údaj:

pri čítaní vracia  hodnotu vo formáte string. Zvyknem ju teda používať následovne:

format(string,sizeof(string),"%s",IniFile("Súbor.ini","Sekcia","Kluc_x","",1));

prípadne  strval(IniFile("Súbor.ini","Sekcia","Kluc_x","",1));

čo teda ostáva? Mazanie.

IniFile("Súbor.ini","Sekcia","Kluc_x","",3);   - vymaže klúč Kluc_x

IniFile("Súbor.ini","Sekcia","","",3);   - vymaže Sekciu (aj so všetkými klúčmi ktoré obsahuje)

Treba uznať že priebežne stále ladím rôzne neduhy ktoré to má ale aj tak je to Include ktoré nielen že je použitelné ale mojích posledných možno 100 scriptov sa bez neho nezaobišlo.

A áno, Je to jediný príkaz v celom Include a jeho tvar teda je IniFile(file[128],section[128],key[128],data[128],mode) // mode: 1-číta 2-zapisuje 3-maže

Takže kto má záujem sa na to pozrieť prípadne vyskúšať. Nech sa páči.

Tí z Vás čo ste šikovnejší Pawneri si ju iste budete vedieť aj prispôsobiť. Neponúkam však hotový produkt. Berte to ako koncept, ako inšpiráciu stvoriť z toho niečo viac než už to je.

Prajem vela zábavy ;) a pekný deň.

AIni.inc

Link to comment
Share on other sites

Pozerám na to a určite ti príde rozumne stále otvárať a zatvárať súbor?

Napr. budem mať 1000 údajov o hráčovi v súbore, lebo môj GM je best pro (hehe) a teda pri načítaní údajov 1000 krát otvorim daný súbor, 1000 krát ho zatvorím a 1000 krát prejdem 1-1000 riadkov súboru, pričom pri každom riadku vykonám ešte x y ďalších operácií? -> z toho vychadza zlozitost na N^2*k -> kde N je pocet zaznamov, k je pocet operacii ktore musis spravit

Ak sa mýlim a tvoj script funguje inak tak som zvedavý že ako to je vymyslené :) rád sa novému priučím

Rozumnejsie by bolo pouzit utriedenie daneho suboru, potom ho cely nacitat do pamati, rozparsovat na jednotlive kluce a data a potom logaritmicky skakat po jednotlivych datach, zlozitejsie by bolo ukladanie.

Z toho by vysla zlozitost N*k + log(N)

Este by sa to dalo optimalizovat tym, ze ak sa 2x po sebe otvori rovnaky subor, nie je nutne ho opatovne otvarat... Taktiez spravit oddelenu funkciu, kde by bolo explicitne povedane, ze teraz idem nacitavat len 1 udaj

  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

Otvara ho iba raz na citanie potom he cez temp prepise podla parametrov funkcie a pri ukladani myslim druhykrat....teda prvykrat na citanie, druhykrat na zapis... volal som tu funkciu uz aj valakrat po sebe ale mas pravdu ze to nieje optimalne. zatial som narazil iba na problem s tym ze ak ho pouzivaju dva FS sucasne tak ten "druhy" uz subor neotvori... Popravde nemal som moznost to vyskusta pod extremnou zatazou (vela hracov) ale zatial som s tym problem nemal... Vravim nieje to dokonale a stale to priebezne vylepsujem akonahle objavim nejaky problem. Ako som písal v príspevku: ,,Neponúkam však hotový produkt. Berte to ako koncept, ako inšpiráciu stvoriť z toho niečo viac než už to je."

Ak cita vela niecoho tak ho dam iba na zaplnenie premennych ;) možno by nebolo naškodu nejak implementovať aj hromadný zapis z pola alebo z Enum. Ale samozrejme bude mi cťou ak moj projekt vylepšíš prípadne ak sa z neho inšpiruješ pri vlastnom projekte. Skor som chcel poukazať na možnosti ktoré vnaša použitie sekcii.

Edited by Arcturus
Link to comment
Share on other sites

Tak gratuluju, vytvořils horší Dini obohacené o sekce. Koukl jsem se do toho tvého includu a musím říct, že je to hrozné a nikomu bych to nedoporučoval použít. Reinventing wheel není vždy nejlepší volba, zvlášť u takových věcí.

Už jen to tvoje API, které nabízíš je něco hodně zvláštního a chtělo by na tom zapracovat - oddělené ukládání, načítání, mazání a wrapper funkce pro různé datové typy.

 

Kód samotný je napsaný hodně na prasáka, chtělo by to separovat na více funkcí a použít nějaké guard clauses (třeba).  Pak například s tímhle by tě každý normální člověk vyfakoval

if(strfind(string,secstr,true)!=-1){sectgle=1;secfnd=1;}else{sectgle=0;}

 

Taky by bylo fajn vracet něco, co signalizuje error a ne string "not found". To je o ničem. Tahle věc je úplně zbytečná, stačí ta vnitřní podmínka (určitě je tam víc věcí, ale nedá se to číst)

if(strfind(string,"[",true)!=-1)
{
    if(strfind(string,secstr,true)!=-1){sectgle=1;secfnd=1;}else{sectgle=0;}
}

 

To nejdůležitější, což bohužel neděláš, je jak zmiňoval @Quiter optimalizování znovuotevírání souborů. Ty tam pro každý zapsaný záznam vytváříš temp file, přepíšeš originání soubor do temp filu (s novým klíčem a hodnotou) a pak temp file přepíšeš zpět do originálního souboru. To není vůbec optimální a za sekce (které v DOF můžeš simulovat prefixem klíčů) tohle nestojí. Btw, existuje y_ini a další includy podporující sekce a jsou optimalizované a s normálním API.

 

Edited by Lukasz
  • Paráda! (+1) 2
  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

Za mě je pro změnu prasárna v těch počtů argumentů. S takovým přístupem brzy překonáš C++ . Je to spíše kosmetická záležitost... Nicméně při debuggingu máš pak mnohem lepší přehlednost, kde co a jak. Hlavní problém jsou ty uvozovky. Nějaký nováček se v tom splete a pak prohodí argument klíče se sekcí a je to v háji. Ono taky zkus najit, kde je v tomhle problém:

IniFile("Admin/server.sav", "Sekce" , "title", title[playerid], 2);
IniFile("Admin/server.sav", "Sekce" , "max", max, 2);
IniFile("Admin/server.sav", "Sekce" , "min", min, 2);
IniFile("Admin/server.sav", "Sekce" , "min", hodnedlouhyvar[playerid], 2);
IniFile("Serv/player.sav", "Sekce" , "sekkkera", sekackunamaso[playerid], 2);
IniFile("deset/dvacet.sav", "Sekce" , "jodlelellee", vehicle[10][99], 2);
IniFile("Noohting.sav", "Sekce" , "randomomom", randommm[e_ran][10], 2);
IniFile("blasample.sav", "Sekce" , "sest", desetdevetosm[7], 2);

Jak říká @Bloodman, prostě radši čteme písmenka než čísla. Takže typy módu házet podle čísla a čus, není dobrý nápad. To si pak člověk musí pamatovat a hlídat si to, a když mu to nakonec nejde tak prohlíží celý kód, a jako idiot musí studovat každé číslo, jestli teda zapisuje nebo čte. Určitě na to jdou použít buď makra a nebo výčty hodnot.
(Plus: ještě bych se podíval na optimalizaci, jestliže by přišel nějaký jiný idiot a ze srandy by házel větší nebo menší čísla módů. Takže určitě se hodí něco jako defaultní, zvlášť u prací se soubory, které jsou 50 % důvodů, proč padá server):

enum INI_MODES {
	INI_WRITE = 0,
	INI_READ,
	INI_DELETE
}

stock IniMeeh(..., INI_MODES: mode) {
	if (mode == INI_WRITE)

A určitě bych řešil prázdný řetězec tak, že bych to přeházel a hodil některé argumenty jako nepovinné, ať to vypadá lépe například:

stock IniFile(file[], data[], INI_MODES: mode = INI_READ, section[] = "")...

//
IniFile("file.sav", title[playerid]);
//
IniFile("file.sav", title[playerid], INI_WRITE);

//
IniFile("garaz.sav", garaz[playerid][2], INI_WRITE, "Garaz3");

A ještě jak si to dokázal používat a snadno rozlišit, kde je část kódu, kde se načítají údaje a kde se zapisují? Protože, jestliže na to nemáš 2 funkce SaveData() a LoadData(), tak pak nechápu, jak ses v tom dokázal tak snadno vyznat?

Ano já vím. Odpovíš mi na to, že to si pak může udělat každý podle sebe. Ale když to nevypadá dobře, tak k téhle části se nikdo ani nedostane, když se mu to nelíbí už na první pohled a vůbec se toho radši ani nedotkne.

Edited by Scydo
  • Paráda! (+1) 2
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

Suhlasim s Vami oboma (nebudem rozpisovať v čom konkretne ale viac menej všeobecne) a som rád, že sa nájdu ludia čo ten kód aspoň pozrú (malá pasca na Janikstyle "pawnerov" ;) ) a nedrbnu to bezmyšlienkovito do "svojho scriptu"... Ďalej ďakujem za odozvu. Ako som spomínal. Pracujem na tom priebežne a podobné pripomienky na vylepšenia alebo zmeny sú viac ako vítané nakolko každý scripter ma možnosti a prevedenie limitované vlastným náhladom či už na kód samotný alebo na koncept. Moj ciel je jasný (aspoň pre mňa) a verím že ďalšie verzie sa stretnú s pozitivnejším ohlasom. A Scydo .... trafil si klinec po hlavičke ("A ještě jak si to dokázal používat a snadno rozlišit, kde je část kódu, kde se načítají údaje a kde se zapisují? Protože, jestliže na to nemáš 2 funkce SaveData() a LoadData(), tak pak nechápu, jak ses v tom dokázal tak snadno vyznat?") Presne toto je dôvod prečo si radšej všetko píšem sám... ;) Páni smekám klobúk pred Vami :) 

  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

"Ono taky zkus najit, kde je v tomhle problém..." myslíš zapis hodnôt integer cez parametre typu string? Ako som spomínal koncept bol "Práca s textovým súborom" preto aj parametre su v string a ked ho používam je trochu otravne všetko prehadzovať do tohoto typu...

Edited by Arcturus
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...