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

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

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

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Вопрос по статической модели анимации
Экспортировал кровать в ASC формате с префиксом zm_
ZS_POS расставил как в оригинальном файле.

Нужно ли где-то в скриптах прописывать созданную модель?

Не надо, но чтобы ты на неё мог ложиться как на кровать обычную - ASC-файл обязательно должен иметь название BEDHIGH_**** . Это если ты не хочешь составлять свои анимации для новой кровати или изменять схему взаимодействия.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Доброго времени суток. Подскажите, как можно сделать зелье, которое при использовании будет определённое количество времени постепенно восстанавливать здоровье/ману.

Как вариант. Организовываешь циклический триггер. Прописываешь функции точного времени. В момент выпивания бутылочки запоминается время её выпивания (с точностью до секунды). Затем в циклической функции это значение сравнивается с текущим временем и производится восстановление здоровья/маны, пока не истёк период действия зелья.

А если хочу... Это так на будущее...

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

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Прописываешь функции точного времени. В момент выпивания бутылочки запоминается время её выпивания (с точностью до секунды). Затем в циклической функции это значение сравнивается с текущим временем и производится восстановление здоровья/маны, пока не истёк период действия зелья.
Зачем создавать себе проблемы с получением/оперированием текущим временем?
Зачем вообще оперировать со временем в форматах "секунда, минута" и т.д. - все заложено в частоте отработки триггера.
Нас интересует "интервал в интервале" и шаг изменения, пофиг глобальные цифры.
В функции использования присваивем значение переменой ВЫПИЛ=ДА и МахВремя=ХХХ
В триггере
Если ВЫПИЛ==ДА
- Если МАхВремя < ХХХ - время действия
-- увеличиваем ХП на ХХ
-- МахВремя -=1 - уменьшаем счетчик времени действия
- ЕЛСЕ
-- ВЫПИЛ=0
ЕНД
Естественно добавляем проверки на ТекущееХП не более махХП и т.д.
 

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
А какое все-таки максимальное количество VOB объектов можно вставить в игру?
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
Зачем создавать себе проблемы с получением/оперированием текущим временем?
Зачем вообще оперировать со временем в форматах "секунда, минута" и т.д. - все заложено в частоте отработки триггера.
Нас интересует "интервал в интервале" и шаг изменения, пофиг глобальные цифры.
В функции использования присваивем значение переменой ВЫПИЛ=ДА и МахВремя=ХХХ
В триггере
Если ВЫПИЛ==ДА
- Если МАхВремя < ХХХ - время действия
-- увеличиваем ХП на ХХ
-- МахВремя -=1 - уменьшаем счетчик времени действия
- ЕЛСЕ
-- ВЫПИЛ=0
ЕНД
Естественно добавляем проверки на ТекущееХП не более махХП и т.д.
Сделал вот такие два скрипта:
Код:
instance ItPo_HealthRestore(C_Item)
{
    name = NAME_Trank;
    mainflag = ITEM_KAT_POTIONS;
    flags = ITEM_MULTI;
    value = Value_HpEssenz;
    visual = "ItPo_Health_02.3ds";
    material = MAT_GLAS;
    on_state[0] = UseItPo_HealthRestore;
    scemeName = "POTIONFAST";
    wear = WEAR_EFFECT;
    effect = "SPELLFX_HEALTHPOTION";
    description = "Зелье восстановления";
    text[1] = NAME_Bonus_HP;
    count[1] = HP_Essenz;
    text[5] = NAME_Value;
    count[5] = Value_HpEssenz;
};
 
 
func void UseItPo_HealthRestore()
{
    RestorePotionDrank = 1;
    RestorePotionDuration = 10;
    RestorePotion1();
};
И:
Код:
var int RestorePotionDrank;
var int RestorePotionDuration;
var int RestorePotionTime;
 
func void RestorePotion1()
{
    if((RestorePotionDrank == 1) && (RestorePotionDuration > 0) && (self.attribute[ATR_HITPOINTS_MAX] > self.attribute[ATR_HITPOINTS]))
    {
        Npc_ChangeAttribute(self,ATR_HITPOINTS,5);
        RestorePotionDuration -= 1;
        RestorePotion1();
    }
    else
    {
        RestorePotionDrank = 0;
    };
};
Но проблема в том, что второй скрипт срабатывает 10 раз мгновенно. Как сделать чтобы был интервал между повторными вызовами RestorePotion1?
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Сделал вот такие два скрипта:
1. Курим "циклический триггер готика" - поиск в Гугл
2. Вызывать функцию при выпивании зелья - НЕ НАДО, она сама отработает по условиям в триггере.

https://sites.google.com/site/ukroleha/modarticles/triggerscriptcycle
Раньше была здесь на сайте, сейчас не нашел
 

Хелдар

Участник форума
Регистрация
3 Июл 2012
Сообщения
2.450
Благодарности
780
Баллы
375
Про циклические триггеры можно почитать тут.
Нужное тебе начинается со слов Теперь давайте создадим простенький зацикленный триггер-скрипт.
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
1. Курим "циклический триггер готика" - поиск в Гугл
2. Вызывать функцию при выпивании зелья - НЕ НАДО, она сама отработает по условиям в триггере.

https://sites.google.com/site/ukroleha/modarticles/triggerscriptcycle
Раньше была здесь на сайте, сейчас не нашел
Я уже нашел. Сделал этот триггер, но нужная функция не срабатывает от него. Я проверял триггер на другой функции - всё работает. В чём может быть проблема?
Само зелье:
Код:
instance ItPo_HealthRestore(C_Item)
{
    name = NAME_Trank;
    mainflag = ITEM_KAT_POTIONS;
    flags = ITEM_MULTI;
    value = Value_HpEssenz;
    visual = "ItPo_Health_02.3ds";
    material = MAT_GLAS;
    on_state[0] = UseItPo_HealthRestore;
    scemeName = "MAPSEALED";
    wear = WEAR_EFFECT;
    effect = "SPELLFX_HEALTHPOTION";
    description = "Зелье восстановления";
    text[1] = NAME_Bonus_HP;
    count[1] = HP_Essenz;
    text[5] = NAME_Value;
    count[5] = Value_HpEssenz;
};
 
 
func void UseItPo_HealthRestore()
{
    RestorePotionDrank = 1;
    RestorePotionDuration = 10;
};
Функция:
Код:
var int RestorePotionDrank;
var int RestorePotionDuration;
 
func void RestorePotion1()
{
    if((RestorePotionDrank == 1) && (RestorePotionDuration > 0))
    {
        Npc_ChangeAttribute(self,ATR_HITPOINTS,5);
        RestorePotionDuration -= 1;
    }
    else
    {
        RestorePotionDrank = 0;
    };
};
Функция триггера:
Код:
func void B_CYCLE_FUNCTION()
{
    if(hero.attribute[ATR_HITPOINTS_MAX] == 0)
    {
        Wld_SendTrigger("CYCLE_TRIGGER");
        return;
    };
    RestorePotion1();
    Wld_SendTrigger("CYCLE_TRIGGER");
};
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Pag,
1.А чем отлючаются B_StartOtherRoutine и Npc_Exchangeroutine?
Если вопрос еще актуален, то:
Код:
B_StartOtherRoutine
// Запускает какое либо расписания для НПС npc
 
Npc_ExchangeRoutine
// меняет у НПС npc текущий распорядок дня (новый указывается в "аргументах" функции, переменная - routine)

Зы, В проекте скриптов Сурсера, есть неплохая справка по функциям Скриптов/движка, стоит заглядывать туда почаще.
Панель категорий слева: Данные / Внутренние функции, в зависимости от проекта - Г1/Г2, загрузятся те или иные функции. Важно, описание функций доступно только при загруженном активном проекте в Сурсере.
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
Pag,

Если вопрос еще актуален, то:
Код:
B_StartOtherRoutine
// Запускает какое либо расписания для НПС npc
 
Npc_ExchangeRoutine
// меняет у НПС npc распорядок дня, указанный в "аргументах" функции , переменной - routine
Уже не актуален.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
В чём может быть проблема?

Как часто вызывается циклическая функция? Если 10 раз в секунду, то весь процесс закончится примерно тогда, когда закончится выпивание бутылочки (завершится анимация). Чтобы процесс был более растянутым во времени, ставь дополнительный счётчик, чтобы повышение HP на 1 происходило 1 раз в несколько вызовов циклической функции.


Так должно быть? Для зелий обычно используются другие анимации.
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
Как часто вызывается циклическая функция? Если 10 раз в секунду, то весь процесс закончится примерно тогда, когда закончится выпивание бутылочки (завершится анимация). Чтобы процесс был более растянутым во времени, ставь дополнительный счётчик, чтобы повышение HP на 1 происходило 1 раз в несколько вызовов циклической функции.



