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
 

Mamorr - zdjęcie

Mamorr

Rejestracja: 16.08.2011
Aktualnie: Nieaktywny
Poza forum Ostatnio: 20.02.2014 18:38
*****

#477125 Informacje wstępne, czyli Jak zacząć Scripting AMXX

Napisane przez Gość w 09.11.2012 19:47

Tutorial dla początkujących
Informacje wstępne
Scripting AMXX


[kotwica='cel']Cel[/kotwica]
Nauka tworzenia pluginów AMXX

Wymagania
  • Znajomość obsługi AMXX
  • Umiejętność programowania
  • Podstawowa znajomość Pawna
  • Racjonalne tworzenie algorytmów
  • Umiejętność korzystania z manuala
  • Edytor Pawna wraz z kompilatorem AMXX
[kotwica='wstep']Wstęp[/kotwica]
Na samym początku zadajmy sobie pytanie: czym są pluginy AMXX i jak działają.

Pluginy AMXX to algorytmy modyfikacji rozgrywki na serwerach HLDS, pisane w języku Pawn,
zrozumiałym dla ludzi i zapisywane pod postacią plików SMA, które w wyniku kompilacji przybierają
postać kodu niezrozumiałego dla człowieka, ale zrozumiałego dla AMXX, zapisywane pod postacią
plików AMXX, które komunikują się z serwerem HLDS poprzez Metamoda:P, zmieniając rozgrywkę.

[kotwica='istota']Istota[/kotwica]
Tym samym, plugin komunikuje się z Metamodem:P, a Metamod:P z silnikiem gry (serwerem HLDS).
Musimy pamiętać, że każda wymiana informacji pomiędzy serwerem a silnikiem gry, zużywa liczne
zasoby sprzętowe i należy zadawać możliwie jak najmniej zapytań do silnika gry poprzez Metamoda:P.

[kotwica='plugins_ini']Plugins.ini[/kotwica]
Plik plugins.ini zawiera listę pluginów, które zostaną załadowane do AMXX i będą wykonywać swoje
algorytmy, komunikując się z serwerem HLDS poprzez MetaModa:P, modyfikując przebieg gry.

Jednak kolejność pluginów wpisanych w pliku plugins.ini nie jest bez znaczenia.
Zwróćmy teraz uwagę na sposób działania AMXX, czyli interakcję z serwerem gry.
AMXX pozwala nam, poprzez MetaModa:P, na następujące operacje:
  • Zarejestrowanie danego zdarzenia czy wartości (np. odczytanie liczby pieniędzy danego gracza, czy zaobserwowanie wybuchu bomby)
  • Modyfikowanie danego zdarzenia czy wartości (np. zmiana punktów życia danego gracza, czy przedłużenia czasu trwania oślepienia)
  • Zablokowanie danego zdarzenia czy usunięcie wartości (np. brak obrażeń od granatów, czy usunięcie limitu posiadanych dolarów)
  • Wywołanie danego zdarzenia (np. zabicie gracz, teleportacja gracza na respawn wrogów, czy pozbawienie gracza jego broni)
  • Tworzenie danego zdarzenia czy wartości (np. zabicie vipa lub ucieczka terrorystów, czy stworzenie nowych cvarów)
Tym samym, poszczególne pluginy mogą być od siebie zależne, a ich kolejność ma znaczenie.
Należy zatem zwracać uwagę na kolejność pluginów w pliku plugins.ini, przy czym algorytmy
kolejnych pluginów, od góry pliku plugins.ini, wykonywane są proporcjonalnie sekwencyjnie.

Przykładowo, jeśli w pluginie pierwszym od góry pliku plugins.ini, zablokujemy możliwość mówienia,
to w pluginie drugim od góry, nie zostanie zarejestrowane powiedzenie na sayu określonej wartości.
W odwrotnej kolejności tych pluginów w pliku plugins.ini zaś, będzie to z kolei możliwe do wykonania.

[kotwica='AMXMODX']AMXMODX[/kotwica]
Pierwszą, podstawową biblioteką, jaką będziemy musieli załączyć do naszego pluginu, jest AMXMODX.
W tym celu, dodajemy na samej górze naszego kodu SMA następującą linijkę kodu
#include <amxmodx>


AMXX posiada parę publicznych, predefiniowanych funkcji, a oto one:

[kotwica='plugin_natives']plugin_natives[/kotwica]
Ta funkcja wywoływana jest jako pierwsza, tuż po załadowaniu pluginu do pamięci AMXX.
W niej należy zainicjować wszelkie natywy do współpracy z innymi pluginami, czyli sprawić,
by możliwa była kompleksowa komunikacja pomiędzy funkcjami poszczególnych pluginów.

Jak już pisałem, funkcje ładowane są kolejno, od góry pliku plugins.ini, tak więc kolejność jest istotna.

[kotwica='plugin_precache']plugin_precache[/kotwica]
Ta funkcja wywoływana jest po załadowaniu wszytkich pluinów z natywami, lecz jeszcze przed pełnym zainicjowaniem
serwera HLDS i to w niej należy zarejestrować wszelkie wymagane do pobrania przez Użytkowników pliki niestandardowe,
z których będzie korzystał plugin, by powiadomić klienta gry o konieczności pobrania tych plików przed ustaleniem połączenia.

W tej właśnie funkcji należy zarejestrować wszelkie modyfikatory skryptów startowych serwera HLDS, by móc
w nie ingerować, zanim zostaną załadowane i wykonane skrypty startowe, uniemożliwiając ich identyfikację.

[kotwica='plugin_init']plugin_init[/kotwica]
Ta funkcja wywoływana jest podczas inicjalizacji pluginu, po pełnym załadowaniu funkcji startowych serwera.
W tej funkcji należy zarejestrować nasz plugin przy użyciu funkcji register_plugin o następujących parametrach
register_plugin(const plugin_name[], const version[], const author[])

Warto zidentyfikować plugin w celu późniejszego testowania stanu pluginu i odnalezienia go na liście pluginów.
Składnia argumentów funkcji nie wymaga chyba większego komentarza, w przypadku wątpliwości zapraszam do manuala.

[kotwica='przyklad']Przykład[/kotwica]
Na tym etapie, potrafimy już stworzyć i zarejestrować pierwszy plugin, nie robiący praktycznie nic.
#include <amxmodx>

public plugin_init(){
register_plugin("Nauka AMXX", "0.1", "benio101");
}
Przypomnijmy, w pierwszej linijce zaimportowaliśmy wymaganą zawsze dla AMXX, bibliotekę amxmodx.
W trzeciej linijce zainicjowaliśmy publiczną funkcję plugin_init, wykonywaną po pełnym załadowaniu skryptów startowych HLDS.
Przypominam, że funkcja plugin_init winna być funkcją publiczną, inaczej może nie zostać ona wykonana w oczekiwanym momencie.
W czwartej linijce, rejestruję plugin i na tym kończy się działanie naszego testowego pluginu, który praktycznie nie zmienia rozgrywki.

W funkcji plugin_init należy także zarejestrować wszelkie nasłuchiwacze zdarzeń, jak śmierć gracza, czy nowa runda.

[kotwica='plugin_cfg']plugin_cfg[/kotwica]
Ta funkcja wywoływana jest tuż po plugin_init i służy konfiguracji pluginu, m.in. pobraniu zmiennych globalnych z silnika gry,
ustanowieniu połączenia z bazą danych, czy pobrania innych, istotnych danych do współpracy pluginu z zasobami zewnętrznymi.

[kotwica='register_event']register_event[/kotwica]
Pierwsza z funkcji, którą poznamy, pozwala na przechwycenie wybranych zdarzeń, które dokonywane są na serwerze.
Tutaj odwołuję do niezwykle istotnej strony, na której wypisane są zdarzenia silnika HLDS wraz z argumentami:

Half-Life 1 Game Events

Teraz spróbujemy przechwycić funkcję śmierci, w tym celu musimy zarejestrować w funkcji plugin_init nasłuchiwacz tego zdarzenia
register_event("DeathMsg", "DeathMsg", "a");
Pierwszy parametr, zgodnie z dokumentacją, oznacza nazwę zdarzenia.
Drugi parametr oznacza funkcję publiczną, która będzie wywoływana w momencie wystąpienia tego zdarzenia. Trzeci parametr
wynosi "a", gdyż DeathMsg jest eventem globalnym. Tym samym utworzymy sobie funkcję publiczną DeathMsg i damy zabójcy 200$.

[kotwica='read_data']read_data[/kotwica]
Jak możemy wyczytać z powyższego linku, DeathMsg posiada cztery argumenty. Nam wystarczy pierwszy argument, czyli id zabójcy.
public DeathMsg(){
	new killer=read_data(1);
}
Funkcja DeathMsg wywoływana jest w momencie wystąpienia zdarzenia śmierci.
Za pomocą funkcji read_data możemy odczytać dany parametr funkcji, ponieważ pierwszy argument
to numer identyfikacyjny zabójcy, ten właśnie numer pobierzemy i zapiszemy do nowo utworzonej zmiennej killer.
Teraz będziemy chcieli nagrodzić zabójcę, przekazując mu dodatkowe 200 dolarów za zabójstwo.
W tym celu, skorzystamy z funkcji z biblioteki cstrike, cs_set_user_money.

[kotwica='import_biblioteki']Import biblioteki[/kotwica]
Aby móc skorzystać z tej funkcji, musimy najpierw zaimportować kolejną bibliotekę,
w tym celu dodajemy do naszego kodu następującą linijkę (najlepiej pod bilioteką amxmodx)
#include <cstrike>
Przypomnijmy, jak powinien wyglądać nasz obecny, pełny kod:
#include <amxmodx>
#include <cstrike>

public plugin_init(){
register_plugin("Nauka AMXX", "0.1", "benio101");

register_event("DeathMsg", "DeathMsg", "a");
}

public DeathMsg(){
new killer=read_data(1);
}


[kotwica='sprawdzenie_obecnosci_gracza']Sprawdzenie obecności gracza[/kotwica]
Teraz dochodzimy do niezwykle istotnej rzeczy, którą musisz zapamiętać raz na zawsze!
Operując na jakimkolwiek graczu, upewnij się, że gracz może zostać danej operacji poddany.
W przykładzie, chcemy dodać pieniądze graczowi, jednak zanim to zrobimy, musimy się upewnić,
czy gracz jest jeszcze na naszym serwerze. Zawsze mógł rzucić granat, wyjść z serwera, a opiero po chwili
nastąpi zdarzenie śmierci. Co się stanie przy próbie dodania pieniędzy graczowi, którego nie ma na serwerze?
Na pewno jest to niepotrzebne zapytanie do silnika gry, dużo większe zużycie zasobów sprzętowych, a także stale
powiększające się logi błędów. Na dłuższą metę, takie właśnie błędy skutkują dużymi lagami bądź crashami serwera.

Tym samym, użyjemy funkcji is_user_connected, w celu sprawdzenia, czy gracz jest jeszcze na serwerze.
Pamiętajmy, że aktualnie killer reprezentuje numer identyfikacyjny zabójcy, jednak w różnych funkcjach, możemy różnie
identyfikować poszczególne byty czy zdarzenia. Przy okazji, każdy byt na mapie ma swój własny, unikalny numer identyfikacyjny,
jednakże numerem identyfikacyjnym gracza jest numer z zakresu od 1 do maksymalnej liczby graczy włącznie. Tym samym, numer
bytu, będący większy lub równy 1 i nie większy, niż maksymalna liczba graczy na serwerze, oznacza na pewno gracza. (niekoniecznie online!)

public DeathMsg(){
new killer=read_data(1);
if(is_user_connected(killer)){
// Dodawanie pieniedzy
}
}
Teraz skorzystamy z natywów biblioteki cstrike i dodamy zabójcy 200 dolarów.
cs_set_user_money(killer, cs_get_user_money(killer) + 200);

Jak można zauważyć, nie mamy wprost funkcji dodającej pieniądze. W związku z tym,
musimy jako drugi parametr funkcji cs_set_user_money podać sumę 200
i obecnej liczby dolarów gracza, pobieranej przy użyciu funkcji cs_get_user_money

[kotwica='zwracana_wartosc']Zwracana wartość[/kotwica]
W nowo utworzonej funkcji DeathMsg, zwrócimy na końcu odpowiednią wartość.
Dostępne wartości do zwrócenia:

PLUGIN_CONTINUE
Domyślna wartość, przerywająca dalsze wywołanie funkcji, jednak przez każdy inny plugin, a także silnik gry,
zdarzenie zostanie wywołane. Po prostu nic niżej od tego polecenia nie zostanie wywołane w tej danej jednej funkcji.

PLUGIN_HANDLED_MAIN
Dalsze wywołanie funkcji nie będzie możliwe, podobnie, jak w przypadku PLUGIN_CONTINUE, dalej wszystkie
pluginy będą mogły odnotować tę funkcję, jednak event ten zostanie zablokowany dla silnika właściwego gry.

PLUGIN_HANDLED
Dalsze wywoływanie funkcji zostanie przerwane, a ani silnik gry nie odnotuje tego eventu, ani, w przeciwieństwie
do PLUGIN_HANDLED_MAIN, żaden z kolejnych pluginów, wypisanych poniżej od tego obecnego w plugins.ini.

Nam wystarczy PLUGIN_CONTINUE, bowiem nie chcemy blokować śmierci w silniku, ani pozbawiać informacji o śmierci
kolejnych pluginów. Na koniec zmienimy nazwę pluginu na odzwierciedlającą rzeczywiste zastosowanie pluginu. Gotowy kod:
#include <amxmodx>
#include <cstrike>

public plugin_init(){
register_plugin("Dodatkowe 200 dolarow za zabojstwo", "0.1", "benio101");

register_event("DeathMsg", "DeathMsg", "a");
}

public DeathMsg(){
new killer=read_data(1);
if(is_user_connected(killer)){
cs_set_user_money(killer, cs_get_user_money(killer) + 200);
}
return PLUGIN_CONTINUE;
}

Tym samym, właśnie napisaliśmy swój pierwszy plugin, który daje dodatkowe 200 dolarów za zabójstwo.


Tutorial napisany, choć z drobnym opóźnieniem, z okazji Światowego Dnia Jakości.
Jeśli przypadnie on Wam do gustu, to mogę pokusić się w wolnym czasie o napisanie kolejnych
części, jako kontynuację, z rozwinięciem wątku i coraz bardziej zaawansowanymi przykładami Scriptingu.


#609867 [ROZWIĄZANE] 10% szans na otrzymaniu broni na spawnie.

Napisane przez Gość w 27.01.2014 17:50

Pozwolę sobie najpierw nieco posprzątać kod:

#include <amxmodx>
#include <HamSandwich>
#include <Fakemeta>

new fm_give_item

public plugin_init()
{
	register_plugin("szansa_na_bron", "1.0", "czy-bit")
	RegisterHam(Ham_Spawn, "player", "Fw_PlayerSpawnPost", 1)
}

public Fw_PlayerSpawnPost(id)
{
	if(random_num(1 , 10) == 1)
	is_user_alive(id)
	fm_give_item(id, "weapon_hegrenade"); //Gracz ma 10% szans aby otrzymac granat wybuchowy
		client_print(id, print_chat, "Dostales granata!")
	
	return HAM_HANDLED
}

Warunek:

if(random_num(1 , 10) == 1)

można zapisać prościej i wydajniej przy użyciu funkcji random, która idealnie się nadaje do szans procentowych:

if(!random(10))

 
Przyjrzyjmy się następującym linijkom:

	if(!random(10))
	is_user_alive(id)
	fm_give_item(id, "weapon_hegrenade"); //Gracz ma 10% szans aby otrzymac granat wybuchowy
		client_print(id, print_chat, "Dostales granata!")

Po sprawdzeniu ifem szansy procentowej, wykonujesz drugi warunek, ale już poza ifem i jako funkcję.
Drugi warunek, mianowicie is_user_alive winien być wewnątrz ifa, w tym przypadku połączony z poprzednim koniunkcją:

	if(!random(10) && is_user_alive(id)){
		fm_give_item(id, "weapon_hegrenade"); //Gracz ma 10% szans aby otrzymac granat wybuchowy
		client_print(id, print_chat, "Dostales granata!");
	}

Korzystając z funkcji biblioteki fakemeta_util, fm_give_item, nie możesz stworzyć zmiennej o nazwie identycznej do nazwy funkcji, z której korzystasz, która to zmienna jest zresztą zbędna.

Dodatkowo, musisz zmienić nagłówek, by nie załączać fakemeta, lecz wspomnianą fakemeta_util, z której to korzystasz.

 

Ostatecznie, kod winien przyjąć postać typu:

#include <amxmodx>
#include <fakemeta_util>
#include <HamSandwich>

public plugin_init()
{
	register_plugin("szansa_na_bron", "1.0", "czy-bit")
	RegisterHam(Ham_Spawn, "player", "Fw_PlayerSpawnPost", 1)
}

public Fw_PlayerSpawnPost(id)
{
	if(!random(10) && is_user_alive(id)){
		fm_give_item(id, "weapon_hegrenade"); //Gracz ma 10% szans aby otrzymac granat wybuchowy
		client_print(id, print_chat, "Dostales granata!");
	}
	
	return HAM_HANDLED
}



#531149 Rownomierne rozkladanie punktow statystyk

Napisane przez MateuszKuCi w 03.04.2013 20:37

trzymaj sprawdz. (bedzie działać :))

Załączone pliki


  • +
  • -
  • 1


#530791 QTM_codmod 2 perki, wytrzymalosc perkow, colorchat

Napisane przez lukas72 w 02.04.2013 07:25

ja mam sory za nazwe ale mam taki bałagan na kompie ...

Załączone pliki


  • +
  • -
  • 1


#209383 Dodawanie frakcji - 2 sposoby

Napisane przez Cypis' w 25.01.2011 21:21

Frakcje czytane z pliku cod_frakcje.ini w configs.

Jak zainstlować:
Gotowiec:
Spoiler

Edytacja Silnika:
Spoiler


Instrukcja jak dodac frakcje:
Spoiler

  • +
  • -
  • 139


#412723 [ROZWIĄZANE] Statystyki POD shoutboxem

Napisane przez Ojciec Dyrektor w 20.05.2012 19:29

