summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Stolberg <joe.stolberg@gmx.de>2017-06-07 22:37:41 +0200
committerJoachim Stolberg <joe.stolberg@gmx.de>2017-06-07 22:37:41 +0200
commitd3112a7445c204e46dabf12cc61a44eaace0d2e3 (patch)
tree53f52459805f5cf8efef56f839ed000942120cd6
parentfe827f0cef03b35a3b08eb266298e80619c432f1 (diff)
fixed the following issues
- stuck inside the hook bug - check for free space bug - added a recipe - added crane sound
-rw-r--r--init.lua77
1 files changed, 65 insertions, 12 deletions
diff --git a/init.lua b/init.lua
index 278d147..dca98b7 100644
--- a/init.lua
+++ b/init.lua
@@ -17,6 +17,8 @@
towercrane = {}
+dofile(minetest.get_modpath("towercrane") .. "/config.lua")
+
--##################################################################################################
--## Tower Crane Hook
--##################################################################################################
@@ -25,7 +27,7 @@ local hook = {
collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2},
collide_with_objects = false,
visual = "cube",
- visual_size = {x=0.4, y=0.4},
+ visual_size = {x=0.6, y=0.6},
textures = {
"towercrane_hook.png",
"towercrane_hook.png",
@@ -40,17 +42,27 @@ local hook = {
speed_forward=0,
speed_right=0,
speed_up=0,
+ sound=nil,
}
----------------------------------------------------------------------------------------------------
-- Enter/leave the Hook
----------------------------------------------------------------------------------------------------
function hook:on_rightclick(clicker)
+ local name = clicker:get_player_name()
if self.driver and clicker == self.driver then -- leave?
clicker:set_detach()
+ default.player_attached[name] = false
+ default.player_set_animation(clicker, "stand" , 10)
self.driver = nil
+ if self.sound ~= nil then
+ minetest.sound_stop(self.sound)
+ self.sound = nil
+ end
elseif not self.driver then -- enter?
self.driver = clicker
- clicker:set_attach(self.object, "", {x=0,y=0,z=0}, {x=0,y=0,z=0})
+ clicker:set_attach(self.object, "", {x=0,y=15,z=-3}, {x=0,y=0,z=0})
+ default.player_attached[name] = true
+ default.player_set_animation(clicker, "sit" , 10)
end
end
@@ -112,6 +124,17 @@ function hook:on_step(dtime)
if pos.z < self.pos1.z then vz= velocity end
if pos.z > self.pos2.z then vz= -velocity end
+ if vx ~= 0 or vz ~= 0 or self.speed_up ~= 0 then
+ if self.sound == nil then
+ self.sound = minetest.sound_play({name="crane"},{object=self.object,
+ gain=towercrane.gain, max_hear_distance=20,
+ loop=true})
+ end
+ elseif self.sound ~= nil then
+ minetest.sound_stop(self.sound)
+ self.sound = nil
+ end
+
self.object:setvelocity({x=vx, y=self.speed_up,z=vz})
else
self.object:setvelocity({x=0, y=0,z=0})
@@ -139,6 +162,34 @@ local function turnleft(dir)
return minetest.facedir_to_dir((facedir + 3) % 4)
end
+
+ if minetest.get_node_or_nil(pos) ~= nil then
+ return false
+ end
+
+----------------------------------------------------------------------------------------------------
+-- Check space for mast and arm
+----------------------------------------------------------------------------------------------------
+local function check_space(pos, dir, height, width)
+ for i = 1,height+2 do
+ pos.y = pos.y + 1
+ if minetest.get_node_or_nil(pos).name ~= "air" then
+ return false
+ end
+ end
+
+ pos.x = pos.x + dir.x*2
+ pos.z = pos.z + dir.z*2
+ for i = 1,width+3 do
+ pos.x = pos.x + dir.x
+ pos.z = pos.z + dir.z
+ if minetest.get_node_or_nil(pos).name ~= "air" then
+ return false
+ end
+ end
+ return true
+end
+
----------------------------------------------------------------------------------------------------
-- Constuct mast and arm
----------------------------------------------------------------------------------------------------
@@ -177,7 +228,6 @@ local function construct_crane(pos, dir, height, width, owner)
else
minetest.env:add_node(pos, {name="towercrane:arm"})
end
-
end
end
@@ -243,7 +293,7 @@ minetest.register_node("towercrane:base", {
},
paramtype2 = "facedir",
is_ground_content = false,
- groups = {cracky=3},
+ groups = {cracky=2},
formspec = set_formspec,
-- set meta data (form for crane height and width, dir of the arm)
@@ -281,7 +331,6 @@ minetest.register_node("towercrane:base", {
local dir = minetest.string_to_pos(meta:get_string("dir"))
local height = meta:get_int("height")
local width = meta:get_int("width")
- local org_pos = table.copy(pos)
if dir ~= nil and height ~= nil and width ~= nil then
dig_crane(pos, dir, height, width)
end
@@ -292,14 +341,18 @@ minetest.register_node("towercrane:base", {
local width = tonumber(size[2])
if height ~= nil and width ~= nil then
height = math.max(height, 8)
- height = math.min(height, 24)
+ height = math.min(height, towercrane.max_height)
width = math.max(width, 8)
- width = math.min(width, 24)
+ width = math.min(width, towercrane.max_width)
meta:set_int("height", height)
meta:set_int("width", width)
meta:set_string("infotext", "Crane size: " .. height .. "," .. width)
if dir ~= nil then
- construct_crane(org_pos, dir, height, width, owner)
+ if check_space(table.copy(pos), dir, height, width) then
+ construct_crane(table.copy(pos), dir, height, width, owner)
+ else
+ minetest.chat_send_player(owner, "Too less space to raise up the tower crane!")
+ end
end
end
end
@@ -447,18 +500,18 @@ minetest.register_node("towercrane:mast_ctrl_off", {
local height = meta:get_int("height")
local width = meta:get_int("width")
- -- pos1 = close/right
+ -- pos1 = close/right/below
dir = turnright(dir)
local pos1 = vector.add(pos, vector.multiply(dir, width/2))
dir = turnleft(dir)
local pos1 = vector.add(pos1, vector.multiply(dir, 1))
- pos1.y = pos.y - 1
+ pos1.y = pos.y - 2 - height
- -- pos2 = far/left
+ -- pos2 = far/left/above
local pos2 = vector.add(pos1, vector.multiply(dir, width-1))
dir = turnleft(dir)
pos2 = vector.add(pos2, vector.multiply(dir, width))
- pos2.y = pos.y - 4 + height
+ pos2.y = pos.y - 3 + height
-- normalize x/z so that pos2 > pos1
if pos2.x < pos1.x then