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
 

Mychu - zdjęcie

Mychu

Rejestracja: 25.07.2013
Aktualnie: Nieaktywny
Poza forum Ostatnio: 14.03.2025 23:23
*****

#731268 Ts3 bany na stronie

Napisane przez MaxioR w 04.10.2016 21:34

Tu masz gotowy skrypt:

-Lista adminów online

-Lista banów

-Statystyki serwera

https://github.com/Wruczek/ts-website

DEMO

TS3_WEB_DEMO.png


  • +
  • -
  • 2


#722658 problem z cs go podczas właczania

Napisane przez plx211 w 11.03.2016 18:14

Tak moze byc spowodowane, jesli wydajnosc dysku spadla dluzej wczytuje pliki, a tym samym staje sie to o czym napisalem wyzej.

naprawdę nie masz czym sie martwic ;)

(a przynajmniej polki nie umozliwia ci to gry)


  • +
  • -
  • 1


#722649 problem z cs go podczas właczania

Napisane przez Linux' w 11.03.2016 15:02

A czy może spowodowane że dysk ma 5 - 6 lat?

 

Długość życia dysku nie ma nic do rzeczy, co najwyżej prędkość jego odczytu.


  • +
  • -
  • 1


#722641 problem z cs go podczas właczania

Napisane przez plx211 w 11.03.2016 11:32

Nie masz czym sie martwic, kliknij anuluj jak to wyskoczy.
Jest to spowodowane tym ze csgo wczytuje wtedy duzo plikow i nie daje zadnych odpowiedzi, przez co system uznaje ze process sie zawiesil.

Jak ci to przeszkadza polecam ci Linux'a (jak sie na nim nie znasz, to dobrym wyborem jest mint 64bity z cinnamon)
  • +
  • -
  • 1


#691398 Instalacja windows 7 czy przepadnie gwarancja

Napisane przez Epal w 04.03.2015 20:10

Tak się składa że ja też mam laptop z windows 8.1 i rozumiem że chcesz go przeinstalować w serwisie bo samemu to raczej nie dasz rady.

Myśle że gwarancja ci nie przepadnie bo ona jest na laptop i system nie ma nic do tego.


  • +
  • -
  • -1


#690885 Mam problem z amxbansem nie mogę robić ssów .

Napisane przez Frankiii w 01.03.2015 14:18

Jeżeli masz wgrany plugin:  amxbans_ssban.amxx  to dopisz go do plugins.ini


  • +
  • -
  • 1


#274704 Podmienianie modeli broni

Napisane przez DarkGL w 27.07.2011 19:39

Pokaże dwie metody gorszą i lepszą na podmienia modeli broni które widzi gracz i modeli które widzą inni gracze patrząc na nas
  • Metoda gorsza:

    do plugin_init dodajemy
    register_event("CurWeapon","CurWeapon","be", "1=1")
    jest to event wywoływany przy zmianie broni , strzale / przeładowaniu (zmianie amunicji) więc dość często prawda ?
    gdzieś w pluginie dodajemy
    public CurWeapon(id)
    {
    	new wid = read_data(2)	// Id broni
    }
    
    w zmiennej wid mamy typ broni ( CSW_*)
    Nazwy broni i ammo do give_item (+ speed) - AMXX.pl: Support AMX Mod X
    załóżmy że chcemy podmienić model noża
    public CurWeapon(id)
    {
    	new wid = read_data(2)	// Id broni
    	if(wid == CSW_KNIFE){
    	}
    }
    teraz kod na podmianę
    • Wykorzystujący engine

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		entity_set_string(id, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      	}
      }
      
    • Wykorzystujący fakemete

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		set_pev(id,pev_viewmodel2,"models/v_nowy_noz.mdl")
      	}
      }
      
    może będziemy chcieli podmienić też model p_ czyli ten model którzy widzą inni gracze patrzący na gracza (nie ze specta poprostu patrzący na niego ;D )
    wtedy dodajemy
    • Wykorzystując engine

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		entity_set_string(id, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      		entity_set_string(id, EV_SZ_weaponmodel, "models/p_nowy_noz.mdl")  
      	}
      }
      
    • Wykorzystując fakemete

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		set_pev(id,pev_viewmodel2,"models/v_nowy_noz.mdl")
      		set_pev(id,pev_weaponmodel2,"models/p_nowy_noz.mdl")
      	}
      }
      
      jeśli będziemy chcieli podmienić broni to robimy
      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		//podmiana modeli
      	}
      	else if(wid == inna bron){
      		//podmiana modeli
      	}
      }
      
  • Metoda lepsza:

    Wykorzystująca hamsandwich
    w plugin_init dodajemy
    RegisterHam(Ham_Item_Deploy, "weapon_knife", "fwItemDeploy",1);
    drugi parametr jest to classname w przykładzie dałem weapon_knife bo taki jest classname dla noża dla innych broni możecie sprawdzić tutaj
    Nazwy broni i ammo do give_item (+ speed) - AMXX.pl: Support AMX Mod X
    w pluginie w dowolnym miejscu dodajemy
    public fwItemDeploy(wpn){
    	static iOwner;
    	iOwner = pev(wpn,pev_owner);
    }
    
    w zmiennej iOwner mamy id gracza który trzyma broń
    i podmieniamy
    • Wykorzystując engine

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = entity_get_edict(wpn, EV_ENT_owner)
      	
      	entity_set_string(iOwner, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      	
      }
      
    • Wykorzystując fakemete

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = pev(wpn,pev_owner);
      	
      	set_pev(iOwner,pev_viewmodel2,"models/v_nowy_noz.mdl")
      	
      }
    no i jeśli model p także to
    • Wykorzystując engine

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = entity_get_edict(wpn, EV_ENT_owner)
      	
      	entity_set_string(iOwner, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      	entity_set_string(iOwner, EV_SZ_weaponmodel, "models/p_nowy_noz.mdl")  
      }
      
    • Wykorzystując fakemete

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = pev(wpn,pev_owner);
      	
      	set_pev(iOwner,pev_viewmodel2,"models/v_nowy_noz.mdl")
      	set_pev(iOwner,pev_weaponmodel2,"models/p_nowy_noz.mdl")
      }
      
    a jeśli będziemy chcieli podłączyć podmienianie dwóch lub więcej broni w jednej funkcji to robimy

    public fwItemDeploy(wpn){
    	static iOwner;
    	iOwner = pev(wpn,pev_owner);
    	
    	new wpnID = cs_get_weapon_id(wpn)
    	
    	if(wpnID == CSW_KNIFE){
    		//podmiana modelu
    	}
    	else if(wpnID == inna bron){
    		//podmiana modelu
    	}
    }
    ta metoda jest lepsza ponieważ model jest podmieniany tylko przy wyciąganiu (deploy) , przy strzale i przeładowaniu nie ma to miejsca
oczywiście nowe modele muszą być "zprecachowane" ( Dołączona grafika ) w plugin_precache
  • +
  • -
  • 22


#686042 wartość danego kodu

Napisane przez radim w 02.02.2015 17:57

read_file i parse


  • +
  • -
  • 1


#686054 wartość danego kodu

Napisane przez radim w 02.02.2015 18:55

new file[ 128 ], arg1[ 64 ], arg2[ 64 ], arg3[ 64 ], text[ 100 ], len;
	
formatex( file, 127, "addons/amxmodx/plik.ini" );
	
for( new i; read_file( file, i, text, charsmax( text ), len ); i++ )
{
	parse( text, arg1, 63, arg2, 63, arg3, 63 );
	/*
	arg1		arg2		arg3
	NICK		KLASA		EXP
	radim		Plastus		20
	*/
}

  • +
  • -
  • 1


#51103 Statystyki - statsx.amxx

Napisane przez Saper w 22.03.2009 18:27

Statystyki - statsx.amxx
Dzięki mojemu poradnikowi dowiecie się za co odpowiadają poszczególne komendy w Statystykach pochodzących z pluginu statsx.amxx
Statystyki znajdują się w amxmodmenu -> 9 ( Więcej ) -> 5 ( Statystyki ) i wyglądają one tak :
Dołączona grafikaDołączona grafika
Dołączona grafikaDołączona grafika

Za pierwsze cztery strony do opcji Rankingi w Obserwatorze odpowiada plugin statsx.amxx za reszte odpowiada plugin miscstats.amxx. Jeżeli w Statystykach macie tylko 4 strony to znaczy że nie jest właczony plugin miscstats.amxx. Aby go właczyc należy usunac ; z przed nazwy pluginu w plugins.ini

Strona 1
Dołączona grafika
Pozycja nr 1

HP & AP Zabójcy -> Po włączeniu tej komendy będą nam się pokazywały takie statystyki w lewym dolnym rogu
Dołączona grafika


Pozycja nr 2

Pokaż Atakujących -> Po włączeniu tej komendy będą nam się pokazywały takie statystyki w prawej części monitora
Dołączona grafika

Pozycja nr 3

Pokaż Ofiary -> Po włączeniu tej komendy będą nam się pokazywały takie statystyki w prawej części monitora
Dołączona grafika

Pozycja nr 4

Pokaż Zabójce -> Po włączeniu tej komendy bedą nam się pokazywały takie statystyki w lewym górnym rogu
Dołączona grafika

Pozycja nr 5

Pokaż Wynik Gry
-> Po włączeniu tej komendy bedą nam się pokazywały takie statystyki w lewej części monitora
Dołączona grafika

Pozycja nr 6

Pokaż Statystyki Sumaryczne
-> Po włączeniu tej komendy bedą nam się pokazywały takie statystyki w lewej części monitora
Dołączona grafika

Pozycja nr 7
Pokaż Najlepszego Rundy -> Po włączeniu tej komendy bedą nam się pokazywały takie statystyki w lewej części monitora
Dołączona grafika


Strona 2
Dołączona grafika
Pozycja nr 1

Pokaż Najbardziej Raniącego Rundy
-> Po włączeniu tej komendy bedą nam się pokazywały takie statystyki w lewej części monitora
Dołączona grafika

Pozycja nr 2

Statystyki HUD Podstawowe
-> Po włączeniu tej komendy zostanie zablokowana mozliwość wł/wył statystyk dla graczy poprzez komende /switch

Pozycja nr 3

Odległość i HS w HUD
-> Po włączeniu tej komendy bedzie dodawana informacja do Atakujący ( Patrz : Strona 1 ; Pozycja 2 ) i Ofiary ( Patrz : Strona 1 ; Pozycja 3 ) na temat odległosci z jakiej został zabity gracz oraz czy zostal zabity przez Headshot
Dołączona grafika

Pozycja nr 4

Statystyki na koniec mapy
-> Po włączeniu tej komendy na koniec mapy beda pokazywały się nam statystyki tak jakbyśmy użyli komendy /statsme - Komenda /statsme musi być włączona ( Patrz : Strona 2 ; Pozycja 7 )

Pozycja nr 5

Top15 na koniec mapy
-> Po włączeniu tej komendy na koniec mapy beda pokazywały się nam statystyki tak jakbyśmy użyli komendy /top15 - Komenda /top15 musi być włączona ( Patrz : Strona 3 ; Pozycja 6 )

Pozycja nr 6

Say /hp
-> Po włączeniu tej komendy wpisując podczas gry /hp pojawi nam się w lewym dolnym rogu taka informacja

Dołączona grafika


Pozycja nr 7

Say /statsme
-> Po włączeniu tej komendy wpisując podczas gry /statsme otworzy nam się okno z naszymi statystykami na obecnej mapie
Dołączona grafika

Strona 3
Dołączona grafika
Pozycja nr 1

Say /rankstats
-> Po włączeniu tej komendy wpisując podczas gry /rankstats otworzy nam się okno z naszymi statystykami rankingu
Dołączona grafika

Pozycja nr 2

Say /me
-> Po włączeniu tej komendy wpisując podczas gry /me pojawi nam się informacja o ilości zadanych obrażeń od początku rundy Dołączona grafika

Pozycja nr 3

Say /rank
-> Po włączeniu tej komendy wpisując podczas gry /rank pojawi nam się w lewym dolnym rogu informacja o naszym miejscu w rankingu Dołączona grafika

Pozycja nr 4

Say /report
-> Po włączeniu tej komendy wpisując podczas gry /report pojawi nam się w lewym dolnym rogu informacja o naszym stanie ekwipunku Dołączona grafika


Pozycja nr 5

