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

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

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

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
В игре существует несколько типов заклинания которые фактически являясь одинаковыми используют разные спеллы:
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
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
свитки трансформации
перед созданием новых свитков трансформации необходимо создать для них прототип. в этот прототип я добавлю id = ItSc_ID_Trf что бы их "сгруппировать" для будущих проверок.

Daedalus:
/*******************************************************************************************/
//             Trf Scrolls
/*******************************************************************************************/

const int   SPL_AllTrf          = SPL_TrfSheep;     // см. файл Constants
const int   ItSc_ID_Trf         = 135;              // айди для всех свитков трансформации. для различных проверок
const int     Value_Sc_AllTrf     = 20;               // цена "дефаутного" свитка
const int   SPL_Cost_ItSc       = SPL_Cost_Scroll;  // см. файл Constants

const string    NAME_SPL_AllTrf = "Свиток превращения";

prototype PRT_ItSc_Trf(C_Item)
{
    id                  =   ItSc_ID_Trf;

    name                 =    NAME_Spruchrolle;
    mainflag             =    ITEM_KAT_RUNE;
    flags                 =    ITEM_MULTI;

    value                 =    Value_Sc_AllTrf;

    visual                =    "ItSc_SumGol.3ds";
    material            =    MAT_LEATHER;

    spell                =     SPL_AllTrf;
 
    cond_atr[2]           =     ATR_MANA_MAX;               cond_value[2]   =     SPL_Cost_ItSc;

    wear                =     WEAR_EFFECT;
    effect                =    "SPELLFX_WEAKGLIMMER";

    description            =    NAME_SPL_AllTrf;

    TEXT    [0]            =    Name_MageScroll    ;

    TEXT    [1]            =    NAME_Mana_needed;            COUNT    [1]     =    cond_value[2];
 
    TEXT    [5]            =    NAME_Value;                 COUNT    [5]     =    value;
};

/*******************************************************************************************/
func void B_ItScTrf_TEXTCOUNT()
{
    item.COUNT[1]   =    item.cond_value[2];
    item.COUNT[5]   =    item.value;
};

сама инстанция свитка будет содержать информацию о кол-ве маны необходимой для каста, цене свитка, модельку и инстанцию существа в кого кастер будет превращаться.
Daedalus:
const string    NAME_SPL_TrfGolem           = "Свиток превращения в голема";
const int       Value_Sc_TrfGolem           = 666;
const int       SPL_Cost_TrfGolem           = 15;

instance ItSc_TrfGolem (PRT_ItSc_Trf)
{
    description            =    NAME_SPL_TrfGolem;      // описание свитка
    value                 =    Value_Sc_TrfGolem;      // цена свитка
    visual                =    "ItSc_SumGol.3ds";      // моделька
    cond_value[2]          =     SPL_Cost_TrfGolem;      // требует  маны
    hp                  =   StoneGolem;             // в кого превращаться
 
    B_ItScTrf_TEXTCOUNT();
};

в спелл логик получаем ссылку на используемую руну/свиток и берём из неё данные о том сколько маны требует заклинание и в кого будет превращаться герой. ману отнимаем движком.
Daedalus:
// ------ TrfAll ------
func int Spell_Logic_TrfAll (var int manaInvested)
{
    var c_item itm;  itm = Npc_GetSpellItem(self);

    if manaInvested == 0
    {
        if (self.attribute[ATR_MANA] < itm.cond_value[2])
        {
            return SPL_SENDSTOP;
        };
        return SPL_FORCEINVEST + itm.cond_value[2];  // отнимает ману
    };
    Npc_SetActiveSpellInfo(self, itm.hp);
    return SPL_SENDCAST;
};

остаётся добавить вызов нового Spell_Logic_TrfAll в SPELL_PROCESSMANA. Для это я решил определять новые свитки через айди инстанции свитка, что позволит сохранить работу оригинальной "механики" для полноценного теста новой версии в игре.

Daedalus:
func int Spell_ProcessMana(var int manaInvested)
{
    var c_item itm;  itm = Npc_GetSpellItem(SELF);
    Hlp_PrintConsole(Str_Format("SPELL_PROCESSMANA  itm.name = %s",itm.description));
 
    if (itm.id   ==  ItSc_ID_Trf)    {     return Spell_Logic_TrfAll(manaInvested);  };
 
    Spell_ProcessMana_old(manaInvested);
};


