Construction Set Der Scriptthread

Wie gesagt... es sind deine Koordinaten. Wenn deine Zelle wirklich so weit draußen liegt, dann sind die tatsächlichen Zielkoordinaten wesentlich größer. Mach das, was ReneMiner worgeschlagen hat, um die korrekten Koordinaten zu ermitteln. Das Script könnte dann in etwa so aussehen:

Code:
begin vf_svushscript
short DoOnce
short noLore

IF ( MenuMode == 1 )
	return
ElseIF ( DoOnce == -1 )
	return
ElseIF ( DoOnce == 0 )
	IF ( GetDistance Player <= 128 )
		ForceGreeting
		set DoOnce to 1
		return
	EndIF
EndIF

IF ( GetCurrentAiPackage == 1 )
	setHello 0
	ForceRun

	IF ( GetAiPackageDone == 1 )
		set DoOnce to -1
		AiWander 0 5 0 0 0 0 0 0 0 0 0 0
		SetHello 30
	EndIF
EndIF

end
Das AITravel gehört dann ins Dialogresult vor das Goodbye.
 
  • Like
Reaktionen: Senture
gut, also ich fress jetzt erstmal nen Besen..das war ja ne schwere Geburt xD
es funktioniert natürlich perfekt!
Ich dachte das ganze funktioniert immer Zellenweise, da man die Pathgrids ja auch nur immer für eine Zelle setzen kann.

Vielen vielen Dank an alle die mir geholfen haben!
 
Nein- Du kannst auch über mehrere Zellen reisen. Dazu müssen die Gridpunkte (achte z.B. auf die gelben gestrichelten border-lines) der aneinander grenzenden Zellen nur ganz dicht beieinander sein. Ausserdem - geh auf Nummer Sicher - bedenke Gegenverkehr z.b. andere herumwandernde NPCs oder Wachen- lege zwei Spuren nebeneinander die in einer Art Gitter verknüpft sind- so haben sie alternative Wege und treten nicht auf der Stelle und versuchen "Sumo-Ringkampf im Stehen" wenn zwei wandernde aneinander geraten.
 
hört sich ja witzig an..ich habe insgesamt immer soviele wegpunkte wie möglich angelegt und diese mit den nächstliegenden verknüpft, ich hoffe das haut so hin.
Eine andere Frage: wie bringe ich das denn zustande, dass der NPC ein greeting nur einmal bringt, ohne einen zusätzlichen Journaleintrag zu vergeben?
 
Du kannst dem NPC eine lokale variable ins script schreiben z.b.

begin ...
short lastGreeting

end
- speichern...

im Dialog kannst Du dann bei den 6 Feldern rechts mit den dropdown-boxen Bedingungen wählen (zusammenstellen)

Local LastGreeting = 0

und setzt im Result

set LastGreeting to 1

dann wird er nie wieder das Greeting bringen bei dem 0 verlangt ist.
"LastGreeting" ist jetzt willkürlich gewählt. Du kannst auch eine beliebige andere lokale Variable nehmen die er vieleicht sowieso schon hat und deren status eine bestimmte Situation vorraussetzt.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Senture
meh, schon wieder ich..

ich habe im script eine variable hinterlegt, welche dem Spieler dann im Resultfenster des Dialogs hinzugefügt werden soll..ingame wird mir aber gesagt, dass 0 für additem nicht zulässig ist, die variable ist aber im script gesetzt.

geht
player->additem "dummy" meineVariable
nicht?

und gibts da Alternativen?
 
Edit:
Der Befehl Additem verlangt eine feste Zahl und akzeptiert keine lokalen variablen Werte.

Alternativ:

Code:
If ( MeineVariable >= 8192 )
  Player->AddItem "dummy", 8192
  set meineVariable to ( meineVariable - 8192 )
Endif
If ( MeineVariable >= 4096 )
  Player->AddItem "dummy", 4096
  set meineVariable to ( meineVariable - 4096 )
Endif
If ( MeineVariable >= 2048 )
  Player->AddItem "dummy", 2048
  set meineVariable to ( meineVariable - 2048 )
Endif
If ( MeineVariable >= 1024 )
  Player->AddItem "dummy", 1024
  set meineVariable to ( meineVariable - 1024 )
Endif
If ( MeineVariable >= 512 )
  Player->AddItem "dummy", 512
  set meineVariable to ( meineVariable - 512 )
Endif
If ( MeineVariable >= 256 )
  Player->AddItem "dummy", 256
  set meineVariable to ( meineVariable - 256 )
Endif
If ( MeineVariable >= 128 )
  Player->AddItem "dummy", 128
  set meineVariable to ( meineVariable - 128 )
Endif
If ( MeineVariable >= 64 )
  Player->AddItem "dummy", 64
  set meineVariable to ( meineVariable - 64 )
Endif
If ( MeineVariable >= 32 )
  Player->AddItem "dummy", 32
  set meineVariable to ( meineVariable - 32 )
Endif
If ( MeineVariable >= 16 )
  Player->AddItem "dummy", 16
  set meineVariable to ( meineVariable - 16 )
Endif
If ( MeineVariable >= 8 )
  Player->AddItem "dummy", 8
  set meineVariable to ( meineVariable - 8 )
Endif
If ( MeineVariable >= 4 )
  Player->AddItem "dummy", 4
  set meineVariable to ( meineVariable - 4 )
Endif
If ( MeineVariable >= 2 )
  Player->AddItem "dummy", 2
  set meineVariable to ( meineVariable - 2 )
Endif
If ( MeineVariable == 1 )
  Player->AddItem "dummy", 1
  set meineVariable to 0
Endif
; meineVariable ist jetzt 0
; daher eventuell vorher den Wert kopieren...

brauchst Du Werte > 16383 dann musst Du jeweils eine Verdoppelung mehr vornehmen. Brauchst Du definitiv weniger dann nimm soviele ifs wie nötig + 1 zur Sicherheit
 
Zuletzt bearbeitet:
Das Result-Fenster ist sozusagen ein Script. Du kannst da 64 kB an code unterbringen.
Allerdings kannst Du da keine Variablen deklarieren - aber auf lokale des Sprechers zugreifen und auf globale sowieso.
Auch If und While sind möglich - aber nicht verschachtelt

Edit: Wobei das im Result zu starten zu Folge hat das man für jeden Inventar-Zugriff beim Spieler eine Meldung bekommt.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Senture
Dein Befehl Additem verlangt eine feste Zahl und akzeptiert keine variablen Werte.
Das ist so nicht ganz korrekt.

AddItem akzeptiert sehr wohl Variablen vom Typ Short in Dialogresults. Allerdings keine lokalen! Dialogresultate werden on-the-fly kompiliert und dabei werden Globale Variablen von AddItem (und RemoveItem) mit ihrem Wert interpretiert, lokale Variablen dagegen mit 0. Also, Senture... wenn du die Möglichkeit hast, eine globale Variable VOR dem Lauf des Dialogresultats mit dem Wert zu füllen, dann kannst du

player->additem "ID", GlobVar

als Befehl benutzen. Wie gesagt VOR dem Laufen des Resultats. Es ist nicht möglich, den Wert der Global im Dialogresultat selbst zu ändern. Diese Wertänderung würde erst im nächsten Frame wirksam.
 
habe das Ganze zwar bereits "gelöst", aber rein aus Interesse..wenn ich also im Resultfenster eine Variable deklarier und sie dann dementsprechend mit getitemcount zuweise, ist das dann möglich? oder ist die dann wieder lokal
 
