Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] [BIOHAZARD] Problem z funkcją warunkową if()dziwne powikłania po zastosowaniu warunku.


  • Zamknięty Temat jest zamknięty
6 odpowiedzi w tym temacie

#1 poloo89

    Pomocny

  • Użytkownik

Reputacja: 2
Nowy

  • Postów:59
  • GG:
  • Lokalizacja:Wrocław
Offline

Napisano 16.04.2012 15:08

Witam.
Już nie pierwszy temat o moich problemach z biohazardem :) Ale tym bardziej problem bardziej ze scriptingiem zwiazany.

Robię item w sklepie "zombie madness" jedną z jego funkcjonalności jest nieodrzucanie zombie na skutek strzału...

poniżej istotne wycinki kodu bez funkcjonalnosci anty odrzucania ( wszystko dziala jak nalezy):

(...)
new g_czas[33]
(...)
public plugin_init()
{
(...)
RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
(...)
}
(...)
public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype) // fukcja pluginu biohazard.amxx wywolywana jest w momencie strzalu i odpowiada za odrzucanie do tylu... (wg moich wnioskow :D)
{
if(!g_gamestarted)
return HAM_SUPERCEDE

if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
return HAM_IGNORED

if(!is_user_connected(attacker) || !g_zombie[victim])
return HAM_IGNORED

static kbpower
kbpower = g_weapon_knockback[get_user_weapon(attacker)]

if(kbpower != -1)
{
static flags
flags = pev(victim, pev_flags)

if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND))) // warunek ten odpowiada za nieodpychanie zombie w momencie gdy kuca ( i gdy jest ustawiony odpowiedni cvar), u mnie na serwerze jest wylaczona ta funkcja (zombie jest odpychane w kazdym wypadku)
return HAM_IGNORED

static Float:origins[2][3]
pev(victim, pev_origin, origins[0])
pev(attacker, pev_origin, origins[1])

if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
{
static Float:velocity[3]
pev(victim, pev_velocity, velocity)

static Float:tempvec
tempvec = velocity[2]

xs_vec_mul_scalar(direction, damage, direction)
xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)

xs_vec_add(direction, velocity, velocity)
velocity[2] = tempvec

set_pev(victim, pev_velocity, velocity)

return HAM_HANDLED
}
}
return HAM_IGNORED
}
(...)
/////// SZALONE ZOMBIE // funkcje sterujace ''klasa'' szalone zombie odpowiadaja za wlaczenie poswiaty odtworzenie dzwieku - wlaczane sa przez funkcje natywna wywolywana z pluginu 'sklep'

