Experience: release
parent
41de61907a
commit
a86e883834
|
@ -152,7 +152,7 @@ core.builtin_auth_handler = {
|
|||
core.notify_authentication_modified(name)
|
||||
end,
|
||||
reload = function()
|
||||
core.log("action", "[AUTH] Writing authentication data to disk")
|
||||
core.log("action", "[AUTH] Reading authentication data from disk")
|
||||
read_auth_file()
|
||||
return true
|
||||
end,
|
||||
|
@ -231,6 +231,5 @@ if not core.is_singleplayer() then
|
|||
core.auth_commit()
|
||||
core.after(save_interval, auto_save)
|
||||
end
|
||||
|
||||
core.after(save_interval, auto_save)
|
||||
end
|
||||
|
|
|
@ -389,6 +389,16 @@ function core.override_item(name, redefinition)
|
|||
end
|
||||
|
||||
|
||||
function core.add_group(name, adding)
|
||||
local addgroup = {}
|
||||
addgroup = table.copy(core.registered_items[name].groups)
|
||||
for k, v in pairs(adding) do
|
||||
addgroup[k] = v
|
||||
end
|
||||
core.override_item(name, {groups = addgroup})
|
||||
end
|
||||
|
||||
|
||||
core.callback_origins = {}
|
||||
|
||||
function core.run_callbacks(callbacks, mode, ...)
|
||||
|
|
|
@ -250,7 +250,7 @@ function carts:get_rail_groups(additional_groups)
|
|||
-- Get the default rail groups and add more when a table is given
|
||||
local groups = {
|
||||
dig_immediate = 2,
|
||||
attached_node = 1,
|
||||
falling_node = 1,
|
||||
rail = 1,
|
||||
connect_to_raillike = minetest.raillike_group("rail")
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ minetest.register_node("default:obsidian", {
|
|||
description = "Obsidian",
|
||||
tiles = {"default_obsidian.png"},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
groups = {cracky = 4, level = 2, oddly_breakable_by_hand = 3},
|
||||
groups = {cracky = 3, level = 2, oddly_breakable_by_hand = 3},
|
||||
})
|
||||
|
||||
minetest.register_node("default:bedrock", {
|
||||
|
|
|
@ -3,7 +3,7 @@ experience = {}
|
|||
local modname = minetest.get_current_modname()
|
||||
local modpath = minetest.get_modpath(modname)
|
||||
|
||||
dofile(modpath .. "/override.lua")
|
||||
dofile(modpath .. "/xp.lua")
|
||||
|
||||
local MAX_LEVEL = 40
|
||||
local MAX_HUD_XP = 32
|
||||
|
@ -15,7 +15,6 @@ local ORB_COLLECT_RADIUS = 3
|
|||
local xp, _hud = {}, {}
|
||||
|
||||
local get_objs_rad = minetest.get_objects_inside_radius
|
||||
local get_players = minetest.get_connected_players
|
||||
|
||||
local vec_new, vec_dist, vec_mul, vec_sub =
|
||||
vector.new, vector.distance, vector.multiply, vector.subtract
|
||||
|
@ -26,37 +25,37 @@ local function init_data(player, reset)
|
|||
|
||||
if not _xp or reset then
|
||||
xp[name] = {
|
||||
xp_bar = 0,
|
||||
xp_total = 0,
|
||||
xp_number = 0,
|
||||
level = 0,
|
||||
xp_bar = 0,
|
||||
level = 0,
|
||||
}
|
||||
else
|
||||
xp[name] = _xp
|
||||
end
|
||||
end
|
||||
|
||||
hud.register("xp_bar", {
|
||||
hud_elem_type = "statbar",
|
||||
position = {x = 0.5, y = 1},
|
||||
alignment = {x = -1, y = -1},
|
||||
offset = {x = -246, y = -79},
|
||||
size = {x = 31, y = 14},
|
||||
text = "expbar_full.png",
|
||||
background = "expbar_empty.png",
|
||||
number = 0,
|
||||
max = MAX_HUD_XP,
|
||||
})
|
||||
if minetest.settings:get_bool("enable_damage") then
|
||||
hud.register("xp_bar", {
|
||||
hud_elem_type = "statbar",
|
||||
position = {x = 0.5, y = 1},
|
||||
alignment = {x = -1, y = -1},
|
||||
offset = {x = -256, y = -78},
|
||||
size = {x = 31, y = 14},
|
||||
text = "expbar_full.png",
|
||||
background = "expbar_empty.png",
|
||||
number = 0,
|
||||
max = MAX_HUD_XP,
|
||||
})
|
||||
|
||||
-- level number
|
||||
hud.register("lvl", {
|
||||
hud_elem_type = "text",
|
||||
position = {x = 0.5, y = 0.966},
|
||||
alignment = {x = 0, y = -1},
|
||||
offset = {x = 0, y = -15},
|
||||
number = 0x3cff00,
|
||||
text = "",
|
||||
})
|
||||
-- level number
|
||||
hud.register("lvl", {
|
||||
hud_elem_type = "text",
|
||||
position = {x = 0.5, y = 1},
|
||||
alignment = {x = 0, y = -10},
|
||||
offset = {x = 188, y = 56},
|
||||
number = 0x3cff00,
|
||||
text = "0",
|
||||
})
|
||||
end
|
||||
|
||||
--[[minetest.register_on_joinplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
|
@ -85,87 +84,87 @@ function experience.add_orb(amount, pos)
|
|||
end
|
||||
end
|
||||
|
||||
function experience.get_level(name)
|
||||
return xp[name].level
|
||||
end
|
||||
if minetest.settings:get_bool("enable_damage") then
|
||||
minetest.register_on_dignode(function(pos, oldnode, digger)
|
||||
local name = oldnode.name
|
||||
local xp_min = minetest.get_item_group(name, "xp_min")
|
||||
local xp_max = minetest.get_item_group(name, "xp_max")
|
||||
|
||||
minetest.register_on_dignode(function(pos, oldnode, digger)
|
||||
local name = oldnode.name
|
||||
local xp_min = minetest.get_item_group(name, "xp_min")
|
||||
local xp_max = minetest.get_item_group(name, "xp_max")
|
||||
if xp_min and xp_max and xp_max > 0 then
|
||||
experience.add_orb(math.random(xp_min, xp_max), pos)
|
||||
end
|
||||
end)
|
||||
|
||||
if xp_min and xp_max and xp_max > 0 then
|
||||
experience.add_orb(math.random(xp_min, xp_max), pos)
|
||||
end
|
||||
end)
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
init_data(player)
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
init_data(player)
|
||||
end)
|
||||
minetest.register_on_newplayer(function(player)
|
||||
init_data(player)
|
||||
end)
|
||||
|
||||
minetest.register_on_newplayer(function(player)
|
||||
init_data(player)
|
||||
end)
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
init_data(player, true)
|
||||
end)
|
||||
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
init_data(player, true)
|
||||
end)
|
||||
minetest.register_playerstep(function(dtime, playernames)
|
||||
for i = 1, #playernames do
|
||||
local name = playernames[i]
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local pos = player:get_pos()
|
||||
|
||||
minetest.register_playerstep(function(dtime, playernames)
|
||||
for i = 1, #playernames do
|
||||
local name = playernames[i]
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local pos = player:get_pos()
|
||||
pos.y = pos.y + 0.5
|
||||
xp[name].timer = (xp[name].timer or 0) + dtime
|
||||
|
||||
pos.y = pos.y + 0.5
|
||||
xp[name].timer = (xp[name].timer or 0) + dtime
|
||||
for _, obj in ipairs(get_objs_rad(pos, ORB_COLLECT_RADIUS)) do
|
||||
local ent = obj:get_luaentity()
|
||||
if not obj:is_player() and ent and ent.name == "experience:orb" then
|
||||
local orb_pos = obj:get_pos()
|
||||
|
||||
for _, obj in ipairs(get_objs_rad(pos, ORB_COLLECT_RADIUS)) do
|
||||
local ent = obj:get_luaentity()
|
||||
if not obj:is_player() and ent and ent.name == "experience:orb" then
|
||||
local orb_pos = obj:get_pos()
|
||||
if vec_dist(pos, orb_pos) <= 1 then
|
||||
if xp[name].timer >= ((xp[name].last_sound or 0) + ORB_SOUND_INTERVAL) then
|
||||
minetest.sound_play("orb", {to_player = name})
|
||||
xp[name].last_sound = xp[name].timer
|
||||
end
|
||||
|
||||
if vec_dist(pos, orb_pos) <= 1 then
|
||||
if xp[name].timer >= ((xp[name].last_sound or 0) + ORB_SOUND_INTERVAL) then
|
||||
minetest.sound_play("orb", {to_player = name})
|
||||
xp[name].last_sound = xp[name].timer
|
||||
local inc = 2 * xp[name].level + 7
|
||||
|
||||
if xp[name].level >= 16 then
|
||||
inc = 5 * xp[name].level - 38
|
||||
elseif xp[name].level >= 31 then
|
||||
inc = 9 * xp[name].level - 158
|
||||
end
|
||||
|
||||
xp[name].xp_bar = xp[name].xp_bar + (MAX_HUD_XP / inc)
|
||||
obj:remove()
|
||||
else
|
||||
pos.y = pos.y + 0.2
|
||||
local vec = vec_mul(vec_sub(pos, orb_pos), 3)
|
||||
obj:set_velocity(vec)
|
||||
end
|
||||
|
||||
local inc = 2 * xp[name].level + 7
|
||||
|
||||
if xp[name].level >= 16 then
|
||||
inc = 5 * xp[name].level - 38
|
||||
elseif xp[name].level >= 31 then
|
||||
inc = 9 * xp[name].level - 158
|
||||
end
|
||||
|
||||
xp[name].xp_bar = xp[name].xp_bar + (MAX_HUD_XP / inc)
|
||||
obj:remove()
|
||||
else
|
||||
pos.y = pos.y + 0.2
|
||||
local vec = vec_mul(vec_sub(pos, orb_pos), 3)
|
||||
obj:set_velocity(vec)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if xp[name].xp_bar >= MAX_HUD_XP then
|
||||
if xp[name].level < MAX_LEVEL then
|
||||
xp[name].level = xp[name].level + 1
|
||||
xp[name].xp_bar = xp[name].xp_bar - MAX_HUD_XP
|
||||
else
|
||||
xp[name].xp_bar = MAX_HUD_XP
|
||||
if xp[name].xp_bar >= MAX_HUD_XP then
|
||||
if xp[name].level < MAX_LEVEL then
|
||||
xp[name].level = xp[name].level + 1
|
||||
xp[name].xp_bar = xp[name].xp_bar - MAX_HUD_XP
|
||||
else
|
||||
xp[name].xp_bar = MAX_HUD_XP
|
||||
end
|
||||
end
|
||||
|
||||
hud.change_item(player, "xp_bar", {number = xp[name].xp_bar})
|
||||
hud.change_item(player, "lvl", {text = xp[name].level})
|
||||
|
||||
player:set_attribute("xp", minetest.serialize(xp[name]))
|
||||
|
||||
--[[ player:hud_change(_hud[name].lvl, "text", xp[name].level)
|
||||
player:hud_change(_hud[name].lvl, "offset",
|
||||
{x = (xp[name].level >= 10 and 13 or 6), y = -202}) ]]
|
||||
end
|
||||
|
||||
hud.change_item(player, "xp_bar", {number = xp[name].xp_bar})
|
||||
|
||||
-- player:hud_change(_hud[name].lvl, "text", xp[name].level)
|
||||
hud.change_item(player, "lvl", {text = xp[name].level})
|
||||
-- player:hud_change(_hud[name].lvl, "offset",
|
||||
-- {x = (xp[name].level >= 10 and 13 or 6), y = -202})
|
||||
end
|
||||
end, minetest.is_singleplayer()) -- Force step in singlplayer mode only
|
||||
end, minetest.is_singleplayer()) -- Force step in singlplayer mode only
|
||||
end
|
||||
|
||||
minetest.register_entity("experience:orb", {
|
||||
timer = 0,
|
||||
|
@ -204,13 +203,3 @@ minetest.register_entity("experience:orb", {
|
|||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_on_shutdown(function()
|
||||
local players = get_players()
|
||||
for i = 1, #players do
|
||||
local player = players[i]
|
||||
local name = player:get_player_name()
|
||||
|
||||
player:set_attribute("xp", minetest.serialize(xp[name]))
|
||||
end
|
||||
end)
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
minetest.override_item("default:stone_with_coal", {
|
||||
groups = {cracky = 3, xp_min = 0, xp_max = 2},
|
||||
})
|
||||
|
||||
minetest.override_item("default:wood", {
|
||||
groups = {dig_immediate = 3, xp_min = 4, xp_max = 6, flammable = 2, wood = 1},
|
||||
})
|
|
@ -0,0 +1,13 @@
|
|||
--
|
||||
-- Experience nodes
|
||||
--
|
||||
|
||||
--minetest.add_group("default:clay", {xp_min = 1, xp_max = 2}) -- craft recipe
|
||||
minetest.add_group("default:stone_with_coal", {xp_min = 1, xp_max = 3})
|
||||
--minetest.add_group("default:stone_with_iron", {xp_min = 2, xp_max = 4})
|
||||
minetest.add_group("default:stone_with_lapis", {xp_min = 3, xp_max = 5})
|
||||
--minetest.add_group("default:glowstone", {xp_min = 3, xp_max = 5})
|
||||
--minetest.add_group("default:stone_with_gold", {xp_min = 4, xp_max = 6})
|
||||
minetest.add_group("default:stone_with_bluestone", {xp_min = 5, xp_max = 7})
|
||||
minetest.add_group("default:stone_with_diamond", {xp_min = 6, xp_max = 8})
|
||||
minetest.add_group("default:stone_with_emerald", {xp_min = 7, xp_max = 9})
|
|
@ -32,14 +32,19 @@ mobs:register_mob("mobs_animal:bear", {
|
|||
hp_max = 15,
|
||||
fall_damage = 3,
|
||||
fear_height = 4,
|
||||
drops = {
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:leather"},
|
||||
{name = "mobs:leather", chance = 2}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(4, 6), pos)
|
||||
end
|
||||
return {
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:leather"},
|
||||
{name = "mobs:leather", chance = 2}
|
||||
}
|
||||
end,
|
||||
replace_what = {
|
||||
"farming:blueberry_4", "farming:raspberry_4"
|
||||
},
|
||||
|
|
|
@ -17,10 +17,15 @@ mobs:register_mob("mobs_animal:bunny", {
|
|||
runaway = true,
|
||||
runaway_from = {"mobs_animal:pumba", "player"},
|
||||
jump_height = 5,
|
||||
drops = {
|
||||
{name = "mobs:rabbit_raw"},
|
||||
{name = "mobs:rabbit_hide", min = 0, max = 1},
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(1, 2), pos)
|
||||
end
|
||||
return {
|
||||
{name = "mobs:rabbit_raw"},
|
||||
{name = "mobs:rabbit_hide", min = 0, max = 1}
|
||||
}
|
||||
end,
|
||||
water_damage = 1,
|
||||
fear_height = 2,
|
||||
animation = {
|
||||
|
|
|
@ -13,9 +13,14 @@ mobs:register_mob("mobs_animal:chicken", {
|
|||
},
|
||||
run_velocity = 3,
|
||||
runaway = true,
|
||||
drops = {
|
||||
{name = "mobs:chicken_raw"}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(2, 3), pos)
|
||||
end
|
||||
return {
|
||||
{name = "mobs:chicken_raw"}
|
||||
}
|
||||
end,
|
||||
fall_damage = 0,
|
||||
fall_speed = -8,
|
||||
fear_height = 5,
|
||||
|
|
|
@ -17,13 +17,18 @@ mobs:register_mob("mobs_animal:cow", {
|
|||
attack = "mobs_cow",
|
||||
},
|
||||
run_velocity = 3,
|
||||
drops = {
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:leather", chance = 2},
|
||||
{name = "mobs:leather", chance = 2}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(3, 5), pos)
|
||||
end
|
||||
return {
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "mobs:leather", chance = 2},
|
||||
{name = "mobs:leather", chance = 2}
|
||||
}
|
||||
end,
|
||||
animation = {
|
||||
speed_normal = 15,
|
||||
speed_run = 15,
|
||||
|
|
|
@ -22,9 +22,14 @@ mobs:register_mob("mobs_animal:kitten", {
|
|||
run_velocity = 2,
|
||||
runaway = true,
|
||||
jump_height = 5,
|
||||
drops = {
|
||||
{name = "farming:string"}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(1, 2), pos)
|
||||
end
|
||||
return {
|
||||
{name = "farming:string"}
|
||||
}
|
||||
end,
|
||||
water_damage = 1,
|
||||
fall_damage = 2,
|
||||
fear_height = 3,
|
||||
|
|
|
@ -20,8 +20,7 @@ mobs:register_mob("mobs_animal:pig", {
|
|||
follow = {"default:apple", "farming:potato"},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
--experience.add_orb(math.random(1,3), pos) -- random amount between 1 and 3
|
||||
experience.add_orb(3, pos)
|
||||
experience.add_orb(math.random(1,3), pos) -- random amount between 1 and 3
|
||||
end
|
||||
|
||||
return {
|
||||
|
|
|
@ -22,11 +22,16 @@ for i = 1, #dyes do
|
|||
},
|
||||
runaway = true,
|
||||
jump_height = 3,
|
||||
drops = {
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "wool:" .. name}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(2, 4), pos)
|
||||
end
|
||||
return {
|
||||
{name = "mobs:meat_raw"},
|
||||
{name = "mobs:meat_raw", chance = 2},
|
||||
{name = "wool:" .. name}
|
||||
}
|
||||
end,
|
||||
animation = {
|
||||
speed_normal = 15,
|
||||
speed_run = 15,
|
||||
|
|
|
@ -29,10 +29,15 @@ mobs:register_mob("mobs_monster:skeleton", {
|
|||
walk_velocity = 0.5,
|
||||
run_velocity = 0.5,
|
||||
jump = false,
|
||||
drops = {
|
||||
{name = "default:bone", chance = 2},
|
||||
{name = "default:bone", chance = 2}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(2, 4), pos)
|
||||
end
|
||||
return {
|
||||
{name = "default:bone", chance = 2},
|
||||
{name = "default:bone", chance = 2}
|
||||
}
|
||||
end,
|
||||
after_activate = function(self, staticdata, def, dtime)
|
||||
-- replace skeleton using the old directx model
|
||||
if self.mesh == "mobs_zombie.x" then
|
||||
|
|
|
@ -22,10 +22,15 @@ mobs:register_mob("mobs_monster:spider", {
|
|||
run_velocity = 3,
|
||||
view_range = 15,
|
||||
floats = 0,
|
||||
drops = {
|
||||
{name = "farming:string"},
|
||||
{name = "farming:string", chance = 2}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(2, 4), pos)
|
||||
end
|
||||
return {
|
||||
{name = "farming:string"},
|
||||
{name = "farming:string", chance = 2}
|
||||
}
|
||||
end,
|
||||
water_damage = 5,
|
||||
animation = {
|
||||
speed_normal = 15,
|
||||
|
@ -88,9 +93,14 @@ mobs:register_mob("mobs_monster:small_spider", {
|
|||
run_velocity = 3,
|
||||
view_range = 10,
|
||||
floats = 0,
|
||||
drops = {
|
||||
{name = "farming:string"}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(1, 2), pos)
|
||||
end
|
||||
return {
|
||||
{name = "farming:string"}
|
||||
}
|
||||
end,
|
||||
water_damage = 5,
|
||||
animation = {
|
||||
speed_normal = 15,
|
||||
|
|
|
@ -28,11 +28,16 @@ mobs:register_mob("mobs_monster:zombie", {
|
|||
walk_velocity = 0.5,
|
||||
run_velocity = 0.5,
|
||||
jump = false,
|
||||
drops = {
|
||||
{name = "mobs_monster:rotten_flesh"},
|
||||
{name = "mobs_monster:rotten_flesh", chance = 2},
|
||||
{name = "mobs_monster:rotten_flesh", chance = 2}
|
||||
},
|
||||
drops = function(pos)
|
||||
if rawget(_G, "experience") then
|
||||
experience.add_orb(math.random(3, 5), pos)
|
||||
end
|
||||
return {
|
||||
{name = "mobs_monster:rotten_flesh"},
|
||||
{name = "mobs_monster:rotten_flesh", chance = 2},
|
||||
{name = "mobs_monster:rotten_flesh", chance = 2}
|
||||
}
|
||||
end,
|
||||
after_activate = function(self, staticdata, def, dtime)
|
||||
-- replace zombies using the old directx model
|
||||
if self.mesh == "mobs_zombie.x" then
|
||||
|
|
Loading…
Reference in New Issue