PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : G.E.C.K. Tutorial - Einführung in das Skripten



Indy
28.12.2008, 17:39
Einführung in das Skripten

Hallo und wilkommen in die Einführung für Skripten im G.E.C.K.

Erst einmal vorab:
Wozu braucht man eigentlich Skripte?

Skripte sind im G.E.C.K. kleine Hilfswerkzeuge, die uns eine ganze Reihe weiterer Möglichkeiten offenbaren und für viele Ereignisse "hinter den Kulissen" verantwortlich sind. Sie sind es, die meist die Quests steuern und es zum Beispiel ermöglichen, dass das Betätigen eines Schalters die verlinkte Tür öffnet. Sie sind es, die bei Aktivieren eines Gegenstands Dialogboxen erscheinen lassen oder einfach nur die Erfüllung einer bestimmten Voraussetzung überprüfen.
Die Skripte sind also recht mächtige Werkzeuge, mit denen sich viele interessante Dinge anstellen lassen.

Generell ist es von Nutzen, wenn ihr bereits Kenntnisse mit Programmiersprachen verschiedener mitbringt, da somit der Einstieg in die verschiedenen Kontrollstrukturen wegfällt. Dieses Tutorial soll sich aber auch an die Einsteiger richten, die noch nie mit einer Programmier- oder ähnlichen Sprache gearbeitet haben.


Der Einsatz von Skripten

Bevor wir mit der Syntax beginnen, sehen wir uns zuerst noch einmal an, wo Skripte überhaupt angewandt werden.

Skripte können in verschiedenen Formen angewandt werden. So unterscheiden sich diese in 3 Typen: Quest-Skripte, Object-Skripte und Effect-Skripte.

Quest-Skripte werden, wie schon der Name verrät, bei Quests angewendet und steuern diese. Die Object-Skripte können auf die meisten interagierbaren Objekte angewandt werden, wie etwa NPCs, Doors, Items, Activators und viele weitere. Die Effect-Skripte sind für die sogenannten Game Effects, also diverse Zustände und Enchantments, die Kreaturen oder Characters betreffen, zuständig.

Die Syntax

Der Skriptname

Jedes Skript beginnt zunächst mit einer einfachen Kennzeichnung, die sich aus folgendem Code zusammensetzt:


scn MeinSkriptName
;oder auch: SriptName MeinSkriptName

Groß- und Kleinschreibung spielt hier keine Rolle, es kann als genauso "SCN" oder auch "scriptname" geschrieben werden. Wie man sieht, bieten Funktionen meist sowohl eine Kurzschreibweise, als auch eine lange Schreibweise an. Welche davon angewandt wird, bleibt jedem selbst überlassen.


Die Kommentare

Der mit dem ;-Zeichen gekennzeichnete Eintrag ist ein Kommentar. Kommentare können mit einem ";" begonnen werden und gelten dann für die fortlaufende Zeile. Sie sind dazu da, das geschriebene Skript durch Erklärungen lesbarer zu machen, also damit man auch später noch weiß, was das Skript nun eigentlich machen soll.


Die Variablenzuweisung

Unter dem Skriptnamen folgen die Variablenzuweisungen. Variablen sind ganz einfach kleine Datenspeicher, die mit einem Wert (hier sind nur numerische Zahlen als Werte möglich) ausgestattet und modifiziert werden können. Im G.E.C.K.-Scripting gibt es 4 Variablentypen: short, long, float und ref.


short variablenname1
long variablenname2
float variablenname3
ref variablenname4

Die short-Variable kann Zahlen von -32768 bis 32767 speichern, während long und float höhere Grenzwerte besitzen. Da wir jedoch im G.E.C.K.-Scripting meist in einem sehr niedrigen Zahlenbereich arbeiten und wir wohl nie über größere Zahlenwerte hinauskommen werden, ist nur die short-Variable relevant.

Die ref-Variable ist eine Referenzvariable. Sie speichert statt Zahlenwerten eine Objektreferenz. Mit diesen können wir also richtige Objektreferenzen aus der Spielwelt ansprechen.


Der Beginblock

Nach den Variablendeklarationen folgt immer der Begin-Block. Dieser sorget dafür, dass der weiterstehende Code nur dann ausgeführt wird, wenn die Begin-Bedingung erfüllt wurde. Der Begin-Block "Begin OnActivate" wird beispielsweise nur dann ausgeführt, wenn das betreffende Objekt, auf dem das Skript liegt, vom Spieler aktiviert wird. Begin-Blöcke MÜSSEN nach ihrem darin enthaltenen Code mit "End" abgeschlossen werden.


