Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
08.06.2000, 15:16
Morgan



Kann nicht jemand ein Tutorial über mehrere Menüs schreiben. Unser Mod bleibt an dieser Sache kleben. Wir haben 2 Menüs. In dem einen sucht man sich sein Team aus und in dem anderen kauft man Waffen. Man kann 5 Waffen kaufen (also slot 1-5). Will ich mir jetzt aber die erste Waffe kaufen obwohl ich in Team 2 bin, dann gibt er mir nicht die erste Waffe sondern setzt mich in Team 1. Dasselbe ist wenn ich in team 1 bin und mir die waffe 2 kaufen will.
Ich hoffe ihr könnt mir helfen.

Morgan (http://hlfuture.net-games.com)

--

zum Seitenanfang zum Seitenende Profil || Suche
001
09.06.2000, 07:57
PsyDAD



Dieses Problem hatte ich auch mal, und bin auf eine ganz simple Lösung gestossen.
Am besten machst du zuerst einen neuen Integer in der Klasse CBasePlayer den du dann m_iMenu oder so nennst.
Dieser Integer hat den immer den Wert des aktuellen Menüs. zBsp. 1 für Teamauswahl und 2 für Waffenkauf.
Du musst jetzt einfach immer bevor du die ShowMenu Funktion aufrufst diese Variable ändern wie du sie brauchst. (zBsp. pPlayer->m_iMenu = 1;)
Nachher musst du in der ClientCommand Funktion beim menuselect Befehl einfach eine Switch Anweisung einfügen.
switch (pPlayer->m_iMenu)
{
case 1:
//// Hier das ganze Zeug für die Teamauswahl
break;
case 2:
//// Und hier alles für den Waffenkauf
break;
}

Das war jetzt alles in Schnelldurchlauf, wenn du etwas nicht verstehst, frag einfach nach.

PsyDAD

--

zum Seitenanfang zum Seitenende Profil || Suche
002
09.06.2000, 13:59
Morgan



Bei mir klappte das nicht so ganz! (L(
Deswegen schreibe ich dir hier meinen Code und hoffe , das du mir sagen kannst wie das geht!

Wstrike_gamerules.cpp:

//=========================================================
// ClientCommand
// the user has typed a command which is unrecognized by everything else;
// this check to see if the gamerules knows anything about the command
//=========================================================
BOOL CHalfLifeHMCTF :: ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
{
char szMenu [512];

if ( FStrEq( pcmd, "menuselect" ) )
{
if ( CMD_ARGC() < 2 )
return TRUE;

int slot = atoi( CMD_ARGV(1) );

//chris Beginn
switch(pPlayer->m_nMenu)

{
case Menu_ChangeTeam:
default:
switch (slot)
{
case 1:

JoinTeam(pPlayer, Wstrike_TEAM1_NAME);// option one
break;

case 2:

JoinTeam(pPlayer, Wstrike_TEAM2_NAME);//option two
break;

case 3:

JoinTeam(pPlayer, TeamWithFewestPlayers());//option three

}

{
break;
}

case Menu_Buy:
switch (slot)
{

case 1:
if(pPlayer->m_iMoneyAmount <= 499)
return TRUE;
pPlayer->GiveNamedItem( "weapon_9mmAR" );
pPlayer->m_iMoneyAmount -= 500;
break;
case 2:
if(pPlayer->m_iMoneyAmount <= 399)
return TRUE;
pPlayer->GiveNamedItem( "weapon_shotgun" );
pPlayer->m_iMoneyAmount -= 400;
break;
case 3:
if(pPlayer->m_iMoneyAmount <= 299)
return TRUE;
pPlayer->GiveNamedItem( "weapon_python" );
pPlayer->m_iMoneyAmount -= 300;
break;
case 4:
if(pPlayer->m_iMoneyAmount <= 699)
return TRUE;
pPlayer->GiveNamedItem( "weapon_crossbow" );
pPlayer->m_iMoneyAmount -= 700;
break;
case 5:
if(pPlayer->m_iMoneyAmount <= 999)
return TRUE;
pPlayer->GiveNamedItem( "weapon_rpg" );

pPlayer->m_iMoneyAmount -= 1000;
break;

}
break;
}

return TRUE;
}
else if ( FStrEq( pcmd, "changeteam" ) )
{
//Make sure he's not dead
if (!pPlayer->IsAlive()) return TRUE;

pPlayer->m_nMenu = Menu_ChangeTeam;
strcpy (szMenu, "Select a team

");
strcat (szMenu, "1. Gangster
");
strcat (szMenu, "2. Debuty
");
strcat (szMenu, "3. Autoteam");
ShowMenu (pPlayer, 0x7, 0, 0, szMenu);

return TRUE;
}


// if we're not handling a menuselection, but handling the changeclass command, do this:
else if (FStrEq(pcmd, "changeclass" )) //If you type changeclass in console....
{
// show the menu
ShowMenu (pPlayer, 0x3F, 0, 0, "#class_list");
// prevent the error message
return true;
}

else if (FStrEq(pcmd, "buy" ))
{
ShowMenu(pPlayer, 0x1F, 20, 0, "#buy_menu");
pPlayer->m_iMenu = 1;


return TRUE;
}

return FALSE;
}

//Chris Ende

und jetzt die Player.h:

//Morgan
enum _Menu {
Menu_ChangeTeam,
Menu_Buy,

};
//Morgan

class CBasePlayer : public CBaseMonster
{
public:
int m_iMenu;
int m_iClientMenu;
int m_iMoneyAmount;

Helft mir!!!!!!!

--

zum Seitenanfang zum Seitenende Profil || Suche
003
09.06.2000, 16:31
Prefect



Was kümmert dich das jetzt noch? Das Menüsystem im SDK2 arbeitet völlig anders.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
004
09.06.2000, 16:42
PsyDAD



Dieses Problem schaffen wir jetzt ein für alle Mal aus dem Weg =)
Alles geänderte ist fett.
--------------------
//=========================================================
// ClientCommand
// the user has typed a command which is unrecognized by everything else;
// this check to see if the gamerules knows anything about the command
//=========================================================
BOOL CHalfLifeHMCTF :: ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
{
char szMenu [512];

if ( FStrEq( pcmd, "menuselect" ) )
{
if ( CMD_ARGC() < 2 )
return TRUE;

int slot = atoi( CMD_ARGV(1) );

//chris Beginn
switch(pPlayer->m_iMenu)

{
case 1: //Sagen wir 1 ist der Wert für das Teammenü
//Weg mit dem default:
switch (slot)
{
case 1:

JoinTeam(pPlayer, Wstrike_TEAM1_NAME);// option one
break;

case 2:

JoinTeam(pPlayer, Wstrike_TEAM2_NAME);//option two
break;

case 3:

JoinTeam(pPlayer, TeamWithFewestPlayers());//option three

// Hier war ein } zuviel
// Hier auch
}
break; //Das kommt hier hin

case 2: //Sagen wir 2 ist der Wert für das Kaufmenü
switch (slot)
{

case 1:
if(pPlayer->m_iMoneyAmount <= 499)
return TRUE;
pPlayer->GiveNamedItem( "weapon_9mmAR" );
pPlayer->m_iMoneyAmount -= 500;
break;
case 2:
if(pPlayer->m_iMoneyAmount <= 399)
return TRUE;
pPlayer->GiveNamedItem( "weapon_shotgun" );
pPlayer->m_iMoneyAmount -= 400;
break;
case 3:
if(pPlayer->m_iMoneyAmount <= 299)
return TRUE;
pPlayer->GiveNamedItem( "weapon_python" );
pPlayer->m_iMoneyAmount -= 300;
break;
case 4:
if(pPlayer->m_iMoneyAmount <= 699)
return TRUE;
pPlayer->GiveNamedItem( "weapon_crossbow" );
pPlayer->m_iMoneyAmount -= 700;
break;
case 5:
if(pPlayer->m_iMoneyAmount <= 999)
return TRUE;
pPlayer->GiveNamedItem( "weapon_rpg" );

pPlayer->m_iMoneyAmount -= 1000;
break;

}
return TRUE;
}
else if ( FStrEq( pcmd, "changeteam" ) )
{
//Make sure he's not dead
if (!pPlayer->IsAlive()) return TRUE;

pPlayer->m_nMenu = 1; //Wir sagten ja 1 ist die Teamauswahl
strcpy (szMenu, "Select a team ");
strcat (szMenu, "1. Gangster ");
strcat (szMenu, "2. Debuty ");
strcat (szMenu, "3. Autoteam");
ShowMenu (pPlayer, 0x7, 0, 0, szMenu);

return TRUE;
}

// if we're not handling a menuselection, but handling the changeclass command, do this:
else if (FStrEq(pcmd, "changeclass" )) //If you type changeclass in console....
{
// show the menu
ShowMenu (pPlayer, 0x3F, 0, 0, "#class_list");
// prevent the error message
return true;
}

else if (FStrEq(pcmd, "buy" ))
{
pPlayer->m_iMenu = 2; // Wir sagten ja 2 ist das Kaufmenü, ausserdem kommt
// diese Linie vor die ShowMenu Funktion

ShowMenu(pPlayer, 0x1F, 20, 0, "#buy_menu");

return TRUE;
}

return FALSE;
}

//Chris Ende

und jetzt die Player.h:

//Morgan
enum _Menu {
Menu_ChangeTeam,
Menu_Buy,

};
//Morgan

class CBasePlayer : public CBaseMonster
{
public:
int m_iMenu; // Hier stimmt alles
int m_iClientMenu;
int m_iMoneyAmount;
--------------------
Es kann sehr gut sein, dass irgendwo einen kleinen Fehler gemacht habe, weil das mit die Formatierung verloren gieng.
Ich hoffe es klappt jetzt alles und meine Arbeit war nicht umsonst.

PsyDAD

--

zum Seitenanfang zum Seitenende Profil || Suche
005
09.06.2000, 16:45
PsyDAD



@ Perfect:
Klar ist alles anders, aber wieso glaubst du haben auch die von Counter-Strike noch die alten Menüs verwendet ? Weil die vieeeeeel einfach zu handhaben sind, ich finde für den Anfang ist so ein Menü nicht schlecht...

PsyDAD

--

zum Seitenanfang zum Seitenende Profil || Suche
006
09.06.2000, 18:17
Prefect



Was ist dein Problem? Du kannst die Maus ja ausschalten, dann hast du genauso Zahlen-Bedienung wie im alten Menü.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
007
09.06.2000, 19:35
PsyDAD



Ja, schon klar. Aber ich mein die Handhabung vom coden her... Ja, ok, es giebt jetzt noch keine Tutorials und ich blick sonst auch NOCH nicht ganz durch. Aber ich denke für "Newbie Coder" ist das doch besser..

Lassen wir das, ich versuch auf jeden Fall das VGUI mal (wenigstens halb) zu kapieren, werde ich aber nicht in nächster Zeit hinkriegen.

PsyDAD

--

zum Seitenanfang zum Seitenende Profil || Suche
008
10.06.2000, 12:27
Morgan



kannst du mir jetzt vielleicht auch sagen, wiem man mehrere Menüs wie in Counterstrike machen kann. z.B. Ein Pistolenmenü:
kaufmenu
-Pistolenmenü
--1
--2
-schnellfeuerwaffen
--1
--3
???

--

zum Seitenanfang zum Seitenende Profil || Suche
009
10.06.2000, 12:41
DarkCloud14



Wenn wir schon bei Menüs wie kann ich solche Menüs wie in TFC machen also mit dem VGUI meine ich ?
Ist das mehr arbeit als mit den alten oder weniger oder genauso viel ?

THX

--

zum Seitenanfang zum Seitenende Profil || Suche
010
12.06.2000, 21:13
Morgan



Weiß hie niemand wie man mehrere menüs ineinander wie in Counterstrike macht ??

--

zum Seitenanfang zum Seitenende Profil || Suche
011
13.06.2000, 11:50
DarkCloud14



Hmm wenn du willst,dass man z.b. als erstes ein team wählt und dann die Klasse musst du einfach das Klassenmenü aufrufen nachdem der Spieler das Team gewählt hat und natürlich das m_imenu(oder wie auch immer es bei dir heißt)switchen.Versuchs einfach mal :)

--

zum Seitenanfang zum Seitenende Profil || Suche
012
13.06.2000, 15:12
Morgan



Und wie geht das mit dem switschen???

--

zum Seitenanfang zum Seitenende Profil || Suche
013
14.06.2000, 12:32
PsyDAD



Wie wärs wenn du mal ein Menü Tutorial durchmachst und verstehst...
Dann könntest du nämlich solche Probleme selber lösen (sind ja eigentlich alle ganz simpel, sonst würde ich sie ja nicht verstehen =) ).
Gute tuts giebts unter:
<a href="http://www.thewall.de/dhcc" target="_blank"><!--autohttp-->http://www.thewall.de/dhcc</a><!--autohttp--> =)
<a href="http://hlpp.valveworld.com" target="_blank"><!--auto-->http://hlpp.valveworld.com</a><!--auto-->
<a href="http://www.planethalflife.com/wavelength/coding/" target="_blank"><!--autohttp-->http://www.planethalflife.com/wavelength/coding/</a><!--autohttp-->
<a href="http://www.planethalflife.com/hlprogramming/old/tutorials.htm" target="_blank"><!--autohttp-->http://www.planethalflife.com/hlprogramming/old/tutorials.htm</a><!--autohttp-->

Englisch solltest du können...

PsyDAD

--

zum Seitenanfang zum Seitenende Profil || Suche
014
15.06.2000, 09:54
Morgan



Wie geht das denn genau mit dem switchen. Mein Code ist doch oben!!!! Kann mir keiner helfen???

--

zum Seitenanfang zum Seitenende Profil || Suche
015
15.06.2000, 20:08
DarkCloud14



Also da du in deinem Code ja mit Jointeam in ein Team joinst,musst du diese Funktion auch irgendwo in der selben Datei haben der Anfang könnte wie folgt aussehen(bin mir nicht sicher da ich den ja nicht gesehen habe):void

void CHalfLifeTeamplay::JoinTeam(CBasePlayer *pPlayer, const char *pTeamName)
{
char text [1024];

if (FStrEq(pPlayer->m_szTeamName, pTeamName))
{
return;
}

usw.
Damit nun das Klassenmenü kommt nachdem du ein Team gewählt hast versuch folgendes:

void CHalfLifeTeamplay::JoinTeam(CBasePlayer *pPlayer, const char *pTeamName)
{
char text [1024];

//DarkCloud14
pPlayer->m_nMenu = Menu_ChangeClass;
ShowMenu (pPlayer, 0x3f, 0, 0, "#class_list");
//DarkCloud14

if (FStrEq(pPlayer->m_szTeamName, pTeamName))
{
return;
}

wobei du Menu_ChangeClass auch in der ClientCommand haben musst(wie das mit dem Teammenü)also so etwas ähnliches wie folgt:

case Menu_ChangeClass:
switch (slot)
{
case 1:
pPlayer->m_PlayerClass=1;
ClientPrint(pPlayer->pev, HUD_PRINTTALK, "You are now Scout class.");
pPlayer->Spawn();
break;

Ok ich hoffe den Rest kannst du selbst
Wenn du mir ein paar Credits geben würdest wäre auch net =)(kleiner Scherz am Rande)
Cya

--

zum Seitenanfang zum Seitenende Profil || Suche
016
15.06.2000, 22:04
Morgan



Wenn's klappt dann hast du es dir ja verdient!!

--

zum Seitenanfang zum Seitenende Profil || Suche
017
16.06.2000, 09:45
Morgan



Nein, ich glaube du hast das falsch verstanden !!!! Das mit den 2 Menüs das klapt jetzt !!
Also ich habe schon ein geldsystem! Wenn ich auf die Taste drücke , dann kommt das kaufmenü! Dort sollte z.B. stehen 1.Pistolen 2. MPS usw. Wenn ich dann 1 drücke dann soll das Pistolenmenü kommen. Oder bei 2 das MP Menü!!
Danke!

--

zum Seitenanfang zum Seitenende Profil || Suche
018
16.06.2000, 14:08
DarkCloud14



Achso ehh das dürfte aber kein Problem mehr sein oder ??
Zuerst musst du in der Clientcommand das Menü machen das Aufgerufen werden soll wenn du buy oder so eingibst ich mach mal ein Beispiel

case Menu_Buy:
switch (slot)
{

case 1:
pPlayer->m_nMenu = Menu_Pistols;
ShowMenu (pPlayer, 0x3f, 0, 0, "#pistols");
break;

case 2:
pPlayer->m_nMenu = Menu_Mps;
ShowMenu (pPlayer, 0x3f, 0, 0, "#Mps");
break;
}
break;

case Menu_Pistols:
switch (slot)
{

case 1:
if(pPlayer->m_iMoneyAmount <= 299)
return TRUE;
pPlayer->GiveNamedItem( "weapon_python" );
pPlayer->m_iMoneyAmount -= 300;
break;

case 2:
if(pPlayer->m_iMoneyAmount <= 299)
return TRUE;
pPlayer->GiveNamedItem( "weapon_9mmhandgun" );
pPlayer->m_iMoneyAmount -= 300;
break;
}
break;

case Menu_Mps:
switch (slot)
{

case 1:
if(pPlayer->m_iMoneyAmount <= 499)
return TRUE;
pPlayer->GiveNamedItem( "weapon_9mmAR" );
pPlayer->m_iMoneyAmount -= 500;
break;

case 2:
if(pPlayer->m_iMoneyAmount <= 399)
return TRUE;
pPlayer->GiveNamedItem( "weapon_shotgun" );
pPlayer->m_iMoneyAmount -= 400;
break;
}
break;

else if (FStrEq(pcmd, "buy" ))
{
ShowMenu(pPlayer, 0x1F, 20, 0, "#buy_menu");
pPlayer->m_nMenu = Menu_Buy;

return TRUE;
}

So ungefähr müsste es aussehen.Ich hab das alte Menu_Buy umgeändert da das mit den Waffen erst in dem nächsten Menü (das aufgerufen wird)gebraucht wird.Und ja ich weiß,dass die Shotgun keine MP ist das soll nur ein Beispiel sein.
Das letztere hab ich umgeändert da sonst das mit dem Menü net richtig klappt.
So ich hoffe das es jetzt klappt bzw ,dass es das war was du wolltest.
Cya

--

zum Seitenanfang zum Seitenende Profil || Suche
019
16.06.2000, 14:26
DarkCloud14



Ach bevor ichs vergesse du musst in der Titles.txt noch sowas wie folgt schreiben:

buy_menu
{
=== Buy Item ===

1. Pistols
2. Mps
}

pistols
{
=== Choose Your Pistol ===

1. Glock
2. Phyton
}

mps
{
=== Choose Your Mp ===

1. Mp5
2. Shotgun
}

So das wars du kannst das in der Titles.txt natürlich beliebig verändern.

Das 0x3 im ShowMenu(hinter pPlayer, ) bedeutet,dass nur die ersten 2 Tasten also 1 und 2 benutzt werden können.
Du kannst mit einem Base Converter der z.B. dem Hexworkshop beiliegt herausfinden welche Zahl du dort hinschreiben musst wenn du als Hexadecimale Zahl 3 eingibst(nicht 0x3 nur die Zahl die hinter dem 0x steht)wirst du bei Binary
0011 sehen die ersten 2 Nullen werden nicht gezählt nur das was hinter ihnen steht so ist z.B. 3F in Binary
0111111 und somit koennen die ersten 6 Zahlen (1,2,3,4,5,6)benutzt werden wenn du anstatt 0x3 0x3F schreibst.

Cya

--

zum Seitenanfang zum Seitenende Profil || Suche
020
19.06.2000, 21:24
DarkCloud14



Hi Morgan kurze Frage klappt das was ich da hingeschrieben habe ??

Cya

--

zum Seitenanfang zum Seitenende Profil || Suche
021
24.06.2000, 11:50
Boogdoo



Super, dass endlich mal jemand dieses Problem erklärt!! Thx PsyDad und DarkCloud14!!
Ich wollte das ganze mal ausprobieren, er sagt aber immer, dass es die Funktion "JoinTeam" nicht gibt. Habt ihr das SDK 2.0 oder die Funktion selbst gemacht??
Könnt ihr sie bitte hier posten? Unser Mod hängt nämlich auch schon seit einiger Zeit wegen diesem Problem.

Thx i.a.

Boogdoo

--

------------------------------
© Boogdoo
a.k.a. -=[TFoG|Saddam]=-, ViZiT http://www.tfog-clan.de/

zum Seitenanfang zum Seitenende Profil || Suche
022
24.06.2000, 12:53
DarkCloud14



Moin Boogdoo ich hab heut mal nen guten Tag also das mit dem JoinTeam sollte wie folgt aussehen(habs in der teamplay_gamerules.cpp benutzt):

void CHalfLifeTeamplay::JoinTeam(CBasePlayer *pPlayer, const char *pTeamName)
{
char text [1024];

if (FStrEq(pPlayer->m_szTeamName, pTeamName))
{
return;
}

if ( pPlayer->m_afPhysicsFlags & PFLAG_OBSERVER)
{

sprintf( text, "* %s has joined the %s team
", STRING(pPlayer->pev->netname), pTeamName );
UTIL_SayText( text, pPlayer );
UTIL_LogPrintf( ""%s<%i>" joined the %s team
", STRING( pPlayer->pev->netname ), GETPLAYERUSERID( pPlayer->edict() ), pTeamName );
pPlayer->pev->deadflag = DEAD_RESPAWNABLE;
ChangePlayerTeam( pPlayer, pTeamName, FALSE, FALSE );

pPlayer->Spawn();
RecountTeams();
}
else
{

sprintf( text, "* %s has changed to the %s team
", STRING(pPlayer->pev->netname), pTeamName );
UTIL_SayText( text, pPlayer );
UTIL_LogPrintf( ""%s<%i>" changed to the %s team
", STRING( pPlayer->pev->netname ), GETPLAYERUSERID( pPlayer->edict() ), pTeamName );
ChangePlayerTeam( pPlayer, pTeamName, TRUE, TRUE );

RecountTeams();
}
}

wobei du noch folgendes in die teamplay_gamerules.h bzw deine_gamerules.h schreiben musst :
unter

virtual BOOL IsValidTeam( const char *pTeamName );
const char *SetDefaultPlayerTeam( CBasePlayer *pPlayer );
virtual void ChangePlayerTeam( CBasePlayer *pPlayer, const char *pTeamName, BOOL bKill, BOOL bGib );
schreib

virtual void JoinTeam( CBasePlayer *pPlayer, const char *pTeamName);

So das Showmenu hast du ja hoffentlich.

Cya

--

zum Seitenanfang zum Seitenende Profil || Suche
023
24.06.2000, 13:00
DarkCloud14



Ahh ich hab das mit dem Observer vergessen am besten schaust du dir das Tutorial auf http://www.planethalflife.com/whenitsdone/projects/hmctf.shtml an dort ist das ganze nur halt noch mit CTF Zeugs

Cya

--

zum Seitenanfang zum Seitenende Profil || Suche
024
24.06.2000, 20:36
Mike



HI,

wenn ihr menus sehn wollt wie ihn TFC 1.5 zieht euch die Seals-Alpha 2 von www.navysealsmod.com. Die haben welche !

Mike

--

zum Seitenanfang zum Seitenende Profil || Suche