←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Prośba o odliczanie

  • +
  • -
vernon - zdjęcie vernon 18.05.2012

Witam, mam do was prośbę o odliczanie chodzi mi mniej więcej o takie:

- Wpisuje się w say /odlicz
- Zaczyna sie odliczanie np. 25 sek + cvar
- Napisy na środku Odliczanie 24, 23, 22
- Dodatkowo chce żeby po wpisaniu komendy /odlicz TT + przenosi do funkcji z broniami(wyswietla sie tylko tt)
- Po skończeniu odliczania przenosi do następnej funkcji
- I prosił bym tez jak zrobić limit graczy + cvar
Użytkownik vernon edytował ten post 18.05.2012 00:21
Odpowiedz

Gość_21977_* 18.05.2012

0. new czas; register_cvar("cvar",25); sync = CreateHudSyncObj();

1. register_clcmd("say /odlicz", odlicz);
set_task(1.0,"odlicz",5673,_,_,"b")

2. new czas=get_cvar_num("cvar");
3. set_hudmessage(r, g, b, -1, -1, 0, 6.0, 6.0); ShowSyncHudMsg(0, sync, "%d", czas);
4. nie rozumiem
5. if(czas<=0){remove_task(5673); inna_funkcja();}
6. Nie rozumiem, podobnie, jak 4.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 18.05.2012

Zamiast hud można zawsze wyświetlać poprzez client_print(id, print_center, "%d", czas);

ad 4. chyba chodzi o to, żeby po włączeniu odliczania TT wyświetliło się menu z wyborem broni. W funkcji odlicz dopisujesz (benio zapomniał cudzysłowiu w register_clcmd, ba być register_clcmd("say /odlicz", "odlicz") ;) :
new menu = menu_create("Wybierz broń", "menu_handler");

menu_additem(menu, "AK 47", "weapon_ak47");
menu_additem(menu, "M4A1", "weapon_m4a1");
menu_additem(menu, "Deagle", "weapon_deagle");

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);

menu_display(id, menu);


I dodajesz handler menu, czyli tą funkcję:
public menu_handler(id, menu, item) {
if(item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}

new info[20], access;
menu_item_getinfo(menu, item, access, info, 19);
give_item(id, info);
if(equal(item, "weapon_scout")||equal(item, "weapon_g3sg1")||equal(item, "weapon_ak47")) {
give_item(id, "ammo_762nato");
give_item(id, "ammo_762nato");
give_item(id, "ammo_762nato");
} else if(equal(item, "weapon_m4a1")||equal(item, "weapon_aug")||equal(item, "weapon_sg552")||equal(item, "weapon_sg550")||equal(item, "weapon_famas")||equal(item, "weapon_galil")) {
give_item(id, "ammo_556nato");
give_item(id, "ammo_556nato");
give_item(id, "ammo_556nato");
} else if(equal(item, "weapon_xm1014")||equal(item, "weapon_m3")) {
give_item(id, "ammo_buckshot");
give_item(id, "ammo_buckshot");
give_item(id, "ammo_buckshot");
give_item(id, "ammo_buckshot");
} else if(equal(item, "weapon_mac10")||equal(item, "weapon_ump45")||equal(item, "weapon_usp")) {
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
give_item(id, "ammo_45acp");
} else if(equal(item, "weapon_elite")||equal(item, "weapon_glock18")||equal(item, "weapon_mp5navy")||equal(item, "weapon_tmp")) {
give_item(id, "ammo_9mm");
give_item(id, "ammo_9mm");
give_item(id, "ammo_9mm");
give_item(id, "ammo_9mm");
} else if(equal(item, "weapon_fiveseven")||equal(item, "weapon_p90")) {
give_item(id, "ammo_57mm");
give_item(id, "ammo_57mm");
} else if(equal(item, "weapon_awp")) {
give_item(id, "ammo_338magnum");
give_item(id, "ammo_338magnum");
give_item(id, "ammo_338magnum");
} else if(equal(item, "weapon_m249")) {
give_item(id, "ammo_556natobox");
give_item(id, "ammo_556natobox");
give_item(id, "ammo_556natobox");
give_item(id, "ammo_556natobox");
give_item(id, "ammo_556natobox");
give_item(id, "ammo_556natobox");
give_item(id, "ammo_556natobox");
} else if(equal(item, "weapon_p228")) {
give_item(id, "ammo_357sig");
give_item(id, "ammo_357sig");
give_item(id, "ammo_357sig");
give_item(id, "ammo_357sig");
}

menu_destroy(menu);
return PLUGIN_HANDLED;
}