Say /score
-> Po włączeniu tej komendy wpisując podczas gry /score pojawi nam się w lewym dolnym rogu informacja o wyniku gry w rundzie ( Patrz : Strona 1 ; Pozycja 5 )
Dołączona grafika

Pozycja nr 6

Say /top15
-> Po włączeniu tej komendy wpisując podczas gry /top15 otworzy nam się okno z listą 15 najlepszych graczy servera z ich statystykami Dołączona grafika

Pozycja nr 7

Say /stats
-> Po włączeniu tej komendy wpisując podczas gry /stats pojawi nam się w lewej części monitora lista graczy na serverze. Wybierając gracza możemy sprawdzic jego Statystyki mapy ( tak jakbym wpisal /statsme ( Patrz : Strona 2 ; Pozycja 7 )) lub jego Statystyki rankingu ( tak jakbym wpisal /rankstats ( Patrz : Strona 3 ; Pozycja 1 )). Statystyki przełączamy klawiszem 8
Dołączona grafikaDołączona grafika

Strona 4
Dołączona grafika
Pozycja nr 1

Rankingi w Obserwatorze
-> Po włączeniu tej komendy gdy nieżyjemy lub jesteśmy na spektatorze pojawi się nam w lewym dolnym rogu informacja o miejscu w rankingu gracza którego obserwujemy. Kamera musi być inna niż widok celownika!
Dołączona grafika

Po wł/wył komend pamiętajcie zawsze o kliknięciu na 8 aby zapisać zmiany !!!

Na koniec chciałbym podziękować dla:
-Abes_Ziomal'a
--PainKiller-'a
za dodanie reklamy amxx.pl na screenach :)

PS: proszę nie zwracać uwagi na wartości w statystykach :) Są one bardzo lamerskie ze względu iż robione były one wyłacznie pod poranik... W rzeczywistości są one znacznie wyższe bo jak wiadomo istne PRO ze mnie jest :P :P :P :P

@ 2007-2009 AMXX.pl @ Wszelkie prawa zastrzeżone.


  • +
  • -
  • 26


#410363 Dobre i złe nawyki tworzenia menu

Napisane przez GwynBleidD w 14.05.2012 14:00

Krótka przedmowa, czyli o czym ten poradnik

Będzie to poradnik nie o samym tworzeniu menu, lecz o tym jak to, w zależności od sytuacji, robić prawidłowo. Skupię się tutaj wyłącznie na nowym typie menu, który w najnowszym amx umożliwia prawie tą samą funkcjonalność, co stary typ menu, a dużo większą wygodę użycia. Jedynym brakiem tutaj jest brak możliwości utworzenia linii informacyjnej przed pierwszym elementem w menu (czyli zaraz pod tytułem), co jednak można obejść tworząc wielolinijkowy tytuł, o czym na końcu tego tutorialu w ramach bonusu :) W praktyce będzie to prawie wyłącznie o użyciu info w menu, czyli jak go używać z głową i do czego może się przydać.

Omówienie funkcji zostawiam dokumentacji :) Najpierw omówię złe praktyki i opiszę dlaczego są złe


1. Konstruowanie switcha w oparciu o info

Często widzę taki "koszmarek" jak sterowanie switchem w handlerze poprzez info, gdzie w info zawiera się numer pozycji, w postaci tekstu. Jeśli nie wiesz o czym mówię, zobacz przykład:



public show_menu(id) {
    new menu = menu_create("Menu serwera", "handle_menu");
    
    menu_additem(menu, "Wyświetl regulamin", "1");
    if(cs_get_user_team(id)==CS_TEAM_CT)
        menu_additem(menu, "Kup AK47", "2");
    else
        menu_additem(menu, "Kup M4A1", "2");
    menu_additem(menu, "Wyświetl top15", "3");
    menu_additem(menu, "Zobacz inne serwery", "4");
    menu_additem(menu, "Przekaż pieniąde graczowi", "5");
    
    menu_display(id, menu)
}

