X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fenvironment.cpp;h=06f2b8bf9d9ad80892e13294fe11736ce1479fcf;hb=b3b075ea02034306256b486dd45410aa765f035a;hp=f9de13baac17e7009c40bb085df212fdce7cb494;hpb=fad263dec9e1fa7ae0886f768e22d8ee74e8553b;p=dragonfireclient.git diff --git a/src/environment.cpp b/src/environment.cpp index f9de13baa..06f2b8bf9 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -21,7 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "environment.h" #include "collision.h" #include "raycast.h" -#include "serverobject.h" #include "scripting_server.h" #include "server.h" #include "daynightratio.h" @@ -37,6 +36,7 @@ Environment::Environment(IGameDef *gamedef): m_cache_active_block_mgmt_interval = g_settings->getFloat("active_block_mgmt_interval"); m_cache_abm_interval = g_settings->getFloat("abm_interval"); m_cache_nodetimer_interval = g_settings->getFloat("nodetimer_interval"); + m_cache_abm_time_budget = g_settings->getFloat("abm_time_budget"); m_time_of_day = g_settings->getU32("world_start_time"); m_time_of_day_f = (float)m_time_of_day / 24000.0f; @@ -83,11 +83,29 @@ float Environment::getTimeOfDayF() return m_time_of_day_f; } +bool Environment::line_of_sight(v3f pos1, v3f pos2, v3s16 *p) +{ + // Iterate trough nodes on the line + voxalgo::VoxelLineIterator iterator(pos1 / BS, (pos2 - pos1) / BS); + do { + MapNode n = getMap().getNode(iterator.m_current_node_pos); + + // Return non-air + if (n.param0 != CONTENT_AIR) { + if (p) + *p = iterator.m_current_node_pos; + return false; + } + iterator.next(); + } while (iterator.m_current_index <= iterator.m_last_index); + return true; +} + /* Check if a node is pointable */ inline static bool isPointableNode(const MapNode &n, - INodeDefManager *nodedef , bool liquids_pointable) + const NodeDefManager *nodedef , bool liquids_pointable) { const ContentFeatures &features = nodedef->get(n); return features.pointable || @@ -96,7 +114,7 @@ inline static bool isPointableNode(const MapNode &n, void Environment::continueRaycast(RaycastState *state, PointedThing *result) { - INodeDefManager *nodedef = getMap().getNodeDefManager(); + const NodeDefManager *nodedef = getMap().getNodeDefManager(); if (state->m_initialization_needed) { // Add objects if (state->m_objects_pointable) { @@ -159,7 +177,7 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) v3s16 np(x, y, z); bool is_valid_position; - n = map.getNodeNoEx(np, &is_valid_position); + n = map.getNode(np, &is_valid_position); if (!(is_valid_position && isPointableNode(n, nodedef, state->m_liquids_pointable))) { continue; @@ -175,12 +193,12 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) bool is_colliding = false; // Minimal distance of all collisions float min_distance_sq = 10000000; + // ID of the current box (loop counter) + u16 id = 0; v3f npf = intToFloat(np, BS); - for (std::vector::const_iterator i = boxes.begin(); - i != boxes.end(); ++i) { - // Get current collision box - aabb3f box = *i; + // This loop translates the boxes to their in-world place. + for (aabb3f &box : boxes) { box.MinEdge += npf; box.MaxEdge += npf; @@ -188,8 +206,10 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) v3s16 intersection_normal; if (!boxLineCollision(box, state->m_shootline.start, state->m_shootline.getVector(), &intersection_point, - &intersection_normal)) + &intersection_normal)) { + ++id; continue; + } f32 distanceSq = (intersection_point - state->m_shootline.start).getLengthSQ(); @@ -198,9 +218,11 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) min_distance_sq = distanceSq; result.intersection_point = intersection_point; result.intersection_normal = intersection_normal; + result.box_id = id; found_boxcenter = box.getCenter(); is_colliding = true; } + ++id; } // If there wasn't a collision, stop if (!is_colliding) {