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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

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

MaGoth

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

Вложения

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

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.235
Благодарности
2.575
Баллы
455
Пожалуйста уточни, какие анимации и в каких ZS состояниях можно задействовать для орков?
Для "стандартных" орков используется состояние ZS_MM_AllScheduler
AI\Monster\RTN_Monster\ZS_MM_AllScheduler.d
из которого вызывается состояние ZS_MM_Rtn_Rest.d
в котором имеется следующий блок:

Daedalus:
       if(randomMove == 0)
        {
            AI_PlayAni(self,"R_ROAM1");
        };
        if(randomMove == 1)
        {
            AI_PlayAni(self,"R_ROAM2");
        };
        if(randomMove == 2)
        {
            AI_PlayAni(self,"R_ROAM3");
        };

Аналогичный блок анимаций присутствует в Orc.mds
Daedalus:
 // ***************************************************************************************
// MM DAYCYCLE
// ***************************************************************************************
            ani            ("r_Roam1"            2    ""            0.0 0.0 M.    "Orc_Roam01_A01.asc"        F    0    50) 
            ani            ("r_Roam2"            2    ""            0.0 0.0 M.    "Orc_Roam02_A01.asc"        F    0    65) 
            aniAlias    ("r_Roam3"            2    ""            0.0 0.0 M.    "t_Perception"                         F)
// ***************************************************************************************
Судя по всему, это и есть те почесывания задниц. Ящеры на сколько я помню полностью копируют скелет орков и содержат аналогичные анимации.
 
Последнее редактирование модератором:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.124
Благодарности
3.215
Баллы
485
Судя по всему, это и есть те почесывания задниц.
Правильно, а также оглядывание по сторонам и ковыряние в земле. Спасибо, теперь Ур-Шак не будет стоять неподвижно, пытаясь воспроизводить несуществующие анимации.
Daedalus:
func int ZS_Stand_WP_Loop()
{
    var int random;
    if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
    {
        if(self.guild != GIL_FRIENDLY_ORC)
        {
            AI_PlayAni(self,"T_STAND_2_LGUARD");
        };
        self.aivar[AIV_TAPOSITION] = ISINPOS;
    };
    if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
    {
        random = Hlp_Random(10);
        if(random == 0)
        {
            if(self.guild == GIL_FRIENDLY_ORC)
            {
                AI_PlayAni(self,"R_ROAM1");
            }
            else
            {
                AI_PlayAni(self,"T_LGUARD_SCRATCH");
            };
        }
        else if(random == 1)
        {
            if(self.guild == GIL_FRIENDLY_ORC)
            {
                AI_PlayAni(self,"R_ROAM2");
            }
            else
            {
                AI_PlayAni(self,"T_LGUARD_STRETCH");
            };
        }
        else if(random == 2)
        {
            if(self.guild == GIL_FRIENDLY_ORC)
            {
                AI_PlayAni(self,"R_ROAM3");
            }
            else
            {
                AI_PlayAni(self,"T_LGUARD_CHANGELEG");
            };
        };
        Npc_SetStateTime(self,0);
    };
    return LOOP_CONTINUE;
};
popa.jpg
 
Последнее редактирование модератором:

Banderas1989

Участник форума
Регистрация
18 Мар 2014
Сообщения
129
Благодарности
30
Баллы
190
Как называются скрипты, отвечающие за добычу магической руды и железа?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.843
Благодарности
5.268
Баллы
910
Как называются скрипты, отвечающие за добычу магической руды и железа?

В оригинале Г2НВ можно добывать только золотые самородки
Его скрипт \Story\Dialog_Mobsis\Goldhacken.d

А ты описал какой-то мод.
В моде файл по-другому называется, либо близко по смыслу
 

Banderas1989

Участник форума
Регистрация
18 Мар 2014
Сообщения
129
Благодарности
30
Баллы
190
В оригинале Г2НВ можно добывать только золотые самородки
Его скрипт \Story\Dialog_Mobsis\Goldhacken.d

А ты описал какой-то мод.
В моде файл по-другому называется, либо близко по смыслу
Копаюсь в скриптах второго возвращения
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
228
Благодарности
29
Баллы
190
Подскажите, что это за гильдия - GIL_SEPERATOR_HUM? Типо все людские гильдии вместе?

Я так понял я все делал не правильно и Guild вообще для монстров не нужна и отношения монстров должны прописываться в В_InitMonsterAttitude.d?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.158
Благодарности
6.138
Баллы
1.565
Подскажите, что это за гильдия - GIL_SEPERATOR_HUM? Типо все людские гильдии вместе?

