struct SpawnEntity
{
+ std::uint32_t id;
std::uint16_t type;
std::uint16_t setup;
LinAl::Vector<float, 3> position;
add<Vector3f, float, float, float>(&Vector3f::x, &Vector3f::y, &Vector3f::z);
add<Quaternion>(&Quaternion::a, &Quaternion::b, &Quaternion::c, &Quaternion::d);
- add<SpawnEntity>(&SpawnEntity::type, &SpawnEntity::setup, &SpawnEntity::position, &SpawnEntity::rotation, &SpawnEntity::scale);
+ add<SpawnEntity>(&SpawnEntity::id, &SpawnEntity::type, &SpawnEntity::setup, &SpawnEntity::position, &SpawnEntity::rotation, &SpawnEntity::scale);
}
} // namespace Msp::Game
#include "replicator.h"
#include "entity.h"
#include "networking.h"
+#include <msp/core/raii.h>
#include "spawner.h"
#include "transform.h"
#include "zygote.h"
Handle<Transform> transform = entity->get_transform();
auto i = lower_bound_member(entities, transform, &ReplicatedEntity::transform);
entities.emplace(i, entity, transform, zygote);
+
+ if(networking.is_server())
+ zygote->set_entity_id(next_entity_id++);
+ else if(received_entity_id!=Zygote::NO_ID)
+ zygote->set_entity_id(received_entity_id);
}
}
const SpawnInfo &info = re.zygote->get_spawn_info();
Messages::SpawnEntity message;
+ message.id = re.zygote->get_entity_id();
message.type = networking.intern_string(info.type_name);
message.setup = networking.intern_string(info.setup_name);
const TransformValues &tf = re.transform->get_values();
return; // TODO report the error somehow
const string &setup_name = networking.get_string(message.setup);
+ SetForScope<uint32_t> set_id(received_entity_id, message.id);
(*i)->spawn(type_name, setup_name, TransformValues(message.position, message.rotation, message.scale));
}
#include "messages.h"
#include "protocol.h"
#include "system.h"
+#include "zygote.h"
namespace Msp::Game {
class Networking;
class Spawner;
class Transform;
-class Zygote;
class MSPGAME_API Replicator: public System, private Net::PacketReceiver<Messages::SpawnEntity>
{
std::vector<Spawner *> spawners;
std::vector<ReplicatedEntity> entities;
std::vector<unsigned> players;
+ std::uint32_t next_entity_id = 1;
+ std::uint32_t received_entity_id = Zygote::NO_ID;
public:
Replicator(Stage &, Networking &);
#include "zygote.h"
#include <msp/core/except.h>
+using namespace std;
+
namespace Msp::Game {
void Zygote::set_spawn_info(const SpawnInfo &s)
spawn_info = &s;
}
+void Zygote::set_entity_id(uint32_t id)
+{
+ if(entity_id!=NO_ID)
+ throw already_called("entity_id already set");
+ entity_id = id;
+}
+
const SpawnInfo &Zygote::get_spawn_info() const
{
if(!spawn_info)
#ifndef MSP_GAME_ZYGOTE_H_
#define MSP_GAME_ZYGOTE_H_
+#include <limits>
#include "component.h"
namespace Msp::Game {
class Zygote: public Component
{
+public:
+ static constexpr std::uint32_t NO_ID = std::numeric_limits<std::uint32_t>::max();
+
private:
const SpawnInfo *spawn_info = nullptr;
+ std::uint32_t entity_id = NO_ID;
public:
Zygote(Handle<Entity> e): Component(e) { }
void set_spawn_info(const SpawnInfo &);
+ void set_entity_id(std::uint32_t);
const SpawnInfo &get_spawn_info() const;
+ std::uint32_t get_entity_id() const { return entity_id; }
};
} // namespace Msp::Game