Jump to content

    Locked Manipulacja mikrofonem w AMXX


    Recommended Posts

    • Cała zawartość 2
    • Temat został założony
    • Ostatnia odpowiedź

    Top Posters In This Topic

    Najpopularniejsze posty

    Krótki poradnik o tym jak manipulować zasięgiem mikrofonu od strony serwera. Ostatnio modyfikowałem plugin VM, więc podzielę się tą wiedzą   I sposób - Wbudowane cvary. Gotowe rozwiązania wbudowan

    Krótki poradnik o tym jak manipulować zasięgiem mikrofonu od strony serwera. Ostatnio modyfikowałem plugin VM, więc podzielę się tą wiedzą ;)

     

    I sposób - Wbudowane cvary.

    Gotowe rozwiązania wbudowane w HLDS, które tylko sobie ustalamy za pomocą cvarów. Nie dają one jednak za dużych możliwości.

     

    sv_voiceenable 0/1 - włącza/wyłącza komunikacje głosową

    sv_alltalk 0/1 - umożliwia rozmowę wszystkich ze wszystkimi bez ograniczeń lub gdy wyłączony to tylko ze swoją drużyną i tylko z żywymi lub martwymi graczami w zależności od własnego stanu

    sv_voicequality 1-5 - jakość rozmów, im wyższa tym lepsza, ale może również obciążać łącze

    sv_voicecodec - wybór kodeka:

    • "voice_miles" - przestarzały
    • "voice_speex" - aktualny

     

    II sposób - Skrypt w AMXX

    Dzięki niemu możemy dokładnie określić kto kogo może usłyszeć, czego alltalk nam nie umożliwia.

    Potrzebujemy do tego modułu fakemeta.

    Rejestrujemy forward w funkcji startującej plugin - plugin_init()

    register_forward(FM_Voice_SetClientListening, "cskatowice")
    

    Tworzymy ciało naszego forwarda:

    public Forward_SetClientListening(iReceiver, iSender, bool:bListen)
    {
    
    }
    

    iReceiver - to id osoby odbierającej rozmowę

    iSender - id osoby mówiącej (wysyłająca rozmowę)

    bListen - wartość bool - określa czy ma odebrać czy nie

     

    Nasz forward wykonuje się cały czas nieprzerwanie, niezależnie od tego czy ktoś na serwerze mówi czy nie. Działa podobnie do prethinka.

    Aby zatem to ograniczyć wykluczmy już na początku z niego graczy, którzy nie istnieją.

    public Forward_SetClientListening(iReceiver, iSender, bool:bListen)
    {
       if (!is_user_connected(iReceiver) || !is_user_connected(iSender)) return FMRES_IGNORED;
    }
    

    Jest to ważne! Inaczej możemy mieć problemy z wydajnością lub dziwne crashe.

    Dodatkowo jeśli to możliwe to nie powinno się używać funkcji sprawdzających wysyłającego i odbierającego tylko najlepiej sprawdzić co potrzeba wcześniej i używać zmiennych. Jest to o wiele szybszy zabieg - dostęp do pamięci niż sprawdzanie np. flag kilkadziesiąt razy na sekundę.

    Więc w ten sposób możemy wybrać dowolnego gracza, dowolną grupę graczy wybraną według dowolnego kryterium.

    Na przykład zarezerwujmy możliwość "wysyłania" rozmowy tylko dla adminów, ale tak żeby wszyscy ich słyszeli.

     

    Tak jak wcześniej mówiłem zapiszmy w pamięci informację czy gracz, który się połączył jest adminem. Po rozłączeniu trzeba wyczyść pole.

    new bool:is_admin[33];
    
    public client_authorized(id)
    {
    	if (access(id,ADMIN_BAN)) is_admin[id] = true;
    }
    
    public client_disconnect(id)
    {
    	is_admin[id] = false;
    }
    

    Właściwa implementacja:

    public cskatowice(iReceiver, iSender, bool:bListen)
    {
    	if (!is_user_connected(iReceiver) || !is_user_connected(iSender)) return FMRES_IGNORED;
    	if(is_admin[iSender])
    	{
    		engfunc(EngFunc_SetClientListening, iReceiver, iSender, true) // wyslij
    		forward_return(FMV_CELL, true)
    		return FMRES_SUPERCEDE
            }
            engfunc(EngFunc_SetClientListening, iReceiver, iSender, false) // zablokuj reszte rozmow
            forward_return(FMV_CELL, true)
            return FMRES_SUPERCEDE
    }
    

    W ten sposób możemy zdecydować kto ma słyszeć daną rozmowę. Możemy rozróżniać według czego tylko chcemy - drużyny, kasy, fragów itd.

    Link to comment
    Share on other sites

    Guest
    This topic is now closed to further replies.
     Share

    ×
    ×
    • Create New...