Construction Set Der Scriptthread

schon wieder ich...:-D

kann mir jemand sagen wie man den dwemer lever sich nur einmal bewegen lässt..., komm nich drauf..,
also einmal beim activaten und einmal wieder in die ausgangsstellung, wenn auch die bars wieder zurück fahren?

Code:
begin _vdm_tomb_bars_lever

;this one moves the tomb metalbars aside.
;VDM TOMB LEVER


short State 
float timer 


if ( MenuMode == 1 ) 
    return 
endif 


if ( OnActivate == 1 ) 
    if ( "_vdm_tomb_bars" == 0 ) 
    MessageBox, "You pull the lever and the metalbars nearby moves away." 
    PlaySound "Door Stone Open" 
    set State to 10 
    endif 
endif


if ( State >= 10 ) 
    set timer to ( timer + GetSecondsPassed ) 
    if ( timer < 5 ) 
    "_vdm_metal_bars_01"->MoveWorld y 78 
    playgroup "idle2"
elseif ( timer > 15 ) 
    "_vdm_metal_bars_01"->SetAtStart 
    set State to 0 
    set timer to 0 
elseif ( timer > 10 ) 
    "_vdm_metal_bars_01"->MoveWorld y -78 
    playgroup "idle3"
    endif 
endif


End

DANKE
 
hallo, brauch ma wieder hilfe.... :-D

ich möchte das ein npc mehrere male "forcegreeted" basierend auf verschiedenen journalentries.., hatte es bis jetzt nur mit einen forcegreeting gemacht via doonce..
wie mach ich es das der npc mehreren male forcegreeted?

zb bei journalenty 14.. und dann wieder bei 23 usw.... er soll halt hier auch nur einmal forcegreeten....und im den jeweiligen forcegreeting wird dann auch ein neuer entry gesetzt...

danke vdm

p.s. ka was an der letzten frage jetze so schlimm war das ich keine antwort bekomme, hab es dann selbst hinbekommen...
 
Im Grunde einfach - ungefähr so:

Code:
begin MultiGreet_sc
short	JournalState
short	DoGreet
float	DownTimer

IF ( MenuMode )
	return
EndIF

IF ( DownTimer > 0 )
	set DownTimer to ( DownTimer - GetSecondsPassed )
	return
EndIF

set JournalState to ( GetJournalIndex "XYZ_ID" )
set DownTimer to 0 * GetSecondsPassed
set DoGreet to 0

IF ( JournalState == 10 )
	set DoGreet to 1
ElseIF ( JournalState == 20 )
	set DoGreet to 1
ElseIF ( JournalState == 30 )
	set DoGreet to 1
ElseIF ( JournalState == 40 )
	set DoGreet to 1
ElseIF ( JournalState == 50 )
	set DoGreet to 1
EndIF

IF ( DoGreet == 1 )
	IF ( GetDistance, player >= 1000 )
		set DownTimer to 1
	Else
		set DownTimer to 5
		ForceGreeting
	EndIF
	return
EndIF

end
Das ForceGreeting sollte man nur ausführen, wenn der NPC auch einigermaßen nah ist, also vielleicht noch eine GetDeistance Prüfung machen. Der Timer dient dazu, abzufangen, dass FG mehrfach ausgelöst wird, solange der Journaleintrag nicht durch einen Dialog/Greeting/etc. aktualisiert wurde.

EDIT:
Mit Distanzprüfung.
 
Zuletzt bearbeitet:
Ich habe das Script in dem Beitrag vorher überarbeitetg und eine Entferungsprüfung hinzugefügt.

Du brauchst im Grunde nur Entfernung und JournalIndizes ändern. Sollte funktuionieren, auch wenn ich kein Morrowind habe, um zu testen und mein Scripting nach so langer Zeit schon ein wenig eingerostet ist. Der Timer dient einfach dazu, das Script zu blocken, damit es nicht mit dem Dialogaufruf kollidiert bzw. in Verbindung mit der Entfernung, damit die nicht ständig geprüft wird.
 
hey, hab ma wieder ne frage... ;)

ich hab mir ne faction gebastelt..., und hab so rumprobiert ob ich da auch expelled werden kann, dabei ist mir aufgefallen das das grad nich funktioniert. hab faction members gekillt, bestohlen und in deren betten gepennt. werd aber irgendwie nich expelled. die betten items etc. sind natürlich owned bei npcs, bzw. npc is in der selben faction...

nun ist meine frage wie werd ich expelled in meiner neuen faction?

danke vdm
 
das is mir schon klar, ich dachte aber wenn ich npc xy kill, oder bestehle etc...werd ich auch expelled. funzt ja auch im vanilla..
 
Hey, ich bräuchte mal wieder eure Hilfe. Ich möchte wie im Vanilla erreichen, dass der Spieler ein Haus, genauer gesagt einen Fischereibetrieb weiter ausbauen kann.
Code:
begin FR_SH_Fishdoor2

if GetJournalIndex "FR_SH_Ha1" >= 12
return
endif

if GetJournalIndex "Fr_SH_Ha1" == 11
enable
PlaceItem, "ex_common_building_02", -57239.527, 142960.250, 1134.288, 0
PlaceItem, "ex_common_building_02", -57239.527, 143470.547, 1133.288, 0
PlaceItem, "ex_common_dormer_square", -57043.234, 143111.922, 1471.147, 0
PlaceItem, "ex_common_dormer_square", -57043.234, 142839.547, 1471.147, 0
PlaceItem, "ex_common_awning_wood_01", -57303.570, 143789.266, 1324.474, 180
PlaceItem, "ex_common_awning_wood_01", -57169.426, 143789.266, 1324.474, 180
PlaceItem, "barrel_02_Ingred", -57226.070, 143782.938, 1095.224, 0
PlaceItem, "barrel_02_Ingred", -57169.648, 143775.844, 1096.463, 0
PlaceItem, "ex_common_window_01", -57511.125, 143613.469, 1245.881, 90
PlaceItem, "ex_common_window_01", -57517.219, 143360.156, 1245.881, 90
PlaceItem, "ex_common_tavern_01", -57957.285, 142933.188, 1354.178, 180
PlaceItem, "ex_common_chimney_tall", -58316.344, 142816.266, 484.090, 90
PlaceItem, "ex_common_entrance_01", -57974.992, 143019.969, 1049.522, 90
PlaceItem, "ex_common_lighthouse", -55601.988, 144471.234, 2833.555, 0
Journal "FR_SH_Ha1" 12
elseif GetJournalindex "Fr_Sh_Ha1" <=10
disable
endif
Mein Problem ist jetzt, dass zwar alles funktioniert wie es soll, aber dass die Statics die ich hier einfüge danach "Aktivierbar"/Sammelbar sind, ich sie also ins inventar nehmen kann, wodurch das Spiel instant crasht. Kann man das irgendwie umgehen, oder muss ich die erweiterung nur aus Aktivatorteilen mit dem jeweiligen Script drauf basteln?
 
Mein Problem ist jetzt, dass zwar alles funktioniert wie es soll, aber dass die Statics die ich hier einfüge danach "Aktivierbar"/Sammelbar sind, ich sie also ins inventar nehmen kann, wodurch das Spiel instant crasht. Kann man das irgendwie umgehen, oder muss ich die erweiterung nur aus Aktivatorteilen mit dem jeweiligen Script drauf basteln?

Ja, ich denke, du musst auf Activatoren mit Disable/Enable umsteigen.

Alternativ kannst du alle Objekte mit "reference persistent" anlegen und irgendwo parken, um sie mit Position später an die gewünschte Stelle zu bewegen. Wobei ich glaube, dass die erste Variante speicherschonender ist.
 
  • Like
Reaktionen: Freelancer_T
Dann werdens wohl die Activator, danke dir.
Rein Interessehalber noch:
Mit "reference persistent" müsste ich die entsprechenden Teile jeweils als eigenen Static benennen, also auch wenn ich z.B.: 2 Fenster habe und beide platzieren möchte, dann muss ich 1 als Fenster eins und eins als Fenster 2 deklarieren, weils das Spiel ja sonst nicht außeinander kennt, oder?
 
Rein Interessehalber noch:
Mit "reference persistent" müsste ich die entsprechenden Teile jeweils als eigenen Static benennen, also auch wenn ich z.B.: 2 Fenster habe und beide platzieren möchte, dann muss ich 1 als Fenster eins und eins als Fenster 2 deklarieren, weils das Spiel ja sonst nicht außeinander kennt, oder?

Genau. Reference persistent heißt, dass es eins und genau eins dieser Teile gibt.
 
  • Like
Reaktionen: Freelancer_T
Hey,

hab hier son Script was via Resultbox abfefeuert wird.., sobald man ausn Menü raus is.., wie müsste es den aussehn, wenn ich da noch nen Teleport Effect drin haben möchte.., so like "Sotha Alma Appear Effect"...?
Sieht halt nicht so gut aus wenn der NPC einfach so verschwindet.. :D


Code:
Begin _vdm_x

if ( MenuMode == 1 )
    return
endif


playsound "conjuration hit"
"_vdm_x"->positionCell, x, y, z, 0, "xyz"


StopScript _vdm_x


End _vdm_x

danke

Edit: Mark oder Recall geht auch...
 
Zuletzt bearbeitet:
Edit: Mark oder Recall geht auch...
Geht nicht, da sie nur beim Spieler funktionieren. Bei NPCs passiert da nicht viel.

Im Grunde willst du also einen Teleport Effekt "faken", wenn ic h es richtig verstanden habe. Die Sache ist die, so ganz trivial ist das nicht. Das hängt mit der Effektsteuerung zusammen, also damit wie die Größe magischer Effekte von der Game-Engine errechnet wird. Am einfachsten ginge es, wenn du dir mal ansieht, wie Spriggans wiederbelebt werden. Es funktioniert im Prinzip so, daß ein grafisches Objekt gedropped wird:

Code:
Begin _vdm_x
float time
float xpos
float ypos
float zpos
short doonce

IF ( MenuMode == 1 )
	return
ElseIF ( DoOnce == -1 )
	return
EndIF

IF ( DoOnce == 0 )
	set xpos to ( GetPos, X )
	set ypos to ( GetPos, Y )
	set zpos to ( GetPos, Z )
	set zpos to (zpos +30)
	Placeitem "sprigganup" xpos ypos zpos 0
	set DoOnce to 1
EndIF

set time to ( time + GetSecondsPassed )	
IF ( time >= 1)
	set time to 0
	set DoOnce to -1
	"_vdm_x"->PositionCell, [x], [y], [z], 0, "xyz"
	StopScript _vdm_x
EndIF

end _vdm_x
 
  • Like
Reaktionen: VDMap
Hallo,
ich hab mir nochmal das multigreet script angeschaut..., und mir ist aufgefallen, das wenn ich eine interior cell betrete wo der npc drin ist (der greeten soll), wird sofort gegreeted...obwohl ich noch nicht in der nähe von dem npc bin...

hier noch mal das script:

Code:
begin MultiGreet_sc

short    JournalState
short    DoGreet
float    DownTimer


IF ( MenuMode )
    return
EndIF


IF ( DownTimer > 0 )
    set DownTimer to ( DownTimer - GetSecondsPassed )
    return
EndIF


set JournalState to ( GetJournalIndex "XYZ_ID" )
set DownTimer to 0 * GetSecondsPassed
set DoGreet to 0


IF ( JournalState == 10 )
    set DoGreet to 1
ElseIF ( JournalState == 20 )
    set DoGreet to 1
ElseIF ( JournalState == 30 )
    set DoGreet to 1
ElseIF ( JournalState == 40 )
    set DoGreet to 1
ElseIF ( JournalState == 50 )
    set DoGreet to 1
EndIF


IF ( DoGreet == 1 )
    IF ( GetDistance, player >= 1000 )
        set DownTimer to 1
    Else
        set DownTimer to 5
        ForceGreeting
    EndIF
    return
EndIF


end

ich hab nur die distanz abfrage geändert:

Code:
[COLOR=#000000]IF ( GetDistance, player < 128 )[/COLOR]

an was liegts..? :huh:

ty
 
ich hab nur die distanz abfrage geändert:

Code:
[COLOR=#000000]IF ( GetDistance, player < 128 )[/COLOR]

an was liegts..?
Aber grundsätzlich verstehst du die Programmierung? Na ja, wohl nicht:

Deine Änderung sorgt dafür, dass der NPC den Spieler nur dann nicht anspricht, wenn er näher als 128 Einheiten ist.
 
  • Like
Reaktionen: VDMap
hehe, ich dachte er spricht mich an wenn ich näher komme als 128 einheiten...

Also erstmal funktioniert dein Timer nicht...

Mit set DownTimer to 0 * GetSecondsPassed setzt du ihn in jedem Durchlauf auf 0. Mit anderen Worten, dein Timer wird niemals anspringen und er prüft das ForceGreeting in jedem Frame...

Zu deinem anderen Problem:

Im Originalscript wird geprüft, ob der Player mehr als 1000 Einheiten entfernt ist, wenn ja, wartet er eine Sekunde und prüft dann erneut. Wenn er näher ist, macht er ein ForceGreeting und wartet danach 5 Sekunden.

Wenn du nun die Bedingung in kleiner als 128 Einheiten änderst. Funktioniert es natürlich auch so. Wenn der Spieler näher ist als 128 Einheiten, wartet er eine Sekunde. Wenn er weiter weg ist als 128 Einhieten, spricht er ihn an und wartet dann 5 Sekunden.
 
  • Like
Reaktionen: VDMap