From 566537ee0c35dded7ecf154b773d7a4a5beb9e52 Mon Sep 17 00:00:00 2001 From: darkrose Date: Tue, 14 Oct 2014 18:46:35 +1000 Subject: [PATCH] stop objects freezing --- src/content_sao.cpp | 5 +++- src/content_sao.h | 5 ++-- src/environment.cpp | 31 ++++++++++---------- src/server.cpp | 70 ++++++++++++++++----------------------------- 4 files changed, 48 insertions(+), 63 deletions(-) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index e7a8f82..cd99ab5 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -475,6 +475,9 @@ void MobSAO::step(float dtime, bool send_recommended) m_walk_around_timer = 0.1*myrand_range(20,40); } } + }else if (m_walk_around_timer > 10.0) { + m_walk_around_timer = 0.2; + m_walk_around = true; } if (m_next_pos_exists) { v3f pos_f = m_base_position; @@ -1196,7 +1199,7 @@ void MobSAO::sendPosition() } void MobSAO::doDamage(u16 d) { - infostream<<"MobV2 hp="< 0.10) - { + if (m_send_recommended_timer > 0.10) { m_send_recommended_timer = 0; send_recommended = true; } @@ -2723,8 +2722,11 @@ void ServerEnvironment::step(float dtime) if (obj->level() > mob_level) obj->m_removed = true; // Don't step if is to be removed or stored statically - if (obj->m_removed || obj->m_pending_deactivation) + if (obj->m_removed || obj->m_pending_deactivation) { + // be sure m_removed is set in case m_pending_deactivation is + obj->m_removed = true; continue; + } // Step object obj->step(dtime, send_recommended); // Read messages from object @@ -3161,25 +3163,18 @@ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, - object has m_removed=true, or - object is too far away */ - for(core::map::Iterator - i = current_objects.getIterator(); - i.atEnd()==false; i++) - { + for (core::map::Iterator i = current_objects.getIterator(); i.atEnd()==false; i++) { u16 id = i.getNode()->getKey(); ServerActiveObject *object = getActiveObject(id); - if(object == NULL) - { + if (object == NULL) { infostream<<"ServerEnvironment::getRemovedActiveObjects():" <<" object in current_objects is NULL"<m_removed == false) - { + }else if (object->m_removed == false) { f32 distance_f = object->getBasePosition().getDistanceFrom(pos_f); /*infostream<<"removed == false" <<"distance_f = "<::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) - { + for (core::map::Iterator i = m_clients.getIterator(); i.atEnd() == false; i++) { RemoteClient *client = i.getNode()->getValue(); Player *player = m_env.getPlayer(client->peer_id); - if(player==NULL) - { + if (player==NULL) { // This can happen if the client timeouts somehow - /*infostream<<"WARNING: "<<__FUNCTION_NAME<<": Client " - <peer_id - <<" has no associated player"<getPosition(), BS); core::map removed_objects; core::map added_objects; - m_env.getRemovedActiveObjects(pos, radius, - client->m_known_objects, removed_objects); - m_env.getAddedActiveObjects(pos, radius, - client->m_known_objects, added_objects); + m_env.getRemovedActiveObjects(pos, radius, client->m_known_objects, removed_objects); + m_env.getAddedActiveObjects(pos, radius, client->m_known_objects, added_objects); // Ignore if nothing happened - if(removed_objects.size() == 0 && added_objects.size() == 0) - { + if (removed_objects.size() == 0 && added_objects.size() == 0) { //infostream<<"active objects: none changed"<::Iterator - i = removed_objects.getIterator(); - i.atEnd()==false; i++) - { + for (core::map::Iterator i = removed_objects.getIterator(); i.atEnd()==false; i++) { // Get object u16 id = i.getNode()->getKey(); ServerActiveObject* obj = m_env.getActiveObject(id); @@ -1371,7 +1358,7 @@ void Server::AsyncRunStep() // Remove from known objects client->m_known_objects.remove(i.getNode()->getKey()); - if(obj && obj->m_known_by_count > 0) + if (obj && obj->m_known_by_count > 0) obj->m_known_by_count--; } @@ -1406,7 +1393,7 @@ void Server::AsyncRunStep() // Add to known objects client->m_known_objects.insert(i.getNode()->getKey(), false); - if(obj) + if (obj) obj->m_known_by_count++; } @@ -2246,10 +2233,10 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) } else if(command == TOSERVER_CLICK_ACTIVEOBJECT) { - if(datasize < 7) + if (datasize < 7) return; - if((getPlayerPrivs(player) & PRIV_BUILD) == 0) + if ((getPlayerPrivs(player) & PRIV_BUILD) == 0) return; /* @@ -2265,22 +2252,23 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) ServerActiveObject *obj = m_env.getActiveObject(id); - if(obj == NULL) - { + if (obj == NULL) { infostream<<"Server: CLICK_ACTIVEOBJECT: object not found" <m_removed) + if (obj->m_removed) { + infostream<<"Server: CLICK_ACTIVEOBJECT: object has been removed" + <getValue(); // Handle objects - for(core::map::Iterator - i = client->m_known_objects.getIterator(); - i.atEnd()==false; i++) - { + for (core::map::Iterator i = client->m_known_objects.getIterator(); i.atEnd()==false; i++) { // Get object u16 id = i.getNode()->getKey(); ServerActiveObject* obj = m_env.getActiveObject(id); - if(obj && obj->m_known_by_count > 0) + if (obj && obj->m_known_by_count > 0) obj->m_known_by_count--; } @@ -5876,13 +5861,12 @@ void Server::handlePeerChange(PeerChange &c) std::wstring message; { Player *player = m_env.getPlayer(c.peer_id); - if(player != NULL) - { + if (player != NULL) { std::wstring name = narrow_to_wide(player->getName()); message += L"*** "; message += name; message += L" left game"; - if(c.timeout) + if (c.timeout) message += L" (timed out)"; } } @@ -5895,26 +5879,22 @@ void Server::handlePeerChange(PeerChange &c) // Set player client disconnected { Player *player = m_env.getPlayer(c.peer_id); - if(player != NULL) + if (player != NULL) player->peer_id = 0; /* Print out action */ - if(player != NULL) - { + if (player != NULL) { std::ostringstream os(std::ios_base::binary); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) - { + for (core::map::Iterator i = m_clients.getIterator(); i.atEnd() == false; i++) { RemoteClient *client = i.getNode()->getValue(); assert(client->peer_id == i.getNode()->getKey()); - if(client->serialization_version == SER_FMT_VER_INVALID) + if (client->serialization_version == SER_FMT_VER_INVALID) continue; // Get player Player *player = m_env.getPlayer(client->peer_id); - if(!player) + if (!player) continue; // Get name of player os<getName()<<" ";