Jump to content
Sign in to follow this  
Ogen Dogen

Manipulacja mikrofonem w AMXX

2 posts in this topic

Recommended Posts

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.

  • + rep 6

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

O Nas

CSKatowice.com powstało dnia 28 lipca 2012 roku. Jesteśmy prężnie rozwijającą się siecią serwerów Counter-Strike. Nasza młoda i uzdolniona kadra Administratorów pozwala nam się szybko rozwijać!

Społeczność

Reklama

cskatowice
×
×
  • Create New...