Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 8 von 8
  1. Beiträge anzeigen #1 Zitieren
    Lehrling Avatar von The Gardist
    Registriert seit
    Jun 2009
    Beiträge
    25
     
    The Gardist ist offline

    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?

  2. Beiträge anzeigen #2 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    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

  3. Beiträge anzeigen #3 Zitieren
    Lehrling Avatar von The Gardist
    Registriert seit
    Jun 2009
    Beiträge
    25
     
    The Gardist ist offline
    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?

  4. Beiträge anzeigen #4 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    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);
    	};
    };

  5. Beiträge anzeigen #5 Zitieren
    Lehrling Avatar von The Gardist
    Registriert seit
    Jun 2009
    Beiträge
    25
     
    The Gardist ist offline
    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)

  6. Beiträge anzeigen #6 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von The Gardist Beitrag anzeigen
    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)

  7. Beiträge anzeigen #7 Zitieren
    Lehrling Avatar von The Gardist
    Registriert seit
    Jun 2009
    Beiträge
    25
     
    The Gardist ist offline
    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)

  8. Beiträge anzeigen #8 Zitieren
    Lehrling Avatar von The Gardist
    Registriert seit
    Jun 2009
    Beiträge
    25
     
    The Gardist ist offline
    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
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide