!/mods/minetest/mods_here.txt
/worlds
/world/
-/clientmods/*
+/clientmods/custom
!/clientmods/preview/
/client/mod_storage/
--- /dev/null
+local function loop()
+ local item = minetest.get_wielded_item():get_name()
+ local pos = minetest.find_node_near(minetest.localplayer:get_pos(), 5, "mcl_farming:wheat", true)
+ if item == "mcl_farming:wheat_seeds" and pos then
+ minetest.dig_node(pos)
+ minetest.place_node(pos)
+ end
+ minetest.after(0.1, loop)
+end
+
+minetest.after(0.1, loop)
--- /dev/null
+buildbot = {}
+
+local function build_y(callback)
+ buildbot.pos.y = buildbot.pos.y - buildbot.step.y
+ local function step()
+ buildbot.pos.y = buildbot.pos.y + buildbot.step.y
+ minetest.after(0.25, (buildbot.pos.y == buildbot.goal.y) and callback or step)
+ minetest.place_node(buildbot.pos)
+ local player_pos = minetest.find_node_near(buildbot.pos, 2, "air")
+ if player_pos then
+ minetest.localplayer:set_pos(player_pos)
+ end
+ end
+ minetest.after(0.25, step)
+end
+
+local function build_z(callback)
+ buildbot.pos.z = buildbot.pos.z - buildbot.step.z
+ local function step()
+ buildbot.start.y, buildbot.goal.y = buildbot.goal.y, buildbot.start.y
+ buildbot.step.y = (buildbot.goal.y > buildbot.pos.y) and 1 or -1
+ buildbot.pos.z = buildbot.pos.z + buildbot.step.z
+ build_y((buildbot.pos.z == buildbot.goal.z) and callback or step)
+ end
+ minetest.after(0.25, step)
+end
+
+local function build_x(callback)
+ buildbot.pos.x = buildbot.pos.x - buildbot.step.x
+ local function step()
+ buildbot.start.z, buildbot.goal.z = buildbot.goal.z, buildbot.start.z
+ buildbot.step.z = (buildbot.goal.z > buildbot.pos.z) and 1 or -1
+ buildbot.pos.x = buildbot.pos.x + buildbot.step.x
+ build_z((buildbot.pos.x == buildbot.goal.x) and callback or step)
+ end
+ minetest.after(0.25, step)
+end
+
+minetest.register_chatcommand("build", {
+ func = function(param)
+ local sucess
+ buildbot.start = vector.round(minetest.localplayer:get_pos())
+ buildbot.pos = vector.new(buildbot.start)
+ success, buildbot.goal = minetest.parse_pos(param)
+ if success then
+ buildbot.step = {}
+ buildbot.step.x = (buildbot.goal.x > buildbot.start.x) and 1 or -1
+ buildbot.start.z, buildbot.goal.z = buildbot.goal.z, buildbot.start.z
+ buildbot.start.y, buildbot.goal.y = buildbot.goal.y, buildbot.start.y
+ build_x(function() minetest.display_chat_message("Done.") end)
+ end
+ return false, buildbot.goal
+ end
+})
+
+local keep_digging = false
+
+core.register_chatcommand("keepdigging", {
+ params = "<X>,<Y>,<Z>",
+ description = "Dig node again and again",
+ func = function(param)
+ local success, pos = core.parse_pos(param)
+ if success then
+ keep_digging = true
+ local function loop()
+ core.dig_node(pos)
+ if keep_digging then
+ core.after(0.1, loop)
+ end
+ end
+ loop()
+ end
+ end,
+})
+
+core.register_chatcommand("stopdigging", {
+ description = "Stop diggin",
+ func = function()
+ keep_digging = false
+ end,
+})
+
+
+core.register_chatcommand("digaround", {
+ description = "Scan for one or multible nodes in a radius around you",
+ param = "<radius> node1[,node2...]",
+ func = function(param)
+ local radius = tonumber(param:split(" ")[1])
+ local nodes = param:split(" ")[2]:split(",")
+ local function loop()
+ local fpos = core.find_node_near(core.localplayer:get_pos(), radius, nodes, true)
+ if fpos then core.dig_node(fpos) end
+ core.after(0, loop)
+ end
+ loop()
+ end,
+})
--- /dev/null
+MIT License
+
+Copyright (c) 2018 red-001
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null
+# colour_chat
+A minetest CSM mod for changing the colour of text sent to the server.
+
+### Usage
+Use .set_colour to set the colour of chat sent to the server, you can use either HTML named colours or HTML hexdecimal colour codes. Use .rainbow to generate rainbow text
--- /dev/null
+local modstorage = core.get_mod_storage()
+
+local register_on_message = core.register_on_sending_chat_message
+if core.register_on_sending_chat_messages then
+ register_on_message = core.register_on_sending_chat_messages
+end
+
+local function rgb_to_hex(rgb)
+ local hexadecimal = '#'
+
+ for key, value in pairs(rgb) do
+ local hex = ''
+
+ while(value > 0)do
+ local index = math.fmod(value, 16) + 1
+ value = math.floor(value / 16)
+ hex = string.sub('0123456789ABCDEF', index, index) .. hex
+ end
+
+ if(string.len(hex) == 0)then
+ hex = '00'
+
+ elseif(string.len(hex) == 1)then
+ hex = '0' .. hex
+ end
+
+ hexadecimal = hexadecimal .. hex
+ end
+
+ return hexadecimal
+end
+
+local function color_from_hue(hue)
+ local h = hue / 60
+ local c = 255
+ local x = (1 - math.abs(h%2 - 1)) * 255
+
+ local i = math.floor(h);
+ if (i == 0) then
+ return rgb_to_hex({c, x, 0})
+ elseif (i == 1) then
+ return rgb_to_hex({x, c, 0})
+ elseif (i == 2) then
+ return rgb_to_hex({0, c, x})
+ elseif (i == 3) then
+ return rgb_to_hex({0, x, c});
+ elseif (i == 4) then
+ return rgb_to_hex({x, 0, c});
+ else
+ return rgb_to_hex({c, 0, x});
+ end
+end
+
+local function canTalk()
+ if core.get_privilege_list then
+ return core.get_privilege_list().shout
+ else
+ return true
+ end
+end
+
+local function say(message)
+ if not canTalk() then
+ minetest.display_chat_message("You need 'shout' in order to talk")
+ return
+ end
+ minetest.send_chat_message(message)
+ if minetest.get_server_info().protocol_version < 29 then
+ local name = minetest.localplayer:get_name()
+ minetest.display_chat_message("<"..name.."> " .. message)
+ end
+end
+
+register_on_message(function(message)
+ if message:sub(1,1) == "/" or modstorage:get_string("colour") == "" or modstorage:get_string("colour") == "white" then
+ return false
+ end
+
+ say(core.get_color_escape_sequence(modstorage:get_string("colour")) .. message)
+ return true
+end)
+
+core.register_chatcommand("set_colour", {
+ description = core.gettext("Change chat colour"),
+ func = function(colour)
+ modstorage:set_string("colour", colour)
+ return true, "Chat colour changed."
+ end,
+})
+
+core.register_chatcommand("rainbow", {
+ description = core.gettext("rainbow text"),
+ func = function(param)
+ if not canTalk() then
+ return false, "You need 'shout' in order to use this command"
+ end
+ local step = 360 / param:len()
+ local hue = 0
+ -- iterate the whole 360 degrees
+ local output = ""
+ for i = 1, param:len() do
+ local char = param:sub(i,i)
+ if char:match("%s") then
+ output = output .. char
+ else
+ output = output .. core.get_color_escape_sequence(color_from_hue(hue)) .. char
+ end
+ hue = hue + step
+ end
+ say(output)
+ return true
+end,
+})
+
+core.register_chatcommand("say", {
+ description = core.gettext("Send text without applying colour to it"),
+ func = function(text)
+ say(text)
+ return true
+ end,
+})
--- /dev/null
+core.register_chatcommand("place", {
+ params = "<X>,<Y>,<Z>",
+ description = "Place wielded item",
+ func = function(param)
+ local success, pos = core.parse_pos(param)
+ if success then
+ core.place_node(pos)
+ return true, "Node placed at " .. core.pos_to_string(pos)
+ end
+ return false, pos
+ end,
+})
+
+core.register_chatcommand("dig", {
+ params = "<X>,<Y>,<Z>",
+ description = "Dig node",
+ func = function(param)
+ local success, pos = core.parse_pos(param)
+ if success then
+ core.dig_node(pos)
+ return true, "Node at " .. core.pos_to_string(pos) .. " dug"
+ end
+ return false, pos
+ end,
+})
+
+core.register_chatcommand("kill", {
+ description = "Kill yourself",
+ func = function(param)
+ core.send_damage(core.localplayer:get_hp())
+ end,
+})
+
+core.register_chatcommand("scan", {
+ description = "Scan for one or multible nodes in a radius around you",
+ param = "<radius> node1[,node2...]",
+ func = function(param)
+ local radius = tonumber(param:split(" ")[1])
+ local nodes = param:split(" ")[2]:split(",")
+ local pos = core.localplayer:get_pos()
+ local fpos = core.find_node_near(pos, radius, nodes, true)
+ if fpos then
+ return true, "Found " .. table.concat(nodes, " or ") .. " at " .. core.pos_to_string(fpos)
+ end
+ return false, "None of " .. table.concat(nodes, " or ") .. " found in a radius of " .. tostring(radius)
+ end,
+})
+
+local function teleport(param)
+ local success, pos = core.parse_pos(param)
+ if success then
+ core.localplayer:set_pos(pos)
+ return true, "Teleporting to " .. core.pos_to_string(pos)
+ end
+ return false, pos
+end
+
+core.register_chatcommand("teleport", {
+ params = "<X>,<Y>,<Z>",
+ description = "Teleport to position",
+ func = function(param)
+ return teleport(param)
+ end,
+})
+
+core.register_chatcommand("tpoff", {
+ params = "<X>,<Y>,<Z>",
+ description = "Teleport to position and log out immediately",
+ func = function(param)
+ teleport(param)
+ minetest.disconnect()
+ end,
+})
+
+minetest.register_chatcommand("wielded", {
+ description = "Print itemstring of wieleded item",
+ func = function()
+ return true, minetest.get_wielded_item():get_name()
+ end
+})
--- /dev/null
+minetest.override_item("air", {liquids_pointable = true})
--- /dev/null
+
+function get_itemslot_bg(x, y, w, h)
+ local out = ""
+ for i = 0, w - 1, 1 do
+ for j = 0, h - 1, 1 do
+ out = out .."image["..x+i..","..y+j..";1,1;mcl_formspec_itemslot.png]"
+ end
+ end
+ return out
+end
+
+local formspec_ender_chest = "size[9,8.75]"..
+ "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", "Ender Chest")).."]"..
+ "list[current_player;enderchest;0,0.5;9,3;]"..
+ get_itemslot_bg(0,0.5,9,3)..
+ "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", "Inventory")).."]"..
+ "list[current_player;main;0,4.5;9,3;9]"..
+ get_itemslot_bg(0,4.5,9,3)..
+ "list[current_player;main;0,7.74;9,1;]"..
+ get_itemslot_bg(0,7.74,9,1)..
+ "listring[current_player;enderchest]"..
+ "listring[current_player;main]"
+
+minetest.register_chatcommand("echest", {
+ func = function()
+ minetest.show_formspec("echest:enderchest", formspec_ender_chest)
+ end
+})
--- /dev/null
+load_mod_set = true
+load_mod_buildbot = true
+load_mod_colour_chat = true
+load_mod_custom = true
+load_mod_echest = true
+load_mod_autofarm = false
+load_mod_commands = true
+load_mod_test = false
+load_mod_destroyliquids = true
--- /dev/null
+core.register_chatcommand("set", {
+ params = "([-n] <name> <value>) | <name>",
+ description = "Set or read client configuration setting",
+ privs = {server=true},
+ func = function(param)
+ local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)")
+ if arg and arg == "-n" and setname and setvalue then
+ core.settings:set(setname, setvalue)
+ return true, setname .. " = " .. setvalue
+ end
+
+ setname, setvalue = string.match(param, "([^ ]+) (.+)")
+ if setname and setvalue then
+ if not core.settings:get(setname) then
+ return false, "Failed. Use '.set -n <name> <value>' to create a new setting."
+ end
+ core.settings:set(setname, setvalue)
+ return true, setname .. " = " .. setvalue
+ end
+
+ setname = string.match(param, "([^ ]+)")
+ if setname then
+ setvalue = core.settings:get(setname)
+ if not setvalue then
+ setvalue = "<not set>"
+ end
+ return true, setname .. " = " .. setvalue
+ end
+
+ return false, "Invalid parameters (see .help set)."
+ end,
+})
+
--- /dev/null
+minetest.override_item("air", {liquids_pointable = true})