summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Stolberg <joe.stolberg@gmx.de>2017-09-24 12:20:43 +0200
committerJoachim Stolberg <joe.stolberg@gmx.de>2017-09-24 12:20:43 +0200
commita12eff34d2c287fa6a12c6499ddf6ca2b28374f6 (patch)
treeb39124a9ee817189fc69dbc00782f12526e7daaf
parent0377480edd8f5c2bcfa45b332d6597f4a8b2f692 (diff)
Switched from entity model to real fly privs
-rw-r--r--README.md16
-rw-r--r--config.lua3
-rw-r--r--description.txt2
-rw-r--r--init.lua71
-rw-r--r--settingtypes.txt3
-rw-r--r--sounds/crane.oggbin0 -> 12234 bytes
-rw-r--r--towercrane640.pngbin358082 -> 349458 bytes
7 files changed, 49 insertions, 46 deletions
diff --git a/README.md b/README.md
index 624d936..bca8d3d 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-# Tower Crane Mod V0.10
-In order to simplify the construction of buildings, the crane forms a construction area in which the player can fly (similar to fly privs).
+# Tower Crane Mod V0.12
+In order to simplify the construction of buildings, the crane forms a construction area in which the player gets fly privs.
Browse on: ![GitHub](https://github.com/joe7575/Minetest-Towercrane)
@@ -21,17 +21,7 @@ The owner of the crane gets automatically area protection over the complete cons
If there is not enough free space for the crane mast/arm or the potential construction area of the
crane intersects a protected area from another player, the crane will not be build.
-* Right-click the crane switch block to place the hook in front of the crane mast
-
-* Enter the hook by right-clicking the hook
-
-* "Fly" within the working area (height, width) by means of the (default) controls
- - Move mouse: Look around
- - W, A, S, D: Move
- - Space: move up
- - Shift: move down
-
-* Leave the hook by right-clicking the hook or right-clicking the crane switch node
+* Right-click the crane switch block to switch to fly privs. The player will be placed in front of the crane.
* To remove the crane, destroy the base block.
**Hint:** The protection area of the crane will also be removed.
diff --git a/config.lua b/config.lua
index df561da..db5aabb 100644
--- a/config.lua
+++ b/config.lua
@@ -7,8 +7,5 @@ towercrane.max_width = tonumber(minetest.setting_get("towercrane_max_width")) or
-- Crane rope lenght in block (max_height .. max_height+x)
towercrane.rope_length = tonumber(minetest.setting_get("towercrane_rope_length")) or 24
--- Gain factor for the crane sound (0.0 to 1)
-towercrane.gain = tonumber(minetest.setting_get("towercrane_gain")) or 1
-
-- Recipe available (true/false)
towercrane.recipe = tonumber(minetest.setting_get("towercrane_recipe")) or true
diff --git a/description.txt b/description.txt
index 1105d2a..fdbc291 100644
--- a/description.txt
+++ b/description.txt
@@ -1 +1 @@
-To simplify the construction of buildings, the crane forms a working area, in which the player can fly.
+To simplify the construction of buildings, the crane forms a working area, in which the player gets fly privs.
diff --git a/init.lua b/init.lua
index 4dbfd6c..c52c7f9 100644
--- a/init.lua
+++ b/init.lua
@@ -3,7 +3,7 @@
Tower Crane Mod
===============
- v0.11 by JoSt
+ v0.12 by JoSt
Copyright (C) 2017 Joachim Stolberg
LGPLv2.1+
@@ -102,31 +102,27 @@ end
--## Tower Crane Hook (player)
--##################################################################################################
--- give/take player fly privs
+-- give/take player the necessary privs/physics
local function fly_privs(player, enable)
local privs = minetest.get_player_privs(player:get_player_name())
local physics = player:get_physics_override()
if privs then
+ print("vorher", minetest.privs_to_string(privs))
if enable == true then
- if privs["fast"] then
- player:set_attribute("store_fast", "1")
- else
- player:set_attribute("store_fast", "0")
- end
+ player:set_attribute("store_fast", minetest.serialize(privs["fast"]))
+ player:set_attribute("store_fly", minetest.serialize(privs["fly"]))
+ player:set_attribute("store_speed", minetest.serialize(physics.speed))
privs["fly"] = true
privs["fast"] = nil
physics.speed = 0.5
else
- privs["fly"] = nil
- if player:get_attribute("store_fast") == "1" then
- privs["fast"] = true
- else
- privs["fast"] = nil
- end
- physics.speed = 1
+ privs["fast"] = minetest.deserialize(player:get_attribute("store_fast"))
+ privs["fly"] = minetest.deserialize(player:get_attribute("store_fly"))
+ physics.speed = minetest.deserialize(player:get_attribute("store_speed"))
end
player:set_physics_override(physics)
minetest.set_player_privs(player:get_player_name(), privs)
+ print("nachher", minetest.privs_to_string(privs))
end
end
@@ -146,10 +142,17 @@ local function control_player(pos, pos1, pos2, player)
if pl_pos.z < pos1.z then pl_pos.z = pos1.z; correction = true end
if pl_pos.z > pos2.z then pl_pos.z = pos2.z; correction = true end
if correction == true then
- player:setpos(pl_pos)
+ if minetest.get_node(pl_pos).name == "air" then
+ player:setpos(pl_pos)
+ else
+ local last_pos = minetest.string_to_pos(meta:get_string("last_known_pos"))
+ player:setpos(last_pos)
+ end
+ else -- store last known correct position
+ meta:set_string("last_known_pos", minetest.pos_to_string(pl_pos))
end
- minetest.after(2, control_player, pos, pos1, pos2, player)
+ minetest.after(1, control_player, pos, pos1, pos2, player)
end
end
else
@@ -169,10 +172,11 @@ local function place_hook(pos, dir, player, pos1, pos2)
pos.x = pos.x + dir.x
pos.z = pos.z + dir.z
player:setpos(pos)
+ meta:set_string("last_known_pos", minetest.pos_to_string(pos))
-- set privs
fly_privs(player, true)
- -- control player every 2 sec.
- minetest.after(2, control_player, switch_pos, pos1, pos2, player)
+ -- control player every second
+ minetest.after(1, control_player, switch_pos, pos1, pos2, player)
end
end
@@ -242,7 +246,7 @@ end
----------------------------------------------------------------------------------------------------
local function check_space(pos, dir, height, width)
local remove = function(pos, node_name, tArg)
- if minetest.get_node_or_nil(pos).name ~= "air" then
+ if minetest.get_node(pos).name ~= "air" then
tArg.res = false
end
end
@@ -276,8 +280,8 @@ end
----------------------------------------------------------------------------------------------------
local function remove_crane(pos, dir, height, width)
local remove = function(pos, node_name, tArg)
- if minetest.get_node_or_nil(pos).name == node_name or
- minetest.get_node_or_nil(pos).name == "towercrane:mast_ctrl_on" then
+ if minetest.get_node(pos).name == node_name or
+ minetest.get_node(pos).name == "towercrane:mast_ctrl_on" then
minetest.remove_node(pos)
end
end
@@ -398,10 +402,17 @@ minetest.register_node("towercrane:base", {
-- evaluate user input (height, width), destroyed old crane and build a new one with
-- the given size
on_receive_fields = function(pos, formname, fields, player)
+ local switch_pos = {x=pos.x, y=pos.y+1, z=pos.z}
if fields.size == nil then
return
end
- local meta = minetest.get_meta(pos)
+ local meta = minetest.get_meta(switch_pos)
+ local running = meta:get_int("running")
+ if running == 1 then
+ return
+ end
+
+ meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
local dir = minetest.string_to_pos(meta:get_string("dir"))
local height = meta:get_int("height")
@@ -418,7 +429,7 @@ minetest.register_node("towercrane:base", {
if dir ~= nil and height ~= nil and width ~= nil then
remove_crane_data(pos)
remove_area(id, owner)
- --remove_crane(table.copy(pos), dir, height, width)
+ remove_crane(table.copy(pos), dir, height, width)
remove_hook(pos, player)
end
@@ -446,16 +457,24 @@ minetest.register_node("towercrane:base", {
else
chat(owner, "Too less distance to your other crane(s)!")
end
+ else
+ chat(owner, "Invalid input!")
end
end,
can_dig = function(pos, player)
+ local switch_pos = {x=pos.x, y=pos.y+1, z=pos.z}
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
- if player:get_player_name() == owner then
- return true
+ if player:get_player_name() ~= owner then
+ return false
+ end
+ meta = minetest.get_meta(switch_pos)
+ local running = meta:get_int("running")
+ if running == 1 then
+ return false
end
- return false
+ return true
end,
-- remove mast and arm if base gets destroyed
diff --git a/settingtypes.txt b/settingtypes.txt
index 678d7ea..287688b 100644
--- a/settingtypes.txt
+++ b/settingtypes.txt
@@ -9,9 +9,6 @@ towercrane_max_width (maximum crane width) int 24
# can be placed on buildings and the hook still reaches the ground.
towercrane_rope_length (crane rope lenght) int 24
-# Gain factor for the crane sound (0.0 to 1)
-towercrane_gain (sound gain factor) float 1
-
# Recipe available (true/false)
towercrane_recipe (recipe available) bool true
diff --git a/sounds/crane.ogg b/sounds/crane.ogg
new file mode 100644
index 0000000..a042f52
--- /dev/null
+++ b/sounds/crane.ogg
Binary files differ
diff --git a/towercrane640.png b/towercrane640.png
index f38d9db..e2f2733 100644
--- a/towercrane640.png
+++ b/towercrane640.png
Binary files differ