Witam
Chciałem przerobić system obrażeń ten z G1 na ten z G2NK - jak wiadomo formuła ta w drugiej części to (Atrybut + dmg broni - armor - 1)/10 a kiedy uderzy kryt nie dzieli na 10. natomiast w G1 z tego co zauważyłem było jakoś tak: (Atrybut + dmg broni - armor) a kiedy krytyczny cios to: (atrybut + dmg broni * 2 - armor). I teraz tak mam już zrobiony skrypt. działa to z Hookiem, ale w samej funkcji mam problem z warunkiem:
func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg)
{
var string concatText;
var c_npc slf;
slf = _^(attackerptr);
var c_npc oth;
oth = _^(victimPtr);
var int damage;
if(Npc_IsInFightMode(slf,FMODE_FIST))
{
dmg = (slf.attribute[ATR_STRENGTH] - oth.protection[PROT_BLUNT]);
PrintS_Ext("damage fist",RGBA(255, 255, 255, 255));
};
if(dmg < MinimalDMG )
{
dmg = MinimalDMG ;
PrintS_Ext("minimalny dmg fist",RGBA(255, 255, 255, 255));
};
if (Npc_HasReadiedWeapon(slf))
{
var c_item wpn;
wpn = Npc_GetReadiedWeapon(slf);
var int wpnDmg;
wpnDmg = wpn.damageTotal;
var int armRes;
concatText = IntToString(wpn.flags);
PrintS_Ext(concatText,RGBA(255, 255, 255, 255));
If wpn.damagetype == DAM_EDGE
{
armRes = oth.protection[PROT_EDGE];
}
else if wpn.damagetype == DAM_BLUNT
{
armRes = oth.protection[PROT_BLUNT];
}
else if wpn.damagetype == DAM_POINT
{
armRes = oth.protection[PROT_POINT];
}
else if wpn.damagetype == DAM_FIRE
{
armRes = oth.protection[PROT_FIRE];
}
else if wpn.damagetype == DAM_MAGIC
{
armRes = oth.protection[PROT_MAGIC];
};
if ((ITEM_2HD_AXE || ITEM_2HD_SWD || ITEM_AXE ||ITEM_SWD) & wpn.flags) /////////////////nie działa
{
damage = (wpnDmg + slf.attribute[ATR_STRENGTH]);
PrintS_Ext("damage melee weapon",RGBA(255, 255, 255, 255));
}
if ((ITEM_BOW || ITEM_CROSSBOW) & wpn.flags) ////////////////////nie działa
{
damage = (wpnDmg + slf.attribute[ATR_DEXTERITY]);
};
damage = (damage -armRes)/10;
var int ChanceForCrit;
ChanceForCrit = 0;
if ((ITEM_2HD_AXE || ITEM_2HD_SWD) & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_2H);
};
if ((ITEM_AXE || ITEM_SWD) & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_1H);
};
if (ITEM_BOW & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_BOW);
};
if (ITEM_CROSSBOW & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_CROSSBOW);
};
if(Hlp_Random(100) < chanceForCrit){
damage = damage * 10;
};
if (damage < 0)
{
damage = 5;
};
dmg = damage;
};
return dmg;
};
To co zaznaczyłem na czerwono po prostu się nie odpala w grze. Kiedy dałem zamiast tego np:
if Npc_HasReadiedMeleeWeapon(slf)
Wtedy odnajduje broń i wykonuje się wszystko perfect, ale nie mogę tego dać ze względu na cios krytyczny gdzie jest podział na 1H i 2H. Dawałem też warunki typu:
if wpn.flags = ITEM_SWD
Ale nie przynosi to żadnego skutku.
Dodam, że potwory walczą za pomocą pięści i funkcja działa, kiedy dałem warunek z typami broni to czasami potwory mają dziwnie duże obrażenia, natomiast kiedy jest warunek z HasReadiedMeleeWeapon to już tego nie ma.
Czy ktoś wie gdzie został popełniony błąd? Staram się metodą prób i błędów ale bez efektów od dłuższego czasu :(