Construction Set Skriptthread zum Construction Set

Ich will dem Spieler per Skript einen höheren Skill im Umgang mit dem Bogen und im Schleichen verpassen. Eine mögliche Funktion könnte AdvancePCSkill sein. Es soll eine permanente Erhöhung der betreffenden Skillwerte sein. Leider habe ich keine Ahnung welchen Wert ich da nehmen soll - mit den Skills bin ich wenig vertraut und kenne die Zusammenhänge nicht.
Man kann ja z.B. bei einem Buch unter "Teaches" Schleichen und Schütze angeben. Das ist eigentlich genau was ich erreichen will, nur eben über einen Skript. Wer kennt sich da aus?
 
Ich will dem Spieler per Skript einen höheren Skill im Umgang mit dem Bogen und im Schleichen verpassen. Eine mögliche Funktion könnte AdvancePCSkill sein. Es soll eine permanente Erhöhung der betreffenden Skillwerte sein. Leider habe ich keine Ahnung welchen Wert ich da nehmen soll - mit den Skills bin ich wenig vertraut und kenne die Zusammenhänge nicht.
Man kann ja z.B. bei einem Buch unter "Teaches" Schleichen und Schütze angeben. Das ist eigentlich genau was ich erreichen will, nur eben über einen Skript. Wer kennt sich da aus?

Vielleicht kannst du mal "ModPCSkill" versuchen, der Befehl wird vom Oghma Infinium genutzt, dem Buch von Hermaeus Mora. Dort konnte man sich für einen von drei Wegen entscheiden, damit die eigenen Skills steigen.

Besagtes Skript:
Code:
scn DAOghmaInfiniumScript

short readOnce
short button1
short button2
short basestrength
short newstrength
short basespeed
short newspeed
short baseagility
short newagility
short baseintelligence
short newintelligence

;Begin OnActivate

;if ( readOnce == 0 ) && ( IsActionREF player == 1 )
;	MessageBox "Do you wish to read the Oghma Infinium?" "Yes" "No"
;	set readOnce to 1
;endif

;End

Begin OnEquip

if ( readOnce == 0 )
	MessageBox "Möchtet Ihr das Oghma Infinium lesen?" "Pfad des Stahls lesen" "Pfad des Schattens lesen" "Pfad des Geistes lesen" "Nichts lesen"
	;set button1 to GetButtonPressed
	set readOnce to 1
endif

End
	

Begin MenuMode

if ( readOnce == 1 )
	
	set button1 to getbuttonpressed
	
	if ( button1 == 0 )
		;MessageBox "INCREASING FIGHTER STUFF"
		Set basestrength to ( player.GetBaseAV Strength )
		set newstrength to ( basestrength + 10 )
		set basespeed to ( player.GetBaseAV Speed )
		set newspeed to ( basespeed + 10 )
		Player.SetAV Strength newstrength
		Player.SetAV Speed newspeed
		ModPCSkill Blade 10
		ModPCSkill HeavyArmor 10
		ModPCSkill Blunt 10
		set readOnce to 4
	elseif ( button1 == 1 )
		;MessageBox "INCREASING THIEF STUFF"
		set basespeed to ( player.GetBaseAV Speed )
		set newspeed to ( basespeed + 10 )
		Player.SetAV Speed newspeed
		set baseagility to ( player.GetBaseAV Agility )
		set newagility to ( baseagility + 10 )
		Player.SetAV Agility newagility
		ModPCSkill Sneak 10
		ModPCSkill Security 10
		ModPCSkill LightArmor 10
		set readOnce to 4
	elseif ( button1 == 2 )
		;MessageBox "INCREASING MAGE STUFF"
		set baseintelligence to ( player.GetBaseAV Intelligence )
		set newintelligence to ( baseintelligence + 10 )
		Player.SetAV intelligence newintelligence
		ModPCSkill Destruction 10
		ModPCSkill Willpower 10
		ModPCSkill Conjuration 10
		ModPCSkill Restoration 10
		set readOnce to 4
	elseif ( button1 == 3 )
		set button1 to 0
		set readOnce to 0
	endif

endif




if ( readOnce == 4 )
	set readOnce to 5
	Player.RemoveItem DAOghmaInfinium 1	
endif

End


MfG Master of Worlds
 
  • Like
Reaktionen: Beolo
@Beolo
Ich hab im Resultscript ein "NPCName.evp" eingefügt. Das Kleid wird jetzt angezogen, aber erst, wenn man ihr den Befehl ein zweites Mal gibt. Der Dialog wird durch einen Haken bei "Goodbye" beendet, also sofort. Eigenartig, dass sie es erst beim zweiten Ansprechen tut.

Deine Idee mit dem Skript wird bei mir wahrscheinlich nicht funktionieren, denn sie hat nicht immer die gleiche Rüstung an. Man kann ihr alle Rüstungen ins Inventar legen, die man mag, damit sie immer so gekleidet ist, wie man will. Bei einem Skript müsste ihr immer die gleiche Rüstung zugewiesen sein, richtig?

@Andy
Nein, ein eat oder sleep package hat sie nicht.
Ich habe ihre Rüstung und ihr Kleid in eine Truhe gelegt, die ich bei Container erstellt habe. Diese Truhe steht in ihrer Dummy-Cell.

Was die Skripte betrifft, kann ich jetzt nur raten, da ich sie nicht selber geschrieben habe. Aber ich habe sie mir jetzt mal genauer angesehen und versucht, Parallelen zu finden. Also....

Im Questskript habe ich die Variable "shortinvopen" gefunden. Die lautet folgendermaßen:

short invopen
;invopen == 0 no inventory sharing
;invopen == 1 inventory sharing opened
;invopen == 2 important for updating the look, resetting to 0


In ihrem eigenen Skript, also dasjenige, welches auf ihre Person gelegt ist, habe ich einen ganzen GameMode-Block gefunden, der ihr Inventory-Stuff betrifft. Dort wird diese Variable auch verwendet. Aber ich vermute mal, dieses kommt erst dann zum Zuge, wenn der Player ingame ihr Inventar öffnet, um ihr eine neue Rüstung anzulegen. Macht es Sinn, wenn ich diese Variable "NPC-Name.invopen == 2" in ihr Result-Skript schreibe?
 
Ich habe ihre Rüstung und ihr Kleid in eine Truhe gelegt, die ich bei Container erstellt habe. Diese Truhe steht in ihrer Dummy-Cell.
Dann vermute ich liegt es daran, dass Du das Inventar noch mal aufrufen musst um ein Update ihrer Kleidung zu erreichen. Wenn Du ihr die Sachen direkt ins Inventory ziehst sollte das Package eigentlich funktionieren wie vorgesehen. Vermute mal die Dialogoption erreicht, dass das Spiel schaut was sie im Inventar hat wenn das Package startet, aber da die Gegenstände in einer Truhe liegen sind sie nicht dort wo das Spiel als erstes schaut, und kommen erst an die passende Position, wenn das Inventar durch expliziten Aufruf "upgedatet" wird.

Oh, und wenn Du ihr die Kleidung ins Charakter Inventar ziehst solltest Du evtl. eigene Items für sie erstellen, bei denen Du die "playable" Option entfernst. Ich denke damit könntest Du verhindern, das der Spieler ihr aus Versehen die Altagskleidung aus dem Inventar nimmt... glaube ich zumindest.

Caveat: Ich muss zugeben, ich betreibe bei diesen Sachen selber noch sehr viel "learning by doing", daher keine Gewähr für jedewede Auskünfte. :D
 
Besten Dank, Master of World!
Du hast Recht, ModPCSkill gibt´s ja auch noch. Im Skript werden zweierlei Dinge verwendet. Mit ModAV der Basiswert, z.B. bei Speed um 10 erhöht und mit ModPCSkill eine direkt Erhöhung um 10 Punkte, z.B. bei Sneak. Also so wie ich das sehe, müsste in meinem Fall ein einfaches "Player.ModPCSkill Sneak/Marksman 10" ausreichen.
Das teste ich gleich mal. Ich hab Oblivion schon seit über 5 Jahren nicht mehr gespielt, kann mich nicht mehr erinnern wie das mit dem Hochskillen war. Musste man da nicht schlafen oder so, oder war das jetzt in einem anderen Spiel? :lol:


Andy1967 schrieb:
Dann vermute ich liegt es daran, dass Du das Inventar noch mal aufrufen musst um ein Update ihrer Kleidung zu erreichen.

Das sehe ich auch so. Ich bin davon ausgegangen, dass die Klamotten schon im Inventar des Begleiters liegen.
 
Ich glaub wir reden hier grade aneinander vorbei, oder vielleicht hab ich mich ja auch misverständlich ausgedrückt. Ich meinte nicht, dass Du einen Scriptbefehl benutzen solltest um das Inventar zweifach aufzurufen. Ich meinte Dein Problem, dass das Package erst greift wenn Du in-game das Inventar aufrufst liegt wahrscheinlich daran wie Du die Klamotten dem Char zuordnest, also die in-game Situation die Du vor einigen Posts beschrieben hast.

Schau erst mal was pasiert wenn Du ihr die Klamotten direkt ins Inventory ziehst, statt sie in die Truhe zu legen. Wenn das "unequip" dann immer noch nicht greift wenn Du es über den Dialog ansteuerst findet sich sicher auch dafür eine Lösung. Ich glaube aber im Moment machst Du es dir evtl. schwieriger als es sein muß. Das Package sollte eigentlich alles tun was Du willst, solange der NSC normale Kleidung im Inventory Tab gelistet hat.
 
Das Kleid befindet sich jetzt in ihrer Inventory, das aus der Truhe habe ich entfernt.
Aber auch hier das gleiche Spiel, erst bei der zweiten Aufforderung zieht sie es an.
Was aber reibungslos klappt ist das Anlegen ihrer Rüstung, wenn sie anschließend den normalen "Folgen-Befehl" erhält. Das geht wie geschmiert.:D
Es ist eigenartig, die Einstellungen sind in den jeweiligen Result-Scripts fast identisch. Auch ihre beiden Folgen-Packages habe ich verglichen. Auch sie sind fast identisch, bis auf den Wert der Variable und die zusätzlichen Haken bei unequip armor und weapon selbstverständlich.
 
Also da bin ich jetzt auch mit meinem Latein am Ende. (Hatte ich erwähnt, dass ich in Latein nie merhr als ne 4- bekommen hab? ;))

Alles was mir jetzt noch einfällt wäre nen sauberen Save ohne die Mod zu machen und zu schauen ob es nach Reaktivierung der Mod einen Unterschied gibt. Wenn das Problem damit auch nicht beseitigt wird muss jemand anderes ran.
 
Naja, ich hab die ganze Zeit mit einem Cleansave getestet. Aber was soll's, ich kann ja die Mod nochmal deinstallieren, einen weiteren Cleansave anlegen und danach neu installieren.
Das machen wir aber erst morgen, jetzt raucht mir der Kopf.:huh:
 
Hallo, jetzt noch auf die letzte eine Frage

Ich möchte, daß ein NPC (tot) im Interior verschwindet, wenn man eine Tür benutzt.
Soweit OK, aber der NPC soll nur dann verschwinden, wenn man ihn vorher durchsucht hat.
Geht dies mit einem Script Befehl zu prüfen?
Danke
 
Du könntest vermutlich ein Script auf den NPC legen, dass bei OnActivate eine Variable setzt. Diese Variable fragst Du dann im Tür-Script ab. Ich kann es dir nur leider nicht mit Sicherheit sagen, Scripting für Oblivion ist bei mir schon eine Weile her.
 
Super Dice vielen Dank - dies ist eine Möglichkeit - ich warte aber noch auf die Hoffnung, daß jemand mit einem Befehl helfen kann al la "if gefilzt dann" :)
 
Super Dice vielen Dank - dies ist eine Möglichkeit - ich warte aber noch auf die Hoffnung, daß jemand mit einem Befehl helfen kann al la "if gefilzt dann" :)

Wäre mir nicht bekannt, so ein Befehl. Mit der Variable kannst du es aber simpel und recht schnell lösen, ohne auf einen etwaigen nicht existent Befehl zu warten.

Bin mir nicht sicher, ob es so ganz passend funktioniert, also vor allem das Aufrufen der Variable über die Referenz zzzRef (Persistent Reference des NPCs). Probier es einfach aus, außer du hast selbst eine bessere Idee.

Code:
scn zzzScriptXYNPC

short checked

Begin onActivate
	if (checked == 0)
	set checked to 1
	endif
activate
end


Code:
scn zzzScriptXYDoor

Begin onActivate
	if (zzzRef.checked == 1)
	zzzRef.disable
	endif
	activate
end

MfG Master of Worlds
 
  • Like
Reaktionen: Meclaton
Der Befehl lautet "PickIdle", nur nützt der dir nichts, ohne die nötigen Einträge im Idle-Manager. Du müsstest erstmal die Animationen unter "UniqueIdleAnimations" einbauen und natürlich mit den richtigen Bedingungen versehen, sonst wird ganz Tamriel herumhampeln. Die Engine feuert PickIdle auch ganz automatisch in bestimmten Situationen ab. Man muss also die einzelnen Animationen so mit Bedingungen absichern, dass keine ungewollten Ergebnisse auftreten.

Ich verwende für meine NPC in der Regel eine Questvariable - jeder NPC hat natürlich seine eigene. Jeder NPC bekommt im Idle-Manager einen leeren Eintrag ohne Animation, nur mit der Bedingung "GetIsID". Diesem Eintrag folgen nun die Childs mit den jeweiligen Idle-Animations. Die wiederum haben die Bedingung GetQuestVariable.
Soll nun ein bestimmter NPC eine Animation ausführen, brauch ich nur die Questvariable auf einen bestimmten Wert setzen, gefolgt von einem "PickIdle".
Ob nun NPC oder Spieler, der Vorgang ist derselbe.
 
  • Like
Reaktionen: robinH
Ich habe eben einen Skript geschrieben und er will einfach nicht funktionieren.
Die Debug-Messages ergeben dass der Skript bis Once = 8 durchrattert.
Die Timers sind immer auf -0. Also wohl die Standardeinstellungen.
Muss man bei SayTo iwas beachten?
PHP:
scn aaDROrd0HQ07PiratenYrmoKrevakTrigSkript

Short Once
Float Timer

Begin onTriggerActor Player
If ( Once == 0 ) 
	Set Once To 1
	PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	DisablePlayerControls
Endif
End

Begin GameMode
If ( Once == 0 )
	Return
Elseif ( Once == 1 )
	Set Once To 2
	PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	DROrdHQ07YrmoKrevakAppear.PlayGroup Forward 0
Elseif ( Once == 2 )
	If ( DROrdHQ07YrmoKrevakAppear.isAnimPlaying == 0 )
		Set Once To 3
		PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	Endif
Elseif ( Once == 3 )
	Set Once To 4
	PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	TriggerHitShader 5
	DROrdHQ07YrmoRef.Enable
Elseif ( Once == 4 )
	Set Once To 5
	Let Timer := DROrdHQ07YrmoRef.SayTo Player aaDROrdHQ07YrmoKrevakTalk1 1
	PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	PrintToConsole "Calenad - Yrmo Talk - Timer = %.0f" Timer
Elseif ( Once == 5 )
	If ( Timer > 0 )
		Set Timer To ( Timer - GetSecondsPassed )
	Else
		Set Once To 6
		PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	Endif
Elseif ( Once == 6 )
	Set Once To 7
	Let Timer := DROrdHQ07YrmoRef.SayTo Player aaDROrdHQ07YrmoKrevakTalk2 1
	PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	PrintToConsole "Calenad - Yrmo Talk - Timer = %.0f" Timer
Elseif ( Once == 7 )
	If ( Timer > 0 )
		Set Timer To ( Timer - GetSecondsPassed )
	Else
		Set Once To 8
		PrintToConsole "Calenad - Yrmo Talk - Once = %.0f" Once
	Endif
Endif
End
 
Ich sehe da im Code selbst auch keinen Fehler. Das Einzige, was mir logisch erscheinen würde, wäre, dass die Dialoge keinen Wert besitzen, also keinen Text/Sound/whatever, und der Timer somit immer den Wert -1 erhält.