Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Praca na plikach


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
12 odpowiedzi w tym temacie

#1 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 17.04.2009 12:29

Zaczne od najprostrzej funkcji do logowania przebiegu pracy naszego pluga:

log_to_file( const file[], const message[], [ ... ] )

Funkcja sklada sie z 2 czesci:
- Nazwa pliku (opcjonalnie sciezka) - przy nie podaniu sciezki zostanie stworzony(zapisany do) plik o podanej nazwie w folderze amxmodx/logs

Jesli chcemy by kazdy dzien mial osobny plik oraz by mozna bylo latwo je rozroznic musimy odpowiednio sformatowac nazwe pliku:
new file[32],Time[7]
	get_time("%d%m%y",Time,8)
	format(file,31,"TEST_%s.log",Time)
	log_to_file(file,"Test log")
W efekcie zostanie kazdego dnia tworzony plik lub zapis do istniejacego pliku o podajen nazwie. W tym przypadku powstal by plik TEST_170409.log

Specyfikacjie funkcji get_time KLIK!


- Druga czesc sklada sie z informacji ktora chcemy wpisac do pliku.

Na poczatku kazdego nowego wpisu beda informacje typu data - godzina (nie musimy sami formatowac tej czesci):
L 04/17/2009 - 12:38:11:

Tekst ktory bedziemy wprowadzac do pliku mozna formatowac tak jak w funkcji Format np:
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)	
	register_clcmd("say /log","test")
}

public test(id)
{
	new name[32],ip[32],sid[64]
	get_user_name(id,name,31)
	get_user_ip(id,ip,31,1)
	get_user_authid(id,sid,63)
	log_to_file("file.txt","Gracz %s %s %s - napisal /log",name,ip,sid)
}


Teraz podam 3 czesto niezbedne funkcje do pracy na plikach, ale nie wystarczajace by cokolwiek wpisac/pobrac z pliku:

get_basedir( name[], len ) - sciezka do folderu .../amxmodx/
get_configsdir( name[], len ) -sciezka do folderu .../amxmodx/config/
get_datadir( name[], len ) - sciezka do folderu .../amxmodx/data/


Pierwszy parametr to nazwa tablicy, a drugu to ilosc elementow ktore mozna uzyc (o 1 mniej niz liczba przy deklarowaniu tablicy). dzięki tym funkcja jestesmy w stanie zawsze zapisac plik w tym samym miejscu na serwerze niezaleznie na jakim jest on robiony.

Kolejne przydatne funkcje:

file_exists ( const file[] ) - sprawdza czy istnieje plik o podanej nazwie i sciezce
dir_exists ( const dir[] ) - sprawdza czy podana sciezka istnieje. Jesli np. nie ma folderu w ktorym chcemy zapisac dane wystarczy go stworzyc:
mkdir ( const dirname[] ) - tworzy folder o podanej nazwie i sciezce

file_size ( const file[], [ flag ] ) - sprawdza rozmiar pliku:
- gdy flaga to liczba 0 to funkcja zwraca liczbe Bitow pliku
- gdy flaga to liczba 1 to funkcja zwraca liczbe lini w pliku



Teraz najpodstawowsze 2, moim zdaniem najbardzej przydatne funkcie do pracu na plikach:

read_file ( const file[], line, text[], len, &txtLen ) - funkcja do czytania danych z pliku

- pierwszy parametr to nazwa pluku i sciezka do niego (trzeba go sformatowac za pomoca w/w funkcji)
- drugi parametr to nr. lini ktora chcemy czytac - pierwsza linia w pliku jest linia o numerze 0. Sama funkcja zwraca kolejna dostepna linie jesli jest dostepna lub 0 gdy czytana linia jest ostatnia linia w pliku
- trzeci parametr to tablica w ktorej beda przechowywane dane z podanej wczesniej lini pliku
- czwarty parametr to maksymalna ilosc danych ktore mozemy przechowywac w tablicy (1 mniej niz liczba podana przy deklaracji)
- ostatni, piaty parametr zwraca ilosc znakow ktore zostaly pobrane do tablicy (jesli naprzyklad tablica ma rozmiar 512 a pobralismy tylko 17 znakow, to w tej zmiennej bedzie przechowywana informacia ile znakow tablicy jest dla nas wazne).

