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

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

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

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

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.336
Благодарности
3.181
Баллы
525
эту функцию можно доводить до любой дистанции, а потом прервать, когда условие distance <= X будет достигнуто
Не знаю способа. Если знаешь, подскажи.

Провёл небольшой эксперимент, заставляя Снафа подходить к ГГ с помощью функции AI_GotoNpc:
AI_GotoNpc.jpg
Во-первых, расстояние всё-таки великовато для нормальной передачи предмета. Во-вторых, оно нестабильно. При равных стартовых условиях (Снаф взаимодействует с котлом, ГГ стоит на месте) получил разброс расстояния от 166см до 173см в выборке из пяти попыток. При изменении начального расстояния между Снафом и ГГ получил разброс от 152см до 180см. Такая неопределённость расстояния не позволяет нормально согласовать анимации передающего и принимающего.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
435
Благодарности
261
Баллы
230
Можно попробовать перехватить функцию через плагин и покрутить в ней разными параметрами:
C++:
// Должно повлиять на функцию AI_GotoNpc.
// (только адрес нужен согласно движку)
//0x007947E0 private: int __thiscall oCNpc::RbtGotoFollowPosition(void)
static int __fastcall RbtGotoFollowPosition(oCNpc* _this);
static CInvoke <int(__thiscall*)(oCNpc*)> pRbtGotoFollowPosition(0x007947E0, RbtGotoFollowPosition, IVK_AUTO);
static int __fastcall RbtGotoFollowPosition(oCNpc* _this)
{
    if (_this)
    {
        // дистанция приближения в каких-то единицах
        _this->rbt.maxTargetDist = 10000;

        // _this->rbt.positionUpdateTime - возможно повлияет на точность приближения
    }

    // дальнейший вызов оригинальной функции
    return pRbtGotoFollowPosition(_this);
}

Ещё нужно решить вопрос разброса персонажей по высоте.
Как вариант не разрешать передачу в этом случае. А если очень надо или высота не очень большая, что тогда?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.336
Благодарности
3.181
Баллы
525
Не знаю, что при этом правится. Но если правится некое граничное расстояние, при достижении которого происходит остановка, то это не исправит нестабильность расстояния.

Как я понимаю, происходит следующее. Тушка движется, выполняя в цикле состояние s_walkl. За каждый цикл тушка продвигается вперёд на ХХсм. Если фиксируется, что расстояние до цели стало меньше граничного значения, то следует выход из цикла и переход в другое состояние t_walkl_2_walk -> s_walk. Но вот, насколько будет превышено граничное состояние - это неопределённая величина. Разброс, теоретически, может достигать ширины двух шагов ХХсм (один цикл движения).

Чтобы остановка произошла на строго определённом расстоянии, требуется усложнение алгоритма остановки, как мне кажется.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Чтобы остановка произошла на строго определённом расстоянии, требуется усложнение алгоритма остановки, как мне кажется.
Считаю что не нужно заморачиваться с анимацией. Достаточно приблизительно сблизить персонажей, а в момент смены камеры незаметно отцентрировать их как следует.
Что до разных плоскостей - можно без проблем реализовать это смешенной анимацией как в прицеливании у дальнобоев. Назначаем какой-нибудь кости свойство выполнять наклон в соответствие с направляющим вектором между self и other и всё.

Upd Просто тут еще фишка в том, что от самой анимации эта погрешность может сильно меняться и смысла от подгонки становится 0...
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Народ, у кого установлена чистая Г2 и Г2 НВ от какелы, сделайте по паре скринов из настроек меню игры этих версий::
Меню → Настройки → Игра
Меню → Настройки → Звук
и закиньте сюда.. спасибо. :)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
сп не важен, он в скриптах ничего не меняет..
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Лови
Пост автоматически объединён:

Готика 2. Вообще ничего не установлено.
 