Menu możesz dowolnie rozbudować, wystarczy dodać linijkę z menu_additem(menu, "Nazwa pozycji", "kod_broni"); Kody broni znajdziesz tu (kolumna z weapon_). W handlerze nie musisz edytować nic.

ad 6. Chodzi Ci o to, że komendy można użyć jak minimum ileś graczy?
Użytkownik GwynBleidD edytował ten post 18.05.2012 11:37
Odpowiedz

  • +
  • -
vernon - zdjęcie vernon 18.05.2012

z 4 t chodzilo mi o to co wyżej podał, a z 6 ze komende /odlicz mozna np. wpisac od 6 graczy, jesli jest 4 graczy to musi byc wiadomość w say "Zeby wpisac ta komende trzeba 6 osób"
Użytkownik vernon edytował ten post 18.05.2012 12:35
Odpowiedz

Gość_21977_* 18.05.2012

Zamiast męczyć się z magazynkami, można też użyć przyjaznej funkcji, ale to jak kto woli :)
public recharge(id){
if(!is_user_alive(id))
return;
switch(get_user_weapon(id)){
case CSW_GLOCK18: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_glock18", id),20)
case CSW_USP: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_usp", id),12)
case CSW_P228: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_p228", id),13)
case CSW_DEAGLE: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_deagle", id),7)
case CSW_FIVESEVEN: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_fiveseven", id),20)
case CSW_ELITE: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_elite", id),30)
case CSW_M3: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m3", id),8)
case CSW_XM1014: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_xm1014", id),7)
case CSW_TMP: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_tmp", id),30)
case CSW_MAC10: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_mac10", id),30)
case CSW_MP5NAVY: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_mp5navy", id),30)
case CSW_UMP45: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_ump45", id),25)
case CSW_P90: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_p90", id),50)
case CSW_FAMAS: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_famas", id),30)
case CSW_GALIL: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_galil", id),35)
case CSW_AK47: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_ak47", id),30)
case CSW_M4A1: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m4a1", id),30)
case CSW_SCOUT: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_scout", id),10)
case CSW_SG552: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_sg552", id),30)
case CSW_AUG: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_aug", id),30)
case CSW_SG550: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_sg550", id),30)
case CSW_G3SG1: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_g3sg1", id),20)
case CSW_AWP: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_awp", id),10)
case CSW_M249: cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m249", id),100)
}
}
Odpowiedz

  • +
  • -
vernon - zdjęcie vernon 18.05.2012

A mogl by mi ktoś stworzyć taki plugin? Bo ja z tego co mi napisaliscie nic nie rozumie :) nie wiem co i jak, proszę o napisanie a beda 2 +
Odpowiedz

Gość_21977_* 18.05.2012

Znów odnoszę wrażenie, że chcesz, żeby Ci gotowca napisać.
A dział to "Pytania", a nie "Zrób za mnie"

Jeśli skorzystasz z ww. porad, to stworzysz taki plugin bez problemu.
Napisz i jeśli okaże się nie działać, poproś o pomoc.

Uwierz w siebie, a na pewno dasz radę :)
Odpowiedz

  • +
  • -
vernon - zdjęcie vernon 18.05.2012

<p><p>No spróbowałem swoich sil i wyskoczyło mi w logach cos takiego:

Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright © 1997-2006 ITB CompuPhase, AMX Mod X Team

