Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Custom collision boxes node property.
  • Loading branch information
RealBadAngel committed Oct 19, 2014
1 parent b11e1db commit e5652cb
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 5 deletions.
12 changes: 10 additions & 2 deletions doc/lua_api.txt
Expand Up @@ -408,8 +408,16 @@ param2 is reserved for the engine when any of these are used:
0 = y+ 1 = z+ 2 = z- 3 = x+ 4 = x- 5 = y-
facedir's two less significant bits are rotation around the axis
paramtype2 == "leveled"
^ The drawn node level is read from param2, like flowingliquid

collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
^ defines list of collision boxes for the node. If empty, collision boxes
will be the same as nodeboxes, in case of any other nodes will be full cube
as in the example above.

Nodes can also contain extra data. See "Node Metadata".

Node drawtypes
Expand Down
2 changes: 1 addition & 1 deletion src/collision.cpp
Expand Up @@ -259,7 +259,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
continue;
int n_bouncy_value = itemgroup_get(f.groups, "bouncy");

std::vector<aabb3f> nodeboxes = n.getNodeBoxes(gamedef->ndef());
std::vector<aabb3f> nodeboxes = n.getCollisionBoxes(gamedef->ndef());
for(std::vector<aabb3f>::iterator
i = nodeboxes.begin();
i != nodeboxes.end(); i++)
Expand Down
9 changes: 9 additions & 0 deletions src/mapnode.cpp
Expand Up @@ -354,6 +354,15 @@ std::vector<aabb3f> MapNode::getNodeBoxes(INodeDefManager *nodemgr) const
return transformNodeBox(*this, f.node_box, nodemgr);
}

std::vector<aabb3f> MapNode::getCollisionBoxes(INodeDefManager *nodemgr) const
{
const ContentFeatures &f = nodemgr->get(*this);
if (f.collision_box.fixed.empty())
return transformNodeBox(*this, f.node_box, nodemgr);
else
return transformNodeBox(*this, f.collision_box, nodemgr);
}

std::vector<aabb3f> MapNode::getSelectionBoxes(INodeDefManager *nodemgr) const
{
const ContentFeatures &f = nodemgr->get(*this);
Expand Down
8 changes: 6 additions & 2 deletions src/mapnode.h
Expand Up @@ -217,8 +217,7 @@ struct MapNode
void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot);

/*
Gets list of node boxes (used for rendering (NDT_NODEBOX)
and collision)
Gets list of node boxes (used for rendering (NDT_NODEBOX))
*/
std::vector<aabb3f> getNodeBoxes(INodeDefManager *nodemgr) const;

Expand All @@ -227,6 +226,11 @@ struct MapNode
*/
std::vector<aabb3f> getSelectionBoxes(INodeDefManager *nodemgr) const;

/*
Gets list of collision boxes
*/
std::vector<aabb3f> getCollisionBoxes(INodeDefManager *nodemgr) const;

/* Liquid helpers */
u8 getMaxLevel(INodeDefManager *nodemgr) const;
u8 getLevel(INodeDefManager *nodemgr) const;
Expand Down
3 changes: 3 additions & 0 deletions src/nodedef.cpp
Expand Up @@ -233,6 +233,7 @@ void ContentFeatures::reset()
damage_per_second = 0;
node_box = NodeBox();
selection_box = NodeBox();
collision_box = NodeBox();
waving = 0;
legacy_facedir_simple = false;
legacy_wallmounted = false;
Expand Down Expand Up @@ -303,6 +304,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
// Stuff below should be moved to correct place in a version that otherwise changes
// the protocol version
os<<serializeString(mesh);
collision_box.serialize(os, protocol_version);
}

void ContentFeatures::deSerialize(std::istream &is)
Expand Down Expand Up @@ -372,6 +374,7 @@ void ContentFeatures::deSerialize(std::istream &is)
// Stuff below should be moved to correct place in a version that
// otherwise changes the protocol version
mesh = deSerializeString(is);
collision_box.deSerialize(is);
}catch(SerializationError &e) {};
}

Expand Down
1 change: 1 addition & 0 deletions src/nodedef.h
Expand Up @@ -244,6 +244,7 @@ struct ContentFeatures
u32 damage_per_second;
NodeBox node_box;
NodeBox selection_box;
NodeBox collision_box;
// Used for waving leaves/plants
u8 waving;
// Compatibility with old maps
Expand Down
5 changes: 5 additions & 0 deletions src/script/common/c_content.cpp
Expand Up @@ -432,6 +432,11 @@ ContentFeatures read_content_features(lua_State *L, int index)
f.selection_box = read_nodebox(L, -1);
lua_pop(L, 1);

lua_getfield(L, index, "collision_box");
if(lua_istable(L, -1))
f.collision_box = read_nodebox(L, -1);
lua_pop(L, 1);

f.waving = getintfield_default(L, index,
"waving", f.waving);

Expand Down

0 comments on commit e5652cb

Please sign in to comment.