forked from VoxeLibre/VoxeLibre
put head swivel in separate function
This commit is contained in:
parent
49670d1d28
commit
18c415f6a0
|
@ -50,12 +50,6 @@ if minetest.settings:get_bool("only_peaceful_mobs", false) then
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function dir_to_pitch(dir)
|
|
||||||
--local dir2 = vector.normalize(dir)
|
|
||||||
local xz = math.abs(dir.x) + math.abs(dir.z)
|
|
||||||
return -math.atan2(-dir.y, xz)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- default nodes
|
-- default nodes
|
||||||
local node_ice = "mcl_core:ice"
|
local node_ice = "mcl_core:ice"
|
||||||
local node_snowblock = "mcl_core:snowblock"
|
local node_snowblock = "mcl_core:snowblock"
|
||||||
|
@ -525,78 +519,8 @@ function mob_class:on_step(dtime)
|
||||||
self.object:set_yaw(yaw)
|
self.object:set_yaw(yaw)
|
||||||
self:update_roll()
|
self:update_roll()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- end rotation
|
-- end rotation
|
||||||
|
self:check_head_swivel()
|
||||||
if self.head_swivel and type(self.head_swivel) == "string" then
|
|
||||||
local final_rotation = vector.new(0,0,0)
|
|
||||||
local oldp,oldr = self.object:get_bone_position(self.head_swivel)
|
|
||||||
|
|
||||||
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 10)) do
|
|
||||||
if obj:is_player() and not self.attack or obj:get_luaentity() and obj:get_luaentity().name == self.name and self ~= obj:get_luaentity() then
|
|
||||||
if not self._locked_object then
|
|
||||||
if math.random(5000/self.curiosity) == 1 or vector.distance(pos,obj:get_pos())<4 and obj:is_player() then
|
|
||||||
self._locked_object = obj
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if math.random(10000/self.curiosity) == 1 then
|
|
||||||
self._locked_object = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if self.attack or self.following then
|
|
||||||
self._locked_object = self.attack or self.following
|
|
||||||
end
|
|
||||||
|
|
||||||
if self._locked_object and (self._locked_object:is_player() or self._locked_object:get_luaentity()) and self._locked_object:get_hp() > 0 then
|
|
||||||
local _locked_object_eye_height = 1.5
|
|
||||||
if self._locked_object:get_luaentity() then
|
|
||||||
_locked_object_eye_height = self._locked_object:get_luaentity().head_eye_height
|
|
||||||
end
|
|
||||||
if self._locked_object:is_player() then
|
|
||||||
_locked_object_eye_height = self._locked_object:get_properties().eye_height
|
|
||||||
end
|
|
||||||
if _locked_object_eye_height then
|
|
||||||
local self_rot = self.object:get_rotation()
|
|
||||||
if self.object:get_attach() then
|
|
||||||
self_rot = self.object:get_attach():get_rotation()
|
|
||||||
end
|
|
||||||
if self.rot then
|
|
||||||
local player_pos = self._locked_object:get_pos()
|
|
||||||
local direction_player = vector.direction(vector.add(self.object:get_pos(), vector.new(0, self.head_eye_height*.7, 0)), vector.add(player_pos, vector.new(0, _locked_object_eye_height, 0)))
|
|
||||||
local mob_yaw = math.deg(-(-(self_rot.y)-(-minetest.dir_to_yaw(direction_player))))+self.head_yaw_offset
|
|
||||||
local mob_pitch = math.deg(-dir_to_pitch(direction_player))*self.head_pitch_multiplier
|
|
||||||
|
|
||||||
if (mob_yaw < -60 or mob_yaw > 60) and not (self.attack and self.state == "attack" and not self.runaway) then
|
|
||||||
final_rotation = vector.multiply(oldr, 0.9)
|
|
||||||
elseif self.attack and self.state == "attack" and not self.runaway then
|
|
||||||
if self.head_yaw == "y" then
|
|
||||||
final_rotation = vector.new(mob_pitch, mob_yaw, 0)
|
|
||||||
elseif self.head_yaw == "z" then
|
|
||||||
final_rotation = vector.new(mob_pitch, 0, -mob_yaw)
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
if self.head_yaw == "y" then
|
|
||||||
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, ((mob_yaw-oldr.y)*.3)+oldr.y, 0)
|
|
||||||
elseif self.head_yaw == "z" then
|
|
||||||
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, 0, -(((mob_yaw-oldr.y)*.3)+oldr.y)*3)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elseif not self._locked_object and math.abs(oldr.y) > 3 and math.abs(oldr.x) < 3 then
|
|
||||||
final_rotation = vector.multiply(oldr, 0.9)
|
|
||||||
else
|
|
||||||
final_rotation = vector.new(0,0,0)
|
|
||||||
end
|
|
||||||
|
|
||||||
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- run custom function (defined in mob lua file)
|
-- run custom function (defined in mob lua file)
|
||||||
|
|
|
@ -273,6 +273,83 @@ function mcl_mobs:set_animation(self, anim)
|
||||||
self:set_animation(anim)
|
self:set_animation(anim)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function dir_to_pitch(dir)
|
||||||
|
--local dir2 = vector.normalize(dir)
|
||||||
|
local xz = math.abs(dir.x) + math.abs(dir.z)
|
||||||
|
return -math.atan2(-dir.y, xz)
|
||||||
|
end
|
||||||
|
|
||||||
|
function mob_class:check_head_swivel()
|
||||||
|
if self.head_swivel and type(self.head_swivel) == "string" then
|
||||||
|
local final_rotation = vector.new(0,0,0)
|
||||||
|
local oldp,oldr = self.object:get_bone_position(self.head_swivel)
|
||||||
|
|
||||||
|
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 10)) do
|
||||||
|
if obj:is_player() and not self.attack or obj:get_luaentity() and obj:get_luaentity().name == self.name and self ~= obj:get_luaentity() then
|
||||||
|
if not self._locked_object then
|
||||||
|
if math.random(5000/self.curiosity) == 1 or vector.distance(pos,obj:get_pos())<4 and obj:is_player() then
|
||||||
|
self._locked_object = obj
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if math.random(10000/self.curiosity) == 1 then
|
||||||
|
self._locked_object = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.attack or self.following then
|
||||||
|
self._locked_object = self.attack or self.following
|
||||||
|
end
|
||||||
|
|
||||||
|
if self._locked_object and (self._locked_object:is_player() or self._locked_object:get_luaentity()) and self._locked_object:get_hp() > 0 then
|
||||||
|
local _locked_object_eye_height = 1.5
|
||||||
|
if self._locked_object:get_luaentity() then
|
||||||
|
_locked_object_eye_height = self._locked_object:get_luaentity().head_eye_height
|
||||||
|
end
|
||||||
|
if self._locked_object:is_player() then
|
||||||
|
_locked_object_eye_height = self._locked_object:get_properties().eye_height
|
||||||
|
end
|
||||||
|
if _locked_object_eye_height then
|
||||||
|
local self_rot = self.object:get_rotation()
|
||||||
|
if self.object:get_attach() then
|
||||||
|
self_rot = self.object:get_attach():get_rotation()
|
||||||
|
end
|
||||||
|
if self.rot then
|
||||||
|
local player_pos = self._locked_object:get_pos()
|
||||||
|
local direction_player = vector.direction(vector.add(self.object:get_pos(), vector.new(0, self.head_eye_height*.7, 0)), vector.add(player_pos, vector.new(0, _locked_object_eye_height, 0)))
|
||||||
|
local mob_yaw = math.deg(-(-(self_rot.y)-(-minetest.dir_to_yaw(direction_player))))+self.head_yaw_offset
|
||||||
|
local mob_pitch = math.deg(-dir_to_pitch(direction_player))*self.head_pitch_multiplier
|
||||||
|
|
||||||
|
if (mob_yaw < -60 or mob_yaw > 60) and not (self.attack and self.state == "attack" and not self.runaway) then
|
||||||
|
final_rotation = vector.multiply(oldr, 0.9)
|
||||||
|
elseif self.attack and self.state == "attack" and not self.runaway then
|
||||||
|
if self.head_yaw == "y" then
|
||||||
|
final_rotation = vector.new(mob_pitch, mob_yaw, 0)
|
||||||
|
elseif self.head_yaw == "z" then
|
||||||
|
final_rotation = vector.new(mob_pitch, 0, -mob_yaw)
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if self.head_yaw == "y" then
|
||||||
|
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, ((mob_yaw-oldr.y)*.3)+oldr.y, 0)
|
||||||
|
elseif self.head_yaw == "z" then
|
||||||
|
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, 0, -(((mob_yaw-oldr.y)*.3)+oldr.y)*3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif not self._locked_object and math.abs(oldr.y) > 3 and math.abs(oldr.x) < 3 then
|
||||||
|
final_rotation = vector.multiply(oldr, 0.9)
|
||||||
|
else
|
||||||
|
final_rotation = vector.new(0,0,0)
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_on_leaveplayer(function(player)
|
minetest.register_on_leaveplayer(function(player)
|
||||||
local pn = player:get_player_name()
|
local pn = player:get_player_name()
|
||||||
if not active_particlespawners[pn] then return end
|
if not active_particlespawners[pn] then return end
|
||||||
|
|
Loading…
Reference in New Issue