[ROZWIĄZANE] Wtedy, kiedy byt zabija gracza
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
To czy weapon bedzie mialo nazwe "rocket" ?
Użytkownik d0n tHe Pr0oo edytował ten post 21.10.2012 08:25
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
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.
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 ?
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.
Fili:P
21.10.2012
A gdyby zmienić sprite na rocket w killboard ?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 ?
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);
}
}
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, raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Z pozdrowieniami,
Zespół AMXX.PL
Ten temat został zamknięty przez moderatora.
Powód: Pomoc udzielona
Jeśli się z tym nie zgadzasz, raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Z pozdrowieniami,
Zespół AMXX.PL