summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent <vincent.leung60@gmail.com>2014-12-08 09:12:48 +0100
committerVincent <vincent.leung60@gmail.com>2014-12-08 09:12:48 +0100
commitd8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063 (patch)
tree7d51c143dd473da9bccff93dbfa89bb8314bbd2d
parentMerge branch 'issue_1253' of https://github.com/p-mcgowan/MCServer into issue_1253 (diff)
downloadcuberite-d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063.tar
cuberite-d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063.tar.gz
cuberite-d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063.tar.bz2
cuberite-d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063.tar.lz
cuberite-d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063.tar.xz
cuberite-d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063.tar.zst
cuberite-d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063.zip
-rw-r--r--src/ClientHandle.cpp60
-rw-r--r--src/ClientHandle.h2
-rw-r--r--src/Root.cpp9
-rw-r--r--src/Root.h4
4 files changed, 52 insertions, 23 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index 3fca48394..025588485 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -1788,6 +1788,41 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID)
+bool cClientHandle::CheckMultiLogin(void)
+{
+ std::list<AString> usernamesServer = cRoot::Get()->GetServer()->GetUsernames();
+
+ for (auto item : usernamesServer)
+ {
+ if ((item).compare(a_Username) == 0)
+ {
+ Kick("A player of the username is already logged in");
+ return false;
+ }
+ }
+
+ class cCallback :
+ public cPlayerListCallback
+ {
+ virtual bool Item(cPlayer * a_Player) override
+ {
+ return true;
+ }
+ } Callback;
+
+ if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback))
+ {
+ Kick("A player of the username is already logged in");
+ return false;
+ }
+
+ return true;
+}
+
+
+
+
+
bool cClientHandle::HandleHandshake(const AString & a_Username)
{
if (!cRoot::Get()->GetPluginManager()->CallHookHandshake(*this, a_Username))
@@ -1798,31 +1833,12 @@ bool cClientHandle::HandleHandshake(const AString & a_Username)
return false;
}
}
+
if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin()))
{
- std::list<AString> usernamesServer = cRoot::Get()->GetServer()->GetUsernames();
-
- for (auto item : usernamesServer)
- {
- if ((item).compare(a_Username) == 0)
- {
- Kick("A player of the username is already logged in");
- return false;
- }
- }
- class cCallback :
- public cPlayerListCallback
- {
- virtual bool Item(cPlayer * a_Player) override
- {
- return true;
- }
- } Callback;
- if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback))
- {
- Kick("A player of the username is already logged in");
- }
+ return CheckMultiLogin();
}
+
return true;
}
diff --git a/src/ClientHandle.h b/src/ClientHandle.h
index f195b6be7..880a404da 100644
--- a/src/ClientHandle.h
+++ b/src/ClientHandle.h
@@ -280,6 +280,8 @@ public:
void HandleEntityLeaveBed (int a_EntityID);
void HandleEntitySprinting (int a_EntityID, bool a_IsSprinting);
+ /** Kicks the current player if the same username is already logged in. */
+ bool CheckMultiLogin(void);
/** Called when the protocol handshake has been received (for protocol versions that support it;
otherwise the first instant when a username is received).
Returns true if the player is to be let in, false if they were disconnected
diff --git a/src/Root.cpp b/src/Root.cpp
index e309bb174..e51b7a048 100644
--- a/src/Root.cpp
+++ b/src/Root.cpp
@@ -649,6 +649,15 @@ bool cRoot::DoWithPlayerByUUID(const AString & a_PlayerUUID, cPlayerListCallback
+bool cRoot::FindAndDoWithPlayer(const AString & a_PlayerName, cPlayerListCallback & a_Callback)
+{
+
+}
+
+
+
+
+
AString cRoot::GetProtocolVersionTextFromInt(int a_ProtocolVersion)
{
return cProtocolRecognizer::GetVersionTextFromInt(a_ProtocolVersion);
diff --git a/src/Root.h b/src/Root.h
index 29753a47d..b926b36bc 100644
--- a/src/Root.h
+++ b/src/Root.h
@@ -128,7 +128,9 @@ public:
/** Finds the player over his uuid and calls the callback */
bool DoWithPlayerByUUID(const AString & a_PlayerUUID, cPlayerListCallback & a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
-
+
+ bool FindAndDoWithPlayer(const AString & a_PlayerName, cPlayerListCallback & a_Callback);
+
// tolua_begin
/// Sends a chat message to all connected clients (in all worlds)