<!-- BEGIN switch_enable_board_msg_index -->
<div id="hm" style="display: ''; position: relative;">
<table width="100% class="forumline" cellspacing="1" cellpadding="3" border="0" align="center">
<tr>
<th class="thCornerL" height="25" nowrap="nowrap" onclick="javascript:ShowHide('hm','hm2','hm3');" style="cursor: pointer" title="{L_VHIDE}">&nbsp;{L_BOARD_MSG}&nbsp;</th>
</tr>
<tr>
<td class="row1"><span class="gen">{BOARD_MSG}</span></td>
</tr>
</table>
</div>
<div id="hm2" style="display: none; position: relative;">
<table width="100%" class="forumline" cellspacing="1" cellpadding="3" border="0" align="center">
<tr>
<th class="thCornerL" height="25" nowrap="nowrap" onclick="javascript:ShowHide('hm','hm2','hm3');" style="cursor: pointer">&nbsp;{L_BOARD_MSG}&nbsp;</th>
</tr>
</table>
</div>
<script language="javascript" type="text/javascript">
<!--
if(GetCookie('hm3') == '2') ShowHide('hm', 'hm2', 'hm3');
//-->
</script>
<!-- END switch_enable_board_msg_index -->
<!-- BEGIN custom_registration -->
<form method="post" action="{S_PROFILE_ACTION}">
<table width="100%" cellpadding="1" cellspacing="0" border="0" class="forumline">
<tr>
<td>
<table width="100%" cellpadding="3" cellspacing="0" border="0" class="forumline">
<tr>
<td class="catHead" colspan="7" height="28"><span class="cattitle">&nbsp;{L_REGIST_TITLE}</span></td>
</tr>
<tr>
<td class="row15" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{L_USERNAME}:</span></td>
<td class="row15" align="left" valign="middle"><input type="text" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="username" size="25" maxlength="20" value=""></td>
<td class="row15">&nbsp;</td>
<td class="row15" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{L_PASSWORD}:</span></td>
<td class="row15" align="left" valign="middle"><input type="password" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="new_password" size="25" maxlength="100" value=""></td>
<td nowrap class="row1" align="left" valign="middle">
<!-- BEGIN gender_box -->
<span class="gensmall">&nbsp;{L_GENDER}: {L_FEMALE}<input type="radio" name="gender" value="2"> {L_MALE}<input type="radio" name="gender" value="1"></span>
<!-- END gender_box -->
<!-- BEGIN validation -->
<img src="{VALIDATION_IMAGE}" width="95" height="20" border="0" alt="">&nbsp;
<input type="text" class="post" onFocus="Active(this); this.value=''" onBlur="NotActive(this)" name="reg_key" maxlength="4" size="4" value="{L_CODE}">&nbsp;&nbsp;&nbsp&nbsp;
<!-- END validation -->
</td>
<td class="row15" width="100%"></td>
</tr>
<tr>
<td class="row15" align="left" valign="middle"><span class="gensmall">{L_CONFIRM_PASSWORD}:</span></td>
<td class="row15" align="left" valign="middle"><input type="password" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="password_confirm" size="25" maxlength="100" value=""></td>
<td class="row15">&nbsp;</td>
<td class="row15" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{L_EMAIL}:</span></td>
<td class="row15" align="left" valign="middle"><input type="text" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="email" size="25" maxlength="255" value=""></td>
<td class="row15" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{CUSTOM_FIELDS}{S_HIDDEN_FIELDS}
<input type="submit" name="submit" value="{L_RSSUBMIT}" class="liteoption"></span></td>
<td class="row15" width="100%"></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<!-- END custom_registration -->
<!-- BEGIN switch_user_logged_out -->
<form method="post" action="{S_LOGIN_ACTION}">
<!-- END switch_user_logged_out -->
<table width="100%" cellspacing="1" cellpadding="3" border="0" align="center">
<tr>
<td align="left" valign="bottom"><span class="gensmall">
<!-- BEGIN switch_user_logged_in -->
{LAST_VISIT_DATE}<br>
<!-- END switch_user_logged_in -->
{CURRENT_TIME}<br></span><span class="nav"><a href="{U_INDEX}" class="nav">{L_INDEX}</a>{NAV_CAT_DESC}</span></td>
<td align="right" valign="bottom" class="gensmall">
<!-- BEGIN switch_user_logged_in -->
<a href="{U_SEARCH_SELF}" class="gensmall">{L_SEARCH_SELF}</a><br>
<!-- END switch_user_logged_in -->
<a href="{U_SEARCH_UNANSWERED}" class="gensmall">{L_SEARCH_UNANSWERED}</a>
<br>
<!-- BEGIN switch_unread -->
<a href="{U_SEARCH_NEW}" class="gensmall">{L_SEARCH_NEW} [{COUNT_NEW_POSTS}]</a> &laquo;&raquo;
<!-- END switch_unread -->
<!-- BEGIN switch_user_logged_in -->
<a href="{U_SEARCH_LASTVISIT}" class="gensmall">{L_SEARCH_LASTVISIT}</a>
<!-- END switch_user_logged_in -->
<!-- BEGIN switch_user_logged_out -->
<span class="gensmall"><input class="post" onFocus="Active(this); this.value=''" onBlur="NotActive(this)" type="text" name="username" size="8" value="nick"/>&nbsp;<input class="post" onFocus="Active(this); this.value=''" onBlur="NotActive(this)" type="password" name="password" value="1111111" size="8">
<!-- BEGIN switch_allow_autologin -->
<input class="text" type="checkbox" name="autologin">
<!-- END switch_allow_autologin -->
<input type="submit" class="liteoption" name="login" value="{L_LOGIN}"></span>
<!-- END switch_user_logged_out -->
</td>
</tr>
</table>
<!-- BEGIN switch_user_logged_out -->
</form>
<!-- END switch_user_logged_out -->
{BOARD_INDEX}
<form method="post" action="{T_SELECT_ACTION}" name="quickchange">
<table width="100%" cellspacing="1" border="0" align="center" cellpadding="3">
<tr>
<td align="left"><span class="gensmall">
<!-- BEGIN switch_user_logged_in -->
<a href="{U_MARK_READ}" class="gensmall">{L_MARK_FORUMS_READ}</a>
<!-- END switch_user_logged_in -->
</span></td>
<td align="right"><span class="gensmall">[ <a href="javascript:void(0);" OnClick="window.open('{U_PREFERENCES}', 'WindowOpen', 'HEIGHT=500,resizable=yes,scrollbars=yes,WIDTH=380');" style="text-decoration: none;">{L_PREFERENCES}</a> ]&nbsp;
<!-- BEGIN change_style -->
{change_style.L_CHANGE_STYLE}:
{change_style.TEMPLATE_SELECT}
<!-- END change_style -->
</span></td>
</tr>
</table>
</form>
<!-- BEGIN custom_registration_bottom -->
<form method="post" action="{S_PROFILE_ACTION}">
<table width="100%" cellpadding="1" cellspacing="0" border="0" class="forumline">
<tr>
<td>
<table width="100%" cellpadding="3" cellspacing="0" border="0" class="forumline">
<tr>
<td class="catHead" colspan="7" height="28"><span class="cattitle">&nbsp;{L_REGIST_TITLE}</span></td>
</tr>
<tr>
<td class="row1" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{L_USERNAME}:</span></td>
<td class="row1" align="left" valign="middle"><input type="text" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="username" size="25" maxlength="20" value=""></td>
<td class="row1">&nbsp;</td>
<td class="row1" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{L_PASSWORD}:</span></td>
<td class="row1" align="left" valign="middle"><input type="password" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="new_password" size="25" maxlength="100" value=""></td>
<td nowrap class="row1" align="left" valign="middle">
<!-- BEGIN gender_box -->
<span class="gensmall">&nbsp;{L_GENDER}: {L_FEMALE}<input type="radio" name="gender" value="2"> {L_MALE}<input type="radio" name="gender" value="1"></span>
<!-- END gender_box -->
<!-- BEGIN validation -->
<img src="{VALIDATION_IMAGE}" width="95" height="20" border="0">&nbsp;
<input type="text" class="post" onFocus="Active(this); this.value=''" onBlur="NotActive(this)" name="reg_key" maxlength="4" size="4" value="{L_CODE}">&nbsp;&nbsp;&nbsp&nbsp;
<!-- END validation -->
</td>
<td class="row1" width="100%"></td>
</tr>
<tr>
<td class="row1" align="left" valign="middle"><span class="gensmall">{L_CONFIRM_PASSWORD}:</span></td>
<td class="row1" align="left" valign="middle"><input type="password" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="password_confirm" size="25" maxlength="100" value=""></td>
<td class="row1">&nbsp;</td>
<td class="row1" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{L_EMAIL}:</span></td>
<td class="row1" align="left" valign="middle"><input type="text" class="post" onFocus="Active(this)" onBlur="NotActive(this)" style="width:120px" name="email" size="25" maxlength="255" value=""></td>
<td class="row1" align="left" valign="middle" nowrap="nowrap"><span class="gensmall">{CUSTOM_FIELDS}{S_HIDDEN_FIELDS}
<input type="submit" name="submit" value="{L_RSSUBMIT}" class="liteoption"></span></td>
<td class="row1" width="100%"></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<br>
<!-- END custom_registration_bottom -->
<br clear="all">
{SHOUTBOX_DISPLAY}<!-- BEGIN disable_viewonline -->
<table width="100%" cellpadding="3" cellspacing="0" border="0" class="forumline">
<tr>
<td id="bri" colspan="2" height="28"><span class="cattitle"><a href="{U_VIEWONLINE}" class="cattitle" title="{L_VIEW_DETAILED}"><center>Statystyki</center></a></span></td>
</tr>
<tr>
<td class="row6" align="center" valign="middle" rowspan="6">
<img src="templates/minecraft_style/images/whoisonline.png" width="93" height="176" alt="" border="0" margin="0"></td>
<td class="row7" align="left" width="100%">
<span class="gensmall">{TOTAL_POSTS}<br>{TOTAL_USERS}<br>{NEWEST_USER}{COUNTER}</span></td>
</tr>
<tr>
<td class="row8" align="left">
<span class="gensmall">{TOTAL_USERS_ONLINE}<br>{LOGGED_IN_USER_LIST}</br>Legendy :
<!-- BEGIN staff_explain -->
<a href="{disable_viewonline.staff_explain.U_GROUP_URL}" class="gensmall" style="color: #{disable_viewonline.staff_explain.GROUP_COLOR}{disable_viewonline.staff_explain.GROUP_STYLE}">{disable_viewonline.staff_explain.GROUP_PREFIX}{disable_viewonline.staff_explain.GROUP_NAME}</a>
<!-- BEGIN se_separator -->
&bull;
<!-- END se_separator -->
<!-- END staff_explain -->
</br>{RECORD_USERS}
</span></td>
</tr>

</table>
<table width="100%" cellpadding="1" cellspacing="1" border="0">
<tr>
<td align="left" valign="top"><span class="gensmall">{L_ONLINE_EXPLAIN}</span></td>
</tr>
</table>
<!-- END disable_viewonline -->

spróbuj
  • +
  • -
  • 1


#412115 [ROZWIĄZANE] Dodatkowe pole pod avatarem.

Napisane przez QuahodronN w 19.05.2012 10:25

A jak zmienić to "Skąd" na Lokalizacja? W panelu admina się nie da.

Musisz wejść na ftp i w languages/lang_polish/lang_main.php wyszukujesz sobie Skąd i zmieniasz na lokalizacja
  • +
  • -
  • 1


#393350 [ROZWIĄZANE] Gdzie zmienić zapisywanie się odznak?

Napisane przez IndeS w 07.04.2012 16:26

w amxx.cfg

// Rank mode
// 0 - by nick
// 1 - by authid
// 2 - by ip
//
// Default value: 1
csstats_rank 0


a tak nawiasem mowiac to zapis odznak jest zupelnie inny niz ranku ale to swoja droga :)
  • +
  • -
  • 1


#393128 [ROZWIĄZANE] Kolorowe napisy na say-u.

Napisane przez IndeS w 07.04.2012 12:27

Nie dasz rady żeby wszystkiem robiło na niebiesko.
Do wyboru masz:

^x01 //normalny
^x04 // zielony
^x03 // teamu

wstawiasz przed tym gdzie ma byc zmieniony np.

^x01 tu bedzie zółty ^x04 od tąd zielony ^x03 a tu niebieski dla ct a czerwony dla tt


A kolega wyżej jak ma głupoty pisać niech nie pisze wcale!
  • +
  • -
  • 1


#390573 [ROZWIĄZANE] Odznaka bf2.

Napisane przez Fili:P w 03.04.2012 14:50

if ((roundkills[0]>5) && (roundkills[3]>3) && (totalkills[id]>3999))

Znaczy:
Jeżeli(Zabijesz ponad 6 graczy w rundzie, zabijesz ponad 3 osoby ze swojej drużyny i będziesz miał ponad 3999 fragów


Czyli to:
(roundkills[3]>3)

Odpowiada za teamkill.
Jakby co to:
0 - kills
1 - deaths
2 - headshots
3 - teamkilling
4 - shots
5 - hits
6 - damage

  • +
  • -
  • 1