odlicz.sma(17) : error 035: argument type mismatch (argument 2)
odlicz.sma(64) : warning 217: loose indentation
odlicz.sma(162) : warning 203: symbol is never used: "czas"

1 Error.
Could not locate output file odlicz.amxx (compile failed).


@edit już sobie z UP poradziłem ale mam problem, ponieważ jak wpisuje /odlicz pokazuje sie napis ale nie widac jak sie odlicza 25, 24, 23 itd. ja to zrobic?

dalem tak


set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
show_hudmessage(0, "Rozpocznie sie za %d", czas);

Użytkownik vernon edytował ten post 18.05.2012 20:00
Odpowiedz

  • +
  • -
ogieR8 - zdjęcie ogieR8 18.05.2012

Przed :

set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
show_hudmessage(0, "Rozpocznie sie za %d", czas);


Dodaj:

czas--

Użytkownik ogieR- edytował ten post 18.05.2012 20:15
Odpowiedz

  • +
  • -
vernon - zdjęcie vernon 18.05.2012

nadal to samo tylko teraz pisze Rozpocznie sie za 24
Odpowiedz

Gość_21977_* 18.05.2012

Podaj więcej kodu, bo trudno jest powiedzieć.
Upewnij się, że przypisujesz wartość 25 do zmiennej czas tylko 1 raz, a nie za każdym razem.
Odpowiedz

  • +
  • -
vernon - zdjęcie vernon 18.05.2012

A i jeszcze jak by mógł ktoś dodać żeby przenosiło po minięciu czasu do innej funckji cmdfunkcja

public odliczanie(id)
{
    new czas=get_cvar_num("cvar");
            
    set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
    show_hudmessage(0, "Rozpocznie sie za %d", czas);
    czas--;            
            
    return PLUGIN_CONTINUE;
}
Odpowiedz

mierzwi - zdjęcie mierzwi 19.05.2012

odejmuj czas przed wyświetleniem, podaj cały kod ziom, bo co ja mam Ci tu strzelić jak nie wiem co gdzie wywołujesz...
Odpowiedz

Gość_21977_* 19.05.2012

Tak, jak pisałem i pisał emu, podaj cały kod, bo trudno jest strzelać, nie znając kodu.
Ale fakt faktem, że new czas=get_cvar_num("cvar"); czyli pobranie wartości wykonuj tylko raz, przed wywołaniem funkcji odliczanie, a nie wewnątrz niej, bo na chwilę obecną to za każdym razem pobiera czas na nowo wczytuje się z cvaru, więc zawsze przyjmuje wartość 25.

new czas=get_cvar_num("cvar"); // tylko raz pobieramy wartosc

public odliczanie(id)
{
set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
show_hudmessage(0, "Rozpocznie sie za %d", czas);
czas--;

if(czas<=0){
cmdfunkcja();
// i odliczanie() tez juz nie moze byc wykonywane
}

return PLUGIN_CONTINUE;
}
Odpowiedz

  • +
  • -
vernon - zdjęcie vernon 19.05.2012

OK poczekajcie kilka minut

#include 
#include
#include

public plugin_init()
{
    register_plugin( "Odlicz", "0,1", "Home" );
    register_clcmd( "say /odlicz", "odliczanie" );
    set_task(1.0,"odliczanie",5673,_,_,"b")
    
    register_event( "HLTV", "eventHLTV", "a" );
    
    register_cvar("odliczanie","25");
    
}
public eventHLTV()
{
    new players[32], num;
    
    get_players( players, num );
    for( new i; i < num ; i++ )
    {
        new id = players[i]
        
        if( !is_user_alive( id ) )
            continue;
        
        set_user_godmode( id, 0 )
    }
}

public odliczanie(id)
{
    if( get_user_team( id ) != 2 )
    return PLUGIN_HANDLED;
    
    new players[32], num;
    
    get_players( players, num );
    for( new i; i < num ; i++ )
    {
        new pid = players[i]
        
        if( !is_user_alive( pid ) )
            continue;
        
        switch( get_user_team( pid ) )
        {
            case 1: WeaponMenu( pid );
            case 2: set_user_godmode( pid, 1 );
        }
        
    }
    
    new czas=get_cvar_num("odliczanie");
            
    set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
    show_hudmessage(0, "Rozpocznie sie za %d", czas);
    czas--;
                        
    return PLUGIN_CONTINUE;
}



public cmdfunkcja(id)
{
    set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
    show_hudmessage( 0, "Koniec odliczania!" );
    
    client_cmd( id, "123" );
    
}
I proszę dodać tez ten limit graczy zeby, komende /odlicz można uzyć dopiero od 6 graczy + wiadomosc w say, do tego jeszcze ze komedne /odlicz mozna tylko do 30 sekund uzyc przed poczatkiem rundy + wiadomosc w say
Użytkownik vernon edytował ten post 19.05.2012 08:35
Odpowiedz

  • +
  • -
vernon - zdjęcie vernon 19.05.2012

benio101 lub emu pomóżcie :)
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 19.05.2012

@benio101, Twój drugi post w temacie jest kompletnie nie na temat, gdyż ta funkcja uzupełnia amunicję w magazynku trzymanej broni do pełna, a nie dodaje amunicję do plecaka.

Co do tematu:
1.
register_event( "HLTV", "eventHLTV", "a" );

To nie jest event wykrywający nową rundę, w pewnych przypadkach się wykonuje dodatkowo i nie zawsze na początku nowej rundy. Nie można też przy użyciu tego eventu wykonywać niektórych operacji. Zamiast tego użyj:
register_logevent("Poczatek_Rundy", 2, "1=Round_Start");


2. Do uruchomienia jakiejś funkcji po określonym czasie używaj set_task. W przypadku tego pluginu możesz zrobić odliczanie na 2 sposoby: upływający czas co sekundę (czyli wiadomość się zmienia "Rozpocznie się za 10, 9, 8... sekund"), oraz wyświetlenie czasu na początku tylko odliczania (czyli wiadomość jest non stop "Rozpocznie się za 10 sekund").

3. Do pobierania wartości cvarów lepiej używać get_pcvar_num itp. Przykład zastosowania:

new Cvar;
public plugin_init() {
register_plugin .....
Cvar = register_cvar(twoj_cvar, "10");
}

public funkcja(id) {
new wartosc = get_pcvar_num(Cvar);
}

Więcej o tym znajdziesz w poradnikach na forum.

5. Gdy zwracasz PLUGIN_HANDLED w wywołaniu komendy say, wtedy nie wyświetli się ona w czacie dla innych (nie będzie linii w czacie że ktoś to napisał).

Mam dziś dobry dzień, więc poprawiony kod:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>

new czas;
new cOdliczanie, cGracze;

public plugin_init()
{
register_plugin( "Odlicz", "0,1", "Home" );
register_clcmd( "say /odlicz", "odliczanie" );
set_task(1.0,"odliczanie",5673,_,_,"b")

register_logevent("Poczatek_Rundy", 2, "1=Round_Start");

cOdliczanie = register_cvar("odliczanie","25");
cGracze = register_cvar("min_graczy", "6");

}
public Poczatek_Rundy()
{
new players[32], num;

get_players( players, num );
for( new i; i < num ; i++ )
{
new id = players[i]

if( !is_user_alive( id ) )
continue;

set_user_godmode( id, 0 )
}
}

public odliczanie(id)
{
if( get_user_team( id ) != 2 )
return PLUGIN_HANDLED;

new players[32], num;

get_players( players, num );
if(num<get_pcvar_num(cGracze)) {
client_print(id, print_chat, "Musi być co najmniej %d graczy", get_pcvar_num(cGracze));
return PLUGIN_HANDLED;
}
for( new i; i < num ; i++ )
{
new pid = players[i]

if( !is_user_alive( pid ) )
continue;

switch( get_user_team( pid ) )
{
case 1: WeaponMenu( pid );
case 2: set_user_godmode( pid, 1 );
}

}

czas=get_pcvar_num(cOdliczanie);

set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
show_hudmessage(0, "Rozpocznie sie za %d", czas);
czas--;

set_task(1.0, "cmdfunkcja", id);

return PLUGIN_HANDLED;
}

public cmdfunkcja(id) {
if(czas>0) {
set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
show_hudmessage(0, "Rozpocznie sie za %d", czas);
czas--;
set_task(1.0, "cmdfunkcja", id);
return PLUGIN_CONTINUE;
}

set_hudmessage( 0, 191, 255, -1.0, 0.1, 0, 6.0, 7.0 );
show_hudmessage( 0, "Koniec odliczania!" );
}


Do menu z broniami użyj moich funkcji, ewentualnie zmień bronie, które chcesz żeby w nim były, tak jak to opisałem.
Użytkownik GwynBleidD edytował ten post 19.05.2012 18:03
Odpowiedz

Gość_21977_* 19.05.2012

@GwynBleidD Spamujesz mnie na PW i zarzucasz mi pisanie nie na temat, podczas gdy to właśnie Ty nie potrafisz czytać ze zrozumieniem.
Proszę Cię, żebyś mnie więcej nie spamował, bo kolejny taki przypadek zaraportuję. Proszę Cię po raz ostatni, przyznaj się do błędu, a nie próbujesz na siłę się usprawiedliwiać.
Napiszę to ostatni raz, napisałem, że "zamiast męczyć się z magazynkami (...)", a nie, że funkcja ta dodaje amunicję wraz z odpowiednią ilością magazynków.

Ad.1.
register_logevent("Poczatek_Rundy", 2, "1=Round_Start");
Nie używaj powyższego kodu, gdyż nie wykryje on m.in. restartu rundy, czy innych niestandardowych sytuacji.
Zamiast tego użyj
register_event("HLTV","round_begin","a","1=0","2=0");


Odnośnie powyższego kodu, w przypadku choćby stosowania rozgrzewki, nie jest on poprawny.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 19.05.2012

@benio, tak się składa, że jest dokładnie odwrotnie, to event HLTV nie wykrywa restartu rundy. Round_Start jest wykonywany po każdym upłynięciu freeze time, jeśli nie ma freeze time, to wykonywany jest on natychmiast. Nie zdarzyła mi się jeszcze żadna sytuacja, aby się ten kod nie wykonał. Natomiast event HLTV nie wykonuje się przy pierwszej rundzie na mapie, po restarcie mapy (sv_restart 1, lub gdy na serwerze pojawią się osoby w obu drużynach), oraz nie można bezpośrednio w niej dawać komuś broni, gdyż wywala to co jakiś czas błędy. Poza tym wykonuje się ona czasem w dodatkowych sytuacjach, gdy serwer zmuszony jest poinformować serwery HLTV o obecnych graczach na serwerze, ich drużynach itp.

Co do zarzucenia Ci pisania nie na temat, zgadzam się nie doczytałem, że nie jest to zamiennik mojego kodu, ale podtrzymuję bezsensowność Twojego postu, gdyż nie napisałeś dokładnie do czego ta funkcja służy i gdzie jej użyć, a wątpię żeby tak początkujący skrypter jak vernon domyślił się jak z tej funkcji pożytek zrobić.
Odpowiedz

Gość_21977_* 19.05.2012

Funkcja register_logevent( "RoundStart", 2, "1=Round_Start" ); wykonuje się po upływie freezetime, a nie na początku rundy, więc znowu gadasz głupoty.
Od restartu jest register_event("TextMsg", "restart_round", "a", "2&#Game_will_restart_in")

@up:
set_task(1.0,"odliczanie",5673,_,_,"b")
sprawdziłeś chociaż, co napisałeś?
Odpowiedz