In diesem Tutorial werde ich euch zeigen wir ihr selbst herausfindet wie man einen Rcon Befehl erstellt und diesem eine Aufgabe zuordnet.
Ich werde dieses Tuturial nach dem Prinzip Learning by Doing aufziehen und euch erst eine Aufgabe stellen,dann die Haupthilfen ohne Bsp geben
und dann einmal mit. Am Ende werde ich noch einmal einen neuen Befehl hinzufügen welcher auf das Tutorial "Erste Schritte" beruht und Aip genannt wird.
Bei Fragen zu C++ Kenntnissen schaut euch hier durch (sehr gutes nachschlagewerk highscore.de/cpp/einfuehrung/index.html
Aufgabe:
Versucht einen Rcon Befehl zu erstellen,diesem eine Aufgabe zu überteilen wo man schneller schießt (sogenanntes Aip).
Wenn ihr nun nicht weiterkommt hier eine allgemeine Erklärung was ihr zuerst tun solltet um das Wissen zu erlangen einen Befehl zu erstellen
Hilfe Nr.1
Spoiler anzeigen
Wenn ihr weitere Hilfe braucht kommt hier eine Erklärung was ein Rcon Befehl macht(wie er aufgebaut ist):
Hilfe Nr.2
Spoiler anzeigen
Lösung + Kommentare/Erklärungen der Aip Befehl(schneller schießen)
Spoiler anzeigen
Am Anfang solltet ihr den Befehl erstellen dies macht ihr in gamecontext.cpp
Ihr ergänzt einfach ein Console()->Register(command,Datentyp int,serverlastig,späterer Funktionsname,this, "Was der Befehl macht")
[cpp]void CGameContext::OnConsoleInit() //Hier erzeugt ihr eine neue Console()->Register Zeile
Console()->Register("force_vote", "ss?r", CFGFLAG_SERVER, ConForceVote, this, "Force a voting option");
Console()->Register("clear_votes", "", CFGFLAG_SERVER, ConClearVotes, this, "Clears the voting options");
Console()->Register("vote", "r", CFGFLAG_SERVER, ConVote, this, "Force a vote to yes/no");
Console()->Register("aip", "i", CFGFLAG_SERVER, Conaip, this, "Activate fast shoots"); // Hier wird der Rcon Befehl angelegt
// command,Datentyp int,serverlastig,Conaip ist die Funktion welche der int wert übermittelt wird(gut so Botox?)
[/cpp]
Nun als nächstes erstellen wir die die Funktion Conaip in gamecontext.cpp und gamecontext.h
gamcontext.h L.62:
Eine Zeile ergänzen mit dem Funktionsnamen (Conaip)
[cpp]static void ConRemoveVote(IConsole::IResult *pResult, void *pUserData);
static void ConForceVote(IConsole::IResult *pResult, void *pUserData);
static void ConClearVotes(IConsole::IResult *pResult, void *pUserData);
static void ConVote(IConsole::IResult *pResult, void *pUserData);
static void Conaip(IConsole::IResult *pResult, void *pUserData); //Hier werden die Variablen angelegt[/cpp]
Nun für den weiteren Verlauf des Tutorial müssen wir eine Variable erstellen die einen wahrheitswert wieder gibts. Dies machen wir mit bool.
Diesen bool fügen wir in player.h ein im public: bereicht (z.b irgwo zwischen 15 und 70)
[cpp]
bool m_aip; //bool gibt Wahrheitswert wieder d.h m_aip kann true or false sein.
// wenn man m_aip nun woanders benutzen möchte muss man m_pPlayer->m_aip (bei character.cpp) benutzen bzw
//m_apPlayers[ClientID] (bei gamecotext.cpp) wenn man etwas mit der ClientID der Players machen will.
[/cpp]
gamecontext.cpp
Die Funktion selbst wird nun erstellt:
[cpp]void CGameContext::Conaip(IConsole::IResult *pResult, void *pUserData)//Funktionsname: Conaip | *pResult: int Wert |
//void *pUserData: übergibt Datentypen als Parameter
{
CGameContext *pSelf = (CGameContext *)pUserData; //gibt void *pUserData die Datentypen
int ClientID = clamp(pResult->GetInteger(0), 0, (int)MAX_CLIENTS-1); //Client id wird der int Wert/wem wir aip geben
if(!pSelf->m_apPlayers[ClientID]) // wenn es die ClientID nicht gibt
return; //passiert nichts (Funktion wird ohne etwas gemacht zu haben beendet.
char aBuf[128];//man kan 128 Zeichen lang schreiben
if(!pSelf->m_apPlayers[ClientID]->m_aip) //wenn m_aip nicht aktiv ist des Clienten mit der ID
{
pSelf->m_apPlayers[ClientID]->m_aip = true; //dann wird aip angemacht bei dem CLienten mit der ID
str_format(aBuf, sizeof(aBuf), "Activated aip", pSelf->Server()->ClientName(ClientID)); //Text/Ziel wird dem vorbereitet
pSelf->SendChatTarget(ClientID, aBuf); // Text wird zum Ziel geschickt
}
else
{
pSelf->m_apPlayers[ClientID]->m_aip = false; //das Gegenteil wie oben
str_format(aBuf, sizeof(aBuf), "Deactivated aip", pSelf->Server()->ClientName(ClientID)); //Gleiche nur anderer Text
pSelf->SendChatTarget(ClientID, aBuf); // Text wird zum Ziel geschickt
}
}[/cpp]
Nun haben wir die Funktion m_aip einen wahrheitswert gegeben. Wenn aip an ist ist m_aip = true wenn nicht m_aip = false
Dies wird nun in character.cpp -> Funktion void CCharacter::FireWeapon() eingebaut
[cpp]bool FullAuto = false;
if(m_pPlayer->m_aip || m_ActiveWeapon == WEAPON_GRENADE || m_ActiveWeapon == WEAPON_SHOTGUN || m_ActiveWeapon == WEAPON_RIFLE) //wenn m_aip an ist
FullAuto = true; //wird autofire aktiviert
[/cpp]
In Zeile 2 wurde if(m_pPlayer->m_aip || hinzugefügt
Nun werden wir Anderungen an den Letzen Zeilen der Funktion betätigen, wo wir Munition und Fastreload einstellen werden,
[cpp]// Hier wird unendlich Ammo und schnelleres Schei0en geregelt
if(!m_pPlayer->m_aip) //wenn m_aip == false
{
if(m_aWeapons[m_ActiveWeapon].m_Ammo > 0) // wenn die aktive Waffe mehr Munition als 0 hat
m_aWeapons[m_ActiveWeapon].m_Ammo--; // dann wird eine Munition abgezogen
if(!m_ReloadTimer)//? wenn nachgeladen wird
m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 1000; //muss " Aktivewaffeschussverzögerung
//*Server()->TickSpeed() /1000 (normal)
//gewartet werden bis man wieder schießen kann
}
else if(m_pPlayer->m_aip) //wenn m_aip == true
{
if(m_aWeapons[m_ActiveWeapon].m_Ammo > 0) // wenn die aktive Waffe mehr Munition als 0 hat
m_aWeapons[m_ActiveWeapon].m_Ammo++; // dann wird eine Munition hinzugefügt(immer volle Munition)
if(!m_ReloadTimer) ////? wenn nachgeladen wird
m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 5000; //muss " Aktivewaffeschussverzögerung
//*Server()->TickSpeed() /5000 (fastreload)
//gewartet werden bis man wieder schießen kann
}[/cpp]
Nun alle Dateien abspeichern und kompilelieren und siehe da, wie haben einen funktionierenden aip Befehl eingebaut
So das wars erstmal mit dem Tutorial ich hoffe es wird euch weiter helfen
Bei gefundenden Fehlern bitte mitteilen damit ich diese verbessern kann.
Greetz warkid
Ich werde dieses Tuturial nach dem Prinzip Learning by Doing aufziehen und euch erst eine Aufgabe stellen,dann die Haupthilfen ohne Bsp geben
und dann einmal mit. Am Ende werde ich noch einmal einen neuen Befehl hinzufügen welcher auf das Tutorial "Erste Schritte" beruht und Aip genannt wird.
Bei Fragen zu C++ Kenntnissen schaut euch hier durch (sehr gutes nachschlagewerk highscore.de/cpp/einfuehrung/index.html
Aufgabe:
Versucht einen Rcon Befehl zu erstellen,diesem eine Aufgabe zu überteilen wo man schneller schießt (sogenanntes Aip).
Wenn ihr nun nicht weiterkommt hier eine allgemeine Erklärung was ihr zuerst tun solltet um das Wissen zu erlangen einen Befehl zu erstellen
Hilfe Nr.1
Ein Rconbefehl ist eine Variable der einen Wert zugeteilt wird (bsp: sv_tournament_mode 1= an 0= aus)
Ihr schaut euch zuerst einen rcon Befehl an den ihr schon kennt und wo ihr wisst wie er funktioniert. (Am besten einen einfachen)
Nun schaut ihr euch zuerst dass an wo der Befehl erstellt wird und erst danach wie dem Befehl/Variable eine Aufgabe zugeteilt wird.
Dateien die ihr nachschauen solltet sind: Gamecontext.cpp & config_variables.h
Versucht euch zu überlegen welcher rcon befehl recht einfach aufgebaut ist und sucht dann nach diesem.
Ihr schaut euch zuerst einen rcon Befehl an den ihr schon kennt und wo ihr wisst wie er funktioniert. (Am besten einen einfachen)
Nun schaut ihr euch zuerst dass an wo der Befehl erstellt wird und erst danach wie dem Befehl/Variable eine Aufgabe zugeteilt wird.
Dateien die ihr nachschauen solltet sind: Gamecontext.cpp & config_variables.h
Versucht euch zu überlegen welcher rcon befehl recht einfach aufgebaut ist und sucht dann nach diesem.
Wenn ihr weitere Hilfe braucht kommt hier eine Erklärung was ein Rcon Befehl macht(wie er aufgebaut ist):
Hilfe Nr.2
Nun schaut ihr euch Gamecontext.cpp und Gamecontext.h an
und sucht nun den Befehl say und versucht herauszufinden wie dieser funktioniert nach Hilfe Nr.1
Erklärung:
Spoiler anzeigen
Gamecontext.h Zeile 54
[cpp]static void ConSay(IConsole::IResult *pResult, void *pUserData); // Hier werden die Variablen angelegt
[/cpp]
Gamecontext.cpp Zeile 1327
[cpp]Console()->Register("say", "r", CFGFLAG_SERVER, ConSay, this, "Say in chat"); //RconBefehl wird erstellt. Say ist der Befehl,mit dem die Variable aufgerufen wird und r ist der Parameter Typ(rest vom string)
// Bekommt sie einen Wert greift sie auf ConSay zu(Es ist eine Funktion)[/cpp]
Gamecontext.cpp Zeile 1028 - 1033
[cpp]void CGameContext::ConSay(IConsole::IResult *pResult, void *pUserData) //Funktions wird gestartet | (Hier werden die Parameter angegeben)
{
CGameContext *pSelf = (CGameContext *)pUserData; //Ein neuer player wird erstellt, der die daten von pUserData übernimmt.
pSelf->SendChat(-1, CGameContext::CHAT_ALL, pResult->GetString(0)); //Eingegeben Text wird gesendet via Funktion SendChat()
}
[/cpp]
und sucht nun den Befehl say und versucht herauszufinden wie dieser funktioniert nach Hilfe Nr.1
Erklärung:
Gamecontext.h Zeile 54
[cpp]static void ConSay(IConsole::IResult *pResult, void *pUserData); // Hier werden die Variablen angelegt
[/cpp]
Gamecontext.cpp Zeile 1327
[cpp]Console()->Register("say", "r", CFGFLAG_SERVER, ConSay, this, "Say in chat"); //RconBefehl wird erstellt. Say ist der Befehl,mit dem die Variable aufgerufen wird und r ist der Parameter Typ(rest vom string)
// Bekommt sie einen Wert greift sie auf ConSay zu(Es ist eine Funktion)[/cpp]
Gamecontext.cpp Zeile 1028 - 1033
[cpp]void CGameContext::ConSay(IConsole::IResult *pResult, void *pUserData) //Funktions wird gestartet | (Hier werden die Parameter angegeben)
{
CGameContext *pSelf = (CGameContext *)pUserData; //Ein neuer player wird erstellt, der die daten von pUserData übernimmt.
pSelf->SendChat(-1, CGameContext::CHAT_ALL, pResult->GetString(0)); //Eingegeben Text wird gesendet via Funktion SendChat()
}
[/cpp]
Lösung + Kommentare/Erklärungen der Aip Befehl(schneller schießen)
Am Anfang solltet ihr den Befehl erstellen dies macht ihr in gamecontext.cpp
Ihr ergänzt einfach ein Console()->Register(command,Datentyp int,serverlastig,späterer Funktionsname,this, "Was der Befehl macht")
[cpp]void CGameContext::OnConsoleInit() //Hier erzeugt ihr eine neue Console()->Register Zeile
Console()->Register("force_vote", "ss?r", CFGFLAG_SERVER, ConForceVote, this, "Force a voting option");
Console()->Register("clear_votes", "", CFGFLAG_SERVER, ConClearVotes, this, "Clears the voting options");
Console()->Register("vote", "r", CFGFLAG_SERVER, ConVote, this, "Force a vote to yes/no");
Console()->Register("aip", "i", CFGFLAG_SERVER, Conaip, this, "Activate fast shoots"); // Hier wird der Rcon Befehl angelegt
// command,Datentyp int,serverlastig,Conaip ist die Funktion welche der int wert übermittelt wird(gut so Botox?)
[/cpp]
Nun als nächstes erstellen wir die die Funktion Conaip in gamecontext.cpp und gamecontext.h
gamcontext.h L.62:
Eine Zeile ergänzen mit dem Funktionsnamen (Conaip)
[cpp]static void ConRemoveVote(IConsole::IResult *pResult, void *pUserData);
static void ConForceVote(IConsole::IResult *pResult, void *pUserData);
static void ConClearVotes(IConsole::IResult *pResult, void *pUserData);
static void ConVote(IConsole::IResult *pResult, void *pUserData);
static void Conaip(IConsole::IResult *pResult, void *pUserData); //Hier werden die Variablen angelegt[/cpp]
Nun für den weiteren Verlauf des Tutorial müssen wir eine Variable erstellen die einen wahrheitswert wieder gibts. Dies machen wir mit bool.
Diesen bool fügen wir in player.h ein im public: bereicht (z.b irgwo zwischen 15 und 70)
[cpp]
bool m_aip; //bool gibt Wahrheitswert wieder d.h m_aip kann true or false sein.
// wenn man m_aip nun woanders benutzen möchte muss man m_pPlayer->m_aip (bei character.cpp) benutzen bzw
//m_apPlayers[ClientID] (bei gamecotext.cpp) wenn man etwas mit der ClientID der Players machen will.
[/cpp]
gamecontext.cpp
Die Funktion selbst wird nun erstellt:
[cpp]void CGameContext::Conaip(IConsole::IResult *pResult, void *pUserData)//Funktionsname: Conaip | *pResult: int Wert |
//void *pUserData: übergibt Datentypen als Parameter
{
CGameContext *pSelf = (CGameContext *)pUserData; //gibt void *pUserData die Datentypen
int ClientID = clamp(pResult->GetInteger(0), 0, (int)MAX_CLIENTS-1); //Client id wird der int Wert/wem wir aip geben
if(!pSelf->m_apPlayers[ClientID]) // wenn es die ClientID nicht gibt
return; //passiert nichts (Funktion wird ohne etwas gemacht zu haben beendet.
char aBuf[128];//man kan 128 Zeichen lang schreiben
if(!pSelf->m_apPlayers[ClientID]->m_aip) //wenn m_aip nicht aktiv ist des Clienten mit der ID
{
pSelf->m_apPlayers[ClientID]->m_aip = true; //dann wird aip angemacht bei dem CLienten mit der ID
str_format(aBuf, sizeof(aBuf), "Activated aip", pSelf->Server()->ClientName(ClientID)); //Text/Ziel wird dem vorbereitet
pSelf->SendChatTarget(ClientID, aBuf); // Text wird zum Ziel geschickt
}
else
{
pSelf->m_apPlayers[ClientID]->m_aip = false; //das Gegenteil wie oben
str_format(aBuf, sizeof(aBuf), "Deactivated aip", pSelf->Server()->ClientName(ClientID)); //Gleiche nur anderer Text
pSelf->SendChatTarget(ClientID, aBuf); // Text wird zum Ziel geschickt
}
}[/cpp]
Nun haben wir die Funktion m_aip einen wahrheitswert gegeben. Wenn aip an ist ist m_aip = true wenn nicht m_aip = false
Dies wird nun in character.cpp -> Funktion void CCharacter::FireWeapon() eingebaut
[cpp]bool FullAuto = false;
if(m_pPlayer->m_aip || m_ActiveWeapon == WEAPON_GRENADE || m_ActiveWeapon == WEAPON_SHOTGUN || m_ActiveWeapon == WEAPON_RIFLE) //wenn m_aip an ist
FullAuto = true; //wird autofire aktiviert
[/cpp]
In Zeile 2 wurde if(m_pPlayer->m_aip || hinzugefügt
Nun werden wir Anderungen an den Letzen Zeilen der Funktion betätigen, wo wir Munition und Fastreload einstellen werden,
[cpp]// Hier wird unendlich Ammo und schnelleres Schei0en geregelt
if(!m_pPlayer->m_aip) //wenn m_aip == false
{
if(m_aWeapons[m_ActiveWeapon].m_Ammo > 0) // wenn die aktive Waffe mehr Munition als 0 hat
m_aWeapons[m_ActiveWeapon].m_Ammo--; // dann wird eine Munition abgezogen
if(!m_ReloadTimer)//? wenn nachgeladen wird
m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 1000; //muss " Aktivewaffeschussverzögerung
//*Server()->TickSpeed() /1000 (normal)
//gewartet werden bis man wieder schießen kann
}
else if(m_pPlayer->m_aip) //wenn m_aip == true
{
if(m_aWeapons[m_ActiveWeapon].m_Ammo > 0) // wenn die aktive Waffe mehr Munition als 0 hat
m_aWeapons[m_ActiveWeapon].m_Ammo++; // dann wird eine Munition hinzugefügt(immer volle Munition)
if(!m_ReloadTimer) ////? wenn nachgeladen wird
m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 5000; //muss " Aktivewaffeschussverzögerung
//*Server()->TickSpeed() /5000 (fastreload)
//gewartet werden bis man wieder schießen kann
}[/cpp]
Nun alle Dateien abspeichern und kompilelieren und siehe da, wie haben einen funktionierenden aip Befehl eingebaut
So das wars erstmal mit dem Tutorial ich hoffe es wird euch weiter helfen
Bei gefundenden Fehlern bitte mitteilen damit ich diese verbessern kann.
Greetz warkid
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von warkid ()