#define MSP_GAME_PROTOCOL_H_
#include <msp/net/protocol.h>
+#include "mspgame_api.h"
namespace Msp::Game {
};
-class StageProtocol: public Net::Protocol
+class MSPGAME_API StageProtocol: public Net::Protocol
{
public:
StageProtocol();
System(s),
event_source(stage.get_event_bus()),
observer(stage.get_event_bus()),
- networking(n),
- protocol(networking.set_receiver<StageProtocol>(&dispatcher))
+ networking(n)
{
observer.observe<Events::ComponentCreated>([this](const auto &e){ component_created(e); });
-
- add_receiver<Messages::SpawnEntity>(*this);
- add_receiver<Messages::GrantPossession>(*this);
}
void Replicator::add_spawner(Spawner &spawner, const string &type)
send_spawn(e, id);
}
+void Replicator::set_protocol(const Net::Protocol &p)
+{
+ if(protocol)
+ throw already_called("Replicator::set_protocol");
+
+ protocol = &p;
+ add_receiver<Messages::SpawnEntity>(*this);
+ add_receiver<Messages::GrantPossession>(*this);
+}
+
Handle<Entity> Replicator::find_entity(uint32_t id) const
{
auto i = find_if(entities, [id](const ReplicatedEntity &e){ return e.zygote->get_entity_id()==id; });
EventObserver observer;
Networking &networking;
Net::DynamicDispatcher dispatcher;
- const Net::Protocol &protocol;
+ const Net::Protocol *protocol = nullptr;
std::vector<Spawner *> spawners;
std::vector<ReplicatedEntity> entities;
std::vector<std::uint32_t> players;
void add_target_player(std::uint32_t);
bool is_server() const { return networking.is_server(); }
+ template<typename T>
+ requires std::is_base_of_v<StageProtocol, T>
+ void set_protocol();
+
+private:
+ void set_protocol(const Net::Protocol &);
+
+public:
template<typename P>
void add_receiver(Net::PacketReceiver<P> &);
void receive(const Messages::GrantPossession &) override;
};
+template<typename T>
+ requires std::is_base_of_v<StageProtocol, T>
+void Replicator::set_protocol()
+{
+ set_protocol(networking.set_receiver<T>(&dispatcher));
+}
+
template<typename P>
void Replicator::add_receiver(Net::PacketReceiver<P> &recv)
{
- dispatcher.add_receiver<P>(protocol.get_packet_id<P>(), recv);
+ if(!protocol)
+ throw invalid_state("Replicator::add_receiver");
+ dispatcher.add_receiver<P>(protocol->get_packet_id<P>(), recv);
}
template<typename P>