[G1] Efekt podpalenia (Lego Buffs) 3336 0

O temacie

Autor IceMan

Zaczęty 14.05.2020 roku

Wyświetleń 3336

Odpowiedzi 0

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy

IceMan

[G1] Efekt podpalenia (Lego Buffs)
2020-05-14, 21:31(Ostatnia zmiana: 2020-05-14, 23:02)
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  :ok: :trollface: :F

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  :hmmm:

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");
};
};
};
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry