Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was stimmt an diesem Script nicht?



Lord Asgar
24.09.2007, 21:31
Siehe Titel :


scn ZZZtestaddscript

short button
short weapon

begin onequip player

messagebox "Wie wollt ihr diese Waffe führen?""Einhändig""Zweihändig"

Set weapon to GetButtonPressed

If weapon == 0
if (IsActionRef Player) && ( player.getitemcount ZZZakakata ==1 )
player.removeitem ZZZakakata 1
player.additem ZZZakakata 1
player.equipitem ZZZakakata
if (IsActionRef Player) && ( player.getitemcount ZZZakakatana2 ==1 )
player.removeitem ZZZakakatana2 1

If weapon == 1
if (IsActionRef Player) && ( player.getitemcount ZZZakakatana2 ==1 )
player.removeitem ZZZakakatana2 1
player.additem ZZZakakatana2 1
player.equipitem ZZZakakatana2
if (IsActionRef Player) && ( player.getitemcount ZZZakakata ==1 )
player.removeitem ZZZakakata 1

end


Es wird mir immer gesagt , es wäre nicht in einem Begin/end block aber ich sehe das nicht oO

Rung
24.09.2007, 21:56
Hallo,
Du musst jedes if, das Du aufmachst auch wieder mit einem endif zumachen. Es muss also genausviele endifs geben wie es ifs gibt. ;)
Außerdem solltest Du nach der MessageBox eine Variable setzen, damit der Teil dahinter nicht andauernd durchläuft. Des weiteren, würde ich nur die Messagebox in den OnEquip-Block werfen, den Rest in einen MenuMode-Block. ;)

Low Post
24.09.2007, 21:59
Sicher das der nichts wegen if-Blöcken will? Ich hab nähmlich kein einziges endif/elseif in deinem Script gefunden.
Außerdem ist die Variable button in deinem Skript etwas überflüssig, oder wird die noch durch ein anderes Skript verwendet?
Funktionieren Messageboxen überhaupt in einem OnEquip-Block (also die Reaktion darauf)?
Nur so als kleiner Tipp:
Message " "
Message " "
vor so Sachen wie Player.additem blenden nervende Meldungen aus (Zeug hinzugefügt/ausgerüstet/etc.).
Ich würde bei Messageboxen immer den Befehl set Zeug to GetButtonPressed + 1 verwenden. Da Variablen normalerweise standartmäßig auf 0 stehen könnte es sonst vorkommen, dass die Reaktion auf Antwort 1 (GetButtonPressed == 0) einfach so ausgeführt wird.
Warum entfernst du dein Item (falls vorhanden) nur um es danach wieder hinzuzufügen?
Ein einfaches EquipItem reicht da auch.
Warum überprüfts du noch IsActonRef == Player?
Hast du doch schon mit dem OnEquip Player darauf beschränkt.

Und obwohl das jetzt recht viele Kritikpunkte sind, nicht abschrecken lassen, es ist gut, dass du es zuerst selbst versucht hast.
Außerdem waren die meisten Sachen die ich jetzt aufgezählt hab nur unnötig Absicherungen (bzw. Erfahrungswerte, aber da kommst du auch noch hin). ;)
Und die richtigen Befehle hast du ja schon gefunden, das ist mehr als die meisten schaffen (zumindest von denen, die laut um Hilfe schreien).

Ich würde mal dieses Skript versuchen:

scn ZZZtestaddscript

short weapon

begin onequip player
messagebox "Wie wollt ihr diese Waffe führen?""Einhändig""Zweihändig"
Set weapon to GetButtonPressed + 1

begin Menumode
If weapon == 1
if ( player.getitemcount ZZZakakata == 1 )
Message " "
Message " "
player.equipitem ZZZakakata
elseif ( player.getitemcount ZZZakakatana2 == 1 )
player.removeitem ZZZakakatana2 1
player.additem ZZZakakata 1
player.equipitem ZZZakakata
endif
set weapon to 0
elseif weapon == 2
if ( player.getitemcount ZZZakakatana2 == 1 )
Message " "
Message " "
player.equipitem ZZZakakatana2
elseif ( player.getitemcount ZZZakakata == 1 )
Message " "
Message " "
player.removeitem ZZZakakata 1
player.additem ZZZakakata 1
player.equipitem ZZZakakata
endif
set weapon to 0
endif
end
Skript liegt auf der Waffe, Waffe ist Unique (nur einmal vorhanden, auch nicht 1-Einhand und 1 Zweihand-Version gleichzeitig), dann sollte das ganze eigentlich beim Spieler funktioneren.

Lord Asgar
25.09.2007, 09:51
Das CS sagt mir , wenn ich speichern will dass es ein Problem in Zeile 9 gibt , "Nested begin/end blocks are not allowed". oO Das sagt mir irgendwie gar nix.


und muss ich bei diesem
Message " "
Message " "
Was zwischen den " " reinschreiben?oO

bg2408
25.09.2007, 09:55
Das CS sagt mir , wenn ich speichern will dass es ein Problem in Zeile 9 gibt , "Nested begin/end blocks are not allowed". oO Das sagt mir irgendwie gar nix.Das heißt, daß du irgendwo ein endif / End vergessen hast.

Im Falle des oben von Low Post geposteten Scripts übrigens ein End vor Begin MenuMode.



und muss ich bei diesem
Message " "
Message " "
Was zwischen den " " reinschreiben?oO
Nein. Ziel ist ja, daß nichts angezeigt wird ;).

Lord Asgar
25.09.2007, 10:12
Gewisses End eingefügt , gespeichert und Script auf die beiden Katanas gelegt , Katana plaziert. Nur seltsamerweise legt er bei zweihändig den zweihänder nicht an oO

bg2408
25.09.2007, 11:06
Gewisses End eingefügt , gespeichert und Script auf die beiden Katanas gelegt , Katana plaziert. Nur seltsamerweise legt er bei zweihändig den zweihänder nicht an oOKein Wunder -> schau dir den Scriptteil an. Da wird das ganz normale Katana (ZZZakakata) statt das zweihändige (ZZZakakatana2) dem Spieler zugefügt und equipped ;).

Lord Asgar
25.09.2007, 11:13
Kein Wunder -> schau dir den Scriptteil an. Da wird das ganz normale Katana (ZZZakakata) statt das zweihändige (ZZZakakatana2) dem Spieler zugefügt und equipped ;).

Aha , aber irgendwie verstehe ich nicht welches Weapon jetzt für den ersten Button und welches für den zweiten steht , wie müsste das Script denn aussehen? :D

bg2408
25.09.2007, 11:21
scn ZZZtestaddscript

short weapon

begin onequip player
messagebox "Wie wollt ihr diese Waffe führen?""Einhändig""Zweihändig"
Set weapon to GetButtonPressed + 1
End

begin Menumode
If weapon == 1
;Knoepfli 1 - Einhaender;
if ( player.getitemcount ZZZakakata == 1 )
;fuer den Fall, dass er das Katana schon hat;
Message " "
Message " "
;verhindert Nachrichtenspam für den Spieler;
player.equipitem ZZZakakata
;ziemlich unsinnig imho. Das Script wird durch OnEquip gestartet. Doppelt gemoppelt?;
elseif ( player.getitemcount ZZZakakatana2 == 1 )
player.removeitem ZZZakakatana2 1
player.additem ZZZakakata 1
player.equipitem ZZZakakata
;entfernt Zweihaender, gibt Einhaender und ruestet diesen aus;
endif
set weapon to 0
elseif weapon == 2
;knoepfli 2 - Zweihaender;
if ( player.getitemcount ZZZakakatana2 == 1 )
Message " "
Message " "
player.equipitem ZZZakakatana2
elseif ( player.getitemcount ZZZakakata == 1 )
Message " "
Message " "
player.removeitem ZZZakakata 1
player.additem ZZZakakata2 1
player.equipitem ZZZakakata2
endif
set weapon to 0
endif
endÜbrigens eine gute Idee ist es, Scripte zu kommentieren. Wie das geht habe ich mal vorgemacht. Ohne blickt man durch wochen- oder monatealte Scripts nur schwer durch.

Lord Asgar
25.09.2007, 11:35
Sehr seltsam , mit dem neuen Script funktioniert die Zweihänder-Sache immer noch nicht oO
Liegt nicht daran , dass mein Test-Schwert der Einhänder ist oder? ^^

bg2408
25.09.2007, 11:48
Es kann auch daran liegen, daß es generell nciht funktionierne kann, und du statt MenuMode GameMode nehmen mußt... manche Befehle funktionieren im MenuMode nicht. Also mal GameMode ausprobieren ;).

Lord Asgar
25.09.2007, 11:56
Ich hab mittlerweile durch nen anderen Thread erfahren , dass ein Item sich nicht selbst entfernen kann , also hänge ich das Script besser an eine Art Wechsler-Item statt an das eigentliche Schwert^^

Gamemode probier ich auch mal^^

Rung
25.09.2007, 12:09
Ein Item kann sich mit dem Befehl RemoveMe (http://cs.bethsoft.com/constwiki/index.php/RemoveMe)selbst entfernen.
Und zu Deinem Problem: Einhandschwerter können nicht einfach als Zweihänder umgestellt werden, indem man im Attributes-Window von BladeOneHand zu BladeTwoHand wechselt. Dazu gehören außerdem Änderungen im NIF. Sonst wird das Schwert nicht angezeigt, wenn Du es ziehst.

Lord Asgar
25.09.2007, 12:12
Ein Item kann sich mit dem Befehl RemoveMe (http://cs.bethsoft.com/constwiki/index.php/RemoveMe)selbst entfernen.
Und zu Deinem Problem: Einhandschwerter können nicht einfach als Zweihänder umgestellt werden, indem man im Attributes-Window von BladeOneHand zu BladeTwoHand wechselt. Dazu gehören außerdem Änderungen im NIF. Sonst wird das Schwert nicht angezeigt, wenn Du es ziehst.

Das mit Removeme war mir aus dem WoP-Thread bekannt aber da hies es , dass bei dem Befehl keine darauffolgenden Scriptbefehle mehr ausgeführt werden und das ist ja dann auch nicht der Sinn der Sache.
Und es gibt zwei völlig unterschiedliche Schwerter für Einhand und Zweihand , ich hab nicht einfach den Weapontype geändert^^

Rung
25.09.2007, 12:17
RemoveMe gilt als Return, das ist wahr, aber um es dennoch effektiv einzusetzen, musst Du einfach die nötigen Befehle vor das RemoveMe legen.

Lazarus
25.09.2007, 12:21
Nur bringt das gar nichts, da das ganze nicht funktioniert, habe es damals selbst ausprobiert als ich mein Bastardschwert-Script gebastelt habe. Die beste(und afaik einzige funktionierende Lösung) ist, das ganze über einen GameMode-Activator zu regeln.

...wie wärs wenn wir die Aktivitäten auf einen Thread beschränken? ;)

Lord Asgar
25.09.2007, 12:56
Dann machen wir einfach in diesem Thread weiter^^

Also ich habe mir mal auf Lazarus' Rat hin sein Ivellon-Activatorscript angesehen und entsprechend angepasst :


scn ZZZactivatorscript

short akakataEquipped

short item
short akakata


begin MenuMode
if akakataEquipped == 1


messagebox "Möchtet Ihr dieses Schwert ein- oder zweihändig führen?" "Einhändig " "Zweihändig"
set item to 1

if player.getitemcount zzzakakata >= 1
player.removeitem zzzakakata 1
else
player. removeitem zzzakakatana2 1
endif

endif


if item == 1
set akakata to getbuttonpressed
set akakataEquipped to 0

if akakata == 0
if player.GetActorValue Strength >= 50
player.additem zzzakakata 1
player.equipitem zzzakakata
set item to 0
else
player.additem zzzakakatana2 1
player.equipitem zzzakakatana2
set item to 0
messagebox "Ihr seid nicht stark genug, um dieses Schwert einhändig führen zu können."
endif
elseif akakata == 1
player.additem zzzakakatana2 1
player.equipitem zzzakakatana2
set item to 0
endif
endif

end


Aktivator erstellt und mit dem Script belegt. Dann das Schwert-Script erstellt :


scn ZZZschwertscript
begin OnEquip Player
ZZZactivatorRef.moveto player, 0, 0, 0
set ZZZactivatorRef.zzzakakataEquipped to 1
end

aber das lässt er mich nicht speichern , er sagt dass ZZZactivatorRef nicht geht. Weiss jemand warum? oO

Lazarus
25.09.2007, 13:04
Du musst eine neue Zelle erstellen, deinen Activator da reinsetzen, bei dessen Eigenschaften 'Persistent Reference' anhäkeln und eine ID angeben. Dann kannst du den Befehl

set IDdesInDerZelleBefindlichenActivators.zzzakakataEquipped to 1
im Schwert-Script verwenden.


Und gib deinen Scripten gescheite Namen. Oder hast du nur je einen Script für ein Schwert und einen Activator.

Lord Asgar
25.09.2007, 13:15
Juhu , endlich geht es.Danke an alle , die mir geholfen haben:)
Nur noch eine Frage : Wie krieg ich den Activator unsichtbar , wenn ich keine Textur angebe ist er ein riesiges gelbes Fragezeichen oO

Lazarus
25.09.2007, 13:20
Du brauchst eine Nif-Datei mit leerer NiNode. habe mal eine hochgeladen, bitteschön (http://upload.worldofplayers.de/upload.cgi?a=show&file=537472657573656c6b756368656e2e726172&big=1).

Edit: wieso bekomme ich eigentlich die Meldung, meine 266 Byte große Datei wäre zu groß zum Anhängen?

Lord Asgar
26.09.2007, 16:15
Ich nutze den Titel dieses Threads nochmal für ein anderes Script^^
Weiss jemand, warum das CS dieses Script nicht akzeptiert? Es heisst wieder , da würde ein begin/end block nicht stimmen aber für mich sieht es OK aus
Und mit welchem Befehl erhöhe ich die Infamy des Spielers um 1?^^



scn ZZZsegendesblutesscript

begin scripteffectstart

if ( player.getitemcount ZZZfreshblood >= 10 )

player.removeitem zzzfreshblood 10
messagebox "Ihr opfert dem Vampirgott das gesammelte Blut und verdient euch seinen Segen"
player.cast ZZZvampiregodsegen player
(infamy +1)
else

messagebox "Ihr braucht mindestens 10 Flaschen Blut um sie zu opfern."

end

Rung
26.09.2007, 16:23
Da fehlt ein endif. Wie ich schon sagte, muss jedes if mit einem endif wieder 'geschlossen' werden.


scn ZZZsegendesblutesscript

begin scripteffectstart

if ( player.getitemcount ZZZfreshblood >= 10 )

player.removeitem zzzfreshblood 10
messagebox "Ihr opfert dem Vampirgott das gesammelte Blut und verdient euch seinen Segen"
player.cast ZZZvampiregodsegen player
ModPCInfamy 1
else

messagebox "Ihr braucht mindestens 10 Flaschen Blut um sie zu opfern."

endif

end

Und wie Du die Infamie ändern kannst, steht im WIKI (http://cs.bethsoft.com/constwiki/index.php/Main_Page). Du musst nur mal Infamy ins Suchfenster eingeben. Nochmal, wenn Du einen Befehl suchst, konsultiere zuerst das WIKI (http://cs.bethsoft.com/constwiki/index.php/Main_Page).