Poziom czaru a zadawane obrażenia 2304 8

O temacie

Autor IceMan

Zaczęty 18.05.2020 roku

Wyświetleń 2304

Odpowiedzi 8

IceMan

IceMan

Użytkownicy
posty67
Profesjabrak
  • Użytkownicy
Wykorzystując Lego i skrypt Lehony: https://forum.worldofplayers.de/forum/threads/1149697-Script-Eigene-Schadensberechnung
Chciałem przekalkulować obrażenia kilku czarów w G1. Wszystko by było w porządku gdyby nie czary ładujące czyli np Kula Ognia. Nie potrafię wyciągnąć z gry zmiennej która mówi jaki poziom czaru został użyty, a jest to kluczowe w kalkulacji obrażeń.
Mój skrypt wygląda tak:

FUNC INT Calculate_Weapon_Damage (var int victimPtr, var int ddPtr, var int dmg)
{
    var oSDamageDescriptor dmgDescriptor;
    dmgDescriptor = _^ (ddPtr);
var int damage;
var int splDMG;
var int ChanceForEffect;
    //Don't change anything if damage was not caused by NPC
    if (dmgDescriptor.attackerNPC == 0)
    || (victimPtr == 0)
    {
        return dmg;
    };

    var oCNPC slf; slf = _^(dmgDescriptor.attackerNPC);
    var oCNPC oth; oth = _^(victimPtr);
var c_npc oth2;
var c_npc slf2;
slf2 =  _^(dmgDescriptor.attackerNPC);
oth2 =  _^(victimPtr);

    //Spell
    if (dmgDescriptor.SpellID > 0)
    {

if (dmgDescriptor.SpellID == SPL_FIREBALL)
        {
var string concatText;
concatText = ConcatStrings("Poziom czaru: ",IntToString(dmgDescriptor.spellLevel));
PrintS_Ext(concatText,RGBA(255,   255, 255,   255));
if (dmgDescriptor.spellLevel <= 1)
{
splDMG = (SPL_DAMAGE_FIREBALL + slf2.name1 - oth.protection[PROT_FIRE]);
Snd_Play ("MFX_Fireball_Collide1");
}
else if (dmgDescriptor.spellLevel == 2)
{
splDMG = (SPL_DAMAGE_FIREBALL*2 + slf2.name1 - oth.protection[PROT_FIRE]);
Snd_Play ("MFX_Fireball_Collide2");
}
else if (dmgDescriptor.spellLevel == 3)
{
splDMG = (SPL_DAMAGE_FIREBALL*3 + slf2.name1 - oth.protection[PROT_FIRE]);
Snd_Play ("MFX_Fireball_Collide3");
}
else if (dmgDescriptor.spellLevel == 4)
{
splDMG = (SPL_DAMAGE_FIREBALL*4 + slf2.name1 - oth.protection[PROT_FIRE]);
Snd_Play ("MFX_Fireball_Collide4");
};

if (splDmg >= 5)
{
Wld_PlayEffect("VOB_BURN_WEAPON", oth2, oth2, 0, 0, 0, FALSE );
Buff_ApplyUnique(oth2, SpellFireboltBuff);
};
if (splDMG > 5)
{
dmg = splDMG;
}
else if (splDMG < 5)
{
dmg = MinimalDMG;
};
        };
};

...

    return dmg;
};   

FUNC VOID _HOOK_DMG_ONDMG_EVENT ()
{
    EAX = Calculate_Weapon_Damage (EDI, MEM_ReadInt (ESP + 548), EAX);
};

func void InitDamage() {
HookEngine (7567329, 6, "_HOOK_DMG_ONDMG_EVENT");
};

dmgDescriptor.spellLevel - zawsze pokazuje mi liczbę "32" czy naładuje czar raz dwa trzy razy czy wcale nie naładuje.

Da się jakoś to wyciągnąć z gry ten poziom czaru? Próbowałem sam definiować poziom, ale jest to niedoskonałe i buguje się przy kolejnym użyciu czaru wtedy ten który nie doleciał jeszcze zmienia poziom w locie na ten który jest castowany...
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
splDmge = (SPL_DAMAGE_FIREBALL * slf.aiscriptvars[AIV_SpellLevel]) - oth.protection[PROT_FIRE];
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

IceMan

IceMan

Użytkownicy
posty67
Profesjabrak
  • Użytkownicy
Nie czyta mi tego, unknow identifier: AIV_SPELLLEVEL
W pliku oCNpc.d mam linijke:

var int        aiscriptvars[50];                           // 0x0240 int[50]
Oczywiście plik z funkcją DMG jest po inicjowaniu Ikarusa i Lego
Edit: Rozumiem, że mam zadefiniować tego aivara więc dałem:
const int AIV_SpellLevel = 1;
Nie wiem jak dalej postępować
Próbowałem dodawać w skrypcie czaru:
self.aivar[AIV_SpellLevel] = x;
ale wtedy jest identycznie jak wcześniej, czyli kiedy zaczynam castować drugi czar ten pierwszy uderza i zmienia poziom na 1 a puszczony był 4, błądze

Skrypt czaru:
func int Spell_Logic_Fireball (var int manaInvested)
{
if (Npc_IsPlayer (self))
{

if (hero.attribute[ATR_MANA] >= MANACOST_FIREBALL && (!spelllevel))
{
hero.attribute[ATR_MANA] = (hero.attribute[ATR_MANA] - MANACOST_FIREBALL);

if (hero.attribute[ATR_MANA]<MANACOST_FIREBALL)
{
spelllevel = !spelllevel;
self.aivar[AIV_SpellLevel] = 1;
    return SPL_SENDCAST;
}
else
{
spelllevel = 1;
self.aivar[AIV_SpellLevel] = 1;
};
}
else if (hero.attribute[ATR_MANA] >= MANACOST_FIREBALL)
&& (spelllevel == 1)
{
hero.attribute[ATR_MANA] = (hero.attribute[ATR_MANA] - MANACOST_FIREBALL);
if (hero.attribute[ATR_MANA]<MANACOST_FIREBALL)
{
spelllevel = !spelllevel;
    return SPL_SENDCAST;
}
else
{
spelllevel = 2;
self.aivar[AIV_SpellLevel] = 2;
return SPL_NEXTLEVEL;
};
}
else if (hero.attribute[ATR_MANA] >= MANACOST_FIREBALL)
&& (spelllevel  == 2)
{
hero.attribute[ATR_MANA] = (hero.attribute[ATR_MANA] - MANACOST_FIREBALL);
if (hero.attribute[ATR_MANA]<MANACOST_FIREBALL)
{
spelllevel = !spelllevel;
    return SPL_SENDCAST;
}
else
{
spelllevel = 3;
self.aivar[AIV_SpellLevel] = 3;
return SPL_NEXTLEVEL;
};
}
else if (hero.attribute[ATR_MANA] >= MANACOST_FIREBALL)
&& (spelllevel  == 3)
{
hero.attribute[ATR_MANA] = (hero.attribute[ATR_MANA] - MANACOST_FIREBALL);
if (hero.attribute[ATR_MANA]<MANACOST_FIREBALL)
{
spelllevel = !spelllevel;
    return SPL_SENDCAST;
}
else
{
spelllevel = 4;
self.aivar[AIV_SpellLevel] = 4;
return SPL_NEXTLEVEL;
};
}

else if (hero.attribute[ATR_MANA]<MANACOST_FIREBALL && (!spelllevel))
{
return SPL_SENDSTOP;
}
else if  (hero.attribute[ATR_MANA]<MANACOST_FIREBALL && (spelllevel == 2) || (spelllevel == 3))
{
spelllevel = !spelllevel;
return SPL_SENDCAST;
};

};
return SPL_RECEIVEINVEST;
};
 

IceMan

IceMan

Użytkownicy
posty67
Profesjabrak
  • Użytkownicy
Nie wiem czy poprawnie to zrobiłem, ale działa kiedy zamiast robić coś w skrypcie czaru to dodałem w spells_process_mana_released:
if (Npc_GetActiveSpell(self) == SPL_FIREBALL)
{
self.aivar[AIV_SpellLevel] = Npc_GetActiveSpellLevel(self);
return SPL_SENDCAST;
};
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Masz pewność, że indeks numer 1 nie jest używany przez inne skrypty? Poza tym, skoro istnieje taka funkcja, to aivar jest niepotrzebny.
var int spellLevel; spellLevel = Npc_GetActiveSpellLevel(slf2);
splDmge = (SPL_DAMAGE_FIREBALL * spellLevel) - oth.protection[PROT_FIRE];
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

IceMan

IceMan

Użytkownicy
posty67
Profesjabrak
  • Użytkownicy
Potrzebuje aivara w przypadku kiedy to inny NPC rzuca czar, inaczej będzie się znowu bugować ze zmienną.

W skrypcie obrażeń dałem:
splDmge = (SPL_DAMAGE_FIREBALL * slf.aiscriptvars[AIV_SpellLevel]) - oth.protection[PROT_FIRE];
a w skrypcie spells_process_mana_released:
self.aivar[AIV_SpellLevel] = Npc_GetActiveSpellLevel(self);
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Przecież slf2 zwraca obecnie atakującego npc...
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy
Ogólnie to po co wgl przypisywać pointer do obiektu c_npc i oCNPC? XD
Wystarczy ci tylko jeden obiekt.
Jeżeli potrzebujesz mieć wgląd do klasy npc z silnika, użyj oCNpc, ale jak chcesz tylko użyć aivara (KTÓRY JEST JUŻ UTWORZONY I NIE MUSISZ GO ROBIĆ) lub imię npc, to użyj c_npc.
Poprzez użycie bezsensowne, wielokrotne _^(), tylko sobie psujesz wydajność.
 
while(false) Do();

IceMan

IceMan

Użytkownicy
posty67
Profesjabrak
  • Użytkownicy
Przypisywałem do obu dlatego że w niektórych przypadkach potrzebowałem klasy C_NPC na początku miałem tylko oCNpc, ale masz racje, może przejde tylko na klase c_npc.
Ale nie rozumiem, gdzie jest utworzony taki aivar? Ja takiego jak "SpellLevel" nie miałem i wywalało unknow identifier.

Splash kiedy zamiast aivara dałem zmienną zwykłą to kiedy czarowałem ja i NPC jednocześnie to jeżeli NPC puścił czar level 4 a ja po nim od razu Level 2 to czar który mnie uderzał od niego zmieniał się w locie na Level 2, bo zmienna się zmieniła kiedy ja wypuściłem tak to działało właśnie

Edit: pozmieniałem na takie coś:
    var oSDamageDescriptor dmgDescriptor;
    dmgDescriptor = _^ (attackerPtr);
var c_npc oth;
var c_npc slf;
slf =  _^(dmgDescriptor.attackerNPC);
oth =  _^(victimPtr);
 


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