Construction Set Skriptthread zum Construction Set

Nach DarkRulers Frage könnte mir vielleicht jemand sagen ob es einen Befehl gibt um von einem Gegenstand den "gestohlen"-Status zu entfernen?
Falls es so einen Befehl gibt würde mich auch interessieren wie der Skript aussehen muss damit er aufs ganze Inventar zugreifft.
 
Dafür brauchst du auf jeden Fall OBSE. Das sähe dann ungefähr so aus:
Code:
ref item
ref owner

forEach item <- player
set owner to item.getOwner
if owner == 0 || owner == player
  continue
else
  item.clearOwnership
loop
 
  • Like
Reaktionen: Todeskeks
Hallo liebes (neugestaltetes) Forum :)

Ich versuche zur Zeit die Burg Darlan (Nehrim) auf der Basis von "Darlan Improved" noch zu verbessern.
Der ursprüngliche Autor der Mod hat "offenbar" aufgrund von Skyrim keine Lust mehr daran weiterzuarbeiten...

Nun aber zur eigentlichen Frage:

Ich möchte verschiedene Gebäude in der Grafschaft (direkt vor der Burg meistens) durch den Kauf von Renovierungen freischalten (enable und disable - Befehle).
Wenn möglich am Besten noch mit einer kleinen Verzögerung von etwa einem Tag nach dem Kauf, um eine Bauzeit zu simulieren.

Das ganze würde natürlich über eine Gesprächsoption funktionieren (also kein Schriftstück oder Messagboxen falls möglich).

Könnte mir da jemand bitte helfen?
Lg Basch III

Edit: Ich hab grade bemerkt, dass meine Bitte wie eine Bestellung bei Mc Donald's geschrieben ist... :roll:
Ich hab's zuvor probiert das ganze selbst zu scripten, aber es wurde andauernd vom CS nicht angenommen. Deswegen habe ich mich an euch gewendet.
 
Zuletzt bearbeitet:
Du brauchst einen Quest.
Da machste am Besten eine variable die den Wert von GameDaysPassed zum Zeitpunkt des Dialoges speichert.
Per Questskript fragst du dann ab, ob irgendwann die Global GameDaysPassed größer geworden ist.
Wenn z.B. deine Variable TagesVar heißt müssteste so was wie Set QuestID.TagesVar To GameDaysPassed machen.
Und wenn dann weitergehen soll machste die Abfrage If GameDaysPassed >= ( TagesVar + 1 )

Hoffe es ist klar geworden. :(
 
So, jetzt komme ich. :lol:

Dieser Skript liegt auf einem NPC. Er soll 3 Topics per Sayto wiedergeben, anschließend den Spieler ansprechen. Nun ist das Problem, dass nur das 3. Sayto-Topic (PCPAndrogilSeraphimSayto3 1) zu hören ist, die anderen beiden nicht. Jemand ne Idee?

Code:
SCN PCPASScript

Float Timer
Int i
Short A
Short B
Short C
Short DialogVar
Short ResponseVar
Short NowSpeaking

;######################################################

Begin OnPackageDone PCPASTravelpackageB
let i := 1
sayto player PCPAndrogilSeraphimSayto1 1
End

;######################################################

Begin OnPackageDone PCPASTravelpackageC
startconversation player, PCPAndrogilSeraphimTopic4
End

;######################################################

Begin GameMode
If ( DialogVar == 0 )
[U]     Set A To 8 ;[Länge von Sayto-Response 1 in Sekunden]
     Set B To 12 ;[Länge von Sayto-Response 2 in Sekunden]
     Set C To 10 ;[Länge von Sayto-Response 3 in Sekunden]
[/U]    Set DialogVar To 1
Endif

If (i == 1)
      If ( ResponseVar == 0 )
        If ( Timer < A )
            Set Timer To ( Timer + GetSecondsPassed )
            If ( NowSpeaking == 0 )
                [U]SayTo Player PCPAndrogilSeraphimSayto1 1
[/U]                Set NowSpeaking To 1
                PrintToConsole "Astralis - Androgil sagt Topic 1"
            Endif
        Elseif ( Timer >= A )
            Set ResponseVar To 1
            Set NowSpeaking To 0
            Set Timer To 0
            PrintToConsole "Astralis - Androgil hat Topic 1 beendet"
        Endif

    Elseif ( ResponseVar == 1 )
        If ( Timer < B )
            Set Timer To ( Timer + GetSecondsPassed )
            If ( NowSpeaking == 0 )
                [U]SayTo Player PCPAndrogilSeraphimSayto2 1
[/U]                Set NowSpeaking To 1
                PrintToConsole "Astralis - Androgil sagt Topic 2"
            Endif
        Elseif ( Timer >= B )
            Set ResponseVar To 2
            Set NowSpeaking To 0
            Set Timer To 0
            PrintToConsole "Astralis - Androgil hat Topic 2 beendet"
        Endif

    Elseif ( ResponseVar == 2 )
        If ( Timer < C )
            Set Timer To ( Timer + GetSecondsPassed )
            If ( NowSpeaking == 0 )
                [U]SayTo Player PCPAndrogilSeraphimSayto3 1
[/U]                Set NowSpeaking To 1
                PrintToConsole "Astralis - Androgil sagt Topic 3"
            Endif
        Elseif ( Timer >= C )
            Set ResponseVar To 3
            Set NowSpeaking To 0
            Set Timer To 0
            Set i To 2
            PrintToConsole "Astralis - Androgil hat Topic 3 beendet"
        Endif
    Endif
Elseif (i == 2)
         cast PCPAndrogilSeraphimSpell PCPDG08PrisonREF
         PCPASCageREF.PlayGroup left, 0
         let i := 3
Elseif(i == 3)
        StartConversation Player PCPAndrogilSeraphimTopic2
        Set i To 4
Elseif (i == 5)
      disable
endif
End

An den Zeiten für A, B und C liegt es leider nicht.
 
Das Skript sieht eigentlich ganz in Ordnung aus, wenn ich nicht gerade etwas übersehe. Du könntest höchstens noch einige Zeilen Code sparen, aber funktionieren sollte es trotzdem. Spielst du vielleicht mit einem Speicherstand, bei dem die Variable "ResponseVar" schon auf 2 gesetzt ist? Und warum lässt du den NPC zweimal das gleiche Topic sagen; einmal im "onPackageDone"- und im "GameMode"-Block?
 
Das mit dem Speicherstand habe ich gerade überprüft, das kanns nicht sein. Aber das mit dem Topic habe ich mal versucht zu korrigieren, leider gehts immernoch noch nicht:

EDIT: Aktueller Stand
Ergebnis: Der NPC bleibt, nachdem er PackageB vollendet hat, einfach auf der Stelle stehen.

Code:
SCN PCPASScript

Int i
Float Timer

Begin OnPackageDone PCPASTravelpackageB
 let i := 1
End

Begin OnPackageDone PCPASTravelpackageC
 startconversation player, PCPAndrogilSeraphimTopic4
End

Begin GameMode

if(i == 0)
  return
else
  if(i == 1)
    if(timer == 0)
     sayto player PCPAndrogilSeraphimSayto1 1
    endif
     let timer := 8
     let timer := timer - getsecondspassed
    if(timer <= 0)
       let i := 2
       let timer := 0
    endif

  elseif(i == 2)
    if(timer == 0)
     sayto player PCPAndrogilSeraphimSayto2 1
    endif
     let timer := 12
     let timer := timer - getsecondspassed
    if(timer <= 0)
       let i := 3
       let timer := 0
    endif
 
  elseif(i == 3)
    if(timer == 0)
     sayto player PCPAndrogilSeraphimSayto3 1
    endif
     let timer := 10
     let timer := timer - getsecondspassed
    if(timer <= 0)
       let i := 4
       let timer := 0
       cast PCPAndrogilSeraphimSpell PCPDG08PrisonREF
       PCPASCageREF.PlayGroup left, 0
    endif
  elseif(i == 4)   
      StartConversation Player PCPAndrogilSeraphimTopic2
  elseif(i == 5)
      disable
  endif
endif

End
 
Zuletzt bearbeitet:
Ich erlaube mir mal den Doppelpost, der Threadaktualisierung wegen.

Dank der Hilfe von Diarrhoe ist der Skript zurzeit auf folgendem Stand:

Code:
SCN PCPASScript

short init
float timer


Begin OnPackageDone PCPASTravelpackageB

if init == 0
  set init to 1
endif
end


[U]Begin OnPackageDone PCPASTravelpackageC

removescriptpackage PCPASTravelpackageC
startconversation player, PCPAndrogilSeraphimTopic4
[/U]
end


Begin GameMode

if init == 0
  return
else
  if timer <= 0
    if init == 1
      set timer to ( 2 + sayTo player PCPAndrogilSeraphimSayto1 1)
    
    elseif init == 2
      set timer to ( 2 + sayTo player PCPAndrogilSeraphimSayto2 1)
    
    elseif init == 3
      set timer to ( 2 + sayTo player PCPAndrogilSeraphimSayto3 1)
    
    elseif init == 4    
 PCPASCageREF.PlayGroup left, 0
    elseif init == 5
    StartConversation Player PCPAndrogilSeraphimTopic2
      
    elseif init == 6
      return
    endif
    set init to ( init + 1 )
  else
    set timer to ( timer - getSecondsPassed )
  endif
endif
    
if getdestroyed

return
else

setdestroyed 1
endif
End
Es funktioniert soweit gut, bis auf die unterstrichene Zeile: Kurz bevor der NPC den Spieler anspricht und die Kamera zum Dialog heranzoomt, stürzt das Spiel ab. Seltsamerweise werden sogar noch die Resultskripts (setstage) dieses Dialogs ausgeführt, obwohl das ja erst am Ende passieren soll und der Dialog noch nichtmal begonnen hat. Hat jemand eine Idee, woran das liegen könnte?
 
Ich versuche grad einen Script zu schreiben, der einem nach der Rassenauswahl ein Item gibt, aber nur wenn man eine bestimmte Rasse ausgewählt hat.
 
Danke :)
Sry, wenn ich nochmal ne doofe Frage stelle, doch ich möchte meinem Char noch einen "Fleischanzug" machen, und zwar wird der immer im Inventar angelegt, wenn der entsprechende Bodyslot nicht belegt ist (per add un removeitem), wichtig ist aber, dass er nur ausgezogen werden kann, wenn man etwas anderes anzieht, er darf auch nicht verzaubert, verkauft oder aus dem Inventar geworfen werden, ebenfalls wäre es praktisch, wenn er unsichtbar im Inventar bleibt. Per QuestItem könnte man ihn unverzuber- und unverkaufbar machen, doch beim Rest brächte ich Skripthilfe.

Danke nochmal für den Skript (bei meiner Begabung ist das eine riesen Hilfe :))
 
Zuletzt bearbeitet:
Hallo zusammen, ich hätte eine (vergleichsweise) leichte Frage, kann sie aber nicht selbst lösen...

Ich möchte wie bei Vanilla Oblivion in Nehrim Erweiterungen für ein Haus per Erwerb eines Umschlags enablen und dabei die Bruchbudenstücke entfernen.
Folgendes kam soweit heraus:

Scriptname ExpansionScript

short Doonce
short Doonce1

begin gamemode

;These are the variable triggers that are set when a voucher is acquired

if ( Player.GetItemCount 001*ExpansionLetter01 == 1 ) && ( Doonce == 0 )
Parent001*Haus01.Enable
Parent001*Ruin01.Disable
Parent001*Ruin02.Disable
Parent001*Ruin03.Disable
Parent001*Ruin004.Disable
set TotalCount to ( TotalCount + 1 )
set Doonce to 1
endif

end


Es kommt aber leider immer die Fehlermeldung dass die zu erscheinenden, bzw. verschwindenen Objekte keine gültigen Referenzen seien.
Ich habe sie per "Reference Editor ID" aber bereits als Referenzen gekennzeichnet.

Ich wäre sehr dankbar für etwas Hilfe.

Lg Basch III
 
Wozu brauchst du "short Doonce1"?

Der Fehler ist, dass Referenzen nicht mit Zahlen beginnen dürfen. (Und mit den "*" bin ich mir nicht sicher)
 
Die Referenzen beginnen in diesem Fall gar nicht mit einer Zahl, meiner Erfahrung nach ist alles andere egal, bei den * weiß ich es auch nicht. "Persistent Reference" im Referenz-Fenster angehakt? Außerdem hast Du die Variable "TotalCount" in diesem Skript ohne sie deklariert zu haben. Ich nehme aufgrund der Notiz in Englisch an, dass Du eine Vorgabe von Bethesda genutzt hast? Wenn Du sagst, was genau Du haben willst, kann man es Dir schreiben.
 
Es sollte später eine Liste werden mit den verschieden Erweiterungen, wie in Vanilla Oblivion.
Hab *-chen und Zahlen entfernt, aber funktionieren tut's leider immer noch nicht...

Brauche ich eventuell eine Quest dazu?

EDIT: Wie gesagt, es sollten (wie in Oblivion) Briefumschläge bei einem Händler erwerbar sein wodurch verschiedene Erweiterung in und um Burg Darlan freigeschaltet werden sollten.
Als Vorlage habe ich das Hausskript von Bravil benutzt, wenn auch etwas ungeschickt...
 
Wie bereits gesagt, checke erstmal ob "Persistent Reference" angehakt ist.
Ich weiß zwar nicht, wie Bethesda das Ganze genau gemacht hat, aber ich würde das so machen pro Brief:

Code:
SCN Scriptname

Short i

Begin OnSell

if(i == 0)
[COLOR=#ff0000]  <Ref1>.enable
  <Ref2>.enable
  ...[/COLOR]
  set i to 1
endif

End

Du musst halt eintragen, was Du enablen/disablen willst (im roten Bereich).