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
 

darkman - zdjęcie

darkman

Rejestracja: 12.01.2008
Aktualnie: Nieaktywny
Poza forum Ostatnio: 30.10.2012 13:14
-----

#44262 Blokada latarki

Napisane przez darkman w 18.02.2009 11:53

Wiem, że istnieje coś takiego jak cvar mp_flashlight, ale napisałem to dla innych skrypterów, którzy chcą to użyć do innych celów. Kod:

#include <amxmodx>
#include <fakemeta>

public plugin_init()
{
	register_plugin("Block flashlight", "1.0", "darkman");
	register_forward(FM_CmdStart, "fwdCmdStart");
}

public fwdCmdStart(id, uc_handle, seed )
{
	if(get_uc(uc_handle, UC_Impulse) == 100)
	{
		set_uc(uc_handle, UC_Impulse, 0);
		return FMRES_HANDLED;
	}
	return FMRES_IGNORED;
}

Blokuje używanie latarki, postaram sie jeszcze usunąć jej sprite.
  • +
  • -
  • 1


#41488 Jak napisac plugin ?

Napisane przez darkman w 07.02.2009 17:49

każdy bez podstaw c++, kto spotka sie z pawnem i przeczyta ten temat bedzie wiedzial tyle co przed przeczytaniem go. strasznie ogolnie napisane. 2/5.
  • +
  • -
  • 5


#38991 Zmienne - Co I Jak?

Napisane przez darkman w 30.01.2009 15:57

Po pierwsze - co to jest zmienna? Najprościej ujmując zmienna jest to obszar ulokowany w pamięci komputera przechowywujący dane różnego typu np. index gracza, informacje o aktualnej broni, życiu, armor etc. Można na nich wykonywać przeróżne operacje np. pre/post de/inkrementacja(zwiększenie/zmniejszenie o 1) dodawanie, mnożenie, dzielenie, odejmowanie itp. Przy ich tworzeniu automatycznie ustawiane są na 0( nie przechowywują żadnych danych, są po prostu puste) chyba, że zechcemy inaczej dopisując po nazwie "= wartość".

----------------------------------------------------------------------------------------------------------------------------------
Tworzeniu zmiennych są przypisane trzy pojęcia, mianowicie:

Deklaracja:
Po prostu utworzenie zmiennej, bez nadawania jej wartości:
new zmienna;

Inicjacja:
Pierwsze przypisanie wartości do zmiennej po jej utworzeniu:
new zmienna;
zmienna = 1;

Definicja:
Jednoczesne zadeklarowanie i zainicjowanie zmiennej:
new zmienna = 2;

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

W Pawnie można spotkać następujące typy zmiennych:

Integer:
Zmienna przechowywująca dowolne liczby całkowite np. 1, 2, 124, 553562 i wszystkie inne.
Ich deklaracja jest bardzo prosta:
new zmienna;

Float:
Zmienna przechowywująca liczby zmiennoprzecinkowe np. 3.5, 7.0, 2.1.
Deklaracja:
new Float:zmienna

String:
Zmienna przechowywująca string - ciąg znaków. Po nazwie wystarczy dodać dwa nawiasy(lub więcej w zależności jaką tablice chcemy stworzyć)
Deklaracja:
new zmienna[ilosc_znakow_tablicy];

Bool:
Tzw. zmienna logiczna, która przechowuje tylko wartość true(1), lub false(0). Zazwyczaj używane do tego, żeby określić czy coś jest włączone, lub nie.
Deklaracja:
new bool:zmienna;

Stock:
Wiele osób używa je, ale tak naprawdę nie wie jak one działają. Zmienne te są tworzone tylko wtedy, jeżeli są używane, w innym wypadku kompilator je ignoruje. Zazwyczaj używane w plikach nagłówkowych .inc .
Deklaracja:
stock zmienna;

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

Operacje na zmiennych:

Jest możliwych kilka sposobów. Pierwszy to umieszczenie znaku dodawania przed znakiem równości.

zmienna += wartość

Zostanie ona powiększona o podaną wartość.

Sposób drugi:

zmienna = zmienna + wartość

Zostaje pobierana aktualna wartość zmiennej i o ile ma zostać powiększona.

Zamiast plusa można użyć innych znaków np. odejmowania(-), mnożenia(*), dzielenia(/), dzielenia z resztą(%)

Inkrementacja i Dekrementacja

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


Stałe:
Działają tak samo jak zmienne, lecz zmienną ich nie można nazwać gdyż byłaby to kompletna sprzeczność. Różnią się tym, że poprzez cały czas mają jedną wartość, która zostanie im przypisana, nie można na nich wykonywać żadnych operacji oprócz pobierania ich wartości. Przy tworzeniu przed nazwą trzeba dodać przedrostek 'const'

Makrodefinicje:
Bardzo podobne do zmiennych, działają na zasadzie "niech X będzie Y". Tak więc jeżeli do makrodefinicji X przypiszemy Y każdorazowe wpisanie w kodzie X skutkuje wywołaniem Y. Programiści używają ich najczęściej aby zaoszczędzić sobie wpisywania długich nazw funkcji, lub ścieżek do plików. Nie ma ograniczeń co do typu przechowywanych w nich danych. Tworzenie:

#define NAZWA_MAKRODEFINICJI KOD_KTORY_MA_ONA_ZASTEPOWAC

Przykład:

#define func1 server_exec()

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

Widoczność zmiennych:
Występują dwa typy zmiennych jeżeli chodzi o ich widoczność - zmienne lokalne i globalne.

Zmienne globalne są tworzone poza wszystkimi funkcjami, najczęściej na początku kodu pod dyrektywami(dla zachowania estetyki) i można je używać w każdym miejscu. Zmienne lokalne są przeciwieństwem - deklarowane wewnątrz jakieś funkcji i używanie tylko w niej.

W najbliższym czasie opisze jeszcze tablice i ich używanie.
  • +
  • -
  • 8


#31631 Warunki.

Napisane przez darkman w 31.12.2008 15:10

Niżej opisze jak używać w kodzie metody, która zastępuje operator 'if' jednocześnie zaoszczędzając miejsca w danym skrypcie.
Standardowo, jeżeli chcemy, żeby podczas gdy coś zachodzi wykonała się jakaś funkcja używamy operatora
if(warunek)
            wykonaj_funkcje();

Przykład kodu:

#include <amxmodx>

public plugin_init()
{
	register_plugin("Tutorial", "Tutorial", "Tutorial");
	register_clcmd("test", "cmd_test");
}

public cmd_test(id){
	if(is_user_alive(id))
		client_print(id, print_chat, "Jestes zywy");
	else client_print(id, print_chat, "Jestes martwy");
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Napisany kod drukuje na chacie graczowi czy jest żywy lub martwy przy wpisaniu w konsoli komendy test. Nie chodzi jednak o sam kod i co on wywołuje, tylko o to jak prosto można zastąpić operator if(). Mianowicie można użyć formułki:

warunek ? jeżeli zwraca true(1) wykonaj xx : kiedy zwraca false wykonaj zz

Przykład kodu:
#include <amxmodx>

public plugin_init()
{
	register_plugin("Tutorial", "Tutorial", "Tutorial");
	register_clcmd("test", "cmd_test");
}

public cmd_test(id){
	is_user_alive(id) ? client_print(id, print_chat, "Jestes zywy") : client_print(id, print_chat, "Jestes martwy");
}

W istocie kod działa tak samo jak pierwszy, tylko jego struktura jest troche inna. Nie ogranicza się to tylko do funkcji zwracających 0 lub 1, można tego też użyć w inny sposób np:

warunek == 2 ? client_print(id, print_chat, "Zmienna warunek ma wartość 2") : client_print(id, print_chat, "Zmienna warunek ma wartość inną niż 2")

Zachęcam do używania tej metody.
  • +
  • -
  • 2


#31492 Pasek ładowania

Napisane przez darkman w 30.12.2008 23:02

Funkcja ta umieszcza pasek, taki jak przy podkładaniu/rozbrajaniu bomby.

stock set_bartime(id, czas, startprogress=0)
{
        message_begin((id)?MSG_ONE:MSG_ALL, get_user_msgid("BarTime2"), _, id)
        write_short(czas);
        write_short(startprogress);
        message_end();   

} 

Użycie:
set_bartime(id, czas, startprogress)

Parametry:
id - index gracza na którym funkcja ma być wykonana;
czas - okres czasu w jakim ma się ten pasek wypełnić;
startprogress - kiedy pasek zaczyna się pokazywać, jaka jego część ma być wypełniona(wartość w procentach(%)) od 0-100 (0 zaczyna od pustego);

W przypadku kiedy chcemy pokazać pasek wszystkim graczom, należy zmienić typ wiadomości na MSG_ALL, i w miejsce indexu wpisać 0.
  • +
  • -
  • 2


#15695 Warunek If

Napisane przez darkman w 14.09.2008 22:45

Napisze tutaj jak używać warunku if(...) z zaoszczędzeniem użycia CPU.

Np.
if (get_user_team(player) == TEAM_T)
{
    //...kod
} else if (get_user_team(player) == TEAM_CT) {
    //...kod
} else if (get_user_team(player) == TEAM_SPECTATOR) {
    //...kod
}

Taki przykład kodu zużywa więcej procesora - dlaczego? Ponieważ za każdym razem kiedy stawiany jest warunek if(..) wywoływana jest funkcja get_user_team(player).

W użyciu wygląda to mniej więcej tak:
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod


Można to zmienić na:
new team = get_user_team(player)
if (team == TEAM_T)
{
    //...kod
} else if (team == TEAM_CT) {
    //...kod
} else if (team == TEAM_SPECTATOR) {
    //...kod
}

Teraz będzie to wyglądało mniej więcej tak:
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
  itd.

Zamiast if można też użyć przełącznika switch, będzie to najlepsze rozwiązanie:
new team = get_user_team(player)
switch (team)
{
  case TEAM_T:
     //kod...
  case TEAM_CT:
     //kod...
  case TEAM_SPECTATOR:
     //kod...
}

Będzie to wyglądało tak:
Wywołaj get_user_team
  Wykonaj kod
  Wykonaj kod
  Wykonaj kod

  • +
  • -
  • 4