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
 

severe - zdjęcie

severe

Rejestracja: 26.06.2011
Aktualnie: Nieaktywny
Poza forum Ostatnio: 29.04.2020 16:47
-----

#486597 Komunikacja z graczem

Napisane przez Gość w 03.12.2012 20:00

Tutorial dla początkujących
Komunikacja z graczem
Scripting AMXX


[kotwica='cel']Cel[/kotwica]
Nauka podstawowych metod komunikacji gracza z serwerem

[kotwica='wymagania']Wymagania[/kotwica]
  • Informacje wstępne
    Spoiler
  • Zrozumienie istoty działania AMXX
  • Znajomość podstawowych funkcji
  • Umiejętność imptowania bibliotek
  • Zwracanie odpowiedniej wartości funkcji
  • Odczytywanie argumentów wiadomości
[kotwica='logevents']Logevents[/kotwica]
Jak już wiemy z poprzedniego kursu, funkcja register_event pozwala nam zarejestrować dowolne zdarzenie silnika HLDS.

Jednakże, możemy rejestrować także wystąpienie pewnych wiadomości poprzez funkcję register_logevent
Funkcja register_logevent jednak, jako, że rejestruje jedynie wystąpienie wiadomości, będącej wynikiem
wywołania danej operacji, nie może na tę operację wpływać, a jedynie pozyskać informację o wykonaniu danej operacji.

Pierwszym argumentem funkcji register_event jest nazwa funkcji, wykonywanej w momencie odnotowania danego zdarzenia.
Drugim parametrem jest liczba argumentów, które będziemy odczytywać. W kolejnych, opcjonalnych argumentach, możemy ograniczyć
notowane zdarzenia funkcji filtrami, operując na poszczególnych parametrach, licząc argumenty od 0. Liczba kolejnych
argumentów filtrujących jest dowolna, a niespełnienie choć jednego z nich, nie wywoła funkcji z pierwszego parametru.

[kotwica='filtry_logevents']Filtry logevents[/kotwica]
Do dyspozycji mamy następujące filtry:
  • Równość
    arg=val
    
    Argument nr arg musi być dokładnie taki, jak podana wartość val, np.
    "0=World triggered"
    
  • Nierówność
    arg!val
    
    Argument nr arg nie może zawierać podanej wartości val, np.
    "0!World triggered"
    
  • Większość
    arg>val
    
    Argument nr arg musi być większy, niż podana wartość val, np.
    "1>2"
    
  • Mniejszość
    arg<val
    
    Argument nr arg musi być mniejszy, niż podana wartość val, np.
    "3<4"
    
  • Zawieranie
    arg&val
    
    Argument nr arg musi zawierać wartość val, np.
    "1&spawn"
    
Przykład pełnej funkcji rejestrującej spawn gracza z bombą:
register_logevent("spawnedWithBomb", 3, "1=triggered", "2=Spawned_With_The_Bomb");

Jednakże, co w przypadku, gdy chcielibyśmy zarejestrować zarówno spawn z bombą,
jak i otrzymanie bomby (np. poprzez podniesienie z ziemi) za pomocą register_event?
Jak pamiętamy, funkcja zostanie wywołana, o ile koniunkcja warunków z argumentów opcjonalnych zostanie spełniona.
W przypadku chęci rejestracji otrzymania bomby (czy to przez podniesienie, czy otrzymanie wraz ze spawnem) bowiem,
potrzebujemy alternatywy tych warunków. I na to jest rozwiązanie! Z pomocą przychodzi nam funkcja read_logargv.

[kotwica='read_logargv']read_logargv[/kotwica]
Funkcja ta odczytuje zawartość zadanego w pierwszym argumencie, parametru zdarzenia logowanego (licząc od zera)
i zapisuje do tablicy o nazwie z drugiego argumentu o maksymalnym rozmiarze z trzeciego argumentu funkcji read_logargv.
Zobaczmy to na przykładzie:
#include <amxmodx>

public plugin_init(){
register_plugin("Bomb get detect", "0.1", "benio101");

register_logevent("playerTriggered", 3, "1=triggered");
}

public playerTriggered(){
new akcja[64];
read_logargv(2, akcja, 64);

if(
equali(akcja, "Spawned_With_The_Bomb") ||
equali(akcja, "Got_The_Bomb")
){
// Jakis gracz otrzymal bombe
}
}
Rejestrujemy logevent i ograniczamy go jedynie do równości drugiego argumentu z "triggered".
Następnie, w funkcji playerTriggered, pobieramy zawartość trzeciego argumentu do zmiennej akcja.
Jeśli akcją jest otrzymanie bomby lub spawn z bombą, co sprawdzamy w warunku połączonym alternatywą,
to oznacza, że Jakiś gracz otrzymał bombę. Teraz pozostanie nam odczytać jego id i napiszemy mu to.
#include <amxmodx>

public plugin_init(){
register_plugin("Bomb get detect", "0.1", "benio101");

register_logevent("playerTriggered", 3, "1=triggered");
}

public playerTriggered(){
new akcja[64];
read_logargv(2, akcja, 64);

if(
equali(akcja, "Spawned_With_The_Bomb") ||
equali(akcja, "Got_The_Bomb")
){
// Jakis gracz otrzymal bombe

new arg0[64], name[64], argid, id;
read_logargv(0, arg0, 64);

parse_loguser(arg0, name, 64, argid);
id=find_player("k", argid);

client_print(id, print_chat, "Otrzymales bombe!");
}
}
Pobraliśmy tutaj zawartość pierwszego argumentu do zmiennej arg0, następnie pobraliśmy nick gracza za pomocą funkcji parse_loguser,
by na końcu odnaleźć jego właściwe id za pomocą funkcji find_player i wyświetlić mu komunikat o otrzymaniu bomby.

[kotwica='lkomunikacja_serwera_z_graczem']Komunikacja serwera z graczem[/kotwica]
Rozgrywka multiplayer na serwerze możliwa jest dzięki komunikowaniu się klientów gry oraz serwera HLDS.
Każde kliknięcie myszy, nachylenie się, czy zmiana pozycji u gracza, a także wywołania jakiejś komendy,
wpływają na informacje przesyłane od klienta do serwera gry. Z drugiej strony, serwer także systematycznie
komunikuje się z nami, przesyłając informacje o naszej pozycji, punktach zdrowia, czy pojawiającym się nowym granacie dymnym i jego lokalizacji.

Podczas, gdy większość operacji wykonywana jest po stronie serwera (jak spawny graczy, ruch zakładników, czy tykanie bomby),
to część wykonywana jest po stronie gracza i serwer nie ma na nie wpływu, jak np. ruch gracza, czy ustalanie odrzutu broni przy strzale.

[kotwica='Iiformacje_nieosiagalne']Informacje nieosiągalne[/kotwica]
Poza operacjami, których charakterystyka, dokładny opis, bądź których informacja o wykonaniu, są przesyłane pomiędzy serwerem HLDS, a klientami,
istnieją także operacje, które nie zostają ujawnione dla drugiej strony, zarówno po stronie serwera, jak i u klienta.
Przykładem tych drugich jest np. wywołanie komendy zmiany slotu bądź łączenia się z określonym serwerem.

Warto więc zapamiętać, że nie na wszystkie operacje mamy wpływ, a niektóre czynności gracza mogą nie być dla nas dostępne nawet do odczytania.
Jak już wspomniałem, m.in. informacja o wywołaniu niektórych komend, czyli wpisaniu ich w konsolę, są przesyłane do serwera, a więc możemy je odnotować.

[kotwica='komendy_gracza']Komendy gracza[/kotwica]
Tutaj z pomocą przychodzi nam funkcja register_clcmd, która rejestruje daną komendę u gracza i pozwala na wykonanie danych operacji.
#include <amxmodx>

public plugin_init(){
register_plugin("Komenda klienta", "0.1", "benio101");

register_clcmd("test", "test");
}
W powyższym kodzie widzimy zarejestrowaną komendę test (pierwszy parametr), która zostanie wysłana do AMXX i wywołana zostanie funkcja test (za nazwę funkcji do wywołania odpowiada drugi parametr). Nic nie stoi na przeszkodzie, by nazwa rejestrowanej komendy oraz funkcji, były takie same.

Dodamy zatem funkcję, która zostanie wywołana po wpisaniu przez klienta, polecenia "test" i wyświetlimy na chacie ogólnym temu graczowi, słowo "test".
#include <amxmodx>

public plugin_init(){
register_plugin("Komenda klienta", "0.1", "benio101");

register_clcmd("test", "test");
}

public test(id){
if(is_user_connected(id)){
client_print(id, print_chat, "test");
}
}

W praktyce jednak, najczęściej korzysta się z komendy say, która zbindowana jest u większości graczy pod klawiszami y oraz u.
Chat czy team_chat, to nic innego, jak komenda say z danym parametrem, który podajemy w trakcie gry bez potrzeby otwierania konsoli.

[kotwica='client_print']client_print[/kotwica]
Funkcja client_print wysyła dla gracza o id podanym w pierwszym parametrze, tekst z trzeciego argumentu w określone miejsce drugim parametrem.
  • print_notify (alternatywnie 1) wyśle wiadomość do konsoli gracza, o ile jest w trybie deweloperskim (rzadko używane)
  • print_console (alternatywnie 2) wyśle wiadomość do konsoli gracza bez względu na to, czy jest w trybie deweloperkim, czy nie
  • print_chat (alternatywnie 3) wyśle wiadomość na chat gracza, widoczny w grze (najczęściej używana opcja)
  • print_center (alternatywnie 4) wyśle wiadomość na samym środku ekranu gracza (trudno ją przegapić)
Używanie nazw print_[notify|console|chat|center] zamiast cyfer jest możliwe, dzięki zastosowaniu struktury typu enum.
Podanie w pierwszym argumencie zera zamiast numeru gracza, wiadomość zostanie wysłana do wszystkich graczy na serwerze.

[kotwica='chat_i_team_chat']Chat i TeamChat[/kotwica]
Tak więc, zarejestrowanie wydania komendy na chacie jest możliwe, poprzez dodanie prostego "say " lub "say_team " przed
komendą, gdyż docelowo, klient wysyła właśnie komendę poprzedzoną tymi poleceniami do serwera.
Zarejestrujemy teraz przykładową komendę "test" powiedzianą na chacie oraz na team_chacie.
#include <amxmodx>

public plugin_init(){
register_plugin("Komenda klienta", "0.1", "benio101");

register_clcmd("say test", "test");
register_clcmd("say_team test", "test");
}

public test(id){
if(is_user_connected(id)){
client_print(id, print_chat, "Powiedziales test");
}
}
Przejdziemy teraz do bardziej praktycznego zastosowania, czyli do ukrycia na chacie wpisania komendy,
rozpoczynającej się slashem, które zwyczajowo oznaczają specjalną komendę, jak /me czy /hp, wyświetlającą obrażenia.

[kotwica='ukrycie_wpisanych_komend']Ukrycie wpisanych komend[/kotwica]
Poza ujrzeniem zadanych, czy otrzymanych obrażeń, nie chcemy, by wszyscy widzieli ten wpis na chacie.
W tym celu zarejestrujemy funkcję say oraz say_team i będziemy blokować wysyłanie komendy do silnika gry,
o ile pierwszym znakiem będzie slash, za pomocą zwrócenia PLUGIN_HANDLED_MAIN. Main, ponieważ nie chcemy
blokować dalszego przepływu informacji innym pluginom, wpisanym niżej w pliku konfiguracyjnym serwera, plugins.ini
#include <amxmodx>

public plugin_init(){
register_plugin("Niewyswietlanie komend ze slashem", "0.1", "benio101");

register_clcmd("say", "say");
register_clcmd("say_team", "say");
}

public say(id){
new txt[192];
read_args(txt,192);
remove_quotes(txt);

if(equali(txt[0],"/")){
return PLUGIN_HANDLED_MAIN;
}

return PLUGIN_CONTINUE;
}


[kotwica='blokada_kupowania_broni']Blokada kupowania broni[/kotwica]
Teraz przejdziemy do bardzie praktycznego przykładu, mianowicie
postaramy się zablokować możliwość kupowania broni, granatów i tarczy.

W tym celu będziemy rejestrować daną komendę na kupowanie,
a następnie blokować jej wysyłanie do silnika gry HLDS.

Najpierw jednak, musimy zadać sobie pytanie, w jaki sposób dokonywany jest zakup?
Otóż, standardowo, można korzystać z 2 rodzai menu, bądź poprzez komendę na kupno.
Ostatecznie, komenda w menu, docelowo i tak wysyła do serwera komendę na kupno broni.
Tak więc, pozostaje nam jedynie, wszelkie takie komendy zablokować i kupowanie nie będzie możliwe.

Tutaj odsyłam do podstawowych informacji o broniach: CS Weapons Information
Nazwy komend do blokowania widnieją w kolumnach BUYNAME oraz BUYNAME2.
Druga Kolumna komend na kupowanie, zawiera nazwy ze starszych wersji CSa,
które wciąż są dostępne, by zachować kompatybilność skryptów bindujących.

Nie uwzględnienie tych komend w procesie blokowania, pozwoli nam na kupowanie broni
poprzez wpisanie alternatywnych komend w konsolę, a funkcja, która działa częściowo,
działa źle, gdyż dalej pozostaje możliwość zakupu broni, czego nie chcielibyśmy.

Do spisu komend broni, dodamy kupowanie amunicji (priamammo i secammo), kamizelki (vest i vesthelm),
noktowizora (nvgs), zestawu rozbrajającego (defuser) oraz komend kupowania autobuy i rebuy.
Profilaktycznie, zablokujemy także komendy cl_[set](auto|re)buy oraz komendę buy.

Mając pełen spis komend, wystarczy zarejestrować je wszystkie i następnie zablokować.
Żeby nie tworzyć niepotrzebnie mnóstwa podobnych komend (czyli stosując zasadę DRY),
wpiszemy te wszystkie komendy w tablicę i zarejestrujemy te komendy przy użyciu pętli.
#include <amxmodx>

