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
 

kyku - zdjęcie

kyku

Rejestracja: 07.11.2008
Aktualnie: Nieaktywny
Poza forum Ostatnio: 02.09.2014 23:55
*****

#174557 stock is_allowed_server

Napisane przez Knopers w 26.09.2010 15:24

(...) tylko właśnie mogłem dodać zmienne consty.


Ale wtedy nie były bo to już zmienne tylko stałe :giggle:
I nie przypisał byś już do stałej IP pobranego funkcją get_user_ip :giggle:
  • +
  • -
  • 1


#168284 odpychanie (velocity)

Napisane przez Owner123 w 05.09.2010 09:49

stock get_velocity_from_origin( ent, Float:fOrigin[3], Float:fSpeed, Float:fVelocity[3] )
{
new Float:fEntOrigin[3];
entity_get_vector( ent, EV_VEC_origin, fEntOrigin );

// Velocity = Distance / Time

new Float:fDistance[3];
fDistance[0] = fEntOrigin[0] - fOrigin[0];
fDistance[1] = fEntOrigin[1] - fOrigin[1];
fDistance[2] = fEntOrigin[2] - fOrigin[2];

new Float:fTime = ( vector_distance( fEntOrigin,fOrigin ) / fSpeed );

fVelocity[0] = fDistance[0] / fTime;
fVelocity[1] = fDistance[1] / fTime;
fVelocity[2] = fDistance[2] / fTime;

return ( fVelocity[0] && fVelocity[1] && fVelocity[2] );
}


// Sets velocity of an entity (ent) away from origin with speed (speed)

stock set_velocity_from_origin( ent, Float:fOrigin[3], Float:fSpeed )
{
new Float:fVelocity[3];
get_velocity_from_origin( ent, fOrigin, fSpeed, fVelocity )

entity_set_vector( ent, EV_VEC_velocity, fVelocity );

return ( 1 );
}


Używasz set_velocity_from_origin na encie który ma być odepchnięty i wsio ;)
  • +
  • -
  • 3


#162342 Jaka jest różnica między eventami

Napisane przez R3X w 21.08.2010 13:25

Ham_Killed jest zdarzeniem bezpośrednim - zawsze kiedy ktoś ginie jest wywoływany; funkcja
Death(ofiara){
	new zabojca = get_user_attacker(id); // nie zawsze się zgadza :/
}

"DeathMsg" jest wywoływany przy pokazaniu w prawym górnym rogu komunikatu śmierci; funkcja
Death(){
	new ofiara = read_data(2);
	new zabojca = read_data(1); // zasze się zgadza
}
jeśli gracz zginie bez globalnej informacji (np. user_silentkill() czy wybuch bomby) to śmierć gracza nie jest odnotowywana; nie jest także łapana w przypadku message_begin(MSG_ALL, get_user_msgid("DeathMsg")) -> trzeba użyć emessage_*


BTW flagi "de" i nie mają sensu dla globalnego eventu "a"
  • +
  • -
  • 2


#144797 MySQL - z czym to się je.

Napisane przez Owner123 w 17.06.2010 14:31

Witam.
Na wstępnie chciałbym powiedzieć, że nie będę opisywał tu zapytań MySQL ponieważ to mija się z celem. Jeśli ktoś chce się pouczyć zapytań MySQL zapraszam na uw-team.org (nie wiem czy taka reklama jest dozwolona, jeśli tak to prosiłbym o nie wlepianie mi warna). Szczerze polecam Wideotutorial Unknow'a na temat MySQL.
Życzę miłej lekturki.

MySQL, cóż to takiego ?

Edit. Thx 4 R3X
SQL - Structured Query Language (pl. strukturalny język zapytań), jest to nowoczesny język, dzięki któremu można posługiwać się bazami danych. MySQL to popularna odmiana serwera, które potrafi przetwarzać zapytania w tym języku.

Przejdźmy do sedna.
Aby móc zacząć pracować, musimy dołączyć do swojego pluginu dyrektywą #include odpowiednią biblioteke:

#include <sqlx>


Dobra mamy już odpowiednie narzędzia aby zacząć

Są 2 metody, pracy na bazach danych. Ja opiszę tutaj sposób, który używam osobiście i który sprawdza się w wielu przypadkach (m.in. Diablo Mod).
Ta metoda opiera się tylko na utworzeniu "pojemnika" który przechowuje dane dostępowe do bazy danych i odpowiednim użyciu go.
Możemy go stworzyć funkcją SQL_MakeDbTuple:
native Handle:SQL_MakeDbTuple(const host[], const user[], const pass[], const db[], timeout=0);

