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
 

MAGNET - zdjęcie

MAGNET

Rejestracja: 28.08.2012
Aktualnie: Nieaktywny
Poza forum Ostatnio: 08.04.2024 19:36
****-

#713955 Introduction to SourcePawn

Napisane przez MAGNET w 29.10.2015 16:25

SourcePawn 1.7 – podstawy programowania
Poradnik ten jest zaprojektowany aby pokazać i nauczyć Was kilku podstawowych fundamentów programowania w SourcePawn’ie. Pawn(https://wiki.alliedmods.net/Pawn) jest to język programowania stosowany do ‘osadzania’ funkcji w innych programach. To znaczy, że nie jest to niezależny język jak C++ czy Java i jego dane będą różnić się od zastosowania/aplikacji. SourcePawn jest to wersja Pawn’a używana w SM.
Note: Jeśli jesteś osobą zaczynającą przygodę z programowaniem i nadal nie pojmujesz istoty programowania w SourcePawn’ie, spróbuj poczytać książki uczące programowania jak PHP, Python czy Java, aby zdobyć większa wiedzę na temat programowania.
 
Wprowadzenie dla początkujących
 
Symbole/Słowa klucze
Symbol czy też słowo klucz jest to seria liter, liczb i/lub podkreśleń, który jednoznacznie coś reprezentuje. W symbolach i słowach kluczach rozróżniana jest wielkość liter i zazwyczaj zaczynają się one z małej.
Jest kilka zarezerwowanych słów kluczy, które mają specjalne znaczenie np. if, for, and return. Są to specjalne konstrukcje w języku, które wytłumaczymy później. Pamiętaj, że nie mogą być one użyte jako symbole!

 
Zmienne
 
Jest kilka ważnych konstrukcji, który powinieneś znać zanim zaczniesz programować. Pierwsza z nich jest to zmienna. Zmienna jest to symbol, który przechowuje jakąś daną np. zmienna „z” może przechować liczby 2, 16, 0, etc. Skoro zmienna przechowuje dane, również lokuję w niej pamięć potrzebnej do przechowywania tych danych.
Oprócz nazwy, zmienne mają również swój typ. Typ mówi programowi jak interpretować dane i ile pamięci ta dana użyję. Pawn ma 3 typy danych, które są powszechnie używane:

·          Integers (liczby całkowite) typu int. Zmienne te mogą przechowywać liczby całkowite z przedziału od -2147483648 do 2147483647
·          Floats (liczby zmiennoprzecinkowe) typu float. Zmienne te mogą przechowywać liczby ułamkowe w ogromnym zakresie, choć nie są one tak dokładne jak Integers’y
·          Characters (znaki) typu char. Zmienne te przechowują jeden bajt informacji znaków, zwykle znaki ASCII (http://www.asciitable.com/)
·          Booleans (wartości logiczne) typu bool. Zmienne te przechowują albo wartość true albo false.
Przykłady tworzenia zmiennych i przypisywania im wartości:


int Money = 5400;
float percent = 67.3;
bool enabled = false;

 
Funkcje
 
Następną ważnym pojęciem są funkcje. Funkcja jest to fragment programu, któremu nadano nazwę, i który możemy wykonać poprzez podanie jego nazwy oraz ewentualnych argumentów/parametrów (o ile istnieją). Po ich wywołaniu, wykonują określoną sekwencję kodu, a następnie zwrócą wynik. Jest kilka rodzajów funkcji, ale każda funkcja jest aktywowana w ten sam sposób np.:

show(56);                                                // Wywoła funkcję „show” i da nam liczbę 56
enable();                                                   // Wywoła funkcję „enable” bez żadnych wartości
bool visible = show(a);                   // Wywoła funkcję „show”, przechowując wartość w zmiennej

Każdy kawałek danych przesyłanych do funkcji nosi nazwę argumentu / parametru. Argumenty wytłumaczymy w dalszej części poradnika.
Komentarze
Każdy tekst napisany po „//” jest nazywany „komentarzem” i nie jest on kodem. Jest on najczęściej używany do podpisywania jakiś zmiennych, funkcji, podania ich sposobu działania etc. Przykład użycia chociażby jest podany wyżej w „Funkcjach”. Są dwa rodzaje komentarzy:
·          // - wszystko w tej samej linii za tymi znakami jest ignorowane
·          /*  */ - Multi-liniowy komentarz, wszystko między gwiazdkami jest ignorowane
„Blokowe” kodowanie
Następnym pojęciem jest „blokowe” kodowanie (z ang. block coding). Możesz pogrupować swój kod w „bloki” oddzielone przez { i } przez co kod ….
Paradygmaty języka

 
Zmienne
Pawn obecnie używa następujący typów zmiennych:
·          bool ­– true (prawda) albo false (fałsz)
·          char –  ciąg znaków
·          int – liczba całkowita
·          float –liczba zmiennoprzecinkowa
·          Handle – podstawowy typ obiektu SM
Other types may exist when defined in include files - for example, enums create new types for named integers, and many types derive from Handle.
Strings, currently, are 0-terminated arrays of chars. They're described a little further ahead.

 
Deklaracja
 
Niżej podamy kilka przykładów zadeklarowanych zmiennych, zarówno poprawnych jak i błędych.


int a = 5;
float b = 5.0;
bool c = true;
bool d = false:
Błedne użycie zmiennej:
int a = 5.0;                                             // Błąd „Type mismatch”. 5.0 jest to liczba zmiennoprzecinkowa
float b = 5;                                             // Błąd „Type mismatch”. 5 jest liczbą całkowitą

 
Jeżeli podczas deklaracji zmiennej nie jest przypisana jej wartość, to domyślnie jej wartość będzie wynosić 0 np.:

int a;            // a = 0
float b;       // b = 0.0
bool c;        // c = false

 
Inicjacja
 
Zmiennym można przypisać wartość również po ich utworzeniu np.:

int a;
float b;
bool c;
a = 5;
b = 5.0;
c = true;

 
Tablice
 
Tablica jest to uporządkowany zbiór danych. Tablic używamy wtedy kiedy chcemy przechować wieloczęściowe dane w jednej zmiennej.
Deklaracja
Tablica jest deklarowana poprzez użycie nawiasów (tych kwadratowych) czyli [ ]. Kilka przykładów:

int players[32];            // Dla players tworzy 32-tu elementową tablicę danych typu int
float origin[3];              // Dla origin tworzy 3 elementową tablicę danych typu float
Domyślnie każdy element tablicy ma wartość 0. Można jednak przypisać im różne wartości domyślne:
int numbers[5] = {1, 2, 3, 4, 5};                      // Przechowuje odpowiednio wartości 1, 2, 3, 4, 5.
float origin[3] = {1.0, 2.0, 3.0};                        // Przechowuje odpowiednio wartości 1.0, 2.0, 3.0.

Możesz również pominąć rozmiar tablicy, jeżeli przypiszesz do niej dane:


int numbers[] = {1, 3, 5, 7, 9};

Kompilator automatycznie wywnioskuje, że tablica ma rozmiar 5.
Kiedy tablica jest zadeklarowana z nawiasami kwadratowymi, Pawn interpretuje to tak, że zmienna ma określony rozmiar. Określony rozmiar tablicy jest zawsze znany. Niektórym tablicom rozmiar może zostać nadany dynamicznie poprzez zastosowanie nawiasów kwadratowych. Na przykład:


int[] numbers = new int[MaxClients]

 
Ta deklaracja tworzy zmienną o rozmiarze wartości MaxClients, która może być czymkolwiek. Rozmiar tablicy nie jest więc znany do czasu gdy zmienna MaxClients nie zostanie zadeklarowana

 

Z kolei taki zapis:

 

int tab[32] = {69, ...};

 

ustawi we wszystkich komórkach tablicy wartość 69
 
Użycie
Tablic używa się tak samo jak zwykłych zmiennych. Jedyną różnicą jest to, że tablica musi być zaindeksowana. Indeksowanie tablic oznacza wybranie jednego elementu, którego masz zamiar uzyć.
Dla przykładu kod używającego tablic i ich indeksowania:

int number[5];
float origin[3];

numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;
origin[0] = 1.0;
origin[1] = 2.0;
origin[2] = 3.0;

Note: Indeksowanie zawsze zaczyna się od 0. Jeżeli jakaś tablica posiada N elementów to prawidłowe indeksy są od 0 do N-1.
Użycie niepoprawnego indeksu spowoduję błąd w kompilacji czyli error np.:


int numbers[5];

numbers[5] = 20;

Może to wyglądać poprawnie, ale 5 jest nie jest poprawnym indeksem tej tablicy. Najwyższym indeksem jest 4.
Możesz użyć dowolnego wyrażenia jako indeksu np.:


int a, number[5];

a = 1;                                                          // Ustawia zmiennej „a” wartość 1
numbers[a] = 4;                                  // Ustawia indeksowi 1 (bo a = 1) i elementowi drugiemu (bo indeks 1 to drugi element tablicy) wartość 4
numbers[numbers[a]] = 2;           // Ustawia indeksowi 4 (bo numbers[a] = 4) i elementowi piątemu (bo indeks 4 to piąty element tablicy) wartość 2

 
Ciąg znaków (Strings)
 
(Będę tutaj używał angielskiej jak i polskiej nazwy)
String’i są to konstrukcje do przechowywania tekstu. String jest to po prostu tablica znaków, z wyjątkiem ostatniego znaków który musi być 0 (zwany jako „the null terminator”). Bez niego, Pawn nie wiedziałby kiedy przestać czytać dany ciąg znaków. Wszystkie string’i są kodowane w UTF-8
Ogólnie, musisz wiedzieć jak długi będzie Twój string zanim go przechowasz. SourcePawn nie posiada jeszcze możliwości Stringów znanych np. w PHP

 
Użycie
 
Ciągi znaków są zwykle deklarowane jak tablice np.:

char message[] = "Hello!";
char Claus[6] = "Clams";
Rozłóżmy to na czynniki pierwsze:
char message[7];
char clams[6];

message[0] = 'H';
message[1] = 'e';
message[2] = 'l';
message[3] = 'l';
message[4] = 'o';
message[5] = '!';
message[6] = '\0';
clams[0] = 'C';
clams[1] = 'l';
clams[2] = 'a';
clams[3] = 'm';
clams[4] = 's';
clams[5] = '\0';

Mimo, żę string’i są rzadko inicjowane w ten sposób, to bardzo ważne jest, aby pamiętać pojęcie „null terminator”, który sygnalizuję o końcu string’a. Kompilator i większość funkcji SM automatycznie zakończy string zerem, co jest ważne gdy sami będziemy bezpośrednio edytować string.
Note: Zauważmy, że ciąg znaków jest w cudzysłowach z dwoma przecinkami u góry, natomiast pojedynczy znak jest w cudzysłowach z jednym przecinkiem na górze (lub miedzy apostrofami – jak kto woli)

 
Znaki
 
Znak tekstu może być użyty jako string lub jako komórka np.:


char text[] = "Crab";
char clam;

clam = 'D';                                              // Ustawia zmiennej clam wartość ‘D’
text[0] = 'A';                  // Zmienia indeks 0 (element pierwszy) tablicy text czyli ‘C’ na ‘A’. Teraz text to ‘Arab’
clam = text[0];             // Ustawia zmiennej clam wartość ‘A’
text[1] = clam;             // Zmienia indeks 1 (element drugi) tablicy text czyli ‘r’ na ‘A’. Teraz text to ‘AAab’
What you can't do is mix character arrays with strings. The internal storage is different.
int clams[] = "Clams"; // Błedne
int clams[] = {'C', 'l', 'a', 'm', 's', 0}; // Poprawne, ale TO NIE JEST STRING (CIĄG ZNAKÓW)

 
Funkcje
 
Funkcje, jak wspomnialiśmy wcześniej, jest to odizolowany blok kodu, który wykonuję określoną akcję. Mogą być one wywołane bez lub z argumentami / parametrami które przekazują jakieś dane do funkcji.
Funkcje można wywołać na 2 sposoby:

·          direct call – wywołanie samemu funkcji
·          callback - wywołanie funkcji dostarczanych przez aplikację?
Również rozróżniami kilka rodzajów funckji:
·          native (natywna) – bezpośrednia, wewnętrzna funkcja dostarczana przez aplikacje
·          public (publiczna) – szeroko dostępna funkcja, dla samego pluginu oraz na zewnątrz jego
·          normal (normalna) – normalna funkcja, którą tylko Ty możesz wywołać. Dostępna tylko dla innych funkcji w pluginie
·          static (statyczna) – zakres tej funkcji jest ograniczony w bieżącym pliku
·          stock (stock’owa) – generalnie jest to funkcja normala. Różni się od niej tym, że nieużyta nie powoduję ostrzeżeń przy kompilacji.
·          forward (forward) –
Cały kod w Pawn’ie musi być w funkcjach. To jest różnica między językami jak PHP, Perl czy Python, które pozwalają pisać globalny kod. That is because Pawn is a callback-based language: it responds to actions from a parent application, and functions must be written to handle those actions. Although our examples often contain free-floating code, this is purely for demonstration purposes. Free-floating code in our examples implies the code is part of some function.
Deklaracja
W przeciwieństwie do zmiennych, funkcje nie muszą być deklarowane zanim je użyjesz. Funkcja zbudowana jest z ‘nagłówka’, który zawiera jej nazwę i jej argumenty oraz kodu. Przykład funkcji z podanym jej działaniem:

int AddTwoNumbers(int first, int second)                       // nagłówek składający się z nazwy funkcji I jej parametrów
{
                        int sum = first + second;              // ustawiamy zmiennej sum typu int wartość sumy dwóch zmiennych first i second
                        return sum;                                           // zwraca wartość zmiennej sum (czyli wynik sumy first i second)
}

Jest to prosty przykład funkcji. Zajmijmy się naraziłem ‘nagłówkiem’:


int AddTwoNumbers(int first, int second)
int – typ zwracanej wartości (liczba całkowita)
AddTwoNumbers – nazwa naszej funkcji
int first – pierwszy argument, liczba całkowita
int second – drugi argument, liczba całkowita

Ważną rzeczą na którą warto zwrócić jest return, który informuję o końcu funkcji i zwróceniu wartości wywołującemu funkcję. Wszystkie funkcje coś zwracają na zakończenie, chyba że zwracają specjalny typ zwanym void.
Funkcja może przekazać każdy typ danych i może zwrócić każdy rodzaj nie będący tablicą

Oczywiście można przekazać zmienne do funkcji


int numbers[3] = {1, 2, 0};

numbers[2] = AddTwoNumbers(numbers[0], numbers[1]);         // Zamieni 0 na 3 ( bo 1+2=3 )

Należy pamiętać, że komórki są przekazywane przez wartość. Oznacza to, że ich wartości nie mogą być zmieniane przez funkcję np.:


int a = 5;

ChangeValue(a);

ChangeValue( B);
{
                        b = 5;
}

Ten kod nie zmieni wartości zmiennej „a”, ponieważ to kopia wartości zmiennej „a” przechodzi zamiast jej oryginał.
Więcej przykładów funkcji będzie podanych w dalszej cześci poradnika.

 
Publiczne (Public)
Publicznych funkcji używa się w celu implementacji callbacka. Nie powinieneś tworzyć funkcji publicznej jeśli nie tworzysz do niej żadnego callbacka. Np. takie 2 callback’i z scourcemod.inc:


forward void OnPluginStart();
forward void OnClientDisconnected(int client);

Aby korzystać z możliwości tych forwardów musisz stworzyć funkcję:


public void OnPluginStart()
{
                        /* Code Here */
}

public void OnClientDisconnected(int client)
{
                        /* Code here */
}

 
Słowo public jest sygnałem, aby dołączyć funkcję do odpowiadającemu jej forwardowi
 
Natywy (Natives)
 
Natywy są wbudowanymi funkcjami dostarczony przez SM. Możesz je wywołać tak jak normalne funkcje. Krótko: możemy korzystać z danych jednego pluginu w innym. Np. SM ma następującą funkcję natywną:

native float FloatRound(float num);             // zaokrągla liczby ułamkowe do liczby całkowitej
Może być również wywołana w taki sposób:
int rounded = FloatRound(5.2);                                             // zmienna rounded będzie wynosić 5 (5.2 ≈ 5)

 
Argumenty/Parametry Tablic
 
Można przekazać tablice lub string’i jako argumenty. Ważne, aby zauważyć, że są przekazywane przez referencję. Oznacza to, że zamiast tworzenia kopii danych, dane są referenced directly. Istnieje prostszy sposób wyjaśnienia tego bardziej konkretnie.

int example[] = {1, 2, 3, 4, 5};

ChangeArray(example, 2, 29);

void ChangeArray(int[] array, int index, int value)
{
                        array[index] = value;                       // ustawi 3 na 29
}

Funkcja ustawia dany w tablicy indeks danej wartości. Po wywołaniu naszej funkcji drugi indeks tablicy zmiennej example 3 zmieni się na 29:


example[2] = 29;

Aby zapobiec modyfikowaniu tablicy w funkcji, można zaznaczyć ją jako const. Spowoduje to error podczas kompilacji np.:


void CantChangeArray(const array[], int index, int value)
{
                        array[index] = value;                                               // Nie skompiluje się
}

Używanie const jest dobrym pomysłem w parametrach tablic jeśli wiesz, że tablica nie będzie modyfikowana; może to zapobiec pojawiania się błędów w kodowaniu.
 
Wyrażenia
 
Wyrażenia są takie same jak w matematyce. Są to grupy operatorów/symboli, często w nawiasach.  Zawierają one ścisłą „kolejność operacji” i mogą zawierać w sobie zmienne, funkcje, liczby i nawet wyrażenia same w sobie. Mogą być również przekazane jako parametr jakiejś funkcji.
Najłatwiejszym wyrażeniem jest pojedyncza liczba np.:

0;                   // zwróci liczbę 0
(0);                // również zwróci liczbę 0

Mimo, że wyrażenia mogą zwracać jakąkolwiek wartość, mogę też zwrócić zarówno zero jak i non-zero (liczbę niezerową), w tym sensie że zero = false a non-zero = true np. -1 to true w Pawn’ie, ponieważ jest niezerowe. Nie zakładajmy, że liczby negatywne są false (fałszywe).
Kolejność wykonywania działań jest identyczna jak w matematyce. Podajmy kilka przykładów:


5 + 6;                                  // 11
5 * 6 + 3;                         // 33
5 * (6 + 3);                                             // 45
5.0 + 2.3;                         // 7.3
(5 * 6) % 7;                     // 2; operator modulo (dzielenie, zwraca tylko resztę z dzielenia)
(5 + 3) / 2 * 4 – 9;     // -8

Jak wspomnieliśmy, wyrażenia mogą zawierać zmienne, a nawet funkcje:


int a = 5 * 6;                                                                // 30
int b = a * 3;                                                                // 30 * 3 = 90
int c = AddTwoNumbers(a, B) + (a * B);     // (30 + 90) + (30 * 90) = 390

 
Operatory (przypisania, arytmetyczne, znaku liczby, bitowe, skróconego przypisania, logiczne, warunkowe etc.)
Dokładnie opisane operatory bitowe znajdziecie pod tym linkiem: http://amxx.pl/topic...atory-w-pawnie/
Warunki
Wyrażenia warunkowe pozwalają uruchomić kod, tylko wtedy, kiedy dany warunek jest spełniony.
Wyrażenie if
Wyrażenie if sprawdza jeden lub wiecej warunków np.:

if (a == 5)
{
                        /* Kod, który zostanie uruchomiony kiedy warunek będzie true (prawdziwy) czyli w tym przypadku gdy a będzie równe 5*/
}

Może zostać rozszerzony do zastosowania większej ilości warunków np.:


if (a == 5)
{
                        /* Kod */
}
else if (a == 6)
{
                        /* Kod */
}
else if (if == 7)
{
                        /* Kod */
}

Można zrobić również taki sposób:


if (a == 5)
{
                        /* Kod */
}
else
{
                        /* Kod uruchomi się gdy a nie będzie równe 5 */
}

Note: Do sprawdzania czy coś jest równe czemuś używamy operatora == a nie =. „==” jest to operator logiczny do sprawdzania czy wartości są równe natomiast „=” jest to operator przypisania służący do umieszczania wartości znajdującej się z prawej strony w zmiennej po lewej stronie.
Wyrażenie switch
Wyrażenie switch jest to ograniczone wyrażenie if. Testują one jedno wyrażenie dla serii możliwych wartości np.:


switch (a)
{
                        case 5:
                        {
                                               /* Kod */
                        }
                        case 6:
                        {
                                               /* Kod */
                        }
                        case 7:
                        {
                                               /* Kod */
                        }
                        case 8, 9, 10:
                        {
                                               /* Kod */
                        }
                        default:
                        {
                                               /* uruchomi się gdy żadna z podanych wyżej wartości nie będzie pasowała */
                        }
}

 
Pętle
Pętla służy do powtarzania instrukcji, które chcemy by się wykonały więcej niż raz bez konieczności ich wielokrotnego pisania w kodzie.
Pętla for
Pętla for jest to pętla składająca się z 4 cześci (którym nadam od razu jakieś skróty):
·          nadawanie początkowych wartości zmiennym (inicjalizacja)
·          warunek kończący pętle (warunek)
·          zmiany po obrocie pętle (iteracja)
·          kod, który będzie się wykonywał po obrocie pętli gdy warunek będzie spełniony (kod)
 

for ( /* inicjalizacja */ ; /* warunek */ ; /* iteracja */ )
{
                        /* kod */
}

Prosty przykład użycia funkcji sumującej tablicę:


int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = SumArray(array, 10);

SumArray(const array[], count)
{
                        int Total;

                        for (int i = 0; i < count; ++i)
                        {
                                               total += array[i];
                        }

                        return total;
}

Działanie:
 
·          int i = 0 – tworzy nową zmienną dla pętli i ustawia jej wartość na 0
·          i < count – pętla będzie uruchamiana tylko wtedy gdy ‘i’ będzie mniejsze niż ‘count’. Gwarantuje to, że pętla zatrzyma się w określonym punkcie. W tym przypadku nie chcemy czytać nieistniejących indeksów tablicy
·          ++i - preinkrementacja ‘i’ o 1 po każdym obrocie pętli. Zapewnia to, że pętla nie będzie obracała się wiecznie; ewentualnie ‘i’ stanie się zbyt duże i pętla się skończy
Tak więc funkcja SumArray będzie się obracać przez istniejące indeksy tablicy, za każdym razem dodając wartość indeksu do zmiennej total.
Pętla while
Pętla while są mniej powszechne niż pętle for ale są najprostszym sposobem pętli. Składa się ona z dwóch części:
·          warunek kończący pętlę (warunek)
·          kod, który będzie się wykonywał po obrocie pętli gdy warunek będzie spełniony (kod)
 


while ( /* warunek */ )
{
                        /* kod */
}

Jak długo warunek będzie spełniony, tak długo pętla będzie się powtarzała. Każda pętla for może być zamieniona na pętlę while:
/* inicjalizacja */


while ( /* warunek */ )
{
                        /* kod */
                        /* iteracja */
}

Przykład poprzedniej pętli for zamienionej na pętlę while:

SumArray(const array[], count)
{
                        int total, i;

                        while (i < count)
                        {
                                               total += array[i];
                                               i++;
                        }

                        return total;
}

Jest jeszcze pętla do…while które są jeszcze mniej powszechne. Są to te same pętle co pętle while z wyjątkiem, że warunek jest sprawdzany dopiero PO każdym obrocie pętli, a nie przed. To znaczy, że pętla zawsze obróci się co najmniej raz.


do
{
                        /* kod */
}
while ( /* warunek */ );

 
Kontrola pętli
Istnieją dwa przypadki, w których możesz wpłynąć na działanie pętli:
·          pomijanie (continue) jednej iteracji pętli ale dalsze jej kontynuowanie, lub;
·          przerwanie (break) całkowite pętli zanim się ukończy.
Powiedzmy, że masz funkcję, która pobiera tablicę i szuka odpowiedniej liczby. Chcesz ją zatrzymać kiedy liczba zostanie znaleziona:

/**
 * zwraca wartość indeksu tablicy lub -1 jeżeli nie znajdzie wartości
 */
SearchInArray(const array[], count, value)
{
                        int index = -1;

                        for (int i = 0; i < count; i++)
                        {
                                               if (array[] == value)
                                               {
                                                                       index = i;
                                                                       break;
                                               }
                        }

                        return  index;
}

W pomijaniu iteracji pętli słowem klucz jest continue. Na przykład, powiedzmy, że chcemy zsumować wszystkie liczby parzyste:


int SumEvenNumbers(const array[], count)
{
                        int sum;

                        for (int i = 0; i < count; ++i)
                        {
                                               /* jeżeli reszta z dzielenia przez 2 to 1, to wiemy że to liczba nieparzysta */
                                               if (array[i] % 2 == 1)
                                               {
                                                                       /* Pomija obrót pętli */
                                                                       continue;
                                               }
                                               sum += array[i];
                        }

                        return sum;
}

  • +
  • -
  • 4


#713150 Baza poradników SourceMod !

Napisane przez MAGNET w 11.10.2015 22:50

Witajcie,
piszę ten post w imieniu całej administracji. Chcemy rozwinąć support do SourceModa, gdyż w chwili obecnej stoi on na niskim poziomie. Główną przyczyną jest brak dostatecznej bazy poradników po polsku, a całą potrzebną wiedzę można uzyskać jedynie ze znajomością języka angielskiego, co jest bardzo dużą barierą dla osób, które tego języka nie znają.
Dlatego chcemy to zmienić.
Musimy stworzyć tak obszerną bazę poradników do SM jak w chwili obecnej do AMXX'a, aby każdy laik mógł nauczyć się wszystkiego od zera, jednak sami nie jesteśmy sobie w stanie poradzić. Jeśli są na tym forum osoby, które mogłyby pomóc w rozwoju tej ogromnej inicjatywy, razem moglibyśmy zdziałać naprawdę wiele.
Cała akcja polega na tłumaczeniu tutoriali z AliedMods na polski a następnie umieszczania ich w odpowiednim dziale. Chcielibyśmy posegregować je również w przystępny sposób i stworzyć coś na kształt "książki", której strony dawałyby wiedzę potrzebną do pisania pluginów. Jeśli ten plan się powiedzie, z pewnością forum będzie tak uczęszczane przez spragnionych wiedzy ludzi jak kiedyś.
Mówię teraz bezpośrednio do Ciebie - jeśli chcesz pomóc nam w rozwoju forum i znasz język angielski w stopniu umożliwiającym translację daj nam o tym znać poprzez PW. Przed stworzeniem poradnka całe tłumaczenie zostanie poddane wspólnej korekcie administracji, a gotowy tutorial ponownie przekazany autorowi tłumaczenia w celu publikacji - choć w ten sposób możemy się odwdzięczyć za trud włożony w rozwój forum.
Jeśli macie na ten temat jakieś pytania, przemyślenia, sugestie...piszcie pod spodem.

Serdecznie pozdrawiamy,
Ekipa AMXX.PL


Opiekunami projektu są:W razie jakichkolwiek pytań prosimy o kontakt z tymi osobami :)


Poradniki wymagające tłumaczeniaPoradniki w trakcie tłumaczenia/poprawek/korekt/ukończone:
Informacja #1

Uprzejmie informujemy, iż każda osoba która dokona tłumaczenia poradnika jako podziękowanie otrzyma od Administracji +10pkt Reputacji


Informacja #2

Osoby podejmującę sie tłumaczenia poradnika powinny to zgłosić do Opiekunów całej akcji poprzez Prywatną Wiadomość.
W wiadomości powinien znajdować się link do poradnika który będziecie tłumaczyć!!


  • +
  • -
  • 6


#708536 [ROZWIĄZANE] wyszukanie w której tablicy (?[WymiarzexD?]) znajduje się string

Napisane przez MAGNET w 03.08.2015 23:08

public SzukajID(String:jakas_tablica[], iles_tam, String:szukany_tekst[])
{
 for(new i=0;i<iles_tam;i++)
 {
  if(StrEqual(jakas_tablica[i], szukany_tekst))
  return i
 }
 return 0;
}
new wynik = SzukajID(twoja_tablica, rozmiar, "Zielony");

0 - brak stringa
liczba nieujemna - element tablicy​


  • +
  • -
  • -1


#706741 fm_find_ent_by_owner - możliwe, że zwraca 0?

Napisane przez MAGNET w 18.07.2015 16:01

Wydaje mi się, że gdy robiłem grupy pod BaseBuildera, to próba odnalezienia właściciela ściany kończyła się zwróceniem zera.


  • +
  • -
  • 1


#703739 [ROZWIĄZANE] Łapanie, gdy gracz wystrzelił ostatni pocisk z magazynku (nie Pl...

Napisane przez MAGNET w 22.06.2015 21:37

Nie da się sprawdzić jakimś eventem ile ma się naboi? Nie można sprawdzić po strzale czy jest 0? Jeśli nie, można sprawdzać, czy ma się 1 nabój - wówczas kolejny strzał będzie równoznaczny z pustym magazynkiem. Trzeba jednak wziąć pod uwagę możliwość zmiany broni, bądź przeładowania, czy opuszczenia broni.

Kombinuj


  • +
  • -
  • 1


#702281 Ktoś tu jeszcze moderuje?

Napisane przez MAGNET w 03.06.2015 14:41

Poogarniam jak wrócę na chatę. Przerabiam po ~600 tematów, ale co jakiś czas. Nie jestem w stanie moderowac codziennie
  • +
  • -
  • 2


#700675 Szybkie menu na COD MOD'a

Napisane przez MAGNET w 15.05.2015 22:37

http://amxx.pl/topic...ji-sierpniowej/
  • +
  • -
  • 1


#700341 Ninja Turtles Mod[1.2] by Z!3L0ny

Napisane przez MAGNET w 11.05.2015 22:06

Czekam na GdzieJestNemoMOD
  • +
  • -
  • 4


#699488 [ROZWIĄZANE] error Run time error 10 (plugin "codperk_kusza.amxx") (n...

Napisane przez MAGNET w 04.05.2015 09:50

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 1


#699463 Vip z generatora nie działa

Napisane przez MAGNET w 04.05.2015 09:10

Automatyczna wiadomość


Ten temat został przeniesiony z forum

Scripting AMXX > Problemy

do

AMX Mod X > Problemy
  • +
  • -
  • 1


#697956 [CS:GO] Perm Mute

Napisane przez MAGNET w 19.04.2015 09:27

O święty Jacku. Nie mogłeś od razu dać całego kodu? Jak zawsze czepialscy się znajdą brrrr
  • +
  • -
  • 1


#697930 [CS:GO] Perm Mute

Napisane przez MAGNET w 18.04.2015 23:31

Opis




Plugin ma za zadanie mutować graczy permamentnie. Tyle.
Napisanie go zajęło mi 10 minut, jednak myślę, że okaże się przydatny.

Konfiguracja




Otwieramy sma i szukamy linijki nr 27:
c_ma_mute = RegClientCookie("PermMute", "PermMute", CookieAccess_Private);
Jedyne co musimy zrobić, to zmienić obydwa parametry "PermMute" na własne, ich nazwa nie ma znaczenia, jednak muszą być one takie same.
Plugin nie posiada zapisu sql, tylko operuje na cookiesach, które implementują u gracza ciasteczko, sprawdzane podczas łączenia się z serwerem. Pozwala to na wiele udogodnień, np. posiadająć sieć można wgrać na wszystkie serwery ten sam plugin z identycznymi nazwami wyżej wspomnianych parametrów, co uniemożliwi delikwentowi komunikację na wszystkich serwerach bez potrzeby zakładania bazy danych.

Komendy



mutemenu - otwiera menu mutowania (wywoływane w konsoli)

Download


Załączone pliki


  • +
  • -
  • 3


#697241 pytania Nauka amxx, Pisanie pluginów, Edycja ( co i jak)

Napisane przez MAGNET w 12.04.2015 22:42

http://amxx.pl/forum/16-tutoriale/

Masz tutaj zawarte wszystko czego potrzebujesz jeśli chodzi o teorię. Praktycznie musisz mieć jakieś cele, np. chcesz napisać plugin, który będzie robił to i tamto, bądź wyedytowac x plugin żeby posiadał to i tamto. Aby to zrobić będziesz potrzebował praktycznej wiedzy, którą posiadziesz poprzez szukanie odpowiedzi na problemy napotkane podczas pisania. W ten sposób nauka będzie trwać cały czas. Jak czegoś nie będziesz wiedział - zapytasz się na forum. To droga samouka, przez którą ja też kroczę.
  • +
  • -
  • 1


#697135 Zablokowanie działania funkcji, gdy admin jest na serwerze.

Napisane przez MAGNET w 12.04.2015 15:34

przelecieć pętlą po graczach?


  • +
  • -
  • 1


#696129 [ROZWIĄZANE] problem z kompliacja przez jedno małe [id] ...

Napisane przez MAGNET w 06.04.2015 15:37

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 1