AdminMod.de https://www.adminmod.de/ |
|
Zwei Votes gleichzeitig - Probleme https://www.adminmod.de/viewtopic.php?t=8774 |
Seite 2 von 3 |
Autor: | Einstein87 [ 21.02.2005, 22:31 ] |
Betreff des Beitrags: | |
Ich hab mir die Idee mit dem zentralen Menüplugin mal durch den Kopf gehen lassen. Eigentlich ist es gar nicht so dumm. Die Idee ist, dass wenn sich ein Menü schliesst (und sich kein neues auftut) das zuvor überblendete wieder angezeigt wird. So schwer wird das ned sein, und ich brauche nur 2 plugin_exec, nämlich um eine Menü öffnen zu lassen (und so in der Warteschlange an der Spitze zu positionieren) und eine Art menuselect, welches vom Menüplugin ausgelöst wird und dem eigentlichen skript signalisiert, welcher key gedrückt wurde. Die Problematik des 'abgewürgten' Menüs wäre auch beseitigt, da ja die menü wieder angezeigt werden, nachdem sie überblendet wurden. Das ganze soll auch ein Time-Handling haben, so dass man auch votes machen kann, die 'nur' 10 sec o.ä. offen sind. Das einzige, was mir noch ned ganz klar ist, ist, wie lange die Warteschlange sein soll. Ich denke, 10 Menüs werden reichen oder? Einstein |
Autor: | Rinde [ 21.02.2005, 23:59 ] |
Betreff des Beitrags: | |
du brauchst keine warteschlange, wenn jedes plugin den status seiner menüs selber mitschreibt. es müssten bloss alle plugins alle notwengigen callbacks richtig implementieren |
Autor: | Rinde [ 22.02.2005, 00:47 ] |
Betreff des Beitrags: | |
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? |
Autor: | Einstein87 [ 22.02.2005, 12:19 ] |
Betreff des Beitrags: | |
Zitat: noch fragen?
Immer! Also, 1. wieso machst du dir den ganzen Aufwand, wo sich jedes plugin merken muss, von wievielen menüs es überdeckt wird. das kann ja ganz einfach das zentrale Menüplugin übernehmen. So braucht man nur noch eine Rückruffunktion, nämlich die, die die funktion von menuselect übernimmt. Es wird also JEDES menü (welches nicht zeitgesteuert ist) wieder vom user per tastendruck geschlossen. 2., welche menüs meinste mit den mod-eigenen? meinst du die funkmenüs wo auch go und roger drin sind? wenn ja, die könnte man ja abfangen und in eigene menüs umwandeln. Im falle von radio 1-3 ist das ja kein problem. schwieriger wird es, die grafischen menüs wie buy, buyequip und chooseteam anzupassen, aber auch das müsste gehen. dann bleibt noch showbriefing übrig. aber benutzt das auch wirklich jemand? ich kannte den befehl nicht einmal... den könnte man doch einfach sperren. Einstein |
Autor: | [WING] Black Knight [ 22.02.2005, 12:52 ] |
Betreff des Beitrags: | |
Unveränderliches Sperren ist nicht in Admin Mod, außer es handelt sich um einen Exploit. Das ist nunmal eines der Grundprinzipien von Admin Mod. Eigentlich stehe ich auf dem Standpunkt, dass ein Queuesystem für Menüs in die DLL gehört. Menüaufruf mit Timeout (alle weiteren Menüaufrufe anderer Plugins für diese Person werden gequeued). Bei Aufruf der System-Menüs wird das letzte Menü ausgesetzt und nach Abschluss der Auswahl wieder präsentiert. Wenn Plugin fertig ist, Menü wieder für andere freigeben. Das gleiche mit einem zentralen Menüplugin zu erreichen, ist äußerst aufwendig, ist aber mangels Aussicht auf Umsetzung die einzige Möglichkeit. |
Autor: | Einstein87 [ 22.02.2005, 13:05 ] |
Betreff des Beitrags: | |
Aber wenn man den Befehl irgendwo in einem Plugin registriert und dann handled zurückgibt gehts. Und wegen dem zentralen menüplugin, so schwer ist das ned, aber ich bin der ansicht, dass ein neues Menü das alte überblenden soll, gequeuet wird nur das / die überdeckte(n) Einstein |
Autor: | Rinde [ 22.02.2005, 14:39 ] |
Betreff des Beitrags: | |
Zitat:
Also, 1. wieso machst du dir den ganzen Aufwand, wo sich jedes plugin merken muss, von wievielen menüs es überdeckt wird.
damit ich kein zentrales plugin dafür schreiben muss
Zitat:
das kann ja ganz einfach das zentrale Menüplugin übernehmen.
ja, "ganz einfach"...
Zitat:
So braucht man nur noch eine Rückruffunktion, nämlich die, die die funktion von menuselect übernimmt.
ich habe bereits dargelegt, dass eine zentralisierte queue nicht mit nur einem plugin-callback auskommen kann, da der text jeweils bei anzeige des menüs generiert werden muss, und nicht beim einreihen in die queue.
Zitat: Es wird also JEDES menü (welches nicht zeitgesteuert ist) wieder vom user per tastendruck geschlossen.
schreib du doch mal ein zentrales plugin . ausserdem habe ich mir ja keinen aufwand gemacht. ich habe dir lediglich eine möglichkeit genannt, wie man alle deine wünsche umsetzen kann.das sieht jetzt vielleicht recht umständlich aus, aber mit einer entsprechenden include-datei kann man das ganze ziemlich vereinfachen und für den entwickler nahezu transparent machen. Zitat:
2., welche menüs meinste mit den mod-eigenen? meinst du die funkmenüs wo auch go und roger drin sind? wenn ja, die könnte man ja abfangen und in eigene menüs umwandeln. Im falle von radio 1-3 ist das ja kein problem. schwieriger wird es, die grafischen menüs wie buy, buyequip und chooseteam anzupassen, aber auch das müsste gehen. dann bleibt noch showbriefing übrig. aber benutzt das auch wirklich jemand? ich kannte den befehl nicht einmal... den könnte man doch einfach sperren.
problem sind nach wie vor die kaufmenüs. sie reagieren nicht wie normale menüs, da sie ihre funktion beibehalten, nachdem schon ein menüpunkt gewählt und damit das menü geschlossen wurde. leider nutzen viele buyscripts diese funktion, so dass man dieses verhalten auch nciht blocken kann.
|
Autor: | [WING] Black Knight [ 22.02.2005, 15:24 ] |
Betreff des Beitrags: | |
Deshalb ist ja auch das plugin_CS ziemlich kompliziert geraten. Man muss das gesamte Buy-Menü im Plugin nachbilden, um herauszubekommen, ob der Spieler das Menü verlassen hat oder nicht. Was showbriefing betrifft, handelt es sich hierbei um einen Befehl, der nicht unter Exploit fällt. Es ist für jeden legitim, diesen Befehl aufzurufen. Daher kommt eine Blockade nicht in Frage. |
Autor: | Rinde [ 22.02.2005, 15:42 ] |
Betreff des Beitrags: | |
Zitat: Deshalb ist ja auch das plugin_CS ziemlich kompliziert geraten. Man muss das gesamte Buy-Menü im Plugin nachbilden, um herauszubekommen, ob der Spieler das Menü verlassen hat oder nicht.
falsch. das plugin_CS geht einfach so lange davon aus, dass das buymenü noch offen ist, wie kein anderes modeigenes menü aufgerufen wird, welches das buymenü in jedem fall verdrängen würde, oder aber explizit menuselect 10 aufgerufen wird.ok, zusätzlich wird ein execclient(UserName, "menuselect 10") ausgeführt, um den zweiten fall möglichst immer eintreten zu lassen. das plugin_CS ist aus anderen gründen kompliziert geraten: - unterschiedliche tastenbelegungen für Ts/CTs - kompatibilität für v1.5 und v1.6 - eigenes menü - kompliziertes command-parsing, da nur noch ein kommanda alle funktionen übernimmt - zusätzliche funktionen wie teamspezifische restriktionen |
Autor: | Einstein87 [ 22.02.2005, 17:49 ] |
Betreff des Beitrags: | |
Zitat: ich habe bereits dargelegt, dass eine zentralisierte queue nicht mit nur einem plugin-callback auskommen kann, da der text jeweils bei anzeige des menüs generiert werden muss, und nicht beim einreihen in die queue.
Der springende Punkt ist, dass bei meiner Umsetzungsidee das Menü gleich angezeigt wird und die vorherigen in der queue eine stelle nach hinten rutschen. So eleminiert sich das Problem von wegen falscher Namensanzeige etc. Oder was hast du damit gemeint?
Zitat: problem sind nach wie vor die kaufmenüs. sie reagieren nicht wie normale menüs, da sie ihre funktion beibehalten, nachdem schon ein menüpunkt gewählt und damit das menü geschlossen wurde. leider nutzen viele buyscripts diese funktion, so dass man dieses verhalten auch nciht blocken kann.
Kannst du mir das mal erläutern? ich kenn mich mit dem buy-mechanismus nicht so aus. Und was ist das Problem mit den Buyscripts?Einstein |
Autor: | Rinde [ 22.02.2005, 18:42 ] |
Betreff des Beitrags: | |
1. spieler ist im kaufmenü 2. spieler sendet "menuselect 8" 3. spieler landet im equipmentmenü 4. spieler sendet "menuselect 3" 5. spieler bekommt flash, menü bleibt sichtbar --- soweit alles normal 6. spieler sendet "menuselect 3" 7. spieler bekommt flash --- das ganze lässt sich beliebig wiederholen problem nun: ein normales menü nimmt einen menüselect entgegen, danach wird es inaktiv. beim kaufmenü gibt es keine möglichkeit, herauszufinden, wann das menü tatsächlich inaktiv wird, oder ob der spieler es noch benutzen will. ergo weiss man auch nicht, wann man ein durch das kaufmenü verdecktes menü wieder anzeigen soll. |
Autor: | Einstein87 [ 22.02.2005, 18:51 ] |
Betreff des Beitrags: | |
Aber das Kaufmenu ist ja kein Menü das ein anderes, welches mit der menu() funktion gestartet wurde, überdeckt. Ich habe gerade die Befehle client_buy_open und client_buy_close entdeckt. damit lässt sich doch abhilfe schaffen oder? Einstein |
Autor: | Rinde [ 22.02.2005, 19:00 ] |
Betreff des Beitrags: | |
wenn ich nen vote bekomme und dann auf b drücke...? was tun diese commands? |
Autor: | Einstein87 [ 22.02.2005, 19:26 ] |
Betreff des Beitrags: | |
Zitat: wenn ich nen vote bekomme und dann auf b drücke...?
... wird der vote nicht geschlossen, sondern du siehst das dunkle Buymenu, im Hintergrund aber immer noch den Vote.Zitat: was tun diese commands?
Wie der Name schon sagt. Wenn das buy menü öffnet wird client_buy_open ausgeführt und wenn es wieder schliesst client_buy_close. Diese Funktion bekommt auch den Menuselect nicht als Menu-Ausgang mit.Einstein |
Autor: | Sir Drink a lot [ 22.02.2005, 19:52 ] |
Betreff des Beitrags: | |
wenn man als client setinfo "_vgui_menus" "1" hat. Hat man nun als client dies auf "0" (wie eigentlich 100% aller 1337 Spieler ), kommt das Problem, was Rinde meint mit dem menuselect. |
Autor: | Einstein87 [ 22.02.2005, 20:23 ] |
Betreff des Beitrags: | |
Dann sehe ich eigentlich nur eine einzige brauchbare Alternative: Man muss die Menüs selbst nachprogrammieren und die entsprechenden commands (buy, buyequip, chooseteam) entsprechend hooken und abfangen. Einstein |
Autor: | Rinde [ 22.02.2005, 20:34 ] |
Betreff des Beitrags: | |
1) nicht für alle mods kompatibel 2) zu grosser aufwand 3) technisch nicht möglich, ohne am AM-core rumzupruschen |
Autor: | Einstein87 [ 22.02.2005, 21:47 ] |
Betreff des Beitrags: | |
1. muss nur für cs kompatibel sein 2. macht nix 3. wieso? |
Autor: | Rinde [ 22.02.2005, 22:02 ] |
Betreff des Beitrags: | |
weil man nur old-style-nenüs und keine vgui-menüs am client zeigen kann |
Autor: | Einstein87 [ 22.02.2005, 22:08 ] |
Betreff des Beitrags: | |
Der Zweck des ganzen ist ja die old style menüs anzuzeigen. Gibt es eine möglichkeit, festzustellen, welche menüs vom client verwendet werden? |
Seite 2 von 3 | Alle Zeiten sind UTC+01:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |