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

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

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

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

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
125
Slavemaster, хм, дезинфа с моей стороны, проверил. Почему-то был уверен в этом, видимо в какой-то проект играл, где это правили, но какой - уже не могу вспомнить.
 

cebukoy

Участник форума
Регистрация
14 Июн 2016
Сообщения
53
Благодарности
58
Баллы
170
Добрый день.
Есть пожелание для плагина.

В SystemPack.ini есть строка:
Fight_ANI_Interrupt=0
; ... прерывание анимации в бою, - включено (1) или выключено (0), по-умолчанию выключена: 0.

Когда функция включена (1), то в бою, если игрок получает ненулевой урон, проигрывается короткая анимация получения урона и все действия прерываются (бег, отскок, удар и т.д). Например, если гоблины толпой гопнут и начнут отвешивать, то игрок не сможет даже плюнуть в ответ. У нпс аналогично. *bruise*
Когда функция выключена(0), то анимации прерываются только у нпс.

Так вот, есть предложение для плагина. Функцию сделать активной постоянно, а выключаться будет на определённое время, прикрутить выключение к выкуриванию болотника.
Например: зелёный новичок (действует 1 час), северный тёмный (2 часа) и зов сна (3 часа). Вроде логично, персонаж обкурился и стал невосприимчив к боли = анимации в бою не прерываются. И можно врываться в толпу гоблинов. :D
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Добрый день.
Есть пожелание для плагина.
Такое уже делал Slavemaster, но с более системной и интересной механикой, на мой взгляд.
В SystemPack.ini есть строка:
Fight_ANI_Interrupt=0
; ... прерывание анимации в бою, - включено (1) или выключено (0), по-умолчанию выключена: 0.
И в какой конкретно секции SystemPack.ini вы вообще нашли такой параметр? Я его не обнаруживаю у себя в ini, играя с Union 1.0l.
 
Последнее редактирование:

cebukoy

Участник форума
Регистрация
14 Июн 2016
Сообщения
53
Благодарности
58
Баллы
170
Такое уже делал Slavemaster, но с более системной и интересной механикой, на мой взгляд.
Да нет. Там же совсем другая идея реализована.
И в какой конкретно секции SystemPack.ini вы вообще нашли такой параметр? Я его не обнаруживаю у себя в ini, играя с Union 1.0l.
В Готике 1. Секция [PARAMETERS]. Последний юни.
 

Vic7im

Участник форума
Регистрация
15 Мар 2016
Сообщения
49
Благодарности
18
Баллы
175
Hello everyone, how are you all feeling?

I have another potentially good idea for a plugin. Players can hugely exploit the "jump back" and parry feature of Gothic to become virtually invulnerable, because the game registers a change in bodystate (from BS_RUN to BS_PARADE) the second it enters the parry/jump back animation, and it stays that way until the animation is finished.

I was wondering, is there a way to apply the bodystate change ONLY when the animation reaches a certain frame? Like for example, when the weapon is actually held in defense or when the hero actually jumps back instead of granting invulnerability during all frames?

This would radically increase the difficulty of the game, having players carefully think when to parry and when to jump back without suffering consequences.

Video example of the exploit. 1.45 min mark.

Thanks in advance for all replies, I am willing to help in any way I can for this! Good day \o
 

Czudak

Участник форума
Регистрация
29 Июн 2019
Сообщения
179
Благодарности
95
Баллы
125
A quick request: a fix to disable the ability to draw any weapon (melee/ranged/spell) via any key (keyboard/mouse) when opening/closing chests. Ideally, if it would disable that for all the chest related animation frames of 20-124 range (the same range for all chest MDSes; though it might be more feasible to make a fix for that in HUMANS.MDS at T_CHEST_XXX/S_CHEST_XXX frames of 1-130 range?).

This to prevent the "frozen" chest animations interrupted in the middle and to prevent a couple of exploits with chest keys/heightened jump reach.
 

cebukoy

Участник форума
Регистрация
14 Июн 2016
Сообщения
53
Благодарности
58
Баллы
170
Плагин бы для Готики 1, позволяющий добивать лежачих любым оружием. А то дробящим оружием нельзя добить, нужно переключаться на меч.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
Плагин бы для Готики 1, позволяющий добивать лежачих любым оружием. А то дробящим оружием нельзя добить, нужно переключаться на меч.
Union:
#engine [G1]
    #patch [zBluntKiller]
        HEX @0x00611359 = '90 90'
    #/patch
#/engine
 

cebukoy

Участник форума
Регистрация
14 Июн 2016
Сообщения
53
Благодарности
58
Баллы
170

Вложения

  • zBluntKiller.7z
    236 байт · Просмотры: 36

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
A quick request: a fix to disable the ability to draw any weapon (melee/ranged/spell) via any key (keyboard/mouse) when opening/closing chests.
This patch for G2A will block keys 0-9 while player is in mob interaction:
Union:
#engine [G2A]
    #patch [zMobsiNoWeapon]
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1 = 0x006FC9C2
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2 = 0x006FCB88
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3 = 0x006FCDCA
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic = 0x006FCFAD
        
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1 + 7
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2 + 7
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3 + 7
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic + 7
        
        INT field_oCNpc_interactMob = ZenDef(0x99C, 0x9A0, 0x8D0, 0x964)
        
        // sets ZF = !eax || interactMob
        #assembler [func_oCNpc_TestConditions]
            test eax, eax
            jz return
            
            mov ecx, [ecx+$field_oCNpc_interactMob]
            test ecx, ecx
            jnz set_flag
            
            test eax, eax
            jmp return
            
        set_flag:
            cmp eax, eax
            
        return:
            ret
        #/assembler
        
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1]
            push ecx
            orgcode
            pop ecx
            
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1_end]
        
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2]
            push ecx
            orgcode
            pop ecx
            
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2_end]
        
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3]
            push ecx
            orgcode
            pop ecx
            
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3_end]
        
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic]
            push ecx
            orgcode
            pop ecx
            
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic_end]
    #/patch
#/engine
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
I was wondering, is there a way to apply the bodystate change ONLY when the animation reaches a certain frame?
The plugin unblocks DEF_PAR_FRAME event tag for the animations: *eventTag (0 "DEF_PAR_FRAME" "1 6")
Checked for G2A
C++:
int __fastcall Hook_oCAniCtrl_Human_CanParade(oCAniCtrl_Human*, void*, oCNpc*);
Hook<int(__thiscall*)(oCAniCtrl_Human*, oCNpc*)> Ivk_oCAniCtrl_Human_CanParade(ZENFOR(0x006284C0, 0x0064D5C0, 0x00654C20, 0x006B15B0), &Hook_oCAniCtrl_Human_CanParade, HookMode::Patch);
int __fastcall Hook_oCAniCtrl_Human_CanParade(oCAniCtrl_Human* anictrl, void* vtable, oCNpc* enemy)
{
    if (!Ivk_oCAniCtrl_Human_CanParade(anictrl, enemy))
        return false;

    if (anictrl->paradeBeginFrame == 0.0f && anictrl->paradeEndFrame == 0.0f)
        return true;

    zCModelAniActive* const ani = anictrl->IsParadeRunning();

    if (!ani)
        return true;

    return ani->actFrame >= anictrl->paradeBeginFrame && ani->actFrame <= anictrl->paradeEndFrame;
}
 

Вложения

  • zParadeWindow.vdf
    60 KB · Просмотры: 18

Vic7im

Участник форума
Регистрация
15 Мар 2016
Сообщения
49
Благодарности
18
Баллы
175
Oh my, thanks a bunch!Will surely test it tonight!!!!!!!!!!!!!
 

Czudak

Участник форума
Регистрация
29 Июн 2019
Сообщения
179
Благодарности
95
Баллы
125
This patch for G2A will block keys 0-9 while player is in mob interaction:
Union:
#engine [G2A]
    #patch [zMobsiNoWeapon]
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1 = 0x006FC9C2
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2 = 0x006FCB88
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3 = 0x006FCDCA
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic = 0x006FCFAD
       
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1 + 7
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2 + 7
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3 + 7
        INT text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic_end = text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic + 7
       
        INT field_oCNpc_interactMob = ZenDef(0x99C, 0x9A0, 0x8D0, 0x964)
       
        // sets ZF = !eax || interactMob
        #assembler [func_oCNpc_TestConditions]
            test eax, eax
            jz return
           
            mov ecx, [ecx+$field_oCNpc_interactMob]
            test ecx, ecx
            jnz set_flag
           
            test eax, eax
            jmp return
           
        set_flag:
            cmp eax, eax
           
        return:
            ret
        #/assembler
       
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1]
            push ecx
            orgcode
            pop ecx
           
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_1_end]
       
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2]
            push ecx
            orgcode
            pop ecx
           
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_2_end]
       
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3]
            push ecx
            orgcode
            pop ecx
           
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_KEY_3_end]
       
        #assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic]
            push ecx
            orgcode
            pop ecx
           
            call $func_oCNpc_TestConditions
        #/assembler [text_oCGame_HandleEvent_call_player_CanDrawWeapon_magic_end]
    #/patch
#/engine

Absolutely flabbergasting. Getting to test it right quick!
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.125
Благодарности
3.218
Баллы
485
This patch for G2A will block keys 0-9 while player is in mob interaction:
Будут ли заблокированы эти клавиши при взаимодействии с мобами с диалоговыми окнами (рунные и алхимические столы, наковальни)?
 

Slavemaster


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

Czudak

Участник форума
Регистрация
29 Июн 2019
Сообщения
179
Благодарности
95
Баллы
125
I tested it for 20 different interactive objects and no amount of keyboard/mouse pressing could bring up a weapon/spell. This way, this patch singlehandedly fixed a plethora of bugs and exploits with many objects, not only chests. It gets to work right away from the moment of an initiated object interaction too. And no, it doesn't interfere with the keyboard selection for interactive objects with selection menus (like anvils or rune tables).

This is how winning is done, bro.
 

Czudak

Участник форума
Регистрация
29 Июн 2019
Сообщения
179
Благодарности
95
Баллы
125
А поясни, пожалуйста, что делает данный плагин? Я не понял самого запроса.

You can inject the *eventTag of DEF_PAR_FRAME directly into any animation with it.

DEF_PAR_FRAME is from the source code and it's the "parade window", so now you can regulate invincibility frames of jumpback, strafe, run and etc. animations with it, for example.

At least that's what I understood from this. I would have to test it to get the exact results.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
Czudak, original CanParade function must return true to plugin take in place. So, no invincibility for strafe is possible.
 

Czudak

Участник форума
Регистрация
29 Июн 2019
Сообщения
179
Благодарности
95
Баллы
125
Slavemaster Yes, now I see it all depends on IsParadeRunning and after a quick source code consultation it means animations with the PARADE word in their name.
 
Сверху Снизу