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

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

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

MaGoth

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

Вложения

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
не знаю. как по мне вся задумка "не так", так как не учитывает игровой механики классики.

Daedalus:
instance PC_HERO(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_NONE;
    id = 0;
    voice = 15;
    level = 0;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 0;
    exp_next = 500;
    lp = 0;
    attribute[ATR_STRENGTH] = 10;
    attribute[ATR_DEXTERITY] = 10;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 40;
    attribute[ATR_HITPOINTS] = 40;
    Mdl_SetVisual(self,"HUMANS.MDS");
    Mdl_SetVisualBody(self,"hum_body_Naked0",BODYTEX_PLAYER_G2,0,"Hum_Head_Pony",FACE_N_PLAYER,0,NO_ARMOR);
 
    b_setfightskills(self,10);
 
    /*
    HitChance[NPC_TALENT_1H]       = 10;
    HitChance[NPC_TALENT_2H]       = 10;
    HitChance[NPC_TALENT_BOW]      = 10;
    HitChance[NPC_TALENT_CROSSBOW] = 10;
    */
 
    //-------- Talente --------
    Npc_SetTalentSkill(self,NPC_TALENT_1H,0);
    Npc_SetTalentSkill(self,NPC_TALENT_2H,0);
    Npc_SetTalentSkill(self,NPC_TALENT_BOW,0);
    Npc_SetTalentSkill(self,NPC_TALENT_CROSSBOW,0);
};
Добавил указанное в PC_Hero и заменил AddFighSkill, но ничего не поменялось.

Daedalus:
    B_CheckFightSkill(slf);
    // общий блок для всех
Что это значит? Что должно содержаться в данном блоке?

Daedalus:
func void B_Npc_SetTalentSkill(var C_Npc npc,var int talent,var int newSkill)
{

    var int oldSkill;    oldSkill = Npc_GetTalentSkill(npc,talent);


    //Hlp_PrintConsole(Str_Format("B_Npc_SetTalentSkill[%s], oldSkill=%i, newSkill=%i",npc.name,oldSkill,newSkill));

    if npc.attribute[ATR_STRENGTH]  < (25*newSkill) { return;}; // условия KirTheSeeker
    if npc.attribute[ATR_DEXTERITY] < (25*newSkill) { return;}; // условия KirTheSeeker

    if (oldSkill == newSkill)                       { return;}; //
 
    // меняем талант
    Npc_SetTalentSkill(npc,talent,newSkill);

Пояни, пожалуйста, а где здесь указывать конкретный талант и условия?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
KirTheSeeker, я проверял код перед тем как выложить. у меня всё работало. если у тебя не работает значит или ты часть выкинул или переписал как тебе "кажется" правильным.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
@KirTheSeeker, я проверял код перед тем как выложить. у меня всё работало.
Т.е. у тебя, при снятии/надевании амулетов или т.п. вещей, дающих бонус к силе/ловкости корректно меняются овер-леи?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
KirTheSeeker, нет конечно. что бы это происходило нужно переписывать другую часть кода. а что бы работала следующий момент который ты озвучил нужно будет переписывать еще кусок, а что бы потом и еще кое что работало надо будет переписывать всё с самого начало и с чистого листа.

ты обозначил задачу в рамках b_addfightskill и показал свой неработающий код. я переписал и оно стало работать(по крайней мере у меня). у тебя я не знаю работает он или нет.

сейчас ты говоришь совершенно о другом, а именно смене навыка при изменение атрибута. такого в оригинальном коде просто нет ;-)

p.s.
при этом еще и шмотки меняют атрибут через Npc_ChangeAttribute в классик.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Приветствую всех вновь.
MW 7 подскажи, пожалуйста, как следует изменить данный скрипт для корректной работы в классике, без разделения на перманентные/бонусные значения атрибутов?
Daedalus:
func int B_Attr_KTS_Hero_talent(var int talent, var int percent)
{
 
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if (talent == NPC_TALENT_1H)
    {
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 60)
        {
            if (ATR_STRENGTH  < 50) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 50) { return ATR_DEXTERITY; };

            return TRUE;
        };
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 30)
        {
            if (ATR_STRENGTH  < 25) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 25) { return ATR_DEXTERITY; };
            // Сила и ловкость ГГ превышает 24 (25 и более), обучение возможно -> TRUE.
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE;     
    };
    
    if (talent == NPC_TALENT_2H)
    {
        if (hero.HitChance[NPC_TALENT_2H] + percent >= 60)
        {
            if (ATR_STRENGTH  < 80) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 30) { return ATR_DEXTERITY; };

            return TRUE;
        };
 
        if (hero.HitChance[NPC_TALENT_2H] + percent >= 30)
        {
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 15) { return ATR_DEXTERITY; };
            
            return TRUE;
        };
 
        return TRUE;     
    };
    
    if (talent == NPC_TALENT_BOW)
    {
        if (hero.HitChance[NPC_TALENT_BOW] + percent >= 60)
        {
            if (ATR_DEXTERITY < 80) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 30) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (hero.HitChance[NPC_TALENT_BOW] + percent >= 30)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 15) { return ATR_STRENGTH;  };
            
            return TRUE;
        };
 
        return TRUE;     
    };
    
    if (talent == NPC_TALENT_CROSSBOW)
    {
        if (hero.HitChance[NPC_TALENT_CROSSBOW] + percent >= 60)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (hero.HitChance[NPC_TALENT_CROSSBOW] + percent >= 30)
        {
            if (ATR_DEXTERITY < 20) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 20) { return ATR_STRENGTH;  };
            
            return TRUE;
        };
 
        return TRUE;     
    };
    
    return 666;
};


func int C_KTS_Hero_Atr_Talent(var int talent, var int percent)
{
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    return TRUE;       
};


func int B_Attr_KTS_Hero_talentLVL(var int talent, var int talentLVL)
{
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if (talent == NPC_TALENT_1H)
    {
        if (talentLVL == 2)
        {
            if (ATR_STRENGTH  < 50) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 50) { return ATR_DEXTERITY; };

            return TRUE;
        };
 
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (talentLVL == 1)
        {
            if (ATR_STRENGTH  < 25) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 25) { return ATR_DEXTERITY; };
            // Сила и ловкость ГГ превышает 24 (25 и более), обучение возможно -> TRUE.
            return TRUE;
        };

        return TRUE;
    };
    if (talent == NPC_TALENT_2H)
    {
        if (talentLVL == 2)
        {
            if (ATR_STRENGTH  < 80) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 30) { return ATR_DEXTERITY; };

            return TRUE;
        };
 
        if (talentLVL == 1)
        {
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 15) { return ATR_DEXTERITY; };

            return TRUE;
        };

        return TRUE;
    };
    if (talent == NPC_TALENT_BOW)
    {
        if (talentLVL == 2)
        {
            if (ATR_DEXTERITY < 80) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 30) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (talentLVL == 1)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 15) { return ATR_STRENGTH;  };
            return TRUE;
        };

        return TRUE;
    };
    if (talent == NPC_TALENT_CROSSBOW)
    {
        if (talentLVL == 2)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (talentLVL == 1)
        {
            if (ATR_DEXTERITY < 20) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 20) { return ATR_STRENGTH;  };
            
            return TRUE;
        };

        return TRUE;
    };
 
    return 666;
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
KirTheSeeker, это не оливье. если всё просто покидать что нравится в проект и перемешать работать не будет. я тебе написал файл под классику с функциями под классику и он работает. пихать в проект классики скрипт из другого проекта с функцией проверки(!) не даст ожидаемого результата. так как если ты даже его отредактируешь, то потом где ты его будешь вызывать? то есть у тебя есть в проекте функция но она не вызывается автоматически, её надо где то прописывать. а как это будет соотносится с порогами обучения у учителей которые в классики более жёсткие чем в НВ?


