Allgemein
News
News-Archiv
Partner
Netzwerk
Banner
Header
Media
Downloads
Impressum

The Elder Scrolls
Arena
Daggerfall
Spin-offs
Romane
Jubiläum
Reviews
Welt von TES
Lore-Bibliothek
Namens-
generator

FRPGs

Elder Scrolls Online
Allgemein
Fraktionen
Charakter
Kargstein
Technik
Tamriel-
Manuskript

Media

Skyrim
Allgemein
Lösungen
Tipps & Tricks
Steam-Kniffe
Review
Media
Plugins & Mods

Oblivion
Allgemein
Lösungen
Tipps & Tricks
Technik
Charakter
Media
Plugins & Mods
Kompendium

Morrowind
Allgemein
Lösungen
Tipps & Tricks
Media
Plugins & Mods

Foren
The Elder Scrolls Online
Hilfe & Diskussion

Skyrim
Hilfe & Diskussion
Plugins & Mods

Ältere TES-Spiele
TES-Diskussion
Oblivion-Plugins
Morrowind-Plugins

Community
Taverne zum Shalk
Adventures of Vvardenfell
Tales of Tamriel
Seite 2 von 2 ErsteErste 12
Ergebnis 21 bis 40 von 43

Thema: 2 probleme mit meinem Skript

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Ich nehme an brTestcuirass1Splitter ist ein base object id (sonst würde Drop auch nicht funktionieren).
    Dadurch, dass du
    Code:
                   set britem to brTestcuirass1Splitter
                   britem.moveto Actor 0,0,9
    verwendest benötigst du aber die Referenz.

    Die einzige Möglichkeit diese zu bekommen wäre GetFirst/NextRef. Du solltest allerdings (mindestens) einen Frame warten, bis du sie auch verwendest.


    Das erklärt zwar nicht den CTD, allerdings warum das Script nach dem ersten Durchlauf nicht mehr funktioniert (wird gestoppt, bis Oblivion neu gestartet wird).

  2. #2
    Zitat Zitat
    Die einzige Möglichkeit diese zu bekommen wäre GetFirst/NextRef. Du solltest allerdings (mindestens) einen Frame warten, bis du sie auch verwendest.
    habe mich mal im cswiki schlau gemacht da steht ja irgendwas von While Loop Schleife, sorry wegen meiner Unwissenheit aber ich habe keine ahnung wie die funktioniert.

    Zitat Zitat
    Ich nehme an brTestcuirass1Splitter ist ein base object id
    Jep ein Miscitem um´s Genauer zu sagen

    Zitat Zitat
    Das erklärt zwar nicht den CTD, allerdings warum das Script nach dem ersten Durchlauf nicht mehr funktioniert (wird gestoppt, bis Oblivion neu gestartet wird).
    das der Script nach dem laden Gerne nicht funktioniert war schon bevor ich die sache mit Drop Reingenommen habe.

    Sprich als der Script noch so aussah
    PHP-Code:
    Scriptname aaTestcuirassa 

    short next 
    short EquipDelay 
    long objecthealth 
    ref Actor 
    ref britem 

    Begin GameMode 
        
    if Actor == 
            set Actor to GetContainer 
        
    elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 
            if 
    getCurrentHealth getObjectHealth >= && getCurrentHealth getObjectHealth <= 0.75 
                set next to 1 
                set objecthealth to getCurrentHealth 
                Actor
    .addItemNS aaTestcuirassb 1 
                set EquipDelay to 1 
            
    endif 
        elseif 
    next == 
            
    if EquipDelay >= 
                set EquipDelay to EquipDelay 

            
    elseif EquipDelay == 
                set next to 0 
                Actor
    .UnEquipItemNS aaTestcuirass 
                Actor
    .EquipItemNS aaTestcuirassb 
                Actor
    .setEquippedCurrentHealth objecthealth 2 
                removeMe 
            
    endif 
        elseif 
    Actor != 
                    set Actor to 0 
         
    endif 
    end 

  3. #3
    Bei einer While-Schleife wird einfach alles zwischen dem While und Loop (angenommen Break/Continue wird nicht verwendet) so oft wiederholt, bis die While-Bedingung nicht mehr zutrifft. In dem Wiki-Beispiel ist das so lange der Fall, wie GetNextRef einen Wert != 0 ausgibt.

    Warum das Script sonst anhält kann ich nur vermuten. Mein Ansatz wäre jetzt, dass ein unequip & equip, die den gleichen Slot betreffen nicht im selben Frame stehen dürfen. Ich würde dazu einfach das unequip weglassen.
    Ich würde dir allerdings empfehlen ein paar Print(C)-Befehle einzufügen. Damit kannst du kontrollieren, wie weit das Script durchläuft. Der Fehler ist dann auf jeden Fall danach.

  4. #4
    Habe mal versucht so ein While Loop einzubauen

    PHP-Code:
    Scriptname aaTestcuirassa 

    short next 
    short EquipDelay 
    long objecthealth 
    ref Actor 
    ref britem 

    Begin GameMode 
        
    if Actor == 
            set Actor to GetContainer 
        
    elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 
            if 
    getCurrentHealth getObjectHealth >= && getCurrentHealth getObjectHealth <= 0.75 
                set next to 1 
                set objecthealth to getCurrentHealth 
                Actor
    .addItemNS aaTestcuirassb 1 
                   Actor
    .addItemNS brTestcuirass1Splitter 1
                   Actor
    .Drop brTestcuirass1Splitter 1  
                   set britem to GetFirstRef 27 1
                   
    While ( britem != brTestCuirass1Splitter )
                           
    set britem to GetNextRef
                   Loop
                set EquipDelay to 1 
            
    endif 
        elseif 
    next == 
            
    if EquipDelay >= 
                set EquipDelay to EquipDelay 

            
    elseif EquipDelay == 
                set next to 0 
                Actor
    .UnEquipItemNS aaTestcuirass 
                Actor
    .EquipItemNS aaTestcuirassb 
                Actor
    .setEquippedCurrentHealth objecthealth 2 
                   britem
    .moveto Actor 0,0,150 
                removeMe 
            
    endif 
        elseif 
    Actor != 
                    set Actor to 0 
         
    endif 
    end 
    Das war jetzt mein Erster versuch. Führt allerdings nur zum CTD

    auf der CS Wiki steht ja irgendwas von ; do something with pDoor innerhalb der While Loop Schleife heißt das ich muss da jetzt noch was anderes machen als nur GetNextRef
    Geändert von Orios das auge (01.10.2010 um 19:27 Uhr)

  5. #5
    Da britem eine Referenz ist (GetFirst/NextRef gibt nur Referenzen aus) wird es nie gleich dem base object brTestCuirass1Splitter sein. Versuch mal folgenden While-Loop:
    Code:
    While ( britem.GetIsID brTestCuirass1Splitter )

    Was den CTD betrifft:
    Konsole lässt sich da ja schwer überprüfen, von daher musst du auf den (undokumentierten) Befehl dbg_echo zurückgreifen. Der verwendet die gleiche Syntax wie PrintC, schreibt den Inhalt aber nicht nur in die Konsole, sondern auch in die Datei obse.log im Oblivion-Verzeichnis.
    Der Befehl sollte aber nur zum De-bugging (Fehlersuche) verwendet werden und aus der Release-Version wieder gelöscht werden.

  6. #6
    Ok jetzt gibt es kein CTD mehr (auch nicht im Exterior 8))

    allerdings Passieren jetzt andere Merkwürdige dinge o_O

    1. Der Bildschirm wird für ein Bruchteil einer Sekunde Schwarz
    2. Der Gegner Steckt danach die waffe weg und Zieht sie wieder erneut
    3. Die Musik wird zurück gesetzt
    und 4. bei 3 meiner 8 Versuche wurde das Wetter nach dem Blackscreen geändert

    und Moveto scheint nicht zu Funktionieren (Der Gegenstand brTestcuirass1Splitter erscheint vor der Brust von Player und nicht ein Stück über´m Kopf so wie es bei moveto 0,0,150 ja eigendlich sein soll)

    Hier der Script
    PHP-Code:
    Scriptname aaTestcuirassa

    short next
    short EquipDelay
    long objecthealth
    ref Actor
    ref britem

    Begin GameMode
        
    if Actor == 0
            set Actor to GetContainer
              dbg_echo 
    "Actor to container frame 1"Actor
        
    elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == )
            if 
    getCurrentHealth getObjectHealth >= && getCurrentHealth getObjectHealth <= 0.75
                set next to 1
                set objecthealth to getCurrentHealth
                Actor
    .addItemNS aaTestcuirassb 1
                   dbg_echo 
    "if frame 2"Objecthealth
                   Actor
    .addItemNS brTestcuirass1Splitter 1
                   Actor
    .Drop brTestcuirass1Splitter 1
                   set britem to GetFirstRef 27 1
                   
    While ( britem.GetIsID brTestcuirass1Splitter )
                             
    set britem to GetNextRef
                             dbg_echo 
    "While"britem
                   Loop
                set EquipDelay to 1
            
    endif
        elseif 
    next == 1
            
    if EquipDelay >= 1
                   dbg_echo 
    "EquipDelay frame 3"EquipDelay
                set EquipDelay to EquipDelay 
    1
            
    elseif EquipDelay == 0
                set next to 0
                Actor
    .UnEquipItemNS aaTestcuirass
                Actor
    .EquipItemNS aaTestcuirassb
                Actor
    .setEquippedCurrentHealth objecthealth 2
                   britem
    .moveto Actor 0,0,150
                   dbg_echo 
    " move to frame 4"britem
                removeMe
            
    endif
        elseif 
    Actor != 0
                    set Actor to 0
                    dbg_echo 
    "Actor Reset frame 5"
         
    endif
    end 
    und die Obse.log
    Zitat Zitat
    if frame 2
    While
    Error in script 42001ca0
    Attempting to call a function on a NULL reference or base object
    File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>
    Error in script 42001ca0
    An expression failed to evaluate to a valid result
    File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>
    EquipDelay frame 3
    Actor Reset frame 5
    Actor to container frame 1
    Actor Reset frame 5
    Actor to container frame 1
    Actor Reset frame 5
    Actor to container frame 1
    Actor Reset frame 5
    Actor to container frame 1
    Actor Reset frame 5
    Actor to container frame 1
    Actor Reset frame 5
    ...usw...

  7. #7
    Zitat Zitat
    Error in script 42001ca0
    Attempting to call a function on a NULL reference or base object
    File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>
    Error in script 42001ca0
    An expression failed to evaluate to a valid result
    File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>
    Das weist auf einen Syntax-Fehler hin: Eine Funktion, die einen best. Wert benötigt wird mit einer Null-Referenz/base object aufgerufen.

    Probier mal den ScriptViewer aus, da kannst du sehen, was die Offset-Werte bedeuten (stehen für eine Position im Script).


    Ich vermute, dass es die While-Schleife selbst ist. Das passiert aber nur, wenn keiner der entsprechenden Werte brTestcuirass1Splitter als Base Object hat. Sicher, dass du den richtigen Filter bei GetFirstRef verwendest?

  8. #8
    Ok hat mir nicht viel gebracht da sind bei mir keine übereinstimmenden Offset werte gibt

    Code:
    1      0000   Scriptname aaTestcuirassa
    2             
    3             short next
    4             short EquipDelay
    5             long objecthealth
    6             ref Actor
    7             ref britem
    8             
    9      0004   Begin GameMode
    10     000E      if Actor == 0
    11     001F         set Actor to GetContainer
    12     002E             dbg_echo "Actor to container frame 1", Actor
    13     0053      elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 0 )
    14     0075         if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
    15     00AD            set next to 1
    16     00B8            set objecthealth to getCurrentHealth
    17     00C7            Actor.addItemNS aaTestcuirassb 1
    18     00D9                  dbg_echo "if frame 2", Objecthealth
    19     00EE                  Actor.addItemNS brTestcuirass1Splitter 1
    20     0100                  Actor.Drop brTestcuirass1Splitter 1
    21     0112                  set britem to GetFirstRef 27 1
    22     012D                  While ( britem.GetIsID brTestcuirass1Splitter )
    23     0144                            set britem to GetNextRef
    24     0153                            dbg_echo "While", britem
    25     0163                  Loop
    26     0167            set EquipDelay to 1
    27     0172         endif
    28     0176      elseif next == 1
    29     0187         if EquipDelay >= 1
    30     0198                  dbg_echo "EquipDelay frame 3", EquipDelay
    31     01B5            set EquipDelay to EquipDelay - 1
    32     01C6         elseif EquipDelay == 0
    33     01D7            set next to 0
    34     01E2            Actor.UnEquipItemNS aaTestcuirass
    35     01EF            Actor.EquipItemNS aaTestcuirassb
    36     01FC            Actor.setEquippedCurrentHealth objecthealth 2
    37     020E                  britem.moveto Actor 0,0,150
    38     0236                  dbg_echo " move to frame 4", britem
    39     0251            removeMe
    40     0257         endif
    41     025B      elseif Actor != 0
    42     026C                   set Actor to 0
    43     0277                   dbg_echo "Actor Reset frame 5"
    44     0292        endif
    45     0296   end

  9. #9
    Zitat Zitat von Orios das auge Beitrag anzeigen
    Ok hat mir nicht viel gebracht da sind bei mir keine übereinstimmenden Offset werte gibt
    Interessant ist immer der nächst kleinere Wert, in deinem Fall also:
    Code:
    22     012D                  While ( britem.GetIsID brTestcuirass1Splitter )
    Der Fehler weißt darauf hin, dass britem eine Null-Referenz ist (also keinen Wert hat).
    Abgesehen davon hätte das eh nicht funktioniert, da die (erforderliche) Verneinung vergessen wurde.


    Der korrekte Code wäre:
    Code:
    set britem to GetFirstRef 27 1
    While ( IsFormValid britem )
     if ( britem.GetIsID )
      Break
     endif
     set britem to GetNextRef
    Loop
    if Eval ( !IsFormValid britem )
     ;Ref nicht gefunden
    endif

  10. #10
    Ah jetzt funktioniert es.

    Ganz Großes danke für deine Mühe.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •