CreateMenu (id idSymbol, object pMenuObject, object pCommandObject, int iExtra, string szCaption, int iExtraData, int iStyle, bool fPermanent, id idMenuID);
id idSymbol: Objektdefinition, deren Bild als Symbol verwendet wird, eine ID muss angegeben werden. Beispiel: FLNT würde das Bild eines Flints erzeugen
object pMenuObject: Objekt, in welchem das Menü geöffnet wird; kann bei lokalen Aufrufen Null sein, oder mit anderen Worten: das Objekt, bei welchem das Menü aufgerufen wird. Beispiel: GetCursor(0) sorgt dafür dass der im Moment ausgewählte Clonk des Spielers 1 das Menü bekommt.
object pCommandObject: Erhält das Menükommando (siehe AddMenuItem); kann bei lokalen Aufrufen Null sein.
int iExtra: Zusätzliche Information im Menü über das jeweils markierte Objekt. Die angegebenen C4MN_*-Konstanten sind seit 4.9.5.0 CE ebenfalls definiert und sollten statt der numerischen Werte verwendet werden: (siehe folgende Tabelle:)
Konstante
Wert
Effekt
C4MN_Extra_None
0
Nichts
C4MN_Extra_Components
1
Komponenten
C4MN_Extra_Value
2
Wert (in Gold)
C4MN_Extra_MagicValue
3
Wert als Magiewert.
C4MN_Extra_Info
4
Beschreibungstext sofort anzeigen
C4MN_Extra_ComponentsMagic
5
Komponenten und Magiewert
dies bestimmt, was beim Menü unten in der Ecke angezeigt wird (im Kaufmenü z.B. der Goldwert, also C4NM_Extra_Value oder 2)
string szCaption: Bestimmt den angezeigten Menütext, wenn das Menü keine Einträge enthält -> Selbsterklärend
int iExtraData: nur benötigt bei "iExtraData" 3, gibt den Vergleichswert an (die zweite Zahl, also z.B. 25/70 (die 70))
int iStyle: Aussehen des Menüs. Bitte dieser Tabelle entnehmen:
Konstante
Wert
Aussehen
C4MN_Style_Normal
0
Normal
C4MN_Style_Context
1
Kontextmenü
C4MN_Style_Info
2
Infomenü
C4MN_Style_Dialog
3
Dialog
bool fPermanent: Das Menü bleibt geöffnet, wenn eine Auswahl getroffen wird.
id IdMenuId: [opt] Wenn angegeben, wird diese ID als Menü-ID gesetzt. Die aktuelle Menü-ID wird zum Beispiel von GetMenu zurückgegeben.
AddMenuItem (string szCaption, string szCommand, id idItem, object pMenuObject, int iCount, int iParameter, string szInfoCaption);
string szCaption: Text des neuen Menüeintrags
string szCommand: Kommando, das bei Auswahl des Menüeintrags ausgeführt werden soll. Kann entweder ein Funktionsname oder ein Statement sein. Wenn ein Funktionsname angegeben wird, dann wird die Funktion in dem Objekt aufgerufen, welches bei CreateMenu als pCommandObject übergeben wurde. Also der Befehl der aufgerufen wird (bei dem Objekt bei dem das Menü erstellt wurde) wenn der Menüeintrag gewählt wird.
id idItem: Die ID wird als Bild für den Menüeintrag verwendet. ZAP1 z.b. würde einen Menüeintrag erstellen mit einem Bild eines Zaps.
object pMenuObject: Objekt, dessen Menü der Eintrag hinzugefügt werden soll. Kann bei lokalen Aufrufen 0 sein. Wenn also 0 wird es in der funktion eingefügt in der das Menü erstellt wurde wird er diesem menü hinzugefügt.
int iCount: Zahl, die neben dem Eintrag angezeigz ewird, beim Kaufmenü z.b. die Anzahl wie oft man das Objekt noch kaufen kann.
int iParameter: Wird als 2. Parameter an die in szCommand angegebene Funktion übergeben (wer sich damit nicht auskennt sollte es lassen, ich will hier auch nciht nähe rdarauf eingehen)
string szInfoCaption: Beschreibungstext des neuen Menüeintrags -> "Beispiel: Dies ist ein Menüeintrag" wie bei allen strings muss der Text in "" geschrieben werden.
das war der erste Teil, der zweite erklärt euch anhand eines Beispiels genaueres, das Ziel wird es sein eine Klasse zu erstellen (für BoneZone) die am Start eine Shotgun besitzt und eine Mine, und wenn man über 100 Gold besitzt beim Respawn, bekommt die Klasse noch ein Jetpack, welches sofort angelegt wird.
als erstes öffne die script.c und scroll herunter, bis zu folgendem Eintrag:
Code:
CreateMenu(CXIN, pCrew, 0, C4MN_Extra_None, "Klassenwahl", 0, C4MN_Style_Context); if(GetWealth(iPlr) < 100) { AddMenuItem("Fallschirmspringer","SelectClass1",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel."); AddMenuItem("Assault","SelectClass2",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung."); AddMenuItem("Scharfschütze","SelectClass3",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar."); } else//Pro-Klassen >:D { AddMenuItem("{{ABMB}}Fallschirmspringer","SelectClass4",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel. Kann mit der Pisole ab und zu Airstikes ordern."); AddMenuItem("{{HARM}}Assault","SelectClass5",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung. Durch die zusätzliche Panzerung nun noch ausdauernder."); AddMenuItem("{{SBBA}}Scharfschütze","SelectClass6",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar. Kann sich jetzt Schutzwälle mit Sandsäcken bauen."); } }
ich erklär es euch nochmal genauer:
Code:
CreateMenu(CXIN, pCrew, 0, C4MN_Extra_None, "Klassenwahl", 0, C4MN_Style_Context); if(GetWealth(iPlr) < 100) { AddMenuItem("Fallschirmspringer","SelectClass1",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel."); AddMenuItem("Assault","SelectClass2",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung."); AddMenuItem("Scharfschütze","SelectClass3",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar."); }
als erstes wird das Menü erzeugt (CreateMenu) mit dem Symbol "CXIN", pCrew ist eine Variable die vorher im script festgelegt wurde als der Clonk des Spielers der respawnt. die 0 sagt an dass pCommandObject halt 0 ist und somit kein besonderes Menükommando angegeben wurde. IntIExtraData (der nächste Parameter) ist auf none und somit gibt es keine besonderen Werte die unten in der Ecke angezeigt werden. "Klassenwahl" ist der Text des Menüs. Da iExtraData nicht 3 ist, wird der nächste Parameter nicht benötigt (somit-> 0). Der letzte Parameter zeigt an, dass das Menü den Style eines Kontextmenüs besitzt. Die restlichen 2 Parameter sind optional, und wurden für dieses Menü nicht benötigt.
Danach werden die MenüItems hinzugefügt, also die Einträge. als erstes der Texteintrag (z.B. Fallschirmspringer), danach die Funktion die aufgerufen wird (SelectClassX), das Menüsymbol (MP7R (die MP)) die anderen parameter könnt ihr oben nachsehen. Der letzte ist der Beschreibungstext.
kopiert nun also eine der "AddMenuItem" Zeilen und ändert sie passend: für unsere Beispielklasse also z.B.
1. Name der Klasse ("Mafiosi") 2. die Funktion die aufgerufen wird, einfach immer weiter durchnummerieren. Ich habe ein "a" dahintergesetzt weil weiter unten beim Original schon "Selectclass4" genutzt wird für den Fallschirmspringer falls man mehr als 100 Gold hat. Es ginge natürlich auch "SelectClassPatta1" oder "blablablupp" 3. Icon, hier die Shotgun, gebt einfach die passende ID ein die ihr als bild wollt. 4.5.6. einfach so lassen 7. Beschreibungstext der Klasse
nun können wir ingame testen. Die Klasse ist da.
aber man hat noch immer die Ausrüstung des Fallschirmspringers.
Dies werden wir nun ändern. Wenn wir uns unser script von vorhin nochmal angucken, sehen wir dass wir als Funktion, die beim Wählen des Menüpunktes aufgerufen wird "Selectclass4a" gewählt haben. wenn ihr weitere Klassen erstellen wollt muss natürlich jedes mal eine andere Funktion aufgerufen werden.
suchen wir nun die original Funktionen die nach wählen eines Menüpunkts aufgerufen werden. (Also z.B. "SelectClass1")
Code:
func SelectClass1(id unused, int iObj) { var pObj = Object(iObj); pObj->CreateContents(MP7R); pObj->CreateContents(PIWP); DoStartAmmo(pObj);
var helper = CreateObject(JHLP,0,0,GetOwner(pObj)); pObj->Enter(helper); helper->Set(false,50,true); }
darunter gibt es das noch für SelectClass 2 usw. nach dem letzten SelectClass (6 standardmässig) fügen wir die Funktion
Code:
func SelectClass4a(id unused, int iObj) { }
ein in diese Funktion schreiben wir nun hinein, was passieren soll wenn der Menüeintrag gewählt wurde. Wir wollen eine Shotgun für den Clonk und eine Mine, also:
Code:
func SelectClass4a(id unused, int iObj) { var pObj = Object(iObj); pObj->CreateContents(PGWP); pObj->CreateContents(MINE); pObj->CreateContents(PIWP); DoStartAmmo(pObj);
pObj->CreateContents(PGWP); dies erstellt eine Shotgun beim Clonk, der vorher als Variable "pObj" festgelegt wurde. Das selbe wird mit der Mine (ID: MINE) gemacht und auch mit der Sturmpistole die jede Klasse standardmässig hat (ID: PIWP). DoStartAmmo(pObj); die If-Abfrage bewirkt dass der Clonk gespawnt wird. dies ist eine Funktion die der Autor von BoneZone selber geschrieben hat, sie bewirkt dass alle Waffen des Clonks am start geladen sind. gehen wir nun ingame, sehen wir dass wir sowohl die Klasse wählen können als auch die Gegenstände bekommen:
haben wir aber über 100 Gold taucht die Klasse nicht mehr auf im Menü. Dies liegt daran dass wenn der Spieler über 100 Gold hat ein alternatives Menü für die besseren Verisonen der Klassen erscheint.
suchen wir also wieder die Stelle mit dem menü, nehmen aber diesmal das Menü nach dem else.
Code:
else//Pro-Klassen >:D { AddMenuItem("{{ABMB}}Fallschirmspringer","SelectClass4",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel. Kann mit der Pisole ab und zu Airstikes ordern."); AddMenuItem("{{HARM}}Assault","SelectClass5",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung. Durch die zusätzliche Panzerung nun noch ausdauernder."); AddMenuItem("{{SBBA}}Scharfschütze","SelectClass6",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar. Kann sich jetzt Schutzwälle mit Sandsäcken bauen."); }
wir kopieren wieder eine der AddMenuItem zeilen und fügen sie unter den anderen ein.
Code:
AddMenuItem("{{JTPK}}Mafiosi","SelectClass4b",PGWP,pCrew,0,ObjectNumber(pCrew),"Kommt mit Mine, Shotgun und Jetpack, macht den Skeletten ein Angebot dass sie nicht ablehnen können.");
"{{JTPK}}Mafiosi" der Name der Klasse, das {{JTPK}} erzeugt das Symbol des Jetpacks vor dem Namen, wieder dementsprechend ersetzen. "SelectClass4b" aufgerufene Funktion, siehe oben. Der rest ist genauso wie vorhin nur die Beschreibung ist geändert. der Mafiosi ist jetzt im Menü, auch dann noch wenn man mehr als 100 Gold hat. Wir müssen nur wieder die FUnktion einfügen die aufgerufen wird wenn man den mafiosi wählt und 100 oder mehr Gold hat. Wir nehemn die selbe Funktion wie vorhin, nur ändern wir das "SelectClass4a" in "SelectClass4b" um und fügen dem inhalt der Funktion eine Zeile hinzu:
Code:
func SelectClass4b(id unused, int iObj) { var pObj = Object(iObj); pObj->CreateContents(PGWP); pObj->CreateContents(MINE); pObj->CreateContents(PIWP); pObj->CreateContents(JTPK)->Activate(pObj); DoStartAmmo(pObj);
pObj->CreateContents(JTPK)->Activate(pObj); dies gibt dem Clonk ein Jetpack und aktiviert es. das war es auch "schon".
Viel Spass mit meinem ersten Tutorial, ich hoffe ich konnte euch die Menüs schonmal etwas näher bringen, und ich hoffe auch ihr habt Spass beim designen neuer Klassen..
wer nochmal diesen scriptteil bei meiner BoneZone Version sehen will:
Spoiler:
Code:
CreateMenu(CXIN, pCrew, 0, C4MN_Extra_None, "Klassenwahl", 0, C4MN_Style_Context); if(GetWealth(iPlr) < 100) { AddMenuItem("Fallschirmspringer","SelectClass1",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel."); AddMenuItem("Assault","SelectClass2",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung."); AddMenuItem("Scharfschütze","SelectClass3",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar."); AddMenuItem("Chainsaw","SelectClass25",MEZL,pCrew,0,ObjectNumber(pCrew),"Rhömm böbböbömmbömmbömmbömmbömm."); AddMenuItem("Feuerwehrmann","SelectClass26",FTWP,pCrew,0,ObjectNumber(pCrew),"Nicht zum Löschen von Feuer gedacht."); AddMenuItem("Sprengmeister","SelectClass27",BZWP,pCrew,0,ObjectNumber(pCrew),"Kaboooooom."); AddMenuItem("Doc","SelectClass31",MEDI,pCrew,0,ObjectNumber(pCrew),"Kann für 5 Gold ein Medipack kaufen."); AddMenuItem("Unterstützer","SelectClass32",SNWP,pCrew,0,ObjectNumber(pCrew),"Kann Gegnern das Inventar leeren und hat eine Schallpistole. Alleine nicht gerade gut."); AddMenuItem("Sturmsoldat","SelectClass33",PTWP,pCrew,0,ObjectNumber(pCrew),"Besitzt eine Partikelkanone"); AddMenuItem("Granatentruppe","SelectClass37",GRGE,pCrew,0,ObjectNumber(pCrew),"Kann für 10 Gold eine Granate einkaufen. Besitzt ausserdem eine MP7."); AddMenuItem("Ingenieur","SelectClass38",KRFL,pCrew,0,ObjectNumber(pCrew),"Unterstützt die anderen Soldaten, da er relativ günstig Waffenupgrades kaufen kann. Besitzt aber nur eine einfache Partikelpistole."); AddMenuItem("Thermostrahltrupp","SelectClass39",TSWP,pCrew,0,ObjectNumber(pCrew),"Brutzelt die Skelette weg wie nichts."); AddMenuItem("Soldat","SelectClass43",GUWP,pCrew,0,ObjectNumber(pCrew),"Ein eher einfacher Soldat mit einem Gewehr."); AddMenuItem("Fallschirmjäger","SelectClass44",PARA,pCrew,0,ObjectNumber(pCrew),"Ein eher einfacher Soldat, der mit einem Fallschirm aufs Schlachtfeld kommt."); AddMenuItem("Minenleger","SelectClass45",MINE,pCrew,0,ObjectNumber(pCrew),"Legt Minen. Besitzt ausserdem eine MP"); AddMenuItem("Sturmsoldat","SelectClass49",ASRF,pCrew,0,ObjectNumber(pCrew),"Der vernichter."); AddMenuItem("Gelehrter","SelectClass50",BOOK,pCrew,0,ObjectNumber(pCrew),"Besitzt ein volles Zauberbuch und eine MP"); AddMenuItem("Geschützmann","SelectClass55",BAZO,pCrew,0,ObjectNumber(pCrew),"Der Mann fürs grobe. Hat eine Bazooka."); } else//Pro-Klassen >:D { AddMenuItem("{{ABMB}}Fallschirmspringer","SelectClass4",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel. Kann mit der Pisole ab und zu Airstikes ordern."); AddMenuItem("{{HARM}}Assault","SelectClass5",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung. Durch die zusätzliche Panzerung nun noch ausdauernder."); AddMenuItem("{{SBBA}}Scharfschütze","SelectClass6",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar. Kann sich jetzt Schutzwälle mit Sandsäcken bauen."); AddMenuItem("{{JTPK}}Chainsaw","SelectClass28",MEZL,pCrew,0,ObjectNumber(pCrew),"Metzelt sich gerne durch Skeletthorden. Jetzt mit einem Jetpack ausgestattet."); AddMenuItem("{{MINE}}Feuerwehrmann","SelectClass29",FTWP,pCrew,0,ObjectNumber(pCrew),"Nicht zum Löschen von Feuer gedacht. Legt neuerdings Minen in den Weg der Skelette."); AddMenuItem("{{SFLN}}Sprengmeister","SelectClass30",BZWP,pCrew,0,ObjectNumber(pCrew),"Noch mehr Kabooooooom. Kommt jetzt mit Bomben"); AddMenuItem("{{MED2}}Doc","SelectClass34",MEDI,pCrew,0,ObjectNumber(pCrew),"Kann noch immer für 5 Gold ein Medipack kaufen. Dieses heilt einen frundlichen Clonk in geringem Umkreis sofort etwas. Hat bereits zu Anfang eins."); AddMenuItem("{{DRSU}}Unterstützer","SelectClass35",SNWP,pCrew,0,ObjectNumber(pCrew),"Kann Gegnern das Inventar leeren und hat eine Schallpistole. Alleine nicht gerade gut. hat auch eine Drohne zu seiner Unterstützung"); AddMenuItem("{{STRH}}Sturmsoldat","SelectClass36",PTWP,pCrew,0,ObjectNumber(pCrew),"Besitzt eine Partikelkanone und jetzt auch einen Partikelkonverter zum Aufrüsten "); AddMenuItem("{{GRGE}}Granatentruppe","SelectClass40",GRGE,pCrew,0,ObjectNumber(pCrew),"Kann für 10 Gold eine Granate einkaufen. Besitzt ausserdem eine MP7 und eine Mine."); AddMenuItem("{{HSHD}}Ingenieur","SelectClass41",KRFL,pCrew,0,ObjectNumber(pCrew),"Unterstützt die anderen Soldaten, da er relativ günstig Waffenupgrades kaufen kann. Besitzt neuerdings einen Schildgenerator und einen Partikelkonverter für seine Waffe."); AddMenuItem("{{PARA}}Thermostrahlertrupp","SelectClass42",TSWP,pCrew,0,ObjectNumber(pCrew),"Brutzelt die Skelette weg wie nichts. Und das per Fallschirmsprung."); AddMenuItem("{{KRFL}}Soldat","SelectClass46",GUWP,pCrew,0,ObjectNumber(pCrew),"Ein eher einfacher Soldat mit einem Gewehr. Dieses kann er nun allerdings auch verbessern."); AddMenuItem("{{SEGE}}Fallschirmjäger","SelectClass47",PARA,pCrew,0,ObjectNumber(pCrew),"Ein eher einfacher Soldat. Kann sich und andere für Gold auf sin Flugzeug beamen und dann von da mit dem Fallschirm wieder abspringen."); AddMenuItem("{{GUWP}}Minenleger","SelectClass48",MINE,pCrew,0,ObjectNumber(pCrew),"Legt Minen. Besitzt ausserdem ein Gewehr und kann nun Minen kaufen"); AddMenuItem("{{KRFL}}Sturmsoldat","SelectClass52",ASRF,pCrew,0,ObjectNumber(pCrew),"Der vernichter. Hat auch ein Laserteil und ein Waffenteil."); AddMenuItem("{{MSSH}}Gelehrter","SelectClass53",BOOK,pCrew,0,ObjectNumber(pCrew),"Besitzt ein volles Zauberbuch und eine MP. Kann ausserdem für Gold den Zauber Blitz wirken."); AddMenuItem("{{KRFL}}Geschützmann","SelectClass58",BAZO,pCrew,0,ObjectNumber(pCrew),"Der Mann fürs grobe. Hat eine Bazooka, die er mit Splitter - und Hochgeschwindigkeitsraketen upgraden kann."); } }
func SelectClass1(id unused, int iObj) { var pObj = Object(iObj); pObj->CreateContents(MP7R); pObj->CreateContents(PIWP); DoStartAmmo(pObj);
Thema: Re: Menüs, oder: wie erstelle ich eine Bonezone Klasse? Di Jan 12, 2010 8:57 pm
so, es ist fertig, ich hoffe auf ein paar Kritiken. aber fragt mich jetzt bitte nicht zu allen möglichen Sachen aus meinem Script. manches mag sehr einfach sein, aber diese tut zu schreibenwar vielleicht anstrengend
Menüs, oder: wie erstelle ich eine Bonezone Klasse?