Skip to content

Commit

Permalink
[PlayerList] Now refusing players that are already online.
Browse files Browse the repository at this point in the history
  • Loading branch information
Unarelith committed Jun 26, 2020
1 parent 02feb46 commit 0fd59bf
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 15 deletions.
1 change: 1 addition & 0 deletions source/client/states/ConnectionErrorState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ ConnectionErrorState::ConnectionErrorState(const std::string &error, const std::
auto &game = m_stateStack->push<GameState>();
auto &serverLoadingState = m_stateStack->push<ServerLoadingState>(game, true, m_host, m_port, m_parent);
serverLoadingState.setTexturePack(m_texturePack);
serverLoadingState.setUsername(Config::defaultUsername);
});

m_cancelButton.setText("Cancel");
Expand Down
2 changes: 1 addition & 1 deletion source/client/states/GameState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@ void GameState::init() {
}

void GameState::connect(const std::string &host, int port, const std::string &username) {
m_player.setName(username);
m_client.connect(host, port, m_player);
m_player.setClientID(m_client.id());
m_player.setName(username);
m_client.addPlayer(m_player);

gk::Mouse::setCursorVisible(false);
Expand Down
14 changes: 10 additions & 4 deletions source/server/core/PlayerList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,18 @@ ServerPlayer &PlayerList::addPlayer(const std::string &name, bool isNewPlayer) {
return m_players.at(name);
}

ServerPlayer &PlayerList::connectPlayer(const std::string &name, ClientInfo &client) {
ServerPlayer *PlayerList::connectPlayer(const std::string &name, ClientInfo &client) {
ServerPlayer *player = nullptr;
auto it = m_players.find(name);
if (it != m_players.end()) {
player = &it->second;
gkInfo() << name << "is online";
if (!it->second.isOnline()) {
player = &it->second;
gkInfo() << name << "is online";
}
else {
gkInfo() << name << "failed to connect: already online";
return nullptr;
}
}
else {
player = &addPlayer(name, true);
Expand All @@ -48,7 +54,7 @@ ServerPlayer &PlayerList::connectPlayer(const std::string &name, ClientInfo &cli

client.playerName = name;

return *player;
return player;
}

void PlayerList::disconnectPlayer(const std::string &name) {
Expand Down
2 changes: 1 addition & 1 deletion source/server/core/PlayerList.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class PlayerList {

public:
ServerPlayer &addPlayer(const std::string &name, bool isNewPlayer);
ServerPlayer &connectPlayer(const std::string &name, ClientInfo &client);
ServerPlayer *connectPlayer(const std::string &name, ClientInfo &client);
void disconnectPlayer(const std::string &name);

const ServerPlayer *getPlayer(const std::string &name) const;
Expand Down
23 changes: 14 additions & 9 deletions source/server/network/ServerCommandHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,14 @@ void ServerCommandHandler::setupCallbacks() {
std::string username;
connectionPacket >> username;

auto &player = m_players.connectPlayer(username, client);
if (player.isNewPlayer())
player.setPosition(m_spawnPosition.x, m_spawnPosition.y, m_spawnPosition.z);
ServerPlayer *player = m_players.connectPlayer(username, client);
if (!player) {
sendServerClosed("User is already online", &client);
return;
}

if (player->isNewPlayer())
player->setPosition(m_spawnPosition.x, m_spawnPosition.y, m_spawnPosition.z);

Network::Packet packet;
packet << Network::Command::RegistryData;
Expand All @@ -188,23 +193,23 @@ void ServerCommandHandler::setupCallbacks() {
client.tcpSocket->send(spawnPacket);
}

if (player.isNewPlayer())
m_scriptEngine.luaCore().onEvent(LuaEventType::PlayerConnected, glm::ivec3{player.x(), player.y(), player.z()}, player, client, *this);
if (player->isNewPlayer())
m_scriptEngine.luaCore().onEvent(LuaEventType::PlayerConnected, glm::ivec3{player->x(), player->y(), player->z()}, player, client, *this);

Network::Packet invPacket;
invPacket << Network::Command::PlayerInvUpdate << client.id;
invPacket << player.inventory();
invPacket << player->inventory();
client.tcpSocket->send(invPacket);

// Send spawn packet to all clients for this player
Network::Packet spawnPacket;
spawnPacket << Network::Command::PlayerSpawn << client.id;
spawnPacket << player.x() << player.y() << player.z() << player.dimension() << player.name();
spawnPacket << player.cameraYaw() << player.cameraPitch();
spawnPacket << player->x() << player->y() << player->z() << player->dimension() << player->name();
spawnPacket << player->cameraYaw() << player->cameraPitch();
m_server.sendToAllClients(spawnPacket);

// Send entities to the client
m_worldController.getWorld(player.dimension()).scene().sendEntities(client);
m_worldController.getWorld(player->dimension()).scene().sendEntities(client);
});

m_server.setCommandCallback(Network::Command::ClientDisconnect, [this](ClientInfo &client, Network::Packet &) {
Expand Down

0 comments on commit 0fd59bf

Please sign in to comment.