]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
The Robot Update
authorElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 4 Oct 2020 08:50:07 +0000 (10:50 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 4 Oct 2020 08:50:07 +0000 (10:50 +0200)
77 files changed:
builtin/client/cheats.lua
clientmods/chat/init.lua [deleted file]
clientmods/chat/mod.conf [deleted file]
clientmods/chat/rainbow.lua [deleted file]
clientmods/chat/settingtypes.txt [deleted file]
clientmods/commands/init.lua [deleted file]
clientmods/commands/mod.conf [deleted file]
clientmods/dragonfire/autoeat/init.lua [new file with mode: 0644]
clientmods/dragonfire/autoeat/mod.conf [new file with mode: 0644]
clientmods/dragonfire/autoeat/settingtypes.txt [new file with mode: 0644]
clientmods/dragonfire/chat/colors.lua [new file with mode: 0644]
clientmods/dragonfire/chat/init.lua [new file with mode: 0644]
clientmods/dragonfire/chat/leak.lua [new file with mode: 0644]
clientmods/dragonfire/chat/mod.conf [new file with mode: 0644]
clientmods/dragonfire/chat/rainbow.lua [new file with mode: 0644]
clientmods/dragonfire/chat/settingtypes.txt [new file with mode: 0644]
clientmods/dragonfire/chat/spam.lua [new file with mode: 0644]
clientmods/dragonfire/chat/status.lua [new file with mode: 0644]
clientmods/dragonfire/commands/init.lua [new file with mode: 0644]
clientmods/dragonfire/commands/mod.conf [new file with mode: 0644]
clientmods/dragonfire/inventory/autotool.lua [new file with mode: 0644]
clientmods/dragonfire/inventory/enderchest.lua [new file with mode: 0644]
clientmods/dragonfire/inventory/hand.lua [new file with mode: 0644]
clientmods/dragonfire/inventory/init.lua [new file with mode: 0644]
clientmods/dragonfire/inventory/invhack.lua [new file with mode: 0644]
clientmods/dragonfire/inventory/mod.conf [new file with mode: 0644]
clientmods/dragonfire/inventory/next_item.lua [new file with mode: 0644]
clientmods/dragonfire/inventory/settingtypes.txt [new file with mode: 0644]
clientmods/dragonfire/modpack.txt [new file with mode: 0644]
clientmods/dragonfire/pathfinding/init.lua [new file with mode: 0644]
clientmods/dragonfire/pathfinding/mod.conf [new file with mode: 0644]
clientmods/dragonfire/pathfinding/settingtypes.txt [new file with mode: 0644]
clientmods/dragonfire/perlin/init.lua [new file with mode: 0644]
clientmods/dragonfire/perlin/mod.conf [new file with mode: 0644]
clientmods/dragonfire/perlin/perlin.lua [new file with mode: 0644]
clientmods/dragonfire/respawn/init.lua [new file with mode: 0644]
clientmods/dragonfire/respawn/mod.conf [new file with mode: 0644]
clientmods/dragonfire/respawn/settingtypes.txt [new file with mode: 0644]
clientmods/dragonfire/schematicas/init.lua [new file with mode: 0644]
clientmods/dragonfire/schematicas/mod.conf [new file with mode: 0644]
clientmods/dragonfire/warp/init.lua [new file with mode: 0644]
clientmods/dragonfire/warp/mod.conf [new file with mode: 0644]
clientmods/dragonfire/world/init.lua [new file with mode: 0644]
clientmods/dragonfire/world/mod.conf [new file with mode: 0644]
clientmods/dragonfire/world/settingtypes.txt [new file with mode: 0644]
clientmods/inventory/autotool.lua [deleted file]
clientmods/inventory/enderchest.lua [deleted file]
clientmods/inventory/init.lua [deleted file]
clientmods/inventory/invhack.lua [deleted file]
clientmods/inventory/mod.conf [deleted file]
clientmods/inventory/next_item.lua [deleted file]
clientmods/inventory/settingtypes.txt [deleted file]
clientmods/mods.conf
clientmods/respawn/init.lua [deleted file]
clientmods/respawn/mod.conf [deleted file]
clientmods/respawn/settingtypes.txt [deleted file]
clientmods/schematicas/init.lua [deleted file]
clientmods/warp/init.lua [deleted file]
clientmods/warp/mod.conf [deleted file]
clientmods/world/init.lua [deleted file]
clientmods/world/settingtypes.txt [deleted file]
doc/client_lua_api.txt
src/client/client.cpp
src/client/game.cpp
src/client/game.h
src/client/gameui.cpp
src/client/inputhandler.h
src/defaultsettings.cpp
src/network/clientpackethandler.cpp
src/script/cpp_api/s_cheats.cpp
src/script/lua_api/l_client.cpp
src/script/lua_api/l_client.h
src/script/lua_api/l_env.cpp
src/script/lua_api/l_localplayer.cpp
src/script/lua_api/l_localplayer.h
util/buildbot/buildwin32.sh
util/buildbot/buildwin64.sh

index 839021ad2726a687c7b4b1a022582cbd16d45689..a6aa13dc7953df6f7e3f43d49767abfd1b407ac2 100644 (file)
@@ -2,10 +2,9 @@ core.cheats = {
        ["Combat"] = {
                ["Killaura"] = "killaura",
                ["AntiKnockback"] = "antiknockback",
-               ["NoFallDamage"] = "prevent_natural_damage",
+               ["FastHit"] = "spamclick",
        },
        ["Movement"] = {
-               ["GodMode"] = "entity_speed",
                ["Freecam"] = "freecam",
                ["PrivBypass"] = "priv_bypass",
                ["AutoForward"] = "continuous_forward",
@@ -20,7 +19,6 @@ core.cheats = {
                ["NoHurtCam"] = "no_hurt_cam",
                ["BrightNight"] = "no_night",
                ["Coords"] = "coords",
-               ["Clouds"] = "enable_clouds",
        },
        ["World"] = {
                ["FastDig"] = "fastdig",
@@ -32,6 +30,13 @@ core.cheats = {
                ["UnlimitedRange"] = "increase_tool_range_plus",
                ["PointLiquids"] = "point_liquids",
        },
+       ["Exploit"] = {
+               ["EntitySpeed"] = "entity_speed",
+               ["ParticleExploit"] = "log_particles",
+       },
+       ["Player"] = {
+               ["NoFallDamage"] = "prevent_natural_damage",
+       },
 }
 
 function core.register_cheat(cheatname, category, func)
diff --git a/clientmods/chat/init.lua b/clientmods/chat/init.lua
deleted file mode 100644 (file)
index 45d61e0..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-chat = {}
-
-chat.rainbow = dofile(minetest.get_modpath("chat") .. "/rainbow.lua")
-
-function chat.send(message)
-       local starts_with = message:sub(1, 1)
-       
-       if starts_with == "/" or starts_with == "." then return end
-
-       local reverse = minetest.settings:get_bool("chat_reverse")
-       
-       if reverse then
-               local msg = ""
-               for i = 1, #message do
-                       msg = message:sub(i, i) .. msg
-               end
-               message = msg
-       end
-       
-       local color = minetest.settings:get("chat_color")
-
-       if color then
-               local msg
-               if color == "rainbow" then
-                       msg = chat.rainbow(message)
-               else
-                       msg = minetest.colorize(color, message)
-               end
-               message = msg
-       end
-       
-       minetest.send_chat_message(message)
-       return true
-end
-
-minetest.register_on_sending_chat_message(chat.send)
-
-local etime = 0
-
-minetest.register_globalstep(function(dtime)
-       etime = etime + dtime
-       if etime < 10/8 then return end
-       etime = 0
-       local spam = minetest.settings:get("chat_spam")
-       local enable_spam = minetest.settings:get("chat_enable_spam")
-       if enable_spam and spam then
-               local _ = chat.send(spam) or minetest.send_chat_message(spam)
-       end
-end)
diff --git a/clientmods/chat/mod.conf b/clientmods/chat/mod.conf
deleted file mode 100644 (file)
index ce94dc1..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-name = chat
-author = Fleckenstein
-description = The chat modifications of Dragonfireclient
diff --git a/clientmods/chat/rainbow.lua b/clientmods/chat/rainbow.lua
deleted file mode 100644 (file)
index 1519619..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-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
-
-return function(input)
-       local step = 360 / input:len()
-       local hue = 0
-       local output = ""
-       for i = 1, input:len() do
-               local char = input:sub(i,i)
-               if char:match("%s") then
-                       output = output .. char
-               else
-               output = output  .. minetest.get_color_escape_sequence(color_from_hue(hue)) .. char 
-               end
-        hue = hue + step
-       end
-       return output
-end
diff --git a/clientmods/chat/settingtypes.txt b/clientmods/chat/settingtypes.txt
deleted file mode 100644 (file)
index 5e5aa8a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-chat_color (Chat Color) string white
-chat_reverse (Reverse Chat messages) bool false
-chat_enable_spam (Spam Chat) bool false
-chat_spam (Message to spam into Chat) string
diff --git a/clientmods/commands/init.lua b/clientmods/commands/init.lua
deleted file mode 100644 (file)
index e481e6c..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-minetest.register_chatcommand("say", {
-       description = "Send raw text",
-       func = function(text)
-               minetest.send_chat_message(text)
-               return true
-       end,
-})
-
-minetest.register_chatcommand("teleport", {
-       params = "<X>,<Y>,<Z>",
-       description = "Teleport to relative coordinates.",
-       func = function(param)
-               local success, pos = minetest.parse_relative_pos(param)
-               if success then
-                       minetest.localplayer:set_pos(pos)
-                       return true, "Teleporting to " .. minetest.pos_to_string(pos)
-               end
-               return false, pos
-       end,
-})
-
-minetest.register_chatcommand("wielded", {
-       description = "Print itemstring of wieleded item",
-       func = function()
-               return true, minetest.get_wielded_item():get_name()
-       end
-})
-
-minetest.register_chatcommand("disconnect", {
-       description = "Exit to main menu",
-       func = function(param)
-               minetest.disconnect()
-       end,
-})
-
-minetest.register_chatcommand("players", {
-       description = "List online players",
-       func = function(param)
-               return true, "Online players: " .. table.concat(minetest.get_player_names(), ", ")
-       end
-})
-
-minetest.register_chatcommand("kill", {
-       description = "Kill yourself",
-       func = function()
-               minetest.send_damage(minetest.localplayer:get_hp())
-       end,
-})
-
-minetest.register_chatcommand("set", {
-       params = "([-n] <name> <value>) | <name>",
-       description = "Set or read client configuration setting",
-       func = function(param)
-               local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)")
-               if arg and arg == "-n" and setname and setvalue then
-                       minetest.settings:set(setname, setvalue)
-                       return true, setname .. " = " .. setvalue
-               end
-
-               setname, setvalue = string.match(param, "([^ ]+) (.+)")
-               if setname and setvalue then
-                       if not minetest.settings:get(setname) then
-                               return false, "Failed. Use '.set -n <name> <value>' to create a new setting."
-                       end
-                       minetest.settings:set(setname, setvalue)
-                       return true, setname .. " = " .. setvalue
-               end
-
-               setname = string.match(param, "([^ ]+)")
-               if setname then
-                       setvalue = minetest.settings:get(setname)
-                       if not setvalue then
-                               setvalue = "<not set>"
-                       end
-                       return true, setname .. " = " .. setvalue
-               end
-
-               return false, "Invalid parameters (see .help set)."
-       end,
-})
diff --git a/clientmods/commands/mod.conf b/clientmods/commands/mod.conf
deleted file mode 100644 (file)
index 48f2d6f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-name = commands
-author = Fleckenstein
-description = Misc cheat commands
diff --git a/clientmods/dragonfire/autoeat/init.lua b/clientmods/dragonfire/autoeat/init.lua
new file mode 100644 (file)
index 0000000..7435e17
--- /dev/null
@@ -0,0 +1,21 @@
+autoeat = {}
+
+local last_step_eating = false
+
+minetest.register_on_damage_taken(function()
+       if not minetest.settings:get_bool("autoeat") then return end
+       local player = minetest.localplayer
+       player:set_wield_index(0)
+       minetest.place_node(player:get_pos())
+       autoeat.eating = true
+end)
+
+minetest.register_globalstep(function()
+       if last_step_eating then
+               autoeat.eating, last_step_eating = false, false
+       elseif autoeat.eating then
+               last_step_eating = true
+       end
+end)
+
+minetest.register_cheat("AutoEat", "Player", "autoeat")
diff --git a/clientmods/dragonfire/autoeat/mod.conf b/clientmods/dragonfire/autoeat/mod.conf
new file mode 100644 (file)
index 0000000..d6dc9db
--- /dev/null
@@ -0,0 +1,3 @@
+name = autoeat
+description = Automatically eat when damage was taken, assuming that there is food in the first hotbar slot. This is only useful when used in combination with an afk bot, like schematicas.
+author = Fleckenstein
diff --git a/clientmods/dragonfire/autoeat/settingtypes.txt b/clientmods/dragonfire/autoeat/settingtypes.txt
new file mode 100644 (file)
index 0000000..9614de0
--- /dev/null
@@ -0,0 +1 @@
+autoeat (Automatically eat when damage was taken) bool false
diff --git a/clientmods/dragonfire/chat/colors.lua b/clientmods/dragonfire/chat/colors.lua
new file mode 100644 (file)
index 0000000..b3ab596
--- /dev/null
@@ -0,0 +1,33 @@
+function chat.send(message)
+       local starts_with = message:sub(1, 1)
+       
+       if starts_with == "/" or starts_with == "." then return end
+
+       local reverse = minetest.settings:get_bool("chat_reverse")
+       
+       if reverse then
+               local msg = ""
+               for i = 1, #message do
+                       msg = message:sub(i, i) .. msg
+               end
+               message = msg
+       end
+       
+       local color = minetest.settings:get("chat_color")
+
+       if color then
+               local msg
+               if color == "rainbow" then
+                       msg = chat.rainbow(message)
+               else
+                       msg = minetest.colorize(color, message)
+               end
+               message = msg
+       end
+       
+       minetest.send_chat_message(message)
+       return true
+end
+
+minetest.register_on_sending_chat_message(chat.send)
diff --git a/clientmods/dragonfire/chat/init.lua b/clientmods/dragonfire/chat/init.lua
new file mode 100644 (file)
index 0000000..5086bc5
--- /dev/null
@@ -0,0 +1,13 @@
+chat = {}
+
+local modname = minetest.get_current_modname()
+local modpath = minetest.get_modpath(modname)
+
+chat.rainbow = dofile(modpath .. "/rainbow.lua")
+
+dofile(modpath .. "/colors.lua")
+dofile(modpath .. "/spam.lua")
+dofile(modpath .. "/status.lua")
+dofile(modpath .. "/leak.lua")
+
+
diff --git a/clientmods/dragonfire/chat/leak.lua b/clientmods/dragonfire/chat/leak.lua
new file mode 100644 (file)
index 0000000..a11704d
--- /dev/null
@@ -0,0 +1,10 @@
+local etime = 0
+
+minetest.register_globalstep(function(dtime)
+       if not minetest.settings:get_bool("leak") then return end
+       etime = etime + dtime
+       if etime < 5 then return end
+       etime = 0
+       local player = minetest.localplayer
+       minetest.send_chat_message(minetest.pos_to_string(vector.floor(player:get_pos())))
+end)  
diff --git a/clientmods/dragonfire/chat/mod.conf b/clientmods/dragonfire/chat/mod.conf
new file mode 100644 (file)
index 0000000..ce94dc1
--- /dev/null
@@ -0,0 +1,3 @@
+name = chat
+author = Fleckenstein
+description = The chat modifications of Dragonfireclient
diff --git a/clientmods/dragonfire/chat/rainbow.lua b/clientmods/dragonfire/chat/rainbow.lua
new file mode 100644 (file)
index 0000000..1519619
--- /dev/null
@@ -0,0 +1,61 @@
+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
+
+return function(input)
+       local step = 360 / input:len()
+       local hue = 0
+       local output = ""
+       for i = 1, input:len() do
+               local char = input:sub(i,i)
+               if char:match("%s") then
+                       output = output .. char
+               else
+               output = output  .. minetest.get_color_escape_sequence(color_from_hue(hue)) .. char 
+               end
+        hue = hue + step
+       end
+       return output
+end
diff --git a/clientmods/dragonfire/chat/settingtypes.txt b/clientmods/dragonfire/chat/settingtypes.txt
new file mode 100644 (file)
index 0000000..9428dd9
--- /dev/null
@@ -0,0 +1,6 @@
+chat_color (Chat Color) string white
+chat_reverse (Reverse Chat messages) bool false
+chat_enable_spam (Spam Chat) bool false
+chat_spam (Message to spam into Chat) string
+ignore_status_messages (Ignore status messages from server) bool true
+leak (Frequently leak your coordinates to chat) bool false
diff --git a/clientmods/dragonfire/chat/spam.lua b/clientmods/dragonfire/chat/spam.lua
new file mode 100644 (file)
index 0000000..991846d
--- /dev/null
@@ -0,0 +1,12 @@
+local etime = 0
+
+minetest.register_globalstep(function(dtime)
+       etime = etime + dtime
+       if etime < 10/8 then return end
+       etime = 0
+       local spam = minetest.settings:get("chat_spam")
+       local enable_spam = minetest.settings:get("chat_enable_spam")
+       if enable_spam and spam then
+               local _ = chat.send(spam) or minetest.send_chat_message(spam)
+       end 
+end)
diff --git a/clientmods/dragonfire/chat/status.lua b/clientmods/dragonfire/chat/status.lua
new file mode 100644 (file)
index 0000000..4cf56a0
--- /dev/null
@@ -0,0 +1,5 @@
+minetest.register_on_receiving_chat_message(function(message)
+       if message:sub(1, 1) == "#" and minetest.settings:get_bool("ignore_status_messages") ~= false then
+               return true
+       end
+end) 
diff --git a/clientmods/dragonfire/commands/init.lua b/clientmods/dragonfire/commands/init.lua
new file mode 100644 (file)
index 0000000..94c824f
--- /dev/null
@@ -0,0 +1,88 @@
+minetest.register_chatcommand("say", {
+       description = "Send raw text",
+       func = function(text)
+               minetest.send_chat_message(text)
+               return true
+       end,
+})
+
+minetest.register_chatcommand("teleport", {
+       params = "<X>,<Y>,<Z>",
+       description = "Teleport to relative coordinates.",
+       func = function(param)
+               local success, pos = minetest.parse_relative_pos(param)
+               if success then
+                       minetest.localplayer:set_pos(pos)
+                       return true, "Teleporting to " .. minetest.pos_to_string(pos)
+               end
+               return false, pos
+       end,
+})
+
+minetest.register_chatcommand("wielded", {
+       description = "Print itemstring of wieleded item",
+       func = function()
+               return true, minetest.localplayer:get_wielded_item():get_name()
+       end
+})
+
+minetest.register_chatcommand("disconnect", {
+       description = "Exit to main menu",
+       func = function(param)
+               minetest.disconnect()
+       end,
+})
+
+minetest.register_chatcommand("players", {
+       description = "List online players",
+       func = function(param)
+               return true, "Online players: " .. table.concat(minetest.get_player_names(), ", ")
+       end
+})
+
+minetest.register_chatcommand("kill", {
+       description = "Kill yourself",
+       func = function()
+               minetest.send_damage(minetest.localplayer:get_hp())
+       end,
+})
+
+minetest.register_chatcommand("hop", {
+       description = "Hop",
+       func = function()
+               minetest.set_keypress("jump", true)
+       end,
+})
+
+minetest.register_chatcommand("set", {
+       params = "([-n] <name> <value>) | <name>",
+       description = "Set or read client configuration setting",
+       func = function(param)
+               local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)")
+               if arg and arg == "-n" and setname and setvalue then
+                       minetest.settings:set(setname, setvalue)
+                       return true, setname .. " = " .. setvalue
+               end
+
+               setname, setvalue = string.match(param, "([^ ]+) (.+)")
+               if setname and setvalue then
+                       if not minetest.settings:get(setname) then
+                               return false, "Failed. Use '.set -n <name> <value>' to create a new setting."
+                       end
+                       minetest.settings:set(setname, setvalue)
+                       return true, setname .. " = " .. setvalue
+               end
+
+               setname = string.match(param, "([^ ]+)")
+               if setname then
+                       setvalue = minetest.settings:get(setname)
+                       if not setvalue then
+                               setvalue = "<not set>"
+                       end
+                       return true, setname .. " = " .. setvalue
+               end
+
+               return false, "Invalid parameters (see .help set)."
+       end,
+})
+
diff --git a/clientmods/dragonfire/commands/mod.conf b/clientmods/dragonfire/commands/mod.conf
new file mode 100644 (file)
index 0000000..48f2d6f
--- /dev/null
@@ -0,0 +1,3 @@
+name = commands
+author = Fleckenstein
+description = Misc cheat commands
diff --git a/clientmods/dragonfire/inventory/autotool.lua b/clientmods/dragonfire/inventory/autotool.lua
new file mode 100644 (file)
index 0000000..7df3982
--- /dev/null
@@ -0,0 +1,36 @@
+local function check_tool(stack, node_groups, old_best_time)
+       local toolcaps = stack:get_tool_capabilities()
+       if not toolcaps then return end
+       local best_time = old_best_time
+       for group, groupdef in pairs(toolcaps.groupcaps) do
+               local level = node_groups[group]
+               if level then
+                       local this_time = groupdef.times[level]
+                       if this_time < best_time then
+                               best_time = this_time
+                       end
+               end
+       end
+       return best_time < old_best_time, best_time
+end
+
+minetest.register_on_punchnode(function(pos, node)
+       if not minetest.settings:get_bool("autotool") then return end
+       local player = minetest.localplayer
+       local inventory = minetest.get_inventory("current_player")
+       local node_groups = minetest.get_node_def(node.name).groups
+       local new_index = player:get_wield_index()
+       local is_better, best_time = false, math.huge
+       is_better, best_time = check_tool(player:get_wielded_item(), node_groups, best_time)
+       is_better, best_time = check_tool(inventory.hand[1], node_groups, best_time)
+       for index, stack in pairs(inventory.main) do
+               is_better, best_time = check_tool(stack, node_groups, best_time)
+               if is_better then
+                       new_index = index - 1
+               end
+       end
+       player:set_wield_index(new_index)
+end)
+
+minetest.register_cheat("AutoTool", "Player", "autotool")
diff --git a/clientmods/dragonfire/inventory/enderchest.lua b/clientmods/dragonfire/inventory/enderchest.lua
new file mode 100644 (file)
index 0000000..37a4c84
--- /dev/null
@@ -0,0 +1,27 @@
+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 = "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]"
+
+function minetest.open_special_inventory()
+       minetest.show_formspec("enderchest:enderchest", formspec)
+end
+
+minetest.register_cheat("Enderchest", "Player", minetest.open_special_inventory)
diff --git a/clientmods/dragonfire/inventory/hand.lua b/clientmods/dragonfire/inventory/hand.lua
new file mode 100644 (file)
index 0000000..05ec66b
--- /dev/null
@@ -0,0 +1,27 @@
+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 = "size[9,8.75]"..
+       "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", "Hand")).."]"..
+       "list[current_player;hand;0,0.5;1,1;]"..
+       get_itemslot_bg(0,0.5,1,1)..
+       "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;hand]"..
+       "listring[current_player;main]"
+       
+local function hand()
+       minetest.show_formspec("inventory:hand", formspec)
+end
+
+minetest.register_cheat("Hand", "Player", hand)
diff --git a/clientmods/dragonfire/inventory/init.lua b/clientmods/dragonfire/inventory/init.lua
new file mode 100644 (file)
index 0000000..4440992
--- /dev/null
@@ -0,0 +1,8 @@
+local modname = minetest.get_current_modname()
+local modpath = minetest.get_modpath(modname)
+
+dofile(modpath .. "/invhack.lua") 
+dofile(modpath .. "/enderchest.lua") 
+dofile(modpath .. "/next_item.lua") 
+dofile(modpath .. "/autotool.lua") 
+dofile(modpath .. "/hand.lua") 
diff --git a/clientmods/dragonfire/inventory/invhack.lua b/clientmods/dragonfire/inventory/invhack.lua
new file mode 100644 (file)
index 0000000..eb6f48b
--- /dev/null
@@ -0,0 +1,13 @@
+minetest.register_chatcommand("invhack", {
+       func = function(player)
+               minetest.show_formspec(
+                       "invhack:invhack",
+                       ""
+                               .. "size[8,7.5]"
+                               .. "list[player:" .. player .. ";main;0,3.5;8,4;]"
+                               .. "list[player:" .. player .. ";craft;3,0;3,3;]"
+                               .. "list[player:" .. player .. ";craftpreview;7,1;1,1;]"
+               )
+       end
+})
diff --git a/clientmods/dragonfire/inventory/mod.conf b/clientmods/dragonfire/inventory/mod.conf
new file mode 100644 (file)
index 0000000..18b883f
--- /dev/null
@@ -0,0 +1,3 @@
+name = inventory
+author = Fleckenstein
+description = The inventory cheats for Dragonfireclient
diff --git a/clientmods/dragonfire/inventory/next_item.lua b/clientmods/dragonfire/inventory/next_item.lua
new file mode 100644 (file)
index 0000000..64eb2b7
--- /dev/null
@@ -0,0 +1,18 @@
+local elapsed_time = 0
+local tick_time = 0.05
+
+minetest.register_globalstep(function(dtime)
+       elapsed_time = elapsed_time + dtime
+       if elapsed_time < tick_time then return end
+       local player = minetest.localplayer
+       if not player then return end
+       local item = player:get_wielded_item()
+       if item:get_count() == 0 and minetest.settings:get_bool("next_item") then
+               local index = player:get_wield_index()
+               player:set_wield_index(index + 1)
+       end
+       elapsed_time = 0
+end)
+
+minetest.register_cheat("NextItem", "Player", "next_item")
+
diff --git a/clientmods/dragonfire/inventory/settingtypes.txt b/clientmods/dragonfire/inventory/settingtypes.txt
new file mode 100644 (file)
index 0000000..fef673b
--- /dev/null
@@ -0,0 +1,2 @@
+next_item (NextItem) bool false
+autotool (AutoTool) bool false
diff --git a/clientmods/dragonfire/modpack.txt b/clientmods/dragonfire/modpack.txt
new file mode 100644 (file)
index 0000000..8d1c8b6
--- /dev/null
@@ -0,0 +1 @@
diff --git a/clientmods/dragonfire/pathfinding/init.lua b/clientmods/dragonfire/pathfinding/init.lua
new file mode 100644 (file)
index 0000000..a807faa
--- /dev/null
@@ -0,0 +1,109 @@
+local positions, index, global_goal
+
+local function roundvec(v, d)
+       return vector.divide(vector.round(vector.multiply(v, d)), d)
+end
+
+local function findpath(pos)
+       global_goal = pos
+       index = 2
+       positions = minetest.find_path(
+               minetest.localplayer:get_pos(),
+               pos,
+               tonumber(minetest.settings:get("goto_max_distance") or 25),
+               tonumber(minetest.settings:get("goto_max_jump") or 1),
+               tonumber(minetest.settings:get("goto_max_drop") or minetest.settings:get_bool("prevent_natural_damage") and 1000 or 5)
+       )
+end
+
+minetest.register_chatcommand("goto", {
+       description = "Go to a position (use pathfinding).",
+       param = "<pos>",
+       func = function(param)
+               if positions then
+                       return false, "Goto is still active. Use .gotoabort to abort it."
+               end
+               local success, pos = minetest.parse_pos(param)
+               if not success then
+                       return false, pos
+               end
+               findpath(pos)
+       end,
+})
+
+minetest.register_chatcommand("gotoabort", {
+       description = "Abort goto.",
+       param = "<pos>",
+       func = function(param)
+               if not positions then
+                       return false, "Goto is currently not running (and also not walking haha)"
+               end
+               minetest.set_keypress("forward", false)
+               minetest.set_keypress("sneak", false)
+               positions, index, global_goal = nil
+               return true, "Aborted."
+       end,
+})
+
+minetest.register_globalstep(function(dtime)
+       if positions then
+               minetest.set_keypress("forward", true)
+               minetest.set_keypress("sneak", false)
+               local player = minetest.localplayer
+               local pos = player:get_pos()
+               local goal, next_goal = positions[index], positions[index+1]
+               if not goal then
+                       positions, index, global_goal = nil
+                       minetest.set_keypress("forward", false)
+                       minetest.display_chat_message("Reached goal.")
+                       return
+               end
+               if next_goal then
+                       local d, dn = vector.subtract(pos, goal), vector.subtract(next_goal, goal)
+                       for k, v in pairs(dn) do
+                               if v ~= 0 and k ~= "y" then
+                                       local cv = d[k]
+                                       if v > 0 and cv > 0 or v < 0 and cv < 0 then
+                                               index = index + 1
+                                               goal = next_goal
+                                       end
+                                       break
+                               end     
+                       end
+               end
+               local npos = vector.add(goal, {x = 0, y = 1, z = 0})
+               local node =  minetest.get_node_or_nil(npos)
+               if node and node.name ~= air then
+                       minetest.dig_node(npos)
+               end
+               local velocity = player:get_velocity()
+               velocity.y = 0
+               if vector.length(velocity) < 0.1 then
+                       findpath(global_goal)
+                       return
+               end
+               local distance = vector.distance(pos, goal)
+               if not next_goal and distance < 1 then
+                       index = index + 1
+               end
+               local direction = vector.direction(pos, vector.new(goal.x, 0, goal.z))
+               local yaw = player:get_yaw() % 360
+               local goal_yaw = math.deg(math.atan2(-direction.x, direction.z)) % 360
+               local diff = math.abs(goal_yaw - yaw)
+               if diff > 175 and diff < 185 and distance < 1 then
+                       index = index + 1
+               elseif diff > 10 and diff < 350 then
+                       if yaw < goal_yaw and diff < 180 or yaw > goal_yaw and diff > 180 then
+                               yaw = yaw + 10
+                       elseif yaw < goal_yaw and diff > 180 or yaw > goal_yaw and diff < 180 then
+                               yaw = yaw - 10
+                       end
+                       if diff >= 90 and diff <= 270 then
+                               minetest.set_keypress("sneak", true)
+                       end
+                       player:set_yaw(yaw)
+               else
+                       player:set_yaw(goal_yaw)
+               end
+       end
+end)
diff --git a/clientmods/dragonfire/pathfinding/mod.conf b/clientmods/dragonfire/pathfinding/mod.conf
new file mode 100644 (file)
index 0000000..c5a9fe6
--- /dev/null
@@ -0,0 +1,3 @@
+name = pathfinding
+description = Adds the .goto command!
+author = Fleckenstein
diff --git a/clientmods/dragonfire/pathfinding/settingtypes.txt b/clientmods/dragonfire/pathfinding/settingtypes.txt
new file mode 100644 (file)
index 0000000..2e525ca
--- /dev/null
@@ -0,0 +1,3 @@
+goto_max_distance (Maximum distance from the search positions to search in) int 25
+goto_max_jump (Jump height) int 1
+goto_max_drop (Maximum drop height) int 5
diff --git a/clientmods/dragonfire/perlin/init.lua b/clientmods/dragonfire/perlin/init.lua
new file mode 100644 (file)
index 0000000..4e05c97
--- /dev/null
@@ -0,0 +1,33 @@
+perlin = dofile(minetest.get_modpath("perlin") .. "/perlin.lua")
+
+local start, height, stretch
+
+minetest.register_chatcommand("perlin", {
+       description = "Start perlin terraforming",
+       param = "<height> <stretch>",
+       func = function(param)
+               local sparam = param:split(" ")
+               start, height, stretch = math.floor(minetest.localplayer:get_pos().y), sparam[1], sparam[2]
+       end     
+})
+
+minetest.register_chatcommand("perlinstop", {
+       description = "Abort perlin terraforming",
+       func = function(param)
+               start, height, stretch = nil
+       end     
+})
+
+minetest.register_globalstep(function()
+       if start then
+               local player = minetest.localplayer
+               local pos = vector.floor(player:get_pos())
+               for x = pos.x - 1, pos.x + 1 do
+                       for z = pos.z - 1, pos.z + 1 do
+                               local y = math.floor(start + height * perlin:noise(x / stretch, z / stretch))
+                               local p = vector.new(x, y, z)
+                               minetest.place_node(p)
+                       end
+               end
+       end 
+end)
diff --git a/clientmods/dragonfire/perlin/mod.conf b/clientmods/dragonfire/perlin/mod.conf
new file mode 100644 (file)
index 0000000..98b8452
--- /dev/null
@@ -0,0 +1,3 @@
+name = perlin
+description = A bot that does terraforming automatically using perlin noise.
+author = Fleckenstein
diff --git a/clientmods/dragonfire/perlin/perlin.lua b/clientmods/dragonfire/perlin/perlin.lua
new file mode 100644 (file)
index 0000000..f1872e5
--- /dev/null
@@ -0,0 +1,144 @@
+--[[
+    Implemented as described here:
+    http://flafla2.github.io/2014/08/09/perlinnoise.html
+]]--
+
+local perlin = {}
+perlin.p = {}
+
+local bit32 = {}
+function bit32.band(a, b)
+    local result = 0
+    local bitval = 1
+    while a > 0 and b > 0 do
+      if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits
+          result = result + bitval      -- set the current bit
+      end
+      bitval = bitval * 2 -- shift left
+      a = math.floor(a/2) -- shift right
+      b = math.floor(b/2)
+    end
+    return result
+end
+
+-- Hash lookup table as defined by Ken Perlin
+-- This is a randomly arranged array of all numbers from 0-255 inclusive
+local permutation = {151,160,137,91,90,15,
+  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
+  190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
+  88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
+  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
+  102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
+  135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
+  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
+  223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
+  129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
+  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
+  49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
+  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
+}
+
+-- p is used to hash unit cube coordinates to [0, 255]
+for i=0,255 do
+    -- Convert to 0 based index table
+    perlin.p[i] = permutation[i+1]
+    -- Repeat the array to avoid buffer overflow in hash function
+    perlin.p[i+256] = permutation[i+1]
+end
+
+-- Return range: [-1, 1]
+function perlin:noise(x, y, z)
+    y = y or 0
+    z = z or 0
+
+    -- Calculate the "unit cube" that the point asked will be located in
+    local xi = bit32.band(math.floor(x),255)
+    local yi = bit32.band(math.floor(y),255)
+    local zi = bit32.band(math.floor(z),255)
+
+    -- Next we calculate the location (from 0 to 1) in that cube
+    x = x - math.floor(x)
+    y = y - math.floor(y)
+    z = z - math.floor(z)
+
+    -- We also fade the location to smooth the result
+    local u = self.fade(x)
+    local v = self.fade(y)
+    local w = self.fade(z)
+
+    -- Hash all 8 unit cube coordinates surrounding input coordinate
+    local p = self.p
+    local A, AA, AB, AAA, ABA, AAB, ABB, B, BA, BB, BAA, BBA, BAB, BBB
+    A   = p[xi  ] + yi
+    AA  = p[A   ] + zi
+    AB  = p[A+1 ] + zi
+    AAA = p[ AA ]
+    ABA = p[ AB ]
+    AAB = p[ AA+1 ]
+    ABB = p[ AB+1 ]
+
+    B   = p[xi+1] + yi
+    BA  = p[B   ] + zi
+    BB  = p[B+1 ] + zi
+    BAA = p[ BA ]
+    BBA = p[ BB ]
+    BAB = p[ BA+1 ]
+    BBB = p[ BB+1 ]
+
+    -- Take the weighted average between all 8 unit cube coordinates
+    return self.lerp(w,
+        self.lerp(v,
+            self.lerp(u,
+                self:grad(AAA,x,y,z),
+                self:grad(BAA,x-1,y,z)
+            ),
+            self.lerp(u,
+                self:grad(ABA,x,y-1,z),
+                self:grad(BBA,x-1,y-1,z)
+            )
+        ),
+        self.lerp(v,
+            self.lerp(u,
+                self:grad(AAB,x,y,z-1), self:grad(BAB,x-1,y,z-1)
+            ),
+            self.lerp(u,
+                self:grad(ABB,x,y-1,z-1), self:grad(BBB,x-1,y-1,z-1)
+            )
+        )
+    )
+end
+
+-- Gradient function finds dot product between pseudorandom gradient vector
+-- and the vector from input coordinate to a unit cube vertex
+perlin.dot_product = {
+    [0x0]=function(x,y,z) return  x + y end,
+    [0x1]=function(x,y,z) return -x + y end,
+    [0x2]=function(x,y,z) return  x - y end,
+    [0x3]=function(x,y,z) return -x - y end,
+    [0x4]=function(x,y,z) return  x + z end,
+    [0x5]=function(x,y,z) return -x + z end,
+    [0x6]=function(x,y,z) return  x - z end,
+    [0x7]=function(x,y,z) return -x - z end,
+    [0x8]=function(x,y,z) return  y + z end,
+    [0x9]=function(x,y,z) return -y + z end,
+    [0xA]=function(x,y,z) return  y - z end,
+    [0xB]=function(x,y,z) return -y - z end,
+    [0xC]=function(x,y,z) return  y + x end,
+    [0xD]=function(x,y,z) return -y + z end,
+    [0xE]=function(x,y,z) return  y - x end,
+    [0xF]=function(x,y,z) return -y - z end
+}
+function perlin:grad(hash, x, y, z)
+    return self.dot_product[bit32.band(hash,0xF)](x,y,z)
+end
+
+-- Fade function is used to smooth final output
+function perlin.fade(t)
+    return t * t * t * (t * (t * 6 - 15) + 10)
+end
+
+function perlin.lerp(t, a, b)
+    return a + t * (b - a)
+end
+
+return perlin
diff --git a/clientmods/dragonfire/respawn/init.lua b/clientmods/dragonfire/respawn/init.lua
new file mode 100644 (file)
index 0000000..7f4e473
--- /dev/null
@@ -0,0 +1,47 @@
+local warp = warp or {set_here = function() return false end}
+
+local formspec = ""
+       .. "size[11,5.5]"
+       .. "bgcolor[#320000b4;true]"
+       .. "label[4.85,1.35;" .. "You died" .. "]"
+       .. "button_exit[2,3;3,0.5;btn_respawn;" .. "Respawn" .. "]"
+       .. "button_exit[6,3;3,0.5;btn_ghost_mode;" .. "Ghost Mode" .. "]"
+       .. "set_focus[btn_respawn;true]"
+
+minetest.register_on_death(function()
+       local warp_success, warp_msg = warp.set_here("death")
+       if warp_success then
+               minetest.display_chat_message(warp_msg)
+       else
+               minetest.display_chat_message("You died at " .. minetest.pos_to_string(minetest.localplayer:get_pos()) .. ".")
+       end
+       if minetest.settings:get_bool("autorespawn") then
+               minetest.send_respawn()
+       else
+               minetest.show_formspec("respawn:death", formspec)
+       end
+end)
+
+minetest.register_on_formspec_input(function(formname, fields)
+       if formname == "respawn:death" then
+               if fields.btn_ghost_mode then
+                       minetest.display_chat_message("You are in ghost mode. Use .respawn to Respawn.")
+               else
+                       minetest.send_respawn()
+               end
+       end
+end)
+
+minetest.register_chatcommand("respawn", {
+       description = "Respawn when in ghost mode",
+       func = function()
+               if minetest.localplayer:get_hp() == 0 then
+                       minetest.send_respawn()
+                       minetest.display_chat_message("Respawned.")
+               else
+                       minetest.display_chat_message("You are not in ghost mode.")
+               end
+       end
+})
+
+minetest.register_cheat("AutoRespawn", "Player", "autorespawn")
diff --git a/clientmods/dragonfire/respawn/mod.conf b/clientmods/dragonfire/respawn/mod.conf
new file mode 100644 (file)
index 0000000..8f93a95
--- /dev/null
@@ -0,0 +1,4 @@
+name = respawn
+author = Fleckenstein
+description = Extended respawn behaviour
+optional_depends = warp
diff --git a/clientmods/dragonfire/respawn/settingtypes.txt b/clientmods/dragonfire/respawn/settingtypes.txt
new file mode 100644 (file)
index 0000000..d20b8f1
--- /dev/null
@@ -0,0 +1 @@
+autorespawn (AutoRespawn) bool false
diff --git a/clientmods/dragonfire/schematicas/init.lua b/clientmods/dragonfire/schematicas/init.lua
new file mode 100644 (file)
index 0000000..29e5d45
--- /dev/null
@@ -0,0 +1,204 @@
+local autoeat = rawget(_G, "autoeat") or {}
+local storage = minetest.get_mod_storage()
+local pos1, pos2
+local min, max = math.min, math.max
+local building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks
+
+minetest.register_chatcommand("pos1", {
+       description = "Set schematicas position 1 at your current location",
+       func = function()
+               pos1 = vector.round(minetest.localplayer:get_pos())
+               return true, "Position 1 set to " .. minetest.pos_to_string(pos1)
+       end
+})
+
+minetest.register_chatcommand("pos2", {
+       description = "Set schematicas position 2 at your current location",
+       func = function()
+               pos2 = vector.round(minetest.localplayer:get_pos())
+               return true, "Position 2 set to " .. minetest.pos_to_string(pos2)
+       end
+})
+
+
+minetest.register_chatcommand("schemesave", {
+       description = "Save a schematica",
+       param = "<name>",
+       func = function(name)
+               if not pos1 or not pos2 then
+                       return false, "Position 1 or 2 not set."
+               end
+               
+               local data = {}
+               
+               local lx, ly, lz, hx, hy, hz = min(pos1.x, pos2.x), min(pos1.y, pos2.y), min(pos1.z, pos2.z), max(pos1.x, pos2.x), max(pos1.y, pos2.y), max(pos1.z, pos2.z)
+
+               for x = lx, hx do
+                       local rx = x - lx
+                       for y = ly, hy do
+                               local ry = y - ly
+                               for z = lz, hz do
+                                       local rz = z - lz
+                                       local node = minetest.get_node_or_nil({x = x, y = y, z = z})
+                                       if node and node.name ~= "air" then
+                                               table.insert(data, {pos = {x = rx, y = ry, z = rz}, node = node.name})
+                                       end
+                               end
+                       end
+               end
+               
+               storage:set_string(name, minetest.serialize(data))
+               return true, "Scheme saved successfully as '" .. name .. "'."
+       end
+})
+
+minetest.register_chatcommand("schemebuild", {
+       description = "Build a schematica",
+       param = "<name>",
+       func = function(name)
+               if not pos1 then
+                       return false, "Position 1 not set."
+               end
+               if building then
+                       return false, "Still building a scheme. Use .schemeabort to stop it."
+               end
+               local rawdata = storage:get(name)
+               if not rawdata then
+                       return false, "Schematica '" .. name .. "' not found."
+               end
+               building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks  = true, 1, minetest.deserialize(rawdata), vector.new(pos1), false, 0, false
+       end
+})
+
+minetest.register_chatcommand("schemerecipe", {
+       description = "Print the recipe for a schematica",
+       param = "<name>",
+       func = function(name)
+               local rawdata = storage:get(name)
+               if not rawdata then
+                       return false, "Schematica '" .. name .. "' not found."
+               end
+               local data = minetest.deserialize(rawdata)
+               local sorted = {}
+               for _, d in ipairs(data) do
+                       
+               end
+       end
+})
+
+minetest.register_chatcommand("schemeresume", {
+       description = "Resume constructing a schematica",
+       func = function()
+               if not build_data then
+                       return false, "Currently not building a scheme."
+               end
+               building, out_of_blocks = true, false
+               return true, "Resumed."
+       end
+})
+
+minetest.register_chatcommand("schemepause", {
+       description = "Pause constructing a schematica",
+       func = function()
+               if not build_data then
+                       return false, "Currently not building a scheme."
+               end
+               building = false
+               return true, "Paused."
+       end
+})
+
+minetest.register_chatcommand("schemeabort", {
+       description = "Abort constructing a schematica",
+       param = "<name>",
+       func = function()
+               if not build_data then
+                       return false, "Currently not building a scheme."
+               end
+               building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks = nilw
+               return true, "Aborted."
+       end
+})
+
+minetest.register_chatcommand("schemeskip", {
+       description = "Skip a step in constructing a schematica",
+       param = "<name>",
+       func = function()
+               if not build_data then
+                       return false, "Currently not building a scheme."
+               end
+               building, build_index = true, build_index + 1
+               return true, "Skipped."
+       end
+})
+
+minetest.register_chatcommand("schemegetindex", {
+       description = "Output the build index of the schematica",
+       func = function()
+               return build_index and true or false, build_index
+       end
+})
+
+minetest.register_chatcommand("schemesetindex", {
+       description = "Set the build index of the schematica",
+       param = "<index>",
+       func = function(param)
+               local index = tonumber(param)
+               if not index then return false, "Invalid usage." end
+               build_index = index
+               return true, "Index Changed"
+       end
+})
+
+minetest.register_globalstep(function()
+       if building and not autoeat.eating then
+               local data = build_data[build_index]
+               if not data then
+                       building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks = nil
+                       minetest.display_chat_message("Completed Schematica.")
+                       return
+               end
+               local pos, node = vector.add(build_pos, data.pos), data.node
+               if just_placed_node then
+                       local map_node = minetest.get_node_or_nil(pos)
+                       if map_node and map_node.name == node then
+                               build_index = build_index + 1
+                               just_placed_node = false
+                       else
+                               failed_count = failed_count + 1
+                       end
+                       if failed_count < 10 then
+                               return
+                       end
+               end
+               failed_count = 0
+               local new_index
+               local inventory = minetest.get_inventory("current_player").main
+               for index, stack in ipairs(inventory) do
+                       if minetest.get_item_def(stack:get_name()).node_placement_prediction == node then
+                               new_index = index - 1
+                               break
+                       end
+               end
+               if not new_index then
+                       if not out_of_blocks then
+                               minetest.display_chat_message("Out of blocks for schematica. Missing ressource: '" .. node .. "'. It will resume as soon as you got it or use .schemeskip to skip it.")
+                               minetest.send_chat_message("[Schematicas] Missing ressource: " .. node)
+                       end
+                       out_of_blocks = true
+                       return
+               end
+               if out_of_blocks then
+                       minetest.send_chat_message("[Schematicas] Resuming.")
+               end
+               out_of_blocks = false
+               minetest.localplayer:set_wield_index(new_index)
+               minetest.localplayer:set_pos(minetest.find_node_near(pos, 5, {"air", "ignore", "mcl_core:water_source", "mcl_core:water_flowing"}, false) or pos)
+               minetest.place_node(pos)
+               just_placed_node = true
+               if build_index % 250 == 0 then
+                       minetest.send_chat_message("[Schematicas] " .. build_index .. " of " .. #build_data .. " blocks placed!")
+               end
+       end
+end)
+
diff --git a/clientmods/dragonfire/schematicas/mod.conf b/clientmods/dragonfire/schematicas/mod.conf
new file mode 100644 (file)
index 0000000..92eda80
--- /dev/null
@@ -0,0 +1,4 @@
+name = schematicas
+description = Save structures and recreate them automatically in survival.
+author = Fleckenstein
+optional_depends = autoeat
diff --git a/clientmods/dragonfire/warp/init.lua b/clientmods/dragonfire/warp/init.lua
new file mode 100644 (file)
index 0000000..9eca734
--- /dev/null
@@ -0,0 +1,94 @@
+warp = {}
+
+local storage = minetest.get_mod_storage()
+
+function warp.set(warp, pos)
+       if warp == "" or not pos then return false, "Missing parameter." end
+       local posstr = minetest.pos_to_string(pos)
+       storage:set_string(warp, posstr)
+       return true, "Warp " .. warp .. " set to " .. posstr .. "."
+end
+
+function warp.set_here(param)
+       local success, message = warp.set(param, vector.round(minetest.localplayer:get_pos()))
+       return success, message
+end
+
+function warp.get(param)
+       if param == "" then return false, "Missing parameter." end
+       local pos = storage:get_string(param)
+       if pos == "" then return false, "Warp " .. param .. " not set." end
+       return true, "Warp " .. param .. " is set to " .. pos .. ".", minetest.string_to_pos(pos)
+end
+
+function warp.delete(param)
+       if param == "" then return false, "Missing parameter." end
+       storage:set_string(param, "")
+       return true, "Deleted warp " .. param .. "."
+end
+
+minetest.register_chatcommand("setwarp", {
+       params = "<warp>",
+       description = "Set a warp to your current position.",
+       func = warp.set_here,
+})
+
+minetest.register_chatcommand("readwarp", {
+       params = "<warp>",
+       description = "Print the coordinates of a warp.",
+       func = warp.get,
+})
+
+minetest.register_chatcommand("deletewarp", {
+       params = "<warp>",
+       description = "Delete a warp.",
+       func = warp.delete,
+})
+
+minetest.register_chatcommand("listwarps", {
+       description = "List all warps.",
+       func = function()
+               local warps = storage:to_table().fields
+               local warplist = {}
+               for warp in pairs(warps) do
+                       table.insert(warplist, warp)
+               end
+               if #warplist > 0 then
+                       return true, table.concat(warplist, ", ")
+               else
+                       return false, "No warps set."
+               end
+       end,
+})
+
+local function do_warp(param)
+       if param == "" then return false, "Missing parameter." end
+       local success, pos = minetest.parse_pos(param)
+       if not success then
+               local msg
+               success, msg, pos = warp.get(param)
+               if not success then
+                       return false, msg
+               end
+       end
+       minetest.localplayer:set_pos(pos)
+       return true, "Warped to " .. minetest.pos_to_string(pos)
+end
+
+minetest.register_chatcommand("warp", {
+       params = "<pos>|<warp>",
+       description = "Warp to a set warp or a position.",
+       func = do_warp
+})
+
+minetest.register_chatcommand("warpandexit", {
+       params = "<pos>|<warp>",
+       description = "Warp to a set warp or a position and exit.",
+       func = function(param)
+               local s, m = do_warp(param)
+               if s then
+                       minetest.disconnect()
+               end
+               return s,m 
+       end
+})
diff --git a/clientmods/dragonfire/warp/mod.conf b/clientmods/dragonfire/warp/mod.conf
new file mode 100644 (file)
index 0000000..d014d75
--- /dev/null
@@ -0,0 +1,3 @@
+name = warp
+author = Fleckenstein
+description = Set custom warps and use the teleport exploit
diff --git a/clientmods/dragonfire/world/init.lua b/clientmods/dragonfire/world/init.lua
new file mode 100644 (file)
index 0000000..e5e0e26
--- /dev/null
@@ -0,0 +1,97 @@
+minetest.register_chatcommand("findnodes", {
+       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 = minetest.localplayer:get_pos()
+               local fpos = minetest.find_node_near(pos, radius, nodes, true)
+               if fpos then
+                       return true, "Found " .. table.concat(nodes, " or ") .. " at " .. minetest.pos_to_string(fpos)
+               end
+               return false, "None of " .. table.concat(nodes, " or ") .. " found in a radius of " .. tostring(radius)
+       end,
+}) 
+
+minetest.register_chatcommand("place", {
+       params = "<X>,<Y>,<Z>",
+       description = "Place wielded item",
+       func = function(param)
+               local success, pos = minetest.parse_relative_pos(param)
+               if success then
+                       minetest.place_node(pos)
+                       return true, "Node placed at " .. minetest.pos_to_string(pos)
+               end
+               return false, pos
+       end,
+})
+
+minetest.register_chatcommand("dig", {
+       params = "<X>,<Y>,<Z>",
+       description = "Dig node",
+       func = function(param)
+               local success, pos = minetest.parse_relative_pos(param)
+               if success then
+                       minetest.dig_node(pos)
+                       return true, "Node at " .. minetest.pos_to_string(pos) .. " dug"
+               end
+               return false, pos
+       end,
+})
+
+minetest.register_on_dignode(function(pos)
+       if minetest.settings:get_bool("replace") then
+               minetest.after(0, minetest.place_node, pos)
+       end
+end)
+
+local etime = 0
+
+minetest.register_globalstep(function(dtime)
+       etime = etime + dtime
+       if etime < 1 then return end
+       local player = minetest.localplayer
+       if not player then return end
+       local pos = player:get_pos()
+       local item = player:get_wielded_item()
+       local def = minetest.get_item_def(item:get_name())
+       local nodes_per_tick = tonumber(minetest.settings:get("nodes_per_tick")) or 8
+       if item and item:get_count() > 0 and def and def.node_placement_prediction ~= "" then
+               if minetest.settings:get_bool("scaffold") then
+                       minetest.place_node(vector.add(pos, {x = 0, y = -0.6, z = 0}))
+               elseif minetest.settings:get_bool("highway_z") then
+                       local z = pos.z
+                       local positions = {
+                               {x = 0, y = 0, z = z},
+                               {x = 1, y = 0, z = z},
+                               {x = 2, y = 1, z = z},
+                               {x = -2, y = 1, z = z},
+                               {x = -2, y = 0, z = z},
+                               {x = -1, y = 0, z = z},
+                               {x = 2, y = 0, z = z}
+                       }
+                       for i, p in pairs(positions) do
+                               if i > nodes_per_tick then break end
+                               minetest.place_node(p)
+                       end
+               elseif minetest.settings:get_bool("block_water") then
+                       local positions = minetest.find_nodes_near(pos, 5, {"mcl_core:water_source", "mcl_core:water_floating"}, true)
+                       for i, p in pairs(positions) do
+                               if i > nodes_per_tick then break end
+                               minetest.place_node(p)
+                       end
+               elseif minetest.settings:get_bool("autotnt") then
+                       local positions = minetest.find_nodes_near_under_air_except(pos, 5, item:get_name(), true)
+                       for i, p in pairs(positions) do
+                               if i > nodes_per_tick then break end
+                               minetest.place_node(vector.add(p, {x = 0, y = 1, z = 0}))
+                       end
+               end
+       end
+end) 
+
+minetest.register_cheat("Scaffold", "World", "scaffold")
+minetest.register_cheat("HighwayZ", "World", "highway_z")
+minetest.register_cheat("BlockWater", "World", "block_water")
+minetest.register_cheat("AutoTNT", "World", "autotnt")
+minetest.register_cheat("Replace", "World", "replace")
diff --git a/clientmods/dragonfire/world/mod.conf b/clientmods/dragonfire/world/mod.conf
new file mode 100644 (file)
index 0000000..ddef2dc
--- /dev/null
@@ -0,0 +1,3 @@
+name = world
+desciption = Adds several world interaction bots to dragonfire.
+author = Fleckenstein
diff --git a/clientmods/dragonfire/world/settingtypes.txt b/clientmods/dragonfire/world/settingtypes.txt
new file mode 100644 (file)
index 0000000..8178cc3
--- /dev/null
@@ -0,0 +1,6 @@
+scaffold (Scaffold) bool false
+highway_z (HighwayZ) bool false
+block_water (BlockWater) bool false
+autotnt (AutoTNT) bool false
+replace (Replace) bool false
+nodes_per_tick (Number of nodes to place per tick) int 8
diff --git a/clientmods/inventory/autotool.lua b/clientmods/inventory/autotool.lua
deleted file mode 100644 (file)
index 430e602..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-local function check_tool(stack, node_groups, old_best_time)
-       local toolcaps = stack:get_tool_capabilities()
-       if not toolcaps then return end
-       local best_time = old_best_time
-       for group, groupdef in pairs(toolcaps.groupcaps) do
-               local level = node_groups[group]
-               if level then
-                       local this_time = groupdef.times[level]
-                       if this_time < best_time then
-                               best_time = this_time
-                       end
-               end
-       end
-       return best_time < old_best_time, best_time
-end
-
-minetest.register_on_punchnode(function(pos, node)
-       if not minetest.settings:get_bool("autotool") then return end
-       local player = minetest.localplayer
-       local inventory = minetest.get_inventory("current_player")
-       local node_groups = minetest.get_node_def(node.name).groups
-       local new_index = player:get_wield_index()
-       local is_better, best_time = false, math.huge
-       is_better, best_time = check_tool(player:get_wielded_item(), node_groups, best_time)
-       is_better, best_time = check_tool(inventory.hand[1], node_groups, best_time)
-       for index, stack in pairs(inventory.main) do
-               is_better, best_time = check_tool(stack, node_groups, best_time)
-               if is_better then
-                       new_index = index - 1
-               end
-       end
-       player:set_wield_index(new_index)
-end)
-
-minetest.register_cheat("AutoTool", "Inventory", "autotool")
diff --git a/clientmods/inventory/enderchest.lua b/clientmods/inventory/enderchest.lua
deleted file mode 100644 (file)
index 45ac216..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-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 = "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]"
-
-function minetest.open_special_inventory()
-       minetest.show_formspec("enderchest:enderchest", formspec)
-end
-
-minetest.register_cheat("Enderchest", "Inventory", minetest.open_special_inventory)
diff --git a/clientmods/inventory/init.lua b/clientmods/inventory/init.lua
deleted file mode 100644 (file)
index 52791b3..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-local modname = minetest.get_current_modname()
-local modpath = minetest.get_modpath(modname)
-
-dofile(modpath .. "/invhack.lua") 
-dofile(modpath .. "/enderchest.lua") 
-dofile(modpath .. "/next_item.lua") 
-dofile(modpath .. "/autotool.lua") 
diff --git a/clientmods/inventory/invhack.lua b/clientmods/inventory/invhack.lua
deleted file mode 100644 (file)
index eb6f48b..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-minetest.register_chatcommand("invhack", {
-       func = function(player)
-               minetest.show_formspec(
-                       "invhack:invhack",
-                       ""
-                               .. "size[8,7.5]"
-                               .. "list[player:" .. player .. ";main;0,3.5;8,4;]"
-                               .. "list[player:" .. player .. ";craft;3,0;3,3;]"
-                               .. "list[player:" .. player .. ";craftpreview;7,1;1,1;]"
-               )
-       end
-})
diff --git a/clientmods/inventory/mod.conf b/clientmods/inventory/mod.conf
deleted file mode 100644 (file)
index 18b883f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-name = inventory
-author = Fleckenstein
-description = The inventory cheats for Dragonfireclient
diff --git a/clientmods/inventory/next_item.lua b/clientmods/inventory/next_item.lua
deleted file mode 100644 (file)
index 0b7b88b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-local elapsed_time = 0
-local tick_time = 0.05
-
-minetest.register_globalstep(function(dtime)
-       elapsed_time = elapsed_time + dtime
-       if elapsed_time < tick_time then return end
-       local player = minetest.localplayer
-       if not player then return end
-       local item = player:get_wielded_item()
-       if item:get_count() == 0 and minetest.settings:get_bool("next_item") then
-               local index = player:get_wield_index()
-               player:set_wield_index(index + 1)
-       end
-       elapsed_time = 0
-end)
-
-minetest.register_cheat("NextItem", "Inventory", "next_item")
-
diff --git a/clientmods/inventory/settingtypes.txt b/clientmods/inventory/settingtypes.txt
deleted file mode 100644 (file)
index fef673b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-next_item (NextItem) bool false
-autotool (AutoTool) bool false
index 6dd2a82f7a13ae6e5cd9caaf34f11d29616e0be9..4234591b173d9f3ec389cb7ec4a6cca346e386ff 100644 (file)
@@ -5,3 +5,6 @@ load_mod_inventory = true
 load_mod_commands = true
 load_mod_chat = true
 load_mod_schematicas = true
+load_mod_pathfinding = true
+load_mod_autoeat = true
+load_mod_perlin = true
diff --git a/clientmods/respawn/init.lua b/clientmods/respawn/init.lua
deleted file mode 100644 (file)
index 7d66fe9..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-local warp = warp or {set_here = function() return false end}
-
-local formspec = ""
-       .. "size[11,5.5]"
-       .. "bgcolor[#320000b4;true]"
-       .. "label[4.85,1.35;" .. "You died" .. "]"
-       .. "button_exit[2,3;3,0.5;btn_respawn;" .. "Respawn" .. "]"
-       .. "button_exit[6,3;3,0.5;btn_ghost_mode;" .. "Ghost Mode" .. "]"
-       .. "set_focus[btn_respawn;true]"
-
-minetest.register_on_death(function()
-       local warp_success, warp_msg = warp.set_here("death")
-       if warp_success then
-               minetest.display_chat_message(warp_msg)
-       else
-               minetest.display_chat_message("You died at " .. minetest.pos_to_string(minetest.localplayer:get_pos()) .. ".")
-       end
-       if minetest.settings:get_bool("autorespawn") then
-               minetest.send_respawn()
-       else
-               minetest.show_formspec("respawn:death", formspec)
-       end
-end)
-
-minetest.register_on_formspec_input(function(formname, fields)
-       if formname == "respawn:death" then
-               if fields.btn_ghost_mode then
-                       minetest.display_chat_message("You are in ghost mode. Use .respawn to Respawn.")
-               else
-                       minetest.send_respawn()
-               end
-       end
-end)
-
-minetest.register_chatcommand("respawn", {
-       description = "Respawn when in ghost mode",
-       func = function()
-               if minetest.localplayer:get_hp() == 0 then
-                       minetest.send_respawn()
-                       minetest.display_chat_message("Respawned.")
-               else
-                       minetest.display_chat_message("You are not in ghost mode.")
-               end
-       end
-})
-
-minetest.register_cheat("AutoRespawn", "Combat", "autorespawn")
diff --git a/clientmods/respawn/mod.conf b/clientmods/respawn/mod.conf
deleted file mode 100644 (file)
index 8f93a95..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-name = respawn
-author = Fleckenstein
-description = Extended respawn behaviour
-optional_depends = warp
diff --git a/clientmods/respawn/settingtypes.txt b/clientmods/respawn/settingtypes.txt
deleted file mode 100644 (file)
index d20b8f1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-autorespawn (AutoRespawn) bool false
diff --git a/clientmods/schematicas/init.lua b/clientmods/schematicas/init.lua
deleted file mode 100644 (file)
index fb8e329..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-local storage = minetest.get_mod_storage()
-local pos1, pos2
-local min, max = math.min, math.max
-local building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks
-
-minetest.register_chatcommand("pos1", {
-       description = "Set schematicas position 1 at your current location",
-       func = function()
-               pos1 = vector.round(minetest.localplayer:get_pos())
-               return true, "Position 1 set to " .. minetest.pos_to_string(pos1)
-       end
-})
-
-minetest.register_chatcommand("pos2", {
-       description = "Set schematicas position 2 at your current location",
-       func = function()
-               pos2 = vector.round(minetest.localplayer:get_pos())
-               return true, "Position 2 set to " .. minetest.pos_to_string(pos2)
-       end
-})
-
-
-minetest.register_chatcommand("schemesave", {
-       description = "Save a schematica",
-       param = "<name>",
-       func = function(name)
-               if not pos1 or not pos2 then
-                       return false, "Position 1 or 2 not set."
-               end
-               
-               local data = {}
-               
-               local lx, ly, lz, hx, hy, hz = min(pos1.x, pos2.x), min(pos1.y, pos2.y), min(pos1.z, pos2.z), max(pos1.x, pos2.x), max(pos1.y, pos2.y), max(pos1.z, pos2.z)
-
-               for x = lx, hx do
-                       local rx = x - lx
-                       for y = ly, hy do
-                               local ry = y - ly
-                               for z = lz, hz do
-                                       local rz = z - lz
-                                       local node = minetest.get_node_or_nil({x = x, y = y, z = z})
-                                       if node and node.name ~= "air" then
-                                               table.insert(data, {pos = {x = rx, y = ry, z = rz}, node = node.name})
-                                       end
-                               end
-                       end
-               end
-               
-               storage:set_string(name, minetest.serialize(data))
-               return true, "Scheme saved successfully as '" .. name .. "'."
-       end
-})
-
-minetest.register_chatcommand("schemebuild", {
-       description = "Build a schematica",
-       param = "<name>",
-       func = function(name)
-               if not pos1 then
-                       return false, "Position 1 not set."
-               end
-               if building then
-                       return false, "Still building a scheme. Use .schemeabort to stop it."
-               end
-               local rawdata = storage:get(name)
-               if not rawdata then
-                       return false, "Schematica '" .. name .. "' not found."
-               end
-               building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks  = true, 1, minetest.deserialize(rawdata), vector.new(pos1), false, 0, false
-       end
-})
-
-minetest.register_chatcommand("schemerecipe", {
-       description = "Print the recipe for a schematica",
-       param = "<name>",
-       func = function(name)
-               local rawdata = storage:get(name)
-               if not rawdata then
-                       return false, "Schematica '" .. name .. "' not found."
-               end
-               local data = minetest.deserialize(rawdata)
-               local sorted = {}
-               for _, d in ipairs(data) do
-                       
-               end
-       end
-})
-
-minetest.register_chatcommand("schemeresume", {
-       description = "Resume constructing a schematica",
-       func = function()
-               if not build_data then
-                       return false, "Currently not building a scheme."
-               end
-               building, out_of_blocks = true, false
-               return true, "Resumed."
-       end
-})
-
-minetest.register_chatcommand("schemepause", {
-       description = "Pause constructing a schematica",
-       func = function()
-               if not build_data then
-                       return false, "Currently not building a scheme."
-               end
-               building = false
-               return true, "Paused."
-       end
-})
-
-minetest.register_chatcommand("schemeabort", {
-       description = "Abort constructing a schematica",
-       param = "<name>",
-       func = function()
-               if not build_data then
-                       return false, "Currently not building a scheme."
-               end
-               building, build_index, build_data, build_pos, just_placed_node = nil
-               return true, "Aborted."
-       end
-})
-
-minetest.register_chatcommand("schemeskip", {
-       description = "Skip a step in constructing a schematica",
-       param = "<name>",
-       func = function()
-               if not build_data then
-                       return false, "Currently not building a scheme."
-               end
-               building, build_index = true, build_index + 1
-               return true, "Skipped."
-       end
-})
-
-minetest.register_chatcommand("schemegetindex", {
-       description = "Output the build index of the schematica",
-       func = function()
-               return build_index and true or false, build_index
-       end
-})
-
-minetest.register_chatcommand("schemesetindex", {
-       description = "Set the build index of the schematica",
-       param = "<index>",
-       func = function(param)
-               local index = tonumber(param)
-               if not index then return false, "Invalid usage." end
-               build_index = index
-               return true, "Index Changed"
-       end
-})
-
-minetest.register_globalstep(function()
-       if building then
-               local data = build_data[build_index]
-               if not data then
-                       building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks  = true, 1, minetest.deserialize(rawdata), vector.new(pos1), false, 0, false
-                       minetest.display_chat_message("Completed Schematica.")
-                       return
-               end
-               local pos, node = vector.add(build_pos, data.pos), data.node
-               if just_placed_node then
-                       local map_node = minetest.get_node_or_nil(pos)
-                       if map_node and map_node.name == node then
-                               build_index = build_index + 1
-                               just_placed_node = false
-                       else
-                               failed_count = failed_count + 1
-                       end
-                       if failed_count < 10 then
-                               return
-                       end
-               end
-               failed_count = 0
-               local new_index
-               local inventory = minetest.get_inventory("current_player").main
-               for index, stack in ipairs(inventory) do
-                       if minetest.get_item_def(stack:get_name()).node_placement_prediction == node then
-                               new_index = index - 1
-                               break
-                       end
-               end
-               if not new_index then
-                       if not out_of_blocks then
-                               minetest.display_chat_message("Out of blocks for schematica. Missing ressource: '" .. node .. "'. It will resume as soon as you got it or use .schemeskip to skip it.")
-                               minetest.send_chat_message(node)
-                       end
-                       out_of_blocks = true
-                       return
-               end
-               out_of_blocks = false
-               minetest.localplayer:set_wield_index(new_index)
-               minetest.localplayer:set_pos(minetest.find_node_near(pos, 5, {"air", "ignore", "mcl_core:water_source", "mcl_core:water_flowing"}, false) or pos)
-               minetest.place_node(pos)
-               just_placed_node = true
-       end
-end)
-
diff --git a/clientmods/warp/init.lua b/clientmods/warp/init.lua
deleted file mode 100644 (file)
index 9eca734..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-warp = {}
-
-local storage = minetest.get_mod_storage()
-
-function warp.set(warp, pos)
-       if warp == "" or not pos then return false, "Missing parameter." end
-       local posstr = minetest.pos_to_string(pos)
-       storage:set_string(warp, posstr)
-       return true, "Warp " .. warp .. " set to " .. posstr .. "."
-end
-
-function warp.set_here(param)
-       local success, message = warp.set(param, vector.round(minetest.localplayer:get_pos()))
-       return success, message
-end
-
-function warp.get(param)
-       if param == "" then return false, "Missing parameter." end
-       local pos = storage:get_string(param)
-       if pos == "" then return false, "Warp " .. param .. " not set." end
-       return true, "Warp " .. param .. " is set to " .. pos .. ".", minetest.string_to_pos(pos)
-end
-
-function warp.delete(param)
-       if param == "" then return false, "Missing parameter." end
-       storage:set_string(param, "")
-       return true, "Deleted warp " .. param .. "."
-end
-
-minetest.register_chatcommand("setwarp", {
-       params = "<warp>",
-       description = "Set a warp to your current position.",
-       func = warp.set_here,
-})
-
-minetest.register_chatcommand("readwarp", {
-       params = "<warp>",
-       description = "Print the coordinates of a warp.",
-       func = warp.get,
-})
-
-minetest.register_chatcommand("deletewarp", {
-       params = "<warp>",
-       description = "Delete a warp.",
-       func = warp.delete,
-})
-
-minetest.register_chatcommand("listwarps", {
-       description = "List all warps.",
-       func = function()
-               local warps = storage:to_table().fields
-               local warplist = {}
-               for warp in pairs(warps) do
-                       table.insert(warplist, warp)
-               end
-               if #warplist > 0 then
-                       return true, table.concat(warplist, ", ")
-               else
-                       return false, "No warps set."
-               end
-       end,
-})
-
-local function do_warp(param)
-       if param == "" then return false, "Missing parameter." end
-       local success, pos = minetest.parse_pos(param)
-       if not success then
-               local msg
-               success, msg, pos = warp.get(param)
-               if not success then
-                       return false, msg
-               end
-       end
-       minetest.localplayer:set_pos(pos)
-       return true, "Warped to " .. minetest.pos_to_string(pos)
-end
-
-minetest.register_chatcommand("warp", {
-       params = "<pos>|<warp>",
-       description = "Warp to a set warp or a position.",
-       func = do_warp
-})
-
-minetest.register_chatcommand("warpandexit", {
-       params = "<pos>|<warp>",
-       description = "Warp to a set warp or a position and exit.",
-       func = function(param)
-               local s, m = do_warp(param)
-               if s then
-                       minetest.disconnect()
-               end
-               return s,m 
-       end
-})
diff --git a/clientmods/warp/mod.conf b/clientmods/warp/mod.conf
deleted file mode 100644 (file)
index d014d75..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-name = warp
-author = Fleckenstein
-description = Set custom warps and use the teleport exploit
diff --git a/clientmods/world/init.lua b/clientmods/world/init.lua
deleted file mode 100644 (file)
index 5674fd3..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-minetest.register_chatcommand("findnodes", {
-       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 = minetest.localplayer:get_pos()
-               local fpos = minetest.find_node_near(pos, radius, nodes, true)
-               if fpos then
-                       return true, "Found " .. table.concat(nodes, " or ") .. " at " .. minetest.pos_to_string(fpos)
-               end
-               return false, "None of " .. table.concat(nodes, " or ") .. " found in a radius of " .. tostring(radius)
-       end,
-}) 
-
-minetest.register_chatcommand("place", {
-       params = "<X>,<Y>,<Z>",
-       description = "Place wielded item",
-       func = function(param)
-               local success, pos = minetest.parse_relative_pos(param)
-               if success then
-                       minetest.place_node(pos)
-                       return true, "Node placed at " .. minetest.pos_to_string(pos)
-               end
-               return false, pos
-       end,
-})
-
-minetest.register_chatcommand("dig", {
-       params = "<X>,<Y>,<Z>",
-       description = "Dig node",
-       func = function(param)
-               local success, pos = minetest.parse_relative_pos(param)
-               if success then
-                       minetest.dig_node(pos)
-                       return true, "Node at " .. minetest.pos_to_string(pos) .. " dug"
-               end
-               return false, pos
-       end,
-})
-
-minetest.register_on_dignode(function(pos)
-       if minetest.settings:get_bool("replace") then
-               minetest.after(0, minetest.place_node, pos)
-       end
-end)
-
-local etime = 0
-
-minetest.register_globalstep(function(dtime)
-       etime = etime + dtime
-       if etime < 1 then return end
-       local player = minetest.localplayer
-       if not player then return end
-       local pos = player:get_pos()
-       local item = player:get_wielded_item()
-       local def = minetest.get_item_def(item:get_name())
-       local nodes_per_tick = tonumber(minetest.settings:get("nodes_per_tick")) or 8
-       if item:get_count() > 0 and def.node_placement_prediction ~= "" then
-               if minetest.settings:get_bool("scaffold") then
-                       minetest.place_node(vector.add(pos, {x = 0, y = -0.6, z = 0}))
-               elseif minetest.settings:get_bool("highway_z") then
-                       local z = pos.z
-                       local positions = {
-                               {x = 0, y = 0, z = z},
-                               {x = 1, y = 0, z = z},
-                               {x = 2, y = 1, z = z},
-                               {x = -2, y = 1, z = z},
-                               {x = -2, y = 0, z = z},
-                               {x = -1, y = 0, z = z},
-                               {x = 2, y = 0, z = z}
-                       }
-                       for i, p in pairs(positions) do
-                               if i > nodes_per_tick then break end
-                               minetest.place_node(p)
-                       end
-               elseif minetest.settings:get_bool("block_water") then
-                       local positions = minetest.find_nodes_near(pos, 5, {"mcl_core:water_source", "mcl_core:water_floating"}, true)
-                       for i, p in pairs(positions) do
-                               if i > nodes_per_tick then break end
-                               minetest.place_node(p)
-                       end
-               elseif minetest.settings:get_bool("autotnt") then
-                       local positions = minetest.find_nodes_near_under_air_except(pos, 5, item:get_name(), true)
-                       for i, p in pairs(positions) do
-                               if i > nodes_per_tick then break end
-                               minetest.place_node(vector.add(p, {x = 0, y = 1, z = 0}))
-                       end
-               end
-       end
-end) 
-
-minetest.register_cheat("Scaffold", "World", "scaffold")
-minetest.register_cheat("HighwayZ", "World", "highway_z")
-minetest.register_cheat("BlockWater", "World", "block_water")
-minetest.register_cheat("AutoTNT", "World", "autotnt")
-minetest.register_cheat("Replace", "World", "replace")
diff --git a/clientmods/world/settingtypes.txt b/clientmods/world/settingtypes.txt
deleted file mode 100644 (file)
index c93ce26..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-scaffold (Scaffold) bool false
-highway_z (HighwayZ) bool false
-block_water (BlockWater) bool false
-autotnt (AutoTNT) bool false
-replace (Replace) bool false
index 0b63838b7ccc1fc3da7c8374a0e7f82bf37398af..636fc63c7680e3442bb4be0d3862d6e551dabcdb 100644 (file)
@@ -837,7 +837,26 @@ Call these functions only at load time!
     * `pos2`: end of the ray
     * `objects`: if false, only nodes will be returned. Default is `true`.
     * `liquids`: if false, liquid nodes won't be returned. Default is `false`.
-
+* `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)`
+    * returns table containing path that can be walked on
+    * returns a table of 3D points representing a path from `pos1` to `pos2` or
+      `nil` on failure.
+    * Reasons for failure:
+        * No path exists at all
+        * No path exists within `searchdistance` (see below)
+        * Start or end pos is buried in land
+    * `pos1`: start position
+    * `pos2`: end position
+    * `searchdistance`: maximum distance from the search positions to search in.
+      In detail: Path must be completely inside a cuboid. The minimum
+      `searchdistance` of 1 will confine search between `pos1` and `pos2`.
+      Larger values will increase the size of this cuboid in all directions
+    * `max_jump`: maximum height difference to consider walkable
+    * `max_drop`: maximum height difference to consider droppable
+    * `algorithm`: One of `"A*_noprefetch"` (default), `"A*"`, `"Dijkstra"`.
+      Difference between `"A*"` and `"A*_noprefetch"` is that
+      `"A*"` will pre-calculate the cost-data, the other will calculate it
+      on-the-fly
 * `minetest.find_nodes_with_meta(pos1, pos2)`
     * Get a table of positions of nodes that have metadata within a region
       {pos1, pos2}.
@@ -969,6 +988,10 @@ Passed to `HTTPApiTable.fetch` callback. Returned by
     * Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`)
 
 ### Misc
+* `minetest.set_keypress(key, value)`
+    * Act as if a key was pressed (value = true) / released (value = false)
+    * The key must be an keymap_* setting
+    * e.g. minetest.set_keypress("jump", true) will cause te player to jump until minetest.set_keypress("jump", false) is called or the player presses & releases the space bar himself
 * `minetest.get_inventory(location)`
     * Returns the inventory at location
 * `minetest.register_cheat(name, category, setting | function)`
@@ -1123,8 +1146,14 @@ Methods:
     * returns current player current position
 * `set_pos(pos)`
     * sets the position (anticheat may not like this)
+* `get_yaw()`
+    * returns the yaw (degrees)
+* `set_yaw(yaw)`
+    * sets the yaw (degrees)
 * `get_velocity()`
     * returns player speed vector
+* `set_velocity(vel)`
+    * sets player speed vector
 * `get_hp()`
     * returns player HP
 * `get_name()`
index 74e7b9b0d24e051c54e9da0eb283eea982905f6f..db80beb9f882ffdc0f81164fd97b4dca47cedcc6 100644 (file)
@@ -506,7 +506,7 @@ void Client::step(float dtime)
        {
                float &counter = m_playerpos_send_timer;
                counter += dtime;
-               if((m_state == LC_Ready) && (counter >= m_recommended_send_interval) && ! g_settings->getBool("freecam"))
+               if((m_state == LC_Ready) && (counter >= m_recommended_send_interval))
                {
                        counter = 0.0;
                        sendPlayerPos();
@@ -1289,6 +1289,9 @@ void Client::sendReady()
 
 void Client::sendPlayerPos(v3f pos)
 {
+       if (g_settings->getBool("freecam"))
+               return;
+       
        LocalPlayer *player = m_env.getLocalPlayer();
        if (!player)
                return;
index b9e7e4d9b04a8b1a3bb604ec5be5e25a75b64910..ba360a1534d8cbd468438c8df346fc9d3ce0b6d8 100644 (file)
@@ -238,11 +238,9 @@ void Game::run()
 {
        ProfilerGraph graph;
        RunStats stats              = { 0 };
-       CameraOrientation cam_view_target  = { 0 };
-       CameraOrientation cam_view  = { 0 };
        FpsControl draw_times       = { 0 };
        f32 dtime; // in seconds
-
+       
        /* Clear the profiler */
        Profiler::GraphValues dummyvalues;
        g_profiler->graphGet(dummyvalues);
@@ -309,9 +307,8 @@ void Game::run()
                processClientEvents(&cam_view_target);
                updateCamera(draw_times.busy_time, dtime);
                updateSound(dtime);
-               if (! g_settings->getBool("freecam"))
-                       processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud,
-                               m_game_ui->m_flags.show_debug);
+               processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud,
+                       m_game_ui->m_flags.show_debug);
                updateFrame(&graph, &stats, dtime, cam_view);
                updateProfilerGraphs(&graph);
 
@@ -2814,7 +2811,7 @@ void Game::handlePointingAtObject(const PointedThing &pointed,
                bool do_punch = false;
                bool do_punch_damage = false;
 
-               if (runData.object_hit_delay_timer <= 0.0) {
+               if (runData.object_hit_delay_timer <= 0.0 || g_settings->getBool("spamclick")) {
                        do_punch = true;
                        do_punch_damage = true;
                        runData.object_hit_delay_timer = object_hit_delay;
@@ -3338,10 +3335,15 @@ void Game::freecamChangedCallback(const std::string &setting_name, void *data)
        Game *game = (Game *) data;
        LocalPlayer *player = game->client->getEnv().getLocalPlayer();
        static v3f player_pos = player->getPosition();
-       if (g_settings->getBool("freecam"))
+       static v3f player_speed = player->getSpeed();
+       if (g_settings->getBool("freecam")) {
                player_pos = player->getPosition();
-       else
+               player_speed = player->getSpeed();
+               game->camera->setCameraMode(CAMERA_MODE_FIRST);
+       } else {
                player->setPosition(player_pos);
+               player->setSpeed(player_speed);
+       }
        game->updatePlayerCAOVisibility();
 }
 
index aac8f8f382777645a29ac09dce16687774c9b214..e5557ee18db58156c0d1a0f119429220d9f3536a 100644 (file)
@@ -927,6 +927,9 @@ class Game {
 
        bool m_does_lost_focus_pause_game = false;
 
+       CameraOrientation cam_view_target  = { 0 };
+       CameraOrientation cam_view  = { 0 };
+
 #ifdef __ANDROID__
        bool m_cache_hold_aux1;
        bool m_android_chat_open;
index 8e6c82b114ba1086f6afc02d0f766e93c0061a31..a9057052e8258f825bebbdf06efec13291b8c249 100644 (file)
@@ -210,8 +210,7 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
                m_guitext_status->enableOverrideColor(true);
        }
 
-       // Hide chat when console is visible
-       //m_guitext_chat->setVisible(isChatVisible() && !chat_console->isVisible());
+       m_guitext_chat->setVisible(isChatVisible());
 }
 
 void GameUI::initFlags()
index fc7998f2035df953500b081719b17b87864522a8..e006affb2f2c38aa4cdec0b9e4516376e869df5d 100644 (file)
@@ -195,7 +195,6 @@ class MyEventReceiver : public IEventReceiver
        TouchScreenGUI *m_touchscreengui;
 #endif
 
-private:
        // The current state of keys
        KeyList keyIsDown;
        // Whether a key has been pressed or not
@@ -225,6 +224,8 @@ class InputHandler
        }
 
        virtual bool isKeyDown(GameKeyType k) = 0;
+       virtual void setKeypress(const KeyPress &keyCode) = 0;
+       virtual void unsetKeypress(const KeyPress &keyCode) = 0;
        virtual bool wasKeyDown(GameKeyType k) = 0;
        virtual bool cancelPressed() = 0;
 
@@ -271,6 +272,15 @@ class RealInputHandler : public InputHandler
        {
                return m_receiver->IsKeyDown(keycache.key[k]) || joystick.isKeyDown(k);
        }
+       virtual void setKeypress(const KeyPress &keyCode)
+       {
+               m_receiver->keyIsDown.set(keyCode);
+               m_receiver->keyWasDown.set(keyCode);
+       }
+       virtual void unsetKeypress(const KeyPress &keyCode)
+       {
+               m_receiver->keyIsDown.unset(keyCode);
+       }
        virtual bool wasKeyDown(GameKeyType k)
        {
                return m_receiver->WasKeyDown(keycache.key[k]) || joystick.wasKeyDown(k);
@@ -367,7 +377,7 @@ class RealInputHandler : public InputHandler
                m_receiver->clearInput();
        }
 
-private:
+       private:
        MyEventReceiver *m_receiver = nullptr;
        v2s32 m_mousepos;
 };
@@ -383,6 +393,14 @@ class RandomInputHandler : public InputHandler
        }
 
        virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; }
+       virtual void setKeypress(const KeyPress &keyCode)
+       {
+               keydown.set(keyCode);
+       }
+       virtual void unsetKeypress(const KeyPress &keyCode)
+       {
+               keydown.unset(keyCode);
+       }
        virtual bool wasKeyDown(GameKeyType k) { return false; }
        virtual bool cancelPressed() { return false; }
        virtual v2s32 getMousePos() { return mousepos; }
index 17129e4032a0d2a6fc76b67934a70c4f56973391..a22b6b8517b20f2ab69f568e8990daf9d6ecdaef 100644 (file)
@@ -88,6 +88,8 @@ void set_default_settings(Settings *settings)
        settings->setDefault("no_night", "false");
        settings->setDefault("coords", "false");
        settings->setDefault("point_liquids", "false");
+       settings->setDefault("log_particles", "false");
+       settings->setDefault("spamclick", "false");
        
        // Keymap
        settings->setDefault("remote_port", "30000");
@@ -386,7 +388,7 @@ void set_default_settings(Settings *settings)
        settings->setDefault("max_simultaneous_block_sends_per_client", "40");
        settings->setDefault("time_send_interval", "5");
 
-       settings->setDefault("default_game", "minetest");
+       settings->setDefault("default_game", "mineclone2");
        settings->setDefault("motd", "");
        settings->setDefault("max_users", "15");
        settings->setDefault("creative_mode", "false");
index 9e0b35f5362f54ddf8f6cbf5450f8fd5b1eb0916..05ae91f064023f4aa1b8a3aa4c5c930b14b789bd 100644 (file)
@@ -17,6 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
+#include <iostream>
 #include "client/client.h"
 
 #include "util/base64.h"
@@ -977,7 +978,11 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt)
        ClientEvent *event = new ClientEvent();
        event->type           = CE_SPAWN_PARTICLE;
        event->spawn_particle = new ParticleParameters(p);
-
+       
+       if (g_settings->getBool("log_particles")) {
+               std::cout << p.pos.X << " " << p.pos.Y << " " << p.pos.Z << std::endl;
+       }
+       
        m_client_event_queue.push(event);
 }
 
index 73183c64e11874c82860d98b4639d2cdde6ae52e..8f3e4ef14fe3b44dd33103e50d298d6449fa3c29 100644 (file)
@@ -41,7 +41,7 @@ bool ScriptApiCheatsCheat::is_enabled()
 {
        try {
                return ! m_function_ref && g_settings->getBool(m_setting);
-       } catch (SettingNotFoundException) {
+       } catch (SettingNotFoundException &) {
                return false;
        }
 }
index 5d0ccf2e0eab162a4a6d9086aa2ebd0fbd0c958c..b9a8f77a87bab396ed6ee146cf237d922dd90621 100644 (file)
@@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "map.h"
 #include "util/string.h"
 #include "nodedef.h"
+#include "client/keycode.h"
 
 #define checkCSMRestrictionFlag(flag) \
        ( getClient(L)->checkCSMRestrictionFlag(CSMRestrictionFlags::flag) )
@@ -470,13 +471,31 @@ int ModApiClient::l_get_inventory(lua_State *L)
                inventory_location.deSerialize(location);
                inventory = client->getInventory(inventory_location);
                push_inventory(L, inventory);
-       } catch (SerializationError) {
+       } catch (SerializationError &) {
                lua_pushnil(L);
        }
        
        return 1;
 }
 
+// set_keypress(key_setting, pressed) -> returns true on success
+int ModApiClient::l_set_keypress(lua_State *L)
+{
+       std::string setting_name = "keymap_" + readParam<std::string>(L, 1);
+       bool pressed = lua_isboolean(L, 2) && readParam<bool>(L, 2);
+       try {
+               KeyPress keyCode = getKeySetting(setting_name.c_str());
+               if (pressed)
+                       g_game->input->setKeypress(keyCode);
+               else
+                       g_game->input->unsetKeypress(keyCode);
+               lua_pushboolean(L, true);
+       } catch (SettingNotFoundException &) {
+               lua_pushboolean(L, false);
+       }
+       return 1;
+}
+
 void ModApiClient::Initialize(lua_State *L, int top)
 {
        API_FCT(get_current_modname);
@@ -508,4 +527,5 @@ void ModApiClient::Initialize(lua_State *L, int top)
        API_FCT(place_node);
        API_FCT(dig_node);
        API_FCT(get_inventory);
+       API_FCT(set_keypress);
 }
index 21a540f8f433362303a5892a1f7540bf8cc13952..1ea57f9ee2f8321c281cd69bd922320c9b9dd426 100644 (file)
@@ -116,6 +116,9 @@ class ModApiClient : public ModApiBase
        
        // get_inventory(location)
        static int l_get_inventory(lua_State *L);
+       
+       // l_set_keypress(key_setting, pressed)
+       static int l_set_keypress(lua_State *L);
 public:        
        static void Initialize(lua_State *L, int top);
 };
index 2ea3b08b93e3321a87451dc8655c601a6323bdb0..ee384ad10064761694ab2601e39bead9a267a2e4 100644 (file)
@@ -1365,7 +1365,7 @@ int ModApiEnvMod::l_delete_area(lua_State *L)
 //     max_jump, max_drop, algorithm) -> table containing path
 int ModApiEnvMod::l_find_path(lua_State *L)
 {
-       GET_ENV_PTR;
+       Environment *env = getEnv(L);
 
        v3s16 pos1                  = read_v3s16(L, 1);
        v3s16 pos2                  = read_v3s16(L, 2);
@@ -1382,8 +1382,8 @@ int ModApiEnvMod::l_find_path(lua_State *L)
                if (algorithm == "Dijkstra")
                        algo = PA_DIJKSTRA;
        }
-
-       std::vector<v3s16> path = get_path(&env->getServerMap(), env->getGameDef()->ndef(), pos1, pos2,
+       
+       std::vector<v3s16> path = get_path(&env->getMap(), env->getGameDef()->ndef(), pos1, pos2,
                searchdistance, max_jump, max_drop, algo);
 
        if (!path.empty()) {
@@ -1568,6 +1568,7 @@ void ModApiEnvMod::InitializeClient(lua_State *L, int top)
        API_FCT(find_nodes_near_under_air_except);
        API_FCT(find_nodes_in_area);
        API_FCT(find_nodes_in_area_under_air);
+       API_FCT(find_path);
        API_FCT(line_of_sight);
        API_FCT(raycast);
 }
index 9d7db41ce6217c0090a02a444ce7c24e99ee2df6..8e743c3ab8f9f333ac82c28e67a6f3f5b1028144 100644 (file)
@@ -62,6 +62,38 @@ int LuaLocalPlayer::l_get_velocity(lua_State *L)
        return 1;
 }
 
+int LuaLocalPlayer::l_set_velocity(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+       
+       v3f pos = checkFloatPos(L, 2);
+       player->setSpeed(pos);
+       
+       return 0;
+}
+
+int LuaLocalPlayer::l_get_yaw(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+
+       lua_pushinteger(L, player->getYaw());
+       return 1;
+}
+
+int LuaLocalPlayer::l_set_yaw(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+
+       if (lua_isnumber(L, 2)) {
+               int yaw = lua_tonumber(L, 2);
+               player->setYaw(yaw);
+               g_game->cam_view.camera_yaw = yaw;
+               g_game->cam_view_target.camera_yaw = yaw;
+       }
+       
+       return 0;
+}
+
 int LuaLocalPlayer::l_get_hp(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
@@ -480,6 +512,9 @@ void LuaLocalPlayer::Register(lua_State *L)
 const char LuaLocalPlayer::className[] = "LocalPlayer";
 const luaL_Reg LuaLocalPlayer::methods[] = {
                luamethod(LuaLocalPlayer, get_velocity),
+               luamethod(LuaLocalPlayer, set_velocity),
+               luamethod(LuaLocalPlayer, get_yaw),
+               luamethod(LuaLocalPlayer, set_yaw),
                luamethod(LuaLocalPlayer, get_hp),
                luamethod(LuaLocalPlayer, get_name),
                luamethod(LuaLocalPlayer, get_wield_index),
index a5d1081c7f86ba588fedef3e1ebb93579164b617..c59cef7643ec7ba79d20191f6fcf20c46a2fd2a2 100644 (file)
@@ -34,6 +34,15 @@ class LuaLocalPlayer : public ModApiBase
 
        // get_velocity(self)
        static int l_get_velocity(lua_State *L);
+       
+       // set_velocity(self, vel)
+       static int l_set_velocity(lua_State *L);
+
+       // get_yaw(self)
+       static int l_get_yaw(lua_State *L);
+       
+       // set_yaw(self, yaw)
+       static int l_set_yaw(lua_State *L);
 
        // get_hp(self)
        static int l_get_hp(lua_State *L);
@@ -75,6 +84,8 @@ class LuaLocalPlayer : public ModApiBase
 
        // get_pos(self)
        static int l_get_pos(lua_State *L);
+       
+       // set_pos(self, pos)
        static int l_set_pos(lua_State *L);
 
        // get_movement_acceleration(self)
index 935d8c64284a0b4412354576f2aa2ab5183383cb..a4238fbd842d5ceea79b1fb1977274f104fe2912 100755 (executable)
@@ -6,7 +6,7 @@ CORE_BRANCH=master
 CORE_NAME=dragonfireclient
 GAME_GIT=https://git.minetest.land/Wuzzy/MineClone2
 GAME_BRANCH=master
-GAME_NAME=MineClone2
+GAME_NAME=mineclone2
 
 dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 if [ $# -ne 1 ]; then
index 9f38b6dc0cf5bbd38ceac80a90ce3526a0733918..1b680cf5bd5268a1fa832ae277230a424584cc0e 100755 (executable)
@@ -6,7 +6,7 @@ CORE_BRANCH=master
 CORE_NAME=dragonfireclient
 GAME_GIT=https://git.minetest.land/Wuzzy/MineClone2
 GAME_BRANCH=master
-GAME_NAME=MineClone2
+GAME_NAME=mineclone2
 
 dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 if [ $# -ne 1 ]; then