]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/mob/api/head_code.lua
Make head code for mobs reuse same data
[Crafter.git] / mods / mob / api / head_code.lua
index edd6d4b10d8879929b5cb39a4165fb00cb142b44..4211fb9b4d9f2ed0f66f24f1ca8475a0f7478e89 100644 (file)
@@ -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