Po kolei:
const host[] - adres Hosta. Np. db4free.net, 127.0.0.1
const user[] - login. np. root
const pass[] - hasło.
const db[] - nazwa bazy danych. np. nauka
timeout=0 - tego parametru nie będę opisywał. Najlepiej zostawić tak jak jest.

Przykładowe użycie:
new Handle:Tuple = SQL_MakeDbTuple("127.0.0.1", "root", "", "nauka")

Najlepiej aby zmienne, które są właśnie "pojemnikiem" były globalne.

W jaki sposób wykonać jakieś zapytanie ?

A więc tak, są 2 metody wykonywania zapytań do bazy danych:

- Bezpośrednia (NON-Threaded)
- Pośrednia (Threaded)

Poniżej postaram się opisać obie metody.

Pośrednia / Threaded

Ta metoda przy dużej ilości wpisów w bazie (30k++) zaczyna działać z dużym opóźnieniem, nie ważne na jak dobrym hostingu mamy ulokowaną bazę danych. Jednak jest o wieele bezpieczniejsza. Na czym polega jej bezpieczeństwo?
Otóż tą metodą otrzymujemy wynik później, jednak nie powoduje ona lagów - w przeciwieństwie do NON-Threaded (w niektórych przypadkach, które potem opiszę).

Aby posłuzyć się tą metodą jest funkcja SQL_ThreadQuery:
native SQL_ThreadQuery(Handle:db_tuple, const handler[], const query[], const data[]="", dataSize=0);


Handle:db_tuple - uchwyt do "pojemnika"(nie wiedziałem jak to inaczej określić). Niezbędny aby cokolwiek zrobić.
const handler - nazwa funkcji publicznej która zostanie wywołana PO wykonaniu zapytania.
const query[] - treść zapytania. Jeśli jest skomplikowane lub wymaga użycia %d lub %s to wtedy należy to odpowiednio przygotować komendą format().
Podziękowania dla G[o]Q.
const data[]="" oraz dataSize=0 - parametry opcjonalne.

data to jakby tablica parametrow a dataSize to ich ilosc tak jak parametry w set_task o czym jest osobny poradnik


Przykładowe użycie:

new Handle:gTuple, bool:gConnected
[...]
//Tworzymy "pojemnik" i ustawiamy zmienną gConnected na true jeśli wszystko obeszło się bez przeszkód.

SaveData(id)
{
if(!gConnected) return

new Data[1]
Data[0] = id
new qCommand[512], szName[32]
get_user_name(id, szName, charsmax(szName))
format(qCommand, sizeof qCommand-1, "INSERT INTO nauka VALUES(%s, %i, %i);", szName, iPlayerXP[id], iPlayerLvl[id])
SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
}

public SaveHandler(FailState, Handle:Query, Error[], Errorcode, Data[], DataSize)
{
new id = Data[0]
if(Errorcode)
log_amx("Blad w zapytaniu: %s [SaveData]", Error)

if(FailState == TQUERY_CONNECT_FAILED)
{
log_amx("Nie mozna podlaczyc sie do bazy danych.")
return PLUGIN_CONTINUE
}
else if(FailState == TQUERY_QUERY_FAILED)
{
log_amx("Zapytanie anulowane [SaveData]")
return PLUGIN_CONTINUE
}

return PLUGIN_CONTINUE
}


Oczywiście zamiast funkcji log_amx, możemy posłużyć się funkcją log_to_file.
Przedstawiłem tu zapis Nicku, Xp i Levela graczy do bazy MySQL.

A co z odczytem ?
Powyższa instrukcja spowoduje, dodanie kolejnego wpisu do bazy danych. Nie ważne czy taki wpis już istnieje czy nie.
Aby sprawdzić czy dany wpis istnieje musimy posłużyć się kolejnym zapytaniem:
new Handle:gTuple, bool:gConnected
[...]
//Tworzymy "pojemnik" i ustawiamy zmienną gConnected na true jeśli wszystko obeszło się bez przeszkód.

CheckData(id)
{
if(!gConnected) return

new Data[1]
Data[0] = id
new qCommand[512], szName[32]
get_user_name(id, szName, charsmax(szName))
format(qCommand, sizeof qCommand-1, "SELECT * FROM `nauka` WHERE `nick` = '%s'", szName)
SQL_ThreadQuery(gTuple, "CheckHandler", qCommand, Data, 1)
}

public CheckHandler(FailState, Handle:Query, Error[], Errorcode, Data[], DataSize)
{
new id = Data[0]
if(Errorcode)
log_amx("Blad w zapytaniu: %s [CheckData]", Error)

if(FailState == TQUERY_CONNECT_FAILED)
{
log_amx("Nie mozna podlaczyc sie do bazy danych.")
return PLUGIN_CONTINUE
}
else if(FailState == TQUERY_QUERY_FAILED)
{
log_amx("Zapytanie anulowane [CheckData]")
return PLUGIN_CONTINUE
}

if(!SQL_MoreResults(Query)) // Nie znaleziono wpisów w bazie danych. Możemy spokojnie utworzyć.
DodajWpis(id)
else // A jednak coś znalazł ! Żeby nie robić kolejnej funkcji od razu odczytujemy.
{
iPlayerXp[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "exp")) // Ponieważ funkcja SQL_ReadResult wymaga ID pola, a my go nie mamy musimy posłużyć się funkcją SQL_FieldNameToNum.
iPlayerLvl[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "lvl")) // j/w
}

return PLUGIN_CONTINUE
}


Tutaj za wiele chyba tłumaczyć nie muszę. Sprawdzamy czy rekordy w bazie danych istnieją. Jeśli nie, to dodajemy, ale jak istnieje od razu odczytujemy dane.

Przechodzenie z jednego wpisu do drugiego
Załóżmy, że zapytanie SELECT zwróci nam kilka rekordów. Powyższa metoda nie zadziała poprawnie albo zadziała inaczej niż przewidywaliśmy.
Wtedy przydatna jest komenda SQL_NextRow(Handle:Query).
Przykład (zaczerpnięty z DiabloModa):
while(SQL_MoreResults(Query))
{
new i = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "klasa"))
srv_avg[i] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "AVG"))
SQL_NextRow(Query)
}

Jak zapewne wiadomo - klas w Diablo Modzie jest 8. Zatem zapytanie powyższe zapytanie SELECT odczyta zawartość tylko dla Maga a dla reszty nic by to nie zmieniło. Tutaj zastosowano pętle while która sprawdza czy nadal są jakieś zapytania, jeśli już nie ma - przerwij. Jak już wspomniałem funkcja SQL_NextRow powoduje przeskoczenie z jednego zapytania na drugie, zmniejszając przy tym wartość zwracaną funkcji SQL_MoreResults().

Dla tych co nie rozumieją zbytnio mechanizmu działania
No dobrze. Zapytanie SELECT zwróciło nam 3 rekordy. Chcemy odczytać wszystkie 3, więc tutaj musimy użyć naszej funkcji - SQL_NextRow. Ponieważ, funkcja SQL_MoreResults zwraca ilość rekordów które zostały do odczytania jeśli nic nie zrobiliśmy ma obecnie wartość 3. Dla pomocy kod:
while(SQL_MoreResults(Query))
{
//kod
SQL_NextRow(Query)
}

Po pierwszym obrocie pętli przesuneliśmy się z rekordu pierwszego, na rekord drugi i już wartość zwracana przez funkcje SQL_MoreResults(Query) ma obecnie 2. Teraz możemy bez przeszkód odczytać zawartość kolejnego rekordu.

NOWE!!!
Bezpośrednia / NON-Threaded
Ta metoda daje natychmiastowy zwrot rezultatu ALE pod warunkiem że bazę danych mamy ulokowaną na tej samej maszynie co serwer. W przeciwnym wypadku na serwerze będą ściny serwera i masakryczne pingi.
Aby móc zacząć robić cokolwiek musimy się wpierw połączyć z bazą:

Handle:SQL_Connect(Handle:sqlTuple, &error, szError[], len);

I tutaj strzeżcie się! Pamiętajcie aby ZAWSZE użyc SQL_FreeHandle(Handle:db) jak skończycie majstrować z bazą ! Jak tego nie będziecie robić, serwer będzie crashować bez żadnych error logów. Przykładowe połączenie z bazą wygląda następująco:

public client_authorized(id)
{
new Handle:hConnection, iError, szError[256];

if((hConnection = SQL_Connect(g_hSqlTuple, iError, szError, 255)))
{
// operacje na bazie danych
}
else
{
log_error(AMX_ERR_GENERAL, "Brak polaczenia z baza danych !");
log_error(AMX_ERR_GENERAL, "Kod bledu: %i", iError);
log_error(AMX_ERR_GENERAL, "Tresc bledu: %s", szError);
}

SQL_FreeHandle(hConnection); // PAMIETAJ O TYM BO INACZEJ CZEKA CIE ZGUBA !!!
}


