Construction Set Skriptthread zum Construction Set

Wieso kann man nicht tausend mal auf danke drücken?
Ich versteh zwar fast nichts vom Script aber es klingt gut :good:
 
Bräuchte auch etwas Hilfe.

Ich will, dass beim Tod eines Gegners ein Zauber auf den Spieler gelegt wird.
Allerdings noch einige Extrabedingungen ...

  • Das alles soll über eine Verzauberung geschehen, was etwas problematisch ist, weil der Tod ja quasi als Script-Ende gilt, oder verstehe ich das falsch.
  • der Zauber soll nur eine einzige Sekunde auf dem Player liegen.
Weiß jemand, wie ich das bewerkstelligen soll.
:bye:

Mit Begin OnDeath und dem Befehl addspell, sowie eine Wirkdauer der Verzauberung von 1 Sekunde sollte es gehen.

@ homer: Probiere es doch mal hiermit:

Code:
SCN FlammenScript

Ref myself
short activated
long xpos
long ypos
long zpos
float xrot
float yrot
float zrot

Begin OnActivate 

Set myself to getself

If Player.IsSneaking
	Flamme01.MoveTo myself 0, 0, Z-Koordinate
	Flamme01.enable
	set activated to 1
Else
	Flamme01.disable
	set activated to 0
	activate player
Endif

End

;Update flame- position and rotation
Begin GameMode
if activated == 0
	return
Else
	set xpos to myself.getpos x
	set ypos to myself.getpos y
	set zpos to myself.getpos z
	set xrot to myself.getangle x
	set yrot to myself.getangle y
	set zrot to myself.getangle z
	Flame01.setpos x, xpos
	Flame01.setpos y, ypos
	Flame01.setpos z, zpos
	Flame01.setAngle x, xrot
	Flame01.setAngle y, yrot
	Flame01.setAngle z, zrot
endif
end

@ Kahmul:
Warum benutzt du eine Variable im OnDeath Block? Der wird doch eh nur einmal ausgeführt, wenn der NPC stirbt. Ich würde es so schreiben:

Code:
SCN DeathScript

Begin OnDeath
	MoveTo <MarkerRefInDummy-Cell>
	ressurect
End

Außerdem würde beim zweiten Sterben des NPC's die Variable auf 0 gesetzt werden und somit der NPC nicht wiederbelebt.
 
Zuletzt bearbeitet:
Ich wusste nicht, ob ich eine Variable einfügen sollte. Habs dann einfach mit Variable gemacht. Aber funktionieren würde es trotzdem, weil des "ElseIf" auch ausgeführt wird, da Next vorher auf 1 gesetzt wurde. ;)
 
Ich habs jetzt nochnich ausprobiert, aber muss ich noch was anderes einfügen als die z koordinate?
und die flamme liegt ja eigentlich auf der seite wenn man sie Causm Objektfenster zieht darum muss ich drehung x noch auf -90.0000 oder 270.0000
 
Ich wusste nicht, ob ich eine Variable einfügen sollte. Habs dann einfach mit Variable gemacht. Aber funktionieren würde es trotzdem, weil des "ElseIf" auch ausgeführt wird, da Next vorher auf 1 gesetzt wurde. ;)

Nein, Next würde nicht auf 0 gesetzt werden. Begin OnDeath wird nur ein einziges mal ausgeführt. Dadurch, dass du If - Elseif benutzt, wird auch nur der If-teil beim ersten mal ausgeführt, egal, ob du Next innerhalb des Blockes auf 1 setzt.

Ich habs jetzt nochnich ausprobiert, aber muss ich noch was anderes einfügen als die z koordinate?
und die flamme liegt ja eigentlich auf der seite wenn man sie Causm Objektfenster zieht darum muss ich drehung x noch auf -90.0000 oder 270.0000

Du musst nur die Z-koordinate einfügen.
Und wegen der rotation: Dann musst du bei der Zeile, in der die xrot auf einen Wert gesetzt wird, mit -90 ergänzen:
Code:
	set xrot to myself.getangle x -90

