The Robot Update
This commit is contained in:
parent
af085acbd3
commit
b9f8f0a232
@ -2,10 +2,9 @@ core.cheats = {
|
|||||||
["Combat"] = {
|
["Combat"] = {
|
||||||
["Killaura"] = "killaura",
|
["Killaura"] = "killaura",
|
||||||
["AntiKnockback"] = "antiknockback",
|
["AntiKnockback"] = "antiknockback",
|
||||||
["NoFallDamage"] = "prevent_natural_damage",
|
["FastHit"] = "spamclick",
|
||||||
},
|
},
|
||||||
["Movement"] = {
|
["Movement"] = {
|
||||||
["GodMode"] = "entity_speed",
|
|
||||||
["Freecam"] = "freecam",
|
["Freecam"] = "freecam",
|
||||||
["PrivBypass"] = "priv_bypass",
|
["PrivBypass"] = "priv_bypass",
|
||||||
["AutoForward"] = "continuous_forward",
|
["AutoForward"] = "continuous_forward",
|
||||||
@ -20,7 +19,6 @@ core.cheats = {
|
|||||||
["NoHurtCam"] = "no_hurt_cam",
|
["NoHurtCam"] = "no_hurt_cam",
|
||||||
["BrightNight"] = "no_night",
|
["BrightNight"] = "no_night",
|
||||||
["Coords"] = "coords",
|
["Coords"] = "coords",
|
||||||
["Clouds"] = "enable_clouds",
|
|
||||||
},
|
},
|
||||||
["World"] = {
|
["World"] = {
|
||||||
["FastDig"] = "fastdig",
|
["FastDig"] = "fastdig",
|
||||||
@ -32,6 +30,13 @@ core.cheats = {
|
|||||||
["UnlimitedRange"] = "increase_tool_range_plus",
|
["UnlimitedRange"] = "increase_tool_range_plus",
|
||||||
["PointLiquids"] = "point_liquids",
|
["PointLiquids"] = "point_liquids",
|
||||||
},
|
},
|
||||||
|
["Exploit"] = {
|
||||||
|
["EntitySpeed"] = "entity_speed",
|
||||||
|
["ParticleExploit"] = "log_particles",
|
||||||
|
},
|
||||||
|
["Player"] = {
|
||||||
|
["NoFallDamage"] = "prevent_natural_damage",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
function core.register_cheat(cheatname, category, func)
|
function core.register_cheat(cheatname, category, func)
|
||||||
|
21
clientmods/dragonfire/autoeat/init.lua
Normal file
21
clientmods/dragonfire/autoeat/init.lua
Normal file
@ -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")
|
3
clientmods/dragonfire/autoeat/mod.conf
Normal file
3
clientmods/dragonfire/autoeat/mod.conf
Normal file
@ -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
|
1
clientmods/dragonfire/autoeat/settingtypes.txt
Normal file
1
clientmods/dragonfire/autoeat/settingtypes.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
autoeat (Automatically eat when damage was taken) bool false
|
@ -1,7 +1,3 @@
|
|||||||
chat = {}
|
|
||||||
|
|
||||||
chat.rainbow = dofile(minetest.get_modpath("chat") .. "/rainbow.lua")
|
|
||||||
|
|
||||||
function chat.send(message)
|
function chat.send(message)
|
||||||
local starts_with = message:sub(1, 1)
|
local starts_with = message:sub(1, 1)
|
||||||
|
|
||||||
@ -34,16 +30,4 @@ function chat.send(message)
|
|||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_on_sending_chat_message(chat.send)
|
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)
|
|
13
clientmods/dragonfire/chat/init.lua
Normal file
13
clientmods/dragonfire/chat/init.lua
Normal file
@ -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")
|
||||||
|
|
||||||
|
|
10
clientmods/dragonfire/chat/leak.lua
Normal file
10
clientmods/dragonfire/chat/leak.lua
Normal file
@ -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)
|
@ -2,3 +2,5 @@ chat_color (Chat Color) string white
|
|||||||
chat_reverse (Reverse Chat messages) bool false
|
chat_reverse (Reverse Chat messages) bool false
|
||||||
chat_enable_spam (Spam Chat) bool false
|
chat_enable_spam (Spam Chat) bool false
|
||||||
chat_spam (Message to spam into Chat) string
|
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
|
12
clientmods/dragonfire/chat/spam.lua
Normal file
12
clientmods/dragonfire/chat/spam.lua
Normal file
@ -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)
|
5
clientmods/dragonfire/chat/status.lua
Normal file
5
clientmods/dragonfire/chat/status.lua
Normal file
@ -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)
|
@ -22,7 +22,7 @@ minetest.register_chatcommand("teleport", {
|
|||||||
minetest.register_chatcommand("wielded", {
|
minetest.register_chatcommand("wielded", {
|
||||||
description = "Print itemstring of wieleded item",
|
description = "Print itemstring of wieleded item",
|
||||||
func = function()
|
func = function()
|
||||||
return true, minetest.get_wielded_item():get_name()
|
return true, minetest.localplayer:get_wielded_item():get_name()
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -47,6 +47,13 @@ minetest.register_chatcommand("kill", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_chatcommand("hop", {
|
||||||
|
description = "Hop",
|
||||||
|
func = function()
|
||||||
|
minetest.set_keypress("jump", true)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
minetest.register_chatcommand("set", {
|
minetest.register_chatcommand("set", {
|
||||||
params = "([-n] <name> <value>) | <name>",
|
params = "([-n] <name> <value>) | <name>",
|
||||||
description = "Set or read client configuration setting",
|
description = "Set or read client configuration setting",
|
||||||
@ -78,4 +85,4 @@ minetest.register_chatcommand("set", {
|
|||||||
return false, "Invalid parameters (see .help set)."
|
return false, "Invalid parameters (see .help set)."
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
@ -32,5 +32,5 @@ minetest.register_on_punchnode(function(pos, node)
|
|||||||
player:set_wield_index(new_index)
|
player:set_wield_index(new_index)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.register_cheat("AutoTool", "Inventory", "autotool")
|
minetest.register_cheat("AutoTool", "Player", "autotool")
|
||||||
|
|
@ -24,4 +24,4 @@ function minetest.open_special_inventory()
|
|||||||
minetest.show_formspec("enderchest:enderchest", formspec)
|
minetest.show_formspec("enderchest:enderchest", formspec)
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_cheat("Enderchest", "Inventory", minetest.open_special_inventory)
|
minetest.register_cheat("Enderchest", "Player", minetest.open_special_inventory)
|
27
clientmods/dragonfire/inventory/hand.lua
Normal file
27
clientmods/dragonfire/inventory/hand.lua
Normal file
@ -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)
|
@ -5,3 +5,4 @@ dofile(modpath .. "/invhack.lua")
|
|||||||
dofile(modpath .. "/enderchest.lua")
|
dofile(modpath .. "/enderchest.lua")
|
||||||
dofile(modpath .. "/next_item.lua")
|
dofile(modpath .. "/next_item.lua")
|
||||||
dofile(modpath .. "/autotool.lua")
|
dofile(modpath .. "/autotool.lua")
|
||||||
|
dofile(modpath .. "/hand.lua")
|
@ -14,5 +14,5 @@ minetest.register_globalstep(function(dtime)
|
|||||||
elapsed_time = 0
|
elapsed_time = 0
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.register_cheat("NextItem", "Inventory", "next_item")
|
minetest.register_cheat("NextItem", "Player", "next_item")
|
||||||
|
|
1
clientmods/dragonfire/modpack.txt
Normal file
1
clientmods/dragonfire/modpack.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
109
clientmods/dragonfire/pathfinding/init.lua
Normal file
109
clientmods/dragonfire/pathfinding/init.lua
Normal file
@ -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)
|
3
clientmods/dragonfire/pathfinding/mod.conf
Normal file
3
clientmods/dragonfire/pathfinding/mod.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
name = pathfinding
|
||||||
|
description = Adds the .goto command!
|
||||||
|
author = Fleckenstein
|
3
clientmods/dragonfire/pathfinding/settingtypes.txt
Normal file
3
clientmods/dragonfire/pathfinding/settingtypes.txt
Normal file
@ -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
|
33
clientmods/dragonfire/perlin/init.lua
Normal file
33
clientmods/dragonfire/perlin/init.lua
Normal file
@ -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)
|
3
clientmods/dragonfire/perlin/mod.conf
Normal file
3
clientmods/dragonfire/perlin/mod.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
name = perlin
|
||||||
|
description = A bot that does terraforming automatically using perlin noise.
|
||||||
|
author = Fleckenstein
|
144
clientmods/dragonfire/perlin/perlin.lua
Normal file
144
clientmods/dragonfire/perlin/perlin.lua
Normal file
@ -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
|
@ -44,4 +44,4 @@ minetest.register_chatcommand("respawn", {
|
|||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_cheat("AutoRespawn", "Combat", "autorespawn")
|
minetest.register_cheat("AutoRespawn", "Player", "autorespawn")
|
@ -1,3 +1,4 @@
|
|||||||
|
local autoeat = rawget(_G, "autoeat") or {}
|
||||||
local storage = minetest.get_mod_storage()
|
local storage = minetest.get_mod_storage()
|
||||||
local pos1, pos2
|
local pos1, pos2
|
||||||
local min, max = math.min, math.max
|
local min, max = math.min, math.max
|
||||||
@ -114,7 +115,7 @@ minetest.register_chatcommand("schemeabort", {
|
|||||||
if not build_data then
|
if not build_data then
|
||||||
return false, "Currently not building a scheme."
|
return false, "Currently not building a scheme."
|
||||||
end
|
end
|
||||||
building, build_index, build_data, build_pos, just_placed_node = nil
|
building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks = nilw
|
||||||
return true, "Aborted."
|
return true, "Aborted."
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
@ -150,10 +151,10 @@ minetest.register_chatcommand("schemesetindex", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_globalstep(function()
|
minetest.register_globalstep(function()
|
||||||
if building then
|
if building and not autoeat.eating then
|
||||||
local data = build_data[build_index]
|
local data = build_data[build_index]
|
||||||
if not data then
|
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
|
building, build_index, build_data, build_pos, just_placed_node, failed_count, out_of_blocks = nil
|
||||||
minetest.display_chat_message("Completed Schematica.")
|
minetest.display_chat_message("Completed Schematica.")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -182,16 +183,22 @@ minetest.register_globalstep(function()
|
|||||||
if not new_index then
|
if not new_index then
|
||||||
if not out_of_blocks 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.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)
|
minetest.send_chat_message("[Schematicas] Missing ressource: " .. node)
|
||||||
end
|
end
|
||||||
out_of_blocks = true
|
out_of_blocks = true
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
if out_of_blocks then
|
||||||
|
minetest.send_chat_message("[Schematicas] Resuming.")
|
||||||
|
end
|
||||||
out_of_blocks = false
|
out_of_blocks = false
|
||||||
minetest.localplayer:set_wield_index(new_index)
|
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.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)
|
minetest.place_node(pos)
|
||||||
just_placed_node = true
|
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
|
||||||
end)
|
end)
|
||||||
|
|
4
clientmods/dragonfire/schematicas/mod.conf
Normal file
4
clientmods/dragonfire/schematicas/mod.conf
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
name = schematicas
|
||||||
|
description = Save structures and recreate them automatically in survival.
|
||||||
|
author = Fleckenstein
|
||||||
|
optional_depends = autoeat
|
@ -56,7 +56,7 @@ minetest.register_globalstep(function(dtime)
|
|||||||
local item = player:get_wielded_item()
|
local item = player:get_wielded_item()
|
||||||
local def = minetest.get_item_def(item:get_name())
|
local def = minetest.get_item_def(item:get_name())
|
||||||
local nodes_per_tick = tonumber(minetest.settings:get("nodes_per_tick")) or 8
|
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 item and item:get_count() > 0 and def and def.node_placement_prediction ~= "" then
|
||||||
if minetest.settings:get_bool("scaffold") then
|
if minetest.settings:get_bool("scaffold") then
|
||||||
minetest.place_node(vector.add(pos, {x = 0, y = -0.6, z = 0}))
|
minetest.place_node(vector.add(pos, {x = 0, y = -0.6, z = 0}))
|
||||||
elseif minetest.settings:get_bool("highway_z") then
|
elseif minetest.settings:get_bool("highway_z") then
|
3
clientmods/dragonfire/world/mod.conf
Normal file
3
clientmods/dragonfire/world/mod.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
name = world
|
||||||
|
desciption = Adds several world interaction bots to dragonfire.
|
||||||
|
author = Fleckenstein
|
@ -3,3 +3,4 @@ highway_z (HighwayZ) bool false
|
|||||||
block_water (BlockWater) bool false
|
block_water (BlockWater) bool false
|
||||||
autotnt (AutoTNT) bool false
|
autotnt (AutoTNT) bool false
|
||||||
replace (Replace) bool false
|
replace (Replace) bool false
|
||||||
|
nodes_per_tick (Number of nodes to place per tick) int 8
|
@ -5,3 +5,6 @@ load_mod_inventory = true
|
|||||||
load_mod_commands = true
|
load_mod_commands = true
|
||||||
load_mod_chat = true
|
load_mod_chat = true
|
||||||
load_mod_schematicas = true
|
load_mod_schematicas = true
|
||||||
|
load_mod_pathfinding = true
|
||||||
|
load_mod_autoeat = true
|
||||||
|
load_mod_perlin = true
|
||||||
|
@ -837,7 +837,26 @@ Call these functions only at load time!
|
|||||||
* `pos2`: end of the ray
|
* `pos2`: end of the ray
|
||||||
* `objects`: if false, only nodes will be returned. Default is `true`.
|
* `objects`: if false, only nodes will be returned. Default is `true`.
|
||||||
* `liquids`: if false, liquid nodes won't be returned. Default is `false`.
|
* `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)`
|
* `minetest.find_nodes_with_meta(pos1, pos2)`
|
||||||
* Get a table of positions of nodes that have metadata within a region
|
* Get a table of positions of nodes that have metadata within a region
|
||||||
{pos1, pos2}.
|
{pos1, pos2}.
|
||||||
@ -969,6 +988,10 @@ Passed to `HTTPApiTable.fetch` callback. Returned by
|
|||||||
* Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`)
|
* Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`)
|
||||||
|
|
||||||
### Misc
|
### 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)`
|
* `minetest.get_inventory(location)`
|
||||||
* Returns the inventory at location
|
* Returns the inventory at location
|
||||||
* `minetest.register_cheat(name, category, setting | function)`
|
* `minetest.register_cheat(name, category, setting | function)`
|
||||||
@ -1123,8 +1146,14 @@ Methods:
|
|||||||
* returns current player current position
|
* returns current player current position
|
||||||
* `set_pos(pos)`
|
* `set_pos(pos)`
|
||||||
* sets the position (anticheat may not like this)
|
* sets the position (anticheat may not like this)
|
||||||
|
* `get_yaw()`
|
||||||
|
* returns the yaw (degrees)
|
||||||
|
* `set_yaw(yaw)`
|
||||||
|
* sets the yaw (degrees)
|
||||||
* `get_velocity()`
|
* `get_velocity()`
|
||||||
* returns player speed vector
|
* returns player speed vector
|
||||||
|
* `set_velocity(vel)`
|
||||||
|
* sets player speed vector
|
||||||
* `get_hp()`
|
* `get_hp()`
|
||||||
* returns player HP
|
* returns player HP
|
||||||
* `get_name()`
|
* `get_name()`
|
||||||
|
@ -506,7 +506,7 @@ void Client::step(float dtime)
|
|||||||
{
|
{
|
||||||
float &counter = m_playerpos_send_timer;
|
float &counter = m_playerpos_send_timer;
|
||||||
counter += dtime;
|
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;
|
counter = 0.0;
|
||||||
sendPlayerPos();
|
sendPlayerPos();
|
||||||
@ -1289,6 +1289,9 @@ void Client::sendReady()
|
|||||||
|
|
||||||
void Client::sendPlayerPos(v3f pos)
|
void Client::sendPlayerPos(v3f pos)
|
||||||
{
|
{
|
||||||
|
if (g_settings->getBool("freecam"))
|
||||||
|
return;
|
||||||
|
|
||||||
LocalPlayer *player = m_env.getLocalPlayer();
|
LocalPlayer *player = m_env.getLocalPlayer();
|
||||||
if (!player)
|
if (!player)
|
||||||
return;
|
return;
|
||||||
|
@ -238,11 +238,9 @@ void Game::run()
|
|||||||
{
|
{
|
||||||
ProfilerGraph graph;
|
ProfilerGraph graph;
|
||||||
RunStats stats = { 0 };
|
RunStats stats = { 0 };
|
||||||
CameraOrientation cam_view_target = { 0 };
|
|
||||||
CameraOrientation cam_view = { 0 };
|
|
||||||
FpsControl draw_times = { 0 };
|
FpsControl draw_times = { 0 };
|
||||||
f32 dtime; // in seconds
|
f32 dtime; // in seconds
|
||||||
|
|
||||||
/* Clear the profiler */
|
/* Clear the profiler */
|
||||||
Profiler::GraphValues dummyvalues;
|
Profiler::GraphValues dummyvalues;
|
||||||
g_profiler->graphGet(dummyvalues);
|
g_profiler->graphGet(dummyvalues);
|
||||||
@ -309,9 +307,8 @@ void Game::run()
|
|||||||
processClientEvents(&cam_view_target);
|
processClientEvents(&cam_view_target);
|
||||||
updateCamera(draw_times.busy_time, dtime);
|
updateCamera(draw_times.busy_time, dtime);
|
||||||
updateSound(dtime);
|
updateSound(dtime);
|
||||||
if (! g_settings->getBool("freecam"))
|
processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud,
|
||||||
processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud,
|
m_game_ui->m_flags.show_debug);
|
||||||
m_game_ui->m_flags.show_debug);
|
|
||||||
updateFrame(&graph, &stats, dtime, cam_view);
|
updateFrame(&graph, &stats, dtime, cam_view);
|
||||||
updateProfilerGraphs(&graph);
|
updateProfilerGraphs(&graph);
|
||||||
|
|
||||||
@ -2814,7 +2811,7 @@ void Game::handlePointingAtObject(const PointedThing &pointed,
|
|||||||
bool do_punch = false;
|
bool do_punch = false;
|
||||||
bool do_punch_damage = 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 = true;
|
||||||
do_punch_damage = true;
|
do_punch_damage = true;
|
||||||
runData.object_hit_delay_timer = object_hit_delay;
|
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;
|
Game *game = (Game *) data;
|
||||||
LocalPlayer *player = game->client->getEnv().getLocalPlayer();
|
LocalPlayer *player = game->client->getEnv().getLocalPlayer();
|
||||||
static v3f player_pos = player->getPosition();
|
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();
|
player_pos = player->getPosition();
|
||||||
else
|
player_speed = player->getSpeed();
|
||||||
|
game->camera->setCameraMode(CAMERA_MODE_FIRST);
|
||||||
|
} else {
|
||||||
player->setPosition(player_pos);
|
player->setPosition(player_pos);
|
||||||
|
player->setSpeed(player_speed);
|
||||||
|
}
|
||||||
game->updatePlayerCAOVisibility();
|
game->updatePlayerCAOVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -927,6 +927,9 @@ public:
|
|||||||
|
|
||||||
bool m_does_lost_focus_pause_game = false;
|
bool m_does_lost_focus_pause_game = false;
|
||||||
|
|
||||||
|
CameraOrientation cam_view_target = { 0 };
|
||||||
|
CameraOrientation cam_view = { 0 };
|
||||||
|
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
bool m_cache_hold_aux1;
|
bool m_cache_hold_aux1;
|
||||||
bool m_android_chat_open;
|
bool m_android_chat_open;
|
||||||
|
@ -210,8 +210,7 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
|
|||||||
m_guitext_status->enableOverrideColor(true);
|
m_guitext_status->enableOverrideColor(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hide chat when console is visible
|
m_guitext_chat->setVisible(isChatVisible());
|
||||||
//m_guitext_chat->setVisible(isChatVisible() && !chat_console->isVisible());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameUI::initFlags()
|
void GameUI::initFlags()
|
||||||
|
@ -195,7 +195,6 @@ public:
|
|||||||
TouchScreenGUI *m_touchscreengui;
|
TouchScreenGUI *m_touchscreengui;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
|
||||||
// The current state of keys
|
// The current state of keys
|
||||||
KeyList keyIsDown;
|
KeyList keyIsDown;
|
||||||
// Whether a key has been pressed or not
|
// Whether a key has been pressed or not
|
||||||
@ -225,6 +224,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual bool isKeyDown(GameKeyType k) = 0;
|
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 wasKeyDown(GameKeyType k) = 0;
|
||||||
virtual bool cancelPressed() = 0;
|
virtual bool cancelPressed() = 0;
|
||||||
|
|
||||||
@ -271,6 +272,15 @@ public:
|
|||||||
{
|
{
|
||||||
return m_receiver->IsKeyDown(keycache.key[k]) || joystick.isKeyDown(k);
|
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)
|
virtual bool wasKeyDown(GameKeyType k)
|
||||||
{
|
{
|
||||||
return m_receiver->WasKeyDown(keycache.key[k]) || joystick.wasKeyDown(k);
|
return m_receiver->WasKeyDown(keycache.key[k]) || joystick.wasKeyDown(k);
|
||||||
@ -367,7 +377,7 @@ public:
|
|||||||
m_receiver->clearInput();
|
m_receiver->clearInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MyEventReceiver *m_receiver = nullptr;
|
MyEventReceiver *m_receiver = nullptr;
|
||||||
v2s32 m_mousepos;
|
v2s32 m_mousepos;
|
||||||
};
|
};
|
||||||
@ -383,6 +393,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; }
|
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 wasKeyDown(GameKeyType k) { return false; }
|
||||||
virtual bool cancelPressed() { return false; }
|
virtual bool cancelPressed() { return false; }
|
||||||
virtual v2s32 getMousePos() { return mousepos; }
|
virtual v2s32 getMousePos() { return mousepos; }
|
||||||
|
@ -88,6 +88,8 @@ void set_default_settings(Settings *settings)
|
|||||||
settings->setDefault("no_night", "false");
|
settings->setDefault("no_night", "false");
|
||||||
settings->setDefault("coords", "false");
|
settings->setDefault("coords", "false");
|
||||||
settings->setDefault("point_liquids", "false");
|
settings->setDefault("point_liquids", "false");
|
||||||
|
settings->setDefault("log_particles", "false");
|
||||||
|
settings->setDefault("spamclick", "false");
|
||||||
|
|
||||||
// Keymap
|
// Keymap
|
||||||
settings->setDefault("remote_port", "30000");
|
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("max_simultaneous_block_sends_per_client", "40");
|
||||||
settings->setDefault("time_send_interval", "5");
|
settings->setDefault("time_send_interval", "5");
|
||||||
|
|
||||||
settings->setDefault("default_game", "minetest");
|
settings->setDefault("default_game", "mineclone2");
|
||||||
settings->setDefault("motd", "");
|
settings->setDefault("motd", "");
|
||||||
settings->setDefault("max_users", "15");
|
settings->setDefault("max_users", "15");
|
||||||
settings->setDefault("creative_mode", "false");
|
settings->setDefault("creative_mode", "false");
|
||||||
|
@ -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.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include "client/client.h"
|
#include "client/client.h"
|
||||||
|
|
||||||
#include "util/base64.h"
|
#include "util/base64.h"
|
||||||
@ -977,7 +978,11 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt)
|
|||||||
ClientEvent *event = new ClientEvent();
|
ClientEvent *event = new ClientEvent();
|
||||||
event->type = CE_SPAWN_PARTICLE;
|
event->type = CE_SPAWN_PARTICLE;
|
||||||
event->spawn_particle = new ParticleParameters(p);
|
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);
|
m_client_event_queue.push(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ bool ScriptApiCheatsCheat::is_enabled()
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return ! m_function_ref && g_settings->getBool(m_setting);
|
return ! m_function_ref && g_settings->getBool(m_setting);
|
||||||
} catch (SettingNotFoundException) {
|
} catch (SettingNotFoundException &) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
#include "nodedef.h"
|
#include "nodedef.h"
|
||||||
|
#include "client/keycode.h"
|
||||||
|
|
||||||
#define checkCSMRestrictionFlag(flag) \
|
#define checkCSMRestrictionFlag(flag) \
|
||||||
( getClient(L)->checkCSMRestrictionFlag(CSMRestrictionFlags::flag) )
|
( getClient(L)->checkCSMRestrictionFlag(CSMRestrictionFlags::flag) )
|
||||||
@ -470,13 +471,31 @@ int ModApiClient::l_get_inventory(lua_State *L)
|
|||||||
inventory_location.deSerialize(location);
|
inventory_location.deSerialize(location);
|
||||||
inventory = client->getInventory(inventory_location);
|
inventory = client->getInventory(inventory_location);
|
||||||
push_inventory(L, inventory);
|
push_inventory(L, inventory);
|
||||||
} catch (SerializationError) {
|
} catch (SerializationError &) {
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
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)
|
void ModApiClient::Initialize(lua_State *L, int top)
|
||||||
{
|
{
|
||||||
API_FCT(get_current_modname);
|
API_FCT(get_current_modname);
|
||||||
@ -508,4 +527,5 @@ void ModApiClient::Initialize(lua_State *L, int top)
|
|||||||
API_FCT(place_node);
|
API_FCT(place_node);
|
||||||
API_FCT(dig_node);
|
API_FCT(dig_node);
|
||||||
API_FCT(get_inventory);
|
API_FCT(get_inventory);
|
||||||
|
API_FCT(set_keypress);
|
||||||
}
|
}
|
||||||
|
@ -116,6 +116,9 @@ private:
|
|||||||
|
|
||||||
// get_inventory(location)
|
// get_inventory(location)
|
||||||
static int l_get_inventory(lua_State *L);
|
static int l_get_inventory(lua_State *L);
|
||||||
|
|
||||||
|
// l_set_keypress(key_setting, pressed)
|
||||||
|
static int l_set_keypress(lua_State *L);
|
||||||
public:
|
public:
|
||||||
static void Initialize(lua_State *L, int top);
|
static void Initialize(lua_State *L, int top);
|
||||||
};
|
};
|
||||||
|
@ -1365,7 +1365,7 @@ int ModApiEnvMod::l_delete_area(lua_State *L)
|
|||||||
// max_jump, max_drop, algorithm) -> table containing path
|
// max_jump, max_drop, algorithm) -> table containing path
|
||||||
int ModApiEnvMod::l_find_path(lua_State *L)
|
int ModApiEnvMod::l_find_path(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
Environment *env = getEnv(L);
|
||||||
|
|
||||||
v3s16 pos1 = read_v3s16(L, 1);
|
v3s16 pos1 = read_v3s16(L, 1);
|
||||||
v3s16 pos2 = read_v3s16(L, 2);
|
v3s16 pos2 = read_v3s16(L, 2);
|
||||||
@ -1382,8 +1382,8 @@ int ModApiEnvMod::l_find_path(lua_State *L)
|
|||||||
if (algorithm == "Dijkstra")
|
if (algorithm == "Dijkstra")
|
||||||
algo = PA_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);
|
searchdistance, max_jump, max_drop, algo);
|
||||||
|
|
||||||
if (!path.empty()) {
|
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_near_under_air_except);
|
||||||
API_FCT(find_nodes_in_area);
|
API_FCT(find_nodes_in_area);
|
||||||
API_FCT(find_nodes_in_area_under_air);
|
API_FCT(find_nodes_in_area_under_air);
|
||||||
|
API_FCT(find_path);
|
||||||
API_FCT(line_of_sight);
|
API_FCT(line_of_sight);
|
||||||
API_FCT(raycast);
|
API_FCT(raycast);
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,38 @@ int LuaLocalPlayer::l_get_velocity(lua_State *L)
|
|||||||
return 1;
|
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)
|
int LuaLocalPlayer::l_get_hp(lua_State *L)
|
||||||
{
|
{
|
||||||
LocalPlayer *player = getobject(L, 1);
|
LocalPlayer *player = getobject(L, 1);
|
||||||
@ -480,6 +512,9 @@ void LuaLocalPlayer::Register(lua_State *L)
|
|||||||
const char LuaLocalPlayer::className[] = "LocalPlayer";
|
const char LuaLocalPlayer::className[] = "LocalPlayer";
|
||||||
const luaL_Reg LuaLocalPlayer::methods[] = {
|
const luaL_Reg LuaLocalPlayer::methods[] = {
|
||||||
luamethod(LuaLocalPlayer, get_velocity),
|
luamethod(LuaLocalPlayer, get_velocity),
|
||||||
|
luamethod(LuaLocalPlayer, set_velocity),
|
||||||
|
luamethod(LuaLocalPlayer, get_yaw),
|
||||||
|
luamethod(LuaLocalPlayer, set_yaw),
|
||||||
luamethod(LuaLocalPlayer, get_hp),
|
luamethod(LuaLocalPlayer, get_hp),
|
||||||
luamethod(LuaLocalPlayer, get_name),
|
luamethod(LuaLocalPlayer, get_name),
|
||||||
luamethod(LuaLocalPlayer, get_wield_index),
|
luamethod(LuaLocalPlayer, get_wield_index),
|
||||||
|
@ -34,6 +34,15 @@ private:
|
|||||||
|
|
||||||
// get_velocity(self)
|
// get_velocity(self)
|
||||||
static int l_get_velocity(lua_State *L);
|
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)
|
// get_hp(self)
|
||||||
static int l_get_hp(lua_State *L);
|
static int l_get_hp(lua_State *L);
|
||||||
@ -75,6 +84,8 @@ private:
|
|||||||
|
|
||||||
// get_pos(self)
|
// get_pos(self)
|
||||||
static int l_get_pos(lua_State *L);
|
static int l_get_pos(lua_State *L);
|
||||||
|
|
||||||
|
// set_pos(self, pos)
|
||||||
static int l_set_pos(lua_State *L);
|
static int l_set_pos(lua_State *L);
|
||||||
|
|
||||||
// get_movement_acceleration(self)
|
// get_movement_acceleration(self)
|
||||||
|
@ -6,7 +6,7 @@ CORE_BRANCH=master
|
|||||||
CORE_NAME=dragonfireclient
|
CORE_NAME=dragonfireclient
|
||||||
GAME_GIT=https://git.minetest.land/Wuzzy/MineClone2
|
GAME_GIT=https://git.minetest.land/Wuzzy/MineClone2
|
||||||
GAME_BRANCH=master
|
GAME_BRANCH=master
|
||||||
GAME_NAME=MineClone2
|
GAME_NAME=mineclone2
|
||||||
|
|
||||||
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
if [ $# -ne 1 ]; then
|
if [ $# -ne 1 ]; then
|
||||||
|
@ -6,7 +6,7 @@ CORE_BRANCH=master
|
|||||||
CORE_NAME=dragonfireclient
|
CORE_NAME=dragonfireclient
|
||||||
GAME_GIT=https://git.minetest.land/Wuzzy/MineClone2
|
GAME_GIT=https://git.minetest.land/Wuzzy/MineClone2
|
||||||
GAME_BRANCH=master
|
GAME_BRANCH=master
|
||||||
GAME_NAME=MineClone2
|
GAME_NAME=mineclone2
|
||||||
|
|
||||||
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
if [ $# -ne 1 ]; then
|
if [ $# -ne 1 ]; then
|
||||||
|
Loading…
x
Reference in New Issue
Block a user