←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Wtedy, kiedy byt zabija gracza

Zablokowany

  • +
  • -
d0naciak - zdjęcie d0naciak 21.10.2012

Witam,
otóż chciałbym się dowiedzieć, czy kiedy gracz X zabije gracza Y z np. rakiety na codmodzie, to kiedy w DeathMsg dodam cos takiego
new weapon[32]; read_data(4, weapon, 31);

To czy weapon bedzie mialo nazwe "rocket" ?
Użytkownik d0n tHe Pr0oo edytował ten post 21.10.2012 08:25
Odpowiedz

  • +
  • -
MarWit - zdjęcie MarWit 21.10.2012

Nie, bo przy dotknięciu rakiety wykonujesz funkcję wywolujaca obrazenia/śmierć ( np. Ham_TakeDamage ) na niezarejestrowanej klasie bytu, silnik nie wie jak to rozpoznać i defaultowo ten argument powinienen być pusty lub zawierać string "worldspawn". Ogólnie, ten argument jest używany do przechowywania nazwy sprite wyświetlanego w killboard'dzie.
Odpowiedz

  • +
  • -
d0naciak - zdjęcie d0naciak 21.10.2012

to jak inaczej zrobić, by sprawdzić czy gracz zabił z rakiety ? Moze w ham_takedamage sprawdzac czy obrazenia sa wieksze, rowne hp obrywajacego, i czy byt atakujacy posiada classname rocket ?
Odpowiedz

  • +
  • -
MarWit - zdjęcie MarWit 21.10.2012

Tak jak mówisz będzie działać, ew. możesz jeszcze w TakeDamage zapisywać id atakującego bytu do tablicy i wykorzystywać w Ham_Killed lub jakimś innym evencie zabójstwa.
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 21.10.2012

to jak inaczej zrobić, by sprawdzić czy gracz zabił z rakiety ? Moze w ham_takedamage sprawdzac czy obrazenia sa wieksze, rowne hp obrywajacego, i czy byt atakujacy posiada classname rocket ?

A gdyby zmienić sprite na rocket w killboard ?
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 21.10.2012

new inflictor = create_entity("info_target");
entity_set_string(inflictor, EV_SZ_classname, "rocket");
/*entity_set_edict(inflictor, EV_ENT_owner, attacker);
entity_set_edict(inflictor, EV_ENT_enemy, victim);*/
ExecuteHam(Ham_TakeDamage, victim, inflictor, attacker, fDamage, bits);
entity_set_int(inflictor, EV_INT_flags, FL_KILLME);

Tylko wtedy jeśli ktoś od tego zginie, to nie będzie się to liczyć do ranku. Oczywiście wtedy nazwa broni w logach będzie taka "rocket", a jeśli chcesz, żeby w sprite był wyswietlany inny obrazek niż czaszka, to wystarczy zrobić coś takiego
register_message(get_user_msgid("DeathMsg"), "MessageDeathMsg");

public MessageDeathMsg(msgID, msgDest, msgEnt) {
new szTmp[32];
get_msg_arg_string(4, szTmp, 31);

new weapon;
if(TrieGetCell(gCustomWeapons, szTmp, weapon)) {
replace(szTmp, 31, "rocket", "knife");
// i tu można wszystkie nazwy podawać kolejno w ten sam sposób co wyżej
}
if(weapon)
set_msg_arg_string(4, szTmp);
}

Widać też, że jest tu użyte drzewo, czyli trzeba też tak jakby rejestrować każdą nową nazwę, czyli robimy mniej więcej coś takiego
new Trie:gCustomWeapons;
new giLastCustomWeaponId = CSW_P90;

gCustomWeapons = TrieCreate();

public ZarejestrujNowaBron(const szName[]) {
new CustomWeapon;
if(TrieGetCell(gCustomWeapons, szName, CustomWeapon))
return CustomWeapon;

TrieSetCell(gCustomWeapons, szName, ++giLastCustomWeaponId);
return giLastCustomWeaponId;
}


Jeszcze podam tylko w jaki sposób najlepiej wyciągać nazwę "broni"
register_event("DeathMsg", "SmiercPost", "a");

public SmiercPost() {
new weaponname[32];
read_data(4, weaponname, 31);

new weapon;
TrieGetCell(gCustomWeapons, weaponname, weapon);

if(!weapon) {
if(equal(weaponname, "grenade")) {
format(weaponname, 31, "weapon_he%s", weaponname);
}
else if(!equal(weaponname, "weapon_", 7))
format(weaponname, 31, "weapon_%s", weaponname);

weapon = get_weaponid(weaponname);
}
}
Odpowiedz

  • +
  • -
d0naciak - zdjęcie d0naciak 21.10.2012

Można zamknąć :>
Odpowiedz

  • +
  • -
Kawon - zdjęcie Kawon 21.10.2012

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
Odpowiedz
Zablokowany