Так должно быть? Для зелий обычно используются другие анимации.
Раз в 1 секунду. А насчет анимации - это я сам для проверки анимации ставил.
Npc_ChangeAttribute(hero,ATR_HITPOINTS,5);
Спасибо, помогло.
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
Подскажите: я сделал новый мир и поставил там startpoint. Как сделать так, чтобы игра начиналась там? Как я понял, надо этот мир прописать в ини файле .mod'а. А можно сделать это не компилируя его в мод? По скриптам полазил и не нашел нигде этого.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Pag,
Подскажите: я сделал новый мир и поставил там startpoint. Как сделать так, чтобы игра начиналась там? Как я понял, надо этот мир прописать в ини файле .mod'а. А можно сделать это не компилируя его в мод? По скриптам полазил и не нашел нигде этого.
Варианты:
1. Обозвать твой мир НьюВорлд и скормить его игре, предварительно не забыв забекапить зен оригинального Хориниса, а можно тупо напрямую заменить твоим миром оригинальный мир, в этом случае можно петь заупокойную твоей Готе, если что пойдет не так.
2. Оставить твое оригинальное название, упаковав все это дело в мод-файл, с ини-шкой, в которой прописан твой зен.
3. Плохо смотрел, смотри в каталог скриптов:
..\PrjGOTHIC\Story
файл - Startup.d, в нем инициализируются все Непеси, а также прописывается загрузка мира(ов), если твой мир будет в купе с другими мирами использоваться, то он должен быть там прописан, также как и другие.
Как-то так.
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
Доброго времени суток. Я сделал оружие дальнего боя, и мне нужно изменить звук выстрела только для него. Я изменил его с помощью нового оверлея, который заменил звук выстрела. Но проблема в том, что звука у этого оружия теперь вообще нет. Что я делал:
1. Декомпилировал Humans.msb и закинул HUM_CBOWAIM.ASC оттуда в папку с игрой (в anims). Потом создал там файл test.mds:
Код:
Model("HuS")
    {
    aniEnum
    {
    modelTag("DEF_HIT_LIMB" "zs_RightHand")
    ani("s_CBowShoot" 1 "s_CBowShoot" 0.0 0.0 M. "Hum_CBowAim.asc" F 6 6)
    {
    *eventMMStartAni(6 "S_SHOOT" "ZS_RIGHTHAND")
    *eventSFX(6 "TEST_SHOT" )
    }
    }
    }
2. Декомпилировал SFX.dat и в SfxInst.d добавил инстанцию:
Код:
instance TEST_SHOT(C_SFX_DEF)
{
    file = "TEST_SHOT.wav";
    vol = 60;
};
TEST_SHOT.wav лежит в Gothic II/_work/Data/Sound/Sfx
Вот еще инстанция самого оружия:
Код:
instance ItRw_TEST(C_Item)
{
    name = "Тест";
    mainflag = ITEM_KAT_FF;
    flags = ITEM_CROSSBOW;
    material = MAT_WOOD;
    value = 5200;
    damageTotal = 60;
    damagetype = DAM_POINT;
    munition = ItRw_bolt;
    cond_atr[1] = ATR_STRENGTH;
    cond_value[1] = 25;
    cond_atr[2] = ATR_DEXTERITY;
    cond_value[2] = 65;
    visual = "ItRw_test.3ds";
    description = name;
    on_equip = TEST_1;
    on_unequip = TEST_2;
    text[2] = NAME_Damage;
    count[2] = damageTotal;
    text[5] = NAME_Value;
    count[5] = value;
};
 
func void TEST_1()
{
    Mdl_ApplyOverlayMds(self,"TEST.MDS");
};
 
func void TEST_2()
{
    Mdl_RemoveOverlayMds(self,"TEST.MDS");
};
3.Потом разумеется компилировал dat.
(Все делалось по этому сообщению).
В чём может быть проблема?
 

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

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Раз звук перестал проигрываться, с оверлеем должно быть все норм, проблема - в самом звуке. Скорее всего, не тот формат wav. На память не скажу, но где-то тут были требования.
SFX.dat, надеюсь, тоже скомпилен?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Pag, попробуй воспроизвести звуковой эффект через скрипты. Для проверки. Я, например, создал для себя инстанции пары книженций, при прочтении которых происходит то, что мне нужно. Прописываю набор действий в инстанции книжки, компилирую проект и закидываю его в папку с игрой, в игре читаю книгу и смотрю на результат.
 
Сверху Снизу