wieksze obrażenia z broni dla 1 gracza
AmD
14.09.2010
Witam!
Chce zrobić funkcje która po wpisaniu komendy daje większe obrażenia z wszystkich broni (nie wiem czy da się jakoś to sensownie napisać bez "&&"), chwilowo zrobiłem tylko dla 3 broni dla testu ale nie działa
oto mój kod:
co zrobiłem źle? i jak to poprawić?
Chce zrobić funkcje która po wpisaniu komendy daje większe obrażenia z wszystkich broni (nie wiem czy da się jakoś to sensownie napisać bez "&&"), chwilowo zrobiłem tylko dla 3 broni dla testu ale nie działa
oto mój kod:
public ZadajDamage(id, victim, entity, Float:damage, damagebits)
{
if(is_user_connected(id) && is_user_connected(victim))
{
if(get_user_weapon(id) == CSW_AK47 && CSW_M4A1 && CSW_DEAGLE)
{
SetHamParamFloat(4, damage * 9.5);
}
return HAM_OVERRIDE;
}
return HAM_IGNORED;
}
co zrobiłem źle? i jak to poprawić?

DarkGL
14.09.2010
public ZadajDamage(id, entity, victim, Float:damage, damagebits) { if(is_user_connected(id) && is_user_connected(victim)) { new asd = get_user_weapon(id) if(asd == CSW_AK47 || asd == CSW_M4A1 || asd ==CSW_DEAGLE) { SetHamParamFloat(4, damage * 9.5); } return HAM_HANDLED; } return HAM_IGNORED; }pisane na forum
twój warunek było co prawda prawdziwy ale tylko dla ak47 jak by miałm4 to już nie
&& - i
|| - lub
OVERRIDE - zatrzymuje nadpisywanie
AmD
14.09.2010
dzięki ale nadal nie wiem czemu funkcja działa na każdym graczu a miała tylko na jednym (id=1)
DarkGL
14.09.2010
nie sprawdzasz id gracza sprawdzasz tylko czy atakujacy i ofiara sa na servie i to tyle musiałbyś dac if(idattacker == 1)
grankee
15.09.2010
public ZadajDamage(id, entity, victim, Float:damage, damagebits)pisane na forum
twój warunek było co prawda prawdziwy ale tylko dla ak47 jak by miałm4 to już nie
&& - i
|| - lub
OVERRIDE - zatrzymuje nadpisywanie
powinno być:
(victim, idinflictor, idattacker, Float:damage, damagebits)
AmD
15.09.2010
zrobiłem tak ale nie działa
public ZadajDamage(Victim, Useless, Attacker, Float:damage, damagebits)
{
if(is_user_connected(Attacker) && is_user_connected(Victim))
{
new asd = get_user_weapon(Attacker)
if(asd == CSW_AK47 || asd == CSW_M4A1 || asd ==CSW_DEAGLE)
{
SetHamParamFloat(4, damage * 9.5);
}
return HAM_HANDLED;
}
return HAM_IGNORED;
}

Edited by AmD, 15.09.2010 22:13.
grankee
15.09.2010
Owszem nazwy nie mają znaczenia, jednak ma znaczenie ich kolejność.
Kolejna sprawa DarkGL nie wprowadzaj w błąd
Dokładnie to powinien użyć HAM_OVERRIDE tak jak to zrobił.
rozumiem, że zarejestrowałeś Ham_TakeDamage?
Edited by grankee, 15.09.2010 22:46.
Kolejna sprawa DarkGL nie wprowadzaj w błąd

public ZadajDamage(Victim, Useless, Attacker, Float:damage, damagebits)
{
if(is_user_connected(Attacker) && is_user_connected(Victim))
{
new asd = get_user_weapon(Attacker)
if(asd == CSW_AK47 || asd == CSW_M4A1 || asd ==CSW_DEAGLE)
{
SetHamParamFloat(4, damage * 9.5);
return HAM_OVERRIDE
}
}
return HAM_IGNORED;
}
rozumiem, że zarejestrowałeś Ham_TakeDamage?
Edited by grankee, 15.09.2010 22:46.
DarkGL
15.09.2010
nie rozumiem ? u mnie victim zasze będzie przechowywać id atakującego (gracza/bytu)
u ciebie to jest idattacker więc o co chodzi
u ciebie to jest idattacker więc o co chodzi

grankee
15.09.2010
victim=ofiara a nie atakujący, błędnie nazywasz zmienne, wprowadzasz w błąd innego programiste, który to czyta.
DarkGL
15.09.2010
ooo lol no tak facepalm 
Możemy po prostu anulować obrażenia przez zwrócenie HAM_SUPERCEDE lub HAM_OVERRIDE - cytat z tutka reksia
Po operacjach zwracamy HAM_HANDLED, aby zatwierdzić zmiany. - kolejny
no i nie wiem w co wieżyć gdyby to nie działało R3X by tego nie dodał ale ham_const daje mi takie info

Możemy po prostu anulować obrażenia przez zwrócenie HAM_SUPERCEDE lub HAM_OVERRIDE - cytat z tutka reksia
Po operacjach zwracamy HAM_HANDLED, aby zatwierdzić zmiany. - kolejny
no i nie wiem w co wieżyć gdyby to nie działało R3X by tego nie dodał ale ham_const daje mi takie info
#define HAM_IGNORED 1 /**< Calls target function, returns normal value */ #define HAM_HANDLED 2 /**< Tells the module you did something, still calls target function and returns normal value */ #define HAM_OVERRIDE 3 /**< Still calls the target function, but returns whatever is set with SetHamReturn*() */ #define HAM_SUPERCEDE 4 /**< Block the target call, and use your return value (if applicable) (Set with SetHamReturn*()) */
grankee
15.09.2010
supercede co prawda nie zablokuje obrazen w sensie ich zaistnienia, ale prawdopodobnie zablokuje informacje w silniku gry co za tym idzie nie wykryje ich np. plugin bulletdamage, ani nawet zwykly od statystyk, po prostu nie zaistnieje dalsza informacja jakoby te obrazenia zostaly zadane, w przeciwienstwie do override, ktory tylko zmieni wartosc
G[o]Q
16.09.2010
HAM_HANDLED jak uzywasz sethamparamfloat do dmg przynajmniej tak wnioskuje z tutka
@grankee nie wiem dokladnie jak bedzie bo nie sprawdzalem ale jesli bulletdmg bedzie wyzej w plugins.ini to mozliwe ze obrazenia zostana pokazane
nie wiem jak to wyglada dla RegisterHam() czy tez RegisterHamB()
@grankee nie wiem dokladnie jak bedzie bo nie sprawdzalem ale jesli bulletdmg bedzie wyzej w plugins.ini to mozliwe ze obrazenia zostana pokazane

grankee
16.09.2010
Nie ma znaczenia kolejnosc pluginów tylko kolejność zaistnienia zdarzeń. Najpierw jest Ham_TakeDamage, a później client_damage, wiadomo to po tym, ze w pierszym można zmienić wartości, a w drugim tylko je poznać. Coś na zasadzie register_message i register_event, event tylko poinformuje, message da możliwość zatrzymania i zgodnie z tym wywoła się najpierw.
AmD
16.09.2010
jak zarejestruje TakeDamage to wtedy wszyscy mają większe obrażenia a nie jedna osoba...
by było jasne tak to ma wyglądać?
nie rozumiem po co cały kod skoro błąd tutaj tkwi...
funkcje wykorzystuje w menu (chwilowo jest zwykłym menu potem zrobię w formie)
ps. to powiedzcie mi w końcu który kod jest poprawny?
a... logi czyste
Edited by AmD, 16.09.2010 16:21.
by było jasne tak to ma wyglądać?
RegisterHam(Ham_TakeDamage, "player", "ZadajDamage")
nie rozumiem po co cały kod skoro błąd tutaj tkwi...
funkcje wykorzystuje w menu (chwilowo jest zwykłym menu potem zrobię w formie)
ps. to powiedzcie mi w końcu który kod jest poprawny?

a... logi czyste

Edited by AmD, 16.09.2010 16:21.
G[o]Q
16.09.2010
Nie ma znaczenia kolejnosc pluginów tylko kolejność zaistnienia zdarzeń. Najpierw jest Ham_TakeDamage, a później client_damage, wiadomo to po tym, ze w pierszym można zmienić wartości, a w drugim tylko je poznać. Coś na zasadzie register_message i register_event, event tylko poinformuje, message da możliwość zatrzymania i zgodnie z tym wywoła się najpierw.
mozliwe aczkolwiek zalezy tez od tego czy sobie zarejestrujesz "event" jako pre czy post

jak zarejestruje TakeDamage to wtedy wszyscy mają większe obrażenia a nie jedna osoba...
nie bez zarejestrowania funkcja nie bedzie dzialac a w funkcji musisz juz sprawdzac czy aktualnie obrazenia zadaje dana osoba np przez pobranie nicku/sid'u/ip/flag/setinfo
AmD
16.09.2010
hmm czyli w funkcji mam dodać coś typu:
zrobiłem tak:
i kompilator wyrzuca log:
Edited by AmD, 16.09.2010 16:30.
?
new AmD[32]
get_user_authid(id,AmD,charsmax(AmD));
if(equal(AmD,"STEAM_0:MOJE:SID")) {
zrobiłem tak:
public ZadajDamage(id, Victim, Useless, Attacker, Float:damage, damagebits)
{
new AmD[32]
get_user_authid(id,AmD,charsmax(AmD));
if(equal(AmD,"STEAM_0:0:208******")) {
if(is_user_connected(Attacker) && is_user_connected(Victim))
{
new asd = get_user_weapon(Attacker)
if(asd == CSW_AK47 || asd == CSW_M4A1 || asd ==CSW_DEAGLE)
{
SetHamParamFloat(4, damage * 9.5);
return HAM_OVERRIDE
}
}
return HAM_IGNORED;
}
}
i kompilator wyrzuca log:
Warning: Function "ZadajDamage" should return a value on line 1473
Edited by AmD, 16.09.2010 16:30.