scn Skriptnamen

short i

Begin OnActivate

set i to 1 ;Tritt nur dann ein, wenn das Objekt „aktiviert“ wird.

End

Begin GameMode

set i to 1 ;Tritt immer ein, wenn sich das Spiel im Gamemodus befindet, als immer dann, wenn gerade kein Menü läuft.

End



Eine Auflistung aller im G.E.C.K. möglichen Begin-Bedingungen, sowie deren Erklärung, findet ihr im Offiziellen GECK-Wiki: Begin - GECK (http://geck.bethsoft.com/index.php/Begin).

Anmerkung: Die Einrückung des im Begin-Block stehenden Codes ist nicht zwingend erforderlich. Es gehört jedoch zum guten Ton, in Blöcken stehend Codesegmente mit dem Tabulator einzurücken, was auch die Lesbarkeit von umfassenderen Skripten deutlich vereinfacht.


Variablen modifizieren

Wird eine Variable neu deklariert, ist ihr Anfangswert zunächst "0". Eine Wertzuweisung geschieht mit der Set-Funktion:


set variablenname to 1

Hier wird also der zuvor auf 0 deklarierten Variable der Wert 1 zugewiesen. Variablenname können natürlich auch einfach inkrementiert werden:


scn InkrementierSkript

short i

Begin OnActivate
set i to 1 ; i bekommt seine erste Zuweisung
set i to i + 2 ; i wird um den Wert 2 inkrementiert: Die Variable hat nun den Wert 3

End


Die if-Bedingungen

Die if-Bedingungen sind WENN-Bedingungen, welche für gewöhnlich einen Wert auf ZUTREFFEND oder NICHT ZUTREFFEND abprüfen und nach diesem entscheiden, ob der Code im ersten Block (falls zutreffend), oder der zweite im else-Block (ANDERNFALLS) stehende Code (falls nicht zutreffend), ausgeführt werden soll.

if-Bedingungen verwenden für Überprüfen verschiedene Operatoren. Diese wären:

---
if i == 1
Prüft ab, ob die zu überprüfenden Elemente die selben Werte besitzen.

if i > 1
Prüft ab, ob das linke Element größer als das rechte ist.

if i < 1
Prüft ab, ob das linke Element kleiner als das rechte ist.

if i != 1
Prüft ab, ob die zu überprüfenden Elemente nicht die selben Werte besitzen.

if i >= 1
Prüft ab, ob das linke Element größer oder gleich das rechte ist.

if i <= 1
Prüft ab, ob das linke Element kleiner oder gleich das rechte ist.
---

Außerdem lassen sich noch mehrere if-Bedingungen miteinander verknüpfen. Bei if-Bedingungen, die mit dem logischen Operator && (UND) verknüpft sind, müssen beide Bedingungen zutreffen. Bei if-Bedingungen, die mit dem logischen Operator || (ODER) verknüpft sind, muss mindestens eine der beiden Bedingungen zutreffen.

Ein if-Block muss mit einem endif abgeschlossen werden. else-Zweige sind möglich, müssen jedoch nicht unbedingt angewandt werden. Um auf einen else-Block direkt eine weitere if-Bedingung folgen zu lassen, kann dieser auch mit endif geschrieben und daraufhin wie ein gewöhnliches if behandelt werden.

Erläutern wir das durch ein Beispiel:


scn InkrementierSkript

short i
short x

Begin OnActivate

set i to 2

if i >= 2 ; Wenn i größer oder gleich 2 ist, tritt der erste Block ein. Andernfalls wird der Else-Block ausgeführt.
set x to 1
else ; Tritt ein, wenn i NICHT größer oder gleich 2 ist.
set x to 2
;...
endif

if i != 2 ;Tritt ein, wenn i NICHT 2 ist.
set x to 1
;...
elseif i > 1 ; Eine direkt darauf folgende if-Bedingung, die eintritt, wenn i NICHT 2 ist.
set x to 2
else
set x to 3
endif
End

Die Funktionen

Funktionen sind Programmroutinen, die eine bestimmte Aufgabe ausführen und daraufhin einen Wert zurücklierfern, der den Status des Ergebnisses ausgibt. Der Funktion vorangestellt wird eine Referenz, an der diese angewendet werden soll. Referenz und Funktion werden durch einen Punkt getrennt, also: referenz.Funktion

- Als Beispiel: Die Funktion "myRef.GetDead" überprüft, ob unsere angegebene Referenz (bei der es sich in diesem Fall um einen NPC handelt) noch lebt. Ist der NPC tot, wird der Wert "1" zurückgegeben. Lebt sie hingegen noch, wird der Wert "0" zurückgegeben.

Funktionen lassen sich selbstverständlich auch in if-Bedingungen anwenden. So ist z.B. folgendes Skript möglich, um den Tod eines NPC's festzustellen:


scn TodfeststellungsSkript

ref myNPC

Begin OnGameMode

set myNPC to GetReference

if myNPC.GetDead == 1
; Der NPC ist tot, entsprechender Code wird ausgeführt.
else
; Der NPC lebt noch, entsprechender Code wird hier ausgeführt.
endif
End

Mit diesem Skript lässt sich ohne weiteres feststellen, ob der NPC tot ist, oder noch lebt, um entsprechend darauf zu reagieren. Anstatt des "GetReference" können wir auch ohne weiteres einen Referenznamen wählen, den wir zuvor einer NPC-Referenz zugewiesen haben.

Es gibt irrsinnig viele Funktionen, die alle ihren eigenen Zweck haben. Hier alle aufzuzählen wäre nicht möglich, ohne das Thema hier zu sprengen.
Eine ausführliche Auflistung alle Funktionen und deren Zweck finden sich im Offiziellen GECK-Wiki (http://geck.bethsoft.com/index.php/Category:Functions).


Schlusssatz

Das war es auch bereits mit unserer "Einführung" in das Skripten. Ich wünsche euch gutes Gelingen mit euren ersten Skripten und hoffentlich hat dieses Tutorial euch weitergeholfen.

SirTroy
28.12.2008, 22:03
Hallo Indy,
Danke fürs Tutorial, nur habe ich einen Fehler entdeckt ;)
Es heißt Begin Gamemode nicht Begin OnGameMode
Viele Grüße

PS: Ihr könnt den Beitrag gerne wieder löschen wollte nur auf den Fehler hinweisen ;)

RadiationMan
05.01.2009, 05:05
Hi,

Also, wenn ich das richtig verstanden habe, ist das skript Global, wenn ich es mit "Begin GameMode" Anweisung laufen lasse? Einmal Aktiviert, läuft es immer? Gibt es eine möglich keit ein skript zu starten ohne das es an einem Objekt oder einem Activator Bereich in der 3d Welt zugewiesen ist? Beispielsweise wenn ein Spiel gestartet wird?

Danke

SirTroy
12.01.2009, 13:54
Ja in dem du eine Quest machst und diese bei spiel beginn startest und eben dieser Quest sollte dein Script haben.

RadiationMan
22.01.2009, 09:10
Danke ;)

Habs am WE selbst rausgefunden uns wollte es eben hier posten, da habe ich deine antwort gelesen. ;)

Trotzdem vielen Dank.:)

Marduk
18.02.2009, 19:11
Hi,
wie heißt im Script der Befehl, mit dem ich ein Topic im Gespräch ausführen kann?

mfg und danke

Misantrooper
19.02.2009, 09:29
hier:
http://geck.bethsoft.com/index.php/Main_Page
gibt es eine umfassende funktionsreference.

google hätte dir geholfen.

Marduk
19.02.2009, 12:14
Da habe ich natürlich schon nachgeschaut, aber trotzdem finde ich den Befehl nicht. Und Google ist erste Anlaufstelle.

mfg

Misantrooper
19.02.2009, 12:58
wenn ich gewollt hätte, das du dich nur mit den scripten auseinandersetzt, hätte ich direkt die skriptseite aufgeschlagen.

ich wollte eigendlich dsa du von selbst dahinterkommst, aber mal ein kleiner ansatz, dann weisst du auch wo im wiki du fündig wirst um dein prob zu lösen.

topics werden durch quests oder AI´s aktiviert/ausgelösst/abgespielt.

Marduk
19.02.2009, 13:29
learning bei doing - gefällt mir.

Vielleicht sollte ich etwas konkreter werden. Im Gespräch mit einen Npc wird ein Zufallsgenerator ausgelöst (der funktioniert auch), und ja nadem wie er ausfällt soll das Gespräch eine andere Wendenung nehmen.

Ich schreibe das Script in gekürzter Form mal hierein.

if GetRandomPercent >= 48.6486486
-> HIER SOLL DAS GESPRÄCH MIT DEM TOPIC ABC FORTFAHREN
else -> HIER SOLL DAS GESPRÄCH MIT DEM TOPIC XYZ FORTFAHREN
endif

Ist das möglich? Ansonsten mache ich das über "ShowMessage", aber die Lösung über das Gespräch gefällt mir besser.

mfg

Misantrooper
19.02.2009, 19:29
learning bei doing - gefällt mir.




ich weiss ich bin ain ar***, aber nur das ist der wahre weg des lernens.


aber mal wieder zu deinem prob.

ich bin mir nicht sicher, aber addtopic könnte weiterhelfen:


if GetRandomPercent >= 48.6486486
questblablabla.addtopic blablabla1
else questblablabla.addtopic blablabla2
endif


oder ein wert den du über die conditions in der jeweiligen topic abfragst.

Marduk
22.02.2009, 15:39
Ah danke,

also, über "addtopic" schein das nicht zu funktionieren.

Was meinst du denn damit: "oder ein wert den du über die conditions in der jeweiligen topic abfragst."?

mfg

SirTroy
23.02.2009, 17:46
Du kannst auch 2 Queststages machen und bei deinem Percentwert eben auf diese Queststage setzen die da sein soll, und bei dieser Queststage soll der Actor den Player mit dem Topic aktivieren. Hoffe du verstehst das xD

Marduk
23.02.2009, 23:34
Du kannst auch 2 Queststages machen und bei deinem Percentwert eben auf diese Queststage setzen die da sein soll, und bei dieser Queststage soll der Actor den Player mit dem Topic aktivieren. Hoffe du verstehst das xD

Ähhhhh.... danke,

könnte ich ein Beispiel bekommen?

mfg

SirTroy
25.02.2009, 18:45
uff....
Pass auf

If Percentwert == 48
set Queststage to 50
endif

Bei deinem NPC machst du nun bei der AI ein Find Packages auf den Player.
Die Condition ist GetStage QuestID == 50.
Und bei der Quest machst du jetz dein Topic und als Condition beim Topic auch GetStage QuestID 50 und natürlich GetIsID NpcREF.

Und eben dasselbe nochmal mit Percentwert == 60 oda so.

Shatra
16.03.2009, 17:43
ScriptName LightSwitchScript

ref light ;der name "light" hat der eine bedeutung oder ist er frei erfunden?

Begin OnActivate
if light == 0 ;wenn die Variable light 0 ist? was ist damit gemeint, unten steht doch schon enable oder disable, ist das der Anfangswert? also wenn das Licht = 0? dann ensteht erst der Bezug zu dem Lichteffekt?
set light to GetLinkedRef
endif

if light.GetDisabled ;also, wenn das light ausgeschaltet wird (ist "light" immer noch die Variable?), dann wird das "light" eingeschaltet, sonst wird es ausgeschaltet?
light.Enable
else
light.Disable
endif
Activate
End

SirTroy
16.03.2009, 18:00
1.Er ist frei erfunden...

2.Eine Variable oder Ref hat immer den Anfangswert 0

3.Nein wenn das Licht beim Aktivieren ausgeschaltet ist, wird es aktiviert, ansonsten wird das licht dann ausgeschaltet, also Disabled.

Shatra
16.03.2009, 19:25
es Funktioniert nicht, Die Objekte sind Lichter keine Lampen

ScriptName LightSwitchVTCT01
ref light

Begin OnActivate
if light == 0
set light to [VTCTMaHaLi01]GetLinkedRef
set light to [VTCTMaHaLi02]GetLinkedRef
set light to [VTCTMaHaLi03]GetLinkedRef
set light to [VTCTMaHaLi04]GetLinkedRef
set light to [VTCTMaHaLi05]GetLinkedRef
set light to [VTCTMaHaLi06]GetLinkedRef
endif

if light.GetDisabled
light.Enable
else
light.Disable
endif
Activate
End

SirTroy
16.03.2009, 20:11
Und was genau möchtest du jetzt? o_O
Und btw:
Du kannst einer Ref nicht mehr als 1 Funktion oder ähnliches zuweisen.
Du müsstest also 6 Refs machen in deinem fall.

Shatra
16.03.2009, 20:20
Ich möchte mit einem Schalter/Activator 6 Lichter in einem Raum deaktivieren.
Nachdem ich die Klammern vor und hinter den Referencen zu den Lichtern gelöscht und eben einen Punkt zwischen reference und getlinkedref gesetzt hab passiert jetzt auch was. Mein Schalter verschwindet nachdem ich ihn aktiviere :confused:

Begin OnActivate
if light == 0
set light to VTCTMaHaLi01.GetLinkedRef
endif

if light.GetDisabled
light.Enable
else
light.Disable
endif
Activate
End


Begin OnActivate
if light == 0
set light to VTCTMaHaLi02.GetLinkedRef
endif

if light.GetDisabled
light.Enable
else
light.Disable
endif
Activate
End

So in etwa?

Sethx
17.03.2009, 06:45
http://www.globalgameport.com/forumdisplay.php?f=313

Shatra
17.03.2009, 17:53
Es geht auch einfacher.
Mach nen XMarker ( gib ihm nen Namen, z.B.: YXZmarker )
Setz bei allen 6 Lichtern den XMarker unter "enable Parent" als Ziel
und hau ein Script auf deinen Schalter oder Terminal.

Script von meinem Terminal:

if(YXZmarker.enable)
YXZmarker.disable
endif

if(XYZmarker.disable)
XYZmarker.enable
endif

Vorteil, du kannst soviele Lichter hinzufügen oder entfernen wie du willst ohne jedes mal das Script ändern zu müssen.

warum die 2 marker?

kannst du mal dein ganzes script posten?

SirTroy
17.03.2009, 18:06
Da sind keine 2 Marker...
Nur 2 abfragen nach dem Marker...

Shatra
17.03.2009, 18:39
vielen dank! es klappt. Kann mir jemand jetzt die nötigen Scriptzeilen verraten mit dem ich eine leuchtende Lampe mit einer ausgeschalteten Lampe ersetze?

und kann ich ein Licht so einstellen, dass es der Tageshelligkeit, sprich Morgen Mittags Abends und Nacht folgt? nachts kein Licht Mittags am hellsten

Sethx
17.03.2009, 19:23
http://www.globalgameport.com/forumdisplay.php?f=313

Shatra
17.03.2009, 20:24
ich hab 2 Lichtquellen in meinem Raum, Einmal ein Großes Fenster nach draußen (Sonnenlicht) und 6 Lampen (künstliches Licht). Da die Leute von Vault Tec sehr sparsam mit Energie umgehen, geht ein NPC um 5 Uhr Morgens zum Schalter und macht die 6 Lichter aus, soweit ist das mein Problem. Ich hätte gern, dass mein Sonnenlicht, Ebenfalls den Raum erfüllt, und zwar nicht permanent auch wenn es draußen dunkel ist sondern wie meine WastelandSkyplane,eine rechteckige Fläche die den Wastelandhimmel in Interiorbereichen nachahmt.

hab die Lösung selber gefunden, es gibt eine Lichquelle die "Sunlight" heisst, bei der kann man unter dem reiter emittance unter Exterior Light einen Himmel auswählen

EMOD
29.03.2009, 03:56
Es ist nur ein REF nötig, wenn es eine Kette aus Lichtern wird, die alle gleichzeitig an oder aus gehen sollen. Der XMarker ist elegant, aber nicht unbedingt nötig.

Ein beliebiges Licht als REFerenz reicht auch, der Rest der Lichterkette wird als Enabled Parent mit dieser Referenzlichtquelle verbunden.

Das REFerenz-Licht wird dann vom Schalter enabled oder disabled.

Die Abfrage in den SKRIPTS ist oft nur für die REFerenz, wodurch man diese nicht extra bennen muss, weil man den Schalter mit der Lichtquelle direkt verlinkt.

Das SKRIPT fragt dann ab, welcher REFERENZ-Punkt mit dem Schalter verbunden (Linked) ist. Der Schalter muss dieses SKRIPT integriert haben.

Einen ganz einfachen Lichtschalter kann man auch über ein Terminal machen. Die if Abfrage ist eigentlich nur bei einem Schalter nötig, da der nur eine Funktion aktivieren hat und das SKRIPT entscheiden muss, ob das Licht gerade an oder aus ist. Bei einem Terminal kann man beliebige Menü-Punkte machen, zwei reichen aus.

1. Einfach eine Lichtquelle als z.b. LichtREF benennen.
2. Die anderen Lichtquellen, die auch ein und aus gehen sollen mit dieser Lichtquelle (LichtREF) über Enabled Parent verbinden.
3. Ein Terminal als Kopie anlegen.
4. Einen Punkt - "Licht an" nennen und in die SKRIPT-Spalte eintragen: LichtREF.enable
5. Einen Punkt - "Licht aus" nennen und in die SKRIPT-Spalte eintragen: LichtREF.disable

Wenn man jetzt das Terminal im Spiel aktiviert, müssen die beiden MenüPunkte Licht an und Licht aus auftauchen. Wenn man dann den jeweiligen MenüPunkt anklickt, sollte das Licht an oder aus gehen.

Will man das Licht erst mal aus haben, klickt man bei der Lichtquelle, die man LichtREF benannt hat, noch den Punkt disabled an, wodurch das Licht erst mal deaktiviert ist. Alle weiteren Lichtquellen, die über Enabled Parent mit LichtREF verbunden sind, machen genau das, was diese Lichtquelle macht. Ist sie aus, sind die anderen auch aus. Ist sie an, sind die anderen auch an.

Lampen kann man auch über den Befehl enable oder disable verschwinden oder auftauchen lassen. Will man zwischen verschiedenen Lampen wechseln, kann man beliebige weitere Punkte anfügen. z.b.

Licht an:
LichtREF.enable
LampenaltREF.disable
LampenneuREF.enable

oder

Licht aus:
LichtREF.disable
LampenaltREF.enable
LampenneuREF.disable

Es sollte natürlich verschiedene Lampen-Grafiken für an und aus vorhanden sein, die Standardlichtquellen sind glaube ich alle an (so ganz dunkel werden sie nicht wirklich). Die Lampen müssen im Editor übereinander geschoben werden, was im Spiel keine Grafikfehler erzeugt, wenn die LampenneuREF im Item-Menü auf disabled steht (damit nur eine Grafik z.b. LampenaltREF zu sehen ist). Dann kann man noch Sound anfügen mit playsound.xxxxx usw...


Kleine Hilfe oder Erklärung der üblichen SKRIPTS:

ref myself
ref light
short toggle

begin onactivate
if myself == 0
set myself to this
endif
if light == 0
set light to myself.getlinkedref
endif

Hier wird nur abgefragt ob eine Referenz gesetzt ist. Wenn nicht, wird die mit dem Schalter verlinkte Lichtquelle für das SKRIPT als REF benannt. Damit ist der Schalter beliebig einsetzbar, weil man jede Lichtquelle, die man damit steuern will, immer direkt verlinkt.

Mit so einem Universallskript kann man einen Schalter mit einer Lichtquelle verlinken, den Schalter kopieren und mit der nächsten Lichtquelle verlinken usw... Die Lichtquellen müssen dazu nicht extra benannt werden, der Link zwischen Schalter und Lichtquelle reicht.

Mit dem Terminal-Beispiel kann man nur die Lichtquelle, die sich LichtREF nennt ein und aus machen. Dafür muss man das Terminal nicht mit der Lichtquelle verlinken, weil das Spiel/SKRIPT den genauen Namen der REF (Lichtquelle) ja kennt.

SilberWolf
01.04.2009, 12:38
Ich müsste mal was zur Script plazierung fragen.
Also ich selber bin Webdesigner und "andere" skriptsprachen gewöhnt,
das hier ohne { und } bzw ; verwirrt mich sowieso schon gewaltig.

Jetzt kann ich das hier am ehesten mit der Aurora sprache in NeverwinterNights vergleichen, welcher ich auch mächtig bin, jedoch wurden da dinge "einfacher" gehandelt. Ein NPC hatte einen Slot für gewisse ereignisse, in dem man ein Skript plazieren kann.
z.B. einen Slot der hieß "OnDeath", jedes Script was dort liegt, wird ausgeführt, wenn der NPC stirbt.
Jetzt ist die frage, wo man so ein Skript hier hinlegt.
Also ich hab ein Haus voller Gegner, wenn der letzte Tot ist, soll ein Skript ziehen. für gewöhnlich würde ich da sowas machen wie:



var DeathCount:Interger;
var i:Interger;

if (Deathcount == i)
{
EndAllActions;
set SciptABC.Active = 1;
};
if (ActionNPCDeathAppear == 1)
{
i++;
};


In einer Flash anwendung wüde dieses Script jetzt so lange laufen, bis die bedingung erfüllt ist.
Frage bleibt, wo lege ich ein solches Script im GECK ab? Also, läuft eine Quest konstant und registriert alle welt-ereignisse? Oder muss ich jedem NPC-Gegner eine "I + 1" skript geben? Wenn ja, wer ist dann auslöser für "I == Voll - weiter gehts".
Woah.. das verwirrt mich hier.

In einem Bethesta tutorial Video sah ich, das die manche Activatoren über aufziehbare Boxen geregelt haben. Aber ich kann ja nicht die ganze Welt in eine Box ziehen. (Bzw.. ich kann sicher, aber das kann ja nich der sinn sein ^^).

Hoffe das mir da wer helfen kann.

Ps. Ich weiß das mein Script nicht "GECK-Konform" ist, aber die richtige Symantik bzw. Grammatik bring ich schon selbst in erfahrung. Zur not frag ich nochmal.
Wichtig is erstmal, dass ich nen ansatzpunkt hab, wohin son skript überhaupt gepackt wird.

EMOD
03.04.2009, 05:17
Ich bin jetzt kein Profi, aber ich würde es so lösen:

Weg 1
Der korrekte Befehl würde

Begin onDeath

if irgendwas....

set xxxx

endif

END

lauten. Das würdest du dann in den NPC als SKRIPT legen, wobei es sich erst aktiviert, wenn der abkratzt.

Weg 2
Ein Aktivator, eine Box, der du das Skript zuweist. Dort wäre dann ein

Begin GameMode

if deathcount == xx

set xxxx

endif

END

sinnvoll, das läuft dann immer, auf jeden Fall wenn der Player die Zelle betritt. Eventuell ist dann eine globale Variable nötig, damit der Deathcount sauber zählt, vielleicht reicht auch eine short Variable im Skript.

Du kannst auch mit GetDistance die Entfernung zum Spieler abfragen, die dann eine if Bedingung abfragt, ob der deathcount schon erreicht ist oder ob eine bestimme Person mit xxx.GetDead == 1 schon hinüber ist oder mit == 0 noch lebt.

SilberWolf
04.04.2009, 01:20
also das hier:



scn SilberModBossTeleportScript

Begin OnDeath

if SilberModTestPupped02.GetDead == 1
SilberModGuardian01.MoveTo SilberModSpawnPoint01
else
endif

End


Funktioniert irgendwie nicht. Guardian steht schon auf dem XMarker bevor die Testpuppe tot is. also genaugenommen steht der schon da, wenn ich den raum betrete.

EDIT: Oh, der stand schon da, weil der noch keinen Navmesh in seiner Kammer hatte. Jetzt hat der einen und ehm ja.. jetzt bleibt der auch bequem in seiner Kammer und kommt da garnicht mehr raus.

in der Geck Referenz hab ich keine Funktion gefunden die einen NPC/Monster Spawnen lässt. Von daher steht der Guardian in einer kleinen kammer die nicht erreicht werden kann vom Spieler. Gibts da ne sinnigere lösung oder muss ich wirklich eine Kammer für 1000 NPC´s schaffen die dann alle irgendwann mal irgentwo auftauchen sollen wenn das Skript das befiehlt.

Ich dachte da an sowas wie "



ref SpawningPupped
Set SpawniingPupped to SilberModEinTollerGegner
If XXX.GetDead == 1
AppearReferenceFromLibraryToLocation.SpawningPupped
endif


sprich das der sich was aus den objekten zieht die es gibt in der Mod. Auch wen diese noch nicht Manuell irgendwo inGame plaziert sind.

EMOD
04.04.2009, 01:40
In deinem Fall geht es noch einfacher:

scn SilberModBossTeleportScript

Begin OnDeath
SilberModGuardian01.enable
END

Du musst dann noch den Guardian platzieren, wo er auftauchen soll und ihn in seinem Menü/Edit auf disable stellen.

Auch wenn du moveto machst, wenn der NPC bis dahin nichts machen soll und nicht gesehen wird, stell ihn besser auf disable und enable ihn immer über das Skript.

Fehlerquellen könnten bei deinem bisherigen Versuch sein:
Die ID SilberModTestPupped02 ist nicht vergeben oder wird nicht richtig von getdead erkannt, das sollte das Skript (wenn du GECK verwendest) eigentlich anmeckern.
Guardian hat kein AI-Package.
Ein AI-Package verweist auf den XMarker oder die Zelle.
Begin onDeath Player mal probieren.
NPC ist enabled, steht an seinem (Spawn)-XMarker rum, sobald der Player den Raum betritt.

SilberWolf
04.04.2009, 02:01
Uii, noch ein Nachtfalke :D
Aber cool, deine Idee mit dem Enable/Disable funktionierte.
Für den Boss reicht das erst einmal.

Fraglich bleibt wie ich das dann später mit der Polizei mache.
Also kurzeinführung: Es ist absolut lächerlich, das ich eine Haarklammer klaue und jeder direkt meinen Tod wünscht als vergeltung. Wer in Rivet City in der Kirchmülltonne wühlt, der ist des Todes. Das ist typisch Bethesta, aber mich nervt sowas, von daher soll es eine Art "Polizei" geben.

NPC bemerkt Diebstahl -> Rennt zu den Cops -> Cops versuchen Player zu stellen -> Player wird verhaftet.

Ich dachte mir das ich das mit MoveTo regeln kann, so das der Polizist stets die "Fährte" des Spielers aufnimmt und erst nach einem bestimmten Radius wieder ins Revier spaziert. Aber das scheint ja damit so nicht umsetzbar zu sein.

EMOD
04.04.2009, 08:01
Würde ich so umsetzen. Cops disablen oder AI-Package rausnehmen. Wenn der NPC die Cops alamiert, rennt der in die Zelle/Polizeistation, dort werden die Cops durch einen Aktivator enabled oder bekommen ein entsprechendes AI-Package. Dann rennen die von der Polizeistation los und suchen den Dieb.

Das könnte man dann mit ner Variablen lösen, die eventuell dann noch eine Wahrscheinlichkeit bekommt, ob sie den Dieb erkennen und die Beschreibung korrekt war. Damit sind sie keine gnadenlosen Bluthunde oder Kopfgeldjäger. Dann noch einen Timer rein, das sie ihre Suche irgendwann abbrechen, Variable und/oder AI-Package wieder löschen.

Bethesda wieder, ich erinnere mich noch an Morrowind, man klaut Klamotten und Ringe, wertet die mit Zauber auf und wird 2 Jahre später beim Diebstahl von nem Stück Brot erwischt. Was machen die Wachen, hey du hast gestohlene Ware und nehmen dir alles ab. Als wenn sie das sehen könnten, das 2 Jahre alte Sachen aus einer anderen Stadt ebenfalls gestohlen sind.

Sethx
04.04.2009, 08:24
http://www.globalgameport.com/forumdisplay.php?f=313

EMOD
04.04.2009, 08:46
Bei den Robotern in der alten Militärbasis habe ich das mit setUnconscious 0
gemacht. Ohne AI-Package sind die Blödmänner vor den PODs gespawnt, sobald ich den Raum betreten habe. Warum an dieser Stelle, war auch rätselhaft, da war nichts.

SetActorAI wird wohl nur bei NPCs gehen, Creatures/Roboter könnten das gut gebrauchen.

snlper
27.04.2011, 19:27
So wie ich bisher gelesen hab, bin ich hier ja genau richtig um was zulernen :)

Ich hab folgendes Problem.
Ich habe einen Npc in der Welt gespawnt und in mal Testnpc genannt. Er hat die Referenz ID aatNPC01 ( aa damit sie immer ganz obenstehen und 01 weil von ihm noch mehr kommen sollen dann) , nun bekam er ein kurzen Dialog und im Dialog kam auch von mir die Aussage: " Zeig mir mal deine Ausrüstung" und bestimmte im dialog als end Script = OpenTeamateContainer 01 , danach wollte ich folgendes Script ( über die geck befehlszeile Gameplay - EditScript - Script- new ) ein neues script abspeichern :

scn aatActivatorPlayersContainerSCRIPT


BEGIN OnActivate

aatNPC01ContainerRef.OpenTeammateContainer 1

END

Nur bekam ich immer folgende Fehlermeldung:
SCRIPTS:Script'scn atActivatorPlayersContainerSCRIPT',line 6:Syntax error. Invalid reference 'aatNPCContainerRef' (only object references and reference variables are allowed in this context).

Wo liegt mein Fehler ??
P.S.: scripten ist nich meine Stärke und bitte verweist nicht auf Englische Seiten, die Goolge übersetzung ist meist sehr kurios :).

Thx