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

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

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

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

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.862
Благодарности
5.300
Баллы
910
Не знаешь а икарус или лего могут это сделать?
Как-то так. Нужно иметь установленный ikarus+Lego

SetBarPositions_Init с аргументами TRUE или FALSE нужно добавить в инициализацию Init_Global
SetBarPositions_Init(TRUE,TRUE)
1-й аргумент, показывать постоянно ману
2-й аргумент, показывать постоянно бар воздуха

Daedalus:
/*
* setBarPositions.d
* Source: https://forum.worldofplayers.de/forum/threads/?p=26426112
*
* Specify the positions of hp, mana, swim and focus bars.
*
* - Requires Ikarus, LeGo (HookEngine)
* - Compatible with Gothic 1 and Gothic 2
*
* Instructions
* - Adjust the customizable function to determine the bar positions
* - Initialize from Init_Global with
*     SetBarPositions_Init(TRUE/FALSE, TRUE/FALSE);
*   where the first and second arguments state whether the mana and swim bars should be always visible
*/


/*
* Customization function to specify the position of the bars in virtual coordinates
*/
func int SetBarPosition(var int barPtr) {
    var oCViewStatusBar bar; bar = _^(barPtr);
    var int x; var int y;

    if (barPtr == MEM_Game.hpBar) {
        // Original
        x = Print_ToVirtual(10, PS_X);                                // 10 px from the left
        y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y);  // 10 px from the bottom

    } else if (barPtr == MEM_Game.manaBar) {
        // Original
        x = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizex, PS_X);  // 10 px from the right
        y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y);  // 10 px from the bottom

    } else if (barPtr == MEM_Game.swimBar) {
        // Original
        x = (PS_VMax - bar.zCView_vsizex) / 2;                        // Centered
        y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y);  // 10 px from the bottom

    } else if (barPtr == MEM_Game.focusBar) {
        // Original
        x = (PS_VMax - bar.zCView_vsizex) / 2;                        // Centered
        y = Print_ToVirtual(10, PS_Y);                                // 10 px from the top
    };

    return x | (y << 14);
};


/*
* Internal function
*/
func void SetBarPositions() {
    MEM_InitGlobalInst();

    const int MASK_X =  (PS_VMax << 1) - 1;
    const int MASK_Y = ((PS_VMax << 1) - 1) << 14;
    var int xy;

    xy = SetBarPosition(MEM_Game.hpBar);
    ViewPtr_MoveTo(MEM_Game.hpBar, (xy & MASK_X), (xy & MASK_Y) >> 14);

    xy = SetBarPosition(MEM_Game.manaBar);
    ViewPtr_MoveTo(MEM_Game.manaBar, (xy & MASK_X), (xy & MASK_Y) >> 14);

    xy = SetBarPosition(MEM_Game.swimBar);
    ViewPtr_MoveTo(MEM_Game.swimBar, (xy & MASK_X), (xy & MASK_Y) >> 14);

    xy = SetBarPosition(MEM_Game.focusBar);
    ViewPtr_MoveTo(MEM_Game.focusBar, (xy & MASK_X), (xy & MASK_Y) >> 14);
};


/*
* Initialization function
*/
func void SetBarPositions_Init(var int manaAlwaysOn, var int swimAlwaysOn) {
    MEM_InitAll();

    const int oCGame__UpdateScreenResolution_removeBarViews_G1 = 6524729; //0x638F39
    const int oCGame__UpdateScreenResolution_removeBarViews_G2 = 7090409; //0x6C30E9
    const int oCGame__UpdatePlayerStatus_manaBarJmp_G1         = 6525351; //0x6391A7
    const int oCGame__UpdatePlayerStatus_manaBarJmp_G2         = 7091198; //0x6C33FE
    const int oCGame__UpdatePlayerStatus_swimBarJmp_G1         = 6525142; //0x6390D6
    const int oCGame__UpdatePlayerStatus_swimBarJmp_G2         = 7090988; //0x6C332C
    var int addr;

    // Hook positioning
    HookEngineF(MEMINT_SwitchG1G2(oCGame__UpdateScreenResolution_removeBarViews_G1,
                                  oCGame__UpdateScreenResolution_removeBarViews_G2), 6, SetBarPositions);

    // Always show mana bar
    if (manaAlwaysOn) {
        addr = MEMINT_SwitchG1G2(oCGame__UpdatePlayerStatus_manaBarJmp_G1, oCGame__UpdatePlayerStatus_manaBarJmp_G2);
        if (MEM_ReadInt(addr) != /*90 90 90 90*/-1869574000) {
            MemoryProtectionOverride(addr, 1);
            MEM_WriteByte(addr, 0);
        };
    };

    // Always show swim bar
    if (swimAlwaysOn) {
        addr = MEMINT_SwitchG1G2(oCGame__UpdatePlayerStatus_swimBarJmp_G1, oCGame__UpdatePlayerStatus_swimBarJmp_G2);
        MemoryProtectionOverride(addr, 2);
        MEM_WriteByte(addr,   /*EB*/235); // jmp
        MEM_WriteByte(addr+1, /*1C*/ 28); // 0x28
    };
};

