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
 

ENDRULA - zdjęcie

ENDRULA

Rejestracja: 30.06.2014
Aktualnie: Nieaktywny
Poza forum Ostatnio: 12.03.2018 01:53
*****

#734123 Instalacja Sourcebans++ (1.5.4.7)

Napisane przez xWangan w 31.12.2016 13:16

Sourcebans++

Sourcebans++ to udoskonalona wersja starego sourcebansa w wersji 1.4.11 utworzonego przez GameConnect. Do najważniejszych poprawek i nowych możliwości warto zaliczyć: bardziej stabilną aplikację, nowy wygląd aplikacji, logowanie przy wykorzystaniu steamapi oraz sporo modyfikacji od community.

 

Wymagania:

  • Serwer WWW.
  • Baza danych z możliwością łączenia się z zewnętrznych adresów ip.
  • Serwer na silniku SRCDS.
  • Wykorzystywanie sourcemod'a w wersji >= 1.7
  • Konto steam.

 

Instalacja po stronie serwera WWW:

  1. Zacznijmy od pobrania paczki sourcebans'a: Załączony plik  sourcebans-pp-1.5.4.7.zip   13,9 MB  400 Ilość pobrań
  2. Wypakowujemy na dysku, zawartość foldera web_upload wrzucamy na FTP serwera WWW.
  3. Uruchamiamy naszą przeglądarkę, wchodzimy na adres naszej strony kończąc go /install/, czyli całość powinna wyglądać tak: adres_strony.pl/install/
  4. Na stronie powinniśmy zobaczyć coś takiego: 5625667969cf67baa677b880768bc0a6.png
  5. Wchodzimy pod adres: https://steamcommunity.com/dev/apikeyi tworzymy APIKEY, będzie nam zaraz potrzebny. Po przeczytaniu licencji zaznaczamy opcję "I have read, and accept the license" po czym klikamy OK. Następny krok to przygotowanie APIKEY pod sourcebans. 
  6. Teraz pora uzupełnić dane dotyczące bazy danych, APIKEY oraz adres sourcebansa (dokładny, np. http://bany.adresstrony.pl/)dc58b771cb55509d55ddaea336687378.png
  7. Po wypełnieniu danych klikamy OK i przechodzimy do następnej strony. W tym kroku będziemy musieli sprawdzić, czy nasz serwer WWW oraz baza danych spełniają wszystkie wymagania.5ab75b878f10ff72f192c6d79c814250.png
  8. Klikamy ok. Jeśli wszystko jest dobrze na stronie która nam się pojawiła powinniśmy otrzymać informację o utworzeniu tabel w bazie danych.5ef0b9c222de04a24b62ef24f8eac575.png
  9. Klikamy OK. Teraz pozostaje nam utworzyć konto administratora. Uzupełniamy wszystkie pola.ed1a3b53cb9fae89d3617324bef1a599.png
  10. Klikamy OK. Teraz wystarczy usunąć z FTP serwera WWW foldery install oraz updater, a sourcebans będzie działał.

 

 

Instalacja po stronie serwera:

Teraz pora na instalację na serwerze gry. W moim przypadku będzie to serwer CS:GO, a programem do łączenia się z FTP jest FileZilla. Nie będę pokazywał podstaw typu "jak połączyć się z serwerem", jeśli ktoś tego nie wie to polecam poszukać osobnego poradnika.

  1. Zanim zaczniemy instalację od strony serwera, zajmijmy się najpierw bazą danych. Do bazy danych należy dodać dostęp z zewnętrznego hosta. Będzie nim adres IP serwera, bez portu. W niektórych przypadkach adresem będzie adres IP podany na stronie hostingu, taką praktykę często stosuje 1s1k.pl. Jako że są różne panele zarządzania stronami WWW nie będę tego pokazywał.
  2. Logujemy się na FTP serwera, wchodzimy do katalogu csgo aż zobaczymy taki układ plików jak na screenie.0df0d49843c97c97b7f60f3221e8c64a.png
  3. Wrzucamy tutaj zawartość folderu game_upload. Następnie wchodzimy w addons --> sourcemod --> configs. Nie będę tego pokazywał, każdy sobie poradzi.a0cb0d3d4e54625ebce77ee36033e34c.png
     
  4. Otwieramy plik databases.cfg. Standardowo wygląda on tak: 
    "Databases"
    {
    	"driver_default"		"mysql"
    	
    	"default"
    	{
    		"driver"			"default"
    		"host"				"localhost"
    		"database"			"sourcemod"
    		"user"				"root"
    		"pass"				""
    		//"timeout"			"0"
    		//"port"			"0"
    	}
    	
    	"storage-local"
    	{
    		"driver"			"sqlite"
    		"database"			"sourcemod-local"
    	}
     
    	"clientprefs"
    	{
    		"driver"			"sqlite"
    		"host"				"localhost"
    		"database"			"clientprefs-sqlite"
    		"user"				"root"
    		"pass"				""
    		//"timeout"			"0"
    		//"port"			"0"
    	}
    	
    }
    
  5. Po ostatnim configu (w tym przypadku clientprefs) dodajemy dane od sourcebansa w podany sposób, uzupełniamy je danymi od utworzonej wcześniej bazy danych sourcebansa.

    	"sourcebans"
    	{
    		"driver"		"mysql"
    		"host"			"adres bazy danych"
    		"database"		"nazwa bazy danych"
    		"user"			"użytkownik bazy danych"
    		"pass"			"hasło bazy danych"
    	}
    
  6. Podgląd jak w tym przypadku to powinno wyglądać (ważne, aby dodać to przed ostatnią klamrą zamykającą plik "}").

    "Databases"
    {
    	"driver_default"		"mysql"
    	
    	"default"
    	{
    		"driver"			"default"
    		"host"				"localhost"
    		"database"			"sourcemod"
    		"user"				"root"
    		"pass"				""
    		//"timeout"			"0"
    		//"port"			"0"
    	}
    	
    	"storage-local"
    	{
    		"driver"			"sqlite"
    		"database"			"sourcemod-local"
    	}
     
    	"clientprefs"
    	{
    		"driver"			"sqlite"
    		"host"				"localhost"
    		"database"			"clientprefs-sqlite"
    		"user"				"root"
    		"pass"				""
    		//"timeout"			"0"
    		//"port"			"0"
    	}
    
    	"sourcebans"
    	{
    		"driver"		"mysql"
    		"host"			"adres bazy danych"
    		"database"		"nazwa bazy danych"
    		"user"			"użytkownik bazy danych"
    		"pass"			"hasło bazy danych"
    	}	
    }
    
  7. Zapisujemy plik na serwer, to mamy za sobą. Następnie wchodzimy tutaj w folder sourcebans.a1b481b9f9f0353601af343391fb7e89.png

  8. Otwieramy plik sourcebans.cfg po czym ustawiamy go według własnych preferencji. Aby bany były poprawnie wykrywane serwer trzeba dodać na stronie, następnie sprawdzić jego ID i w tym pliku ustawić. To tyle, wszystko gotowe.

 

 

Poradnik stworzony dla AMXX.pl przez xWangan.
Kopiowanie na inne fora jest zakazane.


  • +
  • -
  • 4


#703190 PAWN Pre-Processor Część 2

Napisane przez DarkGL w 14.06.2015 16:18

Zawartość

Część 1 - Obejmuje wprowadzenie do preprocesora oraz kilka ważnych rzeczy przydatnych podczas pisania makr.
Część 2 - Wyjaśnienie dokładnie czego szuka kompilator oraz typowych zastosowań makr.
Część 3 - Opis innych dostępnych dyrektyw (oprócz"#define") oraz spojrzenie na definicje bez wartości podmiany.
Część 4 - Używanie stringów w preprocesorze.
Część 5 - Alternatywy dla preprocesora, wiele symboli i rekurencja.
Część 6 - Problemy z makrami oraz spacje.

Wyszukiwanie wzorców

Najprostszym sposobem, aby wyjaśnić wszystkie wzorce jest opisanie czego dokładnie szuka kompilator. Należy też pamiętać że makra są tylko ( albo aż ) podmianą tekstu. Wszystkie poniżej są prawidłowe:


// Definition
#define MY_DEF                          IsPlayerConnected
// Use
if (MY_DEF(playerid))
// Output
if (IsPlayerConnected(playerid))
// Definition
#define MY_DEF                          IsPlayerConnected(
// Use
if (MY_DEF playerid))
// Output
if (IsPlayerConnected(playerid))
// Definition
#define MY_DEF                          IsPlayerConnected(playerid
// Use
if (MY_DEF))
// Output
if (IsPlayerConnected(playerid))
// Definition
#define MY_DEF                          IsPlayerConnected(playerid))
// Use
if (MY_DEF
// Output
if (IsPlayerConnected(playerid))
// Definition
#define MY_DEF                          if (IsPlayerConnected(playerid))
// Use
MY_DEF
// Output
if (IsPlayerConnected(playerid))
// Definition
#define MY_DEF(%0)                      if (IsPlayerConnected((%0)))
// Use
MY_DEF(playerid)
// Output
if (IsPlayerConnected(playerid))
Nie ma znaczenia czy kod jest poprawny przed podmianą , ważne jest czy jest poprawny po podmianie.
<!--more-->
Definicje

Definicja poniżej składa się tylko z tekstu do podmiany i tekstu na który podmieniasz np. "MAX_PLAYERS". Przykłady powyżej pokazują kilka różnych sytuacji i typów wzorców podmiany.

Makra i definicje mogą zaczynać się od podanych znaków:
 
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
_ @
Dalej możemy używać takich znaków:
 
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ @
Makra

Wzorzec wyszukiwania makra z parametrami ma bardzo prostą składnie składająca się z trzech części.


#define <część 1><część 2><część 3>
Część 1 jest to nazwa makra - jest to ta sama konstrukcja którą widzimy w definicjach i może używać tych samych symboli.

Część 3 jest po prostu znakiem ( dowolnym ) - który kończy makro. Najczęściej jest to ')' - zamykający nawias ale może być to tak naprawdę wszystko.

Część 2 jest tak naprawdę wszystkim innym i może zawierać parametry , litery i liczby i wszystkie inne losowe symbole. Ta część musi się zaczynać od błędnego znaku tak aby kompilator wiedział kiedy kończy się nazwa makra. Ta część zawiera wszystkie parametry.

Przykłady - wszystkie poniżej są prawidłowymi wzorcami wyszukiwania ( poszczególne części zostały podzielone ):
 
// Part 1: MY_FUNC
// Part 2: (
// Part 3: )
#define MY_FUNC()
// Part 1: MY_FUNC
// Part 2: (%0
// Part 3: )
#define MY_FUNC(%0)
// Part 1: MY_FUNC
// Part 2: (%0-%1
// Part 3: )
#define MY_FUNC(%0-%1)
// Part 1: MY_FUNC
// Part 2: $%0,%1
// Part 3: $
#define MY_FUNC$%0,%1$
// Part 1: Module
// Part 2: ->%0(%1
// Part 3: )
#define Module->%0(%1)
// Part 1: CRAZY
// Part 2: ^S%0Y%1
// Part 3: Z
#define CRAZY^S%0Y%1Z
// Part 1: RF
// Part 2: :%0:%1[%2](%3)<%4
// Part 3: >
#define RF:%0:%1[%2](%3)<%4>
Przykłady powyżej powinny wyjaśnić Ci wszystko na temat wzorców podmiany , w dalszych częściach poradnika będzie można jednak zauważyć bardziej szczegółowe opisy. Bardzo częstym błędnym założeniem jest że makro musi składać się z takiej konstrukcji "NAZWA(parametr,parametr)" - tak nie jest w PAWNie ( i szczerze mówiąc jest to niesamowita cecha ) !

Podmiana

Są 4 rodzaje podmian ( według mojej klasyfikacji ) - definicje, makra funkcyjne, makra z kodem i specjalne.
Definicje takie jak "MAX_PLAYERS" definiują pojedynczą liczbę lub ciąg znaków i sa używane zamiast tych stałych.
Makra funkcyjne są używane w miejscach w których mogły by być użyte funkcje a nawet sa podobne do funkcji ( często będę używał nazewnictwa funkcji zamiast konwencji nazewnictwa makr ).
Makra z kodem posiadają w sobie kod często wielolinijkowy - często są nazwy spełniają konwencje nazewnictwa makr aby pokazać ze w tym miejscu dzieje się coś specjalnego , makra tego typu wyglądają często jak makra funkcyjne ale nie mogą być zawsze używane zamiennie.
Makra specjalne sa specjalnymi konstrukcjami rozszerzającymi możliwości języka np. Pętla foreach dla pawn która wygląda jak zwykła instrukcja jezyka pawn ale tak naprawdę jest makrem używającym pętli for.

Makra specjalne będą opisane później a definicje zostały już opisane - w tym poradniku zajmiemy sie makrami funkcyjnymi i z kodem.

Makra Funkcyjne

Część 1 w pewien sposób opisywała już makra i parametry ale jest oczywiście tego więcej.Makra funkcyjne mogą być używane zamiast funkcji ( lub odwrotnie ).

Wyobraźmy sobie ze mamy taki kod:
 
enum E_DATA
{
    Float:E_DATA_HEALTH,
    E_DATA_MONEY
}

new gPlayerData[MAX_PLAYERS][E_DATA];

public OnPlayerConnect(playerid)
{
    gPlayerData[playerid][E_DATA_MONEY] = 100;
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    printf("player %d had %d", playerid, gPlayerData[playerid][E_DATA_MONEY]);
    return 1;
}
Używanie tych wszystkich tablic może być w pewien sposób nieporęczne wiec postaramy się wprowadzić do tego wszystkiego makra:
 
enum E_DATA
{
    Float:E_DATA_HEALTH,
    E_DATA_MONEY
}

new gPlayerData[MAX_PLAYERS][E_DATA];

GetMoney(playerid)
{
    return gPlayerData[playerid][E_DATA_MONEY];
}

SetMoney(playerid, money)
{
    gPlayerData[playerid][E_DATA_MONEY] = money;
}

public OnPlayerConnect(playerid)
{
    SetMoney(playerid, 100);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    printf("player %d had %d", playerid, GetMoney(playerid));
    return 1;
}
Możemy nawet jeszcze bardziej skrócić ten kod dzięki makrom:
 
enum E_DATA
{
    Float:E_DATA_HEALTH,
    E_DATA_MONEY
}

new gPlayerData[MAX_PLAYERS][E_DATA];

#define GetMoney(%0)                                                            \
    gPlayerData[(%0)][E_DATA_MONEY]

#define SetMoney(%0,%1)                                                         \
    gPlayerData[(%0)][E_DATA_MONEY] = (%1)

public OnPlayerConnect(playerid)
{
    SetMoney(playerid, 100);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    printf("player %d had %d", playerid, GetMoney(playerid));
    return 1;
}
Ta wersja kodu jest tak samo szybka jak pierwsza wersja kodu i tak prosta jak druga. Warto zauważyć że makra nie zawierają operacji matematycznych ale i tak są owinięte w nawiasy. Spróbuj pomyśleć chwile co by się stało bez użycia nawiasów tzn "%0" bez nawiasów. W większości nie popełniają takie błędu ale wszystko się może zdarzyć:
 
#define GetMoney(%0)                                                            \
    gPlayerData[%0][E_DATA_MONEY]

public OnPlayerDisconnect(playerid, reason)
{
    printf("player %d had %d", playerid, GetMoney( 0], moo[10 ));
    return 1;
}
Makra funkcyjne tutaj są zaprojektowane aby zastąpić funkcje i być używane jak funkcje - wiec dlatego używają konwencji nazewnictwa funkcji a nie makr.
Jednym z wad używania makr funkcyjnych jest brak nazw parametrów więc aby dowiedzieć się co oznaczają parametry należy przeanalizować kod. Kolejny problemem może być używanie takiego kodu:
 
SetMoney(playerid, money++);
Tego typu problemy są wyjaśnione szczegółowo w części 1. W tym przykładzie kontrola błędów nie jest aż tak ważna skoro parametr jest używany tylko raz , więc parametr jest inkrementowany tylko raz. Jeśli piszesz makro które ma zastąpić małą funkcję i każdy parametr może być użyty tylko raz można używać konwencji nazewnica funkcji jednak jeśli parametr może być używany częściej niż raz warto nazwać makro zgodnie z konwencją definicji aby pozostali programiści wiedzieli aby nie używać tego typu problematycznych konstrukcji:
 
SET_MONEY(playerid, money);
money++;
Kilka przykładów makr funkcyjnych:
 
// Wrapper around printf.
#define DEBUG(%0)                       printf("Debug: %s", (%0))

// Square two numbers - watch out for increments.
#define SQUARE(%0)                      ((%0) * (%0))

// Set a timer to do a passed function every second.
#define EVERY_SECOND(%0)                SetTimer((%0), 1000, 1)

// Show an icon - calls "GetNextIcon", an imaginary custom function (or macro).
#define ShowIcon(%0,%1,%2,%3)                                                   \
    SetPlayerMapIcon(playerid, GetNextIcon(playerid), %1, %2, %3, %0, COLOR_RED)
Makra z Kodem

Makro z kodem są podobne do makr funkcyjnych ale nie mogą być używane w tych samych miejscach:

Makra funkcyjne


// Declaration
#define MY_FUNC(%0)                     ((%0) + 7)

// Uses
if (MY_FUNC(var))

var = MY_FUNC(var);

OtherFunc(MY_FUNC(42));
Makra z Kodem


// Declaration
#define MY_FUNC(%0)                     new b = ((%0) + 7)

// All invalid
if (MY_FUNC(var))

var = MY_FUNC(var);

OtherFunc(MY_FUNC(42));
Makra funkcyjne są poprawne we wszystkich użytych miejscach ponieważ zawiera tylko jedno wyrażenie , makro z kodem zawiera jednak konstrukcje przypisania do zmiennej "if (new b = ((var + y))"
jest oczywiście niepoprawne ( to samo "var = new b = ((var) + 7);" )

PS. "a = b = c;" jest poprawną konstrukcją.

Pomijanie Nawiasów

Część 1 mówiła o owijaniu parametrów makr w nawiasy , jednak nie zawsze jest tak czarno biało !

Przykład z wysyłaniem tekstu do gracza. Który jest kompletnie bez sensu ze względu na możliwość używania formatowania w client_print ale powinien wyjaśnić wszystko:
 
client_print( id ,  print_chat , "Hello there");
Teraz wyobraźmy sobie że chcemy dodać ID gracza do wiadomości:
 
new str[32];
format(str, sizeof (str), "Hello there %d", id);
client_print( id ,  print_chat , str);
Jest oczywiście sposób na zrobienie tego z użyciem makr:
 
#define SendClientMessageFormatted(%0,%1,%2,%3)                                 \
    new str[32];                                                                \
    format(str, sizeof (str), (%2), %3);                                        \
    client_print((%0), (%1), str)
Zauważ że "%3" nie jest owinięte w nawiasy i nie dodaliśmy średnika na końcu. Pomyśl co się stanie gdy użyjemy tego makra:
 
SendClientMessageFormatted(id, print_chat , "Hello there %d", id);
Wygeneruje:
 
new str[32];
format(str, sizeof (str), ("Hello there %d"), id);
client_print((id), (print_chat), str);
A
 
SendClientMessageFormatted(id, print_chat, "Hello there %d, you have $%d", id, money);
Wygneruje:
 
new str[32];
format(str, sizeof (str), ("Hello there %d, you have $%d"), id, money);
client_print((id), (print_chat), str);
A teraz wyobraź sobie co by się stało jeśli owinęli byśmy "%3" w nawiasy i dodali byśmy średnik na końcu.
 
#define SendClientMessageFormatted(%0,%1,%2,%3)                                 \
    new str[32];                                                                \
    format(str, sizeof (str), (%2), (%3));                                      \
    client_print((%0), (%1), str);
SendClientMessageFormatted(id, print_chat, "Hello there %d", id);
Wygeneruje:
 
new str[32];
format(str, sizeof (str), ("Hello there %d"), (playerid));
client_print((id), (print_chat), str);;
"id" jest owinięte w nawiasy ( co jest poprawne ) dodatkowo mamy dwa średniki końcu linii. Jeden z makra a drugi z normalnego kodu , średnik nie jest częścią wzorca wyszukiwania więc nie jest podmieniany. Spróbuj wymyśleć co się stanie przy użyciu takiego kodu:
 
#define a() ;
a();
Wracając do poprzednie przykładu
 
SendClientMessageFormatted(id, print_chat , "Hello there %d, you have $%d", id, money);
Wygeneruje:

new str[32];
format(str, sizeof (str), ("Hello there %d"), (id, money));
client_print((id), (print_chat), str);;
"id, money" zawartość "%3" została owinięta w nawiasy - jest to oczywiście błędna konstrukcja. I nadal mamy podwójny średnik !

Zakres Makr z kodem

Kod powyżej ma jeden problem jeśli zrobimy coś takiego:

SendClientMessageFormatted(id, print_chat 
, "Hello there %d", id);
SendClientMessageFormatted(id, print_chat, "You have $%d", money);
Wygenerujemy taki kod:

new str[32];
format(str, sizeof (str), ("Hello there %d"), id);
SendClientMessage((id), (print_chat), str);
new str[32];
format(str, sizeof (str), ("You have $%d"), money);
SendClientMessage((id), (print_chat), str);
Kompilacja kodu wyżej nie powiedzie się ponieważ deklarujemy str dwukrotnie. Aby tego uniknąć należy zawęzić zakres żywotności zmiennych utworzonych w makrze tylko do makra. Najprostszy sposób to:

#define SendClientMessageFormatted(%0,%1,%2,%3)                                 \
    {                                                                           \
        new str[32];                                                            \
        format(str, sizeof (str), (%2), %3);                                    \
        client_print((%0), (%1), str);                                     \
    }
Co Wygeneruje:

{
    new str[32];
    format(str, sizeof (str), ("Hello there %d"), id);
    client_print((id), (print_chat), str);
};
{
    new str[32];
    format(str, sizeof (str), ("You have $%d"), money);
    client_print((id), (print_chat), str);
};
Ten sposób rozwiązuje problem zasięgu zmiennych ale tworzą kolejny tzn. Nawiasy posiadają średnik za sobą odziedziczony po wywoływaniu makra. To ten sam problem podwójnych średników który widzieliśmy wyżej. Potrzebujemy jakiegoś sposobu oznaczania zakresu zmiennych i konstrukcji wymagającej średnika na końcu. Jedyna konstrukcja która spełnia te wymagania jest "do-while" ale nie chcemy zapętlać kodu!

#define SendClientMessageFormatted(%0,%1,%2,%3)                                 \
    do                                                                          \
    {                                                                           \
        new str[32];                                                            \
        format(str, sizeof (str), (%2), %3);                                    \
        client_print((%0), (%1), str);                                     \
    }                                                                           \
    while (false)
Prawie jesteśmy u celu ! Teraz jednak kompilator zgłasza uwagi co do warunku false. False nigdy nie jest prawdziwe wiec kompilator myśli ze kod jest niepotrzebny. Ostateczny kod to:

#if !defined FALSE
    // stock variables are not included if they're not used.
    stock
        bool:FALSE = false;
#endif

#define SendClientMessageFormatted(%0,%1,%2,%3)                                 \
    do                                                                          \
    {                                                                           \
        new str[32];                                                            \
        format(str, sizeof (str), (%2), %3);                                    \
        client_print((%0), (%1), str);                                     \
    }                                                                           \
    while (FALSE)
Pozbylismy sie problemu zasiegu zmiennych i srednika.
Np.

Kilka przykładów makr z kodem:

// Wrapper around printf with _DEBUG check.
#define DEBUG(%0)                       if (_DEBUG == 1) printf("Debug: %s", (%0))

// Declare a variable.
#define VAR(%0)                         new %0 = -1

// Shortcut to declare a public function.
#define PUBLIC(%0,%1)                                                           \
    forward %0(%1);                                                             \
    public %0(%1)
Dlugie makra

Linie w PAWN mogą być maksymalnie długie na 512 znaków w tym znak nowej linii wiec maksymalnie 510 znaków. Limit ten jest sprawdzany już po wykonaniu w całości preprocesora.
Z tego powodu finalna wersja "SendClientMessageFormatted" nie skompiluje się. Kod powyżej jest tylko pokazaniem pewnej koncepcji nie jest wpelni poprawnym kodem , potrzeba kilku zmian aby zaczął działać.

Aby zredukować długość linii warto usunąć niepotrzebne spacje tabulatory itp.

Więcej o tym w następnych częściach.
  • +
  • -
  • 6


#653137 [ROZWIĄZANE] Dodanie bunny hopa do ganianego by cypis

Napisane przez Alelluja w 27.07.2014 08:47

Proszę

Załączone pliki


  • +
  • -
  • 1


#653132 [ROZWIĄZANE] Dodanie bunny hopa do ganianego by cypis

Napisane przez Oddaj Wiertarke w 27.07.2014 01:40

Spoiler

Łap zobacz czy działa.


  • +
  • -
  • 1


#653126 [ROZWIĄZANE] Dodanie bunny hopa do ganianego by cypis

Napisane przez Oddaj Wiertarke w 27.07.2014 00:56

Wystarczy dodać w funkcji client_PreThink(id)

	if (!on)
		return PLUGIN_CONTINUE
	
	if(get_user_flags(id) & FLAGA)
		return PLUGIN_CONTINUE

Flaga czyli flaga na którą jest vip. A co do szybkości chodzi Ci o tt czy ct?


  • +
  • -
  • 1


#653123 [ROZWIĄZANE] Dodanie bunny hopa do ganianego by cypis

Napisane przez Oddaj Wiertarke w 26.07.2014 23:36

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <jailbreak>
#include <engine>

#define	FL_WATERJUMP	(1<<11)	// player jumping out of water
#define	FL_ONGROUND	(1<<9)	// At rest / on the ground

#define PLUGIN "[Jail] Ganiany"
#define VERSION "1.0.6"
#define AUTHOR "Cypis"


new id_ganiany;
new bool:usun;
new bool:on;


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	
	id_ganiany = jail_register_game("Ganiany");
}


public OnDayStartPre(day, szInfo[256], szInfo2[512], setting[10], gTimeRound)
{ 
	static szTime[12];
	if(day == id_ganiany)
	{
		format_time(szTime, 11, "%M:%S", gTimeRound-30);
		formatex(szInfo2, 511, "Zasady:^n%s - Straznicy zaczynaja ganiac wiezniow^nOstatni wiezien ma zyczenie", szTime);
		szInfo = "Dzisiaj jest Ganiany";
		
		
		for(new i=1; i<=MAX; i++)
		{
			if(!is_user_connected(i) || !is_user_alive(i) || get_user_team(i) != 2)
				continue;
			
			
			strip_user_weapons(i);
			give_item(i, "weapon_knife");
		}
		jail_set_prisoners_micro(true, true);
		jail_set_ct_hit_tt(true);
		jail_set_god_ct(true);
		
		
		setting[0] = 1;
		setting[1] = 1;
		setting[2] = 1;
		setting[4] = 3;
	}
}

public client_PreThink(id) {
	if (!on)
		return PLUGIN_CONTINUE

	entity_set_float(id, EV_FL_fuser2, 0.0)
	if (entity_get_int(id, EV_INT_button) & 2) {
		new flags = entity_get_int(id, EV_INT_flags)

		if (flags & FL_WATERJUMP)
			return PLUGIN_CONTINUE
		if ( entity_get_int(id, EV_INT_waterlevel) >= 2 )
			return PLUGIN_CONTINUE
		if ( !(flags & FL_ONGROUND) )
			return PLUGIN_CONTINUE

		new Float:velocity[3]
		entity_get_vector(id, EV_VEC_velocity, velocity)
		velocity[2] += 250.0
		entity_set_vector(id, EV_VEC_velocity, velocity)

		entity_set_int(id, EV_INT_gaitsequence, 6)
	}
	return PLUGIN_CONTINUE
}

