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

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

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

HGn

Участник форума
Регистрация
25 Июн 2013
Сообщения
32
Благодарности
0
Баллы
155

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Не уверен, но попробуй прописать свой доспех в MDS-файле по аналогии с другими доспехами и декомпилируй после этого.
 

HGn

Участник форума
Регистрация
25 Июн 2013
Сообщения
32
Благодарности
0
Баллы
155
Не уверен, но попробуй прописать свой доспех в MDS-файле по аналогии с другими доспехами и декомпилируй после этого.

Так, вероятно я что-то не так делаю. Я скопировал .mdm доспеха в Gothic II\_work\Data\Anims\_compiled. С помощью ГотикСоурсера открыл HumanS.mds, в раздел // Armor-Meshes добавил registerMesh ("ARMOR_NOV_D.ASC") по аналогии с другими доспехами. Сохранил HumanS.mds, выбрал декомпиляцию (mds или msb), указал пустую папку в качестве рабочей, а в качестве модели указал Humans.msb. После декомпиляции проверил рабочую папку, там были все .asc кроме нужного мне. Вероятно нужно было сначала запустить игру и задействовать этот доспех?
 

unknown111

Участник форума
Регистрация
5 Фев 2013
Сообщения
1.075
Благодарности
1.586
Баллы
290
Так, вероятно я что-то не так делаю. Я скопировал .mdm доспеха в Gothic II\_work\Data\Anims\_compiled. С помощью ГотикСоурсера открыл HumanS.mds, в раздел // Armor-Meshes добавил registerMesh ("ARMOR_NOV_D.ASC") по аналогии с другими доспехами. Сохранил HumanS.mds, выбрал декомпиляцию (mds или msb), указал пустую папку в качестве рабочей, а в качестве модели указал Humans.msb. После декомпиляции проверил рабочую папку, там были все .asc кроме нужного мне. Вероятно нужно было сначала запустить игру и задействовать этот доспех?

временно замени любую стандартную MDM'ку своей (назови свою любой готической), декомпильни HUMANS.mds и будет тебе счастье...
 

HGn

Участник форума
Регистрация
25 Июн 2013
Сообщения
32
Благодарности
0
Баллы
155
временно замени любую стандартную MDM'ку своей (назови свою любой готической), декомпильни HUMANS.mds и будет тебе счастье...

Вы не представляете как мне помогли! Огромное человеческое спасибо.
 

ElderGamer


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

Эпизод 1. Использование факела с помощью функции AI_UseItemToState.

Для использования выбран не простой вариант факела (ItLsTorch), а его сгоревший вариант (ItLsTorchburned). В скриптах Г2 такая инстанция тоже есть, только не используется, насколько я знаю. В самой инстанции сделаны некоторые правки.
Код:
instance ItLsTorchburned(C_Item)
{
    name = "Сгоревший факел";
    mainflag = ITEM_KAT_NONE;
    flags = ITEM_MULTI;
    value = 0;
    visual = "ItLs_Torchburned_01.3ds";
    scemeName = "DRAWTORCH";
    material = MAT_WOOD;
    description = name;
};

Если игроку и удастся обнаружить такой вариант факела в игре, то это не вызовет подозрений, и будет выглядеть вполне естественно.

Для доставания и убирания факела из отдельных кадров других анимаций с помощью плагинов камрада Керракс собран специальный файл анимации, который можно найти в архиве вместе с другими исходниками во вложении к этому посту. Сценарии анимаций выглядят следующим образом:
Код:
            ani        ("t_DrawTorch_Stand_2_S0"    1    "s_DrawTorch_S0"        0.1    0.1    M.    "Hum_DrawTorch_M01.asc"        F    0    4)
            aniAlias        ("t_DrawTorch_S0_2_Stand"    1    ""                0.1    0.1    M.    "t_DrawTorch_Stand_2_S0"        R)
            ani        ("s_DrawTorch_S0"        1    "s_DrawTorch_S0"        0.0    0.0    M.    "Hum_DrawTorch_M01.asc"        F    5    5)
            ani        ("t_DrawTorch_S0_2_S1"        1    "s_DrawTorch_S1"        0.1    0.1    M.    "Hum_DrawTorch_M01.asc"        F    6    13)
            {
                *eventTag    (6    "DEF_CREATE_ITEM"    "ZS_LEFTHAND"    "ItLsTorchburning")
            }
            ani        ("s_DrawTorch_S1"        1    "s_DrawTorch_S1"        0.1    0.1    MI    "Hum_Torch_RunAmbient_M01.asc"    F    0    50 FPS:5)
            ani        ("t_DrawTorch_S1_2_S0"        1    "s_DrawTorch_S0"        0.1    0.1    M.    "Hum_DrawTorch_M01.asc"        R    6    13)
            {
                *eventTag    (6    "DEF_DESTROY_ITEM")
            }

Для того, чтобы непись достал факел, нужно прописать функции:
Код:
CreateInvItem(self,ItLsTorchburned);
AI_UseItemToState(self,ItLsTorchburned,1);

Для того, чтобы убрал:
Код:
AI_UseItemToState(self,ItLsTorchburned,-1);

Чтобы ГГ не мог использовать такой сгоревший факел из инвентаря, нужно в файле HUMANS.MDS прописать анимации-пустышки, при выполнении которых ничего не происходит.
Код:
            ani        ("t_DrawTorch_Stand_2_S0"    1    "s_DrawTorch_S0"        0.1    0.1    M.    "Hum_RunAmbient_M01.asc"        F    1    1)
            aniAlias        ("t_DrawTorch_S0_2_Stand"    1    ""                0.1    0.1    M.    "t_DrawTorch_Stand_2_S0"        R)
            ani        ("s_DrawTorch_S0"        1    "s_DrawTorch_S0"        0.0    0.0    M.    "Hum_RunAmbient_M01.asc"        F    1    1)
            aniAlias        ("t_DrawTorch_S0_2_S1"        1    "s_DrawTorch_S1"        0.1    0.1    M.    "t_DrawTorch_Stand_2_S0"        F)
            aniAlias        ("s_DrawTorch_S1"        1    "s_DrawTorch_S1"        0.1    0.1    M.    "s_DrawTorch_S0"            F)
            aniAlias        ("t_DrawTorch_S1_2_S0"        1    "s_DrawTorch_S0"        0.1    0.1    M.    "t_DrawTorch_Stand_2_S0"        R)

Полноценные же анимации нужно прописать в файле оверлея, назначаемого неписю в его инстанции. Так я, например, экспериментировал со стражниками Старого Лагеря и прописывал анимации в файле оверлея Humans_Militia.mds.

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

Эпизод 2. Использование факела с помощью функции AI_UseItem.

Инстанция сгоревшего факела может быть такой же, как в приведённом выше варианте, но я рассматривал разные способы, поэтому назвал анимации по-другому, что нашло отражение и в инстанции факела.
Код:
instance ItLsTorchburned(C_Item)
{
    name = "Сгоревший факел";
    mainflag = ITEM_KAT_NONE;
    flags = ITEM_MULTI;
    value = 0;
    visual = "ItLs_Torchburned_01.3ds";
    scemeName = "USETORCH";
    material = MAT_WOOD;
    description = name;
};

Сценарии анимаций:
Код:
            ani        ("t_UseTorch_Stand_2_S0"    1    "s_UseTorch_S0"        0.1    0.1    M.    "Hum_DrawTorch_M01.asc"        F    0    4)
            ani        ("s_UseTorch_S0"        1    "s_UseTorch_S0"        0.0    0.0    M.    "Hum_DrawTorch_M01.asc"        F    5    5)
            ani        ("t_UseTorch_S0_2_Stand"    1    ""                0.1    0.1    M.    "Hum_DrawTorch_M01.asc"        F    6    14)
            {
                *eventTag    (6    "DEF_CREATE_ITEM"    "ZS_LEFTHAND"    "ItLsTorchburning")
            }

Для того, чтобы непись достал факел, нужно прописать функции:
Код:
CreateInvItem(self,ItLsTorchburned);
AI_UseItem(self,ItLsTorchburned);

Заставить его убрать факел с использованием правильной анимации уже не получится, но некоторые функции, например, AI_SetWalkMode(self,NPC_WALK) или AI_Standup(self), приводят к исчезновению факела из руки. При попытке заговорить с неписем факел тоже, к сожалению, исчезает.

