Experience: release

master
MoNTE48 2019-07-15 02:50:18 +02:00
parent 41de61907a
commit a86e883834
17 changed files with 214 additions and 161 deletions

View File

@ -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

View File

@ -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, ...)

View File

@ -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")
}

View File

@ -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", {

View File

@ -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)

View File

@ -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},
})

View File

@ -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})

View File

@ -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"
},

View File

@ -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 = {

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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 {

View File

@ -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,

View File

@ -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

View File

@ -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,

View File

@ -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