]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/boat/init.lua
remove server debug
[Crafter.git] / mods / boat / init.lua
index 29157d395d37f24c9c0904c7f2ef0343838650bb..62d8169912d539fc221569bb8e43799215fa571f 100644 (file)
@@ -1,3 +1,61 @@
+
+local
+minetest,vector,math,pairs
+=
+minetest,vector,math,pairs
+
+local name
+local pos
+local node
+local node_above
+local goalx
+local goalz
+local currentvel
+local level
+local level2
+local nodename
+local acceleration
+
+local function lavaflow(self)  
+       pos = self.object:get_pos()
+       pos.y = pos.y + self.object:get_properties().collisionbox[2]
+       pos = vector.round(pos)
+       node = minetest.get_node(pos).name
+       node_above = minetest.get_node(vector.new(pos.x,pos.y+1,pos.z)).name
+       goalx = 0
+       goalz = 0
+       found = false
+       if node == "main:lavaflow" then
+               currentvel = self.object:get_velocity()
+               level = minetest.get_node_level(pos)
+               for x = -1,1 do
+                       for z = -1,1 do
+                               if found == false then
+                                       nodename = minetest.get_node(vector.new(pos.x+x,pos.y,pos.z+z)).name
+                                       level2 = minetest.get_node_level(vector.new(pos.x+x,pos.y,pos.z+z))
+                                       if level2 > level and nodename == "main:lavaflow" or nodename == "main:lava" then
+                                               goalx = -x
+                                               goalz = -z
+                                               --diagonal flow
+                                               if goalx ~= 0 and goalz ~= 0 then
+                                                       found = true
+                                               end
+                                       end
+                               end
+                       end
+               end
+               --only add velocity if there is one
+               --else this stops the player
+               if goalx ~= 0 and goalz ~= 0 then
+                       acceleration = vector.new(goalx-currentvel.x,0,goalz-currentvel.z)
+                       self.object:add_velocity(acceleration)
+               elseif goalx ~= 0 or goalz ~= 0 then
+                       acceleration = vector.new(goalx-currentvel.x,0,goalz-currentvel.z)
+                       self.object:add_velocity(acceleration)
+               end
+       end
+end
+
 --minetest.get_node_level(pos)
 minetest.register_entity("boat:boat", {
        initial_properties = {
@@ -83,14 +141,19 @@ minetest.register_entity("boat:boat", {
        
        --players drive the baot
        drive = function(self)
-               if self.rider and not self.on_land == true then
+               if self.rider 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:get_velocity()
                                local goal = rider:get_look_dir()
-                               goal = vector.multiply(goal,20)
+                               if self.on_land == true then
+                                       goal = vector.multiply(goal,1)
+                               else
+                                       goal = vector.multiply(goal,20)
+                               end
                                local acceleration = vector.new(goal.x-currentvel.x,0,goal.z-currentvel.z)
                                acceleration = vector.multiply(acceleration, 0.01)
                                self.object:add_velocity(acceleration)
@@ -132,6 +195,7 @@ minetest.register_entity("boat:boat", {
                
                --flow normally if floating else don't
                if node == "main:water" or node =="main:waterflow" then
+                       self.object:set_acceleration(vector.new(0,0,0))
                        self.swimming = true
                        local vel = self.object:get_velocity()
                        local goal = 9
@@ -140,50 +204,7 @@ minetest.register_entity("boat:boat", {
                        self.object:add_velocity(acceleration)
                        --self.object:set_acceleration(vector.new(0,0,0))
                else
-                       local vel = self.object:get_velocity()
-                       local goal = -9.81
-                       local acceleration = vector.new(0,goal-vel.y,0)
-                       acceleration = vector.multiply(acceleration, 0.01)
-                       self.object:add_velocity(acceleration)
-                       --self.object:set_acceleration(vector.new(0,0,0))
-               end
-       end,
-       
-       --makes boats flow
-       flow = function(self)
-               local pos = self.object:get_pos()
-               pos.y = pos.y - 0.4
-               local node = minetest.get_node(pos).name
-               local node_above = minetest.get_node(vector.new(pos.x,pos.y+1,pos.z)).name
-               local goalx = 0
-               local goalz = 0
-               --print(node_above)
-               if (node == "main:waterflow" or node == "main:water" ) and not self.moving == true and (node_above ~= "main:water" and node_above ~= "main:waterflow") then
-                       local currentvel = self.object:get_velocity()
-                       local level = minetest.get_node_level(pos)
-                       local pos = self.object:get_pos()
-                       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))
-                                                       if (level2 < level and nodename == "main:waterflow") or (nodename == "main:water" and level2 == 7)  then
-                                                               goalx = x*7
-                                                               goalz = z*7
-                                                               --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
+                       self.object:set_acceleration(vector.new(0,-10,0))
                end
        end,
        
@@ -202,17 +223,28 @@ minetest.register_entity("boat:boat", {
                local pos = self.object:get_pos()
                local velocity = self.object:get_velocity()
                if self.lag_check then
-                       local chugent = math.ceil(minetest.get_us_time()/1000 - self.lag_check)
+                       local chugent = minetest.get_us_time()/1000000 - self.lag_check
 
                        --print("lag = "..chugent.." ms")
-                       if chugent > 70 and  self.old_pos and self.old_velocity then
+                       if chugent > 1 and  self.old_pos and self.old_velocity then
                                self.object:move_to(self.old_pos)
                                self.object:set_velocity(self.old_velocity)
                        end
                end
                self.old_pos = pos
-               self.old_velocity = vel
-               self.lag_check = minetest.get_us_time()/1000
+               self.old_velocity = velocity
+               self.lag_check = minetest.get_us_time()/1000000
+       end,
+
+       flow = function(self)
+               local flow_dir = flow(self.object:get_pos())
+               if flow_dir then
+                       flow_dir = vector.multiply(flow_dir,10)
+                       local vel = self.object:get_velocity()
+                       local acceleration = vector.new(flow_dir.x-vel.x,flow_dir.y-vel.y,flow_dir.z-vel.z)
+                       acceleration = vector.multiply(acceleration, 0.01)
+                       self.object:add_velocity(acceleration)
+               end
        end,
 
        on_step = function(self, dtime)
@@ -243,11 +275,7 @@ minetest.register_craftitem("boat:boat", {
                        return
                end
                
-               if minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "water")>0 then
-                       minetest.add_entity(pointed_thing.under, "boat:boat")
-               else
-                       return
-               end
+               minetest.add_entity(pointed_thing.above, "boat:boat")
 
                itemstack:take_item()
 
@@ -417,45 +445,6 @@ minetest.register_entity("boat:iron_boat", {
                end
        end,
        
-       --makes boats flow
-       flow = function(self)
-               local pos = self.object:get_pos()
-               pos.y = pos.y - 0.4
-               local node = minetest.get_node(pos).name
-               local node_above = minetest.get_node(vector.new(pos.x,pos.y+1,pos.z)).name
-               local goalx = 0
-               local goalz = 0
-               --print(node_above)
-               if (node == "nether:lavaflow" or node == "nether:lava" ) and not self.moving == true and (node_above ~= "nether:lava" and node_above ~= "nether:lavaflow") then
-                       local currentvel = self.object:get_velocity()
-                       local level = minetest.get_node_level(pos)
-                       local pos = self.object:get_pos()
-                       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))
-                                                       if (level2 < level and nodename == "main:lavaflow") or (nodename == "main:lava" and level2 == 7)  then
-                                                               goalx = x*7
-                                                               goalz = z*7
-                                                               --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)
                if not self.moving == true then
@@ -470,7 +459,7 @@ minetest.register_entity("boat:iron_boat", {
                local pos = self.object:get_pos()
                local velocity = self.object:get_velocity()
                if self.lag_check then
-                       local chugent = math.ceil(minetest.get_us_time()/1000- self.lag_check)
+                       local chugent = minetest.get_us_time()/1000000- self.lag_check
 
                        --print("lag = "..chugent.." ms")
                        if chugent > 70 and  self.old_pos and self.old_velocity then
@@ -479,8 +468,8 @@ minetest.register_entity("boat:iron_boat", {
                        end
                end
                self.old_pos = pos
-               self.old_velocity = vel
-               self.lag_check = minetest.get_us_time()/1000
+               self.old_velocity = velocity
+               self.lag_check = minetest.get_us_time()/1000000
        end,
 
        on_step = function(self, dtime)
@@ -488,14 +477,14 @@ minetest.register_entity("boat:iron_boat", {
                self.push(self)
                self.drive(self)
                self.float(self)
-               self.flow(self)
+               lavaflow(self)
                self.slowdown(self)
                self.lag_correction(self,dtime)
        end,
 })
 
 minetest.register_craftitem("boat:iron_boat", {
-       description = "Iron Boat",
+       description = "Nether Iron Boat",
        inventory_image = "iron_boatitem.png",
        wield_image = "iron_boatitem.png",
        liquids_pointable = true,
@@ -511,11 +500,7 @@ minetest.register_craftitem("boat:iron_boat", {
                        return
                end
                
-               if pointed_thing.above.y < -10000 and pointed_thing.above.y > -20000 then
-                       minetest.add_entity(pointed_thing.under, "boat:iron_boat")
-               else
-                       return
-               end
+               minetest.add_entity(pointed_thing.above, "boat:iron_boat")
 
                itemstack:take_item()