Вложения

  • Gothic2 2019-08-18 12-49-59-627.jpg
    Gothic2 2019-08-18 12-49-59-627.jpg
    241,9 KB · Просмотры: 252
  • Gothic2 2019-08-18 12-50-13-311.jpg
    Gothic2 2019-08-18 12-50-13-311.jpg
    225,6 KB · Просмотры: 248
  • Gothic2 2019-08-18 12-50-20-259.jpg
    Gothic2 2019-08-18 12-50-20-259.jpg
    228,1 KB · Просмотры: 234
  • Gothic2 2019-08-18 12-50-28-211.jpg
    Gothic2 2019-08-18 12-50-28-211.jpg
    243,6 KB · Просмотры: 229
  • Gothic2 2019-08-18 12-59-11-541.jpg
    Gothic2 2019-08-18 12-59-11-541.jpg
    334,6 KB · Просмотры: 243
  • Gothic2 2019-08-18 12-59-18-961.jpg
    Gothic2 2019-08-18 12-59-18-961.jpg
    327,9 KB · Просмотры: 233
  • Gothic2 2019-08-18 12-59-26-384.jpg
    Gothic2 2019-08-18 12-59-26-384.jpg
    329,2 KB · Просмотры: 225
  • Gothic2 2019-08-18 12-59-32-979.jpg
    Gothic2 2019-08-18 12-59-32-979.jpg
    334,2 KB · Просмотры: 257
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Эт самое, у кого-нибудь есть HumanS.MDS с расширенным списком анимаций и желательно с исходниками ASC? На оригинальной кукле Hum_Body_Naked0.ASC.
Смысл в том, что имеется код, который позволяет внедрять новые анимации в игру через MDS Overlay без нужды в перекомпиляции главного MDS.
alex_draven в первую очередь вопрос к тебе
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.847
Благодарности
5.274
Баллы
910
Хотелось бы узнать, почему движок игры все равно вставляет предмет/непися на не существующем FP (но в правильном месте)
Daedalus:
instance ITWR_THERIDDLE5(C_Item)
{
    name = "Старая книга";
    mainflag = ITEM_KAT_DOCS;
    flags = ITEM_MISSION;
    value = 50;
    visual = "ItWr_Book_02_03.3ds";
    material = MAT_LEATHER;
    scemeName = "MAP";
    description = "Хроманин 5";
    text[5] = NAME_Value;
    count[5] = value;
    on_state[0] = usetheriddle5;
};

func void usetheriddle5()
{
    var int nDocID;
    var C_Npc riddler;
    IT_Written(OldWorld_Zen);
    if(JESTEMWGD == TRUE)
    {
        if(RIDDLE5 == FALSE)
        {
            B_GivePlayerXP(100);
            B_LogEntry(TOPIC_THERIDDLE,"Кажется, это последняя книга. 'Ты найдешь меня там, где все началось.' И я уже знаю кого там встречу - кучу нечисти и очередного мервого идиота.");
            Snd_Play("FoundRiddlersBook");
            Wld_InsertNpc(bau_7542_riddler,"FP_FOGTOWER_BOOK");
            riddler = Hlp_GetNpc(bau_7542_riddler);
            B_KillNpc(riddler);           
            RIDDLE5 = TRUE;
        }
        else
        {
            B_Say(self,self,"$NOTHINGNEW");           
        };
    };
    nDocID = Doc_Create();
    Doc_SetPages(nDocID,2);
    Doc_SetPage(nDocID,0,"Book_Mage_L.tga",0);
    Doc_SetPage(nDocID,1,"Book_Mage_R.tga",0);
    Doc_SetFont(nDocID,-1,"font_20_book.tga");
    Doc_SetMargins(nDocID,0,275,20,30,20,1);
    Doc_PrintLine(nDocID,0,"");
    Doc_PrintLine(nDocID,0,"Хроманин");
    Doc_PrintLine(nDocID,0,"-----------");
    Doc_SetFont(nDocID,-1,"font_10_book.TGA");
    Doc_PrintLine(nDocID,0,"");
    Doc_PrintLines(nDocID,0,"Но я не буду вставать на этот путь один. Я должен буду разделить силу, сокрытую во мне, с достойным, который найдет меня. Надеюсь, мое ожидание не затянется надолго...");
    Doc_SetMargins(nDocID,-1,30,20,275,20,1);
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLines(nDocID,1,"Ты найдешь меня там, где все началось.");
    Doc_Show(nDocID);
};

Имеем вставку непися на FP FP_FOGTOWER_BOOK
В локации oldworld.zen нет этого FP от слова совсем. Но есть FP с близким названием FP_STAND_FOGTOWER_BOOK
В итоге НПС спавнится на FP_STAND_FOGTOWER_BOOK
Я почему-то думал, если нет нужного WP/FP предмет/непись должны спавниться в нулевой координате, в этой локации над подземельем замка старого лагеря.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.125
Благодарности
3.218
Баллы
485
Имеем вставку непися на FP FP_FOGTOWER_BOOK
В локации oldworld.zen нет этого FP от слова совсем. Но есть FP с близким названием FP_STAND_FOGTOWER_BOOK
В итоге НПС спавнится на FP_STAND_FOGTOWER_BOOK
Если точки нет, то непись спавнится просто где-то. На нулевых координатах его не будет, в мире к нему нельзя будет попасть через goto vob, а перед загрузкой сохранений он будет вычищен из памяти вместе с остальными правильными неписями (если вырезать из скриптов его инстанцию, то попытка загрузить любую сохраненку завершится вылетом - игра обращается к этому неписю, потому что он действительно существует в мире).
Однако, если у непися прописан правильный распорядок дня с существующими точками, то непись использует для своей инкарнации именно эти точки. В таком случае точка спауна в команде Wld_InsertNpc совершенно не важна.

Приведу примеры из Г2НВ (актуальны только при вставке неписей вне зоны видимости игрока):
Daedalus:
//точка NW_CITY_ENTRANCE_01 существует, непись будет вставлен туда...
Wld_InsertNpc(MIL_302_Torwache,"NW_CITY_ENTRANCE_01");

//...и сразу исчезнет из игры, потому что точка NW_CITY_GUARDOFFICE_GUARD_01 не существует
func void Rtn_Start_302()
{
    TA_Guard_Passage(8,0,23,0,"NW_CITY_GUARDOFFICE_GUARD_01");
    TA_Guard_Passage(23,0,8,0,"NW_CITY_GUARDOFFICE_GUARD_01");
};

Итог: непись вставлен правильно и недоступен
Daedalus:
//точка ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_01 не существует, непись вставляется неизвестно куда...
Wld_InsertNpc(BDT_10400_Addon_DeadBandit,"ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_01");

//...zSpy выдает сообщение об ошибке...
SPAWN: Spawnpoint ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_01 not found. Npc BDT_10400_ADDON_DEADBANDIT cannot be spawned. .... <oSpawn.cpp,#450>

//...но точка в распорядке непися (ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_02) правильная, поэтому он будет существовать на ней
func void Rtn_Start_10400()
{
    TA_Stand_WP(8,0,16,0,"ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_02");
    TA_Stand_WP(16,0,8,0,"ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_02");
};

Итог: непись вставлен неправильно и доступен
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Народ, тут такой вопрос назрел для тех кто любит ковыряться в мирах Г1.:
Под мостом в пещере должен спавнится BLACKGOBBOLEADER но в скриптах такого нет вообще, откуда он взялся.. кто-нить встречал его в скриптах или в мирах игры ??
unknown1.png unknown2.png
Код из проблемного сейва::
Код:
[npc804 oCNpc:zCVob 52224 27057]
        pack=int:1
        dataRaw=raw:f6b6e5c6107a3ec4cfbe1a46fc10e5c6a81028c448e91b46ed6de5c6b41635c4b6791b469dfdd9be000000803fa3673f000000000000803f000000003fa367bf000000009dfdd9be5822
        vobName=string:BLACKGOBBOLEADER
        [% zCEventManager 0 27058]
            cleared=bool:1
            active=bool:0
            [emCutscene % 0 0]
            []
        []
        sleepMode=int:0
        nextOnTimer=float:3.40282347e+038
        npcInstance=string:BLACKGOBBOLEADER
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.125
Благодарности
3.218
Баллы
485
К чему относятся подобные сообщения zSpy?
Код:
[w] 106:06 Warn:  0 B:     CS: Cutscene "19448" has no player .... <zCCsContext.cpp,#447>
[w] 106:10 Warn:  0 B:     CS: Cutscene "19449" has no player .... <zCCsContext.cpp,#447>


