Zepha/src/server/Server.cpp
aurailus df0e74b3e7 Client Positions are shown using crosshairs on all other clients!
* Server Regurgitates player location info to all clients
* PlayerEntity class for representing other Players on the server
* Temporary ServerEntity rendering code in GameScene
2019-02-08 15:35:59 -08:00

85 lines
2.4 KiB
C++

//
// Created by aurailus on 09/01/19.
//
#include "Server.h"
#include "../generic/blocks/BlockChunk.h"
Server::Server() = default;
Server::Server(unsigned short port) {
this->port = port;
}
void Server::init() {
handler = NetHandler(port, 32);
while (alive) update();
}
void Server::update() {
Timer loop("");
ENetEvent event;
while (handler.update(&event) && loop.elapsedNs() < 15L*1000000L) {
switch (event.type) {
case ENET_EVENT_TYPE_CONNECT: {
auto peer = connections.addPeer(event.peer);
connections.addPlayer(peer, "Aurailus");
break;
}
case ENET_EVENT_TYPE_RECEIVE: {
Packet p(event.packet);
auto from = (ServerPeer*)event.peer->data;
auto player = from->player;
if (player != nullptr) {
if (p.type == PacketType::PLAYERINFO) {
//Update Player Object
glm::vec3 newPos = glm::vec3(
Serializer::decodeFloat(&p.data[0]),
Serializer::decodeFloat(&p.data[4]),
Serializer::decodeFloat(&p.data[8])
);
player->pos = newPos;
//Send All Clients the new positon
Packet r(PacketType::ENTITYINFO);
Serializer::encodeInt (r.data, player->peer->index);
Serializer::encodeFloat(r.data, newPos.x);
Serializer::encodeFloat(r.data, newPos.y - 1.0f);
Serializer::encodeFloat(r.data, newPos.z);
for (auto peer : connections.peers) {
r.sendTo(peer->peer, PacketChannel::ENTITYINFO);
}
}
}
enet_packet_destroy(event.packet);
break;
}
case ENET_EVENT_TYPE_DISCONNECT: {
connections.removePeer(event.peer);
break;
}
case ENET_EVENT_TYPE_NONE:
default:
break;
}
}
long sleep_for = 16L*1000000L - loop.elapsedNs();
std::this_thread::sleep_for(std::chrono::nanoseconds(sleep_for));
}
void Server::cleanup() {
alive = false;
}
Server::~Server() {
cleanup();
}