public handle_menu(id, menu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new sKey[6], iKey, access, callback;
    menu_item_getinfo(menu, item, access, sKey, 5,_, _, callback);
    iKey = str_to_num(sKey);
    
    switch(iKey) {
        case 1: client_cmd(id, "say /regulamin");
        case 2: daj_bron(id);
        case 3: client_cmd(id, "say /top15");
        case 4: client_cmd(id, "say /serwery");
        case 5: client_cmd(id, "say /przelew");
    }
    
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

Co tu i dlaczego jest źle? a to, że wymyślamy koło na nowo i marnotrawimy zasoby. Otóż niepotrzebnie używamy 3ciego parametru itemów z menu o nazwie info, aby determinować co klient kliknął w menu, przez co generujemy niepotrzebne utworzenie 3ch zmiennych w handlerze, konieczność pobrania info i przekonwertowania na postać numeryczną + podanie do każdego itemu dodatkowego parametru info, co generuje dodatkowe zużycie zasobów. Może i niewielkie, ale na pewno niepotrzebne :) Więc na pewno tworzenie menu w taki sposób dobrą praktyką nie jest.


ad 1. Konstruowanie switcha w oparciu o parametr item

Teraz poprawna wersja z użyciem, stworzonego do tego celu, parametru item z handlera, który przechowuje numer tego elementu, licząc od 0, czyli ten sam plugin wyglądać może tak:

public show_menu(id) {
    new menu = menu_create("Menu serwera", "handle_menu");
    
    menu_additem(menu, "Wyświetl regulamin");
    if(cs_get_user_team(id)==CS_TEAM_CT)
        menu_additem(menu, "Kup AK47");
    else
        menu_additem(menu, "Kup M4A1");
    menu_additem(menu, "Wyświetl top15");
    menu_additem(menu, "Zobacz inne serwery");
    menu_additem(menu, "Przekaż pieniąde graczowi");
    
    menu_display(id, menu)
}

public handle_menu(id, menu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    switch(item) {
        case 0: client_cmd(id, "say /regulamin");
        case 1: daj_bron(id);
        case 2: client_cmd(id, "say /top15");
        case 3: client_cmd(id, "say /serwery");
        case 4: client_cmd(id, "say /przelew");
    }

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

i gwarantuję, że zadziała tak samo, a nawet lepiej ;) Numeracja w item jest niezależna od numeracji klawiszy w menu, więc każdy additem i tylko additem zwiększa nam numer o 1, zaczynamy od 0 o czym trzeba pamiętać koniecznie. Exit nie ma numeru 0, ale specjalną wartość nazwaną MENU_EXIT, równą -3 (-2 i -1 to odpowiednio wstecz i dalej).


Trochę o samym parametrze info

No dobra, ale czym w końcu jest to info? Ano jest to informacja, którą możemy przekazać do handlerów menu, aby poinformować go o tym, co zawiera dana opcja. W przypadku przykładu 1, gdzie tworzymy je w kodzie statycznie lub prawie statycznie (różni się etykieta itemu pod klawiszem 2 w zależności od drużyny w podanym przykładzie) jest całkowicie zbędne. Jednak może się przydać przy tworzeniu dynamicznego menu. Oto następna zła praktyka:


2. Nieprawidłowe menu z graczami

Przyjrzyjmy się przykładowej implementacji menu do przelewu kasy, w którym możemy wybrać danego gracza i przelać mu pieniądze. Dla uproszczenia przyjąłem, że podaną funkcję show_przelew wywołuje handler z poprzedniego menu wyboru ilości kasy do przelania. Ilość ta jest podana w parametrze wartosc. gWartosci to 33 elementowa tablica globalna:

public show_przelew(id, wartosc) {
    new menu = menu_create("Wybierz gracza do przelania kasy", "handle_przelew");
    
    gWartosci[id] = wartosc;
    
    new players[32], num;
    get_players(players, num);
    for(new i=0; i<num; ++i) {
        new name[32];
        get_user_name(players[i], name, 31);
        menu_additem(menu, name);
    }
    
    menu_display(id, menu);
}

public handle_przelew(id, menu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new players[32], num;
    get_players(players, num);
    przelej_kase(id, players[item], gWartosci[id]);
    
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

Niby wszystko pięknie, na oko i po pierwszych testach działa, bo przecież itemów tworzymy tyle ile graczy, więc item będzie nam zwracał zawsze pozycję w tablicy players, którą zajmował dany gracz. No prawie... Bo co się stanie jak ktoś wyjdzie z serwera albo ktoś na serwer wejdzie? Jeśli nastąpi to w tablicy po indeksie gracza, którego chcemy wybrać to jeszcze pół biedy, ale jeśli przed to kolejność się zmieni. A niestety widziałem takie praktyki w wielu pluginach... No i w tym momencie dajemy kasę nie temu graczowi co trzeba...


ad 2. Prawidłowo działające menu z graczami

Jak to poprawić? użyć info! Tutaj, w przeciwieństwie do przykładu pierwszego, należy go użyć. Więc używajmy:

public show_przelew(id, wartosc) {
    new menu = menu_create("Wybierz gracza do przelania kasy", "handle_przelew");
    
    new players[32], num;
    new name[32], info[25];
    get_players(players, num);
    for(new i=0; i<num; ++i) {
        get_user_name(players[i], name, 31);
        formatex(info, 24, "%08X%08X%08X", wartosc, players[i], get_user_userid(players[i]));
        /*info[0] = wartosc; POPRAWKA - TEGO SPOSOBU WIĘCEJ NIE UŻYWAMY!
        info[1] = players[i];
        info[2] = get_user_userid(players[i]); */
        menu_additem(menu, name, info);
    }
    
    menu_display(id, menu);
}

public handle_przelew(id, menu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
    
    new info[25], access, callback;
    menu_item_getinfo(menu, item, access, info, 24,_, _, callback);
    new tid = hexstr_to_num(info[8], 8); // zaczynamy od 8 znaku i pobieramy 8 z nich, konwertując je z hex na liczbę
    new tuserid = hexstr_to_num(info[16], 8);
    new wartosc = hexstr_to_num(info, 8);
    if(is_user_connected(tid) && tuserid == get_user_userid(tid))
        przelej_kase(id, tid, wartosc);

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}
hexstr_to_num(string[], chars) {
    new result=0;
    for(new i=0; i<chars && string[i]!='^0'; ++i)
        result = result<<4 + (string[i]>'9'?string[i]>'F'?string[i]-'a'+10:string[i]-'A'+10:string[i]-'0');
        return result;
    }
}

Jak widać potrzebne wartości, czyli id gracza i wartość kasy do przelania. Ale co? Przecież to nie jest napis, tylko tablica... A kto powiedział albo gdzieś napisał, że info musi być napisem? Może być tablicą, wszak napis też jest tablicą, tyle że specyficznie interpretowaną ;) więc zastosowanie jak najbardziej prawidłowe. (Znów aktualizacja! Ostatnio odkryłem, że niestety gdy funkcja napotka wartość 0, przerywa całkowicie wczytywanie dalszych wartości! Musimy więc przerobić liczbę na string!) Utworzyłem prosty string z 3 wartości liczbowych w postaci heksadecymalnej. Użyłem dość dziwnej konstrukcji %08F, zapewnia to wypełnienie zerami z przodu tak, aby liczba zawsze zajmowała 8 znaków. Dlaczego każda ma 8? liczba każda w AMX ma 32 bity, jedna cyfra HEX może zapisać 4, dalej chyba już jasne :) Stworzyłem również funkcję konwertującą string hexadecymalny na liczbę, aby wydobyć ze stringa spowrotem wartości. Dlaczego użyłem HEX? Prościej jest konwertować to na liczbę i zajmuje stałą ilość znaków ;) Teraz już nie martwimy się, że jakiś gracz ucieknie z serwera (no chyba, że ucieka nam gracz, do którego chcemy przelać kasę... ale wtedy po prostu kasa się nie przeleje, chyba że ktoś na miejsce wychodzącego gracza akurat wejdzie, na taki przypadek można zrobić weryfikację nicku lub sid jeszcze) (aktualizowałem kod pluginu zgodnie z sugestią użytkownika sebul) i mamy elegancko zrobione menu :) Jednocześnie zbędna stała się globalna tablica gWartosci, gdyż wartość kasy przesyłamy w tym samym info, co id gracza.
Mam nadzieję, że przykład ten jasno ilustruje do czego info w nowych menu powinno być używane.


3. Menu statyczne wyboru serwera, przykład nieco gorszy

Teraz jeszcze jeden przykład uzasadnionego użycia info, mimo menu statycznego. Oczywiście na początek ten... może tym razem po prostu gorszy, bo jak najbardziej poprawny ;) przykład, menu serwerów:

public show_serwery(id) {
    new menu = menu_create("Wybierz serwer na który chcesz przejść", "handle_serwery");
    
    menu_additem(menu, "Serwer GunGame");
    menu_additem(menu, "Serwer FFA");
    menu_additem(menu, "Serwer Diablo");
    
    menu_display(id, menu);
}

public handle_serwery(id, menu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    switch(item) {
        case 0: client_cmd(id, "Connect 23.123.33.22:27033");
        case 1: client_cmd(id, "Connect 12.34.56.78:27090");
        case 2: client_cmd(id, "Connect 98.76.54.32:27010");
    }

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

Dlaczego przykład jest gorszy? trudniejszy w edycji, musimy w 2ch miejscach zmieniać, gdy chcemy zmienić listę serwerów.


ad 3. Menu wyboru serwera, przykład lepszy, wygodniejszy

Mimo, że poprawny jest, przedstawiam wariant wygodniejszy:

public show_serwery(id) {
    new menu = menu_create("Wybierz serwer na który chcesz przejść", "handle_serwery");
    
    menu_additem(menu, "Serwer GunGame", "23.123.33.22:27033");
    menu_additem(menu, "Serwer FFA", "12.34.56.78:27090");
    menu_additem(menu, "Serwer Diablo", "98.76.54.32:27010");
    
    menu_display(id, menu);
}

public handle_serwery(id, menu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new ip[32], access, callback;
    menu_item_getinfo(menu, item, access, ip, 31,_, _, callback);
    client_cmd(id, "Connect %s", ip);
    
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

W ten oto sposób mamy dużo wygodniejsze dodawanie i edycję listy serwerów, bo dla każdego serwera jest to jedna, przejrzysta linia. Dodatkowo drobną modyfikacją można uzyskać listę serwerów odczytywaną z pliku, nvaulta albo bazy SQL, wstawiając odpowiednią pętlę zamiast additem, oraz dodając obsługę jednego z wymienionych. Tutaj, mimo menu statycznego, mamy w pełni uzasadnione użycie info do determinowania akcji podejmowanej przez menu :)


I na koniec obiecany bonus

Jak wiecie, dzięki starym menu można tworzyć coś, co przypomina, albo i nie przypomina menu, np wyświetlić regulamin na kilkanaście linii i pod nim dać możliwość jego akceptacji. Na nowym menu można dokładnie to samo, wymaga to jednak tricków kilku.

O ile nie ma żadnych problemów, gdy np. chcemy wstawić po każdej opcji w menu linijkę opisującą, albo gdy wszystkie opcje w menu mają być na samej górze, a dodatkowy tekst na dole, gdyż jest coś takiego jak menu_addblank i menu_addtext. Nie możemy ich jednak użyć przed użyciem choć raz menu_additem (nie wiem dlaczego tak twórcy amx głupio zrobili, ale tak zrobili). Jednak jest możliwość ominięcia tego niuansu przez ustawienie potrzebnych nam rzeczy w wielolinijkowym tytule. Tu następne ograniczenie: ustawienie tytułu poprzez menu_create posiada dosyć rygorystyczny limit znaków, musimy więc ustawić to poprzez menu_setprop(menu, MPROP_TITLE, ...) czyli np coś takiego:

    menu = menu_create("Regulamin serwera", "handler");
    menu_setprop(menu, MPROP_TITLE, "Regulamin serwera \yGunGame^n^nNa serwerze obowiązuje\rABSOLUTNY\yzakaz przeklinania^nNie wolno bugować mapy...");

    menu_additem(menu, "Akceptuję regulamin");
    menu_additem(menu, "Nie akceptuję regulaminu");
    menu_addtext(menu, " Nie zaakceptowanie regulaminu wiąże się z 5 minutowym banem");
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);

I w taki sposób uzyskujemy ładny, czytelny regulamin, na nowych menu, z możliwością akceptacji ;) Prawda, że proste :)

Dziękuję za dotrwanie do końca :D

Copyright © Wszelkie prawa zastrzeżone
Kopiowanie tego poradnika lub treści w nim zawartych bez wyraźnej zgody autora jest zabronione i będzie ścigane z mocy prawa


  • +
  • -
  • 20


#684889 Stałe kompilatora pawn

Napisane przez DarkGL w 26.01.2015 17:02

http://darkgl.amxx.p...mpilatora-pawn/

Lista stałych kompilatora pawn które możemy używać w naszym kodzie
  • __DATE__ - aktualna data
  • __TIME__ - aktualny czas
  • cellbits - "wielkość" pojedynczej komórki pamięci
  • cellmax - maksymalna wartość którą może przechowywać komórka pamięci
  • cellmin - minimalna wartość którą może przechowywać komórka pamięci
  • __Pawn - wersja interpretatora pawn
  • debug - poziom debugowania
Stałe dodane w kompilatorze AMXX w wersji 1.8.3
  • __LINE__ - aktualna linia pliku
  • __BINARY_PATH__ - ścieżka do wykonywanego pliku
  • __BINARY_NAME__ - nazwa wykonywanego pliku
Użycie:
server_print("__DATE__: %s", __DATE__);
server_print("__TIME__: %s", __TIME__);
server_print("cellbits: %d", cellbits);
server_print("cellmax: %d", cellmax);
server_print("cellmin: %d", cellmin);
server_print("__Pawn: %d", __Pawn);
server_print("debug: %d", debug);
sAuqNeq.png
  • +
  • -
  • 12


#685648 Licznik Headshotów *Headshot Manager*

Napisane przez Wielkie Jol w 31.01.2015 10:03

opis

Prosty licznik headshotów a zarazem prosty plugin, który liczy nam headshoty w danej grze, po wyjściu z gry zapisuje do pliku nvault, po ponownym wejściu przywraca headshoty, które nastrzeliliśmy do rozłączenia się z serwerem.

Potem dodam aktualizację, która sprawdzi, która osoba w danej mapie nastrzelała ich najwięcej i wedle liczb, rozda jakieś nagrody.

 

[komendy]

"say /headshots"

"say /hs"
"say_team /hs"
"say_team /headshots"
 
Wszystko do zmiany przy zmiennej g_Commands
 
 
[cvary]
 
amx_licznikhsdisplay
0 - wyświetlanie hsów po wpisaniu komendy tylko w say
1 - wyświetlanie hsów po wpisaniu komendy tylko w hud
2 - wyświetlanie hsów po wpisaniu komendy w say i hud
amx_licznikhsbest
0 - wyłącza pokazywanie gracza z największą ilością hs co rundę
1 - włącza pokazywanie gracza z największą ilością hs co rundę ( domyślnie
amx_licznikhsnagroda
0 - wyłącza system nagród za najwięcej hsów w trakcie mapy
1 - włącza system nagród za najwięcej hsów w trakcie mapy ( domyślnie )
amx_licznikhsprefix
ustawia prefix do pluginu, domyślnie [LicznikHS]
amx_licznikhsilosc
jeżeli licznikhsnagroda ustawiony na 1, daje nagrody 60s przed końcem mapy
dla tego, który zdobył najwięcej hsów, domyślnie wartość 30 diamentów bf4.
Dla innego moda, np. cod moda zmieniamy linijkę 110.
 
+ define CZAS, który definiuje, ile sekund przed końcem mapy mają być rozdane nagrody
 
inne informacje
Jeżeli bedziemy zmieniac wartosc cvarow hsbest i nagrody, mapa musi zostac zmieniona dwa razy, zanim zmiany wejda w zycie, jest to spowodowane eventami z tego co zauwazylem.
 
 

Załączone pliki


  • +
  • -
  • 9


#682170 Pytanie o temperaturę karty graficznej

Napisane przez RasiaQ w 10.01.2015 15:44

Temperatury nie powinny przekraczać 70C. Możliwe że jest brudna, warto byłoby ją wyczyścić.

Wyciągnij kartę kup sprężone powietrze w sklepie,koszt ok 15 zł za puszkę i dobrze ją przeczyść.Jak to nie pomoże to można jeszcze nałożyć nowa pastę termo-przewodzącą pomiędzy procesor graficzny a radiator karty.

  • +
  • -
  • 1


#682233 Pytanie o temperaturę karty graficznej

Napisane przez RasiaQ w 10.01.2015 19:14

Wyczyść i nałóż i sprawdź jak to będzie wyglądało. Najlepiej dwoma programami dla pewności


  • +
  • -
  • 1