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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.804
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 515
Последнее редактирование модератором:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.331
Благодарности
6.314
Баллы
1.595
RPD, приведи свой код к такому:
Daedalus:
func void B_Nikita_Func(var C_Npc nikita)
{
    Npc_SetTalentSkill(nikita,NPC_TALENT_MAGE,7);
    Npc_SetTalentSkill(nikita,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_ALCHEMY,1);
    B_RaiseFightTalent(nikita,NPC_TALENT_1H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_2H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_BOW,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_CROSSBOW,70);
    CreateInvItems(nikita,itmw_nikita_piercer,1);
    AI_EquipBestMeleeWeapon(nikita);
    Mdl_SetModelFatness(nikita,2);
    Mdl_ApplyOverlayMds(nikita,"Humans_Mage.mds");
    B_SetNpcVisual_Nikita(nikita,MALE,"Hum_Head_Thief",FACE_N_NIKITA,BodyTex_N,ITAR_Bau_M);
    nikita.fight_tactic = FAI_HUMAN_MASTER;
    nikita.npcType = npctype_main;
};

prototype Nikita_Default(C_NPC)
{
    attribute[ATR_STRENGTH] = 200;
    aivar[REAL_STRENGTH] = 200;
    attribute[ATR_DEXTERITY] = 150;
    aivar[REAL_DEXTERITY] = 150;
    attribute[ATR_MANA_MAX] = 300;
    aivar[REAL_MANA_MAX] = 300;
    attribute[ATR_MANA] = 300;
    attribute[ATR_HITPOINTS_MAX] = 25000;
    attribute[ATR_HITPOINTS] = 25000;
    protection[PROT_EDGE] = 0;
    protection[PROT_BLUNT] = 0;
    protection[PROT_POINT] = 0;
    protection[PROT_FIRE] = 0;
    protection[PROT_MAGIC] = 0;
    damagetype = DAM_BLUNT;
    senses = SENSE_HEAR | SENSE_SEE | SENSE_SMELL;
    senses_range = PERC_DIST_MONSTER_ACTIVE_MAX;
    aivar[AIV_MM_FollowTime] = NPC_TIME_FOLLOW;
    aivar[AIV_FightDistCancel] = FIGHT_DIST_CANCEL;
    bodyStateInterruptableOverride = FALSE;
};


instance Summoned_Nikita(Nikita_Default)
{
    name[0] = "Вызванный Никита";
    guild = GIL_NIK;
    level = 0;
    aivar[AIV_PARTYMEMBER] = TRUE;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_FRIENDLY);
    start_aistate = ZS_MM_Rtn_Summoned;
};

instance Nikita_For_Npc(Nikita_Default)
{
    name[0] = "Никита";
    guild = GIL_NIK;
    voice = 20;
    level = 100;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_HOSTILE);
};

весь мой код в b_selectSpell()
Э... Он сам себя чтоли вызывает?
В этой же функции, b_selectSpell, покажи блок if((slf.guild == GIL_NIK)
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
RPD, приведи свой код к такому:
Daedalus:
func void B_Nikita_Func(var C_Npc nikita)
{
    Npc_SetTalentSkill(nikita,NPC_TALENT_MAGE,7);
    Npc_SetTalentSkill(nikita,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_ALCHEMY,1);
    B_RaiseFightTalent(nikita,NPC_TALENT_1H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_2H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_BOW,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_CROSSBOW,70);
    CreateInvItems(nikita,itmw_nikita_piercer,1);
    AI_EquipBestMeleeWeapon(nikita);
    Mdl_SetModelFatness(nikita,2);
    Mdl_ApplyOverlayMds(nikita,"Humans_Mage.mds");
    B_SetNpcVisual_Nikita(nikita,MALE,"Hum_Head_Thief",FACE_N_NIKITA,BodyTex_N,ITAR_Bau_M);
    nikita.fight_tactic = FAI_HUMAN_MASTER;
    nikita.npcType = npctype_main;
};

prototype Nikita_Default(C_NPC)
{
    attribute[ATR_STRENGTH] = 200;
    aivar[REAL_STRENGTH] = 200;
    attribute[ATR_DEXTERITY] = 150;
    aivar[REAL_DEXTERITY] = 150;
    attribute[ATR_MANA_MAX] = 300;
    aivar[REAL_MANA_MAX] = 300;
    attribute[ATR_MANA] = 300;
    attribute[ATR_HITPOINTS_MAX] = 25000;
    attribute[ATR_HITPOINTS] = 25000;
    protection[PROT_EDGE] = 0;
    protection[PROT_BLUNT] = 0;
    protection[PROT_POINT] = 0;
    protection[PROT_FIRE] = 0;
    protection[PROT_MAGIC] = 0;
    damagetype = DAM_BLUNT;
    senses = SENSE_HEAR | SENSE_SEE | SENSE_SMELL;
    senses_range = PERC_DIST_MONSTER_ACTIVE_MAX;
    aivar[AIV_MM_FollowTime] = NPC_TIME_FOLLOW;
    aivar[AIV_FightDistCancel] = FIGHT_DIST_CANCEL;
    bodyStateInterruptableOverride = FALSE;
};


instance Summoned_Nikita(Nikita_Default)
{
    name[0] = "Вызванный Никита";
    guild = GIL_NIK;
    level = 0;
    aivar[AIV_PARTYMEMBER] = TRUE;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_FRIENDLY);
    start_aistate = ZS_MM_Rtn_Summoned;
};

instance Nikita_For_Npc(Nikita_Default)
{
    name[0] = "Никита";
    guild = GIL_NIK;
    voice = 20;
    level = 100;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_HOSTILE);
};


Э... Он сам себя чтоли вызывает?
В этой же функции, b_selectSpell, покажи блок if((slf.guild == GIL_NIK)
да, сам себя
Пост автоматически объединён:

RPD, приведи свой код к такому:
Daedalus:
func void B_Nikita_Func(var C_Npc nikita)
{
    Npc_SetTalentSkill(nikita,NPC_TALENT_MAGE,7);
    Npc_SetTalentSkill(nikita,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_ALCHEMY,1);
    B_RaiseFightTalent(nikita,NPC_TALENT_1H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_2H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_BOW,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_CROSSBOW,70);
    CreateInvItems(nikita,itmw_nikita_piercer,1);
    AI_EquipBestMeleeWeapon(nikita);
    Mdl_SetModelFatness(nikita,2);
    Mdl_ApplyOverlayMds(nikita,"Humans_Mage.mds");
    B_SetNpcVisual_Nikita(nikita,MALE,"Hum_Head_Thief",FACE_N_NIKITA,BodyTex_N,ITAR_Bau_M);
    nikita.fight_tactic = FAI_HUMAN_MASTER;
    nikita.npcType = npctype_main;
};

prototype Nikita_Default(C_NPC)
{
    attribute[ATR_STRENGTH] = 200;
    aivar[REAL_STRENGTH] = 200;
    attribute[ATR_DEXTERITY] = 150;
    aivar[REAL_DEXTERITY] = 150;
    attribute[ATR_MANA_MAX] = 300;
    aivar[REAL_MANA_MAX] = 300;
    attribute[ATR_MANA] = 300;
    attribute[ATR_HITPOINTS_MAX] = 25000;
    attribute[ATR_HITPOINTS] = 25000;
    protection[PROT_EDGE] = 0;
    protection[PROT_BLUNT] = 0;
    protection[PROT_POINT] = 0;
    protection[PROT_FIRE] = 0;
    protection[PROT_MAGIC] = 0;
    damagetype = DAM_BLUNT;
    senses = SENSE_HEAR | SENSE_SEE | SENSE_SMELL;
    senses_range = PERC_DIST_MONSTER_ACTIVE_MAX;
    aivar[AIV_MM_FollowTime] = NPC_TIME_FOLLOW;
    aivar[AIV_FightDistCancel] = FIGHT_DIST_CANCEL;
    bodyStateInterruptableOverride = FALSE;
};


instance Summoned_Nikita(Nikita_Default)
{
    name[0] = "Вызванный Никита";
    guild = GIL_NIK;
    level = 0;
    aivar[AIV_PARTYMEMBER] = TRUE;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_FRIENDLY);
    start_aistate = ZS_MM_Rtn_Summoned;
};

instance Nikita_For_Npc(Nikita_Default)
{
    name[0] = "Никита";
    guild = GIL_NIK;
    voice = 20;
    level = 100;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_HOSTILE);
};


Э... Он сам себя чтоли вызывает?
В этой же функции, b_selectSpell, покажи блок if((slf.guild == GIL_NIK)
У меня кстати как раз нет проверки на гильдию, только на инстанцию нпс
Пост автоматически объединён:

RPD, приведи свой код к такому:
Daedalus:
func void B_Nikita_Func(var C_Npc nikita)
{
    Npc_SetTalentSkill(nikita,NPC_TALENT_MAGE,7);
    Npc_SetTalentSkill(nikita,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_ALCHEMY,1);
    B_RaiseFightTalent(nikita,NPC_TALENT_1H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_2H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_BOW,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_CROSSBOW,70);
    CreateInvItems(nikita,itmw_nikita_piercer,1);
    AI_EquipBestMeleeWeapon(nikita);
    Mdl_SetModelFatness(nikita,2);
    Mdl_ApplyOverlayMds(nikita,"Humans_Mage.mds");
    B_SetNpcVisual_Nikita(nikita,MALE,"Hum_Head_Thief",FACE_N_NIKITA,BodyTex_N,ITAR_Bau_M);
    nikita.fight_tactic = FAI_HUMAN_MASTER;
    nikita.npcType = npctype_main;
};

prototype Nikita_Default(C_NPC)
{
    attribute[ATR_STRENGTH] = 200;
    aivar[REAL_STRENGTH] = 200;
    attribute[ATR_DEXTERITY] = 150;
    aivar[REAL_DEXTERITY] = 150;
    attribute[ATR_MANA_MAX] = 300;
    aivar[REAL_MANA_MAX] = 300;
    attribute[ATR_MANA] = 300;
    attribute[ATR_HITPOINTS_MAX] = 25000;
    attribute[ATR_HITPOINTS] = 25000;
    protection[PROT_EDGE] = 0;
    protection[PROT_BLUNT] = 0;
    protection[PROT_POINT] = 0;
    protection[PROT_FIRE] = 0;
    protection[PROT_MAGIC] = 0;
    damagetype = DAM_BLUNT;
    senses = SENSE_HEAR | SENSE_SEE | SENSE_SMELL;
    senses_range = PERC_DIST_MONSTER_ACTIVE_MAX;
    aivar[AIV_MM_FollowTime] = NPC_TIME_FOLLOW;
    aivar[AIV_FightDistCancel] = FIGHT_DIST_CANCEL;
    bodyStateInterruptableOverride = FALSE;
};


instance Summoned_Nikita(Nikita_Default)
{
    name[0] = "Вызванный Никита";
    guild = GIL_NIK;
    level = 0;
    aivar[AIV_PARTYMEMBER] = TRUE;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_FRIENDLY);
    start_aistate = ZS_MM_Rtn_Summoned;
};