к силе/ловкости корректно меняются овер-леи
попробуй отредактировать b_raiseattribute
Daedalus:
func void b_raiseattribute(var C_NPC oth,var int attrib,var int points)
{
    var string concattext;
    if(attrib == ATR_STRENGTH)
    {
        oth.attribute[ATR_STRENGTH] += points;
        concattext = ConcatStrings(PRINT_LEARNSTR,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
    if(attrib == ATR_DEXTERITY)
    {
        oth.attribute[ATR_DEXTERITY] += points;
        concattext = ConcatStrings(PRINT_LEARNDEX,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
    if(attrib == ATR_MANA_MAX)
    {
        oth.attribute[ATR_MANA_MAX] += points;
        oth.attribute[ATR_MANA] += points;
        concattext = ConcatStrings(PRINT_LEARNMANA_MAX,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
    if(attrib == ATR_HITPOINTS_MAX)
    {
        oth.attribute[ATR_HITPOINTS_MAX] += points;
        oth.attribute[ATR_HITPOINTS] += points;
        concattext = ConcatStrings(PRINT_LEARNHITPOINTS_MAX,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
   
    B_Addfightskill(oth,NPC_TALENT_1H,0);
    B_Addfightskill(oth,NPC_TALENT_2H,0);
    B_Addfightskill(oth,NPC_TALENT_BOW,0);
    B_Addfightskill(oth,NPC_TALENT_CROSSBOW,0);
   
};

после этого сначала подними навык у учителей. а потом подними силу и ловкость у учителей или зельями. по идеи после изменения силы и ловкости навык сменится. а может быть и нет. если будет меняться тогда можно будет отредактировать кольца и амулеты.
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
после этого сначала подними навык у учителей. а потом подними силу и ловкость у учителей или зельями. по идеи после изменения силы и ловкости навык сменится. а может быть и нет.
Да, теперь уровень таланта корректно меняется при прокачке силы/ловкости. Благодарю.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
KirTheSeeker, соответственно далее в своём проекте ты можешь переделать кольца / амулеты заменив у них Npc_ChangeAttribute на b_raiseattribute
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
KirTheSeeker, соответственно далее в своём проекте ты можешь переделать кольца / амулеты заменив у них Npc_ChangeAttribute на b_raiseattribute
А как теперь можно здесь добавить проверку атрибутов при прокачке навыка у учителей, чтобы игрок получал соответствующие уведомления?

Daedalus:
func int B_Attr_KTS_Hero_talent(var int talent, var int percent)
{
 
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if (talent == NPC_TALENT_1H)
    {
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 60)
        {
            if (ATR_STRENGTH  < 50) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 50) { return ATR_DEXTERITY; };

            return TRUE;
        };
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
       
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 30)
        {
            if (ATR_STRENGTH  < 25) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 25) { return ATR_DEXTERITY; };
            // Сила и ловкость ГГ превышает 24 (25 и более), обучение возможно -> TRUE.
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE;    
    };
   
    if (talent == NPC_TALENT_2H)
    {
        if (hero.HitChance[NPC_TALENT_2H] + percent >= 60)
        {
            if (ATR_STRENGTH  < 80) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 30) { return ATR_DEXTERITY; };

            return TRUE;
        };
 
        if (hero.HitChance[NPC_TALENT_2H] + percent >= 30)
        {
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 15) { return ATR_DEXTERITY; };
           
            return TRUE;
        };
 
        return TRUE;    
    };
   
    if (talent == NPC_TALENT_BOW)
    {
        if (hero.HitChance[NPC_TALENT_BOW] + percent >= 60)
        {
            if (ATR_DEXTERITY < 80) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 30) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (hero.HitChance[NPC_TALENT_BOW] + percent >= 30)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 15) { return ATR_STRENGTH;  };
           
            return TRUE;
        };
 
        return TRUE;    
    };
   
    if (talent == NPC_TALENT_CROSSBOW)
    {
        if (hero.HitChance[NPC_TALENT_CROSSBOW] + percent >= 60)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (hero.HitChance[NPC_TALENT_CROSSBOW] + percent >= 30)
        {
            if (ATR_DEXTERITY < 20) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 20) { return ATR_STRENGTH;  };
           
            return TRUE;
        };
 
        return TRUE;    
    };
   
    return 666;
};


func int C_KTS_Hero_Atr_Talent(var int talent, var int percent)
{
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    return TRUE;      
};


func int B_Attr_KTS_Hero_talentLVL(var int talent, var int talentLVL)
{
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if (talent == NPC_TALENT_1H)
    {
        if (talentLVL == 2)
        {
            if (ATR_STRENGTH  < 50) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 50) { return ATR_DEXTERITY; };

            return TRUE;
        };
 
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (talentLVL == 1)
        {
            if (ATR_STRENGTH  < 25) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 25) { return ATR_DEXTERITY; };
            // Сила и ловкость ГГ превышает 24 (25 и более), обучение возможно -> TRUE.
            return TRUE;
        };

        return TRUE;
    };
    if (talent == NPC_TALENT_2H)
    {
        if (talentLVL == 2)
        {
            if (ATR_STRENGTH  < 80) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 30) { return ATR_DEXTERITY; };

            return TRUE;
        };
 
        if (talentLVL == 1)
        {
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };
            if (ATR_DEXTERITY < 15) { return ATR_DEXTERITY; };

            return TRUE;
        };

        return TRUE;
    };
    if (talent == NPC_TALENT_BOW)
    {
        if (talentLVL == 2)
        {
            if (ATR_DEXTERITY < 80) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 30) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (talentLVL == 1)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 15) { return ATR_STRENGTH;  };
            return TRUE;
        };

        return TRUE;
    };
    if (talent == NPC_TALENT_CROSSBOW)
    {
        if (talentLVL == 2)
        {
            if (ATR_DEXTERITY < 40) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 40) { return ATR_STRENGTH;  };

            return TRUE;
        };
 
        if (talentLVL == 1)
        {
            if (ATR_DEXTERITY < 20) { return ATR_DEXTERITY; };
            if (ATR_STRENGTH  < 20) { return ATR_STRENGTH;  };
           
            return TRUE;
        };

        return TRUE;
    };
 
    return 666;
};

