|
-
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)
-
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)
-
Zitat von NicoDE
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.
-
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)
-
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
-
Zitat von Lehona
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
-
Zitat von NicoDE
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)
-
Funktioniert ihr geilen Schnecken
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
-
Zitat von aebo
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.
-
Zitat von aebo
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)
-
Funktioniert ihr geilen Schnecken
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
-
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
|
|