Чтобы изменить положение баров, надо изменить их виртуальные координаты в функции SetBarPosition на эти
Daedalus:
    if (barPtr == MEM_Game.hpBar) { //изменить положение бара здоровья
        x = Print_ToVirtual(10, PS_X);
        y = PS_VMax - Print_ToVirtual(6 + 3 * (4 + bar.zCView_psizey), PS_Y);

    } else if (barPtr == MEM_Game.manaBar) { //изменить положение бара маны
        x = Print_ToVirtual(10, PS_X);
        y = PS_VMax - Print_ToVirtual(6 + 2 * (4 + bar.zCView_psizey), PS_Y);

    } else if (barPtr == MEM_Game.swimBar) { //изменить положение бара воздуха
        // Original
        x = (PS_VMax - bar.zCView_vsizex) / 2;                        // Centered
        y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y);  // 10 px from the bottom
Источник
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
549
Благодарности
142
Баллы
220
Есть старый сейв. Затем меняется мир (для начала добавим один вейпоинт и включим его в вэйнет). Грузим старый сейв, и в нём нет этого вейпоинта.
Начинаю новую игру. Делаю сейв под измененным миром (как ANSI). Ищу вейпоинт, вот он:
[wayl4095 § 0 22364]
[]
[wayr4095 zCWaypoint 0 23162]
wpName=string: PSI_TEMPLE_STAIRS_5
waterDepth=int:0
underWater=bool:0
position=vec3:48958.0938 -3913.75122 -956.959534
direction=vec3:0.956304729 0 -0.292371839
[]
Думал, верхняя строка включает вейпоинт в вейнет. Переношу этот блок в старый сейв. Гружу, увы, вейпоинт не добавляется. Вопрос, как сделать, чтоб работало?

P.S. Задачу решил, нужно id новые расчитать, и количество объектов увеличить на 1.
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
549
Благодарности
142
Баллы
220
Существует ли возможность добавлять в мир новые объекты (такие как дерево, лестница, костёр и т.д.) и удалять их по ходу игры?
Насколько я знаю, нет. Было бы неплохо реализовать такую штуку на Юнионе, в виде функций для скриптов.
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.022
Благодарности
522
Баллы
350
Я тебя не понял. Хочешь сказать, что способ есть? И что значит "нормальный" модинг?
Скорее всего он тебя не правильно понял. В теории можно действительно создать целую батарею муверо-вобов и свапать их на уже заранее подготовленные места. Правда такой свап будет ограничен тем, что место нужно выставит в спейсере.
План с выставление через Юнион тоже имеет подводные камни в виде того, что вобы имеют приличное количество настроек и такое если и возможно, то только с помощью достаточно прокаченного плагина. В любом случае я подобное ещё не видел
З.ы если есть вопросы в плане возможностей Юни, крайне рекомендую призывать Gratt. Что скажешь?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
В любом случае я подобное ещё не видел
на костылях лего и икуруса это пилится в два счета, там даже мод замутили, наподобие а-ля "Цива", где каждая хрень строится и возводится по камушкам, палочкам, бревнышкам, ищите его на дойчевоге, ибо названия я сейчас не помню его, как и то вышел он уже или нет..
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.288
Благодарности
4.585
Баллы
625
Сначала механику надо понимать. Я бы захоткеил создание костра при условии материалов в инвентаре. Далее ввел бы проверку на валидность территории. Отсутствие крыши, земляная поверхность под ногами и минимальный угол наклона поверхности. Если все гуд, то можно сетить костер. Чтобы убрать - персонаж его разберет на составляющие.
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
549
Благодарности
142
Баллы
220
Gratt, мне просто нужна возможность разместить объект в мире через скрипты, задав его имя, координаты и разворот. Задача у меня такая: есть территория, до определенного момента она пуста, затем по ходу игры туда приходит группа людей и разбивает лагерь. И вот тут нужно добавить костёр, кровати и т.д. Также может понадобиться удалить некоторые объекты из мира (например, валяющиеся скелеты).
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
549
Благодарности
142
Баллы
220
Gratt, а если через Mdl_SetVisible сделать модель невидимую для игрока, он может наткнуться на неё и остановиться?

А через мувер, это типа спрятать под землёй, и поднять, когда нужно?
 

Gratt


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

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
А через мувер, это типа спрятать под землёй, и поднять, когда нужно?
Да, но есть одно существенное ограничение - коллизии. Они могут мешать нормальному перемещению муверов и привязанных к ним объектов.
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.847
Благодарности
1.213
Баллы
440
Я тебя не понял. Хочешь сказать, что способ есть? И что значит "нормальный" модинг?
Как уже отметили выше - через муверы, движение которых можно начать через команды в скриптах. Но нужно помнить про коллизии с другими вобами (это дело может помещать движению муверов, и они не будут двигаться, хотя работа в спейсере и скриптах может быть правильно построена).
Просто, имхо, я не вижу смысла сразу бежать и строчить на форуме "а запилите на юнионе, плиз, мою пердежку", не предположив, а есть ли такая возможность стандартными средствами (либо спросив про оную тут же, на форуме). Я не спорю, что "Юня" - крутая штука, хотя бы потому, что он фиксит ряд ошибок в работе движка. Но когда на выходе имеем кучу плагинов, которые вроде и рабочие сами по себе, и функционал могут нести полезный (субъективно для каждого из нас), но в то же время есть шанс конфликта плагинов друг с другом...
Ну и под "нормальным" я имел в виду в рамках ограничений движка. Сейчас, с утра, понимаю правда, что эпитет "нормальный" не совсем корректный и к нему докопаться можно:D

Скорее всего он тебя не правильно понял.
Скорее всего для начала следует дождаться разъяснений человека, а уже потом делать выводы, но никак не делать этого за него*right*
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.288
Благодарности
4.585
Баллы
625
шанс конфликта плагинов друг с другом...
Шанс конфликта может быть только в кривых руках или при полном непонимании архитектуры. В остальном плагины либо без хуков и вряд ли ты их сломаешь, либо если это хуки, то плагины ими 'делятся' друг с другом
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.022
Благодарности
522
Баллы
350
Beowulf, нет, как раз таки претензия к тому, что, судя по твоему ответу, батарея муверов с тычканием коллизий за каким то чудом стало считатся "нормальным" методом. Раньше да, принял был без каких либо возражений, но сейчас, имея на руках с десяток расширителей и плагинов само понятие "нормального" модинга скачет от человека к человеку. Да и признаться честно, я искренне надеялся что уже изобрели метод или плагин для непосредственного воббинга внутри самой игры не отрываясь от игрового процесса
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.288
Благодарности
4.585
Баллы
625
Lorddemonik, во время игры не будет плагина, потому что в игровом режиме создаются всякие дополнительные объекты, которые сразу полезут в сохраняемый zen. За счёт этого мусора он будет больше весить. В том же классическом спейсере рекомендуется вообще не трогать кнопку 'играть' как раз по этой причине.
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.022
Благодарности
522
Баллы
350
Gratt, ну а вообще физически, можно заставить игру в реальном времени перезаписать мир игры с внесёнными изменениями, например, если объекты уже расположены в мире и их необходимо просто передвинуть и поместить перед героем? В таком случае для игры поменяются только координаты
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.862
Благодарности
5.300
Баллы
910
Gratt, ну а вообще физически, можно заставить игру в реальном времени перезаписать мир игры с внесёнными изменениями, например, если объекты уже расположены в мире и их необходимо просто передвинуть и поместить перед героем? В таком случае для игры поменяются только координаты
Youtube
 
Сверху Снизу