[G2 NK] Aktualizacja menu statystyk 5607 17

O temacie

Autor Graveir

Zaczęty 1.01.2017 roku

Wyświetleń 5607

Odpowiedzi 17

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Mógłby mi ktoś powiedzieć, w których plikach były potrzebne zmiany, aby działała aktualizacja danej zdolności w menu statystyk? Bo pamiętam, że kiedyś Chicken lub Sawik zrobili dla mnie skrypt, jednak prawdę powiedziawszy nie pamiętam, co tam było zmieniane. Przy pomocy DecDat wyciągnąłem skrypty ze starszej wersji swojego moda, jednak jest tam taki chaos, że nie wiem, co za co odpowiada. To, co teoretycznie wyciągnąłem(i dodałem) wygląda następująco(skrypty i Lego zainstalowałem od zera):
Menu_Status:
items[58] = "MENU_ITEM_TALENT_9_TITLE";
items[59] = "MENU_ITEM_TALENT_9_SKILL";

instance MENU_ITEM_TALENT_9_TITLE(C_MENU_ITEM_DEF)
{
posx = STAT_B_X1;
posy = STAT_TAL_Y + (16 * STAT_DY);
fontname = STAT_FONT_DEFAULT;
flags = flags & ~IT_SELECTABLE;
};

instance MENU_ITEM_TALENT_9_SKILL(C_MENU_ITEM_DEF)
{
posx = STAT_B_X2;
posy = STAT_TAL_Y + (16 * STAT_DY);
fontname = STAT_FONT_DEFAULT;
flags = flags & ~IT_SELECTABLE;
};
Do pliku startup dodałem takie coś:
hookenginef(4707920, 6, update_character_menu);

func void update_menu_item(var string name, var string val) {
 
 var int itptr;
 const int SetText = 5114800;

    itptr = mem_getmenuitembystring(name);
    if(!itptr) {
        return;
    };
    call_intparam(true);
    call_intparam(0);
    call_zstringptrparam(val);
    call__thiscall(itptr, settext);
};

func void update_character_menu() {
    var string s;

    if(npc_gettalentskill(hero, npc_talent_regenerate) == 1) {
        s = concatstrings("Początkujący - ", inttostring(hero.attribute[6]));
    }
    else {
        s = concatstrings("Brak - ", inttostring(0));
    };
    s = concatstrings(s, " sekund");
    update_menu_item("MENU_ITEM_TALENT_9_SKILL", s);
    if(npc_gettalentskill(hero, npc_talent_firemaster) == 1) {
        s = concatstrings("Początkujący", inttostring(hero.attribute[7]));
    }
    else {
        s = concatstrings("Brak", inttostring(0));
    };
    s = concatstrings(s, "sekund");
    update_menu_item("MENU_ITEM_TALENT_10_SKILL", s);
};
No i w pliku Text:
Pod CONST STRING TXT_TALENTS [NPC_TALENT_MAX] =
"Reg. życia", //raus //NPC_TALENT_REGENERATE = 9;
"Reg. many", //raus //NPC_TALENT_FIREMASTER = 10;
Pod CONST STRING TXT_TALENTS_SKILLS   [NPC_TALENT_MAX] =
"-|Uczony", //raus //NPC_TALENT_REGENERATE = 9;
"-|Uczony", //raus //NPC_TALENT_FIREMASTER = 10;
Tak jak na wstępie zaznaczyłem - próbowałem to przekopiować z DecDat, jednak problem jest taki, że teoretycznie na starcie gry powinienem mieć napis "Brak", jeśli chodzi o regenerację życia, a mam po prostu "-". Po rozmowie z npc'em powinno mi zaaktualizować tekst przy regeneracji życia na zasadzie "Reg. życia | Początkujący | x sekund".
A u mnie pokazuje po rozmowie tylko "Uczony".
Skrypt dialogu(w razie czego):
// ************************************************************
//      EXIT
// ************************************************************
INSTANCE DIA_Trump_EXIT   (C_INFO)
{
npc         = WAR_5000_Trump;
nr          = 999;
condition   = DIA_Trump_EXIT_Condition;
information = DIA_Trump_EXIT_Info;
permanent   = TRUE;
description = DIALOG_ENDE;
};
FUNC INT DIA_Trump_EXIT_Condition()
{
return TRUE;
};
FUNC VOID DIA_Trump_EXIT_Info()
{
AI_StopProcessInfos (self);
};

// ************************************************************
//   Bauernaufstand
// ************************************************************
INSTANCE DIA_Trump_Test   (C_INFO)
{
npc         = WAR_5000_Trump;
nr          = 1;
condition   = DIA_Trump_Test_Condition;
information = DIA_Trump_Test_Info;
permanent   = FALSE;
description = "Test regeneracji.";
};
FUNC INT DIA_Trump_Test_Condition()
{
return TRUE;
};
FUNC VOID DIA_Trump_Test_Info()
{
AI_Output (other, self, "DIA_Trump_Test_15_00"); //Test regeneracji.
AI_Output (self, other, "DIA_Trump_Test_12_01"); //Niech tak będzie.
Npc_SetTalentSkill (hero, NPC_TALENT_REGENERATE, 1);
hero.attribute[ATR_REGENERATEHP] = 5;
hero.attribute[ATR_REGENERATEMANA] = 10;
};
PS. Z tym dialogem zresztą mam problem, że nie pokazuje mi się tekst w grze(istnieje description, ale po jego kliknięciu nie widać tych 2 zdań), a reparsowałem skrypty przy pomocy GothicStarter_mod, natomiast dialogi poprzez redefix(usunąłem pliku OU).
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Zainicjowałeś funkcję Install_Character_Menu_Hook w Init_Global?
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Chyba tak.
func void INIT_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)
Game_InitGerman();
LeGo_Init (LeGo_All &~ LeGo_Bloodsplats);
};

func void Install_Character_Menu_Hook() {
        //at oCMenu_Status::SetLearnPoints
        const int done = false;
        if(!done) {
            HookEngineF(4707920, 6, Update_Character_Menu);
            done = true;
        };
    };
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Nope.

func void Install_Character_Menu_Hook() {
        //at oCMenu_Status::SetLearnPoints
        const int done = false;
        if(!done) {
            HookEngineF(4707920, 6, Update_Character_Menu);
            done = true;
        };
    };

func void INIT_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)
Game_InitGerman();
LeGo_Init (LeGo_All &~ LeGo_Bloodsplats);
Install_Character_Menu_Hook ();
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Dodałem to co podesłałeś pod func void STARTUP_GLOBAL() i nic to nie dało.
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Nie inicjuj w startupie, bo funkcja wywoła się tylko za pierwszym wczytaniem świata.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Ja chyba tego nie potrafię wkleić, bo jeśli zrobię tak:
func void INIT_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)

Game_InitGerman();
LeGo_Init (LeGo_All &~ LeGo_Bloodsplats);
Install_Character_Menu_Hook ();

};


func void Install_Character_Menu_Hook() {
        //at oCMenu_Status::SetLearnPoints
        const int done = false;
        if(!done) {
            HookEngineF(4707920, 6, Update_Character_Menu);
            done = true;
        };
    };
To wyskakuje błąd "Unknown identifier: Install_Character_Menu_Hook".
A jak dam to pod startup_global, to nie wyskakuje błąd, ale nie działa aktualizacja.
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Wiesz, że parser nie potrafi przeskakiwać z miejsca na miejsce, tylko parsuje wszystko po kolei z góry na dół?
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Mniej-więcej. Zresztą nie pamiętam, żebym przy swoim modzie korzystał z tej funkcji, którą ty pokazałeś.
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Żeby to w ogóle ruszyło, to musi być w Init_Global. Tak się inicjuje funkcje wywoływane za pomocą HookEngine. Dodaj zwykłego Printa na początku funkcji update_character_menu żeby sprawdzić czy poprawnie zainicjowałeś. Jeśli tekst się pojawi, to wina jest po stronie warunków sprawdzających czy nauczyłeś się danej umiejętności.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Lehona

Lehona

Użytkownicy
posty196
Propsy190
  • Użytkownicy
Have a look at this: http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2/page6?p=20906914&viewfull=1#post20906914

It handles everything you need. Luckily the documentation is even in English (and there is an example), so I'm sure you'll figure out how to use it. If not, just ask :)

Edit: I'm a dummy, obviously you're already using this! You deleted some parts, that's why I didn't recognize it.
If you're actually initializing it, something must be wrong with your conditions :) Maybe just always set the Value to "test" and see if that works?
 
Unless specified otherwise, my posts are always about Gothic 2 Night of the Raven.

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Ja nie mam jak tego umieścić w Init_Global, bo za każdy razem wyskakuje "unknown identifier FUNC".
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Prawdopodobnie zjadłeś średnik. Pokazałem wcześniej jak to powinno wyglądać:
func void Install_Character_Menu_Hook() {
        //at oCMenu_Status::SetLearnPoints
        const int done = false;
        if(!done) {
            HookEngineF(4707920, 6, Update_Character_Menu);
            done = true;
        };
    };

func void INIT_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)
Game_InitGerman();
LeGo_Init (LeGo_All &~ LeGo_Bloodsplats);
Install_Character_Menu_Hook ();
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Teraz to wygląda następująco:
// *********
// GLOBAL
// *********

func void STARTUP_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor STARTUP_<LevelName>)
Game_InitGerman();
};

func void Install_Character_Menu_Hook() {
        //at oCMenu_Status::SetLearnPoints
        const int done = false;
        if(!done) {
            HookEngineF(4707920, 6, Update_Character_Menu);
            done = true;
        };
    };

func void INIT_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)

Game_InitGerman();
LeGo_Init (LeGo_All &~ LeGo_Bloodsplats);
Install_Character_Menu_Hook ();

};

func void update_menu_item(var string name, var string val) {
 
 var int itptr;
 const int SetText = 5114800;

    itptr = mem_getmenuitembystring(name);
    if(!itptr) {
        return;
    };
    call_intparam(true);
    call_intparam(0);
    call_zstringptrparam(val);
    call__thiscall(itptr, settext);
};

func void update_character_menu() {
PrintScreen ("Test", -1, -1, FONT_SCREEN, 2);

var string s;

    if(npc_gettalentskill(hero, npc_talent_regenerate) == 1) {
        s = concatstrings("Początkujący - ", inttostring(hero.attribute[6]));
    }
    else {
        s = concatstrings("Brak - ", inttostring(0));
    };
    s = concatstrings(s, " sekund");
    update_menu_item("MENU_ITEM_TALENT_9_SKILL", s);
    if(npc_gettalentskill(hero, npc_talent_firemaster) == 1) {
        s = concatstrings("Początkujący", inttostring(hero.attribute[7]));
    }
    else {
        s = concatstrings("Brak", inttostring(0));
    };
    s = concatstrings(s, "sekund");
    update_menu_item("MENU_ITEM_TALENT_10_SKILL", s);
};
Chociaż i tak to źle wkleiłem, jednak jak nacisnę B to wyskakuje napis TEST.
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Czyli wszystko poprawnie zainicjowane. Teraz wiemy, że wina jest po stronie warunku.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Toworish

Toworish

Użytkownicy
http://chomikuj.pl/ToWoRiSh
posty1664
Propsy254
ProfesjaNierób
  • Użytkownicy
  • http://chomikuj.pl/ToWoRiSh
Spoglądam w ten temat, i zastanawiam się czy to nie jest przypadkiem to samo co podał Siemekk w tym temacie, trochę info na stronie pierwszej a więcej info na drugiej: http://themodders.org/index.php?topic=26035.20
 
Niebawem...Pierdolnę se poradniki do Goticzka. Albo i nie, bo sie mnie nie chce.

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Spoglądam w ten temat, i zastanawiam się czy to nie jest przypadkiem to samo co podał Siemekk w tym temacie, trochę info na stronie pierwszej a więcej info na drugiej: http://themodders.org/index.php?topic=26035.20
Przejrzałem to co podesłałeś i moje przeróbki wyglądają dość podobnie.
Edit: @Splash - a ten tekst powinien wyskakiwać za każdym razem, jak nacisnę B czy tylko raz?

Post połączony: 2017-01-03, 11:41
Bo sam warunek chyba problemem nie jest
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Xardas47

Xardas47

Użytkownicy
Mhroczny charakterek
posty249
Propsy150
ProfesjaProgramista
  • Użytkownicy
  • Mhroczny charakterek
Cytat: Sektenspinner
6.) Do not try to manage menu items that the engine
          manages itself. For example you will not be able
          to change the value in MENU_ITEM_LEARN, because
          the engine will always display the number of learn points there, negating your changes.
          If, for example, you want to display the player strength,
          create a new menu item or rename the old menu item
          instead of just using MENU_ITEM_ATTRIBUTE_1.

Ten sposób nie działa na elementy którymi zarządza silnik. Proponuję opóźnić funkcje aktualizacji o kilka milisekund, sprawdzałem 50ms ale można eksperymentować jeszcze z mniejszymi wartościami.
W Startupie, hook jest ten sam -  zmieniłem tylko nazwę funkcji: hookenginef(4707920, 6, OpenStatus_Screen); Sama funkcja wygląda banalnie prosto, korzystając z FF'a opóźniamy funkcję o określoną liczbę milisekund: func void OpenStatus_Screen() {
FF_ApplyExt(update_character_menu, 50, 1);
};

Cała reszta bez zmian.
 


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