]> git.tdb.fi Git - libs/game.git/commitdiff
Add some network state checks
authorMikko Rasa <tdb@tdb.fi>
Sat, 13 Jan 2024 12:09:18 +0000 (14:09 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 13 Jan 2024 12:09:18 +0000 (14:09 +0200)
source/game/remotecall.h
source/game/replicator.cpp

index b9c2ac61474a1f44ec7645518cf3e09e73e27cef..f79569c4726eaa463568e474899eaa56bee6e34d 100644 (file)
@@ -136,7 +136,11 @@ template<typename P>
 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);
 }
 
index aba64eb438175b5867021abd8c44c41ede147c45..fa32249b32aac4b7067608cd184566fb2b00b3ba 100644 (file)
@@ -35,6 +35,9 @@ void Replicator::add_spawner(Spawner &spawner, const string &type)
 
 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)
@@ -76,12 +79,16 @@ void Replicator::tick(Time::TimeDelta)
 
 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)
@@ -143,6 +150,9 @@ void Replicator::send_possession(const ReplicatedEntity &re, uint32_t target)
 
 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())
@@ -155,6 +165,9 @@ void Replicator::receive(const Messages::SpawnEntity &message)
 
 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>())