• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в оценке работ на конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

получение данных из руны/свитка Npc_GetSpellItem

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
  • Первое сообщение
  • #1
В игре существует несколько типов заклинания которые фактически являясь одинаковыми используют разные спеллы:
func c_item Npc_GetSpellItem (var c_npc self) позволит получить данные напрямую из руны/свитка подобные заклинания можно уплотнить: использовать общую инстанцию спела, общий СпеллЛогик и общий спелайди.

добавлена функция func string Spell_GetName(var int spellID, var C_ITEM spellItem) для замены надписи на экране при активации/выборе спелла.
Daedalus:
func string Spell_GetName(var int spellID, var C_ITEM spellItem)
{
    var string msg;
 
    if spellItem.FLAGS & ITEM_MULTI // это свиток
    {
        msg = Str_Format("%s (%s)",spellItem.description,Name_MageScroll);
        // можно добавить кол-во имеющихся свитков или что то еще
    }
    else    // это руна
    {
        msg = spellItem.description;    // просто выводим название руны
    };
    return msg;
};


C++:
namespace NAMESPACE
{
    int __cdecl Npc_GetSpellItem()
    {
        oCNpc* npc;
        ZARGS(npc);

        oCItem* spellItem = nullptr;

        if (npc && npc->mag_book && npc->mag_book->spellnr >= 0 && npc->mag_book->spellnr < npc->mag_book->spellitems.GetNum())
            spellItem = npc->mag_book->spellitems[npc->mag_book->spellnr];

        ZRETURN(spellItem);
        return false;
    }

    ZEXTERNAL(oCItem*, Npc_GetSpellItem, oCNpc*);

    zSTRING* __fastcall Hook_oCSpell_GetName(oCSpell*, void*, zSTRING*);
    Hook<zSTRING*(__thiscall*)(oCSpell*, zSTRING*)> Ivk_oCSpell_GetName(ZENFOR(0x0047E1B0, 0x00488AE0, 0x00484E90, 0x004864B0), &Hook_oCSpell_GetName, HookMode::Patch);
    zSTRING* __fastcall Hook_oCSpell_GetName(oCSpell* spell, void* vtable, zSTRING* spellName)
    {
        static int funcIndex = parser->GetIndex("Spell_GetName");

        spellName = Ivk_oCSpell_GetName(spell, spellName);

        if (funcIndex >= 0 && player && player->mag_book)
            for (int i = 0; i < player->mag_book->spells.GetNum(); i++)
                if (player->mag_book->spells[i] == spell)
                {
                    *spellName = CallParser<zSTRING>(parser, funcIndex, spell->spellID, player->mag_book->spellitems[i]);
                    break;
                }

        return spellName;
    }
}

спасибо за патч Slavemaster
 

Вложения

  • 2023_05_12_zNPC_GETSPELLITEM.rar
    24 KB · Просмотры: 3
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.156
Баллы
1.565

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
Slavemaster если в Spell_ProcessMana у НПС "0" маны, то ничего не происходит.
в таком случае если у героя есть 10 маны и ему надо инвестировать 10 маны то каст не произойдёт, так как после того как герой инвестирует последнюю единичку маны, Spell_ProcessMana не вызывается.

такая ситуация с телепортом и мне пришлось последнюю единичку маны отнимать скриптами перед кастам :-(

возможно ли это как то исправить патчем на юнион?
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
так как после того как герой инвестирует последнюю единичку маны, Spell_ProcessMana не вызывается.
В этом случае должна вызываться SPELL_PROCESSMANA_RELEASE.
Изменить кое-что, наверное, можно, но могут другие заклы сломаться и придётся их логику переписывать.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
В этом случае должна вызываться SPELL_PROCESSMANA_RELEASE.
точно! совсем забыл :-( спасибо, пойду допишу :)

upd
арбайтен :)
Код:
func int Spell_ProcessMana_Release(var int manaInvested)
{

    var c_item itm;  itm = Npc_GetSpellItem(SELF);
    //Hlp_PrintConsole(Str_Format("Spell_ProcessMana  itm.name = %s",itm.description));
  
    Hlp_PrintConsole(Str_Format("Spell_ProcessMana_Release: manainvested=%i,  mana = %i",  manainvested,   self.attribute[ATR_MANA]));

    if (self.attribute[ATR_MANA] < 0)  { self.attribute[ATR_MANA] = 0; };  // береженного Бог бережёт

    if (itm.id == Spl_AllTeleport) 
    {   
        return Spell_Logic_TeleportAll(manaInvested);
    }; 

    return Spell_ProcessMana_Release_old(manaInvested);
};


upd2

обновил пост №3
 
Последнее редактирование:
Сверху Снизу