Construction Set Skriptthread zum Construction Set

Dann muss ich ja noch einen Fehler gemacht haben. Och mann, ich bin zu dumm für diese Welt.
Ok, vielleicht geht das so einfacher, das ist mein script:
scriptname "heilen"

Begin ScriptEffectStart

float health
float maxhealth
float magicka
float need
float skill
float value

set health to [player]GetActorValue Health
set maxhealth to [player]GetBaseActorValue Health
set magicka to [player]GetActorValue Magicka
set skill to [player]GetActorValue Restoration

if skill >= 100
set skill to 100
endif

set need to maxhealth - health
set need to need^1.3
set need to need*1.28
set value to skill*0.00858
set value to 1 - value
set need to need*value

if need <= magicka
set value to magicka - need
set health to maxhealth
endif

elseif need > magicka
set value to magicka / value
set value to value / 1.28
set magicka to value
set skill to magicka - 32768
set skill to skill^1.3
if skill > value
set magicka to magicka - 32768
endif
set skill to magicka - 16384
set skill to skill^1.3
if skill > value
set magicka to magicka - 16384
endif
set skill to magicka - 8192
set skill to skill^1.3
if skill > value
set magicka to magicka - 8192
endif
set skill to magicka - 4096
set skill to skill^1.3
if skill > value
set magicka to magicka - 4096
endif
set skill to magicka - 2048
set skill to skill^1.3
if skill > value
set magicka to magicka - 2048
endif
set skill to magicka - 1024
set skill to skill^1.3
if skill > value
set magicka to magicka - 1024
endif
set skill to magicka - 512
set skill to skill^1.3
if skill > value
set magicka to magicka - 512
endif
set skill to magicka - 256
set skill to skill^1.3
if skill > value
set magicka to magicka - 256
endif
set skill to magicka - 128
set skill to skill^1.3
if skill > value
set magicka to magicka - 128
endif
set skill to magicka - 64
set skill to skill^1.3
if skill > value
set magicka to magicka - 64
endif
set skill to magicka - 32
set skill to skill^1.3
if skill > value
set magicka to magicka - 32
endif
set skill to magicka - 16
set skill to skill^1.3
if skill > value
set magicka to magicka - 16
endif
set skill to magicka - 8
set skill to skill^1.3
if skill > value
set magicka to magicka - 8
endif
set skill to magicka - 4
set skill to skill^1.3
if skill > value
set magicka to magicka - 4
endif
set skill to magicka - 2
set skill to skill^1.3
if skill > value
set magicka to magicka - 2
endif
set skill to magicka - 1
set skill to skill^1.3
if skill > value
set magicka to magicka - 1
endif
set health to health + magicka
set value to 0
endif

SetActorValue Health health
SetActorValue Magicka value

end
Bitte sucht zuerst fehler in den Befehlen und erst, wenn ihr da keine findet, in der Rechnung.

Ich danke euch für eure Hilfe.

mfG Battlemage
 
Bitte sucht zuerst fehler in den Befehlen und erst, wenn ihr da keine findet, in der Rechnung.

das ^ geht nicht, das versteht oblivion nicht. der set-befehl kennt nur addition (+), subtraktion (-), multiplikation (*), division (/) und modulus (%).
wenn ich das richtig sehe, müsstest du dazu den obse-befehl pow verwenden, also statt

set need to need^1.3

musst du

set need to (pow need 1.3)

schreiben.
überprüf aber lieber noch, ob da auch das richtige ergebnis rauskommt, da ich mich mit den englischen mathematischen begriffen leider nicht so gut auskenne.
 
Zuletzt bearbeitet:
ach soo, danke, das müsste richtig sein. base ist Basis, exponent ist Exponent und Basis hoch Exponent ergibt die Potenz.
Ich änder gleich alles um und probier es aus.
 
Es hat leider nicht funktioniert. Trotzdem danke, ich glaube schon, dass dort ein Fehler war und jetzt gelöst wurde.
Da immer, wenn ich den Zauber im spiel einsetze, gar nichts passiert, denke ich, dass ich irgendetwas bei den GetActorValue und/oder SetActorValue Befehlen falsch gemacht habe. Stimmt das?
 
Code:
set health to [player]GetActorValue Health
musst du ersetzen durch
Code:
set Health to Player.GetActorValue Health



Hat das CS da nicht beim kompilieren gemeckert?
 