Daedalus:
func int b_teachfighttalentpercent(var C_NPC slf,var C_NPC oth,var int talent,var int percent,var int teachermax)
{
    var string concattext;
    var int kosten;
    var int realhitchance;
   
    kosten = b_getlearncosttalent(oth,talent) * percent;
    if((talent != NPC_TALENT_1H) && (talent != NPC_TALENT_2H) && (talent != NPC_TALENT_BOW) && (talent != NPC_TALENT_CROSSBOW))
    {
        Print("*** ОШИБКА: неправильный параметр ***");
        return FALSE;
    };
    if(talent == NPC_TALENT_1H)
    {
        realhitchance = oth.hitchance[NPC_TALENT_1H];
    }
    else if(talent == NPC_TALENT_2H)
    {
        realhitchance = oth.hitchance[NPC_TALENT_2H];
    }
    else if(talent == NPC_TALENT_BOW)
    {
        realhitchance = oth.hitchance[NPC_TALENT_BOW];
    }
    else if(talent == NPC_TALENT_CROSSBOW)
    {
        realhitchance = oth.hitchance[NPC_TALENT_CROSSBOW];
    };
    if(realhitchance >= teachermax)
    {
        concattext = ConcatStrings(PRINT_NOLEARNOVERPERSONALMAX,IntToString(teachermax));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNYOUREBETTER");
        return FALSE;
    };
    if((realhitchance + percent) > teachermax)
    {
        concattext = ConcatStrings(PRINT_NOLEARNOVERPERSONALMAX,IntToString(teachermax));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNOVERPERSONALMAX");
        return FALSE;
    };
   
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        B_Say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        B_Say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
   
    if(oth.lp < kosten)
    {
        PrintScreen(PRINT_NOTENOUGHLP,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
   
    oth.lp = oth.lp - kosten;
    if(talent == NPC_TALENT_1H)
    {
        if((hero.hitchance[NPC_TALENT_1H] - hero.hitchance[NPC_TALENT_2H]) >= 50)
        {
            b_addfightskill(oth,NPC_TALENT_1H,percent);
            b_addfightskill(oth,NPC_TALENT_2H,percent);
            PrintScreen(PRINT_LEARN1H_AND_2H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_1H,percent);
            PrintScreen(PRINT_LEARN1H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    if(talent == NPC_TALENT_2H)
    {
        if((hero.hitchance[NPC_TALENT_2H] - hero.hitchance[NPC_TALENT_1H]) >= 50)
        {
            b_addfightskill(oth,NPC_TALENT_2H,percent);
            b_addfightskill(oth,NPC_TALENT_1H,percent);
            PrintScreen(PRINT_LEARN2H_AND_1H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_2H,percent);
            PrintScreen(PRINT_LEARN2H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    if(talent == NPC_TALENT_BOW)
    {
        if((hero.hitchance[NPC_TALENT_BOW] - hero.hitchance[NPC_TALENT_CROSSBOW]) >= 75)
        {
            b_addfightskill(oth,NPC_TALENT_BOW,percent);
            b_addfightskill(oth,NPC_TALENT_CROSSBOW,percent);
            PrintScreen(PRINT_LEARNBOW_AND_CROSSBOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_BOW,percent);
            PrintScreen(PRINT_LEARNBOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    if(talent == NPC_TALENT_CROSSBOW)
    {
        if((hero.hitchance[NPC_TALENT_CROSSBOW] - hero.hitchance[NPC_TALENT_BOW]) >= 75)
        {
            b_addfightskill(oth,NPC_TALENT_CROSSBOW,percent);
            b_addfightskill(oth,NPC_TALENT_BOW,percent);
            PrintScreen(PRINT_LEARNCROSSBOW_AND_BOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_CROSSBOW,percent);
            PrintScreen(PRINT_LEARNCROSSBOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    return FALSE;
};

При текущем раскладе сообщения отображаются корректно, но тормозится на первом этапе, будто у ГГ всегда не хватает силы, т.е. на даёт качать навык дальше.
Пост автоматически объединён:

С амулетами тоже всё работает, правда смущает сообщение при снятии "Ловкость + -15".
Daedalus:
instance ITAM_DEX_01(C_ITEM)
{
    name = NAME_AMULETT;
    mainflag = ITEM_KAT_MAGIC;
    flags = ITEM_AMULET;
    value = VALUE_AM_DEX;
    visual = "ItAm_Dex_01.3ds";
    visual_skin = 0;
    material = MAT_METAL;
    on_equip = equip_itam_dex_01;
    on_unequip = unequip_itam_dex_01;
    description = "Амулет ловкости";
    text[2] = NAME_BONUS_DEX;
    count[2] = AM_DEX;
    text[5] = NAME_VALUE;
    count[5] = value;
    inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
};


func void equip_itam_dex_01()
{
//    Npc_ChangeAttribute(self,ATR_DEXTERITY,AM_DEX);
    b_raiseattribute(self,ATR_DEXTERITY,AM_DEX);
};

func void unequip_itam_dex_01()
{
//    Npc_ChangeAttribute(self,ATR_DEXTERITY,-AM_DEX);
    b_raiseattribute(self,ATR_DEXTERITY,-AM_DEX);
};
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
Daedalus:
func int b_teachfighttalentpercent(var C_NPC slf,var C_NPC oth,var int talent,var int percent,var int teachermax)
{
    ...
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        return C_KTS_Hero_Atr_Talent(talent,percent);
    };

Daedalus:
func int B_Attr_KTS_Hero_talent(var int talent, var int percent)
{
 
    var int value;
    var int newSkill;   
 
    if (talent == NPC_TALENT_1H)
    {
        value = hero.HitChance[NPC_TALENT_1H] + percent;
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
          
        if (ATR_STRENGTH  < 25 * newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 25 * newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
  
    if (talent == NPC_TALENT_2H)
    {
        value = hero.HitChance[NPC_TALENT_2H] + percent;
      
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
      
        if (ATR_STRENGTH  < 40*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
  

    if (talent == NPC_TALENT_BOW)
    {
        value = hero.HitChance[NPC_TALENT_BOW] + percent;
      
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
      
        if (ATR_STRENGTH  < 40*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    }; 
  
    if (talent == NPC_TALENT_CROSSBOW)
    {
        value = hero.HitChance[NPC_TALENT_CROSSBOW] + percent;
      
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
      
        if (ATR_STRENGTH  < 20*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 20*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    }; 

    return 666;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Daedalus:
func int b_teachfighttalentpercent(var C_NPC slf,var C_NPC oth,var int talent,var int percent,var int teachermax)
{
    ...
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        return C_KTS_Hero_Atr_Talent(talent,percent);
    };

Daedalus:
func int B_Attr_KTS_Hero_talent(var int talent, var int percent)
{
 
    var int value;
    var int newSkill;  
 
    if (talent == NPC_TALENT_1H)
    {
        value = hero.HitChance[NPC_TALENT_1H] + percent;
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
         
        if (ATR_STRENGTH  < 25 * newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 25 * newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
 
    if (talent == NPC_TALENT_2H)
    {
        value = hero.HitChance[NPC_TALENT_2H] + percent;
     
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
     
        if (ATR_STRENGTH  < 40*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
 

    if (talent == NPC_TALENT_BOW)
    {
        value = hero.HitChance[NPC_TALENT_BOW] + percent;
     
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
     
        if (ATR_STRENGTH  < 40*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
 
    if (talent == NPC_TALENT_CROSSBOW)
    {
        value = hero.HitChance[NPC_TALENT_CROSSBOW] + percent;
     
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
     
        if (ATR_STRENGTH  < 20*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 20*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };

    return 666;
};
Всё равно не хочет - пишет "Не хватает силы.." при попытке прокачать любой боевой навык выше 30% и всё. В чём может быть загвоздка?

Daedalus:
func int B_Attr_KTS_Hero_talent(var int talent, var int percent)
{
 
    var int value;
    var int newSkill;   
 
    if (talent == NPC_TALENT_1H)
    {
        value = hero.HitChance[NPC_TALENT_1H] + percent;
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };

        if (ATR_STRENGTH  < 25 * newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 25 * newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };

    if (talent == NPC_TALENT_2H)
    {
        value = hero.HitChance[NPC_TALENT_2H] + percent;
      
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
      
        if (ATR_STRENGTH  < 40*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
 

    if (talent == NPC_TALENT_BOW)
    {
        value = hero.HitChance[NPC_TALENT_BOW] + percent;
      
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
      
        if (ATR_STRENGTH  < 40*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
 
    if (talent == NPC_TALENT_CROSSBOW)
    {
        value = hero.HitChance[NPC_TALENT_CROSSBOW] + percent;
      
        newSkill = (value / 30);    if (newSkill > 2)   { newSkill = 2; };
      
        if (ATR_STRENGTH  < 20*newSkill) { return ATR_STRENGTH;  };
        if (ATR_DEXTERITY < 20*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };

    return 666;
};


func int C_KTS_Hero_Atr_Talent(var int talent, var int percent)
{
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    return TRUE;       
};

Daedalus:
func int b_teachfighttalentpercent(var C_NPC slf,var C_NPC oth,var int talent,var int percent,var int teachermax)
{
    var string concattext;
    var int kosten;
    var int realhitchance;
    
    kosten = b_getlearncosttalent(oth,talent) * percent;
    if((talent != NPC_TALENT_1H) && (talent != NPC_TALENT_2H) && (talent != NPC_TALENT_BOW) && (talent != NPC_TALENT_CROSSBOW))
    {
        Print("*** ОШИБКА: неправильный параметр ***");
        return FALSE;
    };
    if(talent == NPC_TALENT_1H)
    {
        realhitchance = oth.hitchance[NPC_TALENT_1H];
    }
    else if(talent == NPC_TALENT_2H)
    {
        realhitchance = oth.hitchance[NPC_TALENT_2H];
    }
    else if(talent == NPC_TALENT_BOW)
    {
        realhitchance = oth.hitchance[NPC_TALENT_BOW];
    }
    else if(talent == NPC_TALENT_CROSSBOW)
    {
        realhitchance = oth.hitchance[NPC_TALENT_CROSSBOW];
    };
    if(realhitchance >= teachermax)
    {
        concattext = ConcatStrings(PRINT_NOLEARNOVERPERSONALMAX,IntToString(teachermax));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNYOUREBETTER");
        return FALSE;
    };
    if((realhitchance + percent) > teachermax)
    {
        concattext = ConcatStrings(PRINT_NOLEARNOVERPERSONALMAX,IntToString(teachermax));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNOVERPERSONALMAX");
        return FALSE;
    };

    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        return C_KTS_Hero_Atr_Talent(talent,percent);
    };
    if (B_Attr_KTS_Hero_talent(talent,percent) == ATR_STRENGTH)
    {
        return C_KTS_Hero_Atr_Talent(talent,percent);
    };

    if(oth.lp < kosten)
    {
        PrintScreen(PRINT_NOTENOUGHLP,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    
    oth.lp = oth.lp - kosten;
    if(talent == NPC_TALENT_1H)
    {
        if((hero.hitchance[NPC_TALENT_1H] - hero.hitchance[NPC_TALENT_2H]) >= 50)
        {
            b_addfightskill(oth,NPC_TALENT_1H,percent);
            b_addfightskill(oth,NPC_TALENT_2H,percent);
            PrintScreen(PRINT_LEARN1H_AND_2H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_1H,percent);
            PrintScreen(PRINT_LEARN1H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    if(talent == NPC_TALENT_2H)
    {
        if((hero.hitchance[NPC_TALENT_2H] - hero.hitchance[NPC_TALENT_1H]) >= 50)
        {
            b_addfightskill(oth,NPC_TALENT_2H,percent);
            b_addfightskill(oth,NPC_TALENT_1H,percent);
            PrintScreen(PRINT_LEARN2H_AND_1H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_2H,percent);
            PrintScreen(PRINT_LEARN2H,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    if(talent == NPC_TALENT_BOW)
    {
        if((hero.hitchance[NPC_TALENT_BOW] - hero.hitchance[NPC_TALENT_CROSSBOW]) >= 75)
        {
            b_addfightskill(oth,NPC_TALENT_BOW,percent);
            b_addfightskill(oth,NPC_TALENT_CROSSBOW,percent);
            PrintScreen(PRINT_LEARNBOW_AND_CROSSBOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_BOW,percent);
            PrintScreen(PRINT_LEARNBOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    if(talent == NPC_TALENT_CROSSBOW)
    {
        if((hero.hitchance[NPC_TALENT_CROSSBOW] - hero.hitchance[NPC_TALENT_BOW]) >= 75)
        {
            b_addfightskill(oth,NPC_TALENT_CROSSBOW,percent);
            b_addfightskill(oth,NPC_TALENT_BOW,percent);
            PrintScreen(PRINT_LEARNCROSSBOW_AND_BOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        }
        else
        {
            b_addfightskill(oth,NPC_TALENT_CROSSBOW,percent);
            PrintScreen(PRINT_LEARNCROSSBOW,-1,-1,FONT_SCREEN,2);
            return TRUE;
        };
    };
    return FALSE;
};

Daedalus:
func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{
    var int value;
    
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 60) && (slf.attribute[ATR_STRENGTH] >= 50) && (slf.attribute[ATR_DEXTERITY] >= 50)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
            Mdl_ApplyOverlayMds(slf,"humans_1hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_1H] >= 30) && (slf.attribute[ATR_STRENGTH] >= 25) && (slf.attribute[ATR_DEXTERITY] >= 25)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
            Mdl_ApplyOverlayMds(slf,"humans_1hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,0);
            Mdl_RemoveOverlayMDS(slf,"humans_1hST1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_1hST2.MDS");
        };
    };
    
    if(talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] += percent;
        if(slf.HitChance[NPC_TALENT_2H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_2H] >= 60) && (slf.attribute[ATR_STRENGTH] >= 80) && (slf.attribute[ATR_DEXTERITY] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,2);
            Mdl_ApplyOverlayMds(slf,"humans_2hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_2H] >= 30) && (slf.attribute[ATR_STRENGTH] >= 40) && (slf.attribute[ATR_DEXTERITY] >= 15)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,1);
            Mdl_ApplyOverlayMds(slf,"humans_2hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,0);
            Mdl_RemoveOverlayMDS(slf,"humans_2hST1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_2hST2.MDS");
        };
    };
    
    if(talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] += percent;
        if(slf.HitChance[NPC_TALENT_BOW] > 100)
        {
            slf.HitChance[NPC_TALENT_BOW] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_BOW] >= 60) && (slf.attribute[ATR_DEXTERITY] >= 80) && (slf.attribute[ATR_STRENGTH] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_bowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_BOW] >= 30) && (slf.attribute[ATR_DEXTERITY] >= 40) && (slf.attribute[ATR_STRENGTH] >= 15)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_bowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,0);
            Mdl_RemoveOverlayMDS(slf,"humans_bowT1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_bowT2.MDS");
        };
    };
    
    if(talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] += percent;
        if(slf.HitChance[NPC_TALENT_CROSSBOW] > 100)
        {
            slf.HitChance[NPC_TALENT_CROSSBOW] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 60) && (slf.attribute[ATR_DEXTERITY] >= 40) && (slf.attribute[ATR_STRENGTH] >= 40)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 30) && (slf.attribute[ATR_DEXTERITY] >= 20) && (slf.attribute[ATR_STRENGTH] >= 20)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,0);
            Mdl_RemoveOverlayMDS(slf,"humans_cbowT1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_cbowT2.MDS");
        };
    };
};

Daedalus:
func void b_raiseattribute(var C_NPC oth,var int attrib,var int points)
{   
    var string concattext;
    
    if(attrib == ATR_STRENGTH)
    {
        oth.attribute[ATR_STRENGTH] += points;
        oth.attribute[ATR_HITPOINTS_MAX] += points * 2;
        oth.attribute[ATR_HITPOINTS] += points * 2;
        concattext = ConcatStrings(PRINT_LEARNSTR,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
    if(attrib == ATR_DEXTERITY)
    {
        oth.attribute[ATR_DEXTERITY] += points;
        oth.attribute[ATR_HITPOINTS_MAX] += points;
        oth.attribute[ATR_HITPOINTS] += points;
        concattext = ConcatStrings(PRINT_LEARNDEX,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
    if(attrib == ATR_MANA_MAX)
    {
        oth.attribute[ATR_MANA_MAX] += points;
        oth.attribute[ATR_MANA] += points;
        concattext = ConcatStrings(PRINT_LEARNMANA_MAX,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
    if(attrib == ATR_HITPOINTS_MAX)
    {
        oth.attribute[ATR_HITPOINTS_MAX] += points;
        oth.attribute[ATR_HITPOINTS] += points;
        concattext = ConcatStrings(PRINT_LEARNHITPOINTS_MAX,IntToString(points));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
    };
    
    B_Addfightskill(oth,NPC_TALENT_1H,0);
    B_Addfightskill(oth,NPC_TALENT_2H,0);
    B_Addfightskill(oth,NPC_TALENT_BOW,0);
    B_Addfightskill(oth,NPC_TALENT_CROSSBOW,0);
    
};

Daedalus:
instance PC_HERO(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_NONE;
    id = 0;
    voice = 15;
    level = 0;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 0;
    exp_next = 500;
    lp = 0;
    attribute[ATR_STRENGTH] = 10;
    attribute[ATR_DEXTERITY] = 10;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 30;
    attribute[ATR_HITPOINTS] = 30;
    Mdl_SetVisual(self,"HUMANS.MDS");
    Mdl_SetVisualBody(self,"hum_body_Naked0",BODYTEX_PLAYER_G2,0,"Hum_Head_Pony",FACE_N_PLAYER,0,NO_ARMOR);
    b_setfightskills(self,5);
    Npc_SetTalentSkill(self,NPC_TALENT_1H,0);
    Npc_SetTalentSkill(self,NPC_TALENT_2H,0);
    Npc_SetTalentSkill(self,NPC_TALENT_BOW,0);
    Npc_SetTalentSkill(self,NPC_TALENT_CROSSBOW,0);
};

instance PC_L3(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_NONE;
    id = 0;
    voice = 15;
    level = 3;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 3000;
    exp_next = 5000;
    lp = 0;
    attribute[ATR_STRENGTH] = 20;
    attribute[ATR_DEXTERITY] = 10;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 76;
    attribute[ATR_HITPOINTS] = 76;
    b_setnpcvisual(self,MALE,"Hum_Head_Pony",FACE_N_PLAYER,BODYTEX_N,itar_leather_l);
    b_addfightskill(self,NPC_TALENT_1H,30);
    b_addfightskill(self,NPC_TALENT_2H,10);
    b_addfightskill(self,NPC_TALENT_BOW,10);
    b_addfightskill(self,NPC_TALENT_CROSSBOW,10);
    CreateInvItems(self,itmi_gold,100);
    CreateInvItems(self,itrw_bolt,100);
    EquipItem(self,itmw_1h_vlk_sword);
    EquipItem(self,itrw_crossbow_l_01);
};

instance PC_L9(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_MIL;
    id = 0;
    voice = 15;
    level = 9;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 22500;
    exp_next = 27500;
    lp = 0;
    attribute[ATR_STRENGTH] = 40;
    attribute[ATR_DEXTERITY] = 30;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 148;
    attribute[ATR_HITPOINTS] = 148;
    b_setnpcvisual(self,MALE,"Hum_Head_Pony",FACE_N_PLAYER,BODYTEX_N,itar_mil_l);
    b_addfightskill(self,NPC_TALENT_1H,30);
    b_addfightskill(self,NPC_TALENT_2H,10);
    b_addfightskill(self,NPC_TALENT_BOW,30);
    b_addfightskill(self,NPC_TALENT_CROSSBOW,10);
    CreateInvItems(self,itmi_gold,100);
    CreateInvItems(self,itrw_arrow,100);
    EquipItem(self,itmw_bartaxt);
    EquipItem(self,itrw_bow_l_03);
};

instance PC_L19(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_PAL;
    id = 0;
    voice = 15;
    level = 19;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 95000;
    exp_next = 105000;
    lp = 0;
    attribute[ATR_STRENGTH] = 65;
    attribute[ATR_DEXTERITY] = 55;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 148;
    attribute[ATR_HITPOINTS] = 148;
    b_setnpcvisual(self,MALE,"Hum_Head_Pony",FACE_N_PLAYER,BODYTEX_N,itar_pal_m);
    b_addfightskill(self,NPC_TALENT_1H,60);
    b_addfightskill(self,NPC_TALENT_2H,30);
    b_addfightskill(self,NPC_TALENT_BOW,30);
    b_addfightskill(self,NPC_TALENT_CROSSBOW,10);
    CreateInvItems(self,itmi_gold,100);
    CreateInvItems(self,itrw_arrow,100);
    CreateInvItems(self,itrw_bolt,100);
    EquipItem(self,itmw_elbastardo);
    EquipItem(self,itrw_bow_m_01);
    CreateInvItems(self,itru_pallight,1);
    CreateInvItems(self,itru_pallightheal,1);
    CreateInvItems(self,itru_palholybolt,1);
};

instance PC_L25(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_DJG;
    id = 0;
    voice = 15;
    level = 25;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 162500;
    exp_next = 175500;
    lp = 0;
    attribute[ATR_STRENGTH] = 80;
    attribute[ATR_DEXTERITY] = 65;
    attribute[ATR_MANA_MAX] = 20;
    attribute[ATR_MANA] = 20;
    attribute[ATR_HITPOINTS_MAX] = 290;
    attribute[ATR_HITPOINTS] = 290;
    b_setnpcvisual(self,MALE,"Hum_Head_Pony",FACE_N_PLAYER,BODYTEX_N,itar_djg_m);
    b_addfightskill(self,NPC_TALENT_1H,70);
    b_addfightskill(self,NPC_TALENT_2H,30);
    b_addfightskill(self,NPC_TALENT_BOW,50);
    b_addfightskill(self,NPC_TALENT_CROSSBOW,30);
    Npc_SetTalentSkill(self,NPC_TALENT_PICKLOCK,1);
    CreateInvItems(self,itmi_gold,500);
    CreateInvItems(self,itrw_arrow,100);
    EquipItem(self,itmw_orkschlaechter);
    EquipItem(self,itrw_bow_m_04);
    CreateInvItems(self,itke_lockpick,10);
    CreateInvItems(self,itmi_flask,2);
    CreateInvItems(self,itpo_health_02,10);
    CreateInvItems(self,itpo_speed,5);
    CreateInvItems(self,itlstorch,50);
};

instance PC_L31(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_PAL;
    id = 0;
    voice = 15;
    level = 31;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 248000;
    exp_next = 264000;
    lp = 0;
    attribute[ATR_STRENGTH] = 100;
    attribute[ATR_DEXTERITY] = 70;
    attribute[ATR_MANA_MAX] = 40;
    attribute[ATR_MANA] = 40;
    attribute[ATR_HITPOINTS_MAX] = 412;
    attribute[ATR_HITPOINTS] = 412;
    b_setnpcvisual(self,MALE,"Hum_Head_Pony",FACE_N_PLAYER,BODYTEX_N,itar_pal_h);
    b_addfightskill(self,NPC_TALENT_1H,50);
    b_addfightskill(self,NPC_TALENT_2H,80);
    b_addfightskill(self,NPC_TALENT_BOW,30);
    b_addfightskill(self,NPC_TALENT_CROSSBOW,50);
    CreateInvItems(self,itmi_gold,500);
    CreateInvItems(self,itrw_bolt,100);
    EquipItem(self,itmw_2h_blessed_03);
    EquipItem(self,itrw_crossbow_h_02);
    CreateInvItems(self,itru_pallight,1);
    CreateInvItems(self,itru_pallightheal,1);
    CreateInvItems(self,itru_palholybolt,1);
    CreateInvItems(self,itru_palmediumheal,1);
    CreateInvItems(self,itru_palrepelevil,1);
    CreateInvItems(self,itru_palfullheal,1);
    CreateInvItems(self,itru_paldestroyevil,1);
};

instance PC_E3MAGE(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_KDF;
    id = 0;
    voice = 15;
    level = 31;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 248000;
    exp_next = 264000;
    lp = 0;
    attribute[ATR_STRENGTH] = 50;
    attribute[ATR_DEXTERITY] = 50;
    attribute[ATR_MANA_MAX] = 200;
    attribute[ATR_MANA] = 200;
    attribute[ATR_HITPOINTS_MAX] = 500;
    attribute[ATR_HITPOINTS] = 500;
    b_setnpcvisual(self,MALE,"Hum_Head_Pony",FACE_N_PLAYER,BODYTEX_N,itar_kdf_h);
    b_addfightskill(self,NPC_TALENT_1H,40);
    b_addfightskill(self,NPC_TALENT_2H,30);
    b_addfightskill(self,NPC_TALENT_BOW,20);
    b_addfightskill(self,NPC_TALENT_CROSSBOW,10);
    Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6);
    Npc_SetTalentSkill(self,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(self,NPC_TALENT_ALCHEMY,1);
    Npc_SetTalentSkill(self,NPC_TALENT_TAKEANIMALTROPHY,1);
    PLAYER_TALENT_ALCHEMY[POTION_HEALTH_01] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_HEALTH_02] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_HEALTH_03] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_MANA_01] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_MANA_02] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_MANA_03] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_SPEED] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_PERM_STR] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_PERM_DEX] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_PERM_MANA] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_PERM_HEALTH] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_TEETH] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_CLAWS] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_FUR] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_HEART] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_SHADOWHORN] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_FIRETONGUE] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFWING] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFSTING] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_MANDIBLES] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_CRAWLERPLATE] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DRGSNAPPERHORN] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DRAGONSCALE] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DRAGONBLOOD] = TRUE;
    PLAYER_TALENT_RUNES[SPL_LIGHT] = TRUE;
    PLAYER_TALENT_RUNES[SPL_FIREBOLT] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ICEBOLT] = TRUE;
    PLAYER_TALENT_RUNES[SPL_LIGHTHEAL] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SUMMONGOBLINSKELETON] = TRUE;
    PLAYER_TALENT_RUNES[SPL_INSTANTFIREBALL] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ZAP] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SUMMONWOLF] = TRUE;
    PLAYER_TALENT_RUNES[SPL_WINDFIST] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SLEEP] = TRUE;
    PLAYER_TALENT_RUNES[SPL_MEDIUMHEAL] = TRUE;
    PLAYER_TALENT_RUNES[SPL_LIGHTNINGFLASH] = TRUE;
    PLAYER_TALENT_RUNES[SPL_CHARGEFIREBALL] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SUMMONSKELETON] = TRUE;
    PLAYER_TALENT_RUNES[SPL_FEAR] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ICECUBE] = TRUE;
    PLAYER_TALENT_RUNES[SPL_CHARGEZAP] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SUMMONGOLEM] = TRUE;
    PLAYER_TALENT_RUNES[SPL_DESTROYUNDEAD] = TRUE;
    PLAYER_TALENT_RUNES[SPL_PYROKINESIS] = TRUE;
    PLAYER_TALENT_RUNES[SPL_FIRESTORM] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ICEWAVE] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SUMMONDEMON] = TRUE;
    PLAYER_TALENT_RUNES[SPL_FULLHEAL] = TRUE;
    PLAYER_TALENT_RUNES[SPL_FIRERAIN] = TRUE;
    PLAYER_TALENT_RUNES[SPL_BREATHOFDEATH] = TRUE;
    PLAYER_TALENT_RUNES[SPL_MASSDEATH] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ARMYOFDARKNESS] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SHRINK] = TRUE;
    EquipItem(self,itmw_1h_misc_sword);
    EquipItem(self,itam_mana_01);
    EquipItem(self,itru_light);
    EquipItem(self,itru_instantfireball);
    EquipItem(self,itru_icecube);
    EquipItem(self,itru_fullheal);
    EquipItem(self,itru_firerain);
    EquipItem(self,itru_lightningflash);
    EquipItem(self,itru_shrink);
    CreateInvItems(self,itmi_gold,100);
    CreateInvItems(self,itru_massdeath,1);
    CreateInvItems(self,itru_armyofdarkness,1);
    CreateInvItems(self,itru_sumgol,1);
    CreateInvItems(self,itsc_trfsheep,5);
    CreateInvItems(self,itsc_trfwolf,5);
    CreateInvItems(self,itsc_trfdragonsnapper,3);
    CreateInvItems(self,itmi_flask,10);
    CreateInvItems(self,itmi_runeblank,10);
    CreateInvItems(self,itmi_sulfur,10);
    CreateInvItems(self,itmi_quartz,10);
    CreateInvItems(self,itmi_pitch,10);
    CreateInvItems(self,itmi_rockcrystal,10);
    CreateInvItems(self,itmi_aquamarine,10);
    CreateInvItems(self,itmi_holywater,10);
    CreateInvItems(self,itmi_coal,10);
    CreateInvItems(self,itmi_darkpearl,10);
    CreateInvItems(self,itpl_swampherb,10);
    CreateInvItems(self,itpl_mana_herb_01,10);
    CreateInvItems(self,itpl_mana_herb_02,10);
    CreateInvItems(self,itpl_mana_herb_03,10);
    CreateInvItems(self,itpl_health_herb_01,10);
    CreateInvItems(self,itpl_health_herb_02,10);
    CreateInvItems(self,itpl_health_herb_03,10);
    CreateInvItems(self,itpl_dex_herb_01,10);
    CreateInvItems(self,itpl_strength_herb_01,10);
    CreateInvItems(self,itpl_speed_herb_01,10);
    CreateInvItems(self,itpl_mushroom_01,10);
    CreateInvItems(self,itpl_mushroom_02,10);
    CreateInvItems(self,itpl_forestberry,10);
    CreateInvItems(self,itpl_blueplant,10);
    CreateInvItems(self,itpl_planeberry,10);
    CreateInvItems(self,itpl_temp_herb,10);
    CreateInvItems(self,itpl_perm_herb,10);
    CreateInvItems(self,itpo_mana_01,10);
    CreateInvItems(self,itpo_mana_02,5);
    CreateInvItems(self,itpo_mana_03,1);
    CreateInvItems(self,itpo_health_01,10);
    CreateInvItems(self,itpo_health_02,5);
    CreateInvItems(self,itpo_health_03,1);
    CreateInvItems(self,itpo_speed,5);
};

instance PC_E3PALADIN(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_PAL;
    id = 0;
    voice = 15;
    level = 31;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 248000;
    exp_next = 264000;
    lp = 0;
    attribute[ATR_STRENGTH] = 100;
    attribute[ATR_DEXTERITY] = 100;
    attribute[ATR_MANA_MAX] = 50;
    attribute[ATR_MANA] = 50;
    attribute[ATR_HITPOINTS_MAX] = 500;
    attribute[ATR_HITPOINTS] = 500;
    b_setnpcvisual(self,MALE,"Hum_Head_Pony",FACE_N_PLAYER,BODYTEX_N,itar_pal_h);
    b_addfightskill(self,NPC_TALENT_1H,100);
    b_addfightskill(self,NPC_TALENT_2H,90);
    b_addfightskill(self,NPC_TALENT_BOW,80);
    b_addfightskill(self,NPC_TALENT_CROSSBOW,70);
    Npc_SetTalentSkill(self,NPC_TALENT_MAGE,0);
    Npc_SetTalentSkill(self,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(self,NPC_TALENT_TAKEANIMALTROPHY,1);
    PLAYER_TALENT_SMITH[WEAPON_COMMON] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_SPECIAL_01] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_SPECIAL_01] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_SPECIAL_02] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_SPECIAL_02] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_SPECIAL_03] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_SPECIAL_03] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_SPECIAL_04] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_SPECIAL_04] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_TEETH] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_CLAWS] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_FUR] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_HEART] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_SHADOWHORN] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_FIRETONGUE] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFWING] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFSTING] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_MANDIBLES] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_CRAWLERPLATE] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DRGSNAPPERHORN] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DRAGONSCALE] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DRAGONBLOOD] = TRUE;
    EquipItem(self,itmw_2h_pal_sword);
    EquipItem(self,itrw_bow_h_01);
    CreateInvItems(self,itrw_crossbow_h_01,1);
    CreateInvItems(self,itrw_arrow,1000);
    CreateInvItems(self,itrw_bolt,1000);
    EquipItem(self,itam_strg_01);
    EquipItem(self,itru_palmediumheal);
    EquipItem(self,itru_palrepelevil);
    CreateInvItems(self,itmi_gold,100);
    CreateInvItems(self,itmi_nugget,50);
    CreateInvItems(self,itmiswordraw,10);
    CreateInvItems(self,itat_dragonblood,10);
    CreateInvItems(self,itsc_instantfireball,10);
    CreateInvItems(self,itsc_trfsheep,5);
    CreateInvItems(self,itsc_trfwolf,5);
    CreateInvItems(self,itsc_trfdragonsnapper,3);
    CreateInvItems(self,itmi_flask,10);
    CreateInvItems(self,itmi_runeblank,10);
    CreateInvItems(self,itpo_mana_01,10);
    CreateInvItems(self,itpo_mana_02,5);
    CreateInvItems(self,itpo_mana_03,1);
    CreateInvItems(self,itpo_health_01,10);
    CreateInvItems(self,itpo_health_02,5);
    CreateInvItems(self,itpo_health_03,1);
    CreateInvItems(self,itpo_speed,5);
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
ты же сам эти условия вводишь добавляя B_Attr_KTS_Hero_talent в b_teachfighttalentpercent
Да, но прокачка навыка блокируется даже при тренировке силы/ловкости до 90/90, а такого быть не должно. И код вроде бы это исключает.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
Daedalus:
func int b_teachfighttalentpercent(var C_NPC slf,var C_NPC oth,var int talent,var int percent,var int teachermax)
{
    ...
    if((realhitchance + percent) > teachermax)
    {
        concattext = ConcatStrings(PRINT_NOLEARNOVERPERSONALMAX,IntToString(teachermax));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNOVERPERSONALMAX");
        return FALSE;
    };
    if(oth.lp < kosten)
    {
        PrintScreen(PRINT_NOTENOUGHLP,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    if !C_KTS_Hero_Atr_Talent(talent,percent)
    {
        return false;
    };

но прокачка навыка блокируется даже при тренировке силы/ловкости до 90/90, а такого быть не должно.
я же тебе писал ранее, что это не оливье. если всё просто покидать что нравится в проект и перемешать работать не будет. я тебе стараюсь написать простой код, что бы проверить будет ли оно работать или нет. ты хочешь сразу построить звезду смерти и бездумно начинаешь копировать код, дублировать его, перемешивать усложнять. потом приносишь тонну кода и спрашиваешь, а что тут не так? да по мне там всё что ты пишешь не так :)
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Daedalus:
func int b_teachfighttalentpercent(var C_NPC slf,var C_NPC oth,var int talent,var int percent,var int teachermax)
{
    ...
    if((realhitchance + percent) > teachermax)
    {
        concattext = ConcatStrings(PRINT_NOLEARNOVERPERSONALMAX,IntToString(teachermax));
        PrintScreen(concattext,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNOVERPERSONALMAX");
        return FALSE;
    };
    if(oth.lp < kosten)
    {
        PrintScreen(PRINT_NOTENOUGHLP,-1,-1,FONT_SCREEN,2);
        b_say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    if !C_KTS_Hero_Atr_Talent(talent,percent)
    {
        return false;
    };
Всё равно пишет "Не хватает силы.." при попытке прокачать любой боевой навык выше 30%.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
Всё равно пишет "Не хватает силы.." при попытке прокачать любой боевой навык выше 30%.
ATR_STRENGTH это константа. она ВСЕГДА равна 4.
hero.attribute[ATR_STRENGTH] это кол-во силы у НПС которым управляет игрок.

Daedalus:
func int B_Attr_KTS_Hero_talent(var int talent, var int percent)
{
 
    // общая часть
    if      (talent == NPC_TALENT_1H)        { percent += hero.HitChance[NPC_TALENT_1H];}
    else if (talent == NPC_TALENT_2H)        { percent += hero.HitChance[NPC_TALENT_2H];}
    else if (talent == NPC_TALENT_BOW)       { percent += hero.HitChance[NPC_TALENT_BOW];}
    else if (talent == NPC_TALENT_CROSSBOW)  { percent += hero.HitChance[NPC_TALENT_CROSSBOW];};

    var int newSkill;       newSkill = (percent / 30);  
   
    if (newSkill > 2)  
    {
        newSkill = 2;
    };
   
    // условия KirTheSeeker  
    if (talent == NPC_TALENT_1H)
    {  
   
        if (hero.attribute[ATR_STRENGTH]  < 25 * newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 25 * newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
   
    if (talent == NPC_TALENT_2H)
    {      
        if (hero.attribute[ATR_STRENGTH]  < 40*newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
   

    if (talent == NPC_TALENT_BOW)
    {      
        if (hero.attribute[ATR_STRENGTH]  < 40*newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };  
   
    if (talent == NPC_TALENT_CROSSBOW)
    {      
        if (hero.attribute[ATR_STRENGTH]  < 20*newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 20*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };  

    return 666;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
ATR_STRENGTH это константа. она ВСЕГДА равна 4.
hero.attribute[ATR_STRENGTH] это кол-во силы у НПС которым управляет игрок.

Daedalus:
func int B_Attr_KTS_Hero_talent(var int talent, var int percent)
{
 
    // общая часть
    if      (talent == NPC_TALENT_1H)        { percent += hero.HitChance[NPC_TALENT_1H];}
    else if (talent == NPC_TALENT_2H)        { percent += hero.HitChance[NPC_TALENT_2H];}
    else if (talent == NPC_TALENT_BOW)       { percent += hero.HitChance[NPC_TALENT_BOW];}
    else if (talent == NPC_TALENT_CROSSBOW)  { percent += hero.HitChance[NPC_TALENT_CROSSBOW];};

    var int newSkill;       newSkill = (percent / 30); 
  
    if (newSkill > 2) 
    {
        newSkill = 2;
    };
  
    // условия KirTheSeeker 
    if (talent == NPC_TALENT_1H)
    { 
  
        if (hero.attribute[ATR_STRENGTH]  < 25 * newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 25 * newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
  
    if (talent == NPC_TALENT_2H)
    {     
        if (hero.attribute[ATR_STRENGTH]  < 40*newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    };
  

    if (talent == NPC_TALENT_BOW)
    {     
        if (hero.attribute[ATR_STRENGTH]  < 40*newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 15*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    }; 
  
    if (talent == NPC_TALENT_CROSSBOW)
    {     
        if (hero.attribute[ATR_STRENGTH]  < 20*newSkill) { return ATR_STRENGTH;  };
        if (hero.attribute[ATR_DEXTERITY] < 20*newSkill) { return ATR_DEXTERITY; };

        return TRUE;
    }; 

    return 666;
};
Теперь работает корректно. Благодарю.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
я же тебе присылал заново написанный файл с общей функцией(одной) переключения навыка и оверлеев. ты опять понакопировал непонимая что и завтра придешь с новыми вопросами.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
я же тебе присылал заново написанный файл с общей функцией(одной) переключения навыка и оверлеев. ты опять понакопировал непонимая что и завтра придешь с новыми вопросами.
Сейчас попробую.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
972
Баллы
295
я не знаю зачем ты решил чекать навыки в классике... но допустим ты что там написал у тебя навык может перепрыгнуть 100 или уйти в минус.
вот общая функция. то есть ты можешь её вызывать из разных мест и она приводит в соответствия сразу все боевые навыки, а не один. логично что её надо вынести в отдельную функцию? логично. но ты считаешь иначе. ты считаешь что нужно просто копировать код и вставлять. копировать и вставлять. каждый год. а потом писать , а что не так?
Код:
func void B_CheckFightSkill(var C_NPC slf)
{
    if      (slf.HitChance[NPC_TALENT_1H] > 100)
    {
        slf.HitChance[NPC_TALENT_1H] = 100;
    }
    else if (slf.HitChance[NPC_TALENT_1H] < 0)
    {
        slf.HitChance[NPC_TALENT_1H] = 0;
    };
 
    if      (slf.HitChance[NPC_TALENT_2H] > 100)
    {
        slf.HitChance[NPC_TALENT_1H] = 100;
    }
    // неуверн что надо, но пусть будет.
    else if(slf.HitChance[NPC_TALENT_1H] < 0)
    {
        slf.HitChance[NPC_TALENT_1H] = 0;
    };


    // неуверн что надо, но пусть будет.
    if(slf.HitChance[NPC_TALENT_BOW] > 100)
    {
        slf.HitChance[NPC_TALENT_BOW] = 100;
    };
    if(slf.HitChance[NPC_TALENT_CROSSBOW] > 100)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] = 100;
    };
};

вот отдельно функция обновления оверлеев. я не знаю зачем ты решил их обновлять в ручную. ну допустим случилось такая необходимость. вот отдельная функция взята из проекта D36. тоже не нужна? нужна
Код:
func void UpdateOverlay(var C_Npc npc,var int oldSkill,var int newSkill,var string mds1,var string mds2)
{
    if(oldSkill == newSkill)    {        return;    };
 
    if      (oldSkill == 1)     { Mdl_RemoveOverlayMDS(npc,mds1); }
    else if (oldSkill == 2)     { Mdl_RemoveOverlayMDS(npc,mds2); };
 
    if      (newSkill == 1)     { Mdl_ApplyOverlayMds(npc,mds1); }
    else if (newSkill == 2)     { Mdl_ApplyOverlayMds(npc,mds2); };
};
или лучше опять копировать что то там и вставлять наугад, а потом писать "что не так"?

вот ты переключаешь сам навык. опять же отдельная функция с твоими условиями. с отправкой нужных оверлеев которые "клеются" из кусочков в правильно название
Daedalus:
func void B_Npc_SetTalentSkill(var C_Npc npc,var int talent,var int newSkill)
{

    var int oldSkill;    oldSkill = Npc_GetTalentSkill(npc,talent);


    //Hlp_PrintConsole(Str_Format("B_Npc_SetTalentSkill[%s], oldSkill=%i, newSkill=%i",npc.name,oldSkill,newSkill));

    if npc.attribute[ATR_STRENGTH]  < (25*newSkill) { return;}; // условия KirTheSeeker
    if npc.attribute[ATR_DEXTERITY] < (25*newSkill) { return;}; // условия KirTheSeeker

    if (oldSkill == newSkill)                       { return;}; //
 
    // меняем талант
    Npc_SetTalentSkill(npc,talent,newSkill);


    // а точно надо ли обновлять оверлеи скриптами в классике? совсем не уверен в этом
    var string mdstln;  mdstln = "";
 
    if      talent == NPC_TALENT_1H          { mdstln = "1hS"; }
    else if talent == NPC_TALENT_2H          { mdstln = "2hS"; }
    else if talent == NPC_TALENT_BOW         { mdstln = "bow"; }
    else if talent == NPC_TALENT_CROSSBOW    { mdstln = "cbow"; };
 
    mdstln = ConcatStrings("humans_",mdstln);

    var string mds1;    mds1 = ConcatStrings(mdstln,"T1.MDS");  // например humans_cbowT1.MDS
    var string mds2;    mds2 = ConcatStrings(mdstln,"T2.MDS");  // например humans_2hST2.MDS
    
    UpdateOverlay(npc,oldSkill,newSkill,mds1 ,mds2 );
};
и опять в отдельную функцию что бы можно было вызвать откуда угодно. например из диалога с учителем который даёт бонус или еще где то там. или лучше копировать , а потом спрашивать а почему у менять ВСЕГДА срабатывает проверка на силу в коде где вместо силы нпс, стоит константа(цифра 4) которая всегда меньше атрибута, который всегда больше 10.
то есть: если 4 < 10, то конец. ребят а что не так? почему у меня всегда срабатывает это проверка? пойду ещё скопирую кода, вдруг поможет и баг исчезнет.

вот тебе был написан читабельный B_Addfightskill. ни простыня, а компактный код близкий к оригиналу. с выносом всех твоих условий которые ты меняешь через день в отдельные функции, так как их всё равно придётся вызывать из разных мест. что бы ни копировать одно и тоже. и потом не править это в разных местах множа ошибки.
Daedalus:
// код для классик. без НВ.
func void B_Addfightskill(var C_NPC slf,var int talent,var int percent)
{

    if slf.id==0
    {
        //Hlp_PrintConsole(Str_Format("B_Addfightskill[%s], talent=%i,  percent=%i  ",slf.name,talent,percent));
    };
 
    var int value; // запишем hitchance таланта который улучшили
 
    if (talent == NPC_TALENT_1H)
    {
        slf.hitchance[NPC_TALENT_1H] += percent;
        value = slf.hitchance[NPC_TALENT_1H];
    }
    else if(talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] += percent;
        value = slf.HitChance[NPC_TALENT_2H];
    }
    else if(talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] += percent;
        value = slf.HitChance[NPC_TALENT_BOW];
    }
    else if(talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] += percent;
        value = slf.HitChance[NPC_TALENT_CROSSBOW];
    };
 
    B_CheckFightSkill(slf);
    // общий блок для всех
    // newSkill из проекта D36
    var int newSkill;     newSkill = (value / 30);  //  newSkill целое число, то есть 0,1,2,3
    if (newSkill > 2)   { newSkill = 2; }; //  но не больше двух :-)
 
    B_Npc_SetTalentSkill(slf,talent,newSkill);
};
и править тогда нужно не всё одно и тоже, постоянно допуская опечатки и ошибки, а в одном месте. и отладку тогда можно делать в том же месте. и условия которые ты обязательно придумаешь еще так же можно делать в одном месте.
 
Последнее редактирование:
Сверху Снизу