|
-
Lehrling
G2 Ikarus/LeGo Item beim Drop aus der Spielwelt entfernen
Hey,
ich möchte bestimmte Items beim droppen sofort aus der Spielwelt herauslöschen.
Code:
func void EVT_NPCDROPVOB() {
// var c_npc slf; slf = MEM_PtrToInst(ECX);
var c_item itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 4));
if (Hlp_IsItem(itm, ITMW_1H_SCHWERT))
{
//print(itm.name);
Wld_RemoveItem(itm);
print("Loeschen!");
}
else
{
print(itm.name);
};
};
Die Nachricht wird bei dem entsprechendem Item angezeigt, allerdings wird das Item nicht entfernt.
Ich kann das Item danach noch ohne Probleme aufheben und habe dieses dann auch noch im Inventar.
Kann mir jemand sagen, wie ich das Item korrekt lösche oder wo mein Fehler liegt?
-
Teste bitte mal den Rückgabewerte von Wld_RemoveItem().
Es kann sein, dass sich das Item noch nicht in der Welt befindet (wann und wodurch wird EVT_NPCDROPVOB aufgerufen?).
"Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
Lehrling
Sorry für die späte Antwort.
Rufe es in der Init_Global() auf via
Code:
const int hookOnce = 0;
if (!hookOnce)
{
const int oCNpc__DoDropVob = 7622096; //0x744DD0
HookEngine(oCNpc__DoDropVob, 6, "EVT_NPCDROPVOB");
hookOnce = 1;
};
Habe es mit verschiedenen Items probiert.
Das Item ITLSTORCHBURNING z.B wird scheinbar "halb" zerstört. Der Rückgabewert ist bei ITLSTORCHBURNING z.B auch 1, allerdings verschwindet die Fackel nicht Visuell - sie bleibt in der Luft "stecken" und man kann ein unsichtbares Item wieder aufheben.
Bei beliebigen anderen Items ist der Rückgabewert 0.
Gibt es eine Möglichkeit etwas später zu hooken?
-
Ja, denn die Funktion generiert erst das Item in der Welt, d.h. zum Zeitpunkt des Hooks existiert es noch gar nicht. Du kannst am Ende der Funktion hooken, dann funktioniert es. Hier die nötigen Änderungen in grün. Allerdings kommt man bei der Adresse nicht mehr so leicht an den (N)PC der das Item droppt, ist das für dich wichtig? Ich kenne aber keinen Fall, in dem ein NPC ein Item droppt. Es sollte sich immer um den Spieler handeln.
Code:
const int hookOnce = 0;
if (!hookOnce)
{
const int oCNpc__DoDropVob_retn = 7622805; //0x745095
HookEngine(oCNpc__oCNpc__DoDropVob_retn, 5, "EVT_NPCDROPVOB");
hookOnce = 1;
};
Code:
func void EVT_NPCDROPVOB() {
//var c_npc slf; slf = MEM_PtrToInst(ECX);
var c_item itm; itm = MEM_PtrToInst(ESI);
if (Hlp_IsItem(itm, ITMW_1H_SCHWERT))
{
//print(itm.name);
Wld_RemoveItem(itm);
print("Loeschen!");
}
else
{
print(itm.name);
};
};
-
Lehrling
Hey,
klappt jetzt soweit mit allen Items außer mit welchen die als Visual eine .ZEN haben.
Gibt es dafür noch eine Lösung?
Edit: NPCs brauch ich nicht, danke.
Geändert von The Gardist (06.10.2017 um 14:36 Uhr)
-
Zitat von The Gardist
Hey,
klappt jetzt soweit mit allen Items außer mit welchen die als Visual eine .ZEN haben.
Gibt es dafür noch eine Lösung?
Edit: NPCs brauch ich nicht, danke.
Gibt es andere Items ausser Fackeln, die als Visual eine .ZEN haben?
Ich kann dir keine Lösung anbieten, aber Fackeln erfahren an vielen Stellen der Engine eine Sonderbehandlung, es könnte also relativ umständlich werden...
Geändert von Lehona (06.10.2017 um 17:06 Uhr)
-
Lehrling
Ich habe mir noch ein paar andere "Vobtrees" als Item zusammengeschustert und dies sind halt auch .ZEN Dateien.
Kann man alternativ das Visual beim Drop irgendwie manipulieren und einfach auf sowas wie
visual = ""; setzen und anschließend deleten?
Edit:
Ist es alternativ möglich noch früher zu hooken, damit man das Visual ändern kann, bevor das Item tatsächlich erstellt wird?
Ist es möglich mit z.B MEM_DeleteVob das verbleibende visual zu löschen? Hat da jemand eine Idee?
Edit 2:
Ich habe eben mal die Funktion
Code:
void __thiscall oCGame::DeleteTorches(void) 0x006CB640 0 6 public: void __thiscall oCGame::DeleteTorches(void)
aufgerufen.
Die klappt zumindest für Fackeln super (löscht allerdings auch die Objekte aus der Hand heraus), kann man die Funktion irgendwie zerlegen und Einzelteile davon aufrufen mit einem c_item als Parameter?
Geändert von The Gardist (08.10.2017 um 06:52 Uhr)
-
Lehrling
Das Probleme hat sich für mich erledigt (hab meine Item visuals von .ZEN wieder auf .3ds geändert), habe aber eine andere Frage (wobei ich jetzt nicht weiß, ob ich dafür ein extra Thema aufmachen soll.. Daher einfach mal hier)
Ich bräuchte jetzt ein "Callback" welches aufgerufen wird sobald ein MDS Overlay einem NPC zugewiesen wird.
Zum Zuweisen nutze ich zur Zeit:
Code:
int __thiscall oCNpc::ApplyOverlay(zSTRING const &) 0x0072D2C0 0 6 public: int __thiscall oCNpc::ApplyOverlay(zSTRING const &)
Kann mir da jemand bei helfen oder sowas zur Verfügung stellen?
Ich bräuchte auf jeden Fall den NPC und evtl. auch den MDS Namen (ich weiß nicht ob zu dem Zeitpunkt schon "npc.mds_name" schon den "neuen" Wert hat)
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|