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.
|
Statystyki
- Grupa: Przyjaciel
- Całość postów: 2 334
- Odwiedzin: 24 684
- Tytuł: Godlike
- Wiek: 28 lat
- Urodziny: Listopad 23, 1995
-
Imię
Maciej
-
Płeć
Mężczyzna
-
Lokalizacja
Mońki
#437898 Proszę o komplikacje pluginu COD BOTS +++
Napisane przez kamilos3311 w 29.07.2012 20:45
W załączniku nie dam bo nie można dawać .amxx
link: http://speedy.sh/AaghW/COD-Bots.amxx
#423921 [ROZWIĄZANE COD NOWY] Jak usunąć klasę na serwerze?
Napisane przez Split w 24.06.2012 15:27
1 Sposob: Wejdz w amxmodx/conficg/plugin-codmod.ini/ i tam masz np codclass_snajper.amxx to to usuwasz
2.Sposob: Wejdz w amxmodx/plugins/np masz tam plugin codclass_snajpe.amxx to usuwas go
3. Sposob Wejdz w amxmodx/conficg/Plugins-codmod.ini/ usun np codclass_snajper.amxx potem wejdz w amxmodx/plugins i usun ten plugin
<ciach>
#418568 Diablo Mod by Stachu
Napisane przez Stachuu :D ?? w 07.06.2012 14:11
Na wstepie powiem ze jest to odkopany plik sma (ostatnio edytowany okolo 4 miechy temu)
wiec nie mam do niego modeli plikow .txt .
mysle ze bedzie on sluzyl jako pomoc przy robieniu wlasnych Dm
Moze troche o tym co jest w tym calym pliku sma
1.Gildie (by me)
2.Artefakty
3.Wlasny system questow
4.27 klas
5.Przynajmniej 5 calkiem nowych mocy (licze tylko te ktorych odpowiednikow nie spotkalem na innych serwerach/lub wyszlyodemnie)
Nie mam glowy aby rozpisywac all wiec zamieszczam plik i zycze powodzenia w przeszukiwaniu moda
W razie pytan piszcie w tym temacie.
newdiablo.sma 348,53 KB 3663 Ilość pobrań
newdiablo.amxx
#418815 Diablo Mod by Stachu
Napisane przez Nakupenda. w 08.06.2012 09:17
A Ci bardziej doświadczeni bedą mieli dużo większy orzech do zgryzienia, jak wymyśleć coś jeszcze bardziej "innego" i innowacyjnego, bo zaraz każdy będzie miał artefakty i gildie.
Jżeeli o mnie chodzi to sory ale minus.
#410976 Niech Ktos MI napisze Klasee
Napisane przez KubusGrubcio w 15.05.2012 21:23
#410363 Dobre i złe nawyki tworzenia menu
Napisane przez GwynBleidD w 14.05.2012 14:00
Krótka przedmowa, czyli o czym ten poradnik
Będzie to poradnik nie o samym tworzeniu menu, lecz o tym jak to, w zależności od sytuacji, robić prawidłowo. Skupię się tutaj wyłącznie na nowym typie menu, który w najnowszym amx umożliwia prawie tą samą funkcjonalność, co stary typ menu, a dużo większą wygodę użycia. Jedynym brakiem tutaj jest brak możliwości utworzenia linii informacyjnej przed pierwszym elementem w menu (czyli zaraz pod tytułem), co jednak można obejść tworząc wielolinijkowy tytuł, o czym na końcu tego tutorialu w ramach bonusu W praktyce będzie to prawie wyłącznie o użyciu info w menu, czyli jak go używać z głową i do czego może się przydać.
Omówienie funkcji zostawiam dokumentacji Najpierw omówię złe praktyki i opiszę dlaczego są złe
1. Konstruowanie switcha w oparciu o info
Często widzę taki "koszmarek" jak sterowanie switchem w handlerze poprzez info, gdzie w info zawiera się numer pozycji, w postaci tekstu. Jeśli nie wiesz o czym mówię, zobacz przykład:
public show_menu(id) { new menu = menu_create("Menu serwera", "handle_menu"); menu_additem(menu, "Wyświetl regulamin", "1"); if(cs_get_user_team(id)==CS_TEAM_CT) menu_additem(menu, "Kup AK47", "2"); else menu_additem(menu, "Kup M4A1", "2"); menu_additem(menu, "Wyświetl top15", "3"); menu_additem(menu, "Zobacz inne serwery", "4"); menu_additem(menu, "Przekaż pieniąde graczowi", "5"); menu_display(id, menu) } public handle_menu(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } new sKey[6], iKey, access, callback; menu_item_getinfo(menu, item, access, sKey, 5,_, _, callback); iKey = str_to_num(sKey); switch(iKey) { case 1: client_cmd(id, "say /regulamin"); case 2: daj_bron(id); case 3: client_cmd(id, "say /top15"); case 4: client_cmd(id, "say /serwery"); case 5: client_cmd(id, "say /przelew"); } menu_destroy(menu); return PLUGIN_HANDLED; }
Co tu i dlaczego jest źle? a to, że wymyślamy koło na nowo i marnotrawimy zasoby. Otóż niepotrzebnie używamy 3ciego parametru itemów z menu o nazwie info, aby determinować co klient kliknął w menu, przez co generujemy niepotrzebne utworzenie 3ch zmiennych w handlerze, konieczność pobrania info i przekonwertowania na postać numeryczną + podanie do każdego itemu dodatkowego parametru info, co generuje dodatkowe zużycie zasobów. Może i niewielkie, ale na pewno niepotrzebne Więc na pewno tworzenie menu w taki sposób dobrą praktyką nie jest.
ad 1. Konstruowanie switcha w oparciu o parametr item
Teraz poprawna wersja z użyciem, stworzonego do tego celu, parametru item z handlera, który przechowuje numer tego elementu, licząc od 0, czyli ten sam plugin wyglądać może tak:
public show_menu(id) { new menu = menu_create("Menu serwera", "handle_menu"); menu_additem(menu, "Wyświetl regulamin"); if(cs_get_user_team(id)==CS_TEAM_CT) menu_additem(menu, "Kup AK47"); else menu_additem(menu, "Kup M4A1"); menu_additem(menu, "Wyświetl top15"); menu_additem(menu, "Zobacz inne serwery"); menu_additem(menu, "Przekaż pieniąde graczowi"); menu_display(id, menu) } public handle_menu(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } switch(item) { case 0: client_cmd(id, "say /regulamin"); case 1: daj_bron(id); case 2: client_cmd(id, "say /top15"); case 3: client_cmd(id, "say /serwery"); case 4: client_cmd(id, "say /przelew"); } menu_destroy(menu); return PLUGIN_HANDLED; }
i gwarantuję, że zadziała tak samo, a nawet lepiej Numeracja w item jest niezależna od numeracji klawiszy w menu, więc każdy additem i tylko additem zwiększa nam numer o 1, zaczynamy od 0 o czym trzeba pamiętać koniecznie. Exit nie ma numeru 0, ale specjalną wartość nazwaną MENU_EXIT, równą -3 (-2 i -1 to odpowiednio wstecz i dalej).
Trochę o samym parametrze info
No dobra, ale czym w końcu jest to info? Ano jest to informacja, którą możemy przekazać do handlerów menu, aby poinformować go o tym, co zawiera dana opcja. W przypadku przykładu 1, gdzie tworzymy je w kodzie statycznie lub prawie statycznie (różni się etykieta itemu pod klawiszem 2 w zależności od drużyny w podanym przykładzie) jest całkowicie zbędne. Jednak może się przydać przy tworzeniu dynamicznego menu. Oto następna zła praktyka:
2. Nieprawidłowe menu z graczami
Przyjrzyjmy się przykładowej implementacji menu do przelewu kasy, w którym możemy wybrać danego gracza i przelać mu pieniądze. Dla uproszczenia przyjąłem, że podaną funkcję show_przelew wywołuje handler z poprzedniego menu wyboru ilości kasy do przelania. Ilość ta jest podana w parametrze wartosc. gWartosci to 33 elementowa tablica globalna:
public show_przelew(id, wartosc) { new menu = menu_create("Wybierz gracza do przelania kasy", "handle_przelew"); gWartosci[id] = wartosc; new players[32], num; get_players(players, num); for(new i=0; i<num; ++i) { new name[32]; get_user_name(players[i], name, 31); menu_additem(menu, name); } menu_display(id, menu); } public handle_przelew(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } new players[32], num; get_players(players, num); przelej_kase(id, players[item], gWartosci[id]); menu_destroy(menu); return PLUGIN_HANDLED; }
Niby wszystko pięknie, na oko i po pierwszych testach działa, bo przecież itemów tworzymy tyle ile graczy, więc item będzie nam zwracał zawsze pozycję w tablicy players, którą zajmował dany gracz. No prawie... Bo co się stanie jak ktoś wyjdzie z serwera albo ktoś na serwer wejdzie? Jeśli nastąpi to w tablicy po indeksie gracza, którego chcemy wybrać to jeszcze pół biedy, ale jeśli przed to kolejność się zmieni. A niestety widziałem takie praktyki w wielu pluginach... No i w tym momencie dajemy kasę nie temu graczowi co trzeba...
ad 2. Prawidłowo działające menu z graczami
Jak to poprawić? użyć info! Tutaj, w przeciwieństwie do przykładu pierwszego, należy go użyć. Więc używajmy:
public show_przelew(id, wartosc) { new menu = menu_create("Wybierz gracza do przelania kasy", "handle_przelew"); new players[32], num; new name[32], info[25]; get_players(players, num); for(new i=0; i<num; ++i) { get_user_name(players[i], name, 31); formatex(info, 24, "%08X%08X%08X", wartosc, players[i], get_user_userid(players[i])); /*info[0] = wartosc; POPRAWKA - TEGO SPOSOBU WIĘCEJ NIE UŻYWAMY! info[1] = players[i]; info[2] = get_user_userid(players[i]); */ menu_additem(menu, name, info); } menu_display(id, menu); } public handle_przelew(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } new info[25], access, callback; menu_item_getinfo(menu, item, access, info, 24,_, _, callback); new tid = hexstr_to_num(info[8], 8); // zaczynamy od 8 znaku i pobieramy 8 z nich, konwertując je z hex na liczbę new tuserid = hexstr_to_num(info[16], 8); new wartosc = hexstr_to_num(info, 8); if(is_user_connected(tid) && tuserid == get_user_userid(tid)) przelej_kase(id, tid, wartosc); menu_destroy(menu); return PLUGIN_HANDLED; } hexstr_to_num(string[], chars) { new result=0; for(new i=0; i<chars && string[i]!='^0'; ++i) result = result<<4 + (string[i]>'9'?string[i]>'F'?string[i]-'a'+10:string[i]-'A'+10:string[i]-'0'); return result; } }
Jak widać potrzebne wartości, czyli id gracza i wartość kasy do przelania. Ale co? Przecież to nie jest napis, tylko tablica... A kto powiedział albo gdzieś napisał, że info musi być napisem? Może być tablicą, wszak napis też jest tablicą, tyle że specyficznie interpretowaną więc zastosowanie jak najbardziej prawidłowe. (Znów aktualizacja! Ostatnio odkryłem, że niestety gdy funkcja napotka wartość 0, przerywa całkowicie wczytywanie dalszych wartości! Musimy więc przerobić liczbę na string!) Utworzyłem prosty string z 3 wartości liczbowych w postaci heksadecymalnej. Użyłem dość dziwnej konstrukcji %08F, zapewnia to wypełnienie zerami z przodu tak, aby liczba zawsze zajmowała 8 znaków. Dlaczego każda ma liczba każda w AMX ma 32 bity, jedna cyfra HEX może zapisać 4, dalej chyba już jasne Stworzyłem również funkcję konwertującą string hexadecymalny na liczbę, aby wydobyć ze stringa spowrotem wartości. Dlaczego użyłem HEX? Prościej jest konwertować to na liczbę i zajmuje stałą ilość znaków Teraz już nie martwimy się, że jakiś gracz ucieknie z serwera (no chyba, że ucieka nam gracz, do którego chcemy przelać kasę... ale wtedy po prostu kasa się nie przeleje, chyba że ktoś na miejsce wychodzącego gracza akurat wejdzie, na taki przypadek można zrobić weryfikację nicku lub sid jeszcze) (aktualizowałem kod pluginu zgodnie z sugestią użytkownika sebul) i mamy elegancko zrobione menu Jednocześnie zbędna stała się globalna tablica gWartosci, gdyż wartość kasy przesyłamy w tym samym info, co id gracza.
Mam nadzieję, że przykład ten jasno ilustruje do czego info w nowych menu powinno być używane.
3. Menu statyczne wyboru serwera, przykład nieco gorszy
Teraz jeszcze jeden przykład uzasadnionego użycia info, mimo menu statycznego. Oczywiście na początek ten... może tym razem po prostu gorszy, bo jak najbardziej poprawny przykład, menu serwerów:
public show_serwery(id) { new menu = menu_create("Wybierz serwer na który chcesz przejść", "handle_serwery"); menu_additem(menu, "Serwer GunGame"); menu_additem(menu, "Serwer FFA"); menu_additem(menu, "Serwer Diablo"); menu_display(id, menu); } public handle_serwery(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } switch(item) { case 0: client_cmd(id, "Connect 23.123.33.22:27033"); case 1: client_cmd(id, "Connect 12.34.56.78:27090"); case 2: client_cmd(id, "Connect 98.76.54.32:27010"); } menu_destroy(menu); return PLUGIN_HANDLED; }
Dlaczego przykład jest gorszy? trudniejszy w edycji, musimy w 2ch miejscach zmieniać, gdy chcemy zmienić listę serwerów.
ad 3. Menu wyboru serwera, przykład lepszy, wygodniejszy
Mimo, że poprawny jest, przedstawiam wariant wygodniejszy:
public show_serwery(id) { new menu = menu_create("Wybierz serwer na który chcesz przejść", "handle_serwery"); menu_additem(menu, "Serwer GunGame", "23.123.33.22:27033"); menu_additem(menu, "Serwer FFA", "12.34.56.78:27090"); menu_additem(menu, "Serwer Diablo", "98.76.54.32:27010"); menu_display(id, menu); } public handle_serwery(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } new ip[32], access, callback; menu_item_getinfo(menu, item, access, ip, 31,_, _, callback); client_cmd(id, "Connect %s", ip); menu_destroy(menu); return PLUGIN_HANDLED; }
W ten oto sposób mamy dużo wygodniejsze dodawanie i edycję listy serwerów, bo dla każdego serwera jest to jedna, przejrzysta linia. Dodatkowo drobną modyfikacją można uzyskać listę serwerów odczytywaną z pliku, nvaulta albo bazy SQL, wstawiając odpowiednią pętlę zamiast additem, oraz dodając obsługę jednego z wymienionych. Tutaj, mimo menu statycznego, mamy w pełni uzasadnione użycie info do determinowania akcji podejmowanej przez menu
I na koniec obiecany bonus
Jak wiecie, dzięki starym menu można tworzyć coś, co przypomina, albo i nie przypomina menu, np wyświetlić regulamin na kilkanaście linii i pod nim dać możliwość jego akceptacji. Na nowym menu można dokładnie to samo, wymaga to jednak tricków kilku.
O ile nie ma żadnych problemów, gdy np. chcemy wstawić po każdej opcji w menu linijkę opisującą, albo gdy wszystkie opcje w menu mają być na samej górze, a dodatkowy tekst na dole, gdyż jest coś takiego jak menu_addblank i menu_addtext. Nie możemy ich jednak użyć przed użyciem choć raz menu_additem (nie wiem dlaczego tak twórcy amx głupio zrobili, ale tak zrobili). Jednak jest możliwość ominięcia tego niuansu przez ustawienie potrzebnych nam rzeczy w wielolinijkowym tytule. Tu następne ograniczenie: ustawienie tytułu poprzez menu_create posiada dosyć rygorystyczny limit znaków, musimy więc ustawić to poprzez menu_setprop(menu, MPROP_TITLE, ...) czyli np coś takiego:
menu = menu_create("Regulamin serwera", "handler"); menu_setprop(menu, MPROP_TITLE, "Regulamin serwera \yGunGame^n^nNa serwerze obowiązuje\rABSOLUTNY\yzakaz przeklinania^nNie wolno bugować mapy..."); menu_additem(menu, "Akceptuję regulamin"); menu_additem(menu, "Nie akceptuję regulaminu"); menu_addtext(menu, " Nie zaakceptowanie regulaminu wiąże się z 5 minutowym banem"); menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
I w taki sposób uzyskujemy ładny, czytelny regulamin, na nowych menu, z możliwością akceptacji Prawda, że proste
Dziękuję za dotrwanie do końca
Copyright © Wszelkie prawa zastrzeżone
Kopiowanie tego poradnika lub treści w nim zawartych bez wyraźnej zgody autora jest zabronione i będzie ścigane z mocy prawa
#409855 [ROZWIĄZANE] Szukam pliginu interp_raty.amxx
Napisane przez Pawlak093 w 13.05.2012 12:00
#409968 Logo sieci pod oknem ściągania, przy wejściu na serwer
Napisane przez TomekLex w 13.05.2012 14:21
#409941 Logo sieci pod oknem ściągania, przy wejściu na serwer
Napisane przez Słupski w 13.05.2012 13:53
Za pomoc oczywiście będzie +
Czekam na odpowiedzi.
Pozdrawiam, Słupski
#406537 Bug perki
Napisane przez game4player w 04.05.2012 20:35
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <hamsandwich> #include <codmod> #define DMG_BULLET (1<<1) new wartosc_perku[33]; new bool:ma_perk[33]; public plugin_init() { register_plugin("Fart Strzelca", "1.0", "QTM_Peyote"); cod_register_perk("Fart Strzelca", "Masz 1/3 szans na natychmiastowe zabicie z USP/GLOCK18", 6, 12); RegisterHam(Ham_TakeDamage, "player", "TakeDamage") } public cod_perk_enabled(id, wartosc) { wartosc_perku[id] = wartosc; ma_perk[id] = true; } public cod_perk_disabled(id) ma_perk[id] = false public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits) { if(!is_user_connected(idattacker)) return HAM_IGNORED; if(!ma_perk[idattacker]) return HAM_IGNORED; if(get_user_team(this) == get_user_team(idattacker)) return HAM_IGNORED; if(random_num(1, wartosc_perku[idattacker]) != 1) return HAM_IGNORED; if(!(damagebits & DMG_BULLET)) return HAM_IGNORED; new weapon = get_user_weapon(idattacker); if(weapon != CSW_USP && weapon != CSW_GLOCK18) return HAM_IGNORED; SetHamParamFloat(4, float(get_user_health(this))) return HAM_IGNORED; }
Platynowe
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <hamsandwich> #include <codmod> new const perk_name[] = "Platynowe Naboje"; new const perk_desc[] = "Zadajesz 30 obrazen wiecej"; new bool:ma_perk[33]; new wartosc_perku[33]; public plugin_init() { register_plugin(perk_name, "1.0", "QTM_Peyote"); cod_register_perk(perk_name, perk_desc, 25, 32); RegisterHam(Ham_TakeDamage, "player", "TakeDamage"); } public cod_perk_enabled(id, wartosc) { ma_perk[id] = true; wartosc_perku[id] = wartosc; } public cod_perk_disabled(id) ma_perk[id] = false; public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits) { if(!is_user_connected(idattacker)) return HAM_IGNORED; if(ma_perk[idattacker]) cod_inflict_damage(idattacker, this, float(wartosc_perku[idattacker]), 0.0, idinflictor, damagebits); return HAM_IGNORED; } /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par } */
#406542 Bloka rakiet cod onwy
Napisane przez game4player w 04.05.2012 20:41
#405513 Ranking gracza na say
Napisane przez Nestea****Lemon w 03.05.2012 08:08
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <csx>
#define PLUGIN "rank_hud"
#define VERSION "1.0"
#define AUTHOR "forma"
#define TASK_SHOWCLASS 2222
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
}
public client_connect(id)
{
set_task(0.01,"cmdRank",TASK_SHOWCLASS+id,_,_,"b");
}
public client_disconnect(id)
if(task_exists(TASK_SHOWCLASS+id))
remove_task(TASK_SHOWCLASS+id)
public cmdRank(id)
{
id-=TASK_SHOWCLASS;
static stats[8], body[8], rankpos, rankmax;
get_user_stats(id, stats, body);
rankpos = get_user_stats(id, stats, body);
rankmax = get_statsnum();
set_hudmessage(255, 215, 0, 0.72, 0.4);
show_hudmessage(id, "Rank: %d/%d", rankpos, rankmax);
}
Jak ci nie pasuje to moge znaleźć lepszy -----> mysle ze ten jest wystaczajacy
PS : to jest rank w Hud a nie w say na twoim SS
#404285 Przerobienie klasy
Napisane przez Matissek w 01.05.2012 01:32
#403223 Skąd wziąć plik .sma
Napisane przez Czyzu w 28.04.2012 17:26
#403135 Proszę o perki
Napisane przez C@w@ler w 28.04.2012 14:18
Załączone pliki
-
codperk_kamuflaz.sma 549 bajtów 33 Ilość pobrań
codperk_kamuflaz.amxx -
codperk_tarczaswat.sma 907 bajtów 34 Ilość pobrań
codperk_tarczaswat.amxx -
codperk_zwinnepalce.sma 1,8 KB 25 Ilość pobrań
codperk_zwinnepalce.amxx
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: Goliath
- Regulamin