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.
|
Krytykiewicz
Rejestracja: 10.11.2012Aktualnie: Poza forum
Poza forum Ostatnio: Prywatna
Statystyki
- Grupa: Użytkownik
- Całość postów: 114
- Odwiedzin: 2 587
- Tytuł: Zaawansowany
- Wiek: Wiek nie został ustalony
- Urodziny: Data urodzin nie została podana
-
Płeć
Mężczyzna
-
Lokalizacja
Stąd
Kontakt
Narzędzia użytkownika
Ostatnio byli
#506195 VIP Generator
Napisane przez Gość w 24.01.2013 20:09
Poprawa AutoBH, drobny fix w menu broni oraz dodanie nowej funkcjonalności,
jaką jest automatyczne generowanie pliku vip.txt na podstawie wybranych opcji.
Plik jest generowany po wybraniu opcji "Automatyczne generowanie motd".
Możliwa jest własna stylizacja MOTD, w tym wybranie koloru tła, czcionki, jej wielkość a nawet wpisania ceny vipa.
Podgląd MOTD pliku vip.txt pojawia się na dole generatora w czasie rzeczywistym wraz z wygenerowaniem kodu.
Dzięki zastosowaniu dodatkowego modułu, gotowy plik vip.txt można pobrać jednym kliknięciem tak samo, jak gotowy plugin.
Dalej pracujemy nad obiecanymi w temacie aktualizacjami, m.in. usuwania duplikatów broni na slocie, a także paroma dodatkami.
Jak napisałem, jest to szybki update, mający na celu przede wszystkim przetestować nową funkcjonalność, obiecany update wkrótce się pojawi
Aha, wraz z wersją 10.0 wycofujemy support dla przeglądarki Internet Explorer 10. I tak niemal nikt z tej przeglądarki nie
korzysta, a osobne implementacje dla IE10 zajmują zbyt dużo czasu, tak więc oficjalnie support dla IE10 zostaje wycofany.
#505909 [ROZWIĄZANE] Porada oraz pytanie na temat IPB
Napisane przez xenos w 23.01.2013 23:34
Przecież w dzisiejszych czasach 75 % forum na silniku IPB, to nulledy. A, że stawiają je na tych nowszych wersjach, to trudniej je rozpoznać.
Tu masz przykład, a Twoje pliki od kolegi też są pirackie
Tak? To amxx.pl też ma pirata: http://amxx.pl/cache/ ?
Różnice masz w tym że jak najedziesz na napis IPB to odniesie Cię do strony twórcy skryptu(na tym pierwszym wyblaknięte brak odnośnika),ogólnie w samym skrypcie jest wiele takich "ukrytych" odnośników przykładowo też powinien być na stronie głównej
#505509 [ROZWIĄZANE] Zabezpieczanie pluginów
Napisane przez DarkGL w 23.01.2013 13:06
#489840 Tworzenie menu - przykłady
Napisane przez sebul w 13.12.2012 07:50
Wstęp wróć↵
Flagi gracza: wróć↵
W pliku "amxconst.inc"
#define ADMIN_ALL 0 /* everyone */
#define ADMIN_IMMUNITY (1<<0) /* flag "a" */
#define ADMIN_RESERVATION (1<<1) /* flag "b" */
#define ADMIN_KICK (1<<2) /* flag "c" */
#define ADMIN_BAN (1<<3) /* flag "d" */
#define ADMIN_SLAY (1<<4) /* flag "e" */
#define ADMIN_MAP (1<<5) /* flag "f" */
#define ADMIN_CVAR (1<<6) /* flag "g" */
#define ADMIN_CFG (1<<7) /* flag "h" */
#define ADMIN_CHAT (1<<8) /* flag "i" */
#define ADMIN_VOTE (1<<9) /* flag "j" */
#define ADMIN_PASSWORD (1<<10) /* flag "k" */
#define ADMIN_RCON (1<<11) /* flag "l" */
#define ADMIN_LEVEL_A (1<<12) /* flag "m" */
#define ADMIN_LEVEL_B (1<<13) /* flag "n" */
#define ADMIN_LEVEL_C (1<<14) /* flag "o" */
#define ADMIN_LEVEL_D (1<<15) /* flag "p" */
#define ADMIN_LEVEL_E (1<<16) /* flag "q" */
#define ADMIN_LEVEL_F (1<<17) /* flag "r" */
#define ADMIN_LEVEL_G (1<<18) /* flag "s" */
#define ADMIN_LEVEL_H (1<<19) /* flag "t" */
#define ADMIN_MENU (1<<20) /* flag "u" */
#define ADMIN_ADMIN (1<<24) /* flag "y" */
#define ADMIN_USER (1<<25) /* flag "z" */
Dodatkowo przydatny będzie ten temat -> http://amxx.pl/topic/60353-flagi/
Wywołanie funkcji komendą: wróć↵
Potrzebne/użyte funkcje:
- register_clcmd
register_clcmd(const client_cmd[], const function[], flags = -1, info[] = "");
client_cmd[] - komenda która musi zostać wpisana w konsoli gracza
function[] - nazwa funkcji która zostanie uruchomiona (musi to być funkcja publiczna)
flags - flagi dostępu
info - opis funkcji - lub register_concmd
register_concmd(const cmd[], const function[], flags = -1, info[] = "");
cmd[] - komenda która musi zostać wpisana w konsoli gracza lub w konsoli serwera
function[] - nazwa funkcji która zostanie uruchomiona (musi to być funkcja publiczna)
flags - flagi dostępu
info - opis funkcji - client_print - do wyświetlenia tekstu u gracza
client_print(index, type, const message[], any:...);
index - id gracza
type - typ wiadomości
print_chat - wiadomość na czacie
message[] - wiadomość
print_center - na środku ekranu
print_console - w konsoli
print_notify - w konsoli w trybie developerskim
any:... - ciągi formatujące - cmd_access - do sprawdzania praw dostępu do funkcji, która jest wywoływana komendą
cmd_access(id, level, cid, num, bool:accesssilent = false);
id - indeks gracza wywołującego komendę
level - poziom dostępu
cid - identyfikator komendy
num - ilość parametrów razem z komendą (gdy brak parametrów podajemy 1)
accesssilent - opcjonalny, jeśli podasz true, to komunikaty z błędami nie będą pokazywane
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Komendy"
#define VERSION "0.1"
#define AUTHOR "Sebul"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("funkcja", "pokazfunkcje"); // funckja pokaże się po wpisaniu "funkcja" w konsoli gracza
register_clcmd("say /funkcja", "pokazfunkcje"); // funckja pokaże się po wpisaniu "/funckja" na ogólnym czacie (podczas gry) przez gracza lub po wpisaniu "say /funckja" w konsoli gracza
register_concmd("funkcja2", "pokazfunkcje"); // funckja pokaże się po wpisaniu "funckja2" w konsoli gracza lub w konsoli serwera
register_clcmd("funkcja3", "pokazfunkcje", ADMIN_IMMUNITY); // funkcja pokaże się po wpisaniu "funkcja3" w konsoli gracza, który ma immunitet (flagę a)
register_concmd("funkcja4", "pokazfunkcje", ADMIN_KICK, "cos tam"); // funkcja pokaże się po wpisaniu "funkcja4" w konsoli gracza, który ma flagę c lub gdy komenda "funkcja4" zostanie wpisana w konsoli serwera
}
public pokazfunkcje(id, level, cid) {
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED;
client_print(0, print_chat, "Gracz o id=%i wyswietlil funkcje ^"pokazfunkcje^"", id);
return PLUGIN_HANDLED;
}
Formatowanie tekstu: wróć↵
^n - nowa linia
^t - odstęp, inaczej tabulator (różniący się od spacji)
\w - dalszy tekst będzie miał kolor biały
\y - dalszy tekst będzie miał kolor zółty
\r - dalszy tekst będzie miał kolor czerwony
\d - dalszy tekst będzie miał kolor szary
\R - dalszy tekst będzie wyrównany do prawej
Do formatowania tekstu (nie tylko w menu), można używać format lub formatex dla większej przejrzystości, a szczególnie gdy mamy dużo tekstu do formatowania.
Definicje klawiszy: wróć↵
W pliku "amxconst.inc"
/* Menu keys */
#define MENU_KEY_1 (1<<0)
#define MENU_KEY_2 (1<<1)
#define MENU_KEY_3 (1<<2)
#define MENU_KEY_4 (1<<3)
#define MENU_KEY_5 (1<<4)
#define MENU_KEY_6 (1<<5)
#define MENU_KEY_7 (1<<6)
#define MENU_KEY_8 (1<<7)
#define MENU_KEY_9 (1<<8)
#define MENU_KEY_0 (1<<9)
Użycie switcha: wróć↵
Warto używać, szczególnie gdy w menu (i nie tylko) mamy dużo opcji.
Przykład:
new costam = 1;
switch(costam) {
case 0: {
client_print(id, print_chat, "Wartosc zmiennej wynosi 0");
}
case 1: {
client_print(id, print_chat, "Wartosc zmiennej wynosi 1"); // w tym przypadku wyświetli się nam ta wiadomość, gdyż zmienna "costam" ma przypisaną wartość 1
}
case 2: {
client_print(id, print_chat, "Wartosc zmiennej wynosi 2");
}
default: {
client_print(id, print_chat, "Wartosc zmiennej jest inna niz 0, 1 lub 2");
}
}
Stare menu wróć↵
Do stworzenia starego menu, potrzebujemy:
- register_menucmd
register_menucmd(menuid, keys, const function[]);
menuid - id naszego menu, które tworzy się za pomocą "register_menuid"
keys - jakie klawisze ma rozpoznawać nasze menu, liczba 1023 jest dla wszystkich (od 1 do 0)
function[] - nazwa funkcji w której pokazujemy menu - register_menuid
register_menuid(const menu[], outside = 0);
menu[] - nazwa menu
outside - zamieniamy na 1, gdy menu jest z innego źródła, np. inny plugin - show_menu
show_menu(index, keys, const menu[], time = -1, const title[] = "");
index - id gracza
keys - jakie klawisze ma rozpoznawać nasze menu, liczba 1023 jest dla wszystkich (od 1 do 0)
menu[] - treść menu
time - czas (w sekundach) wyświetlania menu, -1 oznacza, że menu zamknie się dopiero, gdy gracz naciśnie jakiś dostępny klawisz
title[] - nazwa menu - Jest jeszcze register_menu, ale ja nigdy z tego nie korzystałem, więc nie będę teraz tej funkcji opisywał.
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Stare Menu"
#define VERSION "0.1"
#define AUTHOR "Sebul"
#define TESTMENU_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_0 // tworzymy stałą z trzema klawiszami: 1, 2 i 0
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "staremenu");
register_menucmd(register_menuid("Testowe Menu"), TESTMENU_KEYS, "staremenuhandle"); // rejestrujemy menu o nazwie "Testowe Menu" i wykorzystujemy TESTMENU_KEYS
}
public staremenu(id) {
show_menu(id, TESTMENU_KEYS, "\yWidzisz menu?^n^n\w1. Tak^t2. Nie^n^n0. Wyjdz", -1, "Testowe Menu"); // pokazujemy menu, dostępne tylko trzy klawisze
return PLUGIN_HANDLED;
}
public staremenuhandle(id, key) { // funkcja posiada dwa parametry, id gracza oraz użyty klawisz
switch(key) { // używamy switcha, pamiętamy, że klawisz 1 ma wartość 0, a klawisz 2 - 1, itd.
case 0: {
client_print(id, print_chat, "Wybrales tak.");
}
case 1: {
client_print(id, print_chat, "Wybrales nie.");
}
// nie trzeba robić "case 9:", bo i tak wykona się tylko return na samym dole
}
return PLUGIN_HANDLED; // menu się zamknie
}
Nowe menu wróć↵
Do stworzenia nowego menu, potrzebujemy:
- menu_create - tworzenie menu oraz jego uchwytu
menu_create(const title[], const handler[], ml = 0);
title[] - nazwa menu oraz jego nagłówek gdy MPROP_TITLE nie ustawione
handler[] - nazwa funkcji do której będą przekazywane informacje (musi to być funkcja publiczna)
ml - nie trzeba podawać - menu_makecallback - tworzenie funkcji kontrolnej
menu_makecallback(const function[]);
function[] - nazwa funkcji kontrolnej (musi to być funkcja publiczna), w dalszej części będzie to bardziej opisane - menu_additem - dodawania opcji
menu_additem(menu, const name[], const info[] = "", paccess = 0, callback = -1);
menu - uchwyt stworzonego wcześniej menu
name[] - nazwa dodawanej opcji
info[] - dodatkowe informacje, które można przekazać do menu
paccess - flagi dostępu do danej opcji, w dalszej części będzie to bardziej opisane
callback - funkcja kontrolna, w dalszej części będzie to bardziej opisane - menu_setprop - konfiguracja menu
menu_setprop(menu, prop, ...);
menu - uchwyt stworzonego wcześniej menu
prop - opcja z listy (plik "newmenus.inc"):
#define MPROP_PERPAGE 1 /* Liczba opcji na stronę (param1 = liczba, 0=bez stronnicowania, 7=domyślnie oraz maksymalnie) */
#define MPROP_BACKNAME 2 /* Nazwa opcji Back/Wstecz (param1 = tekst) */
#define MPROP_NEXTNAME 3 /* Nazwa opcji Next/Dalej (param1 = tekst) */
#define MPROP_EXITNAME 4 /* Nazwa opcji Exit/Wyjście (param1 = tekst) */
#define MPROP_TITLE 5 /* Nagłówek menu (param1 = tekst) */
#define MPROP_EXIT 6 /* Opcja wyjścia? (param1 = liczba, MEXIT_ALL - zawsze, MEXIT_NEVER - nidgy) */
#define MPROP_NOCOLORS 8 /* Czy usunąć automatyczne kolory(param1 = liczba, 0=domyślnie) */
#define MPROP_NUMBER_COLOR 10 /* Kolor numerów opcji (param1 = tekst, "\r"=domyślny) */
... - wartość wybranej opcji - menu_display - wyświetlenie menu
menu_display(id, menu, page = 0);
id - id gracza
menu - uchwyt stworzonego wcześniej menu
page - strona w menu, którą ma wyświetlić jako pierwszą - menu_destroy - niszczenie menu
menu_destroy(menu);
menu - uchwyt stworzonego wcześniej menu - menu_item_getinfo - pobieranie informacji z menu (nie do końca opisane)
menu_item_getinfo(menu, item, &access, info[], infolen, name[] = "", namelen = 0, &callback);
menu - uchwyt stworzonego wcześniej menu
item - podajemy numer opcji z menu (zaczyna się od 0)
access - flagi dostępu do danej opcji
info[] - dodatkowe informacje danej opcji
infolen - maksymalna długość tablicy info[]
name[] - nazwa danej opcji
namelen - maksymalna długość tablicy name[]
callback - ? (chyba id/uchwyt z funkcji "menu_makecallback")
Gdy menu jest zawsze takie same dla każdego gracza, wystarczy utworzyć je tylko raz
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Nowe Menu"
#define VERSION "0.1"
#define AUTHOR "Sebul"
new g_testmenu; // tworzymy zmienną globalną, uchwyt dla menu
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu");
}
public plugin_cfg() { // tworzymy menu, np. w tej funkcji, bo wykonuje się ona tylko raz na mapę
g_testmenu = menu_create("Widzisz menu?", "nowemenuhandle");
menu_additem(g_testmenu, "Tak"); // item = 0
menu_additem(g_testmenu, "Nie"); // item = 1
menu_setprop(g_testmenu, MPROP_EXITNAME, "Wyjscie");
}
public nowemenu(id) {
menu_display(id, g_testmenu);
return PLUGIN_HANDLED;
}
public nowemenuhandle(id, menu, item) { // funkcja posiada trzy parametry, id gracza, uchwyt menu oraz klawisz/item/opcję, która została wybrana
if(item == MENU_EXIT) {
return PLUGIN_HANDLED; // zamykamy menu, generalnie nie trzeba dodawać tutaj tego warunku, ale z przyzwyczajenia ja go tutaj dodaję, zresztą czasami nawet lepiej to robić na samej górze funkcji
}
switch(item) { // używamy switcha, pamiętamy, że wartość klawisza/itemu/opcji zaczyna się od 0
case 0: {
client_print(id, print_chat, "Wybrales tak.");
}
case 1: {
client_print(id, print_chat, "Wybrales nie.");
}
}
return PLUGIN_HANDLED;
}
Gdy menu zmienia się, czyli nie jest ciągle takie same, wtedy trzeba tworzyć je oraz niszczyć za każdym razem (z wykorzystaniem get_user_team)
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Nowe Menu"
#define VERSION "0.1"
#define AUTHOR "Sebul"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu");
}
public nowemenu(id) {
new testmenu = menu_create("Widzisz menu?", "nowemenuhandle");
if(get_user_team(id) == 1) {
menu_additem(testmenu, "Tak"); // item = 0
menu_additem(testmenu, "Nie"); // item = 1
}
else {
menu_additem(testmenu, "Nie"); // item = 0
menu_additem(testmenu, "Tak"); // item = 1
}
menu_setprop(testmenu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, testmenu);
return PLUGIN_HANDLED;
}
public nowemenuhandle(id, menu, item) { // funkcja posiada trzy parametry, id gracza, uchwyt menu oraz klawisz/item/opcję, która została wybrana
if(item == MENU_EXIT) {
menu_destroy(menu); // niszczymy menu przy wyjściu z niego
return PLUGIN_HANDLED;
}
client_print(id, print_chat, "Wybrales opcje: %i", item);
menu_destroy(menu); // niszczymy menu przy wybraniu jakiejkolwiek opcji
return PLUGIN_HANDLED;
}
Przykład wykorzystania menu_item_getinfo, dodatkowo wykorzystane zostało także: is_user_alive, is_user_connected, get_user_name oraz num_to_str
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Nowe Menu - menu_item_getinfo"
#define VERSION "0.1"
#define AUTHOR "Sebul"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu");
}
public nowemenu(id) {
new testmenu = menu_create("Lista zywych graczy:", "nowemenuhandle");
new name[48], tempid[6], i;
for(i=1; i<=32; ++i) { // pętla for od 1 do 32, bo id graczy zaczyna się od 1, a maksymalna ilość graczy to 32 (lub mniej)
if(!is_user_alive(i)) // sprawdzamy, czy gracz żyje
continue;
get_user_name(i, name, 47); // pobieramy jego nick
num_to_str(i, tempid, 5); // zamieniamy id żywego gracza na tekst
menu_additem(testmenu, name, tempid); // dodajemy opcję do menu
}
menu_setprop(testmenu, MPROP_BACKNAME, "Wroc");
menu_setprop(testmenu, MPROP_NEXTNAME, "Dalej");
menu_setprop(testmenu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, testmenu);
return PLUGIN_HANDLED;
}
public nowemenuhandle(id, menu, item) { // funkcja posiada trzy parametry, id gracza, uchwyt menu oraz klawisz/item/opcję, która została wybrana
if(item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new data[6], iName[64];
new access, callback;
menu_item_getinfo(menu, item, access, data, 5, iName, 63, callback);
new id2 = str_to_num(data);
if(!is_user_connected(id2)) {
client_print(id, print_chat, "Gracza o id=%i, nie ma na serwerze", id2);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new name[48]; get_user_name(id2, name, 47);
client_print(id, print_chat, "Wybrales %s, jego pozycja w menu to %i", name, item);
/* jeśli po wyświetleniu menu długo nie będziemy wybierać gracza, to może się okazać, że wybranego gracza nie ma już na serwerze,
a na jego miejscu jest już ktoś inny, aby uniknąć takich przypadków, należy stosować jescze jakieś dodatkowe sprawdzanie */
menu_destroy(menu);
return PLUGIN_HANDLED;
}
Funkcja kontrolna: wróć↵
Każda opcja w menu może mieć swoją funkcję kontrolną, która może ją włączyć lub wyłączyć.
Do tworzenia funkcji kontrolnej wykorzystujemy menu_makecallback.
Przykład:
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Nowe Menu - funkcja kontrolna"
#define VERSION "0.1"
#define AUTHOR "Sebul"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu");
}
public nowemenu(id) {
new testmenu = menu_create("Jestes zywy?", "nowemenuhandle");
new menucallback = menu_makecallback("nowemenucallback");
menu_additem(testmenu, "Tak", _, _, menucallback); // item = 0
menu_additem(testmenu, "Nie", _, _, menucallback); // item = 1
menu_additem(testmenu, "Nie wiem", _, _, menucallback); // item = 2
menu_setprop(testmenu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, testmenu);
return PLUGIN_HANDLED;
}
public nowemenucallback(id, menu, item) { // funkcja kontolna także ma trzy parametry, id gracza, uchwyt menu oraz klawisz/item/opcję, która została wybrana
if(item == 0 && !is_user_alive(id)) // jeśli item = 0 (opcja "tak") i gracz nie żyje, to nie będzie mógł tego wybrać
return ITEM_DISABLED;
else if(item == 1 && is_user_alive(id)) // jeśli item = 1 (opcja "nie") i gracz żyje, to nie będzie mógł tego wybrać
return ITEM_DISABLED;
return ITEM_ENABLED;
}
public nowemenuhandle(id, menu, item) { // funkcja posiada trzy parametry, id gracza, uchwyt menu oraz klawisz/item/opcję, która została wybrana
if(item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}
switch(item) { // używamy switcha, pamiętamy, że wartość klawisza/itemu/opcji zaczyna się od 0
case 0: {
client_print(id, print_chat, "Wybrales tak.");
}
case 1: {
client_print(id, print_chat, "Wybrales nie.");
}
case 2: {
client_print(id, print_chat, "Wybrales nie wiem.");
}
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
Przykłady menu na flagę wróć↵
Zarówno w starym menu, jak i nowym można ograniczać dostęp albo do całego menu, albo do poszczególnych opcji w menu. Poniżej będzie to pokazane w obu stylach menu.
W starym menu wróć↵
Blokowanie całego menu, gdy można je wywołać tylko poprzez komendę
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Stare Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
#define TESTMENU_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_0
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "staremenu", ADMIN_BAN); // tylko admin będzie mógl użyć tej komendy oraz wyświetlić menu
register_menucmd(register_menuid("Testowe Menu"), TESTMENU_KEYS, "staremenuhandle");
}
public staremenu(id) {
if(!cmd_access(id, level, cid, 1)) // sprawdzamy, czy dana osoba posiada uprawnienia
return PLUGIN_HANDLED;
show_menu(id, TESTMENU_KEYS, "\yWidzisz menu?^n^n\w1. Tak^t2. Nie^n^n0. Wyjdz", -1, "Testowe Menu");
return PLUGIN_HANDLED;
}
public staremenuhandle(id, key) {
switch(key) {
case 0: {
client_print(id, print_chat, "Wybrales tak.");
}
case 1: {
client_print(id, print_chat, "Wybrales nie.");
}
}
return PLUGIN_HANDLED;
}
Blokowanie całego menu, gdy można je wywołać nie tylko poprzez komendę, np. menu wyświetla się także przy spawnie
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#define PLUGIN "Stare Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
#define TESTMENU_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_0
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "staremenu");
RegisterHam(Ham_Spawn, "player", "Spawn", 1);
register_menucmd(register_menuid("Testowe Menu"), TESTMENU_KEYS, "staremenuhandle");
}
public Spawn(id) {
if(!is_user_alive(id))
return;
staremenu(id);
}
public staremenu(id) {
if(!(get_user_flags(id) & ADMIN_BAN)) // sprawdzamy, czy dana osoba posiada uprawnienia
return PLUGIN_HANDLED;
show_menu(id, TESTMENU_KEYS, "\yWidzisz menu?^n^n\w1. Tak^t2. Nie^n^n0. Wyjdz", -1, "Testowe Menu");
return PLUGIN_HANDLED;
}
public staremenuhandle(id, key) {
switch(key) {
case 0: {
client_print(id, print_chat, "Wybrales tak.");
}
case 1: {
client_print(id, print_chat, "Wybrales nie.");
}
}
return PLUGIN_HANDLED;
}
Blokowanie opcji w menu po wciśnięciu klawisza (czyli bez blokowania klawiszy)
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Stare Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
#define TESTMENU_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_0
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "staremenu");
register_menucmd(register_menuid("Testowe Menu"), TESTMENU_KEYS, "staremenuhandle");
}
public staremenu(id) {
show_menu(id, TESTMENU_KEYS, "\yKim jestes?^n^n\w1. Graczem^n2. Adminem^n3. Mam immunitet^n^n0. Wyjdz", -1, "Testowe Menu");
return PLUGIN_HANDLED;
}
public staremenuhandle(id, key) {
switch(key) {
case 0: {
client_print(id, print_chat, "Jestes graczem."); // dostępne dla każdego
}
case 1: {
if(get_user_flags(id) & ADMIN_BAN) // tylko dla admina
client_print(id, print_chat, "Jestes adminem.");
}
case 2: {
if(get_user_flags(id) & ADMIN_IMMUNITY) // tylko dla admina z flagą a
client_print(id, print_chat, "Posiadasz immunitet.");
}
}
return PLUGIN_HANDLED;
}
Blokowanie opcji w menu przed wciśnięciem klawisza (czyli z blokowaniem klawiszy)
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Stare Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
#define TESTMENU_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_0
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "staremenu");
register_menucmd(register_menuid("Testowe Menu"), TESTMENU_KEYS, "staremenuhandle");
}
public staremenu(id) {
new klawisze = TESTMENU_KEYS;
if(!(get_user_flags(id) & ADMIN_BAN))
klawisze &= ~MENU_KEY_2; // jeśli gracz nie ma flagi admina, to wyłącza klawisz 2 (opcję 2)
if(!(get_user_flags(id) & ADMIN_IMMUNITY))
klawisze &= ~MENU_KEY_3; // jeśli gracz nie ma immunitetu, to wyłącza klawisz 3 (opcję 3)
show_menu(id, klawisze, "\yKim jestes?^n^n\w1. Graczem^n2. Adminem^n3. Mam immunitet^n^n0. Wyjdz", -1, "Testowe Menu");
return PLUGIN_HANDLED;
}
public staremenuhandle(id, key) {
switch(key) {
case 0: {
client_print(id, print_chat, "Jestes graczem."); // dostępne dla każdego
}
case 1: {
client_print(id, print_chat, "Jestes adminem."); // tutaj nie trzeba już sprawdzać, czy gracz posiada flagę admina
}
case 2: {
client_print(id, print_chat, "Posiadasz immunitet."); // tutaj nie trzeba już sprawdzać, czy gracz posiada immunitet
}
}
return PLUGIN_HANDLED;
}
W nowym menu wróć↵
Blokowanie całego menu, gdy można je wywołać tylko poprzez komendę
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Nowe Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
new g_testmenu;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu", ADMIN_BAN); // tylko admin będzie mógl użyć tej komendy oraz wyświetlić menu
}
public plugin_cfg() {
g_testmenu = menu_create("Widzisz menu?", "nowemenuhandle");
menu_additem(g_testmenu, "Tak"); // item = 0
menu_additem(g_testmenu, "Nie"); // item = 1
menu_setprop(g_testmenu, MPROP_EXITNAME, "Wyjscie");
}
public nowemenu(id) {
if(!cmd_access(id, level, cid, 1)) // sprawdzamy, czy dana osoba posiada uprawnienia
return PLUGIN_HANDLED;
menu_display(id, g_testmenu);
return PLUGIN_HANDLED;
}
public nowemenuhandle(id, menu, item) {
if(item == MENU_EXIT) {
return PLUGIN_HANDLED;
}
switch(item) {
case 0: {
client_print(id, print_chat, "Wybrales tak.");
}
case 1: {
client_print(id, print_chat, "Wybrales nie.");
}
}
return PLUGIN_HANDLED;
}
Blokowanie całego menu, gdy można je wywołać nie tylko poprzez komendę, np. menu wyświetla się także przy spawnie
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#define PLUGIN "Nowe Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
new g_testmenu;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu");
RegisterHam(Ham_Spawn, "player", "Spawn", 1);
}
public plugin_cfg() {
g_testmenu = menu_create("Widzisz menu?", "nowemenuhandle");
menu_additem(g_testmenu, "Tak"); // item = 0
menu_additem(g_testmenu, "Nie"); // item = 1
menu_setprop(g_testmenu, MPROP_EXITNAME, "Wyjscie");
}
public Spawn(id) {
if(!is_user_alive(id))
return;
nowemenu(id);
}
public nowemenu(id) {
if(!(get_user_flags(id) & ADMIN_BAN)) // sprawdzamy, czy dana osoba posiada uprawnienia
return PLUGIN_HANDLED;
menu_display(id, g_testmenu);
return PLUGIN_HANDLED;
}
public nowemenuhandle(id, menu, item) {
if(item == MENU_EXIT) {
return PLUGIN_HANDLED;
}
switch(item) {
case 0: {
client_print(id, print_chat, "Wybrales tak.");
}
case 1: {
client_print(id, print_chat, "Wybrales nie.");
}
}
return PLUGIN_HANDLED;
}
Blokowanie opcji w menu po wciśnięciu klawisza
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Nowe Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
new g_testmenu;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu");
}
public plugin_cfg() {
g_testmenu = menu_create("Kim jestes?", "nowemenuhandle");
menu_additem(g_testmenu, "Graczem"); // item = 0
menu_additem(g_testmenu, "Adminem"); // item = 1
menu_additem(g_testmenu, "Mam immunitet"); // item = 2
menu_setprop(g_testmenu, MPROP_EXITNAME, "Wyjscie");
}
public nowemenu(id) {
menu_display(id, g_testmenu);
return PLUGIN_HANDLED;
}
public nowemenuhandle(id, menu, item) {
if(item == MENU_EXIT) {
return PLUGIN_HANDLED;
}
switch(item) {
case 0: {
client_print(id, print_chat, "Jestes graczem."); // dostępne dla każdego
}
case 1: {
if(get_user_flags(id) & ADMIN_BAN) // tylko dla admina
client_print(id, print_chat, "Jestes adminem.");
}
case 2: {
if(get_user_flags(id) & ADMIN_IMMUNITY) // tylko dla admina z flagą a
client_print(id, print_chat, "Posiadasz immunitet.");
}
}
return PLUGIN_HANDLED;
}
Blokowanie opcji w menu przed wciśnięciem klawisza
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Nowe Menu - flagi"
#define VERSION "0.1"
#define AUTHOR "Sebul"
new g_testmenu;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "nowemenu");
}
public plugin_cfg() {
g_testmenu = menu_create("Kim jestes?", "nowemenuhandle");
menu_additem(g_testmenu, "Graczem"); // item 0 dla każdego
menu_additem(g_testmenu, "Adminem", _, ADMIN_BAN); // ustawia item 1 tylko dla adminów
menu_additem(g_testmenu, "Mam immunitet", _, ADMIN_IMMUNITY); // ustawia item 2 tylko dla graczy z immunitetem
menu_setprop(g_testmenu, MPROP_EXITNAME, "Wyjscie");
}
public nowemenu(id) {
menu_display(id, g_testmenu);
return PLUGIN_HANDLED;
}
public nowemenuhandle(id, menu, item) {
if(item == MENU_EXIT) {
return PLUGIN_HANDLED;
}
switch(item) {
case 0: {
client_print(id, print_chat, "Jestes graczem."); // dostępne dla każdego
}
case 1: {
client_print(id, print_chat, "Jestes adminem."); // tutaj nie trzeba już sprawdzać, czy gracz posiada flagę admina
}
case 2: {
client_print(id, print_chat, "Posiadasz immunitet."); // tutaj nie trzeba już sprawdzać, czy gracz posiada immunitet
}
}
return PLUGIN_HANDLED;
}
Można jeszcze daną opcję dodawać na flagę przy użyciu menu_makecallback, ale nie warto tego używać do takich rzeczy, skoro są lepsze i szybsze sposoby (te które wymieniłem wyżej).
Paczka pluginów użytych w tym poradniku: tworzenie_menu.rar 281,57 KB 190 Ilość pobrań
No i tym sposobem doszliśmy do końca ;]
Wróć na początek↵
#503878 Lucky_skill
Napisane przez MarWit w 19.01.2013 19:35
#501651 Ustawienie szybkości gracza **VIP**
Napisane przez Gość w 15.01.2013 11:11
Ponadto pobranie prędkości gracza w evencie CurWeapon pobierze niezaktualizowaną prędkość gracza, tym samym ustalisz błędną prędkość graczowi.
RegisterHam(Ham_Item_PreFrame, "player", "fw_Player_ResetMaxSpeed", 1);
public fw_Player_ResetMaxSpeed(id){
if(bSpeed[id] && is_user_alive(id)){
set_user_maxspeed(id, get_user_maxspeed(id) + 50);
}
}
Ponadto, maksymalna prędkość jest ograniczona poprzez cvar sv_maxspeed po stronie serwera oraz po stronie graczy:
- cl_forwardspeed dla tempa chodzenia do przodu
- cl_backspeed dla tempa cofania się
- cl_sidespeed dla tempa chodzenia w bok
- cl_upspeed dla tempa wspinania się (np. po drabinie)
- cl_yawspeed dla tempa obracania się
Limit ten jednak może zostać zmieniony poprzez np. Orpheu.
#501835 RoundSound
Napisane przez speedkill w 15.01.2013 20:10
Jest to plugin większości znany, odtwarza on muzykę na koniec rundy, w zależności który team wygrał.
Ktoś spyta czym ten plugin różni się od tych pozostałych?
Plugin ten posiada:
- Wczytywanie utworów z pliku RoundSound.ini
- Playlista dla każdego teamu z osobna
- Możliwość przesłuchania każdego z utworu
- Możliwość ustawienia dla którego teamu ma być dana piosenka
- Tytuły piosenek podajemy w tym samym pliku
- Plugin wczytuje wszystko na początku mapy, tylko raz!
- Dokładne logowanie o przebiegu wczytywania każdej piosenki
- Możliwość włączenia/wyłączenia roundsound'a
- Pokazywanie jaka piosenka obecnie jest odgrywana
- Możliwość ustawienia m.in. gdzie ma się pokazywać jaka piosenka jest odgrywana ( czat lub ukrycie tego )
- Komenda /last, dzięki której możemy zobaczyć tytuł ostatniej piosenki
- Wyłączanie / włączanie, odsłuchiwanie utworów odbywa się w menu
- Reklama na czacie co ustalony czas cvarem, o istnieniu takich komend jak /last itp.
- Blokowanie pluginu, jeżeli plik RoundSound.ini nie istnieje w folderze configs/
- Możliwość wyłączenia reklam dotyczących roundsound'a
- Możliwość zmiany pozycji wyświetlania obecnego utworu
- Możliwość ustawienia czy muzyka ma się odtwarzać losowo czy po kolei
- Możliwość wyświetlenia użytkownikowi tytłu piosenki, a także wyłączenie tego
amxmodx
Roundsound_ads_time /* Czas wyświetlania wiadomości w sekundach [ domyślnie 120 ] | Limit nie mniej niż 30 sekund */ Roundsound_prefix /* Prefix wiadomości dotyczących roundsounda [ domyślnie RoundSound ] */ Roundsound_show_type /* Wyświetlanie informacji o obecnym utworze [ domyślnie 1 ] | 1 - Chat | 0 - Brak */ Roundsound_random_music /* Czy muzyka ma się odtwarzać losowo [ domyślnie 0 ] | 1 - Losowo | 0 - Po kolei */ Roundsound_show_playlist /* Czy ma pokazywać nazwy utworów ( w odsłuchiwaniu, pod koniec rundy lub gdy gracz użyje komendy /last ) [ domyślnie 1 ] | 1 - Tak | 0 - Nie */
Otwiera główne menu, w którym można wyłączyć lub włączyć roundsounda, posłuchać utworów CT / TT, wyłączyć reklamy, oraz zmienić pozycję wyświetlania:
say /rs say /roundsound say_team /rs say_team /roundsoundPokazywanie ostatniego utworu, który został odegrany:
say /last say_team /last
Tworzymy plik RoundSound.ini w folderze configs, następnie uzupełniamy go tak:
"Ścieżka" "Tytuł" "Team"Przykładowo:
"misc/RoundSound/1.mp3" "All I Want For Christmas Is You" "TT"Ważne! Ścieżkę podajemy tak jakbyśmy się znajdowali w folderze sound/, wyżej został podany przykład.
Standardowa.
Autor: Michał "speedkill" Mulik
Czysta wersja:
amxmodx.rar 17,71 KB 6535 Ilość pobrań
RoundSound.sma 10,41 KB 3869 Ilość pobrań
RoundSound.amxx
#500151 Osoby Roku 2012 - Wyniki
Napisane przez Gość w 11.01.2013 23:04
Tworzy niesamowite, wysokiej jakości modyfikacje i pluginy na poziomie, dbając o każdy szczegół.
Wciąż nas zaskakuje, łamiąc kolejne bariery w programowaniu pod AMXX i tworząc coraz to ciekawsze mody.
Jednak serdeczne wyrazy uznania wysyłam także do wielu pozostałych osób, które nie znalazły się w powyższych wynikach, a zasługują na pochwałę.
dla CheQ za wieczny optymizm i wielkie serce okazywane użytkownikom, nie tylko w postaci pomocy, ale także i krzepienia ducha
dla Sebula za wytrwałość i umiejętność stosowania niekonwencjonalnych rozwiązań oraz szeregu przydatnych publikacji
dla MarWita za nieocenione, staranne skrypty, bez których stworzenie wielu modyfikacji byłoby wręcz niemożliwych
dla Fili:Pa za ciekawe pomysły, wiele nietuzinkowych prac i ciągłe zaskakiwanie nas nowymi rozwiązaniami
dla Ojca Dyrektora za zimną krew i radzenie sobie z wieloma trudnymi przypadkami na forum i poza nim
dla Sharka za wyjątkowe poczucie humoru, za samą jego obecność na forum i trafne, ale dobitne uwagi
dla Kawona za naprawdę sporą cierpliwość, wyrozumiałość i rzadko spotykaną pracowitość na forum
dla Onyke za niepowtarzalny i dopracowany kod i racjonalne podejście do wielu istotnych problemów
dla Speedkilla za olbrzymią pracę, jaką wkłada w pomoc i zaangażowanie, którego często nie widać
dla Portka za najlepsze poczucie humoru, nieocenioną pomoc, trafne argumenty i spostrzeżenia
dla Na 5tyka za staranne pogłębianie swojej wiedzy i niemałą pomoc udzieloną wielu osobom
dla Cypisa za dokładność i staranność w wielu tworzonych przez siebie, potężnych aplikacji
dla GwynBleidDa za wyjątkową dbałość o szczegóły i cenne porady, jakie nam przekazuje
i dla całej reszty społeczności forum, która dzieli się swoją wiedzą i umiejętnościami.
Jesteście wspaniali. Gratulacje!
#494198 Generator Broni Niestandardowych
Napisane przez Fili:P w 27.12.2012 09:43
Link do niego: Weapon Creator by Fili:P
Serdecznie, jak można zauważyć po linku, dziękuję beniowi za użyczenie hostingu. Jeżeli coś nie tak z generatorem proszę śmiało pisać pozdrawiam.
Nie można podmieniać AK47, ponieważ nie można zmieniać jego sprite.
Nie można na raz dać graczowi 2 broni, które podmieniają 1 broń.
Wygenerowany kod udostępnia 2 natywy, których nazwy sami ustawiamy. Pierwszy natyw daje nam broń, a drugi ją zabiera.
Pliki potrzebne do stworzenia nowej broni:
- Model P
- Model V
- Model W
- Sprite z niewybraną bronią.
- Sprite z wybraną bronią ( można podać ten sam plik do tych 2 )
- Plik z konfiguracją sprite. Więcej na ten temat: http://forums.allied...ad.php?t=175632
#360863 Fake Team Bot v1.3
Napisane przez sebul w 08.02.2012 21:57
To samo co tutaj http://amxx.pl/topic...e-team-bot-v11/ tylko z jedną ważną przeróbką. Plugin dodaje boty gdy na serwerze jest mniej graczy niż X (edytowane cvarem), ale także kickuje je, gdy warunek ten nie zostanie spełniony, czyli gdy jest więcej graczy. Stan graczy sprawdzany jest co kilka sekund, więc na boty trzeba czasami trochę poczekać. Sam mam ten plugin u siebie na serwerze, co prawda na początku było w nim parę bugów, ale zostały one już chyba naprawione, bo od dłuższego czasu wszystko jest ok.
dm_fakebot_min_player "8" // poniżej ilu graczy ma być na serwerze, aby boty się dodały
Standardowa.
Załączone pliki
-
faketeambot.sma 2,63 KB 1315 Ilość pobrań
faketeambot.amxx
#494271 Licenja
Napisane przez dasiek w 27.12.2012 11:43
#493897 Menu Admina v 1.0
Napisane przez speedkill w 26.12.2012 16:33
public cbmenu_admina(id,menu,item) { if(!is_user_connected(id)) return PLUGIN_CONTINUE; if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_CONTINUE; } switch(item) { case 0: { Gracz(id) opcja = 1 } case 1: { Gracz(id) opcja = 2 } case 2: { Gracz(id) opcja = 3 } case 3: { Gracz(id) opcja = 4 } case 4: { Gracz(id) opcja = 5 } case 5: { Gracz(id) opcja = 6 } case 6: { Gracz(id) opcja = 7 } } return PLUGIN_CONTINUE; }
public cbmenu_admina(id,menu,item){ if(item == MENU_EXIT){ menu_destroy(menu); return PLUGIN_CONTINUE; } if(is_user_connected(id)){ Gracz(id) opcja = item + 1; } return PLUGIN_CONTINUE; }Nie łatwiej ?
#493856 Colorchat - 2 inne wersje
Napisane przez sebul w 26.12.2012 15:18
#if defined _colorchat_included
#endinput
#endif
#define _colorchat_included
#define COLORMAXSLOTS 32
#define COLORCODE_NORMAL 0x01
#define COLORCODE_TEAM 0x03
#define COLORCODE_GREEN 0x04
enum Color {
NORMAL = 1, // Yellow
GREEN, // Green Color
TEAM_COLOR, // Red, grey, blue
GREY, // grey
RED, // Red
BLUE, // Blue
}
new const ColorTeamName[][] = {
"",
"TERRORIST",
"CT",
"SPECTATOR"
}
stock const ColorCodeType[] = {
0x00,
COLORCODE_NORMAL,
COLORCODE_GREEN,
COLORCODE_TEAM,
COLORCODE_TEAM,
COLORCODE_TEAM,
COLORCODE_TEAM
}
public ColorChat(id, Color:type, const msg[], any:...) { // {Float,Sql,Result,_}
static message[256];
switch(type) {
case NORMAL: message[0] = COLORCODE_NORMAL; // Yellow
case GREEN: message[0] = COLORCODE_GREEN; // Green
default: message[0] = COLORCODE_TEAM; // White, Red, Blue
}
vformat(message[1], 254, msg, 4);
message[190] = '^0';
new index, MSG_Type;
if(!id) {
index = ColorFindPlayer();
MSG_Type = MSG_ALL;
}
else {
MSG_Type = MSG_ONE;
index = id;
}
if(!is_user_connected(index))
return;
new team, ColorChange;
team = get_user_team(index);
ColorChange = ColorSelection(index, team, MSG_Type, type);
ShowColorMessage(index, MSG_Type, message);
if(ColorChange)
ColorTeamInfo(index, MSG_Type, ColorTeamName[team]);
}
ShowColorMessage(id, type, const message[]) {
message_begin(type, 76, _, id);
write_byte(id);
write_string(message);
message_end();
}
ColorTeamInfo(id, type, const szTeam[]) {
message_begin(type, 86, _, id);
write_byte(id);
write_string(szTeam);
message_end();
return 1;
}
ColorSelection(index, iTeam, msgtype, Color:Type) {
switch(Type) {
case RED: {
if(iTeam != 1)
return ColorTeamInfo(index, msgtype, ColorTeamName[1]);
}
case BLUE: {
if(iTeam != 2)
return ColorTeamInfo(index, msgtype, ColorTeamName[2]);
}
case GREY: {
if(iTeam != 0 && iTeam != 3)
return ColorTeamInfo(index, msgtype, ColorTeamName[0]);
}
}
return 0;
}
ColorFindPlayer() {
new i = 0;
while(i < COLORMAXSLOTS) {
if(is_user_connected(++i) && !is_user_hltv(i))
return i;
}
return -1;
}
Colorchat 2
#if defined _colorchat_included
#endinput
#endif
#define _colorchat_included
#define COLORCODE_NORMAL 0x01
#define COLORCODE_TEAM 0x03
#define COLORCODE_GREEN 0x04
enum Color {
NORMAL = 1, // Yellow
GREEN, // Green Color
TEAM_COLOR, // Red, grey, blue
GREY, // grey
RED, // Red
BLUE, // Blue
}
new const ColorTeamName[][] = {
"",
"TERRORIST",
"CT",
"SPECTATOR"
}
stock const ColorCodeType[] = {
0x00,
COLORCODE_NORMAL,
COLORCODE_GREEN,
COLORCODE_TEAM,
COLORCODE_TEAM,
COLORCODE_TEAM,
COLORCODE_TEAM
}
public ColorChat(id, Color:type, const msg[], any:...) { // {Float,Sql,Result,_}
static message[256];
switch(type) {
case NORMAL: message[0] = COLORCODE_NORMAL; // Yellow
case GREEN: message[0] = COLORCODE_GREEN; // Green
default: message[0] = COLORCODE_TEAM; // White, Red, Blue
}
vformat(message[1], 254, msg, 4);
message[190] = '^0';
new team, ColorChange;
if(!id) {
new ColPlay[32], ColNum, i;
get_players(ColPlay, ColNum);
for(i=0; i<ColNum; ++i) {
team = get_user_team(ColPlay[i]);
ColorChange = ColorSelection(ColPlay[i], team, type);
ShowColorMessage(ColPlay[i], message);
if(ColorChange)
ColorTeamInfo(ColPlay[i], ColorTeamName[team]);
}
}
else {
if(!is_user_connected(id))
return;
team = get_user_team(id);
ColorChange = ColorSelection(id, team, type);
ShowColorMessage(id, message);
if(ColorChange)
ColorTeamInfo(id, ColorTeamName[team]);
}
}
ShowColorMessage(id, const message[]) {
message_begin(MSG_ONE, 76, _, id);
write_byte(id);
write_string(message);
message_end();
}
ColorTeamInfo(id, const szTeam[]) {
message_begin(MSG_ONE, 86, _, id);
write_byte(id);
write_string(szTeam);
message_end();
return 1;
}
ColorSelection(id, iTeam, Color:Type) {
switch(Type) {
case RED: {
if(iTeam != 1)
return ColorTeamInfo(id, ColorTeamName[1]);
}
case BLUE: {
if(iTeam != 2)
return ColorTeamInfo(id, ColorTeamName[2]);
}
case GREY: {
if(iTeam != 0 && iTeam != 3)
return ColorTeamInfo(id, ColorTeamName[0]);
}
}
return 0;
}
Załączone pliki
-
colorchat.inc 2,18 KB 246 Ilość pobrań
-
colorchat2.inc 2,11 KB 181 Ilość pobrań
#493771 Optymalny sposób - menu sklepu
Napisane przez Fili:P w 26.12.2012 11:37
Oto jego kod:
#include < amxmodx >
#include < cstrike >
#define PLUGIN "Fili:Shop Api"
#define VERSION "1.0"
#define AUTHOR "Fili:P"
#define KOMENDA "say /sklep"
enum
{
TEAM_TT = 1,
TEAM_CT
}
new Array:nazwy_item,
Array:koszt_item,
Array:team_item,
items = 0;
public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHOR );
register_clcmd( KOMENDA, "shop" );
nazwy_item = ArrayCreate( 1, 32 );
koszt_item = ArrayCreate( 1, 1 );
team_item = ArrayCreate( 1, 1 );
}
public plugin_natives()
{
register_native( "item_register", "_itemreg" );
// native item_register( name[ 32 ], koszt, team );
}
public shop( id )
{
if( !is_user_alive( id ) )
{
client_print( id, print_chat, "Musisz zyc, aby kupywac w sklepie!" );
return PLUGIN_CONTINUE;
}
new menu = menu_create( "Sklep", "shop_handle" );
for( new i = 0; i<ArraySize( koszt_item ); i++ )
{
if( !( (1<<ArrayGetCell( team_item, i )) & (1<<get_user_team( id ) ) ) )
continue;
new szName[ 32 ];
ArrayGetString( nazwy_item, i, szName, 31 );
new szItem[ 40 ];
formatex( szItem, 39, "%s \y$%d", szName, ArrayGetCell( koszt_item, i ) );
menu_additem( menu, szItem );
}
return PLUGIN_CONTINUE;
}
public shop_handle( id, menu, item )
{
if( item == MENU_EXIT )
return PLUGIN_HANDLED;
for( new i = 0; i<ArraySize( koszt_item ); i++ )
{
if( !( (1<<ArrayGetCell( team_item, i )) & (1<<get_user_team( id ) ) ) )
continue;
if( ArrayGetCell( koszt_item, i ) > cs_get_user_money( id ) )
{
client_print( id, print_chat, "Nie masz dosc pieniedzy, aby kupic ten przedmiot!" );
continue;
}
cs_set_user_money( id, cs_get_user_money( id ) - ArrayGetCell( koszt_item, i ) );
new iRet;
ExecuteForward( CreateMultiForward( "item_buy", ET_CONTINUE, FP_CELL, FP_CELL ), iRet, id, i );
}
return PLUGIN_HANDLED;
}
public itemreg( plugin, params )
{
new name[ 32 ];
get_string( 1, name, 31 );
ArrayPushString( nazwy_item, name );
ArrayPushCell( koszt_item, get_param( 2 ) );
ArrayPushCell( team_item, get_param( 3 ) );
items++;
return items-1;
}
Jeżeli chcesz zmienić komendę otwierającą sklep zamień ją w lini:
#define KOMENDA "say /sklep"
Tworzenie itemów
W plugin_init rejestrujemy przedmiot:
item_register( "Gold M4", 10000 /* to oznacza że zapłacimy 10000$ */, TEAM_CT );
W 3 argumencie możemy użyć sumy bitowej
Wartości to TEAM_TT i TEAM_CT.
Wykrycie kupna itemu
Nie miałem pojęcia, czy chcesz aby item był na runde czy na ile, więc po prostu wywołuje się forward podczas kupna przedmiotu a zabierasz go gdy chcesz.
public item_buy( id, item )
{
// gracz kupil item
}
Przykładowy item - Smoke
#include <amxmodx>
#include <fun>
native item_register( nazwa[ 32 ], koszt, team );
new item_id;
public plugin_init() {
register_plugin("", "", "")
item_id = item_register( "Smoke grenade", 100, TEAM_CT|TEAM_TT );
}
public item_buy( id, item )
{
if( item != item_id )
return 0;
give_item( id, "weapon_smokegrenade" );
}
#493718 Optymalny sposób - menu sklepu
Napisane przez GwynBleidD w 26.12.2012 00:22
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: Krytykiewicz
- Regulamin