diff --git a/mods/default/player.lua b/mods/default/player.lua index 32d1e09..1705e18 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -1,6 +1,7 @@ local player_soundspec = {} local player_lastsound = {} local player_health = {} +local player_lastpos = {} local enable_flowing_water_sound = minetest.setting_getbool("enable_flowing_water_sound") if enable_flowing_water_sound == nil then enable_flowing_water_sound = true end @@ -16,9 +17,11 @@ local function step(dtime) or player_pos.y < -30000 or player_pos.y > 30000 or player_pos.z < -30000 or player_pos.z > 30000 then minetest.chat_send_player(name, "Don't go past 30000m in any direction!") - player.set_hp(0) + player:setpos(player_lastpos[name]) end + player_lastpos[name] = player:getpos() + if player:get_hp() < player_health[name] then minetest.sound_play( "default_hurt", @@ -105,6 +108,8 @@ local function on_joinplayer(player) -- uncomment to disable the sneak glitch player:set_physics_override({sneak_glitch = false}) + + player_lastpos[name] = player:getpos() end local function on_leaveplayer(player) @@ -113,6 +118,7 @@ local function on_leaveplayer(player) player_soundspec[name] = nil player_lastsound[name] = nil player_health[name] = nil + player_lastpos[name] = nil end minetest.register_privilege("uberspeed", "Can use /uberspeed command") diff --git a/mods/nav/map.lua b/mods/nav/map.lua index a6c9107..8e0fc23 100644 --- a/mods/nav/map.lua +++ b/mods/nav/map.lua @@ -10,7 +10,7 @@ default.ui.register_page("nav_nav", form_nav) local open_formspecs = {} local timer = 10 -local update_time = 0.25 +local update_time = 0.1 function nav.add_waypoint(pos, name, label, isinfo, type) nav.waypoints[name] = {pos = pos, label = label, isinfo = isinfo or false, type = type} @@ -64,17 +64,12 @@ function nav.show_map(player) for _, wptname in pairs(wpts) do local wpt = nav.waypoints[wptname] - local isinfo = wpt.isinfo - if wptname == "player_" .. name then - isinfo = true - end - form = form .. get_formspec_waypoint( 3.5+(((wpt.pos.x-pos.x)/nav.map_radius)*3), 6+(((pos.z-wpt.pos.z)/nav.map_radius)*3), wptname, wpt.label, - isinfo) + wpt.isinfo) end form = form .. "image[5.5,3;1,1;nav_map_compass.png]" @@ -85,19 +80,6 @@ function nav.show_map(player) minetest.show_formspec(name, "nav_map", form) end -minetest.register_craftitem( - "nav:map", - { - description = "Map", - inventory_image = "nav_inventory.png", - wield_image = "nav_inventory.png", - stack_max = 1, - on_use = function(itemstack, player, pointed_thing) - open_formspecs[player:get_player_name()] = true - nav.show_map(player) - end, - }) - local function recieve_fields(player, form_name, fields) if form_name == "nav_map" then if fields.quit or fields.nav_map_tracker then @@ -112,7 +94,7 @@ local function on_joinplayer(player) minetest.after( 1.0, function() - nav.add_waypoint(player:getpos(), "player_"..name, name, false, "player") + nav.add_waypoint(player:getpos(), "player_"..name, name, true, "player") end) end @@ -148,6 +130,19 @@ local function step(dtime) end end +minetest.register_craftitem( + "nav:map", + { + description = "Map", + inventory_image = "nav_inventory.png", + wield_image = "nav_inventory.png", + stack_max = 1, + on_use = function(itemstack, player, pointed_thing) + open_formspecs[player:get_player_name()] = true + nav.show_map(player) + end, + }) + minetest.register_craft( { output = "nav:map", diff --git a/mods/util/init.lua b/mods/util/init.lua index f10f84c..4c67b6b 100644 --- a/mods/util/init.lua +++ b/mods/util/init.lua @@ -80,6 +80,8 @@ function util.remove_area(pos1, pos2) end end end + + manip:write_to_map() end function util.areafunc(pos1, pos2, func) @@ -109,23 +111,22 @@ function util.reconstruct(pos1, pos2) -- fix chests local nodes = minetest.find_nodes_in_area(pos1, pos2, "default:chest") + local node = minetest.registered_nodes["default:chest"] for _, pos in ipairs(nodes) do - local node = minetest.registered_nodes[minetest.get_node(pos).name] - node.on_construct(pos) end - local nodes = minetest.find_nodes_in_area(pos1, pos2, "music:player") - for _, pos in ipairs(nodes) do - local node = minetest.registered_nodes[minetest.get_node(pos).name] - + + -- fix music players + nodes = minetest.find_nodes_in_area(pos1, pos2, "music:player") + node = minetest.registered_nodes["music:player"] + for _, pos in ipairs(nodes) do node.on_construct(pos) end -- fix furnaces - local nodes = minetest.find_nodes_in_area(pos1, pos2, "default:furnace") - for _, pos in ipairs(nodes) do - local node = minetest.registered_nodes[minetest.get_node(pos).name] - + nodes = minetest.find_nodes_in_area(pos1, pos2, "default:furnace") + node = minetest.registered_nodes["default:furnace"] + for _, pos in ipairs(nodes) do node.on_construct(pos) end end diff --git a/mods/village/depends.txt b/mods/village/depends.txt index 82e2adc..695054a 100644 --- a/mods/village/depends.txt +++ b/mods/village/depends.txt @@ -2,3 +2,4 @@ default util mobs goodies +nav diff --git a/mods/village/generate.lua b/mods/village/generate.lua index 4d064ba..3719541 100644 --- a/mods/village/generate.lua +++ b/mods/village/generate.lua @@ -6,6 +6,74 @@ local mp = minetest.get_modpath("village") village.villages = {} +local village_file = minetest.get_worldpath() .. "/villages" + +function village.get_id(name, pos) + return name .. minetest.hash_node_position(pos) +end + +function village.save_villages() + local f = io.open(village_file, "w") + + for name, def in pairs(village.villages) do + f:write(name .. " " .. def.name .. " " .. minetest.hash_node_position(def.pos) .. "\n") + end + + io.close(f) +end + +function village.load_villages() + local f = io.open(village_file, "r") + + if f then + repeat + local l = f:read("*l") + if l == nil then break end + + for name, fname, pos in string.gfind(l, "(.+) (%a+) (%d.+)") do + village.villages[name] = { + name = fname, + pos = minetest.get_position_from_hash(pos), + } + end + until f:read(0) == nil + + io.close(f) + else + village.save_villages() + end + + village.load_waypoints() +end + +function village.load_waypoints() + for name, def in pairs(village.villages) do + nav.remove_waypoint("village_" .. name) + nav.add_waypoint( + def.pos, + "village_" .. name, + def.name .. " village", + true, + "village" + ) + end +end + +function village.get_nearest_village(pos) + local nearest = 100000 -- big number + local name = nil + + for name, def in pairs(village.villages) do + local dist = vector.distance(pos, def.pos) + if dist < nearest then + nearest = dist + name = name + end + end + + return {dist = nearest, name = name} +end + village.chunkdefs = {} village.chunkdefs["livestock_pen"] = { @@ -101,12 +169,19 @@ function village.spawn_chunk(pos, orient, replace, pr, chunktype, nofill) if nofill ~= true then minetest.place_schematic( - {x = pos.x, y = pos.y-8, z = pos.z}, - mp.."/schematics/village_filler.mts", + {x = pos.x, y = pos.y, z = pos.z}, + mp.."/schematics/village_empty.mts", "0", {}, true ) + minetest.place_schematic( + {x = pos.x-6, y = pos.y-5, z = pos.z-6}, + mp.."/schematics/village_filler.mts", + "0", + {}, + false + ) end minetest.place_schematic( @@ -227,16 +302,19 @@ function village.spawn_village(pos, pr) local depth = pr:next(village.min_size, village.max_size) - village.villages[name] = { + village.villages[village.get_id(name, pos)] = { + name = name, pos = pos, } - village.spawn_chunk(pos, "0", {}, pr, "well") + village.save_villages() + village.load_waypoints() local houses = {} local built = {} local roads = {} + village.spawn_chunk(pos, "0", {}, pr, "well") built[minetest.hash_node_position(pos)] = true village.spawn_road(pos, houses, built, roads, depth, pr) @@ -310,4 +388,10 @@ function village.spawn_village(pos, pr) ) end end -end \ No newline at end of file +end + +minetest.after( + 0, + function() + village.load_villages() + end) \ No newline at end of file diff --git a/mods/village/init.lua b/mods/village/init.lua index 5989832..8fb9dd1 100644 --- a/mods/village/init.lua +++ b/mods/village/init.lua @@ -8,6 +8,8 @@ village = {} village.min_size = 2 -- min chunk gen iterations village.max_size = 6 -- max chunk gen iterations +village.min_spawn_dist = 256 -- closest distance a village will spawn from another village + village.pr = PseudoRandom(minetest.get_mapgen_params().seed) dofile(minetest.get_modpath("village").."/names.lua") diff --git a/mods/village/mapgen.lua b/mods/village/mapgen.lua index 4a16e1b..e67a8bd 100644 --- a/mods/village/mapgen.lua +++ b/mods/village/mapgen.lua @@ -44,9 +44,14 @@ minetest.register_abm( minetest.remove_node(pos) local pr = PseudoRandom(minetest.get_mapgen_params().seed+pos.x+pos.y+pos.z) if node.name == "village:grassland_village_mg" then - if pr:next(1, 60) == 1 then - print("Spawning a (Mapgen)Grassland village at "..dump(pos)) - minetest.after(3.0, function() village.spawn_village(pos, pr) end) -- a short delay to (hopefully)ensure that the surrounding terrain is generated + if pr:next(1, 30) == 1 then + local nearest = village.get_nearest_village(pos) + if nearest.dist > village.min_spawn_dist then + print("Spawning a (Mapgen)Grassland village at "..dump(pos)) + minetest.after(3.0, function() village.spawn_village(pos, pr) end) -- a short delay to (hopefully)ensure that the surrounding terrain is generated + else + print("Cannot spawn village, too near another village") + end end else print("Spawning a Grassland village at "..dump(pos)) diff --git a/mods/village/names.lua b/mods/village/names.lua index 6e19a97..3145cdf 100644 --- a/mods/village/names.lua +++ b/mods/village/names.lua @@ -33,6 +33,8 @@ function village.name.generate(pr) local name = prefix..middle..postfix + name = name:gsub("^%l", string.upper) + village.name.used[name] = true return name diff --git a/mods/village/schematics/village_empty.mts b/mods/village/schematics/village_empty.mts new file mode 100644 index 0000000..d35ab2e Binary files /dev/null and b/mods/village/schematics/village_empty.mts differ diff --git a/mods/village/schematics/village_filler.mts b/mods/village/schematics/village_filler.mts index a861546..5624b42 100644 Binary files a/mods/village/schematics/village_filler.mts and b/mods/village/schematics/village_filler.mts differ