new static weaponsBuyNames[][]={
"p228", "shield", "scout", "hegren", "xm1014", "mac10", "aug", "sgren", "elites", "fn57",
"ump45", "sg550", "galil", "famas", "usp", "glock", "awp", "mp5", "m249", "m3", "m4a1",
"tmp", "g3sg1", "flash", "deagle", "sg552", "ak47", "p90", "228compact", "autoshotgun",
"bullpup", "fiveseven", "krieg550", "defender", "clarion", "km45", "9x19mm", "magnum",
"smg", "12gauge", "mp", "d3au1", "nighthawk", "krieg552", "cv47", "c90", "primammo",
"secammo", "vest", "vesthelm", "nvgs", "defuser", "autobuy", "rebuy",
"cl_autobuy", "cl_setautobuy", "cl_setrebuy", "cl_rebuy", "buy"
}

public plugin_init(){
register_plugin("Blokada kupowania", "0.1", "benio101");

for(new i=0; i<sizeof weaponsBuyNames; ++i){
register_clcmd(weaponsBuyNames[i], "block");
}
}

public block(){
return PLUGIN_HANDLED_MAIN;
}



#288566 client_cmd i client_cmd

Napisane przez Kusek w 28.08.2011 18:14

client_cmd(id, "give_portal %s", szName);
hmm?
  • +
  • -
  • 1


#275678 Inne dodawanie punktów

Napisane przez byCZUS w 30.07.2011 11:51

Witam,
dzisiaj przedstawię troszkę inny sposób dodawanie punktów statystyk niż w innych tutkach ;], wygląda to mniej więcej tak:

ncje45.jpg

Dokładniej chodzi o opcję numer: 1. Po jej kliknięciu liczba dodawanych punktów się zwiększa (można to dowolnie edytować).

A więc do dzieła, na samym początku musimy dodać jedną stałą z naszymi punktami i zmienną która będzie przechowywała informacje o tym co ile ma dodawać na pkt.
Pod:
 

new const maxAmmo[31] = {0, 52, 0, 90, 1, 31, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120, 30, 120, 200, 31, 90, 120,
90, 2, 35, 90, 90,0, 100};

dodajemy coś takiego:
 

new const co_ile[] = { 1, 4, 8, 16, 24 } // Wlasnie tutaj zmieniamy co ile maja rosnac punkty.
new szybkosc_rozdania[33];

Następnym krokiem będzie edycja widoku statystyk i handler'a od tego. Szukamy

public PrzydzielPunkty(id)
{
new inteligencja[65];
new zdrowie[60];
new wytrzymalosc[60];
new kondycja[60];
new tytul[25];
format(inteligencja, charsmax(inteligencja), "Inteligencja: \r%i \y(Zwieksza sile perkow i umiejetnosci klasy)", PobierzInteligencje(id, 1, 1, 1));
format(zdrowie, charsmax(zdrowie), "Zdrowie: \r%i \y(Zwieksza zdrowie)", PobierzZdrowie(id, 1, 1, 1));
format(wytrzymalosc, charsmax(wytrzymalosc), "Wytrzymalosc: \r%i \y(Zmniejsza obrazenia)", PobierzWytrzymalosc(id, 1, 1, 1));
format(kondycja, charsmax(kondycja), "Kondycja: \r%i \y(Zwieksza tempo chodu)", PobierzKondycje(id, 1, 1, 1));
format(tytul, charsmax(tytul), "Przydziel Punkty(%i):", punkty_gracza[id]);
new menu = menu_create(tytul, "PrzydzielPunkty_Handler");
menu_additem(menu, inteligencja);
menu_additem(menu, zdrowie);
menu_additem(menu, wytrzymalosc);
menu_additem(menu, kondycja);
menu_setprop(menu, MPROP_EXIT, 0);
menu_display(id, menu);
}
i zamieniamy na

public PrzydzielPunkty(id)
{
new szybkosc[60];
new inteligencja[65];
new zdrowie[60];
new wytrzymalosc[60];
new kondycja[60];
new tytul[25];

format(szybkosc, charsmax(szybkosc), "Ile dodawac: \r%d \y(Ile pkt dodac do statow)", co_ile[szybkosc_rozdania[id]]);
format(inteligencja, charsmax(inteligencja), "Inteligencja: \r%i \y(Zwieksza sile perkow i umiejetnosci klasy)", PobierzInteligencje(id, 1, 1, 1));
format(zdrowie, charsmax(zdrowie), "Zdrowie: \r%i \y(Zwieksza zdrowie)", PobierzZdrowie(id, 1, 1, 1));
format(wytrzymalosc, charsmax(wytrzymalosc), "Wytrzymalosc: \r%i \y(Zmniejsza obrazenia)", PobierzWytrzymalosc(id, 1, 1, 1));
format(kondycja, charsmax(kondycja), "Kondycja: \r%i \y(Zwieksza tempo chodu)", PobierzKondycje(id, 1, 1, 1));
format(tytul, charsmax(tytul), "Przydziel Punkty(%i):", punkty_gracza[id]);
new menu = menu_create(tytul, "PrzydzielPunkty_Handler");
menu_additem(menu, szybkosc);
menu_addblank(menu, 0);
menu_additem(menu, inteligencja);
menu_additem(menu, zdrowie);
menu_additem(menu, wytrzymalosc);
menu_additem(menu, kondycja);
menu_setprop(menu, MPROP_EXIT, 0);
menu_display(id, menu);
}
Wygląd naszego menu z punktami został już zmieniony teraz, handler, znajduje się on nieco niżej, dokładnie chodzi o to:

public PrzydzielPunkty_Handler(id, menu, item)
{
client_cmd(id, "spk QTM_CodMod/select");

if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_CONTINUE;
}

if(punkty_gracza[id] < 1)
return PLUGIN_CONTINUE;

new limit_poziomu = get_pcvar_num(cvar_limit_poziomu);

switch(item)
{
case 0:
{
if(inteligencja_gracza[id] < limit_poziomu/2)
{
inteligencja_gracza[id]++;
punkty_gracza[id]--;
}
else
client_print(id, print_chat, "[COD:MW] Maxymalny poziom inteligencji osiagniety");


}
case 1:
{
if(zdrowie_gracza[id] < limit_poziomu/2)
{
zdrowie_gracza[id]++;
punkty_gracza[id]--;
}
else
client_print(id, print_chat, "[COD:MW] Maxymalny poziom sily osiagniety");
}
case 2:
{
if(wytrzymalosc_gracza[id] < limit_poziomu/2)
{
wytrzymalosc_gracza[id]++;
punkty_gracza[id]--;
}
else
client_print(id, print_chat, "[COD:MW] Maxymalny poziom zrecznosci osiagniety");

}
case 3:
{
if(kondycja_gracza[id] < limit_poziomu/2)
{
kondycja_gracza[id]++;
punkty_gracza[id]--;
}
else
client_print(id, print_chat, "[COD:MW] Maxymalny poziom kondycji osiagniety");
}
}

if(punkty_gracza[id] > 0)
PrzydzielPunkty(id);

return PLUGIN_CONTINUE;
}
zamieniamy na

public PrzydzielPunkty_Handler(id, menu, item) {
client_cmd(id, "spk QTM_CodMod/select");

if(item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_CONTINUE;
}

if(punkty_gracza[id] < 1)
return PLUGIN_CONTINUE;

new limit_poziomu = get_pcvar_num(cvar_limit_poziomu);
new ilosc = (co_ile[szybkosc_rozdania[id]] > punkty_gracza[id]) ? punkty_gracza[id] : co_ile[szybkosc_rozdania[id]]

switch(item) {
case 0: {
if(szybkosc_rozdania[id] < charsmax(co_ile)) szybkosc_rozdania[id]++;
else szybkosc_rozdania[id] = 0;
}
case 1: {
if(inteligencja_gracza[id]+ilosc <= limit_poziomu/2) {
inteligencja_gracza[id]+=ilosc;
punkty_gracza[id]-=ilosc;
} else client_print(id, print_chat, "[COD:MW] Maxymalny poziom inteligencji osiagniety");
}
case 2: {
if(zdrowie_gracza[id]+ilosc <= limit_poziomu/2) {
zdrowie_gracza[id]+=ilosc;
punkty_gracza[id]-=ilosc;
} else client_print(id, print_chat, "[COD:MW] Maxymalny poziom sily osiagniety");
}
case 3: {
if(wytrzymalosc_gracza[id]+ilosc <= limit_poziomu/2) {
wytrzymalosc_gracza[id]+=ilosc;
punkty_gracza[id]-=ilosc;
} else client_print(id, print_chat, "[COD:MW] Maxymalny poziom zrecznosci osiagniety");
}
case 4: {
if(kondycja_gracza[id]+ilosc <= limit_poziomu/2) {
kondycja_gracza[id]+=ilosc;
punkty_gracza[id]-=ilosc;
} else client_print(id, print_chat, "[COD:MW] Maxymalny poziom kondycji osiagniety");
}
}

if(punkty_gracza[id] > 0)
PrzydzielPunkty(id);

return PLUGIN_CONTINUE;
}

No i to tyle, wystarczy teraz przekompilować kod i wgrać plugin. ;]
  • +
  • -
  • 75


#266524 Inwigilator Błąd

Napisane przez Cypis' w 05.07.2011 10:44

zamień cały public client_disconnect na to:

public client_disconnect(id)
{
new ent = -1
while((ent = find_ent_by_class(ent, "camera")))
{
if(entity_get_int(ent, EV_ENT_owner) == id)
remove_entity(ent);
}
}

  • +
  • -
  • 2


#271222 Monety i sklep

Napisane przez soda w 18.07.2011 13:55

dam ci mój.
Ale tylko amxx

Załączone pliki


  • +
  • -
  • 2


#240921 Hity 2011 Round Sound

Napisane przez Zego w 24.04.2011 11:20

Przedstawiam kolejną paczkę z muzyka na serwer. Tym razem są to Hity 2011. Paczka wykonana na życzenie użytkownika korniksnk

Round Sound będzie podzielony na 2 paczki. Pierwsza z nich to będą kawałki w formacie .mp3, druga w formacie .wav

Informacje:
> Ilość kawałków- 10
> Typ dźwięku- .mp3, .wav
> Długość utworów- 10-20 sec.

Instalacja:
-Plik alt_end_round_sounds.amxx wrzucamy do cstrike/addons/amxmodx/plugins
-Plik alt_end_round_sounds.sma wrzucamy do cstrike/addons/amxmodx/scripting
-Plik roundsound.ini wrzucamy do cstrike/addons/amxmodx/configs
-Folder round_sound wrzucamy do cstrike/addons/amxmodx/configs
-Na końcu plugins.ini dopisujemy: alt_end_round_sounds.amxx
-Utwory wrzucamy do cstrike/sound/misc.
-Zmieniamy mapę, lub restartujemy serwer i gotowe


Cvary:
ers_enabled "1" //czy plugin ma działać 0 - wyłączony / 1 - właczony, oryginalnie 1
ers_player_toggle "1" //komenda "/roundsound" (dzięki tej komendzie każdy gracz będzie mógł wyłączyć i włączyć sobie muzykę na koniec rundy) 0 - wyłączona / 1 - właczona, oryginalnie 1
erc_time_ads "120" // czas w sekundach co ile ma wyświetlać w czacie informacje o "/roundsound" 0 - wyłączony, oryginalnie 120
erc_random_precache "10" //ilość plików muzycznych na drużynę


Tytuły:
2011_1 - alexandra stan - mr. saxo beat
2011_2 - Alexis Jordan - Happiness
2011_3 - B.O.B. Ft. Bruno Mars- Nothin' On You
2011_4 - Jessie J - Price Tag feat B.o.B
2011_5 - Katy Perry - ET ft Kanye West
2011_6 - Nicole Scherzinger - Don 39t Hold Your Breath
2011_7 - Pitbull Feat. Akon - Shut It Down
2011_8 - Pitbull feat. Ne-Yo, Afrojack & Nayer - Give Me Everything (Tonight)
2011_9 - Snoop dogg - Sweat -David Guetta (Radio Edit)
2011_10 - Wiz Khalifa - Black and Yellow

Download:
Format MP3:
Zippyshare.com - 2011 mp3.rar
Format WAV:
Zippyshare.com - 2011 wav.rar

Załączone pliki


  • +
  • -
  • 10


#264336 Jak dodac wskrzeszanie do medyka

Napisane przez Cypis' w 30.06.2011 08:22

