Construction Set Der Scriptthread

Nein. Diese Frage taucht hier alle 2 Seiten auf. Es gibt einen sehr umständlichen, nicht perfekt funktionierenden Workaround mit dem man den Spieler zwingen kann, sein Inventar abzulegen. Disen kannst du hier im Thread oft genug finden, wenn du mal nach Last oder Inventar suchst.

Lieben dank Killfetzer :)

Zu der Sache mit dem "zwingen" habe ich vielleicht noch eine möglichkeit gefunden, an der ich mich mal versuche. :)

In den Dialogen hab ich eine art Abfrage gesehen, die wohl den Wert der getragenen Ausrüstung prüft und je nach Wert dann eine reaktion erzeugt.

"Mit einer solchen Ausrüstung scheint es Euch sehr gut zu gehen. Kann ich Euch helfen?"

Result: ;Reputation >= 80; PCClothingMod >= 12000


Theoretisch müsste das ja dann auch möglich sein damit den Charakter zu zwingen seine Sachen abzulegen, um zb. in den nächsten Raum zu gelangen. (Zumindest wenn ich die Sache jetzt richtig analysiert habe :D)
 
Zuletzt bearbeitet:
In den Dialogen hab ich eine art Abfrage gesehen, die wohl den Wert der getragenen Ausrüstung prüft und je nach Wert dann eine reaktion erzeugt.

Ja, die getragene Ausrüstung. Diese Abfrage interessiert sich in kein bisschen dafür, was der Spieler im Inventar hat.

Wenn du ihn nur zwingen willst, eine bestimmte Ausrüstung zu tragen (oder auch keine) gibt es andere Tricks.
 
Moin, weiß hier jemand wie ich MWSE-Scripts kompilieren kann? das CS kennt die Funktionen ja nicht und dieses MWEdit, das ich gefunden habe scheint noch zieeemlich in der Beta-phase zu sein
 
Moin, weiß hier jemand wie ich MWSE-Scripts kompilieren kann? das CS kennt die Funktionen ja nicht und dieses MWEdit, das ich gefunden habe scheint noch zieeemlich in der Beta-phase zu sein
Ich hab gehört, Wrye Mash soll das auch können. Du kannst da zumindest Scripte ex- und impotieren. Angeblich soll es beim importieren auch MWSE kompilieren können.
 
Hi, ich habe irgendwo hier einmal einen Script von Killfetzer gesehen der eine "Selbstschussanlage" ermöglichen soll. Der unten stehende Script sollte auf einen Aktivator gepackt werden und somit alle 3 Sekunden ein Feuerball auf den Spieler schleudern.

begin my_selbstschussanlage

short state
float timer

if ( state == 0 )
if ( GetDistance Player <= 1024 )
Cast "zzzz_fireball" Player
set state to 1
endif
endif

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

end my_selbstschussanlage

Wenn ich mich dem Aktivator nähere beginnt für den Bruchteil einer Sekunde eine Castanimation, danach Spielabsturz.
Weiss jemand wo der Fehler liegt? Wäre sehr hilfreich.

Gruß Tigu
 
Was ist das denn für ein Activator? Ein Editor Marker, oder hat er eine sichtbare Mesh? Falls nicht, kann das ein Problem sein. Das Script ist es eher nicht, es sieht sauber aus. Und was ist mit dem ausgewählten Zauber? Folgendes:

Ein Activator/Actor, der einen Zauber castet, muß eine sichtbare Mesh mit einer definierten Shape und Größe haben. Der Zaubereffekt selbst muß wiederum auch gewisse Eigenschaften aufweisen, namentlich Reichweite, Stärke und Kosten. Sonst kann die Engine nämlich die Größe des visuellen Zaubereffekts nicht berechnen (und crasht, meist mit einer extrem kryptischen Fehlermeldung, aber ich hab auch schon kommentarlose CTDs gesehen)..
 
Ich habe noch weiter rumprobiert, es liegt am Zauber selber.
Der Typ der Zaubers darf nicht "Ziel" sein, dadurch stürzt alles ab. Einfach den Typ auf "Berührung" stellen.
Man sieht eine Castanimation und man erhält Schaden. Nur einen Feuerball der auf einen zufliegt sieht man nicht.
 
Ich denke mal eher das Problem besteht durch die Zauberart, bei Schaden auf Berührung fliegt ja eh nichts durch die Gegend und bei Ziel schmiert das Spiel ab.
btw. hab noch kein Tribunal/Bloodmoon drauf, da mein Mod ohne auskommen sollte.:oops:
 
Du kannst sowas "faken"... schau dir mal die Proximity Mine aus Tribunal an. Die macht im Prinzip genau das... damit ließe sich auch eine "richtige" Feuerballschleuder bauen.

Die Proximity Mine braucht aber den Explode-Befehl, wenn ich es richtig im Kopf habe und den gibt es erst mit Tribunal, das ja anscheinend nicht vorhanden ist:

btw. hab noch kein Tribunal/Bloodmoon drauf, da mein Mod ohne auskommen sollte.:oops:
 
Ein wenig Offtopic-> Wie groß ist die Wahrscheinlichkeit, das jemand der heute noch Morrowind zockt und sich Mods draufpackt weder Tribunal noch Bloodmoon hat?
Wenn das Ganze richtung 0 tendiert pack ich die Addons mit drauf.
 
Hallo, ich hab ein mehr oder weniger großes Problem mit einem MWSE-Script. Ich hab das auf notepad geschrieben, dann mit MWEdit compiliert und danach mit dem CS bzw enchanted editor zu na .esp gemacht. Wenn ich jetzt die Cell betrete mit den Gegenständen die das Script haben bekomme ich folgenden Error:
Trying to RunFunction index greater than function count
The script will not run anymore.

Das Script:
begin MiscSynchroScript

float tempZ
float tempX
float tempY
float tempRotation


float posZ
float posX
float posY
float Rotation
long ObjectId


setx ObjectId to XRefID


short existence
short interior
long interiorID


set posZ to ( GetPos Z )
set posY to ( GetPos Y )
set posX to ( GetPos X )
set Rotation to ( GetAngle Z )


while( GetPos Z )

set tempZ to posZ
set tempY to posY
set tempX to posX
set tempRotation to Rotation
set existence to 1
if( GetInterior )

set interior to 1
setx interiorID to XMyCellID
elseif( GetInterior == 0 )
set interior to 0
set interiorID to 0
endif
set posZ to GetPos Z
set posY to GetPos Y
set posX to GetPos X
set Rotation to GetAngle Z
if( posZ != tempZ )
xLogMessage "SYNC::MISCPOS: %f|%f|%f|%f|%d|%d|%d|" posX posY posZ Rotation Objectid interiorID
elseif( posY != tempY )
xLogMessage "SYNC::MISCPOS: %f|%f|%f|%f|%d|%d|%d|" posX posY posZ Rotation Objectid interiorID
elseif( posX != tempX )
xLogMessage "SYNC::MISCPOS: %f|%f|%f|%f|%d|%d|%d|" posX posY posZ Rotation Objectid interiorID
elseif( Rotation != tempRotation )
xLogMessage "SYNC::MISCPOS: %f|%f|%f|%f|%d|%d|%d|" posX posY posZ Rotation Objectid interiorID
endif
endwhile
set existence to 0
setx ObjectID to XRefID
xLogMessage "SYNC::MISCPOS: %d %d" ObjectID existence

Was kann ich da gegen den Fehler machen?
 
Was soll das Skript machen:
Ich möchte ein globales Script erstellen, welches die Rüstung/Waffen von beliebigen NPCs in geladenen Zellen um den Spieler automatisch repariert. Dies geht wohl nicht mit dem normalen Boardmitteln sondern scheinbar wird der MWSE benötigt, welchen ich in V0.94 installiert habe.

Welche Probleme gibt es:
Wenn ich das Skript ausführe "freezt" Morrowind aber stürzt nicht ab. D.h. Musik läuft weiter

Das Skript:
Code:
; 	description:	This script checks and repairs all damaged equip owned by Player or NPC
;	author: 			Drullo321
begin MRS_Global_AutoRepair
	if ( MenuMode )
		return
	endif

	StopScript, MRS_Global_AutoRepair

; variable declarations
	long npc_reference	; pointer to a npc object
	short endOfInventoryNotReached ; true when there are more objects in current npc's inventory to cycle through

	; Information about one npc inventory item
	long currentItemID
	long currentItemCount
	long currentItemType
	long currentItemValue
	float currentItemWeight
	long currentItemName
	long nextItemReference

	long npc_currentItemCondition			; health of current item
	long npc_currentItemMaxCondition		; maximum health of current item

	short isRepairable						; true for armor and weapons
	short temp						
	short isRunning ; only execute script while not currently running

	; Reset variables
	set endOfInventoryNotReached to 1

	;----------------------------

	; 1.Cycle through each NPC (and player) in the current cell(s)	
	setx npc_reference to xFirstNPC
	whilex ( npc_reference )
		MessageBox, "Hello World"
		; 2.Cycle trough each item of the current npc's inventory
		; Get first inventory item
		setx currentItemID currentItemCount currentItemType currentItemValue currentItemWeight currentItemName nextItemReference to npc_reference->xContentList 0
		; Check if inventory of character/npc is NOT empty
		if ( nextItemReference == 0 )
			set endOfInventoryNotReached to 0
		endif
		whilex ( endOfInventoryNotReached )
			; check item type (only armor and weapons can and should be repaired
			set isRepairable to 1
			if ( currentItemType != 1346454871 ) ;not weapon
				if ( currentItemType != 1330467393 ) ;not armor
					set isRepairable to 0
				endif
			endif

			; repair when item is damaged
			ifx ( isRepairable )
				;setx npc_currentItemCondition to currentItemID->xGetCondition
				;setx npc_currentItemMaxCondition to currentItemID->xGetMaxCondition
				;set temp to ( npc_currentItemMaxCondition - npc_currentItemCondition )	
				;ifx ( temp )
				;	setx temp to currentItemID->xSetCondition npc_currentItemMaxCondition
				;endif			
			endif

			; Get next item
			setx currentItemID currentItemCount currentItemType currentItemValue currentItemWeight currentItemName nextItemReference to npc_reference->xContentList nextItemReference
				; ---
			; Check if it is end of list
			if ( nextItemReference== 0 )
				set endOfInventoryNotReached to 0
			endif
		endwhile		
		; get next npc
		setx npc_reference to xNextRef npc_reference
	endwhile

	StartScript, MRS_Global_AutoRepair
end

Das ganze mal als testversion komplett gekürzt gibt genau den selben Freeze:
Code:
; 	description:	This script checks and repairs all damaged equip owned by Player or NPC
;	author: 			Drullo321
begin MRS_Global_AutoRepair
	if ( MenuMode )
		return
	endif

	StopScript, MRS_Global_AutoRepair

; variable declarations
	long npc_reference	; pointer to a npc object
	short endOfInventoryNotReached ; true when there are more objects in current npc's inventory to cycle through

	; Information about one npc inventory item
	long currentItemID
	long currentItemCount
	long currentItemType
	long currentItemValue
	float currentItemWeight
	long currentItemName
	long nextItemReference

	long counter

	long npc_currentItemCondition			; health of current item
	long npc_currentItemMaxCondition		; maximum health of current item

	short isRepairable						; true for armor and weapons
	short temp						
	short isRunning ; only execute script while not currently running

	; Reset variables
	set endOfInventoryNotReached to 1

	;----------------------------

	; 1.Cycle through each NPC (and player) in the current cell(s)	
	setx npc_reference to xFirstNPC
	whilex ( npc_reference )
		set counter to ( counter + 1 )
		MessageBox, "Hello World Nr %G", 
				; get next npc
		setx npc_reference to xNextRef npc_reference
	endwhile

	StartScript, MRS_Global_AutoRepair
end

Augenscheinlich hat er ein Problem mit:
Code:
	set npc_reference to xFirstNPC
	whilex ( npc_reference )

Denn da scheint er zu hängen den ich kriege keine Nachricht angezeigt.
Zusätzlich falls man das zum laufen kriegt habe ich in einem englischsprachigen Forum gelesen das man mit den xGetCondition-Befehlen keine Rüstung/Waffen im Inventar ansprechen könnte. Ja dann frag ich mich wozu es die überhaupt gibt weil daüfr würde es doch gebraucht werden
 
Was mir schonmal auffiel:
MessageBox, "Hello World Nr %G",
; get next npc
Da fehlt ne Variable für das %G in messagebox. Vermutlich meintest du MessageBox, "Hello World Nr %G", counter
Ansonsten: mhh, keine Ahnung. Das Beispielscript sieht ja genauso aus...
Ob es daran liegt, dass dein if ( menuMode ) vor den Variablendeklarationen ist?

Zusätzlich falls man das zum laufen kriegt habe ich in einem englischsprachigen Forum gelesen das man mit den xGetCondition-Befehlen keine Rüstung/Waffen im Inventar ansprechen könnte. Ja dann frag ich mich wozu es die überhaupt gibt weil daüfr würde es doch gebraucht werden
ich würd sagen, um in der Welt liegende Items zu ändern. Du könntest evtl versuchen, den Leuten alle Items abzunehmen und wieder hinzuzufügen, das sollte auf jeden Fall Kondition (aber auch die Ladung) auf Maximum setzen. Könnte aber sein, dass du Probleme kriegst, die NPCs ihre equippten Items wieder anziehen zu lassen. Als ich mal versucht habe, festzustellen, was der Spieler gerade trägt (durch alle Items iterieren, für jedes xHasItemEquipped aufgerufen), hat MW sich bei mir komplett aufgehängt :ugly:
Aber vielleicht ist es performant genug, wenn man nur Waffen und Rüstungen prüft. Du könntest auch schauen, wie der Werewolf ReEquip-Mod das macht.


@Cody: du hast in allen 4 xLogMessage 7 Platzhalter aber nur 6 Variablen
\€: außerdem hast du MWSE-Code in normalen ifs.


btw, ne Kleinigkeit die ich mal gebastelt habe:
http://pra.iplanet.at/filemgr/test/mwcodeformatter.html
hilft manchmal, unübersichtlichen MW-Code zu verstehen
 
  • Like
Reaktionen: Cody227 und Drullo321
Danke für die Rückmeldung
Da fehlt ne Variable für das %G in messagebox. Vermutlich meintest du MessageBox, "Hello World Nr %G", counter

Kann passiert sein, als ich bissl copy pasted habe. War auf jedenfall mal richtig und hatte ich auch nur eingebaut um mir ne Art "Debug" Nachricht auszugeben um zu sehen ob/wie oft er dorthin kommt, selbst ohne freezt er vorher.

Ob es daran liegt, dass dein if ( menuMode ) vor den Variablendeklarationen ist?
Siehe eins oben drüber. Hatte erst überlegt ob es daran liegt dass er das jeden Frame aufruft und habe deshalb zwischenzeitlich das und noch ne "isRunning"-Variable eingebaut und gesetzt welche aber auch nix geholfen hat.

Scheint wohl alles nichts zu helfen. Muss ich wohl warten bis Lexa ihre/seine (englische?) überarbeitete Version von Castle Wars herausbringt. Ich meine dort muss ja sowas vorhanden sein sonst führt es die ganze Mod ad absurdum. Hat mich schon damals gefragt warum es solche eigentlich logischen Sachen nicht in den Vanilla-Funktionen gab/gibt
 
Scheint wohl alles nichts zu helfen. Muss ich wohl warten bis Lexa ihre/seine (englische?) überarbeitete Version von Castle Wars herausbringt. Ich meine dort muss ja sowas vorhanden sein sonst führt es die ganze Mod ad absurdum. Hat mich schon damals gefragt warum es solche eigentlich logischen Sachen nicht in den Vanilla-Funktionen gab/gibt
Hm? Scripted Item Repair gibt es in CW nicht. Wozu auch - die Einheiten bestreiten einen einzigen Kampf und die Wahrscheinlichkeit, dass die Waffen dabei kaputt gehen, ist nicht so hoch. Der Spieler kann sein Zeug reparieren lassen. Item Repair gibt es nur an einer Stelle - im Survival Mode, wenn man ein zusätzliches Weapon/Armor Upgrade fallen läßt. Dann werden die alten Teile entfernt und neue, heile Teile ins Inventar gefügt. Castle Wars ist MWSE-frei, in der Originalversion ebenso wie in meiner Überarbeitung. Und ohne MWSE gibt es definitiv keine funktionale UND performante Möglichkeit, Items automatisch zu reparieren. GetHealthGetRatio hätte den Zustand einer Waffe oder Rüstung feststellen können sollen, tut es aber nicht. Und Set/ModHealth funktionieren nicht auf Gegenständen. Damit bleibt in Vanilla nur der direkte Austausch der Items und das ist echt ätzend.
 
Hey, hey.
Ich bin mal wieder hier mit der Frage nach einem simplen Script, der mir in Eigenarbeit einfach nicht gelingen will - wie üblich.

Ich bräuchte also einen Script, den ich auf einen Activator legen will.
Sobald sich der Spieler draufstellt, soll der Activator verschwinden und den Spieler fallen lassen. Beim nächsten Zellenwechsel soll er aber wieder an Ort und Stelle sein.
Für erscheinen und verschwinden reichen hier disable und enable.

Ich bedanke mich im vorraus und bin mir sicher, dass das keine allzu große Mühe sein sollte. ;)