Под мостом в пещере должен спавнится BLACKGOBBOLEADER но в скриптах такого нет вообще, откуда он взялся.. кто-нить встречал его в скриптах или в мирах игры ??
Это из моего Gothic Russobit-M Fix. Может, в каком-то моде тоже есть такой.
Daedalus:
instance BLACKGOBBOLEADER(MST_DEFAULT_BLACKGOBBO)
{
    level = 17;
    set_blackgobboleader_visuals();
    Npc_SetToFightMode(self,itmw_1h_sword_short_01);
    attribute[ATR_STRENGTH] = 60 + 30;
    attribute[ATR_HITPOINTS_MAX] = 115;
    attribute[ATR_HITPOINTS] = 115;
    protection[PROT_BLUNT] = 60;
    protection[PROT_EDGE] = 60;
    name[0] = "Гоблин-вожак";
};
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Gratt, вот откуда ноги этого глючного гоблина торчат.. *ded*
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.184
Благодарности
2.879
Баллы
420
Эт самое, у кого-нибудь есть HumanS.MDS с расширенным списком анимаций и желательно с исходниками ASC? На оригинальной кукле Hum_Body_Naked0.ASC.
С оригинальной куклой не общаюсь. По вопросу не понятно. Чем не устравивает декомпиляция? Щелк и весь список в папке в виде asc.
Исходников оригинальной сборки в природе не существует. Моя сборка не закончена и там будет другой список названий файлов.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Чем не устравивает декомпиляция?
Поставка модов или просто дополнений к существующим анимациям. Несколько авторов не смогут работать с одной болванкой в силу несовместимости конечных MDS. А тут все предельно просто. Достаточно вписать новые анимации в MDS оверлей и они подтянутся к основному списку.
Например плагин на скрытное убийство не обязан будет тянуть за собой перекомпилированный HumanS. Возможно потом еще посмотрю загрузку анимаций заведомо несовместимых скелетов, чтобы была минимальная поддержка, например, твоей куклы и оригинальной.
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.184
Благодарности
2.879
Баллы
420
Новые анимации к конечному мдс не зависят от типа сборки, т.к. все имена телодвижений фиксированы на уровне движка. Автор лишь выбирает, что ему для сборки требуется. Например, если у меня в моде нет обучения передвижения без шума, то я просто вырезаю блок анимаций sneak. Тот, кто захочет на базе этой сборки сделать свою, может просто дописать этот блок в любой форме. При условии, что ast его поддерживает.
Главный враг тут это несовместимость кукол с разной иерархией скелета. Ты это никак не победишь. Если у меня нет исходников какой то модели, то хрен когда я ее расширю.

Мои анимации кстати должны по идее без проблем компилироваться со стандартной куклой. Мой скелет это исходный скелет с новыми слотами. Мои сырые asc не содержат информации о слотах вообще. А значит должны лечь на исходник без ошибок.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Народ, кто нибудь помнит какие каталоги отсутствуют в оригинальных установках г1, г2, г2а, и г1а возможно?
Пока для этих приколхозил проверку/исправление/создание:
Код:
..\_work\data\Anims\_compiled
..\_work\data\Meshes\_compiled
..\_work\data\Textures\_compiled
..\Saves\current
может еще что было ?! ::)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.174
Благодарности
6.153
Баллы
1.565
MaGoth, да там и decompiled куча, а у текстур и того подавно...
 
Сверху Снизу