Construction Set Der Scriptthread

quest question

hallo, hab da schon wieder eine frage...:huh:

und zwar: hab ein quest gemacht wo ich npc zxy aussn knast rausholen muss, so weit so gut....
ich kann den schlüssel klauen, oder guard xyz bestechen..., klappt auch ganz gut!

jetzt möchte ich aber, wenn ich den schlüssel geklaut habe, das guard xyz, wenn sie npc zxy detected/sieht das sie anfängt zu fighten gegen npc zxy..., aber auch nur wenn ich den schlüssel geklaut habe..., nicht wenn ich guard xyz bestochen hab..

wie könnte ich das machen...:?

danke
 
zu befreiender NPC als persistent markiert
wichtig, sonst kann die Wache den Gefangenen nicht entdecken bzw das Script nicht kompiliert werden!

das script an der Wache,
vorrausgesetzt Du hast "local short bestochen" im dialog-result auf 1 gesetzt nachdem man ihn bestochen hat
( set bestochen to 1 )

Code:
begin sc_dein_scriptname

short bestochen
float timer

If ( menuMode )
; wenn menus, dialoge etc. offen sind dann nicht checken
; raus hier:
  return
EndIf

If ( bestochen != 0 )
; falls Wache schon bestochen oder der Gefangene angegriffen wurde raus hier:
  return
EndIf

If ( CellChanged )
  ; bei einem Zellwechsel auf keinen Fall sofort checken, das geht nicht gut:
   set timer to 0.1
  ; also raus hier:
   return
EndIf

If ( Player->GetItemCount "schlüssel" > 0 ) 
; *** siehe unten
  
  If ( timer <= 0 )
    ; Zeit abgelaufen, jetzt checken:
    If ( GetDetected "gefangener" )
      ; der Gefangene wurde entdeckt !
      StartCombat "gefangener"
      set bestochen to -1   
      ; die Wache kann ja jetzt nicht mehr bestochen werden.
    EndIf
    ; check in 2 sekunden nochmal:
    set timer to 2
  Else
    ; warte bis oben eingesetzte Zeit abgelaufen ist:
    set timer to ( timer - GetSecondsPassed )
  EndIf
EndIf

End

*** Statt ( Player->GetItemCount "Schlüssel" > 0 ) solltest Du hier einen Tagebucheintrag nehmen der gemacht wird wenn man mit dem Gefangenen die Flucht besprochen hat - da der gewitzte Spieler den Schlüssel ja wegwerfen oder die Gefängnistür auch aufbrechen könnte. Die Bedingung wäre dann sowas wie
If ( GetJournalIndex "j_Gefangener_befreit" == journalIndex )

Der timer verhindert das der guard ständig checkt ob er den Gefangenen sehen kann was die Performance beeinträchtigen würde. Daher checkt er nur alle 2 sekunden ob er den Gefangenen sehen kann. Kommt auf die Raumgrösse an - vieleicht sind sogar 0.5 sekunden nötig - oder auch 3.5 ausreichend.

Auf keinen Fall sollte während oder sofort nach dem Zellwechsel auf GetDetected geprüft werden- also auch nicht wenn der Spieler mit dem Gefangenen dummerweise wieder zurück ins Gefängnisgebäude gehen sollte. Daher wird der timer in dem Fall auf eine Zehntelsekunde Verzögerung gesetzt.
Da man sowieso irgendwie erstmal reinkommen muss steht der timer somit anfangs immer auf 0.1

an "local bestochen" erkennt der Guard z.B. im späteren Dialog was los ist/war falls er dann noch lebt...
 
Zuletzt bearbeitet:
hatte mir das gebastelt, ging aber irgendwie nich... :D

Code:
begin guard_xyz


if ( GetJournalIndex "anyway" < 10 )
if ( GetDetected "npc_zxy" == 1 )
StartCombat "npc_zxy"
endif
endif

end

naja, werd es später mal ausprobieren....

danke rene
 
hey, hab es grad ma probiert.., geht leider nicht..

was meinst du mit persistent? etwa corpses persist?

errors
getdetected not found
startcombat not found
miss matched if/else/endif starting

sorry..




 
natürlich "persist". Ohne gehts nicht, hab ich doch oben geschrieben. :lol:

Alle Objekte die im Script direkt referenziert werden (hier "gefangener") müssen dauerhaft existent, global abrufbar vorhanden sein - so fällt "Leiche beseitigen" für solche aus.

Klar das der Interpreter aussteigt wenn Du den Gefangenen nicht als solchen markiert hast.
Auch muss der Gefangene irgendwo im Editor platziert sein sonst kann er ihn nicht finden - würde ne andere Fehlermeldung geben...
 
  • Like
Reaktionen: 1 Person
Nur eine bescheidene Frage: Gibt es ItemCount > 0
Ich hätte jetzt ItemCount >= 0 vermutet?
 
ich weiß es nicht..., hab das weggelassen und hab dafür ne journal abfrage drin...
 
Zuletzt bearbeitet:
Nur eine bescheidene Frage: Gibt es ItemCount > 0
Ich hätte jetzt ItemCount >= 0 vermutet?

Gibt es.
> 0 heisst grösser als 0, es wäre mathematisch das Gleiche wie >= 1 solange mit Ganzzahlen (short, long) gerechnet wird.

ach das andere, da hab ich mich wohl vertan, es braucht kein "->" bei getDetected und Startcombat... :oops: (siehe avSlavehunter-script)
 
Zuletzt bearbeitet:
ja - AIfollow bewirkt das die gesamte Truppe angegriffen wird.
Vieleicht könnte der Spieler sich unsichtbar machen um Deine Aufgabe zu lösen - das müsste man mal ausprobieren
 
okay, dachte ich mir schon :)

kann man nich danach nochn befehl ins script basteln, das der pc nich angegriffen wird?

wära aber auch leicht unkool iwie..
 
Zuletzt bearbeitet:
dann würde aber auch der Gefangene wieder in Ruhe gelassen...

hmm, kompliziert - das Einfachste (für mich) wäre dem Gefangenen ein Signal zu geben (bestimmte Kleidung anlegen oder einen harmlosen Zauber zaubern oder schleichen/ducken) damit der im richtigen Moment per AiTravel selbst losschleicht.
Das wäre für mich jetzt einfacher zu realisieren als es zu erklären. :D
 
raffs auch nich so ganz..:D

btw kann man in die result box sowas schreiben wie force sneak, oder wie das heißt?
 
nun ja es funzt :roll:

ich bräuchte dann noch was..., wenn wir die cell verlassen haben das er nichtmehr schleicht....

hab als base das ragashScript genommen...
 
sorry ich weiss nicht mehr wie man das ForceSneak aufhebt - es gibt was, aber bei meinem Windows 8.1 funktioniert die TES3-CS-Hilfe nicht - so kann ich nicht nachkucken.
Ich glaube bei "scripting commands overview" oder sowas ähnlichem findest Du alle aufgelistet- das ist eine Seite in der Hilfe auf der so ziemlich alle Befehle beschrieben stehen da müsste mal jemand nachschauen...
 
ich bräuchte dann noch was..., wenn wir die cell verlassen haben das er nichtmehr schleicht...
Der passende Gegenbefehl lautet ClearForceSneak

Analog dazu:

ForceRun / ClearForceRun
ForceJump / ClearForceJump
ForceMoveJump / ClearForceMoveJump

Da das dann aber nicht in einem Dialogresult steht, würde ich darüber nachdenken, es in das Script des NPC zu setzen. Man kann zwar nicht den Standort eines NPC im Script abfragen, nur den des Spielers, aber das ist auch in Ordnung. Das Script auf der NPC würde die Zelle prüfen, in der sich der Spieler befindet. Da es lokal ist, läuft dieses Script nur, wenn sich Spieler und NPC in der gleichen Zelle befinden, Das heißt im Umkehrschluß folgendes: Wenn das Script läuft, ist der NPC mit dem Spieler zusammen. Wenn der Spieler also nicht im Gefängnis ist, gilt das auch für den NPC.

Die Bedingung wäre dann in etwa so:

Code:
IF ( GetForceSneak )
  IF ( GetPCCell, "ID der Gefängnis-Interior" = 0 )
    ClearForceSneak
  EndIF
EndIF
Die Sache hat natürlich ein paar Haken. Diese Bedingung da ist momentan wirklich sehr einfach gehalten. So würde sie dazu führen, dass der NPC außerhalb des Knasts später nicht mehr schleichen kann, weil es sofort wieder aufgehoben würde. Man könnte (und sollte) es also noch an eine DoOnce-Bedingung knüpfen, einen Journaleintrag oder sonst was. Aber im Grundsatz würde es so funktionieren.
 
Zuletzt bearbeitet:
so, icke ma wieder :roll:

kann ich, wenn ich via dialog irgendwohin teleportiert worden bin, auch gleich noch das menü irgenwie killen?
find es irgendwie unkool, wenn man weg teleportiert worden ist und das menu is noch offen..., goodbye is schon ganz okay, dann kann man wenigstens nich irgendwelche topics wählen etc..., aber aussn menü raus fänd ich schon besser...

danke