Riesenproblem mit "else if" kann jemand helfen, bitte??

Hier ist der ideale Ort um über Scripts und Mods für X³: Reunion zu diskutieren.

Moderators: Moderatoren für Deutsches X-Forum, Scripting / Modding Moderators

Post Reply
ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Riesenproblem mit "else if" kann jemand helfen, bitte??

Post by ChristianErding » Sat, 4. May 13, 17:43

Ich wollte ein Script abändern, so dass man in Station auf einen Händler treffen kann der einen 1 x A EMP anbietet. Vorhandenes Geld und Laderaum soll überprüft werden.
So weit so gut. Nun habe ich folgendes Problem:

Wenn beide vorhanden ist prima, aber wenn man zuerst zu wenig Geld hatte,
kommt die Text-Meldung: "Nicht genügend Credits"
Wenn man nun schnell etwas verkauft und die BBS-Meldung nochmal aufruft, wird das Teil gekauft kommt in den Laderaum, die Danke-Meldug erscheint, ABER

Die die Text-Meldung "Nicht genügend Credits" erscheint ein weiters mal.

Es scheint so als ob die der Quest state (Quest.Aborted) irgendwie im Speicher hängen bleibt und nicht gelöscht wird.
Das Script sieht derzeit so aus:


********Uninteressant*****************
$Page.ID.=.get.global.variable:.name='plugin.empkyon.id'
.
$DATA.PRICE.=.0
$DATA.SHIP.=.1.
$DATA.NAME.=.2.
.
$PlayTime.=.playing.time
$NextOffer.=.3.
$PlayerShip.=.get.player.ship
.
*.When.the.script.is.first.loaded
if.$Event.==.'init'.OR.$Event.==.'reinit'.
...
*.Called.when.first.viewing.BBS.in.a.station,.returns.the.priority
else.if.$Event.==.'prio'.
..$LastOffer.=.get.global.variable:.name='Emp.Last'
..$NextOffer.=.$NextOffer.+.$LastOffer.
..if.$NextOffer.<.$PlayTime.
....return.90
..else
....return.0
..end


********...Jetzt.wird.es.interssanter.************
*.When.the..BBS.would.like.to.offer.the.mission,.sets.the.message.to.display
else.if.$Event.==.'offer'.
..while.size.of.array.$Array.Data
....remove.element.from.array.$Array.Data.at.index.0
..end
...
..$Times.=.$PlayerShip->get.local.variable:.name='plugin.emp.times'
..skip.if.$Times.>=.1.
....$Times.=.0.
......
..
...
..$Station.=.[PLAYERSHIP]->get.environment
..$Race.=.$Station->get.owner.race
..$Name.=.[THIS]->call.script.'lib.cycrow.getname'.:.arg0=$Race.
..append.$Name.to.array.$Array.Data..

***.Hier.werden.nur.verschiedene.Grundtexte.angezeigt.*****
...
..$Amt.=.sprintf:.pageid=$Page.ID.textid=1000,.null,.null,.null,.null,.null
..$Amt.=.string.$Amt.to.integer
..$Amt.=.random.value.from.0.to.$Amt.-.1
..$Amt.=.$Amt.+.1001.
..$Message.=.sprintf:.pageid=$Page.ID.textid=$Amt,.$Name,.$Price,.null,.null,.null
..set.quest.state.with.message:.quest=$Object.state=[Quest.Offered].msg=$Message

******.So.jetzt...........**********
...
..*.When.the.mision.is.actualy.displayed.on.the..BBS
else.if.$Event.==.'display'.
...
..*.When.one.of.the.options.was.selected
else.if.$Event.==.'select'.
..$Price.=.get.max.price.of.ware.{Alpha.EM-Plasmakanone}
..$minCost.=.$Price.*.1.
..$maxCost.=.$Price.*.2.
..$Price.=.random.value.from.$minCost.to.$maxCost.-.1
..append.$Price.to.array.$Array.Data
..append.[PLAYERSHIP].to.array.$Array.Data
...
..$Money.=.get.player.money
..$Price.=.$Array.Data[$DATA.PRICE]
..write.to.player.logbook.$Price
..$Name.=.$Array.Data[$DATA.NAME]

***.Hier.hängt.er,.textid=3.ist.die.Meldung."Nicht.genügend.Credits"


..if.$Money.<.$Price.
....$Message1.=.sprintf:.pageid=$Page.ID.textid=3,.$Name,.null,.null,.null,.null
....=speak.text:.page=13.id=1254.priority=99
....set.quest.state.with.message:.quest=$Object.state=[Quest.Aborted].msg=$Message1
..end
...
..$Empv.=.get.volume.of.ware.{Alpha.EM-Plasmakanone}
..$Shipv.=.[PLAYERSHIP]->get.free.volume.of.cargo.bay
..if.$Empv.>.$Shipv.
....$Message2.=.sprintf:.pageid=$Page.ID.textid=4,.$Name,.null,.null,.null,.null
....=speak.text:.page=13.id=1253.priority=99
....set.quest.state.with.message:.quest=$Object.state=[Quest.Aborted].msg=$Message2
..end
...
..if.$Money.>.$Price.AND.$Empv.<.$Shipv.
....$Message3.=.sprintf:.pageid=$Page.ID.textid=5,.$Name,.null,.null,.null,.null
....set.global.variable:.name='Emp.Last'.value=$PlayTime
....set.quest.state.with.message:.quest=$Object.state=[Quest.Accepted].msg=$Message3
..end...
...
..*.When.the.mission.was.accepted
else.if.$Event.==.'accept'.
..$Price.=.$Array.Data[$DATA.PRICE]
..$PlayerShip.=.$Array.Data[$DATA.SHIP]
..write.to.player.logbook.$Price
..=.$PlayerShip->call.script.'plugin.emp.accept'.:.Amount=$Price..install=$install.
..=speak.text:.page=17.id=9001.priority=99
..=speak.text:.page=13.id=1273.priority=99
..set.quest.$Object.timeout.to.1
...
else.if.$Event.==.'check'.OR.$Event.==.'timeout'.
..set.quest.state.with.message:.quest=$Object.state=[Quest.Finished].msg=null
end


Dazu das Plugin.emp.accept:

$Amount.=.0.-.$Amount.
add.money.to.player:.$Amount
.
=.[PLAYERSHIP]->install.1.units.of.{Alpha.EM-Plasmakanone}
.
$Times.=.[PLAYERSHIP]->get.local.variable:.name='plugin.emp.times'
skip.if.$Times.>=.1.
..$Times.=.0.
inc.$Times.=
[PLAYERSHIP]->set.local.variable:.name='plugin.emp.times'.value=$Times
.
return.[TRUE]


und das al.plugin file:

$LoadOnce.=.get.global.variable:.name='Overtune.LoadOnce'
if.$LoadOnce.!=.3.
..set.global.variable:.name='Empkyon.LoadOnce'.value=3
..*.set.global.variable:.name='Empkyon.LastOffer'.value=0
..set.global.variable:.name='Kyon.Last'.value=0
..set.global.variable:.name='Emp.Last'.value=0
...
end
.
set.global.variable:.name='plugin.empkyon.id'.value=7130
.
register.quest.script.'plugin.emp.quest'.instance.multiple=[TRUE]
register.quest.script.'plugin.kyon.quest'.instance.multiple=[TRUE]
.
return.null
Last edited by ChristianErding on Sat, 4. May 13, 19:04, edited 3 times in total.
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sat, 4. May 13, 18:00

kannst du bitte das ganze noch einmal in Code-Tags und mit einrückungen posten? ohne ist das nämlich verwirrend

und wenn es nicht gerade ein 1000-Zeiler ist bitte auch noch den uninterresanten teil und die Argumente, denn vielleicht liegt der fehler ja in einer falsch oder nicht gesetzten variable.
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Post by ChristianErding » Sat, 4. May 13, 18:56

So ist umformatiert. Der Fehler liegt wohl irgendwo im Quest.state.
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sat, 4. May 13, 19:21

auch wenn ich deinen fehler noch nicht finde: dein script sorgt nicht für den fall dass der Spieler auf den Credit genau genügend Geld hat oder exakt den benötigten Laderaumplatz frei.. ein <= und >= schaffen hier abhilfe ;)

EDIT: kann es sein, dass der quest aus irgendwelchen gründen 2* schnell hintereinander gestartet wird, aber du nur genügend Geld für eine Waffe hast?

EDIT2: hast du spielexterne Editoren verwendet bzw. das Script manuell bearbeitet?

EDIT3: das Spielerschiff musst du btw nicht in eine Variable speichern, dafür gibts die Konstante [PLAYERSHIP] ;)


bitte streichen, ich hab mich bei dem Codeabschnitt verlesen:
EDIT4: der zweck für welches du es verwendest ist btw fraglich, dafür sind Globale Variablen geeigneter, da der Spieler das Schiff jederzeit wechseln kann und dein Script in die irre führen, da ältere Werte beim wechsel nicht gelesen werden bzw. beim zurückwechseln völlig veraltete werte gelesen werden.. dein globales Array mit den werten für den quest hätte dafür sicher noch platz ;) (du müsstest den Wert lediglich noch mit ins Array aufnehmen, ein erenutes setzen der GV ist aufgrund der pointer-natur von Arrays nicht notwendig)
Last edited by UniTrader on Sat, 4. May 13, 19:33, edited 2 times in total.
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Post by ChristianErding » Sat, 4. May 13, 19:28

Zu wenig Geld?

War meine erste Vermutung, deswegen habe ich mir 160 000 000 Credits besorgt, sicher ist sicher.

Das muss das Quest state sein leider kenne ich mich damit null aus.

aufallend ist das die Sprachausgabe in der Zeile beim 2. Versuch nicht mit ausgegeben wird, sondern nur die Meldung, quasi so ein halber Durchlauf.

Vielen Dank für das gucken, gibt sicher interessanteres als meinen versemmelten Scriptcode, ">=" baue ich sofort ein! Danke!!!

EDIT:

Wenn die Bedingungen am Anfang alle erfüllt sind läuft das script ohne Probleme durch. Wenn aber mal "Quest aborted" war. Läuft es auch komplett fehlerfrei durch wenn alle Bedingen erfüllt sind, gibt aber zusätzlich noch die Meldung aus "nicht genügend Credits" . Aber der Gegenstand wird trotzdem übertragen und das Geld abgebucht.

Edit2:
Habe den Exscriptor verwendet und bin Anfänger was das Scripten angeht.

Das Ursprungsscript ist das "OvertuneBBS"
Last edited by ChristianErding on Sat, 4. May 13, 20:14, edited 3 times in total.
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sat, 4. May 13, 19:41

ok, ich kann jetzt keinen wirklichen fehler in deinem Code finden.. bau vieleicht mal in deine Nachrichten nen zähler ein, der dir mitteilt, der wievielte Aufruf des Scriptes diese Nachricht sendet bzw ob das ganze aus derselben Instanz kommt (und welche instanz wann gestartet wurde)..

(am Scriptanfang:
$debug.count = get global var name='debug.count'
inc $debug.count=
set global variable 'debug.count'
write to player logbook $debug.count

und dann jeder nachricht noch $debug.count anhängen:
$messageX = $messageX + $debug.count
)
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Post by ChristianErding » Sat, 4. May 13, 20:47

Gesagt getan!!

Aber die bl*de Meldung kommt einfach nicht mehr.

Kann man die Wahrscheinlichkeit irgenwie beeinflussen, so dass die Meldung IMMER erscheint. Ist sonst übel mit testen...

Vieleicht mit dem "Prio" im Script??

EDIT:
set global variable 'debug.count'

da muss noch eine variable hin, vielleicht value=0 ??
********************************************
Zusatzfrage:
Was bedeuteen eigentlich im dazugehörigen "Accept-Script" die
Times Einträge?
Ging da im Ursprungsscript ein Counter hoch, der vielleicht verhindert das die Meldung irgendwann noch mal erscheint?


$Amount = 0 - $Amount
add money to player: $Amount

= [PLAYERSHIP]->install 1 units of {Alpha EM-Plasmakanone}

$Times = [PLAYERSHIP]->get local variable: name='plugin.emp.times'
skip if $Times >= 1
$Times = 0
inc $Times =
[PLAYERSHIP]->set local variable: name='plugin.emp.times' value=$Times

return [TRUE]



********************
Es läuft jetzt irgenwie, keine Ahnung warum die finale Version sieht so aus:

$Page.ID.=.get.global.variable:.name='plugin.empkyo.id'
.
$DATA.PRICE.=.0.
$DATA.SHIP.=.1.
$DATA.NAME.=.2.
.
$PlayTime.=.playing.time
$NextOffer.=.3.
$PlayerShip.=.get.player.ship
.
*.When.the.script.is.first.loaded
if.$Event.==.'init'.OR.$Event.==.'reinit'.
...
..*.Caled.when.first.viewing.BBS.in.a.station,.returns.the.priority
else.if.$Event.==.'prio'.
..$LastOffer.=.get.global.variable:.name='emp.Last'
..$NextOffer.=.$NextOffer.+.$LastOffer.
..if.$NextOffer.<.$PlayTime.
....return.99
..else
....return.0
..end
...
..*.When.the..BBS.would.like.to.offer.the.mission,.sets.the.message.to.display
else.if.$Event.==.'offer'.
..while.size.of.array.$Array.Data
....remove.element.from.array.$Array.Data.at.index.0
..end
...
..$Times.=.$PlayerShip->get.local.variable:.name='plugin.emp.times'
..skip.if.$Times.>=.1.
....$Times.=.0.
...
...
..$Price.=.get.max.price.of.ware.{Alpha.EM-Plasmakanone}
..$minCost.=.$Price.*.1.
..$maxCost.=.$Price.*.2.
..$Price.=.random.value.from.$minCost.to.$maxCost.-.1
...
..append.$Price.to.array.$Array.Data
..append.[PLAYERSHIP].to.array.$Array.Data
...
..$Station.=.[PLAYERSHIP]->get.environment
..$Race.=.$Station->get.owner.race
..$Name.=.[THIS]->call.script.'lib.cycrow.getname'.:.race=$Race.
..append.$Name.to.array.$Array.Data
...
...
..$Amt.=.sprintf:.pageid=$Page.ID.textid=1000,.null,.null,.null,.null,.null
..$Amt.=.string.$Amt.to.integer
..$Amt.=.random.value.from.0.to.$Amt.-.1
..$Amt.=.$Amt.+.1001.
..$Message.=.sprintf:.pageid=$Page.ID.textid=$Amt,.$Name,.$Price,.null,.null,.null
..set.quest.state.with.message:.quest=$Object.state=[Quest.Offered].msg=$Message
...
..*.When.the.mision.is.actaly.displayed.on.the..BBS
else.if.$Event.==.'display'.
...
..*.When.one.of.the.options.was.selected
else.if.$Event.==.'select'.
..$Price.=.get.max.price.of.ware.{Alpha.EM-Plasmakanone}
..$minCost.=.$Price.*.1.
..$maxCost.=.$Price.*.2.
..$Price.=.random.value.from.$minCost.to.$maxCost.-.1
..append.$Price.to.array.$Array.Data
..append.[PLAYERSHIP].to.array.$Array.Data
...
..$Money.=.get.player.money
..$Price.=.$Array.Data[$DATA.PRICE]
..write.to.player.logbook.$Price
..$Name.=.$Array.Data[$DATA.NAME]
..if.$Money.<.$Price.
....$Message1.=.sprintf:.pageid=$Page.ID.textid=3,.$Name,.null,.null,.null,.null
....=speak.text:.page=13.id=1254.priority=99
....set.quest.state.with.message:.quest=$Object.state=[Quest.Aborted].msg=$Message1
....=.wait.200.ms
..end
...
..$Empv.=.get.volume.of.ware.{Alpha.EM-Plasmakanone}
..$Shipv.=.[PLAYERSHIP]->get.free.volume.of.cargo.bay
..if.$Shipv.<.$Empv.
....$Message2.=.sprintf:.pageid=$Page.ID.textid=4,.$Name,.null,.null,.null,.null
....=speak.text:.page=13.id=1253.priority=99
....set.quest.state.with.message:.quest=$Object.state=[Quest.Aborted].msg=$Message2
....=.wait.200.ms
..end
...
..if.$Money.>=.$Price.AND.$Empv.<=.$Shipv.
....$Message3.=.sprintf:.pageid=$Page.ID.textid=5,.$Name,.null,.null,.null,.null
....set.global.variable:.name='emp.Last'.value=$PlayTime
....set.quest.state.with.message:.quest=$Object.state=[Quest.Accepted].msg=$Message3
....=.wait.200.ms
..end
...
...
...
...
..*.When.the.mission.was.accepted
else.if.$Event.==.'accept'.
..$Price.=.$Array.Data[$DATA.PRICE]
..$PlayerShip.=.$Array.Data[$DATA.SHIP]
..write.to.player.logbook.$Price
..=.$PlayerShip->call.script.'plugin.emp.accept'.:.Amount=$Price..install=$install.
..=speak.text:.page=17.id=9001.priority=99
..=speak.text:.page=13.id=1273.priority=99
..set.quest.$Object.timeout.to.1
...
else.if.$Event.==.'check'.OR.$Event.==.'timeout'.
..set.quest.state.with.message:.quest=$Object.state=[Quest.Finished].msg=null
..=.wait.200.ms
end
.
return.null
**********************************************
Last edited by ChristianErding on Sun, 5. May 13, 01:00, edited 1 time in total.
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sun, 5. May 13, 00:22

ups, da kommt natürlich $debug.count rein ^^ hab ich wohl vergessen
die zahl soll ja mit jeder laufenden Instanz erhöht werden, also muss man irgendwo speichern wie oft das script bereits aufgerufen wurde


ach ja: inc wirkt btw wie ich kürzlich erfahren habe auch für null und erhöht dieses auf 1, was ein klein wenig code spart ^^
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Post by ChristianErding » Sun, 5. May 13, 09:24

Ah ja, nun habe ich auch wieder was dazugelernt!

Eins noch:

Weisst du zufällig noch was das "prio" im script bedeutet in Verbindung mit return 40?

else.if.$Event.==.'prio'.
..$LastOffer.=.get.global.variable:.name='emp.Last'
..$NextOffer.=.$NextOffer.+.$LastOffer.
..if.$NextOffer.<.$PlayTime.
....return.40
..else
....return.0
..end
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sun, 5. May 13, 13:01

die quest engine fragrt an dieser stelle das script ab, wie wichtig es ist, aber da ich mich mit der quest engine nichht wirklich auskenne kannn ich dir nicht sagen, wie man die rückgabewerte interpretieren muss..
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Post by ChristianErding » Sun, 5. May 13, 13:31

Hab mal grob getestet, bei 90 kommt die Meldung sehr oft!!

Last but not least:

Kennst du, oder jemand anderes eine Möglichkeit, wie eine Abfrage aussehen könnte damit die u. a. Meldung z.B nur auf Piratenbasen erscheint?



$Page.ID.=.get.global.variable:.name='plugin.empkyon.id'
.
$DATA.PRICE.=.0
$DATA.SHIP.=.1.
$DATA.NAME.=.2.
.
$PlayTime.=.playing.time
$NextOffer.=.3.
$PlayerShip.=.get.player.ship
.
*.When.the.script.is.first.loaded
if.$Event.==.'init'.OR.$Event.==.'reinit'.
...
*.Called.when.first.viewing.BBS.in.a.station,.returns.the.priority
else.if.$Event.==.'prio'.
..$LastOffer.=.get.global.variable:.name='Emp.Last'
..$NextOffer.=.$NextOffer.+.$LastOffer.
..if.$NextOffer.<.$PlayTime.
....return.90
..else
....return.0
..end
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

Post Reply

Return to “X³: Reunion - Scripts und Modding”