Skocz do zawartości
Jaev

.ini kolejno w folderze (dfile) / losowanie

Rekomendowane odpowiedzi

Witam, chciałbym sobie zrobić coś takiego, że np. na komendę mam tworzenie pliku w folderze za pomocą dfile i chciałbym żeby one się numerowały np.

info1.ini
info2.ini
info3.ini
info4.ini
info5.ini

tyle, że nie wiem jak zrobić to numerowanie, a przy okazji jak odtworzyć losowy plik z danego folderu tj

folder
	info1.ini
	info2.ini
	info3.ini

->
random - wylosowano plik info1.ini - > zapis do zmiennej

Mam sobie tu stary PlayerPath na dfile'u ale nie mam pojęcia jak go przerobić pod to numerowanie :E

stock PlayerPath(playerid)
{
	new path[128];
	format(path, sizeof(path), ACC_PATH"%s.ini", NazwaGracza(playerid));
	return path;
}

Proszę o pomoc :))

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
  1. W OnFilterScriptInit() sprawdź czy istnieje plik info0.ini, zawierający wartość dla ostatnio zapisanego pliku - jeśli nie istnieje to go utwórz i zapisz do niego wartość 0;
  2. Przy uruchomieniu skryptu wczytaj do zmiennej globalnej wartość z pliku info0.ini;
  3. Przy tworzeniu nowego pliku ustaw dla jego nazwy wartość zmiennej +1, następnie zapisz ją do pliku info0.ini.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
    CMD:nowyplik(playerid)
    {
        new str[25],i;
        for(i = 1; i < MAX_PLIKOW; i++)
        {
            format(str,sizeof(str),"/folder/info%d.ini",i);
            if(!fexist(str))
            {
                i = _:fopen(str, io_write);
                // if(!File:i) continue;
                fwrite(File:i,"Pawno.PL\r\n");
                fclose(File:i);
                i = MAX_PLIKOW;
            }
        }
        if(i < MAX_PLIKOW) SendClientMessage(playerid,-1,"Juz jest max plikow w tym folderze ziomus.");
        else
        {
            // utworzono plik ktorego nazwa jest w tablicy str
        }
        return 1;
    }
    CMD:losuj(playerid)
    {
        new num[MAX_PLIKOW], cnt;
        new str[25],idx;
        for(idx = 1; idx < MAX_PLIKOW; idx++)
        {
            format(str,sizeof(str),"/folder/info%d.ini",idx);
            if(!fexist(str)) continue;

            num[cnt++] = idx;
        }
        if(cnt == 0) SendClientMessage(playerid,-1,"Nie ma zadnego pliku w tym folderze.");
        else
        {
            format(str,sizeof(str),"/folder/info%d.ini",num[random(cnt)]);
            cnt = _:fopen(str, io_read);
            while(fread(File:cnt, str))
            {
                // pobieranie linijka po linijce
            }
            fclose(File:cnt);
        }
        return 1;
    }

Chyba cos takiego o ile dobrze zrozumialem

Edytowane przez Pr0f3ssi0n4LisT.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
new fileidx= 0; // zmienna globalna

public OnFilterScriptInit()
{
  new fhandle;
  if (fexist("info_0.ini")) { fhandle= fopen("info_0.ini", io_read); new temp[4+1]; fread(fhandle, temp); fileidx= strval(temp); }
  else { fhandle= fopen("info_0.ini", io_append); fwrite(fhandle, "0"); }

  fclose(fhandle);
}
stock nowy_plik(tekst[])
{
  new temp[9+1]; format(temp, sizeof(temp), "info_%d.ini", ++fileidx);
  new fhandle= fopen(temp, io_append); fwrite(fhandle, tekst); fclose(fhandle);

  if (fexist("info_0.ini")) fremove("info_0.ini");
  fhandle= fopen("info_0.ini", io_append); valstr(temp, fileidx); fwrite(fhandle, temp); fclose(fhandle);
}

Plik info_0.ini jest po to, aby po restarcie serwera nie utracić indeksu ostatniego pliku.

new fname[9+1]; format(fname, sizeof(fname), "info_%d.ini", random(fileidx-1)+1);

Zmienna fname będzie przechowywała nazwę wylosowanego pliku.

Edytowane przez PrzMas

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×