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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

Не стесняюсь спросить....

viper_093

Участник форума
Регистрация
11 Апр 2013
Сообщения
59
Благодарности
2
Баллы
160
Ребят, как сделать в икарусе так чтобы пока нажата клавиша шифт (shift) герой начал бегать (спринтом), а когда я отжимаю клавишу возвращается обычный бег (как на видео-демонстрации strong hand-а)?
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Не знаю, как именно делали в strong hand'е, но я бы делала спринт примерно по такой схеме:

1. Сделать оверлей, назовем его "Player_Sprint.mds", в котором все анимации ходьбы заменены на спринт (сравниваем "HumanS.mds" и "HumanS_Sprint.mds").

2. В скриптах создаем циклическую функцию, через обычный триггер-цикл или FrameFunctions из LeGo. Там проверяем нажатие Shift:

Код:
//Глобальные переменные:
var int Player_Sprint_Enabled;
const int Player_Sprint_MaxTime = 30000;    //предельное время спринта, в мс (можно переменную)
 
...........
 
// в функцию цикла
if (Player_Sprint_Enabled == FALSE)
{    //еще не бежим
    if (MEM_KeyPressed(KEY_RSHIFT) || MEM_KeyPressed(KEY_LSHIFT))
    {    //игрок нажал SHIFT
        Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", Player_Sprint_MaxTime);    //даже если что-то пойдет не так, оверлей в итоге отключится
        Player_Sprint_Enabled = TRUE;
    };
}
else
{    //уже бежим
    if (!MEM_KeyPressed(KEY_RSHIFT) && !MEM_KeyPressed(KEY_LSHIFT))
    {    //игрок отпустил SHIFT
        Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", 0);    //откл. оверлей, если уже отклюен - ничего не будет
        Player_Sprint_Enabled = FALSE;
    };
    /* тут вписываем учет усталости, когда надо отключаем оверлей */
};


3. Добавляем отображение полоски усталости в ту же циклическую функцию. См. LeGo Bars.

4. Начинаем учитывать всякие "особые ситуации". В первую очередь загрузку-сохранение игры, еще ГГ мог в кого-нибудь превратиться, быть под каким-нибудь эффектом...
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
Не знаю, как именно делали в strong hand'е, но я бы делала спринт примерно по такой схеме:

1. Сделать оверлей, назовем его "Player_Sprint.mds", в котором все анимации ходьбы заменены на спринт (сравниваем "HumanS.mds" и "HumanS_Sprint.mds").

2. В скриптах создаем циклическую функцию, через обычный триггер-цикл или FrameFunctions из LeGo. Там проверяем нажатие Shift:

Код:
//Глобальные переменные:
var int Player_Sprint_Enabled;
const int Player_Sprint_MaxTime = 30000;    //предельное время спринта, в мс (можно переменную)
 
...........
 
// в функцию цикла
if (Player_Sprint_Enabled == FALSE)
{    //еще не бежим
    if (MEM_KeyPressed(KEY_RSHIFT) || MEM_KeyPressed(KEY_LSHIFT))
    {    //игрок нажал SHIFT
        Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", Player_Sprint_MaxTime);    //даже если что-то пойдет не так, оверлей в итоге отключится
        Player_Sprint_Enabled = TRUE;
    };
}
else
{    //уже бежим
    if (!MEM_KeyPressed(KEY_RSHIFT) && !MEM_KeyPressed(KEY_LSHIFT))
    {    //игрок отпустил SHIFT
        Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", 0);    //откл. оверлей, если уже отклюен - ничего не будет
        Player_Sprint_Enabled = FALSE;
    };
    /* тут вписываем учет усталости, когда надо отключаем оверлей */
};


3. Добавляем отображение полоски усталости в ту же циклическую функцию. См. LeGo Bars.

4. Начинаем учитывать всякие "особые ситуации". В первую очередь загрузку-сохранение игры, еще ГГ мог в кого-нибудь превратиться, быть под каким-нибудь эффектом...
Ух ты,не думал,что дамы на форуме такое знают.Спасибо за информацию,возьму на заметку)
 

viper_093

Участник форума
Регистрация
11 Апр 2013
Сообщения
59
Благодарности
2
Баллы
160
А почему не получится сделать оверлей как у зелья скорости, например
Код:
Mdl_ApplyOverlayMdsTimed(self,"HUMANS_SPRINT.MDS",Time_Speed);
?
И еще: какой из "Frame functions" мне следует использовать (я раньше не пользовался LeGo.), и можно эти функции использовать как обычно, например:
Код:
void FF_Apply(func имя функции)
{
сама функция оверлея.
}
?
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
А почему не получится сделать оверлей как у зелья скорости, например
Код:
Mdl_ApplyOverlayMdsTimed(self,"HUMANS_SPRINT.MDS",Time_Speed);
?
?
Точно не знаю,может и ошибусь,но оверлей применяется на определенное время,в свою очередь которое обрабатывается движком.
ЗЫ,жди более продвинутых людей в этой категории,я редко работал с оверлеями.
 

viper_093

Участник форума
Регистрация
11 Апр 2013
Сообщения
59
Благодарности
2
Баллы
160
Точно не знаю,может и ошибусь,но оверлей применяется на определенное время,в свою очередь которое обрабатывается движком.
ЗЫ,жди более продвинутых людей в этой категории,я редко работал с оверлеями.

По моему там есть константа отвечающая за время спринта а именно "Time_Speed" .
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
По моему там есть константа отвечающая за время спринта а именно "Time_Speed" .
кто-то уже пробовал вписывать значения в константу - и это ничем не помогло.Как было 5 минут - так и осталось.Хотя,можешь попробовать,я уже говорил что с оверлеями работал очень редко.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Если сейчас правильно помню, то время действия оверлея задается через скрипт, смотри в оригинале игры где эффект ускорения накладывается, там-же и время будет указано...

Зы, + тутор Вама:
...
void Mdl_ApplyOverlayMds (c_npc n0,string s1);// запустить файл анимации s1 с расширением mds для НПС n0.
void Mdl_RemoveOverlayMDS (c_npcself,string overlayName);// отключить от НПС self файл анимации overlayName.
void Mdl_ApplyOverlayMDSTimed (c_npcself,string overlayname,int timeTicks);// запустить файл анимации overlayname для НПС self на время timeTicks.
...
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
Функция из аддона,лежит в IT_Addon_Food
func void UseSchnellerHering()
{
var C_Npc her;
her = Hlp_GetNpc(PC_Hero);
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
{
Mdl_ApplyOverlayMdsTimed(self,"HUMANS_SPRINT.MDS",120000);
};
Player_KnowsSchnellerHering = TRUE;
};

Вызов через инстанцию
instance ItFo_Addon_SchnellerHering(C_Item)
{
name = "Быстрая селедка";
mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;
value = Value_SchnellerHering;
visual = "ItMi_Rum_01.3ds";
material = MAT_GLAS;
on_state[0] = UseSchnellerHering;
scemeName = "POTIONFAST";
description = "Выглядит подозрительно!";
text[1] = "Эффект неизвестен.";
text[2] = "Возможны побочные эффекты";
text[5] = NAME_Value;
count[5] = Value_SchnellerHering;
};
Лежит там же
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Так, по порядку.

Почему не подходит обычный "HUMANS_SPRINT.MDS"? Потому что там заменяются анимации бега. А когда ты зажимаешь SHIFT, ГГ переходит в режим ходьбы. И оверлея ты просто не заметишь. Если назначить для спринта другую кнопку, например, Z, то можно использовать "HUMANS_SPRINT.MDS".

Оверлей можно применить на какое-то время:
Mdl_ApplyOverlayMdsTimed(<NPC>,"<имя оверлея.MDS>",<время действия, мс>);
Такой оврелей автоматически снимается через указанное время и сбрасывается при сохранении-загрузке. А чтобы отключить его при отпускании SHIFT, нужно назначить его же, но с нулевым временем действия.

