Construction Set Skriptthread zum Construction Set

Code:
scn MessageBoxScriptErweitert

Short Button
Short MenuType       ;Wird beim drücken eines Buttons hochgesetzt und später abgefragt für weitere MessageBoxen
Short Exit          ;Benutze ich zum schließen des Menus

Begin OnActivate ;GameMode, OnDrop, OnAdd - Nehmt was ihr wollt
	Set Exit to 1
	Set Button to GetButtonPressed
	Set MenuType to 0
	If MenuType == 0
		MessageBox "Welche Waffe wollt ihr?", "Waffe", "Kleidung", "Nichts"
	endif
end

Begin GameMode
	If Exit
		If Button == -1              ; Sollte die MessageBox mal als erstes -1 ausgeben, manchmal funktioniert es denn nicht.
			Set Button to GetButtonPressed          ;GetButtonPressed gibt an welcher "Knopf" gedrückt wurde.
		Elseif Button == 0
			Set MenuType to 1
		Elseif Button == 1
			Set MenuType to 2
	Else           ;Sollte einer der Buttons nicht 0 oder 1 sein, wird Exit auf 0 gesetzt und die MessageBox beendet
		Set Exit to 0
		Endif
	Endif
		If MenuType == 1
			MessageBox "Welche Waffe?", "Silber", "Stahl", "Ende" ;;und so weiter
			If Button == 0
				Player.AddItem [SilberwaffenID]
			Elseif Button == 1
				Player.Additem [StahlwaffenID]
			Elseif Button > 1    ;Solltet ihr mehr Buttons haben muss die Zahl natürlich größer als 1 sein.
				Set exit to 0     ;Wieder zum schließen der MessageBox
			endif    ;Ihr könnt jetzt natürlich noch eine weitere Box machen die abfragt welche Silber/Stahlwaffe, dafür müsst ihr nur einen neuen MenuType bestimmen und diesen abfragen und da die MessageBox machen ;)
		Elseif MenuType == 2
			MessageBox "Welche Kleidung wollt ihr?", "Schöne", "Welche von Rittern", "Deine!", "Soneas ;)", "Ende"
			If Button == 0
				Player.AddItem [SchöneKleidungID]
			Elseif Button == 1
				Player.Additem [RitterkleidungID]
			Elseif Button == 2
				NpcREF.kill
				Message "Nimm sie..."
			Elseif Button == 3
				Sonea.RemoveKleidung && Addplayer ; Scherzblock^^
			Elseif Button > 3
				Set Exit to 0
			endif
	endif
end

Da is mir eins zuviel reingerutscht ;)
 
  • Like
Reaktionen: EraZeR
Ich meinte es zwar noch etwas anders und er hat das ganze nicht mit Waffen sondern mit Pflanzen und Tränken, aber probieren kann er es.
Sonst schreib ich das, wie schon gesagt, nochmal auf, wie ich das meinte.
 
  • Like
Reaktionen: EraZeR
dayspassed

Kann sich mal jemand folgenden Script anschauen? Ich finde einfach nicht herraus, wieso er nicht funktioniert.

Code:
Scriptname blabla
   
  short dayspassed
  short gamedayspassed
  short TotalCount
  short Doonce
  short Doonce1
   
  begin gamemode
   
  if ( Player.GetItemCount BlaItem == 1 ) && ( Doonce == 0 )
       SetStage BlaQuestStage 20
       set dayspassed to GameDaysPassed + 1
       set doonce to 1
  endif
   
  if ( Doonce == 1 ) && ( dayspassed <= GameDaysPassed )
       BlaRef.Disable
       Bla1Ref.Enable
       Bla2Ref.Disable
       set doonce to 2    
       SetStage BlaQuestStage 30
  Endif
   
  if ( Player.GetItemCount BlaIatem1 == 1 ) && ( Doonce1 == 0 )
       Bla3Ref.Enable
       set TotalCount to ( TotalCount + 1 )
       set Doonce1 to 1
   
  ;Ends Quest if All Bought
   
  if ( TotalCount < 2 )
       if ( TotalCount == 1 )
            setstage BlaQuestStage 35
  endif
  endif
   
  end
Und nun was er tun soll:

Nach Erhalt von BlaItem, soll 1 Tag vergehen. Anschließend die BlaRef-BlaRef2 aktivieren bzw. deaktivieren.
Außerdem soll BlaQuestStage auf die nächste Stufe gesetzt werden, in dem Fall auf 30. Dann geht's weiter...Nach Erhalt von BlaItem1 soll BlaRef3 aktiviert werden.

