forked from oerkki/voxelands
stop objects freezing
This commit is contained in:
parent
38c3a50db5
commit
566537ee0c
|
@ -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="<<m_hp<<" damage="<<d<<std::endl;
|
||||
infostream<<"Mob hp="<<((int)m_hp)<<" damage="<<((int)d)<<" age="<<((int)m_age)<<std::endl;
|
||||
|
||||
if (d < m_hp) {
|
||||
m_hp -= d;
|
||||
|
|
|
@ -75,8 +75,9 @@ private:
|
|||
|
||||
MobMotion getMotion()
|
||||
{
|
||||
if (m_angry)
|
||||
return content_mob_features(m_content).angry_motion;
|
||||
MobMotion m = content_mob_features(m_content).angry_motion;
|
||||
if (m_angry && m != MM_STATIC)
|
||||
return m;
|
||||
return content_mob_features(m_content).motion;
|
||||
}
|
||||
|
||||
|
|
|
@ -2711,8 +2711,7 @@ void ServerEnvironment::step(float dtime)
|
|||
bool send_recommended = false;
|
||||
u8 mob_level = mobLevelI(g_settings->get("max_mob_level"));
|
||||
m_send_recommended_timer += dtime;
|
||||
if(m_send_recommended_timer > 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<u16, bool>::Iterator
|
||||
i = current_objects.getIterator();
|
||||
i.atEnd()==false; i++)
|
||||
{
|
||||
for (core::map<u16, bool>::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"<<std::endl;
|
||||
}
|
||||
else if(object->m_removed == false)
|
||||
{
|
||||
}else if (object->m_removed == false) {
|
||||
f32 distance_f = object->getBasePosition().getDistanceFrom(pos_f);
|
||||
/*infostream<<"removed == false"
|
||||
<<"distance_f = "<<distance_f
|
||||
<<", radius_f = "<<radius_f<<std::endl;*/
|
||||
if(distance_f < radius_f)
|
||||
{
|
||||
if (distance_f < radius_f) {
|
||||
// Not removed
|
||||
continue;
|
||||
}
|
||||
|
@ -3285,6 +3280,9 @@ void ServerEnvironment::removeRemovedObjects()
|
|||
if (obj->m_removed == false && obj->m_pending_deactivation == false)
|
||||
continue;
|
||||
|
||||
// be sure m_removed is set in case m_pending_deactivation is
|
||||
obj->m_removed = true;
|
||||
|
||||
/*
|
||||
Delete static data from block if is marked as removed
|
||||
*/
|
||||
|
@ -3443,8 +3441,11 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
|
|||
}
|
||||
|
||||
// If pending deactivation, let removeRemovedObjects() do it
|
||||
if (obj->m_pending_deactivation)
|
||||
if (obj->m_pending_deactivation) {
|
||||
// be sure m_removed is set in case m_pending_deactivation is
|
||||
obj->m_removed = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
u16 id = i->first;
|
||||
v3f objectpos = obj->getBasePosition();
|
||||
|
|
|
@ -1319,32 +1319,22 @@ void Server::AsyncRunStep()
|
|||
s16 radius = g_settings->getS16("active_object_send_range_blocks");
|
||||
radius *= MAP_BLOCKSIZE;
|
||||
|
||||
for(core::map<u16, RemoteClient*>::Iterator
|
||||
i = m_clients.getIterator();
|
||||
i.atEnd() == false; i++)
|
||||
{
|
||||
for (core::map<u16, RemoteClient*>::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 "
|
||||
<<client->peer_id
|
||||
<<" has no associated player"<<std::endl;*/
|
||||
continue;
|
||||
}
|
||||
v3s16 pos = floatToInt(player->getPosition(), BS);
|
||||
|
||||
core::map<u16, bool> removed_objects;
|
||||
core::map<u16, bool> 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"<<std::endl;
|
||||
continue;
|
||||
}
|
||||
|
@ -1356,10 +1346,7 @@ void Server::AsyncRunStep()
|
|||
// Handle removed objects
|
||||
writeU16((u8*)buf, removed_objects.size());
|
||||
data_buffer.append(buf, 2);
|
||||
for(core::map<u16, bool>::Iterator
|
||||
i = removed_objects.getIterator();
|
||||
i.atEnd()==false; i++)
|
||||
{
|
||||
for (core::map<u16, bool>::Iterator i = removed_objects.getIterator(); i.atEnd()==false; i++) {
|
||||
// Get object
|
||||
u16 id = i.getNode()->getKey();
|
||||
ServerActiveObject* obj = m_env.getActiveObject(id);
|
||||
|
@ -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"
|
||||
<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// Skip if object has been removed
|
||||
if(obj->m_removed)
|
||||
if (obj->m_removed) {
|
||||
infostream<<"Server: CLICK_ACTIVEOBJECT: object has been removed"
|
||||
<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
//TODO: Check that object is reasonably close
|
||||
|
||||
// Left click, pick object up (usually)
|
||||
if(button == 0)
|
||||
{
|
||||
if (button == 0) {
|
||||
content_t wield_item = CONTENT_IGNORE;
|
||||
ToolItem *titem = NULL;
|
||||
|
||||
|
@ -5860,10 +5848,7 @@ void Server::handlePeerChange(PeerChange &c)
|
|||
*/
|
||||
RemoteClient *client = n->getValue();
|
||||
// Handle objects
|
||||
for(core::map<u16, bool>::Iterator
|
||||
i = client->m_known_objects.getIterator();
|
||||
i.atEnd()==false; i++)
|
||||
{
|
||||
for (core::map<u16, bool>::Iterator i = client->m_known_objects.getIterator(); i.atEnd()==false; i++) {
|
||||
// Get object
|
||||
u16 id = i.getNode()->getKey();
|
||||
ServerActiveObject* obj = m_env.getActiveObject(id);
|
||||
|
@ -5876,8 +5861,7 @@ 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;
|
||||
|
@ -5901,13 +5885,9 @@ void Server::handlePeerChange(PeerChange &c)
|
|||
/*
|
||||
Print out action
|
||||
*/
|
||||
if(player != NULL)
|
||||
{
|
||||
if (player != NULL) {
|
||||
std::ostringstream os(std::ios_base::binary);
|
||||
for(core::map<u16, RemoteClient*>::Iterator
|
||||
i = m_clients.getIterator();
|
||||
i.atEnd() == false; i++)
|
||||
{
|
||||
for (core::map<u16, RemoteClient*>::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)
|
||||
|
|
Loading…
Reference in New Issue