Problem 1/x z broni nie działa poprawnie
ex0
10.06.2014
Witam, jak w temacie.
Od dnia wczorajszego zaobserwowałem dziwne zjawisko, a mianowicie stosując funkcję
if(weapon == CSW_HEGRENADE && damage > 20.0) cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
Nie otrzymujemy 1/1 na zabicie jak powinno być a raczej różne rodzaje DMG.
Poczynając od 700 (Jeżeli mamy w granicach 1000 hp) do nawet 3700 (Jeżeli mamy w granicach 4500 hp)
Czyli jak widać funkcja niezbyt poprawnie działa, dodatkowo tylko pierwszy strzał jest tak mocny, a pozostałe już są standardowe, zwiększone zgodnie z DMG klasy lub zmniejszone odpowiednio do tego co pisałem na górze czyli wartości pozostałego HP u gracza przeciwnego.
następną sprawą jest, że kompletnie nie działa mi (bynajmniej tak mi się zdaje, lub działa tak jak to powyżej) 1/x z danej broni
if(weapon == CSW_M4A1 && damage > 20.0 && random_num(1,6) == 1) cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
Przykładowo to.
A cała funkcja wygląda u mnie tak:
public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits) { if(!is_user_connected(idattacker)) return HAM_IGNORED; if(!ma_klase[idattacker]) return HAM_IGNORED; if(damagebits & DMG_BULLET) { new weapon = get_user_weapon(idattacker); if(weapon == CSW_HEGRENADE && damage > 20.0) cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits); if(weapon == CSW_M4A1 && damage > 20.0 && random_num(1,6) == 1) cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits); if(weapon == CSW_AK47 && damage > 20.0 && random_num(1,6) == 1) cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits); if(weapon == CSW_DEAGLE && damage > 20.0 && random_num(1,6) == 1) cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits); if(get_user_team(this) != get_user_team(idattacker) && get_user_weapon(idattacker) == CSW_M4A1 && damagebits & DMG_BULLET) cod_inflict_damage(idattacker, this, 100.0, 1.0, idinflictor, damagebits); } return HAM_IGNORED; }
Zdziwiło mnie to, lecz kolega dla faktu 1/1 stwierdził, że lepszym rozwiązaniem będzie użycie
SetParamFloat
Więc zastosowałem to tak:
if(weapon == CSW_KNIFE && damage > 20.0) { SetParamFloat(4, get_user_health(this))
I tutaj ku mojemu ogromnemu zdziwieniu ....
publicTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits) { if(!is_user_connected(idattacker)) return HAM_IGNORED; if(!ma_klase[idattacker]) return HAM_IGNORED; if(damagebits & DMG_BULLET) { new weapon = get_user_weapon(idattacker); if(weapon == CSW_KNIFE && damage > 20.0) { SetParamFloat(4, get_user_health(this)) return HAM_HANDLED; } } return HAM_IGNORED }
Tak wygląda funkcja, a mianowicie w oczy rzuca się dla mnie to :
publicTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
Jak widać bez zastosowanej spacji, wtedy nie wyskakują errory z niezdefiniowanym symbolem (już nie pamiętam jakim), natomiast po oddzieleniu spacją wyskakuje własnie takowy error.
A tak to tutaj tylko warrning wyskakuje, że symbol nie jest (był) nigdzie używany(użyty).
Czy ktoś mi może odpowiedzieć co tutaj mogłoby szlag trafić i nie działać?
Ponieważ to bardzo irytujące
Ogólnie podstawy jak:
#define DMG_BULLET (1<<1) RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
są zawarte w kodzie.
Jakieś pomysły?
ex0
12.06.2014
if(weapon == CSW_HEGRENADE && damage > 20.0)Zmień na:
if(damagebits & (1<<24))Przy broniach zrób tak:
if(weapon == CSW_M4A1 && damagebits & DMG_BULLET && random_num(1,6) == 1)
Ogólnie mistrzu to nie pykło . :<
BlackPerfum
12.06.2014
Proszę wszystko jasno opisane:
#include <amxmodx> #include <hamsandwich> #include <fakemeta> public plugin_init() { register_plugin("Tak sie zabija graczy!!!", "", "BlackPerfum(Zjem ci Noge)") RegisterHam(Ham_TakeDamage, "player", "TakeDamage",0) //Rejestruje momęt zadania dmg graczu } public TakeDamage(id, ent, attacker, Float:damage, damagebits) { if(!is_user_connected(attacker) || !is_user_alive(id) || id == attacker) return HAM_IGNORED // Sprawdzam czy osoba zadająca dmg jest graczem (+ czy jest naserwie) // Sprawdzam też czy osobę otrzymującą dmg nie zabił jakiś inny plugin // Sprawdzam czy ktoś nie zadał sam sobie dmg if(ent == attacker)// Porównuje byt zadający dmg z bytem gracza { //(tzn. warunek spełni się gdy to gracz zada dmg bezpośrednio czyli nie za pomocą he lub innych bytów) // Jeśli żaden plugin nie zabił atakującego to jest nie możliwym by nie żył dlatego spokojnie można pobrać jego broń new weapon = get_user_weapon(attacker) switch(weapon) //Sprawdzam aktualną broń atakującego { case CSW_KNIFE: { //Jeśli to nóż if(!random(8)) { //I jeśli atakującemu się poszczęściło gdyż ma tylko 12,5% (1/8(ta ósemka jest tą z random)*100% = 12,5%) //To zabijam trafionego ale robie to tak by pluginy mogły to wychwycić ExecuteHamB(Ham_Killed, id, attacker, 1) //Gracz zabity i koniec ciężkich zmagań z zadawaniem dmg } } // Użyłem case byś mógł łatwo dodawać sobie bronie gdyż widziałem że ich tam parę masz // Pamiętaj w tym warunku nie złapiesz zadanie dmg przez he, lub inne byty niż gracz(i bronie palne+nóż) } } else { // Tutaj można się pokwapić o złapanie zadania dmg he // pobieranie broni nam tu nie pomoże gdyz gracz wyrzucił he i ma coś innego w łapie // chyba że miał ich parę i nie zmienił broni ale nam to pomocne nie będzie gdyż szansa na to jest równa 1 na 1/0 // Można pobrać classname ent'a zadającego dmg i porównać go do "weapon_hegranade" ale nie lubimy zbyt często porównywać string'ów // Dlatego z pomocą przychodzi nam fakemeta // Spróbujmy pobrać id broni ale nie bytu new weapon = get_pdata_int(ent,43,4) // Tylko nwm czy wartość zostanie poprawnie pobrana gdy byt nie będzie bronią ale // zawsze możesz użyć "damagebits" choć często pluginy używają go w nie konfortowy sposób // Czyli masz conajmniej dwa sposoby czy byt to he // Nr.1 if(weapon == CSW_HEGRENADE) //Nr.2 if(damagebits & (1<<24)) //Osobiście użył bym pierwszego (ale najpierw sprawdził jak zachowuje się na byty które nie są brońmi) ale z mojej niewiedzy użyję sposobu nr.2 if(damagebits & (1<<24))//A zatem jeśli byt zadający dmg to he { if(!random(2)) { //I jeśli Została wylosowana liczba 0 (możliwe liczby do wylosowania: 0,1 tzn. 50% na liczbę 0) //To zabijam gracza ExecuteHamB(Ham_Killed, id, attacker, 1) // I to wszystko } } } }
Najlepsza odpowiedź
ex0
12.06.2014
Wielkie dzięki panu.
Bardzo jasno czytelnie i dobrze opisane.
Browara bym postawił, ale kolega nie z okolic