]> git.lizzy.rs Git - Crafter.git/commitdiff
Add functioning boats
authoroilboi <47129783+oilboi@users.noreply.github.com>
Wed, 19 Feb 2020 12:17:39 +0000 (07:17 -0500)
committeroilboi <47129783+oilboi@users.noreply.github.com>
Wed, 19 Feb 2020 12:17:39 +0000 (07:17 -0500)
mods/boat/init.lua
mods/mob/init.lua
todo.txt

index 4dcc1f8f287f61e84ec894e0e1aa1328d1ddae3c..a18b4df0ba23424a182f86fc555f9ff171bb4ef2 100644 (file)
@@ -4,15 +4,17 @@ minetest.register_entity("boat:boat", {
                hp_max = 1,
                physical = true,
                collide_with_objects = false,
-               collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5},
+               collisionbox = {-0.4, -0.35, -0.4, 0.4, 0.3, 0.4},
                visual = "mesh",
                mesh = "boat.obj",
                textures = {"boat.png"},
                visual_size = {x=3,y=3,z=3},
                is_visible = true,
+               automatic_face_movement_dir = 90.0,
+               automatic_face_movement_max_rotation_per_sec = 600,
        },
        
-       rider = "",
+       rider = nil,
 
 
        get_staticdata = function(self)
@@ -34,7 +36,66 @@ minetest.register_entity("boat:boat", {
                self.object:set_velocity({x = 0, y = 0, z = 0})
                self.object:set_acceleration({x = 0, y = -9.81, z = 0})
        end,
+       on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
+               local pos = self.object:getpos()
+               minetest.add_item(pos, "boat:boat")
+               self.object:remove()
+       end,
+       
+       
+       on_rightclick = function(self,clicker)
+               if not clicker or not clicker:is_player() then
+                       return
+               end
+               local player_name = clicker:get_player_name()
+               
+               if self.rider and player_name == self.rider then
+                       clicker:set_detach()
+                       self.rider = nil
+               elseif not self.rider then
+                       self.rider = player_name
+                       clicker:set_attach(self.object, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0})
+                       --player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0})
+                       --carts:manage_attachment(clicker, self.object)
+
+                       -- player_api does not update the animation
+                       -- when the player is attached, reset to default animation
+                       
+                       --player_api.set_animation(clicker, "stand")
+               end
+       end,
+       --check if the boat is stuck on land
+       check_if_on_land = function(self)
+               local pos = self.object:getpos()
+               pos.y = pos.y - 0.37
+               local bottom_node = minetest.get_node(pos).name
+               if (bottom_node == "main:water" or bottom_node == "main:waterflow" or bottom_node == "air") then
+                       self.on_land = false
+               else
+                       self.on_land = true
+               end
+       
+       end,
        
+       --players drive the baot
+       drive = function(self)
+               if self.rider and not self.on_land == true then
+                       local rider = minetest.get_player_by_name(self.rider)
+                       local move = rider:get_player_control().up
+                       self.moving = nil
+                       if move then
+                               local currentvel = self.object:getvelocity()
+                               local goal = rider:get_look_dir()
+                               goal = vector.multiply(goal,9)
+                               local acceleration = vector.new(goal.x-currentvel.x,0,goal.z-currentvel.z)
+                               acceleration = vector.multiply(acceleration, 0.01)
+                               self.object:add_velocity(acceleration)
+                               self.moving = true
+                       end
+               else
+                       self.moving = nil
+               end
+       end,
        
        --players push boat
        push = function(self)