instance Nikita_For_Npc(Nikita_Default)
{
    name[0] = "Никита";
    guild = GIL_NIK;
    voice = 20;
    level = 100;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_HOSTILE);
};


Э... Он сам себя чтоли вызывает?
В этой же функции, b_selectSpell, покажи блок if((slf.guild == GIL_NIK)
Привел. Сохраняются проблемы: Вызванный экземпляр от лица игрока только дерется мечом (Должен также кастовать заклы). А вызванный экземпляр у НПС тупо стоит на месте и ничего не делает, ни на что не реагирует
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.331
Благодарности
6.314
Баллы
1.595
Сохраняются проблемы: Вызванный экземпляр от лица игрока только дерется мечом (Должен также кастовать заклы). А вызванный экземпляр у НПС тупо стоит на месте и ничего не делает, ни на что не реагирует
Покажи код заклинания. И самый первый вариант никитки
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Покажи код заклинания. И самый первый вариант никитки
Daedalus:
const int SPL_Cost_SummonNikita = 250;

instance Spell_SummonNikita(C_Spell_Proto)
{
    time_per_mana = 0;
    targetCollectAlgo = TARGET_COLLECT_NONE;
};


func int Spell_Logic_SummonNikita(var int manaInvested)
{
    if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
    {
        return SPL_SENDCAST;
    }
    else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonNikita)
    {
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};

func void Spell_Cast_SummonNikita()
{
    if(Npc_GetActiveSpellIsScroll(self))
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
    }
    else
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonNikita;
    };
    
    if(Npc_IsPlayer(self))
    {
        Wld_SpawnNpcRange(self,Summoned_Nikita,1,300);
    }
    else
    {
        Wld_SpawnNpcRange(self,Nikita_for_Npc,1,300);
    };
    
    self.aivar[AIV_SelectSpell] += 1;
};
Пост автоматически объединён:

Daedalus:
const int SPL_Cost_SummonNikita = 250;

instance Spell_SummonNikita(C_Spell_Proto)
{
    time_per_mana = 0;
    targetCollectAlgo = TARGET_COLLECT_NONE;
};


func int Spell_Logic_SummonNikita(var int manaInvested)
{
    if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
    {
        return SPL_SENDCAST;
    }
    else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonNikita)
    {
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};

func void Spell_Cast_SummonNikita()
{
    if(Npc_GetActiveSpellIsScroll(self))
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
    }
    else
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonNikita;
    };
   
    if(Npc_IsPlayer(self))
    {
        Wld_SpawnNpcRange(self,Summoned_Nikita,1,300);
    }
    else
    {
        Wld_SpawnNpcRange(self,Nikita_for_Npc,1,300);
    };
   
    self.aivar[AIV_SelectSpell] += 1;
};
Не понял про "первый вариант"
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.331
Благодарности
6.314
Баллы
1.595
Не понял про "первый вариант"
Забей.
С заклом тоже все норм.
До компа доберусь посмотрю что нажуно.
А пока сам посмотри как орки шаманы себя ведут. Если врпг далеко - кастуют, если близко - достают ножик.
В их сторону посмотри.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.331
Благодарности
6.314
Баллы
1.595
RPD, Скрипт Никитки переделай на это:
Daedalus:
func void B_Nikita_Func(var C_Npc nikita)
{
    nikita.guild = GIL_NIK;
    nikita.voice = 20;
    Npc_SetTalentSkill(nikita,NPC_TALENT_MAGE,7);
    Npc_SetTalentSkill(nikita,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_ALCHEMY,1);
    B_RaiseFightTalent(nikita,NPC_TALENT_1H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_2H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_BOW,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_CROSSBOW,70);
    CreateInvItems(nikita,itmw_nikita_piercer,1);
    AI_EquipBestMeleeWeapon(nikita);
    Mdl_SetModelFatness(nikita,2);
    Mdl_ApplyOverlayMds(nikita,"Humans_Mage.mds");
    B_SetNpcVisual_Nikita(nikita,MALE,"Hum_Head_Thief",FACE_N_NIKITA,BodyTex_N,ITAR_Bau_M);
    nikita.fight_tactic = FAI_HUMAN_MASTER;
    nikita.npcType = npctype_main;
};

prototype Nikita_Default(C_NPC)
{
    attribute[ATR_STRENGTH] = 200;
    aivar[REAL_STRENGTH] = 200;
    attribute[ATR_DEXTERITY] = 150;
    aivar[REAL_DEXTERITY] = 150;
    attribute[ATR_MANA_MAX] = 300;
    aivar[REAL_MANA_MAX] = 300;
    attribute[ATR_MANA] = 300;
    attribute[ATR_HITPOINTS_MAX] = 25000;
    attribute[ATR_HITPOINTS] = 25000;
    protection[PROT_EDGE] = 0;
    protection[PROT_BLUNT] = 0;
    protection[PROT_POINT] = 0;
    protection[PROT_FIRE] = 0;
    protection[PROT_MAGIC] = 0;
    damagetype = DAM_BLUNT;
    senses = SENSE_HEAR | SENSE_SEE | SENSE_SMELL;
    senses_range = PERC_DIST_MONSTER_ACTIVE_MAX;
    aivar[AIV_MM_FollowTime] = NPC_TIME_FOLLOW;
    aivar[AIV_FightDistCancel] = FIGHT_DIST_CANCEL;
    bodyStateInterruptableOverride = FALSE;
};


instance Summoned_Nikita(Nikita_Default)
{
    name[0] = "Вызванный Никита";
    level = 0;
    B_Nikita_Func(self);
};

instance Nikita_For_Npc(Nikita_Default)
{
    name[0] = "Никита";
    level = 100;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_HOSTILE);
};

Скрипт спелла переделай на это:

Daedalus:
const int SPL_Cost_SummonNikita = 250;

instance Spell_SummonNikita(C_Spell_Proto)
{
    time_per_mana = 0;
    targetCollectAlgo = TARGET_COLLECT_NONE;
};


func int Spell_Logic_SummonNikita(var int manaInvested)
{
    if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
    {
        return SPL_SENDCAST;
    }
    else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonNikita)
    {
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};

func void Spell_Cast_SummonNikita()
{
    if(Npc_GetActiveSpellIsScroll(self))
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
    }
    else
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonNikita;
    };
    
    if(Npc_IsPlayer(self))
    {
        Wld_SpawnNpcRange(self,Summoned_Nikita,1,300);
        AI_StartState(Summoned_Nikita,ZS_MM_Rtn_Summoned,0,"");
    }
    else
    {
        Wld_SpawnNpcRange(self,Nikita_for_Npc,1,300);
        Npc_GetNextTarget(Nikita_for_Npc);
        Npc_SetTarget(Nikita_for_Npc,other);
        AI_StartState(Nikita_for_Npc,ZS_Attack,0,"");
    };
    
    self.aivar[AIV_SelectSpell] += 1;
};

B_SelectSpell переделай вот так:

Daedalus:
    if((Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(nikita)) || (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Summoned_Nikita)) || (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Nikita_For_Npc)))    {       
        if(!Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItem(slf,ItRu_InstantFireball);
        };
        if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_MELEE)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        };
        return FALSE; //B_ReadyRune(slf,ItRu_SumNik);
    };
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
RPD, Скрипт Никитки переделай на это:
Daedalus:
func void B_Nikita_Func(var C_Npc nikita)
{
    nikita.guild = GIL_NIK;
    nikita.voice = 20;
    Npc_SetTalentSkill(nikita,NPC_TALENT_MAGE,7);
    Npc_SetTalentSkill(nikita,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(nikita,NPC_TALENT_ALCHEMY,1);
    B_RaiseFightTalent(nikita,NPC_TALENT_1H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_2H,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_BOW,70);
    B_RaiseFightTalent(nikita,NPC_TALENT_CROSSBOW,70);
    CreateInvItems(nikita,itmw_nikita_piercer,1);
    AI_EquipBestMeleeWeapon(nikita);
    Mdl_SetModelFatness(nikita,2);
    Mdl_ApplyOverlayMds(nikita,"Humans_Mage.mds");
    B_SetNpcVisual_Nikita(nikita,MALE,"Hum_Head_Thief",FACE_N_NIKITA,BodyTex_N,ITAR_Bau_M);
    nikita.fight_tactic = FAI_HUMAN_MASTER;
    nikita.npcType = npctype_main;
};

prototype Nikita_Default(C_NPC)
{
    attribute[ATR_STRENGTH] = 200;
    aivar[REAL_STRENGTH] = 200;
    attribute[ATR_DEXTERITY] = 150;
    aivar[REAL_DEXTERITY] = 150;
    attribute[ATR_MANA_MAX] = 300;
    aivar[REAL_MANA_MAX] = 300;
    attribute[ATR_MANA] = 300;
    attribute[ATR_HITPOINTS_MAX] = 25000;
    attribute[ATR_HITPOINTS] = 25000;
    protection[PROT_EDGE] = 0;
    protection[PROT_BLUNT] = 0;
    protection[PROT_POINT] = 0;
    protection[PROT_FIRE] = 0;
    protection[PROT_MAGIC] = 0;
    damagetype = DAM_BLUNT;
    senses = SENSE_HEAR | SENSE_SEE | SENSE_SMELL;
    senses_range = PERC_DIST_MONSTER_ACTIVE_MAX;
    aivar[AIV_MM_FollowTime] = NPC_TIME_FOLLOW;
    aivar[AIV_FightDistCancel] = FIGHT_DIST_CANCEL;
    bodyStateInterruptableOverride = FALSE;
};


instance Summoned_Nikita(Nikita_Default)
{
    name[0] = "Вызванный Никита";
    level = 0;
    B_Nikita_Func(self);
};

instance Nikita_For_Npc(Nikita_Default)
{
    name[0] = "Никита";
    level = 100;
    B_Nikita_Func(self);
    B_SetAttitude(self,ATT_HOSTILE);
};

Скрипт спелла переделай на это:

Daedalus:
const int SPL_Cost_SummonNikita = 250;

instance Spell_SummonNikita(C_Spell_Proto)
{
    time_per_mana = 0;
    targetCollectAlgo = TARGET_COLLECT_NONE;
};


func int Spell_Logic_SummonNikita(var int manaInvested)
{
    if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
    {
        return SPL_SENDCAST;
    }
    else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonNikita)
    {
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};

func void Spell_Cast_SummonNikita()
{
    if(Npc_GetActiveSpellIsScroll(self))
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
    }
    else
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonNikita;
    };
   
    if(Npc_IsPlayer(self))
    {
        Wld_SpawnNpcRange(self,Summoned_Nikita,1,300);
        AI_StartState(Summoned_Nikita,ZS_MM_Rtn_Summoned,0,"");
    }
    else
    {
        Wld_SpawnNpcRange(self,Nikita_for_Npc,1,300);
        Npc_GetNextTarget(Nikita_for_Npc);
        Npc_SetTarget(Nikita_for_Npc,other);
        AI_StartState(Nikita_for_Npc,ZS_Attack,0,"");
    };
   
    self.aivar[AIV_SelectSpell] += 1;
};

B_SelectSpell переделай вот так:

Daedalus:
    if((Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(nikita)) || (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Summoned_Nikita)) || (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Nikita_For_Npc)))    {      
        if(!Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItem(slf,ItRu_InstantFireball);
        };
        if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_MELEE)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        };
        return FALSE; //B_ReadyRune(slf,ItRu_SumNik);
    };
здорово получилось, спасибо. Единственное что - если, допустим, призванные экземпляры уже убили первую цель - они дальше будут стоять и тупить до того, пока их самих не ударят
Пост автоматически объединён:

Такая же проблема у меня и с обычными Никитами. если в них попадает какой нибудь фаербол - будут молча стоять и не двигаться - пока не удярят
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.331
Благодарности
6.314
Баллы
1.595
призванные экземпляры уже убили первую цель - они дальше будут стоять и тупить до того, пока их самих не ударят
Тут ковырять функцию B_Attack
Такая же проблема у меня и с обычными Никитами. если в них попадает какой нибудь фаербол - будут молча стоять и не двигаться - пока не удярят
А тут ковырять B_AssessDamage
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Тут ковырять функцию B_Attack

А тут ковырять B_AssessDamage
да, нужно определенно подумать
Пост автоматически объединён:

да, нужно определенно подумать
единственное что, не мог бы скинуть файлик со всеми аиварами, если есть?
 

MEG@VOLT

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

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Короче, пытался я додумать, пытался и так ни к чему не пришел.

Daedalus:
func void B_AssessSurprise()

{

    Npc_SetTarget(self,other);

    self.aivar[AIV_ATTACKREASON] = AR_GuildEnemy;

};



func void ZS_Attack()

{

    Perception_Set_Minimal();

 

    Npc_PercEnable(self,PERC_ASSESSSURPRISE,B_AssessSurprise);

    B_ValidateOther();

    self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);

    if(C_WantToFlee(self,other))

    {

        Npc_ClearAIQueue(self);

        B_ClearPerceptions(self);

        Npc_SetTarget(self,other);

        AI_StartState(self,ZS_Flee,0,"");

        return;

    };

    if(self.aivar[AIV_LOADGAME] == FALSE)

    {

        B_Say_AttackReason();

    };

    if(Npc_IsInFightMode(self,FMODE_NONE))

    {

        AI_EquipBestRangedWeapon(self);

        AI_EquipBestMeleeWeapon(self);

    };

    AI_Standup(self);

    B_StopLookAt(self);

    B_TurnToNpc(self,other);

    if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(nikita)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Summoned_Nikita)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Nikita_For_Npc)))

    {

        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_SPRINT.MDS",300000);

    };

    AI_SetWalkMode(self,NPC_RUN);

    self.aivar[AIV_Guardpassage_Status] = GP_NONE;

    self.aivar[AIV_LastAbsolutionLevel] = B_GetCurrentAbsolutionLevel(self);

    self.aivar[AIV_PursuitEnd] = FALSE;

    self.aivar[AIV_StateTime] = 0;

    self.aivar[AIV_TAPOSITION] = 0;

    self.aivar[AIV_HitByOtherNpc] = 0;

    self.aivar[AIV_SelectSpell] = 0;

};



func int ZS_Attack_Loop()