dodaj za tym: public MedkitThink(ent)
{

if(!is_valid_ent(ent))
return PLUGIN_CONTINUE;

  • +
  • -
  • 1


#257586 Awanse klas

Napisane przez Goliath w 10.06.2011 19:48

Na prośbę jednego z użytkowników zrobiłem system awansowania klas. Doszedłem do tego drogą prób i błędów, więc kod może nie być w pełni optymalny, ale przynajmniej działa Dołączona grafika.

Uwaga! Wymagana znajomość pojęcia "kompilacja lokalna". Jeżeli nie wiesz, co to jest, odwiedź ten temat - http://amxx.pl/topic...ilowac-pluginy/

1. Otwieramy plik QTM_CodMod.sma.
2. Do zmiennych globalnych dodajemy:
new awanse[MAX_ILOSC_KLAS+1][3], awansuje_do[MAX_ILOSC_KLAS+1], awansuje_z[MAX_ILOSC_KLAS+1];
new ilosc_awansow;

3. Na koniec pliku dopisujemy:
public ZarejestrujAwans(plugin, params)
{
if(params != 9)
return PLUGIN_CONTINUE;

if(++ilosc_klas > MAX_ILOSC_KLAS)
return -1;

pluginy_klas[ilosc_klas] = plugin;

new awans_z = get_param(1);
awansuje_do[awans_z] = ilosc_klas;
awansuje_z[ilosc_klas] = awans_z;
ilosc_awansow++;
awanse[ilosc_awansow][1] = ilosc_klas;
awanse[ilosc_awansow][0] = awans_z;
awanse[ilosc_awansow][2] = get_param(2);
get_string(3, nazwy_klas[ilosc_klas], MAX_WIELKOSC_NAZWY);
get_string(4, opisy_klas[ilosc_klas], MAX_WIELKOSC_OPISU);

bronie_klasy[ilosc_klas] = get_param(5);
zdrowie_klas[ilosc_klas] = get_param(6);
kondycja_klas[ilosc_klas] = get_param(7);
inteligencja_klas[ilosc_klas] = get_param(8);
wytrzymalosc_klas[ilosc_klas] = get_param(9);

return ilosc_klas;
}

public ZnajdzAwans(Z, Do)
{
new Return;
for(new i=1; i<=ilosc_awansow; i++)
{
if(awanse[i][0] == Z && awanse[i][1] == Do)
{
Return = i;
break;
}
}
return Return;
}

public JestAwansem(klasa)
{
new bool:jest;
for(new i=1; i<=ilosc_awansow; i++)
{
if(awanse[i][1] == klasa)
{
jest = true;
break;
}
}
return jest;
}

4. Do publica plugin_natives dodajemy:
register_native("cod_register_advance", "ZarejestrujAwans");

5. Zmieniamy public WybierzKlase na:
public WybierzKlase(id)
{
new menu = menu_create("Wybierz klase:", "WybierzKlase_Handle");

new klasa[50], dana_klasa, numer[10];
for(new i=1; i <= ilosc_klas; i++)
{
if(JestAwansem(i))
continue;
WczytajDane(id, i);
dana_klasa = i;

for(; ;)
{
if(awansuje_do[dana_klasa] && poziom_gracza[id] >= awanse[ZnajdzAwans(dana_klasa, awansuje_do[dana_klasa])][2])
{
dana_klasa = awansuje_do[dana_klasa];
WczytajDane(id, dana_klasa);
}
else break;
}
formatex(klasa, charsmax(klasa), "%s \yPoziom: %i", nazwy_klas[dana_klasa], poziom_gracza[id]);
num_to_str(dana_klasa, numer, 9);
menu_additem(menu, klasa, numer);
}

WczytajDane(id, klasa_gracza[id]);

menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
menu_display(id, menu);

client_cmd(id, "spk QTM_CodMod/select");
}

6. Zmieniamy public WybierzKlase_Handle na:
public WybierzKlase_Handle(id, menu, item)
{
client_cmd(id, "spk QTM_CodMod/select");

if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_CONTINUE;
}

new data[65], name[65], acces, callback
menu_item_getinfo(menu, item, acces, data, 64, name, 64, callback)
item = str_to_num(data);

if(item == klasa_gracza[id] && !nowa_klasa_gracza[id])
return PLUGIN_CONTINUE;

nowa_klasa_gracza[id] = item;

if(klasa_gracza[id])
client_print(id, print_chat, "[COD:MW] Klasa zostanie zmieniona w nastepnej rundzie.");
else
{
UstawNowaKlase(id);
DajBronie(id);
ZastosujAtrybuty(id);
}

return PLUGIN_CONTINUE;
}

7. W publicu SprawdzPoziom, po ZapiszDane(id), dopisujemy:
	if(awansuje_do[klasa_gracza[id]])
{
if(poziom_gracza[id] >= awanse[ZnajdzAwans(klasa_gracza[id], awansuje_do[klasa_gracza[id]])][2])
{
set_hudmessage(212, 255, 85, 0.31, 0.32, 0, 6.0, 5.0);
ShowSyncHudMsg(id, SyncHudObj2,"Osiagajac poziom %i, awansowales do klasy %s!", poziom_gracza[id], nazwy_klas[awansuje_do[klasa_gracza[id]]]);
nowa_klasa_gracza[id] = awansuje_do[klasa_gracza[id]];
UstawNowaKlase(id);
DajBronie(id);
ZastosujAtrybuty(id);
ZapiszDane(id);
}
}

Jeżeli chcesz, aby na nową klasę przechodził poziom, exp, statystyki itd., zastąp w/w funkcję tą:
		if(awansuje_do[klasa_gracza[id]])
{
if(poziom_gracza[id] >= awanse[ZnajdzAwans(klasa_gracza[id], awansuje_do[klasa_gracza[id]])][2])
{
set_hudmessage(212, 255, 85, 0.31, 0.32, 0, 6.0, 5.0);
ShowSyncHudMsg(id, SyncHudObj2,"Osiagajac poziom %i, awansowales do klasy %s!", poziom_gracza[id], nazwy_klas[awansuje_do[klasa_gracza[id]]]);
new temp_int = inteligencja_gracza[id], temp_zdr = zdrowie_gracza[id], temp_kon = kondycja_gracza[id], temp_wyt = wytrzymalosc_gracza[id], temp_exp = doswiadczenie_gracza[id], temp_lvl = poziom_gracza[id];
nowa_klasa_gracza[id] = awansuje_do[klasa_gracza[id]];
UstawNowaKlase(id);
poziom_gracza[id] = temp_lvl;
doswiadczenie_gracza[id] = temp_exp;
wytrzymalosc_gracza[id] = temp_wyt;
zdrowie_gracza[id] = temp_zdr;
kondycja_gracza[id] = temp_kon;
inteligencja_gracza[id] = temp_int;
punkty_gracza[id] = (poziom_gracza[id]-1)*2-inteligencja_gracza[id]-zdrowie_gracza[id]-wytrzymalosc_gracza[id]-kondycja_gracza[id];
DajBronie(id);
ZastosujAtrybuty(id);
ZapiszDane(id);
}
}

