diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua index d07337379..4c3894765 100644 --- a/data/mods/default/init.lua +++ b/data/mods/default/init.lua @@ -1302,7 +1302,7 @@ minetest.register_node("default:rail", { walkable = false, selection_box = { type = "fixed", - --fixed = + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, material = minetest.digprop_dirtlike(0.75), }) diff --git a/src/activeobject.h b/src/activeobject.h index 7a5952f18..c46ae61b2 100644 --- a/src/activeobject.h +++ b/src/activeobject.h @@ -62,7 +62,6 @@ public: virtual u8 getType() const = 0; - virtual aabb3f* getCollisionBox() = 0; protected: u16 m_id; // 0 is invalid, "no id" }; diff --git a/src/collidableobject.h b/src/collidableobject.h new file mode 100644 index 000000000..d2d148118 --- /dev/null +++ b/src/collidableobject.h @@ -0,0 +1,36 @@ +/* +Minetest-c55 +Copyright (C) 2012 sapier + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +#ifndef __COLLIDABLEOBJECT_H__ +#define __COLLIDABLEOBJECT_H__ + +#include + +class CollidableObject { +public: + virtual aabb3f* getCollisionBox() = 0; + + inline float getFlexibility() { return m_Flexibility; } + inline int getWeight() { return m_Weight; } +protected: + int m_Weight; + float m_Flexibility; + aabb3f m_collisionbox; +}; + +#endif //__COLLIDABLEOBJECT_H__ diff --git a/src/collision.cpp b/src/collision.cpp index 78597ac68..6ebe55593 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "collision.h" +#include "collidableobject.h" #include "mapblock.h" #include "map.h" #include "nodedef.h" @@ -266,13 +267,18 @@ collisionMoveResult collisionMoveSimple(Environment* env, for (core::list::Iterator iter = objects.begin(); iter != objects.end(); iter++) { - aabb3f* object_collisionbox = (*iter)->getCollisionBox(); - //TODO do we need to check if it's really near enough? - if (object_collisionbox != NULL) + CollidableObject* object = dynamic_cast(*iter); + + if (object != NULL) { - cboxes.push_back(*object_collisionbox); - is_unloaded.push_back(false); - is_step_up.push_back(false); + aabb3f* object_collisionbox = object->getCollisionBox(); + //TODO do we need to check if it's really near enough? + if (object_collisionbox != NULL) + { + cboxes.push_back(*object_collisionbox); + is_unloaded.push_back(false); + is_step_up.push_back(false); + } } } } //tt3 diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 70ef3ee2c..4157cf68d 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "tile.h" #include "environment.h" #include "collision.h" +#include "collidableobject.h" #include "settings.h" #include #include @@ -1681,7 +1682,7 @@ void MobV2CAO::setLooks(const std::string &looks) #include "luaentity_common.h" -class LuaEntityCAO : public ClientActiveObject +class LuaEntityCAO : public ClientActiveObject , public CollidableObject { private: core::aabbox3d m_selection_box; @@ -1701,7 +1702,6 @@ private: int m_anim_num_frames; float m_anim_framelength; float m_anim_timer; - aabb3f m_collisionbox; public: LuaEntityCAO(IGameDef *gamedef, ClientEnvironment *env): @@ -2123,7 +2123,7 @@ LuaEntityCAO proto_LuaEntityCAO(NULL, NULL); PlayerCAO */ -class PlayerCAO : public ClientActiveObject +class PlayerCAO : public ClientActiveObject, public CollidableObject { private: core::aabbox3d m_selection_box; @@ -2137,7 +2137,6 @@ private: LocalPlayer *m_local_player; float m_damage_visual_timer; bool m_dead; - aabb3f m_collisionbox; public: PlayerCAO(IGameDef *gamedef, ClientEnvironment *env): diff --git a/src/content_sao.h b/src/content_sao.h index 6ff2a04fe..6db320ab4 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "serverobject.h" #include "content_object.h" +#include "collidableobject.h" class TestSAO : public ServerActiveObject { @@ -32,7 +33,6 @@ public: static ServerActiveObject* create(ServerEnvironment *env, v3f pos, const std::string &data); void step(float dtime, bool send_recommended); - inline aabb3f* getCollisionBox() { return NULL; } private: float m_timer1; float m_age; @@ -52,7 +52,6 @@ public: ItemStack createItemStack(); void punch(ServerActiveObject *puncher, float time_from_last_punch); float getMinimumSavedMovement(){ return 0.1*BS; } - inline aabb3f* getCollisionBox() { return NULL; } private: std::string m_itemstring; bool m_itemstring_changed; @@ -73,7 +72,6 @@ public: std::string getClientInitializationData(); std::string getStaticData(); void punch(ServerActiveObject *puncher, float time_from_last_punch); - inline aabb3f* getCollisionBox() { return NULL; } private: bool m_is_active; IntervalLimiter m_inactive_interval; @@ -100,7 +98,6 @@ public: std::string getStaticData(); void punch(ServerActiveObject *puncher, float time_from_last_punch); bool isPeaceful(){return false;} - inline aabb3f* getCollisionBox() { return NULL; } private: void doDamage(u16 d); @@ -129,7 +126,6 @@ public: void step(float dtime, bool send_recommended); std::string getClientInitializationData(); std::string getStaticData(); - inline aabb3f* getCollisionBox() { return NULL; } private: bool m_is_active; IntervalLimiter m_inactive_interval; @@ -160,7 +156,6 @@ public: void step(float dtime, bool send_recommended); void punch(ServerActiveObject *puncher, float time_from_last_punch); bool isPeaceful(); - inline aabb3f* getCollisionBox() { return NULL; } private: void sendPosition(); void setPropertyDefaults(); @@ -198,7 +193,7 @@ private: struct LuaEntityProperties; -class LuaEntitySAO : public ServerActiveObject +class LuaEntitySAO : public ServerActiveObject, public CollidableObject { public: LuaEntitySAO(ServerEnvironment *env, v3f pos, @@ -245,7 +240,6 @@ private: v3f m_last_sent_velocity; float m_last_sent_position_timer; float m_last_sent_move_precision; - aabb3f m_collisionbox; }; #endif diff --git a/src/game.cpp b/src/game.cpp index df41e7da5..5f7eaa8c4 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -362,15 +362,6 @@ PointedThing getPointedThing(Client *client, v3f player_position, if(!isPointableNode(n, client, liquids_pointable)) continue; - v3s16 facedirs[6] = { - v3s16(-1,0,0), - v3s16(1,0,0), - v3s16(0,-1,0), - v3s16(0,1,0), - v3s16(0,0,-1), - v3s16(0,0,1), - }; - std::vector boxes = n.getSelectionBoxes(client->ndef()); v3s16 np(x,y,z); @@ -384,52 +375,37 @@ PointedThing getPointedThing(Client *client, v3f player_position, box.MinEdge += npf; box.MaxEdge += npf; - f32 d = 0.001*BS; - aabb3f faceboxes[6] = { - // X- - aabb3f( - box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, - box.MinEdge.X+d, box.MaxEdge.Y, box.MaxEdge.Z - ), - // X+ - aabb3f( - box.MaxEdge.X-d, box.MinEdge.Y, box.MinEdge.Z, - box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z - ), - // Y- - aabb3f( - box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, - box.MaxEdge.X, box.MinEdge.Y+d, box.MaxEdge.Z - ), - // Y+ - aabb3f( - box.MinEdge.X, box.MaxEdge.Y-d, box.MinEdge.Z, - box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z - ), - // Z- - aabb3f( - box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, - box.MaxEdge.X, box.MaxEdge.Y, box.MinEdge.Z+d - ), - // Z+ - aabb3f( - box.MinEdge.X, box.MinEdge.Y, box.MaxEdge.Z-d, - box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z - ), - }; - for(u16 j=0; j<6; j++) { - v3f centerpoint = faceboxes[j].getCenter(); + v3s16 facedir = g_6dirs[j]; + aabb3f facebox = box; + + f32 d = 0.001*BS; + if(facedir.X > 0) + facebox.MinEdge.X = facebox.MaxEdge.X-d; + else if(facedir.X < 0) + facebox.MaxEdge.X = facebox.MinEdge.X+d; + else if(facedir.Y > 0) + facebox.MinEdge.Y = facebox.MaxEdge.Y-d; + else if(facedir.Y < 0) + facebox.MaxEdge.Y = facebox.MinEdge.Y+d; + else if(facedir.Z > 0) + facebox.MinEdge.Z = facebox.MaxEdge.Z-d; + else if(facedir.Z < 0) + facebox.MaxEdge.Z = facebox.MinEdge.Z+d; + + v3f centerpoint = facebox.getCenter(); f32 distance = (centerpoint - camera_position).getLength(); if(distance >= mindistance) continue; - if(!faceboxes[j].intersectsWithLine(shootline)) + if(!facebox.intersectsWithLine(shootline)) continue; + v3s16 np_above = floatToInt(centerpoint + intToFloat(facedir, d), BS); + result.type = POINTEDTHING_NODE; result.node_undersurface = np; - result.node_abovesurface = np+facedirs[j]; + result.node_abovesurface = np_above; mindistance = distance; hilightboxes.clear(); diff --git a/src/serverremoteplayer.h b/src/serverremoteplayer.h index 6de36eebc..b67ba9c7f 100644 --- a/src/serverremoteplayer.h +++ b/src/serverremoteplayer.h @@ -22,13 +22,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "player.h" #include "serverobject.h" +#include "collidableobject.h" #include "content_object.h" // Object type IDs /* Player on the server */ -class ServerRemotePlayer : public Player, public ServerActiveObject +class ServerRemotePlayer : public Player, public ServerActiveObject , public CollidableObject { public: ServerRemotePlayer(ServerEnvironment *env); @@ -96,7 +97,6 @@ public: aabb3f* getCollisionBox(); private: bool m_position_not_sent; - aabb3f m_collisionbox; }; #endif