Skip to content

Commit

Permalink
[WorldSaveBasicBackend] Now saving player position, rotation and inve…
Browse files Browse the repository at this point in the history
…ntory.
  • Loading branch information
Unarelith committed Jun 26, 2020
1 parent 992d2de commit 02feb46
Show file tree
Hide file tree
Showing 17 changed files with 132 additions and 59 deletions.
2 changes: 2 additions & 0 deletions docs/network-protocol.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ _This packet has no field._
| Player Z | double | Player Z coordinate |
| Dimension | u16 | Dimension ID |
| Username | std::string | Name of the player |
| Camera Yaw | float | Horizontal camera view angle |
| Camera Pitch | float | Vertical camera view angle |

#### PlayerChangeDimension

Expand Down
7 changes: 6 additions & 1 deletion source/client/network/ClientCommandHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,19 +231,24 @@ void ClientCommandHandler::setupCallbacks() {
gk::Vector3d pos;
u16 dimension;
std::string username;
packet >> clientId >> pos.x >> pos.y >> pos.z >> dimension >> username;
float cameraYaw, cameraPitch;
packet >> clientId >> pos.x >> pos.y >> pos.z >> dimension
>> username >> cameraYaw >> cameraPitch;

if (clientId != m_client.id()) {
m_playerBoxes.emplace(clientId, PlayerBox{m_player.camera()});
Player &player = m_playerBoxes.at(clientId);
player.setPosition(pos.x, pos.y, pos.z);
player.setRotation(cameraYaw, cameraPitch);
player.setDimension(dimension);
player.setClientID(clientId);
player.setName(username);
m_client.addPlayer(player);
}
else {
m_player.setPosition(pos.x, pos.y, pos.z);
m_player.setRotation(cameraYaw, cameraPitch);
m_player.updateCamera();
}
});

Expand Down
8 changes: 4 additions & 4 deletions source/client/world/ClientPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ ClientPlayer::ClientPlayer(gk::Camera &camera) : m_camera(camera) {
m_viewAngleV = 0.f;
m_viewAngleRoll = 0.f;

updateDir();
updateCamera();

m_camera.setDPosition(m_x + m_cameraLocalPos.x, m_y + m_cameraLocalPos.y, m_z + m_cameraLocalPos.z);
}
Expand All @@ -53,16 +53,16 @@ void ClientPlayer::turnH(float angle) {
if (m_viewAngleH >= 180.f) m_viewAngleH -= 360.f;
if (m_viewAngleH < -180.f) m_viewAngleH += 360.f;

updateDir();
updateCamera();
}

void ClientPlayer::turnViewV(float angle) {
m_viewAngleV = std::max(std::min(m_viewAngleV + angle, 90.f), -90.f);

updateDir();
updateCamera();
}

void ClientPlayer::updateDir() {
void ClientPlayer::updateCamera() {
float ch = cosf(m_viewAngleH * RADIANS_PER_DEGREES);
float sh = sinf(m_viewAngleH * RADIANS_PER_DEGREES);
float cv = cosf(m_viewAngleV * RADIANS_PER_DEGREES);
Expand Down
5 changes: 3 additions & 2 deletions source/client/world/ClientPlayer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ class ClientPlayer : public Player {
void turnH(float angle);
void turnViewV(float angle);

void updateCamera();

void move(float direction);

void processInputs();
Expand All @@ -67,13 +69,12 @@ class ClientPlayer : public Player {
static void setInstance(ClientPlayer *instance) { s_instance = instance; }

void setPosition(double x, double y, double z);
void setCameraRoll(float angle) { m_viewAngleRoll = angle; updateDir(); };
void setCameraRoll(float angle) { m_viewAngleRoll = angle; updateCamera(); };

gk::Camera &camera() { return m_camera; }

private:
void testPoint(const ClientWorld &world, double x, double y, double z, glm::vec3 &vel);
void updateDir();

static ClientPlayer *s_instance;

Expand Down
4 changes: 2 additions & 2 deletions source/common/world/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ u8 Player::getOppositeDirection() const {
}

void Player::serialize(sf::Packet &packet) const {
packet << m_x << m_y << m_z << m_dimension << m_inventory << m_name;
packet << m_x << m_y << m_z << m_dimension << m_viewAngleH << m_viewAngleV << m_viewAngleRoll << m_inventory;
}

void Player::deserialize(sf::Packet &packet) {
packet >> m_x >> m_y >> m_z >> m_dimension >> m_inventory >> m_name;
packet >> m_x >> m_y >> m_z >> m_dimension >> m_viewAngleH >> m_viewAngleV >> m_viewAngleRoll >> m_inventory;
}

// Please update 'docs/lua-api-cpp.md' if you change this
Expand Down
53 changes: 42 additions & 11 deletions source/server/core/PlayerList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,30 +26,61 @@
*/
#include "PlayerList.hpp"

ServerPlayer &PlayerList::addPlayer(ClientInfo &client) {
m_players.emplace(client.id, client);
return m_players.at(client.id);
ServerPlayer &PlayerList::addPlayer(const std::string &name, bool isNewPlayer) {
m_players.emplace(name, ServerPlayer{name, isNewPlayer});
return m_players.at(name);
}

void PlayerList::removePlayer(u16 id) {
auto it = m_players.find(id);
if (it != m_players.end())
m_players.erase(it);
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";
}
else {
player = &addPlayer(name, true);
gkInfo() << name << "is online (first connection)";
}

player->setClient(&client);
player->setClientID(client.id);

client.playerName = name;

return *player;
}

void PlayerList::disconnectPlayer(const std::string &name) {
auto it = m_players.find(name);
if (it != m_players.end()) {
it->second.setClient(nullptr);
it->second.setNewPlayer(false);
}
}

const ServerPlayer *PlayerList::getPlayer(u16 id) const {
auto it = m_players.find(id);
const ServerPlayer *PlayerList::getPlayer(const std::string &name) const {
auto it = m_players.find(name);
if (it == m_players.end())
return nullptr;

return &it->second;
}

ServerPlayer *PlayerList::getPlayer(u16 id) {
auto it = m_players.find(id);
ServerPlayer *PlayerList::getPlayer(const std::string &name) {
auto it = m_players.find(name);
if (it == m_players.end())
return nullptr;

return &it->second;
}

ServerPlayer *PlayerList::getPlayerFromClientID(u16 clientID) {
for (auto &it : m_players) {
if (it.second.clientID() == clientID)
return &it.second;
}

return nullptr;
}

15 changes: 10 additions & 5 deletions source/server/core/PlayerList.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,28 @@
#include "ServerPlayer.hpp"

class PlayerList {
using PlayerMap = std::unordered_map<u16, ServerPlayer>;
using PlayerMap = std::unordered_map<std::string, ServerPlayer>;
using Iterator = PlayerMap::iterator;
using ConstIterator = PlayerMap::const_iterator;

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

const ServerPlayer *getPlayer(u16 id) const;
ServerPlayer *getPlayer(u16 id);
const ServerPlayer *getPlayer(const std::string &name) const;
ServerPlayer *getPlayer(const std::string &name);

ServerPlayer *getPlayerFromClientID(u16 clientID);

Iterator begin() { return m_players.begin(); }
Iterator end() { return m_players.end(); }

ConstIterator begin() const { return m_players.begin(); }
ConstIterator end() const { return m_players.end(); }

std::size_t size() const { return m_players.size(); }

private:
PlayerMap m_players;
};
Expand Down
6 changes: 4 additions & 2 deletions source/server/core/ServerApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,10 @@ void ServerApplication::update() {

if (m_clock.getTicks() % 100 < 10) {
for (auto &it : m_players) {
m_serverCommandHandler.sendPlayerPosUpdate(it.first);
m_serverCommandHandler.sendPlayerRotUpdate(it.first);
if (it.second.isOnline()) {
m_serverCommandHandler.sendPlayerPosUpdate(it.second.clientID());
m_serverCommandHandler.sendPlayerRotUpdate(it.second.clientID());
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion source/server/lua/LuaMod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ void LuaMod::despawnEntity(EntityWrapper &entity) {
void LuaMod::giveItemStack(ServerPlayer &player, ItemStack *itemStack) {
if (itemStack) {
player.inventory().addStack(itemStack->item().stringID(), itemStack->amount());
m_worldController.server()->sendPlayerInvUpdate(player.clientID(), &player.client());
m_worldController.server()->sendPlayerInvUpdate(player.clientID(), player.client());
}
else
gkError() << "In mod '" + m_id + "': Failed to add stack to player";
Expand Down
2 changes: 2 additions & 0 deletions source/server/network/ClientInfo.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ class ClientInfo {
std::shared_ptr<sf::TcpSocket> tcpSocket;

NetworkInputHandler inputHandler;

std::string playerName;
};

#endif // CLIENTINFO_HPP_
39 changes: 21 additions & 18 deletions source/server/network/ServerCommandHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ void ServerCommandHandler::sendBlockInvUpdate(s32 x, s32 y, s32 z, const Invento
}

void ServerCommandHandler::sendPlayerPosUpdate(u16 clientID, bool isTeleportation, const ClientInfo *client) const {
const ServerPlayer *player = m_players.getPlayer(clientID);
const ServerPlayer *player = m_players.getPlayerFromClientID(clientID);
if (player) {
Network::Packet packet;
packet << Network::Command::PlayerPosUpdate;
Expand All @@ -86,7 +86,7 @@ void ServerCommandHandler::sendPlayerPosUpdate(u16 clientID, bool isTeleportatio
}

void ServerCommandHandler::sendPlayerRotUpdate(u16 clientID, const ClientInfo *client) const {
const ServerPlayer *player = m_players.getPlayer(clientID);
const ServerPlayer *player = m_players.getPlayerFromClientID(clientID);
if (player) {
Network::Packet packet;
packet << Network::Command::PlayerRotUpdate;
Expand All @@ -103,7 +103,7 @@ void ServerCommandHandler::sendPlayerRotUpdate(u16 clientID, const ClientInfo *c
}

void ServerCommandHandler::sendPlayerInvUpdate(u16 clientID, const ClientInfo *client) const {
ServerPlayer *player = m_players.getPlayer(clientID);
ServerPlayer *player = m_players.getPlayerFromClientID(clientID);
if (player) {
Network::Packet packet;
packet << Network::Command::PlayerInvUpdate;
Expand Down Expand Up @@ -170,9 +170,9 @@ void ServerCommandHandler::setupCallbacks() {
std::string username;
connectionPacket >> username;

auto &player = m_players.addPlayer(client);
player.setPosition(m_spawnPosition.x, m_spawnPosition.y, m_spawnPosition.z);
player.setName(username);
auto &player = m_players.connectPlayer(username, client);
if (player.isNewPlayer())
player.setPosition(m_spawnPosition.x, m_spawnPosition.y, m_spawnPosition.z);

Network::Packet packet;
packet << Network::Command::RegistryData;
Expand All @@ -183,11 +183,13 @@ void ServerCommandHandler::setupCallbacks() {
for (auto &it : m_players) {
Network::Packet spawnPacket;
spawnPacket << Network::Command::PlayerSpawn << it.first;
spawnPacket << it.second.x() << it.second.y() << it.second.z();
spawnPacket << it.second.x() << it.second.y() << it.second.z() << it.second.dimension() << it.second.name();
spawnPacket << it.second.cameraYaw() << it.second.cameraPitch();
client.tcpSocket->send(spawnPacket);
}

m_scriptEngine.luaCore().onEvent(LuaEventType::PlayerConnected, glm::ivec3{m_spawnPosition.x, m_spawnPosition.y, m_spawnPosition.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;
Expand All @@ -198,14 +200,15 @@ void ServerCommandHandler::setupCallbacks() {
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();
m_server.sendToAllClients(spawnPacket);

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

m_server.setCommandCallback(Network::Command::ClientDisconnect, [this](ClientInfo &client, Network::Packet &) {
m_players.removePlayer(client.id);
m_players.disconnectPlayer(client.playerName);
});

m_server.setCommandCallback(Network::Command::ChunkRequest, [this](ClientInfo &client, Network::Packet &packet) {
Expand All @@ -216,7 +219,7 @@ void ServerCommandHandler::setupCallbacks() {
});

m_server.setCommandCallback(Network::Command::PlayerInvUpdate, [this](ClientInfo &client, Network::Packet &packet) {
ServerPlayer *player = m_players.getPlayer(client.id);
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
if (player) {
packet >> player->inventory();
}
Expand All @@ -228,7 +231,7 @@ void ServerCommandHandler::setupCallbacks() {
double x, y, z;
packet >> x >> y >> z;

ServerPlayer *player = m_players.getPlayer(client.id);
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
if (player) {
player->setPosition(x, y, z);
}
Expand All @@ -240,7 +243,7 @@ void ServerCommandHandler::setupCallbacks() {
float yaw, pitch;
packet >> yaw >> pitch;

ServerPlayer *player = m_players.getPlayer(client.id);
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
if (player) {
player->setRotation(yaw, pitch);
}
Expand All @@ -249,7 +252,7 @@ void ServerCommandHandler::setupCallbacks() {
});

m_server.setCommandCallback(Network::Command::PlayerPlaceBlock, [this](ClientInfo &client, Network::Packet &packet) {
ServerPlayer *player = m_players.getPlayer(client.id);
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
if (player) {
s32 x, y, z;
u32 block;
Expand All @@ -271,7 +274,7 @@ void ServerCommandHandler::setupCallbacks() {
});

m_server.setCommandCallback(Network::Command::PlayerDigBlock, [this](ClientInfo &client, Network::Packet &packet) {
ServerPlayer *player = m_players.getPlayer(client.id);
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
if (player) {
s32 x, y, z;
packet >> x >> y >> z;
Expand All @@ -291,7 +294,7 @@ void ServerCommandHandler::setupCallbacks() {
});

m_server.setCommandCallback(Network::Command::PlayerHeldItemChanged, [this](ClientInfo &client, Network::Packet &packet) {
ServerPlayer *player = m_players.getPlayer(client.id);
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
if (player) {
u8 hotbarSlot;
u16 itemID;
Expand All @@ -306,7 +309,7 @@ void ServerCommandHandler::setupCallbacks() {
});

m_server.setCommandCallback(Network::Command::BlockActivated, [this](ClientInfo &client, Network::Packet &packet) {
ServerPlayer *player = m_players.getPlayer(client.id);
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
if (player) {
s32 x, y, z;
u16 screenWidth, screenHeight;
Expand Down Expand Up @@ -372,15 +375,15 @@ void ServerCommandHandler::setupCallbacks() {
}

void ServerCommandHandler::setPlayerPosition(u16 clientID, s32 x, s32 y, s32 z) {
ServerPlayer *player = m_players.getPlayer(clientID);
ServerPlayer *player = m_players.getPlayerFromClientID(clientID);
if (player)
player->setPosition(x, y, z);
else
gkError() << ("Failed to set position for player " + std::to_string(clientID) + ": Player not found").c_str();
}

inline ServerWorld &ServerCommandHandler::getWorldForClient(u16 clientID) {
ServerPlayer *player = m_players.getPlayer(clientID);
ServerPlayer *player = m_players.getPlayerFromClientID(clientID);
if (!player)
throw EXCEPTION("Player instance not found for client", clientID);

Expand Down
Loading

0 comments on commit 02feb46

Please sign in to comment.