public zombie_madness(id)
{
g_czas[id] = true
set_user_godmode(id, 1)
ZmAura(id)
emit_sound(id, CHAN_STATIC, "biohazard/zombie_madness1.wav", VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
set_task(5.5, "madness_over", id)
}

public madness_over(id)
{
g_czas[id]=false
set_user_godmode(id, 0)
}

public ZmAura(id)
{
new Origin[3]
get_user_origin(id, Origin)
message_begin(MSG_PVS, SVC_TEMPENTITY, Origin, 0)
write_byte(TE_DLIGHT)
write_coord(Origin[0])
write_coord(Origin[1])
write_coord(Origin[2])
write_byte(25)
write_byte(250)
write_byte(0)
write_byte(0)
write_byte(50)
write_byte(10)
message_end()

if (g_czas[id])
{
set_task(0.1, "ZmAura", id)
return;
}
}



W powyzszym kodzie wszystko gra, tj. po wybraniu z menu pluginu 'sklep' odpalana jest posrednio funkcja zombie_madness(id) w ktorej odtwarzany jest dzwiek, wlacza sie godmod i wartosc g_czas ustawiana jest na true , dzięki czemu dziala aura.. wszystko trwa 5.5s nastepnie jest wylaczany godmode oraz g_czas zmienia sie na false.

wszystko jest jak nalezy... brakuje tylko jednej sprawy. podczas wlaczonego zombie madness powina wylaczyc sie funckja odpowiadajaca za odpychanie. no wiec postanowilem dopisac warunek w bacon_traceattack_player

if(g_czas[id])
return HAM_IGNORED;


w sumie wszystko wyglada nastepujaco:

(...)
new g_czas[33]
(...)
public plugin_init()
{
(...)
RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
(...)
}
(...)
public bacon_traceattack_player(id, victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype) // fukcja pluginu biohazard.amxx wywolywana jest w momencie strzalu i odpowiada za odrzucanie do tylu... (wg moich wnioskow :D)
{
if(!g_gamestarted)
return HAM_SUPERCEDE

if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
return HAM_IGNORED

if(!is_user_connected(attacker) || !g_zombie[victim])
return HAM_IGNORED

if(g_czas[id]) // DOPISANY PRZEZE MNIE WARUNEK, KTORY POWINIEN PRZERYWAC FUNKCJE ODPYCHANIA W MOMENCIE g_czas[id]==false
return HAM_IGNORED

static kbpower
kbpower = g_weapon_knockback[get_user_weapon(attacker)]

if(kbpower != -1)
{
static flags
flags = pev(victim, pev_flags)

if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND))) // warunek ten odpowiada za nieodpychanie zombie w momencie gdy kuca ( i gdy jest ustawiony odpowiedni cvar), u mnie na serwerze jest wylaczona ta funkcja (zombie jest odpychane w kazdym wypadku)
return HAM_IGNORED

static Float:origins[2][3]
pev(victim, pev_origin, origins[0])
pev(attacker, pev_origin, origins[1])

if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
{
static Float:velocity[3]
pev(victim, pev_velocity, velocity)

static Float:tempvec
tempvec = velocity[2]

xs_vec_mul_scalar(direction, damage, direction)
xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)

xs_vec_add(direction, velocity, velocity)
velocity[2] = tempvec

set_pev(victim, pev_velocity, velocity)

return HAM_HANDLED
}
}
return HAM_IGNORED
}
(...)
/////// SZALONE ZOMBIE // funkcje sterujace ''klasa'' szalone zombie odpowiadaja za wlaczenie poswiaty odtworzenie dzwieku - wlaczane sa przez funkcje natywna wywolywana z pluginu 'sklep'

public zombie_madness(id)
{
g_czas[id] = true
set_user_godmode(id, 1)
ZmAura(id)
emit_sound(id, CHAN_STATIC, "biohazard/zombie_madness1.wav", VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
set_task(5.5, "madness_over", id)
}

public madness_over(id)
{
g_czas[id]=false
set_user_godmode(id, 0)
}

public ZmAura(id)
{
new Origin[3]
get_user_origin(id, Origin)
message_begin(MSG_PVS, SVC_TEMPENTITY, Origin, 0)
write_byte(TE_DLIGHT)
write_coord(Origin[0])
write_coord(Origin[1])
write_coord(Origin[2])
write_byte(25)
write_byte(250)
write_byte(0)
write_byte(0)
write_byte(50)
write_byte(10)
message_end()

if (g_czas[id])
{
set_task(0.1, "ZmAura", id)
return;
}
}


zdawało by się, że wszystko bedzie działać jak ta lala. gdy zombie madness jest wylaczone ( g_data[id]==false ) zombie jest normalnie odpychane zarowno jak stoi oraz jak kuca... Natomiast gdy uruchomimy Madness wartosc g_data[id] zmieniana jest na 'true' poza efektami swietlnymi i dzwiekowymi. zombie powinno stac caly czas w miejscu w momencie strzalu zarowno w pozcji stojacej jak i kucajacej.
No i tutaj pojawia sie magia(dla mnie nie wyjasnione zjawisko) w momencie Madness, rzeczywiscie wszystko gra... zombie nie jest odrzucane....
Natomiast w stanie poza Madness. dzieja sie dziwne rzeczy... gdy zombie kuca ... cos sie psuje ( nie jest odpychane do tylu) gdy stoi wszystko dziala jak nalezy normalnie odrzuca je do tylu.

Chcialbym, żeby ktoś sprawdził ten zapis funkcji czy wszystko dobrze wpisałem... i czy mógłby mi ktoś wyjaśnić dlaczego tak sie dzieje ze po dodaniu 2 linijek kodu zwiazanych z zombie madness. Nagle zombie w stanie 'normalnym' podczas stania zachowuje sie tak jak powinno ( odpychane jest do tylu) natomiast podczas kucaka zachowuje sie tak jak w Madness ( nie odpycha go nic do tylu)

mnie sie wydaje, że jest wszystko dobrze zapisane aczkolwiek muszę się mylić :))

