Zepha/src/world/player/ServerPlayer.cpp

98 lines
2.2 KiB
C++

#include "ServerPlayer.h"
#include "world/ServerWorld.h"
#include "util/net/NetField.h"
#include "server/ServerClient.h"
#include "util/net/Serializer.h"
#include "util/net/Deserializer.h"
#include "world/inv/ServerInventoryRefs.h"
ServerPlayer::ServerPlayer(ServerClient& client, World& world, SubgamePtr game, DimensionPtr dim) :
Player(game, world, dim, client.id), Entity(game, dim), client(client),
inventory(world.getRefs()->createInventory("player:" + std::to_string(id))) {
inventory->createList("cursor", 1, 1);
}
string ServerPlayer::getUsername() {
return client.username;
}
void ServerPlayer::assertField(Packet packet) {
packet.type = Packet::Type::THIS_PLAYER_INFO;
packet.sendTo(getPeer(), Packet::Channel::INTERACT);
}
void ServerPlayer::handleAssertion(Deserializer& d) {
while (!d.atEnd()) {
const auto field = d.read<NetField>();
switch (field) {
default:
std::cout << Log::err << "Player received unhandled NetField, Type "
<< static_cast<u32>(field) << "." << Log::endl;
break;
case NetField::POS:
setPos(d.read<vec3>());
break;
case NetField::VEL:
setVel(d.read<vec3>());
break;
case NetField::LOOK_YAW:
setPitch(d.read<f32>());
break;
case NetField::LOOK_PITCH:
setYaw(d.read<f32>());
break;
case NetField::FLYING:
setFlying(d.read<bool>());
break;
case NetField::HAND_INV:
setHandList(d.read<string>());
break;
case NetField::WIELD_INV:
setWieldList(d.read<string>());
break;
case NetField::WIELD_INDEX:
setWieldIndex(d.read<u16>());
break;
}
}
}
void ServerPlayer::setDim(DimensionPtr dim, bool assert) {
Player::setDim(dim, assert);
// Force a generation flush.
lastPos = vec3(INFINITY);
changedMapBlocks = true;
}
void ServerPlayer::setPos(vec3 pos, bool assert) {
ivec3 lastMapBlock = Space::MapBlock::world::fromBlock(this->pos);
ivec3 newMapBlock = Space::MapBlock::world::fromBlock(pos);
if (newMapBlock != lastMapBlock && !changedMapBlocks) {
changedMapBlocks = true;
lastPos = this->pos;
}
Player::setPos(pos, assert);
}
InventoryPtr ServerPlayer::getInventory() {
return inventory;
}
ENetPeer* ServerPlayer::getPeer() {
return client.peer;
}