EDIT: Mir ist noch was eingefallen. Wir würde ein Sript aussehen, der einen Activator in bestimmten Zeitabständen Zauber auf einen anderen Activator schießen lässt?
EDITEDIT: Ganz vergessen: Killfetzer hat mir so einen Script ja schonmal gebastelt. :oops:
 
Zuletzt bearbeitet:
EDIT: Tut mir sehr leid, das ist der Morrowind-Thread ... war der falsche Tab offen. Ich muss ins Skyrim-Forum.
 
Zuletzt bearbeitet von einem Moderator:
Hallo zusammen, ich habe u.U. ein kniffliges Anliegen. Ich möchte für eine Mod, an der ich gerade arbeite, eine "Vater"-Figur erstellen, sprich der NPC soll der gleichen Rasse angehören. Mit GetRace kann ich ja die Rasse des Spielers abfragen, soweit kein Problem.
Gibt es aber eine Möglichkeit, die Rasse des NPCs per Script zu ändern? Oder muss ich für jede Rasse einen NPC mit eigenem Script erstellen, welches die NPCs nach der Rassenabfrage mit disable ausblendet bzw. die gewünschte Rasse einblendet.
Um im diesen Fall die Dialogerstellung zu vereinfachen (sprich nicht jedes Topic für jeden NPC) wäre es doch dann am sinnvollsten, die Topics an eine eigens generierte Klasse zu binden und nicht an den ID-Namen, oder?