I co to daje ? W metodzie pośredniej takie coś było zbędne!
Otóż użycie tego daje nam możliwość bezpośredniego wprowadzania zapytań do bazy danych. Aby wprowadzić zapytanie musimy użyć 2 funkcji:

Handle:SQL_PrepareQuery(Handle:connection, fmt[], any:...);
bool:SQL_Execute(Handle:query);

Dla ścisłości: funkcja SQL_Execute naprawdę nie zwraca typu bool tylko typ int. Jednak napisałem bool aby uświadomić Tobie, Drogi czytelniku, aby ta funkcja zwraca tylko wartości 1 i 0 aby nas poinformować o tym czy wykonanie zapytania SQL przebiegło poprawnie.
Przejdźmy do małego opisu parametrów:
SQL_PrepareQuery:
Pierwszy parametr:
Uchwyt zwrócony przez funkcje SQL_Connect. Tak, właśnie dlatego było nam potrzebne ręczne połączenie się z bazą!
Drugi i reszta parametrów: Treść zapytania. Jest to w miarę elastyczne ponieważ możemy używać znacznikow %d, %s itd. Uwaga! Nie zalecam używanie tu zapytań typu UPDATE ! Zamiast tego polecam użycie zapytań REPLACE, jednak aby działały one poprawnie wymagane jest utworzenie klucza PRIMARY, UNIQUE lub INDEX. Dlaczego? Nawet jeśli kod jest w pełni zoptymalizowany i baza danych stoi na localhoscie, przy dużej ilości rekordów (100k+, czasem 50k+) powodowane są ścinki i lagi serwera.
Rezultat: Uchwyt do wykonania zapytania. Ta funkcja tylko przygotowuje zapytanie !!! Zapytanie jest wykonywane dopiero przy użyciu funkcji SQL_Execute()! I niech was ręka boska broni! Tutaj też uzywajcie funkcji SQL_FreeHandle()!!! Tak samo jak w przypadku SQL_Connect nie użycie tego powoduje crashe serwera bez żadnych logów!

SQL_Execute:
Jest tutaj tylko jeden parametr: Uchwyt zwrócony przez funkcje SQL_PrepareQuery. Wykonanie tej funkcji jest równoznaczne z wywołaniem zapytania, wcześniej przygotowanego przez funkcje SQL_PrepareQuery.

Dobra koniec teorii, czas na podanie przykładowego kodu:

public client_authorized(id)
{
new Handle:hConnection, iError, szError[256];

if((hConnection = SQL_Connect(g_hSqlTuple, iError, szError, 255)))
{
new szNick[32];
get_user_name(id, szNick, 31);

new Handle:hQuery = SQL_PrepareQuery(hConnection, "SELECT * FROM tabela WHERE `nick` = '%s'", szNick);

if(SQL_Execute(hQuery))
{
new num = 0;
while(SQL_MoreResults(hQuery))
{
num = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "klasa"));
g_iPlayerLvl[id][num] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "lvl"));
g_iPlayerExp[id][num] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "exp"));
SQL_NextRow(hQuery)
}
}
else
{
SQL_QueryError(hQuery, szError, 255);
log_error(AMX_ERR_GENERAL, "Blad w zapytaniu !");
log_error(AMX_ERR_GENERAL, "Kod bledu: %i", iError);
log_error(AMX_ERR_GENERAL, "Tresc bledu: %s", szError);
}

SQL_FreeHandle(hQuery); // Niech was reka boska broni, przed zapomnieniem o tym
}
else
{
log_error(AMX_ERR_GENERAL, "Brak polaczenia z baza danych !");
log_error(AMX_ERR_GENERAL, "Kod bledu: %i", iError);
log_error(AMX_ERR_GENERAL, "Tresc bledu: %s", szError);
}

SQL_FreeHandle(hConnection);
}


Dałem kod razem z SQL_Connect abyście dobrze widzieli w jaki sposób posługiwać się uchwytem do połączenia.

Jak zapewne widać zmian w korzystaniu z SQL_ReadResult i SQL_NextRow nie ma.

Na tym kończę ten tutorial!

Myślę że opisałem najważniejsze rzeczy. Jeśli ktoś chce poznać resztę funkcji które oferuję biblioteka sqlx wystarczy zajrzeć do pliku sqlx.inc który znajduję się w addons/amxmodx/scripting/include. Co prawda po angielsku, ale chyba z jakiejś przyczyny powstały tłumacze internetowe, prawda ? Dobrym punktem odniesienia jest Diablo Mod. Posiada on szereg funkcji dzięki którym możemy majstrować w bazie MySQL.

