Construction Set Der Scriptthread

Dann möchtest du meine Mesh nicht mehr haben? Denn ich habe sie zufällig :)
 
Zuletzt bearbeitet:
ich möchte 2 Scripte vorstellen, das erste ist derart wie hier gesucht. Die Lösung sieht ziemlich skuril aus und hat ihre "Eigenart" wohl daher, dass man Bücher in MW ganz anderes aktviert als jede andere Art von Gegenständen

Code:
Begin IdV_DontPickup

; this goes to some book/scroll/paper whatever
; the original script was written by Dave Humphrey
; and on some note in his PI Dave's Furniture Store
;if ( OnActivate )
;	Activate
;endif
; is the whole thing and will make any kind of book or scroll impossible to pickup
; but one will be stuck in some wired menumode that ends when hitting the inventory button (right mouse)
; the rest of the script was created by me and will prevent this effect

short io	; inventory open

if ( io )
	Menutest
	set io to Menumode
endif

if ( OnActivate )
	if ( Menumode == 0 )
		set io to 1
	endif
	Activate
endif

End

wie schon dabei steht kommt der Hauptteil garnicht von mir

mit dem zweiten kann man feststellen ob der Spieler einer Zauber wirkt und wieviel Mana er verbraucht (mit schwankender Genauigkeit)

Code:
Begin IdV_CastDetect_Debug

short cost
short fail
short sch

float c
float d
float m
float r

if ( MenuMode )	; cant cast in menumode
	Return
endif

if ( CharGenState != -1 )	; just in case...
	Return
endif

if ( Player->GetSpellReadied == 0 )	; cant cast with your hands down
	Return
endif

set c to ( Player->GetMagicka )	; current magicka
set d to ( m - c )	; difference to old
set m to c	; safe current as old

; get the first (!) frame the cast sound plays
; thats the frame the magicka is removed
; assuming the sound matchs the school, the sch(ool) variable can be used later
; sounds can be changed in 'Gameplay, Magic Settings'
; Player->GetAlteration/Conjuration/Destruction/Illusion/Mysticism/Restoration

if ( Player->GetSoundPlaying "alteration cast" )
	if ( sch == 0 )
		set sch to 1
	endif
elseif ( Player->GetSoundPlaying "conjuration cast" )
	if ( sch == 0 )
		set sch to 2
	endif
elseif ( Player->GetSoundPlaying "destruction cast" )
	if ( sch == 0 )
		set sch to 3
	endif
elseif ( Player->GetSoundPlaying "shock cast" )
	if ( sch == 0 )
		set sch to 3
	endif
elseif ( Player->GetSoundPlaying "frost_cast" )
	if ( sch == 0 )
		set sch to 3
	endif
elseif ( Player->GetSoundPlaying "illusion cast" )
	if ( sch == 0 )
		set sch to 4
	endif
elseif ( Player->GetSoundPlaying "mysticism cast" )
	if ( sch == 0 )
		set sch to 5
	endif
elseif ( Player->GetSoundPlaying "restoration cast" )
	if ( sch == 0 )
		set sch to 6
	endif
elseif ( sch )	; reset if it plays no longer
	set sch to 0
	set fail to 0
endif

; assuming you cant cast while the old sound still plays
; also runs the first time the script is started

if ( sch == 0 )
	set r to 0
	if ( d )
		set r to ( d / GetSecondsPassed )
	endif
	Return
endif

if ( fail )	; once we even know the spell failed, theres nothing left to do
	Return
endif

; While the sound for spellcasting does not need to match the school,
; the failure sound will match it. Though we dont make any use of that.

if ( Player->GetSoundPlaying "Spell Failure Destruction" )
	set fail to 1
elseif ( Player->GetSoundPlaying "Spell Failure Alteration" )
	set fail to 1
elseif ( Player->GetSoundPlaying "Spell Failure Illusion" )
	set fail to 1
elseif ( Player->GetSoundPlaying "Spell Failure Mysticism" )
	set fail to 1
elseif ( Player->GetSoundPlaying "Spell Failure Restoration" )
	set fail to 1
elseif ( Player->GetSoundPlaying "Spell Failure Conjuration" )
	set fail to 1
endif

if ( fail )
	if ( sch > 0 )
		MessageBox "Nicht genug Mana"
	else
		MessageBox "Fehlzündung"
	endif
endif

if ( sch < 1 )	; the cast was already detected and its 'cost' calculated
	Return
endif

set c to r	; this is just for debugging, see last MessageBox

if ( r )
	set r to ( r * GetSecondsPassed )
endif
set d to ( d - r )

set cost to ( d + 0.5 )	; kill rounding error, spellcost are non-negative integers
if ( cost < 0 )
	set cost to 0
endif

MessageBox "Kosten: ~%g (%.3f) M. Regen: %.3f M/s. Korrektur: %.3f M", cost, d, c, r
set sch to -1

End

verwendbar für Manakosten senken bei höheren Skillstufen etc, muss man bei Bedarf noch einfügen.

ist vergleichbar mit Spell Cast Reduction von Aragon, das auf dem Spellcasting Mod von Horatio basiert (das in der Version 1.2 in Morrowind Improved im Einsatz ist)
Ich habe die dort verwendeten Tricks umgedreht und stelle erst fest wenn gezaubert wird und messe dann die Manakoste, die ich gegebenenfalls korrigiere, falls ich vermute es liegt irgendeine Art von Manaregeneration vor.
Regenertion wird linear angenommen und betrifft nur den letzten Frame. mehr Frames bringen meiner Meinung nach garnichts, lasse mich aber gern eines besseren belehren.

Hauptteil ist die von Horatio entdeckte Methode Zaubern mit Sounds festzustellen.

Das erste hat ganz sicher keinen Effekt auf die Framerate, das zweiten keinen den ich bemerken konnte (vielleich 1-2 von 100 fps wenn man die Hände zum Zaubern hebt). Verbesserungvorschläge willkommen.
 
Zuletzt bearbeitet:
Frage:

Kan man abfragen, ob der Spieler eine bestimmte Klasse ist?

Ich möchte nämlich, dass nur bestimmte Klassen, die Gegenstände nehmen können.


Gruß: TakoTatsujin
 
Du kannst mit Hilfe der Dialogoptionen herausfinden, welche Klasse NPCs haben.

Für den Spieler fällt mir jetzt keine Lösung ein. Wenn ein neues Spiel gestartet wird, kannst du sicher die primären und sekundären Fertigkeiten abfangen. Da die Klassen sowieso frei erstellbar sind, wirst du sie auch eher nicht abfangen können.
 
  • Like
Reaktionen: TakoTatsujin
Kan man abfragen, ob der Spieler eine bestimmte Klasse ist?
Jein.

Jedenfalls nicht mit normalen Scripts. Kann sein, dass der MWSE da was kann, aber ganz so einfach ist das nicht. Du könntest das ganze mit zwei Hello-Results machen, denn in den Dialogen gibt es die Condition "PCClass = XXX"... in dem Result müßte eine Global Var gesetzt werden, entweder 1 (richtige Klasse) oder 0 (falsche Klasse)... ansonsten, da es noch die "free"-Class gibt, sieht es für den Spieler düster aus, da hat Killfetzer recht.

In Scripts nun wieder ist es nur möglich, die Klasse des Spielers abzufragen, und das auch nur als MessageBox Variable. Prüfen geht nicht.
 
  • Like
Reaktionen: TakoTatsujin
ein script mit folgnder Wirkung soll auf einen Activator:

Sobald man sich dem Activator auf 512 Einheiten nähert soll ein bestimmter Sound abgespielt werden. Gleichzeitig soll der Bildschirm innerhalb von einer Sekunde schwarz werden. Sobald der Bildschirm komplett dunkel ist, tritt ein Transport mit den Koordinaten "5195, 5630, 15312, 270, 'MeineganzbestimmteZelle'" ein und das Tagebuch wird aktualisiert.

Danke schonmal, ich wette es ist wieder mal simpler als ich dachte. Meine Version hat jedenfalls nicht funktioniert. :roll:

Edit: Für die Ankunft.
Sobald man in der Zielzelle ankommt, soll ein weiterer bestimmter Sound abgespielt werden. Außerdem soll der Bildschirm wieder hell werden. Das ganze darf aber nur einmal passieren, weil man die Zielzelle auch schon vorher und auf anderen wegen betreten kann. Eventuell kann als "begrenzender Faktor" der Tagebucheintrag aus dem vorherigen Script herhalten...
 
Zuletzt bearbeitet:
ein script mit folgnder Wirkung soll auf einen Activator:

Sobald man sich dem Activator auf 512 Einheiten nähert soll ein bestimmter Sound abgespielt werden. Gleichzeitig soll der Bildschirm innerhalb von einer Sekunde schwarz werden. Sobald der Bildschirm komplett dunkel ist, tritt ein Transport mit den Koordinaten "5195, 5630, 15312, 270, 'MeineganzbestimmteZelle'" ein und das Tagebuch wird aktualisiert.

Danke schonmal, ich wette es ist wieder mal simpler als ich dachte. Meine Version hat jedenfalls nicht funktioniert. :roll:

Edit: Für die Ankunft.
Sobald man in der Zielzelle ankommt, soll ein weiterer bestimmter Sound abgespielt werden. Außerdem soll der Bildschirm wieder hell werden. Das ganze darf aber nur einmal passieren, weil man die Zielzelle auch schon vorher und auf anderen wegen betreten kann. Eventuell kann als "begrenzender Faktor" der Tagebucheintrag aus dem vorherigen Script herhalten...

Du nimmst zwei Scripts. Das eine ein lokales, das auf dem Activator liegt und das andere global, dass den Transport steuert und von dem lokalen gestartet wird.

Code:
begin my_local_script

short doonce

if ( doonce == 0 )
  if ( GetDistance Player < 512 )
    set doonce to 1
    StartScript "my_global_script"
  endif
endif

end

Code:
begin my_global_script

short state
float timer

if ( MenuMode == 1 )
  return
endif

if ( state == 0 )
  set state to 1
  PlaySound "mysound1"
  FadeOut 1
elseif ( state == 1 )
  set timer to timer + GetSecondsPassed
  if ( timer >= 1 )
    set timer to 0
    set state to 2
    Player->PositionCell xpos ypos zpos zrot "mycell"
  endif
elseif ( state == 2 )
  set state to 3
  PlaySound "mysound2"
  Journal "myjournal" 100
  FadeIn 1
else
 StopScript "my_global_script"
endif

end
 
  • Like
Reaktionen: Luke
Hi, Ich brauche ein skript mit dem ich einen daedroth mit einer speziellen ID für 10 Sekunden lang beschwören kann.
Ich hab versucht das skript aus dem Mod "Scripted Summoning" umzuschreiben, allerdings bin ich nicht sonderlich gut im scripten weshalb es auch nicht funktioniert hat.

Wäre Nett wenn ihr mir helfen könntet:)
 
Hi, Ich brauche ein skript mit dem ich einen daedroth mit einer speziellen ID für 10 Sekunden lang beschwören kann.
Ich hab versucht das skript aus dem Mod "Scripted Summoning" umzuschreiben, allerdings bin ich nicht sonderlich gut im scripten weshalb es auch nicht funktioniert hat.

Wäre Nett wenn ihr mir helfen könntet:)

Was genau mächtest du denn? Soll diese Kreatur immer und überall beschwörbar sein oder nur an einem bestimmten Ort? Einmal oder beliebig oft? Mit einem bestimmten Zauber oder immer, wenn du den Effekt Daedrtoh beschwören verwendest?

Ich gehe mal davon aus, dass du einen bestimmten Zauber mit dem Namen "Daedrothfürst beschwören" (oder sonst wie) erstellt hast, der einen beliebigen Effekt hat und die ID "my_daedroth_spell". Dein Daedroth hat entsprechend die ID "my_summon_daedroth". Diesen Daedroth kannst du dann immer und überall beschwören.

Dazu benötigst du zunächst ein globales Script (am besten als StartScript gestartet):

Code:
begin my_daedroth_global_script

short doonce

if ( Player->GetSpellEffects "my_daedroth_spell" == 1 )
	if ( doonce == 0 )
		set doonce to 1
		PlaceAtPC "my_summon_daedroth" 1 128 0
		Player->RemoveSpellEffects "my_daedroth_spell"
	endif
else
	if ( doonce == 1 )
		set doonce to 0
	endif
endif

end

Auf die Kreatur selbst musst du nun ein Script legen, dass Ihr Verhalten und ihr Verschwinden steuert:

Code:
begin my_summon_daedroth_script

short state
float timer

if ( state == 0 )
  AIFollow Player 0 0 0 0
 set state to 1
endif

if ( state == 1 )
 set timer to timer + GetSecondsPassed
 if ( timer >= 10 )
  Disable
  set state to 2
 endif