Анимации-пустышки для файла HUMANS.MDS:
Код:
            ani        ("t_UseTorch_Stand_2_S0"    1    "s_UseTorch_S0"        0.1    0.1    M.    "Hum_RunAmbient_M01.asc"        F    1    1)
            ani        ("s_UseTorch_S0"        1    "s_UseTorch_S0"        0.0    0.0    M.    "Hum_RunAmbient_M01.asc"        F    1    1)
            aniAlias        ("t_UseTorch_S0_2_Stand"    1    ""                0.1    0.1    M.    "t_UseTorch_Stand_2_S0"        F)

Эпизод 3. Использование особенностей движка.

В ходе экспериментов было замечено, что повторное использование факела приводит к тому, что факел из левой руки перекладывается движком в правую руку, а новый факел появляется в левой руке. После исчезновения факела из левой руки факел из правой руки возвращается обратно в левую руку. И уже после этого факел из левой руки убрать нельзя. Я пока не знаю способа, кроме удаления от непися и повторного приближения к нему. Тогда движок инициализирует непися и факела у него не будет. Пока же непись держит факел в руке, он может нормально выполнять свой распорядок дня и разговаривать с ГГ. Подобные же свойства, кстати, факел приобретает, если заставить непися поднять горящий факел, лежащий на земле. Использовать эту особенность движка можно в следующем сценарии анимаци вытаскивании факела:
Код:
            ani        ("t_UseTorch_Stand_2_S0"    1    "s_UseTorch_S0"        0.1    0.1    M.    "Hum_DrawTorch_M01.asc"        F    0    4)
            ani        ("s_UseTorch_S0"        1    "s_UseTorch_S0"        0.0    0.0    M.    "Hum_DrawTorch_M01.asc"        F    5    5)
            ani        ("t_UseTorch_S0_2_Stand"    1    ""                0.1    0.1    M.    "Hum_DrawTorch_M01.asc"        F    6    14)
            {
                *eventTag    (6    "DEF_CREATE_ITEM"    "ZS_LEFTHAND"    "ItLsTorchburning")
                *eventTag    (8    "DEF_CREATE_ITEM"    "ZS_LEFTHAND"    "ItLsTorchburning")
                *eventTag    (10    "DEF_DESTROY_ITEM")
            }

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

На основании данного способа я попробовал реализовать распорядок стражника в шахте. В начале выполнения распорядка стражник подбирает выпавший из рук факел или "достаёт" факел из инвентаря. В дальнейшем он стоит на своём посту, держа факел в руке.
Код:
func void ZS_GuardUnderGround()
{
    PrintDebugNpc(PD_TA_FRAME,"ZS_GuardUnderGround");
    GuardPerception();
    Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessSC);
    AI_Standup(self);
    AI_RemoveWeapon(self);
    AI_SetWalkMode(self,NPC_WALK);
    if(!Npc_HasItems(self,ItLsTorchburned))
    {
        CreateInvItem(self,ItLsTorchburned);
    };
    if(!Npc_WasInState(self,ZS_Talk))
    {
        Npc_PerceiveAll(self);
        if(Wld_DetectItem(self,ITEM_TORCH))
        {
            if((Npc_GetDistToItem(self,item) < 700) && Hlp_IsItem(item,ItLsTorchburning))
            {
                AI_GotoItem(self,item);
                AI_TakeItem(self,item);
            }
            else
            {
                AI_UseItem(self,ItLsTorchburned);
            };
        }
        else
        {
            AI_UseItem(self,ItLsTorchburned);
        };
    };
    if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == 0)
    {
        AI_GotoWP(self,self.wp);
    };
};
 
