X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mods%2Fmob%2Fapi%2Fhead_code.lua;h=4211fb9b4d9f2ed0f66f24f1ca8475a0f7478e89;hb=8c43777302e522f551edb77b7e6576ef219ac7ff;hp=edd6d4b10d8879929b5cb39a4165fb00cb142b44;hpb=274aa90ba2057fe926b112e4eceef556b72f7601;p=Crafter.git diff --git a/mods/mob/api/head_code.lua b/mods/mob/api/head_code.lua index edd6d4b..4211fb9 100644 --- a/mods/mob/api/head_code.lua +++ b/mods/mob/api/head_code.lua @@ -1,45 +1,56 @@ +local +minetest,math,vector += +minetest,math,vector + +--converts the degrees to radians +local degrees_to_radians = function(degrees) + --print(d) + return(degrees/180.0*math.pi) +end + +--converts yaw to degrees +local degrees = function(yaw) + return(yaw*180.0/math.pi) +end + +--rounds it up to an integer +local degree_round = function(degree) + return(degree + 0.5 - (degree + 0.5) % 1) +end +--turns radians into degrees - not redundant +--doesn't add math.pi +local radians_to_degrees = function(radians) + return(radians*180.0/math.pi) +end + +--make sure this is redefined as shown below aka +--don't run mob_rotation_degree_to_radians(rotation) +--run local radians = mob_rotation_degree_to_radians(rotation) +--or the mobs head rotation will become overwritten +local head_rotation_to_radians = function(rotation) + return{ + x = 0, --roll should never be changed + y = degrees_to_radians(180 - rotation.y)*-1, + z = degrees_to_radians(90 - rotation.z) + } +end + -- -mobs.create_head_functions = function(def,mob_register) - --converts the degrees to radians - local degrees_to_radians = function(degrees) - --print(d) - return(degrees/180.0*math.pi) - end - - --converts yaw to degrees - local degrees = function(yaw) - return(yaw*180.0/math.pi) - end - - --rounds it up to an integer - local degree_round = function(degree) - return(degree + 0.5 - (degree + 0.5) % 1) - end - --turns radians into degrees - not redundant - --doesn't add math.pi - local radians_to_degrees = function(radians) - return(radians*180.0/math.pi) - end - - - --make sure this is redefined as shown below aka - --don't run mob_rotation_degree_to_radians(rotation) - --run local radians = mob_rotation_degree_to_radians(rotation) - --or the mobs head rotation will become overwritten - local head_rotation_to_radians = function(rotation) - return{ - x = 0, --roll should never be changed - y = degrees_to_radians(180 - rotation.y)*-1, - z = degrees_to_radians(90 - rotation.z) - } - end - + +local pos +local body_yaw +local head_yaw +local dir +local head_position +local head_rotation +mobs.create_head_functions = function(def,mob_register) --a movement test to move the head mob_register.move_head = function(self,pos2,dtime) if self.head_bone then if self.head_coord == "horizontal" then --print(self.head_bone) - local head_position,head_rotation = self.object:get_bone_position(self.head_bone) + head_position,head_rotation = self.object:get_bone_position(self.head_bone) --[[ debug if rotation then --print("--------------------------------") @@ -58,59 +69,63 @@ mobs.create_head_functions = function(def,mob_register) self.object:set_bone_position(self.head_bone, head_position, rotation) end ]]-- - - --print(self.head_rotation.y) + --if passed a direction to look - local pos = self.object:get_pos() - local body_yaw = self.object:get_yaw() + pos = self.object:get_pos() + body_yaw = self.object:get_yaw()-math.pi/2+self.rotational_correction + + dir = vector.multiply(minetest.yaw_to_dir(body_yaw),self.head_directional_offset) - if not body_yaw then - return - end - - local dir = vector.multiply(minetest.yaw_to_dir(body_yaw+self.head_rotation_offset),self.head_directional_offset) - - local body_yaw = minetest.dir_to_yaw(dir) + body_yaw = minetest.dir_to_yaw(dir) --pos is where the head actually is pos = vector.add(pos,dir) pos.y = pos.y + self.head_height_offset --use this to literally look around - self.head_pos = pos + --self.head_pos = pos - if self.debug_head_pos == true then - minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = 0.2, - size = 1, - texture = "dirt.png", - }) - end + --if self.debug_head_pos == true then + -- minetest.add_particle({ + -- pos = pos, + -- velocity = {x=0, y=0, z=0}, + -- acceleration = {x=0, y=0, z=0}, + -- expirationtime = 0.2, + -- size = 1, + -- texture = "dirt.png", + -- }) + --end --if the function was given a pos if pos2 then --compare the head yaw to the body - - local head_yaw = minetest.dir_to_yaw(vector.direction(pos,pos2)) - - local goal_yaw = body_yaw-head_yaw - - print(goal_yaw) - + --we must do a bunch of calculations to correct + --strange function returns + --for some reason get_yaw is offset 90 degrees + head_yaw = minetest.dir_to_yaw(vector.direction(pos,pos2)) + head_yaw = minetest.dir_to_yaw(minetest.yaw_to_dir(head_yaw)) + head_yaw = degrees(head_yaw)-degrees(body_yaw) + + if head_yaw < -180 then + head_yaw = head_yaw + 360 + elseif head_yaw > 180 then + head_yaw = head_yaw - 360 + end + --if within range then do calculations - if goal_yaw <= math.pi/2 and goal_yaw >= -math.pi/2 then + if head_yaw >= -90 and head_yaw <= 90 then ---begin pitch calculation --feed a 2D coordinate flipped into dir to yaw to calculate pitch head_rotation.x = degrees(minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)),0,pos.y-pos2.y))+(math.pi/2)) - head_rotation.z = degrees(-goal_yaw) + if self.flip_pitch then + head_rotation.x = head_rotation.x * -1 + end + head_rotation.z = head_yaw self.object:set_bone_position(self.head_bone, head_position, head_rotation) return(true) --nothing to look at - else--dofile(path.."movement.lua") + else self.return_head_to_origin(self,dtime) return(false) end @@ -120,92 +135,86 @@ mobs.create_head_functions = function(def,mob_register) self.return_head_to_origin(self,dtime) return(false) end - --[[ + elseif self.head_coord == "vertical" then - --print(self.head_bone) - local head_position,head_rotation = self.object:get_bone_position(self.head_bone) - - -- debug - if head_rotation then - print("test") + head_position,head_rotation = self.object:get_bone_position(self.head_bone) + --[[ debug + if rotation then --print("--------------------------------") - --head_rotation.x = head_rotation.x + 1 - head_rotation.y = head_rotation.y + 1 - head_rotation.z = 0 + --rotation.x = rotation.x + 1 + rotation.z = rotation.z + 1 + rotation.y = 0 - if head_rotation.x > 90 then - head_rotation.x = -90 - end - if head_rotation.z > 90 then - head_rotation.z = -90 + if rotation.x > 90 then + rotation.x = -90 end - if head_rotation.y > 90 then - head_rotation.y = -90 + if rotation.z > 90 then + rotation.z = -90 end --print(rotation.x) - self.object:set_bone_position(self.head_bone, head_position, head_rotation) + self.object:set_bone_position(self.head_bone, head_position, rotation) end - + ]]-- --print(self.head_rotation.y) --if passed a direction to look + pos = self.object:get_pos() + body_yaw = self.object:get_yaw()-math.pi/2+self.rotational_correction + + dir = vector.multiply(minetest.yaw_to_dir(body_yaw),self.head_directional_offset) - local pos = self.object:get_pos() - local body_yaw = self.object:get_yaw() - if not body_yaw then - return - end - - local dir = vector.multiply(minetest.yaw_to_dir(body_yaw+self.head_rotation_offset),self.head_directional_offset) - - local body_yaw = minetest.dir_to_yaw(dir) + body_yaw = minetest.dir_to_yaw(dir) --pos is where the head actually is pos = vector.add(pos,dir) pos.y = pos.y + self.head_height_offset --use this to literally look around - self.head_pos = pos + --self.head_pos = pos - if self.debug_head_pos == true then - minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = 0.2, - size = 1, - texture = "dirt.png", - }) - end + --if self.debug_head_pos == true then + -- minetest.add_particle({ + -- pos = pos, + -- velocity = {x=0, y=0, z=0}, + -- acceleration = {x=0, y=0, z=0}, + -- expirationtime = 0.2, + -- size = 1, + -- texture = "dirt.png", + -- }) + --end --if the function was given a pos if pos2 then --compare the head yaw to the body - local head_yaw = minetest.dir_to_yaw(vector.direction(pos,pos2)) - - local goal_yaw = body_yaw-head_yaw - - if goal_yaw < -math.pi then - goal_yaw = goal_yaw + math.pi - elseif goal_yaw > math.pi then - goal_yaw = goal_yaw - math.pi + --we must do a bunch of calculations to correct + --strange function returns + --for some reason get_yaw is offset 90 degrees + head_yaw = minetest.dir_to_yaw(vector.direction(pos,pos2)) + head_yaw = minetest.dir_to_yaw(minetest.yaw_to_dir(head_yaw)) + head_yaw = degrees(head_yaw)-degrees(body_yaw) + + if head_yaw < -180 then + head_yaw = head_yaw + 360 + elseif head_yaw > 180 then + head_yaw = head_yaw - 360 end - - print("goal_yaw="..goal_yaw,"body_yaw="..body_yaw,"head_yaw="..head_yaw) - + --if within range then do calculations - if goal_yaw <= math.pi/2 and goal_yaw >= -math.pi/2 then + if head_yaw >= -90 and head_yaw <= 90 then ---begin pitch calculation --feed a 2D coordinate flipped into dir to yaw to calculate pitch head_rotation.x = degrees(minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)),0,pos.y-pos2.y))+(math.pi/2)) - head_rotation.y = degrees(goal_yaw) + if self.flip_pitch then + head_rotation.x = head_rotation.x * -1 + end + head_rotation.y = -head_yaw self.object:set_bone_position(self.head_bone, head_position, head_rotation) return(true) --nothing to look at - else--dofile(path.."movement.lua") + else self.return_head_to_origin(self,dtime) return(false) end @@ -215,7 +224,6 @@ mobs.create_head_functions = function(def,mob_register) self.return_head_to_origin(self,dtime) return(false) end - ]]-- end end end @@ -224,7 +232,7 @@ mobs.create_head_functions = function(def,mob_register) --this sets the mob to move it's head back to pointing forwards mob_register.return_head_to_origin = function(self,dtime) - local head_position,head_rotation = self.object:get_bone_position(self.head_bone) + head_position,head_rotation = self.object:get_bone_position(self.head_bone) if self.head_coord == "horizontal" then --make the head yaw move back