public OnDayStartPost(day)
{
	if(day == id_ganiany)
	{
		jail_set_all_speed(0.1, 2) //blokowanie chodzenia ct
		
		
		jail_open_cele();
		jail_set_game_hud(30, "Rozpoczecie zabawy za");
		on=true;
	}
}


public OnGameHudEnd(day)
{
	if(day == id_ganiany)
	{
		if(!usun)
		{
			jail_set_ct_hit_tt(false);
			jail_set_all_speed(300.0, 2) //ustawienie chodzenia ct
			
			
			jail_set_game_hud(300, "Zakonczenie zabawy za");
		}
		else
		{
			jail_set_play_game(USUWANIE_DANYCH, true);
		}
		usun = !usun;
	}
}


public OnRemoveData(day)
{
	usun = false;
	on=false;
}


//stock
stock jail_set_all_speed(Float:speed, team)
{
	for(new i=1; i<=MAX; i++)
	{
		if(!is_user_alive(i) || !is_user_connected(i) || get_user_team(i) != team)
			continue;
		
		
		jail_set_user_speed(i, speed);
	}
}

Łap powinno działać.

Alelluja skopiowałeś całą funkcje bez zmian co w tym wypadku nie pozwoliło na działanie tego.


  • +
  • -
  • 1


#653083 [ROZWIĄZANE] Dodanie bunny hopa do ganianego by cypis

Napisane przez Alelluja w 26.07.2014 19:00

Może Zadziała Proszę

Załączone pliki


  • +
  • -
  • 1


#651542 [ROZWIĄZANE] wykasowanie pistoletu w pierwszej rundzie

Napisane przez BlackPerfum w 20.07.2014 17:37

P350 przypatrz się:
public Spawn(id)
{
	if(ma_klase[id])
	{
		strip_user_weapons(id)	//to dodales
		
		noze[id] = 20
		new param[1]
		param[0] = id
		if(!task_exists(id + POKAZ_STATUS))
			set_task(0.1, "pokaz_informacje", id+POKAZ_STATUS, _, _, "b");
		if(!task_exists(4247545 + id))
			set_task(0.2, "make_footsteps", 4247545+id, param, 1, "b")
		strip_user_weapons(id) //A to bylo xD
		give_item(id, "weapon_knife");
		g_isDying[id] = true
		set_user_footsteps(id, 1);
		set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 0);
	}
}
GJ xD

Do funkcji cod_class_enabled dodaj funkcje strip_user_weapons + give_item i będzie śmigać
Spoiler

  • +
  • -
  • 3


#650851 [Poprawione] Lepszy sposób zmiany prędkości gracza

Napisane przez BlackPerfum w 18.07.2014 00:11

Zmieniasz wartość prywatną bytu broni, którą Ham_CS_Player_ResetMaxSpeed ustawi graczowi, innymi słowy, zmieniasz prędkość maksymalną gracza, tylko pośrednio.
Nie mniej jednak, właśnie z tego powodu, że zmieniasz wartość jedynie dla broni, jakikolwiek inny event, po którym następuje zmiana maksymalnej prędkości gracza, nadpisze Twoją zmianę u gracza, przez co Twoja "metoda" nie zadziała, zrozum to wreszcie.

Mylisz się!!! Kolejny event nie nadpisze tej wartości. Gdyż pobierze wartość z offsetu m_flWeaponSpeed danej broni a to ją zmieniam a nie maksymalną prędkość gracza. Pewnie nadal nie wierzysz to lepiej ci to wytłumaczę Ham_Item_Deploy wykonuje się przed Ham_CS_Player_ResetMaxSpeed zatem według twojego rozumowania wartość prędkości gracza ustawiona w Ham_Item_Deploy zmieni się w Ham_CS_Player_ResetMaxSpeed. Zatem dlaczego prędkość działa na broniach ze slotu 2/3/4? I tu twoje rozumowanie jest błędne...
 

Zgadza się, że Ham_CS_Player_ResetMaxSpeed skądś pobiera prędkość do ustawienia, ale jedynie w przypadku zmiany broni jest to m_flWeaponSpeed, a jak podkreślałem kilkukrotnie, zmiana broni to NIE JEST JEDYNY event, który wpływa na wystąpienie Ham_CS_Player_ResetMaxSpeed, dlatego Twoja metoda nie będzie działać, jak wspomniałem, choćby po wystąpieniu Zoom, który wywoła Ham_CS_Player_ResetMaxSpeed a ten nie będzie czytał wartości z m_flWeaponSpeed, co wytłumaczyłem wraz z załączonymi logami w poście wyżej.

Tu tez się mylisz ale tylko częściowo bo funkcja Ham_CS_Player_ResetMaxSpeed zawsze pobiera wartość prędkości z Ham_CS_Item_GetMaxSpeed a to z kolei dla broni ze slotów 2/3/4 pobiera wartość z m_flWeaponSpeed a z innych to są stałe, dlatego na sloty 1/5 nie działa mój sposób (w nowych binarkach). To dlaczego jak użyje zoom'a to zwalniam? Bo wartość pobrana jest dzielona/mnożona/dodawana ale nie jest używana żadna stała liczba a nadal pobiera się wartość z Ham_CS_Item_GetMaxSpeed.

 

Offsety są stałe i zapisane w pliku hamdata.ini. A co do slotów, to nie ma to żadnego znaczenia; Ham_CS_Player_ResetMaxSpeed (dla zmiany broni) wywołuje się bez względu na to, jaki slot ma wyciągana broń, co zresztą widać po logach w poście wyżej (27–34 zmiana z noża na glocka).

Mam na myśli offsety pdata nie te z hamdata.ini. Wywołuje się stale ale inaczej pobiera maksymalną prędkość gracza.
 

Przyznaj się do błędu, a nie tkwisz w tym błędnym przekonaniu i nie przyjmujesz do wiadomości, że Ham_CS_Player_ResetMaxSpeed wywołuje się NIE TYLKO podczas zmiany broni.

Wiem że:

Ham_CS_Player_ResetMaxSpeed wywołuje się NIE TYLKO podczas zmiany broni.

Wytłumacz sobie dlaczego na slotach 2/3/4 to dziala a zrozumiesz że moja metoda jest dobra ale niestety przez zmiany w kodzie cs'a prędkość ze slotów 1/5 znajduje się w stałych a nie w zmiennych.

