forked from VoxeLibre/VoxeLibre
move set_conditionals from mcl_playerplus to mcl_util
This commit is contained in:
parent
1a6698abda
commit
68d04bc4e8
|
@ -610,3 +610,95 @@ function mcl_util.get_pointed_thing(player, liquid)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- This following part is 2 wrapper functions + helpers for
|
||||||
|
-- object:set_bones
|
||||||
|
-- and player:set_properties preventing them from being resent on
|
||||||
|
-- every globalstep when they have not changed.
|
||||||
|
|
||||||
|
local function roundN(n, d)
|
||||||
|
if type(n) ~= "number" then return n end
|
||||||
|
local m = 10^d
|
||||||
|
return math.floor(n * m + 0.5) / m
|
||||||
|
end
|
||||||
|
|
||||||
|
local function close_enough(a,b)
|
||||||
|
local rt=true
|
||||||
|
if type(a) == "table" and type(b) == "table" then
|
||||||
|
for k,v in pairs(a) do
|
||||||
|
if roundN(v,2) ~= roundN(b[k],2) then
|
||||||
|
rt=false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
rt = roundN(a,2) == roundN(b,2)
|
||||||
|
end
|
||||||
|
return rt
|
||||||
|
end
|
||||||
|
|
||||||
|
local function props_changed(props,oldprops)
|
||||||
|
local changed=false
|
||||||
|
local p={}
|
||||||
|
for k,v in pairs(props) do
|
||||||
|
if not close_enough(v,oldprops[k]) then
|
||||||
|
p[k]=v
|
||||||
|
changed=true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return changed,p
|
||||||
|
end
|
||||||
|
|
||||||
|
--tests for roundN
|
||||||
|
local test_round1=15
|
||||||
|
local test_round2=15.00199999999
|
||||||
|
local test_round3=15.00111111
|
||||||
|
local test_round4=15.00999999
|
||||||
|
|
||||||
|
assert(roundN(test_round1,2)==roundN(test_round1,2))
|
||||||
|
assert(roundN(test_round1,2)==roundN(test_round2,2))
|
||||||
|
assert(roundN(test_round1,2)==roundN(test_round3,2))
|
||||||
|
assert(roundN(test_round1,2)~=roundN(test_round4,2))
|
||||||
|
|
||||||
|
-- tests for close_enough
|
||||||
|
local test_cb = {-0.35,0,-0.35,0.35,0.8,0.35} --collisionboxes
|
||||||
|
local test_cb_close = {-0.351213,0,-0.35,0.35,0.8,0.351212}
|
||||||
|
local test_cb_diff = {-0.35,0,-1.35,0.35,0.8,0.35}
|
||||||
|
|
||||||
|
local test_eh = 1.65 --eye height
|
||||||
|
local test_eh_close = 1.65123123
|
||||||
|
local test_eh_diff = 1.35
|
||||||
|
|
||||||
|
local test_nt = { r = 225, b = 225, a = 225, g = 225 } --nametag
|
||||||
|
local test_nt_diff = { r = 225, b = 225, a = 0, g = 225 }
|
||||||
|
|
||||||
|
assert(close_enough(test_cb,test_cb_close))
|
||||||
|
assert(not close_enough(test_cb,test_cb_diff))
|
||||||
|
assert(close_enough(test_eh,test_eh_close))
|
||||||
|
assert(not close_enough(test_eh,test_eh_diff))
|
||||||
|
assert(not close_enough(test_nt,test_nt_diff)) --no floats involved here
|
||||||
|
|
||||||
|
--tests for properties_changed
|
||||||
|
local test_properties_set1={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.65, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
|
||||||
|
local test_properties_set2={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
|
||||||
|
|
||||||
|
local test_p1,_=props_changed(test_properties_set1,test_properties_set1)
|
||||||
|
local test_p2,_=props_changed(test_properties_set1,test_properties_set2)
|
||||||
|
|
||||||
|
assert(not test_p1)
|
||||||
|
assert(test_p2)
|
||||||
|
|
||||||
|
function mcl_util.set_properties(obj,props)
|
||||||
|
local changed,p=props_changed(props,obj:get_properties())
|
||||||
|
if changed then
|
||||||
|
obj:set_properties(p)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mcl_util.set_bone_position(obj,b,p,r) --bone,position,rotation
|
||||||
|
local oldp,oldr=obj:get_bone_position(b)
|
||||||
|
if vector.equals(vector.round(oldp),vector.round(p)) and vector.equals(vector.round(oldr),vector.round(r)) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
obj:set_bone_position(b,p,r)
|
||||||
|
end
|
||||||
|
|
|
@ -121,98 +121,8 @@ end
|
||||||
local node_stand, node_stand_below, node_head, node_feet, node_head_top
|
local node_stand, node_stand_below, node_head, node_feet, node_head_top
|
||||||
local is_swimming
|
local is_swimming
|
||||||
|
|
||||||
-- This following part is 2 wrapper functions for player:set_bones
|
local set_bone_position_conditional = mcl_util.set_bone_position
|
||||||
-- and player:set_properties preventing them from being resent on
|
local set_properties_conditional = mcl_util.set_properties
|
||||||
-- every globalstep when they have not changed.
|
|
||||||
|
|
||||||
local function roundN(n, d)
|
|
||||||
if type(n) ~= "number" then return n end
|
|
||||||
local m = 10^d
|
|
||||||
return math.floor(n * m + 0.5) / m
|
|
||||||
end
|
|
||||||
|
|
||||||
local function close_enough(a,b)
|
|
||||||
local rt=true
|
|
||||||
if type(a) == "table" and type(b) == "table" then
|
|
||||||
for k,v in pairs(a) do
|
|
||||||
if roundN(v,2) ~= roundN(b[k],2) then
|
|
||||||
rt=false
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
rt = roundN(a,2) == roundN(b,2)
|
|
||||||
end
|
|
||||||
return rt
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local function props_changed(props,oldprops)
|
|
||||||
local changed=false
|
|
||||||
local p={}
|
|
||||||
for k,v in pairs(props) do
|
|
||||||
if not close_enough(v,oldprops[k]) then
|
|
||||||
p[k]=v
|
|
||||||
changed=true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return changed,p
|
|
||||||
end
|
|
||||||
|
|
||||||
--tests for roundN
|
|
||||||
local test_round1=15
|
|
||||||
local test_round2=15.00199999999
|
|
||||||
local test_round3=15.00111111
|
|
||||||
local test_round4=15.00999999
|
|
||||||
|
|
||||||
assert(roundN(test_round1,2)==roundN(test_round1,2))
|
|
||||||
assert(roundN(test_round1,2)==roundN(test_round2,2))
|
|
||||||
assert(roundN(test_round1,2)==roundN(test_round3,2))
|
|
||||||
assert(roundN(test_round1,2)~=roundN(test_round4,2))
|
|
||||||
|
|
||||||
-- tests for close_enough
|
|
||||||
local test_cb = {-0.35,0,-0.35,0.35,0.8,0.35} --collisionboxes
|
|
||||||
local test_cb_close = {-0.351213,0,-0.35,0.35,0.8,0.351212}
|
|
||||||
local test_cb_diff = {-0.35,0,-1.35,0.35,0.8,0.35}
|
|
||||||
|
|
||||||
local test_eh = 1.65 --eye height
|
|
||||||
local test_eh_close = 1.65123123
|
|
||||||
local test_eh_diff = 1.35
|
|
||||||
|
|
||||||
local test_nt = { r = 225, b = 225, a = 225, g = 225 } --nametag
|
|
||||||
local test_nt_diff = { r = 225, b = 225, a = 0, g = 225 }
|
|
||||||
|
|
||||||
assert(close_enough(test_cb,test_cb_close))
|
|
||||||
assert(not close_enough(test_cb,test_cb_diff))
|
|
||||||
assert(close_enough(test_eh,test_eh_close))
|
|
||||||
assert(not close_enough(test_eh,test_eh_diff))
|
|
||||||
assert(not close_enough(test_nt,test_nt_diff)) --no floats involved here
|
|
||||||
|
|
||||||
--tests for properties_changed
|
|
||||||
local test_properties_set1={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.65, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
|
|
||||||
local test_properties_set2={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
|
|
||||||
|
|
||||||
local test_p1,_=props_changed(test_properties_set1,test_properties_set1)
|
|
||||||
local test_p2,_=props_changed(test_properties_set1,test_properties_set2)
|
|
||||||
|
|
||||||
assert(not test_p1)
|
|
||||||
assert(test_p2)
|
|
||||||
|
|
||||||
local function set_properties_conditional(player,props)
|
|
||||||
local changed,p=props_changed(props,player:get_properties())
|
|
||||||
if changed then
|
|
||||||
player:set_properties(p)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function set_bone_position_conditional(player,b,p,r) --bone,position,rotation
|
|
||||||
local oldp,oldr=player:get_bone_position(b)
|
|
||||||
if vector.equals(vector.round(oldp),vector.round(p)) and vector.equals(vector.round(oldr),vector.round(r)) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
player:set_bone_position(b,p,r)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_overall_velocity(vector)
|
local function get_overall_velocity(vector)
|
||||||
local v = math.sqrt(vector.x^2 + vector.y^2 + vector.z^2)
|
local v = math.sqrt(vector.x^2 + vector.y^2 + vector.z^2)
|
||||||
|
|
Loading…
Reference in New Issue