@@ -46,18 +107,12 @@ minetest.register_entity("boat:boat", {
                                player_pos.y = 0
                                
                                local currentvel = self.object:getvelocity()
-                               
                                local vel = vector.subtract(pos, player_pos)
                                vel = vector.normalize(vel)
                                local distance = vector.distance(pos,player_pos)
-                               
                                distance = (1-distance)*10
-                               
                                vel = vector.multiply(vel,distance)
-                               
-                               
                                local acceleration = vector.new(vel.x-currentvel.x,0,vel.z-currentvel.z)
-                               
                                self.object:add_velocity(acceleration)  
                        end
                end
@@ -67,32 +122,71 @@ minetest.register_entity("boat:boat", {
        float = function(self)
                local pos = self.object:getpos()
                local node = minetest.get_node(pos).name
-               local vel = self.object:getvelocity()
-               local goal = 1
-               local acceleration = vector.new(0,goal-vel.y,0)
                self.swimming = false
                
+               --flow normally if floating else don't
                if node == "main:water" or node =="main:waterflow" then
-                       print("float man")
                        self.swimming = true
+                       local vel = self.object:getvelocity()
+                       local goal = 3
+                       local acceleration = vector.new(0,goal-vel.y,0)
                        self.object:add_velocity(acceleration)
                end
        end,
        
+       --makes boats flow
+       flow = function(self)
+               local pos = self.object:getpos()
+               pos.y = pos.y - 0.37
+               local node = minetest.get_node(pos).name
+               local goalx = 0
+               local goalz = 0
+               if (node == "main:waterflow" or node == "main:water" ) and not self.moving == true and not self.on_land == true then
+                       local currentvel = self.object:getvelocity()
+                       local level = minetest.get_node_level(pos)
+                       local pos = self.object:getpos()
+                       for x = -1,1 do
+                               for y = -1,0 do
+                                       for z = -1,1 do
+                                               if (x == 0 and z ~= 0) or (z == 0 and x ~=0) then
+                                                       local nodename = minetest.get_node(vector.new(pos.x+x,pos.y+y,pos.z+z)).name
+                                                       local level2 = minetest.get_node_level(vector.new(pos.x+x,pos.y+y,pos.z+z))
+                                                       print(node)
+                                                       if (level2 < level and nodename == "main:waterflow") or (nodename == "main:water" and level2 == 7)  then
+                                                               goalx = x*5
+                                                               goalz = z*5
+                                                               --break
+                                                       end
+                                               end
+                                       end
+                               end
+                       end
+                       --only add velocity if there is one
+                       --else this stops the boat
+                       if goalx ~= 0 or goalz ~= 0 then
+                               local acceleration = vector.new(goalx-currentvel.x,0,goalz-currentvel.z)
+                               acceleration = vector.multiply(acceleration, 0.01)
+                               self.object:add_velocity(acceleration)
+                       end
+               end
+       end,
+       
        
        --slows the boat down
        slowdown = function(self)
-               local vel = self.object:getvelocity()
-               local deceleration = vector.multiply(vel, -0.01)
-               self.object:add_velocity(deceleration)
-               
-       
-       
+               if not self.moving == true then
+                       local vel = self.object:getvelocity()
+                       local deceleration = vector.multiply(vel, -0.01)
+                       self.object:add_velocity(deceleration)
+               end
        end,
 
        on_step = function(self, dtime)
+               self.check_if_on_land(self)
                self.push(self)
+               self.drive(self)
                self.float(self)
+               self.flow(self)
                self.slowdown(self)
        end,
 })
index 3e8f035cbe2638b84b6aab54d3c2c556ad28ac8f..ede03d8119e4937418f97ac54143ba5f150159b6 100644 (file)
@@ -151,14 +151,14 @@ minetest.register_entity("mob:pig", {
        --makes the mob swim
        swim = function(self)
                local pos = self.object:getpos()
-               pos.y = pos.y + 0.4
+               pos.y = pos.y + 0.7
                local node = minetest.get_node(pos).name
                local vel = self.object:getvelocity()
-               local goal = 1
+               local goal = 3
                local acceleration = vector.new(0,goal-vel.y,0)
                self.swimming = false
                
-               if node == ("main:water" or "main:waterflow") then
+               if node == "main:water" or node =="main:waterflow" then
                        self.swimming = true
                        self.object:add_velocity(acceleration)
                end
index 3acddf3f2d2c238193960e3a442747d44c74f833..df93d812fdd943bb6658420516b9437b28735141 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -34,6 +34,8 @@ shiftclick with tool tries to place torch
 make tnt hurt player
 right click with tool places torch
 if placed last node put another stack into hand
+add a function to set a velocity goal to entities and then implement it with all entities
+^make a value if below then stop?
 
 
 open bugs: