PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 probleme mit meinem Skript



Orios das auge
15.08.2009, 17:20
hallo

wie oben erwähnt habe ich 2 Probleme mit folgendem skript


scn aaarmorbrokenc

short init
short next
short EquipDelay
long objecthealth
ref Actor

Begin onEquip
if init == 0
set Actor to getcontainer
set init to 1
endif
end

Begin GameMode
if init == 1
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
message "Rüstung ist beschädigt!"
set next to 1
set objecthealth to getObjectHealth aamodiamelion
Actor.addItem aamodiamelionbroken 1
set init to 0
if next == 1
set EquipDelay to 1
endif
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItem aamodiamelion
Actor.EquipItem aamodiamelionbroken
Actor.setEquippedCurrentHealth objecthealth 2
removeMe
endif
endif
end

1. der skript funktioniert bei mir aber nicht bei NPC´s

2. setObjectHealth funktioniert nicht <= "GELÖST"

freue mich über jede hilfe :)

Chao-Ren
15.08.2009, 18:11
Heißt das anstatt "SetObjectHealth" nicht "SetHealth"? So war's zumindest in MW.

Orios das auge
15.08.2009, 18:16
ne der befehl heisst so Link (http://cs.elderscrolls.com/constwiki/index.php/SetObjectHealth)

Low Post
15.08.2009, 20:11
Was willst du mit SetObjectHealth denn beeinflussen?

Wenn du die aktuelle "Gesundheit" des Objekts beeinflussen willst ist das der falsche Befehl.
Dazu benötigst du G/SetCurrentHealth.


Problem: dazu benötigst du die Referenz des Objekts, da es sich aber in einem Inventar befindet ist es keine Referenz (bzw. bei Ausführung des Scriptes eine temporäre) --> funktioniert nicht



Lösung: du musst über G/SetEquippedCurrentHealth gehen.


SetObjectHealth beeinflusst die maximale Gesundheit (wird Ingame nicht angezeigt, das ist nur der prozentuale Wert). Die kannst du im CS aber direkt festlegen, da du die IDs ja augenscheinlich kennst ist der Befehl imho recht sinnfrei. ;)

Orios das auge
15.08.2009, 20:49
danke für die antwort

ich möchte damit den aktuelle zustand der Rüssi auf der Rüssi übertragen die durch den Skript ausgerüsted wird

ok hab den Skript jetzt ma Aktualisiert

es funktioniert aber immer noch nicht:confused:

aamodiamelionbroken hat immer noch 100 %

SirTroy
15.08.2009, 22:45
scn aaarmorbrokenc

short init
short next
short EquipDelay
long objecthealth
ref Actor

Begin onEquip
if init == 0
set Actor to getself
set init to 1
endif
end

Begin GameMode
if init == 1
if (( getEquippedCurrentHealth / getObjectHealth aamodiamelion ) >= 0 ) && (( getequippedCurrentHealth / getObjectHealth aamodiamelion ) <= 0.75 )
message "Rüstung ist beschädigt!"
set next to 1
set objecthealth to getObjectHealth aamodiamelion
Actor.addItem aamodiamelionbroken 1
set init to 0
if next == 1
set EquipDelay to 1
endif
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItem aamodiamelion
Actor.EquipItem aamodiamelionbroken
Actor.setEquippedCurrentHealth objecthealth 2
removeMe
endif
endif
end

Ich versuch mal mein glück, kanns nicht testen.

Orios das auge
15.08.2009, 22:57
jetzt sagt cs mir

script error

Script "aarmorbrokenb" line 18 missing parameter int.

hab jetzt aber keine ahnung was ich da tuhen soll:confused:

SirTroy
15.08.2009, 23:01
scn aaarmorbrokenc

short init
short next
short EquipDelay
long objecthealth
ref Actor

Begin onEquip
if init == 0
set Actor to getself
set init to 1
endif
end

Begin GameMode
if init == 1
if (( getEquippedCurrentHealth 2 / getObjectHealth aamodiamelion ) >= 0 ) && (( getequippedCurrentHealth 2 / getObjectHealth aamodiamelion ) <= 0.75 )
message "Rüstung ist beschädigt!"
set next to 1
set objecthealth to getObjectHealth aamodiamelion
Actor.addItem aamodiamelionbroken 1
set init to 0
if next == 1
set EquipDelay to 1
endif
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItem aamodiamelion
Actor.EquipItem aamodiamelionbroken
Actor.setEquippedCurrentHealth objecthealth 2
removeMe
endif
endif
end

Sry hatte die 2 vergessen

Orios das auge
15.08.2009, 23:09
wenn ich jetzt die rüssi anziehe verschwindet se auch gleich wieder (auch aus inventar)
die neue rüssi taucht denn aber auch net auf:confused:

Low Post
16.08.2009, 00:28
Du musst natürlich auch GetCurrentHealth verwenden um den Wert zu speichern. ;)

