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 12 von 12
  1. Beiträge anzeigen #1 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline

    Einmalig Xp bei Schlösseröffnen mit Dietrich

    Hallo zusammen,

    ich arbeite gerade an einem Xp-System nach erfolgreichem Knacken einer Truhe.
    Es klappt auch alles so wie es soll nur brauche ich noch ein bisschen Hilfe bei der Zuordnung der Truhen.
    Es soll nachdem die Truhe erfolgreich mit dem Dietrich geöffnet wurde XP gegeben werden. Diese Truhe soll dann bei nochmaliger Benutzung keine XP mehr abgeben. D.h. ich brauche eine Art variable, die ich für alle Truhen nutzen kann.
    Xp bekommt man bei mir sobald der Zustand der Truhe S1 beträgt.
    Ich hatte es auch schon über die G_LockPick() versucht, habe aber gemerkt, dass diese nicht reibungslos funktioniert.

    Kann mir da jemand helfen?


    Code:
    func void TRUHEOEFFNEN_S1()
    {
        var C_NPC her; 
      	
        her = Hlp_GetNpc(PC_Hero);
    	
    	
        if (Hlp_GetInstanceID(self )== Hlp_GetInstanceID(her))  // Ob das der Hero ist .....
        {
        
       	PLAYER_MOBSI_PRODUCTION = MOBSI_TRUHE;  	// Mobsi aktiv
    
     		if (Hier muss dann die Variable oder ähnliches hin == FALSE)
    			{
    
    			B_GivePlayerXP (DiebXP + (Truhenoeffner * 10));	 		   	
      	
    			Hier muss dann die Variable oder ähnliches hin = TRUE;
    				   	
    		        }
    		   
    		        else
    	   		     {
    	   	             print ("du bekommst keine xp mehr");
    		             };		   	
        };   
    };
    würde ja auch reichen, wenn man irgendwie den namen der truhe erfragen könnte. dann könnte man im spacer allen truhen halt fortlaufende namen geben, wäre so ne idee.
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (30.05.2017 um 13:25 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    Mit Npc_GetDetectedMob kommst du nur an den Basisnamen des Schemas ("CHESTBIG", "CHESTSMALL"). Das wird dir aber wahrscheinlich nicht weiterhelfen.

    In der OnState-Funktion wird nicht nur SELF, sondern auch ITEM gesetzt. Wenn Du Glück hast, dann ist das Interact-Item der Schlüssel...

    ps: Ansonsten wird's schwierig: Kombination aus conditionFunc (Beginn der Interaktion), G_PICKLOCK (merken ob Dietrich-Aktion ausgeführt und erfolgreich) und onStateFunc (Auswertung beim Öffnen). Was aber nicht funktioniert, wenn der pickLockStr nur aus einem Zeichen besteht (kein G_PICKLOCK).
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Geändert von NicoDE (30.05.2017 um 16:38 Uhr)

  3. Beiträge anzeigen #3 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von NicoDE Beitrag anzeigen
    Mit Npc_GetDetectedMob kommst du nur an den Basisnamen des Schemas ("CHESTBIG", "CHESTSMALL"). Das wird dir aber wahrscheinlich nicht weiterhelfen.

    In der OnState-Funktion wird nicht nur SELF, sondern auch ITEM gesetzt. Wenn Du Glück hast, dann ist das Interact-Item der Schlüssel...

    ps: Ansonsten wird's schwierig: Kombination aus conditionFunc (Beginn der Interaktion), G_PICKLOCK (merken ob Dietrich-Aktion ausgeführt und erfolgreich) und onStateFunc (Auswertung beim Öffnen). Was aber nicht funktioniert, wenn der pickLockStr nur aus einem Zeichen besteht (kein G_PICKLOCK).
    Das Mob sollte doch im Fokus sein während der Benutzung, d.h. man kommt über her.focus_vob (her ist oCNpc) an das Mob?
    Danach ist es "nur noch" eine Frage, wie man die einzelnen Truhen unterscheidet. Könnte man da den _zCObject_hashIndex als Schlüssel für eine Hashtable verwenden? Ich würde annehmen, der ist einzigartig und ändert sich nicht... Ansonsten kann man sich vielleicht einfach die X oder Z Koordinate als Schlüssel nehmen, das ist zwar nicht zwangsläufig einzigartig, aber vermutlich sehr, sehr wahrscheinlich.

  4. Beiträge anzeigen #4 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    Versuch's mal mit dem oben nachträglich erwähnten Ansatz:
    (wurde so umgestellt, dass 'self' auf den Spieler anstatt das Objekt zeigt und mit Ikarus ein direkter Zugriff auf das Objekt möglich ist)
    Code:
    // _work\Data\Scripts\Content\Story\G_Functions\G_PickLock.d
    
    class oCMobLockable{};  // uncomment if already defined (Ikarus)
    
    // oCMobInter.conditionFunc = G_PICKLOCK_S0
    // oCMobInter.onStateFunc   = G_PICKLOCK
    // Length(oCMobLockable.pickLockStr) >= 2
    func void OnPlayerPicklockUnlock(var int Nr, var oCMobLockable Mob)
    {
    	// Add your bonus here...
    	// Original code that was never called due to missing game callback:
    	//Snd_Play3d(Mob, "PICKLOCK_UNLOCK");
    	//Print(PRINT_PICKLOCK_UNLOCK);
    };
    
    func void OnPlayerPicklockSuccess(var int Nr, var oCMobLockable Mob)
    {
    	Snd_Play3d(Mob, "PICKLOCK_SUCCESS");
    	Print(PRINT_PICKLOCK_SUCCESS);
    };
    
    func void OnPlayerPicklockBroken(var int Nr, var oCMobLockable Mob)
    {
    	Snd_Play3d(Mob, "PICKLOCK_BROKEN");
    	Print(PRINT_PICKLOCK_BROKEN);
    	if (Hlp_Random(100) <= 25) {
    		Npc_SendPassivePerc(hero, PERC_ASSESSQUIETSOUND, hero, hero);
    	};
    };
    
    func void OnPlayerPicklockFailure(var int Nr, var oCMobLockable Mob)
    {
    	Snd_Play3d(Mob, "PICKLOCK_FAILURE");
    	Print(PRINT_PICKLOCK_FAILURE);
    };
    
    ////////////////////////////////////////
    
    var int _PlayerPicklockNr;
    instance _PlayerPicklockMob(oCMobLockable);
    func void _PlayerPicklockReset()
    {
    	_PlayerPicklockNr = 0;
    	_PlayerPicklockMob = Hlp_GetNpc(-1);  // = NULL
    };
    func oCMobLockable _PlayerPicklockMobAssign()
    {
    	// external bug usage (parameter is not removed from stack)
    	AI_CombatReactToDamage(_PlayerPicklockMob);
    };
    func oCMobLockable _PlayerPicklockMobFromSelf()
    {
    	// external bug usage (parameter is not removed from stack)
    	AI_CombatReactToDamage(self);
    };
    func int G_PICKLOCK_S0()
    {
    	if (Npc_IsPlayer(self)) {
    		_PlayerPicklockReset();
    	};
    	return TRUE;  // oCMobInter.conditionFunc
    };
    func void G_PICKLOCK(var int Success, var int UnlockOrBroken)
    {
    	_PlayerPicklockNr += 1;
    	_PlayerPicklockMob = _PlayerPicklockMobFromSelf();
    	var int Nr; Nr = +_PlayerPicklockNr;
    	var oCMobLockable Mob; Mob = _PlayerPicklockMobFromSelf();
    	self = Hlp_GetNpc(hero);
    	if (Success) {
    		if (UnlockOrBroken) {
    			// does not happen, handled by G_PICKLOCK_S1
    			_PlayerPicklockReset();
    			OnPlayerPicklockUnlock(Nr, Mob);
    		} else {
    			OnPlayerPicklockSuccess(Nr, Mob);
    		};
    	} else {
    		_PlayerPicklockReset();
    		if (UnlockOrBroken) {
    			OnPlayerPicklockBroken(Nr, Mob);
    		} else {
    			OnPlayerPicklockFailure(Nr, Mob);
    		};
    	};
    };
    func void G_PICKLOCK_S1()
    {
    	if (Npc_IsPlayer(self) && (_PlayerPicklockNr > 0)) {
    		var int Nr; Nr = _PlayerPicklockNr + 1;
    		var oCMobLockable Mob; Mob = _PlayerPicklockMobAssign();
    		_PlayerPicklockReset();
    		OnPlayerPicklockUnlock(Nr, Mob);
    	};
    };
    Die conditionFunc/S0 stellt sicher, dass der Zähler auf jeden Fall zurückgesetzt wird (beim Start der Interaktion (kein S0-Event) und beim Beenden der Interaktion (S0-Event)). Ansonsten könnte der Spieler das Knacken abbrechen und für das Öffnen der nächsten Truhe/Tür belohnt werden.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Geändert von NicoDE (02.06.2017 um 17:54 Uhr)

  5. Beiträge anzeigen #5 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Oh, natürlich, die Truhen wissen ja sowieso, wann sie geknackt worden sind oder nicht.

    Ich nehme an, G_PickLock() wird nicht aufgerufen, wenn die Truhe keine Kombination hat oder schon geknackt wurde? Dann sieht deine Lösung gut aus

  6. Beiträge anzeigen #6 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Ich nehme an, G_PickLock() wird nicht aufgerufen, wenn die Truhe keine Kombination hat oder schon geknackt wurde?
    Wird sie nicht, locked ist nach dem Knacken FALSE.

    Das Problem ist, dass das Spiel G_PICKLOCK für den letzten Fall (bSuccess TRUE und bOpen TRUE) gar nicht aufruft.

    Wie oben erwähnt, funktioniert der Workaround nur für Kombinationen mit mindestens zwei Zeichen.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

  7. Beiträge anzeigen #7 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von NicoDE Beitrag anzeigen
    Hört sich kompliziert an

    Versuch's mal mit dem oben nachträglich erwähnten Ansatz (ungetestet):
    Code:
    // oCMobContainer.conditionFunc = G_PICKLOCK_S0
    // oCMobContainer.onStateFunc   = G_PICKLOCK
    var int PlayerPickLockSuccess;
    func int G_PICKLOCK_S0()
    {
    	if (Npc_IsPlayer(self)) {
    		//Print("PickLock S0");
    		PlayerPickLockSuccess = FALSE;
    	};
    	return TRUE;
    };
    func void G_PICKLOCK_S1()
    {
    	if (Npc_IsPlayer(self)) {
    		//Print(ConcatStrings("PickLock S1: ", IntToString(PlayerPickLockSuccess)));
    		if (PlayerPickLockSuccess) {
    			PlayerPickLockSuccess = FALSE;
    			Print("PickLock Bonus");
    		};
    	};
    };
    func void G_PICKLOCK(var int bSuccess, var int bBrokenOpen)
    {
    	//var string text; text = ConcatStrings("PickLock: ", IntToString(bSuccess)); text = ConcatStrings(text, ","); Print(ConcatStrings(text, IntToString(bBrokenOpen)));
    	PlayerPickLockSuccess = bSuccess;
    	//...
    };
    okay, und dieses ersetzt dann die G_PickLck funktion?
    was passiert dann mit meiner OnstateFunc? bleibt die bestehen oder fliegt die wieder heraus?
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (30.05.2017 um 18:11 Uhr)

  8. Beiträge anzeigen #8 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Funktioniert ihr geilen Schnecken
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  9. Beiträge anzeigen #9 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von aebo Beitrag anzeigen
    okay, und dieses ersetzt dann die G_PickLck funktion?
    was passiert dann mit meiner OnstateFunc? bleibt die bestehen oder fliegt die wieder heraus?
    Nein, in der G_PickLock-Funktion wird nur eine Zeile ergänzt.

    Schau dir mal die ersten beiden Zeilen im Code-Block an, da steht drin, was jeweils in die OnState bzw. ConditionFunc eingetragen werden muss.

  10. Beiträge anzeigen #10 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    Zitat Zitat von aebo Beitrag anzeigen
    was passiert dann mit meiner OnstateFunc?
    Die kannst du nennen wie Du willst. Ich dachte es macht Sinn alles an einer Stelle zu haben und ähnlich zu benennen...
    Die existierende G_PICKLOCK muss nur um den obigen Code erweitert werden.

    ps: man könnte in G_PICKLOCK auch mitzählen, wie lang die Kombination war und den Bonus davon abhängig machen...
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Geändert von NicoDE (31.05.2017 um 17:20 Uhr)

  11. Beiträge anzeigen #11 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Funktioniert ihr geilen Schnecken
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  12. Beiträge anzeigen #12 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    Beim Testen ist mir noch etwas aufgefallen...

    Entgegen dem Kommentar in _work\Data\Scripts\Content\Story\G_Functions\G_PickLock.d ist SELF innerhalb der Funktion G_PickLock() keine Objektreferenz auf den Spieler (C_NPC / oCNpc), sondern auf die Truhe (oCMobContainer)!

    Das heißt, dass die Sounds im Originalskript (Snd_Play3d) auf der Truhe abgespielt werden und nicht auf dem Spieler.
    Das erklärt auch, warum für Npc_SendPassivePerc HERO anstatt SELF verwendet wurde.
    Dadurch ist in G_PickLock() mit Ikarus/LeGo ein direkter Zugriff auf die Truhe möglich...
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

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