Ein neues Thema erstellen  Auf das Thema antworten  [ 52 Beiträge ]  Gehe zu Seite 1 2 3 Nächste
Autor Nachricht
 Betreff des Beitrags: Zwei Votes gleichzeitig - Probleme
BeitragVerfasst: 16.08.2004, 22:30 

Registriert: 07.08.2004, 13:21
Beiträge: 20
huhu leute,

öhm ich hab ein etwas seltsames problem ... und zwar hab ich n script gemacht, wo man durchn bestimmten befehl nen menu() bekommt ...

das funktioniert soweit ohne probs ...

aaaber, wenn kurz danach einer zb nen admin_vote_map macht, dann wird mein eigener ausgeblendet, und der map vote angezeigt, stimme ich dann ab, wird das ergebnis meines teils berechnet ... dann verschwindet die ausgabe und ich kann nicht mehr für die map voten ...

also irgendwie gibbet da konflikte ...

gibs das irgendwas spezielles, wie man sowas verhindern kann ?

grüße
tF


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.08.2004, 01:04 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
leider nicht.

Wenn man die menu Funktion verwendet, dann muss man auf viele Dinge achten...aber wenn dir die vote Funktion dazwischen funkt, ist es natürlich schwer, das abzufangen...

Man muss eben versuchen, in der menuselect Funktion die Sachen, die zum Menü gehören, mit PLUGIN_HANDELD abzufangen, damit die Auswahl nicht weitergegeben und zufällig in dem Moment für den Vote verwendet wird...

hm...also wenn g_User[UserIndex]=1 (er ist in einem Menü), dann muss in der registrierten menuselect Funktion alle Eingaben mit HANDLED abgefangen werden.

Oh...und da liegt das Problem :) Kommt ein Vote (es kommt ein neuer "menu" Text), dann macht er HANDLED zur Auswahl und er wertet die Eingabe zu Deinem Menü und der Vote-Text verschwindet. Es bleibt keine Möglichkeit mehr, noch mal etwas für den Vote abzustimmen, da er es dem Menü zugeordnet hat.

Hm...sollte man votes abschalten, wenn jemand ein Menü benutzt?

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.08.2004, 06:10 

Registriert: 07.08.2004, 13:21
Beiträge: 20
also wenn ich dich richtig verstanden habe, wäre dein vorschlag ... dass wenn ein user ein menu aufruft, solange bis das abgelaufen ist, keine map oder kick votes gestartet werden dürfen ?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.08.2004, 11:01 

Registriert: 07.08.2004, 13:21
Beiträge: 20
ich hab das mal ausgetestet ... hat soweit geklappt ...
aber jetz kommt direkt das nächste problem ...

angenommen es wird ein map vote gestartet ... dann werden meine eingaben nich für den map vote gewertet, sondern auf mein menu ... auch wenn ich das menu garnicht gestartet habe ...

daher wäre nun die frage, wie krieg ichs hin, dass der "menuselect" aus dem einen script dem anderen "menuselect" vom anderen script nicht inne quere kommt ??? :shock:

dat das imma alles so kompliziert sein muss :D


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.08.2004, 19:22 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
tja.

Mit der Menü-Funktion hast Du Dir auch das Schwierigste herrausgesucht :)
Zitat:
angenommen es wird ein map vote gestartet ... dann werden meine eingaben nich für den map vote gewertet, sondern auf mein menu ... auch wenn ich das menu gar[" "]nicht gestartet habe ...
Tja. Das ist ein Zeichen dafür, dass eben das Menüselect gar nicht die korrekten Daten abfängt.

So mache ich das:
Wenn Du eine Funktion hast, die menu() benutzt, dann musst Du Dir irgendwie merken, welcher Spieler diese Funktion aufgerufen hat, um später in der menuselect Funktion die Eingaben genau dieses Spielers wieder herrauszufinden.

1. man definiert z.B. global new g_UserMenu[MAX_PLAYERS];

2. wenn die Person das Menü aufruft, dann speicherst Du z.B. in g_UserMenu[UserIndex] = 1. Damit weisst Du, dass Spieler XYZ mit dem UserIndex sich im Menü (1) befindet.

3. im plugin_init dann plugin_registercmd("menuselect","menuselect",ACCESS_ALL);

4. In der Funktion menuselect anhand des übergebenen UserIndex kann man nun die Beziehung wiederfinden.
Code:
public menuselect(HLCommand,HLData,HLUserName,UserIndex){
   new Data[3];
   new iSelect;
   if (g_UserMenu[UserIndex]==1){ 
     convert_string(HLData,Data,3);
     iSelect=strtonum(Data);
     switch(iSelect){
         case 1: ....Spieler hat die Menüpunkt 1 ausgewählt....
         case etc.....
     }
     g_UserMenu[UserIndex]=0; //wichtig, damit eben erkannt wird, dass der Spieler XYZ eine Auswahl getroffen hat und weitere Menuselect-Befehle an die Engine weitergegeben werden.
     return PLUGIN_HANDLED;
  }
  return PLUGIN_CONTINUE;
}

Das Handled steht dann dafür, dass die Eingabe dieses erkannten Spielers eben zum Menü des Plugins gehört und nicht an die Engine weitergegeben wird.

5. Trifft der If Satz aus Punkt 4 nicht zu, wird alles mit return PLUGIN_CONTINUE an die Engine weitergegeben.

Aber trotz des richtigen Handlings kommt es beim Vote dann weiterhin zum Problem. Solltest Du das Menü nämlich genau zu dem Zeitpunkt offen haben, dann überschreibt ein erscheinendes Vote-Menü Dein Menü , aber Deine Auswahl wird noch Deinem Menü zugeordnet, da g_UserMenu[UserIndex] immer noch 1 ist.

Und da muss jetzt noch eine kluge Lösung gefunden werden :)

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 12:57 
Benutzeravatar

Registriert: 03.07.2004, 15:33
Beiträge: 26
Hi

Ich bin noch nicht so bekannt hier, habe aber schon einige eigene Plugins geschrieben, die ich auch mal noch auf adminmod.de hochladen werde.

Ich kenne die hier beschriebene Situation nur zu gut, viele von meinen Plugins benutzen Menüs. Ich denke, es ist an der Zeit, eine kleine Konvention einzuführen, die dem ganzen Abhilfe schafft. Das sieht so aus:
  • Jedes Plugin, das ein Menu oder einen Vote aufrufen will und tut, muss erst einen Befehl mit plugin_exec ausführen. Ich denke, man sollte ihn 'CloseMenu' o.ä. nennen. Erst dann soll das Menü/der Vote geöffnet werden.
  • Wenn ein Plugin ein Menü/einen Vote offen hat, sorgt nun die Funktion 'CloseMenu', die vorher registered wurde, dafür, die Variablen zurückzusetzen, die für die Auswertung des Menüs gedient hätten.
Somit entstehen keine Doppelauswertungen oder Auswertungen im falschen Plugin mehr.

Wie findet ihr das?

Einstein


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 13:16 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Wir hatten schonmal über ein zentrales Menüplugin diskutiert, aber das stellte sich letztlich als zu kompliziert heraus.

Man könnte es auch vereinfachen. Der Ansatz mit plugin_exec erscheint mir recht gut.

Nehmen wir an, wir hätten ein zentrales Menüplugin, dessen Aufgaben die Überprüfung eines laufenden Votes etc. übernimmt und die Auswertung der Auswahl übernimmt.
D.h. das eigentliche Plugin muss ein plugin_exec mit Rückruffunktion, Keys, Userindex und Menuinhalt liefern.
Das Menüplugin überprüft, ob schon ein Vote oder Menü läuft und führt zum günstigen Zeitpunkt das Menü aus und wartet auf die Antwort.
Die erfolgte Antwort wird dann über die Rückruffunktion an das eigentliche Plugin wiederum per plugin_exec zurückgemeldet.

Beispiel:
Aufruf:
Code:
 plugin_exec ("issue_menu","menu_example§512§3§Dies ist ein Beispieltext!");
Problem hierbei ist einen geeigneten Delimiter zu finden. Habe mal § verwendet.

Rückruf:
Code:
 plugin_exec ("menu_example","3§5");
Spieler #3 hat sich also für Option 5 entschieden.

Das ist zwar keine wirklich ausgefeilte Lösung, aber zumindest mal ein einfach umzusetzender Ansatz.

Die einzelnen Plugins müssten sich damit zumindest nicht mehr um Überschneidungen kümmern, da das komplett vom zentralen Menüplugin übernommen wird. Lediglich die Rückmeldung muss ausgewertet werden.

Plugins am besten an plugins@adminmod.org schicken. Dann ist das für mich übersichtlicher.

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 14:42 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
Aber der kleinste Nenner, den wir finden könnten, wäre dies was Einstein angesprochen hat.

Damit hätte man schon mal die Möglichkeit, "Last in, kill first"

Was aber natürlich die schon oft angesprochenen und diskutierten Probleme hervorruft. Das z.B. ein TK Menu überschrieben wird, was in dem Moment wichtiger ist als irgendeine Anzeige in Menüform.

"First in, restrict Next" funktioniert in dem Fall auch nicht :)

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 15:21 
Benutzeravatar

Registriert: 03.07.2004, 15:33
Beiträge: 26
Die Idee ist gut, aber es ergibt sich für mich ein Problem - nämlich wenn ein Vote oder ein Menu nur bestimmte Zeit offen sein soll.

Ich bin z.B. grad dran ein tk Plugin zu schreiben, wo man als nicht-Admin ab 5 tks einen Vote starten kann, ob der Player gekickt werden soll. Ich will aber, dass man nur 10 secs voten kann. Des weiteren soll der Admin 3. den Vote abbrechen können oder 4. den Kick gleich selbst ausführen können wenn er will.
Wenn abgebrochen/gekickt wird, soll das Menü bei den normalen clients sofort verschwinden und so keine Eingabe mehr zulassen. Alles in Allem komme ich zum Schluss, dass ich ein Menü daraus machen und den vote selbst auswerten muss.

Bei der Idee mit dem zentralen Plugin würde ja ein neues Menü warten, bis das Alte geschlossen wird, wenn ich das richtig verstehe. Dann gibt es aber Probleme mit dem timing.

Ich bin auch sonst nicht umbedingt ein Fan der zentralisierung, es ginge meiner Meinung nach einfacher wenn man es jedem Plugin selbst überlassen würde, sein Menü zu schliessen und seine Variablen zurückzusetzen.

Ausserdem müsste man bestehende Plugins nur leicht oder gar nicht abändern, was alles sehr viel kompatibler machen würde.

Einstein


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 15:23 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
zentrales menüplugin? verwende ich für meine menü-plugins seit über einem jahr, funktioniert tadellos.
funktioniert genau so, wie einstein es vorgeschlagen hat.

beispiel gefällig?

erstmal eine includedatei zur einfacheren verwendung einbinden:
Code:
#include <menu>
dann brauchen wir ein globals array, was sich merkt, in welchem menü unseres plugins alle spieler sind.
Code:
#define MENU_NONE 0
new g_Menu[MAX_PLAYERS] = {MENU_NONE};
in der plugin_init:
Code:
register_menu_reset("CallbackFunktion");
im plugin wird die callbackfunktion dann definiert:
Code:
public CallbackFunktion(HLCommand,HLData,HLUserName,UserIndex) {
    reset_menu(HLData,g_Menu,MENU_NONE,maxplayercount());
    return PLUGIN_CONTINUE;
}
zu guter letzt: der menüaufruf meines plugins:
Code:
[...]
kill_menu(UserIndex);
menu(UserName, Text, keys, timeout);
g_Menu[UserIndex] = MENU_XYZ;
entscheidend ist, dass der aufruf zu kill_menu() vor dem menu() aufruf kommt. sonst killt das plugin sein eigenes menü :)
natürlich könnte man jetzt noch einen schönen wrapper dafür schreiben, der dann etwa so aufgerufen wird:
Code:
display_menu(UserIndex, Text, keys, timeout, MENU_XYZ);

dasselbe muss nicht nur bei aufrufen zu menu(), sondern auch bei vote() gemacht werden.
Code:
kill_menu(0); // 0 = alle
vote(...);
okay, genug geschwafelt, hier die include-datei und das plugin

/€: ich vergaß, zusätzlich enthält die menu.inc noch die funktion clear_menu(UserIndex), das ein leeres menü mit 1s timeout an die spieler sendet. damit schließe ich z.B. das forgivetk-menü am rundenanfang, wenn der spieler sowieso schon getötet wird.

/€²: das hauptplugin hat übrigens den einzigen zweck, bei menü-kommandos des mods die menüs zu killen. die kommunikation zwischen den einzelnen AM-plugins würde auch ohne funktionieren.
im moment ist das ganze auf CS ausgerichtet. könnte man evtl auf eine dateibasierte liste für alle mods ändern.


Dateianhänge:
menu.inc [1.23 KiB]
391-mal heruntergeladen
plugin_base_menu.sma [1.08 KiB]
356-mal heruntergeladen


Zuletzt geändert von Rinde am 19.02.2005, 16:22, insgesamt 1-mal geändert.
Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 15:57 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
zu einem zentralen menüplugin wie blacky es vorschlägt, habe ich mir auch schon detaillierte gedanken gemacht, und sogar angefangen, eines zu schreiben. das ganze ist aber bei genauerer betrachtung schwieriger als zunächst gedacht.
1) nehmen wir an, die menüs sollen in eine warteschlange aufgenommen werden, und ausserdem unterschiedliche prioritäten haben können.
nun wurde ein spieler TKt, und sieht das forgive-menü. dieses hat natürlich die höchste priorität. danach wird ein kick-vote gestartet, um einen spieler zu kicken, der eine niedrigere priorität hat. bevor der spieler das forgive-menü schliesst, oder es vom plugin geschlossen wird am rundenanfang, ändert der kick-votespieler seinen namen. danach wir das kickvote-menü, das schon in der warteschlange ist, einen falschen namen im vote anzeigen. man müsste also eine callback-funktion benutzen, um den menütext vom plugin zu erfragen, in dem moment, in dem das menü angezeigt wird.
2) ausserdem, damit das das forgive-plugin das menü wieder beenden kann, müsste es eine ID oder einen handle auf den warteschlangeneintrag erhalten, wenn es das menü aufruft. dieses könnte dann zum schließen des menüs genutzt werden, bzw. dem entfernen aus der warteschlange, wenn es noch nciht angezeigt wurde. wenn man nun aber ein plugin hat, dass für denselben spieler mehrere menüs in die warteschlange schieben kann (allein die möglichkeit reicht), z.B, ein umfangreiches voting-plugin, das zwei votes schnell hintereinnander anzeigt, während der spieler noch im forgive-menü ist, dann kann das vote-plugin die warteschlangeneintrags-handles nicht mehr in einem einfachen array über MAX_PLAYERS speichern. es müsste dateien oder ähnlich verfahren her, um sich die handles zu merken, und daten die damit assoziiert sind. ziemlich komplizierte geschichte wenn ihr mich fragt.
3) ein weiteres gedankenmodell: man sieht einen vote, hat aber noch nicht geantwortet. in dem moment wird man TKt, und bekommt das forgive-menü, da es höhere priorität hat. bei diesem vorgang müsste das vote-plugin informiert werden, dass es entweder das menü erneut anzeigt, oder diesen spieler bei der auswertung nicht mit berechnet.
4) der aufgabe des zentral-plugins, die ganzen handles und callbacks zu speicher, ist nur mit dateien zu realisieren, was nciht wirklich performant und übersichtlich ist.
wie ihr seht, ist das eine so komplexe sache, dass nichtmal ich mich getraut habe, weiter daran zu schreiben.

folgende prototypen müsste eine passende include-datei mindestens haben haben (einige davon habe ich auch schon implementiert):
Code:
#define HANDLE_INVALID 0

enum priority {
    PRIORITY_LOWEST,
    PRIORITY_LOW,
    PRIORITY_NORMAL,
    PRIORITY_HIGH,
    PRIORITY_HIGHEST
};

enum cancelReason {
    REASON_TIMEOUT,
    REASON_SUPERSEDED,
};

#define FLAG_NOBUYTIME (1<<0)
#define FLAG_NOSUPERSEDE (1<<1)
#define FLAG_NOENQUEUE (1<<2)

forward register_callback(
    &hCallback,
    Function[] );

forward register_menu(
    &hMenuHandle,
    hDisplayCallback,
    hSelectCallback,
    hCancelCallback = HANDLE_INVALID );

forward menu_enqueue(
    hMenu,
    id,
    timeout = 0,
    priority:Priority = PRIORITY_NORMAL,
    flags = 0,
    &hQueueItem = HANDLE_INVALID );

forward menu_cancel(
    &hQueueItem );

forward get_menu_selectdata(
    HLData,
    &key,
    &hMenu = HANDLE_INVALID,
    &hQueueItem = HANDLE_INVALID );

forward get_menu_displaydata(
    HLData,
    &userindex = 0,
    &hMenu = HANDLE_INVALID,
    &hQueueItem = HANDLE_INVALID );

forward get_menu_canceldata(
    HLData,
    &userindex,
    &cancelReason:reason = REASON_SUPERSEDED,
    &hMenu = HANDLE_INVALID,
    &hQueueItem = HANDLE_INVALID );
und ich habe niemals ein plugin damit geschrieben. in der praxis könnten noch weitere probleme auftauchen, an die ich bisher nciht gedacht habe.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 16:34 
Benutzeravatar

Registriert: 03.07.2004, 15:33
Beiträge: 26
Gäbe es denn irgendeine möglichkeit, wieder zu einem menü zurückzukehren, welches überdeckt wurde?

Edit: Ach nein auch das wird zu kompliziert, oder wie soll das zentrale plugin wissen wann es zurückkehren darf... das wäre dann noch ein weiterer befehl...


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 16:47 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
ja, gäbe es. einen cancel-callback definieren, in diesem abfragen, ob der cancel-grund REASON_SUPERSEDED ist, und wenn ja, das menü erneut mit menu_enqueue in die warteschlange einreihen.

@ "das wird zu kompliziert": eigentlich ist es so schon zu kompliziert. so gut wie keiner würde mit einer solchen API arbeiten wollen/können, weshalb ich die entwicklung auch wieder eingestellt habe.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 16:47 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
jepp...da muss man ja studiert für haben, um das zu verstehen.

Also nochmal von vorne und gaaanz einfach :)

A. Verzicht auf zentrales Menüplugin, da zu komplex.
B. jedes Plugin, was ein Menü verwendet muss einfach die Option besitzen, dass man das Menü wieder aufrufen kann, wenn dieses durch ein anderes Menü geschlossen wurde.
C. Jedes Plugin, welches ein Menü verwendet, muss auf 0 Cancel setzen (menuselect 10) und damit das Beenden des Menüs idividuell speichern.
D. Jedes Plugin, welches ein Menü verwendet, muss einfach andere Menüs durch execclient(User,"menuselect 10") schließen.
E. (was wahrscheinlich jedes Menüplugin schon besitzt:) geöffnete Menü-Plugins werden durch Aufrufen der internen HL-Menüs geschlossen.

So...Knackpunkt ist D:

der Aufruf von execclient(User,"menuselect 10") und der nachfolgende Aufruf des Menüs für den Client klappt nicht so ohne weiteres. Ich habe es in meinem sdal_menü Plugin mit einem Timer gelöst. Erst execclient und dann per Timer 1 sec später dann beim Client das Menü geöffnet. Dadurch kommt keine Kollison mehr zu stande.

Wie ich aber gerade festgestellt habe, klappt es auch einfacher (timer nervt):
man registriert/erstellt eine Function "menu_call",ACCESS_ALL mit return PLUGIN_HANDLED;
Nun kann man ohne Probleme, z.B. in einem HandleSay folgendes machen:
Code:
public HandleSay(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new UserName[MAX_NAME_LENGTH];
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,UserName,MAX_DATA_LENGTH);
	strstripquotes(Data);
	if(strcmp(Data,"votemaps")==0){
		execclient(UserName,"menuselect 10");
		execclient(UserName,"menu_call");
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}

public menu_call(HLCommand,HLData,HLUserName,UserIndex){
	new UserName[MAX_NAME_LENGTH];
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
	vote_menu(UserName,UserIndex);
	return PLUGIN_HANDLED;
}

Demzufolge ist ein plugin_exec gar nicht mehr notwendig bzw. eine Kommunikation der Plugins untereinander.

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 17:02 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
sdal, jetzt redest du unfug. von meiner ersten lösung hast du wohl nix mitgekriegt. die ist nämlich ziemlich simpel, und kann all das, was deine gerade vorgeschlagene lösung kann, allerdings ohne execclient und merkwürdige vorraussetzungen wie eine cancel-option.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 17:09 
Benutzeravatar

Registriert: 03.07.2004, 15:33
Beiträge: 26
Mir wäre allerdings ein plugin_exec lieber, da sonst jeder den Befehl menu_call von der console ausführen könnte...


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 17:19 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
nochmal ein beispiel für sdal:
Code:
#include <adminlib>
#include <menu>

#define MENU_NONE 0
#define MENU_EXAMPLE 1

new g_Version[] = "1337";

new g_maxplayers;
new g_Menu[MAX_PLAYERS] = {MENU_NONE};

public plugin_init() {
    plugin_registerinfo("Example Menu Plugin", "Example Menu Plugin Description", g_Version);
    plugin_registercmd("admin_examplemenu", "DisplayMenu", ACCESS_ALL, "Displays examlpe menu");
    plugin_registercmd("menuselect","HandleMS",ACCESS_ALL);
    register_menu_reset("MenuReset");
    g_maxplayers = maxplayercount();
    return PLUGIN_CONTINUE;
}

public MenuReset(HLCommand, HLData, HLUserName, UserIndex) {
    reset_menu(HLData, g_Menu, MENU_NONE, g_maxplayers);
    return PLUGIN_CONTINUE;
}

public DisplayMenu(HLCommand, HLData, HLUserName, UserIndex) {
    new Text[] = "\yMenu\w^n1. Option #1^n2. Option #2^n^n0. Exit";
    new UserName[MAX_NAME_LENGTH];
    new keys = (1<<0) | (1<<1) | (1<<9);
    convert_string(HLUserName, UserName, MAX_NAME_LENGTH);
    kill_menu(UserIndex);
    menu(UserName, Text, keys, 0); 
    return PLUGIN_HANDLED;
}

public HandleMS(HLCommand,HLData,HLUserName,UserIndex) {
    if(g_Menu[UserIndex] == MENU_NONE) return PLUGIN_CONTINUE;
    new Data[MAX_DATA_LENGTH];
    convert_string(HLData, Data, MAX_DATA_LENGTH);
    new iNum = strtonum(Data);
    new UserName[MAX_NAME_LENGTH];
    convert_string(HLUserName, UserName, MAX_NAME_LENGTH);
    new Text[MAX_TEXT_LENGTH];
    snprintf(Text, MAX_TEXT_LENGTH, "Player ^"%s^" chose option #%d", UserName, iNum);
    say(Text);
    return PLUGIN_HANDLED;
}
wesentlich komplizierter als vorher? ich denke nicht.


Zuletzt geändert von Rinde am 19.02.2005, 17:27, insgesamt 3-mal geändert.

Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 17:24 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
@ einstein: ein plugin_exec muss ein command registrieren, dass jeder ausführen können muss. auch bei meinem plugin kann man "rmb_reset" in die konsole eingeben, woraufhin alle menüplugins denken, ein neues menü wurde aufgerufen. bringt aber nix, dann können sie halt das menü, das sie gerade angezeigt haben, nicht mehr verwenden, ansonsten hat es überhauptkeine auswirkungen.
man könnte natürlich (und für ein komplizierteres plugin wie das, was ich als zweites vorgeschlagen habe, würde das auch der sicherheit wegen benötigen) vor dem plugin_exec einen vault-wert auf 1, und nach dem plugin_exec wieder auf 0 setzen. das empfangende plugin nimmt den gesendeten wert nur an, wenn der wert auf 1 ist. da der hlds nicht multithreaded ist, wäre es unmöglich für den client, falsche menüs zu öffnen o.ä.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 17:27 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
ich kenne Deine menü Konstruktion. Haben uns ja schon oft darüber unterhalten.

und ich ziehe ein execclient 10 vor.

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19.02.2005, 17:30 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
a propos vault: es ist natürich möglich, daten anstatt über die parameter von plugin_exec über das vault zu übermitteln. also:

o plugin A setzt einige werte im vault
o Plugin A sendet ein plugin_exec ohne parameter
o in plugin B wird von plugin_exec ein befehl ausgeführt.
o plugin B überprüft, ob die werte im vault gesetzt sind, und liest sie aus
o plugin A löscht die werte im vault wieder, damit manipulationen ausgeschlossen sind


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 52 Beiträge ]  Gehe zu Seite 1 2 3 Nächste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de
Original Design von "[ Half-Life Admin Mod © Alfred Reynolds 2000-2003 ] - [ site design by Jägermeister ]"