Nowy Atrybut w Menu_Status z pomocą Ikarus/LeGo 5909 13

O temacie

Autor IceMan

Zaczęty 3.10.2019 roku

Wyświetleń 5909

Odpowiedzi 13

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
Witam,

Czytałem parę samouczków i wypowiedzi ludzi z forum odnośnie robienia nowego atrybutu w G1 i dodania go do Menu_Status i mam jedno pytanie ale pierw przedstawię co zrobiłem:

Rozszerzyłem klasę dotyczącą "name" w C_NPC na takie coś:

VAR STRING name ;
VAR INT name1[5] ;
VAR STRING name2 ;
VAR STRING name3 ;
VAR STRING name4 ;

W Menu_Status włączyłem nieużywane MENU_ITEM_PLAYERNAME, umiejscowiłem i wygląda oki.

Następnie w pliku postaci zamieniłem "name" na "name1"
name1 = 0;

W skryptach dodałem odpowiednie linijki, żeby przy nauce tego "atrybutu" wartość dla name1 się zwiększała, ale..
Moim problem jest to, że w Menu_Status wyświetla się nie zmienna "name1" tylko zmienna "name" czyli pierwsza od góry.

Moje pytanie: Czy da się zrobić tak żeby wczytywał mi do Menu_Status zmienną "name1"?
 

bogu9821

bogu9821

Użytkownicy
posty407
Propsy185
ProfesjaProgramista
  • Użytkownicy
Po 1. NIE MOŻESZ rozszerzać klasy C_NPC, bo klasa C_NPC musi zgadzać się z tą z sinika.
Po 2. jest to hardcodowane w silniku i tylko za pomocą ikarusa/Uniona możesz to osiągnąć.
Wersję Ikarusową znajdziesz na pewno gdzieś na forum.
 
while(false) Do();

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
Po 1. NIE MOŻESZ rozszerzać klasy C_NPC, bo klasa C_NPC musi zgadzać się z tą z sinika.
Po 2. jest to hardcodowane w silniku i tylko za pomocą ikarusa/Uniona możesz to osiągnąć.
Wersję Ikarusową znajdziesz na pewno gdzieś na forum.

Ja nie rozszerzyłem klasy tylko dałem zamiast jednej tablicy 5 stringów podzieliłem to na 4 zmienne stringa i jedną tablice inta bo 1 string = 5 intów

Ogólnie nie chciałbym tego robić za pomocą edycji silnika. Mam wgranego ikarusa + lego jakby co, ale Avallach pisał w tym temacie:

https://themodders.org/index.php?topic=17231.20

Że można skorzystać z tej nieużywanej klasy dotyczącej wyświetlania imienia w menu_status. Tylko nie bardzo zrozumiałem bo domyślnie ma to typ String a mój atrybut ma być wartością liczbową
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Nie powinno się rozbijać tego string'a na 5 intów. String ma sizeof 20, po jego rozbiciu mogłoby dojść do błędów w grze poprzez zapełnianie tych pól niewłaściwymi wartościami.
Aby dodać kolejny atrybut w Menu należy albo użyć Uniona | Ikarusa bądź zrobić to na zasadzie talentu (czego z góry nie polecam)
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
A czemu nie polecasz na zasadzie talentu? I co z tym co pisał Avallach?
 

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
Zacząłem działać z tym na zasadzie tego posta z woga:

https://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2/page11?p=20906914&viewfull=1#post20906914
Taki skrypt dodałem do pliku HookEngine.d

func void Update_Menu_Item(var string name, var string val)
{
    var int itPtr;
    itPtr = MEM_GetMenuItemByString(name);   
    if (!itPtr)
{
        MEM_Error(ConcatStrings("Update_Menu_Item: Invalid Menu Item: ", name));
        return;
    };
    const int SetText = 5114800;
    CALL_IntParam(true);
    CALL_IntParam(0);
    CALL_zStringPtrParam(val);
    CALL__thiscall(itPtr, SetText);
};
   
func void Install_Character_Menu_Hook()
{
    const int done = false;
    if(!done)
{
        HookEngineF(4707920, 6, Update_Character_Menu);
        done = true;
    };
};

func void Update_Character_Menu()
{
    var int inteligencja;
    inteligencja = ATR_INTELIGENCE;
    var string concatText;
    concatText = ConcatStrings(IntToString(inteligencja), " Inteligencja:");
    Update_Menu_Item("MENU_ITEM_ATTRIBUTE_5_TITLE", concatText);
};

Wszystko oki postępowałem zgodnie z instrukcjami stworzyłem nowe menu w menu_status.d
I położenie zgadza się bo sprawdzałem, ale problem jest taki, że ta funkcja Update_Character_Menu nie pokazuje mi w Menu_Status tego atrybutu (ani nazwy ani liczy) Nazwa się pojawia tylko jak sam ją sobie zdefiniuje ręcznie w menu_status.d

Czy ktoś wie w czym może być problem? Nie mogę do tego dojść za bardzo.

Edit: Zauważyłem całkiem przypadkiem, że ten skrypt ma jakiś wpływ na używanie czarów. Kiedy chce wyjąć czar wywala mi gre do pulpitu. Usunąłem dla sprawdzenia linijke ze startupa i czary działają.
 

Splash

Splash

Moderator
posty4211
Propsy3412
ProfesjaNierób
  • Moderator
Jeśli dobrze zrozumiałem z pierwszego posta, modujesz Gothic 1, a ten skrypt jest do Gothic 2.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
Jeśli dobrze zrozumiałem z pierwszego posta, modujesz Gothic 1, a ten skrypt jest do Gothic 2.

Myślałem że nie będzie wielkich różnic. Można go jakoś zoptymalizować pod G1? Albo jakaś inna opcja aby stworzyć ten atrybut?
 

Splash

Splash

Moderator
posty4211
Propsy3412
ProfesjaNierób
  • Moderator
Tu nie chodzi o optymalizację, a całkowicie inne adresy w pamięci silnika.
4707920 to dziesiętnie zapisany adres funkcji:
0x47D650:    oCMenu_Status::SetLearnPoints(ulong)
Natomiast w G1:
0x47D650:    oCSpell::Reset(oCSpell *__hidden this)
I to by się zgadzało dlaczego się sypał podczas używania magii. Poprawnym adresem dla G1 jest 0x476300, czyli 4678400‬. Długość instrukcji również wynosi 6 bajtów, czyli tak jak w G2.

HookEngineF(4678400‬, 6, Update_Character_Menu);
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
Poprawiłem, ale teraz wywala gre do pulpitu jak włącze menu statystyk.
Co może powodować taką akcje?
 

Splash

Splash

Moderator
posty4211
Propsy3412
ProfesjaNierób
  • Moderator
Zapomniałem o funkcji zCMenuItem::SetText

Zamień:
const int SetText = 5114800;
na:
onst int SetText = 5061760‬
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
Dzięki wielkie, działa jak trzeba. Propsy! :)
Tak swoją drogą do odczytania tych wartości potrzeba jakiegoś programu? Bo jak mówisz są zapisane w silniku
 

Splash

Splash

Moderator
posty4211
Propsy3412
ProfesjaNierób
  • Moderator
Używam darmowej wersji IDA 7.0. Program może się wydawać trudny w użyciu, ale na potrzeby tej gry można się samemu nauczyć z niego korzystać.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

IceMan

IceMan

Użytkownicy
posty68
Propsy11
Profesjabrak
  • Użytkownicy
Dzięki raz jeszcze!
Temat do zamknięcia.
 


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