Added the possibility of reserved player slots by implementing the HandleHandshake hook!
More info: http://forum.mc-server.org/showthread.php?tid=555 git-svn-id: http://mc-server.googlecode.com/svn/trunk@836 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
692afbca68
commit
f94456dd3e
@ -974,10 +974,9 @@ int cProtocol125::ParseHandshake(void)
|
||||
|
||||
LOGD("HANDSHAKE %s", Username.c_str());
|
||||
|
||||
if (cRoot::Get()->GetDefaultWorld()->GetNumPlayers() >= cRoot::Get()->GetDefaultWorld()->GetMaxPlayers())
|
||||
if (!m_Client->HandleHandshake( m_Username ))
|
||||
{
|
||||
m_Client->Kick("The server is currently full :(-- Try again later");
|
||||
return PARSE_OK;
|
||||
return PARSE_OK; // Player is not allowed into the server
|
||||
}
|
||||
|
||||
SendHandshake(cRoot::Get()->GetServer()->GetServerID());
|
||||
|
@ -332,6 +332,11 @@ int cProtocol132::ParseHandshake(void)
|
||||
HANDLE_PACKET_READ(ReadBEInt, int, ServerPort);
|
||||
m_Username = Username;
|
||||
|
||||
if (!m_Client->HandleHandshake( m_Username ))
|
||||
{
|
||||
return PARSE_OK; // Player is not allowed into the server
|
||||
}
|
||||
|
||||
// Send a 0xFD Encryption Key Request http://wiki.vg/Protocol#0xFD
|
||||
AString key;
|
||||
CryptoPP::StringSink sink(key); // GCC won't allow inline instantiation in the following line, damned temporary refs
|
||||
|
@ -918,6 +918,23 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID)
|
||||
|
||||
|
||||
|
||||
bool cClientHandle::HandleHandshake(const AString & a_Username)
|
||||
{
|
||||
if (!cRoot::Get()->GetPluginManager()->CallHookHandshake(this, a_Username))
|
||||
{
|
||||
if (cRoot::Get()->GetDefaultWorld()->GetNumPlayers() >= cRoot::Get()->GetDefaultWorld()->GetMaxPlayers())
|
||||
{
|
||||
Kick("The server is currently full :(-- Try again later");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cClientHandle::SendData(const char * a_Data, int a_Size)
|
||||
{
|
||||
{
|
||||
|
@ -162,6 +162,7 @@ public:
|
||||
void HandleRespawn (void);
|
||||
void HandleDisconnect (const AString & a_Reason);
|
||||
void HandleKeepAlive (int a_KeepAliveID);
|
||||
bool HandleHandshake (const AString & a_Username);
|
||||
|
||||
/** Called when the protocol has finished logging the user in.
|
||||
Return true to allow the user in; false to kick them.
|
||||
|
@ -283,6 +283,17 @@ bool cPlugin::OnWeatherChanged(cWorld * a_World)
|
||||
|
||||
|
||||
|
||||
bool cPlugin::OnHandshake(cClientHandle * a_Client, const AString & a_Username)
|
||||
{
|
||||
UNUSED(a_Client);
|
||||
UNUSED(a_Username);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cPlugin::AddCommand(const AString & a_Command, const AString & a_Description, const AString & a_Permission)
|
||||
{
|
||||
CommandStruct Command;
|
||||
|
@ -61,6 +61,7 @@ public:
|
||||
virtual bool OnUpdatedSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player);
|
||||
virtual bool OnUpdatingSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4, cPlayer * a_Player);
|
||||
virtual bool OnWeatherChanged (cWorld * a_World);
|
||||
virtual bool OnHandshake (cClientHandle * a_Client, const AString & a_Username);
|
||||
|
||||
// Accessors
|
||||
const AString & GetName() const { return m_Name; }
|
||||
|
@ -627,6 +627,26 @@ bool cPluginManager::CallHookUpdatedSign(cWorld * a_World, int a_BlockX, int a_B
|
||||
|
||||
|
||||
|
||||
bool cPluginManager::CallHookHandshake(cClientHandle * a_ClientHandle, const AString & a_Username)
|
||||
{
|
||||
HookMap::iterator Plugins = m_Hooks.find(HOOK_HANDSHAKE);
|
||||
if (Plugins == m_Hooks.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (PluginList::iterator itr = Plugins->second.begin(); itr != Plugins->second.end(); ++itr)
|
||||
{
|
||||
if ((*itr)->OnHandshake(a_ClientHandle, a_Username))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cPlugin* cPluginManager::GetPlugin( const AString & a_Plugin ) const
|
||||
{
|
||||
|
@ -115,6 +115,7 @@ public: //tolua_export
|
||||
bool CallHookUpdatedSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player);
|
||||
bool CallHookUpdatingSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4, cPlayer * a_Player);
|
||||
bool CallHookWeatherChanged (cWorld * a_World);
|
||||
bool CallHookHandshake (cClientHandle * a_ClientHandle, const AString & a_Username);
|
||||
|
||||
void RemoveHooks( cPlugin* a_Plugin );
|
||||
void RemovePlugin( cPlugin* a_Plugin, bool a_bDelete = false ); //tolua_export
|
||||
|
@ -640,6 +640,30 @@ bool cPlugin_NewLua::OnUpdatedSign(
|
||||
|
||||
|
||||
|
||||
bool cPlugin_NewLua::OnHandshake(cClientHandle * a_Client, const AString & a_Username)
|
||||
{
|
||||
cCSLock Lock(m_CriticalSection);
|
||||
if (!PushFunction("OnHandshake"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
tolua_pushusertype(m_LuaState, a_Client, "cClientHandle");
|
||||
tolua_pushstring (m_LuaState, a_Username.c_str());
|
||||
|
||||
if (!CallFunction(2, 1, "OnHandshake"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool bRetVal = (tolua_toboolean( m_LuaState, -1, 0) > 0);
|
||||
return bRetVal;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cPlugin_NewLua * cPlugin_NewLua::CreateWebPlugin(lua_State * a_LuaState)
|
||||
{
|
||||
LOGWARN("WARNING: Using deprecated function CreateWebPlugin()! A Lua plugin is a WebPlugin by itself now. (plugin \"%s\" in folder \"%s\")",
|
||||
|
@ -34,17 +34,18 @@ public: //tolua_export
|
||||
virtual bool OnCollectPickup (cPlayer * a_Player, cPickup * a_Pickup) override;
|
||||
virtual bool OnCraftingNoRecipe(const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe) override;
|
||||
virtual bool OnDisconnect (cPlayer * a_Player, const AString & a_Reason) override;
|
||||
virtual bool OnKilled (cPawn* a_Killed, cEntity* a_Killer ) override;
|
||||
virtual bool OnKilled (cPawn * a_Killed, cEntity* a_Killer ) override;
|
||||
virtual bool OnLogin (cClientHandle * a_Client, int a_ProtocolVersion, const AString & a_Username) override;
|
||||
virtual bool OnPlayerJoin (cPlayer* a_Player ) override;
|
||||
virtual void OnPlayerMove (cPlayer* a_Player ) override;
|
||||
virtual void OnPlayerSpawn (cPlayer* a_Player ) override;
|
||||
virtual bool OnPlayerJoin (cPlayer * a_Player ) override;
|
||||
virtual void OnPlayerMove (cPlayer * a_Player ) override;
|
||||
virtual void OnPlayerSpawn (cPlayer * a_Player ) override;
|
||||
virtual bool OnPostCrafting (const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe) override;
|
||||
virtual bool OnPreCrafting (const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe) override;
|
||||
virtual void OnTakeDamage (cPawn* a_Pawn, TakeDamageInfo* a_TakeDamageInfo ) override;
|
||||
virtual void OnTakeDamage (cPawn * a_Pawn, TakeDamageInfo * a_TakeDamageInfo ) override;
|
||||
virtual bool OnUpdatedSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player) override;
|
||||
virtual bool OnUpdatingSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4, cPlayer * a_Player) override;
|
||||
virtual bool OnWeatherChanged (cWorld * a_World) override;
|
||||
virtual bool OnHandshake (cClientHandle * a_Client, const AString & a_Username) override;
|
||||
|
||||
const AString & GetDirectory(void) const {return m_Directory; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user