endif

if ( state == 2 )
  set state to 3
  SetDelete 1
endif

end
 
Erstmal danke für deine Antwort.
Eigentlich müsste der Effekt des Zauber entfernt werden, aber ich habe es einmal mit dem Zaubereffekt "Beschworene Stiefel" versucht doch als ich den Zauber ingame ausprobiert habe ist nichts passiert also weder daedroth noch stiefel. Danach habe ich es mit dem Zaubereffekt "Clannbann beschwören" versucht doch ingame beschwöre ich dann einen ganz normalen Clannbann.:(
Ich habe das script mehrmals nach Fehlern durchsucht aber keinen gefunden.
 
Ich brauche eine Spezielle form eines Liftscripts für mein Projekt (siehe signatur)
Und zwar brauche ich eine Unsichtbare Plattform die, sobald der Player oder, wenn machbar, auch ein NPC drauf steht, hinauffährt, und sobald sie oben ist, und der Player/NPC nicht mehr drauf ist, nach ca. 5 sekunden verschwindet und unten wieder erscheint.
Die genauen positionen weiss ich nicht, einfach xxx schreiben:)

Edit: besser (aber sicher auch schwerer zu scripen)wäre noch:
Wenn der Player/NPC draufsteht gehts aufwärts bis zum ziel, wenn nicht färt er abwärts bis zum start
 
Zuletzt bearbeitet von einem Moderator:
Erstmal danke für deine Antwort.
Eigentlich müsste der Effekt des Zauber entfernt werden, aber ich habe es einmal mit dem Zaubereffekt "Beschworene Stiefel" versucht doch als ich den Zauber ingame ausprobiert habe ist nichts passiert also weder daedroth noch stiefel. Danach habe ich es mit dem Zaubereffekt "Clannbann beschwören" versucht doch ingame beschwöre ich dann einen ganz normalen Clannbann.:(
Ich habe das script mehrmals nach Fehlern durchsucht aber keinen gefunden.

Also ich verwende diese Scriptkonstruktion in einem meiner PIs in verschiedensten Variationen und es funktioniert tadellos. Du kannst dir ja an verschiedenen Stellen MessageBoxen einbauen und so herausbekommen, ab welcher Stelle das Script nicht mehr funktioniert.

Ich brauche eine Spezielle form eines Liftscripts für mein Projekt (siehe signatur)
Und zwar brauche ich eine Unsichtbare Plattform die, sobald der Player oder, wenn machbar, auch ein NPC drauf steht, hinauffährt, und sobald sie oben ist, und der Player/NPC nicht mehr drauf ist, nach ca. 5 sekunden verschwindet und unten wieder erscheint.
Die genauen positionen weiss ich nicht, einfach xxx schreiben:)

Edit: besser (aber sicher auch schwerer zu scripen)wäre noch:
Wenn der Player/NPC draufsteht gehts aufwärts bis zum ziel, wenn nicht färt er abwärts bis zum start

In einem meiner PIs habe ich eine identische Plattform verwendet:

Code:
begin dg_platform_falle07

short doOnce

if ( GetStandingPC == 1 )
	if ( GetPos Z >= 11900 )
		if ( doOnce == 0 )
			PlaySound "cent steam roar"
			MessageBox "Die Plattform trägt Euch nicht."
			set doOnce to 1
		endif
		MoveWorld z -200
		return
	endif
endif

if ( GetPos Z < 13400 )
	if (doOnce==1)
		set doOnce to 0
	endif
	MoveWorld z 75
endif

end
 
Mal wieder ein kleines Problem mit einem Script, ähnlich wie das tageszeitabhängige disable-Script ein paar Seiten weiter.
Mit Script soll zwischen 21 Uhr abends und 07 Uhr nachts der NPC in eine interne Zelle teleportiert werden und dort bleiben. Wenn es zwischen 7 Uhr morgens und 21 Uhr abends ist soll er wieder an seiner alten Stelle in einer externen Stelle stehen.

Wo liegt hier schon wieder das Problem?

PHP:
begin "MNC Dorusat teleport"


short state

if ( state == 0 )
    if ( GameHour > 21 )
    MNC_Amassos_Dorusat->PositionCell "Ebenherz, Dorusat Amassos Haus" 3980, 4170, 16018, 147
      set state to 1
    endif
endif

    if ( state == 1 )
         if ( GameHour > 7 )
                if ( GameHour < 21 )
            MNC_Amassos_Dorusat->PositionCell "Ebenherz, Hafenviertel" 20682 ,-111455, 715, 228
            set state to 0
                endif
          endif
    endif

    end

Bin mir nicht sicher, aber kann es sein, dass ich hierbei mit genauen Zeitangaben arbeiten muss?
 
also hinsichtlich der Zeitangaben liegt GameHour (soweit ich weiß) im Bereich 0,0 bis 23,99999 ... im oberen Abschnitt würde bei 21,00001 bis 23,99999 die if-bedingung greifen ... im unteren Bereich bei 7,00001 bis 20,99999

Rein von der Zeitabdeckung fehlt also der Bereich 0 bis 7, wobei das wahrscheinlich nur problematisch ist wenn man den Bereich 21-0 irgendwie überspringt (Rasten? Warten?) ... kenn mich mit dem Handling dieser Phasen nicht wirklich aus

Mit genauen Zeitangaben solltest du besser nicht arbeiten, da es sich bei GlobalHour um nen float-Wert handelt, welcher jeden Frame (?) etwas erhöht wird ... ob du da jetzt genau X,00000 rauskommt ist nicht gesichert, deshalb bleib mal bei den relativen Angaben

Ansonsten beschreib mal genauer was denn das eigentliche Problem ist bzw. was nicht funktioniert
 
Also das Script funktioniert nicht, weil der NPC noch an seiner Stelle in der externen Zelle steht nach 21 Uhr. Dies macht er durchgängig, heisst also, dass der Teleport im Script erst gar nicht durchgeführt wird.
@Ivan: Wieso muss hier denn die ReferencePersist aktiviert sein? Ich hab noch nen andere NPC mit einem disable-script (ein paar Seiten vorher), dass auch ohne das klappt.
 
ist der NPC ReferencePersist und hast du das Script gestartet?
NPCs sind immer persistant. Viel interessanter wäre, ob die ID Unique ist - aber davon gehe ich aus.

@Merc:
Das Script müßte eigentlich funktionieren... nur muß ich dich erst einmal fragen auf was du dieses Script gelegt hast. Liegt es auf der NPC? Falls ja, kann das nicht richtig funktionieren, da es nur innerhalb der AI-Reichweite ausgeführt wird bzw. nur, wenn du gerade in der Zelle stehst, in der sich die NPC befindet. Um sicher zu stellen, dass es in jedem Fall läuft, muß es zwingend als Globalscript laufen - oder du platzierst in den betroffenen Zielzellen (Kayanlage und Haus) je einen Aktivator, welcher dieses Script in etwas abgewandelter Form trägt.
 
  • Like
Reaktionen: Mercarryn
NPCs sind immer persistant. Viel interessanter wäre, ob die ID Unique ist - aber davon gehe ich aus.

@Merc:
Das Script müßte eigentlich funktionieren... nur muß ich dich erst einmal fragen auf was du dieses Script gelegt hast. Liegt es auf der NPC? Falls ja, kann das nicht richtig funktionieren, da es nur innerhalb der AI-Reichweite ausgeführt wird bzw. nur, wenn du gerade in der Zelle stehst, in der sich die NPC befindet. Um sicher zu stellen, dass es in jedem Fall läuft, muß es zwingend als Globalscript laufen - oder du platzierst in den betroffenen Zielzellen (Kayanlage und Haus) je einen Aktivator, welcher dieses Script in etwas abgewandelter Form trägt.

Ja, ich hatte das Script auf den betreffenden NPC gelegt. Wenn ich als Global anlege, könnte ich doch noch mehr Teleports für weitere NPCS einbauen oder nicht? Dann müsste ich nur die Zeitvorgaben als Bedingung einstellen und würde mir die vielen einzelnenen Scripts sparen ( die NPCS sollen sowas wie ne Art Tagesverlauf haben)
 
Ja, ich hatte das Script auf den betreffenden NPC gelegt. Wenn ich als Global anlege, könnte ich doch noch mehr Teleports für weitere NPCS einbauen oder nicht? Dann müsste ich nur die Zeitvorgaben als Bedingung einstellen und würde mir die vielen einzelnenen Scripts sparen ( die NPCS sollen sowas wie ne Art Tagesverlauf haben)

Ja, das kannst du machen.