Przyklad petli ktora bedzie czytac kazda linie pliku a nastepnie wykonywac "TWOJ KOD"
new line=0, file, text[128],chars
	do{
		line = read_file(file,line,text,127,chars)
		/*
		TWOJ KOD
		*/
	}
	while(line!=0)
Petla do while bedzie wykonywana do momentu gdy funkcja read_file zwroci liczbe 0 czyli dojdzie do konca pliku. Jesli szukamy konkretnej informacji w pliku, ktora sie znajduje w tylko 1 linki kodu, to po jej znalezieniu mozemy przerwac funkcjie za pomoca "break" dzięki temu mozemy za petla zapisac informacjie w ktorej lini znajduje sie np. dana mapa. Zapisana linia moze byc pozniej przydatna do aktualizacji danych.


write_file ( const file[], const text[], [ line ] ) - funkcja zapisuje informacje do podanego pliku lub go tworzy

- Pierwszy parametr to nazwa pliku i sciezka do niego (trzeba go odpowiednio sformatowac).
- Drugi paramert to tablica znakowa ktora przechowuje dane ktore chcemy zapisac do pliku. Jesli nic nie wpiszemy to linia bedzie pusta - funkcja write_file nie dodaje wlasnego tekstu do zapisywanego pliku
- Trzeci parametr to nr. lini w ktorej ma byc zapisana informacja linie sie zaczynaja od nr.0 - podajac konkretna linie, informacje ktore sa w niej przechowywane zostana usuniete i w danej lini zostana wprowadzone nasze nowe dane. Jesli paramet line bedzie rowny -1 to tekst bedzie zapisany na koncu pliku, bez nadpisywnia zadnych danych.



Uwagi:
- moga wystapic problemu w pracy na plikach na serwerach na ktorych chmod nie pozwala amxx'owi na zapis/czytanie/tworzenie plikow
- moga wystapic problemy przy formatowaniu sciezki na rozych systemach operacyjnych ( linux i windows rozdzielaja foldery za pomoca / oraz - mozna sprawdzic typ serwera za pomoca funkcji is_linux_server())
- tutorial zostal napisany na bazie "AMX Mod X Function Reference" oraz mojego doswiadczenia w tej dziedzinie. Podany kod nie moze stanowic samodzielnego pluga, trzeba go dostosowac do wlasnych potrzeb.
- Jesli sa pytania/uwagi proszę pisac w tym temacie
- Napisane dla http://www.amxx.pl nie kopiowac bez mojej zgody (czyt. autora).
- Jesli jakis mod mysli, ze tut jest nie czytelnie napisany lub sa bledy natury nie merytorycznej, tp jest proszony o poprawienie a nie pisanie zbednego posta ;-)
  • +
  • -
  • 1

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 981
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 31.08.2009 14:34

heh napisałeś tak
read_file ( const file[], line, text[], len, &txtLen ) - funkcja do czytania danych z pliku

- pierwszy parametr to nazwa pluku i sciezka do niego (trzeba go sformatowac za pomoca w/w funkcji)
wyżej wymienione funkcje to
get_basedir( name[], len ) - sciezka do folderu .../amxmodx/ 
get_configsdir( name[], len ) -sciezka do folderu .../amxmodx/config/ 
get_datadir( name[], len ) - ścieżka do folderu .../amxmodx/data/
ale jak go sformatować to nie napisałeś mówię to z punktu widzenia nooba który kompletnie nie wie jak to zrobić :
  • +
  • -
  • 0

#3 Change

    Super Hero

  • Użytkownik

Reputacja: 129
Zaawansowany

  • Postów:1 161
  • Lokalizacja:Konin
Offline

Napisano 31.08.2009 14:44

A ja mam pytanie bo jestem takim noobem raczej :P Tzn przykładowo jak wyglądałaby całość zapisywania z osobnym plikiem na dobę ?
  • +
  • -
  • 0

#4 Miczu

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 31.08.2009 15:48

new file[128]

get_configsdir( file, 127 )

format(file,127,"%s/plugins.ini",file)

new line=0, text[128],chars 
    do{ 
        line = read_file(file,line,text,127,chars) 
        client_print(id,print_chat,"%s",text)
    } 
    while(line!=0)

i wypisze wszystkie plugi z plugins.ini
  • +
  • -
  • 2

#5 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 981
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 31.08.2009 18:13

co to jest zmienna data :) ?
taki kod nie che dziąłać
get_datadir(file,127)
	format(data,127,"%s/milionerzy.ini",file)
	do{
		ktora_linia = read_file(file,ktora_linia,pytania,255,ile_znakow)
	}
	while(ktora_linia !=0)
zmienne:
new death_or_alive
new how_many
new pytania[256]
new ktora_linia=0
new ile_znakow
new file[128]

  • +
  • -
  • 0

#6 Miczu

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 31.08.2009 20:04

poprawialem w locie by moc skopiowac z tutka, juz poprawilem :)
  • +
  • -
  • 0

#7 Mochi

    Zaawansowany

  • Użytkownik

Reputacja: 16
Początkujący

  • Postów:81
  • Lokalizacja:asd
Offline

Napisano 07.09.2009 20:03

A jak odczytać 2 dane z tej samej linii np. w pliku mam tak zapisane

"Cos" "Cos2"
I jak odczytać wartość jednego i drugiego oddzielnie ?
  • +
  • -
  • 0

#8 darkman

    Wszechwiedzący

  • Przyjaciel

Reputacja: 87
Zaawansowany

  • Postów:553
  • Lokalizacja:inactive
Offline

Napisano 07.09.2009 20:08

parse();
  • +
  • -
  • 0

#9 Mochi

    Zaawansowany

  • Użytkownik

Reputacja: 16
Początkujący

  • Postów:81
  • Lokalizacja:asd
Offline

Napisano 07.09.2009 20:40

Ciekawe zastosowanie :D
Dzięki
  • +
  • -
  • 0

#10 Mochi

    Zaawansowany

  • Użytkownik

Reputacja: 16
Początkujący

  • Postów:81
  • Lokalizacja:asd
Offline

Napisano 25.12.2009 12:08

Sorry że nie edytuje ,ale tak nikt nie zauważy.
Mam jeszcze pytanie.
Jak wykasować daną linijkę z danego pliku ,dany plik za pomocą pluginu?
  • +
  • -
  • 0

#11 Miczu

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 25.12.2009 12:31

write_file - powinno nadpisac dana linie - czyli jak nadpiszesz tekstem typu " " lub po prostu komentarzem (plik cfg na serwie?) to powinno zalatwic sprawe - jak cos to polecam wersjie skopiowania zawartosci i dodania tylko na poczatku komentarza - latwe odzyskiwanie w razie pomylki...
  • +
  • -
  • 0

#12 Kubaczek <3

    Zaawansowany

  • Użytkownik

Reputacja: 17
Początkujący

  • Postów:116
  • Steam:steam
  • Lokalizacja::)
Offline

Napisano 27.03.2010 07:53

A jak stworzyć plik u gracza ?
  • +
  • -
  • 0

#13 Miczu

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 27.03.2010 09:55

Instalując mu trojana, backtora etc. Amxx nie pozwili ci na tworzenie plików jak i ich odczyt po stronie gracza. Jedynie precache jest możliwy, co jest jedno razowe wysłanie pliku przy połączeniu gracza.
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych