Właściciel GET Opublikowano 30 Czerwca 2014 Właściciel Opublikowano 30 Czerwca 2014 Zmiana prędkości gracza Istota prędkości u graczaPrędkość, z jaką porusza się gracz to iloczyn jego maksymalnej prędkości oraz spowolnienia (np. po skoku, otrzymaniu niektórych obrażeń czy podczas używania spadochronu).Jednakże chcąc dodać graczowi bonus prędkości, bądź go spowolnić, wystarczy się skupić na jego maksymalnej prędkości i tym się właśnie zajmiemy.Prędkość standardowaStandardowo, prędkość maksymalna gracza jest ustalana głównie w 3 sytuacjach (dla CS 1.6): Przy aktywowaniu broni, gdzie wartość maksymalnej prędkości gracza jest ustalana w zależności od przyjmowanej broni (210 - 260):210: AWP, G3SG1, SG550 220: M249 221: AK47 230: M3, M4A1 235: SG552 240: XM1014, Galil, Famas, AUG 245: P90 250: Glock, USP, P228, dEagle, Elites, FiveseveN, UZI, TMP, MP5, UMP ,Knife , HE, FB, SG, C4 260: Scout Przy rozpoczęciu podkładania bomby (0) Przy rozpoczęciu rozbrajania bomby (0) Ograniczenia górne prędkości maksymalnejMaksymalna prędkość graczy jest ograniczona bezwzględnie:do 1000 przez HLDS przez cvar serwera sv_maxspeed przez cvary każdego z graczy: cl_forwardspeed dla biegu do przodu cl_backspeed dla biegu do tyłu cl_sidespeed dla biegu w bok cl_upspeed dla szybkości wspinania się po drabinie cl_downspeed dla szybkości schodzenia z drabiny Jeśli chcemy zezwolić graczom na korzystanie z bonusów prędkości,warto ustawić cvar serwera sv_maxspeed na 1000.Do tego, możemy zmieść graczom limity ustalone przez nich samych:public client_connect(id){ client_cmd(id, "cl_forwardspeed 1000"); client_cmd(id, "cl_backspeed 1000"); client_cmd(id, "cl_sidespeed 1000"); client_cmd(id, "cl_upspeed 1000"); client_cmd(id, "cl_downspeed 1000"); } Zmiana prędkości graczaMaksymalna prędkość gracza zapisana jest jako dana prywatna bytu (pdata) pod identyfikatorem pev_maxspeed.Jednak dużo łatwiej będzie nam korzystać z gotowych natywów set_user_maxspeed i get_user_maxspeed.jednakże, jak już wiemy, prędkość gracza zmienia się m.in. wraz z aktywowaniem broni, a więc samo przypisanie jej do gracza nie wystarczy.W tym celu, poza zmianą prędkości gracza w miejscu, będziemy musieli oznaczyć go jako posiadaczabonusu prędkości, by w momencie, gdy zaistnieje reset jego prędkości, ponownie nadać utracony bonus.Event zmiany prędkościDo wykrycia resetu maksymalnej prędkości u gracza, służy event HamSandwich: Ham_CS_Player_ResetMaxSpeed.RegisterHam(Ham_CS_Player_ResetMaxSpeed, "player", "speed", 1); Funkcja Ham_CS_Player_ResetMaxSpeed wyłapuje dokładnie i tylko reset prędkości gracza, czyli właśnie to, czego chcemy.Ham_CS_Player_ResetMaxSpeed jest częścią HamSandwich od wersji 1.3. Jeśli korzystasz ze starszej wersji HamSandwich,zalecam Ci zaktualizować go do najnowszej wersji 1.3, dzięki czemu zyskasz dość sporo nowych eventów do wykorzystania.Jeśli jednak masz starą wersję i nie chcesz aktualizować modułu kanapki z szynką, zamiast eventu Ham_CS_Player_ResetMaxSpeed,użyj eventu, który wykonuje się przy każdym procesie myślenia przedmiotów, czyli zawsze, gdy potrzeba, orazprzy zmianie właściwości przedmiotów, zwłaszcza broni, podczas przeładowania, czy oddawania strzałów,czyli Ham_Item_PreFrame. Dla wersji HamSandwich starszych, niż 1.3 jest to jedyne rozwiązanie.WebKompilator na AMXX.pl posiada ham_const.inc w wersji 1.3, a więc obsługuje najnosze eventy HamSandwich.Jeśli tworzysz uniwersalny plugin, bądź modyfikację i nie wiesz, czy Administrator korzysta z aktualnej wersji HamSandwich, czy nie,warto sprawdzić, czy można wykorzystać event Ham_CS_Player_ResetMaxSpeed, czy będzie trzeba użyć Ham_Item_PreFrame.RegisterHam(get_player_resetmaxspeed_func(), "player", "speed", 1); Ham:get_player_resetmaxspeed_func(){ #if defined Ham_CS_Player_ResetMaxSpeed return IsHamValid(Ham_CS_Player_ResetMaxSpeed)?Ham_CS_Player_ResetMaxSpeed:Ham_Item_PreFrame; #else return Ham_Item_PreFrame; #endif }Autor funkcji get_player_resetmaxspeed_func: ConnorMcLeod.Przykładowe zastosowaniePrzykład pluginu, który na początku każdej rundy, przyzna losowemu graczowi buff prędkości do 1000.0 wraz z komentarzami. #include <amxmodx> #include <fun> #include <HamSandwich> // makrodefinicje obsługi Sumy bitów #define SetBit(%1,%2) (%1|=(1<<(%2))) #define ClearBit(%1,%2) (%1&=~(1<<(%2))) #define CheckBit(%1,%2) (%1&(1<<(%2))) // zmienna jako suma bitów, określająca, czy gracz ma bonus prędkości new speedbuff; // zmienna z maksymalną liczbą graczy na serwerze new maxPlayers; public plugin_init(){ // Rejestruje plugin register_plugin("Random speed buff", "1.0", "benio101"); // Rejestruje najlepszy dostępny event resetu prędkości gracza RegisterHam(get_player_resetmaxspeed_func(), "player", "speed", 1); // Rejestruje event nowej rundy register_logevent("roundStart", 2, "1=Round_Start"); // Rejestruje event końca rundy register_logevent("roundEnd", 2, "1=Round_End"); } public plugin_cfg(){ //pobiera maksymalną liczbę graczy na serwerze maxPlayers=get_maxplayers(); } // Wybiera najlepszy dostępny event resetu prędkości gracza Ham:get_player_resetmaxspeed_func(){ #if defined Ham_CS_Player_ResetMaxSpeed return IsHamValid(Ham_CS_Player_ResetMaxSpeed)?Ham_CS_Player_ResetMaxSpeed:Ham_Item_PreFrame; #else return Ham_Item_PreFrame; #endif } // obsługa nowej rundy public roundStart(){ // pobieranie id żywych graczy new player_ids[32], players=-1; for(new i=1; i<=maxPlayers; ++i){ if(is_user_alive(i)){ player_ids[++players]=i; } } if(++players){ // losujemy zwycięzcę speed buffa new winner=player_ids[random(players)]; // dodajemy jej buffa prędkości w miejscu set_user_maxspeed(winner, 1000.0); // oznaczamy gracza jako posiadającego buffa SetBit(speedbuff, winner); }/*{ else brak żywych graczy, nie losujemy }*/ } // obsługa bonusu prędkości public speed(id){ if( // sprawdzamy, czy gracz żyje is_user_alive(id) // oraz, czy posiada buff prędkości && CheckBit(speedbuff, id) ){ // jeśli posiada, to ustawiamy mu prędkość znów na 1000.0 set_user_maxspeed(id, 1000.0); } } public client_connect(id){ // zapobiegamy odziedziczeniu buffa przez nowego gracza, // który otrzymał id szczęśliwca, który opuścił serwer ClearBit(speedbuff, id); } public roundEnd(){ // runda się skończyła, usuwamy wszelkie bonusy prędkości speedbuff=0; } Dlaczego CurWeapon NIE JEST eventem od resetu prędkościCurWeapon jest eventem, wywoływanym w momencie zmiany stanu broni.Czyli m.in. po każdym strzale, zmianie broni, przeładowaniu czy zakupieniu.Wiele osób BŁĘDNIE wykorzystuje event CurWeapon zamiast Ham_CS_Player_ResetMaxSpeed.Wymienię tutaj kilka najważniejszych z negatywnych skutków tego tragicznego rozwiązania.CurWeapon nie wykonuje się po spawnie graczy (choć powinien) i zmiana prędkości graczazachodzi w praktyce dopiero po zmianie broni, bądź oddanym strzale czy przeładowaniu.CurWeapon zachodzi w momencie, kiedy zmienia się stan broni, jak wspomniałem, m.in.podczas strzału, choć nie powinien. Jest to zdecydowanie niepotrzebne i wpływa zauważalniena zwiększenie lagów na serwerze. Używanie tego rozwiązania w połączeniu z wymagającymiobliczeniami, znacząco zwiększa lagi gracza i potem na forum pojawiają się tematy "Zacina mi CS, jak strzelam".CurWeapon wykonuje się dopiero pewien czas po evencie resetu prędkości gracza, przez comożemy zauważyć dość irytujące "bujanie' postacią podczas strzelania, czy zmiany broni.CurWeapon jest eventem zawodnym. Innymi słowy, może się nie wykonać, tymsamym, nie reustalić prędkości gracza po resecie jego maksymalnej prędkości.Wystarczy bardzo szybko zmienić dokładnie czterokrotnie broń (z jednej na drugą),by zyskał status zawodnego i nie wykonał się, nie przyznając nam buffu, czy antybuffu.Dla standardowego połączenia, jest to okres ok. 1/4 sekundy. Czterokrotna zmianabroni w tym czasie nie jest trudna, zapewne zgodzą się ze mną Ci, którzy odblokowalilabirynt w ukrytej krainie w Raymanie 2 bez wpisywania tajnego kodu w menu głównym.Przykład nieskutecznego działania eventu CurWeapon dla przykładowego pluginu: #include <amxmodx> #include <fun> public plugin_init(){ register_plugin("1000 speed", "1.0", "benio101"); register_event("CurWeapon", "CurWeapon", "be"); } public CurWeapon(id){ set_user_maxspeed(id, 75.0); } Jeśli nie potraficie w ciągu ok. 1/4 sekundy czterokrotnie zmienić broni,a chcielibyście się przekonać, że CurWeapon faktycznie NIE ZAWSZE działa,załączam Wam config, który możecie sobie zbindować pod wodolny klawisz.Po wciśnięciu klawisza, wasza prędkość wróci do podstawowej (zignoruje efektspeed buffa, spowolnienia, czy unieruchomienia) o ile jest on nadawany przez CurWeapon.Config z bindem pod klawisz "L", wymaga posiadania noża oraz pistoletu:alias "waits" "wait; wait; wait; wait; wait; wait" bind "l" "slot2; wait; slot3; waits; slot2; waits; slot3; waits; slot2;"Jak widzicie, zmienia on broń dokładnie czterokrotnie w ok. 1/4 sekundy.Pierwsza zmiana służy jedynie upewnieniu się, że rozpoczniemy zmiany od pistoletu.Dla wolnego połączenia lub mulącego serwera / CSa, należy zmniejszyć liczbęwait w aliasie z 6 do ok. 4. Zainteresowani zresztą trafią na to metodą prób i błędów. Źródło: amxx.pl | Autor: benio101 9
Przep1s. Opublikowano 30 Czerwca 2014 Fragowicz Opublikowano 30 Czerwca 2014 (edytowane) Przyda się nie jednej osobie. - Lecz wątpie że ktoś przeczyta to całe, napracowałęś się. - Leci plusik w twoją stronę. ;) / Odpowiedz. - - Oczywiscie że to jest bardziej dla pogramistów, dlatego piszę że im się przyda, osoby które mile chcą zawitać jako programista, powinny odwiedzić kochane forum i przeczytać twojego posta. ;) Edytowane 30 Czerwca 2014 przez Nesty
PawelPasza Opublikowano 4 Sierpnia 2014 Fragowicz Opublikowano 4 Sierpnia 2014 Dzięki :D Przydało się i całe przeczytałem ciekawe nawet nie wiedziałem że tak można ;p Plusik :D
Zasłużony Fragowicz Nikoś Opublikowano 1 Września 2014 Zasłużony Fragowicz Opublikowano 1 Września 2014 Dzięki bardzo ! Przydało sie
Właściciel GET Opublikowano 6 Czerwca 2017 Autor Właściciel Opublikowano 6 Czerwca 2017 Wiadomość została wygenerowana automatycznie. Ten temat został oznaczony przez Moderatora jako spam i wyrzucony do -> archiwum. Jeśli się z tym nie zgadzasz, raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Rekomendowane odpowiedzi