bool is_position_valid;
MapNode n = map->getNodeNoEx(p, &is_position_valid);
- if (is_position_valid) {
+ if (is_position_valid && n.getContent() != CONTENT_IGNORE) {
// Object collides into walkable nodes
any_position_valid = true;
false, n_bouncy_value, p, box));
}
} else {
- // Collide with unloaded nodes
+ // Collide with unloaded nodes (position invalid) and loaded
+ // CONTENT_IGNORE nodes (position valid)
aabb3f box = getNodeBox(p, BS);
cinfo.push_back(NearbyCollisionInfo(true, false, 0, p, box));
}
// Do not move if world has not loaded yet, since custom node boxes
// are not available for collision detection.
+ // This also intentionally occurs in the case of the object being positioned
+ // solely on loaded CONTENT_IGNORE nodes, no matter where they come from.
if (!any_position_valid) {
*speed_f = v3f(0, 0, 0);
return result;