De/Creating A Class System: Difference between revisions

From Valve Developer Community
< De
Jump to navigation Jump to search
No edit summary
No edit summary
Line 246: Line 246:


==Die Implementation==
==Die Implementation==
//@WIP
 
Da wir nun alles haben was wir brauchen müssen wir nur alles einbauen!
 
Hier der Code mit erklärung:
 
//Added im Konstruktor:
  //Erster Spawn?
  m_bFirstSpawn=true;
  //Startklasse festlegen:
  m_iClass=Default_Class.GetInt();
 
  m_iCurrentClass=m_iClass;
  //Die standart Klasse setzen!
  m_iDefaultClass=Default_Class.GetInt();
  //Standartwerte 100 für leben/armor:
  m_iHealth=100;
  m_iArmor=100;
  //Maximal Leben/Armor für Jede Klasse:
  m_iMaxHealth=100;
  m_iMaxArmor=100;
 
void CBasePlayer::InitClassSystem()
{
    DevMsg("Klassensystem wird initalisiert!\n");
    CheckAllClassConVars();
    SetPlayerClass();
    SetClassStuff();
}
 
 
 
int CBasePlayer::GetClassValue()const
{
  return m_iClass;
}
 
 
int CBasePlayer::GetDefaultClassValue()const
{
  return m_iDefaultClass;
}
 
 
bool CBasePlayer::IsFirstSpawn()
{
  return m_bFirstSpawn;
}
 
 
//Soll die Waffen verteilen:
//Hier ist irgend wo ein Bug!
void CBasePlayer::SetPlayerClass()
{
if(IsFirstSpawn()==true)
{
          m_iClass=m_iDefaultClass;
}
 
      switch(m_iClass)
      {
      case Invalid:
            //Muss noch eingebaut werden!
            //Hier bekommt man nur die standart Waffen!
            SetClassDefault();
      break;
      case Unassigned:
            //Hier setzen wir die Standart-Klasse!
            SetClassDefault();
      break;
      case Assaulter:
            SetClassGroundUnit();
      break;
      case Supporter:
            SetClassSupportUnit();
      break;
      case Medic:
            SetClassMedic();
      break;   
      default:
            SetClassDefault();
      break;
      }
}
 
void CBasePlayer::OnClassChange()
{
  if(m_iClass!=m_iCurrentClass)
  {   
  //Spieler killen und punkte um 1 erhöhen(wegen Selbstmord)!
  CommitSuicide();
  IncrementFragCount(1);
 
  //Setzen damit wir nicht die Selbe Klassen haben!
  m_iCurrentClass=m_iClass;
  }
}
 
 
void CBasePlayer::CheckAllClassConVars()
{
  //Haben wir eine Klasse die zwischen Spec-Ops und der letzen Klasse liegt?
  if(m_iClass<Assaulter||m_iClass>Medic)
  {
  m_iClass=Assaulter;
  }
 
  if(m_iDefaultClass<Assaulter||m_iDefaultClass>Medic)
  {
  m_iDefaultClass=Assaulter;
  }
}
 
void CBasePlayer::SetClassDefault()
{
  Msg("Du hast die Klasse Default!\n");
  CheckAllClassConVars();
  SetPlayerClass();
}
 
 
//Assault:
void CBasePlayer::SetClassGroundUnit()
{
  //Standartwerte für leben/armor:
  m_iHealth=125;
  m_iArmor=125;
  //Maximal Leben/Armor für Jede Klasse:
  m_iMaxHealth=125;
  m_iMaxArmor=125;
    //Waffen verteilen:
    Msg("Du bist jetzt eine Ground Unit!\n");
   
CBasePlayer::GiveNamedItem( "weapon_357" );
CBasePlayer::GiveNamedItem( "weapon_smg1" );
CBasePlayer::GiveNamedItem( "weapon_frag" );
CBasePlayer::GiveAmmo( Magazin_357*3 , "357" );
CBasePlayer::GiveAmmo( Magazin_SMG1*3        , "SMG1");
CBasePlayer::GiveAmmo( Magazin_SMG1_Granates*1, "smg1_grenade");
CBasePlayer::GiveAmmo( Magazin_Frag*5        , "grenade" );
}
 
 
//Supporter
void CBasePlayer::SetClassSupportUnit()
{
  //Standartwerte für leben/armor:
  m_iHealth=100;
  m_iArmor=300;
  //Maximal Leben/Armor für Klasse:
  m_iMaxHealth=100;
  m_iMaxArmor=300;
 
    //Waffen verteilen:
    Msg("Du bist jetzt eine Support Unit!\n");
   
CBasePlayer::GiveNamedItem( "weapon_ar2" );
CBasePlayer::GiveNamedItem( "weapon_frag" );
CBasePlayer::GiveNamedItem( "weapon_357" );
CBasePlayer::GiveAmmo( Magazin_AR2*3, "AR2" );
CBasePlayer::GiveAmmo( Magazin_AR2AltFire*2, "AR2AltFire" );
CBasePlayer::GiveAmmo( Magazin_Frag*3, "grenade" );
CBasePlayer::GiveAmmo( Magazin_357*3 , "357" );
//Eigenschaft des Supporter's aufrufen:
//GetAmmo();
}
 
 
//Medic:
void CBasePlayer::SetClassMedic()
{
  //Standartwerte für leben/armor:
  m_iHealth=100;
  m_iArmor=75;
  //Maximal Leben/Armor für Klasse:
  m_iMaxHealth=100;
  m_iMaxArmor=75;
 
    //Waffen verteilen:
    Msg("Du bist jetzt ein Medic!\n");
   
CBasePlayer::GiveNamedItem( "weapon_357" );
CBasePlayer::GiveNamedItem( "weapon_smg1" );
CBasePlayer::GiveAmmo( Magazin_357*2, "357" );
CBasePlayer::GiveAmmo( Magazin_SMG1*2 , "SMG1");
CBasePlayer::GiveAmmo( Magazin_SMG1_Granates*3, "smg1_grenade");
}
 
//Legt das Leben für unsere klasse fest:
int  CBasePlayer::GetClassHealth()const
{
  return m_iHealth;
}
 
//Legt die Armor für die Klasse Fest:
int  CBasePlayer::GetClassArmor()const
{
  return m_iArmor;
}
 
//Diese Methoden setzen für jede Klasse das Leben und die Armor
int CBasePlayer::GetClassMaxHealth()const
{
  return m_iMaxHealth;
}
 
//Diese Methoden holen für jede Klasse das Leben und die Armor
int CBasePlayer::GetClassMaxArmor()const
{
  return m_iMaxArmor;
}
 
 
 
//Setzt Leben und Armor für den Spieler!
void CBasePlayer::SetClassStuff()
{
  //Hier Leben setzen:   
  CBasePlayer::SetHealthValue(GetClassHealth());
  CBasePlayer::SetMaxHealthValue(GetClassMaxHealth());
  //Variable gehört nicht zu CBasePlayer!!!
  //TODO: Das ist eine Private Variable die ich ändern muss!
  CBasePlayer::SetArmorValue(GetClassArmor());
  //CBasePlayer::SetMaxArmorValue(GetClassMaxArmor());
}
 
//Klasse per ConVar wechsel für Client:
void CBasePlayer::ChangeClass(int NewClass)
{
  m_iClass=NewClass;
}
 
 
Da ihr ja schon wisst wofür die ganzen Methoden sind müsst ihr nur noch gucken wie alles läuft :)
 
Aber nun mal zum einbauen der ConVars die man braucht:
 
//Der Server hat für alle die selbe Standartklasse!
//Der Admin kann die Standartklasse ändern!
ConVar Default_Class("Default_Class", "3", FCVAR_ARCHIVE, "Variable für Standartklasse!");
 
Nun hat der Server seine Default Klasse die jeder Spieler beim spawnen bekommt.
Diese könnt ihr dann über die Konsole ändern :)
 
Ihr könnt auch noch mehr Settings für den Admin zur verfügung stellen:
 
//Maximale Klassen erlauben(Admins!)
//TODO:Muss noch aktiviert werden im Code!
ConVar Max_Assaulter("Max_Assaulter", "3", FCVAR_ARCHIVE, "Variable für Maximale Assaulter!");
ConVar Max_Supporter("Max_Supporter", "3", FCVAR_ARCHIVE, "Variable für Maximale Supporter!");
ConVar Max_Medic("Max_Medic", "3", FCVAR_ARCHIVE, "Variable für Maximale Medics!");
 
//Klassen erlauben(Admins):
//TODO:Muss noch aktiviert werden im Code!
ConVar Allow_Assaulter("Allow_Assaulter", "1", FCVAR_ARCHIVE, "Erlaubt Klasse Ground Unit!");
ConVar Allow_Supporter("Allow_Supporter", "1", FCVAR_ARCHIVE, "Erlaubt Klasse Support Unit!");
ConVar Allow_Medic("Allow_Medic", "1", FCVAR_ARCHIVE, "Erlaubt Klasse Medic!");
 
Diese müsst ihr aber selbst implementieren!
 
Nun müssen wir nur noch dem Spieler die möglichkeit zum ändern der Klasse geben!
Und dann muss man noch die Prüfungen der Klassen einbauen!
 
Dazu müssen wir einfach in der Methode OnClientCommand folgendes einbauen am ende:
 
    else if ( stricmp( cmd, "Class" ) ==0)
    {
    //int iClass=CBasePlayer::GetClass();
    if (engine->Cmd_Argc() < 2)
    return true;
 
    int iClass = atoi( engine->Cmd_Argv(1));
    ChangeClass(iClass);
   
    return true;
    }
 
Hier mit wird eine ConVar Simuliert.
Aber man kann durch Class und dann die Klassennummer also Class 1 die Klasse ändern!
Nun müssen wir aber die Prüfungsmethode aufrufen und dann haben wirs schon!
 
Das machen wir in der Methode PostThink();
 
Dort setzen wir am ende einfach folgendes ein:
 
OnClassChange();
 
Das wars :) wenn alles stimmt dann dürfte euer Klassensystem Funktionieren ;)
 
Also viel Spaß und schreibt mir falls es Probleme oder Kritik gibt ;)

Revision as of 04:13, 25 June 2006

Einleitung

Hi und willkommen zum Coding Tutorial um ein Klassensystem zuerstellen. Das Klassensystem ist aus meiner [url=http://moonlight-interactive.sponsored.by.clanserver4u.de/armymod/ Army Mod]. Dass ist eine abgeschwächte Version mit nur 3 Klassen aber am ende könnt ihr das erweitern! Damit es nicht alzu schwer wird werden wir nur 3 Klassen erstellen. Sollten wir aber eine Klasse wechseln dann werden wir getötet und bekommen beim Spawn unsere Klasse. Aber der Server bekommt eine Standartklasse die jeder beim ersten Spawnen bekommt :)

Wir nehmen die Klassen Supporter, Medic und Assaulter


Daten die gebraucht werden

Als erstes eine Auflistung was wir brauchen an Codedateien.

Header:

dlls/player.h

Quellcodedateien

dlls/player.cpp


Das Klassensystem wird zu 100% Serverseitig sein aber der Client kann die Klassenwechseln ;)

Das wars auch schon :)

Die Deklarationen

Als erstes müssen wir uns an die Deklarationen machen. Was wir brauchen sind einige Variablen und einige Funktionen. Aber als erstes werden wir ein Enum erstellen das die Werte unserer Klassen enthält!

Das Enum machen wir erstmal so:

enum
{
 Unassigned=0,
 Assaulter,
 Supporter,
 Medic
}

Später brauchen wir das für die Vergleiche!

Jetzt werden wir uns der Klasse CBasePlayer wiedmen.

Zum beginn werden wir einen neuen public und einen neuen Private bereich am ende von CBasePlayer adden. Dort schreiben wir den gesamten Code für das Klassensystem rein!

//Die neuen Bereiche für das Klassensystem!
public:
private:


Hier nun alles was wir an Methoden deklarieren müssen und natürlich auch die Variablen:

/*
********************************************
**Klassensystem:
**Hier werden die Klassen verteilt!
**Es wird auch auf die richtigen Klassen geprüft!
********************************************
*/
public:
//Methode zum Klassenwechseln
virtual void ChangeClass(int NewClass); 
virtual int GetClass();
//Initalisierung des Klassensystems!
void InitClassSystem();
//Überprüft ob wir keinen ungültigen wert setzen für die Klassenvariablen:
void CheckAllClassConVars();
//Hier wird geprüft ob wir die Klasse gewechselt haben:
void OnClassChange();
//Setzt Leben und Armor für den Spieler!
void SetClassStuff();
//Setzt den neuen wert für die Check Variable:
void SetCurrentClassValue();
//Die Klasse holen:
int GetClassValue()const;
//Die Standartklasse holen:
int GetDefaultClassValue()const;
//Schaltmethode die Klassen verteilt:
void SetPlayerClass();
//Legt das Leben für unsere klasse fest:
int  GetClassHealth()const;
//Diese Methoden setzen für jede Klasse das Leben und die Armor
int GetClassMaxHealth()const;
//Legt die Armor für die Klasse Fest:
int  GetClassArmor()const;
//Diese Methoden holen für jede Klasse das Leben und die Armor
int GetClassMaxArmor()const;
private:  
//Wichtige Prüfung auf ersten Spawn:
bool m_bFirstSpawn;
bool IsFirstSpawn();
//Welche Klasse haben wir(enum):
int m_iClass;
//Prüft ob wir die Klasse gewechselt haben:
int m_iCurrentClass;
//Hier setzen wir die Standartklasse!
int m_iDefaultClass;
//Waffen, Leben und Armor der Klassen verteilen:
void SetClassDefault();
void SetClassGroundUnit();
void SetClassSupportUnit();
void SetClassMedic();
/*
********************************************
**Spielereigenschaften:
**Hier werden Eigenschaften wie Speed, Condition
**und maximale Klassen festgelegt!
********************************************
*/
//Integer für Rüstung:
int m_iArmor;
int m_iMaxArmor;


Nun kommen wir zur Erklärung wofür wir das alles brauchen. Wir fangen oben an und arbeiten uns runter.

public

//Methode zum Klassenwechseln
virtual void ChangeClass(int NewClass); 

Diese Methode brauchen wir damit der Client(Spieler) per Menu/Konsole seine Klasse wechselt.

virtual int GetClass();

Brauchen wir wenn wir noch sachen wie Ammo, Leben und Rüstungsincrementierung für den Supporter/Medic einbauen wollen.

//Initalisierung des Klassensystems!
void InitClassSystem();

Diese Methode soll das Klassensystem aus der Spawn Methode von CBasePlayer starten. Damir werden die Methoden für die Klassenverteilung usw aufgerufen. Bei der Implementierung seit ihr dann schlauer.

//Überprüft ob wir keinen ungültigen wert setzen für die Klassenvariablen:
void CheckAllClassConVars();

Diese Methode prüft ob wir einen gültigen Wert eingegeben haben! Falls wir das nicht Prüfen würden dann würde eure Mod crashen. Falls der Wert nicht stim dann müsst ihr einen Wert für die Klasse setzen!

//Hier wird geprüft ob wir die Klasse gewechselt haben:
void OnClassChange();

Diese Methode wird in der Thinkmethode gebraucht. Falls ihr die Klasse wechselt werdet ihr gekillt und einen Punkt sonst würdet ihr Punktabzug bekommen.

//Setzt Leben und Armor für den Spieler!
void SetClassStuff();

Diese Methode setzt für jede Klasse den Wert für das Leben, Maximal Leben und Rüstung. Leider wird die Rüstung über den Code der Recharger festgelegt den müsst ihr ändern.

//Setzt den neuen wert für die Check Variable:
void SetCurrentClassValue();

Diese Methode ändert den Wert der CheckVariable für die Klassen sonst würde man immer wieder sterben!

//Die Klasse holen:
int GetClassValue()const;

Diese Methode holt uns den Wert der Klasse die wir haben.

//Die Standartklasse holen:
int GetDefaultClassValue()const;

Diese Methode holt Vom Server die Standartklasse damit man im Falle einer ungültigen Klasse diese bekommt.

//Schaltmethode die Klassen verteilt:
void SetPlayerClass();

Diese Methode ist die Steuerzentrale unseres Klassensystems. Dort wird mit dem Wert der Klassenvariable alles gelenkt. Von der Waffen und Lebensverteilung bis zum setzen des Spielermodels(das müsst ihr leider noch machen!)


//Legt das Leben für unsere klasse fest:
int  GetClassHealth()const;

Diese Methode holt das Leben das ihr im Moment habt.

//Diese Methoden setzen für jede Klasse das Leben und die Armor
int GetClassMaxHealth()const;

Die Methode holt das Maximale Leben das eure Klasse haben kann.

//Legt die Armor für die Klasse Fest:
int  GetClassArmor()const;

Diese Methode holt euch die Rüstung die ihr im Momen habt.

//Diese Methoden holen für jede Klasse das Leben und die Armor
int GetClassMaxArmor()const;

Diese Methode holt die Maximale Rüstung eurer Klasse(Ist leider noch unbrauchbar wegen dem Recharger Code!)

private

//Wichtige Prüfung auf ersten Spawn:
bool m_bFirstSpawn;

Diese Variable ist für die Abfrag für den ersten Spawn nötig.

bool IsFirstSpawn();

Diese Methode gibt uns auskunft ob wir das erstemal gespawnt sind.

//Welche Klasse haben wir(enum):
int m_iClass;

Diese Variable speichert den Wert unserer Klasse:

//Prüft ob wir die Klasse gewechselt haben:
int m_iCurrentClass;

Das ist die Prüfungsvariable die den Wert unserer Momentanen Klasse enthält. Der Wert wird dann geändert wqenn wie die Klasse wechseln.

//Hier setzen wir die Standartklasse!
int m_iDefaultClass;

Diese Variable holt die Klasse des Servers und ist gleichzeitig die erste Klasse die man beim ersten spawn bekommt

//Waffen, Leben und Armor der Klassen verteilen:
void SetClassDefault();
void SetClassGroundUnit();
void SetClassSupportUnit();
void SetClassMedic();

Das sind unsere Methoden zum verteilen alle wichtigen Sachen einer Klasse. Also Leben, Maximalleben, Rüstung, Maximalrüstung, Waffen usw.

//Integer für Rüstung:
int m_iArmor;
int m_iMaxArmor;

Das sind unsere Variablen für Rüstung und Maximalrüstung.

Jetzt wisst ihr was wir alles brauchen und wieso.

Nun kommen wir zum Teil in dem wir alles Einbauen.

Die Implementation

Da wir nun alles haben was wir brauchen müssen wir nur alles einbauen!

Hier der Code mit erklärung:

//Added im Konstruktor:
 //Erster Spawn?
 m_bFirstSpawn=true;

 //Startklasse festlegen:
 m_iClass=Default_Class.GetInt();
 
 m_iCurrentClass=m_iClass;
 //Die standart Klasse setzen!
 m_iDefaultClass=Default_Class.GetInt();

 //Standartwerte 100 für leben/armor:
 m_iHealth=100;
 m_iArmor=100;

 //Maximal Leben/Armor für Jede Klasse:
 m_iMaxHealth=100;
 m_iMaxArmor=100;
void CBasePlayer::InitClassSystem()
{
    DevMsg("Klassensystem wird initalisiert!\n");
    CheckAllClassConVars();
    SetPlayerClass();
    SetClassStuff();
}


int CBasePlayer::GetClassValue()const
{
 return m_iClass;
}


int CBasePlayer::GetDefaultClassValue()const
{
 return m_iDefaultClass;
}


bool CBasePlayer::IsFirstSpawn()
{
 return m_bFirstSpawn;
}


//Soll die Waffen verteilen:
//Hier ist irgend wo ein Bug!
void CBasePlayer::SetPlayerClass()
{
	 if(IsFirstSpawn()==true)
	 {
         m_iClass=m_iDefaultClass;

}

     switch(m_iClass)
     {
      case Invalid:
           //Muss noch eingebaut werden!
           //Hier bekommt man nur die standart Waffen!
           SetClassDefault();
      break;
      case Unassigned:
           //Hier setzen wir die Standart-Klasse!
           SetClassDefault();
      break;
      case Assaulter:
           SetClassGroundUnit();
      break;
      case Supporter:
           SetClassSupportUnit();
      break;
      case Medic:
           SetClassMedic();
      break;    
      default:
           SetClassDefault();
      break;
     }
}
void CBasePlayer::OnClassChange()
{
 if(m_iClass!=m_iCurrentClass)
 {    
  //Spieler killen und punkte um 1 erhöhen(wegen Selbstmord)!
  CommitSuicide();
  IncrementFragCount(1);
 
  //Setzen damit wir nicht die Selbe Klassen haben!
  m_iCurrentClass=m_iClass;
 }
}


void CBasePlayer::CheckAllClassConVars()
{
 //Haben wir eine Klasse die zwischen Spec-Ops und der letzen Klasse liegt?
 if(m_iClass<Assaulter||m_iClass>Medic)
 {
  m_iClass=Assaulter;
 }
  
 if(m_iDefaultClass<Assaulter||m_iDefaultClass>Medic)
 {
  m_iDefaultClass=Assaulter;
 }
}
void CBasePlayer::SetClassDefault()
{
 Msg("Du hast die Klasse Default!\n");

 CheckAllClassConVars();
 SetPlayerClass();
}


//Assault:
void CBasePlayer::SetClassGroundUnit()
{
 //Standartwerte für leben/armor:
 m_iHealth=125;
 m_iArmor=125;

 //Maximal Leben/Armor für Jede Klasse:
 m_iMaxHealth=125;
 m_iMaxArmor=125;

   //Waffen verteilen:
   Msg("Du bist jetzt eine Ground Unit!\n");
   
	CBasePlayer::GiveNamedItem( "weapon_357" );	
	CBasePlayer::GiveNamedItem( "weapon_smg1" );

CBasePlayer::GiveNamedItem( "weapon_frag" );

CBasePlayer::GiveAmmo( Magazin_357*3 , "357" ); CBasePlayer::GiveAmmo( Magazin_SMG1*3 , "SMG1"); CBasePlayer::GiveAmmo( Magazin_SMG1_Granates*1, "smg1_grenade"); CBasePlayer::GiveAmmo( Magazin_Frag*5 , "grenade" );

}


//Supporter
void CBasePlayer::SetClassSupportUnit()
{
 //Standartwerte für leben/armor:
 m_iHealth=100;
 m_iArmor=300;

 //Maximal Leben/Armor für Klasse:
 m_iMaxHealth=100;
 m_iMaxArmor=300;
   //Waffen verteilen:
   Msg("Du bist jetzt eine Support Unit!\n");
   
	CBasePlayer::GiveNamedItem( "weapon_ar2" );

CBasePlayer::GiveNamedItem( "weapon_frag" );

	CBasePlayer::GiveNamedItem( "weapon_357" );	

CBasePlayer::GiveAmmo( Magazin_AR2*3, "AR2" ); CBasePlayer::GiveAmmo( Magazin_AR2AltFire*2, "AR2AltFire" ); CBasePlayer::GiveAmmo( Magazin_Frag*3, "grenade" ); CBasePlayer::GiveAmmo( Magazin_357*3 , "357" );

//Eigenschaft des Supporter's aufrufen: //GetAmmo();

}


//Medic:
void CBasePlayer::SetClassMedic()
{
 //Standartwerte für leben/armor:
 m_iHealth=100;
 m_iArmor=75;

 //Maximal Leben/Armor für Klasse:
 m_iMaxHealth=100;
 m_iMaxArmor=75;
   //Waffen verteilen:
   Msg("Du bist jetzt ein Medic!\n");
   

CBasePlayer::GiveNamedItem( "weapon_357" ); CBasePlayer::GiveNamedItem( "weapon_smg1" );

CBasePlayer::GiveAmmo( Magazin_357*2, "357" ); CBasePlayer::GiveAmmo( Magazin_SMG1*2 , "SMG1"); CBasePlayer::GiveAmmo( Magazin_SMG1_Granates*3, "smg1_grenade");

}
//Legt das Leben für unsere klasse fest:
int  CBasePlayer::GetClassHealth()const
{
 return m_iHealth;
}
//Legt die Armor für die Klasse Fest:
int  CBasePlayer::GetClassArmor()const
{
 return m_iArmor;
}
//Diese Methoden setzen für jede Klasse das Leben und die Armor
int CBasePlayer::GetClassMaxHealth()const
{
 return m_iMaxHealth;
}
//Diese Methoden holen für jede Klasse das Leben und die Armor
int CBasePlayer::GetClassMaxArmor()const
{
 return m_iMaxArmor;
} 


//Setzt Leben und Armor für den Spieler!
void CBasePlayer::SetClassStuff()
{
 //Hier Leben setzen:    
 CBasePlayer::SetHealthValue(GetClassHealth());
 CBasePlayer::SetMaxHealthValue(GetClassMaxHealth());

 //Variable gehört nicht zu CBasePlayer!!!
 //TODO: Das ist eine Private Variable die ich ändern muss!
 CBasePlayer::SetArmorValue(GetClassArmor());
 //CBasePlayer::SetMaxArmorValue(GetClassMaxArmor());
}
//Klasse per ConVar wechsel für Client:
void CBasePlayer::ChangeClass(int NewClass)
{
 m_iClass=NewClass;
}


Da ihr ja schon wisst wofür die ganzen Methoden sind müsst ihr nur noch gucken wie alles läuft :)

Aber nun mal zum einbauen der ConVars die man braucht:

//Der Server hat für alle die selbe Standartklasse!
//Der Admin kann die Standartklasse ändern!
ConVar Default_Class("Default_Class", "3", FCVAR_ARCHIVE, "Variable für Standartklasse!");

Nun hat der Server seine Default Klasse die jeder Spieler beim spawnen bekommt. Diese könnt ihr dann über die Konsole ändern :)

Ihr könnt auch noch mehr Settings für den Admin zur verfügung stellen:

//Maximale Klassen erlauben(Admins!) //TODO:Muss noch aktiviert werden im Code! ConVar Max_Assaulter("Max_Assaulter", "3", FCVAR_ARCHIVE, "Variable für Maximale Assaulter!"); ConVar Max_Supporter("Max_Supporter", "3", FCVAR_ARCHIVE, "Variable für Maximale Supporter!"); ConVar Max_Medic("Max_Medic", "3", FCVAR_ARCHIVE, "Variable für Maximale Medics!");

//Klassen erlauben(Admins): //TODO:Muss noch aktiviert werden im Code! ConVar Allow_Assaulter("Allow_Assaulter", "1", FCVAR_ARCHIVE, "Erlaubt Klasse Ground Unit!"); ConVar Allow_Supporter("Allow_Supporter", "1", FCVAR_ARCHIVE, "Erlaubt Klasse Support Unit!"); ConVar Allow_Medic("Allow_Medic", "1", FCVAR_ARCHIVE, "Erlaubt Klasse Medic!");

Diese müsst ihr aber selbst implementieren!

Nun müssen wir nur noch dem Spieler die möglichkeit zum ändern der Klasse geben! Und dann muss man noch die Prüfungen der Klassen einbauen!

Dazu müssen wir einfach in der Methode OnClientCommand folgendes einbauen am ende:

   else if ( stricmp( cmd, "Class" ) ==0)
   { 
    //int iClass=CBasePlayer::GetClass();
    if (engine->Cmd_Argc() < 2)
    return true;
    int iClass = atoi( engine->Cmd_Argv(1));
    ChangeClass(iClass);
    
    return true;
   }

Hier mit wird eine ConVar Simuliert. Aber man kann durch Class und dann die Klassennummer also Class 1 die Klasse ändern! Nun müssen wir aber die Prüfungsmethode aufrufen und dann haben wirs schon!

Das machen wir in der Methode PostThink();

Dort setzen wir am ende einfach folgendes ein:

OnClassChange();

Das wars :) wenn alles stimmt dann dürfte euer Klassensystem Funktionieren ;)

Also viel Spaß und schreibt mir falls es Probleme oder Kritik gibt ;)