Я так понял я все делал не правильно и Guild вообще для монстров не нужна и отношения монстров должны прописываться в В_InitMonsterAttitude.d?
Это не гильдия, это резделитель гильдий. Так же как GIL_SEPERATOR_ORC
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.331
Благодарности
3.178
Баллы
525
Это число, как уже сказали, используется в качестве разделителя. Гильдии с меньшими значениями считаются человеческими.

Guild вообще для монстров не нужна
Нет, нужна. Помимо параметра Guild, у непися имеется параметр расширенного внутридвижкового класса TrueGuild. При инициализации непися параметр TrueGuild копирует значение Guild. И вот этот самый параметр TrueGuild учитывается при работе восприятия врага PERC_ASSESSENEMY. Если ты не назначишь монстру гильдию, он останется с нулевой гильдией GIL_NONE и будет иметь отношения с другими неписями, как человек-нейтрал.

Также значения Guild и TrueGuild учитываются в функциях ИИ в скриптах. Про настройки анимации уже писалось.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.235
Благодарности
2.575
Баллы
455
Судя по тому, что упоминается
есть мнение что речь шла не о параметре НПЦ, а об массиве в Guilds.d, в котором прописываются отношения человеческих гильдий, которые к монстрам прямого отношения не имеют.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Подскажите, что это за гильдия - GIL_SEPERATOR_HUM? Типо все людские гильдии вместе?

Я так понял я все делал не правильно и Guild вообще для монстров не нужна и отношения монстров должны прописываться в В_InitMonsterAttitude.d?
1. разделитель, как уже писалось выше.
2. гильдия для монстров нужна и всегда должна быть указана в ее прототипе, от которого исходят их инстанции..
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.843
Благодарности
5.268
Баллы
910
Хотелось бы узнать, что именно было исправлено в Г2 в неофициальном обновлении, а именно этот пункт из списка изменений
-При загрузке игры у NPC больше нет неправильных анимаций боя (использована идея Myxomop)

Файл в story\b_story\b_meleeweaponchange.d просмотрел как и измененный файл items\Einhand_EquipBonus.d

Попытался сделать с кольцом, все равно после save/load гг теряет боевую стойку в которой был, а если снять кольцо, то прошлое значение возвращается, при этом стойка мастер будет всегда как самая первая. (Т.е. без кольца у ГГ 50% одноручное Боец, с кольцом ГГ 70% мастер)

Пример кольца
Daedalus:
var int hero_1h_max_bonus;
const int MASTER_1H_BONUS = 20;


instance ITRI_MASTER(C_Item)
{
    name = "Кольцо мастера";
    mainflag = ITEM_KAT_MAGIC;
    flags = ITEM_RING;
    value = 4000;
    visual = "ItRi_Prot_Mage_02.3ds";
    visual_skin = 0;
    material = MAT_METAL;
    on_equip = equip_MASTER;
    on_unequip = unequip_MASTER;
    wear = WEAR_EFFECT;
    effect = "SPELLFX_ITEMGLIMMER";
    description = "Кольцо мастера";
    text[2] = NAME_ADDON_BONUS_1H;
    count[2] = MASTER_1H_BONUS;
    text[5] = NAME_Value;
    count[5] = value;
};

func void equip_MASTER()
{
    if(Npc_IsPlayer(self) && (self.HitChance[NPC_TALENT_1H] < 100))
    {
        if((self.HitChance[NPC_TALENT_1H] + MASTER_1H_BONUS) > 100)
        {
            hero_1h_max_bonus = 100 - self.HitChance[NPC_TALENT_1H];
            B_AddFightSkill(self,NPC_TALENT_1H,hero_1h_max_bonus);
            b_meleeweaponchange(hero_1h_max_bonus,0,0);
        }
        else
        {
            hero_1h_max_bonus = -1;
            B_AddFightSkill(self,NPC_TALENT_1H,MASTER_1H_BONUS);
            b_meleeweaponchange(MASTER_1H_BONUS,0,0);
        };
    };
};

func void unequip_MASTER()
{
    if(Npc_IsPlayer(self) && (MELEEWEAPONCHANGEDHERO || (SCRIPTPATCHWEAPONCHANGE == FALSE)))
    {
        if(hero_1h_max_bonus < 0)
        {
            B_AddFightSkill(self,NPC_TALENT_1H,-MASTER_1H_BONUS);
            b_meleeweaponundochange();
        }
        else
        {
            B_AddFightSkill(self,NPC_TALENT_1H,-hero_1h_max_bonus);
            b_meleeweaponundochange();
        };
    };
};

Созданный файл b_meleeweaponchange.d
Daedalus:
var int MeleeWeaponChangedHero;
var int ChangedManaHero;
var int ChangedOneHHero;
var int ChangedTwoHHero;
var int ScriptPatchWeaponChange;

func void b_meleeweaponchange(var int oneh,var int twoh,var int manamax)
{
    MeleeWeaponChangedHero = TRUE;
    ChangedManaHero = manamax;
    ChangedOneHHero = oneh;
    ChangedTwoHHero = twoh;
    ScriptPatchWeaponChange = TRUE;
};

func void b_meleeweaponundochange()
{
    MeleeWeaponChangedHero = FALSE;
    ChangedManaHero = 0;
    ChangedOneHHero = 0;
    ChangedTwoHHero = 0;
    ScriptPatchWeaponChange = TRUE;
};
Файл b_meleeweaponchange.d был добавлен в gothic.src.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.153
Баллы
915
Здесь вам не Англия, копать надо глубже.:D Все изменения для оверлеев владения оружием в неофициальном обновлении прописаны в скрипте B_AddFightSkill.d. Вполне возможно, что в нём не всегда могут учитываться даваемые оружием или бижутерией временные бонусы к этим параметрам.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.843
Благодарности
5.268
Баллы
910
Здесь вам не Англия, копать надо глубже.:D Все изменения для оверлеев владения оружием в неофициальном обновлении прописаны в скрипте B_AddFightSkill.d. Вполне возможно, что в нём не всегда могут учитываться даваемые оружием или бижутерией временные бонусы к этим параметрам.

Покопал по глубже в Англию. Спасибо за наводку. Теперь работает все как часики*thumbs up*
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.663
Баллы
305
Пытаюсь портировать быстрые слоты сделанные на лего на платформу Г1. Не могу понять как этот хук должен выглядеть для первой Готики
Код:
HookEngineF(7369071, 6, QS_Hook);
 

ElektroWitch

Участник форума
Регистрация
24 Авг 2018
Сообщения
7
Благодарности
0
Баллы
150
Доброго времени суток дамы и господа, прошу вас уделить минуту внимания. Вопрос в этой теме уже поднимался, но как был решен не понятно, а пользователь не появлялся на форуме с прошлого года, так что даже уточнить не представляется возможным.
Суть в том, чтобы заставить игру выполнять определенные действия при нажатии клавиш (спаун монстров, в идеале зелий и включение\отключение бессмертия). К сожалению мои познания в области скриптинга равны полному нулю. Так что буду благодарна если кто-то поможет с написанием скриптов ну или хотя бы даст хорошего пинка в нужном направлении (помимо изучения С++). Благодарю за то что уделили время, хотя бы на прочтение данного сообщения.
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Доброго времени суток дамы и господа, прошу вас уделить минуту внимания. Вопрос в этой теме уже поднимался, но как был решен не понятно, а пользователь не появлялся на форуме с прошлого года, так что даже уточнить не представляется возможным.
Суть в том, чтобы заставить игру выполнять определенные действия при нажатии клавиш (спаун монстров, в идеале зелий и включение\отключение бессмертия). К сожалению мои познания в области скриптинга равны полному нулю. Так что буду благодарна если кто-то поможет с написанием скриптов ну или хотя бы даст хорошего пинка в нужном направлении (помимо изучения С++). Благодарю за то что уделили время, хотя бы на прочтение данного сообщения.
Простейший вариант - как раз связан с C++, правда изучать его не надо, если вам для тестов все это надо - просто создать пару блоков кода, которые будут вызывать функции у вас в скриптах при нажатии определенных клавиш. Уж в этом вам помогут без проблем.)
 

ElektroWitch

Участник форума
Регистрация
24 Авг 2018
Сообщения
7
Благодарности
0
Баллы
150
@Haart, благодарю за ответ) И кому можно продать душу за пару блоков кода?)
 
Последнее редактирование:

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
@Haart, и кому можно продать душу за пару блоков кода?)
Нам, участникам Форума.) как буду у компании, покажу.

@ElektroWitch, Все еще интересует ? Готов помочь с хоткеями, без привязки к скриптам. Т.е. что-бы удалить эти хоткеи, скрипты изменять не придется.
 
Последнее редактирование модератором:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.276
Благодарности
4.579
Баллы
625

ElektroWitch

Участник форума
Регистрация
24 Авг 2018
Сообщения
7
Благодарности
0
Баллы
150
Все еще интересует ?
Да, конечно) Интересует повсеместно и в полном объеме) Без привязки к скриптам? Хм... Я считала, что изменения возможны только через все круги ада изменение мира игры)
 
Сверху Снизу