Ham_TakeDamage - jak używać...?
R3X
23.05.2011
no jak coś zmienisz to możesz dostać zmienione, nigdy nie potrzebowałem obu tych forwardów na raz; chodzi o to, że obsługa post jest mniej inwazyjna dla modułu i dlatego lżejsza, ale tylko 'do odczytu', bo nie daje kontroli na wynikiem; to jest coś jak różnica między register_message, a register_event
sebul
23.05.2011
Czyli może ja też nie będę potrzebował obydwu
Bo wolałbym być pewny na kim wykonuje operacje 
Dodano 23 maj 2011 - 21:52:
A i jeszcze coś miałem się dopytać ;] Z tym drzewem trie, to pobieranie nowej broni (nie przez equal) dodaje się tak?


Dodano 23 maj 2011 - 21:52:
A i jeszcze coś miałem się dopytać ;] Z tym drzewem trie, to pobieranie nowej broni (nie przez equal) dodaje się tak?
if(!TrieGetCell(gCustomWeapons, szClass, weapon))
weapon = 0;
else
weapon = gCustomWeapons[szClass];
R3X
23.05.2011
nie
pisałem że takie cuda się nie kompilują!
to
to get pobiera wartość pod kluczem [szClass]

to
TrieGetCell(gCustomWeapons, szClass, weapon)zapisałem tak
gCustomWeapons[szClass];żeby łatwiej było zrozumieć ideę trie
to get pobiera wartość pod kluczem [szClass]
sebul
23.05.2011
Czyli jak? 
Tak? Oczywiście to tylko wycinek tego kodu.

if(!TrieGetCell(gCustomWeapons, szClass, weapon))
weapon = 0;
else
weapon = TrieGetCell(gCustomWeapons, szClass, weapon);
Tak? Oczywiście to tylko wycinek tego kodu.
R3X
23.05.2011
TrieGetCell zwraca 1 jak klucz istnieje i 0 jak klucz nie istnieje; wartość jest wpisywana do 3 argumentu przez referencję
jeśli isnieje klucz o nazwie [szClass] to weapon będzie równe jego weaponid, jeśli nie istnieje (get zwróciło 0) to do weapon wpisz 0
nie potrzebujesz drugiego getCell
btw tamten kod działa identycznie jak ten
if(!TrieGetCell(gCustomWeapons, szClass, weapon)) weapon = 0;to znaczy:
jeśli isnieje klucz o nazwie [szClass] to weapon będzie równe jego weaponid, jeśli nie istnieje (get zwróciło 0) to do weapon wpisz 0
nie potrzebujesz drugiego getCell
btw tamten kod działa identycznie jak ten
if(0 == TrieGetCell(gCustomWeapons, szClass, weapon)) weapon = 0;
sebul
23.05.2011
Teraz już kumam 
Jak wykryć wybuch bomby? DMG_BLAST?
I jeszcze czy da się zrobić tak, że jak ktoś kogoś zabija, to nie będzie pokazana broń z której zabił, tylko ta czaszka, co wyświetla się normalnie przy samobójstwie, itp. czy też nóż, pomimo tego, że zabito, np. z usp.
Użytkownik sebul edytował ten post 23.05.2011 23:35

Jak wykryć wybuch bomby? DMG_BLAST?
I jeszcze czy da się zrobić tak, że jak ktoś kogoś zabija, to nie będzie pokazana broń z której zabił, tylko ta czaszka, co wyświetla się normalnie przy samobójstwie, itp. czy też nóż, pomimo tego, że zabito, np. z usp.
Użytkownik sebul edytował ten post 23.05.2011 23:35
R3X
23.05.2011
tak, bomba to DMG_BLAST
jak chcesz zmienić przyczynę zgonu to musisz podmienić zmienić inflictora
jak chcesz zmienić przyczynę zgonu to musisz podmienić zmienić inflictora
sebul
24.05.2011
Czyli w jaki sposób zmienić?
A jak najlepiej jest kogoś uśmiercić? Czyli powiedzmy, że gdy jakaś zmienna spełnia warunek, to wtedy zabijamy kogoś. Obecnie zwracam aktualne HP ofiary i 4 parametr zamieniam na te HP, ale nie zawsze zabija (przynajmniej tak zauważyłem), bo chyba jeszcze tutaj kamizelka redukuje te obrażenia.
Użytkownik sebul edytował ten post 24.05.2011 01:56
A jak najlepiej jest kogoś uśmiercić? Czyli powiedzmy, że gdy jakaś zmienna spełnia warunek, to wtedy zabijamy kogoś. Obecnie zwracam aktualne HP ofiary i 4 parametr zamieniam na te HP, ale nie zawsze zabija (przynajmniej tak zauważyłem), bo chyba jeszcze tutaj kamizelka redukuje te obrażenia.
Użytkownik sebul edytował ten post 24.05.2011 01:56
R3X
24.05.2011
SetHamParamEntity(2, ent);ent musisz stworzyć i nadać klasę, od której gracz ma zginąć; w post mógbyś ten byt usuwać, żeby nie zostawiać śmieci
ewentualnie na początku mapy stwórz po 1 bycie dla każdej broni i wtedy weź sobie id bytu z tablicy
przed zabiciem gracza usuń mu kamizelkę (i tak zginie to po co mu:P)
set_pev(id, pev_armor, 0.0);
sebul
24.05.2011
Trochę pobawiłem się z tym wybuchem bomby, ale coś nie działa... Chciałem zwiększyć obrażenia przy wybuchu, napisałem coś takiego
No i obrażenia były zawsze takie same, dawałem nawet "0.5", czy "3.0", ale nic się nie zmieniało. Chce to po prostu zrobić, bo na takich modach jak diablo ma się więcej życia, no i jest ta redukcja obrażeń, dlatego też przy jakichś 200-300 hp bomba już nie zabija gracza.
Z tą śmiercią może zrobię tak jak jest to w oryginalnym diablo, bo chciałbym to zrobić jak najłatwiej.
To "set_pev(id, pev_armor, 0.0)" usuwa tylko kamizelkę? A hełm zostawia?
Użytkownik sebul edytował ten post 24.05.2011 11:19
Float:fNewDamage = damage;
// jakiś kod, który zmienia wartość fNewDamage
if(fNewDamage != damage) {
if(damagebits & DMG_BLAST) {
fNewDamage *= 2.0;
}
SetHamParamFloat(4, fNewDamage);
return HAM_HANDLED;
}
No i obrażenia były zawsze takie same, dawałem nawet "0.5", czy "3.0", ale nic się nie zmieniało. Chce to po prostu zrobić, bo na takich modach jak diablo ma się więcej życia, no i jest ta redukcja obrażeń, dlatego też przy jakichś 200-300 hp bomba już nie zabija gracza.
Z tą śmiercią może zrobię tak jak jest to w oryginalnym diablo, bo chciałbym to zrobić jak najłatwiej.
To "set_pev(id, pev_armor, 0.0)" usuwa tylko kamizelkę? A hełm zostawia?
Użytkownik sebul edytował ten post 24.05.2011 11:19
R3X
24.05.2011
damagebits sprawdzaj przed
armor to armor, nie ma tu podziału na kamizelkę i hełm, od tego jest pev_armortype
if(fNewDamage != damage)
armor to armor, nie ma tu podziału na kamizelkę i hełm, od tego jest pev_armortype
sebul
24.05.2011
A te flagi damagebits są już w którymś includu zdefiniowane?
Chyba nie, bo teraz dałem "(1<<6)" i działa. Nie wyskakiwały jakieś błędy przy kompilacji to myślałem, że to już jest w jakimś includu ^ ^
Użytkownik sebul edytował ten post 24.05.2011 12:30
Chyba nie, bo teraz dałem "(1<<6)" i działa. Nie wyskakiwały jakieś błędy przy kompilacji to myślałem, że to już jest w jakimś includu ^ ^
Użytkownik sebul edytował ten post 24.05.2011 12:30
DarkGL
24.05.2011
hmm sa w standardowym includzie
#define DMG_GENERIC 0 /* generic damage was done */ #define DMG_CRUSH (1<<0) /* crushed by falling or moving object */ #define DMG_BULLET (1<<1) /* shot */ #define DMG_SLASH (1<<2) /* cut, clawed, stabbed */ #define DMG_BURN (1<<3) /* heat burned */ #define DMG_FREEZE (1<<4) /* frozen */ #define DMG_FALL (1<<5) /* fell too far */ #define DMG_BLAST (1<<6) /* explosive blast damage */ #define DMG_CLUB (1<<7) /* crowbar, punch, headbutt */ #define DMG_SHOCK (1<<8) /* electric shock */ #define DMG_SONIC (1<<9) /* sound pulse shockwave */ #define DMG_ENERGYBEAM (1<<10) /* laser or other high energy beam */ #define DMG_NEVERGIB (1<<12) /* with this bit OR\\\'d in, no damage type will be able to gib victims upon death */ #define DMG_ALWAYSGIB (1<<13) /* with this bit OR\\\'d in, any damage type can be made to gib victims upon death */ #define DMG_DROWN (1<<14) /* Drowning */ /* time-based damage */ #define DMG_TIMEBASED (~(0x3fff)) /* mask for time-based damage */ /* TF Additions */ #define DMG_PARALYZE (1<<15) /* slows affected creature down */ #define DMG_NERVEGAS (1<<16) /* nerve toxins, very bad */ #define DMG_POISON (1<<17) /* blood poisioning */ #define DMG_RADIATION (1<<18) /* radiation exposure */ #define DMG_DROWNRECOVER (1<<19) /* drowning recovery */ #define DMG_ACID (1<<20) /* toxic chemicals or acid burns */ #define DMG_SLOWBURN (1<<21) /* in an oven */ #define DMG_SLOWFREEZE (1<<22) /* in a subzero freezer */ #define DMG_MORTAR (1<<23) /* Hit by air raid (done to distinguish grenade from mortar) */
sebul
24.05.2011
Czyli w "hamsandwich"? To ja u siebie tego nie mam... Ale dobra, dopisze się ;]
sebul
24.05.2011
No już znalazłem, ale nigdzie nie widzę, żeby był on gdzieś dołączony...hlsdk_const.inc, jest on dołączany prawdopodobnie w amxmodx.inc
A jednak jest

