Witam

Chciałbym zrobić coś takiego w G1 aby postać po otrzymaniu obrażeń od Ognia czyli np za pomocą czaru Ognistej kuli zaczęła tracić życie przez x czas. Wiem, że podpalenie istnieje w oryginalnym Gothicu jednak nie daje mi spokoju to w jaki sposób to działa czyli: Jeżeli NPC ma jakąś ochronę przed ogniem nawet "5" to ma tylko na sobie animacje że się pali, ale HP nie spada. Jeżeli NPC ma ochronę = 0 to wtedy działa to i poprawnie odejmuje HP. Zauważyłem, że to działa w ten sposób tylko u NPC, bo kiedy Gracz dostaje obrażenia i ma ochronę przed ogniem to zadaje mu obrażenia tak jak powinno (HP spada).
Tak więc wiedząc że jest to zawarte w silniku gry, chciałem użyć Lego a konkretnie funckji buffs jednak napotkałem kilka problemów z którymi nie mogę sobie poradzić od tygodnia

Mój skrypt wygląda tak, że w funkcji która odpowiada za obrażenia wywołuje buffa który odejmuje HP celowi czyli:
func void SpellBurnDmg(var int bh)
{
var int ptr;
ptr = Buff_GetNpc(bh);
if (!ptr)
{
return;
};
var c_npc victim;
victim = _^(ptr);
Npc_ChangeAttribute(victim, ATR_HITPOINTS, 5);
};
instance SpellBurn(lCBuff) {
name = "Podpalenie";
bufftype = BUFF_BAD;
durationMS = 5*1000;
tickMS = 1000;
onTick = SAVE_GetFuncID(SpellBurnDmg);
buffTex = "BurnIcon.TGA";
};
W czym problem?
Napotkałem dwa bugi:
1.Jeżeli buff zabije NPC to Gracz nie dostaje Exp'a
2.Jeżeli buff zabije NPC strzelającego z kuszy do nas to NPC mimo, że nie żyje dalej do nas strzela i zadaje obrażenia, akcje przerywa oddalenie się o kawałek od NPC.
Błąd pierwszy próbowałem korygować dodaniem expa z funkcji: B_DeathXP, ale buguje się bo Ticki są co sekunde i dostaje co sekunde Expa nawet jeżeli dam tą funkcje w warunku Npc_IsDead oraz również z BodyState:
func void SpellBurnDmg(var int bh)
{
var int ptr;
ptr = Buff_GetNpc(bh);
if (!ptr)
{
return;
};
var c_npc victim;
victim = _^(ptr);
Npc_ChangeAttribute(victim, ATR_HITPOINTS, -5);
var lcBuff oth;
oth = get(bh);
if Npc_IsDead(victim) && !Npc_WasInState(victim, ZS_Unconscious)
{
B_DeathXP();
Npc_ClearAIQueue(victim);
if C_NpcIsHuman(victim)
{
B_FullStop (victim);
};
print("Death XP");
}
else if Npc_IsDead(victim) && Npc_WasInState(victim, ZS_Unconscious)
{
oth.durationMS = 0;
};
};
Co do drugiego błędu to próbowałem wymusić stop akcji NPC kiedy zginie i podziałało, bo póki co nie przytrafiła się ta sytuacja, oczywiście tylko kiedy jest człowiekiem w innym wypadku potwory umierały bez końca do końca buffa.
Ktoś ma może jakiś pomysł na to z tym doświadczeniem? Póki co dostaje po 9990 expa za zabicie lub co tick kiedy NPC zginie ciągle leci Exp
Edit: Proszę o zamknięcie/usunięcie tematu, poradziłem sobie z tymi błędami po prostu dodałem na początku, żeby sprawdzał HP wroga więc wygląda to tak:func void SpellBurnDmg(var int bh)
{
var int ptr;
ptr = Buff_GetNpc(bh);
if (!ptr)
{
return;
};
var c_npc victim;
victim = _^(ptr);
if (victim.attribute[ATR_HITPOINTS] > 0)
{
Npc_ChangeAttribute(victim, ATR_HITPOINTS, -5);
if Npc_IsDead(victim) && C_NpcIsHuman(victim)
{
B_DeathXP();
B_FullStop (victim);
print("Death HUMAN XP");
}
else if Npc_IsDead(victim) && !C_NpcIsHuman(victim)
{
B_DeathXP();
print("Death MONSTER XP");
};
};
};