Guest User

Fix for the "Don't allow block placement inside player, exce

a guest
Jan 27th, 2012
98
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff -rupN minetest_orig/src/server.cpp minetest_modified/src/server.cpp
  2. --- minetest_orig/src/server.cpp    2011-11-12 17:17:42.000000000 +0100
  3. +++ minetest_modified/src/server.cpp    2011-11-24 15:53:37.762770923 +0100
  4. @@ -2671,6 +2671,43 @@ void Server::ProcessData(u8 *data, u32 d
  5.                         client->SetBlockNotSent(blockpos);
  6.                         return;
  7.                     }
  8. +                  
  9. +                   if ((g_settings->getBool("free_move") == false) &&
  10. +                       (content_features(((MaterialItem*)item)->getMaterial()).air_equivalent == false))
  11. +                   {
  12. +                       float distance;
  13. +                       core::list<Player*> players = m_env.getPlayers();
  14. +                       core::list<Player*>::Iterator ip;
  15. +                      
  16. +                       for(ip = players.begin(); ip != players.end(); ip++) {
  17. +                           Player *p = *ip;
  18. +                           v3f player_pos = p->getPosition();
  19. +                           v3f player_eye_pos = p->getEyePosition();
  20. +                  
  21. +                           // this is strange. I would expect that (p->touching_ground == false) prevents a block
  22. +                           // to be placed at the current players "legs" but it doesn't. Seems that standing on
  23. +                           // something doesn't mean to touch ground? Not a big problem here IMHO.
  24. +                           if((p == player) && (p->touching_ground == false)) {
  25. +                               distance = BS*0.4;
  26. +                           } else {
  27. +                               distance = BS*0.9;
  28. +                           }
  29. +                  
  30. +                           if((player_pos.getDistanceFrom(intToFloat(p_over, BS)) <= distance) ||
  31. +                               (player_eye_pos.getDistanceFrom(intToFloat(p_over, BS)) <= distance))
  32. +                           {
  33. +                               infostream  << "Client "<<peer_id<<" tried to place"
  34. +                                           << " block on a player position;"
  35. +                                           << " setting MapBlock not sent."<<std::endl;              
  36. +                  
  37. +                               RemoteClient *client = getClient(peer_id);
  38. +                               v3s16 blockpos = getNodeBlockPos(p_over);
  39. +                               client->SetBlockNotSent(blockpos);
  40. +                               return;
  41. +                           }
  42. +                       }
  43. +                   }
  44. +
  45.                 }
  46.                 catch(InvalidPositionException &e)
  47.                 {
RAW Paste Data