{

    B_Greg_ComesToDexter();

    Npc_GetTarget(self);

    if(Npc_GetDistToNpc(self,other) > self.aivar[AIV_FightDistCancel])

    {

        Npc_ClearAIQueue(self);

        AI_Standup(self);

        self.aivar[AIV_PursuitEnd] = TRUE;

        return LOOP_END;

    };

    if((Npc_GetStateTime(self) > self.aivar[AIV_MM_FollowTime]) && (self.aivar[AIV_PursuitEnd] == FALSE))

    {

        Npc_ClearAIQueue(self);

        AI_Standup(self);

        self.aivar[AIV_PursuitEnd] = TRUE;

        self.aivar[AIV_Dist] = Npc_GetDistToNpc(self,other);

        self.aivar[AIV_StateTime] = Npc_GetStateTime(self);

        if(other.guild < GIL_SEPERATOR_HUM)

        {

            B_Say(self,other,"$RUNCOWARD");

        };

    };

    if(self.aivar[AIV_PursuitEnd] == TRUE)

    {

        if(Npc_GetDistToNpc(self,other) > self.senses_range)

        {

            return LOOP_END;

        };

        if(Npc_GetStateTime(self) > self.aivar[AIV_StateTime])

        {

            if((Npc_GetDistToNpc(self,other) < self.aivar[AIV_Dist]) || !(C_BodyStateContains(other,BS_RUN) && !C_BodyStateContains(other,BS_JUMP)))

            {

                self.aivar[AIV_PursuitEnd] = FALSE;

                Npc_SetStateTime(self,0);

                self.aivar[AIV_StateTime] = 0;

            }

            else

            {

                B_TurnToNpc(self,other);

                self.aivar[AIV_Dist] = Npc_GetDistToNpc(self,other);

                self.aivar[AIV_StateTime] = Npc_GetStateTime(self);

            };

        };

        return LOOP_CONTINUE;

    };

    if(B_GetCurrentAbsolutionLevel(self) > self.aivar[AIV_LastAbsolutionLevel])

    {

        Npc_ClearAIQueue(self);

        AI_Standup(self);

        return LOOP_END;

    };

    if((C_BodyStateContains(other,BS_SWIM) || C_BodyStateContains(other,BS_DIVE)) && (self.aivar[AIV_MM_FollowInWater] == FALSE))

    {

        Npc_ClearAIQueue(self);

        AI_Standup(self);

        self.aivar[AIV_PursuitEnd] = TRUE;

        return LOOP_END;

    };

    if(self.aivar[AIV_WaitBeforeAttack] >= 1)

    {

        AI_Wait(self,0.8);

        self.aivar[AIV_WaitBeforeAttack] = 0;

    };

    if(self.aivar[AIV_MaxDistToWp] > 0)

    {

        if((Npc_GetDistToWP(self,self.wp) > self.aivar[AIV_MaxDistToWp]) && (Npc_GetDistToWP(other,self.wp) > self.aivar[AIV_MaxDistToWp]))

        {

            self.fight_tactic = FAI_NAILED;

        }

        else

        {

            self.fight_tactic = self.aivar[AIV_OriginalFightTactic];

        };

    };

    if(!C_BodyStateContains(other,BS_RUN) && !C_BodyStateContains(other,BS_JUMP))

    {

        Npc_SetStateTime(self,0);

    };

    if((Npc_GetStateTime(self) > 2) && (self.aivar[AIV_TAPOSITION] == 0))

    {

        B_CallGuards();

        self.aivar[AIV_TAPOSITION] = 1;

    };

    if((Npc_GetStateTime(self) > 8) && (self.aivar[AIV_TAPOSITION] == 1))

    {

        B_CallGuards();

        self.aivar[AIV_TAPOSITION] = 2;

    };

    B_CreateAmmo(self);

    B_SelectWeapon(self,other);

    if(Hlp_IsValidNpc(other) && (C_NpcIsDown(other) == FALSE))

    {

        if(((Hlp_GetInstanceID(other) == Hlp_GetInstanceID(nikita)) || (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Summoned_Nikita)) || (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Nikita_For_Npc))) && !Npc_IsPlayer(self))

        {

            self.flags = 0;

        };

        if(((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(nikita)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Summoned_Nikita)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Nikita_For_Npc))) && !Npc_IsPlayer(other))

        {

            other.flags = 0;

        };

     

        if(other.aivar[AIV_INVINCIBLE] == FALSE)

        {

            AI_Attack(self);

        }

        else

        {

            Npc_ClearAIQueue(self);

        };

        self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);

        return LOOP_CONTINUE;

    }

    else

    {

        Npc_ClearAIQueue(self);

        if((Hlp_IsValidNpc(other)) && (Npc_IsInState(other,ZS_Unconscious)) && ((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Nikita)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Summoned_Nikita)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Nikita_For_Npc))))

        {

            if(self.aivar[AIV_PursuitEnd] == FALSE)

            {

                if(B_GetCurrentAbsolutionLevel(self) > self.aivar[AIV_LastAbsolutionLevel])

                {

                    B_Say(self,other,"$WISEMOVE");

                }

                else

                {

                    B_Say_AttackEnd();

                };

            };

            if(Npc_IsInFightMode(self,FMODE_MELEE))

            {

                B_FinishingMove(self, other);

            };  

         

            return LOOP_CONTINUE;

        };

        if(Hlp_IsValidNpc(other) && Npc_IsPlayer(other) && C_NpcIsDown(other))

        {

            Npc_SetTempAttitude(self,Npc_GetPermAttitude(self,hero));

        };

        if(self.aivar[AIV_ATTACKREASON] != AR_KILL)

        {

            Npc_PerceiveAll(self);

            Npc_GetNextTarget(self);

        };

        if(Hlp_IsValidNpc(other) && !C_NpcIsDown(other) && ((Npc_GetDistToNpc(self,other) < PERC_DIST_INTERMEDIAT) || Npc_IsPlayer(other)) && (Npc_GetHeightToNpc(self,other) < PERC_DIST_HEIGHT) && (other.aivar[AIV_INVINCIBLE] == FALSE) && !(C_PlayerIsFakeBandit(self,other) && (self.guild == GIL_BDT)))

        {

            if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_HOSTILE)

            {

                self.aivar[AIV_ATTACKREASON] = AR_GuildEnemy;

                if(Npc_IsPlayer(other))

                {

                    self.aivar[AIV_LastPlayerAR] = AR_GuildEnemy;

                    self.aivar[AIV_LastFightAgainstPlayer] = FIGHT_CANCEL;

                    self.aivar[AIV_LastFightComment] = FALSE;

                };

            }

            else if(Npc_GetAttitude(self,other) == ATT_HOSTILE)

            {

                self.aivar[AIV_ATTACKREASON] = self.aivar[AIV_LastPlayerAR];

            };

            return LOOP_CONTINUE;

        }

        else

        {

            Npc_ClearAIQueue(self);

            if((self.aivar[AIV_LastFightAgainstPlayer] == FIGHT_CANCEL) && (self.aivar[AIV_LASTTARGET] != Hlp_GetInstanceID(hero)))

            {

                self.aivar[AIV_LastFightComment] = TRUE;

            };

            return LOOP_END;

        };

    };

};



