Aktuelles Leben und Mana mittig im jeweiligen Balken anzeigen lassen
Hallo,
es gab glaube ich vor gar nicht so langer Zeit schon mal einen Thread dazu, leider finde ich ihn aber nicht mehr. Ich möchte den aktuellen Wert von Mana und Leben mittig im jeweiligen Balken anzeigen lassen. Das Anzeigen der Werte selbst wäre soweit gar kein Problem. Problem ist aber, dass der Print (ich probiere es mit der LeGo-Funktion Print_Ext) immer unter den Balken sich befindet, also unter den jeweiligen Texturen. Wie verhindere ich, dass das passiert und der Text auf den Texturen angezeigt wird, bestenfalls auch noch genau mittig von diesen? Weiß da jemand eine Lösung?
Hallo,
es gab glaube ich vor gar nicht so langer Zeit schon mal einen Thread dazu, leider finde ich ihn aber nicht mehr. Ich möchte den aktuellen Wert von Mana und Leben mittig im jeweiligen Balken anzeigen lassen. Das Anzeigen der Werte selbst wäre soweit gar kein Problem. Problem ist aber, dass der Print (ich probiere es mit der LeGo-Funktion Print_Ext) immer unter den Balken sich befindet, also unter den jeweiligen Texturen. Wie verhindere ich, dass das passiert und der Text auf den Texturen angezeigt wird, bestenfalls auch noch genau mittig von diesen? Weiß da jemand eine Lösung?
Das liegt daran, dass die HP Bars später als eine FrameFunction gerendert werden und die Bars immer "ganz oben" angezeigt werden.
Hier ist der Quellcode von meinem RenderBarValues Patch (gerade erstellt, höhö), mit dem man bei der HP und Mana Leiste jeweils die Zahlenwerte (vom Hero) angezeigt bekommt, sowie die leben von einem Fokus NPC.
Spoiler:(zum lesen bitte Text markieren)
Code:
func void Patch_RenderBarValues_CloseIfOpen(var int viewPtr) {
if(viewPtr) {
var zCView view; view = _^(viewPtr);
if (view.isOpen) {
ViewPtr_Close(viewPtr);
};
};
};
func void Patch_RenderBarValues_TryShow(var int barPtr, var int viewPtr) {
var oCViewStatusBar bar; bar = _^(barPtr);
if (bar.zCView_ondesk) {
ViewPtr_Open(viewPtr);
ViewPtr_MoveTo(viewPtr, bar.zCView_vposx, bar.zCView_vposy);
} else {
Patch_RenderBarValues_CloseIfOpen(viewPtr);
};
};
const string Patch_RenderBarValues_Font = "FONT_OLD_10_WHITE.TGA";
const int Patch_RenderBarValues_hpView = 0;
const int Patch_RenderBarValues_hpTextViewPtr = 0;
const int Patch_RenderBarValues_mpView = 0;
const int Patch_RenderBarValues_mpTextViewPtr = 0;
const int Patch_RenderBarValues_focusHpView = 0;
const int Patch_RenderBarValues_focusHpTextViewPtr = 0;
func void Patch_RenderBarValues_RenderForBar(var int barPtr, var int viewPtr, var int textViewPtr, var int act, var int max) {
var oCViewStatusBar bar; bar = _^(barPtr);
if (!bar.zCView_ondesk) { return; };
var zCViewText tv; tv = _^(textViewPtr);
var string text;
text = IntToString(act);
text = ConcatStrings(text, " / ");
text = ConcatStrings(text, IntToString(max));
tv.text = text;
tv.posx = Print_ToVirtual((bar.zCView_psizex - Print_GetStringWidth(text, Patch_RenderBarValues_Font)) / 2, bar.zCView_psizex);
tv.posy = Print_ToVirtual((bar.zCView_psizey - Print_GetFontHeight(Patch_RenderBarValues_Font)) / 2, bar.zCView_psizey);
ViewPtr_Top(viewPtr);
};
func void Patch_RenderBarValues() {
var oCViewStatusBar hpBar; hpBar = _^(MEM_Game.hpBar);
var oCViewStatusBar mpBar; mpBar = _^(MEM_Game.manaBar);
var oCViewStatusBar focusBar; focusBar = _^(MEM_Game.focusBar);
if (!Patch_RenderBarValues_hpView) {
MEM_Info("RenderBarValues: Initializing views...");
Patch_RenderBarValues_hpView = ViewPtr_Create(hpBar.zCView_vposx, hpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_hpView, hpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_hpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_hpView, Patch_RenderBarValues_hpTextViewPtr);
Patch_RenderBarValues_mpView = ViewPtr_Create(mpBar.zCView_vposx, mpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_mpView, mpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_mpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_mpView, Patch_RenderBarValues_mpTextViewPtr);
Patch_RenderBarValues_focusHpView = ViewPtr_Create(mpBar.zCView_vposx, mpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_focusHpView, mpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_focusHpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_focusHpView, Patch_RenderBarValues_focusHpTextViewPtr);
};
Patch_RenderBarValues_TryShow(MEM_Game.hpBar, Patch_RenderBarValues_hpView);
Patch_RenderBarValues_TryShow(MEM_Game.manaBar, Patch_RenderBarValues_mpView);
Patch_RenderBarValues_TryShow(MEM_Game.focusBar, Patch_RenderBarValues_focusHpView);
Patch_RenderBarValues_RenderForBar(MEM_Game.hpBar, Patch_RenderBarValues_hpView, Patch_RenderBarValues_hpTextViewPtr, hero.attribute[ATR_HITPOINTS], hero.attribute[ATR_HITPOINTS_MAX]);
Patch_RenderBarValues_RenderForBar(MEM_Game.manaBar, Patch_RenderBarValues_mpView, Patch_RenderBarValues_mpTextViewPtr, hero.attribute[ATR_MANA], hero.attribute[ATR_MANA_MAX]);
if (focusBar.zCView_ondesk) {
var oCNpc oNpc; oNpc = MEM_CpyInst(hero);
if (Hlp_Is_oCNpc(oNpc.focus_vob)) {
oNpc = _^(oNpc.focus_vob);
Patch_RenderBarValues_RenderForBar(MEM_Game.focusBar, Patch_RenderBarValues_focusHpView, Patch_RenderBarValues_focusHpTextViewPtr, oNpc.attribute[ATR_HITPOINTS], oNpc.attribute[ATR_HITPOINTS_MAX]);
};
};
};
func void Patch_RenderBarValues_Init() {
const int oCGame__Render_AfterUpdatePlayerStatus_G1 = 6545007; // 0063de6f, size:6
const int oCGame__Render_AfterUpdatePlayerStatus_G2 = 7113181; // 006c89dd, size:6
HookEngineF(
MEMINT_SwitchG1G2(oCGame__Render_AfterUpdatePlayerStatus_G1, oCGame__Render_AfterUpdatePlayerStatus_G2),
6,
Patch_RenderBarValues);
};
func void Ninja_RenderBarValues_Init() {
MEM_InitAll();
LeGo_MergeFlags( LeGo_Interface | LeGo_HookEngine );
Patch_RenderBarValues_Init();
};
Ich hab das ding bereits als separaten Patch veröffentlicht, kommt drauf an wofür du den Code verwenden willst
Der Patch kann ebenfalls die HP/MP/Gegner Anzeigen. Ich hatte damals aber auch immer das Problem das die Bar's immer über dem Text wahren Daher lasse ich den Text über den Bar's anzeigen, mit deinem Hook könnte ich aber dieses Problem endlich beheben und so anzeigen lassen wie ich es ursprünglich wollte Daher die frage ob ich die wichtigen Teile, die dafür verantwortlich sind bei mir mit einbauen darf ^^
Der Patch kann ebenfalls die HP/MP/Gegner Anzeigen. Ich hatte damals aber auch immer das Problem das die Bar's immer über dem Text wahren Daher lasse ich den Text über den Bar's anzeigen, mit deinem Hook könnte ich aber dieses Problem endlich beheben und so anzeigen lassen wie ich es ursprünglich wollte Daher die frage ob ich die wichtigen Teile, die dafür verantwortlich sind bei mir mit einbauen darf ^^
Das liegt daran, dass die HP Bars später als eine FrameFunction gerendert werden und die Bars immer "ganz oben" angezeigt werden.
Hier ist der Quellcode von meinem RenderBarValues Patch (gerade erstellt, höhö), mit dem man bei der HP und Mana Leiste jeweils die Zahlenwerte (vom Hero) angezeigt bekommt, sowie die leben von einem Fokus NPC.
Spoiler:(zum lesen bitte Text markieren)
Code:
func void Patch_RenderBarValues_CloseIfOpen(var int viewPtr) {
if(viewPtr) {
var zCView view; view = _^(viewPtr);
if (view.isOpen) {
ViewPtr_Close(viewPtr);
};
};
};
func void Patch_RenderBarValues_TryShow(var int barPtr, var int viewPtr) {
var oCViewStatusBar bar; bar = _^(barPtr);
if (bar.zCView_ondesk) {
ViewPtr_Open(viewPtr);
ViewPtr_MoveTo(viewPtr, bar.zCView_vposx, bar.zCView_vposy);
} else {
Patch_RenderBarValues_CloseIfOpen(viewPtr);
};
};
const string Patch_RenderBarValues_Font = "FONT_OLD_10_WHITE.TGA";
const int Patch_RenderBarValues_hpView = 0;
const int Patch_RenderBarValues_hpTextViewPtr = 0;
const int Patch_RenderBarValues_mpView = 0;
const int Patch_RenderBarValues_mpTextViewPtr = 0;
const int Patch_RenderBarValues_focusHpView = 0;
const int Patch_RenderBarValues_focusHpTextViewPtr = 0;
func void Patch_RenderBarValues_RenderForBar(var int barPtr, var int viewPtr, var int textViewPtr, var int act, var int max) {
var oCViewStatusBar bar; bar = _^(barPtr);
if (!bar.zCView_ondesk) { return; };
var zCViewText tv; tv = _^(textViewPtr);
var string text;
text = IntToString(act);
text = ConcatStrings(text, " / ");
text = ConcatStrings(text, IntToString(max));
tv.text = text;
tv.posx = Print_ToVirtual((bar.zCView_psizex - Print_GetStringWidth(text, Patch_RenderBarValues_Font)) / 2, bar.zCView_psizex);
tv.posy = Print_ToVirtual((bar.zCView_psizey - Print_GetFontHeight(Patch_RenderBarValues_Font)) / 2, bar.zCView_psizey);
ViewPtr_Top(viewPtr);
};
func void Patch_RenderBarValues() {
var oCViewStatusBar hpBar; hpBar = _^(MEM_Game.hpBar);
var oCViewStatusBar mpBar; mpBar = _^(MEM_Game.manaBar);
var oCViewStatusBar focusBar; focusBar = _^(MEM_Game.focusBar);
if (!Patch_RenderBarValues_hpView) {
MEM_Info("RenderBarValues: Initializing views...");
Patch_RenderBarValues_hpView = ViewPtr_Create(hpBar.zCView_vposx, hpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_hpView, hpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_hpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_hpView, Patch_RenderBarValues_hpTextViewPtr);
Patch_RenderBarValues_mpView = ViewPtr_Create(mpBar.zCView_vposx, mpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_mpView, mpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_mpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_mpView, Patch_RenderBarValues_mpTextViewPtr);
Patch_RenderBarValues_focusHpView = ViewPtr_Create(mpBar.zCView_vposx, mpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_focusHpView, mpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_focusHpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_focusHpView, Patch_RenderBarValues_focusHpTextViewPtr);
};
Patch_RenderBarValues_TryShow(MEM_Game.hpBar, Patch_RenderBarValues_hpView);
Patch_RenderBarValues_TryShow(MEM_Game.manaBar, Patch_RenderBarValues_mpView);
Patch_RenderBarValues_TryShow(MEM_Game.focusBar, Patch_RenderBarValues_focusHpView);
Patch_RenderBarValues_RenderForBar(MEM_Game.hpBar, Patch_RenderBarValues_hpView, Patch_RenderBarValues_hpTextViewPtr, hero.attribute[ATR_HITPOINTS], hero.attribute[ATR_HITPOINTS_MAX]);
Patch_RenderBarValues_RenderForBar(MEM_Game.manaBar, Patch_RenderBarValues_mpView, Patch_RenderBarValues_mpTextViewPtr, hero.attribute[ATR_MANA], hero.attribute[ATR_MANA_MAX]);
if (focusBar.zCView_ondesk) {
var oCNpc oNpc; oNpc = MEM_CpyInst(hero);
if (Hlp_Is_oCNpc(oNpc.focus_vob)) {
oNpc = _^(oNpc.focus_vob);
Patch_RenderBarValues_RenderForBar(MEM_Game.focusBar, Patch_RenderBarValues_focusHpView, Patch_RenderBarValues_focusHpTextViewPtr, oNpc.attribute[ATR_HITPOINTS], oNpc.attribute[ATR_HITPOINTS_MAX]);
};
};
};
func void Patch_RenderBarValues_Init() {
const int oCGame__Render_AfterUpdatePlayerStatus_G1 = 6545007; // 0063de6f, size:6
const int oCGame__Render_AfterUpdatePlayerStatus_G2 = 7113181; // 006c89dd, size:6
HookEngineF(
MEMINT_SwitchG1G2(oCGame__Render_AfterUpdatePlayerStatus_G1, oCGame__Render_AfterUpdatePlayerStatus_G2),
6,
Patch_RenderBarValues);
};
func void Ninja_RenderBarValues_Init() {
MEM_InitAll();
LeGo_MergeFlags( LeGo_Interface | LeGo_HookEngine );
Patch_RenderBarValues_Init();
};
Das liegt daran, dass die HP Bars später als eine FrameFunction gerendert werden und die Bars immer "ganz oben" angezeigt werden.
Hier ist der Quellcode von meinem RenderBarValues Patch (gerade erstellt, höhö), mit dem man bei der HP und Mana Leiste jeweils die Zahlenwerte (vom Hero) angezeigt bekommt, sowie die leben von einem Fokus NPC.
Spoiler:(zum lesen bitte Text markieren)
Code:
func void Patch_RenderBarValues_CloseIfOpen(var int viewPtr) {
if(viewPtr) {
var zCView view; view = _^(viewPtr);
if (view.isOpen) {
ViewPtr_Close(viewPtr);
};
};
};
func void Patch_RenderBarValues_TryShow(var int barPtr, var int viewPtr) {
var oCViewStatusBar bar; bar = _^(barPtr);
if (bar.zCView_ondesk) {
ViewPtr_Open(viewPtr);
ViewPtr_MoveTo(viewPtr, bar.zCView_vposx, bar.zCView_vposy);
} else {
Patch_RenderBarValues_CloseIfOpen(viewPtr);
};
};
const string Patch_RenderBarValues_Font = "FONT_OLD_10_WHITE.TGA";
const int Patch_RenderBarValues_hpView = 0;
const int Patch_RenderBarValues_hpTextViewPtr = 0;
const int Patch_RenderBarValues_mpView = 0;
const int Patch_RenderBarValues_mpTextViewPtr = 0;
const int Patch_RenderBarValues_focusHpView = 0;
const int Patch_RenderBarValues_focusHpTextViewPtr = 0;
func void Patch_RenderBarValues_RenderForBar(var int barPtr, var int viewPtr, var int textViewPtr, var int act, var int max) {
var oCViewStatusBar bar; bar = _^(barPtr);
if (!bar.zCView_ondesk) { return; };
var zCViewText tv; tv = _^(textViewPtr);
var string text;
text = IntToString(act);
text = ConcatStrings(text, " / ");
text = ConcatStrings(text, IntToString(max));
tv.text = text;
tv.posx = Print_ToVirtual((bar.zCView_psizex - Print_GetStringWidth(text, Patch_RenderBarValues_Font)) / 2, bar.zCView_psizex);
tv.posy = Print_ToVirtual((bar.zCView_psizey - Print_GetFontHeight(Patch_RenderBarValues_Font)) / 2, bar.zCView_psizey);
ViewPtr_Top(viewPtr);
};
func void Patch_RenderBarValues() {
var oCViewStatusBar hpBar; hpBar = _^(MEM_Game.hpBar);
var oCViewStatusBar mpBar; mpBar = _^(MEM_Game.manaBar);
var oCViewStatusBar focusBar; focusBar = _^(MEM_Game.focusBar);
if (!Patch_RenderBarValues_hpView) {
MEM_Info("RenderBarValues: Initializing views...");
Patch_RenderBarValues_hpView = ViewPtr_Create(hpBar.zCView_vposx, hpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_hpView, hpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_hpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_hpView, Patch_RenderBarValues_hpTextViewPtr);
Patch_RenderBarValues_mpView = ViewPtr_Create(mpBar.zCView_vposx, mpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_mpView, mpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_mpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_mpView, Patch_RenderBarValues_mpTextViewPtr);
Patch_RenderBarValues_focusHpView = ViewPtr_Create(mpBar.zCView_vposx, mpBar.zCView_vposy, 1, 1);
ViewPtr_ResizePxl(Patch_RenderBarValues_focusHpView, mpBar.zCView_psizex, Print_GetFontHeight(Patch_RenderBarValues_Font));
Patch_RenderBarValues_focusHpTextViewPtr = Print_CreateTextPtr("", Patch_RenderBarValues_Font);
ViewPtr_AddTextView(Patch_RenderBarValues_focusHpView, Patch_RenderBarValues_focusHpTextViewPtr);
};
Patch_RenderBarValues_TryShow(MEM_Game.hpBar, Patch_RenderBarValues_hpView);
Patch_RenderBarValues_TryShow(MEM_Game.manaBar, Patch_RenderBarValues_mpView);
Patch_RenderBarValues_TryShow(MEM_Game.focusBar, Patch_RenderBarValues_focusHpView);
Patch_RenderBarValues_RenderForBar(MEM_Game.hpBar, Patch_RenderBarValues_hpView, Patch_RenderBarValues_hpTextViewPtr, hero.attribute[ATR_HITPOINTS], hero.attribute[ATR_HITPOINTS_MAX]);
Patch_RenderBarValues_RenderForBar(MEM_Game.manaBar, Patch_RenderBarValues_mpView, Patch_RenderBarValues_mpTextViewPtr, hero.attribute[ATR_MANA], hero.attribute[ATR_MANA_MAX]);
if (focusBar.zCView_ondesk) {
var oCNpc oNpc; oNpc = MEM_CpyInst(hero);
if (Hlp_Is_oCNpc(oNpc.focus_vob)) {
oNpc = _^(oNpc.focus_vob);
Patch_RenderBarValues_RenderForBar(MEM_Game.focusBar, Patch_RenderBarValues_focusHpView, Patch_RenderBarValues_focusHpTextViewPtr, oNpc.attribute[ATR_HITPOINTS], oNpc.attribute[ATR_HITPOINTS_MAX]);
};
};
};
func void Patch_RenderBarValues_Init() {
const int oCGame__Render_AfterUpdatePlayerStatus_G1 = 6545007; // 0063de6f, size:6
const int oCGame__Render_AfterUpdatePlayerStatus_G2 = 7113181; // 006c89dd, size:6
HookEngineF(
MEMINT_SwitchG1G2(oCGame__Render_AfterUpdatePlayerStatus_G1, oCGame__Render_AfterUpdatePlayerStatus_G2),
6,
Patch_RenderBarValues);
};
func void Ninja_RenderBarValues_Init() {
MEM_InitAll();
LeGo_MergeFlags( LeGo_Interface | LeGo_HookEngine );
Patch_RenderBarValues_Init();
};
Zwar etwas spät und vermutlich bin ich gerade einfach nur doof, doch bei mir werden mit dem Skript keine Werte auf den Balken angezeigt in Gothic 2. Ich verwende ansonsten eigentlich nur zwei weitere Skripte, die mit den Balken zu tun haben, die sollten aber normalerweise keine Probleme machen sicherheitshalber hatte ich sie beide sogar mal vollständig deaktiviert. Es müsste doch lediglich die Patch_RenderBarValues_Init in der Startup aufgerufen werden, oder?
Zwar etwas spät und vermutlich bin ich gerade einfach nur doof, doch bei mir werden mit dem Skript keine Werte auf den Balken angezeigt in Gothic 2. Ich verwende ansonsten eigentlich nur zwei weitere Skripte, die mit den Balken zu tun haben, die sollten aber normalerweise keine Probleme machen sicherheitshalber hatte ich sie beide sogar mal vollständig deaktiviert. Es müsste doch lediglich die Patch_RenderBarValues_Init in der Startup aufgerufen werden, oder?
Problem gelöst. Ich habe gerade LeGo auf die 2.8.0 aktualisiert, eigentlich aus einem anderen Grund, dabei habe ich aber festgestellt, dass die Werte nun angezeigt werden.
Bedenke dabei noch, das Prefix “Patch_” überall zu entfernen.
Gut, dass du das erwähnst. Das hätte ich wohl tatsächlich vergessen. Gestern noch die ganze Zeit dran gedacht, dann aber irgendwie wieder völlig ausgeblendet...