Uwaga: Poradnik poprawiony
Na tym forum już jest tutorial o zmianie prędkości gracza (link) lecz pokazuje nam tylko trzy opcje:
• CurWeapon
• Ham_CS_Player_ResetMaxSpeed
• Ham_Item_PreFrame
Osobiście uważam że każda z nich jest w jakimś stopniu nie odpowiednia. Nawet to udowodnie. Wytłumaczenie dlaczego CurWeapon jest złe do ustawienia zmiany prędkości gracza znajdziecie tutaj. Zostały nam zatem jeszcze dwie opcje do wykluczenia.
Ham_Item_PreFrame
Ma tylko jedną wadę tzn. to jest think wykonuje się tyle samo ile gracz posiada fps. Zatem podczas 1 min gry może wykonać się 6000 razy nawet jeśli stoimy w miejscu i totalnie nic nie robimy Czegoś tak nie optymalnego nie chcemy. Dlatego ta opcja od razu odpada.
Ham_CS_Player_ResetMaxSpeed
Patrząc na to teoretycznie to ta funkcja nie posiada wad ale jednak w praktyce się znajdują. Tzn:
• wykonuje sie parę razy więcej niż powinna gdyż nasza prędkość jest resetowana także podczas freeze time'u, śmierci, spawn'u
• W jakiś sposób trzeba rozróżnić wykonanie się tej funkcji w czasie freeze time'u i po nim
• NAJWAŻNIEJSZE Ta funkcja jest dostepna dopiero w wersji 1.3 hamsandwich'a co jest jej największą wadą gdyż z wielu przyczyn nie każdy ma mozliwość jego aktualizacji
Zatem w jaki sposób ustawiać prędkość graczu? Zastanówmy się. Wszystkie dostępne sposoby jakie znalazłem na necie mówią o wymuszaniu prędkości gracza w jakimś evencie lecz po co mamy wymuszać nową wartość prędkości?? Nie lepiej sprawić by CS sam ustawił taką jaką chcemy? Jasne że lepiej to dlaczego nie Dlatego wykombinowałem coś swojego hihihi
Do zmiany wartości którą CS ustawia nam jako prędkość będziemy potrzebować:
• hamsanwich'a
• umiejętności myślenia
Uwaga jeśli nie masz choćby jednej z wyżej wymienionych rzeczy ten tutorial ci się nie przyda!!!
Niestety musimy zmierzyć się jeszcze z jedną acz ostatnią przeszkodą tzn. classname do RegisterHam Funkcja Ham_Item_Deploy ma to w sobie że wykonuje się dla broni nie dla gracza dlatego nie można złapać momęt pokazania broni za pomocą classname == player, trzeba używać każdego z osobna classname broni. Ma to swoją wadę i zaletę:
Zaleta: w przypadku chęci zwiększenia prędkości np. tylko na nożu wystarczy złapać tylko classname == weapon_knife
Wada: jesli chce się zmieniać prędkość na wszystkich boniach trzeba złapać ten event dla wszystkich classname standardowych broni
Lista classname standardowych broni: klik
Ogółem to wada jest tak mizerna że nie ma co się o nią fapać Bo wystarczy raz na całą mapę przejechać po 31 classname
Ham_CS_Item_GetMaxSpeed posłuży nam jako event zmiany prędkości (ale tylko pre)
Wystarczy gadania. Zróbmy kod:
#include <amxmodx> #include <hamsandwich> #include <fakemeta> //Wymagane moduły //fakemeta tylko do sprawdzania id gracza/broni (opcjonalny moduł) const m_pPlayer = 41 const m_iId = 43 public plugin_init() { new classname[32] // Zmienna do której będziemy pobierać classname poszczególnych broni for(new i=1;i<31;++i) if(i!=2) { //Pętelka na wszystkie bronie get_weaponname(i,classname,31) //Pobieram classname danej broni RegisterHam( Ham_CS_Item_GetMaxSpeed, classname, "GetItemMaxSpeed") //Rejestruje uchwyt na event Ham_CS_Item_GetMaxSpeed dla danego classname broni //Ważne 4 arg musi == 0 by to był event typu pre } } public GetItemMaxSpeed(wid) // tutaj łapie event { //Pamiętajcie wid to id bytu broni (nie mylić z CSW_*) new weapon,id,Float:Speed // robie zmiennej na id gracza i id z CSW_* id = get_pdata_cbase(wid,m_pPlayer,4) //Ważne tylko takim sposobem pobierać id gracza który trzyma broń // Gdyż użycie pev/entity_get_edict może zwrócić -1 nawet jeśli gracz trzyma broń w momęcie startu/końca pracy serwera gdyż // Dane z pev/entity_get_edict są czasami (pod dużym obciążeniem) aktualizowane później niż dane pod offsetem m_pPlayer //Tak w ogóle to pobieram id gracza xD weapon = get_pdata_int(wid,m_iId,4) // Pobieram id broni to z CSW_* //Zeby przytoczyć trochę praktyki to dajmy graczu który posiada flagę ADMIN_LEVEL_H prędkość równą 500 na wszystkich broniach // oprócz C4 bo na nim ustawimy 900 xD //Najpierw sprawdzamy czy posiada flagę ADMIN_LEVEL_H if(get_user_flags(id) & ADMIN_LEVEL_H) { //Teraz muzimy sprawdzić czy aktywna broń to nie C4 if(weapon != CSW_C4) { //Jeśli to nie C4 //Ustawiamy prędkość równą 500.0 Speed = 500.0 } else { //Lecz jeśli to C4 to 900 Speed = 900.0 } } //Zmieniam zwracana wartosc SetHamReturnFloat(Speed) //Informuje o zmianie zwracanej wartosci return HAM_OVERRIDE }Ten sposób zmiany prędkości nie ma większych wad bo:
• uruchamia się
• nie trzeba bawić sie freeze time'em bo CS robi to za nas!!
• możliwość kożystania już od pierwszej (oficjalnej w amxmodx'ie) wersji hamsandwich'a
• nie da się tego zbugować od strony clienta
Opis offset'ów:
• m_pPlayer - Typ edict(int). Przechowuje coś w stylu ownera dla danej broni lub byt do którego jest aktualnie przyczepiona (jedno i to samo)
• m_iId - Typ int. Przechowuje id broni (to z CSW_*)
To chyba na tyle. Prosty, łatwy i optymalny sposób na zmiane prędkości gracza
Użytkownik BlackPerfum edytował ten post 23.07.2014 23:46