таким образом для новых рун/свитков превращения больше не будет технических ограничений и они все буду
 

Вложения

  • Spell_TrfAll.d
    3,2 KB · Просмотры: 3
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
руны телепортации
в начале делаем прототип руны телепортации. в прототипе я использую поле ID для "маркировки" всех новых рун телепортации. так же я добавляю требование к мане cond_atr[2] для руны. разработчики часто забывают про этот нюанс.
Daedalus:
const int SPL_AllTELEPORT = SPL_PalTeleportSecret;
prototype PRT_ITRU_TELEPORT(C_Item)
{
    id                  =   SPL_AllTELEPORT ;
    name                 =    NAME_Rune;

    mainflag             =    ITEM_KAT_RUNE;
    //FLAGS = ITEM_MULTI;   // свиток(одноразовая руна)
    flags                 =    0;
 
    cond_atr[2]           =    ATR_MANA_MAX;
    cond_value[2]          =    SPL_COST_TELEPORT;
 
    value                =    Value_Ru_PalTeleportSecret;
    visual                =    "ItRu_PalTeleportSecret.3DS";
 
    material            =    MAT_STONE;

    spell                =     SPL_AllTELEPORT ;
 
    wear                =     WEAR_EFFECT;
    effect                =    "SPELLFX_WEAKGLIMMER";
 
    TEXT[1]             =    NAME_Manakosten;            COUNT[1] =    cond_value[2];
    TEXT[5]             =    NAME_Value;                    COUNT[5] =    value;
};

в инстанции руны указываем мир и waypoint куда будет телепортироваться НПС. Для waypoint используем nameID. Спасибо ElderGamer .
Daedalus:
INSTANCE ItRu_TeleportChinaTown(PRT_ITRU_TELEPORT)
{
    description            =     "China Town";
    hp                  =   NEWWORLD_ZEN;                   // мир
    nameID              =   "NW_CITY_HABOUR_PUFF_VANJA";    // waypoint
};

делаем общий Spell_Logic_TeleportAll. в принципе он может быть любой. в данном примере я беру необходимое кол-во маны на каст из инстанции руны и отнимаю ману движком.
Daedalus:
/*******************************************************************************************/
func int Spell_Logic_TeleportAll(var int manainvested)
{ 
    // ОТЛАДКА
    Hlp_PrintConsole(Str_Format("Spell_Logic_TeleportAll: manainvested=%i,  mana = %i", manainvested,   self.attribute[ATR_MANA]));
 
    var int spllvl; spllvl = Npc_GetActiveSpellLevel(self);
 
    if (spllvl <= 1)
    //if (manainvested == 0)
    {
        if (self.attribute[ATR_MANA] < SPL_COST_TELEPORT)
        //if (self.attribute[ATR_MANA] < itm.cond_value[2])
        {
            if (self.attribute[ATR_MANA] > 0)
            {
                AI_PlayAni (self,"T_PRACTICEMAGIC3");   // ради забавы
            };
            self.attribute[ATR_MANA] = 0;           // мана за забавы
            return SPL_SENDSTOP;
        };
     
        // время анимации телепорта примерно 2500 мс
        Spell_Teleport.time_per_mana = IntToFloat(2500 / SPL_COST_TELEPORT);
         
        return SPL_NEXTLEVEL;
    };
 
    //if (manainvested > itm.cond_value[2])
    if (manainvested > SPL_COST_TELEPORT)
    {
        return SPL_SENDCAST;
    };
 
    return SPL_RECEIVEINVEST;   // отнимает ману
};

в Spell_Cast_Teleport добавляем проверку что бы вычленить новые руны. Далее проверка на мир и телепортация НПС.

Daedalus:
// ----- neu 1.21 Verteiler fьr die Cast-Funcs -------
func void Spell_Cast_Teleport()
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("spell_cast_teleport  itm.name = %s; WP=%s",itm.description,itm.nameID));
 
    if (C_Runa_Teleport(self))
    //if (itm.id   ==  Spl_AllTeleport)
    {
        if (CURRENTLEVEL == DRAGONISLAND_ZEN)
        {
            AI_Teleport(self,Npc_GetNearestWP(self));
            PrintScreen(PRINT_TELEPORTTOOFARAWAY,-1,YPOS_LEVELUP,FONT_SCREENSMALL,2);
        }
        else if (itm.hp == CURRENTLEVEL)
        {
            AI_Teleport(self,itm.nameID);
        }
        else
        {
            B_ChangeLevelAway(itm.hp,itm.nameID);
        };
        AI_PlayAni        (self, "T_HEASHOOT_2_STAND" );
        return;
    };
    spell_cast_teleport_old();
};

в начало Spell_ProcessMana и Spell_ProcessMana_Release добавляем проверку для новых рун телепортации.
Daedalus:
func int Spell_ProcessMana(var int manaInvested)
{
    Hlp_PrintConsole(Str_Format("Spell_ProcessMana: manainvested=%i,  mana = %i",  manainvested,   self.attribute[ATR_MANA]));

    if (C_Runa_Teleport(self))
    {
        return Spell_Logic_TeleportAll(manaInvested);
    };
 
    return Spell_ProcessMana_old(manaInvested);
};

func int Spell_ProcessMana_Release(var int manaInvested)
{
    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 (C_Runa_Teleport(self))
    {
        return Spell_Logic_TeleportAll(manaInvested);
    };

    return Spell_ProcessMana_Release_old(manaInvested);
};

вот и всё :)

upd 2024.01.01
- Добавлена смена мира
 

Вложения

  • Spell_Teleport_Alle.zip
    4,1 KB · Просмотры: 0
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
заклинания вызова
в прототипе я использую поле ID для "маркировки" всех новых заклинаний вызова.
Daedalus:
const int Spl_ALLSUMMON = SPL_SummonMud;

prototype PRT_ItSc_Sum(C_Item)
{
    id                  =   Spl_ALLSUMMON;
    name                 =    NAME_Spruchrolle;

    mainflag             =    ITEM_KAT_RUNE;
    FLAGS = ITEM_MULTI;       // свиток(одноразовая руна)
    //flags                 =    0;  // руна
 
    cond_atr[2]           =    ATR_MANA_MAX;
    cond_value[2]          =    SPL_Cost_Scroll;
 
    value                =    Value_Sc_SumSkel;
 
    visual                =    "ItSc_SumSkel.3DS";
    material            =    MAT_LEATHER;

    spell                =     Spl_ALLSUMMON;
 
    wear                =     WEAR_EFFECT;
    effect                =    "SPELLFX_WEAKGLIMMER";
 
    TEXT[0]             =    Name_MageScroll    ;           // свиток
    TEXT[1]             =    NAME_Manakosten;            COUNT[1] =    cond_value[2];
    TEXT[5]             =    NAME_Value;                    COUNT[5] =    value;
};
в инстанции свитка прописываем кого вызывать и в каком кол-ве
Daedalus:
const string NAME_SPL_SumWolfPack = "Вызов стаи волков";

instance ItSc_SumWolfPack(PRT_ItSc_Sum)
{
    description            =    NAME_SPL_SumWolfPack;
    hp                  =   Summoned_Wolf; // инстанция призванного волка
    hp_max              =   3; // кол-во
};
в Spell_Logic отнимаем ману движком
Daedalus:
func int Spell_Logic_SumAll(var int manainvested)
{

    var c_item itm;         itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("Spell_Logic_SumAll  itm.name = %s",itm.description));

    if (manainvested == 0)
    {
        if (self.attribute[ATR_MANA] < itm.cond_value[2])
        {
            AI_PlayAni (self,"T_PRACTICEMAGIC2");   // ради забавы
            self.attribute[ATR_MANA] = 1;           // мана за забавы
            return SPL_SENDSTOP;
        };
        return SPL_NEXTLEVEL;
    };
 
    if (manainvested > itm.cond_value[2])
    {
        return SPL_SENDCAST;
    };
    if (self.attribute[ATR_MANA] == 1)  { self.attribute[ATR_MANA] += 1; };  // береженного Бог бережёт
    return SPL_RECEIVEINVEST;   // отнимает ману
};

после каста создаём призванных существ
Daedalus:
func void Spell_Cast_SummonMud()
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("Spell_Cast_SummonMud  itm.name = %s",itm.description));
 
    if (itm.id   ==  Spl_ALLSUMMON)
    {
        Wld_SpawnNpcRange    (self, itm.hp, itm.hp_max,    500);
        return;
    };
    Spell_Cast_SummonMud_old();
};

в начале Spell_ProcessMana добавляем проверку для заклинаний вызова. обратите внимание что проверка ставится в начале, то есть до проверок по спелу.
Daedalus:
func int Spell_ProcessMana(var int manaInvested)
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("Spell_ProcessMana  itm.name = %s",itm.description));
 
    if (itm.id   ==  Spl_ALLSUMMON)    {     return Spell_Logic_SumAll(manaInvested);  };
 
    Spell_ProcessMana_old(manaInvested);
};
 

Вложения

  • Spell_SumAll.zip
    1,2 KB · Просмотры: 0
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
заклинание скорости
использование Npc_GetSpellItem так же позволяет повесить и новые "бафы" / "дебафы" на имеющиеся спелы. Например заклинание "скорость". Нового тут ничего нет, всё тоже самое. Пример кода:

Daedalus:
INSTANCE ItRu_Speed(C_Item)
{
    ItRu_Fear();
    cond_atr[2]         =   ATR_MANA_MAX;
    cond_value[2]       =   30;
    description         =   "Скорость";
};

func int Spell_logic_Speed(var int manainvested)
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
    if (manainvested == 0)
    {
        if (self.attribute[ATR_MANA] < itm.cond_value[2])
        {
            return SPL_SENDSTOP;
        };
        //return SPL_NEXTLEVEL;
    };
 
    if (manainvested > itm.cond_value[2])
    {
        return SPL_SENDCAST;
    };
   
    if (self.attribute[ATR_MANA] == 1)  { self.attribute[ATR_MANA] += 1; };  // береженного Бог бережёт
   
    return SPL_RECEIVEINVEST;   // отнимает ману
};

func void Spell_Cast_Fear()
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("Spell_Cast_Fear  itm.name = %s",itm.name));
    if (Hlp_IsItem(itm,ItRu_Speed))  
    {  
        //Wld_PlayEffect("spellFX_Teleport_RING", self, self, 0, 0, 0, FALSE);
        Mdl_ApplyOverlayMDSTimed    (self, "HUMANS_SPRINT.MDS", Time_Speed);
        return;
    };
    Spell_Cast_Fear_old();
};

func int Spell_ProcessMana(var int manainvested)
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("spell_processmana  itm.name = %s",itm.name));
    if (Hlp_IsItem(itm,ItRu_Speed))    {   return spell_logic_Speed(manainvested); };
    Spell_ProcessMana_old(manainvested);
};
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
Slavemaster есть еще такой нюанс: в данный момент "название спелла"(текстовое сообщение при активации спела) берётся из массива TXT_SPELLS. Можно ли сделать так что бы "название спела" бралось из item.description?
а еще лучше что бы вызывалась какая то func string s_txt_spells_name и я мог отдать ей string сам :)
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
MW 7, так пойдет?
var String res; res=Npc_GetItemDescription(ItRu_Icebolt);
Hlp_PrintConsole(Str_Format("item desc: %s", res));
 

Вложения

  • Union_Npc_GetItemDescription.vdf
    254 KB · Просмотры: 4

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
Daedalus:
func string Spell_GetName(var int spellID, var C_ITEM spellItem)
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;
    }
}
 

Вложения

  • zTest.vdf
    86,5 KB · Просмотры: 2

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
del
 
Последнее редактирование:

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
MW 7, не работает что-ли? У меня как бы проще и универсальнее получилось описание любого итема вернет. Зачем ограничивать спелом?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
Xeдин, нето :)

Slavemaster, спасибо! как раз то, что доктор прописал! :)
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;
};
1683908766901.jpeg
1683908761571.jpeg
 
Последнее редактирование:

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
Как-то так и не привязано к спелу, ну хозяин барин))

var String resDesc;
var C_Item res;
res=Player_GetActiveSpellItem();
if(res){
Hlp_PrintConsole(Str_Format("item name: %s", res.name));
resDesc=Npc_GetItemDescription(Hlp_GetInstanceID(res));
Hlp_PrintConsole(Str_Format("item desc: %s", resDesc));
};
 

Вложения

  • 2.jpg
    2.jpg
    131,9 KB · Просмотры: 15
  • 1.jpg
    1.jpg
    2,6 MB · Просмотры: 15

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
У меня как бы проще и универсальнее получилось описание любого итема вернет. Зачем ограничивать спелом?
для описание любого итема можно использовать штатные функции.
Код:
Npc_GetInvItem(self,ItRu_Icebolt);
Hlp_PrintConsole(Str_Format("item desc: %s", item.description));

тут речь шла о замене штатной информации, которая выводится на экран, при активации спела.
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
MW 7, а, тогда ок, чото не посмотрел что скриптовые есть функции, понял дословно что надо вернуть item.description ))
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275

Вложения

  • Spell_SumAll.zip
    1,2 KB · Просмотры: 1
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
в Spell_Cast_Teleport добавляем проверку что бы вычленить новые руны. Далее проверка на мир и телепортация НПС.
смена мира с использованием zparser
Daedalus:
func void B_ChangeLevelAway(var int GOTOlevel, var string wpch)
{
    if    (GOTOlevel         == OLDWORLD_ZEN)
    {
        Wld_ChangeLevel("OLDWORLD\OLDWORLD.zen",wpch);
    }
    else if    (GOTOlevel         == NEWWORLD_ZEN)
    {
        Wld_ChangeLevel("NEWWORLD\NEWWORLD.zen",wpch);
    }
    else if    (GOTOlevel         == ADDONWORLD_ZEN)
    {
        Wld_ChangeLevel("ADDON\ADDONWORLD.zen",wpch);
    }
    else
    {
       PrintScreen(PRINT_TeleportTooFarAway,-1,YPOS_LevelUp,FONT_ScreenSmall,2); 
    };
};

Daedalus:
// ----- neu 1.21 Verteiler fьr die Cast-Funcs -------
func void Spell_Cast_Teleport()
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("spell_cast_teleport  itm.name = %s",itm.description));
 
    if (itm.id   ==  Spl_AllTeleport)
    {
        if (CURRENTLEVEL == DRAGONISLAND_ZEN)
        {
            AI_Teleport(self,Npc_GetNearestWP(self));
            PrintScreen(PRINT_TELEPORTTOOFARAWAY,-1,YPOS_LEVELUP,FONT_SCREENSMALL,2);
        }
        else if(itm.hp == CURRENTLEVEL)
        {
            AI_Teleport(self,itm.nameID);
        }
        else
        {
            B_ChangeLevelAway(itm.hp,"itm.nameID"); 
        };
        AI_PlayAni        (self, "T_HEASHOOT_2_STAND" );
        return;
    };
    spell_cast_teleport_old();
};
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
ElderGamer MEG@VOLT не могу сообразить какое время(time_per_mana * SPL_COST_TELEPORT) выставить для телепорта. толи 2500, толи 2000, толи 3000.

// время анимации телепорта примерно 2500 мс ?
Spell_Teleport.time_per_mana = IntToFloat(2500 / SPL_COST_TELEPORT);

дайте ценный совет :-D


Daedalus:
func int Spell_Logic_TeleportAll(var int manainvested)
{   
    var c_item itm;  itm = Npc_GetSpellItem(self);
    var int spllvl; spllvl = Npc_GetActiveSpellLevel(self);

    Hlp_PrintConsole(Str_Format("Spell_Logic_TeleportAll: manainvested=%i, spllvl=%i itm.name = %s ", manainvested, spllvl,  itm.description));
    
    if (spllvl == 1)
    //if (manainvested == 0)
    {
        if (self.attribute[ATR_MANA] < SPL_COST_TELEPORT)   
        //if (self.attribute[ATR_MANA] < itm.cond_value[2])   
        {
            AI_PlayAni (self,"T_PRACTICEMAGIC3");   // ради забавы
            self.attribute[ATR_MANA] = 1;           // мана за забавы
            return SPL_SENDSTOP;
        };
        
        // время анимации телепорта примерно 2500 мс   
        Spell_Teleport.time_per_mana = IntToFloat(2500 / SPL_COST_TELEPORT);
    
        return SPL_NEXTLEVEL;
    };
    

    
    //if (manainvested > itm.cond_value[2])
    if (manainvested > SPL_COST_TELEPORT)
    {
        return SPL_SENDCAST;
    };
    if (self.attribute[ATR_MANA] == 1)  { self.attribute[ATR_MANA] += 1; };  // береженного Бог бережёт
    return SPL_RECEIVEINVEST;   // отнимает ману
};
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.157
Баллы
1.565
MW 7, я вообще делаю 1700
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
MEG@VOLT, на 1700 кольцо до конца не дойдёт ;-)
 
Сверху Снизу