|
-
10.11.2020 12:12
#1
yINSTANCE_HELP Item im Inventar
diego87 testet meine Mod und schickte mir ein Screenshot. Er spielt mit einigen Patches.
[Bild: 5VttuPbhp7T.jpg]
Es ist eine LeGo Int und in jeder .dat hinterlegt - Wie kommt die als Item ins Inventar?
Ich vermute es liegt an der Kombination mit den genutzten Patches.
Geändert von Falugify (10.11.2020 um 12:19 Uhr)
-
Du könntest mal beim Pirate oder Alan nachfragen, ich meinte in Odyssee gab es das auch mal.
-
Erklärung Problem:
Zitat von NicoDE
Irgendwas hat irgendwann ein Item mit dem Symbolindex 0 ins Inventar getan. \255INSTANCE_HELP hat immer den Index 0 (weil es vom Parser sogar noch vor den Externals angelegt wird). Es wird intern dazu benutzt, Objektreferezenzen als Rückgabewert von Externals zurückzugeben. Es könnte sich zu dem Zeitpunkt also tatsächlich um eine C_Item-Referenz gehandelt haben... Nur war das wohl nicht beabsichtigt. Ein ähnliches Problem gibt es mit Npc_RemoveItem und anderen Externals. Eigentlich dürfte man ITEM (die Intanzvariable) nicht verwenden... aber der Support wurde teilweise in den Externals eingebaut...
Ursache in Odyssee:
Zitat von blackpirate
So wie es aussieht, habe ich den Fehler, der den unsichtbaren Gegenstand hervorgerufen hat, gefunden und behoben.
Es handelte sich dabei um diesen Eintrag in der ZS_Dead:
Code:
Npc_SetToFightMode (self, 0);
Sinn dieses Eintrags war die doppelte Waffe nach dem Tod der Goblins aus dem Inventar zu nehmen. Ich habe nach der Deaktivierung des Eintrags jede Menge Monster getötet ohne, dass der Fehler nochmal aufgetreten ist.
Möglicherweise steht in deiner mod irgendwo äquivalenter code. (Npc_SetToFightMode (NPC, XYZ); und XYZ == 0)
Oder auch createInvItems mit 0 als parameter für item.
-
10.11.2020 13:04
#4
Zitat von Cryp18Struct
Erklärung Problem:
Ursache in Odyssee:
Möglicherweise steht in deiner mod irgendwo äquivalenter code. (Npc_SetToFightMode (NPC, XYZ); und XYZ == 0)
Oder auch createInvItems mit 0 als parameter für item.
Ich habe das hier in meiner Mod:
Code:
// ****************************************************************************************************
func int oCNpc_GetModel(var int _this)
{
const int oCNpc__GetModel = 7571232; // 0x00738720
const int call = 0;
if (CALL_Begin(call))
{
CALL_PutRetValTo(_@(retVal));
CALL__thiscall(_@(_this), oCNpc__GetModel);
call = CALL_End();
};
var int retVal;
return retVal;
};
func int zCModel_SearchNode(var int _this, var string nodeName)
{
const int zCModel__SearchNode = 5758960; // 0x0057DFF0
CALL_zStringPtrParam(nodeName);
CALL__thiscall(_this, zCModel__SearchNode);
var int retVal; retVal = CALL_RetValAsInt();
return retVal;
};
func int zCModel_SetNodeVisual(var int _this, var int nodePtr, var int visualPtr, var int animated)
{
const int zCModel_SetNodeVisual = 5739168; // 0x005792A0
const int call = 0;
if (CALL_Begin(call))
{
CALL_IntParam(_@(animated));
CALL_IntParam(_@(visualPtr));
CALL_IntParam(_@(nodePtr));
CALL__thiscall(_@(_this), zCModel_SetNodeVisual);
call = CALL_End();
};
var int retVal;
return retVal;
};
func void _Fix_GoblinClubs_NpcUnarchive_Hook()
{
var int _this; _this = EBP;
if (!_this) { return; };
var C_Npc _thisNpc; _thisNpc = _^(_this);
if (!(_thisNpc.guild == GIL_GOBBO
|| _thisNpc.guild == GIL_GOBBO_SKELETON
|| _thisNpc.guild == GIL_SUMMONED_GOBBO_SKELETON ))
{
return;
};
if (_thisNpc.attribute[ATR_HITPOINTS] != 0)
{
return;
};
var int pModel; pModel = oCNpc_GetModel(_this);
if (!pModel)
{
return;
};
var int pNodeInst; pNodeInst = zCModel_SearchNode(pModel, "ZS_RIGHTHAND");
if (!pNodeInst)
{
return;
};
zCModel_SetNodeVisual(pModel, pNodeInst, 0, FALSE);
};
func void Fix_GoblinClubs_Init()
{
const int oCNpc__Unarchive_End = 7636622; // 0x0074868E
HookEngineF(oCNpc__Unarchive_End, 7, _Fix_GoblinClubs_NpcUnarchive_Hook);
};
Liegt es vielleicht daran?
-
Kann mir nicht vorstellen das es daran liegt. Zum einen wird da nur am visual etwas verändert, zum anderen wird dieser code nicht für einen lebenden menschlichen NPC aufgerufen (und kann daher nicht erklären warum ein menschlicher Händler die Dinger im Inventar hat).
Schau dir mal die Stelle an wo items im inventar dieses NPCs erstellt werden (B_GiveTradeInv?).
-
10.11.2020 13:56
#6
Zitat von Cryp18Struct
Kann mir nicht vorstellen das es daran liegt. Zum einen wird da nur am visual etwas verändert, zum anderen wird dieser code nicht für einen lebenden menschlichen NPC aufgerufen (und kann daher nicht erklären warum ein menschlicher Händler die Dinger im Inventar hat).
Schau dir mal die Stelle an wo items im inventar dieses NPCs erstellt werden (B_GiveTradeInv?).
Wird es verursacht durch CreateInvItems (self, ItMw_1h_Bau_Mace, 0); oder CreateInvItems (self, 0, 1); oder durch beide Varianten? Bei Jora finde ich keinen solchen Fehler.
Im Dialog lasse ich ihm Pfeile nachfüllen
Code:
Npc_RemoveInvItems (self, ItRw_Bolt, Npc_HasItems (self,ItRw_Bolt) );
var int McBolzenAmount;
McBolzenAmount = (Kapitel * 50);
CreateInvItems (self, ItRw_Bolt, McBolzenAmount );
Npc_RemoveInvItems (self, ItRw_Arrow, Npc_HasItems (self,ItRw_Arrow) );
var int McArrowAmount;
McArrowAmount = (Kapitel * 50);
CreateInvItems (self, ItRw_Arrow, McArrowAmount );
-
Hmm, can save him? Or you can see for yourself what is currently in the inventory of PC_HERO
carryvob....
-
Zitat von Falugify
Wird es verursacht durch CreateInvItems (self, ItMw_1h_Bau_Mace, 0); oder CreateInvItems (self, 0, 1); oder durch beide Varianten? Bei Jora finde ich keinen solchen Fehler.
CreateInvItems (self, 0, 1); würde ein solches defektes Null item erstellen.
Und ja, der Jora Pfeil code sieht okay aus.
Verwendest du irgendwo Variablen um items zu erstellen?
Also beispielsweise von der struktur her so was:
Code:
var int itemInstVar;
itemInstVar = 0;
if(a){
itemInstVar = ABCD_ITEM_A;
}else if(b){
itemInstVar = XYZ_ITEM_B;
};
CreateInvItems(npc, itemInstVar, XYZ); // falls itemInstVar == 0: produziert solche fehlerhafte items
In Velen gab es das Problem auch mal, da wurde fmode_none als parameter an npc_settofightmode übergeben (und fmode_none ist halt auch == 0)
https://forum.worldofplayers.de/foru...1#post26047723
Ich würde da jetzt zuerst in den ZS-Funktionen/Zuständen/Tagesabläufen die Jora macht nachschauen ob da irgendwas auffälliges passiert.
Dann in den Skripten nach allen Stellen suchen wo npc_settofightmode verwendet wird und schauen ob da irgendwo ein parameter steht der keine Item Instanz ist.
Und dann CreateInvItems/CreateInvItem alle Stellen prüfen.
edit: wäre natürlich auch sinnvoll zu wissen welche patches er genau verwendet, evt. liegt es ja wirklich an einem patch.
-
10.11.2020 23:14
#9
Zitat von Cryp18Struct
CreateInvItems (self, 0, 1); würde ein solches defektes Null item erstellen.
Und ja, der Jora Pfeil code sieht okay aus.
Verwendest du irgendwo Variablen um items zu erstellen?
Also beispielsweise von der struktur her so was:
Code:
var int itemInstVar;
itemInstVar = 0;
if(a){
itemInstVar = ABCD_ITEM_A;
}else if(b){
itemInstVar = XYZ_ITEM_B;
};
CreateInvItems(npc, itemInstVar, XYZ); // falls itemInstVar == 0: produziert solche fehlerhafte items
In Velen gab es das Problem auch mal, da wurde fmode_none als parameter an npc_settofightmode übergeben (und fmode_none ist halt auch == 0)
https://forum.worldofplayers.de/foru...1#post26047723
Ich würde da jetzt zuerst in den ZS-Funktionen/Zuständen/Tagesabläufen die Jora macht nachschauen ob da irgendwas auffälliges passiert.
Dann in den Skripten nach allen Stellen suchen wo npc_settofightmode verwendet wird und schauen ob da irgendwo ein parameter steht der keine Item Instanz ist.
Und dann CreateInvItems/CreateInvItem alle Stellen prüfen.
edit: wäre natürlich auch sinnvoll zu wissen welche patches er genau verwendet, evt. liegt es ja wirklich an einem patch.
Ich habe keine Situation gefunden, wo keine Item Instanz genutzt wird, wo eigentlich eine vorausgesetzt wird. Auch finde ich nichts, wo am ende eine 0 oder andere Zahl als Ergebnis herauskommen könnte wo eine Item Instanz als Ergebnis erwartet wird. Diego87 sagte mir, dass er Bloodsplats und das kategorisierte Inventar nutzt.
-
Zitat von Falugify
diego87 testet meine Mod und schickte mir ein Screenshot. Er spielt mit einigen Patches.
[Bild: 5VttuPbhp7T.jpg]
Es ist eine LeGo Int und in jeder .dat hinterlegt - Wie kommt die als Item ins Inventar?
Ich vermute es liegt an der Kombination mit den genutzten Patches.
Wir hatten den Fehler beim töten von Gegnern. Hier ist es bei einem Händlerinventar. Ist das bei allen Inventaren der Fall oder nur bei Jora? Wenn es nur bei ihm ist, könnte der Fehler in Joras Händlereintragungen zu finden sein.
"Glaubensikone Hänno kennt den Weg" - Die Zeugen Spandaus
-
11.11.2020 13:54
#11
Zitat von Alain Dufont
Wir hatten den Fehler beim töten von Gegnern. Hier ist es bei einem Händlerinventar. Ist das bei allen Inventaren der Fall oder nur bei Jora? Wenn es nur bei ihm ist, könnte der Fehler in Joras Händlereintragungen zu finden sein.
Im letzten Spieldurchgang war es bei Tandor, da hätte es wohl auch ein leeres Item gegeben. Ich selbst konnte den Fehler noch nicht reproduzieren und bei den Savegames, die diego87 bei beiden Male geschickt hat, habe ich auch kein leeres Item gesehen, wenn sie nach dem laden überhaupt noch existieren.
-
Kann das nicht auch passieren, wenn sich durch einen Patch die Instanzen verschieben?
-
Zitat von Milky-Way
Kann das nicht auch passieren, wenn sich durch einen Patch die Instanzen verschieben?
Nein. Symbol-IDs der Mod verschieben sich nicht durch einen Patch.
Da kann ich aber nur für Ninja sprechen. Das zParserExtender-Plugin, welches in einigen Plugins verwendet wird, ist da weitaus weniger vorausschauend und konzeptionell weniger ausgearbeitet.
Ich glaub hier sind zu wenig Infos, um wild zu spekulieren. Ein bisschen debugging ist dann doch noch notwendig. Am besten wären folgende Dinge beim Spieler, bei dem es auftritt, abzuklären.
- Wurde der Spielstand mit einer ältern Version der Mod begonnen?
- Was sind alle Patches und Plugins, die verwendet werden?
- Wurde möglicherweise der Marvin-Modus verwendet, um irgendetwas einzufügen, zu korrigieren?
- Gleiches für GVE
- Wann und wie sind diese Items zum ersten Mal aufgetreten?
- Tritt das nur bei Jora auf? Wenn ja, wurde mit ihm zuvor gehandelt oder nicht?
- Ändert sich die Anzahl der Items wenn man den Händlerdialog mehrfach öffnet und schließt.
- Sind die Items nach Speichern und Laden noch vorhanden? Ändert sich die Anzahl dadurch?
- Ist das Verhalten beim Spieler reproduzierbar, wenn er einen frischen Spielstand beginnt?
- Gibt es einen Speicherstand in dem die Items noch nicht vorhanden waren, um systematisch alle Patches oder andere Zusätze einzeln als Ursache auszuschließen. D.h. unproblematischen Spielstand mit/ohne jedem einzelnen Zusatzpaket laden und prüfen, ob die Items auftauchen.
-
Hier meine auflistung zu deinen fragen:
1= nein
2= ich benutze den bloodpatch, ist eine vdf datei, aber vorraussetzung ist ninja. Ninja ist im gothic verzeichnis installiert. Und ich benutze noch das kategorisierte inventar.
3= nein
4= nein
5= ab kapitel 3. Ist immer bei unterschiedlichen händlern.
Jetzt ist es jora. In einem anderen run war es tandor.
Bei beiden händlern war die zahl 33 oder 32 meine ich.
6= siehe 5
7= nein
8= beides nein
9= ich werde in einem neuen durchlauf ohne vdf patches spielen um zu testen, ob der fehler weiterhin auftritt.
Mehr kann ich nicht sagen
10= nein
Ich hoffe ich konnte damit etwas helfen.
Man kann übrigends diese komischen "fehleritems" ganz normal kaufen, es wird dabei aber kein gold abgezogen.
Dann wandert dieser komische gegenstand im inventar des helden. Irgendwann ist aber dieser gegenstand im inventar einfach verschwunden. Beim händler bleibt dieser gegenstand weiterhin im inventar, bis man ihn "leerkauft".
Danke für eure mühen
-
Zitat von mud-freak
Nein. Symbol-IDs der Mod verschieben sich nicht durch einen Patch.
Da kann ich aber nur für Ninja sprechen. Das zParserExtender-Plugin, welches in einigen Plugins verwendet wird, ist da weitaus weniger vorausschauend und konzeptionell weniger ausgearbeitet.
Falsche Ausdrucksweise meinerseits: ein Patch der Mod ansich -- der Spieler spielt, der Modder bringt eine neue Version raus, der Spieler setzt einen alten Spielstand fort.
(hat sich dann aber wohl mit deinem Punkt 1 erledigt)
-
If this happens at traders. Can you attach all the b_givetradeinv and B_CreateAmbientInv scripts?
Maybe the problem is somewhere in these scripts.
-
Zitat von Milky-Way
Falsche Ausdrucksweise meinerseits: ein Patch der Mod ansich -- der Spieler spielt, der Modder bringt eine neue Version raus, der Spieler setzt einen alten Spielstand fort.
Ah richtig. Da habe ich das Wort Patch falsch verstanden. Bei Verschiebungen von Symbol-IDs durch Änderungen innerhalb der Mod würde ich aber vermuten, dass ein entsprechendes Item ganz aus einem Inventar verschwindet. Dass ein Item mit Symbol-ID Null ins Inventar wandert sollte eher aktivem Platzieren zugrunde liegen.
@diego87 Danke für das Abklappern der Liste.
@Falugify Wie von anderen hier vorgeschlagen, würde ich die Skripte der Mod untersuchen. Falls du nicht sicher bist, wie du genau vorgehen solltest, oder wie du genau problematischen Code erkennen kannst, kannst du folgendes machen. Mit einem Text-Editor, der mehrere Dateien durchsuchen kann (z.B. Notepad++ oder SublimeText), durchsuchst du deine Skripte nach CreateInvItem, CreateInvItems, AI_TakeItem und EquipItem. In SublimeText werden alle Vorkommnisse mit einigen Zeilen davor und danach als Text angezeigt, den du hier posten kannst. Dann können wir helfen nach etwaigen Problemen zu suchen.
Außerdem die Frage: Nutzt du Skripte, die das Verkaufen von Items kontrollieren/unterbinden oder in Inventar/Container anderweitig eingreifen? Könntest du die auch einmal posten?
-
12.11.2020 12:56
#18
Zitat von mud-freak
Ah richtig. Da habe ich das Wort Patch falsch verstanden. Bei Verschiebungen von Symbol-IDs durch Änderungen innerhalb der Mod würde ich aber vermuten, dass ein entsprechendes Item ganz aus einem Inventar verschwindet. Dass ein Item mit Symbol-ID Null ins Inventar wandert sollte eher aktivem Platzieren zugrunde liegen.
@diego87 Danke für das Abklappern der Liste.
@Falugify Wie von anderen hier vorgeschlagen, würde ich die Skripte der Mod untersuchen. Falls du nicht sicher bist, wie du genau vorgehen solltest, oder wie du genau problematischen Code erkennen kannst, kannst du folgendes machen. Mit einem Text-Editor, der mehrere Dateien durchsuchen kann (z.B. Notepad++ oder SublimeText), durchsuchst du deine Skripte nach CreateInvItem, CreateInvItems, AI_TakeItem und EquipItem. In SublimeText werden alle Vorkommnisse mit einigen Zeilen davor und danach als Text angezeigt, den du hier posten kannst. Dann können wir helfen nach etwaigen Problemen zu suchen.
Außerdem die Frage: Nutzt du Skripte, die das Verkaufen von Items kontrollieren/unterbinden oder in Inventar/Container anderweitig eingreifen? Könntest du die auch einmal posten?
Solche Skripte habe ich nicht, ich nutze ein zusätzliches Equip Item:
Code:
func void AI_EquipWeapon (var C_NPC slf, var int ItemInst)
{
const int EquipWeapon_TogglesEquip = 1;
const int oCNpc__EquipWeapon_ptr = 7577648;
if (!Npc_HasItems (slf, ItemInst))
{
CreateInvItems (slf, ItemInst, 1);
};
if (!Npc_GetInvItem(slf, ItemInst))
{
MEM_AssertFail("Unexpected behaviour in EquipWeapon.");
return;
};
if ((item.mainflag == ITEM_KAT_NF) && (Npc_HasReadiedMeleeWeapon(slf)))
|| ((item.mainflag == ITEM_KAT_FF) && (Npc_HasReadiedRangedWeapon(slf))) {
MEM_Warn ("EquipWeapon: Caller wants to equip a weapon while weapon of the same type is readied. Ignoring request.");
return;
};
if (item.flags & ITEM_ACTIVE)
&& (!EquipWeapon_TogglesEquip)
{
MEM_Info ("EquipWeapon: This weapon is already equipped. Ignoring request.");
return;
};
CALL_PtrParam(MEM_InstToPtr(item));
CALL__thiscall(MEM_InstToPtr(slf), oCNpc__EquipWeapon_ptr);
};
Ich habe die Scripte schon durchforscht und konnte nichts erkennen.
Bei Samuel habe ich jetzt aber zufälligerweise das hier gefunden:
CreateInvItems (slf, Ri_ProtFire02,1);
Das ist eine const int Ri_ProtFire02 = 5;
Das müsste sogar eine originale Code-Zeile sein. Vielleicht kann jemand das kurz bestätigen, der die originalen Scripte bei B_GiveTradeInv_Addon_Samuel hat.
-
Zitat von Falugify
Solche Skripte habe ich nicht, ich nutze ein zusätzliches Equip Item:
Ich habe die Scripte schon durchforscht und konnte nichts erkennen.
Bei Samuel habe ich jetzt aber zufälligerweise das hier gefunden:
CreateInvItems (slf, Ri_ProtFire02,1);
Das ist eine const int Ri_ProtFire02 = 5;
Das müsste sogar eine originale Code-Zeile sein. Vielleicht kann jemand das kurz bestätigen, der die originalen Scripte bei B_GiveTradeInv_Addon_Samuel hat.
Right. Must be ItRi_Prot_Fire_02
There are a lot of errors in the original scripts that endlessly appear in mods, unless they are fixed.
-
Zitat von N1kX
Right. Must be ItRi_Prot_Fire_02
There are a lot of errors in the original scripts that endlessly appear in mods, unless they are fixed.
Thanks for that hint.
I printed out all CreateInvItem(s) calls in my scripts and manually searched them with this regex, to find any invalid instance. But it seems there is only that one in the original scripts.
- Find everything that starts with CreateInvItem or CreateInvItems, disregard casing
- match any first parameter
- match the next parameter if it does *not* start with "It". (valid: ItKe_..., invalid: Holy_Hammer_MIS)
Code:
[Cc][rR][eE][aA][tT][eE][Ii][nN][vV][Ii][tT][eE][mM][sS]?\s*\(\w+?,(?![\s]*[iI][tT])
i used RipGrep in case insensitive mode to get all the lines that contained CreateInvItem
[Bild: GMJM2.png]
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|