8. Zapisujemy i kompilujemy plik. Otwieramy plik include/codmod.inc. Dopisujemy na koniec tego pliku to, a następnie go zapisujemy:
native cod_register_advance(z_klasy, od_levela, const nazwa[], const opis[], bronie, punkty_zdrowia, punkty_kondycji, punkty_inteligencji, punkty_wytrzymalosci);

9. Wszystko jest już gotowe, ale nie mamy zdefiniowanych żadnych awansów. Teraz się tym zajmiemy. Zacznę od omówienia parametrów natywu cod_register_advance.
z_klasy - id klasy, kt&#243;ra ma awansować w tą klasę,
od_levela - wymagany level do awansu,
Reszta parametr&#243;w nie r&#243;żni się od tych z cod_register_class
10. Klasę, w którą będzie się awansować tworzymy praktycznie tak samo, jak zwykłą. Musimy tylko użyć natywu cod_register_advance, zamiast cod_register_class. Użycie natywu wygląda tak:
cod_register_advance(cod_get_classid("Snajper"), 60, nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);

I teraz w stworzoną przez nas klasę, będzie awansować inna klasa - Snajper, po osiągnięciu 60 poziomu. A to plik .sma przykładowej klasy - Elitarnego Snajpera:
Załączony plik  codawans_elitesnajper.sma   1,4 KB  1787 Ilość pobrań
  codawans_elitesnajper.amxx

Gotowiec:
Załączony plik  awanse.sma   41,62 KB  1675 Ilość pobrań
  awanse.amxx

Dodatki/alternatywne wersje:
- Wersja kompatybilna z frakcjami DarkGL'a - http://amxx.pl/topic...post__p__262120
- Klasy nie awansują, ale odblokowywują się po osiągnięciu danego poziomu na danej klasie - http://amxx.pl/topic...post__p__259522
- Klasy nie awansują, ale odblokowywują się po osiągnięciu danego poziomu na danej klasie (jeżeli mamy wgrane frakcje) - http://amxx.pl/topic...post__p__262954
- Informacje o awansach w menu /klasy - http://amxx.pl/topic...post__p__263164

Mam nadzieję, że coś zrozumieliście i nie będziecie mieli problemów ze zrobieniem tego na swoim CoD'zie Dołączona grafika.
  • +
  • -
  • 75


#263297 Potrójny skok i błąd w kompilacji

Napisane przez Goliath w 27.06.2011 10:02

On chce trzy skoki, a nie dwa.
Zmień:
new bool:moze_skoczyc[33];

Na:
new skoki[33];


A następnie zmień:
public CmdStart(id, uc_handle)
{
if(!ma_klase[id])
return FMRES_IGNORED;

new button = get_uc(uc_handle, UC_Buttons);
new oldbutton = pev(id, pev_oldbuttons);
new flags = pev(id, pev_flags);
if((button & IN_JUMP) && !(flags & FL_ONGROUND) && !(oldbutton & IN_JUMP) && moze_skoczyc[id])
{
moze_skoczyc[id] = false;
new Float:velocity[3];
pev(id, pev_velocity, velocity);
velocity[2] = random_float(265.0,285.0);
set_pev(id, pev_velocity, velocity);
}
else if(flags & FL_ONGROUND)
moze_skoczyc[id] = true;

return FMRES_IGNORED;
}

Na:
public CmdStart(id, uc_handle)
{
if(!ma_klase[id])
return FMRES_IGNORED;

new button = get_uc(uc_handle, UC_Buttons);
new oldbutton = pev(id, pev_oldbuttons);
new flags = pev(id, pev_flags);
if((button & IN_JUMP) && !(flags & FL_ONGROUND) && !(oldbutton & IN_JUMP) && skoki[id])
{
skoki[id]--;
new Float:velocity[3];
pev(id, pev_velocity, velocity);
velocity[2] = random_float(265.0,285.0);
set_pev(id, pev_velocity, velocity);
}
else if(flags & FL_ONGROUND)
skoki[id] = 2;

return FMRES_IGNORED;
}

  • +
  • -
  • 1