Funkcja/zmienna która definiuje otwarty ekwipunek 405 4

O temacie

Autor RandomRadioactiveMonster

Zaczęty 28.03.2020 roku

Wyświetleń 405

Odpowiedzi 4

RandomRadioactiveMonster

RandomRadioactiveMonster

Użytkownicy
posty14
Propsy7
ProfesjaSkrypter
  • Użytkownicy
Szczęść Boże
Chciałbym się zapytać, czy w Gothicu 2 istnieje jakaś funkcja/zmienna która definiuje otwarty ekwipunek bądź menu. Chodzi mi o mniej wiecej coś takiego:

if (otwarty_ekwipunek = true) {
cos sie dzieje
};

(Przepraszam za ewentualne błędy w warunku, ale dopiero dziś po przerwie przerzuciłem się z moddingu hoia do gothica)
Za odpowiedz z góry bardzo dziękuje
 

Parzival

Parzival

Użytkownicy
CEO (Itharu Team)
posty64
Propsy13
ProfesjaProducent
  • Użytkownicy
  • CEO (Itharu Team)
Coś się znajdzie na bank. Pewnie musiałbyś mieć jakiegoś HookEngine z Ikarusa. Ale nie jestem pewny.
 

Splash

Splash

Moderator
posty4095
Propsy3296
ProfesjaNierób
  • Moderator
Bez użycia pakietów skryptowych nie da rady
func intInventoryIsOpen() {
    var oCNpc her; her = Hlp_GetNpc(hero);
    var int inv; inv = _@(her.inventory2_vtbl);

    const int call = 0;

    if (CALL_Begin(call)) {
        CALL__thiscall(_@(inv), 7377408);
        call = CALL_End();
    };

    return CALL_RetValAsInt;
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...

Khantor

Khantor

Użytkownicy
posty33
Propsy4
Profesjabrak
  • Użytkownicy
Ta funkcja zwróci ci "1" jak masz otworzony ekwipunek, ale wlicza się w to także np. otworzenie skrzyni, handel  czy przeszukiwanie pobitego/martwego NPC. Jeśli chcesz, żeby funkcja zwracała ci "1" tylko, jeśli ręcznie otworzyłeś ekwipunek (czyli z wyłączeniem wymienionych wyżej przypadków) to możesz to zrobić np. tak:

Najpierw definiujesz nową funkcję, która wydobywa, a potem przelicza znacznik (?) przycisku z systemu szesnastkowego na dziesiętny:

func int ReadKeyFromIni (var string KeyName, var int KeyNameIndex)
{
var string str; str = MEM_GetGothOpt ("KEYS", KeyName);

    var int buf; var int index;
    buf = STR_toChar(str);

    var int res; res = 0;
var int chr;

if (KeyNameIndex == 1)
{
index = 0;
var int loopStart1; loopStart1 = MEM_StackPos.position;

if (index < 2)
{
chr = MEM_ReadInt (buf + index) & 255;

if ((chr >= 48  /*0*/ ) && (chr <= 57  /*9*/ ))
{
res = res * 16 + (chr - 48);
}
else if ((chr == 97 /*a*/) || (chr == 65 /*A*/))
{
res = res * 16 + 10;
}
else if ((chr == 98 /*b*/) || (chr == 66 /*B*/))
{
res = res * 16 + 11;
}
else if ((chr == 99 /*c*/) || (chr == 67 /*C*/))
{
res = res * 16 + 12;
}
else if ((chr == 100 /*d*/) || (chr == 68 /*D*/))
{
res = res * 16 + 13;
}
else if ((chr == 101 /*e*/) || (chr == 69 /*E*/))
{
res = res * 16 + 14;
}
else if ((chr == 102 /*f*/) || (chr == 70 /*F*/))
{
res = res * 16 + 15;
}
else
{
MEM_Warn (ConcatStrings ("STR_ToInt: cannot convert string: ", str));
return 0;
};

index += 1;
MEM_StackPos.position = loopStart1;
};
}
else if (KeyNameIndex == 2)
{
index = 4;
var int loopStart2; loopStart2 = MEM_StackPos.position;

if (index < 6)
{
chr = MEM_ReadInt (buf + index) & 255;

if ((chr >= 48  /*0*/ ) && (chr <= 57  /*9*/ ))
{
res = res * 16 + (chr - 48);
}
else if ((chr == 97 /*a*/) || (chr == 65 /*A*/))
{
res = res * 16 + 10;
}
else if ((chr == 98 /*b*/) || (chr == 66 /*B*/))
{
res = res * 16 + 11;
}
else if ((chr == 99 /*c*/) || (chr == 67 /*C*/))
{
res = res * 16 + 12;
}
else if ((chr == 100 /*d*/) || (chr == 68 /*D*/))
{
res = res * 16 + 13;
}
else if ((chr == 101 /*e*/) || (chr == 69 /*E*/))
{
res = res * 16 + 14;
}
else if ((chr == 102 /*f*/) || (chr == 70 /*F*/))
{
res = res * 16 + 15;
}
else
{
MEM_Warn (ConcatStrings ("STR_ToInt: cannot convert string: ", str));
return 0;
};

index += 1;
MEM_StackPos.position = loopStart2;
};
};

return res;
};

Najlepiej zdefiniować ją w jakimś osobnym pliku i wpisać do gothic.src pod

AI\AI_INTERN\AI_CONSTANTS.D
_INTERN\IKARUS_CONST_G2.D
_INTERN\ENGINECLASSES_G2\*.D
_INTERN\IKARUS.D
_INTERN\float.D

Teraz tworzysz nową funkcję, która będzie wydobywać z gothic.ini jakie przyciski masz przypisane pod ekwipunek i sprawdzać, czy otworzyłeś go ręcznie:

var int IsInventoryOpenedManually;

func void IsInventoryOpened()
{
var int KeyInventory1; KeyInventory1 = ReadKeyFromIni ("keyInventory", 1);
var int KeyInventory2; KeyInventory2 = ReadKeyFromIni ("keyInventory", 2);
var int IsInventoryKeyPressed;

if (IsInventoryOpenedManually == 1)
{
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), 7377408);
call = CALL_End();
};

var int ret;

if (ret == 0)
{
IsInventoryOpenedManually = 0;
};
};

if ((Npc_GetBodyState(hero) == BS_INVENTORY)
&& (IsInventoryKeyPressed == 1))
{
IsInventoryOpenedManually = 1;
};

IsInventoryKeyPressed = 0;

if (((MEM_KeyState(KeyInventory1) == KEY_PRESSED)
|| (MEM_KeyState(KeyInventory2) == KEY_PRESSED))
&& ((Npc_GetBodyState(hero) == BS_STAND)
|| (Npc_GetBodyState(hero) == BS_RUN))
&& (Is_Dialogue_Active == FALSE))
{
IsInventoryKeyPressed = 1;
};
};

Tą funkcję podpinasz pod FrameFunction i inicjujesz co klatkę. Masz teraz zmienną "IsInventoryOpenedManually", która określa ci, czy ekwipunek jest otwarty (ręcznie). "Is_Dialogue_Active" to zmienna która mówi, czy postać prowadzi rozmowę. Nie wiedziałem jak ma wyglądać warunek który to określa, więc w "ZS_Talk" wsadziłem zmienną która daje TRUE jak postać prowadzi rozmowę i działa.  :lol2: Pewnie da się to zrobić prościej ale ja nie umiem bo dopiero miesiąc się z Ikarusem bawię z czego 3 tygodnie męczyłem się z tym dokładnie problemem, a nigdzie tego nie znalazłem.
 

Splash

Splash

Moderator
posty4095
Propsy3296
ProfesjaNierób
  • Moderator
Można też tak:
func int InventoryIsOpen() {
    var oCNpc her; her = Hlp_GetNpc(hero);
    var int inv; inv = _@(her.inventory2_vtbl);
    var int ret;
    const int call = 0;

    if (CALL_Begin(call)) {
        CALL_PutRetValTo(_@(ret));
        CALL__thiscall(_@(inv), 7377408);
        call = CALL_End();
    };

    return +ret;
};

func int GetInventoryMode() {
    var oCNpc her; her = Hlp_GetNpc(hero);
    var int inv; inv = _@(her.inventory2_vtbl);
    var int ret;
    const int call = 0;

    if (CALL_Begin(call)) {
        CALL_PutRetValTo(_@(ret));
        CALL__thiscall(_@(inv), 7360672);
        call = CALL_End();
    };

    return +ret;
};

/*INV_MODE_DEFAULT = 0
INV_MODE_CONTAINER = 1
INV_MODE_PLUNDER = 2
INV_MODE_STEAL = 3
INV_MODE_BUY = 4
INV_MODE_SELL = 5
INV_MODE_MAX = 6*/

func int InventoryIsOpenWithMode(var int mode) {
    return InventoryIsOpen() && GetInventoryMode() == mode;
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry