-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathServer.cpp
More file actions
executable file
·97 lines (78 loc) · 3.27 KB
/
Server.cpp
File metadata and controls
executable file
·97 lines (78 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//
// Created by Иван Ильин on 25.05.2021.
//
#include "engine/utils/Log.h"
#include "Server.h"
#include "MinecraftMsgType.h"
void Server::broadcast() {
sf::Packet updatePacket;
updatePacket << MsgType::ServerUpdate;
for (auto& player : _players) {
updatePacket << player.first << player.second->position().x() << player.second->position().y() << player.second->position().z() << player.second->angle().y() << player.second->headAngle();
}
for (auto& player : _players) {
_socket.send(updatePacket, player.first);
}
}
void Server::processConnect(sf::Uint16 targetId) {
sf::Packet sendPacket;
sf::Packet extraPacket;
extraPacket << MsgType::NewClient << targetId;
sendPacket << MsgType::Init << targetId;
_players.insert({ targetId, std::make_shared<Player>(ObjectNameTag("Player_"+std::to_string(targetId))) });
for (const auto& player : _players)
{
sendPacket << player.first << player.second->position().x() << player.second->position().y() << player.second->position().z();
if (player.first != targetId)
_socket.sendRely(extraPacket, player.first);
}
_socket.sendRely(sendPacket, targetId);
}
void Server::processClientUpdate(sf::Uint16 senderId, sf::Packet& packet) {
double x, y, z, angleBody, headAngle;
packet >> x >> y >> z >> angleBody >> headAngle;
_players.at(senderId)->translateToPoint(Vec3D{ x, y, z });
_players.at(senderId)->rotateToAngle(Vec3D{0, angleBody, 0});
_players.at(senderId)->setHeadAngle(headAngle);
}
void Server::processDisconnect(sf::Uint16 senderId) {
sf::Packet sendPacket;
sendPacket << MsgType::Disconnect << senderId;
_players.erase(senderId);
for (const auto& player : _players)
_socket.sendRely(sendPacket, player.first);
}
void Server::processCustomPacket(sf::Packet& packet, sf::Uint16 senderId) {
sf::Packet sendPacket;
int buff[3];
sf::Uint16 tmp;
Cube::Type cubeType;
MinecraftMsgType type;
packet >> type;
switch (type) {
case MinecraftMsgType::AddCube:
packet >> tmp >> buff[0] >> buff[1] >> buff[2];
sendPacket << MsgType::Custom << MinecraftMsgType::AddCube << tmp << buff[0] << buff[1] << buff[2];
for(auto& _player : _players) {
if(senderId != _player.first) {
_socket.sendRely(sendPacket, _player.first);
}
}
Log::log("Server: AddCube (" + std::to_string(tmp) + ") at [" + std::to_string(buff[0]) + ", " + std::to_string(buff[1]) + ", " + std::to_string(buff[2]) + "]");
break;
case MinecraftMsgType::RemoveCube:
packet >> buff[0] >> buff[1] >> buff[2];
sendPacket << MsgType::Custom << MinecraftMsgType::RemoveCube << buff[0] << buff[1] << buff[2];
for(auto& _player : _players) {
if(senderId != _player.first) {
_socket.sendRely(sendPacket, _player.first);
}
}
Log::log("Server: RemoveCube at [" + std::to_string(buff[0]) + ", " + std::to_string(buff[1]) + ", " + std::to_string(buff[2]) + "]");
break;
}
}
void Server::processStop() {
for (auto it = _players.begin(); it != _players.end();)
_players.erase(it++);
}