|
|
-
03.02.2018 22:47
-
Skyrim - Script "Sound-Effekt bei Klick auf einen Actor"
#1
|
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?
|
|
|
|
|
-
04.02.2018 04:27
#2
|
Lehrling
Mach mal die Leerzeichen zwischen 'Soundmarker' und danach weg, z.B. 'Sound property SoundMarker01 auto'.
|
|
-
04.02.2018 12:15
#3
|
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.
|
|
-
08.02.2018 17:53
#4
|
Lehrling
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)
|
|
-
12.02.2018 23:24
#5
|
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...
|
|
|
|
|
-
13.02.2018 21:34
#6
|
Lehrling
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
|
|
|
|
|
-
14.02.2018 20:04
#7
|
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.
|
|
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
|
|
|