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

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

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

MaGoth

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

Вложения

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

MEG@VOLT

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

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
А как вписал?
Должно быть вот так:
func C_Trigger AI_StartTriggerScriptEx(var string funcName, var int delay, var instance slf, var instance oth, var instance vct);
Вообще не так)
Daedalus:
func void Start_Trigger_Attribute_TimeBonus(var c_npc slf,var int attribute,var int value,var int time)
{
    Attribute_TimeBonus = attribute;
    var C_Trigger trigger;
    //*************************************************************************//
    //- Func   - функция, которую будет вызывать триггер.
    //- Self   - NPC, который при вызове функции будет помещаться в self.
    //- Other  - NPC, который при вызове функции будет помещаться в other.
    //- Victim - NPC, который при вызове функции будет помещаться в victim.   
    AI_StartTriggerScriptEx(имя функции, задержка, self, other, victim) - расширенная функция, если необходимо указать в нее определенных участников
    trigger = AI_StartTriggerScriptEx("Trigger_Attribute_TimeBonus", 1, slf, null, null);
     trigger.AIVariables[0] = time; // число повторов(секунд) триггера 
    trigger.AIVariables[1] = attribute; // атрибут
     trigger.AIVariables[2] = value;     //
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
Я ничего не понимаю, у меня нет такого файла
1701270892259.png
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Daedalus:
func void Start_Trigger_Attribute_TimeBonus(var c_npc slf,var int attribute,var int value,var int time)
{
    Attribute_TimeBonus = attribute;
    var C_Trigger trigger;
    //*************************************************************************//
    //- Func   - функция, которую будет вызывать триггер.
    //- Self   - NPC, который при вызове функции будет помещаться в self.
    //- Other  - NPC, который при вызове функции будет помещаться в other.
    //- Victim - NPC, который при вызове функции будет помещаться в victim.  
    //AI_StartTriggerScriptEx(имя функции, задержка, self, other, victim) - расширенная функция, если необходимо указать в нее определенных участников
    trigger = AI_StartTriggerScriptEx("Trigger_Attribute_TimeBonus", 1, slf, null, null);
     trigger.AIVariables[0] = time; // число повторов(секунд) триггера
    trigger.AIVariables[1] = attribute; // атрибут
     trigger.AIVariables[2] = value;     //
   
};

func int Trigger_Attribute_TimeBonus()
{  

    if (SelfTrigger.Delay < 1000)
    {
        SelfTrigger.Delay = 1000; // раз в секунду
        B_RaiseAttribute(self,SelfTrigger.AIVariables[1],SelfTrigger.AIVariables[2]);
    };

//    Hlp_msg = Str_Format("Trigger_Attribute_TimeBonus[%s]. Счётчик %i", self.name, SelfTrigger.AIVariables[0]);
//    Hlp_PrintConsole(Hlp_msg);

    SelfTrigger.AIVariables[0] -= 1;        // счётчик времени
   
    if (SelfTrigger.AIVariables[0] <= 0)
    {
        B_RaiseAttribute(self,SelfTrigger.AIVariables[1], -SelfTrigger.AIVariables[2]);
        attribute_TimeBonus = 0;
        return LOOP_END;
    };  

    return LOOP_CONTINUE;
};

Компиляция прошла успешно, но если использовать зелье игра вырубается.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
а если из проекта убрать и просто в папку авторан положить?
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
118
Благодарности
3
Баллы
40
1701369641430.png

Глупый вопрос. После декомпиляции готик дат появляется такая ошибка при компиляции проекта. Я помню, что уже сталкивался с подобным и исправлял проблему, но долго не писал скрипты и совсем забыл как фиксить.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
RPD нужен код. Так не видно что ему не нравится.
Daedalus:
func void B_Greg_ComesToDexter ()
{
    var c_npc npc; npc = Hlp_GetNpc(BDT_1060_Dexter);
    
    // выход если
    if (!Hlp_IsValidNpc(npc))                       {  return;  };
    //if (B_Greg_ComesToDexter_OneTime == TRUE)     {  return;  }; // повторный вызов
    if (GregLocation == Greg_Dexter)                {  return;  }; // повторный вызов
    if (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(npc))   {  return;  }; // НПС не Декстер
    

    //B_Greg_ComesToDexter_OneTime = TRUE;
    GregLocation = Greg_Dexter;
    self.aivar[AIV_EnemyOverride] = FALSE;
    //dexter.aivar[AIV_EnemyOverride] = FALSE;
    B_StartOtherRoutine    (Greg_NW,"Dexter");
    //Wld_InsertNpc     (Giant_Rat,"NW_CASTLEMINE_TOWER_CAMPFIRE_02"); //Mike: nicht mehr nцtig (AI-Fix)
};
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
118
Благодарности
3
Баллы
40
RPD нужен код. Так не видно что ему не нравится.
Daedalus:
func void B_Greg_ComesToDexter ()
{
    var c_npc npc; npc = Hlp_GetNpc(BDT_1060_Dexter);
   
    // выход если
    if (!Hlp_IsValidNpc(npc))                       {  return;  };
    //if (B_Greg_ComesToDexter_OneTime == TRUE)     {  return;  }; // повторный вызов
    if (GregLocation == Greg_Dexter)                {  return;  }; // повторный вызов
    if (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(npc))   {  return;  }; // НПС не Декстер
   

    //B_Greg_ComesToDexter_OneTime = TRUE;
    GregLocation = Greg_Dexter;
    self.aivar[AIV_EnemyOverride] = FALSE;
    //dexter.aivar[AIV_EnemyOverride] = FALSE;
    B_StartOtherRoutine    (Greg_NW,"Dexter");
    //Wld_InsertNpc     (Giant_Rat,"NW_CASTLEMINE_TOWER_CAMPFIRE_02"); //Mike: nicht mehr nцtig (AI-Fix)
};
это скорее проблема в src файле как мне кажется, так как неизвестный идентификатор
 

MW 7


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

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
118
Благодарности
3
Баллы
40
тебе неправильно кажется. а я не могу тебе сказать в чём именно проблема, так как ты традиционно не даёшь файл скрипта на который ссылаешься. обрати внимание что топик называется "вопросы по скриптингу", а не "загадки RPD".
1701416624200.png
 

MW 7


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



лечится вот так
Daedalus:
    //dexter.aivar[AIV_EnemyOverride] = FALSE;
    self.aivar[AIV_EnemyOverride] = FALSE;
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
118
Благодарности
3
Баллы
40
RPD
Посмотреть вложение 119283


лечится вот так
Daedalus:
    //dexter.aivar[AIV_EnemyOverride] = FALSE;
    self.aivar[AIV_EnemyOverride] = FALSE;
спасибо. Сразу еще проблема появилась:
func void Use_Mushroom_02()
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,HP_Mushroom_02);
if(Npc_IsPlayer(self))
{
Mushroom_02_Eaten = Mushroom_02_Eaten + 1;
if(Mushroom_02_Eaten == Mushroom_02_Eaten_MAX)
{
B_RaiseAttribute(self,ATR_MANA_MAX,10);
Npc_ChangeAttribute(self,ATR_MANA,10);
Snd_Play("LevelUp");
Mushroom_02_Eaten = 0;
};
};
1701417191295.png


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

спасибо. Сразу еще проблема появилась:
func void Use_Mushroom_02()
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,HP_Mushroom_02);
if(Npc_IsPlayer(self))
{
Mushroom_02_Eaten = Mushroom_02_Eaten + 1;
if(Mushroom_02_Eaten == Mushroom_02_Eaten_MAX)
{
B_RaiseAttribute(self,ATR_MANA_MAX,10);
Npc_ChangeAttribute(self,ATR_MANA,10);
Snd_Play("LevelUp");
Mushroom_02_Eaten = 0;
};
};
1701417191295.png


Очень странно, почему так криво декомпилируется?
func void Use_Mushroom_02()
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,HP_Mushroom_02);
if(Npc_IsPlayer(self))
{
Mushroom_02_Eaten = Mushroom_02_Eaten + 1;
if(Mushroom_02_Eaten == Mushroom_02_Eaten_MAX)
{
B_RaiseAttribute(self,ATR_MANA_MAX,10);
Npc_ChangeAttribute(self,ATR_MANA,10);
Snd_Play("LevelUp");
Mushroom_02_Eaten = 0;
};
};
};

Щас проверяю правильные декомпилированные скрипты и там все также как у меня. Но почему тогда не компилируется?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Очень странно, почему так криво декомпилируется?
наверное потому что мод был криво написан. он криво был написан, запихан и результат на лицо. точнее не криво, а из области "а я считаю что вот так".

...

Daedalus:
var int Mushroom_02_Eaten; // будем считать сколько съел герой грибов

func void Use_Mushroom_02()
{
    Npc_ChangeAttribute(self,ATR_HITPOINTS,HP_Mushroom_02);

    if (Npc_IsPlayer(self)) // НПС под управлением игрока. может быть вовсе не наш безымянный ГГ !!!
    {
        // тут нужна доп проверка по инстанции героя, т.е. pc_hero !!!
        Mushroom_02_Eaten += 1;
        if(Mushroom_02_Eaten >= Mushroom_02_Eaten_MAX)
        {
            B_RaiseAttribute(hero, ATR_MANA_MAX,10);
            Npc_ChangeAttribute(hero, ATR_MANA,10);
            Snd_Play("LevelUp");
            Mushroom_02_Eaten = 0;
        };
    };
};

...

тебе надо взять какой нибудь тоталкомандер и искать в нём среди файлов скриптов те переменные на которые ругается компилятор. то есть например найти Mushroom_02_Eaten. Далее понять она глобальная или локальная. если глобальная(в чём я сильно сомневаюсь) писать ей в файл с Story_Globals.d, а если локальная то оставлять в файле с едой.
...

в целом компилятор за годы был доведён до ума и действует на опережения не компилируя проект который в целом мог бы запуститься игрой, а потом в самый интересный момент выкатить веер критичиских ошибок и закрошить игру ;-)
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
118
Благодарности
3
Баллы
40
наверное потому что мод был криво написан. он криво был написан, запихан и результат на лицо. точнее не криво, а из области "а я считаю что вот так".

...

Daedalus:
var int Mushroom_02_Eaten; // будем считать сколько съел герой грибов

func void Use_Mushroom_02()
{
    Npc_ChangeAttribute(self,ATR_HITPOINTS,HP_Mushroom_02);

    if (Npc_IsPlayer(self)) // НПС под управлением игрока. может быть вовсе не наш безымянный ГГ !!!
    {
        // тут нужна доп проверка по инстанции героя, т.е. pc_hero !!!
        Mushroom_02_Eaten += 1;
        if(Mushroom_02_Eaten >= Mushroom_02_Eaten_MAX)
        {
            B_RaiseAttribute(hero, ATR_MANA_MAX,10);
            Npc_ChangeAttribute(hero, ATR_MANA,10);
            Snd_Play("LevelUp");
            Mushroom_02_Eaten = 0;
        };
    };
};

...

тебе надо взять какой нибудь тоталкомандер и искать в нём среди файлов скриптов те переменные на которые ругается компилятор. то есть например найти Mushroom_02_Eaten. Далее понять она глобальная или локальная. если глобальная(в чём я сильно сомневаюсь) писать ей в файл с Story_Globals.d, а если локальная то оставлять в файле с едой.
...

в целом компилятор за годы был доведён до ума и действует на опережения не компилируя проект который в целом мог бы запуститься игрой, а потом в самый интересный момент выкатить веер критичиских ошибок и закрошить игру ;-)
знать бы еще тогда, как надо считать
 
Сверху Снизу