Construction Set Skriptthread zum Construction Set

@Kahmul:

Ich wollte dein Skript jetzt mal ausprobieren, aber bekomme mehrere Fehlermeldungen, wenn ich es speichern möchte.

Zum einen beschwert sich das CS (mit OBSE) über zu viele "Operators".

Aber davor noch jammert es, dass es die "animgroup 7" nicht kennt.

Hier nochmal das Script, wie es z.Z. ausschaut:
Code:
SCN Scriptname

Ref MvCMarker1REF
Ref MvCMarker2REF

Short Distance
Int i

Float fQuestDelayTime

Begin GameMode

if(i == 0)
    let fquestdelaytime := 0.01
    let MvCMarker1REF := MvCMarker1REF
    let MvCMarker2REF := MvCMarker2REF
    let i += 1
endif

if(player.isrunning)
    if(player.isanimgroupplaying 7) || (player.isanimgroupplaying 8) || (player.isanimgroupplaying 9) || (player.isanimgroupplaying 10)
        if(i == 1)
           MvCMarker1REF.moveTo player
           let i += 1
          return
        elseif(i == 2) 
           MvCMarker2REF.moveTo player
           let i -= 1
        endif
        let distance := MvCMarker1REF.getdistance MvCMarker2REF
        if(distance < 10)
            player.modav2 fatigue -5000
            let distance := 0
           return
        endif
    endif
endif

End
 
@ Meister von Cyrodiil:

Code:
SCN Scriptname

Ref MvCMarker1REF
Ref MvCMarker2REF

Short Distance
Int i

Float fQuestDelayTime

Begin GameMode

if(i == 0)
    let fquestdelaytime := 0.01
    let i := 1
endif

if(player.isrunning)
    if(player.isanimgroupplaying FastForward) || (player.isanimgroupplaying FastBackward) || (player.isanimgroupplaying FastLeft) || (player.isanimgroupplaying FastRight)
        if(i == 1)
           MvCMarker1REF.moveTo player
           let i += 1
          return
        elseif(i == 2) 
           MvCMarker2REF.moveTo player
           let i -= 1
        endif
        let distance := MvCMarker1REF.getdistance MvCMarker2REF
        if(distance < 50)
            player.modav2 fatigue -5000
            let distance := 0
           return
        endif
    endif
endif

End

Habe außerdem die distance etwas hochgesetzt, weil 10 relativ wenig ist und extrem selten getriggert wird. Ich habe außerdem nur das ersetzt, was bei dir Fehler verursacht. Was der Script bewirkt kommt mir ehrlich gesagt etwas komisch vor. Ich habe natürlich keine Ahnung, was du eigentlich mit dem Script bewerkstelligen willst, aber ich denke, dass der Script es nicht tut. Nur so eine Intuition. :lol:

@ Schmelz:
Äußerst seltsam. Ersetze bitte mal die Messageboxen durch 'printc "0"' bzw. 'printc "1"' und teste es nochmal. Vor dem Testen aber in die Konsole noch "tdt" eingeben und bestätigen. Konsole schließen, testen und schauen, was passiert. Du müsstest dann während des Testens unten links eine Ausgabe erhalten.
 
@ MvC:

Du brauchst nur da die MarkerRef hinsetzen, wo "<MarkerXRef>" stand/steht.
Anscheinend scheint "Isanimgroupplaying" keine Zahlen zu nehmen. So sollte es gehen:

Code:
SCN Scriptname

Ref Marker1
Ref Marker2

Short Distance
Int i

Float fQuestDelayTime

Begin GameMode

if(i == 0)
    let fquestdelaytime := 0.01
    let marker1 := <Marker1Ref>    ; Nur hier die Ref einsetzen!
    let marker2 := <Marker2ref>     ; Und hier auch.
    let i += 1
endif

if(player.isrunning)
    if(player.isanimgroupplaying fastforward) || (player.isanimgroupplaying fastbackward) || (player.isanimgroupplaying fastleft) || (player.isanimgroupplaying fastright)
        if(i == 1)
           Marker1.moveTo player
           let i += 1
          return
        elseif(i == 2) 
           marker2.moveTo player
           let i -= 1
        endif
        let distance := marker1.getdistance marker2
        if(distance < 10)
            player.modav2 fatigue -5000
            let distance := 0
           return
        endif
    endif
endif

End

@ Gildur: Schau mal ein paar Seiten zurück. Und das mit den Markern habe ich nur so gemacht, weil ich nicht dauernd "<MarkerRef>" schreiben wollte.
 
  • Like
Reaktionen: Meister von Cyrodiil
Okay, dann wissen wir schon mal wo wir suchen müssen, nämlich im letzten Block:

Code:
elseif controlvar == 2

let actors := ar_construct array
let actor := getFirstRef 69 1
while actor
    if actor.getIsReference player == 0 && actor.getDead
        let actors[index] := actor
        let index += 1
    endif
    let actor := getNextRef
loop
let controlvar := 3
return

elseif controlvar == 3

let index := -1
while index < ar_Last actors
let index += 1
let actor := actors[index]
actor.removeAllItems player
loop
let controlvar := 4

endif

End
 
  • Like
Reaktionen: Schmelz
Code:
                                                            printc"0"
elseif controlvar == 2
                                                            printc"1"
let actors := ar_construct array
                                                            printc"3"
let actor := getFirstRef 69 1
                                                            printc"4"
while actor
                                                            printc"5"
    if actor.getIsReference player == 0 && actor.getDead
                                                            printc"6"
        let actors[index] := actor
                                                            printc"7"
        let index += 1
                                                            printc"8"
    endif
                                                            printc"9"
    getNextRef
                                                            printc"10"
loop
                                                            printc"11"
let controlvar := 3
                                                            printc"12"
return
                                                            printc"13"
elseif controlvar == 3
                                                            printc"14"
let actor := actors[index]
                                                            printc"15"
let index -= 1
                                                            printc"16"
actor.removeAllItems player
                                                            printc"17"
if index == 0
                                                            printc"18"
    let controlvar := 4
                                                            printc"19"
endif
                                                            printc"20"
endif
nur die null wird angezeigt, aber wie kann den "elseif das Problem sein?
 
nur die null wird angezeigt, aber wie kann den "elseif das Problem sein?

Indem die Bedingung nicht erfüllt wird. Baue mal bitte nach dem 'set controlvar to 2' ein 'printc "%g" controlvar' ein und falls das nicht angezeigt werden sollte in die Konsole folgendes eingeben:

"set QuestID.controlvar to QuestID.controlvar"

damit der Wert der Controlvar in der Konsole ausgegeben wird. Irgendwo muss es ja scheitern.
 
  • Like
Reaktionen: Schmelz
Aber wenn die Bedingung nicht erfüllt wird, würde der Block doch übersprungen und würde nicht zum Absturz führen!? -> wie auch immer, Ergebnis ist "&g"...
in die Konsole kann ich doch während dem Script-Verlauf gar nichts eingeben, ...
Bei mir ist Zauber -> Absturz mit einem nicht merklichen Zeitunterschied.

edit: Gehe ich eigentlich richtig in der Annahme, dass "tdt" und "printc" zu obse gehören?

edit: OK, ich hab die fQuestDelayTime hochgesetzt. Und controlvar wird defenitiv auf 2 gesetzt und das vor dem Absturz
 
Zuletzt bearbeitet:
edit: Gehe ich eigentlich richtig in der Annahme, dass "tdt" und "printc" zu obse gehören?

printc schon, tdt ist Vanilla Oblivion.

edit: OK, ich hab die fQuestDelayTime hochgesetzt. Und controlvar wird defenitiv auf 2 gesetzt und das vor dem Absturz?

Dann müsstest du aber noch, wenn du schnelle Augen hast, wenigstens eine 1 in der Konsole lesen können. Denn auf "elseif controlvar == 2" folgt ja direkt der printc, und keines von beidem führt zu einem Absturz - oder anders gesagt - darf nicht zu einem Absturz führen. Falls du gar nicht mehr weiter weist würde ich dir wieder zum üblichen Ausschlussverfahren raten, sprich, du nimmst mal alles weg, außer das CreateArray, um auszuschließen, dass es nicht daran liegt. Also angefangen hiermit:

Code:
elseif controlvar == 2

let actors := ar_construct array
let actor := getFirstRef 69 1

End

Und dann dementsprechend immer weiter erweitern, bis du die Schwachstelle findest.

Grüße,

Gildur
 
  • Like
Reaktionen: Schmelz
Mein Skript funktioniert, aber beim Laden der .esp erhalte ich eine Fehlermeldung:

Code:
Script "NAME" on carryable "ID" contains GetSelf function."
Wie bekomme ich das weg?
Edit: Hat sich erledigt. "GetSelf" durch "This" ersetzt und das CS beschwert sich nicht mehr :)
 
Zuletzt bearbeitet:
....Bitte, wo ist die nächste Wand? :headwall:
klar, "getNextRef" allein führt zum Absturz. (-> "set actor to getNextRef")
Kein Absturz mehr, aber die Toten werden auch nicht geplündert^^
Code:
elseif controlvar == 2

let actors := ar_construct array
let actor := getFirstRef 69 1
while actor
    if actor.getIsReference player == 0 && actor.getDead
        let actors[index] := actor
        let index += 1
    endif
    set actor to getNextRef
loop
let controlvar := 3
return

elseif controlvar == 3

let actor := actors[index]
let index -= 1
actor.removeAllItems player
if index == 0
    let controlvar := 4
endif

endif
edit: kann es sein, dass arrays keine position 0 haben?
 
Zuletzt bearbeitet:
Doch eigentlich haben sie die. Aber du könntest sonst alternativ den Array nicht als Array sondern als Map erstellen. Da müsstest du nur ein wenig ändern:
Code:
let actors := ar_construct [B]map[/B]
 
  • Like
Reaktionen: Schmelz
:hail::hail: Das war's!!!
Aber eine Leiche bleibt unangetastet! -> ist die 0 vielleicht doch unzulässig?
edit: Und was bedeutet map denn, im Vergleich zu array?
 
Aus der OBSE-Dokumentation (s. Signatur): A Map associates numeric keys with values. Unlike an Array, a Map allows negative and floating point numbers to be used as keys and allows gaps to exist between elements.
 
  • Like
Reaktionen: Schmelz