Probier das mal:

scn aaarmorbrokenc

short init
short next
short EquipDelay
long objecthealth
ref Actor

Begin onEquip
if init == 0
set Actor to getcontainer
set init to 1
endif
end

Begin GameMode
if init == 1
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
message "Rüstung ist beschädigt!"
set next to 1
set objecthealth to getCurrentHealth
Actor.addItem aamodiamelionbroken 1
set init to 0
;Abfrage war sinnlos (immer wahr), daher entfernt
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItem aamodiamelion
Actor.EquipItem aamodiamelionbroken
Actor.setEquippedCurrentHealth objecthealth 2
removeMe
endif
endif
end

Orios das auge
16.08.2009, 00:39
es geht :eek: http://www.multimediaxis.de/images/smilies/old/sm_12.gif http://www.multimediaxis.de/images/smilies/old/sm_12.gifhttp://www.multimediaxis.de/images/smilies/old/sm_12.gifhttp://www.multimediaxis.de/images/smilies/old/sm_12.gif
und ich hatte schon fast aufgegeben^^"

jetzt bleibt nur noch das problem das der Skript nicht funktioniert wenn ein NPC die rüssi trägt

Low Post
16.08.2009, 02:57
Füge doch mal folgendes zu Testzwecken in den Gamemode-Block ein:

if ( ( Actor.GetIsReference Player ) == 0 ) && ( IsFormValid Actor )
Print ( Actor.GetName ) + " (" + ( Actor.GetFormIDString ) + ") als Container im Gamemode-Block."
endif


Wenn der Gamemode-Block läuft (und sich das Item nicht im Inventar des Spielers befindet) sollte das deine Konsole zuspammen: <Name> (<FormID>) als Container im Gamemode-Block.
Wenn da nichts erscheint läuft der Gamemode-Block einfach nicht. ;)

Orios das auge
16.08.2009, 10:51
ok ich habe das ma gleich am anfang des blocks eingefügt
und die konsole wure mit folgendem immer wieder zugespamt

Error in script b5000eed
Attempting to call a function on a NULL reference or base object
Error in script b5000eed
An expression failed to evaluate to a valid result

dabei spielte es keine rolle ob ich oder ein npc die rüssi hatte

kleine frage am rande zu setEquippedCurrentHealth

was für eine slot id muss ich eigendlich angeben wen ich z.B. eine rüssi wie das Arenagewand nehmen will?

Low Post
16.08.2009, 14:14
Oh, sorry. Hab eine Abfrage vergessen.
Script wurde editiert.


was für eine slot id muss ich eigendlich angeben wen ich z.B. eine rüssi wie das Arenagewand nehmen will?

Seit der neuesten OBSE-Beta (v0018 Beta 3) reicht es aus einen Slot anzugeben, der von der Rüstung verwendet wird. Davor könntest du noch 18 (http://cs.elderscrolls.com/constwiki/index.php/GetEquippedCurrentHealth) ausprobieren, aber da das Arenagewand auch noch die Füße und Hände besetzt (IIRC) wird das nicht funktionieren.

Einzige Möglichkeit wäre dann SetCurrentHealth, wofür das Item aber z.B. außerhalb des Inventars (da als Referenz) beeinflusst werden muss. Außerdem wurde das auch erst mit o.g. Beta eingefügt. ;)

Orios das auge
16.08.2009, 14:59
ok die konsole wird nicht zugespamt

ich habe jetzt allerdings noch ein problem bemerkt

wenn ich das spiel lade u die rüssi schon an habe wird der begin onEquipp block ja nicht ausgeführt darum habe ich die befehle in den block ma in den gamemod block übernommen und mit einer doonce variable versehen

siehe hier

scn aaarmorbrokenb

short doonce
short init
short next
short EquipDelay
long objecthealth
ref Actor

Begin GameMode
if ( ( Actor.GetIsReference Player ) == 0 ) && ( IsFormValid Actor )
Print ( Actor.GetName ) + " (" + ( Actor.GetFormIDString ) + ") als Container im Gamemode-Block."
endif
if init == 0 && doonce == 0
set Actor to getcontainer
set init to 1
set doonce to 1
endif
if init == 1
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
message "Rüstung ist beschädigt!"
set next to 1
set objecthealth to getCurrentHealth
Actor.addItem aamodiamelionbroken 1
set init to 0
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItem aamodiamelion
Actor.EquipItem aamodiamelionbroken
Actor.setEquippedCurrentHealth objecthealth 2
removeMe
endif
endif
end
allerdings funktioniert das nur wenn die rüstung dem entsprechend beschädigt ist und ich das spiel Speicher,neu starte und dann lade:confused:
beim normalem laden (ohne game ausmachen oder cell wechsel funktioniert das nicht:confused:

Low Post
16.08.2009, 16:04
ok die konsole wird nicht zugespamt

Bedeutet: entweder hat kein NPC das im Inventar, oder der Gamemode-Block läuft dann einfach nicht ab.



Zum Script:
Die Variablen werden eigentlich gespeichert, also sollte es nicht nötig sein das zu ändern.
Falls du aber unbedingt willst würde ich dir GetEquipped (http://cs.elderscrolls.com/constwiki/index.php/GetEquipped) empfehlen.

Orios das auge
16.08.2009, 16:20
zu 1. nein ich habe mir einen x beliebigen Npc ausgesucht und ihn das teil ins inventar geklatscht (kann ich durch ein mod) und in der konsole ist nix erschienen

zu 2. nee der effeckt ist der gleiche als wenn ich doonce ganz weglasse was bedeuted das ganz viele aamodiamelionbroken im inventar auftauchen aber nicht ausgerüsted werden (die rüstung die angelegt ist bleibt aber auch angelegt)

Low Post
16.08.2009, 17:31
1.: Da kann man leider nicht großartig etwas dran ändern.

2.) Hab mir dein Script jetzt nicht angesehen, aber probier mal das hier:

scn aaarmorbrokenc

short next
short EquipDelay
long objecthealth
ref Actor

Begin GameMode
if Actor == 0
set Actor to GetContainer
elseif ( Actor.GetEquipped aamodiamelion ) && ( next == 0 )
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
message "Rüstung ist beschädigt!"
set next to 1
set objecthealth to getCurrentHealth
Actor.addItem aamodiamelionbroken 1
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItem aamodiamelion
Actor.EquipItem aamodiamelionbroken
Actor.setEquippedCurrentHealth objecthealth 2
removeMe
endif
endif
end

Orios das auge
16.08.2009, 18:09
zu 1. heist das jetzt das ich npc´s doch keine dellen in die rüstung kloppen kann?:(

zu 2. thx das hat funktioniert:)

Low Post
16.08.2009, 19:17
Zumindest nicht auf diese Art.
Vermutlich müsstest du den Weg über Eigenschaften mit ScriptEffekt gehen, oder du regelst gleich alles in einem QuestScript.

Orios das auge
16.08.2009, 19:54
ok Scripteffeckt wäre schlecht da der Skript ja auch bei verzauberten sachen funktionieren soll

Könntest du mir das mit den Quest Skript vieleicht genauer erklären
sry das ich so blöd frage aber hatte mit Quest´s noch nicht viel am Hut

Low Post
16.08.2009, 21:27
Um ein QuestScript wirst du nie herumkommen. Entweder um den NPCs die Eigenschaft hinzuzufügen (macht übrigens keinen Unterschied, ob die Rüstung verzaubert wurde oder nicht), oder um den Effekt gleich dort zu erledigen.



QuestScripts unterscheiden sich von sonstigen Scripten nur darin, dass sie keine Referenz haben (sprich: wenn eine Funktion einen CallingActor benötigt muss der angegeben werden), sie mittels StopQuest/StartQuest gestoppt/gestartet werden können und mittels der (lokalen) Variable fQuestDelayTime kontrolliert wird, wie oft ein Gamemode/Menumode-Block läuft.
Ansonsten ist so ziemlich alles gleich: stelle den Typ auf Quest, erstelle eine neu Quest und füge dein Script als das Script der Quest ein. Hin und wieder ist es auch sinnvoll den Haken bei SetGameEnabled zu entfernen (hier wahrscheinlich nicht).

Orios das auge
16.08.2009, 21:52
bedeuted das nicht das der skript dadurch Global wird
und das wen ich für jede rüssi ein passenden Skript erstelle das sehr an die performence
geht?

zu scripteffektstart : dadurch muss ich doch automatisch jede rüssi die den skript benutzt verzaubern was ja blöd währ wenn ich den skript für jede rüssi im Spiel benutzen will

Low Post
16.08.2009, 22:17
Nö, nicht die Rüstung verzaubern, sondern den NPCs eine Eigenschaft (!= Verzauberung) hinzufügen die das entsprechende erledigt. ;)

Performance dürfte hauptsächlich dadurch beeinträchtigt werden, dass du immer jeden NPC neu durchgehen musst. Mehrere Rüstungen (lassen sich btw. auch in einem Script erledigen) machen da den Braten auch nicht mehr fett.

Orios das auge
16.08.2009, 22:33
Nö, nicht die Rüstung verzaubern, sondern den NPCs eine Eigenschaft (!= Verzauberung) hinzufügen die das entsprechende erledigt. ;)
achso mit addspell
bloß wie deklariere ich dafür die entsprechende ref varieable(also die für Actor)?



Performance dürfte hauptsächlich dadurch beeinträchtigt werden, dass du immer jeden NPC neu durchgehen musst. Mehrere Rüstungen (lassen sich btw. auch in einem Script erledigen) machen da den Braten auch nicht mehr fett.

das wäre nich so gut da meine performens sowieso schon nichh so doll ist

Low Post
16.08.2009, 22:47
Scripte sind allgemein nicht so Performance-lastig, dass sollte also weniger das Problem sein.

Die umstehenden NPCs kannst du auf mehreren Wegen bekommen:
Zauber mit großer Reichweite auf den Spieler abfeuern (z.B. von einem Activator der vorher über dem Spieler platziert wird). Das Ziel in dem ScriptEffect (GetSelf) ist dann alles, was sich in der Reichweite befindet.

Mittels OBSE-Funktionen GetFirst/NextRef in einem Loop.


Alles muss in regelmäßigen Abständen überprüft werden, da die NPCs ja wandern.

Orios das auge
17.08.2009, 12:57
ok wenn ich den skript in einen Questskript umwandeln will
sagt cs folgendes

scripterror "aaarmorbroken" on line 10
reference function "getcontainer" requieres explicit reference in quest script
getContainer funzt also nich Getself geht ine einem GameMode block ja auch net gibt sonst noch was das ich überprüfen kann

das mit den callingActor verstehe ich jetzt net so ganz ^^"

wie füge ich ein Activator über den Spieler ein ??
das mit den zauber ist iwie nich so toll wollte ja nicht immer ein dicken zauber wirken lassen (oder geht das alles auch automatisch ganz ohne visualen Effekten)

Edit: weiss jetzt aber net so ganz wie ich mehrere rüssies in einem skript erlediegen soll

Low Post
17.08.2009, 13:54
Mäh, keine Lust mehr.
Hier eine Eigenschaft-Verteil-Quest aus einem meiner Mods:


scn LPUSfEQuDistributionScript

;Global: short LPUSfEGlbEnableNPC ; set LPUSfEGlbEnableNPC to 0 if you want to deactivate the NPC-component of this Plugin
;Global: float LPUSfEGlfVersion ; Version of "Unarmored Skill for Everyone"
long lCount
long lNumber
float fQuestDelayTime
ref rCell
ref rNPC
ref rScript

Begin Gamemode
set rScript to LPUSfEQuDistributionScript
;------------------------------------------------------------------------
; Conditions
;------------------------------------------------------------------------
if ( LPUSfEGlfVersion == 0 ) || ( LPUSfEGlbEnableNPC == 0 ) || ( LPUSfEQuInitialization.iShutDown )
Return
endif
if ( rCell != ( Player.GetParentCell ) )
set rCell to ( Player.GetParentCell )
set lNumber to -1
endif
if ( lNumber != ( GetNumRefs 35 1 ) )
set lNumber to ( GetNumRefs 35 1 )
set lCount to 0
While ( lCount < lNumber )
if ( lCount )
set rNPC to ( GetNextRef )
else
set rNPC to ( GetFirstRef 35 1 )
endif
let lCount += 1
if ( rNPC.GetDead )
PrintD ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " " + ( rNPC.GetName ) + " (" + ( rNPC.GetFormIDString ) + ") is dead.%r" + ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " NPC " + ( ToString lCount ) + " / " + ( ToString lNumber )
elseif ( rNPC.GetIsReference Player )
PrintD ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " " + ( rNPC.GetName ) + " (" + ( rNPC.GetFormIDString ) + ") is the Player.%r" + ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " NPC " + ( ToString lCount ) + " / " + ( ToString lNumber )
elseif ( rNPC.HasSpell LPUSfEAbMain )
PrintD ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " " + ( rNPC.GetName ) + " (" + ( rNPC.GetFormIDString ) + ") already has the Unarmored Skill.%r" + ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " NPC " + ( ToString lCount ) + " / " + ( ToString lNumber )
else
rNPC.AddSpell LPUSfEAbMain
PrintD ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " Added Unarmored Skill to " + ( rNPC.GetName ) + " (" + ( rNPC.GetFormIDString ) + ").%r" + ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " NPC " + ( ToString lCount ) + " / " + ( ToString lNumber )
endif
Loop
PrintD ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " Cell " + ( GetName rCell ) + " (" + ( GetFormIDString rCell ) + ": %q" + ( GetEditorID rCell ) + "%q) tested.%r" + ( ASCIIToChar 2 ) + "LPUSfE (" + ( GetFormIDString rScript ) + "):" + ( ASCIIToChar 3 ) + " NPCs: " + ( ToString lNumber )
endif
End

Begin Menumode
;------------------------------------------------------------------------
; Conditions
;------------------------------------------------------------------------
if ( LPUSfEGlfVersion == 0 ) || ( LPUSfEGlbEnableNPC == 0 ) || ( LPUSfEQuInitialization.iShutDown )
Return
endif
if ( IsPlayerMovingIntoNewSpace ) || ( rCell != ( Player.GetParentCell ) )
set rCell to ( Player.GetParentCell )
set lNumber to -1
endif
End


Der Effekt der Eigenschaft wäre dann folgender:

scn aaarmorbrokenc

short next
short EquipDelay
long objecthealth
Begin ScriptEffectUpdate
if ( GetEquipped aamodiamelion ) && ( next == 0 )
if ( ( getEquippedCurrentHealth 2 ) / ( getObjectHealth aamodiamelion ) >= 0 ) && ( ( getEquippedCurrentHealth 2 ) / ( getObjectHealth aamodiamelion ) <= 0.75 )
message "Rüstung ist beschädigt!"
set next to 1
set objecthealth to ( getEquppedCurrentHealth 2 )
addItem aamodiamelionbroken 1
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
UnEquipItem aamodiamelion
EquipItem aamodiamelionbroken
setEquippedCurrentHealth objecthealth 2
RemoveItem aamodiamelion 1
endif
endif
end

Orios das auge
17.08.2009, 14:56
Mäh, keine Lust mehr.
Mäh, kann ich verstehen :D

o_ojetzt verstehe ich erst wie sowas aufgebaut ist

auf jedenfall großes danke für alle zeit und müh http://www.multimediaxis.de/images/smilies/old/1/respekt_2.gif

2 kleine frage habe ich jedoch noch

ich müsste getFirstRef 69(Actor) 1
nehmen wen ich Player mit einbeziehen will richtig?

was ist Loop? ich vermute ma das ist das für while was endif füt if

//Edit

habe das jetzt so probiert


scn aavictimsofbroken


long Count
long Number
float fQuestDelayTime
ref victim
ref Cell


begin GameMode

set fQuestDelayTime to 1
if ( Cell != ( Player.GetParentCell ) )
set Cell to ( Player.GetParentCell )
set Number to -1
endif
if ( Number != ( GetNumRefs 69 1 ) )
set Number to ( GetNumRefs 69 1 )
set Count to 0
While ( Count < Number )
if ( Count )
set victim to ( GetNextRef )
else
set victim to ( GetFirstRef 69 1 )
endif
set Count to Count +1
if victim.getEquippedObject 2 > 0
if getIsID aamodiamelion
victim.addSpell
elseif getIsID aamodiamelionbroken
victim.addSpell
endif
endif
loop
endif
end

jetzt sagt er mir allerdings

reference function getIsID requires explicit reference in questSkript

sry das ich dich weiter belästige

Low Post
17.08.2009, 17:09
Actor bedeutet NPCs & Kreaturen.
Wenn du den Spieler mit einbeziehen willst mach den einfach am Schluss, wenn der Rest schon durch ist. ;)


Die Fehlermeldung kommt, weil der nicht weiß für welche Referenz er GetIsID überprüfen soll. Für deine Zwecke sollte es ein einfaches == tun. ;)


scn aavictimsofbroken


long Count
long Number
float fQuestDelayTime
ref victim
ref Object
ref Cell


begin GameMode

set fQuestDelayTime to 1
if ( Cell != ( Player.GetParentCell ) )
set Cell to ( Player.GetParentCell )
set Number to -1
endif
if ( Number != ( GetNumRefs 35 1 ) )
set Number to ( GetNumRefs 35 1 )
set Count to 0
While ( Count <= Number )
if ( Count )
set victim to ( GetNextRef )
elseif ( Count == Number )
set victim to Player
else
set victim to ( GetFirstRef 35 1 )
endif
set Count to Count + 1
if Eval ( Object := ( victim.getEquippedObject 2 ) )
if Object == aamodiamelion || Object == aamodiamelionbroken
victim.addSpell <ID>
endif
endif
loop
endif
end

Orios das auge
17.08.2009, 18:38
ok leider passiert nichts

ich habe das folgendermaßen probiert

quest einstellung
priority 60
skript aavictimsofbroken (habe da aus if Object == aamodiamelion || Object == aamodiamelionbroken

if Object == aamodiamelion
victim.addspell aamodiamelionbrokenSP
elseif object == aamodiamelionbroken
viktim.addspell aamodiamelionhealthSP
endif
gemacht sollen ja 2 verschiedene Effekte auftreten sonst habe ich aber nichts geändert ;)

häkchen start game enable

zauber einstellung

type eigenschaft
häkchen Auto-calculate

Effects

effect Skript Effekt
range selbst
school Veränderung
skript aamodiamelionbrokenspell
häkchen Effect is hostile

alles nicht erwähnte habe ich nicht geändert (nur name u ID habe ich jetzt nicht immer angegeben)
muss in game eigendlich die eigenschaft da sichtbar werden wo z.B. anfälligkeit feuer etc steht

edit: ok bei quest hab ich dir Priority auf 0 gesetzt



scn aavictimsofbroken


long Count
long Number
float fQuestDelayTime
ref victim
ref Object
ref Cell


begin GameMode

set fQuestDelayTime to 1
if ( Cell != ( Player.GetParentCell ) )
set Cell to ( Player.GetParentCell )
set Number to -1
endif
if ( Number != ( GetNumRefs 35 1 ) )
set Number to ( GetNumRefs 35 1 )
set Count to 0
while ( Count <= Number )
if ( Count )
set victim to ( GetNextRef )
elseif ( Count == Number )
set victim to Player
message "player hat object"
else
set victim to ( GetFirstRef 35 1 )
endif
set Count to Count + 1
if Eval ( Object := ( victim.getEquippedObject 2 ) )
if Object == aamodiamelion
victim.addSpell aamodiamelionbrokenSP
elseif Object == aamodiamelionbroken
victim.addSpell aamodiamelionhealthSP
endif
endif
Loop
endif
end

fuktioniert allerdings immer noch nicht:(

message taucht nur auf wenn kein NPC in der cell ist
in der ich bin

frage: was macht if (count)?

Orios das auge
21.08.2009, 22:45
ok habe es hinbekommen

Orios das auge
30.09.2010, 17:55
Alle Jahre wiederhttp://www.multimediaxis.de/images/smilies/old/s_065.gif

so nach dem ja so ein Jahr vergangen ist habe ich mal meinen Skript wieder Ausgegraben.
Der sich im laufe der Zeit ein wenig verändert hat und jetzt so Aussieht.


Scriptname aaTestcuirassa

short next
short EquipDelay
long objecthealth
ref Actor
ref britem

Begin GameMode
if Actor == 0
set Actor to GetContainer
elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 0 )
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
set next to 1
set objecthealth to getCurrentHealth
Actor.addItemNS aaTestcuirassb 1
Actor.addItemNS brTestcuirass1Splitter 1
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItemNS aaTestcuirass
Actor.EquipItemNS aaTestcuirassb
Actor.setEquippedCurrentHealth objecthealth 2
Actor.Drop brTestcuirass1Splitter 1
set britem to brTestcuirass1Splitter
britem.moveto Actor 0,0,9
removeMe
endif
elseif Actor != 0
set Actor to 0
endif
end

Jetzt habe ich da 2 Problem

1. Script wird wenn ich im Spiel bin und denn lade. (nicht wenn ich Obl gerade gestartet habe ) öfters mal ignoriert (nicht immer aber doch recht oft).
2. nachdem ich die sache mit den Drop eingefügt habe. löst der Script ein CTD in Exterior Bereichen aus, im interior funktioniert es so aber.

Low Post
30.09.2010, 19:10
Ich nehme an brTestcuirass1Splitter ist ein base object id (sonst würde Drop (http://cs.elderscrolls.com/constwiki/index.php/Drop)auch nicht funktionieren).
Dadurch, dass du
set britem to brTestcuirass1Splitter
britem.moveto Actor 0,0,9
verwendest benötigst du aber die Referenz.

Die einzige Möglichkeit diese zu bekommen wäre GetFirst/NextRef. Du solltest allerdings (mindestens) einen Frame warten, bis du sie auch verwendest.


Das erklärt zwar nicht den CTD, allerdings warum das Script nach dem ersten Durchlauf nicht mehr funktioniert (wird gestoppt, bis Oblivion neu gestartet wird).

Orios das auge
30.09.2010, 22:31
Die einzige Möglichkeit diese zu bekommen wäre GetFirst/NextRef. Du solltest allerdings (mindestens) einen Frame warten, bis du sie auch verwendest. habe mich mal im cswiki schlau gemacht da steht ja irgendwas von While Loop Schleifehttp://www.multimediaxis.de/images/smilies/old/1/nixweiss.gif, sorry wegen meiner Unwissenheit aber ich habe keine ahnung wie die funktioniert.:o


Ich nehme an brTestcuirass1Splitter ist ein base object id Jep ein Miscitem um´s Genauer zu sagen


Das erklärt zwar nicht den CTD, allerdings warum das Script nach dem ersten Durchlauf nicht mehr funktioniert (wird gestoppt, bis Oblivion neu gestartet wird). das der Script nach dem laden Gerne nicht funktioniert war schon bevor ich die sache mit Drop Reingenommen habe.

Sprich als der Script noch so aussah
Scriptname aaTestcuirassa

short next
short EquipDelay
long objecthealth
ref Actor
ref britem

Begin GameMode
if Actor == 0
set Actor to GetContainer
elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 0 )
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
set next to 1
set objecthealth to getCurrentHealth
Actor.addItemNS aaTestcuirassb 1
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItemNS aaTestcuirass
Actor.EquipItemNS aaTestcuirassb
Actor.setEquippedCurrentHealth objecthealth 2
removeMe
endif
elseif Actor != 0
set Actor to 0
endif
end

Low Post
01.10.2010, 17:07
Bei einer While-Schleife wird einfach alles zwischen dem While und Loop (angenommen Break/Continue wird nicht verwendet) so oft wiederholt, bis die While-Bedingung nicht mehr zutrifft. In dem Wiki-Beispiel (http://cs.elderscrolls.com/constwiki/index.php/GetFirstRef) ist das so lange der Fall, wie GetNextRef einen Wert != 0 ausgibt.

Warum das Script sonst anhält kann ich nur vermuten. Mein Ansatz wäre jetzt, dass ein unequip & equip, die den gleichen Slot betreffen nicht im selben Frame stehen dürfen. Ich würde dazu einfach das unequip weglassen.
Ich würde dir allerdings empfehlen ein paar Print (http://cs.elderscrolls.com/constwiki/index.php/Print)(C (http://cs.elderscrolls.com/constwiki/index.php/PrintC))-Befehle einzufügen. Damit kannst du kontrollieren, wie weit das Script durchläuft. Der Fehler ist dann auf jeden Fall danach.

Orios das auge
01.10.2010, 18:19
Habe mal versucht so ein While Loop einzubauen


Scriptname aaTestcuirassa

short next
short EquipDelay
long objecthealth
ref Actor
ref britem

Begin GameMode
if Actor == 0
set Actor to GetContainer
elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 0 )
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
set next to 1
set objecthealth to getCurrentHealth
Actor.addItemNS aaTestcuirassb 1
Actor.addItemNS brTestcuirass1Splitter 1
Actor.Drop brTestcuirass1Splitter 1
set britem to GetFirstRef 27 1
While ( britem != brTestCuirass1Splitter )
set britem to GetNextRef
Loop
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItemNS aaTestcuirass
Actor.EquipItemNS aaTestcuirassb
Actor.setEquippedCurrentHealth objecthealth 2
britem.moveto Actor 0,0,150
removeMe
endif
elseif Actor != 0
set Actor to 0
endif
end Das war jetzt mein Erster versuch. Führt allerdings nur zum CTD :(

auf der CS Wiki steht ja irgendwas von ; do something with pDoor innerhalb der While Loop Schleife heißt das ich muss da jetzt noch was anderes machen als nur GetNextRef :confused:

Low Post
02.10.2010, 12:45
Da britem eine Referenz ist (GetFirst/NextRef gibt nur Referenzen aus) wird es nie gleich dem base object brTestCuirass1Splitter sein. Versuch mal folgenden While-Loop:

While ( britem.GetIsID brTestCuirass1Splitter )


Was den CTD betrifft:
Konsole lässt sich da ja schwer überprüfen, von daher musst du auf den (undokumentierten) Befehl dbg_echo zurückgreifen. Der verwendet die gleiche Syntax wie PrintC, schreibt den Inhalt aber nicht nur in die Konsole, sondern auch in die Datei obse.log im Oblivion-Verzeichnis.
Der Befehl sollte aber nur zum De-bugging (Fehlersuche) verwendet werden und aus der Release-Version wieder gelöscht werden.

Orios das auge
02.10.2010, 15:23
Ok jetzt gibt es kein CTD mehr (auch nicht im Exterior 8))

allerdings Passieren jetzt andere Merkwürdige dinge o_O

1. Der Bildschirm wird für ein Bruchteil einer Sekunde Schwarz
2. Der Gegner Steckt danach die waffe weg und Zieht sie wieder erneut
3. Die Musik wird zurück gesetzt
und 4. bei 3 meiner 8 Versuche wurde das Wetter nach dem Blackscreen geändert:eek:

und Moveto scheint nicht zu Funktionieren (Der Gegenstand brTestcuirass1Splitter erscheint vor der Brust von Player und nicht ein Stück über´m Kopf so wie es bei moveto 0,0,150 ja eigendlich sein soll)

Hier der Script

Scriptname aaTestcuirassa

short next
short EquipDelay
long objecthealth
ref Actor
ref britem

Begin GameMode
if Actor == 0
set Actor to GetContainer
dbg_echo "Actor to container frame 1", Actor
elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 0 )
if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
set next to 1
set objecthealth to getCurrentHealth
Actor.addItemNS aaTestcuirassb 1
dbg_echo "if frame 2", Objecthealth
Actor.addItemNS brTestcuirass1Splitter 1
Actor.Drop brTestcuirass1Splitter 1
set britem to GetFirstRef 27 1
While ( britem.GetIsID brTestcuirass1Splitter )
set britem to GetNextRef
dbg_echo "While", britem
Loop
set EquipDelay to 1
endif
elseif next == 1
if EquipDelay >= 1
dbg_echo "EquipDelay frame 3", EquipDelay
set EquipDelay to EquipDelay - 1
elseif EquipDelay == 0
set next to 0
Actor.UnEquipItemNS aaTestcuirass
Actor.EquipItemNS aaTestcuirassb
Actor.setEquippedCurrentHealth objecthealth 2
britem.moveto Actor 0,0,150
dbg_echo " move to frame 4", britem
removeMe
endif
elseif Actor != 0
set Actor to 0
dbg_echo "Actor Reset frame 5"
endif
end

und die Obse.log

if frame 2
While
Error in script 42001ca0
Attempting to call a function on a NULL reference or base object
File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>
Error in script 42001ca0
An expression failed to evaluate to a valid result
File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>
EquipDelay frame 3
Actor Reset frame 5
Actor to container frame 1
Actor Reset frame 5
Actor to container frame 1
Actor Reset frame 5
Actor to container frame 1
Actor Reset frame 5
Actor to container frame 1
Actor Reset frame 5
Actor to container frame 1
Actor Reset frame 5
...usw...

Low Post
03.10.2010, 01:17
Error in script 42001ca0
Attempting to call a function on a NULL reference or base object
File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>
Error in script 42001ca0
An expression failed to evaluate to a valid result
File: Brokenarmor.esp Offset: 0x0131 Command: <unknown>

Das weist auf einen Syntax-Fehler hin: Eine Funktion, die einen best. Wert benötigt wird mit einer Null-Referenz/base object aufgerufen.

Probier mal den ScriptViewer (http://home.comcast.net/~scruggsyW/obse/ScriptViewer.zip) aus, da kannst du sehen, was die Offset-Werte bedeuten (stehen für eine Position im Script).


Ich vermute, dass es die While-Schleife selbst ist. Das passiert aber nur, wenn keiner der entsprechenden Werte brTestcuirass1Splitter als Base Object hat. Sicher, dass du den richtigen Filter bei GetFirstRef verwendest?

Orios das auge
03.10.2010, 12:47
Ok hat mir nicht viel gebracht da sind bei mir keine übereinstimmenden Offset werte gibt


1 0000 Scriptname aaTestcuirassa
2
3 short next
4 short EquipDelay
5 long objecthealth
6 ref Actor
7 ref britem
8
9 0004 Begin GameMode
10 000E if Actor == 0
11 001F set Actor to GetContainer
12 002E dbg_echo "Actor to container frame 1", Actor
13 0053 elseif ( Actor.GetEquipped aaTestcuirass ) && ( next == 0 )
14 0075 if getCurrentHealth / getObjectHealth >= 0 && getCurrentHealth / getObjectHealth <= 0.75
15 00AD set next to 1
16 00B8 set objecthealth to getCurrentHealth
17 00C7 Actor.addItemNS aaTestcuirassb 1
18 00D9 dbg_echo "if frame 2", Objecthealth
19 00EE Actor.addItemNS brTestcuirass1Splitter 1
20 0100 Actor.Drop brTestcuirass1Splitter 1
21 0112 set britem to GetFirstRef 27 1
22 012D While ( britem.GetIsID brTestcuirass1Splitter )
23 0144 set britem to GetNextRef
24 0153 dbg_echo "While", britem
25 0163 Loop
26 0167 set EquipDelay to 1
27 0172 endif
28 0176 elseif next == 1
29 0187 if EquipDelay >= 1
30 0198 dbg_echo "EquipDelay frame 3", EquipDelay
31 01B5 set EquipDelay to EquipDelay - 1
32 01C6 elseif EquipDelay == 0
33 01D7 set next to 0
34 01E2 Actor.UnEquipItemNS aaTestcuirass
35 01EF Actor.EquipItemNS aaTestcuirassb
36 01FC Actor.setEquippedCurrentHealth objecthealth 2
37 020E britem.moveto Actor 0,0,150
38 0236 dbg_echo " move to frame 4", britem
39 0251 removeMe
40 0257 endif
41 025B elseif Actor != 0
42 026C set Actor to 0
43 0277 dbg_echo "Actor Reset frame 5"
44 0292 endif
45 0296 end

Low Post
03.10.2010, 14:29
Ok hat mir nicht viel gebracht da sind bei mir keine übereinstimmenden Offset werte gibt
Interessant ist immer der nächst kleinere Wert, in deinem Fall also:

22 012D While ( britem.GetIsID brTestcuirass1Splitter )

Der Fehler weißt darauf hin, dass britem eine Null-Referenz ist (also keinen Wert hat).
Abgesehen davon hätte das eh nicht funktioniert, da die (erforderliche) Verneinung vergessen wurde. http://www.greensmilies.com/smile/smiley_emoticons_verlegen.gif


Der korrekte Code wäre:

set britem to GetFirstRef 27 1
While ( IsFormValid britem )
if ( britem.GetIsID )
Break
endif
set britem to GetNextRef
Loop
if Eval ( !IsFormValid britem )
;Ref nicht gefunden
endif

Orios das auge
03.10.2010, 15:22
Ah jetzt funktioniert es. http://smiliestation.de/smileys/Gluecklich/169.gif (http://smiliestation.de/)

Ganz Großes danke für deine Mühe. :A