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

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

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

MaGoth

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

Вложения

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
в Use_OneHStonePlate1
Daedalus:
func void Use_OneHStonePlate1()
{
    StoneplateItem = OneHStonePlate;
    StoneplateLevel = 1;
    if (C_SCHasStPlSkill() == FALSE)
    || (C_KTS_Hero_Atr_Talent(NPC_TALENT_1H, OneH_StPlLevel1) == FALSE)
    {
//        CreateInvItem(hero,ItWr_OneHStonePlate1_Addon);
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
    };
    Use_StonePlate();
};
Пост автоматически объединён:

Daedalus:
func int B_TeachFightTalentPercent(var C_Npc slf,var C_Npc oth,var int talent,var int percent,var int teacherMAX)
{
    if (C_KTS_Hero_Atr_Talent(talent,percent) == FALSE)
    {
        return FALSE;
    };

....
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Daedalus:
func int B_TeachFightTalentPercent(var C_Npc slf,var C_Npc oth,var int talent,var int percent,var int teacherMAX)
{
    if (C_KTS_Hero_Atr_Talent(talent,percent) == FALSE)
    {
        return FALSE;
    };

....
Ты предлагаешь на это заменить то, что сейчас прописано в коде? Т.е. вместо
Daedalus:
if (sPerm_Attr_KTS_Hero_talent(talent,percent) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        B_Say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    if (sPerm_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        B_Say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
достаточно выставить там C_KTS_Hero_Atr_Talent ?
Пост автоматически объединён:

в Use_OneHStonePlate1
Daedalus:
func void Use_OneHStonePlate1()
{
    StoneplateItem = OneHStonePlate;
    StoneplateLevel = 1;
    if (C_SCHasStPlSkill() == FALSE)
    || (C_KTS_Hero_Atr_Talent(NPC_TALENT_1H, OneH_StPlLevel1) == FALSE)
    {
//        CreateInvItem(hero,ItWr_OneHStonePlate1_Addon);
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
    };
    Use_StonePlate();
};
Всё равно не хочет:
3.png
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Всё равно не хочет:
какую табличку читаешь?

достаточно выставить там C_KTS_Hero_Atr_Talent ?
да
KirTheSeeker, возьми оригинальный файл IT_Addon_StonePlates.d и добавь в него одну проверку.

Daedalus:
func int C_SCHasStPlSkill()
{
 
    if (C_KTS_Hero_Atr_Talent(StoneplateTalent, StoneplateValue ) != TRUE)
    {
        return FALSE;
    };
    ...


***

в файл B_Perm_Attr_KTS_FightTalent.d добавь

Daedalus:
var int StoneplateTalent;
var int StoneplateValue;

func void B_KTS_Stoneplate_Atr_Talent()
{
    StoneplateValue  = 0;
    StoneplateTalent = 0;
    if (StoneplateItem == OneHStonePlate)
    {
        if      (StoneplateLevel == 1)    { StoneplateTalent = NPC_TALENT_1H; StoneplateValue = OneH_StPlLevel1; }
        else if (StoneplateLevel == 2)    { StoneplateTalent = NPC_TALENT_1H; StoneplateValue = OneH_StPlLevel2; }
        else if (StoneplateLevel == 3)    { StoneplateTalent = NPC_TALENT_1H; StoneplateValue = OneH_StPlLevel3; };
    };
};

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

скинь файл IT_Addon_StonePlates возможно у нас разные версии
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275

Вложения

  • IT_Addon_StonePlates.d
    20,1 KB · Просмотры: 2

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
KirTheSeeker, вот два файла. проверка для табличек сделано по новым функциям ScriptPatch, то есть с минимальными правками.
 

Вложения

  • IT_Addon_StonePlates_D36.zip
    2,2 KB · Просмотры: 3

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
KirTheSeeker, вот два файла. проверка для табличек сделано по новым функциям ScriptPatch, то есть с минимальными правками.
Я запутался... в этом архиве один файл - IT_AddonStonePlates.d.
Взял этот файл и просто заменил на него старый IT_AddonStonePlates.d, не внося никаких правок.

в файл B_Perm_Attr_KTS_FightTalent.d добавь

Daedalus:
var int StoneplateTalent;
var int StoneplateValue;

func void B_KTS_Stoneplate_Atr_Talent()
{
StoneplateValue = 0;
StoneplateTalent = 0;
if (StoneplateItem == OneHStonePlate)
{
if (StoneplateLevel == 1) { StoneplateTalent = NPC_TALENT_1H; StoneplateValue = OneH_StPlLevel1; }
else if (StoneplateLevel == 2) { StoneplateTalent = NPC_TALENT_1H; StoneplateValue = OneH_StPlLevel2; }
else if (StoneplateLevel == 3) { StoneplateTalent = NPC_TALENT_1H; StoneplateValue = OneH_StPlLevel3; };
};
};

func int C_KTS_Hero_Atr_Talent(var int talent, var int percent)
{
B_KTS_Stoneplate_Atr_Talent();

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

К сожалению, пока получается вот это:
1.png
 

Вложения

  • 1.png
    1.png
    55,5 KB · Просмотры: 3

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
архив перепутал. вот
Что-то там не совсем так.
1669138216515.png

Поднял все навыки до 29%. Изучил "Язык крестьян". Далее стал пробовать все таблички навыков I. Все они корректно не читались, с соответствующим комментарием, НО БЕЗ вывода пояснительного сообщения.
Однако, при подъёме атрибутов до нужных значений, ГГ всё равно отказывается читать таблички, НО внезапно сработало применение таблички 1Р II, и даже сообщения появились (как видно на скрине), хотя "Язык воинов НЕ изучен."
Пост автоматически объединён:

Daedalus:
func void Use_StonePlate(var int level,var int attribute,var int talent,var int value)
{
    if(C_SCHasStPlSkill(level) == FALSE)
    {
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
        B_CannotUse_Addon();
        B_Say(self,self,"$CANTREADTHIS");
        AI_Waitms(self,500);
    }
    else if (talent) > 0
    &&      (C_KTS_Hero_Atr_Talent(talent, value) == FALSE)
    {
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
        B_Say(self,self,"$CANTREADTHIS");
        AI_Waitms(self,500);   
    }
    else
    {
        if(attribute > 0)
        {
            B_RaiseAttributeByStonePlate(attribute,value);
        }
        else if(talent > 0)
        {
            B_RaiseTalentByStonePlate(self,talent,value);
        };
    };
};
Может тут стоит проверку в самый низ поставить, т.е. после if(attribute > 0) ?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Может тут стоит проверку в самый низ поставить, т.е. после if(attribute > 0) ?

Daedalus:
func void Use_StonePlate(var int level,var int attribute,var int talent,var int value)
{
    if(C_SCHasStPlSkill(level) == FALSE)
    {
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
        B_CannotUse_Addon();
        B_Say(self,self,"$CANTREADTHIS");
        AI_Waitms(self,500);
    }
    else if (talent > 0)
    {
        if (C_KTS_Hero_Atr_Talent(talent, value) != true)
        {
            Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
//            B_CannotUse_Addon();
 //           B_Say(self,self,"$CANTREADTHIS");
            AI_Waitms(self,500);  
        }
        else
        {
            B_RaiseTalentByStonePlate(self,talent,value);
        };
    }
    else if (attribute > 0)
    {
        B_RaiseAttributeByStonePlate(attribute,value);
    }
    else
    {
        // так быть не должно
    };
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Daedalus:
func void Use_StonePlate(var int level,var int attribute,var int talent,var int value)
{
    if(C_SCHasStPlSkill(level) == FALSE)
    {
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
        B_CannotUse_Addon();
        B_Say(self,self,"$CANTREADTHIS");
        AI_Waitms(self,500);
    }
    else if (talent > 0)
    {
        if (C_KTS_Hero_Atr_Talent(talent, value) != true)
        {
            Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
//            B_CannotUse_Addon();
 //           B_Say(self,self,"$CANTREADTHIS");
            AI_Waitms(self,500);
        }
        else
        {
            B_RaiseTalentByStonePlate(self,talent,value);
        };
    }
    else if (attribute > 0)
    {
        B_RaiseAttributeByStonePlate(attribute,value);
    }
    else
    {
        // так быть не должно
    };
};
Нет, при тех же условиях, имеем тот же результат:
1669147864757.png
Таблички первого уровня (язык крестьян) ГГ просто отказывается читать (с репликой т.е. не выполняется проверка по языку), однако для табличек второго уровня (язык воинов) проверка на атрибуты совершается корректно, т.е. выводятся сообщения, и при достижении нужных значений атрибутов табличка применяется, хотя соответствующего языка ГГ ещё НЕ знает.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
проверь табличку на повышение атрибутов. они работают правильно или сломались?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
проверь табличку на повышение атрибутов. они работают правильно или сломались?
Сломались. Такая же фигня как и с табличками навыков:
1669150253777.png
Т.е. при изученном языке крестьян ГГ НЕ может прочитать табличку силы I, но может прочитать табличку силы II.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
поменяй проверку на
Daedalus:
func int C_SCHasStPlSkill(var int Level)
{
    //if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == FALSE)                        { return FALSE; };
    if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_3] == TRUE)                         { return TRUE; };   

    if (Level == 1)     { if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == TRUE)   { return TRUE; }; };
    if (Level == 2)     { if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_2] == TRUE)   { return TRUE; }; };
    //if (Level == 3)   { if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_3] == TRUE)   { return TRUE; }; };
    
    return FALSE;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
поменяй проверку на
Daedalus:
func int C_SCHasStPlSkill(var int Level)
{
    //if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == FALSE)                        { return FALSE; };
    if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_3] == TRUE)                         { return TRUE; };  

    if (Level == 1)     { if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == TRUE)   { return TRUE; }; };
    if (Level == 2)     { if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_2] == TRUE)   { return TRUE; }; };
    //if (Level == 3)   { if (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_3] == TRUE)   { return TRUE; }; };
   
    return FALSE;
};
Проверил. Всё так же.
Опробовал все таблички - для навыков и для атрибутов. Проверки атрибутов работают корректно, НО сами таблички некорректно соотносятся с уровнем знания языков, а именно:
- Если ГГ НЕ знает никаких языков, то НЕ читаются никакие таблички;
- Если ГГ изучает язык крестьян, то может использовать таблички второго уровня (на +4 для навыков и атрибутов). Таблички навыков читаются лишь при достижении нужных значений STR/DEX (сообщения выводятся, реплики нет, всё работает корректно).
- Если ГГ изучает язык воинов, то может использовать таблички третьего уровня (+6);
- И только изучив язык жрецов, ГГ может использовать таблички первого уровня (+2);
Короче, уровень языка и табличек некорректно сдвинут.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
попробуй так организовать проверку

Daedalus:
// SсriptPatch D36
// Npc_GetTalentSkill это 0(необучен), 1, 2 или 3
// Level = 0 (язык 1 ур)
// Level = 1 (язык 2 ур)
// Level = 2 (язык 3 ур)
func int C_SCHasStPlSkill(var int Level)
{
    if (Npc_GetTalentSkill(hero, NPC_TALENT_FOREIGNLANGUAGE) >= (Level+1))
    {
        return TRUE;
    };
    return FALSE;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
попробуй так организовать проверку

Daedalus:
// SсriptPatch D36
// Npc_GetTalentSkill это 0(необучен), 1, 2 или 3
// Level = 0 (язык 1 ур)
// Level = 1 (язык 2 ур)
// Level = 2 (язык 3 ур)
func int C_SCHasStPlSkill(var int Level)
{
    if (Npc_GetTalentSkill(hero, NPC_TALENT_FOREIGNLANGUAGE) >= (Level+1))
    {
        return TRUE;
    };
    return FALSE;
};
Да, теперь всё работает корректно.
Благодарю!
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Daedalus:
///////////////////////////////////////////////////////////////////////
// Info Bonus2h - этот блок поставить в начало файла
///////////////////////////////////////////////////////////////////////
var int Sergio_Bonus2h_permanent;
/*************************************/
instance DIA_Sergio_Bonus2h(C_INFO)
{
npc = PAL_299_Sergio;
nr = 2;
condition = DIA_Sergio_Bonus2h_Condition;
information = DIA_Sergio_Bonus2h_Info;
permanent = TRUE;
description = "Ты не мог бы поделиться своим боевым опытом?";
};

func int DIA_Sergio_Bonus2h_Condition ()
{
return Sergio_Bonus2h_permanent;
};

func void DIA_Sergio_Bonus2h_Info ()
{
AI_Output(hero,self,"DIA_Sergio_Isgaroth_XP_15_00"); //Ты не мог бы поделиться своим боевым опытом?
if (B_TeachFightTalentPercent(self,hero,NPC_TALENT_2H,2,70) == true)
{
AI_Output(self,hero,"DIA_Sergio_Isgaroth_XP_04_01"); //Когда ты сражаешься, постарайся, чтобы никто не мог атаковать тебя сзади.
Sergio_Bonus2h_permanent= false;
};
};
Daedalus:
// а это заменить

FUNC VOID DIA_Sergio_Isgaroth_XP()
{
/*
AI_Output (other, self, "DIA_Sergio_Isgaroth_XP_15_00"); //Lass mich an deiner Erfahrung im Kampf teilhaben.
AI_Output (self, other, "DIA_Sergio_Isgaroth_XP_04_01"); //Wenn du kдmpfst, dann sichere dich so ab, dass dich niemand von hinten angreifen kann.

other.HitChance[NPC_TALENT_2H] = (other.HitChance[NPC_TALENT_2H] + 2);
PrintScreen (PRINT_Learn2H, -1, -1, FONT_ScreenSmall, 2);
*/
Sergio_Bonus2h_permanent = true;
Info_ClearChoices (DIA_Sergio_Isgaroth);
DIA_Sergio_Bonus2h_Info();
};
Да, такой вариант с Сержио работает отлично.
Благодарю!
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Приветствую всех вновь.
Остался последний вопрос по соответствию боевых навыков атрибутам, а именно - бонусы от оружия/колец и т.п.
func void Equip_1H(var int value)
Daedalus:
{
    B_ChangeTalent(self,NPC_TALENT_1H,value,TS_TempBonus);
};


func void UnEquip_1H(var int value)
{
    B_ChangeTalent(self,NPC_TALENT_1H,-value,TS_TempBonus);
};
MW 7, самым простым решением мне кажется просто блокировать применение данной функции, если ГГ не соответствует атрибутам? Т.е. когда ГГ экипирует оружие с бонусом, то в случае непрохождения проверки атрибутов выводится сообщение типа "Не хватает силы/ловкости для полноценного использования". Использование оружия при этом, разумеется, никак не ограничивается.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
KirTheSeeker, может на инстанции колец просто накинуть требования к силе/ловкости? тогда герой не сможет их надеть
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Сверху Снизу