Warum funktioniert das Script nicht?

Es ist wieder später Abend und ich habe den Tag mit diesem Script verbracht. Es läuft einfach nicht so wie ich es möchte.

Folgendes:

Ich habe 2 AI Packages angelegt.

Das Erste ohne use Horse. Name SaphiriaFollow.

Wenn ich das Erste (SaphiriaFollow, welches im Grunde immer läuft) mit use Horse einstelle, benutzt mein Begleiter das Pferd. Kein Problem. Nur er steigt nicht ab, wenn ich es mache. Wenn ich dann absteige, beamt sie das Pferd unter ihrem Hintern weg. Das schaut reichlich blöd aus. Sie soll also erst absteigen, und dann das Pferd wegbeamen. Darum der Timer und die beiden AI Packages.

Aus diesem Grund habe ich das Zweite SaphiriaRideHorse angelegt.
Einstellungen sind die selben wie beim ersten, nur mit use Horse.

Wenn ich aufs Pferd steige, soll sie ihr Pferd holen und aufsteigen. Steige ich ab, soll sie es auch machen. Nun wechselt sie aber die AI Packages nicht, und der Timer funzt auch nicht. Keine Ahnung ob es vorher schon irgendwie hängt.

Komme hier einfach nicht weiter, und habe auch langsam keine Idee mehr.:huh:
Schaut euch das Script bitte einmal an.
PHP:
Scriptname MeinBegleiter

short SaphiriaHolDeinPferd
float GaulTimer


BeginGameMode


	if player.IsRidingHorse == 1 && SaphiriaRef.IsRidingHorse != 1 && GetIsCurrentPackage SaphiriaRideHorse == 0
		if SaphiriaHolDeinPferd == 0
			set SaphiriaHolDeinPferd to 1
			SaphiriaRef.Cast StandardFortifyAttribLuck2Apprentice Player ; Show
			SalomeRef.moveto SaphiriaRef, 128, 0, 0 
			SalomeRef.PlayMagicEffectVisuals SHLD ; Show
			SalomeRef.PlayMagicEffectVisuals FOHE ; Show
			SalomeRef.PlayMagicEffectVisuals COCR ; Show
			SalomeRef.PlayMagicEffectVisuals NEYE ; Show
			removeScriptPackage SaphiriaFollow	; Wir nicht removed !
			AddScriptPackage SaphiriaRideHorse	; Wird nicht genommen !
		endif
	elseif player.IsRidingHorse != 1 && SaphiriaRef.IsRidingHorse == 1 && GetIsCurrentPackage SaphiriaRideHorse == 1
		if SaphiriaHolDeinPferd == 1
			set SaphiriaHolDeinPferd to 2
			removeScriptPackage SaphiriaRideHorse
			AddScriptPackage SaphiriaFollow
			set SaphiriaHolDeinPferd to 3
		endif
	elseif player.IsRidingHorse != 1 && SaphiriaRef.IsRidingHorse != 1
		if SaphiriaHolDeinPferd == 2
			SaphiriaRef.Cast StandardFortifyAttribLuck2Apprentice Player
			set SaphiriaHolDeinPferd to 3
		endif
	endif

; ### 8 Sec. Zeit um Abzusteigen, zu zaubern und der Gaul verschwindet

	if SaphiriaHolDeinPferd == 3 && SaphiriaIsInCombat == 0 ; Der Gaul soll ja nicht gleich verschwinden, wenn wir unterwegs böse Buben treffen
		set GaulTimer to 8
			if GaulTimer > 0
				set GaulTimer to GaulTimer - GetSecondsPassed
			else
				if GaulTimer == 2
					SaphiriaRef.Cast StandardFortifyAttribLuck2Apprentice Player
					SalomeRef.PlayMagicEffectVisuals SHLD
					SalomeRef.PlayMagicEffectVisuals FOHE
					SalomeRef.PlayMagicEffectVisuals COCR
					SalomeRef.PlayMagicEffectVisuals NEYE
				if GaulTimer == 0
					SalomeRef.moveto SaphiriasThronRef, 50, 0, 0
					set SaphiriaHolDeinPferd to 0
					SalomeRef.ResetHealth
					Message "Salomè ist wieder Zuhause"
				endif
			endif
	endif

end
 
Code:
set health to [player]GetActorValue Health
musst du ersetzen durch
Code:
set Health to Player.GetActorValue Health



Hat das CS da nicht beim kompilieren gemeckert?

Danke. Jetzt funktioniert es endlich. Es heilt zwar aus irgendeinem Grund zwar nur ein drittel und es wird kein Magicka verbraucht, aber jetzt sind schon mal die Befehle richtig und ich kann in der Rechnung nach Fehlern suchen.

Ich danke hiermit allen, die mir geholfen haben.

mfG Battlemage
 
Es ist wieder später Abend und ich habe den Tag mit diesem Script verbracht. Es läuft einfach nicht so wie ich es möchte.

Folgendes:

Ich habe 2 AI Packages angelegt.

Das Erste ohne use Horse. Name SaphiriaFollow.

Wenn ich das Erste (SaphiriaFollow, welches im Grunde immer läuft) mit use Horse einstelle, benutzt mein Begleiter das Pferd. Kein Problem. Nur er steigt nicht ab, wenn ich es mache. Wenn ich dann absteige, beamt sie das Pferd unter ihrem Hintern weg. Das schaut reichlich blöd aus. Sie soll also erst absteigen, und dann das Pferd wegbeamen. Darum der Timer und die beiden AI Packages.

Aus diesem Grund habe ich das Zweite SaphiriaRideHorse angelegt.
Einstellungen sind die selben wie beim ersten, nur mit use Horse.

Wenn ich aufs Pferd steige, soll sie ihr Pferd holen und aufsteigen. Steige ich ab, soll sie es auch machen. Nun wechselt sie aber die AI Packages nicht, und der Timer funzt auch nicht. Keine Ahnung ob es vorher schon irgendwie hängt.

Komme hier einfach nicht weiter, und habe auch langsam keine Idee mehr.:huh:
Schaut euch das Script bitte einmal an.
PHP:
Scriptname MeinBegleiter

short SaphiriaHolDeinPferd
float GaulTimer


BeginGameMode


	if player.IsRidingHorse == 1 && SaphiriaRef.IsRidingHorse != 1 && GetIsCurrentPackage SaphiriaRideHorse == 0
		if SaphiriaHolDeinPferd == 0
			set SaphiriaHolDeinPferd to 1
			SaphiriaRef.Cast StandardFortifyAttribLuck2Apprentice Player ; Show
			SalomeRef.moveto SaphiriaRef, 128, 0, 0 
			SalomeRef.PlayMagicEffectVisuals SHLD ; Show
			SalomeRef.PlayMagicEffectVisuals FOHE ; Show
			SalomeRef.PlayMagicEffectVisuals COCR ; Show
			SalomeRef.PlayMagicEffectVisuals NEYE ; Show
			removeScriptPackage SaphiriaFollow	; Wir nicht removed !
			AddScriptPackage SaphiriaRideHorse	; Wird nicht genommen !
		endif
	elseif player.IsRidingHorse != 1 && SaphiriaRef.IsRidingHorse == 1 && GetIsCurrentPackage SaphiriaRideHorse == 1
		if SaphiriaHolDeinPferd == 1
			set SaphiriaHolDeinPferd to 2
			removeScriptPackage SaphiriaRideHorse
			AddScriptPackage SaphiriaFollow
			set SaphiriaHolDeinPferd to 3
		endif
	elseif player.IsRidingHorse != 1 && SaphiriaRef.IsRidingHorse != 1
		if SaphiriaHolDeinPferd == 2
			SaphiriaRef.Cast StandardFortifyAttribLuck2Apprentice Player
			set SaphiriaHolDeinPferd to 3
		endif
	endif

; ### 8 Sec. Zeit um Abzusteigen, zu zaubern und der Gaul verschwindet

	if SaphiriaHolDeinPferd == 3 && SaphiriaIsInCombat == 0 ; Der Gaul soll ja nicht gleich verschwinden, wenn wir unterwegs böse Buben treffen
		set GaulTimer to 8
			if GaulTimer > 0
				set GaulTimer to GaulTimer - GetSecondsPassed
			else
				if GaulTimer == 2
					SaphiriaRef.Cast StandardFortifyAttribLuck2Apprentice Player
					SalomeRef.PlayMagicEffectVisuals SHLD
					SalomeRef.PlayMagicEffectVisuals FOHE
					SalomeRef.PlayMagicEffectVisuals COCR
					SalomeRef.PlayMagicEffectVisuals NEYE
				if GaulTimer == 0
					SalomeRef.moveto SaphiriasThronRef, 50, 0, 0
					set SaphiriaHolDeinPferd to 0
					SalomeRef.ResetHealth
					Message "Salomè ist wieder Zuhause"
				endif
			endif
	endif

end

1. RemoveScriptPackage funktioniert nie so ganz wie es soll. Ich bin mittlerweile dazu überegangen, die Ai Packages von Anfang an den Npc's hinzuzfügen und sie infach an Variabeln zu binden. Du könntest eine von den Variabeln daoben z.B SapholdeinPferd als Global machen und die Packages diese Global abfragen lassen.

Zu dem Timer, das mit GaulTimer == 2 oder GaulTimer == 0 wird schwer, weil dieser timer vielleicht in 1 von 10 Fällen genau 2 oder 0 erreicht.

Und du hast in einer Zeile einen Punkt vergessen ( Saphiria.IsinCombat == 1 )
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Eddy Kaschinski
Es scheint, als wäre ich mit der Aussage, dass die Befehle jetzt alle richtig sind, ein wenig voreilig gewesen. Durch den Zauber erhöht sich der maximale Wert von HP und Magicka. Vermutlich ist bei den SetActorValue-Befehl etwas falsch. Und kann mir jemand bestätigen, ob dieser pow-Befehl wirklich ein Potenzierbefehl ist?
 
Also, ich habe jetzt herausgefunden, dass es am SetActorValue befehl liegt. Was damit nicht stimmt weiß ich nicht, aber ich habe dieses script geschrieben:

PHP:
set test to Player.GetActorValue Health
set test to test - 10
Player.SetActorValue Health health

und der Zauber hatte zur Folge, dass die max. HP und HP um 40 erhöht wurden.
 
Hi,
Folgendes: Es soll abgefragt werden ob der NPC tot ist und ob man die richtige Queststage erreicht hat. Wenn das der Fall ist soll der NPC am XMarker wieder lebend erscheinen.

Ich bin soweit:

Code:
scn aaIstErTotScript

Begin GameMode
	if (aaNPC.GetDead == 1)&&(GetStage aaIstErTot == 15)
		aaNPCMarker.PlaceAtMe aaNPC 1
	endif		
End

Wo ist der Fehler?
 
PlaceAtMe erschafft einen komplett neuen Npc, ich denke, du willst eigentlich nur, das der alte Npc wiederbelebt wird und am Marker erscheint oder?

Wenn ja füg diese Zeilen hinzu:

Code:
AaaMeinNpc.Resurrect
AaaMeinNpc.MoveToMarker XMarkerRefID

Außerdem solltest du noch eine Abfrage hinzufügen, dass das ganze nur einmal geschieht, so wie das in deinem Script mit PlaceAtMe steht, wird in jedem Frame ein neueer Npc dieser Art hinzugefügt.

@ Battle, ich geh mal davon aus, dass du mit deinem Script die Health des Players um 10 senken willst?

Versuch es mal mit:

Code:
Player.SetAv Healt to Player.GetAvHealth - 10

Oder

Code:
Set NewValue to Player.GetAvHealth
Set Newvalue to NewValue - 10
Player.SetAv Health to NewValue
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Calcho
@ Battle, ich geh mal davon aus, dass du mit deinem Script die Health des Players um 10 senken willst?

Versuch es mal mit:

Code:
Player.SetAv Healt to Player.GetAvHealth - 10

Oder

Code:
Set NewValue to Player.GetAvHealth
Set Newvalue to NewValue - 10
Player.SetAv Health to NewValue

Dieses script war nur ein Beispiel um zu testen, was an meinem anderen script nicht funktioniert.
Wenn ich Player.SetActorValue Health to test schreibe, sagt er mir beim kompilieren, dass ich keine variable namens "to" vordefiniert habe. Der Befehl Player.SetActorValue Health test ist also richtig. Warum er dann etwas Falsches macht, ist auch mir unbegreiflich. Ich werde noch ein bisschen herumprobieren und mich melden, wenn ich etwas herausfinde.
 
Ich suche einen Befehl, der den Spieler einen Zauber ausführen lässt.

Benutze ich "cast", brauche ich eine Reference (z.B.: "player.cast [zauber] [npc]"). Ich möchte aber nicht, dass der Spieler den Zauber auf ein bestimmtes Ziel wirkt, sondern, dass er einfach den Zauber in Blickrichtung zaubert, als würde er es freiwillig und nicht per Script-Befehl tun.

Bei Zaubern "auf sich selbst" ist das kein Problem ("player.cast [zauber] player"). Aber bei Zaubern "bei Berühren" und "auf Ziel" wäre das Ziel bei diesem Befehl trotzdem der Spieler, er zündet sich also selbst an - was natürlich nicht gewollt ist.
 
muss die reference ein npc sein?
sonst könntest du doch zB n xmarker machen, den irgendwo vor den spieler schieben wenn der zauber gecastet werden soll und diesen als referenz nehmen?
 
Das geht wohl nicht, das ganze muss universell anwendbar sein...

Bringt mich aber auf eine Idee...

Code:
scn [Scriptname]

ref source    ;source = unsichtbarer activator, auf den der "bei Berühren"-Zauber gesprochen wird
ref me        ;me = der Spieler

[...]

set source to [ActivatorID]
player.PlaceAtMe source, 1, 50, 0    ;platziert den unsichtbaren Activator 50 Einheiten vor dem Spieler
player.cast [SpellID] source        ;Spieler benutzt den Zauber und verzaubert den Activator
source.disable         ;damit nicht irgendwann alles voller unsichtbarer Kästen ist

[...]

end
Ich hoffe mal, das funktioniert zumindest bei den "bei Berühren"-Zaubern.


edit: Zu den "auf Ziel"-Zaubern:

Code:
scn [Scriptname]

ref spell      ;reference für den Zauber, den der Spieler gerade gewählt hat


[...]

set spell to GetPlayerSpell    ;spell enstpricht nun dem aktuellen Zauber des Spielers
SelectPlayerSpell [SpellID]    ;der Spieler hat nun [SpellID] als aktiven Zauber
[COLOR=Red]....................
[COLOR=Black]SelectPlayerSpell spell         ;setzt den Zauber wieder zurück zum alten

[...]

end[/COLOR][/COLOR]


Bei den roten Punkten hapert es noch. Gibt es soetwas wie "ForceCast", was den Spieler dazu zwingt, den momentan angewählten Zauber auszuführen?

edit: Man könnte das mit Sicherheit über Trigonometrie lösen. Bekannt sind die Blickwinkel des Spielers und die absolute Entfernung vom Spieler zum Objekt (500 Einheiten). Wissen möchte ich X, Y und Z-Entfernung von der Spielerposition. Habe mir schon ein paar Formeln bei Wikipedia angeschaut und durchgerechnet, mir fehlt aber die Zeit und die Lust das ganze auszurechnen...habe jetzt eine Pyramide mit dreieckiger Grundfläche gezeichnet. Eine Ecke ist der Spieler, eine beliebige andere Ecke ist das Objekt (der Activator, auf den der Zauber geworfen werden soll). Wenn mir jemand eine Formel geben kann, mit der ich die X-, Y- und Z-Entfernung vom Objekt zum Spieler in Abhängigkeit vom Blickwinkel und der absoluten Entfernung (sozusagen Luftlinie) vom Spieler zum Objekt ausrechnen kann, wäre ich sehr dankbar. Vielleicht gibt es hier ja Mathematiker, die sowohl solche Formeln kennen als auch den letzten Satz verstanden haben.


Einfacher wäre es aber, wenn es einen (gerne auch OBSE, da bin ich nicht wählerisch), ich nenne es einmal "ForceCast"-Befehl gäbe, der den Spieler dazu veranlasst, sofort den derzeit im Zauber-Slot gewählten Zauber auszuführen....
 
Zuletzt bearbeitet:
Nein gibt es nicht, jedenfalls ist mir kein dementspechender Befehl bekannt. Du könntest doch, einen Activator vor dem Spieler plazieren, der anstatt den Zauber wirkt und danach wieder verschwindet.
 
Das funktioniert auch bei Berührungs-Zaubern, weil ich den Activator einfach direkt vor dem Spieler platzieren kann. Bei Distanzzaubern wird das aber wesentlich schwieriger, weil ich ja die genaue Blickrichtung des Spielers mit einbeziehen muss. Bei Berührungszaubern ist das immer geradeaus, bei Distanzzaubern auch mal nach oben, unten oder zur Seite.