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

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

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

MaGoth

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

Вложения

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
знать бы еще тогда, как надо считать
зачем придумывать? открывай скрипты из MDK и смотри как пираньи считали. если у тебя чего то ОЧЕНЬ много, спроси на форуме.
 

Oxbow

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

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
в том проекте что я давал было несколько файлов и оно работало. может ты часть потерял?
Gothic II\System\Autorun\G2_Trigger_Attribute_TimeBonus.src
Gothic II\System\Autorun\Trigger_Attribute_TimeBonus\B_RaiseAttributeTimeBonus
Gothic II\System\Autorun\Trigger_Attribute_TimeBonus\Constants
Gothic II\System\Autorun\Trigger_Attribute_TimeBonus\IT_PotionsTimeBonus
Gothic II\System\Autorun\Trigger_Attribute_TimeBonus\Trigger_Attribute_TimeBonus

Все эти закинул.
При чем B_RaiseAttributeTimeBonus нигде не используется. В Trigger_Attribute_TimeBonus используется дефолтная B_RaiseAttribute

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;
    SelfTrigger = AI_StartTriggerScriptEx("Trigger_Attribute_TimeBonus", 1, slf, null, null);  //Поменял trigger на  SelfTrigger
     SelfTrigger.AIVariables[0] = time;  //Поменял trigger на  SelfTrigger
    SelfTrigger.AIVariables[1] = attribute;  //Поменял trigger на  SelfTrigger
     SelfTrigger.AIVariables[2] = value;  //Поменял trigger на  SelfTrigger, потому что не понимаю зачем два разных триггера
  
};


func int Trigger_Attribute_TimeBonus()
{ 
    B_RaiseAttribute(self,SelfTrigger.AIVariables[1],SelfTrigger.AIVariables[2]);
   /* if (SelfTrigger.Delay < 1000)
    {
        SelfTrigger.Delay = 1000;
        B_RaiseAttribute(self,SelfTrigger.AIVariables[1],SelfTrigger.AIVariables[2]);
    };
    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;
    */
    return TRUE;
};
Даже вот так вырубается. Может проблема во внешней функции в принципе? Может быть я как-то не так установил Юнион? Как его правильно устанавливать? Я его устанавливал, чтобы установить Spacer.NET, но он работает нормально. Значит Юнион установлен правильно? Тогда в чем дело?
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Oxbow, Через готиксурсер собери свой проект БЕЗ внешних функций, соответственно и в exernals.d тоже удали упоминания о них.
Потом замени gothic.dat и ou.bin новыми. После этого проверяй на файлах, которые MW 7 дал
 

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60
кстати о готик сурсере, в 3.16 можно изменить название проекта? а то назвал не оригинально и теперь у меня с другим похожим проектом они синхронизируют src файл
 

MW 7


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



Поменял trigger на SelfTrigger, потому что не понимаю зачем два разных триггера
первое. я почти всё не понимаю из того что Гратт пишет про новые классы, но если он даёт пример и пишет что надо делать вот так, то я так и делаю. соответственно и проблем не возникает, так как я придерживался заданных правил. сказано было внутри функции устанавливать локальную var C_Trigger trigger; в неё записывать и запускать, я так и делал. тебе захотелось выкинуть, так как ты не понимаешь и сделать как тебе кажется лучше и как бы...
не понимаешь ну спроси у Гратта. Зачем при это ломать что работает, делать так что не работает и потом писать что не работает? :)
второе. я взял архив из старого сообщения, распаковал и положил его в папку авторан. у меня всё работает. ошибок нет.
третье. тот код нельзя просто взять и вставить в проект в готик соурсер, он работать скорее всего не будет, там надо прописывать нормально инстанции эликсиров, убирать/или прописывать внешние функции Str_Format и Hlp_PrintConsole.

***
При чем B_RaiseAttributeTimeBonus нигде не используется. В Trigger_Attribute_TimeBonus используется дефолтная B_RaiseAttribute
хочешь используй дефолтный, хочешь используй B_RaiseAttributeTimeBonus. там что то было с выводом сообщений при уменьшение / увеличения бонуса.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
.var C_Npc npc; if (Hlp_IsNull(self)) { npc = hero; } else { npc = self; } ...
так не даёт записать.

1701503242848.png


***
Gratt
наверное так?
Daedalus:
    var C_Npc npc;
  
    if (Hlp_IsValidNpc(self))
    {
        npc = Hlp_GetNpc(self);
    }
    else
    {
        npc = Hlp_GetNpc(hero);
    };
 