w załącznikach podczepiam cały plik biohazard.sma do wogóleądu.

pozdrawiam i czekam na porady.

Załączone pliki


  • +
  • -
  • 0

#2 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 17.04.2012 15:00

public bacon_traceattack_player(id, victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)

Skąd w Ham_TraceAttack wzięło się id jako pierwszy parametr + do tego victim i attacker?
Sprawdź, czy przez to się nie sypnęło.

#3 poloo89

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: 2
Nowy

  • Postów:59
  • GG:
  • Lokalizacja:Wrocław
Offline

Napisano 17.04.2012 17:33

no ja dopisałem id... bo jak nie dopisywałem to wywalało, że w funkcji
if(g_czas[id])
jest niezdefiniowany 'symbol' id. hmm.. w takim razie gdzie mam te id dopisać w definicji

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
mam dopisać parametr 'id' ?

Użytkownik poloo89 edytował ten post 17.04.2012 17:34

  • +
  • -
  • 0

#4 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 17.04.2012 20:50

Funkcja Ham_TraceAttack przyjmuje parametry
victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype
i żadnych innych. m.in. victim oznacza ofiarę (atakowanego), attacker - id atakującego, itd. (RTFM)

Pierwszy parametr jest zatem ofiarą, drugi atakującym, reszta nie ma dla naszego problemu znaczenia.
Jeśli dopisałeś sobie id na początku, to od teraz id jest numerem ofiary, a zmienna victim przyjmuje wartość (czyt. z Manuala) numeru id atakującego.
Stąd jeśli w kodzie sprawdzając w domyśle, czy victim żyje, tak naprawdę sprawdzasz, czy żyje atakujący, zaczną się w tym kodzie dziać dziwne cuda niewida,
a nie będziesz wiedział o co chodzi. NIE MOŻESZ dopisać sobie od tak parametru w predefiniowanej, includowanej funkcji, zwłaszcza na początku.


1. Usuń to id na początku, bo zmienna victim będzie reprezentować atakującego i wszystko się nam pomiesza.
2. Skoro już wiesz, że numerem id ofiary (z manuala) jest zmienna victim, to zamiast sprawdzać if(g_czas[id]), sprawdź if(g_czas[victim])
I napisz, czy teraz działa.



#5 poloo89

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: 2
Nowy

  • Postów:59
  • GG:
  • Lokalizacja:Wrocław
Offline

Napisano 17.04.2012 21:53

Spoko, dzięki za odpowiedź. Jutro sprawdze czy to o to chodzi :))
  • +
  • -
  • 0

#6 poloo89

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: 2
Nowy

  • Postów:59
  • GG:
  • Lokalizacja:Wrocław
Offline

Napisano 18.04.2012 13:42

weź na privie napisz adres to ci jakąś dobrą wódke wyśle :D
Działa ! można zamknąć :))
  • +
  • -
  • 0

#7 Goliath

    Godlike

  • Przyjaciel

Reputacja: 1 237
Godlike

  • Postów:2 334
  • GG:
  • Steam:steam
  • Imię:Maciej
  • Lokalizacja:Mońki
Offline

Napisano 18.04.2012 14:46

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, Dołączona grafika raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych