←  Pluginy

AMXX.pl: Support AMX Mod X i SourceMod

»

wieksze obrażenia z broni dla 1 gracza

Locked

  • +
  • -
AmD's Photo 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:


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ć? :D
Quote

  • +
  • -
DarkGL's Photo 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
Quote

  • +
  • -
AmD's Photo 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)
Quote

  • +
  • -
DarkGL's Photo 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)
Quote

  • +
  • -
grankee's Photo 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)
Quote

  • +
  • -
DarkGL's Photo DarkGL 15.09.2010

grankee a co to ma dorzeczy ?
nazywać zmienne mogę jak chcę ;F
Quote

  • +
  • -
AmD's Photo AmD 15.09.2010


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;
}
zrobiłem tak ale nie działa :/
Edited by AmD, 15.09.2010 22:13.
Quote

  • +
  • -
DarkGL's Photo DarkGL 15.09.2010

logi ? caly kod :F ?
Quote

  • +
  • -
grankee's Photo grankee 15.09.2010

Owszem nazwy nie mają znaczenia, jednak ma znaczenie ich kolejność.
Kolejna sprawa DarkGL nie wprowadzaj w błąd :P Dokładnie to powinien użyć HAM_OVERRIDE tak jak to zrobił.
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.
Quote

  • +
  • -
DarkGL's Photo 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 :D
Quote

  • +
  • -
grankee's Photo grankee 15.09.2010

victim=ofiara a nie atakujący, błędnie nazywasz zmienne, wprowadzasz w błąd innego programiste, który to czyta.
Quote

  • +
  • -
DarkGL's Photo 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
#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*()) */
Quote

  • +
  • -
grankee's Photo 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
Quote

  • +
  • -
G[o]Q's Photo 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 :D nie wiem jak to wyglada dla RegisterHam() czy tez RegisterHamB()
Quote

  • +
  • -
grankee's Photo 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.
Quote

  • +
  • -
AmD's Photo 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ć?

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? :D


a... logi czyste :)
Edited by AmD, 16.09.2010 16:21.
Quote

  • +
  • -
DarkGL's Photo DarkGL 16.09.2010

musisz dodać globala czy ma mieć zwiększone obrazenai czy nie
Quote

  • +
  • -
G[o]Q's Photo 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 :D

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
Quote

  • +
  • -
AmD's Photo AmD 16.09.2010

hmm czyli w funkcji mam dodać coś typu:

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.
Quote

  • +
  • -
G[o]Q's Photo G[o]Q 16.09.2010

wyrzuc sobie ostatniego returna za przed ostatnia klamre i bedzie git
Quote
Locked