mirror of
https://github.com/celisej567/mcpe.git
synced 2026-09-17 20:10:23 +03:00
* Add command manager.
This commit is contained in:
@@ -24,7 +24,9 @@ ServerSideNetworkHandler::ServerSideNetworkHandler(Minecraft* minecraft, RakNetI
|
||||
m_pMinecraft = minecraft;
|
||||
m_pRakNetInstance = rakNetInstance;
|
||||
allowIncomingConnections(false);
|
||||
m_pRakNetPeer = m_pRakNetInstance->getPeer();
|
||||
m_pRakNetPeer = m_pRakNetInstance->getPeer();
|
||||
|
||||
setupCommands();
|
||||
}
|
||||
|
||||
ServerSideNetworkHandler::~ServerSideNetworkHandler()
|
||||
@@ -51,7 +53,8 @@ void ServerSideNetworkHandler::levelGenerated(Level* level)
|
||||
|
||||
allowIncomingConnections(m_pMinecraft->m_options.m_bServerVisibleDefault);
|
||||
|
||||
m_onlinePlayers.insert_or_assign(m_pMinecraft->m_pLocalPlayer->m_guid, new OnlinePlayer(m_pMinecraft->m_pLocalPlayer));
|
||||
m_onlinePlayers.insert_or_assign(m_pMinecraft->m_pLocalPlayer->m_guid,
|
||||
new OnlinePlayer(m_pMinecraft->m_pLocalPlayer, m_pMinecraft->m_pLocalPlayer->m_guid));
|
||||
}
|
||||
|
||||
void ServerSideNetworkHandler::onNewClient(const RakNet::RakNetGUID& guid)
|
||||
@@ -102,7 +105,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& guid, LoginPacke
|
||||
pPlayer->m_guid = guid;
|
||||
pPlayer->m_name = std::string(packet->m_str.C_String());
|
||||
|
||||
m_onlinePlayers.insert_or_assign(guid, new OnlinePlayer(pPlayer));
|
||||
m_onlinePlayers.insert_or_assign(guid, new OnlinePlayer(pPlayer, guid));
|
||||
|
||||
StartGamePacket sgp;
|
||||
sgp.field_4 = m_pLevel->getSeed();
|
||||
@@ -154,8 +157,29 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& guid, MessagePac
|
||||
if (msg[0] == '/')
|
||||
{
|
||||
printf("CMD: %s: %s\n", pOP->m_pPlayer->m_name.c_str(), msg.c_str());
|
||||
// TODO: Commands
|
||||
sendMessage(guid, "Commands haven't been implemented yet!");
|
||||
|
||||
std::stringstream ss(msg);
|
||||
ss.get(); // skip the /
|
||||
std::vector<std::string> parms;
|
||||
std::string currparm, cmdname;
|
||||
// get cmd name
|
||||
std::getline(ss, cmdname, ' ');
|
||||
// get cmd parms
|
||||
while (std::getline(ss, currparm, ' '))
|
||||
parms.push_back(currparm);
|
||||
|
||||
CommandFunction func;
|
||||
CommandMap::iterator iter = m_commands.find(cmdname);
|
||||
if (iter == m_commands.end())
|
||||
{
|
||||
sendMessage(pOP, "Unknown command. Type /? for a list of commands.");
|
||||
return;
|
||||
}
|
||||
|
||||
func = iter->second;
|
||||
|
||||
(this->*func)(pOP, parms);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -335,6 +359,11 @@ void ServerSideNetworkHandler::sendMessage(const RakNet::RakNetGUID& guid, const
|
||||
m_pRakNetInstance->send(guid, new MessagePacket(msg));
|
||||
}
|
||||
|
||||
void ServerSideNetworkHandler::sendMessage(OnlinePlayer* player, const std::string& msg)
|
||||
{
|
||||
sendMessage(player->m_guid, msg);
|
||||
}
|
||||
|
||||
void ServerSideNetworkHandler::redistributePacket(Packet* packet, const RakNet::RakNetGUID& source)
|
||||
{
|
||||
RakNet::BitStream bs;
|
||||
@@ -351,3 +380,48 @@ OnlinePlayer* ServerSideNetworkHandler::getPlayerByGUID(const RakNet::RakNetGUID
|
||||
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
///////////////// In-Game Commands /////////////////
|
||||
|
||||
void ServerSideNetworkHandler::setupCommands()
|
||||
{
|
||||
m_commands["?"] = &ServerSideNetworkHandler::commandHelp;
|
||||
m_commands["help"] = &ServerSideNetworkHandler::commandHelp;
|
||||
m_commands["stats"] = &ServerSideNetworkHandler::commandStats;
|
||||
m_commands["time"] = &ServerSideNetworkHandler::commandTime;
|
||||
}
|
||||
|
||||
void ServerSideNetworkHandler::commandHelp(OnlinePlayer* player, const std::vector<std::string>& parms)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << ">> Available commands:";
|
||||
|
||||
for (CommandMap::iterator it = m_commands.begin(); it != m_commands.end(); ++it)
|
||||
{
|
||||
ss << " /" << it->first;
|
||||
}
|
||||
|
||||
sendMessage(player, ss.str());
|
||||
}
|
||||
|
||||
void ServerSideNetworkHandler::commandStats(OnlinePlayer* player, const std::vector<std::string>& parms)
|
||||
{
|
||||
if (!m_pLevel)
|
||||
return;
|
||||
|
||||
std::stringstream ss;
|
||||
ss << "Server uptime: " << getTimeS() << " seconds. Host's name: " << m_pMinecraft->m_pUser->field_0;
|
||||
|
||||
sendMessage(player, ss.str());
|
||||
}
|
||||
|
||||
void ServerSideNetworkHandler::commandTime(OnlinePlayer* player, const std::vector<std::string>& parms)
|
||||
{
|
||||
if (!m_pLevel)
|
||||
return;
|
||||
|
||||
std::stringstream ss;
|
||||
ss << "In-game time: ";
|
||||
ss << m_pLevel->getTime();
|
||||
sendMessage(player, ss.str());
|
||||
}
|
||||
|
||||
@@ -15,12 +15,14 @@
|
||||
#include "world/level/LevelListener.hpp"
|
||||
|
||||
class Minecraft;
|
||||
class ServerSideNetworkHandler;
|
||||
|
||||
struct OnlinePlayer
|
||||
{
|
||||
Player* m_pPlayer; // The player avatar this online player controls
|
||||
RakNet::RakNetGUID m_guid;
|
||||
|
||||
OnlinePlayer(Player* p) : m_pPlayer(p) {}
|
||||
OnlinePlayer(Player* p, const RakNet::RakNetGUID& guid) : m_pPlayer(p), m_guid(guid) {}
|
||||
};
|
||||
|
||||
struct RakNetGUIDHasher
|
||||
@@ -31,6 +33,10 @@ struct RakNetGUIDHasher
|
||||
}
|
||||
};
|
||||
|
||||
typedef void(ServerSideNetworkHandler::* CommandFunction)(OnlinePlayer* player, const std::vector<std::string>& parms);
|
||||
typedef std::unordered_map<std::string, CommandFunction> CommandMap;
|
||||
typedef std::unordered_map<RakNet::RakNetGUID, OnlinePlayer*, RakNetGUIDHasher> OnlinePlayerMap;
|
||||
|
||||
class ServerSideNetworkHandler : public NetEventCallback, public LevelListener
|
||||
{
|
||||
public:
|
||||
@@ -56,9 +62,17 @@ public:
|
||||
void allowIncomingConnections(bool b);
|
||||
void displayGameMessage(const std::string&);
|
||||
void sendMessage(const RakNet::RakNetGUID& guid, const std::string&);
|
||||
void sendMessage(OnlinePlayer*, const std::string&);
|
||||
void redistributePacket(Packet* packet, const RakNet::RakNetGUID& source);
|
||||
|
||||
// Custom
|
||||
OnlinePlayer* getPlayerByGUID(const RakNet::RakNetGUID& guid);
|
||||
void setupCommands();
|
||||
|
||||
// Commands
|
||||
void commandHelp (OnlinePlayer*, const std::vector<std::string>&);
|
||||
void commandStats(OnlinePlayer*, const std::vector<std::string>&);
|
||||
void commandTime (OnlinePlayer*, const std::vector<std::string>&);
|
||||
|
||||
public:
|
||||
Minecraft* m_pMinecraft = nullptr;
|
||||
@@ -67,6 +81,7 @@ public:
|
||||
RakNet::RakPeerInterface* m_pRakNetPeer = nullptr;
|
||||
bool m_bAllowIncoming = false;
|
||||
|
||||
std::unordered_map<RakNet::RakNetGUID, OnlinePlayer*, RakNetGUIDHasher> m_onlinePlayers;
|
||||
OnlinePlayerMap m_onlinePlayers;
|
||||
CommandMap m_commands;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user