Grüße
 
  • Like
Reaktionen: Homer
klappt immernochnich richtig.
ich kann nicht mehr als ein skript aktivieren(nur eine Flamme) und kann sie nicht durch schleichen-anklicken wieder deaktivieren

PS: ich musste flame01 in Flamme01 ändern;-)
 
Zuletzt bearbeitet:
Wie meinst du das?
Im Moment sollte der Skript bewirken, dass man beim Aktivieren wenn man schleicht eine Flamme bei der Flasche brennt und diese sich mit der Flasche mitbewegt (oder irgendein anderes Objekt). Wenn man sie dann nochmals aktiviert, wird die Flasche wieder dem Inventar hinzugefügt. Wenn ich das richtig verstanden habe, soll man sie im Schleichen das Feuer an- und ausmachen können und im Stehen wieder aufnehmen? Dann muss man es so ändern:

Code:
SCN FlammenScript

Ref myself
short activated
long xpos
long ypos
long zpos
float xrot
float yrot
float zrot

Begin OnActivate 

Set myself to getself

If (Player.IsSneaking) && (activated == 0)
	Flamme01.MoveTo myself 0, 0, Z-Koordinate
	Flamme01.enable
	set activated to 1
Elseif (Player.IsSneaking) && (activated)
	Flamme01.disable
	set activated to 0
Else
	Flamme01.disable
	set activated to 0
	activate player
Endif

End

;Update flame- position and rotation
Begin GameMode
if activated == 0
	return
Else
	set xpos to myself.getpos x
	set ypos to myself.getpos y
	set zpos to myself.getpos z
	set xrot to myself.getangle x
	set yrot to myself.getangle y
	set zrot to myself.getangle z
	Flame01.setpos x, xpos
	Flame01.setpos y, ypos
	Flame01.setpos z, zpos
	Flame01.setAngle x, xrot
	Flame01.setAngle y, yrot
	Flame01.setAngle z, zrot
endif
end
 
fast perfekt.
nur ein letztes Problem.
ich habs grad ausprobiert:

Es Liegen/Stehen 2 flaschen im raum.
ich kann aber nur eine aktivieren bei der anderen flackert es kurz auf und schluss is
 
Das liegt wohl daran, dass du nur eine Flamme hast, welche du rumschiebst.
Wenn du mehrere Objekte hast, dann musst du auch mehrere Flammen haben.

:bye:
 
Shader

Hallo,

wollte mal fragen ob es per Skript möglich ist ein EffectShader auf ein Objekt in diesen falle ein Schwert zu legen. Und nicht auf das Schwert und meinen Charakter. Will nämlich einen Flammenshader auf mein Schwert legen ohne z.B ihn Feuerschaden zu geben.

mfg
Sammael
 
Der Befehl heißt "playMagicShaderEffect" oder auch "pms".
Benutzen kannst du ihn so:
Code:
<Schwert-Ref>.pms <Schader-ID> <Dauer (wenn nicht angegeben, endlos)>
 
  • Like
Reaktionen: Sammael666
Hi, ich wüsste gerne, wie ich folgenden Script ergänzen muss, dass die Waffe, welche ich vor dem Wirken des Zaubers benutzt hatte, nach dem Verschwinden der beschworenen Waffe wieder ausgerüstet wird.

Eigentlich muss ich nur wissen, wie ich rauskriege, welche Waffe gerade ausgerüstet ist und wie man die abspeichert. Als short? Als reference?

Code:
scn 000ZaubereffektFlammenschwertZauber

short delay
short HabDich

;###################
;Zauber wird gestartet
;###################

Begin ScriptEffectStart

If (player.getitemcount 0ZauberFlammenschwert00Waffe == 0)
    player.addItem 0ZauberFlammenschwert00Waffe 1

    set HabDich to 1

Elseif (player.getitemcount 0ZauberFlammenschwert00Waffe >= 1)

    player.removeitem 0ZauberFlammenschwert00Waffe 1

    set HabDich to 0

Endif
end

;##################
;Zauber wird beendet
;##################

Begin ScriptEffectFinish

set delay to 0

end

;#########################
;Zauber wird aufrecht erhalten
;##########################

Begin ScriptEffectUpdate

If (HabDich == 1)
    If delay == 0

        set delay to 1

    Elseif delay == 1

        player.equipItem 0ZauberFlammenschwert00Waffe 1

    Else
        return
    Endif
Endif
End
 
ich würde sage als reference

ref OldWeapon

Set OldWeapon to Player.GetWeapon /
Set OldWeapon to Player.GetWeaponEquipped

oder irgendwas in der art.wahrscheinlich braucht man dafür aber OBSE...
 
Du musst eine Referenz mit dem Befehl definieren:

Code:
Player.GetEquippedObject 16
Und ja, der Befehl benötigt OBSE. ;)
 
Machs mal so:

Code:
scn 000ZaubereffektFlammenschwertZauber

short delay
Short First
short HabDich

Ref PlayerWeapon

;###################
;Zauber wird gestartet
;###################

Begin ScriptEffectStart

If (First == 0)
     If (player.getitemcount 0ZauberFlammenschwert00Waffe == 0)
         player.addItem 0ZauberFlammenschwert00Waffe 1
         Set PlayerWeapon to Player.GetEquippedObject 16

         Player.RemoveItem PlayerWeapon 1

         set HabDich to 1
         Set first to 1

     Elseif (player.getitemcount 0ZauberFlammenschwert00Waffe >= 1)

         player.removeitem 0ZauberFlammenschwert00Waffe 1
         Player.AddItem PlayerWeapon 1

         set HabDich to 0
         set First to 0
     Return
endif
Endif
end

;##################
;Zauber wird beendet
;##################

Begin ScriptEffectFinish

set delay to 0

end

;#########################
;Zauber wird aufrecht erhalten
;##########################

Begin ScriptEffectUpdate

If (HabDich == 1)
    If delay == 0

        set delay to 1

    Elseif delay == 1

        player.equipItem 0ZauberFlammenschwert00Waffe 1

    Else
        return
    Endif
Endif
End
 
Zuletzt bearbeitet:
Code:
ref weapon

Begin ScriptEffectStart

set weapon to getEquippedObject 16
...

end

Begin ScriptEffectFinish

equipItem weapon
...

end

Du brauchst in dem Skript keine Bezugsreferenz à la "player", wenn der Zauber auf dem Spieler liegt. Ein Skript-Effekt bezieht sich immer auf die Referenz, auf die er wirkt.
 
Hey. Ich habe hier einen Script und wollte fragen ob man den irgendwie abkürzen kann. NecromancerMadness und NecromancerMadnessFix sind Globals weil andere Scripts darauf zugreifen müssen. Aber isn Questscript (geht auch nicht anders) und möchte halt nicht dass der so viele fps zieht.

scn NecromancerMadnessScript

float NecromancerMadness
float NecromancerMadnessFix
float timer
float fQuestDelayTime
short MessageGotten

begin Gamemode
set fQuestDelayTime to 1
if timer >= 1
set NecromancerMadness to NecromancerMadness - 1
set timer to 0
endif
if NecromancerMadnessFix < 500
elseif NecromancerMadnessFix < 1000
If MessageGotten == 0
Messagebox "Ihr schadet eurem Verstand!"
set MessageGotten to 1
endif
elseif NecromancerMadnessFix < 2000
If MessageGotten == 1
Messagebox "Ihr beginnt euren Verstand dauerhaft zu verlieren!"
Set MessageGotten to 2
endif
elseif NecromancerMadnessFix < 4000
If MessageGotten == 2
Messagebox "Ihr seid wirklich unheilbar Geisteskrank!"
set MessageGotten to 3
endif
elseif NecromancerMadnessFix < 8000
If MessageGotten == 3
Messagebox "Ihr seid extrem Wahnsinnig!Und das von Morgens bis Abends!"
set MessageGotten to 4
endif
else
If MessageGotten == 4
Messagebox "Dauerhaft kann man garnicht Geisterskranker sein als ihr!"
Set Messagegotten to 5
Endif
endif
If NecromancerMadness < NecromancerMadnessFix
set NecromancerMadness to NecromancerMadnessFix
endif
if NecromancerMadness < 1001
return
set timer to timer + 0.1
elseif NecromancerMadness > 1001
player.addspell NecromancerSpell5s1
player.removespell NecromancerSpell5s2
message "Ihr geratet in Erregung!"
set timer to timer + 0.1
return
elseif NecromancerMadness > 2001
player.addspell NecromancerSpell5s2
player.removespell NecromancerSpell5s1
player.removespell NecromancerSpell5s3
message "Ihr beginnt Wahnsinnig zu werden!"
set timer to timer + 0.1
return
elseif NecromancerMadness > 4001
player.addspell NecromancerSpell5s3
player.removespell NecromancerSpell5s2
player.removespell NecromancerSpell5s4
message "Ihr seid ein Schlächter!"
set timer to timer + 0.1
return
elseif NecromancerMadness > 8001
player.addspell NecromancerSpell5s4
player.removespell NecromancerSpell5s3
player.removespell NecromancerSpell5s5
message "Ihr seid im moment verrückt!"
set timer to timer + 0.1
return
elseif NecromancerMadness > 16001
player.addspell NecromancerSpell5s5
player.removespell NecromancerSpell5s4
message "Ihr seid im moment absolut Wahnsinnig!"
set timer to timer + 0.1
return
elseif NecromancerMadnessFic > 8001
set NecromancerMandessFix to 8001
elseif NecromancerMadnessFix < NecromancerMadness - 16000
set NecromancerMadnessFix to NecromancerMadness - 16000
set timer to timer + 0.1
return
endif
end Gamemode
 
Ich bräuchte folgende Scripts, wenn möglich mit Erklärung was für was steht, bin ein relativer Neuling und würde das gelernte gerne weiter verwenden, bloße Scripts die ich nicht verstehe bringen mir da nichts, obwohl es in dem Fall auch seinen Zweck erfüllen würde.

1. Sobald ich durch 2 bestimmte Türen gehe, das wäre in meinem Fall die Magiergilde in Anvil, dann hätte ich gerne folgende Aktion, ein Textfenster tut sich auf, Textfenster öffnen = kein Problem, aber einen Befehl für das Überschreiten ner Grenze, was dann zu der Öffnung des Textfensters führt, kenne ich leider nicht.

2. Eher ne bloße Frage als ein Script in der Weise, wenn ich meinen Charakter durch player.moveto irgendwohin befördern will, was lege ich an die Stelle des Ortes ? nen XMarker? den ich dann dahinter setze ? player.moveto (XMarkerID) ?
 
Zu 1. Du musst einer Triggerzone (zu finden unter Statics -> Activators) eine neue ID geben und in deinem gewünschten Gebiet absetzen und dann musst du ihr noch eine Referenz zuweisen. Danach schreibst du so ein Skript und legst es auf die Triggerbox:

Code:
SCN TriggerzoneScript ; Dürfte klar sein

Short Next ; Variable

Begin OnTriggerActor Player ; Beginnt nur, wenn der Spieler durch die Triggerzone läuft.

 If (Next == 0) ; Falls die Variable auf 0 ist.
       MessageBox "Text" ; Dürfte auch klar sein
     Set Next to 1 ; Die Variable wird zu 1 gesetzt, damit dieses Skript nicht mehr durchlaufen wird.

  Endif ; Ende der If-Klammer

End ; Schluss
2. Du musst einen XMarkerHeading oder einen XMarker in der Welt platzieren und ihm eine Referenz zuweisen und dann schreibst du das:

Code:
Player.MoveTo <MarkerRef>
Übrigens steht der "Player.MoveTo"-Befehl für ein Return, also wird das Skript an dieser Stelle abgebrochen. Deswegen solltest du alle wichtigen Dinge vorher schreiben. ;)

mfg
Kahmul