Wszelkie błędy, niedopowiedzenia oraz literówki lub inne badziewa, proszę zgłaszać w tym temacie.
Wszelka krytyka mile widziana smile.gif


  • +
  • -
  • 31


#143501 XP MOD

Napisane przez grankee w 11.06.2010 15:21

1.Zapisuj na sid, a jesli ktos jest z nonsteam (ma steam_id_lan) to dopiero na nick.
2.Po co Ci -xpmod na końcu key'a? Usuń to, bo to niepotrzebne, niech sam nick/sid będzie kluczem (key'em).
3.Jeśli xp nie dostaje się co chwila to od razu to zapisuj vaultem, wtedy po każdej operacji będzie zapis na bieżąco, a zmienne wywal, no chyba, że co chwila dostaje się za coś expa to wtedy do zmiennych i co runda najrzadziej zapisuj.
4.

public SaveData(id)
{
if(!zaladowalo[id]) return PLUGIN_HANDLED;// zmienna informujaca czy dany gracz byl zaladowany, ale jesli go nie zaladowalo to czemu go nie zapiszesz? Tworzenie konto robisz ręcznie? Jesli ma być automatycznie zapisywane dla nowych graczy to wywal tę linijkę
if(is_user_bot(id)) return PLUGIN_HANDLED;
if(player_xp[id]<=player_xp_old[id] || player_xp[id]==99999999999) return PLUGIN_HANDLED;//nie do konca rozumiem co to, jakby byl caly kod..
new nick[35]//32 wystarczy

new vaultkey[64],vaultdata[256]// po co Ci taka wielka tablica vaultdata? vaultkey w zasadzie powinien byc samym nickiem, po co ten dopisek -xpmod?
format(vaultkey,63,"%s-xpmod",nick)//czyli jak to wyzej poprawisz to ta linijka do usuniecia
format(vaultdata,255,"%i#%i#%i#", player_lvl[id], player_xp[id], player_dead[id])/* Po co wstawiasz #? Zrób to tak:
format(vaultdata,255,"%i %i %i", player_lvl[id], player_xp[id], player_dead[id])
skoro to liczby to nie zawierają spacji, więc później bez problemu podzielisz to parse'm*/
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}


5.
public LoadData(id)
{


if(is_user_bot(id) || !is_user_connected(id)) return PLUGIN_HANDLED;

new nick[35] //wystarczy 32
get_user_name(id, nick, 34);//analogicznie 31
replace_all(nick, 34, "#", "");//po co to ?

new vaultkey[64],vaultdata[256]//po co Ci takie duze tablice? przeczytaj co pisalem wyzej
format(vaultkey,63,"%s-xpmod",nick)// jak wyżej pisałem, wywal "-xpmod", bo to zbędne
format(vaultdata,255,"%i#%i#%i#",player_lvl[id], player_xp[id], player_dead[id])//po co formatujesz string do którego za chwile i tak zapiszesz co innego?(zapiszesz tu wartosc z vaulta)
nvault_get(g_vault,vaultkey,vaultdata,255)//uzyj nvault_lookup, który od razu zwróci Ci, czy taki klucz został odnaleziony w bazie vault, po czym mozesz to zawarunkować i w razie niepowodzenia dasz return, żeby dalej nie wykonywać funkcji
replace_all(vaultdata, 255, "#", " ")//wywal to
new tmp[3][32];
parse(vaultdata, tmp[0], 31, tmp[1], 31, tmp[2], 31)//chyba takich długich wartości expa nie będzie, 31 znaków to grubo ponad bilion :D
player_lvl[id] = str_to_num(tmp[0]);
player_xp[id] = str_to_num(tmp[1]);
player_dead[id] = str_to_num(tmp[2]);
zaladowalo[id] = 1;//jesli to co wyzej ma byc automatycznie to ta zmienna jest zbedna

return PLUGIN_CONTINUE
}



Popraw to i dalej będziemy działać :)
  • +
  • -
  • 1


#139067 [Poradnik] AMXBans 6 "Jak i Co?" 2 + .PDF

Napisane przez Szyfrant w 27.05.2010 16:17

Dołączona grafika


'Szósteczka'



Wersja poradnika: v0.1

WERSJA W FORMACIE .PDF :Załączony plik  AMXBANS - Jak i Co 2 - AMXX - By Szyfrant.pdf   1,16 MB  2272 Ilość pobrań


Kolejna (już druga) odsłona poradnika "Jak i Co?" Nowy AMXBans ... Nowe funkcje... Nowy design... Ehh :D.
W miarę możliwości i czasu poradnik ten będzie aktualizowany.
Dobra bez gadania, lecimy z KONKRETAMI

Poradnik "Jak i Co? 'Szósteczka'" został stworzony dla AMXX.pl , KarczmaPodKepa.pl oraz Ciebie drogi użytkowniku.
By Szyfrant @ Al rajt rizerwt
Jak chcecie kopiować, proszę bardzo, ale nie zapomnijcie o stopce i autorze



1. Narzędzia Główne

Pasek nawigacji


Dołączona grafika

Menu Admina


Dołączona grafika


a ) Strefa Admina


Dołączona grafika


Dodaj bana On-Line

Dołączona grafika


Klikamy na "Podgląd" wcześniej przez nas wyypowanego.
Kolejnym Krokiem jest wybranie typu bana, powodu i czasu.
Namierzamy Gracza z listy i klikamy "Zbanuj". Jeśli chcemy, aby został wyrzucony natychmiastowo
klikamy dodatkowo "Wykop"




b ) Serwer


Dołączona grafika


Ustawienia Serwera(ów)


Dołączona grafika


Mogę co najwyżej krótko opisać.
1. RCON serwera Gry. niezbędny do zarządzania serwerem od strony WWW
2. MOTD - To co się pokazuje gdy ktoś dostanie bana :D
3. Opóźnienie MOTD - po jakim czasie wyświetli się MOTD
4. Można ustawić "Zestaw powodów banów" do danego serwera (o tym troszkę później).
5. Strefa czasowa -  Różnice w czasie na naszym globie :D
6. Możesz wysyłać komendy z poziomu WWW. Użyć można wcześniej zdefiniowanych bądź własnych
------------------------------



Zarządzanie Powodami Banów


Dołączona grafika


Dość ciekawe rozwiązanie :) Można się pobawić :D
W tej opcji możemy utworzyć Zestawy Powodów Banów.
Po stworzeniu możemy dodać powody i podpiąć pod serwer

1. Tworzymy nowy Zestaw. Posłużę się PRZYKŁADEM (Serwer AIM)
2. Dodajemy nowy powód, możemy dodać ile się nam podoba oraz "Statyczny Czas Bana" - [O tym później] (Konsekwentny w stosunku do Powodu).
3. Następnie klikamy na "Edytuj" koło naszego przykładowego zestawu
4. Ostatnim krokiem jest zaznaczenie, które powody chcemy dodać do danego zestawu
ZAPISUJEMY I GOTOWE ;]
------------------------------





Zarządzanie Adminami AMXModX


Dołączona grafika

1. Wpisujemy Nazwę Admina
2. Hasło Admina (Jeżeli mamy zamiar dać Admina na STEAM ID bądź IP nie musimy nic wpisywać. (Odczyt zależy od FLAG*)
3. Dodajemy Uprawnienia dostępu *
4. Wpisujemy Flagi. *
5. W tym wierszu wpisujemy to na co chcemy dać Admina (STEAM ID, IP, Nazwa
6. Nick Admina (Widoczny na liście Adminów)
7. Opcja do wyboru TAK/NIE. Wybieramy czy chcemy,aby dodany przez nas Admin był widoczny na Liście.
8. NASZE CUDO :D PEŁNA KONTROLA   :spadowa:
Ustawiamy na jaki czas Admin ma być aktywny. Możemy wybrać dowolną ilość dni, bądź zaznaczyć "Na Zawsze" -
(Nie Polecam - Haha   ^^   >D )
9. Zaznaczamy, do którego serwera Admin ma być przypisany. Można zaznaczyć kilka na raz.
10. Hmm, zapewne nie wiecie do czego służy lecz powiadam wam, że jest to opcja niezwykle niezwykła.
Przedstawię pewną sytuację:


Młody Admin: "KU***!!! Czitujesz !!! Masz PERMA CW**U!!

5 minut później

Młody Admin: KU*** !!! RASZUJESZ MASZ PERMA !!!


I teraz, aby zapobiec takim sytuacją stworzony został Statystyczny Czas Bana
Do każdego powodu (czytaj "Zarządzanie Powodami Banów) możemy dopisać Statystyczny Czas Bana.
Gdy zaznaczymy tą opcję, Admin nie będzie mógł samemu wpisać czasu bana tylko automatycznie do każdego powodu
będzie dopisany czas bana (Taki jaki ustawimy lub zostanie załadowany standardowy).

Sprytne co?  PEŁNA KONTROLA   :spadowa:  



*
Flagi i Zezwolenia Dostępu


Dołączona grafika


Ustawienia Admina na serwerze


Dołączona grafika

1. Wybieramy serwer i klikamy "Edytuj serwer"
2. Zaznaczamy czy admin ma być aktywny na serwerze
ZAPISUJEMY I WŁALA :D

------------------------------


c ) Strona


Dołączona grafika


Zarządzanie Administratorami na stronie


Dołączona grafika

1. Wpisujemy nazwę Admina
2. Podajemy E-Mail
3. Hasełko (SILNE :D)
4. Powtarzamy :D
5. Wybieramy Poziom. (O tym później)
6. Klikamy "Dodaj" ... No i można się logować do WWW z nowego konta

------------------------------


Zarządzanie Poziomami Administratorów na stronie

Dołączona grafika


Zarządzanie poziomami jest bardzo przydatne, jeżeli chcemy ograniczyć dostęp do pewnych funkcji Adminom WWW (NIE AMX'A)

Jak chcemy dodać nowy poziom klikamy na "Nowy poziom" i zaznaczamy opcje,
które chcemy aby były dostępne w danym poziomie. Klikam na "Zapisz"
GOTOWE

Nie będę opisywał opcji poziomów, gdyż jest to tylko kwestia wyboru TAK/NIE i wszystko jest wyraźnie ukazane.
------------------------------



Ustawienia menu użytkownika (Dla Zaawansowanych!!!)


Dołączona grafika


W tym menu możemy edytować nasz Pasek Nawigacji.
Zaznaczyłem kolorami okienka, które są odpowiednikami
Możemy dodać Nowy odnośnik np. Stronę Główną naszej sieci lub zmienić pozycję wyświetlania
Nie będę tego bliżej opisywać gdyż przy większym kombinowaniu, amatorzy (nie chce nikogo urazić) mogą sobie pousuwać menu :D Zaawansowani dadzą sobie z tym radę

------------------------------



Ustawienia strony


Dołączona grafika

Dołączona grafika

Nie ma co opisywać. Wybór opcji TAK/NIE. Wszystko jest jasno pokazane

------------------------------



2. Narzędzia Opcjonalne


d ) Inne


Dołączona grafika


Moduł Administracji


Dołączona grafika


Też nie ma co opisywać. Możemy włączyć/wyłączyć moduł(y) opcją "Aktywny"


Aktualizacja/Wersja


Dołączona grafika

Informacje dotyczące Wersji WWW i pluginu. Dodatkowo załączone Logi zmian :)


Logi


Dołączona grafika


Tutaj możemy usuwać/sprawdzać logi adminów WWW.

Zaczniemy od filtrowania logów:

1. Wybieramy Admina, którego chcemy "podglądnąć"
2. Następnie wybieramy Akcję, którą chcemy zobaczyć kiedy została wykonana
3. Klikamy na "Idź" i pokazuje nam Logi :)

Teraz Usuwanie
Są 2 Opcje:

4. Usuwanie wszystkich logów
5. Usuwanie logów starszych niż  "X" dni (W miejsce X wpisujemy liczbę dni, sprzed których mają być usunięte logi)




e ) Moduły

Dołączona grafika


Standardowo zamieszczony jest jeden moduł Import/Eksport. Więc omówimy tylko jego .


Import/Eksport

Możemy Importować lub Eksportować nasze dane do plików bądź bazy. Zarówno ze starej wersji i nowej .

Dołączona grafika
Dołączona grafika

W największym czerwonym kółeczku u góry znajdują się kopie zapasowe wcześniej przez nas utworzone. Możemy je pobrać na komputer lub usunąć :)

Zapis bazy jako plik sql.

1. Zapis tylko struktury czyli tylko tabeli
2. Usuwa tabele bazy
3. Usuwa całe wiersze. Po prostu nie będzie wyglądało ładnie :D
4. Jeśli zaznaczymy tą opcję Automatycznie otworzy nam się okienko do pobrania pliku

Zapis banów jako plik sql.

Zapisuje wszystkie bany w pliku sql.
5. Patrz pkt. 4.

Import z pliku banned.cfg

6. Wybieramy powód bana który ma być użyty przy imporcie.
7. Wpisujemy Nick zbanowanego gracza. ( Trochę to głupie)
8. Wpisujemy Serwer, tzn "Strona WWW lub Serwer Gry )
9. Data - Wiadomo :D
10. Wybieramy plik z banami  z naszego komputera (cfg.)
NO I IMPORTUJEMY!!

Import z bazy AMXBans 5.x

11. Wpisujemy Adres Hosta starej bazy AMXBansa
12. Następnie Nazwę Użytkownika
13. Potem Hasło
14. Nazwę bazy
15. Tabelę banów (Jeżeli baza była standardowo zainstalowana to najlepiej zostawić)
16. Jak zaznaczymy tą opcję, zostaną importowane tylko bany Permanentne.
17. Gdy zaznaczymy poprzednie bany zostaną usunięte.

Klikamy "Sprawdź połączenie", jeżeli wszystko dobrze klikamy "Import"

18. Jak zaznaczymy tę opcję, wszystkie bany poprzednio przez nas importowane zostaną USUNIĘTE.
19. Po zaznaczeni tej opcji Wszystkie bany będą "Chronione" przed importem.


Eksport do pliku banned.cfg


20. Eksportowane będą bany tylko Permamentne (Na Zawsze)
21. Po zaznaczeniu tej opcji do banów będą dodane ich Powody
22. Patrz pkt. 4.



------------------------------------------------------



Poradnik "Jak i Co? 'Szósteczka'" został stworzony dla AMXX.pl , KarczmaPodKepa.pl oraz Ciebie drogi użytkowniku.
By Szyfrant @ Al rajt rizerwt
Jak chcecie kopiować, proszę bardzo, ale nie zapomnijcie o stopce i autorze


  • +
  • -
  • 86


#115227 Przyciaganie

Napisane przez QTM. Peyote w 27.02.2010 23:03

Ja znalazłem 2 sposoby.

1. Przyciąga równomiernie jeżeli dystans mniejszy niż 900.
#include <amxmodx>
#include <engine>

new Float:przyciaganie[3]


public plugin_init() 
{
	register_plugin("Przyciaganie", "0.0", "Peyote")
	register_clcmd("say /przyciaganie", "zaznacz")
}


public client_PreThink(id)
{

	new Float:origin[3]
	new Float:velocity[3]
	entity_get_vector(id, EV_VEC_origin, origin)
	new Float:distance = get_distance_f(origin,przyciaganie)
	entity_get_vector(id, EV_VEC_velocity, velocity)
	if(distance < 900.0)
	{
		for(new i=0;i<=2;i++)
		{
			velocity[i] += (origin[i] > przyciaganie[i])?-7.0:7.0
		}
		entity_set_vector(id, EV_VEC_velocity, velocity)
	}
}


public zaznacz(id)
{
	entity_get_vector(id, EV_VEC_origin, przyciaganie)
}

2. Siła przyciągania zależna jest od dystansu. Kiedy się oddalamy szybko spada. Kiedy jesteśmy w punkcie przyciągania bardzo trudno się wydostać i powstają "turbulencje".

#include <amxmodx>
#include <engine>

new Float:przyciaganie[3]


public plugin_init() 
{
	register_plugin("Przyciaganie", "0.0", "Peyote")
	register_clcmd("say /przyciaganie", "zaznacz")
}


public client_PreThink(id)
{

	new Float:origin[3]
	new Float:velocity[3]
	entity_get_vector(id, EV_VEC_origin, origin)
	new Float:distance = get_distance_f(origin,przyciaganie)
	entity_get_vector(id, EV_VEC_velocity, velocity)
	for(new i=0;i<=2;i++)
	{
		velocity[i] += ((origin[i] > przyciaganie[i])?-1000.0:1000.0) / distance
	}
	entity_set_vector(id, EV_VEC_velocity, velocity)
}


public zaznacz(id)
{
	entity_get_vector(id, EV_VEC_origin, przyciaganie)
}

Mnie bardziej przypadła wersja pierwsza ;]
  • +
  • -
  • 1


#105830 Niezwykły bunny hop

Napisane przez naven w 16.01.2010 21:56

człowieku tego bunny hopa to ja mam ale potrzebuje, zeby plugin byl wlaczony, a jak gracz wpisze jakas komende np /bh lub /autobh plugin dla niego wylaczy sie a jak ponownie to wpisze to plugin sie wlacza, ale dzięki za chec pomocy, ale to nie to.

I znowu zaczyna się zrzynanie pomysłów. Napisz sobie -_-
  • +
  • -
  • 0