Ergebnis 1 bis 7 von 7
  1. #1 Zitieren
    Assassins-Creed.de Team Avatar von Dracir
    Registriert seit
    Mar 2009
    Ort
    Reich des Vergessens
    Beiträge
    713
    Hallo,

    ich experimentiere gerade mit folgendem Script herum:

    Code:
    Scriptname ActorDeath extends AnotherScript
    
    import Game
    
    Sound property SoundMarker1 Auto
    Sound property SoundMarker2 Auto
    Sound property SoundMarker3 Auto
    
    Event OnActivate(ObjectReference akActionRef)
    If (Class.GetValue()) == 1
        if akActionRef == GetPlayer()
            SoundMarker1.Play(self)
    elseif (Class.GetValue()) == 2
    	if akActionRef == GetPlayer()
            SoundMarker2.Play(self)
    elseif (Class.GetValue()) == 3
    	if akActionRef == GetPlayer()
            SoundMarker3.Play(self)
    Endif
    Endif
    Endif
    Endif
    EndEvent
    Das Ziel soll es sein, dass man eine zuvor besiegte Kreatur anklickt und dann je nach ausgewählter Klasse des Charakters ein Soundeffekt abgespielt wird. Die Charakterklassen sind in einem anderen Script aufgelistet, auf den am Anfang des Scripts verwiesen wird. Besser wäre es, wenn der Soundeffekt abgespielt wird, direkt nachdem man die Kreatur besiegt hat. Also auf "Event OnDeath" oder wie das in dem Fall richtig lautet.

    Der Script ist an den betreffenden Actor angehängt.

    Zurzeit erscheint beim Kompilieren folgende Fehlermeldung:

    Code:
    Starting 1 compile threads for 1 files...
    Compiling "ActorDeath"...
    ActorDeath.psc(12,35): type mismatch on parameter 1 (did you forget a cast?)
    ActorDeath.psc(15,33): type mismatch on parameter 1 (did you forget a cast?)
    ActorDeath.psc(18,36): type mismatch on parameter 1 (did you forget a cast?)
    No output generated for ActorDeath, compilation failed.
    
    Batch compile of 1 files finished. 0 succeeded, 1 failed.
    Failed on ActorDeath

    Hat da jemand rein zufällig genauere Kenntnisse davon und weiß, was hier fehlt bzw. worin das Problem besteht?
    Dracir ist offline Geändert von Dracir (04.02.2018 um 12:14 Uhr)
  2. #2 Zitieren
    Lehrling
    Registriert seit
    Feb 2014
    Beiträge
    38
    Mach mal die Leerzeichen zwischen 'Soundmarker' und danach weg, z.B. 'Sound property SoundMarker01 auto'.
    Ghaunadaur ist offline
  3. #3 Zitieren
    Assassins-Creed.de Team Avatar von Dracir
    Registriert seit
    Mar 2009
    Ort
    Reich des Vergessens
    Beiträge
    713
    Sorry, vergessen zu erwähnen. Die sind nur als Platzhalter bei diesem Beispiel eingefügt.
    Im richtigen Script ist die eigentliche Bezeichnung zusammengeschrieben.

    Ist korrigiert.
    Dracir ist offline
  4. #4 Zitieren
    Lehrling
    Registriert seit
    Feb 2014
    Beiträge
    38
    Beim Variablen-Namen 'Class' motzt der Compiler rum, weil es bereits ein Vanilla Skript gibt, dass so heisst.
    Ich kann auch gerade nicht erkennen, wo diese Variable im Skript definiert ist.

    Ändere das Skript wie folgt:


    Scriptname ActorDeath extends Actor

    import Game
    AnotherScript property OtherScript auto

    Sound property SoundMarker1 Auto
    Sound property SoundMarker2 Auto
    Sound property SoundMarker3 Auto

    Event OnActivate(ObjectReference akActionRef)
    if akActionRef == GetPlayer()
    If (OtherScript.Class1.GetValue()) == 1
    SoundMarker1.Play(self)
    elseif (OtherScript.Class1.GetValue()) == 2
    SoundMarker2.Play(self)
    elseif (OtherScript.Class1.GetValue()) == 3
    SoundMarker3.Play(self)
    Endif
    Endif
    EndEvent

    (und im anderen Skript entsprechend 'Class' abändern)
    Ghaunadaur ist offline Geändert von Ghaunadaur (08.02.2018 um 18:53 Uhr)
  5. #5 Zitieren
    Assassins-Creed.de Team Avatar von Dracir
    Registriert seit
    Mar 2009
    Ort
    Reich des Vergessens
    Beiträge
    713
    Hab es nun folgendermaßen zum Laufen bekommen, aber dennoch danke. Statt einer zu Beginn ausgewählten Klasse habe ich es von drei verschiedenen "Klassen-Quests" abhängig gemacht, welche ebenfalls zu Beginn für jede der drei Klassen, automatisch beim Start aktiviert werden.

    Das mit den Start-Quests ist in dem anderen Script geregelt, auf den ich beim vorherigen Versuch verweisen wollte.

    Ablauf:
    Spieler wählt Klasse A -> Aktiviere Start-Quest A
    Spieler wählt Klasse B -> Aktiviere Start-Quest B
    Spieler wählt Klasse C -> Aktiviere Start-Quest C

    Beim derzeitig verwendeten Script ist eine Abfrage eingebaut, ob die jeweilige Start-Quest abgeschlossen wurde. Wenn ja, nach Besiegen des Ziels einen von drei Sounds abspielen, je nachdem welche von den drei Start-Quests zuvor abgeschlossen wurde. Läuft im Prinzip auf das selbe gewünschte Ergebnis hinaus, nur eben mit einer Quest statt mit einer Klasse. Das Ziel befindet sich wiederum in einem Bereich, zu dem man erst Zugang erhält, wenn die jeweilige Start-Quest abgeschlossen wurde. Um zu vermeiden, dass man dort hingelangt, bevor die Start-Quest beendet wurde.

    Auch hier wieder die eigentlichen Begriffe durch markierte Platzhalter ersetzt. Der Script ist an den betreffenden Actor angehängt.

    Code:
    Scriptname ActorDeath extends ObjectReference
    
    Sound Property SoundMarker1 Auto
    Sound Property SoundMarker2 Auto
    Sound Property SoundMarker3 Auto
    Quest Property QuestTarget Auto
    Quest Property QuestPlaceholder1 Auto
    Quest Property QuestPlaceholder2 Auto
    Quest Property QuestPlaceholder3 Auto
    Int Property StageQuestIsDone Auto
    Actor Property akKiller Auto
    
    Event OnDeath(Actor akkiller)
    If ( QuestPlaceholder1.GetStage() == StageQuestIsDone )
    SoundMarker1.Play(Self)
    QuestTarget.SetStage(20)
    elseif ( QuestPlaceholder2.GetStage() == StageQuestIsDone )
    SoundMarker2.Play(Self)
    QuestTarget.SetStage(20)
    elseif ( QuestPlaceholder3.GetStage() == StageQuestIsDone )
    SoundMarker3.Play(Self)
    QuestTarget.SetStage(20)
    Endif
    EndEvent

    Auf zu neuen Problemen...
    Dracir ist offline
  6. #6 Zitieren
    Lehrling
    Registriert seit
    Feb 2014
    Beiträge
    38
    Warum so umständlich? Wäre es nicht einfacher, je nach gewählter Klasse oder abgeschlossener Startquest den Wert einer globalen Variable zu setzen? Das Skript würde 3 Properties weniger brauchen.

    Das Skript erweitert das ObjectReference-Skript. In diesem Fall ist das kein Problem, doch wenn Actor-Funktionen benötigt werden, muss es das Actor Skript erweitern (extends Actor).

    Wie auch immer, das Property akKiller ist bereits als Rückgabewert von OnDeath definiert und sollte nicht noch zusätzlich im Skript stehen.


    Beispiel
    Code:
    Scriptname ActorDeath extends Actor
    
    Sound Property SoundMarker1 Auto
    Sound Property SoundMarker2 Auto
    Sound Property SoundMarker3 Auto
    Quest Property QuestTarget Auto
    GlobalVariable Property ClassGlobal Auto
    
    
    Event OnDeath(Actor akkiller)
    If akKiller == Game.GetPlayer()
        If (ClassGlobal.GetValueInt() == 1)
            SoundMarker1.Play(Self)
            QuestTarget.SetStage(20)
        elseif (ClassGlobal.GetValueInt() == 2)
            SoundMarker2.Play(Self)
            QuestTarget.SetStage(20)
        elseif (ClassGlobal.GetValueInt() == 3)
            SoundMarker3.Play(Self)
            QuestTarget.SetStage(20)
        Endif
    endif
    EndEvent
    Ghaunadaur ist offline
  7. #7 Zitieren
    Assassins-Creed.de Team Avatar von Dracir
    Registriert seit
    Mar 2009
    Ort
    Reich des Vergessens
    Beiträge
    713
    In Anbetracht meines laienhaften Verständnis von Papyrus bin ich froh, dass ich manche Dinge überhaupt zum Laufen bekomme, sodass sie wie gewünscht funktionieren. (mittels einiger Tutorials versteht sich)

    Habe deine Variante übernommen... ja, wird auch angenommen. Danke.
    Dracir ist offline

Berechtigungen

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