Add Lock desert mode to user config.

master
David G 2019-01-03 13:11:43 -07:00
parent 6aabf7ec60
commit 025a8b6f2e
1 changed files with 77 additions and 46 deletions

123
init.lua
View File

@ -4,7 +4,13 @@
-- all 16 track directions, along with slopes up and down.
--
-- by David G (kestral246@gmail.com)
-- and mikola
-- and by Mikola
-- Version 2.0-pre-2 - 2019-01-03
-- Added Lock Desert Mode user config, but only when is_desert works.
-- Trying to deal better with transition regions to and from desert.
-- Stone coating will now change to desert stone, and vice versa.
-- How about tm_ for config prefix?
-- Version 2.0-pre-1 - 2019-01-02
-- Updating configs (wip), simplified digging patterns, added shift+left-click user config formspec.
@ -20,7 +26,7 @@
-- software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
-- This config section is a work in progress.
-- I prefixed all the minetest.conf names with tunnel_, but don't know if that's really necessary.
-- I prefixed all the minetest.conf names with tm_, but don't know if that's really necessary.
-- User settable config variables (in game formspec):
-----------------------------------------------------
@ -28,48 +34,56 @@
-- Default for Non-train tunnels.
-- Disables the train-specific options.
local nontrain_tunnel_default = minetest.settings:get_bool("tunnel_nontrain_tunnel_default", false)
local nontrain_tunnel_default = minetest.settings:get_bool("tm_nontrain_tunnel_default", false)
-- Default for Continuous updown digging.
-- Allow digging up/down multiple times without resetting mode.
local continuous_updown_default = minetest.settings:get_bool("tunnel_continuous_updown_default", false)
local continuous_updown_default = minetest.settings:get_bool("tm_continuous_updown_default", false)
-- Default for Lock Desert Mode is always false.
-- This option only shows up if add_desert_material is enabled, and Minetest version is 5.x.
-- Server settable config variables (minetest.conf):
----------------------------------------------------
-- Ceiling lighting
-- Default to torches, but allow using mese post lights.
local use_mese_lights = minetest.settings:get_bool("tunnel_use_mese_lights", false)
local use_mese_lights = minetest.settings:get_bool("tm_use_mese_lights", false)
local lighting = "default:torch"
if use_mese_lights then
lighting = "default:mese_post_light"
end
-- Allow the use of other materials in desert biomes
local add_desert_material = minetest.settings:get_bool("tm_add_desert_material", false)
-- Allow to replace water in air and a transparent coating tunnels
local add_dry_tunnels = minetest.settings:get_bool("tm_add_dry_tunnels", true)
-- Train specific options affected by nontrain_tunnel user setting
-- I need two variables for each of these, so they can be restored when using formspec.
-- Increase tunnel height
local ith_train = (tonumber(minetest.settings:get("tunnel_height") or 5))-5
local ith_train = (tonumber(minetest.settings:get("tm_increase_tunnel_height") or 5))-5
local ith
-- Add "arches" along the sides.
local add_arches_train = minetest.settings:get_bool("tunnel_add_arches", true)
local add_arches_train = minetest.settings:get_bool("tm_add_arches", true)
local add_arches
-- Add gravel mound and additional base
local add_embankment_train = minetest.settings:get_bool("tunnel_add_embankment", true)
local add_embankment_train = minetest.settings:get_bool("tm_add_embankment", true)
local add_embankment
-- Add markup for the railway advtrains
local add_marking_train = minetest.settings:get_bool("tunnel_add_marking", true)
local add_marking_train = minetest.settings:get_bool("tm_add_marking", true)
local add_marking
-- Allow to replace the coating of tunnels on a specific coating
local add_tough_tunnels_train = minetest.settings:get_bool("tunnel_add_tough_tunnels", true)
local add_tough_tunnels_train = minetest.settings:get_bool("tm_add_tough_tunnels", true)
local add_tough_tunnels
-- Allow wide paths in the woods. Greenpeace does not approve
local add_wide_passage_train = minetest.settings:get_bool("tunnel_add_wide_passage", true)
local add_wide_passage_train = minetest.settings:get_bool("tm_add_wide_passage", true)
local add_wide_passage
-- Set actual values based on nontrain_tunnel default.
@ -89,36 +103,29 @@ else
add_wide_passage = add_wide_passage_train
end
-- Allow to replace water in air and a transparent coating tunnels
local add_dry_tunnels = minetest.settings:get_bool("tunnel_add_dry_tunnels", true)
-- Allow the use of other materials in desert biomes
local add_desert_material = minetest.settings:get_bool("tunnel_add_desert_material", false)
-- Materials
-- Walls, floor and additional base (outside the desert)
local coating_not_desert = minetest.settings:get("tunnel_coating_not_desert") or "default:stone"
local coating_not_desert = minetest.settings:get("tm_material_for_coating_not_desert") or "default:stone"
-- Walls, floor and additional base (in the desert)
local coating_desert = minetest.settings:get("tunnel_coating_desert") or "default:desert_stone"
local coating_desert = minetest.settings:get("tm_material_for_coating_desert") or "default:desert_stone"
-- Walls in the water
local glass_walls = minetest.settings:get("tunnel_glass_walls") or "default:glass"
local glass_walls = minetest.settings:get("tm_material_for_glass_walls") or "default:glass"
-- Embankment for railway tracks
local embankment = minetest.settings:get("tunnel_embankment") or "default:gravel"
local embankment = minetest.settings:get("tm_material_for_embankment") or "default:gravel"
-- Railway markings for advtrains (outside the desert)
local marking_not_desert = minetest.settings:get("tunnel_marking_not_desert") or "default:stone_block"
local marking_not_desert = minetest.settings:get("tm_material_for_marking_not_desert") or "default:stone_block"
-- Railway markings for advtrains (in the desert)
local marking_desert = minetest.settings:get("tunnel_marking_desert") or "default:desert_stone_block"
local marking_desert = minetest.settings:get("tm_material_for_marking_desert") or "default:desert_stone_block"
-- Hard coded config options
----------------------------
-- Hard coded config options?
-----------------------------
-- Add ceiling lighting (I question whether not having lights is usable.)
local add_lighting = true
@ -139,7 +146,10 @@ local user_config = {}
minetest.register_on_joinplayer(function(player)
local pname = player:get_player_name()
tunnelmaker[pname] = {updown = 0, lastdir = -1, lastpos = {x = 0, y = 0, z = 0}}
user_config[pname] = {remove_refs = false, nontrain_tunnels = nontrain_tunnel_default, continuous_updown = continuous_updown_default}
user_config[pname] = {remove_refs = false, nontrain_tunnels = nontrain_tunnel_default,
continuous_updown = continuous_updown_default, lock_desert_mode = false,
use_desert_material = add_desert_material and minetest.get_biome_data and
string.match(minetest.get_biome_name(minetest.get_biome_data(player:get_pos()).biome), "desert")}
end)
-- Delete player's state when player leaves
@ -272,13 +282,17 @@ end
register(embankment)
-- Tests whether position is in desert-type biomes, such as desert, sandstone_desert, cold_desert, etc
-- Always just returns false if can't determine biome (i.e., using 0.4.x version)
local is_desert = function(pos)
local is_desert = function(user, pos)
local pname = user:get_player_name()
if add_desert_material and minetest.get_biome_data then
local cur_biome = minetest.get_biome_name( minetest.get_biome_data(pos).biome )
return string.match(cur_biome, "desert")
if user_config[pname].lock_desert_mode then
return user_config[pname].use_desert_material
else
local cur_biome = minetest.get_biome_name( minetest.get_biome_data(pos).biome )
return string.match(cur_biome, "desert")
end
else
return false
end
@ -294,7 +308,6 @@ end
-- |3|3|5|4|5|3|3|
-- | |8|6|6|6|8| |
local region0 = function(x, y, z, user, pointed_thing)
local pos = vector.add(pointed_thing.under, {x=x, y=y, z=z})
local name = minetest.get_node(pos).name
@ -343,9 +356,9 @@ local region3 = function(x, y, z, user, pointed_thing)
if minetest.registered_nodes[name] then
group_flammable = minetest.registered_nodes[name].groups.flammable and minetest.registered_nodes[name].groups.flammable > 0
end
if not(string.match(name, "water") or name == "air" or name == glass_walls or name == coating_not_desert or (add_embankment and name == "tunnelmaker:embankment") or name == marking_not_desert or name == marking_desert or name == lighting or string.match(name, "dtrack")) and add_tough_tunnels then
if not(string.match(name, "water") or name == "air" or name == glass_walls or (add_embankment and name == "tunnelmaker:embankment") or name == marking_not_desert or name == marking_desert or name == lighting or string.match(name, "dtrack")) and add_tough_tunnels then
if not group_flammable then
if is_desert(pos) then
if is_desert(user, pos) then
minetest.set_node(pos, {name = coating_desert})
else
minetest.set_node(pos, {name = coating_not_desert})
@ -364,7 +377,7 @@ local region4 = function(x, y, z, user, pointed_thing)
local name = minetest.get_node(pos).name
if not string.match(name, "dtrack") then
if add_marking then
if is_desert(pos) then
if is_desert(user, pos) then
minetest.set_node(pos, {name = marking_desert})
else
minetest.set_node(pos, {name = marking_not_desert})
@ -373,7 +386,7 @@ local region4 = function(x, y, z, user, pointed_thing)
if add_embankment then
minetest.set_node(pos, {name = "tunnelmaker:embankment"})
else
if is_desert(pos) then
if is_desert(user, pos) then
minetest.set_node(pos, {name = coating_desert})
else
minetest.set_node(pos, {name = coating_not_desert})
@ -390,7 +403,7 @@ local region5 = function(x, y, z, user, pointed_thing)
if add_embankment then
minetest.set_node(pos, {name = "tunnelmaker:embankment"})
else
if is_desert(pos) then
if is_desert(user, pos) then
minetest.set_node(pos, {name = coating_desert})
else
minetest.set_node(pos, {name = coating_not_desert})
@ -403,7 +416,7 @@ local region6 = function(x, y, z, user, pointed_thing)
local pos = vector.add(pointed_thing.under, {x=x, y=y, z=z})
local name = minetest.get_node(pos).name
if not(name == coating_not_desert or name == marking_not_desert or name == marking_desert or string.match(name, "dtrack")) and add_embankment then
if is_desert(pos) then
if is_desert(user, pos) then
minetest.set_node(pos, {name = coating_desert})
else
minetest.set_node(pos, {name = coating_not_desert})
@ -415,7 +428,7 @@ local region7 = function(x, y, z, user, pointed_thing)
local pos = vector.add(pointed_thing.under, {x=x, y=y, z=z})
local name = minetest.get_node(pos).name
if not(name == coating_not_desert or name == marking_not_desert or name == marking_desert or string.match(name, "dtrack")) then
if is_desert(pos) then
if is_desert(user, pos) then
minetest.set_node(pos, {name = coating_desert})
else
minetest.set_node(pos, {name = coating_not_desert})
@ -431,7 +444,7 @@ local region8 = function(x, y, z, user, pointed_thing)
group_flammable = minetest.registered_nodes[name].groups.flammable and minetest.registered_nodes[name].groups.flammable > 0
end
if not(name == coating_not_desert or name == marking_not_desert or name == marking_desert or string.match(name, "dtrack")) and add_embankment and (add_wide_passage or not(add_wide_passage or group_flammable)) then
if is_desert(pos) then
if is_desert(user, pos) then
minetest.set_node(pos, {name = coating_desert})
else
minetest.set_node(pos, {name = coating_not_desert})
@ -716,13 +729,28 @@ for i,img in ipairs(images) do
local key_stats = player:get_player_control()
-- If sneak button held down when left-clicking tunnelmaker, brings up User Config formspec.
if key_stats.sneak then -- Configuration formspec
local formspec = "size[4,3]"..
local formspec = "size[4.5,3.5]"..
"label[0.25,0.25;Tunnelmaker User Options]"..
"checkbox[0.25,0.75;remove_refs;Remove reference nodes;"..tostring(user_config[pname].remove_refs).."]"..
"checkbox[0.25,1.25;nontrain_tunnels;Dig non-train tunnels;"..tostring(user_config[pname].nontrain_tunnels).."]"..
"checkbox[0.25,1.75;continuous_updown;Continuous updown digging;"..tostring(user_config[pname].continuous_updown).."]"
minetest.show_formspec(pname, "tunnelmaker:form", formspec)
else
local formspec_dm = ""
local dmat = ""
local use_desert_material = user_config[pname].use_desert_material
if add_desert_material and minetest.get_biome_data then
if not user_config[pname].lock_desert_mode then
use_desert_material = string.match(minetest.get_biome_name(minetest.get_biome_data(player:get_pos()).biome), "desert")
user_config[pname].use_desert_material = use_desert_material
end
if use_desert_material then
dmat = "Desert"
else
dmat = "Non-desert"
end
formspec_dm = "checkbox[0.25,2.25;lock_desert_mode;Lock desert mode to: "..dmat..";"..tostring(user_config[pname].lock_desert_mode).."]"
end
minetest.show_formspec(pname, "tunnelmaker:form", formspec..formspec_dm)
else -- Dig single node, if pointing to one
if pos ~= nil then
minetest.node_dig(pos, minetest.get_node(pos), player)
minetest.sound_play("default_dig_dig_immediate", {pos=pos, max_hear_distance = 8, gain = 0.5})
@ -785,6 +813,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
add_wide_passage = add_wide_passage_train
elseif fields.continuous_updown == "true" then user_config[pname].continuous_updown = true
elseif fields.continuous_updown == "false" then user_config[pname].continuous_updown = false
elseif fields.lock_desert_mode == "false" then user_config[pname].lock_desert_mode = false
elseif fields.lock_desert_mode == "true" then user_config[pname].lock_desert_mode = true
end
return true
end)
@ -794,7 +824,8 @@ end)
-- Expose api
local remove_marking = {}
remove_marking.replace = function(player_pos)
remove_marking.replace = function(player)
local player_pos = player:get_pos()
local count = 0
-- Gen pos1 and pos2
@ -820,7 +851,7 @@ remove_marking.replace = function(player_pos)
if add_embankment then
data[vi] = minetest.get_content_id("tunnelmaker:embankment")
else
if is_desert({x=x, y=y, z=z}) then
if is_desert(player, {x=x, y=y, z=z}) then
data[vi] = minetest.get_content_id(coating_desert)
else
data[vi] = minetest.get_content_id(coating_not_desert)
@ -839,7 +870,7 @@ end
minetest.register_globalstep(function(dtime)
for _, player in ipairs(minetest.get_connected_players()) do
if user_config[player:get_player_name()].remove_refs then
remove_marking.replace(player:getpos())
remove_marking.replace(player)
end
end
end)