From a127136c6065a13a3125b35e5e448c5a817a365f Mon Sep 17 00:00:00 2001 From: kay27 Date: Mon, 19 Oct 2020 16:38:21 +0400 Subject: [PATCH 1/3] Add Enchanting from Crafter-minetest by Oil_boi --- mods/ENTITIES/mcl_item_entity/init.lua | 11 + mods/ENTITIES/mcl_mobs/api.lua | 4 + mods/HUD/hudbars/init.lua | 5 + mods/HUD/mcl_experience/README.md | 6 + mods/HUD/mcl_experience/init.lua | 547 ++++++++++++++++++ .../locale/mcl_experience.ru.tr | 5 + mods/HUD/mcl_experience/locale/template.txt | 5 + mods/HUD/mcl_experience/sounds/attributes.txt | 2 + mods/HUD/mcl_experience/sounds/experience.ogg | Bin 0 -> 24760 bytes mods/HUD/mcl_experience/sounds/level_up.ogg | Bin 0 -> 43940 bytes .../mcl_experience/textures/attributes.txt | 1 + .../textures/experience_bar.png | Bin 0 -> 3745 bytes .../textures/experience_bar_background.png | Bin 0 -> 2861 bytes .../textures/experience_orb.png | Bin 0 -> 891 bytes mods/ITEMS/mcl_core/nodes_base.lua | 12 +- mods/ITEMS/mcl_fishing/init.lua | 3 + mods/ITEMS/mcl_furnaces/init.lua | 5 + mods/ITEMS/mcl_nether/init.lua | 2 +- mods/ITEMS/mcl_tools/enchanting.lua | 102 ++++ mods/ITEMS/mcl_tools/init.lua | 1 + mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr | 2 + mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr | 2 + mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr | 2 + mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr | 2 + mods/ITEMS/mcl_tools/locale/template.txt | 2 + 25 files changed, 714 insertions(+), 7 deletions(-) create mode 100644 mods/HUD/mcl_experience/README.md create mode 100644 mods/HUD/mcl_experience/init.lua create mode 100644 mods/HUD/mcl_experience/locale/mcl_experience.ru.tr create mode 100644 mods/HUD/mcl_experience/locale/template.txt create mode 100644 mods/HUD/mcl_experience/sounds/attributes.txt create mode 100644 mods/HUD/mcl_experience/sounds/experience.ogg create mode 100644 mods/HUD/mcl_experience/sounds/level_up.ogg create mode 100644 mods/HUD/mcl_experience/textures/attributes.txt create mode 100644 mods/HUD/mcl_experience/textures/experience_bar.png create mode 100644 mods/HUD/mcl_experience/textures/experience_bar_background.png create mode 100644 mods/HUD/mcl_experience/textures/experience_orb.png create mode 100644 mods/ITEMS/mcl_tools/enchanting.lua diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index d7c76f1991..f971d0f35d 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -152,6 +152,11 @@ minetest.register_globalstep(function(dtime) end end + elseif not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "mcl_experience:orb" then + local entity = object:get_luaentity() + entity.collector = player:get_player_name() + entity.collected = true + end end @@ -221,6 +226,12 @@ function minetest.handle_node_drops(pos, drops, digger) local dug_node = minetest.get_node(pos) local toolcaps if digger ~= nil then + if mcl_experience.throw_experience then + local experience_amount = minetest.get_item_group(dug_node.name,"experience") + if experience_amount > 0 then + mcl_experience.throw_experience(pos, experience_amount) + end + end local tool = digger:get_wielded_item() toolcaps = tool:get_tool_capabilities() diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index ab2480f9d4..a4e87341f5 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -640,6 +640,10 @@ local check_for_death = function(self, cause, cmi_cause) local pos = self.object:get_pos() + if mcl_experience.throw_experience and self.hp_min and self.hp_max then + mcl_experience.throw_experience(pos, math.ceil( math.random(self.hp_min,self.hp_max+5) / 5) ) + end + -- execute custom death function if self.on_die then diff --git a/mods/HUD/hudbars/init.lua b/mods/HUD/hudbars/init.lua index 6ddd4a03bf..44c8266567 100644 --- a/mods/HUD/hudbars/init.lua +++ b/mods/HUD/hudbars/init.lua @@ -46,6 +46,11 @@ end -- Load default settings dofile(minetest.get_modpath("hudbars").."/default_settings.lua") +if minetest.get_modpath("mcl_experience") then + -- reserve some space for experience bar: + hb.settings.start_offset_left.y = hb.settings.start_offset_left.y - 20 + hb.settings.start_offset_right.y = hb.settings.start_offset_right.y - 20 +end local function player_exists(player) return player ~= nil and player:is_player() diff --git a/mods/HUD/mcl_experience/README.md b/mods/HUD/mcl_experience/README.md new file mode 100644 index 0000000000..2ab0e1b6f1 --- /dev/null +++ b/mods/HUD/mcl_experience/README.md @@ -0,0 +1,6 @@ +-- eXPerience mod +-- This mod has adopted from oil_boi's Crafter-minetest +-- ( https://www.patreon.com/oil_boi ) by kay27@bk.ru +-- for MineClone 2 under GNU GENERAL PUBLIC LICENSE. +-- Copyright (c) Oil_boi, Wuzzy, kay27, +-- experience_orb texture by github.com/Gerold55 diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua new file mode 100644 index 0000000000..7c291b7b86 --- /dev/null +++ b/mods/HUD/mcl_experience/init.lua @@ -0,0 +1,547 @@ +local S = minetest.get_translator("mcl_experience") +mcl_experience = {} + +local +minetest,math,vector,os,pairs,type += +minetest,math,vector,os,pairs,type + +local storage = minetest.get_mod_storage() + +local registered_nodes +minetest.register_on_mods_loaded(function() + registered_nodes = minetest.registered_nodes +end) + +local pool = {} +-- loads data from mod storage +local name +local temp_pool +local load_data = function(player) + name = player:get_player_name() + pool[name] = {} + temp_pool = pool[name] + if storage:get_int(name.."xp_save") > 0 then + temp_pool.xp_level = storage:get_int(name.."xp_level") + temp_pool.xp_bar = storage:get_int(name.."xp_bar" ) + temp_pool.last_time= minetest.get_us_time()/1000000 + else + temp_pool.xp_level = 0 + temp_pool.xp_bar = 0 + temp_pool.last_time= minetest.get_us_time()/1000000 + end +end + +-- saves data to be utilized on next login +local name +local temp_pool +local save_data = function(name) + if type(name) ~= "string" and name:is_player() then + name = name:get_player_name() + end + temp_pool = pool[name] + + storage:set_int(name.."xp_level",temp_pool.xp_level) + storage:set_int(name.."xp_bar", temp_pool.xp_bar ) + + storage:set_int(name.."xp_save",1) + + pool[name] = nil +end + +-------hud manager +local minetest = minetest + +local player_huds = {} -- the list of players hud lists (3d array) +hud_manager = {} -- hud manager class + +-- terminate the player's list on leave +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_huds[name] = nil +end) + +-- create instance of new hud +hud_manager.add_hud = function(player,hud_name,def) + local name = player:get_player_name() + local local_hud = player:hud_add({ + hud_elem_type = def.hud_elem_type, + position = def.position, + text = def.text, + number = def.number, + direction = def.direction, + size = def.size, + offset = def.offset, + }) + -- create new 3d array here + -- depends.txt is not needed + -- with it here + if not player_huds[name] then + player_huds[name] = {} + end + + player_huds[name][hud_name] = local_hud +end + +-- delete instance of hud +hud_manager.remove_hud = function(player,hud_name) + local name = player:get_player_name() + if player_huds[name] and player_huds[name][hud_name] then + player:hud_remove(player_huds[name][hud_name]) + player_huds[name][hud_name] = nil + end +end + +-- change element of hud +hud_manager.change_hud = function(data) + local name = data.player:get_player_name() + if player_huds[name] and player_huds[name][data.hud_name] then + data.player:hud_change(player_huds[name][data.hud_name], data.element, data.data) + end +end + +-- gets if hud exists +hud_manager.hud_exists = function(player,hud_name) + local name = player:get_player_name() + if player_huds[name] and player_huds[name][hud_name] then + return(true) + else + return(false) + end +end +------------------- + +-- saves specific users data for when they relog +minetest.register_on_leaveplayer(function(player) + save_data(player) +end) + +-- is used for shutdowns to save all data +local save_all = function() + for name,_ in pairs(pool) do + save_data(name) + end +end + +-- save all data to mod storage on shutdown +minetest.register_on_shutdown(function() + save_all() +end) + + +local name +function mcl_experience.get_player_xp_level(player) + name = player:get_player_name() + return(pool[name].xp_level) +end + +local name +local temp_pool +function mcl_experience.set_player_xp_level(player,level) + name = player:get_player_name() + pool[name].xp_level = level + hud_manager.change_hud({ + player = player, + hud_name = "xp_level_fg", + element = "text", + data = tostring(level) + }) + hud_manager.change_hud({ + player = player, + hud_name = "xp_level_bg", + element = "text", + data = tostring(level) + }) +end + +minetest.hud_replace_builtin("health",{ + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + text = "heart.png", + number = core.PLAYER_MAX_HP_DEFAULT, + direction = 0, + size = {x = 24, y = 24}, + offset = {x = (-10 * 24) - 25, y = -(48 + 24 + 38)}, +}) + +local name +local temp_pool +minetest.register_on_joinplayer(function(player) + + load_data(player) + + name = player:get_player_name() + temp_pool = pool[name] + + hud_manager.add_hud(player,"experience_bar_background",{ + hud_elem_type = "statbar", + position = {x=0.5, y=1}, + name = "experience bar background", + text = "experience_bar_background.png", + number = 36, + direction = 0, + offset = {x = (-8 * 28) - 29, y = -(48 + 24 + 16)}, + size = { x=28, y=28 }, + z_index = 0, + }) + + hud_manager.add_hud(player,"experience_bar",{ + hud_elem_type = "statbar", + position = {x=0.5, y=1}, + name = "experience bar", + text = "experience_bar.png", + number = temp_pool.xp_bar, + direction = 0, + offset = {x = (-8 * 28) - 29, y = -(48 + 24 + 16)}, + size = { x=28, y=28 }, + z_index = 0, + }) + + hud_manager.add_hud(player,"xp_level_bg",{ + hud_elem_type = "text", + position = {x=0.5, y=1}, + name = "xp_level_bg", + text = tostring(temp_pool.xp_level), + number = 0x000000, + offset = {x = 0, y = -(48 + 24 + 24)}, + z_index = 0, + }) + hud_manager.add_hud(player,"xp_level_fg",{ + hud_elem_type = "text", + position = {x=0.5, y=1}, + name = "xp_level_fg", + text = tostring(temp_pool.xp_level), + number = 0xFFFFFF, + offset = {x = -1, y = -(48 + 24 + 25)}, + z_index = 0, + }) +end) + + +local name +local temp_pool +local function level_up_experience(player) + name = player:get_player_name() + temp_pool = pool[name] + + temp_pool.xp_level = temp_pool.xp_level + 1 + + hud_manager.change_hud({ + player = player, + hud_name = "xp_level_fg", + element = "text", + data = tostring(temp_pool.xp_level) + }) + hud_manager.change_hud({ + player = player, + hud_name = "xp_level_bg", + element = "text", + data = tostring(temp_pool.xp_level) + }) +end + + +local name +local temp_pool +function mcl_experience.add_experience(player,experience) + name = player:get_player_name() + temp_pool = pool[name] + + temp_pool.xp_bar = temp_pool.xp_bar + experience + + if temp_pool.xp_bar > 36 then + if minetest.get_us_time()/1000000 - temp_pool.last_time > 0.04 then + minetest.sound_play("level_up",{gain=0.2,to_player = name}) + temp_pool.last_time = minetest.get_us_time()/1000000 + end + temp_pool.xp_bar = temp_pool.xp_bar - 36 + level_up_experience(player) + else + if minetest.get_us_time()/1000000 - temp_pool.last_time > 0.01 then + temp_pool.last_time = minetest.get_us_time()/1000000 + minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) + end + end + hud_manager.change_hud({ + player = player, + hud_name = "experience_bar", + element = "number", + data = temp_pool.xp_bar + }) +end + +--reset player level +local name +local temp_pool +local xp_amount +minetest.register_on_dieplayer(function(player) + name = player:get_player_name() + temp_pool = pool[name] + xp_amount = temp_pool.xp_level + + temp_pool.xp_bar = 0 + temp_pool.xp_level = 0 + + + hud_manager.change_hud({ + player = player, + hud_name = "xp_level_fg", + element = "text", + data = tostring(temp_pool.xp_level) + }) + hud_manager.change_hud({ + player = player, + hud_name = "xp_level_bg", + element = "text", + data = tostring(temp_pool.xp_level) + }) + + hud_manager.change_hud({ + player = player, + hud_name = "experience_bar", + element = "number", + data = temp_pool.xp_bar + }) + + mcl_experience.throw_experience(player:get_pos(), xp_amount) +end) + + +local name +local collector, pos, pos2 +local direction, distance, player_velocity, goal +local currentvel, acceleration, multiplier, velocity +local node, vel, def +local is_moving, is_slippery, slippery, slip_factor +local size, data +local function xp_step(self, dtime) + --if item set to be collected then only execute go to player + if self.collected == true then + if not self.collector then + self.collected = false + return + end + collector = minetest.get_player_by_name(self.collector) + if collector and collector:get_hp() > 0 and vector.distance(self.object:get_pos(),collector:get_pos()) < 5 then + self.object:set_acceleration(vector.new(0,0,0)) + self.disable_physics(self) + --get the variables + pos = self.object:get_pos() + pos2 = collector:get_pos() + + player_velocity = collector:get_player_velocity() + + pos2.y = pos2.y + 0.8 + + direction = vector.direction(pos,pos2) + distance = vector.distance(pos2,pos) + multiplier = distance + if multiplier < 1 then + multiplier = 1 + end + goal = vector.multiply(direction,multiplier) + currentvel = self.object:get_velocity() + + if distance > 1 then + multiplier = 20 - distance + velocity = vector.multiply(direction,multiplier) + goal = velocity + acceleration = vector.new(goal.x-currentvel.x,goal.y-currentvel.y,goal.z-currentvel.z) + self.object:add_velocity(vector.add(acceleration,player_velocity)) + elseif distance < 0.4 then + mcl_experience.add_experience(collector,2) + self.object:remove() + end + return + else + self.collector = nil + self.enable_physics(self) + end + end + + + self.age = self.age + dtime + if self.age > 300 then + self.object:remove() + return + end + + pos = self.object:get_pos() + + if pos then + node = minetest.get_node_or_nil({ + x = pos.x, + y = pos.y -0.25, + z = pos.z + }) + else + return + end + + -- Remove nodes in 'ignore' + if node and node.name == "ignore" then + self.object:remove() + return + end + + if not self.physical_state then + return -- Don't do anything + end + + -- Slide on slippery nodes + vel = self.object:get_velocity() + def = node and registered_nodes[node.name] + is_moving = (def and not def.walkable) or + vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0 + is_slippery = false + + if def and def.walkable then + slippery = minetest.get_item_group(node.name, "slippery") + is_slippery = slippery ~= 0 + if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then + -- Horizontal deceleration + slip_factor = 4.0 / (slippery + 4) + self.object:set_acceleration({ + x = -vel.x * slip_factor, + y = 0, + z = -vel.z * slip_factor + }) + elseif vel.y == 0 then + is_moving = false + end + end + + if self.moving_state == is_moving and self.slippery_state == is_slippery then + -- Do not update anything until the moving state changes + return + end + + self.moving_state = is_moving + self.slippery_state = is_slippery + + if is_moving then + self.object:set_acceleration({x = 0, y = -9.81, z = 0}) + else + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) + end +end + +minetest.register_entity("mcl_experience:orb", { + initial_properties = { + hp_max = 1, + physical = true, + collide_with_objects = false, + collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2}, + visual = "sprite", + visual_size = {x = 0.4, y = 0.4}, + textures = {name="experience_orb.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}, + spritediv = {x = 1, y = 14}, + initial_sprite_basepos = {x = 0, y = 0}, + is_visible = true, + pointable = false, + static_save = false, + }, + moving_state = true, + slippery_state = false, + physical_state = true, + -- Item expiry + age = 0, + -- Pushing item out of solid nodes + force_out = nil, + force_out_start = nil, + --Collection Variables + collectable = false, + try_timer = 0, + collected = false, + delete_timer = 0, + radius = 4, + + + on_activate = function(self, staticdata, dtime_s) + self.object:set_velocity(vector.new( + math.random(-2,2)*math.random(), + math.random(2,5), + math.random(-2,2)*math.random() + )) + self.object:set_armor_groups({immortal = 1}) + self.object:set_velocity({x = 0, y = 2, z = 0}) + self.object:set_acceleration({x = 0, y = -9.81, z = 0}) + size = math.random(20,36)/100 + self.object:set_properties({ + visual_size = {x = size, y = size}, + glow = 14, + }) + self.object:set_sprite({x=1,y=math.random(1,14)}, 14, 0.05, false) + end, + + enable_physics = function(self) + if not self.physical_state then + self.physical_state = true + self.object:set_properties({physical = true}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=-9.81, z=0}) + end + end, + + disable_physics = function(self) + if self.physical_state then + self.physical_state = false + self.object:set_properties({physical = false}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) + end + end, + on_step = function(self, dtime) + xp_step(self, dtime) + end, +}) + + +minetest.register_chatcommand("xp", { + params = S("[] []"), + description = S("Gives [player ] [] XP"), + privs = {server=true}, + func = function(name, params) + local player, xp = nil, 1000 + local P, i = {}, 0 + for str in string.gmatch(params, "([^ ]+)") do + i = i + 1 + P[i] = str + end + if i > 2 then + return false, S("Error: Too many parameters!") + end + if i > 0 then + xp = tonumber(P[i]) + end + if i < 2 then + player = minetest.get_player_by_name(name) + end + if i == 2 then + player = minetest.get_player_by_name(P[1]) + end + if (not xp) or (xp < 1) then + return false, S("Error: Incorrect number of XP") + end + if not player then + return false, S("Error: Player not found") + end + local pos = player:get_pos() + pos.y = pos.y + 1.2 + mcl_experience.throw_experience(pos, xp) + end, +}) + +function mcl_experience.throw_experience(pos, amount) + for i = 1,amount do + object = minetest.add_entity(pos, "mcl_experience:orb") + if object then + object:set_velocity({ + x=math.random(-2,2)*math.random(), + y=math.random(2,5), + z=math.random(-2,2)*math.random() + }) + end + end +end diff --git a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr new file mode 100644 index 0000000000..b4c6e5aace --- /dev/null +++ b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr @@ -0,0 +1,5 @@ +[] []=[<игрок>] [] +Gives [player ] [] XP=Даёт [игроку <игрок>] [] +Error: Too many parameters!=Ошибка: слишком много параметров! +Error: Incorrect number of XP=Ошибка: Неправильное число XP +Error: Player not found=Ошибка: Игрок не найден diff --git a/mods/HUD/mcl_experience/locale/template.txt b/mods/HUD/mcl_experience/locale/template.txt new file mode 100644 index 0000000000..5d2c67636c --- /dev/null +++ b/mods/HUD/mcl_experience/locale/template.txt @@ -0,0 +1,5 @@ +[] []= +Gives [player ] [] XP= +Error: Too many parameters!= +Error: Incorrect number of XP= +Error: Player not found= diff --git a/mods/HUD/mcl_experience/sounds/attributes.txt b/mods/HUD/mcl_experience/sounds/attributes.txt new file mode 100644 index 0000000000..26200b934d --- /dev/null +++ b/mods/HUD/mcl_experience/sounds/attributes.txt @@ -0,0 +1,2 @@ + +experience/level_up - https://freesound.org/people/geraldfiebig/sounds/323123/ diff --git a/mods/HUD/mcl_experience/sounds/experience.ogg b/mods/HUD/mcl_experience/sounds/experience.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ed050d739f2c1819955845fc3bae762c6bf9b02d GIT binary patch literal 24760 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 HhG6_Zw+J_c literal 0 HcmV?d00001 diff --git a/mods/HUD/mcl_experience/sounds/level_up.ogg b/mods/HUD/mcl_experience/sounds/level_up.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9f0a9754bfff0bfe0c77698cc402dee48a5c1c75 GIT binary patch literal 43940 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 literal 0 HcmV?d00001 diff --git a/mods/HUD/mcl_experience/textures/attributes.txt b/mods/HUD/mcl_experience/textures/attributes.txt new file mode 100644 index 0000000000..892455baa4 --- /dev/null +++ b/mods/HUD/mcl_experience/textures/attributes.txt @@ -0,0 +1 @@ +experience_orb - https://github.com/Gerold55/Experience-Mod/blob/master/textures/orb.png \ No newline at end of file diff --git a/mods/HUD/mcl_experience/textures/experience_bar.png b/mods/HUD/mcl_experience/textures/experience_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..d43a03d641f48a750d8971a6724f8d9f645df5ff GIT binary patch literal 3745 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 LNkvXXu0mjfx{v&= literal 0 HcmV?d00001 diff --git a/mods/HUD/mcl_experience/textures/experience_bar_background.png b/mods/HUD/mcl_experience/textures/experience_bar_background.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6b5976316c4b41eb0fe7604bc3ab4eff6b5ee3 GIT binary patch literal 2861 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 LNkvXXu0mjf3w%`< literal 0 HcmV?d00001 diff --git a/mods/HUD/mcl_experience/textures/experience_orb.png b/mods/HUD/mcl_experience/textures/experience_orb.png new file mode 100644 index 0000000000000000000000000000000000000000..4d553833cef97f17a5fc353c1ca775a4e2c51140 GIT binary patch literal 891 zcmeAS@N?(olHy`uVBq!ia0vp^{6Kt(gAGVdEt|C)NHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00kvVTq8 z4E4EalY;rw=%Vc!)80oS+60+VuFTznk1SV}SqavC!3c4v5Ndqef9 zkWTsoyY83!gJ%BEj{22Vnp*ZDN-lJ-et+oWnH%@!+}>7Py*ZEXo%qM!d)t{^YW{4E zut@OWQCbjJ_p6%oy1(VgKB>yALmLVjlwBq=asd_oOxCvA5r1U&@1utpmHuV0A34bA zoFu^b_0xQ_KFM|SizdmMe!9|<_>jT9Ly1{L=8pcS-Lq4R3-))+m$#8oc(mP}pPi@E zk>$#1`}ukge`%`U3{>{_l@Q}AXwfioIC${yZ?=ltcI!bdsrp55Bi`+1WcP?w$+e#Qd$IS(IV>=STh)3DeP|3v()_LYNwmGDU;uTPw4SV%MKPOuLgN)YV=5{U;3=V)te$A7)hgb}mv9>bB+k z4Er?D99DmyVQ>6S$#>!#zyG!ZDX+Vk4z*$4ulQ0I^w3iJzK%5&WO(Qb9`=qKyZ=pn z*q~_G(NIeXYxRQFyR)5Hji1A>cAFtD 3 then enchants_available = 3 end + local stock_name = minetest.registered_tools[stack:get_name()].name + local description = minetest.registered_tools[stack:get_name()].description + for i = 1,enchants_available do + local new_enchant = enchantment_list[math.random(1,table.getn(enchantment_list))] + local level = math.random(1,max_enchant_level) + if meta:get_int(new_enchant) == 0 then + player_level = player_level - 5 + meta:set_int(new_enchant, level) + description = description.."\n"..new_enchant:gsub("^%l", string.upper)..": "..tostring(level) + if new_enchant == "swiftness" then + for index,table in pairs(groupcaps) do + for index2,time in pairs(table.times) do + tool_caps["groupcaps"][index]["times"][index2] = time/(level+1) + end + end + end + if new_enchant == "durable" then + for index,table in pairs(groupcaps) do + tool_caps["groupcaps"][index]["uses"] = table.uses*(level+1) + end + end + + if new_enchant == "sharpness" then + for index,data in pairs(tool_caps.damage_groups) do + tool_caps.damage_groups[index] = data*(level+1) + end + end + end + end + + meta:set_string("description", S("Enchanted @1", description)) + meta:set_string("enchanted", "true") + meta:set_tool_capabilities(tool_caps) + + mcl_experience.set_player_xp_level(clicker,player_level) + + + --create truly random hex + local colorstring = "#" + for i = 1,6 do + colorstring = colorstring..hexer[math.random(1,16)] + end + stack = minetest.itemstring_with_color(stack, colorstring) + clicker:set_wielded_item(stack) + end,clicker) + end +}) + +minetest.register_craft({ + output = "mcl_tools:enchantingtable", + recipe = { + {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, + {"mcl_core:obsidian", "mcl_core:diamond", "mcl_core:obsidian"}, + {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, + }, +}) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index f88ea8fa18..f0cea989a8 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -592,3 +592,4 @@ minetest.register_tool("mcl_tools:shears", { dofile(minetest.get_modpath("mcl_tools").."/crafting.lua") dofile(minetest.get_modpath("mcl_tools").."/aliases.lua") +dofile(minetest.get_modpath("mcl_tools").."/enchanting.lua") diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr index 6c061dd00f..96bf565f72 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr @@ -30,3 +30,5 @@ Iron Sword=Eisenschwert Golden Sword=Goldschwert Diamond Sword=Diamantschwert Shears=Schere +Enchanted @1= +Enchanting Table= diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr index 40b1d709bc..da16cbd29d 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr @@ -30,3 +30,5 @@ Iron Sword=Espada de hierro Golden Sword=Espada de oro Diamond Sword=Espada de diamante Shears=Tijeras +Enchanted @1= +Enchanting Table= diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr index 02cd7f2bd6..f5fb7a9482 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr @@ -30,3 +30,5 @@ Iron Sword=Épée en Fer Golden Sword=Épée en Or Diamond Sword=Épée en Diamant Shears=Cisailles +Enchanted @1= +Enchanting Table= diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr index e82fa15ef0..4eb721d6c2 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr @@ -30,3 +30,5 @@ Iron Sword=Железный меч Golden Sword=Золотой меч Diamond Sword=Алмазный меч Shears=Ножницы +Enchanted @1=@1 зачарованный(ая) +Enchanting Table=Волшебный стол diff --git a/mods/ITEMS/mcl_tools/locale/template.txt b/mods/ITEMS/mcl_tools/locale/template.txt index ecb94105f3..e083813243 100644 --- a/mods/ITEMS/mcl_tools/locale/template.txt +++ b/mods/ITEMS/mcl_tools/locale/template.txt @@ -30,3 +30,5 @@ Iron Sword= Golden Sword= Diamond Sword= Shears= +Enchanted @1= +Enchanting Table= From 290893355b8b6b896b1335f4a3d5ab83b5b9a5ab Mon Sep 17 00:00:00 2001 From: kay27 Date: Sat, 24 Oct 2020 00:18:53 +0400 Subject: [PATCH 2/3] Implement some of https://git.minetest.land/Wuzzy/MineClone2/issues/841#issuecomment-11440 --- mods/HUD/mcl_experience/README.md | 2 +- mods/HUD/mcl_experience/init.lua | 352 +++++++++--------- .../locale/mcl_experience.ru.tr | 4 +- mods/HUD/mcl_experience/locale/template.txt | 4 +- 4 files changed, 177 insertions(+), 185 deletions(-) diff --git a/mods/HUD/mcl_experience/README.md b/mods/HUD/mcl_experience/README.md index 2ab0e1b6f1..f59eab20f6 100644 --- a/mods/HUD/mcl_experience/README.md +++ b/mods/HUD/mcl_experience/README.md @@ -1,6 +1,6 @@ -- eXPerience mod -- This mod has adopted from oil_boi's Crafter-minetest -- ( https://www.patreon.com/oil_boi ) by kay27@bk.ru --- for MineClone 2 under GNU GENERAL PUBLIC LICENSE. +-- for MineClone 2 under GNU General Public License v3.0. -- Copyright (c) Oil_boi, Wuzzy, kay27, -- experience_orb texture by github.com/Gerold55 diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index 7c291b7b86..bb62acbec2 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -1,57 +1,57 @@ local S = minetest.get_translator("mcl_experience") mcl_experience = {} - -local -minetest,math,vector,os,pairs,type -= -minetest,math,vector,os,pairs,type - -local storage = minetest.get_mod_storage() - +local pool = {} local registered_nodes + +local gravity = {x = 0, y = -((tonumber(minetest.settings:get("movement_gravity"))) or 9.81), z = 0} +local size_min, size_max = 20, 59 -- percents +local delta_size = size_max - size_min +local size_to_xp = { + {-32768, 2}, -- 1 + { 3, 6}, -- 2 + { 7, 16}, -- 3 + { 17, 36}, -- 4 + { 37, 72}, -- 5 + { 73, 148}, -- 6 + { 149, 306}, -- 7 + { 307, 616}, -- 8 + { 617, 1236}, -- 9 + { 1237, 2476}, --10 + { 2477, 32767} --11 +} + +local function xp_to_size(xp) + local i, l = 1, #size_to_xp + while (xp > size_to_xp[i][1]) and (i < l) do + i = i + 1 + end + return ((i-1) / (l-1) * delta_size + size_min)/100 +end + minetest.register_on_mods_loaded(function() registered_nodes = minetest.registered_nodes end) -local pool = {} --- loads data from mod storage -local name -local temp_pool local load_data = function(player) - name = player:get_player_name() + local name = player:get_player_name() pool[name] = {} - temp_pool = pool[name] - if storage:get_int(name.."xp_save") > 0 then - temp_pool.xp_level = storage:get_int(name.."xp_level") - temp_pool.xp_bar = storage:get_int(name.."xp_bar" ) - temp_pool.last_time= minetest.get_us_time()/1000000 - else - temp_pool.xp_level = 0 - temp_pool.xp_bar = 0 - temp_pool.last_time= minetest.get_us_time()/1000000 - end + local temp_pool = pool[name] + local meta = player:get_meta() + temp_pool.xp = meta:get_int("xp") or 0 + temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) + temp_pool.bar, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) + temp_pool.last_time= minetest.get_us_time()/1000000 end -- saves data to be utilized on next login -local name -local temp_pool -local save_data = function(name) - if type(name) ~= "string" and name:is_player() then - name = name:get_player_name() - end - temp_pool = pool[name] - - storage:set_int(name.."xp_level",temp_pool.xp_level) - storage:set_int(name.."xp_bar", temp_pool.xp_bar ) - - storage:set_int(name.."xp_save",1) - +local save_data = function(player) + name = player:get_player_name() + local temp_pool = pool[name] + local meta = player:get_meta() + meta:set_int("xp", temp_pool.xp) pool[name] = nil end --------hud manager -local minetest = minetest - local player_huds = {} -- the list of players hud lists (3d array) hud_manager = {} -- hud manager class @@ -119,7 +119,10 @@ end) -- is used for shutdowns to save all data local save_all = function() for name,_ in pairs(pool) do - save_data(name) + local player = minetest.get_player_by_name(name) + if player then + save_data(player) + end end end @@ -132,14 +135,16 @@ end) local name function mcl_experience.get_player_xp_level(player) name = player:get_player_name() - return(pool[name].xp_level) + return(pool[name].level) end local name local temp_pool function mcl_experience.set_player_xp_level(player,level) name = player:get_player_name() - pool[name].xp_level = level + pool[name].level = level + pool[name].xp = mcl_experience.level_to_xp(level) +--todo: update bar hud_manager.change_hud({ player = player, hud_name = "xp_level_fg", @@ -154,16 +159,6 @@ function mcl_experience.set_player_xp_level(player,level) }) end -minetest.hud_replace_builtin("health",{ - hud_elem_type = "statbar", - position = {x = 0.5, y = 1}, - text = "heart.png", - number = core.PLAYER_MAX_HP_DEFAULT, - direction = 0, - size = {x = 24, y = 24}, - offset = {x = (-10 * 24) - 25, y = -(48 + 24 + 38)}, -}) - local name local temp_pool minetest.register_on_joinplayer(function(player) @@ -173,101 +168,105 @@ minetest.register_on_joinplayer(function(player) name = player:get_player_name() temp_pool = pool[name] - hud_manager.add_hud(player,"experience_bar_background",{ - hud_elem_type = "statbar", - position = {x=0.5, y=1}, - name = "experience bar background", - text = "experience_bar_background.png", - number = 36, - direction = 0, - offset = {x = (-8 * 28) - 29, y = -(48 + 24 + 16)}, - size = { x=28, y=28 }, - z_index = 0, + hud_manager.add_hud(player, "experience_bar_background", + { + hud_elem_type = "statbar", position = {x=0.5, y=1}, + name = "experience bar background", text = "experience_bar_background.png", + number = 36, direction = 0, + offset = {x = (-8 * 28) - 29, y = -(48 + 24 + 16)}, + size = { x=28, y=28 }, z_index = 3, }) - hud_manager.add_hud(player,"experience_bar",{ - hud_elem_type = "statbar", - position = {x=0.5, y=1}, - name = "experience bar", - text = "experience_bar.png", - number = temp_pool.xp_bar, - direction = 0, - offset = {x = (-8 * 28) - 29, y = -(48 + 24 + 16)}, - size = { x=28, y=28 }, - z_index = 0, - }) + hud_manager.add_hud(player,"experience_bar", + { + hud_elem_type = "statbar", position = {x=0.5, y=1}, + name = "experience bar", text = "experience_bar.png", + number = temp_pool.bar, direction = 0, + offset = {x = (-8 * 28) - 29, y = -(48 + 24 + 16)}, + size = { x=28, y=28 }, z_index = 4, + }) - hud_manager.add_hud(player,"xp_level_bg",{ - hud_elem_type = "text", - position = {x=0.5, y=1}, - name = "xp_level_bg", - text = tostring(temp_pool.xp_level), - number = 0x000000, - offset = {x = 0, y = -(48 + 24 + 24)}, - z_index = 0, - }) - hud_manager.add_hud(player,"xp_level_fg",{ - hud_elem_type = "text", - position = {x=0.5, y=1}, - name = "xp_level_fg", - text = tostring(temp_pool.xp_level), - number = 0xFFFFFF, - offset = {x = -1, y = -(48 + 24 + 25)}, - z_index = 0, + hud_manager.add_hud(player,"xp_level_bg", + { + hud_elem_type = "text", position = {x=0.5, y=1}, + name = "xp_level_bg", text = tostring(temp_pool.level), + number = 0x000000, + offset = {x = 0, y = -(48 + 24 + 24)}, + z_index = 5, + }) + + hud_manager.add_hud(player,"xp_level_fg", + { + hud_elem_type = "text", position = {x=0.5, y=1}, + name = "xp_level_fg", text = tostring(temp_pool.level), + number = 0xFFFFFF, + offset = {x = -1, y = -(48 + 24 + 25)}, + z_index = 6, }) end) - -local name -local temp_pool -local function level_up_experience(player) - name = player:get_player_name() - temp_pool = pool[name] - - temp_pool.xp_level = temp_pool.xp_level + 1 - - hud_manager.change_hud({ - player = player, - hud_name = "xp_level_fg", - element = "text", - data = tostring(temp_pool.xp_level) - }) - hud_manager.change_hud({ - player = player, - hud_name = "xp_level_bg", - element = "text", - data = tostring(temp_pool.xp_level) - }) +function mcl_experience.xp_to_level(xp) + local xp = xp or 0 + local a, b, c, D + if xp > 1507 then + a, b, c = 4.5, -162.5, 2220-xp + elseif xp > 352 then + a, b, c = 2.5, -40.5, 360-xp + else + a, b, c = 1, 6, -xp + end + D = b*b-4*a*c + if D == 0 then + return math.floor(-b/2/a) + elseif D > 0 then + local v1, v2 = -b/2/a, math.sqrt(D)/2/a + return math.floor((math.max(v1-v2, v1+v2))) + end + return 0 end +function mcl_experience.level_to_xp(level) + if (level >= 1 and level <= 16) then + return math.floor(math.pow(level, 2) + 6 * level) + elseif (level >= 17 and level <= 31) then + return math.floor(2.5 * math.pow(level, 2) - 40.5 * level + 360) + elseif level >= 32 then + return math.floor(4.5 * math.pow(level, 2) - 162.5 * level + 2220); + end + return 0 +end -local name -local temp_pool -function mcl_experience.add_experience(player,experience) - name = player:get_player_name() - temp_pool = pool[name] - - temp_pool.xp_bar = temp_pool.xp_bar + experience - - if temp_pool.xp_bar > 36 then +function mcl_experience.xp_to_bar(xp, level) + local level = level or mcl_experience.xp_to_level(xp) + local xp_this_level = mcl_experience.level_to_xp(level) + local xp_next_level = mcl_experience.level_to_xp(level+1) + local bar = math.floor((xp-xp_this_level)/(xp_next_level-xp_this_level)*35) + return bar, xp_next_level +end + +function mcl_experience.add_experience(player, experience) + local name = player:get_player_name() + local temp_pool = pool[name] + + local old_bar, old_xp, old_level = temp_pool.bar, temp_pool.xp, temp_pool.level + temp_pool.xp = math.max(temp_pool.xp + experience, 0) + temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) + temp_pool.bar, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) + if old_level ~= temp_pool.level then if minetest.get_us_time()/1000000 - temp_pool.last_time > 0.04 then minetest.sound_play("level_up",{gain=0.2,to_player = name}) temp_pool.last_time = minetest.get_us_time()/1000000 end - temp_pool.xp_bar = temp_pool.xp_bar - 36 - level_up_experience(player) - else - if minetest.get_us_time()/1000000 - temp_pool.last_time > 0.01 then - temp_pool.last_time = minetest.get_us_time()/1000000 - minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) - end + hud_manager.change_hud({player = player, hud_name = "xp_level_fg", element = "text", data = tostring(temp_pool.level)}) + hud_manager.change_hud({player = player, hud_name = "xp_level_bg", element = "text", data = tostring(temp_pool.level)}) + elseif minetest.get_us_time()/1000000 - temp_pool.last_time > 0.01 then + temp_pool.last_time = minetest.get_us_time()/1000000 + minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) + end + + if old_bar ~= temp_pool.bar then + hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "number", data = temp_pool.bar}) end - hud_manager.change_hud({ - player = player, - hud_name = "experience_bar", - element = "number", - data = temp_pool.xp_bar - }) end --reset player level @@ -275,35 +274,23 @@ local name local temp_pool local xp_amount minetest.register_on_dieplayer(function(player) + if minetest.settings:get_bool("mcl_keepInventory", false) then + return + end + name = player:get_player_name() temp_pool = pool[name] - xp_amount = temp_pool.xp_level + xp_amount = temp_pool.xp - temp_pool.xp_bar = 0 - temp_pool.xp_level = 0 + temp_pool.bar = 0 + temp_pool.level = 0 + temp_pool.xp = 0 + hud_manager.change_hud({player = player, hud_name = "xp_level_fg", element = "text", data = tostring(temp_pool.level)}) + hud_manager.change_hud({player = player, hud_name = "xp_level_bg", element = "text", data = tostring(temp_pool.level)}) + hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "number", data = temp_pool.bar}) - hud_manager.change_hud({ - player = player, - hud_name = "xp_level_fg", - element = "text", - data = tostring(temp_pool.xp_level) - }) - hud_manager.change_hud({ - player = player, - hud_name = "xp_level_bg", - element = "text", - data = tostring(temp_pool.xp_level) - }) - - hud_manager.change_hud({ - player = player, - hud_name = "experience_bar", - element = "number", - data = temp_pool.xp_bar - }) - - mcl_experience.throw_experience(player:get_pos(), xp_amount) + mcl_experience.throw_experience(player:get_pos(), xp_amount) end) @@ -349,7 +336,7 @@ local function xp_step(self, dtime) acceleration = vector.new(goal.x-currentvel.x,goal.y-currentvel.y,goal.z-currentvel.z) self.object:add_velocity(vector.add(acceleration,player_velocity)) elseif distance < 0.4 then - mcl_experience.add_experience(collector,2) + mcl_experience.add_experience(collector, self._xp) self.object:remove() end return @@ -420,7 +407,7 @@ local function xp_step(self, dtime) self.slippery_state = is_slippery if is_moving then - self.object:set_acceleration({x = 0, y = -9.81, z = 0}) + self.object:set_acceleration(gravity) else self.object:set_acceleration({x = 0, y = 0, z = 0}) self.object:set_velocity({x = 0, y = 0, z = 0}) @@ -466,9 +453,11 @@ minetest.register_entity("mcl_experience:orb", { )) self.object:set_armor_groups({immortal = 1}) self.object:set_velocity({x = 0, y = 2, z = 0}) - self.object:set_acceleration({x = 0, y = -9.81, z = 0}) - size = math.random(20,36)/100 - self.object:set_properties({ + self.object:set_acceleration(gravity) + local xp = tonumber(staticdata) + self._xp = xp + size = xp_to_size(xp) + self.object:set_properties({ visual_size = {x = size, y = size}, glow = 14, }) @@ -480,7 +469,7 @@ minetest.register_entity("mcl_experience:orb", { self.physical_state = true self.object:set_properties({physical = true}) self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=-9.81, z=0}) + self.object:set_acceleration(gravity) end end, @@ -497,10 +486,9 @@ minetest.register_entity("mcl_experience:orb", { end, }) - minetest.register_chatcommand("xp", { params = S("[] []"), - description = S("Gives [player ] [] XP"), + description = S("Gives [[player ] ] XP"), privs = {server=true}, func = function(name, params) local player, xp = nil, 1000 @@ -521,27 +509,31 @@ minetest.register_chatcommand("xp", { if i == 2 then player = minetest.get_player_by_name(P[1]) end - if (not xp) or (xp < 1) then - return false, S("Error: Incorrect number of XP") + if not xp then + return false, S("Error: Incorrect value of XP") end if not player then return false, S("Error: Player not found") end - local pos = player:get_pos() - pos.y = pos.y + 1.2 - mcl_experience.throw_experience(pos, xp) + mcl_experience.add_experience(player, xp) end, }) function mcl_experience.throw_experience(pos, amount) - for i = 1,amount do - object = minetest.add_entity(pos, "mcl_experience:orb") - if object then - object:set_velocity({ - x=math.random(-2,2)*math.random(), - y=math.random(2,5), - z=math.random(-2,2)*math.random() - }) - end - end + local i, j = 0, 0 + local obj, xp + while i < amount and j < 100 do + xp = math.min(math.random(1, math.min(32767, amount-math.floor(i/2))), amount-i) + obj = minetest.add_entity(pos, "mcl_experience:orb", tostring(xp)) + if not obj then + return false + end + obj:set_velocity({ + x=math.random(-2,2)*math.random(), + y=math.random(2,5), + z=math.random(-2,2)*math.random() + }) + i = i + xp + j = j + 1 + end end diff --git a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr index b4c6e5aace..1d2195e8d3 100644 --- a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr +++ b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr @@ -1,5 +1,5 @@ [] []=[<игрок>] [] -Gives [player ] [] XP=Даёт [игроку <игрок>] [] +Gives [[player ] ] XP=Даёт [[игроку <игрок> []] единиц опыта XP Error: Too many parameters!=Ошибка: слишком много параметров! -Error: Incorrect number of XP=Ошибка: Неправильное число XP +Error: Incorrect value of XP=Ошибка: Недопустимое значение XP Error: Player not found=Ошибка: Игрок не найден diff --git a/mods/HUD/mcl_experience/locale/template.txt b/mods/HUD/mcl_experience/locale/template.txt index 5d2c67636c..963d9dffae 100644 --- a/mods/HUD/mcl_experience/locale/template.txt +++ b/mods/HUD/mcl_experience/locale/template.txt @@ -1,5 +1,5 @@ [] []= -Gives [player ] [] XP= +Gives [[player ] ] XP= Error: Too many parameters!= -Error: Incorrect number of XP= +Error: Incorrect value of XP= Error: Player not found= From 30d9e54803b5d71ae7b5dad72644b911e12593a9 Mon Sep 17 00:00:00 2001 From: kay27 Date: Sat, 24 Oct 2020 02:46:45 +0400 Subject: [PATCH 3/3] Implement leftovers of https://git.minetest.land/Wuzzy/MineClone2/issues/841#issuecomment-11440 --- mods/ENTITIES/mcl_item_entity/init.lua | 2 +- mods/HUD/mcl_experience/init.lua | 79 ++++++++++--------- .../locale/mcl_experience.ru.tr | 1 + mods/HUD/mcl_experience/locale/template.txt | 1 + mods/ITEMS/mcl_core/nodes_base.lua | 12 +-- mods/ITEMS/mcl_nether/init.lua | 2 +- 6 files changed, 53 insertions(+), 44 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index f971d0f35d..0481b53404 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -227,7 +227,7 @@ function minetest.handle_node_drops(pos, drops, digger) local toolcaps if digger ~= nil then if mcl_experience.throw_experience then - local experience_amount = minetest.get_item_group(dug_node.name,"experience") + local experience_amount = minetest.get_item_group(dug_node.name,"xp") if experience_amount > 0 then mcl_experience.throw_experience(pos, experience_amount) end diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index bb62acbec2..2eec016bcd 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -39,7 +39,7 @@ local load_data = function(player) local meta = player:get_meta() temp_pool.xp = meta:get_int("xp") or 0 temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) - temp_pool.bar, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) + temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) temp_pool.last_time= minetest.get_us_time()/1000000 end @@ -132,31 +132,21 @@ minetest.register_on_shutdown(function() end) -local name function mcl_experience.get_player_xp_level(player) - name = player:get_player_name() + local name = player:get_player_name() return(pool[name].level) end -local name -local temp_pool function mcl_experience.set_player_xp_level(player,level) - name = player:get_player_name() + local name = player:get_player_name() + if level == pool[name].level then + return + end pool[name].level = level - pool[name].xp = mcl_experience.level_to_xp(level) ---todo: update bar - hud_manager.change_hud({ - player = player, - hud_name = "xp_level_fg", - element = "text", - data = tostring(level) - }) - hud_manager.change_hud({ - player = player, - hud_name = "xp_level_bg", - element = "text", - data = tostring(level) - }) + pool[name].xp, pool[name].next_level = mcl_experience.bar_to_xp(pool[name].bar, level) + hud_manager.change_hud({player = player, hud_name = "xp_level_fg", element = "text", data = tostring(level)}) + hud_manager.change_hud({player = player, hud_name = "xp_level_bg", element = "text", data = tostring(level)}) + -- we may don't update the bar end local name @@ -240,9 +230,18 @@ function mcl_experience.xp_to_bar(xp, level) local level = level or mcl_experience.xp_to_level(xp) local xp_this_level = mcl_experience.level_to_xp(level) local xp_next_level = mcl_experience.level_to_xp(level+1) - local bar = math.floor((xp-xp_this_level)/(xp_next_level-xp_this_level)*35) - return bar, xp_next_level -end + local bar_step = 36 / (xp_next_level-xp_this_level) + local bar = (xp-xp_this_level) * bar_step + return bar, bar_step, xp_next_level +end + +function mcl_experience.bar_to_xp(bar, level) + local xp_this_level = mcl_experience.level_to_xp(level) + local xp_next_level = mcl_experience.level_to_xp(level+1) + local bar_step = 36 / (xp_next_level-xp_this_level) + local xp = xp_this_level + math.floor(bar/36*(xp_next_level-xp_this_level)) + return xp, bar_step, xp_next_level +end function mcl_experience.add_experience(player, experience) local name = player:get_player_name() @@ -250,22 +249,27 @@ function mcl_experience.add_experience(player, experience) local old_bar, old_xp, old_level = temp_pool.bar, temp_pool.xp, temp_pool.level temp_pool.xp = math.max(temp_pool.xp + experience, 0) - temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) - temp_pool.bar, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) - if old_level ~= temp_pool.level then - if minetest.get_us_time()/1000000 - temp_pool.last_time > 0.04 then - minetest.sound_play("level_up",{gain=0.2,to_player = name}) - temp_pool.last_time = minetest.get_us_time()/1000000 + if (temp_pool.xp >= temp_pool.xp_next_level) or (experience < 1) then + temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) + temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) + if old_level ~= temp_pool.level then + if minetest.get_us_time()/1000000 - temp_pool.last_time > 0.04 then + minetest.sound_play("level_up",{gain=0.2,to_player = name}) + temp_pool.last_time = minetest.get_us_time()/1000000 + end + hud_manager.change_hud({player = player, hud_name = "xp_level_fg", element = "text", data = tostring(temp_pool.level)}) + hud_manager.change_hud({player = player, hud_name = "xp_level_bg", element = "text", data = tostring(temp_pool.level)}) end - hud_manager.change_hud({player = player, hud_name = "xp_level_fg", element = "text", data = tostring(temp_pool.level)}) - hud_manager.change_hud({player = player, hud_name = "xp_level_bg", element = "text", data = tostring(temp_pool.level)}) - elseif minetest.get_us_time()/1000000 - temp_pool.last_time > 0.01 then - temp_pool.last_time = minetest.get_us_time()/1000000 - minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) + else + if minetest.get_us_time()/1000000 - temp_pool.last_time > 0.01 then + temp_pool.last_time = minetest.get_us_time()/1000000 + minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) + end + temp_pool.bar = temp_pool.bar + temp_pool.bar_step * experience end if old_bar ~= temp_pool.bar then - hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "number", data = temp_pool.bar}) + hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "number", data = math.floor(temp_pool.bar)}) end end @@ -288,7 +292,7 @@ minetest.register_on_dieplayer(function(player) hud_manager.change_hud({player = player, hud_name = "xp_level_fg", element = "text", data = tostring(temp_pool.level)}) hud_manager.change_hud({player = player, hud_name = "xp_level_bg", element = "text", data = tostring(temp_pool.level)}) - hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "number", data = temp_pool.bar}) + hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "number", data = math.floor(temp_pool.bar)}) mcl_experience.throw_experience(player:get_pos(), xp_amount) end) @@ -516,6 +520,9 @@ minetest.register_chatcommand("xp", { return false, S("Error: Player not found") end mcl_experience.add_experience(player, xp) + local playername = player:get_player_name() +-- minetest.chat_send_player(name, "Added " .. tostring(xp) .. " XP to " .. playername .. ", they've got " .. tostring(pool[playername].xp) .. " XP, level " .. tostring(pool[playername].level)) + minetest.chat_send_player(name, S("Added @1 XP to @2, total: @3, experience level: @4", tostring(xp), playername, tostring(pool[playername].xp), tostring(pool[playername].level))) end, }) diff --git a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr index 1d2195e8d3..2d0f579af7 100644 --- a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr +++ b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr @@ -3,3 +3,4 @@ Gives [[player ] ] XP=Даёт [[игроку <игрок> []] Error: Too many parameters!=Ошибка: слишком много параметров! Error: Incorrect value of XP=Ошибка: Недопустимое значение XP Error: Player not found=Ошибка: Игрок не найден +Added @1 XP to @2, total: @3, experience level: @4=Добавляем @1 XP игроку @2, итого: @3, уровень опыта: @4 diff --git a/mods/HUD/mcl_experience/locale/template.txt b/mods/HUD/mcl_experience/locale/template.txt index 963d9dffae..98b00a460e 100644 --- a/mods/HUD/mcl_experience/locale/template.txt +++ b/mods/HUD/mcl_experience/locale/template.txt @@ -3,3 +3,4 @@ Gives [[player ] ] XP= Error: Too many parameters!= Error: Incorrect value of XP= Error: Player not found= +Added @1 XP to @2, total: @3, experience level: @4= diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 0728cb39e5..978dde6487 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -31,7 +31,7 @@ minetest.register_node("mcl_core:stone_with_coal", { tiles = {"mcl_core_coal_ore.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, experience=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, xp=1}, drop = 'mcl_core:coal_lump', sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, @@ -77,7 +77,7 @@ minetest.register_node("mcl_core:stone_with_redstone", { tiles = {"mcl_core_redstone_ore.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=4, building_block=1, material_stone=1, experience=7}, + groups = {pickaxey=4, building_block=1, material_stone=1, xp=7}, drop = { items = { max_items = 1, @@ -110,7 +110,7 @@ minetest.register_node("mcl_core:stone_with_redstone_lit", { light_source = 9, is_ground_content = true, stack_max = 64, - groups = {pickaxey=4, not_in_creative_inventory=1, material_stone=1, experience=7}, + groups = {pickaxey=4, not_in_creative_inventory=1, material_stone=1, xp=7}, drop = { items = { max_items = 1, @@ -141,7 +141,7 @@ minetest.register_node("mcl_core:stone_with_lapis", { tiles = {"mcl_core_lapis_ore.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=3, building_block=1, material_stone=1, experience=6}, + groups = {pickaxey=3, building_block=1, material_stone=1, xp=6}, drop = { max_items = 1, items = { @@ -163,7 +163,7 @@ minetest.register_node("mcl_core:stone_with_emerald", { tiles = {"mcl_core_emerald_ore.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=4, building_block=1, material_stone=1, experience=6}, + groups = {pickaxey=4, building_block=1, material_stone=1, xp=6}, drop = "mcl_core:emerald", sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, @@ -176,7 +176,7 @@ minetest.register_node("mcl_core:stone_with_diamond", { tiles = {"mcl_core_diamond_ore.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=4, building_block=1, material_stone=1, experience=4}, + groups = {pickaxey=4, building_block=1, material_stone=1, xp=4}, drop = "mcl_core:diamond", sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index ee92de0285..aac92839a1 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -35,7 +35,7 @@ minetest.register_node("mcl_nether:quartz_ore", { stack_max = 64, tiles = {"mcl_nether_quartz_ore.png"}, is_ground_content = true, - groups = {pickaxey=1, building_block=1, material_stone=1, experience=3}, + groups = {pickaxey=1, building_block=1, material_stone=1, xp=3}, drop = 'mcl_nether:quartz', sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3,