Dodano 25 maj 2011 - 10:44:
A co zrobić, żeby nowemu bytowi przypisać jakiś sprite do wyświetlania przy zabójstwie? Myślę, że można po prostu blokować te wyświetlanie kto kogo zabił i w funkcji śmierci sprawdzać jaką ma nazwę broń i jeśli powiedzmy będzie "blyskawica" to dało by się "weapon_usp", czy coś innego, ale może jest jakieś lepsze rozwiązanie?
Użytkownik sebul edytował ten post 24.05.2011 15:02
sebul
25.05.2011
No właśnie tak też zrobiłem ^ ^ Trochę musiałem to jeszcze inaczej zrobić (forwardem wysyłam id broni), ale sobie poradziłem. Po prostu myślałem, że może da się jakoś przypisać jakiś sprite do nowej broni, ale teraz to już mi nawet nie potrzebne.możesz też złapać message DeathMsg i tam podmienić nazwę broni
Cypis'
25.05.2011
sebul, da się podmienić sprites ale to wtedy trzeba ingerować w pliki gracza ale to jest nie dozwolone na amxx.pl

sebul
25.05.2011
Nie pytałem o podmianę jakichkolwiek spritów, tylko przypisanie już istniejących do nowych broni.sebul, da się podmienić sprites ale to wtedy trzeba ingerować w pliki gracza ale to jest nie dozwolone na amxx.pl
Dodano 25 maj 2011 - 14:53:
W funkcji DeathMsg też mogę użyć
if(!TrieGetCell(gCustomWeapons, szClass, weapon))
weapon = 0;
??
Dokładniej to wygląda tak
public DeathMsg() {
new weaponname[32];
read_data(4, weaponname, 31);
(...)
new weapon = 0;
if(TrieGetCell(gCustomWeapons, weaponname, weapon)) {
replace(weaponname, charsmax(weaponname), "piorun", "knife");
}
else {
new nazwa[32];
formatex(nazwa, charsmax(nazwa), weaponname);
formatex(nazwa, charsmax(nazwa), "weapon_%s", nazwa);
weapon = get_weaponid(nazwa);
}
show_deadmessage(kid, vid, headshot, weaponname); // tak tylko to napisałem, żeby było wiadomo, że wyświetlam kto kogo zabił
(...)
}
Tak będzie dobrze? Wykryje ID nowych broni? A gdy nie znajdzie ID będzie brało z nazw standardowych broni? Sory, że już odbiegam trochę od samego hamsandwich, ale temat jakby nie patrzeć, też jest i o tym.
Użytkownik sebul edytował ten post 25.05.2011 14:12