Ich bin mir ziemlich sicher, dass das in G2 geht. Ganz sicher, dass du das nicht in den Optionen einfach umkonfiguriert hast?
Man kann die Fäuste nur mit Taste 1 bzw. Leertaste ziehen, wenn man keine Nahkampfwaffe angelegt hat, aber nicht mit Zirkumflex, egal ob man eine Nahkampfwaffe angelegt hat oder nicht.
Getestet mit Original Gothic 2 DNdR - Standard Steuerung sowie Alternativ Steuerung jeweils mit Gothic 1 Controls an und aus.
Systempack ist beim Test verwendet worden, wird aber hoffentlich jetzt nicht den Unterschied machen.
Gibt es diesbezüglich wirklich gar keine Möglichkeit?
Zitat von F a w k e s
Everything is possible
Man kann das sicher (auf sehr instabile Weise) sehr einfach einbauen (FrameFunctions, MEM_KeyState, etc.). Ich wollte ein paar Anstöße geben, wie man das aber etwas sicherer in der Art und Weise von Gothic 1 nachbauen kann. Allerdings wird da in der Engine einiges überprüft, sodass ich hier nicht einfach einen Haufen von Engine-Adressen abladen wollte. Deshalb hab ichs mal fertig implementiert. Die Lösung ist so nahe wie möglich an Gothic 1 orientiert - alle Aufrufe kommen auch so in Gothic 1 vor.
Code:
/*
* Initialization function for enabling fist mode on grave key
*/
func void Game_KeyEventInit(){
const int oCGame__HandleEvent_dfltCase = 7328820; //0x6FD434
HookEngineF(oCGame__HandleEvent_dfltCase, 6, Game_KeyEvent);
};
func void Game_KeyEvent(){
var int key; key = ESI;
if (key == KEY_GRAVE){
var oCNpc her; her = Hlp_GetNpc(hero);
if (!Npc_CanDrawWeapon(hero)){
return;
};
if (her.mag_book){
MagBook_Close(her.mag_book, TRUE);
};
if (Input_KeyToggled(KEY_GRAVE)){
if (Inventory_IsOpen()){
Inventory_Close();
};
if (her.interactMob){
MobContainer_CloseAndReset(her.interactMob, hero);
};
if (her.fmode != FMODE_NONE){AI_RemoveWeapon(hero);
};
if (her.fmode != FMODE_FIST){
AI_DrawFists(hero);
};
};
};
};
Den Code habe ich versucht sehr übersichtlich und nachvollziehbar zu schreiben und habe alle Engine-Aufrufe in separate Funktionen mit verständlichen Namen geschrieben (siehe unten), die vor den oben stehenden Funktionen geparst werden müssen. Initialisiert wird das ganze mit Game_KeyEventInit(); in der Init_Global.
Spoiler:(zum lesen bitte Text markieren)
Code:
func int Npc_CanDrawWeapon(var C_Npc slf){
const int oCNpc__CanDrawWeapon = 6817216; //0x6805C0
if (!Hlp_IsValidNpc(slf)){
return 0;
};
var int slfPtr; slfPtr = _@(slf);
const int call = 0;
if (CALL_Begin(call)){
CALL_PutRetValTo(_@(ret));
CALL__thiscall(_@(slfPtr), oCNpc__CanDrawWeapon);
call = CALL_End();
};
var int ret;
return +ret;
};
func void MagBook_Close(var int mag_book, var int full){
const int oCMag_Book__Close = 4682352; //0x477270
if (!mag_book){
return;
};
const int call = 0;
if (CALL_Begin(call)){
CALL_IntParam(_@(full));
CALL__thiscall(_@(mag_book), oCMag_Book__Close);
call = CALL_End();
};
};
func int Input_KeyToggled(var int key){
const int zCInput_Win32__KeyToggled = 5067216; //0x4D51D0
const int call = 0;
if (CALL_Begin(call)){
CALL_IntParam(_@(key));
CALL_PutRetValTo(_@(ret));
CALL__thiscall(_@(zCInput_zinput), zCInput_Win32__KeyToggled);
call = CALL_End();
};
var int ret;
return +ret;
};
func int Inventory_IsOpen(){
const int oCItemContainer__IsOpen = 7377408; //0x709200
if (!Hlp_IsValidNpc(hero)){
return 0;
};
var oCNpc her; her = Hlp_GetNpc(hero);
var int inv; inv = _@(her.inventory2_vtbl);
const int call = 0;
if (CALL_Begin(call)){
CALL_PutRetValTo(_@(ret));
CALL__thiscall(_@(inv), oCItemContainer__IsOpen);
call = CALL_End();
};
var int ret;
return +ret;
};
func void Inventory_Close(){
const int oCNpc__CloseInventory = 7742480; //0x762410
if (!Hlp_IsValidNpc(hero)){
return;
};
var int herPtr; herPtr = _@(hero);
const int call = 0;
if (CALL_Begin(call)){
CALL__thiscall(_@(herPtr), oCNpc__CloseInventory);
call = CALL_End();
};
};
func void MobContainer_CloseAndReset(var int mobPtr, var C_Npc user){
const int oCMobContainer__Close = 7497280; //0x726640
const int oCMobContainer__Reset = 7495264; //0x725E60
if (!Hlp_Is_oCMobContainer(mobPtr)){
return;
};
if (!Hlp_IsValidNpc(user)){
return;
};
var int userPtr; userPtr = _@(user);
const int call = 0;
if (CALL_Begin(call)){
CALL_PtrParam(_@(userPtr));
CALL__thiscall(_@(mobPtr), oCMobContainer__Close);
CALL__thiscall(_@(mobPtr), oCMobContainer__Reset);
call = CALL_End();
};
};
func void AI_DrawFists(var C_Npc slf){
const int sizeof_oCMsgWeapon = 80; //0x50
const int zCClassDef__ObjectCreated = 5942960; //0x5AAEB0
const int oCMsgWeapon__classDef = 11218112; //00AB2CC0
const int oCMsgWeapon__oCMsgWeapon = 7759824; //0x7667D0
const int zCVob__GetEM = 6290960; //0x5FFE10
const int zCEventManager__OnMessage = 7889792; //0x786380
const int EV_DRAWWEAPON = 0;
if (!Hlp_IsValidNpc(slf)){
return;
};
var int slfPtr; slfPtr = _@(slf);
var int em;
var int msgWeap; msgWeap = MEM_Alloc(sizeof_oCMsgWeapon);
const int call = 0;
if (CALL_Begin(call)){
CALL_PtrParam(_@(oCMsgWeapon__classDef));
CALL_PtrParam(_@(msgWeap));
CALL__cdecl(zCClassDef__ObjectCreated);
CALL_IntParam(_@(TRUE));
CALL_IntParam(_@(FMODE_FIST));
CALL_IntParam(_@(EV_DRAWWEAPON));
CALL__thiscall(_@(msgWeap), oCMsgWeapon__oCMsgWeapon);
CALL_PutRetValTo(_@(em));
CALL__fastcall(_@(slfPtr), _@(FALSE), zCVob__GetEM);
CALL_PtrParam(_@(slfPtr));
CALL_PtrParam(_@(msgWeap));
CALL__thiscall(_@(em), zCEventManager__OnMessage);
call = CALL_End();
};
};