Dowód na moje rozumowanie
Tak jest ustawiana maks prędkość do pobrania dla danej broni:
• ze slotu 2/3/4 (tu jest akurat kod deagl'a) (podam jeden przykład bo tego duzo jest):
Spoiler


• kod ze slotu 1/5 (kod m249):
Spoiler


Poza tym to znalazłem rozwiązanie. Podmieniam 1 post i teraz wszystko działa jak należy możesz sprawdzać
  • +
  • -
  • 2


#650936 [Poprawione] Lepszy sposób zmiany prędkości gracza

Napisane przez BlackPerfum w 18.07.2014 12:11

Zmieniasz wartość prywatną bytu broni, którą Ham_CS_Player_ResetMaxSpeed ustawi graczowi, innymi słowy, zmieniasz prędkość maksymalną gracza, tylko pośrednio.
Nie mniej jednak, właśnie z tego powodu, że zmieniasz wartość jedynie dla broni, jakikolwiek inny event, po którym następuje zmiana maksymalnej prędkości gracza, nadpisze Twoją zmianę u gracza, przez co Twoja "metoda" nie zadziała, zrozum to wreszcie.

totalna bzdura Ham_CS_Player_ResetMaxSpeed nie zmienia offsetu m_flWeaponSpeed. Jedynie pobiera z niego wartość...

Przyznaje się popełniłem błąd. Pierwotny sposób zmiany prędkości był niepoprawny... Ale każdy przedstawiony przez ciebie powód jego błędnego funkcjonowania jest błędny. Dlaczego? Bo pomyliłeś się na starcie tzn. uznałeś iż wartość offsetu m_flWeaponSpeed jest zmieniana w Ham_CS_Player_ResetMaxSpeed lub innych eventach a to bzdura gdyż wartość tego offsetu jest zmieniana tylko i wyłącznie w jednym evencie tzn. Ham_Item_Deploy (dlatego go łapałem jako post).

Pamiętajmy iż na części broni ten sposób działa a na większej części niee. Teraz dlaczego? Dlatego iż tylko część broni używa tego offsetu:
Spoiler


Podczas testowania mogłem użyć innego sposóbu lub jakiegoś fix'a na to iż działało... Jeśli ktoś nie wierzy że ten sposób działa (ale tylko na paru broniach) to proszę o sobie zobaczyć na następujących broniach:

• Knife
• HeGrenade
• SmokeGrenade
• FlashBang
• Usp
• Glock18
• P228
• Deagl
• FiveSeven

Możecie na nich robić co się wam żywnie podoba a nadal prędkość maksymalną będziecie miec taką samą.

Niestety inne bronie są inaczej zrobione przez co nie korzystają z ofsset'ów do ustawiania na nich standardowej prędkości. Zatem klapa bo po co komu sposób którym można jedynie zmienić prędkość na 9 broniach...

Otóż nie gdyż w chwili gdy zauważamy ten błąd nasuwa nam się ciekawa myśl każda broń korzysta z jednej funkcji do pobrania jej standardowej prędkości. Tą funkcję można złapać za pomocą hamsandwich'a nawet w starszych wersjach i zmienić wartość zmienianą na swoją własną. Sposób naprawiony
  • +
  • -
  • 4


#651083 [Poprawione] Lepszy sposób zmiany prędkości gracza

Napisane przez BlackPerfum w 18.07.2014 21:17

nie trzeba bawić sie freeze time'em bo CS robi to za nas!!

Teraz jeszcze został Ci spawn

Właśnie robie to by spawnu nie łapać... Tylko sam frezze time end.

 

Nigdzie tak nie napisałem, ŁŻESZ.

Zmieniasz wartość prywatną bytu broni, którą Ham_CS_Player_ResetMaxSpeed ustawi graczowi, innymi słowy, zmieniasz prędkość maksymalną gracza, tylko pośrednio.
Nie mniej jednak, właśnie z tego powodu, że zmieniasz wartość jedynie dla broni, jakikolwiek inny event, po którym następuje zmiana maksymalnej prędkości gracza, nadpisze Twoją zmianę u gracza, przez co Twoja "metoda" nie zadziała, zrozum to wreszcie.

Tu to napisałeś. Mojej wartości nic nie może nadpisać. Po prostu się nie da (bez ingerencji w kod). Dlaczego zatem jak wyciągnie się AWP to kod (stary) nie działał? Bo awp nie używa offsetów do ustawiania standardowej maksymalnej prędkości. Chcesz się przekonać? Użyj starego sposobu i pozmieniaj parę razy broń między usp --> HE --> Smoke, wartość będzie poprawnie ustawiana. Możesz też zacząć rozbrajać bombę i po przerwaniu lub skończeniu rozbrajania nadal będziesz miał właściwa wartość a nie standardową (nie przy plantowaniu bo nasza broń wtedy by była C4 a C4 nie używa tego offsetu)
 

Zalinkowałeś fragment kodu, który… nie istnieje!

Częściowo istnieje. Samo ustawianie offsetu podanego przeze mnie i pobieranie z niego wartości jest w 100% dobrze przedstawione w załączonym kodzie. Chcesz się przekonać to sprawdź sam, ja sprawdzałem.
 

Reszta posta, standardowo, wyssana z palca. BZDURY.

Cały czas piszesz że coś nadpisze moją wartość, dowiedź tego dla broni:

• Knife
• HeGrenade
• SmokeGrenade
• FlashBang
• Usp
• Glock18
• P228
• Deagl
• FiveSeven

A oddam ci cześć i piwo postawie. Nie mówię o freeze time bo go właśnie chcę uzyskać tak samo np. zatrzymanie podczas rozbrajania (ale po zakończeniu/przerwaniu prędkość ma wrócić do normy). Podaj mi przykład w którym prędkość gracza (na wyżej wymienionych broniach) zmieni się na inną niż pożądana
  • +
  • -
  • 0


#651090 [Poprawione] Lepszy sposób zmiany prędkości gracza

Napisane przez BlackPerfum w 18.07.2014 21:45

Nadpisanie mojej wartości moją wartością = Moja wartość zostaje (tak działa mój kod)

Jeśli twierdzisz inaczej to:

dowiedź tego dla broni:

• Knife
• HeGrenade
• SmokeGrenade
• FlashBang
• Usp
• Glock18
• P228
• Deagl
• FiveSeven

A oddam ci cześć i piwo postawie. Nie mówię o freeze time bo go właśnie chcę uzyskać tak samo np. zatrzymanie podczas rozbrajania (ale po zakończeniu/przerwaniu prędkość ma wrócić do normy). Podaj mi przykład w którym prędkość gracza (na wyżej wymienionych broniach) zmieni się na inną niż pożądana


  • +
  • -
  • -1


#650187 [Poprawione] Lepszy sposób zmiany prędkości gracza

Napisane przez BlackPerfum w 15.07.2014 16:46

Uwaga: Poradnik poprawiony




Na tym forum już jest tutorial o zmianie prędkości gracza (link) lecz pokazuje nam tylko trzy opcje:
CurWeapon
Ham_CS_Player_ResetMaxSpeed
Ham_Item_PreFrame

Osobiście uważam że każda z nich jest w jakimś stopniu nie odpowiednia. Nawet to udowodnie. Wytłumaczenie dlaczego CurWeapon jest złe do ustawienia zmiany prędkości gracza znajdziecie tutaj. Zostały nam zatem jeszcze dwie opcje do wykluczenia.

Ham_Item_PreFrame
Ma tylko jedną wadę tzn. to jest think wykonuje się tyle samo ile gracz posiada fps. Zatem podczas 1 min gry może wykonać się 6000 razy nawet jeśli stoimy w miejscu i totalnie nic nie robimy  xD Czegoś tak nie optymalnego nie chcemy. Dlatego ta opcja od razu odpada.

Ham_CS_Player_ResetMaxSpeed
Patrząc na to teoretycznie to ta funkcja nie posiada wad ale jednak w praktyce się znajdują. Tzn:
• wykonuje sie parę razy więcej niż powinna gdyż nasza prędkość jest resetowana także podczas freeze time'u, śmierci, spawn'u
• W jakiś sposób trzeba rozróżnić wykonanie się tej funkcji w czasie freeze time'u i po nim :(
NAJWAŻNIEJSZE Ta funkcja jest dostepna dopiero w wersji 1.3 hamsandwich'a co jest jej największą wadą gdyż z wielu przyczyn nie każdy ma mozliwość jego aktualizacji :(

Zatem w jaki sposób ustawiać prędkość graczu? Zastanówmy się. Wszystkie dostępne sposoby jakie znalazłem na necie mówią o wymuszaniu prędkości gracza w jakimś evencie lecz po co mamy wymuszać nową wartość prędkości?? Nie lepiej sprawić by CS sam ustawił taką jaką chcemy? Jasne że lepiej to dlaczego nie xD Dlatego wykombinowałem coś swojego hihihi

Do zmiany wartości którą CS ustawia nam jako prędkość będziemy potrzebować:
• hamsanwich'a
• fakemet'y
• umiejętności myślenia

Uwaga jeśli nie masz choćby jednej z wyżej wymienionych rzeczy ten tutorial ci się nie przyda!!!

W teorii pomyślałem tak: złapmy Ham_Item_Deploy pre/post i podmieńmy tam wartość prędkości na swoją własną lecz niestety w praktyce się przekonałem że offsety między Ham_Item_Deploy pre a Ham_Item_Deploy post są przeładowywane :( Dlatego będziemy zmuszeni do operowania tylko na Ham_Item_Deploy post ale na szczęście niczemu to nie wadzi xD

Niestety musimy zmierzyć się jeszcze z jedną acz ostatnią przeszkodą tzn. classname do RegisterHam :( Funkcja Ham_Item_Deploy ma to w sobie że wykonuje się dla broni nie dla gracza dlatego nie można złapać momęt pokazania broni za pomocą classname == player, trzeba używać każdego z osobna classname broni. Ma to swoją wadę i zaletę:
Zaleta: w przypadku chęci zwiększenia prędkości np. tylko na nożu wystarczy złapać tylko classname == weapon_knife
Wada: jesli chce się zmieniać prędkość na wszystkich boniach trzeba złapać ten event dla wszystkich classname standardowych broni

Lista classname standardowych broni: klik

Ogółem to wada jest tak mizerna że nie ma co się o nią fapać xD Bo wystarczy raz na całą mapę przejechać po 31 classname

Ham_CS_Item_GetMaxSpeed posłuży nam jako event zmiany prędkości (ale tylko pre)

Wystarczy gadania. Zróbmy kod:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
//Wymagane moduły
//fakemeta tylko do sprawdzania id gracza/broni (opcjonalny moduł)

const m_pPlayer = 41
const m_iId = 43

public plugin_init()
{
	new classname[32] // Zmienna do której będziemy pobierać classname poszczególnych broni
	for(new i=1;i<31;++i)	if(i!=2)
	{
		//Pętelka na wszystkie bronie

		get_weaponname(i,classname,31) //Pobieram classname danej broni
		
		RegisterHam( Ham_CS_Item_GetMaxSpeed, classname, "GetItemMaxSpeed") //Rejestruje uchwyt na event Ham_CS_Item_GetMaxSpeed dla danego classname broni
		//Ważne 4 arg musi == 0 by to był event typu pre
	}
}

public GetItemMaxSpeed(wid) // tutaj łapie event
{
	//Pamiętajcie wid to id bytu broni (nie mylić z CSW_*)
	
	new weapon,id,Float:Speed // robie zmiennej na id gracza i id z CSW_*
	
	id = get_pdata_cbase(wid,m_pPlayer,4) //Ważne tylko takim sposobem pobierać id gracza który trzyma broń
	// Gdyż użycie pev/entity_get_edict może zwrócić -1 nawet jeśli gracz trzyma broń w momęcie startu/końca pracy serwera gdyż
	// Dane z pev/entity_get_edict są czasami (pod dużym obciążeniem) aktualizowane później niż dane pod offsetem m_pPlayer
	//Tak w ogóle to pobieram id gracza xD
	
	weapon = get_pdata_int(wid,m_iId,4) // Pobieram id broni to z CSW_*
	
	
	//Zeby przytoczyć trochę praktyki to dajmy graczu który posiada flagę ADMIN_LEVEL_H prędkość równą 500 na wszystkich broniach
	// oprócz C4 bo na nim ustawimy 900 xD
	
	//Najpierw sprawdzamy czy posiada flagę ADMIN_LEVEL_H
	if(get_user_flags(id) & ADMIN_LEVEL_H)
	{
		//Teraz muzimy sprawdzić czy aktywna broń to nie C4
		if(weapon != CSW_C4)
		{
			//Jeśli to nie C4
			//Ustawiamy prędkość równą 500.0
			Speed = 500.0
		}
		else
		{
			//Lecz jeśli to C4 to 900
			Speed = 900.0
		}
	}
	//Zmieniam zwracana wartosc
	SetHamReturnFloat(Speed)
	//Informuje o zmianie zwracanej wartosci
	return HAM_OVERRIDE
}
Ten sposób zmiany prędkości nie ma większych wad bo:
• uruchamia się tylko prawie tylko wtedy kiedy naprawdę jest to nam potrzebne niepotrzebnie uruchamia sie podczas: włączania/wyłączania zoom'a, startu/zakończenia rozbrajania paki, startu/zakończenia plantowania paki, pod koniec freeze time (Ham_CS_Player_ResetMaxSpeed uruchamia się częściej)
• nie trzeba bawić sie freeze time'em bo CS robi to za nas!!
• możliwość kożystania już od pierwszej (oficjalnej w amxmodx'ie) wersji hamsandwich'a xD
• nie da się tego zbugować od strony clienta

Opis offset'ów:
m_pPlayer - Typ edict(int). Przechowuje coś w stylu ownera dla danej broni lub byt do którego jest aktualnie przyczepiona (jedno i to samo)
m_iId - Typ int. Przechowuje id broni (to z CSW_*)

To chyba na tyle. Prosty, łatwy i optymalny sposób na zmiane prędkości gracza xD
  • +
  • -
  • 14


#651531 Problem z klasami. Po zmianie klasy bronie i moce zostają z poprzedniej klasy.

Napisane przez BlackPerfum w 20.07.2014 16:48

ja jak robię to mi ciągle klasa pakę wyrzuca.

Zrób nową i podeslij hehe xD
  • +
  • -
  • 1


#652443 Problem z radiem jailbreak.

Napisane przez BlackPerfum w 23.07.2014 17:08

W jakimś pluginie (najprawdopodobniej w głównym pluginie jail'a) łapiesz komendę radia za pomocą funkcji register_clcmd i zwracasz w uchwycie PLUGIN_HANDLED tzn. mam na myśli takie użycie:
// np. w plugins_init
register_clcmd("radio1", "BlokujKomende");
register_clcmd("radio2", "BlokujKomende");
register_clcmd("radio3", "BlokujKomende");



// Gdzieś dalej
public BlokujKomende()    return PLUGIN_HANDLED
Aby działał ci plugin autorstwa DarkGL wystarczy że zamienisz PLUGIN_HANDLED na PLUGIN_HANDLED_MAIN
Aby działało ci zwykłe radio nie możesz żadnej z powyższych wartości zwracać.


Pamiętaj też by sprawdzić czy masz odpowiednio przyciski pobindowane w config'u xD
  • +
  • -
  • 1