Другой вариант - назначение оверлея "на постоянной основе":
Mdl_ApplyOverlayMds(<NPC>,"<имя оверлея.MDS>");
Он остается при сохранении-загрузке игры, а снимается функцией:
Mdl_RemoveOverlayMDS(<NPC>,<имя оверлея>);
Эта функция НЕ отменяет Mdl_ApplyOverlayMdsTimed.
В данном случае мне показался более надежным первый вариант, чтобы из-за какого-нибудь косяка не получилось, что ГГ все время ускоренный.

По поводу FrameFunctions, я пока и сама знакома с ними только в теории. Должно быть примерно так:
1. В Startup.d в функцию init_global дописываем включение Икаруса и ЛеГо:
[INDENT=1]MEM_InitAll();[/INDENT]
[INDENT=1]LeGo_InitAll();[/INDENT]
2. Где-нибудь отдельно пишем нашу циклическую функцию (из предыдущего моего поста), например назовем ее func void SprintCycle()
3. В ту же init_global ниже дописываем:
[INDENT=1]FF_ApplyExt(SprintCycle, 300, -1);[/INDENT]
где 300 - это через сколько мс будет вызываться функция. В данном случае около трех раз в секунду, думаю, хватит. Слишком маленькое число не имеет смысла назначать, чаще чем раз в игровой кадр все равно не сработает.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
Зы, + тутор Вама:
void Mdl_ApplyOverlayMDSTimed (c_npcself,string overlayname,int timeTicks);// запустить файл анимации overlayname для НПС self на время timeTicks.

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

Упс. Посту выше: Спасибо за идею!
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
Был бы рад,если кто-нибудь описал поподробнее циклическую функцию через триггер-скрипт.Сколько не старался - ничего не выходило.
(пытался сделать проверку на наличие одной вещи,при которой каждую секунду убавлялось 1HP)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Ребят, как сделать в икарусе так чтобы пока нажата клавиша шифт (shift) герой начал бегать (спринтом), а когда я отжимаю клавишу возвращается обычный бег (как на видео-демонстрации strong hand-а)?
В StrongHand переключение на бег реализовано БЕЗ дополнительных скриптпакетов Ikarus и LeGo. Кроме того сохранена возможность обычной ходьбы при зажатой клавише SHIFT, переключение на бег происходит если отпустить клавишу SHIFT, но при этом удерживать клавишу "Вперед". В отличие от представленных выше вариантов используется считывание состояний ГГ, а не нажатие конкретных клавиш, которые могут быть переназначены в настройках игры.

Вот вырезка скриптка, помещенная в тело функции B_GlobalInit зацикленной при помощи Trigger-Script

var int PC_Sprint_Mode; //Переменная режима быстрого бега.
var int PC_STAMINA_MAX; //Атрбут максимальной выносливости ГГ.
var int PC_STAMINA_CURRENT; //Атрибут текущей выносливости ГГ.
Расчет выносливости в скриптах не указан.

Код:
func void B_GlobalInit()
{
 
    if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте.
    {
        if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера.
        {
            //Переход в режим обычного бега.
            Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = FALSE;
        };
    };
    if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT).
    {
        if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие)
        {
            //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега.
            if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE)
            {
                PC_Sprint_Mode = 2;
            };
        };
    };
    if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега.
    {
        //Переключение в режим спринтера.
        if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру.
        {
            //Переход в режим спринтера.
            Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = TRUE;
        };
    };
    if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается
    {
        Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
        PC_Sprint_Mode = FALSE;
    };
 
Wld_SendTrigger("GLOBAL_INIT"); //Вызов триггера для зацикливания всей функции.
 
};
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
В StrongHand переключение на бег реализовано БЕЗ дополнительных скриптпакетов Ikarus и LeGo. Кроме того сохранена возможность обычной ходьбы при зажатой клавише SHIFT, переключение на бег происходит если отпустить клавишу SHIFT, но при этом удерживать клавишу "Вперед". В отличие от представленных выше вариантов используется считывание состояний ГГ, а не нажатие конкретных клавиш, которые могут быть переназначены в настройках игры.

Вот вырезка скриптка, помещенная в тело функции B_GlobalInit зацикленной при помощи Trigger-Script

var int PC_Sprint_Mode; //Переменная режима быстрого бега.
var int PC_STAMINA_MAX; //Атрбут максимальной выносливости ГГ.
var int PC_STAMINA_CURRENT; //Атрибут текущей выносливости ГГ.
Расчет выносливости в скриптах не указан.

Код:
func void B_GlobalInit()
{
 
    if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте.
    {
        if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера.
        {
            //Переход в режим обычного бега.
            Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = FALSE;
        };
    };
    if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT).
    {
        if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие)
        {
            //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега.
            if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE)
            {
                PC_Sprint_Mode = 2;
            };
        };
    };
    if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега.
    {
        //Переключение в режим спринтера.
        if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру.
        {
            //Переход в режим спринтера.
            Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = TRUE;
        };
    };
    if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается
    {
        Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
        PC_Sprint_Mode = FALSE;
    };
 
Wld_SendTrigger("GLOBAL_INIT"); //Вызов триггера для зацикливания всей функции.
 
};
Вопрос лично к тебе,а куда собственно девать зацикленный скрипт? Запихивал в event - ноль реакции.Может попробовать отследить работу скрипта через какой-нибудь лог,если это возможно?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Вопрос лично к тебе,а куда собственно девать зацикленный скрипт? Запихивал в event - ноль реакции.Может попробовать отследить работу скрипта через какой-нибудь лог,если это возможно?
Куда хочешь, главное правильное прописать в нем вызов триггер-скрипта и сам триггер-скрипт в спейсере. Вместо триггер-скрипта можешь использовать циклы из пакета Лего описанные выше, но скорость их работы не равномерная и зависит от частоты кадров. Ссылка на урок Триггер-Скрипт https://worldofplayers.ru/threads/31401/
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
Куда хочешь, главное правильное прописать в нем вызов триггер-скрипта и сам триггер-скрипт в спейсере. Вместо триггер-скрипта можешь использовать циклы из пакета Лего описанные выше, но скорость их работы не равномерная и зависит от частоты кадров. Ссылка на урок Триггер-Скрипт https://worldofplayers.ru/threads/31401/
Если можешь потратить немного времени,то можно в ЛС с этим?
 

viper_093

Участник форума
Регистрация
11 Апр 2013
Сообщения
59
Благодарности
2
Баллы
160
В StrongHand переключение на бег реализовано БЕЗ дополнительных скриптпакетов Ikarus и LeGo. Кроме того сохранена возможность обычной ходьбы при зажатой клавише SHIFT, переключение на бег происходит если отпустить клавишу SHIFT, но при этом удерживать клавишу "Вперед". В отличие от представленных выше вариантов используется считывание состояний ГГ, а не нажатие конкретных клавиш, которые могут быть переназначены в настройках игры.

Вот вырезка скриптка, помещенная в тело функции B_GlobalInit зацикленной при помощи Trigger-Script

var int PC_Sprint_Mode; //Переменная режима быстрого бега.
var int PC_STAMINA_MAX; //Атрбут максимальной выносливости ГГ.
var int PC_STAMINA_CURRENT; //Атрибут текущей выносливости ГГ.
Расчет выносливости в скриптах не указан.

Код:
func void B_GlobalInit()
{
 
    if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте.
    {
        if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера.
        {
            //Переход в режим обычного бега.
            Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = FALSE;
        };
    };
    if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT).
    {
        if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие)
        {
            //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега.
            if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE)
            {
                PC_Sprint_Mode = 2;
            };
        };
    };
    if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега.
    {
        //Переключение в режим спринтера.
        if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру.
        {
            //Переход в режим спринтера.
            Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = TRUE;
        };
    };
    if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается
    {
        Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
        PC_Sprint_Mode = FALSE;
    };
 
Wld_SendTrigger("GLOBAL_INIT"); //Вызов триггера для зацикливания всей функции.
 
};
Вот несколько вопросов появилось:
1.Нужно ли расширять грани триггера чтобы он охватывал весь мир?
2.Нужно ли прописать проверку персонаже как в вашем уроке?
3.В "pc_hero" нужно прописать и "PC_STAMINA_CURRENT = 100;" и "PC_STAMINA_MAX = 100;"?
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
Вот несколько вопросов появилось:
1.Нужно ли расширять грани триггера чтобы он охватывал весь мир?
2.Нужно ли прописать проверку персонаже как в вашем уроке?
3.В "pc_hero" нужно прописать и "PC_STAMINA_CURRENT = 100;" и "PC_STAMINA_MAX = 100;"?
Отвечу на первые 2 вопроса ТОЧНО:
1)Не обязательно.Достаточно создать стандартный триггер-скрипт с его стандартными размерами (маленький серый кубик).
2)Обязательно,нам нужно зациклить функцию.Я пробовал без проверки на живучесть,не работало (в общем так: нужен вызов триггера в начале функции и в конце функции,а условия вызова задавай сам.Хотя самый удобный способ вызова первого триггера - проверка на живучесть,как в туториале,а так можно поставить например вызов триггера,если у игрока что-нибудь есть).
НЕ РАБОТАЕТ,ОБЯЗАТЕЛЬНА ПРОВЕРКА НА ЖИВУЧЕСТЬ ГГ. Никак больше триггер-скрипт не запустишь
Можешь попробовать такой способ:
3)А толку то? в скрипте,который тебе дан все аттрибуты являются var,то есть за рамки данного скрипта они не распространяются.Рекомендую к просмотру мод "Возвращение" или "ре-баланс",не помню в каком из них была выносливость.Смотри,как сделано там (точно помню что это атрибут,похожий на "владение оружием".
 

viper_093

Участник форума
Регистрация
11 Апр 2013
Сообщения
59
Благодарности
2
Баллы
160
Не работает мой скрипт, вот как он выглядит:
Код:
func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, находится ли ГГ в мире, иначе сразу вызов триггера без продолжения выполнения функции.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции.
return; //Выход из функции.
};
 
//Дальше можно вставлять множество своих функций...
 
sprint();
 
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};
 
func void sprint()
{
if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте.
    {
        if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера.
        {
            //Переход в режим обычного бега.
            Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = FALSE;
        };
    };
    if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT).
    {
        if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие)
        {
            //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега.
            if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE)
            {
                PC_Sprint_Mode = 2;
            };
        };
    };
    if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега.
    {
        //Переключение в режим спринтера.
        if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру.
        {
            //Переход в режим спринтера.
            Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = TRUE;
        };
    };
    if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается
    {
        Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
        PC_Sprint_Mode = FALSE;
    };
 
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции.
};
 

Defman

Участник форума
Регистрация
26 Май 2013
Сообщения
3.165
Благодарности
245
Баллы
300
Не работает мой скрипт, вот как он выглядит:
Код:
func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, находится ли ГГ в мире, иначе сразу вызов триггера без продолжения выполнения функции.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции.
return; //Выход из функции.
};
 
//Дальше можно вставлять множество своих функций...
 
sprint();
 
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};
 
func void sprint()
{
if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте.
    {
        if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера.
        {
            //Переход в режим обычного бега.
            Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = FALSE;
        };
    };
    if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT).
    {
        if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие)
        {
            //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега.
            if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE)
            {
                PC_Sprint_Mode = 2;
            };
        };
    };
    if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега.
    {
        //Переключение в режим спринтера.
        if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру.
        {
            //Переход в режим спринтера.
            Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS");
            PC_Sprint_Mode = TRUE;
        };
    };
    if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается
    {
        Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
        PC_Sprint_Mode = FALSE;
    };
 
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции.
};
А зачем вы 3 раза вызываете триггер? Достаточно двух. И лучше бы занести не "sprint ()",а весь код.Для надежности.
И да,кода не достаточно.Спейсер еще нужен тут,точнее настройки триггера.Так же убедитесь,то что карта именна та,на которой зацикленный триггер.Запихните ее в мод файл вместе со своими скриптами.
Если хочешь,то можно в аську стукнуть мне.Я указал в профиле.
 
Сверху Снизу