←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Zatrzymanie gracza

  • +
  • -
kyriuch - zdjęcie kyriuch 04.01.2013

Witam, mam problem. Potrzebuję zatrzymać gracza w jednym miejscu, podczas gdy jest on rozpędzony. Nie chce go wsadzać w ziemię, ponieważ wtedy jest taki dziwny efekt skrzywienia/latania. Nie chcę również ustawić mu flagi FL_FROZEN ponieważ wtedy też jest dziwny efekt. Chcę po prostu aby został zatrzymany w miejscu, w czasie dotyku pewnego bytu. Potrzebuję tylko zatrzymania, ponieważ dotyk mam już zarejestrowany. Proszę, pomóżcie!
Odpowiedz

  • +
  • -
Droso - zdjęcie Droso 04.01.2013

http://amxx.pl/dokum...t_user_maxspeed
+ wywołuj to wtedy kiedy chcesz go zatrzymać i w event CurWeapon
Odpowiedz

  • +
  • -
kyriuch - zdjęcie kyriuch 04.01.2013

Tylko widzisz, prędkość się ustawi maksymalna, ale i tak muszę czekać, aż się zatrzyma, dodatkowo jeśli przyduckuje, to poleci dalej :) Umiem już trochę i wpadłem na to ^^
Odpowiedz

  • +
  • -
Droso - zdjęcie Droso 04.01.2013

Tylko widzisz, prędkość się ustawi maksymalna, ale i tak muszę czekać, aż się zatrzyma

Nje, skoro gościu przekracza prędkość to go zatrzyma, chyba, że jest w powietrzu.
Odpowiedz

  • +
  • -
kyriuch - zdjęcie kyriuch 05.01.2013

Ustawiam maxspeed w chwili zetknięcia gracza z ziemią, a i tak go nie zatrzymuje :)
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 05.01.2013

Na graczu wykonaj
entity_set_vector(id, EV_VEC_velocity, Float:{0.0,0.0,0.0});
Odpowiedz

  • +
  • -
kyriuch - zdjęcie kyriuch 05.01.2013

Nie pomaga :/
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 05.01.2013

To widocznie źle coś robisz, to co ja podałem, zatrzymuje gracza na chwilę i po tym wystarczy mu ustawić prędkość na 0.00001 i na pewno nie będzie mógł chodzić oraz zatrzyma się od razu.
Odpowiedz

  • +
  • -
kyriuch - zdjęcie kyriuch 05.01.2013

entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
fm_set_user_maxspeed(id,0.00001)


Nie zatrzymuje, uwierz mi, zwłaszcza jak przyduckuje.
Odpowiedz

Gość_21977_* 07.01.2013

http://amxx.pl/dokum...t_user_maxspeed
+ wywołuj to wtedy kiedy chcesz go zatrzymać i w event CurWeapon

nie CurWeapon, a Ham_Item_PreFrame. CurWeapon nie służy zmiany prędkości na graczu i NIE DZIAŁA POPRAWNIE!

Chcąc zatrzymać gracza w miejscu, zmień jego prędkość na 0.1, używając funowskiego set_user_maxspeed.
Do tego warto graczowi wyzerować wektor ruchu, o czym napisał sebul.
sebul (07.01.2013 15:23):
"nie CurWeapon, a Ham_Item_PreFrame. CurWeapon nie służy zmiany prędkości na graczu i NIE DZIAŁA POPRAWNIE!"
Co masz na myśli pisząc, że nie działa poprawnie?
(07.01.2013 17:29):
Nie zawsze zmienia prędkość gracza, gdyż CurWeapon nie pokrywa się ze zmianą prędkości,
a więc nie działa poprawnie, chociażby po spawnie, czy odebraniu broni graczowi.
I nie mam tutaj na myśli beznadziejnego remove_user_weapons.
(07.01.2013 17:31):
Ten temat był nieraz wałkowany na AM,
u nas niestety, dalej powielane jest błędne
rozwiązanie z CurWeapon a potem pojawiają się
tematy, że gracze biegają już podczas FreezeTime`u.
sebul (07.01.2013 17:40):
"a potem pojawiają się tematy, że gracze biegają już podczas FreezeTime`u."
Ja tam nigdy z tym problemu nie mam, do tego wiadomo, że to się nie pokrywa ze zmianą prędkości, ale to nie oznacza, że nie działa poprawnie, bo u mnie nigdy tego problemu nie było, wszystko zależy od "kodera".
sebul (07.01.2013 17:45):
Oczywiście nie mam tutaj na myśli, że "CurWeapon" to najlepszy sposób na zmienianie prędkości, ale na pewno przy dobrym użyciu nie ma żadnych problemów, prócz może tego, że jak graczowi zabierze się broń, to jego prędkość zaktualizuje się po jakimś czasie.
(08.01.2013 02:22):
CurWeapon z odpowiednim WorkAroundem nie będzie stanowić problemu, ale pojawi się sporo dodatkowego kodu + niepotrzebne resetowanie prędkości gracza m.in. podczas strzału, czy przeładowania broni.

Mimo to, jak właśnie napisałeś, zabranie broni graczowi może zaktualizować prędkość z opóźnieniem, co, jak dla mnie, całkowicie eliminuje metodę CurWeapon jako skuteczną, ale wszystko zależy od programisty oraz zastosowania. Mimo wszystko, polecam rozwiązaniem z Ham_Player_ResetMaxSpeed
Odpowiedz

  • +
  • -
MarWit - zdjęcie MarWit 07.01.2013

Hmm... moze tak ?

#include < amxmodx >
#include < fakemeta >

new bool:gbisFrozen[ 33 ] = { false };

public plugin_init()
{
register_forward( FM_SetClientMaxspeed, "fwSetClientMaxspeed" );

register_clcmd( "say /test", "cmdIWannaToTestIt" )
}

public client_connect( id )
gbisFrozen[ id ] = false;

public cmdIWannaToTestIt( id )
{
engfunc( EngFunc_SetClientMaxspeed, id, 0.00001 ); // Nie wiem czy to w ogole potrzebne = D
gbisFrozen[ id ] = ! gbisFrozen[ id ];
}

public fwSetClientMaxspeed( id, Float: fMaxspeed )
{
if( gbisFrozen[ id ] )
{
fMaxspeed = 0.00001;
return FMRES_HANDLED;
}

return FMRES_IGNORED ;
}
Odpowiedz

  • +
  • -
kyriuch - zdjęcie kyriuch 07.01.2013

my god, MarWit to co napisałeś, to weź to przeczytaj jeszcze raz, przecież co da

fMaxpseed = 0.00001

w forwardzie? nic, co do reszty, to benio, set_user_maxspeed na 0.1 i vector na 0 0 0 owszem, zatrzymuje gracza, ale zrozumcie, że ja to robię w chwili zetknięcia z entem podłogi, kiedy to gracz jest znacznie rozpędzony, przez co jeśli sobie przyduckuje, to zatrzyma go dopiero wtedy kiedy straci prędkość :/
Użytkownik kyriuch edytował ten post 07.01.2013 19:37
Odpowiedz

  • +
  • -
MarWit - zdjęcie MarWit 07.01.2013

<br />my god, MarWit to co napisałeś, to weź to przeczytaj jeszcze raz, przecież co da<br />fMaxpseed = 0.00001<br />w forwardzie? nic<br />


Czysty błąd w doborze funkcji ( nie wspominając o tym że sam forward nie działa jak należy o czym było wspominane m.in. na AM ). Masz zatem jeszcze możliwość zmiany pev_movetype na NONE ( chodz nie mam pojęcia czy to zadziała ), bądź ew. zmianę prędkości przy animacji modelu chodu. Możesz także w ogóle zablokować klawisze chodu, bądź po prostu zablokować zmianę origin.
Użytkownik MarWit edytował ten post 07.01.2013 20:13
Odpowiedz