Ogen Dogen 2 862 Właściciel Last activity: 4 hours ago Posted March 4, 2016 Właściciel Share Posted March 4, 2016 Posted March 4, 2016 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 https://cskatowice.com/topic/15390-manipulacja-mikrofonem-w-amxx/ Share on other sites More sharing options...
THE WODNIK1g 168 Last activity: February 5, 2020 Posted March 4, 2016 Share Posted March 4, 2016 Posted March 4, 2016 Hej! Nie widzisz zawartości tego postu? Sign In lub Create an account, aby korzystać ze wszystkich dostępnych funkcji! Link to comment https://cskatowice.com/topic/15390-manipulacja-mikrofonem-w-amxx/#findComment-93526 Share on other sites More sharing options...
Recommended Posts