diff --git a/.luacheckrc b/.luacheckrc index 3a04d31..4a4578e 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -23,5 +23,5 @@ files["machines_configuration.lua"] = {max_line_length = 190} files["mark.lua"] = {globals = {"machines"}} files["mesecon_adapter.lua"] = {read_globals = {"mesecon"}} files["mover.lua"] = {max_line_length = 290, read_globals = {"bucket", "nodeupdate"}} -files["protect.lua"] = {globals = {"minetest.is_protected"}} +files["protect.lua"] = {globals = {"minetest.is_protected"}, read_globals = {"beerchat"}} files["technic_power.lua"] = {max_line_length = 140} \ No newline at end of file diff --git a/init.lua b/init.lua index 8f80dfe..3fab8a4 100644 --- a/init.lua +++ b/init.lua @@ -46,7 +46,7 @@ basic_machines = { generator_upgrade = 0, -- upgrade available in addition to the current limit (50) -- space space_start_eff = 1500, -- space efficiency height - space_start = 1100, -- space height + space_start = 1100, -- space height, set to false to disable space_textures = "", -- skybox space textures replacement with up to 6 texture names separated by commas exclusion_height = 6666, -- above, without "include" priv, player is teleported to a random location space_effects = false, -- enable damage mechanism @@ -155,7 +155,9 @@ dofile(MP .. "control_doors.lua") -- if you want open/close doors/trapdoors wi -- also walk through trapdoors, steel doors/trapdoors are made impervious to dig through, -- removal by repeated punches dofile(MP .. "control_lights.lua") -- adds ability to toggle light for other light blocks -dofile(MP .. "space.lua") -- change global physics +if basic_machines.settings.space_start then + dofile(MP .. "space.lua") -- change global physics (skybox, gravity, damage mechanism...) +end local S = basic_machines.S diff --git a/mod.conf b/mod.conf index f6a148f..a66ba9e 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,4 @@ name = basic_machines description = lightweight automation mod depends = default -optional_depends = basic_protect, boneworld, baldcypress, bamboo, birch, bucket, cacaotree, cherrytree, chestnuttree, clementinetree, ebony, gravelsieve, hollytree, i3, jacaranda, larch, lemontree, mahogany, maple, oak, palm, plumtree, pomegranate, sequoia, willow, darkage, doors, es, extra_doors, farming, flowers, gloopblocks, mesecons, moreblocks, moreores, player_monoids, signs_lib, unifieddyes, unified_inventory, x_farming, xdecor, xpanes \ No newline at end of file +optional_depends = basic_protect, beerchat, boneworld, baldcypress, bamboo, birch, bucket, cacaotree, cherrytree, chestnuttree, clementinetree, ebony, gravelsieve, hollytree, i3, jacaranda, larch, lemontree, mahogany, maple, oak, palm, plumtree, pomegranate, sequoia, willow, darkage, doors, es, extra_doors, farming, flowers, gloopblocks, mesecons, moreblocks, moreores, player_monoids, signs_lib, unifieddyes, unified_inventory, x_farming, xdecor, xpanes \ No newline at end of file diff --git a/mover.lua b/mover.lua index fd31ac5..9f06fe8 100644 --- a/mover.lua +++ b/mover.lua @@ -674,9 +674,10 @@ minetest.register_node("basic_machines:mover", { local fuel = meta:get_float("fuel") if upgrade == -1 then + node1 = minetest.get_node(pos1); node1_name = node1.name + if node1_name == "ignore" then return end -- nothing to move if not object then - node1 = minetest.get_node(pos1); node1_name = node1.name - if node1_name == "air" or node1_name == "ignore" then return end -- nothing to move + if node1_name == "air" then return end -- nothing to move if not inventory then source_chest = mover.chests[node1_name] or false end @@ -697,7 +698,7 @@ minetest.register_node("basic_machines:mover", { end else node1 = minetest.get_node(pos1); node1_name = node1.name - if node1_name == "air" or node1_name == "ignore" then return end -- nothing to move + if not object and node1_name == "air" or node1_name == "ignore" then return end -- nothing to move if inventory then -- taking items from chests/inventory move fuel_cost = mover.hardness[prefer] or 1 else @@ -787,11 +788,10 @@ minetest.register_node("basic_machines:mover", { end local radius = math.min(vector.distance(pos1, vector_add(pos, {x = x1, y = y1, z = z1})), max_range) -- distance source1-source2 local elevator = meta:get_int("elevator"); if elevator == 1 and radius == 0 then radius = 1 end -- for compatibility - local teleport_any = false + local teleport_any if mover.chests[minetest.get_node(pos2).name] and elevator == 0 then -- put objects in target chest - local inv = minetest.get_meta(pos2):get_inventory() - local mucca + local inv, mucca for _, obj in ipairs(minetest.get_objects_inside_radius(pos1, radius)) do if not obj:is_player() then @@ -802,8 +802,11 @@ minetest.register_node("basic_machines:mover", { if not lua_entity.protected then -- check if mob (mobs_redo) protected -- put item in chest local stack = ItemStack(lua_entity.itemstring) - if not stack:is_empty() and inv:room_for_item("main", stack) then - inv:add_item("main", stack); teleport_any = true + if not stack:is_empty() then + inv = inv or minetest.get_meta(pos2):get_inventory() + if inv:room_for_item("main", stack) then + inv:add_item("main", stack); teleport_any = true + end end obj:remove() end @@ -814,22 +817,25 @@ minetest.register_node("basic_machines:mover", { ((lua_entity.nametag and lua_entity.nametag ~= "") and lua_entity.nametag or "Cow") meta:set_string("infotext", S("@1 already milked!", mucca:gsub(", Cow", "") ~= "" and mucca:sub(3):gsub("Cow", S("Cow")) or S("Cows"))) - elseif inv:contains_item("main", "bucket:bucket_empty") then - inv:remove_item("main", "bucket:bucket_empty") - if inv:room_for_item("main", "mobs:bucket_milk") then - inv:add_item("main", "mobs:bucket_milk") - else - minetest.add_item(obj:get_pos(), {name = "mobs:bucket_milk"}) + else + inv = inv or minetest.get_meta(pos2):get_inventory() + if inv:contains_item("main", "bucket:bucket_empty") then + inv:remove_item("main", "bucket:bucket_empty") + if inv:room_for_item("main", "mobs:bucket_milk") then + inv:add_item("main", "mobs:bucket_milk") + else + minetest.add_item(obj:get_pos(), {name = "mobs:bucket_milk"}) + end + lua_entity.gotten = true; teleport_any = true end - lua_entity.gotten = true; teleport_any = true end end end end end end - else - local times, velocityv = tonumber(prefer) or 0, nil + else -- move objects to another location + local times, velocityv = tonumber(prefer) or 0 if times ~= 0 then if times == 99 then velocityv = {x = 0, y = 0, z = 0} @@ -842,13 +848,12 @@ minetest.register_node("basic_machines:mover", { end end - -- move objects to another location for _, obj in ipairs(minetest.get_objects_inside_radius(pos1, radius)) do if obj:is_player() then if not minetest.is_protected(obj:get_pos(), owner) and (prefer == "" or obj:get_player_name() == prefer) then -- move player only from owners land - obj:move_to(pos2, false); teleport_any = true + obj:set_pos(pos2); teleport_any = true end else local lua_entity = obj:get_luaentity() @@ -1087,8 +1092,8 @@ minetest.register_node("basic_machines:mover", { for _, pos3 in ipairs(positions) do minetest.set_node(pos3, {name = "air"}) + check_for_falling(pos3) end - check_for_falling(pos1) local count, stack_max, stacks = #positions, ItemStack(node1_name):get_stack_max(), {} @@ -1161,15 +1166,15 @@ minetest.register_node("basic_machines:mover", { for _, item in ipairs(drops.items) do if itemlists_dropped >= max_items then break end if math.random(1, item.rarity or 1) == 1 then - local inherit_color, palette_index = item.inherit_color, nil + local inherit_color, palette_index = item.inherit_color if inherit_color then palette_index = minetest.strip_param2_color(node1.param2, def.paramtype2) end - for _, add_item in ipairs(item.items) do -- pick all items from list + for _, drop_item in ipairs(item.items) do -- pick all items from list if inherit_color and palette_index then - add_item = itemstring_to_stack(add_item, palette_index) + drop_item = itemstring_to_stack(drop_item, palette_index) end - inv:add_item("main", add_item) + inv:add_item("main", drop_item) end itemlists_dropped = itemlists_dropped + 1 end diff --git a/protect.lua b/protect.lua index 35cd491..7407470 100644 --- a/protect.lua +++ b/protect.lua @@ -29,7 +29,7 @@ function minetest.is_protected(pos, digger) return is_protected end -minetest.register_on_chat_message(function(name, message) +local function distributor(name, message) local player = minetest.get_player_by_name(name); if not player then return end local pos, r = player:get_pos(), 20 local p = {x = round(pos.x / r + 0.5) * r, y = round(pos.y / r + 0.5) * r + 1, z = round(pos.z / r + 0.5) * r} @@ -47,4 +47,10 @@ minetest.register_on_chat_message(function(name, message) end end end -end) \ No newline at end of file +end + +if minetest.global_exists("beerchat") then + beerchat.register_on_chat_message(distributor) +else + minetest.register_on_chat_message(distributor) +end \ No newline at end of file diff --git a/space.lua b/space.lua index 3d691bc..75853fc 100644 --- a/space.lua +++ b/space.lua @@ -7,7 +7,7 @@ local use_player_monoids = minetest.global_exists("player_monoids") local use_basic_protect = minetest.global_exists("basic_protect") minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) - if player:get_pos().y >= space_start then return end + if player:get_pos().y > space_start then return end -- bring gravity closer to normal with each punch if player:get_physics_override().gravity < 1 then player:set_physics_override({gravity = 1}) @@ -34,15 +34,9 @@ local function toggle_visibility(player, b) player:set_stars({visible = b}) end -local function adjust_enviro(player) -- adjust players physics/skybox - if not player then return end - local pos = player:get_pos() - local inspace = 0 - local physics - - if pos.y > space_start then -- is player in space or not ? - inspace = 1 - physics = {speed = 1, jump = 0.5, gravity = 0.1} -- value set for extreme test space spawn +local function adjust_enviro(inspace, player) -- adjust players physics/skybox + if inspace == 1 then -- is player in space or not ? + local physics = {speed = 1, jump = 0.5, gravity = 0.1} -- value set for extreme test space spawn if use_player_monoids then player_monoids.speed:add_change(player, physics.speed, "basic_machines:physics") @@ -58,7 +52,7 @@ local function adjust_enviro(player) -- adjust players physics/skybox player:set_sky({base_color = 0x000000, type = sky["type"], textures = sky["tex"], clouds = false}) toggle_visibility(player, false) else - physics = {speed = 1, jump = 1, gravity = 1} + local physics = {speed = 1, jump = 1, gravity = 1} if use_player_monoids then player_monoids.speed:add_change(player, physics.speed, "basic_machines:physics") @@ -101,7 +95,7 @@ minetest.register_globalstep(function(dtime) for _, player in ipairs(minetest.get_connected_players()) do local pos = player:get_pos() local name = player:get_player_name() - local inspace = 0 + local inspace if pos.y > space_start then inspace = 1 @@ -116,11 +110,13 @@ minetest.register_globalstep(function(dtime) minetest.log("action", "Exclusion zone alert: " .. name .. " at " .. pos_to_string(pos)) player:set_pos(spawn_pos) end + else + inspace = 0 end -- only adjust player environment ONLY if change occurred (earth->space or space->earth!) if inspace ~= space[name] then - space[name] = adjust_enviro(player) + space[name] = adjust_enviro(inspace, player) end if space_effects and inspace == 1 then -- special space code