Bar_SetAlpha should change the transparency of both textures equally, not just the background. Are you using the newest version of LeGo and can you post the function Bar_SetAlpha (in LeGo/Bars.d) just so we can make sure we're both talking about the same code? The function is very simple and I see no reason why it would work for only one of the textures.
func void Bar_SetAlpha(var int bar, var int alpha) {
if(!Hlp_IsValidHandle(bar)) { return; };
var _bar b; b = get(bar);
var zCView v; v = View_Get(b.v0);
v.alpha = alpha;
v = View_Get(b.v1);
v.alpha = alpha;
};
I managed to fix it thanks to @Siemekk, by adding v.alphaFunc = 2;
Ich spiele gerade wieder ein wenig mit LeGo, Ninja, etc.
Wie lösche ich ein Item aus der Welt korrekt, sodass es im nächsten Aufruf meines Hooks nicht mehr als hero.focus_vob erkannt wird?
Aktuell habe ich lediglich ein MEM_DeleteVob(her.focus_vob); Aufruf.
insgesamt sieht es in etwa so aus:
Code:
// Hooken
HookEngineF(oCNpc__GetFocusVob, 6, MeinHook);
// MeinHook() ... Etwas ausgelassener Code für input validierung ...
var oCNpc her; her = Hlp_GetNpc(hero);
if (Hlp_Is_oCItem(her.focus_vob)) {
var C_Item targetItem; targetItem = MEM_PtrToInst(her.focus_vob);
if (!Hlp_IsValidItem(targetItem)) { return ; };
MEM_DeleteVob(her.focus_vob); // oder Wld_RemoveItem(targetItem);
};
Aktuell behelfe ich mir mit einem
Code:
if (lastPtr == her.focus_vob) { return; };
EDIT:
Wenn ich gerade schon dabei bin... Wld_RemoveItem triggert leider keine "Ertappt" Ereignisse wenn etwas "aufgehoben" wird.
Kann man diese separat ausführen? (Script oder bestehende Engine-Funktion?)
EDIT 2:
Mit einer Abwandlung von F A W K E S' Script habe ich das gewünschte Ergebnis erhalten können.
Hello Kirides,
I guess you can just set her.focus_vob to 0 before you use Wld_RemoveItem function.
(There is quite interesting feature in G1 - where if you call this function Wld_RemoveItem on focus_vob while holding Ctrl as a player - item will not be removed from world, not sure how G2A behaves)
To remove item from the world and to move it to NPCs inventory, you can probably use NPC_DoTakeVob (her, her.focus_vob) :
(I use this one, this way I don't have to set focus_vob to 0, also it sends perception PERC_ASSESSTHEFT)
Code:
FUNC VOID NPC_DoTakeVob (var int slfInstance, var int itemPtr)
{
//006A0D10 .text Debug data ?DoTakeVob@oCNpc@@UAEHPAVzCVob@@@Z
const int oCNpc__DoTakeVob_G1 = 6950160;
//0x007449C0 public: virtual int __thiscall oCNpc::DoTakeVob(class zCVob *)
const int oCNpc__DoTakeVob_G2 = 7621056;
var oCNPC slf; slf = Hlp_GetNPC (slfInstance);
if (Hlp_IsValidNPC (slf)) {
if (Hlp_Is_oCItem (itemPtr)) {
CALL_PtrParam (itemPtr);
CALL__thiscall (MEM_InstToPtr (slf), MEMINT_SwitchG1G2 (oCNpc__DoTakeVob_G1, oCNpc__DoTakeVob_G2));
};
};
};
Geändert von F a w k e s (30.04.2020 um 00:49 Uhr)
I guess you can just set her.focus_vob to 0 before you use Wld_RemoveItem function.
I guess the issue is already resolved, but just to note on the statement: You should not change the focus vob by assignment, because it involves object references. Instead have a look at this post (list item 4).
Zitat von piootrek86
Hello,
Could someone tell me, is it possible to set npc behaviour depence on lego talent? I made something like this:
Code:
var int npc_self; var int npc_other;
npc_self = TAL_GetValue(self, T_Test);
npc_other = TAL_GetValue(other, T_Test);
if (npc_self == 1) && (npc_other == 2) || (npc_self == 2) && (npc_other == 1)
{
B_Attack (self, other, AR_GuildEnemy, 0);
};
Both npc have T_Test set up. One npc have 1, another have 2.
Unfortunately nothing is happening as when I printed it:
I guess the issue is already resolved, but just to note on the statement: You should not change the focus vob by assignment, because it involves object references. Instead have a look at this post (list item 4).
Thank you! I will have a look again, seems like I missed your previous post completely.
Geändert von F a w k e s (02.05.2020 um 14:58 Uhr)
PrintS wird manchmal nicht angezeigt / Beim Speichern dann komplett
Hallo zusammen,
in meiner Modifikation nutze ich fast ausschließlich PrintS für Print-Anzeigen. Z. B. Tagebucheinträge, die EXP-Anzeigen, etc. - meine Tester und auch die Spieler der Atariar Edition (seit Version 1.4) haben festgestellt, dass nicht immer die PrintS angezeigt werden.
Dabei sind mehrere Dinge aufgefallen:
das Einblendungen nicht angezeigt werden, scheint willkürlich und tritt ab und zu mal auf
beim Speichern werden alle PrintS übereinander angezeigt und summieren sich auf
nach einem Spielneustart und Neuladen des betroffenen Saves funktionieren die PrintS wieder korrekt
Tester mit DX11-Renderer melden diesen Fehler, Tester, die ohne den Renderer spielen haben scheinbar keine Probleme (ob hier eine Kausalität besteht, weiß ich nicht)
Hier im Video vom Beta Test der 1.5 bei Plasquar gut zu sehen (7:03:55 - und davor beim Töten von Tieren und CO. keine Einblendung des Prints): https://youtu.be/m6bJsWKVP6k?t=25435
Hier meine Scripte: Lego 2.6.0, Ikarus 1.2.1
Die virtuellen Positionen verändere ich im Spiel in Abhängigkeit zu verschiedenen States.
Auszug aus Userconst.d (Lego) - PF_PrintX als Variable definiert.
Code:
var int PF_PrintX; // Startposition Xvar int PF_PrintY; // Startposition Y
const int PF_TextHeight = 180; // Abstand zwischen einzelnen Zeilen
Ich ändere sie dann abhängig von den Einstellungen des Spielers im Menu.
ApplySettings wird in der Startup gehooked.
HookEngineF (cGameManager__ApplySomeSettings_rtn, 6, ApplySettings);
Hier wird pro Frame abgefragt, ob das Inventar offen ist. Wenn ja, dann passe die Printposition an (damit die Prints mittig angezeigt werden und nicht mit dem geöffneten Inventar überlappen).
EDIT: Ich teste fleißig und bisher wurden alle Prints korrekt angezeigt. Falls sich daran was ändert, gebe ich nochmal bescheid und suche weiter nach möglichen Gründen. Bis jetzt passt aber alles.
Ich möchte einen neuen Statusbalken an der Position vom Gothic 2 Lebensbalken des Spielers erstellen, dazu rufe ich in einer FrameFunction folgenden Code auf:
Code:
func void barNew_Loop(){
var int barNew;
var oCViewStatusBar hpBar; hpBar = MEM_PtrToInst(MEM_Game.hpBar);
dynEndX = hpBar.zCView_pposx;
dynEndY = hpBar.zCView_pposy;
dynEndWidth = hpBar.zCView_psizex;
dynEndHeight = hpBar.zCView_psizey;
Bar_SetMax(barNew, valueOne);
Bar_SetValue(barNew, valueTwo);
var zcView rangeBar; rangeBar = MEM_PtrToInst(hpBar.value_bar);
dynEndBarTop = rangeBar.pposy - hpBar.zCView_pposy;
dynEndBarLeft = rangeBar.pposx - hpBar.zCView_pposx;
if (!Hlp_IsValidHandle(barNew))
{
barNew = Bar_Create(newBar);
};
if (MEM_Game.pause_screen || !InfoManager_HasFinished())
{
Bar_Delete(barNew);
};
};
Damit der Balken auch korrekt skaliert, wenn der Spieler die Auflösung ändert, lösche ich den Balken, sobald ein Menü geöffnet wird und lasse ihn erneut erstellen.
Allerdings ist der neue Balken von Anfang an an einer völlig anderen Position, als der Lebensbalken:
Sollten mit hpBar.zCView_pposx bzw. hpBar.zCView_pposy nicht eigentlich die genauen Werte vom Lebensbalken kopiert und auf den neuen angewandt werden?
Edit: Mir ist außerdem aufgefallen, dass der Balken nur beim ersten Mal entfernt wird, wenn man mit einem NPC redet. Nach Dialogende wird der erneut erstellt, verschwindet dann aber weder wenn man das Menü öffnet, noch wenn man einen NPC anquatscht. Bar_Delete wird aber auf jeden Fall aufgerufen. Beim Pausieren existiert dieses Problem nicht, solange man noch nicht mit einem NPC geredet hat, wird der Balken ausgeblendet.
Was die Position angeht: Die LeGo bars verwenden die übergebenen Werte als Mittelpunkt der bar.
Ausschnitt Dirty Swamp sprintcode als Lösungsvorschlag:
Code:
// LeGo bars benutzen den Mittelpunkt, daher jeweils um die Hälfte verschieben, liegt dann genau auf der mana bar
dynEndX = dynEndX + dynEndWidth/2;
dynEndY = dynEndY + dynEndHeight/2;
Ich möchte einen neuen Statusbalken an der Position vom Gothic 2 Lebensbalken des Spielers erstellen
Falls du den Lebensbalken nachahmen möchtest, um dessen Textur zu ändern, kann ich dir das overrideBars Skript ans Herz legen. Damit lassen sich die existierenden Balken modifizieren, anstatt sie alle neu zu malen und sinnvoll verstecken, anzeigen und fortlaufend der Auflösung anpassen zu müssen. Dadurch ersparst du dir eine Menge Arbeit.
Die Funktionen getNPCHealthState, getPCManaState und getPCSwimState werden fortlaufend aufgerufen und erlauben dir die Texturen zu bestimmen. In der ersten Funktion kannst du den NPC nach hero abfragen, um Änderungen gezielt nur am Lebensbalken des Spielers vorzunehmen. (Die Funktion zum Schwimm-Balken ist mit einem Beispiel gefüllt und sollte geleert werden.)
Was die Position angeht: Die LeGo bars verwenden die übergebenen Werte als Mittelpunkt der bar.
Ausschnitt Dirty Swamp sprintcode als Lösungsvorschlag:
Code:
// LeGo bars benutzen den Mittelpunkt, daher jeweils um die Hälfte verschieben, liegt dann genau auf der mana bar
dynEndX = dynEndX + dynEndWidth/2;
dynEndY = dynEndY + dynEndHeight/2;
Vielen Dank, hat geklappt und der Balken skaliert nun mit (scheinbar) allen Auflösungen korrekt mit.
Zitat von mud-freak
Falls du den Lebensbalken nachahmen möchtest, um dessen Textur zu ändern, kann ich dir das overrideBars Skript ans Herz legen. Damit lassen sich die existierenden Balken modifizieren, anstatt sie alle neu zu malen und sinnvoll verstecken, anzeigen und fortlaufend der Auflösung anpassen zu müssen. Dadurch ersparst du dir eine Menge Arbeit.
Die Funktionen getNPCHealthState, getPCManaState und getPCSwimState werden fortlaufend aufgerufen und erlauben dir die Texturen zu bestimmen. In der ersten Funktion kannst du den NPC nach hero abfragen, um Änderungen gezielt nur am Lebensbalken des Spielers vorzunehmen. (Die Funktion zum Schwimm-Balken ist mit einem Beispiel gefüllt und sollte geleert werden.)
Danke für den Hinweis. Aber mein Ziel war es, sämtliche Statusbalken ordentlich in einer bestimmten Reihenfolge auf die linke Seite zu bekommen.
Danke für den Hinweis. Aber mein Ziel war es, sämtliche Statusbalken ordentlich in einer bestimmten Reihenfolge auf die linke Seite zu bekommen.
Ah, das stimmt. Das ist natürlich ein anderes Vorhaben.
Da du ja evtl. inhaltlich an den Balken nicht viel ändern willst und alle so erhalten bleiben, frage ich mich, ob es nicht auch dort einfacher ist einfach die Koordinaten der bestehenden Balken zu überschreiben.
Ah, das stimmt. Das ist natürlich ein anderes Vorhaben.
Da du ja evtl. inhaltlich an den Balken nicht viel ändern willst und alle so erhalten bleiben, frage ich mich, ob es nicht auch dort einfacher ist einfach die Koordinaten der bestehenden Balken zu überschreiben.
Ich habe es mir nicht nehmen lassen, diese Behauptung einmal auszuprobieren. Mit diesem Skript lassen sich die Balken sehr einfach und ohne großen Aufwand umpositionieren.
Ich habe es mir nicht nehmen lassen, diese Behauptung einmal auszuprobieren. Mit diesem Skript lassen sich die Balken sehr einfach und ohne großen Aufwand umpositionieren.
Sehr cool, vielen Dank dafür! Ich war gestern zwar bereits mit meinem Skript fertig, das zumindest bisher auch zu funktionieren scheint, aber deine Lösung ist da auf jeden Fall die bessere.
Kann es sein, dass für die Buttons eine besondere Handhabung notwendig ist?
Achtung! Tests sind für g1 Version gemacht worden!
Ich verwende Button_create und Button_show einmalig zum Anzeigen des Buttons und button_hide und button_delete um selbige loszuwerden. Meist lösche ich den betreffenden Button mit der eigenen on_click Funktion (macht Sinn wenn ich nicht 15 Buttons zeitgleich aktiv haben möchte). Auf die Buttons wird über Integervars zugegriffen, in denen bei create sofort die Adresse/id gespeichert wurde. (Die createfuncs sind ja mit return)
An einigen Stellen gibt es aber Access Violations beim klicken auf den Button und es gibt ein paar Funktionen, die wohl nicht in Kombination genutzt werden können.
1. On_click abstürze in unregelmäßigen Intervallen. Der niedrigste war 3 klicks, der höchste war 20 Klicks. Ich habe sowohl Klicks auf den gleichen, wie auf verschiedene Buttons getestet. Selbst Buttons mit leeren on_clicks erzeugen Abstürze.
2. Keine Tagebucheinträge möglich. Sobald man b_LogEntry benutzt, gibts ne Assess violation. 100% reproduzierbar.
3. Keine B_GiveInvItem möglich. Ebenfalls sofortiger Absturz. Seltsamerweise gehen Createinvitems und Npc_Removeinvitems ohne Distributionsfunktion perfekt.
Sowohl 2 als auch 3 enthalten eine printscreen-funktion. Kann es sein, dass es da inkompatibilität gibt?