func void ZS_Attack_End()

{

    other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);

    if(self.aivar[AIV_PursuitEnd] == TRUE)

    {

        if(Hlp_IsValidNpc(other) && Npc_IsPlayer(other) && (self.npcType != NPCTYPE_FRIEND))

        {

            Npc_SetTempAttitude(self,ATT_HOSTILE);

        };

        if(self.aivar[AIV_ArenaFight] == AF_RUNNING)

        {

            self.aivar[AIV_ArenaFight] = AF_AFTER;

        };

    };

    if(self.aivar[AIV_PursuitEnd] == FALSE)

    {

        if(B_GetCurrentAbsolutionLevel(self) > self.aivar[AIV_LastAbsolutionLevel])

        {

            B_Say(self,other,"$WISEMOVE");

        }

        else

        {

            B_Say_AttackEnd();

        };

    };

    if((other.aivar[AIV_KilledByPlayer] == TRUE) && (Wld_GetGuildAttitude(self.guild,hero.guild) != ATT_HOSTILE))

    {

        B_SetAttitude(self,ATT_FRIENDLY);

    };

    if(Npc_IsInState(other,ZS_Unconscious) && C_NpcHasAttackReasonToKill(self))

    {

        B_FinishingMove(self,other);

    };

    AI_RemoveWeapon(self);

    if(C_NpcIsDown(other) && C_WantToRansack(self) && ((other.aivar[AIV_RANSACKED] == FALSE) || C_NpcRansacksAlways(self)) && (Npc_GetDistToNpc(self,other) < PERC_DIST_INTERMEDIAT))

    {

        other.aivar[AIV_RANSACKED] = TRUE;

        if(other.guild < GIL_SEPERATOR_HUM)

        {

            AI_StartState(self,ZS_RansackBody,0,"");

            return;

        }

        else if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(AlligatorJack)) && (Npc_HasItems(other,ItFoMuttonRaw) > 0))

        {

            AI_StartState(self,ZS_GetMeat,0,"");

            return;

        };

    };

    if(self.attribute[ATR_HITPOINTS] < (self.attribute[ATR_HITPOINTS_MAX] / 2))

    {

        AI_StartState(self,ZS_HealSelf,0,"");

        return;

    };

};

Кидаю весь код ZS_ATTACK.
Проблемы: Нпс "Никита" при протвкании оппонента станится, не двигается, пока его кто-нибудь не ударит. Также вызванный экземпляр от заклинания призыва после убийства всех целей продолжает находится в состоянии атаки, изза этого стоит на месте, не идет за некромантом и не умирает от клика.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.962
Благодарности
944
Баллы
275
RPD,
после ФинишМув делай выход из loop цикла.

B_FinishingMove(self, other);
return LOOP_END;
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
RPD,
после ФинишМув делай выход из loop цикла.

B_FinishingMove(self, other);
return LOOP_END;
Действительно помогло. вызванный нпс опять же после убийства всех целей не прекращает своего состояния битвы. тоже выход из цикла делать или clearAIQueue? И где именно?
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Действительно помогло. вызванный нпс опять же после убийства всех целей не прекращает своего состояния битвы. тоже выход из цикла делать или clearAIQueue? И где именно?
Получилось исправить на половину. Вставил код непосредственно в инстанцию:
Daedalus:
instance Summoned_Nikita(Nikita_Default)
{
    name[0] = "Вызванный Никита";
    level = 0;
    B_SetAttitude(self,ATT_FRIENDLY);
    start_aistate = ZS_MM_Rtn_Summoned;
    B_Nikita_Func(self);
    aivar[AIV_DropDeadAndKill] = TRUE;
};

instance Nikita_For_Npc(Nikita_Default)
{
    name[0] = "Никита";
    level = 100;
    B_SetAttitude(self,ATT_HOSTILE);
    Npc_GetNextTarget(Nikita_for_Npc);
    Npc_SetTarget(self,other);
    AI_StartState(self,ZS_Attack,0,"");
    B_Nikita_Func(self);
    aivar[AIV_DropDeadAndKill] = TRUE;
};

Только вот после боя если никуда за игроком не идет (игрок стоит на месте, соответственно стоят и вызванные нпс) - стоит в анимации боя с мечом в руках. не убирает его короче
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.962
Благодарности
944
Баллы
275
RPD, у тебя какая инстанция в итоге вызывается?
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
RPD, у тебя какая инстанция в итоге вызывается?
ну так при касте вызова другим нпс - nikita_for_npc. Для героя - summoned_nikita. Если ты об этом
Пост автоматически объединён:

Хочу сделать так, чтобы при касте на определенного НПС, например ледяной глыбы, эффект и урон полностью отражался на того, кто кастанул. Как можно реализовать?
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Я пытался реализовать рандомный каст заклинаний, с определенным шансом для каждого. На деле пекрвые заклы нпс кастует нормально, потом тупит - либо стоит на месте с заклинанием в руках бесконечно, либо просто перебирает каждое. Что здесь не так:
Daedalus:
if(slf.guild == GIL_NIK)
    {
        if(Npc_IsDrawingWeapon(slf))
        {
            return TRUE;
        };
      
        if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_MELEE)
        {
            return FALSE;
        };
      
        if(Npc_HasItems(slf,ItRu_PierceArrow) == 0)
        {
            CreateInvItems(slf,ItRu_PierceArrow,1);
        };
        if(Npc_HasItems(slf,ItRu_SumNik) == 0)
        {
            CreateInvItems(slf,ItRu_SumNik,1);
        };
        if(Npc_HasItems(slf,ItRu_FullHeal) == 0)
        {
            CreateInvItems(slf,ItRu_FullHeal,1);
        };
      
      
        if(slf.aivar[AIV_SelectSpell] == 0)
        {
            rand = Hlp_Random(5);
            slf.aivar[AIV_SelectSpell] += rand;
        };
        if(slf.aivar[AIV_SelectSpell] >= 3)
        {
            B_ReadySpell(slf,SPL_PierceArrow,0);
            return true;
          
        }
        else if(slf.aivar[AIV_SelectSpell] < 3)
        {
            B_ReadySpell(slf,SPL_SummonNikita,0);
            return true;
        };
        if(slf.aivar[AIV_SelectSpell] == 10)
        {
            slf.aivar[AIV_SelectSpell] = 0;
        };
      
        return true;
    };
Пост автоматически объединён:

Кстати я разобрался с проблемой затупа при горении от огненного шара, надо было просто это приписать:
Daedalus:
if(Npc_IsDrawingWeapon(slf))
{
    return TRUE;
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.962
Благодарности
944
Баллы
275
RPD
1) там где у тебя идет == 10 поменяй на >=10;
2) к ранд добавляй еще 1 что бы ранд не мог быть равен 0;
3) обрати внимание что изменение значения аивера лучше производить после каста заклинания. Смотри спелл_каст в файле спелл_логик. В твоем случае в спелл_каст надо или делать рандом для аивера или обнулять его.
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
RPD
1) там где у тебя идет == 10 поменяй на >=10;
2) к ранд добавляй еще 1 что бы ранд не мог быть равен 0;
3) обрати внимание что изменение значения аивера лучше производить после каста заклинания. Смотри спелл_каст в файле спелл_логик. В твоем случае в спелл_каст надо или делать рандом для аивера или обнулять его.

файле спелл_логик. В твоем случае в спелл_каст надо или делать рандом для аивера или обнулять его.
Daedalus:
func void Spell_Cast_SummonNikita()
{
    if(Npc_GetActiveSpellIsScroll(self))
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
    }
    else
    {
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonNikita;
    };
    
    if(Npc_IsPlayer(self))
    {
        Wld_SpawnNpcRange(self,Summoned_Nikita,1,500);
        AI_StartState(Summoned_Nikita,ZS_MM_Rtn_Summoned,0,"");
    }
    else
    {
        Wld_SpawnNpcRange(self,Nikita_for_Npc,1,500);
        B_SetAttitude(self,ATT_HOSTILE);
        AI_StartState(self,ZS_Attack,0,"");
    };
    
    self.aivar[AIV_SelectSpell] += 1;
};

ты имеешь ввиду именно здесь обнулять self.aivar[AIV_SelectSpell], а не увеличивать?
 
Сверху Снизу