PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Großes Scriprproblem!



Da_Chegga
04-02-05, 05:37
Hi!

Ich habe bei meinem MOD ein Scripts erstellt, dass bewirkt, dass, wenn man die Zelle "Uhalmana, Basar" betritt, ein anderes Script gestartet wird. per Tribunalfunktion hab ich das in die Starterscripts gegeben. Allerdings habe ich ein Problem...

Begin DC_Scripts_Bazaar

if (GetPCCell "Uhalmana, Basar" == 1)
startScript "DC_Musik"
endif

end

und das ist das folgende:

Begin DC_Musik

float timer

if (GameHour >= 0)
if (GameHour < 6)
PlaySound "DC_Musik_02"
endif
endif

if (GameHour >= 6)
if (GameHour < 12)
PlaySound "DC_Musik_01"
endif
endif

if (GameHour >= 12)
if (GameHour < 16)
PlaySound "DC_Musik_03"
endif
endif

if (GameHour >= 16)
if (GameHour < 20)
PlaySound "DC_Musik_04"
endif
endif

if (GameHour >= 20)
if (GameHour < 0)
PlaySound "DC_Musik_05"
endif
endif


Aber immer, wenn ich im Spiel die Zelle "Uhalmana, Basar" betrete, schmiert das Spiel ab http://forums.ubi.com/images/smilies/cry.gif. Was kann ich tun?

Da_Chegga
04-02-05, 05:37
Hi!

Ich habe bei meinem MOD ein Scripts erstellt, dass bewirkt, dass, wenn man die Zelle "Uhalmana, Basar" betritt, ein anderes Script gestartet wird. per Tribunalfunktion hab ich das in die Starterscripts gegeben. Allerdings habe ich ein Problem...

Begin DC_Scripts_Bazaar

if (GetPCCell "Uhalmana, Basar" == 1)
startScript "DC_Musik"
endif

end

und das ist das folgende:

Begin DC_Musik

float timer

if (GameHour &gt;= 0)
if (GameHour &lt; 6)
PlaySound "DC_Musik_02"
endif
endif

if (GameHour &gt;= 6)
if (GameHour &lt; 12)
PlaySound "DC_Musik_01"
endif
endif

if (GameHour &gt;= 12)
if (GameHour &lt; 16)
PlaySound "DC_Musik_03"
endif
endif

if (GameHour &gt;= 16)
if (GameHour &lt; 20)
PlaySound "DC_Musik_04"
endif
endif

if (GameHour &gt;= 20)
if (GameHour &lt; 0)
PlaySound "DC_Musik_05"
endif
endif


Aber immer, wenn ich im Spiel die Zelle "Uhalmana, Basar" betrete, schmiert das Spiel ab http://forums.ubi.com/images/smilies/cry.gif. Was kann ich tun?

Der_Buhmann1989
04-02-05, 08:20
Ich kenn mich mit Scripten nicht wirklich aus, also nicht hauen, wenns nicht hinhaut!!! Aber kann es sein, das "float timer" nür für Schiffsteile gut ist?!?!

chris_tm
04-02-05, 10:27
Zum ersten Script:
Das ist ein ganz klassischer Fehler.

Du solltest Dir klar machen, dass ein Script in jedem frame ausgeführt wird also 5 - 100 mal in der Sekunde oder mehr...je nach framerate.

Wenn Du also in der Cell "Uhalmana, Basar" bist wird das globale Script Sekunde für Sekunde zig mal gestartet. Das kann nicht gut gehen.

Deswegen braucht man eine Variable, die dafür sorgt, dass das Script nur einmal gestartet wird wenn man die Cell betritt:

<pre class="ip-ubbcode-code-pre">Begin DC_Scripts_Bazaar

short doOnce

if (GetPCCell "Uhalmana, Basar" == 1)
if ( doOnce == 0 )
startScript "DC_Musik"
set doOnce to 1
endif
else
if ( doOnce == 1 )
set doOnce to 0
endif
endif

end </pre>

Gleiches gilt für das 2te Script.
Zu einer bestimmten Uhrzeit wird die Funktion PlaySound in jedem frame ausgeführt.

Ich hab noch einen timer dazugefügt, der nur alle 10 Sekunden den Uhrzeitcheck ausführt und einen CellCheck, der das Script stoppt wenn man den Basar verlässt:

<pre class="ip-ubbcode-code-pre">Begin DC_Musik

short doOnce
float timer

if ( doOnce == 0 )
set timer to 10
set doOnce to 1

elseif ( doOnce == 1 )
set timer to ( timer + GetSecondsPassed )

if ( timer &lt; 10 )
Return
else
set timer to 0
endif
endif

if ( GetPCCell "Uhalmana, Basar" == 0 )
StopScript "DC_Musik"
set doOnce to 0
Return
endif

if ( GameHour &gt;= 0 )
if ( GameHour &lt; 6 )
PlaySound "DC_Musik_02"
endif
endif

if ( GameHour &gt;= 6 )
if ( GameHour &lt; 12 )
PlaySound "DC_Musik_01"
endif
endif

if ( GameHour &gt;= 12 )
if ( GameHour &lt; 16 )
PlaySound "DC_Musik_03"
endif
endif

if ( GameHour &gt;= 16 )
if ( GameHour &lt; 20 )
PlaySound "DC_Musik_04"
endif
endif

if ( GameHour &gt;= 20 )
if ( GameHour &lt; 23.99 )
PlaySound "DC_Musik_05"
endif
endif

End </pre>

Du musst den timer halt an Deine Bedürfnisse anpassen.

Wenn Dein Basar allerdings nur aus einer Zelle besteht - evtl. sogar nur einer interiorzelle - dann ist der ganze Kram mit 2 globalen Scripts völlig überflüssig.
Dann kann man ganz einfach ein Script an einen unsichtbaren Aktivator hängen, der genau das gleiche macht wie oben.
Wenn man die Zelle verlässt läuft das Script eh nicht und man braucht sich keine grauen Haare wegen globalen Scripts wachsen lassen, die evtl. zu oft gestartet werden oder nicht zuverlässig gestoppt werden!

Da_Chegga
04-02-05, 11:03
Uff! Vielen Dank!
Also, ich habe das Problem mit folgendem Script gelöst:

Auf einer Tür, also quasi, dass wenn man die Tür betritt, dass Script gestartet wird.

Begin DC_ScriptTür

short doonce

if (doonce == 0)
if (OnActivate == 1)
StartScript "DC_Musik"
set doonce to 1

else

if (doonce == 1)
set doonce to 0

endif
endif
endif

end

Und dann, ebenfalls von deinem, das Musikscript, allerdings ein wenig abgeleitet, aber nur, weil ich den "Basar" durch "die Dorfschenke", also den Ort, den man durch Betreten der Tür betritt, ersetzt habe. Geht das?
Begin DC_Musik

short doOnce
float timer

if ( doOnce == 0 )
set timer to 10
set doOnce to 1

elseif ( doOnce == 1 )
set timer to ( timer + GetSecondsPassed )

if ( timer &lt; 10 )
Return
else
set timer to 0
endif
endif

if ( GetPCCell "Uhalmana, Dorfschenke" == 0 )
StopScript "DC_Musik"
set doOnce to 0
Return
endif

if ( GameHour &gt;= 0 )
if ( GameHour &lt; 6 )
PlaySound "DC_Musik_02"
endif
endif

if ( GameHour &gt;= 6 )
if ( GameHour &lt; 12 )
PlaySound "DC_Musik_01"
endif
endif

if ( GameHour &gt;= 12 )
if ( GameHour &lt; 16 )
PlaySound "DC_Musik_03"
endif
endif

if ( GameHour &gt;= 16 )
if ( GameHour &lt; 20 )
PlaySound "DC_Musik_04"
endif
endif

if ( GameHour &gt;= 20 )
if ( GameHour &lt; 23.99 )
PlaySound "DC_Musik_05"
endif
endif

End

Vielen Dank http://forums.ubi.com/images/smilies/11.gif

chris_tm
04-02-05, 11:16
Ist schon mal schön, dass es läuft. http://forums.ubi.com/infopop/emoticons/icon_smile.gif

Es würde aber wie schon gesagt noch einfacher gehen.
Also mit nur einem lokalen Script, dass in der Dorfschenke an irgendeinem Objekt hängt.

Wenn man in der Dorfschenke ist läuft das Script und wenn nicht dann eben nicht...ist halt so mit lokalen Scripts.

Dazu müsstest Du nur die roten Zeilen löschen und die grünen hinzufügen:

Begin DC_Musik

short doOnce
float timer
<span class="ev_code_GREEN">
if ( CellChanged == 1 )
set timer to 0
set doOnce to 0
endif</span>

if ( doOnce == 0 )
set timer to 10
set doOnce to 1

elseif ( doOnce == 1 )
set timer to ( timer + GetSecondsPassed )

if ( timer &lt; 10 )
Return
else
set timer to 0
endif
endif
<span class="ev_code_RED">
if ( GetPCCell "Uhalmana, Dorfschenke" == 0 )
StopScript "DC_Musik"
set doOnce to 0
Return
endif</span>

if ( GameHour &gt;= 0 )
if ( GameHour &lt; 6 )
PlaySound "DC_Musik_02"
endif
endif

if ( GameHour &gt;= 6 )
if ( GameHour &lt; 12 )
PlaySound "DC_Musik_01"
endif
endif

if ( GameHour &gt;= 12 )
if ( GameHour &lt; 16 )
PlaySound "DC_Musik_03"
endif
endif

if ( GameHour &gt;= 16 )
if ( GameHour &lt; 20 )
PlaySound "DC_Musik_04"
endif
endif

if ( GameHour &gt;= 20 )
if ( GameHour &lt; 23.99 )
PlaySound "DC_Musik_05"
endif
endif

End

Da_Chegga
04-02-05, 11:21
Mist! Bei meinem "Tür-Aktivier" Script, läuft es irgendwie nicht so recht... Er stürtzt ab:
Begin DC_ScriptTür

short doonce

if (doonce == 0)
if (OnActivate == 1)
Activate
StartScript "DC_Musik"
set doonce to 1

else

if (doonce == 1)
set doonce to 0

endif
endif
endif

end

Was ist daran falsch?

Da_Chegga
04-02-05, 11:31
Ich versuche mal die Variante mit dem StartScript!

Da_Chegga
04-02-05, 11:36
Trotz allem stürtzt er mir hier ab http://forums.ubi.com/infopop/emoticons/icon_frown.gif

chris_tm
04-02-05, 11:43
Ich habs mir erst jetzt genauer angeschaut.
Wenn man eine Funktion wie OnActivate benutzt bracht man keine doOnce Variable weil OnActivate sowieso nur für einen frame 1 returned.
(CS Helpfile oder SfD8 benutzen...das erspart ärger)

Also wenn überhaupt sollte das Script so aussehen:

<pre class="ip-ubbcode-code-pre">Begin DC_ScriptTür

if ( OnActivate == 1 )
StartScript "DC_Musik"
Activate
endif

end </pre>

Nur macht das überhaupt keinen Sinn, weil wenn Du das Script "DC_Musik" ausserhalb der Schenke startest stoppt sich das Script sofort evtl. sofort von selbst wieder:
if ( GetPCCell "Uhalmana, Dorfschenke" == 0 )
StopScript "DC_Musik"
set doOnce to 0
Return
endif

Ob das was mit dem Absturz zutun hat weiss ich auch nicht aber ein script genau bei einem Zellenwechsel zu starten könnte natürlich problematisch sein.
Benutz doch lieber die Version die ich über Deinem letzten Beitrag gepostet habe.
Die dürfte am wenigsten Probleme machen.

Edit: Nochmal: Du brauchst kein globales Script!
Häng doch einfach das DC_Musik Script als lokales script in die Zelle und alle Probleme sind weg.

Da_Chegga
04-02-05, 11:49
Ich hab jetzt diese Version mit StarScript bentzt, das geht auch nicht. Also, wenn ich keine Global machen soll, wie mach ich das lokale? An irgendein Objekt muss ich dass ja ranhängen!

chris_tm
04-02-05, 11:54
Du kennst doch sicher diese roten unsichtbaren Activators an denen normalerweise Sounds hängen.

Nimm so einen, gib ihm ne neue ID, Script dranhängen und in die Zelle schmeissen und fertig.

Ich hoffe, dass die Sounds die Du da benutzt auch korrekt erstellt sind...nicht dass die der Grund für die Abstürze sind.

Da_Chegga
04-02-05, 12:10
Die gingen schonmal. Da kommt mir ein Verdacht!
Und zwar:

Kann es sein, dass die "Muscicians" von Lady E. ein Grund sein könnten?

Da_Chegga
04-02-05, 12:17
Ich hab jetzt einen Activator in die Zelle "Uhalmana, Dorfschenke" geschmissen und das Script draufgesetzt. Allerdings hab ich dem Teil den namen "Aktivator" gegeben. ist das okay?
Also, dieses Bazaar Script:

Begin DC_Scripts_Bazaar

short doOnce

if (GetPCCell "Uhalmana, Basar" == 1)
if ( doOnce == 0 )
startScript "DC_Musik"
set doOnce to 1
endif
else
if ( doOnce == 1 )
set doOnce to 0
endif
endif

end

Sollte das gehen?

chris_tm
04-02-05, 12:35
<BLOCKQUOTE class="ip-ubbcode-quote"><font size="-1">quote:</font><HR>Kann es sein, dass die "Muscicians" von Lady E. ein Grund sein könnten?
<HR></BLOCKQUOTE>
Keine Ahnung, ich hab mir das plugin noch nie angesehen.

Ich dachte eigentlich, dass Du das <span class="ev_code_GREEN">DC_Musik</span> an den Aktivator hängst..

Das <span class="ev_code_GREEN">DC_Scripts_Bazaar</span> Script macht so jetzt auch keinen Sinn mehr, da es ja sowieso nur im Basar läuft.
Es kann also schlecht checken, wenn sich der Player woanders aufhält, weil es dann gar nicht läuft.

Wenn Du so wahnsinnig scharf darauf bist das <span class="ev_code_GREEN">DC_Musik </span>Script global luafen zu lassen dann mach das <span class="ev_code_GREEN">DC_Scripts_Bazaar </span>Script so:

<pre class="ip-ubbcode-code-pre">Begin DC_Scripts_Bazaar

if ( ScriptRunning, "DC_Musik" == 1 )
Return
else
StartScript "DC_Musik"
endif

end </pre>

Da_Chegga
04-02-05, 12:42
Nein, dass bin ich nicht!
Aber muss ich den Activator dann aktivieren?

Da_Chegga
04-02-05, 15:52
Danke Chris, dank dir klappts jetzt http://forums.ubi.com/infopop/emoticons/icon_smile.gif

Thom19
04-02-05, 16:18
http://forums.ubi.com/images/smilies/353.gif Da_Chegga: Du hast zwar die Editfunktion in deine Signatur integriert, weiß aber scheinbar immer noch nicht, wie man die benutzt, erklär mir das http://forums.ubi.com/infopop/emoticons/icon_wink.gif

ReneMiner
04-02-05, 20:18
<BLOCKQUOTE class="ip-ubbcode-quote"><font size="-1">quote:</font><HR>Originally posted by Da_Chegga:
Mist! Bei meinem "Tür-Aktivier" Script, läuft es irgendwie nicht so recht... Er stürtzt ab:
Begin DC_ScriptTür

short doonce

if (doonce == 0)
if (OnActivate == 1)
Activate
StartScript "DC_Musik"
set doonce to 1

else

if (doonce == 1)
set doonce to 0

endif
endif
endif

end

Was ist daran falsch? <HR></BLOCKQUOTE>


Falsch ist sowas durch Aktivieren einer Tür zu starten. Dabei fängt dein Script den Cellchanged ==1 ab! Es wird kein Zellwechsel registriert wenn diese Tür benutzt wird.

Mach mal statt dem doOnce-Gedönse lieber:

if ( Scriptrunning "meinMusikscript" == 0 )
startscript meinMusikScript
endif

Da_Chegga
05-02-05, 01:41
Ich habs jetzt als Lokal mit einem Aktivator gemacht, Läuft prima! Danke euch beiden http://forums.ubi.com/infopop/emoticons/icon_smile.gif