Soweit funktioniert alles, bis auf die Zeit. Denn nach 1 Tag passiert grad gar nichts!
 
Also erstmal tausend dank an alle die mir geholfen haben, war echt super von euch:good::good: aber ich habe mein Problem jetzt selbst gelöst:p

Das Problem war, dass das auf 0 setzen der Controlvar im GameMode-Block
geschrieben habe. Hab es jetzt in OnActivate-Block verschoben.

Und noch mal danke, das ihr mir geholfen habt
 
@Jollina:
Erstmal solltest du GetItemCount nicht mit == sondern mit >= verwenden.
Bei dem Teil mit GameDaysPassed bin ich mir nicht ganz sicher, ob der so richtig aufgebaut ist, da hab ich irgendwie eine Denkblockade:oops:
 
Versuch es doch einfach mal mit der Abfrage nach den GameDays.
Also
Code:
Set DaysPassed to GetGlobalValue GameDaysPassed

If DaysPassed < GameDaysPassed
 ;Do Stuff
endif


Edit: Versuchs so^^ (Sry, nicht nachgedacht xD)
Edit²: Ok ich seh grad du kannst es auch so lassen (Ohne GetGlobalValue):
Only available as a condition function. In scripts, you can simply use the global variable name directly:
 
Zuletzt bearbeitet:
Na wenn du mit der Variable abfragst ob Dayspassed kleiner als die Globale Variable GameDaysPassed ist, heißt es das mindestens ein tag vergangen sein muss. da in dem moment wo die Globale Variable GameDaysPassed um den Wert 1 ansteigt (Was sie ja Tut wenn ein tag vergeht) der wert von DaysPassed nicht mehr gleich sondern kleiner ist, heißt es das ein tag vergangen sein muss. Du kannst ja noch ne Abfrage einbauen ob der Wert nicht größer als um 1 gestiegen ist. (Hoffe das es verständlich erklärt ist, bin nicht sehr gut im erklären ;) )
 
Code:
Scriptname blabla
   
  short dayspassed
 [B] short gamedayspassed ; kannst du löschen[/B]
  short TotalCount
  short Doonce
  short Doonce1
   
  begin gamemode
   
  if ( Player.GetItemCount BlaItem == 1 ) && ( Doonce == 0 )
       SetStage BlaQuestStage 20
       [B]set dayspassed to GameDaysPassed[/B]
       set doonce to 1
  endif
   
  if ( Doonce == 1 ) &&[B] ( (dayspassed + 1) == GameDaysPassed )[/B]
       BlaRef.Disable
       Bla1Ref.Enable
       Bla2Ref.Disable
       set doonce to 2    
       SetStage BlaQuestStage 30
  Endif
   
  if ( Player.GetItemCount BlaIatem1 == 1 ) && ( Doonce1 == 0 )
       Bla3Ref.Enable
       set TotalCount to ( TotalCount + 1 )
       set Doonce1 to 1
   
  ;Ends Quest if All Bought
   
  if ( TotalCount < 2 )
       if ( TotalCount == 1 )
            setstage BlaQuestStage 35
  endif
  endif
   
  end

Versuch's mal so.
 
  • Like
Reaktionen: Jollina
Hallo zusammen,
ich möchte zwei Zauber scripten und mir fehlen leider die nötigen Kenntnisse dazu.:cry:

1. Ich möchte einen Zauber, der NUR Personen (aller Art) und Kreaturen (aller Art) direkt vor den Zaubernden setzt.
Scn Personenteleporter

Begin ScriptEffectStart
MoveTo player, 0, 0, 100
End
Leider setzt dieser Script auch noch andere Objekte, wie Türen, Kisten, Truhen, Fässer... vor den Zaubernden, das soll nicht passieren, also brauche ich eine If-Schleife, die den Zauber beschränkt.



2. Ich möchte einen Zauber der die Zielperson mehrere Meter in die Luft teleportiert.
Scn Gravityspell

Ref Self

Short spellFail

Begin ScriptEffectStart
if ( Player.isInInterior == 1 )
Message "Dieser Zauber kann drinnen nicht verwendet werden.", 1
Set spellFail to 1

endif

Set Self To GetSelf
MoveTo Self, 0, 0, 1500

End
Wie ihr sehen könnt habe ich Versucht (mithilfe von Midas-Scripts *SCHÄM*) den Zauber so zu beschränken, dass er in Interiors nicht verwendet werden kann, sondern nur im Freien. Ich denke, dass ich es falsch gemacht habe.
Zweitens soll der Zauber auch NUR bei Personen (aller Art) und Kreaturen (aller Art) wirken und sonst bei nichts. Also zwei If-Schleifen.
Schön wäre es noch, wenn das getroffene Ziel beim Aufschlag hinfällt, da sie jetzt nach einem Fall von ca. 50 Metern sofort weiterkämpft, was unrealistisch wirkt. Dieser Effekt ist aber nicht unbedingt nötig, da ich zweifle, dass man das nur mit scripten machen kann (mit Lähmen geht es nicht, schon ausprobiert).


Falls diese Sachen schon ausgiebig erklärt wurden, so tut es mir Leid, ich wollte keine 223 Seiten durchsuchen, ich hoffe ihr versteht.

Gruß, Lord Razor
 
Also, um abzufragen, ob das Ziel ein NPC oder eine Kreatur ist, benutzt du IsActor.

Für die Abfrage dann halt "if IsActor == 1"

Zu der Beschränkung:

Nun, so hast du nur die Hälft gemacht.
Du nach dem endif noch eine Abfrage, ob "spellFail" gleich 1 ist. Wenn nicht, soll der Zauber ja wirken.

Ergänzt wäre das so:
Code:
Scn Gravityspell

Ref Self

Begin ScriptEffectStart
Set Self to GetSelf
if ( Player.isInInterior == 1 ) 
  Message "Dieser Zauber kann drinnen nicht verwendet werden."
elseif (player.IsInInterior == 0) && (self.IsActor == 1)
  MoveTo Self, 0, 0, 1500
endif
End
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Lord Razor
Also müsste der erste Zauber so aussehen.
Scn Personenteleporter

Begin ScriptEffectStart
If IsActor==1
endif
MoveTo player, 0, 0, 100

End

Muss alles, dass nach "If" steht immer in Klammern stehen??
 
Hi,

Ich brauche ein Script:
Beim Aktivieren eines Activators soll das Static xyz sich auf der z-Achse nach oben bewegen.
Beim erneuten Drücken des Activators soll sich xyz wieder die gleiche Strecke runter bewegen.

Danke im Voraus.
 
Ich bin mir nicht sicher ob das überhaupt geht, mit der Achse.

Du könntest es mit disable und enable versuchen.
Dann verschwindet das Objekt.

Code:
scn ScriptName

short busy
short stage
float timer
ref mySelf
ref myParent

begin onActivate

	set mySelf to getSelf
	set myParent to getParentRef

	if busy == 0 && stage == 0
		set stage to 1
		set busy to 1
		playgroup forward 1
		set timer to 4
                player.Setstage [Quest] [QuestStageID] ; Die QuestStage die die StaticRef disable macht.
	endif

end

begin gameMode

	if stage == 1 && timer <= 3
		set mySelf to getSelf
		set myParent to getParentRef
		myParent.activate mySelf 1
		set stage to 2
	endif

	if (isAnimPlaying == 0) && stage == 2 && timer <= 2
		playgroup backward 0
		set stage to 3		
	endif

	if (isAnimPlaying == 0) && stage == 3 && timer <= 0
		set busy to 0
		set stage to 0
	endif

	if timer > 0
		set timer to timer - getSecondsPassed
	endif

end

begin onReset

	reset3DState
	set stage to 0
	set busy to 0
        player.Setstage [Quest] [QuestStageID] ; Nun dann die Queststage die die StaticRef wieder enable macht

end

Du musst eine Quest erstellen und dort unter Quest Stages unter "ResultScript" StaticRef.disable (für Reset eine QuestStage mit StaticRef.enable). Also im Index eine neue QuestStage erstellen.

Versuche dein Glück mal damit :)

Mfg Master of Worlds
 
Zuletzt bearbeitet:
Die Quest kannst du ja im unsichtbaren laufen lassen. Sie läuft ist aber keine Richtige Quest.

Der Spieler selbst muss davon nichts mitbekommen, es wäre außerdem nicht anders möglich ein Objekt disable oder enable zu machen.(ist mir jedenfalls nicht bekannt)


Mfg Master of Worlds