void ReplicatedCall<P>::operator()(P &packet)
{
if(this->replicator)
+ {
+ if(!this->replicator->is_server())
+ throw invalid_state("ReplicatedCall<P>::operator()");
this->replicator->send(packet);
+ }
func(packet);
}
void Replicator::add_target_player(uint32_t id)
{
+ if(!is_server())
+ throw invalid_state("Replicator::add_target_player");
+
auto i = lower_bound(players, id);
players.insert(i, id);
for(const ReplicatedEntity &e: entities)
void Replicator::deferred_tick()
{
- for(ReplicatedEntity &e: entities)
- if(!e.visible_to_players)
- {
- send_spawn(e, 0);
- e.visible_to_players = true;
- }
+ if(is_server())
+ {
+ // TODO may send spawns one frame late, depending on execution order between systems
+ for(ReplicatedEntity &e: entities)
+ if(!e.visible_to_players)
+ {
+ send_spawn(e, 0);
+ e.visible_to_players = true;
+ }
+ }
}
void Replicator::component_created(const Events::ComponentCreated &event)
void Replicator::receive(const Messages::SpawnEntity &message)
{
+ if(is_server())
+ return;
+
const string &type_name = networking.get_string(message.type);
auto i = ranges::find_if(spawners, [&type_name](Spawner *s){ return s->can_spawn(type_name); });
if(i==spawners.end())
void Replicator::receive(const Messages::GrantPossession &message)
{
+ if(is_server())
+ return;
+
Handle<Entity> entity = find_entity(message.entity_id);
if(entity)
if(Handle<Possessed> possessed = entity->get_component<Possessed>())