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

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

В разработке... Union. Пожелания насчёт плагинов

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
вообщем тут надо как то строчки zstring сравнивать.
_this->useWithItem и FocusHero->useWithItem
если совпадают то возвращать 0.

какая функция сравнивает строчки я не знаю :-(

C++:
    //0x0071DB40 public: virtual int __thiscall oCMobInter::GetUseWithItem(void)
    int __fastcall GetUseWithItem(oCMobInter* _this);
    CInvoke <int(__fastcall*) (oCMobInter*)> pGetUseWithItem(0x0071DB40, GetUseWithItem, IVK_AUTO);
    int __fastcall GetUseWithItem(oCMobInter* _this)
    {
        oCMobInter* FocusHero = player->GetFocusVob()->CastTo<oCMobInter>();
        if (FocusHero)
        {
            //if (_this->useWithItem)
            //{
               // if (FocusHero->useWithItem)
               // {
                    cmd << Z"FocusHero: " + FocusHero->sceme + FocusHero->useWithItem << endl;
                    cmd << Z"GetUseWithItem: " + _this->sceme + _this->useWithItem << endl;
                    return 0;
                //}
            //}
        }
        return pGetUseWithItem(_this);
    }
 
Последнее редактирование:

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.450
Благодарности
1.977
Баллы
365
MW 7, сравнение строк this->useWithItem.CompareI(FocusHero->useWithItem)
Но я бы саму запись хука сделал по-другому, как-то так
Добавить строчку int GetUseWithItem_New(); в файлик CMobInter.inl (User API ->oGame->M->CMobInter.inl) и потом в каком-нибудь своем классе MyHooks.cpp

C++:
    HOOK Ivk_oCMobInter_GetUseWithItem_New PATCH(&oCMobInter::GetUseWithItem, &oCMobInter::GetUseWithItem_New);
    int oCMobInter::GetUseWithItem_New() {
        if (player && player->GetFocusVob() && this == player->GetFocusVob() && this->useWithItem.CompareI("ItMiSwordRaw")) {
            return FALSE;
        }
        return THISCALL(Ivk_oCMobInter_GetUseWithItem_New)();
    }
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.083
Благодарности
1.901
Баллы
320

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.450
Благодарности
1.977
Баллы
365
В фокусе игрока может быть объект, которым воспользуется другой NPC.
Одновременно наверное не может быть, надо проверять. Вообще у него проверка на фокус в принципе там ничо не даст мне кажется. Вернее полностью не решит проблему.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
я бы саму запись хука сделал по-другому, как-то так
там же у тебя проверка только на ItMiSwordRaw? а как же другие производственные предметы?

сравнение строк this->useWithItem.CompareI(FocusHero->useWithItem)
C++:
    //0x0071DB40 public: virtual int __thiscall oCMobInter::GetUseWithItem(void)
    int __fastcall GetUseWithItem(oCMobInter* _this);
    CInvoke <int(__fastcall*) (oCMobInter*)> pGetUseWithItem(0x0071DB40, GetUseWithItem, IVK_AUTO);
    int __fastcall GetUseWithItem(oCMobInter* _this)
    {
        oCMobInter* FocusHero = player->GetFocusVob()->CastTo<oCMobInter>();
        if (FocusHero)
        {
            if (_this->focusNameIndex == FocusHero->focusNameIndex)
            {
                if (_this->useWithItem.CompareI(FocusHero->useWithItem))
                {
                            cmd << Z"FocusHero: " + FocusHero->sceme + FocusHero->useWithItem << endl;
                            cmd << Z"GetUseWithItem: " + _this->sceme + _this->useWithItem << endl;
                            cmd << Z"focusNameIndex: " + zSTRING(_this->focusNameIndex)  << endl;
                            //cmd << Z"focusNameIndex: " + zSTRING(FocusHero->focusNameIndex)  << endl;
                }
                return 0;
            }
        }
        return pGetUseWithItem(_this);
    }
Добавить строчку int GetUseWithItem_New(); в файлик CMobInter.inl (User API ->oGame->M->CMobInter.inl) и потом в каком-нибудь своем классе MyHooks.cpp

C++:
    HOOK Ivk_oCMobInter_GetUseWithItem_New PATCH(&oCMobInter::GetUseWithItem, &oCMobInter::GetUseWithItem_New);
    int oCMobInter::GetUseWithItem_New()
    {
        if (player && player->GetFocusVob())
        {
            oCMobInter* FocusHero = player->GetFocusVob()->CastTo<oCMobInter>();

            if (this == player->GetFocusVob())
            {
                if (this->useWithItem.CompareI(FocusHero->useWithItem))
                {
                    cmd << Z"this: " + this->useWithItem << endl;
                    cmd << Z"FocusHero: " + FocusHero->sceme + FocusHero->useWithItem << endl;
                    return FALSE;
                }
            }
        }
        return THISCALL(Ivk_oCMobInter_GetUseWithItem_New)();
    }
 
Последнее редактирование:

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.450
Благодарности
1.977
Баллы
365
MW 7, ItMiSwordRaw для примера я дал. Все твои три проверки можно заменить одной
C++:
    int __fastcall GetUseWithItem(oCMobInter* _this);
    CInvoke <int(__fastcall*) (oCMobInter*)> pGetUseWithItem(0x0071DB40, GetUseWithItem, IVK_AUTO);
    int __fastcall GetUseWithItem(oCMobInter* _this)
    {
        if (player && _this == player->GetFocusVob()) {
            //cmd << Z"FocusHero: " + FocusHero->sceme + FocusHero->useWithItem << endl;
            cmd << Z"GetUseWithItem: " + _this->sceme + _this->useWithItem << endl;
            cmd << Z"focusNameIndex: " + zSTRING(_this->focusNameIndex) << endl;
            return FALSE;
        }
        return pGetUseWithItem(_this);
    }
Но проще и универсальнее как я написал (сразу для всех платформ)
C++:
    HOOK Ivk_oCMobInter_GetUseWithItem_New PATCH(&oCMobInter::GetUseWithItem, &oCMobInter::GetUseWithItem_New);
    int oCMobInter::GetUseWithItem_New() {
        if (player && this == player->GetFocusVob()) {
            return FALSE;
        }
        return THISCALL(Ivk_oCMobInter_GetUseWithItem_New)();
    }
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.450
Благодарности
1.977
Баллы
365
MW 7, забыл в твой код return FALSE; дописать, а так да, просто выведется
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
C++:
    HOOK Ivk_oCMobInter_GetUseWithItem_New PATCH(&oCMobInter::GetUseWithItem, &oCMobInter::GetUseWithItem_New);
    int oCMobInter::GetUseWithItem_New()
    {
        if (player && this == player->GetFocusVob())
        {
            oCMobInter* FocusHero = player->GetFocusVob()->CastTo<oCMobInter>();
            if (this->useWithItem.CompareI(FocusHero->useWithItem))
            //if (this->useWithItem.CompareI(player->GetFocusVob()->useWithItem))
            {
                cmd << Z"this: " + this->useWithItem << endl;
                //cmd << Z"player->GetFocusVob: " + player->GetFocusVob()->useWithItem << endl;
                cmd << Z"FocusHero: " + FocusHero->sceme +" :: Item=" + FocusHero->useWithItem << endl;
                return FALSE;
            }
            return THISCALL(Ivk_oCMobInter_GetUseWithItem_New)();
        }
    }
C++:
    HOOK Ivk_oCMobInter_GetUseWithItem_New PATCH(&oCMobInter::GetUseWithItem, &oCMobInter::GetUseWithItem_New);
    int oCMobInter::GetUseWithItem_New()
    {
        if (player && player->GetFocusVob())
        {
            oCMobInter* FocusHero = player->GetFocusVob()->CastTo<oCMobInter>();

            if (this == player->GetFocusVob())
            {
                if (this->useWithItem.CompareI(FocusHero->useWithItem))
                {
                    //cmd << Z"this: " + this->useWithItem << endl;
                    cmd << Z"FocusHero: " + FocusHero->sceme +" :: Item=" + FocusHero->useWithItem << endl;
                    return FALSE;
                }
            }
        }
        return THISCALL(Ivk_oCMobInter_GetUseWithItem_New)();
    }
1685030126317.jpeg
1685029987025.jpeg
 

Diego9979

Участник форума
Регистрация
15 Июл 2015
Сообщения
28
Благодарности
5
Баллы
170
Ребятушки можно скинуть два плагина 1. по увеличению суток в игре 2. когда подходишь к воде можно будет умываться(ну люблю я быть чистюлей)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
1. по увеличению суток в игре
Если речь об изменении длительности игровых суток, то это можно выполнить в Gothic.ini, установив плагин ZMISCUTILS.
Union:
SecondsPerGameHour=1200
; ... sets the duration of game hour
 

Diego9979

Участник форума
Регистрация
15 Июл 2015
Сообщения
28
Благодарности
5
Баллы
170
играю в Lhiver Edition на Union 1m и понимаю, что не хватает спринта альтернативного ,кто то может скинуть этот плагин?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275

Сахар

Участник форума
Регистрация
5 Янв 2017
Сообщения
59
Благодарности
45
Баллы
180
Возможен ли плагин, который бы вводил затрату желтой шкалы дыхания на акробатические прыжки (наподобие плагина на спринтерский бег)?
После изучения навыка акробатики передвижение по местности превращается в закликивание кнопки прыжка. Никто, включая врагов с крыльями, больше не способен догнать протагониста.
Можно было бы сделать ограничение количества таких прыжков до 3-4 на полную желтую шкалу, после чего требуется "передышка".
Такой плагин бы исправил "симулятор кузнечика" после изучения акробатики.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.131
Благодарности
5.627
Баллы
910
Нужен плагин, помогающий людят тестировать модификации.
Суть плагина: иногда попадаются вот такие сообщения Warn: 0 U:RTN:Routine change failed:XXX.... <zError.cpp,#474>
Так вот, очень хорошо, если в скриптах при поиске ХХХ находится просто ошибка в написании распорядка дня при смене (либо его отсутствие), другое дело, что когда делаешь поиск по XXX, но не находишь смену распорядка дня у этого XXX. Я сразу подозреваю, что где-то есть функция, которая делает Npc_ExchangeRoutine(self, "XXX");
но не в диалоге, а в self может лежать что угодно

В общем, нужно знать детально откуда был вызов, который менял распорядок дня, например, чтобы был построен полный путь, например
func void Test()
|
func void test2()
|
Npc_ExchangeRoutine(XXX, "XXX");

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

Сейчас же невозможно отследить, когда, кто и зачем.
Надеюсь не слишком замудрил с мыслью.

Да и вообще было бы идеально узнать, какие ещё функции переопределяют self (я вкурсе только про wld_npcinsert)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
какие ещё функции переопределяют self (я вкурсе только про wld_npcinsert)
Удаление непися из мира переопределяет. Возможно, ереопределяет вхождение непися в бокс триггер-скрипта, если там не отключена реакция на npc.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.131
Благодарности
5.627
Баллы
910
не. Не видно в какой функции в скриптах произошла смена на несуществующий распорядок дня.

Daedalus:
func void test2()
{
    Npc_ExchangeRoutine(none_100_Xardas,"Test");
};

func event gameloop()
{
    if (Hlp_KeyToggled(KEY_NUMPAD7))
    {
        test2();
    };
};

Код:
+oCNpc_States::ChangeRoutine(zSTRING const&): void
    CALLER    : 0x006DDD6A (supposed zSTRING::Init at 0x006D9B80)
    THIS      : (name="", npc=NONE_100_XARDAS, lastAIState=33219, curState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=0, valid=1, name="ZS_STAND_ARMSCROSSED", stateTime=1021.000, prgIndex=0, isRtnState=1), nextState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=-1, valid=0, name="ZS_STAND_ARMSCROSSED", stateTime=0.000, prgIndex=0, isRtnState=1))
    A0        : "Test"
    +oCNpc_States::ChangeRoutine(int): void
        CALLER    : 0x0076DF07 (supposed oCNpc_States::ChangeRoutine at 0x0076DD50)
        THIS      : (name="", npc=NONE_100_XARDAS, lastAIState=33219, curState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=0, valid=1, name="ZS_STAND_ARMSCROSSED", stateTime=1021.000, prgIndex=0, isRtnState=1), nextState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=-1, valid=0, name="ZS_STAND_ARMSCROSSED", stateTime=0.000, prgIndex=0, isRtnState=1))
        A0        : -1
        THIS      : (name="", npc=NONE_100_XARDAS, lastAIState=33219, curState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=0, valid=1, name="ZS_STAND_ARMSCROSSED", stateTime=1021.000, prgIndex=0, isRtnState=1), nextState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=-1, valid=0, name="ZS_STAND_ARMSCROSSED", stateTime=0.000, prgIndex=0, isRtnState=1))
        TIME      : 121
    THIS      : (name="", npc=NONE_100_XARDAS, lastAIState=33219, curState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=0, valid=1, name="ZS_STAND_ARMSCROSSED", stateTime=1021.000, prgIndex=0, isRtnState=1), nextState=(index=33219, loop=33220, end=33224, timeBehaviour=0, restTime=0.000, restTime=0.000, phase=-1, valid=0, name="ZS_STAND_ARMSCROSSED", stateTime=0.000, prgIndex=0, isRtnState=1))
    TIME      : 439
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.083
Благодарности
1.901
Баллы
320
Не видно в какой функции в скриптах произошла смена на несуществующий распорядок дня.
Я думал по имени рутины уже можно найти в исходниках.
Можно ещё DoStack хукнуть и ChangeRoutine прописать в поле RegEx. Однако с Икарусами это плохо дружит.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.131
Благодарности
5.627
Баллы
910
Я думал по имени рутины уже можно найти в исходниках.
Никак нет. Я выше скинул то, что скидывает zspy, если не меняется распорядок дня.
Одно дело, когда делаешь поиск по имени НПС и находишь ошибку, другое дело, когда смены рутины нет у НПС в скриптах, но почему-то она сменилась, вот второе меня и интересует.
В одном моде Хроник Миртаны смены рутины у НПС, у которых нет смены рутин в скриптах просто сотни...


ааа, понял, ну посмотрю потом, ибо повторять сложно, за 1 сессию в хрониках бывало ловил по 10 ошибочных смен, в другую 0.
 
Последнее редактирование:
Сверху Снизу