1/x działa poprawnie ale tak jak wspominałem Ci kiedyś na PW, ponownie występuję to, że gdy zabiję kogoś 1/x to wtedy wyskakuje taki znaczek jak choćby przy samobójstwie
No niestet yo jest wada ham'a ale mozna to obejść
kolejny problem a mianowicie można zabić swojego gdy strzelisz do niego to wykonuje się na nim samobójstwo tak jakby był włączony FF.
Ja z wyłaczonym ff nigdy z tym problemów nie miałem
Kolejna sprawa 1/1 z Granatu nadal nie działa, więc to Twoje 100% odnosi się tylko do tego, że wprowadziliśmy teraz totalny mord haha
Nigdy nie tstowałem tego sposobu ale już daję działający
35131 co w twoim sposobie jest złe:
• nie sprawdzasz czy osoba której zadajemy dmg żyje a mogła zginąć a wtedy cała funkcja zwiększania dmg nie ma sensu
• za każdym razem jak sprawdzasz broń robisz to za pomocą instrukcji if a nie używasz else if (taki bardziej programistyczny błąd)
• polecam [function=random] a nie [function=random_num] wydajniejsze ale to jest tylko moje widzimisię
• za pomocą [function=SetHamParamFloat] ustawiasz komuś dmg równe jego hp (takie pseudo 1/x) a musisz pamiętać że ta funkcja jest kompatyblina z innymi pluginami tzn. inny plugin może wychwycić zmienioną wartość i sprawić by to już gracza nie zabiło
• używasz [function=cod_inflict_damage] do dodawania dmg a to jest mega zły sposób!!! Dlaczego? dlatego że nikt nie może ingerować w dmg zadane za pomocą tej funkcji jak nie rozumiesz to dam ci przykład:
- w pluginie A dajesz graczu X dodatkowe dmg (z all) za pomocą tej funkcji hmm jakieś 5 dmg
- w pluginie B dajesz graczu Y umiejętnośc iż strzały w plecy nie zadają dmg
Teraz jak gracz X strzeli do gracza Y w polecy to podstawowe dmg się zablokuje a to 5 dodane nie!!! Gdyż na nie wpłynąć nie możemy
Dodatkowo ty do dmg gracza (standardowego) dodajesz dmg (w tej samej ilości) + 3 + 0.5*int
Tzn. Dajesz graczy 2*dmg +3 +0.5*int a napisałeś tak:
dodatkowe dmg (+3) i mnoznik inteligencji (2 pkt = 1 dmg)
Jak bys tam zmiennej damage nie umieścił to by było okey ale umieściłeś!
Nie mam już zbytnio czasu na komentowanie dlatego masz tu kodzik pięknie opisany
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
new HeModelIndex
const m_bitsDamageType = 76
const m_LastHitGroup = 75
public plugin_init()
{
register_plugin("Tak sie zabija graczy!!!", "", "BlackPerfum(Zjem ci Noge)")
RegisterHam(Ham_TakeDamage, "player", "TakeDamage",1) //Rejestruje momęt zadania dmg graczu
//Jeśli chcesz robic tu tylko 1/x to najlepiej pre (4 arg == 0) :D
register_message(get_user_msgid("DeathMsg"),"DeathMsg")
HeModelIndex = engfunc(EngFunc_ModelIndex,"models/w_hegrenade.mdl")
//Zapisuje sobie id modelu granata
}
public DeathMsg(MsgId,MsgDest,id)
{
new vid = get_msg_arg_int(2) //Zapisuje arg. nr. 2 w zmiennej vid (arg. 2 == osoba zabita)
new kid = get_msg_arg_int(1) //Zapisuje arg. nr. 1 w zmiennej vid (arg. 1 == osoba zabijająca)
static WeaponName[32]
get_msg_arg_string(4,WeaponName,31)
if(WeaponName[0] == 'w' && is_user_connected(vid) && 0 < kid < 33 && vid != kid)
{
new body,dmgbits
body = get_pdata_int(vid,m_LastHitGroup,5)
dmgbits = get_pdata_int(vid,m_bitsDamageType,5)
if(body == HIT_HEAD) set_msg_arg_int(3,get_msg_argtype(3),1)
if(dmgbits & DMG_BULLET && is_user_alive(kid))
{
get_weaponname(get_user_weapon(kid),WeaponName,31)
set_msg_arg_string(4,WeaponName[7])
}
else if(dmgbits & 1<<24) set_msg_arg_string(4,"grenade")
}
}
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 na serwie)
// Sprawdzam też czy osobę otrzymującą dmg nie zabił jakiś inny plugin
// Sprawdzam czy ktoś nie zadał sam sobie dmg
// Sprawdzam czy ma klase
// Zakładam że na serwerze jest wyłączone friendlyfire bo niece mi się tego sprawdzać xD
static Float:OldDamage
OldDamage = damage //Przyda się przy zmianie dmg xD
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)
if(damagebits & DMG_BULLET)
{
//Na wszelki wypadek możemy sprawdzić czy to na pewno broń zadaje dmg
// Jeśli żaden plugin nie zabił atakującego to jest nie możliwym by nie żył dlatego spokojnie można pobrać jego broń
switch(get_user_weapon(attacker)) //Sprawdzam aktualną broń atakującego
{
case CSW_M4A1:
{
//Jeśli to m4
if(!random(6))
{
//I jeśli atakującemu się poszczęściło gdyż ma tylko 16,(6)%
//(1/6(ta szóstka jest tą z random)*100% = 16,(6)%)
//To zabijam trafionego ale robie to tak by pluginy mogły to wychwycić
KillPlayer(id,attacker,damagebits) //Gracz zabity i koniec ciężkich zmagań z zadawaniem dmg
}
else
{
/*
//Ale nie uważamy że klasa nadal jest za słaba
//To dodajmy jej 20 dmg uwzględniając int
damage += 20.0+float(cod_get_user_intelligence(attacker,1,1,1))//Czynnik_Inteligencji
//Czynnik inteligencji podmieniasz dowolną liczbą
//Czynnik inteligencji sobie robisz jaki ci się żywnie podoba xD
//Czynnik inteligencji to jest dokładnie to samo co:
//cod_inflict_damage(attacker, id, damage+20.0, Czynnik_Inteligencji, ent, damagebits)
//Np. jak gracz ma 100 inta i ustawisz czynnik inteligencji na 0.2 to doda do dmg
//te 20 dmg+100(int)/(1/0.2 == 5) == 100/5=25 końcowe dmg == damage+20(standardowe)+25(od inta)
*/
}
}
case CSW_AK47: if(!random(6)) KillPlayer(id,attacker,damagebits)//To samo co wyżej tylko bez komentarzy
case CSW_USP: if(!random(6)) KillPlayer(id,attacker,damagebits)
// 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
//Ale najpierw trzeba sprawdzić czy byt przechowuje jakieś dane (nie lubimy błędów w konsoli)
if(pev_valid(ent) == 2)
{
//Czyli jeśli byt przechowuje dane
//To pobierami jego id modelu
//I porównujemy z tym pobranym wcześniej
if(pev(ent,pev_modelindex) == HeModelIndex)//A zatem jeśli byt zadający dmg to he
{
//To zabijam gracza
KillPlayer(id,attacker,damagebits) // I to wszystko
}
}
}
//Teraz sprawdźmy czy zmieniliśmy końcowe dmg:
if(damage != OldDamage)
{
//Jesli zmieniliśmy to trzeba wysłać zmienione dmg + prawowićie zakończyć funkcję
SetHamParamFloat(4,damage)
return HAM_HANDLED
}
//Jeśli dmg nie zostało zmienione to metamod spokojnie może zlekceważyć tą funkcję :D
return HAM_IGNORED
}
KillPlayer(id,attacker,damagebits)
{
set_pdata_int(id,m_bitsDamageType,damagebits)
ExecuteHamB(Ham_Killed, id, attacker, 1)
}
Kompatybilne + Normalne napisy w deatch message