Ach so- doch globale gingen wohl- hatte ich vergessen...(hab's verbessert damit in Zukunft niemand falsch informiert wird)

Du kannst im Result keine neuen Variablen deklarieren. Du kannst lokale aus dem Script des Sprechers benutzen aber ihm keine neuen anhängen. Leider auch keine temporären.

Globale erstelltst Du über Menu Gameplay\Globals - die sind -wie es der Name sagt global und können von überall gelsesen oder gesetzt werden. Der Nachteil ist das sie immer im Speicher verweilen - egal ob sie nur einmal für eine Quest gebraucht wurden oder ständig verwendet werden - daher sollte man sie nur mit Bedacht einsetzen
 
Zuletzt bearbeitet:
Halli Hallo Hallöle..

ich habe für meine unglaublich tolle Diebesgilde Questgegenstände gemacht. Diese Gegenstände haben ein script
begin script

short doonce

if doonce!=1
disable
set doonce to 1
endif

end script

Der Gegenstand wird dann beim ersten Journaleintrag über "ID des Gegenstands"->enable ins Spiel gebracht.
Soweit so gut, meine erste Quest läuft perfekt, der gesuchte Gegenstand ist aber in der gleichen Zelle zu finden.

Die zweite Quest läuft problematischer ab. Nachdem ich nach einiger Meckerei des Spiels den Gegenstand auf "Reference persistent" gesetzt habe, kann der Gegenstand trotzdem nicht über enable im Dialogresult sichtbar gesetzt werden. Der Gegenstand ist 5 Zellen von der Questgeberin entfernt. Ist das Enablen nicht möglich oder gibts da einen Workaround für?

Viele Grüße
Senture
 
Och doch, aber so wird das nichts. Grund:

Das lokale Script des Gegenstands läuft nicht, solange man nicht in Aktionsreichweite (sprich der gleichen Interior-Zelle) ist. Dein Script funktioniert hervoragend und macht, was es soll. Du enablest den Gegenstand im Dialog. Nun gehst du los betrittst die Zielzelle... und das wie ich annehme zum ersten Mal nach Aktualisierung des Plugins und damit des Gegenstands. Peng... das Script greift und disabled den Gegenstand ^^

Knüpfe die Condition zum disablen also nicht nur an doonce, sondern auch an die Quest.

Code:
begin script

short DoOnce

IF ( DoOnce == 0 )
	IF ( GetJournalIndex "QUESTID" < StartIndex )
		disable
	EndIF

	set DoOnce to 1
EndIF

end
Damit sollte es gehen.
 
  • Like
Reaktionen: Senture
Dann würde ich auch auf persistent verzichten - wenn das Ding sowieso ein extra Script bekommt. Etwa in der Art
Code:
Begin ...script

short done

If (done)
  Return
Endif

If ( GetJournalIndex "journalname" >= [jetztSichtbar] )
  Enable
  set done to 1
Else
  Disable
Endif

End

dann brauchst Du im Dialog-Result nichts anderes als "JournalName" auf den Wert [JetztSichtbar] zu setzen und kannst auf ein persistentes Objekt verzichten.
 
  • Like
Reaktionen: Senture
Danke für die Tips, dann werd ichs wohl so machen..schade eigentlich, weil ich ja jetzt für jeden Gegenstand quasi ein eigenes Script bauen muss..aber mir ists trotzdem so lieber, anstatt dass die Gegenstände einfach so zufällig verkauft werden..
 
Theoretisch könntest Du ein Script nehmen welches per GetPCCell oder GetPos feststellt wo der Gegenstand ist- dann könnten sich die Gegenstände das Script teilen
 
Hi! Bei dem Versuch etwas Leben auf meine Straße zu bringen, habe ich ein Monster erschaffen..

Habe einem NPC ein Travel-Package gegeben, dass ihn jeweils nach 2 stündigem wandern zu einem anderem Ort gehen lässt. der Ort ist leider 4 oder 5 Zellen entfernt. So läuft also mein NPC hochmotiviert los, bleibt aber bei der ersten Zellwand stehen und fängt an sich wild zu drehen, sodass er mehrere Gesichter auf einmal hat. Sehr unheimlich, und unerwünscht..

kann man das irgendwie verbessern?
 
Sollte eigentlich kein Problem sein einen NPC von Zelle zu Zelle gehen zu lassen. Wichtig ist- man braucht ein Pathgrid - möglichst mehrspurig im Bereich der Zellgrenzen. Schalte unbeding Borders (mit B) ein so das Du die Gelb-Schwarzen Linien siehst und orientiere Dich an der Färbung (mach z.B. einen Gridpoint genau auf den Wechsel zwischen Schwarz und Gelb) und ziehe die Gridpoints der Nachbarzelle so dicht wie möglich auf die gleichen Punkte. Kannst Dich natürlich auch an der Bodentextur orientieren. Achte drauf Abstände zwischen AiTravel-etappen-Start+Ziel nicht grösser als 900 zu machen - besser versuche beim AITravel Abstände von etwa 750-800 einzuhalten und Wege - also Pathgrids zweispurig mit kreuzenden Verbindungen anzulegen (siehe "Grafik") damit NPCs sich nicht ins Gehege kommen und Sumo-Ringkampf auf der Stelle veranstalten. Die Abstände der Gridpoints sollten möglichst noch kleiner sein (350-600) - also eine Etappe kann ruhig über 2 Points oder mehr (inclusive Kurven & Kreuzungen) führen

Code:
|/\|
O--O
|\/|
|/\|
O--O
|\/|
|/\|
O--O
|\/|
|/\|
O--O
|\/|
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Senture