parent
bd6c675e58
commit
d139b50797
|
@ -1,18 +1,384 @@
|
|||
|
||||
--
|
||||
-- Player
|
||||
--
|
||||
|
||||
local LEVEL_EXTENT = 100
|
||||
local LEVEL_MAX = 300
|
||||
local SPEED_MAX = 6
|
||||
|
||||
local INV_PICK_INDEX = 1
|
||||
local INV_LIGHT_INDEX = 2
|
||||
local INV_SIZE = 2
|
||||
|
||||
local function get_pick_info(player)
|
||||
local hud_inv = player:get_inventory()
|
||||
local pick = hud_inv:get_stack("main", INV_PICK_INDEX)
|
||||
local level, speed = pick:get_name():match("^score:pick_([%d]+)_([%d]+)$")
|
||||
if not level or not tonumber(level) or not speed or not tonumber(speed) then
|
||||
level = 1
|
||||
speed = 1
|
||||
end
|
||||
return tonumber(level), tonumber(speed)
|
||||
end
|
||||
|
||||
local function get_pick_name(level, speed)
|
||||
return "score:pick_" .. level .. "_" .. speed
|
||||
end
|
||||
|
||||
local inventories = {
|
||||
--[[
|
||||
playername = {
|
||||
itemname = count,
|
||||
},
|
||||
]]
|
||||
}
|
||||
|
||||
local function save_inventories()
|
||||
local file = io.open(minetest.get_worldpath() .. "/score_inventory", "w")
|
||||
if not file then
|
||||
minetest.log("error", "Can't save inventories")
|
||||
return
|
||||
end
|
||||
file:write(minetest.serialize(inventories))
|
||||
file:close()
|
||||
end
|
||||
|
||||
local function load_inventories()
|
||||
local file = io.open(minetest.get_worldpath() .. "/score_inventory", "r")
|
||||
if not file then
|
||||
minetest.log("error", "Can't load inventories")
|
||||
return
|
||||
end
|
||||
inventories = minetest.deserialize(file:read("*all"))
|
||||
file:close()
|
||||
end
|
||||
|
||||
local function get_pick_level_cost(level)
|
||||
local cost = {}
|
||||
cost["score:iron_" .. (level + 1)] = 30
|
||||
return cost
|
||||
end
|
||||
|
||||
local function get_pick_speed_cost(level, speed)
|
||||
local cost = {}
|
||||
cost["score:iron_" .. level] = math.ceil(30 * 1.2 ^ (speed - 1))
|
||||
return cost
|
||||
end
|
||||
|
||||
local function get_light_cost(level)
|
||||
local cost = {}
|
||||
cost["score:coal_" .. level] = 50
|
||||
if level > 1 then
|
||||
cost["score:coal_" .. (level + 1)] = 80
|
||||
end
|
||||
return cost
|
||||
end
|
||||
|
||||
local function update_formspec(player, not_enough_resources)
|
||||
local inv = inventories[player:get_player_name()]
|
||||
local hud_inv = player:get_inventory()
|
||||
|
||||
local formspec = "size[5,7]"
|
||||
formspec = formspec .. "tableoptions[background=#00000000;border=false;highlight=#00000000]"
|
||||
formspec = formspec .. "tablecolumns[color;text;text]"
|
||||
formspec = formspec .. "table[0,0;5,4;;"
|
||||
|
||||
local level, speed = get_pick_info(player)
|
||||
local light = hud_inv:get_stack("main", INV_LIGHT_INDEX)
|
||||
formspec = formspec .. "#FFFF00,Item,Amount,"
|
||||
formspec = formspec .. ",Pick Level " .. level .. " Speed " .. speed .. ",1,"
|
||||
formspec = formspec .. "," .. light:get_definition().description .. "," .. light:get_count() .. ","
|
||||
|
||||
local lines = {}
|
||||
for itemname,count in pairs(inv) do
|
||||
table.insert(lines, {
|
||||
minetest.formspec_escape(minetest.registered_items[itemname].description),
|
||||
count,
|
||||
})
|
||||
end
|
||||
|
||||
table.sort(lines, function(a, b)
|
||||
if b[1] == "Score" then
|
||||
return false
|
||||
end
|
||||
if a[1] == "Score" then
|
||||
return true
|
||||
end
|
||||
local a_level = tonumber(a[1]:match(".* Level ([%d]+)$"))
|
||||
local b_level = tonumber(b[1]:match(".* Level ([%d]+)$"))
|
||||
if not a_level or not b_level or a_level == b_level then
|
||||
return a[1] < b[1]
|
||||
end
|
||||
return a_level > b_level
|
||||
end)
|
||||
|
||||
for _,line in ipairs(lines) do
|
||||
formspec = formspec .. "," .. line[1] .. "," .. line[2] .. ","
|
||||
end
|
||||
|
||||
-- remove trailing comma
|
||||
if formspec:match(",$") then
|
||||
formspec = formspec:sub(1, -2)
|
||||
end
|
||||
|
||||
formspec = formspec .. ";0]"
|
||||
|
||||
formspec = formspec .. "button[0,4;2,1;btn_pick_level;Level Pick up]"
|
||||
formspec = formspec .. "tableoptions[background=#00000000;border=false;highlight=#00000000]"
|
||||
formspec = formspec .. "tablecolumns[color;text;text]"
|
||||
formspec = formspec .. "table[2,4;3,1;;"
|
||||
if level >= LEVEL_MAX then
|
||||
formspec = formspec .. ",Max. level,,"
|
||||
else
|
||||
if not_enough_resources == "pick_level" then
|
||||
formspec = formspec .. "#FF0000,Requires:,,"
|
||||
else
|
||||
formspec = formspec .. ",Requires:,,"
|
||||
end
|
||||
local pick_level_cost = get_pick_level_cost(level)
|
||||
for item, required in pairs(pick_level_cost) do
|
||||
local name = minetest.registered_items[item].description
|
||||
formspec = formspec .. "," .. name .. "," .. required .. ","
|
||||
end
|
||||
-- remove trailing comma
|
||||
if formspec:match(",$") then
|
||||
formspec = formspec:sub(1, -2)
|
||||
end
|
||||
formspec = formspec .. ";0]"
|
||||
end
|
||||
|
||||
formspec = formspec .. "button[0,5;2,1;btn_pick_speed;Speed Pick up]"
|
||||
formspec = formspec .. "tableoptions[background=#00000000;border=false;highlight=#00000000]"
|
||||
formspec = formspec .. "tablecolumns[color;text;text]"
|
||||
formspec = formspec .. "table[2,5;3,1;;"
|
||||
if speed >= SPEED_MAX then
|
||||
formspec = formspec .. ",Max. speed for this level,,"
|
||||
else
|
||||
if not_enough_resources == "pick_speed" then
|
||||
formspec = formspec .. "#FF0000,Requires:,,"
|
||||
else
|
||||
formspec = formspec .. ",Requires:,,"
|
||||
end
|
||||
local pick_speed_cost = get_pick_speed_cost(level, speed)
|
||||
for item, required in pairs(pick_speed_cost) do
|
||||
local name = minetest.registered_items[item].description
|
||||
formspec = formspec .. "," .. name .. "," .. required .. ","
|
||||
end
|
||||
-- remove trailing comma
|
||||
if formspec:match(",$") then
|
||||
formspec = formspec:sub(1, -2)
|
||||
end
|
||||
formspec = formspec .. ";0]"
|
||||
end
|
||||
|
||||
formspec = formspec .. "button[0,6;2,1;btn_light;Craft Light]"
|
||||
formspec = formspec .. "tableoptions[background=#00000000;border=false;highlight=#00000000]"
|
||||
formspec = formspec .. "tablecolumns[color;text;text]"
|
||||
formspec = formspec .. "table[2,6;3,1;;"
|
||||
if not_enough_resources == "light" then
|
||||
formspec = formspec .. "#FF0000,Requires:,,"
|
||||
else
|
||||
formspec = formspec .. ",Requires:,,"
|
||||
end
|
||||
local light_cost = get_light_cost(level)
|
||||
for item, required in pairs(light_cost) do
|
||||
local name = minetest.registered_items[item].description
|
||||
formspec = formspec .. "," .. name .. "," .. required .. ","
|
||||
end
|
||||
-- remove trailing comma
|
||||
if formspec:match(",$") then
|
||||
formspec = formspec:sub(1, -2)
|
||||
end
|
||||
formspec = formspec .. ";0]"
|
||||
|
||||
if formspec ~= player:get_inventory_formspec() then
|
||||
player:set_inventory_formspec(formspec)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if fields["btn_pick_level"] then
|
||||
local inv = inventories[player:get_player_name()]
|
||||
local hud_inv = player:get_inventory()
|
||||
|
||||
local level, speed = get_pick_info(player)
|
||||
|
||||
local pick_cost = get_pick_level_cost(level)
|
||||
for item, required in pairs(pick_cost) do
|
||||
if not inv[item] or inv[item] < required then
|
||||
update_formspec(player, "pick_level")
|
||||
return true
|
||||
end
|
||||
end
|
||||
for item, required in pairs(pick_cost) do
|
||||
inv[item] = inv[item] - required
|
||||
end
|
||||
|
||||
hud_inv:set_stack("main", INV_PICK_INDEX, ItemStack(get_pick_name(level + 1, math.max(speed - 1, 1))))
|
||||
|
||||
update_formspec(player)
|
||||
return true
|
||||
end
|
||||
|
||||
if fields["btn_pick_speed"] then
|
||||
local inv = inventories[player:get_player_name()]
|
||||
local hud_inv = player:get_inventory()
|
||||
|
||||
local level, speed = get_pick_info(player)
|
||||
|
||||
if speed >= SPEED_MAX then
|
||||
return true
|
||||
end
|
||||
|
||||
local pick_cost = get_pick_speed_cost(level, speed)
|
||||
for item, required in pairs(pick_cost) do
|
||||
if not inv[item] or inv[item] < required then
|
||||
update_formspec(player, "pick_speed")
|
||||
return true
|
||||
end
|
||||
end
|
||||
for item, required in pairs(pick_cost) do
|
||||
inv[item] = inv[item] - required
|
||||
end
|
||||
|
||||
hud_inv:set_stack("main", INV_PICK_INDEX, ItemStack(get_pick_name(level, speed + 1)))
|
||||
|
||||
update_formspec(player)
|
||||
return true
|
||||
end
|
||||
|
||||
if fields["btn_light"] then
|
||||
local inv = inventories[player:get_player_name()]
|
||||
local hud_inv = player:get_inventory()
|
||||
|
||||
local light_cost = get_light_cost(get_pick_info(player))
|
||||
for item, required in pairs(light_cost) do
|
||||
if not inv[item] or inv[item] < required then
|
||||
update_formspec(player, "light")
|
||||
return true
|
||||
end
|
||||
end
|
||||
for item, required in pairs(light_cost) do
|
||||
inv[item] = inv[item] - required
|
||||
end
|
||||
|
||||
local light = hud_inv:get_stack("main", INV_LIGHT_INDEX)
|
||||
light:add_item(ItemStack("score:light"))
|
||||
hud_inv:set_stack("main", INV_LIGHT_INDEX, light)
|
||||
|
||||
update_formspec(player)
|
||||
return true
|
||||
end
|
||||
|
||||
if fields["quit"] then
|
||||
update_formspec(player)
|
||||
end
|
||||
end)
|
||||
|
||||
local hud_ids = {
|
||||
--[[
|
||||
playername = id,
|
||||
]]
|
||||
}
|
||||
|
||||
local function show_status_message(player, message)
|
||||
local id = hud_ids[player:get_player_name()]
|
||||
local previous = player:hud_get(id).text
|
||||
if previous ~= "" then
|
||||
player:hud_change(id, "text", previous .. "\n" .. message)
|
||||
else
|
||||
player:hud_change(id, "text", message)
|
||||
end
|
||||
minetest.after(5, function(player, id)
|
||||
local previous = player:hud_get(id).text
|
||||
local pos = previous:find("\n")
|
||||
if pos then
|
||||
player:hud_change(id, "text", previous:sub(pos + 1))
|
||||
else
|
||||
player:hud_change(id, "text", "")
|
||||
end
|
||||
end, player, id)
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
player:set_properties({ textures = {} })
|
||||
player:set_sky("0x000000", "plain", {})
|
||||
player:hud_set_hotbar_itemcount(INV_SIZE)
|
||||
hud_ids[player:get_player_name()] = player:hud_add({
|
||||
hud_elem_type = "text",
|
||||
position = { x = 1.0, y = 1.0 },
|
||||
text = "",
|
||||
number = "0xFFFFFF",
|
||||
offset = { x = -10, y = -10 },
|
||||
alignment = { x = -1, y = -1 },
|
||||
})
|
||||
|
||||
local hud_inv = player:get_inventory()
|
||||
hud_inv:set_size("main", INV_SIZE)
|
||||
if not hud_inv:get_stack("main", INV_PICK_INDEX):get_name():match("^score:pick_") or
|
||||
hud_inv:get_stack("main", INV_LIGHT_INDEX):get_name() ~= "score:light" then
|
||||
hud_inv:set_stack("main", INV_PICK_INDEX, ItemStack(get_pick_name(1, 1)))
|
||||
hud_inv:set_stack("main", INV_LIGHT_INDEX, ItemStack("score:light 10"))
|
||||
end
|
||||
|
||||
local inv = inventories[player:get_player_name()]
|
||||
if not inv then
|
||||
inventories[player:get_player_name()] = {
|
||||
["score:score"] = 0
|
||||
}
|
||||
end
|
||||
|
||||
update_formspec(player)
|
||||
end)
|
||||
|
||||
minetest.handle_node_drops = function(pos, drops, player)
|
||||
for _, dropped_item in ipairs(drops) do
|
||||
dropped_item = ItemStack(dropped_item)
|
||||
local item_name = dropped_item:get_name()
|
||||
if item_name == "score:light" then
|
||||
local hud_inv = player:get_inventory()
|
||||
local light = hud_inv:get_stack("main", INV_LIGHT_INDEX)
|
||||
light:add_item(dropped_item)
|
||||
hud_inv:set_stack("main", INV_LIGHT_INDEX, light)
|
||||
else
|
||||
local inv = inventories[player:get_player_name()]
|
||||
if not inv[item_name] then
|
||||
inv[item_name] = dropped_item:get_count()
|
||||
else
|
||||
inv[item_name] = inv[item_name] + dropped_item:get_count()
|
||||
end
|
||||
local status_message = "Mined " .. dropped_item:get_count() .. " "
|
||||
.. dropped_item:get_definition().description .. " (total: "
|
||||
.. inv[item_name] .. ")"
|
||||
show_status_message(player, status_message)
|
||||
end
|
||||
end
|
||||
update_formspec(player)
|
||||
end
|
||||
|
||||
local save_interval = tonumber(minetest.setting_get("server_map_save_interval")) or 5.3
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer > save_interval then
|
||||
timer = 0
|
||||
save_inventories()
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
load_inventories()
|
||||
minetest.setting_set("static_spawnpoint", "1,-80,0")
|
||||
minetest.setting_set("enable_damage", "false")
|
||||
|
||||
--
|
||||
-- Content
|
||||
--
|
||||
|
||||
local LEVEL_EXTENT = 300
|
||||
local LEVEL_MAX = 100
|
||||
for level = 1, LEVEL_MAX do
|
||||
|
||||
local image
|
||||
if level % 2 == 1 then
|
||||
image = 1
|
||||
else
|
||||
image = 2
|
||||
end
|
||||
local image = (level - 1) % 2 + 1
|
||||
|
||||
minetest.register_node("score:stone_" .. level, {
|
||||
description = "Stone Level " .. level,
|
||||
|
@ -29,7 +395,7 @@ for level = 1, LEVEL_MAX do
|
|||
minetest.register_node("score:iron_" .. level, {
|
||||
description = "Iron Level " .. level,
|
||||
tiles = { "score_stone_" .. image .. ".png^score_iron.png" },
|
||||
groups = { stone = level + 1 },
|
||||
groups = { stone = level },
|
||||
light_source = 1,
|
||||
sounds = {
|
||||
footstep = { name = "score_footstep", gain = 1.0 },
|
||||
|
@ -50,7 +416,7 @@ for level = 1, LEVEL_MAX do
|
|||
minetest.register_node("score:coal_" .. level, {
|
||||
description = "Coal Level " .. level,
|
||||
tiles = { "score_stone_" .. image .. ".png^score_coal.png" },
|
||||
groups = { stone = level + 1 },
|
||||
groups = { stone = level },
|
||||
light_source = 1,
|
||||
sounds = {
|
||||
footstep = { name = "score_footstep", gain = 1.0 },
|
||||
|
@ -89,25 +455,27 @@ for level = 1, LEVEL_MAX do
|
|||
clust_size = 1,
|
||||
})
|
||||
|
||||
local pick_capabilities = {
|
||||
groupcaps = {
|
||||
stone = { times = {}, uses = 0 },
|
||||
},
|
||||
}
|
||||
for speed = 1, SPEED_MAX do
|
||||
local pick_capabilities = {
|
||||
groupcaps = {
|
||||
stone = { times = {}, uses = 0 },
|
||||
},
|
||||
}
|
||||
|
||||
for i = 1, level do
|
||||
pick_capabilities.groupcaps.stone.times[i] = math.max(0.6 ^ (level - i), 0.2)
|
||||
for i = 1, level do
|
||||
pick_capabilities.groupcaps.stone.times[i] = math.max(1.1 - (0.1 * speed) * 0.8 ^ (level - i), 0.2)
|
||||
end
|
||||
pick_capabilities.groupcaps.stone.times[level + 1] = 1.5 - (0.1 * speed)
|
||||
|
||||
minetest.register_tool(get_pick_name(level, speed), {
|
||||
description = "Pick Level " .. level,
|
||||
inventory_image = "score_pick_" .. image .. ".png",
|
||||
tool_capabilities = pick_capabilities,
|
||||
on_drop = function(itemstack, dropper, pos)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
end
|
||||
pick_capabilities.groupcaps.stone.times[level + 1] = 1.0
|
||||
|
||||
minetest.register_tool("score:pick_" .. level, {
|
||||
description = "Pick Level " .. level,
|
||||
inventory_image = "score_pick_" .. image .. ".png",
|
||||
tool_capabilities = pick_capabilities,
|
||||
on_drop = function(itemstack, dropper, pos)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
|
@ -137,268 +505,6 @@ minetest.register_tool(":", {
|
|||
range = 4,
|
||||
})
|
||||
|
||||
--
|
||||
-- Player
|
||||
--
|
||||
|
||||
local INV_PICK_INDEX = 1
|
||||
local INV_LIGHT_INDEX = 2
|
||||
local INV_SIZE = 2
|
||||
|
||||
local inventories = {
|
||||
--[[
|
||||
playername = {
|
||||
itemname = count,
|
||||
},
|
||||
]]
|
||||
}
|
||||
|
||||
local function save_inventories()
|
||||
local file = io.open(minetest.get_worldpath() .. "/score_inventory", "w")
|
||||
if not file then
|
||||
minetest.log("error", "Can't save inventories")
|
||||
return
|
||||
end
|
||||
file:write(minetest.serialize(inventories))
|
||||
file:close()
|
||||
end
|
||||
|
||||
local function load_inventories()
|
||||
local file = io.open(minetest.get_worldpath() .. "/score_inventory", "r")
|
||||
if not file then
|
||||
minetest.log("error", "Can't load inventories")
|
||||
return
|
||||
end
|
||||
inventories = minetest.deserialize(file:read("*all"))
|
||||
file:close()
|
||||
end
|
||||
|
||||
local function get_level(player)
|
||||
local hud_inv = player:get_inventory()
|
||||
local pick = hud_inv:get_stack("main", INV_PICK_INDEX)
|
||||
local current_level = math.min(tonumber(pick:get_name():match("^score:pick_([%d]+)$")) or 1, LEVEL_MAX)
|
||||
return current_level
|
||||
end
|
||||
|
||||
local function get_pick_cost(level)
|
||||
local cost = {}
|
||||
cost["score:iron_" .. level] = math.ceil(45 * 1.1 ^ (level - 1))
|
||||
return cost
|
||||
end
|
||||
|
||||
local function get_light_cost(level)
|
||||
local cost = {}
|
||||
for i = level - 1, level do
|
||||
if i > 0 then
|
||||
cost["score:coal_" .. i] = math.ceil((50 + 5 * level) * 1.5 ^ (level - i))
|
||||
end
|
||||
end
|
||||
return cost
|
||||
end
|
||||
|
||||
local function update_formspec(player, not_enough_resources)
|
||||
local inv = inventories[player:get_player_name()]
|
||||
local hud_inv = player:get_inventory()
|
||||
|
||||
local formspec = "size[5,7]"
|
||||
formspec = formspec .. "tableoptions[background=#00000000;border=false;highlight=#00000000]"
|
||||
formspec = formspec .. "tablecolumns[text;text]"
|
||||
formspec = formspec .. "table[0,0;5,5;;"
|
||||
|
||||
local pick = hud_inv:get_stack("main", INV_PICK_INDEX)
|
||||
local light = hud_inv:get_stack("main", INV_LIGHT_INDEX)
|
||||
formspec = formspec .. pick:get_definition().description .. ",1,"
|
||||
formspec = formspec .. light:get_definition().description .. "," .. light:get_count() .. ","
|
||||
|
||||
local lines = {}
|
||||
for itemname,count in pairs(inv) do
|
||||
table.insert(lines, {
|
||||
minetest.formspec_escape(minetest.registered_items[itemname].description),
|
||||
count,
|
||||
})
|
||||
end
|
||||
|
||||
table.sort(lines, function(a, b)
|
||||
if b[1] == "Score" then
|
||||
return false
|
||||
end
|
||||
if a[1] == "Score" then
|
||||
return true
|
||||
end
|
||||
local a_level = tonumber(a[1]:match(".* Level ([%d]+)$"))
|
||||
local b_level = tonumber(b[1]:match(".* Level ([%d]+)$"))
|
||||
if not a_level or not b_level or a_level == b_level then
|
||||
return a[1] < b[1]
|
||||
end
|
||||
return a_level > b_level
|
||||
end)
|
||||
|
||||
for _,line in ipairs(lines) do
|
||||
formspec = formspec .. line[1] .. "," .. line[2] .. ","
|
||||
end
|
||||
|
||||
-- remove trailing comma
|
||||
if formspec:match(",$") then
|
||||
formspec = formspec:sub(1, -2)
|
||||
end
|
||||
|
||||
formspec = formspec .. ";0]"
|
||||
|
||||
formspec = formspec .. "button[0,5;2,1;btn_upgrade;Upgrade Pick]"
|
||||
formspec = formspec .. "tableoptions[background=#00000000;border=false;highlight=#00000000]"
|
||||
formspec = formspec .. "tablecolumns[color;text;text]"
|
||||
if not_enough_resources == "pick" then
|
||||
formspec = formspec .. "table[2,5;3,1;;#FF0000,Requires:,,"
|
||||
else
|
||||
formspec = formspec .. "table[2,5;3,1;;,Requires:,,"
|
||||
end
|
||||
local pick_cost = get_pick_cost(get_level(player))
|
||||
for item, required in pairs(pick_cost) do
|
||||
local name = minetest.registered_items[item].description
|
||||
formspec = formspec .. "," .. name .. "," .. required .. ","
|
||||
end
|
||||
-- remove trailing comma
|
||||
if formspec:match(",$") then
|
||||
formspec = formspec:sub(1, -2)
|
||||
end
|
||||
formspec = formspec .. ";0]"
|
||||
|
||||
formspec = formspec .. "button[0,6;2,1;btn_light;Craft Light]"
|
||||
formspec = formspec .. "tableoptions[background=#00000000;border=false;highlight=#00000000]"
|
||||
formspec = formspec .. "tablecolumns[color;text;text]"
|
||||
if not_enough_resources == "light" then
|
||||
formspec = formspec .. "table[2,6;3,1;;#FF0000,Requires:,,"
|
||||
else
|
||||
formspec = formspec .. "table[2,6;3,1;;,Requires:,,"
|
||||
end
|
||||
local light_cost = get_light_cost(get_level(player))
|
||||
for item, required in pairs(light_cost) do
|
||||
local name = minetest.registered_items[item].description
|
||||
formspec = formspec .. "," .. name .. "," .. required .. ","
|
||||
end
|
||||
-- remove trailing comma
|
||||
if formspec:match(",$") then
|
||||
formspec = formspec:sub(1, -2)
|
||||
end
|
||||
formspec = formspec .. ";0]"
|
||||
|
||||
if formspec ~= player:get_inventory_formspec() then
|
||||
player:set_inventory_formspec(formspec)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if fields["btn_upgrade"] then
|
||||
local inv = inventories[player:get_player_name()]
|
||||
local hud_inv = player:get_inventory()
|
||||
|
||||
local current_level = get_level(player)
|
||||
|
||||
local pick_cost = get_pick_cost(current_level)
|
||||
for item, required in pairs(pick_cost) do
|
||||
if not inv[item] or inv[item] < required then
|
||||
update_formspec(player, "pick")
|
||||
return true
|
||||
end
|
||||
end
|
||||
for item, required in pairs(pick_cost) do
|
||||
inv[item] = inv[item] - required
|
||||
end
|
||||
|
||||
hud_inv:set_stack("main", INV_PICK_INDEX, ItemStack("score:pick_" .. (current_level + 1)))
|
||||
|
||||
update_formspec(player)
|
||||
return true
|
||||
end
|
||||
|
||||
if fields["btn_light"] then
|
||||
local inv = inventories[player:get_player_name()]
|
||||
local hud_inv = player:get_inventory()
|
||||
|
||||
local current_level = get_level(player)
|
||||
local light_cost = get_light_cost(current_level)
|
||||
for item, required in pairs(light_cost) do
|
||||
if not inv[item] or inv[item] < required then
|
||||
update_formspec(player, "light")
|
||||
return true
|
||||
end
|
||||
end
|
||||
for item, required in pairs(light_cost) do
|
||||
inv[item] = inv[item] - required
|
||||
end
|
||||
|
||||
local light = hud_inv:get_stack("main", INV_LIGHT_INDEX)
|
||||
light:add_item(ItemStack("score:light"))
|
||||
hud_inv:set_stack("main", INV_LIGHT_INDEX, light)
|
||||
|
||||
update_formspec(player)
|
||||
return true
|
||||
end
|
||||
|
||||
if fields["quit"] then
|
||||
update_formspec(player)
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
player:set_properties({ textures = {} })
|
||||
player:set_sky("0x000000", "plain", {})
|
||||
player:hud_set_hotbar_itemcount(INV_SIZE)
|
||||
|
||||
local hud_inv = player:get_inventory()
|
||||
hud_inv:set_size("main", INV_SIZE)
|
||||
if not hud_inv:get_stack("main", INV_PICK_INDEX):get_name():match("^score:pick_") or
|
||||
hud_inv:get_stack("main", INV_LIGHT_INDEX):get_name() ~= "score:light" then
|
||||
hud_inv:set_stack("main", INV_PICK_INDEX, ItemStack("score:pick_1"))
|
||||
hud_inv:set_stack("main", INV_LIGHT_INDEX, ItemStack("score:light 10"))
|
||||
end
|
||||
|
||||
local inv = inventories[player:get_player_name()]
|
||||
if not inv then
|
||||
inventories[player:get_player_name()] = {
|
||||
["score:score"] = 0
|
||||
}
|
||||
end
|
||||
|
||||
update_formspec(player)
|
||||
end)
|
||||
|
||||
minetest.handle_node_drops = function(pos, drops, player)
|
||||
for _, dropped_item in ipairs(drops) do
|
||||
dropped_item = ItemStack(dropped_item)
|
||||
local item_name = dropped_item:get_name()
|
||||
if item_name == "score:light" then
|
||||
local hud_inv = player:get_inventory()
|
||||
local light = hud_inv:get_stack("main", INV_LIGHT_INDEX)
|
||||
light:add_item(dropped_item)
|
||||
hud_inv:set_stack("main", INV_LIGHT_INDEX, light)
|
||||
else
|
||||
local inv = inventories[player:get_player_name()]
|
||||
if not inv[item_name] then
|
||||
inv[item_name] = dropped_item:get_count()
|
||||
else
|
||||
inv[item_name] = inv[item_name] + dropped_item:get_count()
|
||||
end
|
||||
end
|
||||
end
|
||||
update_formspec(player)
|
||||
end
|
||||
|
||||
local save_interval = tonumber(minetest.setting_get("server_map_save_interval")) or 5.3
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer > save_interval then
|
||||
timer = 0
|
||||
save_inventories()
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
load_inventories()
|
||||
minetest.setting_set("static_spawnpoint", "1,-80,0")
|
||||
minetest.setting_set("enable_damage", "false")
|
||||
|
||||
--
|
||||
-- Mapgen
|
||||
--
|
||||
|
|
Loading…
Reference in New Issue