Последнее редактирование:

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
MW 7, MEG@VOLT действительно все позакоментил, удалил все из exernals.d. Больше не вырубается))
Но зелье все равно работает не корректно, оно просто отнимает 30 силы и все *sorry*
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
Но зелье все равно работает не корректно, оно просто отнимает 30 силы и все *sorry*
ну так ты же переписал код вот оно у тебя и стало работать некорректно;-)
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
MEG@VOLT, проверь пожалуйста, будет ли у тебя работать. архив в скрепке. инстанции зелий:
ItPo_Bonus_STR, ItPo_Bonus_DEX, ItPo_Bonus_MANA
 

Вложения

  • 2023_12_02_Trigger_Attribute_TimeBonus.zip
    4,3 KB · Просмотры: 3

MEG@VOLT

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

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
MEG@VOLT, проверь пожалуйста, будет ли у тебя работать. архив в скрепке. инстанции зелий:
ItPo_Bonus_STR, ItPo_Bonus_DEX, ItPo_Bonus_MANA
Я тут подшаманил и кажется понял почему не работало. Зелье сразу отнимало силу, потому что Time_Bonus_STR стояло 60 (для движка это похоже 0,6 секунды), я поставил Time_Bonus_STR = 600 зелье стало отнимать силу через 6 секунд. Но доп. силу при выпивании оно все равно не давало я предположил, что SelfTrigger.Delay не бывает меньше 1000 и написал вот так:

Daedalus:
func void Start_Trigger_Attribute_TimeBonus(var c_npc slf,var int attribute,var int value,var int time)
{
    Attribute_TimeBonus = attribute;
    SelfTrigger = AI_StartTriggerScriptEx("Trigger_Attribute_TimeBonus", 1, slf, null, null);
     SelfTrigger.AIVariables[0] = time; // число повторов(секунд) триггера
    SelfTrigger.AIVariables[1] = attribute; // атрибут
     SelfTrigger.AIVariables[2] = value;     //
    SelfTrigger.Delay = 0;
  
};

func int Trigger_Attribute_TimeBonus()
{ 

    if (SelfTrigger.Delay == 0)
    {
        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.000
Благодарности
969
Баллы
295
Gratt можно ли так обнулить ссылку на нпс?

Daedalus:
    if (Npc_IsPlayer(slf))
    {
        // Триггер будет глобальным
        slf = Hlp_GetNpc(-1);
    };

    trigger = AI_StartTriggerScriptEx("NPC_Trigger_Attribute_TimeBonus", 1, slf, null, null);
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
MEG@VOLT, проверь пожалуйста, будет ли у тебя работать. архив в скрепке. инстанции зелий:
ItPo_Bonus_STR, ItPo_Bonus_DEX, ItPo_Bonus_MANA
У меня вырубается игра при прогрузке главного меню с такой ошибкой
 

Вложения

  • Ошибка.png
    Ошибка.png
    3,6 KB · Просмотры: 7
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Gratt можно ли так обнулить ссылку на нпс?

Daedalus:
    if (Npc_IsPlayer(slf))
    {
        // Триггер будет глобальным
        slf = Hlp_GetNpc(-1);
    };

    trigger = AI_StartTriggerScriptEx("NPC_Trigger_Attribute_TimeBonus", 1, slf, null, null);
Не. Дропай текущий триггер и создавай новый. Либо очень осторожно кастуй в int и храни в аиварах.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
Daedalus:
func void Start_Trigger_Attribute_TimeBonus(var c_npc slf,var int attribute,var int value,var int time)
{
    var C_Trigger trigger;
правильнонеправильно
Daedalus:
    if (Npc_IsPlayer(slf))
    {
        // Глобальный Триггер для Героя
        trigger = AI_StartTriggerScriptEx("NPC_Trigger_Attribute_TimeBonus", 1, null, null, null); // Global trigger
    }
    else
    {
        // локальный триггер для других НПС
        trigger = AI_StartTriggerScriptEx("NPC_Trigger_Attribute_TimeBonus", 1, slf, null, null); // local trigger
    };
Daedalus:
    if (Npc_IsPlayer(slf))
    {
        // Триггер будет глобальным
        slf = Hlp_GetNpc(-1);
    };

    trigger = AI_StartTriggerScriptEx("NPC_Trigger_Attribute_TimeBonus", 1, slf, null, null);
Daedalus:
    trigger.Delay = 0;
    //trigger.Delay = 1000;             // раз в секунду. устанавливаю внутри NPC_Trigger_Attribute_TimeBonus
     trigger.AIVariables[0] = time;      // число повторов(секунд) триггера
    trigger.AIVariables[1] = attribute; // атрибут который будем изменять
     trigger.AIVariables[2] = value;     // значение на которое будем менять атрибута
 
    Hlp_PrintConsole(Str_Format("Start_Trigger_Attribute_TimeBonus[%s] time = %i", slf.name, time));
};

Gratt так?
 
Последнее редактирование:
Сверху Снизу