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 )
{
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 )
{
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.