okay, nochmal ein wenig ausführlicher.
es gibt 2 callbacks, die jedes menü registrieren muss. einen, wenn sich ein menü öffnet, und eines, wenn sich ein menü schliesst.
jedes menü muss sich zusätzlich einen wert für jeden spieler merken:
- wieviele menüs das eigene verdecken
die beiden callbacks müssen folgendes implementieren (pseudocode):
- callback beim öffnen eines menüs:
Code:
if ( eigenes_menü_aktiv ) {
verdeckungszähler++;
}
- callback beim schließen eines menüs:
Code:
if ( eigenes_menü_aktiv ) {
verdeckungszähler--;
if (verdeckungszähler == 0) {
zeige_menü();
}
}
da jedes menü auch seine eigenen callbacks aufrufen würde, müssen einge befehle eine bestimmte reihenfolge einhalten, wenn ein menü geöffnet oder geschlossen wird.
- menu öffnen:
Code:
öffnen_callback();
eigenes_menü_aktiv = 1;
- menü schliessen:
Code:
eigenes_menü_aktiv = 0;
schliessen_callback();
im menüselect-handler müsste natürlich überprüft werden, ob das menü gerade verdeckt ist:
Code:
if (eigenes_menü_aktiv && verdeckungszähler == 0) {
aktion_ausführen();
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
wenn du nun noch eine zeitbegrenzung haben willst, so kannst du dir ja die zeit (systemtime()) beim menüaufruf merken. beim reaktivieren überprüfst du die differenz zu der aktuellen zeit mit einem schwellenwert. wird der schwellenwert überschritten, zeigst du das menü halt nicht an. wichtig: stattdessen musst du den schliessen_callback() ausführen, da andere plugins noch davon ausgehen, dass du ein menü anzeigst.
weiterhin: wenn du ein menü mit timeout im menu() aufruf hast, musst du gleichzeitig einen timer starten, in dessen handler du die aktivität deines eigenen menüs auf null setzt, und danach den schliessen_callback() ausführen (beides natürlich nur, wenn noch keine option gewählt wurde. noch besser wäre es, bei optionswahl den timer zu killen).
all dies kann man natürlich noch schön in funktionen packen, die von einer include-datei zur verfügung gestellt werden.
will man ein menü nicht mit der möglichkeit zum wiederherstellen ausstatten, muss man im callback beim öffnen eines menüs nur die aktivität des menüs auf 0 setzen. den schliessen-callback braucht man nicht zu implementieren.
einziges problem das ich noch sehe: mod-eigene menüs melden nicht, wenn sie geschlossen werden. hier würde ich in der implementierung des öffnen-callbacks einen parameter nutzen. wenn dieser wahr ist, müssen die plugins sich auf inaktiv schalten und den zähler ebenfalls auf 0 setzen. nachteil ist, dass überdeckungen durch mod-menüs nicht abgefangen werden. dies habe ich im pseudocode eben nicht berücksichtigt, da es mir erst später aufgefallen ist.
das ganze funktioniert ohne zentrales plugin, und jedes plugin kann beliebig viele menüs haben, die sich auch gegenseitig überdecken können, aber nicht müssen. dazu müssen halt mehrfach die variablen definiert werden, und in den callback-implementierungen das ganze für jedes menü einmal durchexerziert werden.
noch fragen?