Construction Set Der Scriptthread

@Hoch Ordinator: Du müsstest schon die genaueren Umstände erklären. Wie z.B. soll es ausgelöst werden? Durch ein Dialog? Durch einen Tagebucheintrag?

^^


Pagan
 
Der Spieler hat ein Dialog mit NPC 1, er wählt eine Antwort aus (Choice "Mitkommen" 1).
Dann folgen NPC 1, 2, 3 und 4 dem Spieler, bis er den Tagebucheintrag XY 5 bekommt.
 
Hm, na gut, ich hatte gehofft einer der Superscripter würde sich dafür melden, weil sich bei mir oft kleine Fehler einschleichen, aber ich versuche mal was Brauchbares auf die Reihe zu bekommen, könnte aber noch ein wenig dauern. :)


Pagan
 
Ich bräuchte ein Script das für ein Objekt das man erst aufnehmen kann wenn man den Stärke Skill auf 90 hat! Geht sowas? Wenn ja wäre es sehr nett wenn mir das jemand schreiben würde :)

Danke im voraus
 
@Hoch Ordinator:

Also, zuerst musst du unter "Gameplay/Globals..." eine neue globale Variable erstellen. Am besten nennst du sie so wie ich sie für die Scripts genannt habe. ^^

folgebefehl

Dann musst du in das Result Fenster im Dialogmenü bei der Antwort Mitkommen reinschreiben:

set folgebefehl to 1

Dann musst das folgende Script einfach jeweils auf den passenden NPC anpassen:

Code:
Begin folgebefehl_script 

if ( menumode = 1 ) 
return 
endif 

if ( folgebefehl = 1 ) 
if ( GetJournalIndex "JournalID" != Index des Journaleintrages ) 
NPC ID -> AIFollow, Player, 0, 0, 0, 0 
endif 
endif 

elseif ( GetJournalIndex = Index des Journaleintrages ) 
AI Wander, 0, 0, 0, 0 
endif 

end

Ist wahrscheinlich ein wenig umständlich, ein guter Scripter würde das wahrscheinlich einfacher machen, aber ich komm irgendwie auf nichts anderes. ^^'

Probiers aber erst Mal aus, ich weiß nicht obs klappt.


@Skuzzlebut:

Das Script müsstest du auf das Objekt legen.

Code:
Begin stärkeprobe_script 

if ( menumode = 1 ) 
return 
endif 

if ( Player-> GetStrength < 90 ) 
return 
endif  

end

Müsste, denke ich, eigentlich so klappen. :)


Pagan
 
  • Like
Reaktionen: Skuzzlebutt
@Skuzzlebut: Kein Problem :) , dann muss das Script so aussehen:

Code:
Begin stärkeprobe_script 

if ( menumode = 1 ) 
return 
endif 

if ( Player-> GetStrength < 90 ) 
MessageBox, "Text"
return 
endif  

end

endif
 
  • Like
Reaktionen: Skuzzlebutt
@Hoch Ordinator:

Also, zuerst musst du unter "Gameplay/Globals..." eine neue globale Variable erstellen. Am besten nennst du sie so wie ich sie für die Scripts genannt habe. ^^

folgebefehl

Dann musst du in das Result Fenster im Dialogmenü bei der Antwort Mitkommen reinschreiben:

set folgebefehl to 1

Dann musst das folgende Script einfach jeweils auf den passenden NPC anpassen:

Code:
Begin folgebefehl_script 

if ( menumode = 1 ) 
return 
endif 

if ( folgebefehl = 1 ) 
if ( GetJournalIndex "JournalID" != Index des Journaleintrages ) 
NPC ID -> AIFollow, Player, 0, 0, 0, 0 
endif 
endif 

elseif ( GetJournalIndex = Index des Journaleintrages ) 
AI Wander, 0, 0, 0, 0 
endif 

end

Ist wahrscheinlich ein wenig umständlich, ein guter Scripter würde das wahrscheinlich einfacher machen, aber ich komm irgendwie auf nichts anderes. ^^'

Probiers aber erst Mal aus, ich weiß nicht obs klappt.

...was das Script angeht... 'ne Global? Wofür in aller Welt das? Geht zwar auch, ist unnötig. OK, mal kurz ausholen:

Wir haben hier eine Gruppe NPCs, die dem Spieler folgen sollen. Soweit so gut, das ist einfach. Das machen wir über AI und einen einfachen Dialog. Zunächst nehmen wir uns unsere vier NPCs mal vor. Einer von denen (NPC1) scheint ja wohl der Anführer der Truppe zu sein. So, da das so ist, nehmen wir die drei anderen NPCs und packen bei denen im Construction Set ein simples AIFollow oder AIEscort in ihre AIParameter und verweisen darin auf ihren Chef. Das hat schon mal zur Folge, dass die drei ihrem Boss folgen werden. Wir müssen uns also nur noch darum kümmern, dass der Boss dem Spieler folgt. Und das geht ebenso simpel... über die AI und einen einfachen Dialog:

Im Result des Dialogs mit NPC1 kommt der AI-Follow-Befehl und schwupp hast du einen Trupp Minions am Hacken. Wenn man es anders lösen wollte, könnte man auch, sofern die vier NPCs alle UniqueIDs haben, allen vieren über das gleiche Dialogresult ein AIFollow oder AIEscort zuweisen.

Nun der Clou, das Script wird richtig simpel:

Code:
Begin folgebefehl_script 
short doonce

if ( menumode = 1 ) 
 return 
endif 
IF ( doonce == 1 )
 return
EndIF

IF ( (GetJournalIndex [JOURNALID]) >= [IndexNo] ) 
 AIWander, 0, 0, 0, 0
 set doonce to 1
EndIF

end
Sobald der JournalEintrag gesetzt wird, stehen die vier NPCs auf denen das Script liegt nur noch dumm rum. Könnte man etwas feintunen, aber es funktioniert.

Kleiner Tip, Pagan... du solltest IMMER eine doonce Condition beim Setzen von AI-Parametern machen. Außerdem braucht dein GetJournalIndex ein Journal, das abgefragt werden soll und das elseif am Ende da wird dein Script buggen, da du das auslösende IF Block vorher mit EndIF dicht gemacht hast.... abgesehen davon würde der NPC nicht aufhören, dem Spieler zu folgen, aber das nur ganz am Rande :-D
 
  • Like
Reaktionen: Pagan
Ok, ich sehe, ich denke viel zu kompliziert und muss noch einiges lernen. Auf jeden Fall auch ein Danke von von mir. :)

Pagan

EDIT: Gut, das mit der JournalID hab ich vergessen. ^_^
 
Zuletzt bearbeitet:
Also, ich hab jetzt gestern Abend 2 Stunden an diesem Script rumgearbeitet und es will einfach nicht funktionieren, ich hoffe einer von euch kann mir helfen.

Worum geht es:

Um ein Teleportsystem. Der Spieler aktiviert einen Gegenstand. Daraufhin ploppt eine MessageBox mit Multiple Choice Antowrtmöglichkeiten auf. Je nachdem welche der Antworten er wählt, wird er an den gleichnamigen Platz teleportiert.
Der Activator ist mehrmals in der Zelle vorhanden. Um genau zu sein, an jedem Platz zu dem man sich hinteleportieren kann einmal. Das ganze ist in einer Interiorcell. Warum dann ein Teleportsystem? Weil die Wege darin unheimlich lang sind, da will ich dem Spieler nicht zumuten alles immer und immer wieder laufen zu müssen (natürlich muss der Spieler, bevor er das System benutzen kann, eine Quest lösen).

Hier mein Scriptversuch:

Code:
Begin teleportseltort_script 

short button
short status


if ( OnActivate = 1 ) 
if ( teleporthelfer = 1 )
  MessageBox, "Wohin wollt ihr reisen?", "Garten", "Warenhandel", "Taverne", "Haus" 
  set status to 1  
endif

if ( status = 1 )
set button to GetButtonPressed 

 if ( button = -1 ) 
   return 
  endif 

 elseif ( button = 0 ) 
   Player-> PositionCell, 4246, 10669, 9614, 90, "Seltsamer Ort"
   set status to 0
  endif 

 elseif ( button = 1 ) 
   Player -> PositionCell -11007, 3272, 10335, 90, "Seltsamer Ort"
   set status to 0
  endif 

 elseif ( button = 2 ) 
   Player -> PositionCell 14993, 870, 9613, 180, "Seltsamer Ort"
   set status to 0
  endif 

 elseif ( button = 3 ) 
   Player -> PositionCell -26192, -782, 10017, 135, "Seltsamer Ort"
   set status to 0
  endif 


end

Die Variable teleporthelfer ist die Globale die später das Teleportieren, nach abschluss der Quests, ermöglicht.

Fehler die im Spiel auftreten: Wenn ich die Interiorzelle lade in der sich der Activator befindet, dann wird der Spieler automatisch an die erste Teleportstelle ("Garten") gesetzt. Und das immer und immer wieder, d.h. ich kann mich auch nicht von der Stelle bewegen. Und umgucken geht auch nur ganz kurz, dann ist man wieder in der Teleportposition.

Aus testzwecken hatte ich natürlich bei mir die Abfrage der Globale teleporthelfer auf 0 gesetzt, und einmal sogar weggelassen.

Die Funktion

Code:
if ( menumode = 1 ) 
return 
endif

funktioniert in der Zelle übrigens auch nicht, da stürtzt Morrowind dann ab.

EDIT: Ne, diese Abfrage funktioniert doch, nur nicht bei Türen, d.h. wenn ich ein Script mache, was auf einer Tür liegt, und darin ist diese Funktion enthalten, stürzt Morrowind ab.

Und wenn ich ne Abfrage davor setze:

Code:
if ( status = 1 )
return 
endif

kann ich den Activator nicht aktivieren (was ja klar ist, wollte das aber hier nur gesagt haben).


Bin dankbar für jede Hilfe.

Pagan
 
Zuletzt bearbeitet:
Viel zu lernen du noch hast, mein junger Padawan... :D

Ohweh... also das Script da ist gruselig und dass es nur Mist macht, ist kein Wunder. Hier ein Script von mir, das sollte eigentlich funktionieren, auch wenn ich es aus dem Kopf und ganz ohne Construction Set gecoded habe:

Code:
Begin teleportseltort_script 
short button
short status

IF ( OnActivate = 1 )
 IF ( Status != 0 )
  Return
 EndIF
 set Status to 1
 Return
EndIF

IF ( Status == 0 )
 return
EndIF

IF ( teleporthelfer = 0 )
 MessageBox "Vielleicht kann man dieses Gerät später benutzen..."
 set Status to 0
 return
EndIF

IF ( Status == 1 )
 MessageBox, "Wohin wollt ihr reisen?" "Garten" "Warenhandel" "Taverne" "Haus"
 set Status to 2
EndIF

Set button to GetButtonPressed 

IF ( button = -1 )
 return 
EndIF

IF     ( button = 0 )
 Player->PositionCell, 4246, 10669, 9614, 90, "Seltsamer Ort"
ElseIF ( button = 1 ) 
 Player->PositionCell -11007, 3272, 10335, 90, "Seltsamer Ort"
ElseIF ( button = 2 ) 
 Player->PositionCell 14993, 870, 9613, 180, "Seltsamer Ort"
ElseIF ( button = 3 )
 Player->PositionCell -26192, -782, 10017, 135, "Seltsamer Ort"
EndIF

set Status to 0

end
Viel Spaß damit... :)
 
  • Like
Reaktionen: Pagan
Habe mal wieder ein Script Problem und zwar folgendes:

Wenn der Spieler eine Höhle betritt, sollen alle seine Aktionen einfrieren, sprich, er soll sich nur noch umgucken können und sonst nichts mehr. Dann soll eine Nachricht kommen und ihm die Lage erklären. Gleich darauf soll der Spieler dann sterben. Das Problem, das ich habe ist folgendes: Sobald der Spieler die Höhle betritt, soll er eingefroren sein, aber nicht sofort, sondern erst nach 3 Sekunden sterben.
Habe das hier schonmal so ausprobiert:


PHP:
Begin _sky_Einsturz_01

short controlvar
float timer

If ( controlvar == 0 )

	If (GetDistance, Player < 256 )

DisablePlayerControls
DisablePlayerFighting
DisablePlayerJumping
DisablePlayerMagic 
DisablePlayerViewSwitch
DisableTeleporting
DisableVanityMode

set timer to 0

MessageBox, "Die Höhle scheint einzustürtzen. Es gibt keine Möglichkeit zu entkommen."

set timer to timer + GetSecondsPassed

endif
	endif


If ( timer <= 2 )

player -> SetHealth 0

set controlvar to 1

endif
	

End
 
Habe mal wieder ein Script Problem und zwar folgendes:

Wenn der Spieler eine Höhle betritt, sollen alle seine Aktionen einfrieren, sprich, er soll sich nur noch umgucken können und sonst nichts mehr. Dann soll eine Nachricht kommen und ihm die Lage erklären. Gleich darauf soll der Spieler dann sterben. Das Problem, das ich habe ist folgendes: Sobald der Spieler die Höhle betritt, soll er eingefroren sein, aber nicht sofort, sondern erst nach 3 Sekunden sterben.
Habe das hier schonmal so ausprobiert:
Und lass mich raten, der Spieler ist sofort verreckt? :lol:

Das wundert mich nicht, das Script steht sich selbst im Weg ;)

Mach es so:

Code:
Begin _sky_Einsturz_01
short controlvar
float timer

If (GetDistance, Player > 256 )
;ich nehm an, das ist die Distanz zu einem Activator, auf dem das Script liegt.
 return
EndIF

If ( controlvar == 0 )
 DisablePlayerControls
 DisablePlayerFighting
 DisablePlayerJumping
 DisablePlayerMagic 
 DisablePlayerViewSwitch
 DisableTeleporting
 DisableVanityMode
 set timer to 0
 set controlvar to 1
 MessageBox, "Die Höhle stürzt ein. Es gibt keine Möglichkeit zu entkommen."
EndIF

set timer to timer + GetSecondsPassed
If ( timer <= 3 )
 return
EndIF

player -> SetHealth 0 ;yeah, kill the player

End
 
  • Like
Reaktionen: 1 Person
Hallo :)

Ich brauche ein Lift Script. Der Lift soll mit einen Activator Hoch und bei erneuter Betätigung wieder herrunter fahren. Die Koordinaten habe ich nicht aber da am besten einfach "xxx" rein :lol:ich brauche halt mehrere Lifte :-D
 
Code:
begin VV_script

short state

if ( state == 0 )
if (GetPCSleep == 1 )
if (GameHour >= 20 )
if (PCVampire == 0 )
set state to 1
elseif ( PCVampire = -1 )
set state to 2
endif
elseif ( GameHour < 8 )
if ( PCVampire == 0 )
set state to 1
elseif ( PCVampire == -1 )
set state to 2
endif
endif
endif
endif

if ( state == 1 )
if ( Random100 < 15 )
if ( Random100 < 5 )
Player-> AddSpell "vampire blood aundae"
elseif ( Random100 < 10 )
Player-> AddSpell "vampire blood berne"
else 
Player-> AddSpell "vampire blood quarra"
endif
endif
set state to 4
else
set state to 3
endif
endif

if ( state == 2 )
if ( Random100 < 15 )
if ( GetPCSleep == 0 ) 
MessageBox "Ihr wurdet in der Nacht von einem Vampir gebissen!"
set state to 0
endif
endif
endif

if ( state == 3 )
if ( GetPCSleep == 0 )
set state to 0
endif
endif

if (state = 4 )
if ( GetPCSleep == 0 )
MessageBox "Ihr wurdet in der Nacht von einem Vampir gebissen!"
set state to 0
endif
endif
end
Also, erstmal vielen Dank an Killfetzer, der dieses Script zu 99,9% erstellt hat.
Aber dieses Script hat allem Anschein nach einen Defekt - es sollte, nachdem der PC aufwacht und einen der Spells bekommen hat, einen Messagebox zeigen, aber diese kommt partout nicht. :S
Wo ist der Fehler?
 
Also, erstmal vielen Dank an Killfetzer, der dieses Script zu 99,9% erstellt hat.
Aber dieses Script hat allem Anschein nach einen Defekt - es sollte, nachdem der PC aufwacht und einen der Spells bekommen hat, einen Messagebox zeigen, aber diese kommt partout nicht. :S
Wo ist der Fehler?
Keine Ahnung :-D aber mir fällt auf, dass dieses Script drei Dinge nicht behandelt:

1. Werwolf / Lykanthropie?
2. Der Spieler könnte theoretisch mehrfach gebissen werden und alle drei Blood Diseases nacheinander kriegen
3. Random100 kann man SO nicht nutzen, das funktioniert frameübergreifend nicht sauber, da es pro Frame neu berechnet wird und das Script arbeitet nicht komplett in einem Frame.

Ich habe mal ein Script aus dem Kopf erstellt, das diese drei Dinge beachtet. Probiere es aus, ich habe z.Zt. kein Morrowind, da ich unterwegs bin und auf meinem Läppi keine Spiele installiert sind:

Code:
begin VV_script

short state
short Bite

IF ( menumode == 1 )
 return
EndIF

IF ( State > 2 )
 IF (GetPCSleep == 0 )
  IF ( state < 10 )
   MessageBox "Ihr wurdet in der Nacht von einem Vampir gebissen!"
  EndIF
  set state to 0
  set Bite to 0
 EndIF
 return
EndIF

IF ( state == 0 )
 IF (GetPCSleep == 0 )
  Return
 EndIF
 IF (GameHour >= 20 )
  set state to 1
 ElseIF ( GameHour < 8 )
  set state to 1
 EndIF
 Return
EndIF

IF ( State == 1 )
 set Bite to Random100
 IF ( Bite > 14 )
  set state to 10
 Else
  set state to 2
 EndIF
 Return
EndIF

IF ( state == 2 )

 IF ( PCVampire > 0 ) ;don't bite vampires
  set state to 10
 EndIF
 IF ( PCWerewolf == 1 ) ;prevent very BAAAAD Things ;-)
  set state to 10
 EndIF
 IF (PCVampire == -1 ) ;handles vampirism immunity
  set state to 3
 EndIF

 ;if one of this diseases is active, do nothing:
 set state to ( state + ( player->GetSpell "werewolf blood" ) )
 set state to ( state + ( player->GetSpell "vampire blood aundae" ) )
 set state to ( state + ( player->GetSpell "vampire blood berne" ) )
 set state to ( state + ( player->GetSpell "vampire blood quarra" ) )
  
 IF ( state > 2 ) ; no re-infection for infected/immune chars
  Return
 EndIF

EndIF

set state to 5

IF ( Bite < 5 )
 Player->AddSpell "vampire blood aundae"
 Return
ElseIF ( Bite > 9 )
 Player->AddSpell "vampire blood berne"
 Return
End

Player->AddSpell "vampire blood quarra"

End
 
Ich wollte es möglichst so haben, dass man dafür kein Bloodmoon braucht (ich habs gern, wenn ein PI so wenig Abhängigkeiten hat wie möglich ;))
Davon abgesehen sind wir das alte Script nochmal durchgegangen und es funktioniert nun, wie es sollte (die Sache mit den Werwölfen hab ich bewusst außen vor gelassen... ich mein, der einzige der das Script benutzt bin ich, und wenn ich es nimmer will schalte ich es eben ab ;))

Aber danke, ich probiere es gleich mit der GOTY aus. Das Ergebnis editier ich dann hier rein.

EDIT: Okay, beim Abspeichern im CS hat es einen Fehler produziert... "Miss matched if/else/endif starting on line 72." o_O
 
Zuletzt bearbeitet:
EDIT: Okay, beim Abspeichern im CS hat es einen Fehler produziert... "Miss matched if/else/endif starting on line 72." o_O
Tjo, das passiert, wenn man aus dem Kopf schreibt. Ist kein Wunder, Zeile 72 müßte die rot markierte sein:

Code:
{...}
ElseIF ( Bite > 9 )
 Player->AddSpell "vampire blood berne"
 Return
[B][COLOR="Red"]End[/COLOR][/B]

Player->AddSpell "vampire blood quarra"

End
Das End dort ist natürlich Bullshit, da muß EndIF stehen, dann sollte es funktionieren.

Was die Sache mit Bloodmoon angeht, so wäre mein Script nicht zwingend... ich würde es jedoch als "Update" ansehen, für den Fall, dass man Bloodmoon aktiviert, da andernfalls eben Überschneidungen zwischen dem Vampirismus und der Lykanthropie entstehen könnten. Allerdings war mir natürlich nicht bekannt, dass du das nur für was "privates" benötigst, ich dachte es ginge um eine Mod für die Masse, da sollte man sowas dann halt beachten :D
 
  • Like
Reaktionen: Eternus