func void ZS_GuardUnderGround_Loop()
{
    PrintDebugNpc(PD_TA_LOOP,"ZS_GuardUnderGround_Loop");
    AI_SetWalkMode(self,NPC_RUN);
    if(Npc_GetStateTime(self) >= 5)
    {
        Npc_PerceiveAll(self);
        if(Wld_DetectItem(self,ITEM_TORCH))
        {
            if(Npc_GetDistToItem(self,item) < 700)
            {
                AI_StopLookAt(self);
                AI_SetWalkMode(self,NPC_WALK);
                AI_GotoItem(self,item);
                AI_TakeItem(self,item);
                if(Wld_IsFPAvailable(self,"GUARD"))
                {
                    AI_GotoFP(self,"GUARD");
                }
                else
                {
                    AI_GotoWP(self,self.wp);
                };
            };
        };
        if(Npc_HasItems(self,ItLsTorch) > 2)
        {
            Npc_RemoveInvItem(self,ItLsTorch);
        };
        Npc_SetStateTime(self,0);
    }
    if(Npc_GetDistToNpc(self,hero) < 800)
    {
        B_SmartTurnToNpc(self,hero);
    }
    else
    {
        if(Npc_IsOnFP(self,"GUARD"))
        {
            AI_AlignToFP(self);
        }
        else if(Wld_IsFPAvailable(self,"GUARD"))
        {
            AI_SetWalkMode(self,NPC_WALK);
            AI_GotoFP(self,"GUARD");
        }
        else
        {
            AI_AlignToWP(self);
        };
    };
    AI_Wait(self,1);
};
 
func void ZS_GuardUnderGround_End()
{
    PrintDebugNpc(PD_TA_FRAME,"ZS_GuardUnderGround_End");
};

UseTorch.jpg

Приведённые примеры актуальны для Г1. Предположительно, это будет работать и в Г2. Если кто-то решит попробовать, любопытно будет узнать результат. Также интересно было бы услышать мнение специалистов о том, можно ли заставить непися убрать факел в инвентарь, если он был помещён в руку с использованием описанных особенностей движка.
 

Вложения

  • DRAWTORCH_ASC.rar
    84,9 KB · Просмотры: 90

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Подскажите: Персонаж гильдии GIL_VLK. Экипировал хорошим луком о хорошим мечом. Задаю ему атаковать персонажа гильдии GIL_BDT.

B_Attack(self,mNPC1,AR_NONE,1);

Он благополучно рубит его мечом.

1. Как сделать так, чтобы он его добил?

2. Как заставить не рубить мечом, а застрелить из лука?
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
kraw
1. Сделай причиной атаки AR_KILL, например. Тогда добъет.
2. Смотри скрипт B_SelectWeapon. Там всё от дистанции зависит просто.
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.183
Благодарности
2.880
Баллы
420
ElderGamer написал(а):
...можно ли заставить непися убрать факел в инвентарь, если он был помещён в руку с использованием описанных особенностей движка.
Возможно, помог бы тег event SwapMesh, возвращающий факел в правую руку. А там уже удалить предмет через промежуточные фазы анимаций.
В любом случае, все эти манипуляции не избавят от глючности горящей деревяшки в руке. Потому что убого это реализовано даже для управляемых игроком "Хумансов". Что уж говорить по NPC.
Думается, что рабочим вариантом была бы правка движка с введением специального режима движения с факелом в руке, подобного боевым режимам. Т.е. введение в MDS-скрипт специальных фаз анимаций с префиксом torch.
Экипируем факел - включается это режим анимаций для бега, ходьбы, стрейфа, прыжков и прочего базиса. Жестикуляция в диалогах отключается. Достаем оружие, используем мобы, погружаемся в воду, падаем - режим выключается, факел падает на землю или возвращается в инвентарь.
С таким подходом не важно еще, какая модель у нас бегает - "Хуманс" или любая другая пользовательская. Что повысило бы гибкость движка в целом.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Завел я новый прототип для падальщиков. Нужно, чтобы они ни при каких условиях никого не атаковали. Они у меня бегают по замкнутому маршруту. гг их рубит, нужно, чтобы они не обращали на него никакого внимания.

Может кто знает как это сделать?
 

Хелдар

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

Может кто знает как это сделать?
Попробуй так:

Идешь в AI\Monster\B_Monster\B_InitMonsterAttitudes.d, ищешь там Scavenger и меняешь ему ATT_HOSTILE на ATT_FRIENDLY. Нападать не будет точно, про самооборону только затрудняюсь ответить. Проверь, будет ли она присутствовать.
 

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

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Πавел я новый прототип для падальщиков. Нужно, чтобы они ни при каких условиях никого не атаковали. Они у меня бегают по замкнутому маршруту. гг их рубит, нужно, чтобы они не обращали на него никакого внимания.
Чтобы не нападали первыми, можно прописать aivar[AIV_NoFightParker] = TRUE;
С тем, чтобы не обращали внимания, когда их рубят, немножко сложнее. К сожалению, в B_MM_AssessDamage() нет такого условия, чтобы монстр не среагировал на урон. Варианты решения:
а) Самый простой - отключить восприятие урона в расписании ZS_... через Npc_PercDisable(self,PERC_ASSESSDAMAGE); Но тогда не будет наноситься спец. урон (от Когтя Белиара и т.п.).
б) Добавить подходящее условие в B_MM_AssessDamage() сразу после B_BeliarsWeaponSpecialDamage(other,self);
в) Написать собственный вариант реакции на урон вместо B_MM_AssessDamage(), в котором будет только реакция на особое оружие, и подключить его в расписании через Npc_PercEnable(self, B_MM_AssessDamage_NoReaction):
Код:
func void B_MM_AssessDamage_NoReaction()
{
    B_BeliarsWeaponSpecialDamage(other,self);
    // если есть еще какой-то особый урон, добавить сюда
};
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
У меня есть вопрос по моделированию:
Я сделал модель меча, и когда я его экспортирую в 3ds, он становится очень большим. Я пробовал его уменьшать и экспортировать, но он всё равно увеличивается до такого же размера.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.851
Благодарности
6.728
Баллы
1.625
У меня есть вопрос по моделированию:
Я сделал модель меча, и когда я его экспортирую в 3ds, он становится очень большим. Я пробовал его уменьшать и экспортировать, но он всё равно увеличивается до такого же размера.
читаем начало моделирования готы.
первое что приходит на ум: в чем измеряются оси X Y Z ?
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
читаем начало моделирования готы.
первое что приходит на ум: в чем измеряются оси X Y Z ?
Поставил на сантиметры, но проблема осталась.

Всё, разобрался с проблемой.
 

retej

Участник форума
Регистрация
27 Июн 2011
Сообщения
127
Благодарности
55
Баллы
175
Есть вопрос по заклам Пирокинез и Молния в Г1. Где у них прописывается расход маны?
 

Хелдар

Участник форума
Регистрация
3 Июл 2012
Сообщения
2.450
Благодарности
780
Баллы
375
Есть вопрос по заклам Пирокинез и Молния в Г1. Где у них прописывается расход маны?

Во второй расход маны для "Молнии" прописывался в файле spell_LightningFlash.d (AI\Magic\Spells) строкой const int SPL_Cost_LightningFlash = 30; Думаю, в Первой так же. С пирокинезом аналогично должно быть.
 

retej

Участник форума
Регистрация
27 Июн 2011
Сообщения
127
Благодарности
55
Баллы
175
Я так понимаю, что это то же, что в первой прописывается SPL_SENDCAST в файле spell_params. Вот именно для этих двух как раз не прописано (и нигде еще я тоже не нашел), а если добавлять вручную - эффекта нет. Возможно, если переписывать файл spell_logic, то сработает. Но такие заклы, не уверен, что они будут потом правильно работать.
 

Хелдар

Участник форума
Регистрация
3 Июл 2012
Сообщения
2.450
Благодарности
780
Баллы
375
Я так понимаю, что это то же, что в первой прописывается SPL_SENDCAST в файле spell_params. Вот именно для этих двух как раз не прописано (и нигде еще я тоже не нашел), а если добавлять вручную - эффекта нет. Возможно, если переписывать файл spell_logic, то сработает. Но такие заклы, не уверен, что они будут потом правильно работать.

Попробуй так:
в spell_LightningFlash.d в начале файла пропиши const int SPL_Cost_LightningFlash = *нужное число маны*; , а потом в файле поставь проверку
Код:
func int Spell_Logic_LightningFlash(var int manaInvested)
{
    if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
    {
        return SPL_SENDCAST;
    }
    else if(self.attribute[ATR_MANA] >= SPL_Cost_LightningFlash)
    {
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};
Так реализовано во Второй Готике, работать должно и в первой.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Может кто сталкивался с таким феноменом:

Делаю мод на основе скриптовой болванки G2a.

Файл PrjGothic/ai/Human/Guilds.d не менял. Для гильдии GIL_BDT отношение к самим себе ATT_FRIENDLY. Тем не менее, когда рядом оказываются двое из этой гильдии, рубятся друг с другом насмерть. Особенно забавно было запустить "бандитский лагерь" в первый раз, когда все обитатели начали между собой сражаться. Только вот мод на этом не построить...
 
Сверху Снизу