Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
05.10.2005, 18:24
kensen



Hallo

Eben arbeite ich an einer kleinen DM-Map und bin dabei auf ein kleines Problem gestossen, dass ich schon gelöst geglaubt hatte.

Hintergrund: Ein Kraftfeld wird durch einen speziellen Generator aufrechterhalten, wird dieser zerstört, springt ein Dieselgenerator ein, den man wiederum aber ausstöpseln (physbox-Stecker) kann und damit das Kraftfeld zusammenbricht. Das sollte natürlich dann so funktionieren, dass, wenn der Hauptgenerator zuerst zerstört wird, kurz der Strom ausfällt, der Dieselgenerator automatisch angeworfen wird und dann der Strom wieder da ist. Steckt man dann den Dieselgenerator auch aus, bricht das Kraftfeld zusammen und Alarm wird ausgelöst. Wird aber der Dieselgenerator zuerst ausgesteckt, wenn der Hauptgenerator noch läuft und erst danach der Hauptgenerator zerstört, soll direkt das zweite Ereignis eintreten, weil ja der Dieselgenerator anfänglich deaktiviert ist und es damit keinen Unterschied macht, solange der Hauotgenerator läuft, ob er eingesteckt ist oder nicht.

Mein Lösungsansatz:
maht_counter
Initialwert 0
Minimalert 1
Maximalwert 3

Outputs:
OnHitMin >>> kurzer Stromausfall, Dieselgenerator wird angeworfen
OnHitMax >>> Alarm wird ausgelöst

Hauptgenerator: onBreak: math_counter +1
Dieselgenerator-Stecker: onPhysgunPickup: math_counter +2

Was geschehen sollte:
Wird der HG zerstört, wird der Wert des math_counters um 1 erhöht und erreicht damit den Mindestwert für den Stromausfall und die Aktivierung des Dieselgenerators. Wird dann noch das Kabel des DG gezogen, wird der Wert des math_counters um 2 erhöht und erreicht damit 3, wodurch Alarm ausgelöst wird und der Strom gänzlich ausfällt. Wird aber zuerst das Kabel gezogen, wird der Wert des math_counters um 2 erhöht, wobei das OnHitMin-Ereignis übersprungen wird und mit der Zerstörung des Hauptgenerators sollte dann die 3 erreicht werden, wodurch wiederum der Strm ausfällt und Alarm ausgelöst wird.

Was geschieht:
Auf die Zerstörung des Hauptgenerators gibt's überhaupt keine Reaktion, dafür wird beim Ausstecken des Kabels sofort das Alarm-Ereignis ausgelöst, auch wenn der Hauptgenerator noch läuft.

Wie kann es sein, dass das OnHitMax-Ereignis ausgelöst wird, ohne, dass der Max-Wert erreicht wurde? Und warum wird das onHitMin-Ereignis nicht ausgelöst?

Ich habe das Ganze in vereinfachter Form mit zwei Lichtern (grün für onHitMin und rot für onHitMax) und zwei Buttons (einmal math_counter +1 und einmal +2) ausprobiert, wobei die rote erst beim Wert 3 aktiviert werden durfte und die grüne beim Wert 1. Auch hier dasselbe Ergebnis: OnHitMin wird überhaupt nicht ausgelöst und onHitMax wird immer ausgelöst, wenn der +2-Button gedrückt wird, ohne dass dabei der Max-Wert erreicht wurde. Technisch gesehen ein Ding der Unmöglichkeit, deshalb verstehe ich die Source-Welt nicht mehr.

Hat jemand ähnliche Erfahrungen gemacht? Oder geistert hier vielleicht eine alternative Idee zum Erreichen desselben Effekts herum?

Und ja, ich habe tausendmal die Werte des math_counters überprüft, er startet mit Wert 0, Min.-Wert 1 und Max-Wert 3. Die Outputs sind auch korrekt, ebenso die Outputs der Buttons bzw. der beiden Generatoren.

--

"Schnell wie der Wind, leise wie der Wald, tödlich wie das Feuer, standhaft wie der Berg - in Himmel und Erde wird niemand wie ich verehrt." - Takeda Katsuchiyo Shingen

zum Seitenanfang zum Seitenende Profil || Suche
001
06.10.2005, 01:14
kensen



Geschafft!

Vergesst die math_counter, ein einziges logic_compare genügt! Ich hoffe, das hier wird irgendwann mal jemandem nützlich sein - oder anders ausgedrückt: Vergesst nie die Grundlagen der Mathematik, damit lässt sich am Computer alles realisieren :)

Überlegung: Wir haben vier mögliche Outputs beim logic_compare, grösser als, kleiner als, gelich und ungleich; da die beiden ersten auch den Ungleich-Output auslösen würden vergessen wir letzteren wieder, damit bleiben drei Möglichkeiten, nämlich, gleich, grösser als und kleiner als.

Ich fasse die Vorgänge, die nach der Zerstörung des Hauptgenerators ablaufen sollen unter der Ereignismenge E1 zusammen und alles, was abläuft, wenn der HG zerstört und das Kabel ausgestöpselt ist, unter Ereignismenge E2.

