Switched from entity model to real fly privs
parent
0377480edd
commit
a12eff34d2
16
README.md
16
README.md
|
@ -1,5 +1,5 @@
|
||||||
# Tower Crane Mod V0.10
|
# Tower Crane Mod V0.12
|
||||||
In order to simplify the construction of buildings, the crane forms a construction area in which the player can fly (similar to fly privs).
|
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)
|
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
|
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.
|
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
|
* Right-click the crane switch block to switch to fly privs. The player will be placed in front of the crane.
|
||||||
|
|
||||||
* 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
|
|
||||||
|
|
||||||
* To remove the crane, destroy the base block.
|
* To remove the crane, destroy the base block.
|
||||||
**Hint:** The protection area of the crane will also be removed.
|
**Hint:** The protection area of the crane will also be removed.
|
||||||
|
|
|
@ -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)
|
-- Crane rope lenght in block (max_height .. max_height+x)
|
||||||
towercrane.rope_length = tonumber(minetest.setting_get("towercrane_rope_length")) or 24
|
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)
|
-- Recipe available (true/false)
|
||||||
towercrane.recipe = tonumber(minetest.setting_get("towercrane_recipe")) or true
|
towercrane.recipe = tonumber(minetest.setting_get("towercrane_recipe")) or true
|
||||||
|
|
|
@ -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.
|
||||||
|
|
71
init.lua
71
init.lua
|
@ -3,7 +3,7 @@
|
||||||
Tower Crane Mod
|
Tower Crane Mod
|
||||||
===============
|
===============
|
||||||
|
|
||||||
v0.11 by JoSt
|
v0.12 by JoSt
|
||||||
|
|
||||||
Copyright (C) 2017 Joachim Stolberg
|
Copyright (C) 2017 Joachim Stolberg
|
||||||
LGPLv2.1+
|
LGPLv2.1+
|
||||||
|
@ -102,31 +102,27 @@ end
|
||||||
--## Tower Crane Hook (player)
|
--## Tower Crane Hook (player)
|
||||||
--##################################################################################################
|
--##################################################################################################
|
||||||
|
|
||||||
-- give/take player fly privs
|
-- give/take player the necessary privs/physics
|
||||||
local function fly_privs(player, enable)
|
local function fly_privs(player, enable)
|
||||||
local privs = minetest.get_player_privs(player:get_player_name())
|
local privs = minetest.get_player_privs(player:get_player_name())
|
||||||
local physics = player:get_physics_override()
|
local physics = player:get_physics_override()
|
||||||
if privs then
|
if privs then
|
||||||
|
print("vorher", minetest.privs_to_string(privs))
|
||||||
if enable == true then
|
if enable == true then
|
||||||
if privs["fast"] then
|
player:set_attribute("store_fast", minetest.serialize(privs["fast"]))
|
||||||
player:set_attribute("store_fast", "1")
|
player:set_attribute("store_fly", minetest.serialize(privs["fly"]))
|
||||||
else
|
player:set_attribute("store_speed", minetest.serialize(physics.speed))
|
||||||
player:set_attribute("store_fast", "0")
|
|
||||||
end
|
|
||||||
privs["fly"] = true
|
privs["fly"] = true
|
||||||
privs["fast"] = nil
|
privs["fast"] = nil
|
||||||
physics.speed = 0.5
|
physics.speed = 0.5
|
||||||
else
|
else
|
||||||
privs["fly"] = nil
|
privs["fast"] = minetest.deserialize(player:get_attribute("store_fast"))
|
||||||
if player:get_attribute("store_fast") == "1" then
|
privs["fly"] = minetest.deserialize(player:get_attribute("store_fly"))
|
||||||
privs["fast"] = true
|
physics.speed = minetest.deserialize(player:get_attribute("store_speed"))
|
||||||
else
|
|
||||||
privs["fast"] = nil
|
|
||||||
end
|
|
||||||
physics.speed = 1
|
|
||||||
end
|
end
|
||||||
player:set_physics_override(physics)
|
player:set_physics_override(physics)
|
||||||
minetest.set_player_privs(player:get_player_name(), privs)
|
minetest.set_player_privs(player:get_player_name(), privs)
|
||||||
|
print("nachher", minetest.privs_to_string(privs))
|
||||||
end
|
end
|
||||||
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 < 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 pl_pos.z > pos2.z then pl_pos.z = pos2.z; correction = true end
|
||||||
if correction == true then
|
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
|
end
|
||||||
|
|
||||||
minetest.after(2, control_player, pos, pos1, pos2, player)
|
minetest.after(1, control_player, pos, pos1, pos2, player)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -169,10 +172,11 @@ local function place_hook(pos, dir, player, pos1, pos2)
|
||||||
pos.x = pos.x + dir.x
|
pos.x = pos.x + dir.x
|
||||||
pos.z = pos.z + dir.z
|
pos.z = pos.z + dir.z
|
||||||
player:setpos(pos)
|
player:setpos(pos)
|
||||||
|
meta:set_string("last_known_pos", minetest.pos_to_string(pos))
|
||||||
-- set privs
|
-- set privs
|
||||||
fly_privs(player, true)
|
fly_privs(player, true)
|
||||||
-- control player every 2 sec.
|
-- control player every second
|
||||||
minetest.after(2, control_player, switch_pos, pos1, pos2, player)
|
minetest.after(1, control_player, switch_pos, pos1, pos2, player)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -242,7 +246,7 @@ end
|
||||||
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
||||||
local function check_space(pos, dir, height, width)
|
local function check_space(pos, dir, height, width)
|
||||||
local remove = function(pos, node_name, tArg)
|
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
|
tArg.res = false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -276,8 +280,8 @@ end
|
||||||
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
||||||
local function remove_crane(pos, dir, height, width)
|
local function remove_crane(pos, dir, height, width)
|
||||||
local remove = function(pos, node_name, tArg)
|
local remove = function(pos, node_name, tArg)
|
||||||
if minetest.get_node_or_nil(pos).name == node_name or
|
if minetest.get_node(pos).name == node_name or
|
||||||
minetest.get_node_or_nil(pos).name == "towercrane:mast_ctrl_on" then
|
minetest.get_node(pos).name == "towercrane:mast_ctrl_on" then
|
||||||
minetest.remove_node(pos)
|
minetest.remove_node(pos)
|
||||||
end
|
end
|
||||||
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
|
-- evaluate user input (height, width), destroyed old crane and build a new one with
|
||||||
-- the given size
|
-- the given size
|
||||||
on_receive_fields = function(pos, formname, fields, player)
|
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
|
if fields.size == nil then
|
||||||
return
|
return
|
||||||
end
|
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 owner = meta:get_string("owner")
|
||||||
local dir = minetest.string_to_pos(meta:get_string("dir"))
|
local dir = minetest.string_to_pos(meta:get_string("dir"))
|
||||||
local height = meta:get_int("height")
|
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
|
if dir ~= nil and height ~= nil and width ~= nil then
|
||||||
remove_crane_data(pos)
|
remove_crane_data(pos)
|
||||||
remove_area(id, owner)
|
remove_area(id, owner)
|
||||||
--remove_crane(table.copy(pos), dir, height, width)
|
remove_crane(table.copy(pos), dir, height, width)
|
||||||
remove_hook(pos, player)
|
remove_hook(pos, player)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -446,16 +457,24 @@ minetest.register_node("towercrane:base", {
|
||||||
else
|
else
|
||||||
chat(owner, "Too less distance to your other crane(s)!")
|
chat(owner, "Too less distance to your other crane(s)!")
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
chat(owner, "Invalid input!")
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
can_dig = function(pos, player)
|
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 meta = minetest.get_meta(pos)
|
||||||
local owner = meta:get_string("owner")
|
local owner = meta:get_string("owner")
|
||||||
if player:get_player_name() == owner then
|
if player:get_player_name() ~= owner then
|
||||||
return true
|
return false
|
||||||
end
|
end
|
||||||
return false
|
meta = minetest.get_meta(switch_pos)
|
||||||
|
local running = meta:get_int("running")
|
||||||
|
if running == 1 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
end,
|
end,
|
||||||
|
|
||||||
-- remove mast and arm if base gets destroyed
|
-- remove mast and arm if base gets destroyed
|
||||||
|
|
|
@ -9,9 +9,6 @@ towercrane_max_width (maximum crane width) int 24
|
||||||
# can be placed on buildings and the hook still reaches the ground.
|
# can be placed on buildings and the hook still reaches the ground.
|
||||||
towercrane_rope_length (crane rope lenght) int 24
|
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)
|
# Recipe available (true/false)
|
||||||
towercrane_recipe (recipe available) bool true
|
towercrane_recipe (recipe available) bool true
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 341 KiB |
Loading…
Reference in New Issue