Construction Set Skriptthread zum Construction Set

Eine andere (und aufwendigere) Möglichkeit wären die Event-Handler-Funktionen von OBSE. Da müsste man sich dann aber auch erstmal etwas einlesen...
 
Gute Nacht. :D

Ist es möglich das bei einem level up (nach dem schlafen) kein levelup Menü erscheint?

Ich arbeite nämlich grad an etwas grösserem, und dafür wäre es sehr praktisch wenn man seine Attribute nicht über das levelup menü erhöhen kann!


EDIT: Die Sache oben hat sich erledigt.

Aber...(ja ich weiß hässliches wort) :lol: Ich habe jetzt ein mod selbst kreiert indem der char beim laufen Ausdauer verliert.
Doch leider passiert ja nichts weiter wenn die Ausdauer auf Null fehlt.

Kann mir bitte einer einen script geben der dafür sorgt das:
Der char automatisch anfängt zu Gehen sobald die Ausdauer auf Null fällt.
Und er erst wieder Laufen kann sobald 50% der Ausdauer wieder regeneriert sind.

In Voller Hoffnung:
Lightknight
 
Zuletzt bearbeitet:
Sorry für Doppelpost.

Ich hab versucht denn script (Oberer Editierter Beitrag) weitesgehend selbst zu schreiben.
Leider will er nich so wie ich will! :mad:

Code:
scn FatigueRunning


short FatigueEmpty

if (FatigueEmpty == 0) && (Player.GetFatiguePercentage == 0.1)
    set FatigueEmpty to 1

if (FatigueEmpty == 1) && (Player.IsRunning == 1)
    GetIdleDoneOnce knockdown

if (FatigueEmpty == 1) && (Player.IsIdlePlaying == 1)
    set FatigueEmpty to 0

endif
endif
endif

end

Hoffe einer kann mir helfen. :(
 
Bei deinem Skript fehlt zu allerst ein Block. Du hast kein "begin" deklariert, endest aber mit einem "end". Ich weiß nicht, ob dein Code nur ein Auszug aus einem Skript ist, ich erwähne es aber trotzdem mal.
Werte im Dezimalbereich niemals mit einem Gleichheitszeichen abfragen. Die Chance, dass der Wert genau dem verglichenem entspricht, is praktisch null. Arbeite immer mit Wertebereichen, also "<", ">", "<=" oder ">=".
Die Einschränkung des Rennens ist nur mit OBSE möglich. Du musst mit einem dauernd laufenden GameMode-Questskript den Wert der Ausdauer abfragen und dementsprechend auf Gehen umstellen und die Funktion der Rennens deaktivieren und dementsprechend reaktivieren, wenn die Ausdauer wieder bei 50% ist. So in der Art sollte es aussehen:


Code:
SCN FatigueQuestScript

float fQuestDelayTime
Short keyChanged

begin gameMode

if(fQuestDelayTime != 0.01)
    set fQuestDelayTime to 0.01
endif

float fP
set fP to player.getFatiguePercentage

float runKey
set runKey to getControl 10

float runKeyA
set runKeyA to getControl 11

if(fP < 0.01)
    if(player.isRunning)
        if!(isKeypressed3 runKey)
            tapkey runKeyA
        endif
    endif
    disablekey runKey
    disablekey runKeyA
    set keyChanged to 1

elseif(fP >= 0.5)
    if(keyChanged)
        enablekey runkey
        enablekey runkeyA
        set keyChanged to 0
    endif
endif

end
 
  • Like
Reaktionen: Lightknight
Vielen Dank Kahmul

Doch leider funzt der nich. (und nebenbei hast du in Line 23 einen Syntax fehler, du hast ein "!" nach dem "if" ;) )

Ok das mit dem begin block hab ich voll vermasselt! :headwall:
Als ich selber merkte das das mit dem gehen ziemlich schwierig wird hab ich das ganze dann ja auch geändert.
Wie dir garantiert aufgefallen ist hab ich dann auch versucht statt des gehens denn spieler auf die schn..... fliegen zu lassen.

Da dein script ja jetz leider auch net funkt hatte ich noch eine Alternative Idee.
Ich habs nochmal mit dem "auf die schn... fliegen" versucht.

Folgendes:

Ich habe ein neues Item erstellt
Und anschliessend unter Idle Anims eine neue "Sister" erstellt mit der Deathidle..kf mit der Bedingung GetIsItemUse, und dann mein neues Item angegeben!
Jetzt wollte ich einen questscript schreiben nur weiss ich grad nich mehr wie der befehl dafür lautete dem char das Item zu geben OHNE das das im spiel angezeigt wird.

Code:
scn FatigueRunningScript

flaot fQuestDelayTime
flaot fP

begin GameMode

if (fQuestDelayTime != 0.01)
    set fQuestDelayTime to 0.01
endif

set fP to Player.GetFatiguePercentage

if (fP <= 0.1) && (Player.IsRunning == 1)
    Spieler bekommt das Item
    Activate Item
    Item wird wieder entfernt
else
    Return
endif

end

Dann eine Quest erstellen. Dabei drauf geachtet das >Start on begin< (ohne so ähnlich) angehackelt ist.
Und meinen script zuweisen.
Und Priorität höher setzen.

Würde das dann so hinhauen?
Oder irgenteine Idee weshalb das script mit dem gehen nicht klappt?
 
Das war kein Syntax-Fehler. Ich weiß nicht, ob du mit OBSE kompiliert hast, aber ein "!" lässt die Expression zum Gegenteil evaluieren, wäre in diesem Fall also dasselbe wie "if(iskeypressed3 runKey == false)". Es sollte keinen Unterschied machen, ob das "!" vor oder nach der Klammer ist.
Außerdem solltest du mehr Infos liefern als "funktioniert nicht". Wie soll man dir da helfen, das so zu machen, wie du dir das vorstellst, wenn du nicht sagst, was funktioniert, und was nicht. Aber da du sowieso deine Pläne geändert hast, hat sich das ja jetzt erledigt.

Ich habe nicht viel Ahnung von Idles, sollte aber theoretisch funktionieren, wenn GetIsItemUse bei "equipItem" anspricht. Würde es einfach so machen:

Code:
short equipped

if(equipped)
    set equipped to 0
    player.unequipItem <Item>, 1
    player.removeItem <Item>, 1
endif

if (fP <= 0.1) && (Player.IsRunning == 1)
    player.addItem <item>, 1
    if(player.getItemCount <item> > 0) ; sicherstellen, dass das Item wirklich hinzugefügt wurde, s. CS-Wiki Seite von equipItem
        player.equipItem <Item>, 1
        set equipped to 1 ; sicherheitshalber ein paar Frames für die Idles lassen 
    endif
else
    return
endif
 
  • Like
Reaktionen: Lightknight
Hi Kahmul

Außerdem solltest du mehr Infos liefern als "funktioniert nicht". Wie soll man dir da helfen,....
Das CS spuckte beim speichern 2 Fehlermeldungen aus.
Zuerst: "Invalid Begin / End block structure on line 31". Und anschliessend: "line 23 Expression Error: SYNTAX".
Daraufhin hab ich das "!" gelöscht weil es mir auch seltsam vorkamm. (bin ja noch anfänger im scripten)
Daraufhin speicherte er ohne zu meckern.

Als ich das dann im spiel versuchte, passierte einfach nichts! Die Ausdauer sank auf Null und es geschah.....Nichts.

Nachdem ich dann nochmal auf der OBSE seite nachgelesen habe, viel mir auf das man in so einem fall wie mit deinem "!" am anfang begin _gameMode schreiben muss.
Habs auch gleich versucht. Was leider auch nicht half. Die erste Fehlermeldung war die selbe wie zuvor, die 2 fehlermeldung war dann allerdings eine andere:
"line 23: Mismatched Brackets" :huh:

....aber ein "!" lässt die Expression zum Gegenteil evaluieren, wäre in diesem Fall also dasselbe wie "if(iskeypressed3 runKey == false)"....
:idea: Nachdem ich diese aussage von dir lass hatte ich die Idee einfach das "!" gegen "== 0" auszutauschen!
Und.... Es Funktioniert!

Für denn anderen Script möchte ich mich aber auch noch bedanken, probiert habe ich in noch nicht allerdings sehe ich jetzt schon das er nicht ganz so funktionieren würde wie ich es gerne hätte.

....das Item zu geben OHNE das das im spiel angezeigt wird.
Durch die Befehle additm, equipitem und removeitem wird es im spiel dann leider angezeigt:
"xxx wurde dem Inventar hinzugefügt!", "xxx wurde ausgerüstet!", "xxx wurde aus dem Inventar Entfernt!" (message-spam)
Nachdem ich auch diesbezüglich noch mal nachgelesen habe müsste ich das über die Befehle PlaceAtMe, Activate und RemoveMe machen,
was allerdings zu einer ganzen reihe von problemen führen kann.

Aber wie oben eben gesagt dein Script von voher (Mit dem Gehen) klappt jetzt reibungslos!
Tausend dank für deine hilfe und Geduld mit mir! :hail:
 
Es gibt in OBSE auch spezielle Funktionen, die die Spamausgabe verhindern: "addItemNS", "equipItemNS", usw. Alternativ könntest du auch einfach direkt davor zweimal "message " "" (also mit leeren Textfeld) aufrufen.
 
  • Like
Reaktionen: Lightknight
Wieso machst Du dir das so kompliziert mit der Animation? Erstelle im Skript die Questvariable Fallen, oder was auch immer und gib der Idle die Bedingung GetScriptVariable Fallen == 1. Nun setz im Skript an passender Stelle Fallen auf 1 und feuere ein Player.PickIdle hinterher. Danach natürlich wieder zurück auf 0 setzen, damit das Idle bis zum nächsten Sturz inaktiv bleibt.

Alternativ ginge das auch mit einem simplen Krankheitszauber - ganz ohne Animation. Einfach einen Ausdauer-Malus mit einen negativen Wert, -2000 oder so, erstellen. Dann eben per Skript Player.AddSpell und nach ein paar Sekunden den wieder mit Player.RemoveSpell wegnehmen. Vom Prinzip her passiert da genau das Selbe wie bei der DeathIdle. Diese Idle hat keinerlei Animationsdaten und dient wohl nur dazu, die Physik einzuschalten.
 
  • Like
Reaktionen: Lightknight
Gibt es eine Möglichkeit zu überprüfen, ob der Spieler einen Flammen-, Eis- oder Sturmatronach beschworen hat. Ich will eine Prüfung machen, bei der der Spieler alle drei Atronachentypen beschwören muss, um zu bestehen.
 
Du könntest einen individuellen Beschwörungszauber für jeden Atronachen anhand dieses Tutorials erstellen und unter "Begin ScriptEffectFinish" eine neu erstellte globale Variable (mit dem Wert 0) auf einen bestimmten Wert setzen (z. B. "set SummonAtronachFire to 1" für den Flammen-Atronach). Und beim Prüfungskript fügst du dann die neuen Bedingungen hinzu ("if SummonAtronachFire >= 1"; größer gleich 1 für den Fall, dass der Spieler den Beschwörungszauber aus Versehen mehr als einmal zaubert und die Bedingung trotzdem erfüllt wird).
 
Es geht nicht darum, neue Zauber zu erstellen.
Ich will einfach nur abfragen, ob der Spieler in einer Cell (hier mal BeschwörungsZelle genannt) vor seinem Prüfer die drei Vanilla-MagicEffects von FireAtronach, FrostAtronach und StormAtronach ausführt. Es gibt ja dank Zaubererstellungsaltären die Möglichkeit mehrere Zauber mit eigenen Kombinationen zu erstellen, aber die grundlegenden Effekte bleiben ja drin. Ich wollte es zunächst über HasMagicEffect probieren wie ich es schon bei Abfragen über Blitzschild/Feuerschild gemacht habe, aber das funktioniet wohl nicht. :(
 
OBSE/Kein OBSE? Wenn OBSE, kannst du getFirstRef/NextRef verwenden. Wäre die Methode, die ich nehmen würde, da HasMagicEffect anscheinend nicht geht. Habe gerade einige Zeit in den Dokumentation geschaut, aber leider keine Funktion gefunden, mit der man den aktuell ausgewählten Zauber bekommen kann. Wenn du so etwas findest, eventuell ein Skript auf einem Activator im Raum, das abfrägt, ob der Spieler gerade zaubert und welchen Zauber er gerade ausgewählt hat und über dessen Effekte iterieren. GetFirstRef/NextRef wäre aber trotzdem noch leichter.

EDIT: GetFollowers ist auch eine gute Idee. Letztendlich fast dasselbe wie GetFirstref/NextRef, aber wahrscheinlich besser.
 
Hallo alle zusammen,

Ich schreibe gerade an einem Script und suche eine Möglichkeit, einen Script, oder den Teil eines Scriptes, starten zu lassen, sobald eine Info im Dialogmenü BEENDET wurde. Die Info ist nicht festgelegt, es kann jede x-beliebige sein, deshalb kann man zumindest nicht ohne weiteres getsecondspassed nehmen.

Irgendeine Idee?
 
Setz doch im Result des Topics einfach eine Variable deines Skripts hoch. Wie wenn man von Skript-A, eine Ausführung in Skript-B starten will.
 
Das geht leider nicht, weil der Script dann schon während das Topic gesprochen wird läuft. Er darf erst danach laufen und muss ziemlich genau danach starten.
 
Ich habe zwar keine große Ahnung mehr von Dialogen, aber deinen Schilderungen nach scheint es ja nicht ohne einen Timer zu gehen. Wenn das Topic nicht einfach irgendeines ist, sondern es von dir definiert ist und du auf das Resultskript zugreifen kannst, kannst du es doch so machen:

Code:
SCN timerScript

Short run
Float timer

Begin GameMode

if(run)
    set timer to timer - getsecondspassed
    if(timer <= 0)
        set run to 0
        ; mache etwas
    endif
endif

End

Resultskript:

Code:
set timerScript.timer to x
set timerScript.run to 1
 
  • Like
Reaktionen: Unbekannter