Wir brauchen also zwei der drei möglichen Outputs des logic_compare, damit E1 bzw. E2 ablaufen können.

logic_compare:
Initial Value: 1
Compare Value: 3

Hauptgenerator:
OnBreak: logic_compare - SetCompareValue - 1 - 0.00
OnBreak: logic_compare - Compare - 0.01

Stecker:
OnPhysgunPickup: logic_compare - SetValue - 2 - 0.00
OnPhysgunPickup: logic_compare - Compare - 0.01

Wenn jetzt zuerst der HG zerstört wird, haben wir die Situation, dass Initial Value = 1 und Compare Value = 1, womit wir bei OnEqual Ereignis E1 auslösen können. Wird danach der Stecker gezogen, haben wir IV = 2 und CV = 1, womit wir Ereignis E2 über OnGreaterThan auslösen können.

Wird aber zuerst der Stecker gezogen, geschieht - wie gewünscht - nichts, weil das OnLessThan-Ereignis nicht definiert ist. Wird danach noch der Hauptgenerator zerstört, ist der IV = 2 und der CV = 1, wodurch wiederum das OnGreaterThan-Ereignis ausgelöst wird.

Ein guter Tip: Wann immer verkettete Ereignisse nicht funktionieren wollen, zeichnet es euch auf ein Blatt Papier, plötzlich blickt man durch.

--

"Schnell wie der Wind, leise wie der Wald, tödlich wie das Feuer, standhaft wie der Berg - in Himmel und Erde wird niemand wie ich verehrt." - Takeda Katsuchiyo Shingen

zum Seitenanfang zum Seitenende Profil || Suche
002
06.10.2005, 11:57
Richman
Moderator


Interessant. :)

Aber der OnPhysgunPickup Output des Steckers wird doch immer ausgelöst, wenn man den Stecker mit der Physgun greift. Ist es nicht so, dass man nur durch greifen des Steckers (nehmen wir an er liegt bereits am Boden) etwas auslösen kann? Oder das du das bereits gefixt, indem der Output nur einmal getriggert werden kann?

Was den math_counter betrifft, denke ich, weiss ich woran das Problem lag.
Der minimal Wert der du dort definieren kannst, nennt sich ja "Minimum Valid Value". Das heisst, kleinster gültiger Wert. Wenn dieser nun 1 ist, und die Initial Value 0, dann ist die Initial Value ja ganz offensichtlich ungültig, was bedeuten könnte, dass sie den nächsten gültigen Wert gesetzt wird, also 1. Und dann sind die Reaktionen, die du mit den Buttons auslösen konntest wieder nachvollziehbar.

--

Richman's Hazardous Course - Status: 100% !!!
www.richmans-maps.ch.vu - wieder online!

zum Seitenanfang zum Seitenende Profil || Suche
003
06.10.2005, 16:03
kensen



Zu 1.: Ja, wird nur einmal getriggert, hab's auch merken müssen :)

Zu 2.: Hört sich logisch an, bei Gelegenheit versuche ich's nochmal, aber der Effekt funktioniert gut mit dem logic_compare.
Wahrscheinlich habe ich den math_counter falsch verstanden. Ich habe geglaubt, dass der Initialwert schlicht und ergreifend der äh, eben, Initialwert ist und erst durch die Outputs ein Wert im gültigen Bereich erreicht werden muss. Ich werd's dann bei Gelegenheit noch auf eine andere Weise mit dem counter versuchen, habe grade wieder eine Idee entwickelt :)

--

"Schnell wie der Wind, leise wie der Wald, tödlich wie das Feuer, standhaft wie der Berg - in Himmel und Erde wird niemand wie ich verehrt." - Takeda Katsuchiyo Shingen

zum Seitenanfang zum Seitenende Profil || Suche
004
06.10.2005, 16:08
Richman
Moderator


Ich wollte dich nicht davon überzeugen, es lieber mit einem math_counter zu versuchen, sondern lediglich ergründen, warum er sich so verhalten hat. ;)

Ich hätte wahrscheinlich das Problem sowieso ganz anders gelöst. Muss aber nicht heissen, dass es anders besser ist. ^^

Vielleicht noch ein Typ nebenbei: logic_relays kann man per Input Enablen bzw Disablen. So lassen sie sich sozusagen "unterbrechen".

--

Richman's Hazardous Course - Status: 100% !!!
www.richmans-maps.ch.vu - wieder online!

zum Seitenanfang zum Seitenende Profil || Suche
005
06.10.2005, 16:30
kensen



Falls du zufällig Zeit hast, würde mich doch eine kurze Beschreibung deiner Idee interessieren, ich hatte tausende von Gedanken, nur einer hat funktionert bis jetzt.

--

"Schnell wie der Wind, leise wie der Wald, tödlich wie das Feuer, standhaft wie der Berg - in Himmel und Erde wird niemand wie ich verehrt." - Takeda Katsuchiyo Shingen

zum Seitenanfang zum Seitenende Profil || Suche