Prę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ść standardowa
Standardowo, 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)
Maksymalna 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
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 gracza
Maksymalna 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


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 posiadacza
bonusu prędkości, by w momencie, gdy zaistnieje reset jego prędkości, ponownie nadać utracony bonus.
Event zmiany prędkości
Do 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, oraz
przy 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);Autor funkcji get_player_resetmaxspeed_func: ConnorMcLeod.
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
}
Przykładowe zastosowanie
Przykład pluginu, który na początku każdej rundy, przyzna losowemu graczowi buff prędkości do 1000.0 wraz z komentarzami.
Dlaczego CurWeapon NIE JEST eventem od resetu prędkości
CurWeapon 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 gracza
zachodzi 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żalnie
na zwiększenie lagów na serwerze. Używanie tego rozwiązania w połączeniu z wymagającymi
obliczeniami, 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 co
moż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ć, tym
samym, 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 zmiana
broni w tym czasie nie jest trudna, zapewne zgodzą się ze mną Ci, którzy odblokowali
labirynt 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);
}
http://youtu.be/ecZx0SFWqpg
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 efekt
speed 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.
Użytkownik Benio101 edytował ten post 29.03.2013 21:31
Dodałem wzmiankę o ham_const.inc w WebKompilatorze