improve collision checking for pos_is_ok
This commit is contained in:
parent
6c2ab86640
commit
897f0c3580
@ -156,6 +156,7 @@ Changes 1.9.12
|
|||||||
-fixed drop avoidance not working if dropping to water (due to another fix)
|
-fixed drop avoidance not working if dropping to water (due to another fix)
|
||||||
-improve house spawning
|
-improve house spawning
|
||||||
-add ostrich
|
-add ostrich
|
||||||
|
-improve collision checking for pos_is_ok
|
||||||
|
|
||||||
|
|
||||||
Changes 1.9.11
|
Changes 1.9.11
|
||||||
|
@ -305,6 +305,26 @@ function environment.checksurface(pos,surface)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function environment.get_min_max_ground_dist(entity)
|
||||||
|
local min_ground_distance = 0
|
||||||
|
local max_ground_distance = 0
|
||||||
|
|
||||||
|
if entity.environment.max_height_above_ground ~= nil then
|
||||||
|
max_ground_distance = entity.environment.max_height_above_ground
|
||||||
|
end
|
||||||
|
|
||||||
|
if entity.environment.min_height_above_ground ~= nil then
|
||||||
|
min_ground_distance = entity.environment.min_height_above_ground
|
||||||
|
end
|
||||||
|
|
||||||
|
if entity.data.movement.canfly == nil or
|
||||||
|
entity.data.movement.canfly == false then
|
||||||
|
max_ground_distance = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
return min_ground_distance,max_ground_distance
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- name: pos_is_ok(pos,entity)
|
-- name: pos_is_ok(pos,entity)
|
||||||
--
|
--
|
||||||
@ -327,23 +347,9 @@ end
|
|||||||
--! -wrong_surface -@>position is above surface mob shouldn't be
|
--! -wrong_surface -@>position is above surface mob shouldn't be
|
||||||
--! -invalid -@>unable to check position
|
--! -invalid -@>unable to check position
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function environment.pos_is_ok(pos,entity)
|
function environment.old_pos_is_ok(pos,entity)
|
||||||
|
|
||||||
local min_ground_distance = 0
|
local min_ground_distance,max_ground_distance = environment.get_min_max_ground_dist(entity)
|
||||||
local max_ground_distance = 0
|
|
||||||
|
|
||||||
if entity.environment.max_height_above_ground ~= nil then
|
|
||||||
max_ground_distance = entity.environment.max_height_above_ground
|
|
||||||
end
|
|
||||||
|
|
||||||
if entity.environment.min_height_above_ground ~= nil then
|
|
||||||
min_ground_distance = entity.environment.min_height_above_ground
|
|
||||||
end
|
|
||||||
|
|
||||||
if entity.data.movement.canfly == nil or
|
|
||||||
entity.data.movement.canfly == false then
|
|
||||||
max_ground_distance = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
dbg_mobf.environment_lvl2("MOBF: Checking pos "..printpos(pos))
|
dbg_mobf.environment_lvl2("MOBF: Checking pos "..printpos(pos))
|
||||||
|
|
||||||
@ -426,6 +432,135 @@ function environment.pos_is_ok(pos,entity)
|
|||||||
|
|
||||||
return "collision"
|
return "collision"
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
-- name: pos_is_ok(pos,entity)
|
||||||
|
--
|
||||||
|
--! @brief check if a position is suitable for an mob
|
||||||
|
--! @memberof environment
|
||||||
|
--
|
||||||
|
--! @param pos position to check
|
||||||
|
--! @param entity mob to check
|
||||||
|
--! @return suitability of position for mob values:
|
||||||
|
--! -ok -@>position is ok
|
||||||
|
--! -collision -@>position is within a node
|
||||||
|
--! -collision_jumpable -@>position is within a node that can be jumped onto
|
||||||
|
--! -drop -@>position is a drop
|
||||||
|
--! -drop_above_water -@>position is to far above water
|
||||||
|
--! -above_water -@>position is right over water
|
||||||
|
--! -in_water -@>position is within a water node(source or flow)
|
||||||
|
--! -in_air -@>position is in air
|
||||||
|
--! -above_limit -@>position is above level limit
|
||||||
|
--! -below_limit -@>position is below level limit
|
||||||
|
--! -wrong_surface -@>position is above surface mob shouldn't be
|
||||||
|
--! -invalid -@>unable to check position
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
function environment.pos_is_ok(pos,entity,jumpcheck)
|
||||||
|
|
||||||
|
local min_ground_distance,max_ground_distance = environment.get_min_max_ground_dist(entity)
|
||||||
|
|
||||||
|
local cornerpositions = {}
|
||||||
|
|
||||||
|
table.insert(cornerpositions,pos)
|
||||||
|
--read positions at corners
|
||||||
|
table.insert(cornerpositions,mobf_round_pos({x=pos.x + entity.collisionbox[4],y=pos.y,z=pos.z + entity.collisionbox[6]}))
|
||||||
|
table.insert(cornerpositions,mobf_round_pos({x=pos.x + entity.collisionbox[4],y=pos.y,z=pos.z + entity.collisionbox[3]}))
|
||||||
|
table.insert(cornerpositions,mobf_round_pos({x=pos.x + entity.collisionbox[1],y=pos.y,z=pos.z + entity.collisionbox[6]}))
|
||||||
|
table.insert(cornerpositions,mobf_round_pos({x=pos.x + entity.collisionbox[1],y=pos.y,z=pos.z + entity.collisionbox[3]}))
|
||||||
|
|
||||||
|
local lastpos = nil
|
||||||
|
|
||||||
|
local retval = "temp_ok"
|
||||||
|
|
||||||
|
--check if mob at pos will be in correct environment
|
||||||
|
for i=1,#cornerpositions,1 do
|
||||||
|
if not mobf_pos_is_same(lastpos,cornerpositions[i]) then
|
||||||
|
local node_to_check = minetest.env:get_node(cornerpositions[i])
|
||||||
|
|
||||||
|
if node_to_check == nil then
|
||||||
|
mobf_bug_warning(LOGLEVEL_ERROR,"MOBF: BUG!!!! checking position with invalid node")
|
||||||
|
retval = "invalid"
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
if not environment.is_media_element(node_to_check.name,entity.environment.media) == true then
|
||||||
|
dbg_mobf.environment_lvl3("MOBF: at pos " .. printpos(cornerpositions[i]) .. " not within environment")
|
||||||
|
|
||||||
|
if mobf_pos_is_same(pos,cornerpositions[i]) then
|
||||||
|
if node_to_check.name == "default:water_source" or
|
||||||
|
node_to_check.name == "default:water_flowing" then
|
||||||
|
retval = "in_water"
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
if node_to_check.name == "air" then
|
||||||
|
retval = "in_air"
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
--TODO maybe replace by "invalid medium"
|
||||||
|
else
|
||||||
|
retval = "collision"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
lastpos = cornerpositions[i]
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
if retval == "temp_ok" then
|
||||||
|
dbg_mobf.environment_lvl2("MOBF: \tin environment")
|
||||||
|
local ground_distance = mobf_ground_distance(pos,entity.environment.media)
|
||||||
|
|
||||||
|
--following return codes are only usefull for non flying
|
||||||
|
if entity.data.movement.canfly == nil or
|
||||||
|
entity.data.movement.canfly == false then
|
||||||
|
|
||||||
|
if mobf_above_water(pos) then
|
||||||
|
|
||||||
|
if ground_distance > max_ground_distance then
|
||||||
|
dbg_mobf.environment_lvl2("MOBF: \tdropping above water")
|
||||||
|
retval = "drop_above_water"
|
||||||
|
end
|
||||||
|
dbg_mobf.environment_lvl2("MOBF: \tabove water")
|
||||||
|
retval = "above_water"
|
||||||
|
end
|
||||||
|
|
||||||
|
if ground_distance > max_ground_distance then
|
||||||
|
dbg_mobf.environment_lvl2("MOBF: \tdropping")
|
||||||
|
retval = "drop"
|
||||||
|
else
|
||||||
|
dbg_mobf.environment_lvl2("MOBF: \tsurface dependent")
|
||||||
|
retval = environment.checksurface(pos,entity.environment.surfaces)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local miny,maxy = environment.get_absolute_min_max_pos(entity.environment,pos)
|
||||||
|
if pos.y < miny then
|
||||||
|
retval = "below_limit"
|
||||||
|
end
|
||||||
|
|
||||||
|
if pos.y > maxy then
|
||||||
|
retval = "above_limit"
|
||||||
|
end
|
||||||
|
|
||||||
|
retval = environment.checksurface(pos,entity.environment.surfaces)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if retval == "collision" and jumpcheck then
|
||||||
|
if environment.extended_pos_is_ok(pos,entity,false) == "ok" then
|
||||||
|
retval = "collision_jumpable"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return retval
|
||||||
|
end
|
||||||
|
|
||||||
|
function environment.state_prio(oldstate,newstate)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
@ -857,4 +857,35 @@ function mobf_calc_vector_components(dir_radians,absolute_speed)
|
|||||||
|
|
||||||
return retval
|
return retval
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
-- name: mobf_pos_is_same(pos1,pos2)
|
||||||
|
--
|
||||||
|
--! @brief check if two positions are equal
|
||||||
|
--
|
||||||
|
--! @param pos1
|
||||||
|
--! @param pos2
|
||||||
|
--
|
||||||
|
--! @return true/false
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
function mobf_pos_is_same(pos1,pos2)
|
||||||
|
if pos1 == nil or
|
||||||
|
pos2 == nil then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if pos1.x ~= pos2.x or
|
||||||
|
pos1.y ~= pos2.y or
|
||||||
|
pos1.z ~= pos2.z or
|
||||||
|
pos1.x == nil or
|
||||||
|
pos1.y == nil or
|
||||||
|
pos1.z == nil or
|
||||||
|
pos2.x == nil or
|
||||||
|
pos2.y == nil or
|
||||||
|
pos2.z == nil then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
--!@}
|
--!@}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user