Construction Set Skriptthread zum Construction Set

Dann muss es so sein
Code:
scn name

Begin onEquip player
if player.isweaponout == 1; Hiermit wird abgefragt ob die Waffe ;eingesteckt ist oder nicht. Mi setalert 1 wird die waffe automatisch gezogen. 
 player.EquipItem aaaRavenGodaioff 1
 player.UnequipItem aaaRavenarrows 1
endif
else

 player.UnequipItem aaaRavenGodaioff 1
 player.EquipItem aaaRavenarrows 1
end
So soltle es gehen
 
Nein. Damit wirds auch nicht gehen, weil "onEquip" einmal beim Ausrüsten ausgelöst wird und dort ist zwangsläufig keine Waffe gezogen...
 
Ich schreib mal, wie er sich das vorstellt:
Es gibt ein Schwert für die Waffen-Hand. Dies ist standardmäßig an der Seite des Spielers.
Dazu ein Schwert für die Off-Hand.
Des weiteren gibt es ein Mesh, dass die beiden Schwerter in eingesteckter Form darstellt, allerdngs auf dem Rücken.

Das gewünschte Szenario:
Der Spieler rüstet das Schwert aus. Das Off-Schwert wird dazugerüstet, automatisch. Solange das Schwert nicht gezogen ist, sollen jedoch nicht das eine Schwert an der Seite und das andere als Schild in der linken Hand sein, sondern, über die andere Mesh, auf dem Rücken hängen.

Drückt der Spieler nun f (oder was eingestellt ist), um das Schwert (aus der Scheide) zu ziehen, werden die beiden einzelnen Schwerter ausgerüstet und das Doppel-Mesh vom Rücken aus dem Inventar des Spielers entfernt.

Das Doppelmesh wird dem Spieler-Inventar hinzugefügt, wenn er das Schwert in die Scheide steckt und dann gleich ausgerüstet.

Das Doppel-Mesh vom Rücken und das Schwert aus der Waffen-Hand müssen nicht extra abgerüstet werden, da sie beide als Weapon im CS sind und somit automatisch abgerüstet werden, wenn der andere Gegenstand ausgerüstet wird.
Das Off-Hand-Schwert dagegen ist als Armor eingebunden, sonst wäre dies nicht als Schild möglich und deswegen benötigt es auch ein extra Script.

So, ich glaube, damit sollte klar, werden, dass das ganze etwas komplizierter ist.

Ich hatte diese Variante für ihn gebastelt, aber das funktioniert leider nicht:

Folgendes Quest-Script:
scn aaaRavenGodaiScript

float fQuestDelayTime

begin GameMode

set fQuestDelayTime to 0.1

if (player.GetItemCount aaaRavenGodai <= 0)
return
endif

if (player.GetEquipped aaaRavenGodai == 1 && player.IsWeaponOut == 0 && player.GetEquipped aaaRavenGodaioff == 1)
Message " "
Message " "
player.UnequipItem aaaRavenGodaioff
if (player.GetItemCount aaaRavenarrows == 0)
Message " "
Message " "
player.AddItem aaaRavenarrows 1
endif
Message " "
Message " "
player.EquipItem aaaRavenarrows
elseif (player.GetEquipped aaaRavenGodai == 1 && player.IsWeaponOut == 1)
Message " "
Message " "
player.EquipItem aaaRavenGodaioff
if (player.GetItemCount aaaRavenarrows > 0)
Message " "
Message " "
player.RemoveItem aaaRavenarrows 1
endif
elseif (player.GetEquipped aaaRavenGodai == 0 && player.GetEquipped aaaRavenGodaioff == 1 && player.GetEquipped aaaRavenarrows == 1)
Message " "
Message " "
player.UnequipItem aaaRavenGodaioff
Message " "
Message " "
player.RemoveItem aaaRavenarrows 1
elseif (player.GetEquipped aaaRavenGodai == 0 && player.GetEquipped aaaRavenGodaioff == 1 && player.GetEquipped aaaRavenarrows == 0)
Message " "
Message " "
player.UnequipItem aaaRavenGodaioff
elseif (player.GetEquipped aaaRavenarrows == 1 && player.IsWeaponOut == 1)
Message " "
Message " "
player.EquipItem aaaRavenGodai
elseif (player.GetEquipped aaaRavenGodai == 0 && player.GetEquipped aaaRavenarrows == 0 && player.GetItemCount aaaRavenarrows > 0)
Message " "
Message " "
player.RemoveItem aaaRavenarrows 1
endif
end

Folgendes Script auf die Off-Hand-Waffe:
scn aaaRavenGodaioffScript

begin OnEquip player
if (player.GetEquipped aaaRavenarrows == 1)
Message " "
Message " "
player.UnequipItem aaaRavenGodaioff
elseif (player.GetEquipped aaaRavenGodai == 1 && player.IsWeaponOut == 0)
Message " "
Message " "
player.UnequipItem aaaRavenGodaioff
if (player.GetItemCount aaaRavenarrows == 0)
Message " "
Message " "
player.AddItem aaaRavenarrows 1
endif
Message " "
Message " "
player.EquipItem aaaRavenarrows
endif
end

Klappt nur leider nicht wie gewünscht.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Raven 666
Was genau funktioniert denn an dem Skript nicht, bzw. bis zu welchem Grad funktioniert es?
Es könnte daran liegen, dass zwischen dem "addItem"- und "equipItem"-Befehl kein Frame liegt. Dann funktionierts nämlich nicht...
 
Das Problem ist, dass nichts passiert, es verhalten sich alle Objekte, als ob sie kein Script hätten.

Das Quest Script habe ich nun einem neuen Quest hinzugefügt, (Bei dem Pulldownmenü neu erstellt) Muss ich noch irgendwas ankreuzen, oder etwas eingeben, wann das Quest starten soll? Habe leider von Questen noch keine Ahnung...

Ich werde Nico mal anschreiben, und ihm mein Problem schildern, ich bin sicher er kann mir weiterhelfen^^

(Nico = Nicoroshi)

mfg
Raven

EDIT: Nico hat eine E-Mail von mir im Postfach liegen, normalerweise antowrtet er in den nächsten Tagen. Ich werde euch dann die antwort zukommen lassen ;)
 
Zuletzt bearbeitet:
So Leute Nico hat geantwortet:

Er hat gesagt er versteht mein Problem, versteht aber nicht, warum ich den Arrow slot gewählt habe. Ich solle die Schwerter lieber auf die Backweapon legen (Also Claymore Slot) und dann einfach sein script nocheinmal verwenden, dann sollte es funktionieren.

Ich arbeite gerade daran, werde euch dann sagen obs geklappt hat, und screibe dann hier die Scripts von Nico (Copyright to him^^) hier rein. Vielleicht werden wir dann schlauer...

mfg
Raven

EDIT: So es klappt, naja Teilweise, sieht noch nicht schön aus, aber es klappt:

Hab die Arrows nun in ein Claymore verwandelt, alles neu im CS eingestellt, und die Scripts von Nico umgeschrieben. Jetzt klappt das auch, nur die Schwerter am Rücken sind noch irgendwie. (Ja klar, feinarbeit kommt ja noch, musste nur vorher funktionieren)

Wenn wer das File haben will, bzw. die Scripts, soll er sich einfach melden, ist zwar ein wirrwarr an Zeilen und Befehlen, aber das krieg ich noch in den Griff

Freut mich, das es endlich klappt *freu*

Ich bedanke mich bei allen, für die Hilfe und den Rat *Ihr seit klasse* :good:
 
Zuletzt bearbeitet:
Ich möchte, dass beim aktivieren eines bestimmten Gegenstandes eine Truhe geöffnet und kontrolliert wird, ob bestimmte Gegenstände in die Truhe gelegt werden. Anschließend sollen neue Gegenstände in das Inventar des Spielers gehen. Ich habe es folgendermaßen gemacht, aber es funktioniert nicht:
Code:
scn MeinScript

short Anzahl1
short Anzahl2

Begin OnActivate
TruheREF.activate
set Anzahl1 to TruheREF.GetItemCount RuneA
set Anzahl2 to TruheREF.GetItemCount RuneB

player.additem RuneC Anzahl1
player.additem RuneD Anzahl2
end
Die Truhe wird nicht geöffnet. Was ist falsch?
 
1. Man aktiviert einen Gegenstand
2. Es soll eine Truhe geöffnet werden
3. Man kann verschiedene Gegenstände in die Truhe legen
4. Es soll die Anzahl bestimmter Gegenstände in der Truhe ausgelesen werden
5. Es sollen genausoviel andere Gegenstände dem Spieler ins Inventar gelegt werden, wie in der Truhe sind
 
Da musst du mit einem GameMode-Block arbeiten.

Code:
scn ...

short Anzahl1
short Anzahl2
short step

begin OnActivate player
if (step == 0)
    [TruheREF]. activate player
    set step to 1
endif
end

begin GameMode
if (step == 0)
    return
elseif (step == 1)
    set Anzahl1 to [TruheREF].GetItemCount RuneA
    set Anzahl2 to [TruheREF].GetItemCount RuneB
    set step to 2
elseif (step == 2)
    player.AddItem RuneC Anzahl1
    player.AddItem RuneD Anzahl2
    set step to 0
endif
end

So sollte das eigentlich hinhauen.
 
  • Like
Reaktionen: bjoernret
Ich hatte vor etwas Zeit verstreichen zu lassen während eine Aktion ausgeführt wird.
Doch wie mache ich das.

BSP: Spieler wählt einen Gegenstand im Inventar aus und es folgt eine Aktion.

Nur das die Aktion keine Dauer hat. Wie könnte man das machen, das zB ein neues Item nach der auszuführenden Aktion erst nach einer kleinen Weile ins Inventar gelegt wird.

Wärend dessen soll eine Message erscheinen die das Warten zeigt.

Das mit den Timercsripten kapiere ich nicht. Und ich weiss auch nicht wie ich das dort mit reinschreibe.

Soweit bin ich schon

if xyz ==1
player.removeItem Name 1
Zeit läuft
Während Zeit verstreicht, Message erscheint
Player.addItem Name2 1
endif
 
Hallo,

ich bin was Scripten angeht sehr unbegabt und wollte euch bitten euch dieses Script hier mal anzusehen- es funktioniert, aber ich habe "Angst" das es permanent läuft-> ist das unbegründet? Falls nein, wie baue ich einen Stoper ein?

ScriptName Objekctweg

Begin GameMode

if Global == 1
PositionCell 76345, 100.56, 215, 176, DummyCell
Olddoor.disable
endif
End
 
@darknightwalker:
Einfach eine kleine Variable einbauen ala doonce.
Code:
ScriptName Objekctweg

short doonce

Begin GameMode

if (Global == 1 && doonce == 0)
PositionCell 76345, 100.56, 215, 176, DummyCell
Olddoor.disable
set doonce to 1
endif
End

@robinh:
Also, den von dir bereits genannten timer brauchst du.
Wie man das nun jedoch genau baut, hängt etwas davon ab, was du für Gegenstände benutzt.

Ich kann dir mal grob schreiben, wie der timer eingebaut wird.
Also, erst mal, der timer kann nur im GameMode den Wert ändern, sprich runterzählen, raufzählen, wie man es gerade will.

Hier von der Struktur ein kleines Beispielscript:

Code:
scn xyz

short step
[COLOR="Blue"]float timer[/COLOR]

begin OnActivate
if (step == 0)
    Message "Der Timer startet."
    [COLOR="Blue"]set timer to 10[/COLOR]
    set step to 1
endif
end

begin GameMode
if (step == 1 && [COLOR="Blue"]timer > 0[/COLOR])
    [COLOR="Blue"]set timer to timer - GetSecondsPassed[/COLOR]
elseif (step == 1 && [COLOR="Blue"]timer > 4 && timer < 6[/COLOR])
    Message "Der Timer hat die Hälfte erreicht."
elseif (step == 1 && [COLOR="Blue"]timer <= 0[/COLOR])
    Message "Der Timer ist abgelaufen."
    player.AddItem gold001 100
    set step to 2
endif
end

Das farblich markierte ist für den Ablauf wichtig.
Erst einmal braucht der timer einen Wert, deswegen "set timer to 10".
Des weiteren soll der timer in diesem Script runterlaufen, sofern der Wert der Variable timer größer als 0 ist, deswegen "set timer to timer - GetSecondsPassed".

Wie dir oben auffallen könnte, ist timer nicht einfach als short deklariert, sondern als float. Das liegt daran, dass wir mit GetSecondsPassed arbeiten, diese Funktion arbeitet mit float-Werten.
Des Weiteren läuft der timer, deswegen ist es nicht so gut, einen direkten Wert über timer == X abzufragen, sondern mit Bereichseinschränkung zu arbeiten, sprich <, >, <=, >=.

Was bei dir jetzt ein kleines Problem sein könnte, ist, dass ein GameMode-Block auf Items, die im Inventar sind, nicht läuft, sondern nur auf Activators und Quests.
Du müsstest also mit einem kleinen Umweg über eine Quest arbeiten. Dazu kannst du beispielsweise eine Quest starten lassen, wenn man den Gegenstand das erst mal ausrüstet/im Inventar anklickt.

In dem Quest-Script sieht das dann etwa so aus:
Code:
scn ...

short step
float timer

begin GameMode
if (step == 0)
    set timer to 10
    set step to 1
elseif (step == 1 && timer > 0)
    set timer to timer - GetSecondsPassed
elseif (step == 1 && timer > 4 && timer < 6)
    Message "Der Timer hat die Hälfte erreicht."
elseif (step == 1 && timer <= 0)
    Message "Der Timer ist abgelaufen."
    player.AddItem gold001 100
    set step to 2
endif
end

Mit dieser Variante brauchst du dementsprechen zwei Scripts.
 
Gibt es eine Script-Befehl, der abfragt, ob der Spielercharakter ein bestimmtes Nahrungsmittel zu sich genommen hat? (Fleisch, Apfel,...)

Wie immer ist es egal ob mit oder ohne OBSE. :)