X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcollision.cpp;h=3460b04fdb719f75072c444ae243f61a5957de0a;hb=2f2b7915eade91fe20af7c9e5e8921c35342a672;hp=3d322cf0c4baee77342ab5026e652e639e01ecb4;hpb=2587bb361cfc96b3a695d1476e39b9c0ecaa6553;p=oweals%2Fminetest.git diff --git a/src/collision.cpp b/src/collision.cpp index 3d322cf0c..3460b04fd 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -20,9 +20,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "collision.h" #include "mapblock.h" #include "map.h" +#include "nodedef.h" +#include "gamedef.h" -collisionMoveResult collisionMoveSimple(Map *map, f32 pos_max_d, - const core::aabbox3d &box_0, +collisionMoveResult collisionMoveSimple(Map *map, IGameDef *gamedef, + f32 pos_max_d, const core::aabbox3d &box_0, f32 dtime, v3f &pos_f, v3f &speed_f) { collisionMoveResult result; @@ -70,16 +72,21 @@ collisionMoveResult collisionMoveSimple(Map *map, f32 pos_max_d, /* Go through every node around the object - TODO: Calculate the range of nodes that need to be checked */ - for(s16 y = oldpos_i.Y - 1; y <= oldpos_i.Y + 2; y++) - for(s16 z = oldpos_i.Z - 1; z <= oldpos_i.Z + 1; z++) - for(s16 x = oldpos_i.X - 1; x <= oldpos_i.X + 1; x++) + s16 min_x = (box_0.MinEdge.X / BS) - 2; + s16 min_y = (box_0.MinEdge.Y / BS) - 2; + s16 min_z = (box_0.MinEdge.Z / BS) - 2; + s16 max_x = (box_0.MaxEdge.X / BS) + 1; + s16 max_y = (box_0.MaxEdge.Y / BS) + 1; + s16 max_z = (box_0.MaxEdge.Z / BS) + 1; + for(s16 y = oldpos_i.Y + min_y; y <= oldpos_i.Y + max_y; y++) + for(s16 z = oldpos_i.Z + min_z; z <= oldpos_i.Z + max_z; z++) + for(s16 x = oldpos_i.X + min_x; x <= oldpos_i.X + max_x; x++) { try{ // Object collides into walkable nodes MapNode n = map->getNode(v3s16(x,y,z)); - if(content_features(n).walkable == false) + if(gamedef->getNodeDefManager()->get(n).walkable == false) continue; } catch(InvalidPositionException &e) @@ -175,6 +182,7 @@ collisionMoveResult collisionMoveSimple(Map *map, f32 pos_max_d, speed_f -= speed_f.dotProduct(dirs[i]) * dirs[i]; pos_f -= pos_f.dotProduct(dirs[i]) * dirs[i]; pos_f += oldpos_f.dotProduct(dirs[i]) * dirs[i]; + result.collides = true; } } @@ -183,8 +191,8 @@ collisionMoveResult collisionMoveSimple(Map *map, f32 pos_max_d, return result; } -collisionMoveResult collisionMovePrecise(Map *map, f32 pos_max_d, - const core::aabbox3d &box_0, +collisionMoveResult collisionMovePrecise(Map *map, IGameDef *gamedef, + f32 pos_max_d, const core::aabbox3d &box_0, f32 dtime, v3f &pos_f, v3f &speed_f) { collisionMoveResult final_result; @@ -225,11 +233,13 @@ collisionMoveResult collisionMovePrecise(Map *map, f32 pos_max_d, dtime_downcount = 0; } - collisionMoveResult result = collisionMoveSimple(map, pos_max_d, - box_0, dtime_part, pos_f, speed_f); + collisionMoveResult result = collisionMoveSimple(map, gamedef, + pos_max_d, box_0, dtime_part, pos_f, speed_f); if(result.touching_ground) final_result.touching_ground = true; + if(result.collides) + final_result.collides = true; } while(dtime_downcount > 0.001);