diff --git a/aliases.lua b/aliases.lua new file mode 100755 index 0000000..d886e5c --- /dev/null +++ b/aliases.lua @@ -0,0 +1,64 @@ +local alias = minetest.register_alias +-- Remove duplicated items from the carbone subgame because of Moreores mod +-- Stone +alias("default:stone_with_tin", "default:stone") +alias("default:stone_with_silver", "default:stone") +-- Lump +alias("default:tin_lump", "default:stone") +alias("default:silver_lump", "default:stone") +-- Ingot +alias("default:tin_ingot", "default:stone") +alias("default:silver_ingot", "default:stone") +-- Block +alias("default:tinblock", "default:stone") +alias("default:silverblock", "default:stone") +-- Tools +alias("default:pick_silver", "default:stone") +alias("default:shovel_silver", "default:stone") +alias("default:axe_silver", "default:stone") +alias("default:sword_silver", "default:stone") +alias("default:knife_silver", "default:stone") + +-- Remove torch from torches => remise des torches par défaut +alias("torches:floor", "default:torch") +alias("torches:wand", "default:torch") + +-- Remove copper_rail from moreores => utilisation des rail_copper du mod carts +alias("moreores:copper_rail", "carts:rail_copper") + +-- Old fishing mod to the new fishing mod +alias("fishing:fish_cooked", "fishing:fish") +alias("fishing:worm", "fishing:bait_worm") + +-- Old itemframes mod to the new itemframes(v2) mod +alias("itemframes:pedestal", "itemframes:pedestal_cobble") + +-- Remove "moreores:copper_rail" for "carts:copper_rail" +alias("moreores:copper_rail", "carts:rail_copper") + +-- Remove "multitest:hayblock" because farming redo include it now +alias("multitest:hayblock", "farming:straw") + +-- Remove "darkage:stair_straw", "darkage:straw", "darkage:straw_bale" and "darkage:adobe" +alias("darkage:stair_straw", "farming:straw") +alias("darkage:straw", "farming:straw") +alias("darkage:straw_bale", "farming:straw") +alias("darkage:adobe", "farming:straw") + +-- Remove "wiki:wiki" +alias("wiki:wiki", "default:bookshelf") + +-- Remove "building_blocks:knife" +alias("building_blocks:knife", "default:sword_steel") + +-- Remove "xmas_tree" from snow mod +alias("snow:xmas_tree", "default:dirt") + +-- remove "fake_fire:flint_and_steel" from homedecor_modpack mod +alias("fake_fire:flint_and_steel", "fire:flint_and_steel") + +-- remove ongen pine saplings from moretrees +alias("moretrees:pine_sapling_ongen", "default:pine_sapling") + +-- Remove bedrock mod +alias("bedrock:bedrock", "default:cobble") diff --git a/bush_seeds.lua b/bush_seeds.lua new file mode 100644 index 0000000..e6a879e --- /dev/null +++ b/bush_seeds.lua @@ -0,0 +1,31 @@ +minetest.register_craftitem(":bushes:youngtree", { + description = "Young tree", + inventory_image = "bushes_youngtree.png", + on_place = function(stack, user, pointed_thing) + if pointed_thing.type ~= "node" then return end + local pos = pointed_thing.under + + for y = 1, 4 do + local m = 0 + if (y > 2) then m = 1 end + for z = 0, m do + if minetest.get_node({x = pos.x, y = pos.y+y, z = pos.z+z}).name ~= "air" or minetest.is_protected({x = pos.x, y = pos.y+y, z = pos.z+z}, user:get_player_name()) then + return + end + end + end + + abstract_bushes.grow_youngtree_node2(pointed_thing.under, 4) + stack:set_count(stack:get_count() - 1) + return stack + end, +}) + +minetest.register_craft({ + output = "bushes:youngtree", + recipe = { + {"bushes:BushLeaves1", "default:stick", "bushes:BushLeaves1"}, + {"", "default:stick", ""}, + {"", "default:stick", ""}, + }, +}) diff --git a/carbone_init.lua b/carbone_init.lua new file mode 100644 index 0000000..0b7a052 --- /dev/null +++ b/carbone_init.lua @@ -0,0 +1,85 @@ +-- Code below by Casimir. + +minetest.after(1, function() + local i = 0 + local number = 0 + for name, item in pairs(minetest.registered_items) do + if (name and name ~= "") then + number = number + 1 + end + i = i + 1 + end + minetest.log("action", "There are " .. number .. " registered nodes, items and tools.") +end) + +minetest.register_on_joinplayer(function(player) + minetest.sound_play("player_join", {gain = 0.75}) + player:set_physics_override({ + sneak_glitch = false, -- Climable blocks are quite fast in Carbone. + }) +end) + +minetest.register_on_leaveplayer(function(player) + minetest.sound_play("player_leave", {gain = 1}) +end) + +minetest.register_on_respawnplayer(function(player) + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + local pos = player:getpos() + -- minetest.sound_play("player_join", {pos = pos, gain = 0.5}) +end) + +minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) + if user:get_hp() >= 20 then return end + local pos = user:getpos() + minetest.sound_play("health_gain", {pos = pos, gain = 0.4}) +end) + +minetest.log("action", "") -- Empty line. +minetest.log("action", "") -- Empty line. + +if minetest.setting_getbool("creative_mode") then + minetest.log("action", "Creative mode is enabled.") + else + minetest.log("action", "Creative mode is disabled.") +end + +if minetest.setting_getbool("enable_damage") then + minetest.log("action", "Damage is enabled.") + else + minetest.log("action", "Damage is disabled.") +end + +if minetest.setting_getbool("enable_pvp") then + minetest.log("action", "PvP is enabled.") + else + minetest.log("action", "PvP is disabled.") +end + +if not minetest.is_singleplayer() and minetest.setting_getbool("server_announce") then + minetest.log("action", "") -- Empty line. + minetest.log("action", "Server name: " .. minetest.setting_get("server_name") or "(none)") + minetest.log("action", "Server description: " .. minetest.setting_get("server_description") or "(none)") + minetest.log("action", "Server URL: " .. minetest.setting_get("server_address") or "(none)") + minetest.log("action", "MOTD: " .. minetest.setting_get("motd") or "(none)") + minetest.log("action", "Maximum users: " .. minetest.setting_get("max_users") or 15) +end + +minetest.log("action", "") -- Empty line. +minetest.log("action", "") -- Empty line. + +-- Reserved slot handling: + +minetest.register_on_prejoinplayer(function(name, ip) + local admin_slots = minetest.setting_get('admin_slots') or 2 + if #minetest.get_connected_players() >= (minetest.setting_get('max_users') - admin_slots) + and not minetest.check_player_privs(name, {server = true}) then + return "Sorry, " .. admin_slots .. " slots are reserved for administrators." + end +end) + + +if minetest.setting_getbool("log_mods") then + -- Highlight the default mod in the mod loading logs: + minetest.log("action", "Carbone: * [default] loaded.") +end diff --git a/chatcommands.lua b/chatcommands.lua new file mode 100755 index 0000000..815d90d --- /dev/null +++ b/chatcommands.lua @@ -0,0 +1,61 @@ +-- +-- Edited chat commands from core +-- + +-- /shutdown +-- /ban +-- /itemdb + +minetest.register_chatcommand("shutdown", { + description = "shutdown server", + privs = {server=true}, + func = function(name, param) + minetest.log("action", name .. " shuts down server") + minetest.request_shutdown() + minetest.chat_send_all(name .. " just shut down the server.") + end, +}) + +minetest.register_chatcommand("ban", { + params = "", + description = "Ban IP of player", + privs = {ban=true}, + func = function(name, param) + if param == "" then + return true, "Ban list: " .. minetest.get_ban_list() + end + if not minetest.get_player_by_name(param) then + return false, "This player is not online at the moment. Use a /future_ban instead." + end + if not minetest.ban_player(param) then + return false, "Failed to ban player." + end + local desc = minetest.get_ban_description(param) + minetest.log("action", name .. " bans " .. desc .. ".") + return true, "Banned " .. desc .. "." + end, +}) + +minetest.register_chatcommand("itemdb", { + params = "", + description = "Give itemstring of wielded item", + privs = {}, + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then return false end + local item = player:get_wielded_item() + + if item:get_name() == "" then + minetest.chat_send_player(name,"You're handling nothing.") + return true + else + if not minetest.registered_items[item:get_name()] then + minetest.chat_send_player(name,"You are handling an unknown item (known before as " .. item:get_name() ..").") + return true + else + minetest.chat_send_player(name,"You are handling a " .. minetest.registered_items[item:get_name()].description .. " also known as " .. item:get_name() .. ".") + return true + end + end + end +}) diff --git a/commands.lua b/commands.lua new file mode 100755 index 0000000..65c88f3 --- /dev/null +++ b/commands.lua @@ -0,0 +1,190 @@ +minetest.register_privilege("physics", { + description = "Allows player to set their gravity, jump height and movement speed"}) + +-- Infotool code by PilzAdam: +minetest.register_craftitem(":default:infotool", { + description = "Infotool", + inventory_image = "default_infotool.png", + wield_image = "default_infotool.png^[transformR90", + groups = {not_in_creative_inventory = 1}, + on_use = function(_, user, pt) + if pt.type ~= "node" then return end + local nn = minetest.get_node(pt.under).name + if minetest.registered_items[nn] == nil or minetest.registered_items[nn].tiles == nil or type(minetest.registered_items[nn].tiles[1]) ~= "string" then return end + local def = minetest.registered_nodes[nn] + if not def then return end + + local textures = def.tiles + local description = def.description + if not textures then + textures = {"(no texture)"} + end + if not description then + description = {"(no description)"} + end + for i = 1,6 do + if not textures[i] then + textures[i] = textures[i-1] + end + end + local dir = vector.subtract(pt.above, pt.under) + local index + -- This doesn't work for facedir or other drawtypes yet. + if dir.y == 1 then + index = 1 + elseif dir.y == -1 then + index = 2 + else + if dir.x == 1 then + index = 3 + elseif dir.x == -1 then + index = 4 + else + if dir.z == 1 then + index = 5 + else + index = 6 + end + end + end + minetest.chat_send_player(user:get_player_name(), description .. ": " .. nn .. " (" .. textures[index] .. ")") + end, +}) + +minetest.register_chatcommand("info", { + description = "Gives an Infotool, click to receive information on the pointed node", + func = function(name) + local receiverref = minetest.get_player_by_name(name) + receiverref:get_inventory():add_item("main", "default:infotool") + minetest.chat_send_player(name, "\"default:infotool\" added to inventory.") + end, +}) + +minetest.register_chatcommand("clearinventory", { + params = "", + description = "Clears an entire inventory, \"main\" if unspecified, \"craft\" is another possible choice", + func = function(name, param) + local player = minetest.get_player_by_name(name) + local player_inv = player:get_inventory() + if not player then + minetest.log("error", "Unable to clear inventory, no player.") + return false, "Unable to clear inventory, no player." + end + if param == "" then + player_inv:set_list("main", {}) + return true, "Inventory \"main\" cleared." + else + player_inv:set_list(param, {}) + return true, "Inventory \"" .. param .. "\" cleared." + end + end, +}) + +-- The following commands /whoami, /suicide, /speed, /gravity and /jump by Wuzzy: +minetest.register_chatcommand("whoami", { + params = "", + description = "Tells your name", + privs = {}, + func = function(name) + minetest.chat_send_player(name, "Your name is: " .. name) + end, +}) + +minetest.register_chatcommand("ip", { + params = "", + description = "Shows your IP address", + privs = {}, + func = function(name) + minetest.chat_send_player(name, "Your IP address is: "..minetest.get_player_ip(name)) + end +}) + +minetest.register_chatcommand("suicide", { + params = "", + description = "Kills yourself", + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then return end + player:set_hp(0) + if minetest.setting_getbool("enable_damage") == false then + minetest.chat_send_player(name, "[X] Damage is disabled on this server.") + else + minetest.chat_send_player(name, "[X] You suicided.") + end + end, +}) + +minetest.register_chatcommand("speed", { + params = "[speed]", + description = "Sets your movement speed (defaults to 1).", + privs = {physics = true}, + func = function(name, speed) + local player = minetest.get_player_by_name(name) + if not player then return end + if speed == "" then speed = 1 end + if type(tonumber(speed)) ~= "number" + or tonumber(speed) < 0 + or tonumber(speed) > 10 then + minetest.chat_send_player(name, "[~] Speed must be between 0.0 and 10.0.") + return + end + + player:set_physics_override(tonumber(speed), nil, nil) + minetest.chat_send_player(name, "[~] Speed set to " .. tonumber(speed) * 100 .. " %.") + end, +}) + +minetest.register_chatcommand("gravity", { + params = "[gravity]", + description = "Sets your gravity (defaults to 1).", + privs = {physics = true}, + func = function(name, gravity) + local player = minetest.get_player_by_name(name) + if not player then return end + if gravity == "" then gravity = 1 end + if type(tonumber(gravity)) ~= "number" + or tonumber(gravity) < -10 + or tonumber(gravity) > 10 then + minetest.chat_send_player(name, "[~] Gravity must be between -10.0 and 10.0.") + return + end + + player:set_physics_override(nil, nil, tonumber(gravity)) + minetest.chat_send_player(name, "[~] Gravity set to " .. tonumber(gravity) * 100 .. " %.") + end, +}) + +minetest.register_chatcommand("jump", { + params = "[height]", + description = "Sets your jump height (defaults to 1)", + privs = {physics = true}, + func = function(name, jump) + local player = minetest.get_player_by_name(name) + if not player then return end + if jump == "" then jump = 1 end + if type(tonumber(jump)) ~= "number" + or tonumber(jump) < 0 + or tonumber(jump) > 10 then + minetest.chat_send_player(name, "[~] Jump height must be between 0.0 and 10.0.") + return + end + + player:set_physics_override(nil, tonumber(jump), nil) + minetest.chat_send_player(name, "[~] Jump height set to " .. tonumber(jump) * 100 .. " %.") + end, +}) + +minetest.register_chatcommand("hotbar", { + params = "[size]", + description = "Sets the size of your hotbar", + func = function(name, slots) + if slots == "" then slots = 16 end + if type(tonumber(slots)) ~= "number" or tonumber(slots) < 1 or tonumber(slots) > 23 then + minetest.chat_send_player(name, "[_] Hotbar size must be between 1 and 23.") + return + end + local player = minetest.get_player_by_name(name) + player:hud_set_hotbar_itemcount(tonumber(slots)) + minetest.chat_send_player(name, "[_] Hotbar size set to " .. tonumber(slots) .. ".") + end, +}) diff --git a/craft_obsidian.lua b/craft_obsidian.lua new file mode 100755 index 0000000..7afda0e --- /dev/null +++ b/craft_obsidian.lua @@ -0,0 +1,10 @@ +-- Craft obsidian +minetest.register_craft({ + output = "default:obsidian", + recipe = { + {"bucket:bucket_lava"}, + }, + replacements = { + {"bucket:bucket_lava", "bucket:bucket_empty"} + }, +}) diff --git a/depends.txt b/depends.txt new file mode 100755 index 0000000..1ae3aaa --- /dev/null +++ b/depends.txt @@ -0,0 +1,4 @@ +interact +moretrees? +nether? +bushes? diff --git a/forbid_underwater_torch.lua b/forbid_underwater_torch.lua new file mode 100644 index 0000000..a0b0af5 --- /dev/null +++ b/forbid_underwater_torch.lua @@ -0,0 +1,8 @@ +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + if newnode.name ~= "default:torch" or minetest.get_item_group(oldnode.name, "water") == 0 then + return + end + minetest.remove_node(pos, newnode) + minetest.set_node(pos, oldnode) + minetest.add_item(pos, "default:torch") +end) diff --git a/furnace_locked.lua b/furnace_locked.lua new file mode 100755 index 0000000..1517c35 --- /dev/null +++ b/furnace_locked.lua @@ -0,0 +1,343 @@ + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + local formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + return formspec +end + +local inactive_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + +-- +-- Node callback functions that are the same for active and inactive furnace +-- +local function has_locked_furnace_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") and player:get_player_name() ~= minetest.setting_get("name") then + return false + end + return true +end + + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return has_locked_furnace_privilege(meta, player) and inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_furnace_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked furnace belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos) .. ".") + return 0 + end + + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if inv:is_empty("src") then + meta:set_string("infotext", "Furnace is empty") + end + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_furnace_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked furnace belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos) .. ".") + return 0 + end + return stack:get_count() +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist = inv:get_list("src") + local fuellist = inv:get_list("fuel") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + local cookable = true + + if cooked.time == 0 then + cookable = false + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + 1 + + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + 1 + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = 0 + end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + + fuel_totaltime = fuel.time + fuel_time = 0 + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + end + end + + -- + -- Update formspec, infotext and node + -- + local formspec = inactive_formspec + local item_state + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + item_state = item_percent .. "%" + else + if srclist[1]:is_empty() then + item_state = "Empty" + else + item_state = "Not cookable" + end + end + + local fuel_state = "Empty" + local active = "inactive " + local result = false + + if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then + active = "active " + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = fuel_percent .. "%" + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_locked_active") + -- make sure timer restarts automatically + result = true + else + if not fuellist[1]:is_empty() then + fuel_state = "0%" + end + swap_node(pos, "default:furnace_locked") + -- stop timer on the inactive furnace + local timer = minetest.get_node_timer(pos) + timer:stop() + end + + local infotext = "Locked Furnace " .. active .."(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")\n(owned by "..meta:get_string("owner") .. ")" + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + return result +end + +-- +-- Node definitions +-- + +minetest.register_node(":default:furnace_locked", { + description = "Locked Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_locked_front.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + can_dig = can_dig, + + on_timer = furnace_node_timer, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", "Locked Furnace (owned by " .. placer:get_player_name() .. ")") + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('fuel', 1) + inv:set_size('dst', 4) + end, + + on_metadata_inventory_move = function(pos) + local timer = minetest.get_node_timer(pos) + timer:start(1.0) + end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether furnace can burn or not. + local timer = minetest.get_node_timer(pos) + timer:start(1.0) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "src", drops) + default.get_inventory_drops(pos, "fuel", drops) + default.get_inventory_drops(pos, "dst", drops) + drops[#drops+1] = "default:furnace_locked" + minetest.remove_node(pos) + return drops + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +minetest.register_node(":default:furnace_locked_active", { + description = "Locked Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", + { + image = "default_furnace_locked_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace_locked", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + on_timer = furnace_node_timer, + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + + +minetest.register_craft({ + output = "default:furnace_locked", + recipe = { + {"group:stone", "group:stone", "group:stone"}, + {"group:stone", "group:ingot", "group:stone"}, + {"group:stone", "group:stone", "group:stone"}, + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "default:furnace_locked", + recipe = {"default:furnace", "group:ingot"}, +}) diff --git a/give_initial_stuff.lua b/give_initial_stuff.lua new file mode 100755 index 0000000..85b851e --- /dev/null +++ b/give_initial_stuff.lua @@ -0,0 +1,10 @@ +minetest.register_on_newplayer(function(player) + print("Un nouveau joueur vient de nous rejoindre !") + if minetest.setting_getbool("give_initial_stuff") then + print("Equipement de depart transmis") + player:get_inventory():add_item("main", "default:axe_wood") + player:get_inventory():add_item("main", "default:torch 10") + player:get_inventory():add_item("main", "default:sapling 2") + player:get_inventory():add_item("main", "default:apple 5") + end +end) diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..4012a4f --- /dev/null +++ b/init.lua @@ -0,0 +1,48 @@ +--------------------- +-- Server Misc Mod -- +--------------------- + +local cwd = minetest.get_modpath("_misc") + +-- Code extracted from edits done in the default mod +dofile(cwd.."/carbone_init.lua") +dofile(cwd.."/commands.lua") +dofile(cwd.."/forbid_underwater_torch.lua") + +-- Give initial stuff +dofile(cwd.."/give_initial_stuff.lua") + +-- Chat Commands +dofile(cwd.."/chatcommands.lua") + +-- No Interact Messages +dofile(cwd.."/nointeract_messages.lua") + +-- irc +dofile(cwd.."/irc.lua") +-- No Shout Messages +dofile(cwd.."/noshout_messages.lua") + +-- Aliases +dofile(cwd.."/aliases.lua") + +-- Craft Obsidian +dofile(cwd.."/craft_obsidian.lua") + +-- UnCraft Woll +dofile(cwd.."/uncraft_woll.lua") + +-- List players +dofile(cwd.."/list_players.lua") + +-- Desert Sand/Sand swap +dofile(cwd.."/sand_swapping.lua") + +-- Sapling craft recipes +dofile(cwd.."/sapling_crafts.lua") + +-- Bush seeds +dofile(cwd.."/bush_seeds.lua") + +--Locked furnace +dofile(cwd.."/furnace_locked.lua") diff --git a/irc.lua b/irc.lua new file mode 100755 index 0000000..10e141b --- /dev/null +++ b/irc.lua @@ -0,0 +1,84 @@ +# Based on https://github.com/ChaosWormz/mt_terms_of_use + +local IRC = [[ +-~= Regles du salon de chat IRC #minetestforfun@irc.inchra.net =~- +(Ces regles ont ete etablies le 1er Novembre 2014 par les operateurs du canal Mg et MinetestForFun) + +1) Il ne sera tolere aucune transgressions aux regles du reseau InchraNet, sous peine de la sanction prevue par les administrateurs du reseau. +2) Il ne sera tolere aucune forme de violation des lois en vigueur dans les pays de residence des participants, ainsi que ceux des hebergeurs des serveurs. +3) Il ne sera tolere aucune sorte d'insulte, de provocation gratuite, d'incitation a la haine, au meurtre, au suicide, ou toute autre forme d'atteinte au respect mutuel des utilisateurs de l'IRC. +4) Il ne sera tolere aucune forme de flood ainsi que de spam. Rappelez-vous qu'il est preferable d'utiliser un site de televersion de texte (aussi nomme "pastebin"), tel que "pastebin.ubuntu.com" a chaque fois que vous desirez transmettre du code ou un long texte. + Le flood est l'action de saturer le chat de messages repetitifs, inutiles, y compris les join/part, grossiers, sans aucun rapport avec la conversation et au detriment des participants + Le spam est l'action de faire de la publicite pour quelque chose que ce soit sans l'accord d'un ayant droit ou d'un operateur de canal. +5) Il ne sera tolere aucun pseudonyme a caractere sexuel, haineux, contenant des termes ou propos indesirables sur le salon. +6) Il ne sera tolere aucune forme d'harcelement moral ou a caractere sexuel, y compris par messages prives. +7) Il ne sera tolere aucun type de discrimination contre quelque participant que ce soit, ni aucune forme d'insulte envers les operateurs, semi-operateurs et administrateurs d'InchraNet. + +Voici les sanctions prevues pour les infractions aux regles ci-dessus. + +- Infraction niveau DIRT : + Manque de respect envers autrui : Devoice une journee + Provocation envers autrui : Devoice une journee + Insultes envers autrui : Kick + Devoice une journee + +- Infraction niveau STONE : + - Recidivide d'infraction niveau dirt : Kick + Ban 1/2 journee + - Flood, Discrimination : Kick + Devoice deux heures + - Spam : Kick + Devoice 1 jour + Ban 1/2 journee + +- Infraction niveau MESE : + - Recidive d'infraction niveau stone : Kick + Ban 4 jours + devoice 5 jours + - Diffusion de contenu a caractere sexuel : Kick + Ban 1 semaine + devoice 5 jours + - Irrespect envers l'equipe du canal : Kick + Ban 10 jours + devoice 8 jours + +- Infraction niveau OBSIDIAN : + - Recidive d'infraction niveau mese : Kick + Ban 1 mois + devoice 2 semaines + - Violation des lois en vigueur : Kick + Ban definitif + Gline si accord des IrcOP d'InchraNet + - Violation des regles d'InchraNet : Kick + Ban definitif + Gline ou sanction defnie par l'equipe d'InchraNet + + +Autres regles de bienseances : +- Ne demandez pas a faire partie des operateurs/semi-operateurs du canal. +- Attention, l'abus de query et msg est dangereux pour la sante. +- Inutile de faire etalage de votre vie privee si c'est hors contexte ou si personne n'est interesse par celle ci. +- Nous ne sanctionnons bien evidemment pas le hors-sujet, toutefois, s'il est evitable ca ne peut qu’être toujours un plus ! +- Le respect d'autrui est important a nos yeux. +- En cas de probleme, n'hesitez pas a contacter le staff. +]] + +local function make_formspec() + local size = { "size[12,10;]" } + table.insert(size, "background[-0.22,-0.25;13,11;irc_background.jpg]") + table.insert(size, "textarea[.50,1;12,10;TOS;Voici les regles, cliquez sur Accepter si vous etes d'accord avec;"..minetest.formspec_escape(IRC).."]") + table.insert(size, "button_exit[6,9.9;1.5,0.5;accept;J'accepte]") + table.insert(size, "button[7.5,9.9;1.5,0.5;decline;Je refuse]") + return table.concat(size) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "irc" then return end + local name = player:get_player_name() + if fields.accept then + minetest.chat_send_player(name, "Merci d'avoir accepte les regles, vous etes maintenant capable de parler.") + minetest.chat_send_player(name, "Pour plus d'informations tapez /news") + local privs = minetest.get_player_privs(name) + privs.shout = true + minetest.set_player_privs(name, privs) + --end + return + elseif fields.decline then + minetest.kick_player(name, "Aurevoir ! Vous devez accepter les regles de l'irc pour jouer sur le serveur (revennez si vous changez d'avis).") + return + end +end) + +minetest.register_chatcommand("irc",{ + params = "", + description = "Montre les regles de l'irc", + func = function (name,params) + local player = minetest.get_player_by_name(name) + minetest.after(1, function() + minetest.show_formspec(name, "irc", make_formspec()) + end) + end +}) diff --git a/irc_accents.lua b/irc_accents.lua new file mode 100755 index 0000000..e3b7c6c --- /dev/null +++ b/irc_accents.lua @@ -0,0 +1,84 @@ +# Based on https://github.com/ChaosWormz/mt_terms_of_use + +local IRC = [[ +-~= Règles du salon de chat IRC #minetestforfun@irc.inchra.net =~- +(Ces règles ont été établies le 1er Novembre 2014 par les opérateurs du canal Mg et MinetestForFun) + +1) Il ne sera toléré aucune transgressions aux règles du réseau InchraNet, sous peine de la sanction prévue par les administrateurs du réseau. +2) Il ne sera toléré aucune forme de violation des lois en vigueur dans les pays de résidence des participants, ainsi que ceux des hébergeurs des serveurs. +3) Il ne sera toléré aucune sorte d'insulte, de provocation gratuite, d'incitation à la haine, au meurtre, au suicide, ou toute autre forme d'atteinte au respect mutuel des utilisateurs de l'IRC. +4) Il ne sera toléré aucune forme de flood ainsi que de spam. Rappelez-vous qu'il est préférable d'utiliser un site de téléversion de texte (aussi nommé "pastebin"), tel que "pastebin.ubuntu.com" à chaque fois que vous désirez transmettre du code ou un long texte. + Le flood est l'action de saturer le chat de messages répétitifs, inutiles, y compris les join/part, grossiers, sans aucun rapport avec la conversation et au détriment des participants + Le spam est l'action de faire de la publicité pour quelque chose que ce soit sans l'accord d'un ayant droit ou d'un opérateur de canal. +5) Il ne sera toléré aucun pseudonyme à caractère sexuel, haineux, contenant des termes ou propos indésirables sur le salon. +6) Il ne sera toléré aucune forme d'harcèlement moral ou à caractère sexuel, y compris par messages privés. +7) Il ne sera toléré aucun type de discrimination contre quelque participant que ce soit, ni aucune forme d'insulte envers les opérateurs, semi-opérateurs et administrateurs d'InchraNet. + +Voici les sanctions prévues pour les infractions aux règles ci-dessus. + +- Infraction niveau DIRT : + Manque de respect envers autrui : Devoice une journée + Provocation envers autrui : Devoice une journée + Insultes envers autrui : Kick + Devoice une journée + +- Infraction niveau STONE : + - Récidivide d'infraction niveau dirt : Kick + Ban 1/2 journée + - Flood, Discrimination : Kick + Devoice deux heures + - Spam : Kick + Devoice 1 jour + Ban 1/2 journée + +- Infraction niveau MESE : + - Récidive d'infraction niveau stone : Kick + Ban 4 jours + devoice 5 jours + - Diffusion de contenu à caractère sexuel : Kick + Ban 1 semaine + devoice 5 jours + - Irrespect envers l'équipe du canal : Kick + Ban 10 jours + devoice 8 jours + +- Infraction niveau OBSIDIAN : + - Récidive d'infraction niveau mese : Kick + Ban 1 mois + devoice 2 semaines + - Violation des lois en vigueur : Kick + Ban définitif + Gline si accord des IrcOP d'InchraNet + - Violation des règles d'InchraNet : Kick + Ban définitif + Gline ou sanction défnie par l'équipe d'InchraNet + + +Autres règles de bienséances : +- Ne demandez pas à faire partie des opérateurs/semi-opérateurs du canal. +- Attention, l'abus de query et msg est dangereux pour la santé. +- Inutile de faire étalage de votre vie privée si c'est hors contexte ou si personne n'est intéressé par celle ci. +- Nous ne sanctionnons bien évidemment pas le hors-sujet, toutefois, s'il est évitable ça ne peut qu’être toujours un plus ! +- Le respect d'autrui est important à nos yeux. +- En cas de problème, n'hésitez pas à contacter le staff. +]] + +local function make_formspec() + local size = { "size[10,8]" } + table.insert(size, "textarea[0.5,0.5;9.5,8;TOS;Voici les regles, cliquez sur Accepter si vous etes d'accord avec;"..minetest.formspec_escape(IRC).."]") + table.insert(size, "button_exit[6,7.4;1.5,0.5;accept;J'accepte]") + table.insert(size, "button[7.5,7.4;1.5,0.5;decline;Je refuse]") + return table.concat(size) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "irc" then return end + local name = player:get_player_name() + if fields.accept then + minetest.chat_send_player(name, "Merci d'avoir accepte les regles, vous etes maintenant capable de parler.") + minetest.chat_send_player(name, "Pour plus d'informations tapez /news") + local privs = minetest.get_player_privs(name) + privs.shout = true + minetest.set_player_privs(name, privs) + --end + return + elseif fields.decline then + minetest.kick_player(name, "Aurevoir ! Vous devez accepter les règles de l'irc pour jouer sur le serveur (revennez si vous changez d'avis).") + return + end +end) + +minetest.register_chatcommand("irc",{ + params = "", + description = "Montre les regles de l'irc", + privs = {spawn=true}, + func = function (name,params) + local player = minetest.get_player_by_name(name) + minetest.after(1, function() + minetest.show_formspec(name, "irc", make_formspec()) + end) + end +}) diff --git a/list_players.lua b/list_players.lua new file mode 100755 index 0000000..f6587cd --- /dev/null +++ b/list_players.lua @@ -0,0 +1,20 @@ +-- list_players +-- Extracted from MT_essentials, by IndriAppolo +-- + +minetest.register_chatcommand("list_players", { + params = "", + description = "List currentky connected players", + func = function(name,param) + local list + for i,player in ipairs(minetest.get_connected_players()) do + local lname = player:get_player_name() + if not list then list = lname.." " + else list = list..lname.." " end + end + minetest.chat_send_player(name,"-- "..table.getn(minetest.get_connected_players()).." player(s) connected --\n"..list) + return true + end, +}) + +minetest.register_chatcommand("players", core.chatcommands["list_players"]) diff --git a/nointeract_messages.lua b/nointeract_messages.lua new file mode 100755 index 0000000..e0b28a4 --- /dev/null +++ b/nointeract_messages.lua @@ -0,0 +1,31 @@ + +local players = {} + +local function tick(name) + if players[name] == nil then return end + if not minetest.get_player_by_name(name) or minetest.check_player_privs(name, {interact=true}) == true then + players[name] = nil + return + end + if minetest.check_player_privs(name, {shout=true}) then + minetest.chat_send_player(name, "Hey " .. name .. " ! Pour pouvoir construire et intéragir sur ce serveur, tu dois lire les règles du serveur et les accepter. Tape /rules.") + minetest.chat_send_player(name, "Hey " .. name .. " ! To build and interact on this server, you have to read the rules of our server and agree them. Type /rules.") + end + minetest.after(20, tick, name) +end + + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + if not minetest.check_player_privs(name, {interact=true}) and players[name] == nil then + minetest.after(7, tick, name) + players[name] = true + end +end) + + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + if not name then return end + players[name] = nil +end) diff --git a/noshout_messages.lua b/noshout_messages.lua new file mode 100755 index 0000000..3f1b09f --- /dev/null +++ b/noshout_messages.lua @@ -0,0 +1,30 @@ + +local players = {} + +local function tick(name) + if players[name] == nil then return end + if not minetest.get_player_by_name(name) or minetest.check_player_privs(name, {shout=true}) == true then + players[name] = nil + return + end + + minetest.chat_send_player(name, "Hey " .. name .. " ! Pour pouvoir communiquer avec les autres joueurs sur ce serveur, tu dois lire les règles de l'irc et les accepter. Tape /irc.") + minetest.chat_send_player(name, "Hey " .. name .. " ! To speak to other people on this server, you have to read the rules of our irc channel and agree them. Type /irc.") + minetest.after(20, tick, name) +end + + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + if minetest.check_player_privs(name, {shout=false}) and players[name] == nil then + minetest.after(5, tick, name) + players[name] = true + end +end) + + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + if not name then return end + players[name] = nil +end) diff --git a/sand_swapping.lua b/sand_swapping.lua new file mode 100644 index 0000000..2fe45bc --- /dev/null +++ b/sand_swapping.lua @@ -0,0 +1,13 @@ +-- Swap sands + +-- desert -> normal +minetest.register_craft({ + output = "default:sand", + recipe = {{"default:desert_sand"}} +}) + +-- normal -> desert +minetest.register_craft({ + output = "default:desert_sand", + recipe = {{"default:sand"}} +}) diff --git a/sapling_crafts.lua b/sapling_crafts.lua new file mode 100644 index 0000000..3c6345e --- /dev/null +++ b/sapling_crafts.lua @@ -0,0 +1,84 @@ +-- Crafts for saplings +-- From Skyblock by Cornernote +-- + +-- sapling from leaves and sticks +minetest.register_craft({ + output = 'default:sapling', + recipe = { + {'default:leaves', 'default:leaves', 'default:leaves'}, + {'default:leaves', 'default:leaves', 'default:leaves'}, + {'', 'default:stick', ''}, + } +}) + +-- junglesapling from jungleleaves and sticks +minetest.register_craft({ + output = 'default:junglesapling', + recipe = { + {'default:jungleleaves', 'default:jungleleaves', 'default:jungleleaves'}, + {'default:jungleleaves', 'default:jungleleaves', 'default:jungleleaves'}, + {'', 'default:stick', ''}, + } +}) + +-- pine_sapling from pine_needles and sticks +minetest.register_craft({ + output = 'default:pine_sapling', + recipe = { + {'default:pine_needles', 'default:pine_needles', 'default:pine_needles'}, + {'default:pine_needles', 'default:pine_needles', 'default:pine_needles'}, + {'', 'default:stick', ''}, + } +}) + +-- Aspen tree +minetest.register_craft({ + output = "default:aspen_sapling", + recipe = { + {"default:aspen_leaves", "default:aspen_leaves", "default:aspen_leaves"}, + {"default:aspen_leaves", "default:aspen_leaves", "default:aspen_leaves"}, + {"", "default:stick", ""}, + } +}) + +-- Cherry trees +minetest.register_craft({ + output = "default:cherry_sapling", + recipe = { + {"default:cherry_blossom_leaves", "default:cherry_blossom_leaves", "default:cherry_blossom_leaves"}, + {"default:cherry_blossom_leaves", "default:cherry_blossom_leaves", "default:cherry_blossom_leaves"}, + {"", "default:stick", ""}, + } +}) + +-- With nether +if minetest.get_modpath("nether") then + minetest.register_craft({ + output = "nether:tree_sapling", + recipe = { + {"nether:leaves", "nether:leaves", "nether:leaves"}, + {"nether:leaves", "nether:leaves", "nether:leaves"}, + {"", "default:stick", ""}, + } + }) +end + +-- With moretrees +if minetest.get_modpath("moretrees") then + for _, tdef in pairs(moretrees.treelist) do + local treename = tdef[1] + if treename ~= "jungletree" then + local leaves = "moretrees:" .. treename .. "_leaves" + + minetest.register_craft({ + output = "moretrees:" .. treename .. "_sapling", + recipe = { + {leaves, leaves, leaves}, + {leaves, leaves, leaves}, + {"", "default:stick", ""}, + } + }) + end + end +end diff --git a/sounds/player_join.ogg b/sounds/player_join.ogg new file mode 100755 index 0000000..cc6eb85 Binary files /dev/null and b/sounds/player_join.ogg differ diff --git a/sounds/player_leave.ogg b/sounds/player_leave.ogg new file mode 100755 index 0000000..4c6c4d9 Binary files /dev/null and b/sounds/player_leave.ogg differ diff --git a/textures/bushes_youngtree.png b/textures/bushes_youngtree.png new file mode 100644 index 0000000..d4a7cfa Binary files /dev/null and b/textures/bushes_youngtree.png differ diff --git a/textures/default_furnace_locked_front.png b/textures/default_furnace_locked_front.png new file mode 100755 index 0000000..14362b8 Binary files /dev/null and b/textures/default_furnace_locked_front.png differ diff --git a/textures/default_furnace_locked_front_active.png b/textures/default_furnace_locked_front_active.png new file mode 100755 index 0000000..9fe776d Binary files /dev/null and b/textures/default_furnace_locked_front_active.png differ diff --git a/textures/default_infotool.png b/textures/default_infotool.png new file mode 100755 index 0000000..daf8cea Binary files /dev/null and b/textures/default_infotool.png differ diff --git a/textures/irc_background.jpg b/textures/irc_background.jpg new file mode 100755 index 0000000..5a558d5 Binary files /dev/null and b/textures/irc_background.jpg differ diff --git a/uncraft_woll.lua b/uncraft_woll.lua new file mode 100755 index 0000000..97f4d5d --- /dev/null +++ b/uncraft_woll.lua @@ -0,0 +1,119 @@ +-- récupéré les "cotton" des "wool" faite (récupère 3 aulieu de 4 et perte du colorant) +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:black"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:white"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:grey"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:dark_grey"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:blue"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:brown"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:cyan"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:green"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:dark_green"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:dark_grey"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:dark_grey"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:magenta"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:orange"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:pink"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:red"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:violet"}, + }, +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = { + {"wool:yellow"}, + }, +})