diff --git a/mods/README.md b/mods/README.md index f548ef0..a4e9398 100644 --- a/mods/README.md +++ b/mods/README.md @@ -35,6 +35,7 @@ For information check [../README.md](../README.md) | stairs | https://codeberg.org/minenux/minetest-mod-stairs | https://codeberg.org/minenux/minetest-mod-stairs/commit/c3a5af6c452daca599d226df694df1b75f15c110 | [stairs/README.md](stairs/README.md) | | screwdriver | https://codeberg.org/minenux/minetest-game-minetest | https://codeberg.org/minenux/minetest-game-minetest/commit/eb64ff94f82d726e4a55b20fa7ce30e4a7470cc5 | | | tnt | https://codeberg.org/minenux/minetest-mod-tnt | https://codeberg.org/minenux/minetest-mod-tnt/commit/8195861f905a90b53cd52348deb34df41a053027 | [tnt/README.md](tnt/README.md) | +| toolranks | https://codeberg.org/minenux/minetest-mod-toolranks | https://codeberg.org/minenux/minetest-mod-toolranks/commit/5c9553e5ac6cc7ae375033b76ef7771a6935c771 | [toolranks/README.md](toolranks/README.md) | | vessels | https://codeberg.org/minenux/minetest-game-minetest | https://codeberg.org/minenux/minetest-game-minetest/commit/eb64ff94f82d726e4a55b20fa7ce30e4a7470cc5 | | | walls | https://codeberg.org/minenux/minetest-game-minetest | https://codeberg.org/minenux/minetest-game-minetest/commit/eb64ff94f82d726e4a55b20fa7ce30e4a7470cc5 | | | weather | https://codeberg.org/minenux/minetest-game-minetest | https://codeberg.org/minenux/minetest-game-minetest/commit/eb64ff94f82d726e4a55b20fa7ce30e4a7470cc5 | | diff --git a/mods/toolranks/README.md b/mods/toolranks/README.md new file mode 100644 index 0000000..51530df --- /dev/null +++ b/mods/toolranks/README.md @@ -0,0 +1,81 @@ +# Minetest tool ranks mod + +Tool gains levels for digging nodes. Higher level take longer to wear out. + +Information +------------ + +It adds improved information on the description label of the tools, +like how much was used the tool and how much is improved, +and also provides improved xperience over the tool as much you use it.. + +![](screenshot.png) + +# Technical information +--------------------- + +This mod is named `toolranks` + +This ranktool is the tenplus1's version, featured custom values throught +configuration interface for dig speed, mutiplier and durability. + +Shows information about the counts the nodes that spend the tool + +Also provide interface to add toolrank support on other mods. + +#### Dependencies + +* default (now optional) + +#### configuration + +| Config item | type | def | values | Description | +| -------------------------- | ----- | ---- | ----------- | ----------------------------- | +| toolranks_levels | int | 8 | any int | Level (Number of tool levels) | +| toolranks_level_digs | int | 1000 | any int | Number of nodes that need to be dug to reach the next tool level | +| toolranks_speed_multiplier | float | 1.1 | 1.0 to 10.0 | Dig speed multiplier (at maximum tool level, 1.0 to disable) | +| toolranks_use_multiplier | float | 1.1 | 1.0 to 10.0 | Durability multiplier (at maximum tool level,1.0 to disable) | + +#### mods toolrank support + +The default mod of minetest game has default support in this mod, +but not farming hoes, many other mods already integrates toolrank support, +by example all the tenplus1's "redo"s mod already has support, others will need +extra mods like toolranks_extra due rejection from mod authors. + +#### how to add support in mods + +If so, to support this mod, add this code to your mod, after your tool's code: + +```lua +if minetest.get_modpath("toolranks") then + toolranks.add_tool("mymod:mytool") +end +``` + +Where `mymod` is the technical/namespace name of the mod and `mytool` the item name. + +That function provides all that can be do by custom way also as: + +```lua +if minetest.get_modpath("toolranks") then + minetest.override_item("mymod:mytool", { + original_description = "My Tool", + description = toolranks.create_description("My Tool"), + after_use = toolranks.new_afteruse + }) + end +end +``` + +## LICENSE + +(c) 2017 lisacvuk +(c) 2017 tenplus1 +(c) 2023 mckaygerhard + +Code is LGPL v2.1 +media is CC-BY + +check [license.txt](license.txt) + diff --git a/mods/toolranks/depends.txt b/mods/toolranks/depends.txt new file mode 100644 index 0000000..5e78c21 --- /dev/null +++ b/mods/toolranks/depends.txt @@ -0,0 +1 @@ +default? diff --git a/mods/toolranks/description.txt b/mods/toolranks/description.txt new file mode 100644 index 0000000..0092985 --- /dev/null +++ b/mods/toolranks/description.txt @@ -0,0 +1 @@ +TOOL gains levels for digging nodes. Higher level take longer to wear out diff --git a/mods/toolranks/init.lua b/mods/toolranks/init.lua new file mode 100644 index 0000000..87ccbc5 --- /dev/null +++ b/mods/toolranks/init.lua @@ -0,0 +1,211 @@ +local S + +if minetest.get_translator ~= nil then + S = minetest.get_translator("toolranks") -- 5.x translation function +else + if minetest.get_modpath("intllib") then + dofile(minetest.get_modpath("intllib") .. "/init.lua") + if intllib.make_gettext_pair then + gettext, ngettext = intllib.make_gettext_pair() -- new gettext method + else + gettext = intllib.Getter() -- old text file method + end + S = gettext + else -- boilerplate function + S = function(str, ...) + local args = {...} + return str:gsub("@%d+", function(match) + return args[tonumber(match:sub(2))] + end) + end + end +end + +toolranks = { + + colors = { + grey = minetest.get_color_escape_sequence("#9d9d9d"), + green = minetest.get_color_escape_sequence("#1eff00"), + gold = minetest.get_color_escape_sequence("#ffdf00"), + white = minetest.get_color_escape_sequence("#ffffff") + } +} + + +local max_speed = tonumber(minetest.settings:get("toolranks_speed_multiplier")) or 1.1--2.0 +local max_use = tonumber(minetest.settings:get("toolranks_use_multiplier")) or 1.1 +local max_level = tonumber(minetest.settings:get("toolranks_levels")) or 8 +local level_digs = tonumber(minetest.settings:get("toolranks_level_digs")) or 1000 +local level_multiplier = 1 / max_level + + +function toolranks.get_level(uses) + + if type(uses) == "number" and uses > 0 then + return math.min(max_level, math.floor(uses / level_digs)) + end + + return 0 +end + + +function toolranks.create_description(name, uses) + + local description = name + local newdesc = S( + "@1@2\n@3Level @4 @5\n@6@Node dug: @7", + toolranks.colors.green, + description, + toolranks.colors.gold, + toolranks.get_level(uses), + "", -- was tooltype + toolranks.colors.grey, + (type(uses) == "number" and uses or 0) + ) + + return newdesc +end + + +function toolranks.new_afteruse(itemstack, user, node, digparams) + + local pname = user:get_player_name() + + if not pname then return itemstack end -- player nil check + + local itemmeta = itemstack:get_meta() + local dugnodes = tonumber(itemmeta:get_string("dug")) or 0 + + if digparams.wear > 0 then -- Only count nodes that spend the tool + + dugnodes = dugnodes + 1 + + itemmeta:set_string("dug", dugnodes) + end + + if itemstack:get_wear() > 60135 then + + minetest.chat_send_player(pname, + toolranks.colors.gold .. S("Your tool is about to break!")) + + minetest.sound_play("default_tool_breaks", { + to_player = pname, + gain = 2.0, + }, true) + end + + local itemdef = itemstack:get_definition() + local itemdesc = itemdef.original_description or "" + local lastlevel = tonumber(itemmeta:get_string("lastlevel")) or 0 + local level = toolranks.get_level(dugnodes) + + if lastlevel < level then + + local levelup_text = S( + "Your @1@2@3 just leveled up!", + toolranks.colors.green, + itemdesc, + toolranks.colors.white + ) + + minetest.chat_send_player(pname, levelup_text .. " "..lastlevel.." -> "..level) + + minetest.sound_play("toolranks_levelup", { + to_player = pname, + gain = 2.0, + }, true) + + -- Make tool better by modifying tool_capabilities (if defined) + if itemdef.tool_capabilities then + + local speed_multiplier = 1 + (level * level_multiplier * (max_speed - 1)) + local use_multiplier = 1 + (level * level_multiplier * (max_use - 1)) + local caps = table.copy(itemdef.tool_capabilities) + + caps.full_punch_interval = caps.full_punch_interval and + (caps.full_punch_interval / speed_multiplier) + + caps.punch_attack_uses = caps.punch_attack_uses and + (caps.punch_attack_uses * use_multiplier) + + for _,c in pairs(caps.groupcaps) do + + c.uses = c.uses * use_multiplier + + for i,t in ipairs(c.times) do + c.times[i] = t / speed_multiplier + end + end + + itemmeta:set_tool_capabilities(caps) + end + end + + -- Old method for compatibility with tools without tool_capabilities defined + local wear = digparams.wear + + if level > 0 and not itemdef.tool_capabilities then + + local use_multiplier = 1 + (level * level_multiplier * (max_use - 1)) + + wear = wear / use_multiplier + end + + itemmeta:set_string("lastlevel", level) + itemmeta:set_string("description", toolranks.create_description(itemdesc, dugnodes)) + itemstack:add_wear(wear) + + return itemstack +end + + +-- Helper function +function toolranks.add_tool(name) + + local desc = ItemStack(name):get_definition().description + + minetest.override_item(name, { + original_description = desc, + description = toolranks.create_description(desc), + after_use = toolranks.new_afteruse + }) +end + +local defaultmod = minetest.get_modpath("default") + +if defaultmod then +-- Sword +toolranks.add_tool("default:sword_wood") +toolranks.add_tool("default:sword_stone") +toolranks.add_tool("default:sword_steel") +toolranks.add_tool("default:sword_bronze") +toolranks.add_tool("default:sword_mese") +toolranks.add_tool("default:sword_diamond") + +-- Pickaxe +toolranks.add_tool("default:pick_wood") +toolranks.add_tool("default:pick_stone") +toolranks.add_tool("default:pick_steel") +toolranks.add_tool("default:pick_bronze") +toolranks.add_tool("default:pick_mese") +toolranks.add_tool("default:pick_diamond") + +-- Axe +toolranks.add_tool("default:axe_wood") +toolranks.add_tool("default:axe_stone") +toolranks.add_tool("default:axe_steel") +toolranks.add_tool("default:axe_bronze") +toolranks.add_tool("default:axe_mese") +toolranks.add_tool("default:axe_diamond") + +-- Shovel +toolranks.add_tool("default:shovel_wood") +toolranks.add_tool("default:shovel_stone") +toolranks.add_tool("default:shovel_steel") +toolranks.add_tool("default:shovel_bronze") +toolranks.add_tool("default:shovel_mese") +toolranks.add_tool("default:shovel_diamond") + +end + +print("[MOD] Tool Ranks loaded") diff --git a/mods/toolranks/license.txt b/mods/toolranks/license.txt new file mode 100644 index 0000000..1eff911 --- /dev/null +++ b/mods/toolranks/license.txt @@ -0,0 +1,2 @@ +Code: LGPLv2.1+ +Sounds: CC BY 3.0 diff --git a/mods/toolranks/locale/toolranks.en.tr b/mods/toolranks/locale/toolranks.en.tr new file mode 100644 index 0000000..9e6b7d8 --- /dev/null +++ b/mods/toolranks/locale/toolranks.en.tr @@ -0,0 +1,11 @@ +# textdomain: toolranks +@1@2@n@3Level @4 @5@n@6Node dug: @7=@1@2@n@3Level @4 @5@n@6Node dug: @7 +pickaxe=pickaxe +axe=axe +shovel=shovel +hoe=hoe +sword=sword +tool=tool +Most used tool is now a @1@2@3 owned by @4 with @5 uses.=Most used tool is now a @1@2@3 owned by @4 with @5 uses. +Your tool is about to break!=Your tool is about to break! +Your @1@2@3 just leveled up!=Your @1@2@3 just leveled up! diff --git a/mods/toolranks/locale/toolranks.es.tr b/mods/toolranks/locale/toolranks.es.tr new file mode 100644 index 0000000..60da99c --- /dev/null +++ b/mods/toolranks/locale/toolranks.es.tr @@ -0,0 +1,11 @@ +# textdomain: toolranks +@1@2@n@3Level @4 @5@n@6Node dug: @7=@1@2@n@3Nivel @4 @5@n@6Nodos picado: @7 +pickaxe=pickaxe +axe=axe +shovel=shovel +hoe=hoe +sword=sword +tool=tool +Most used tool is now a @1@2@3 owned by @4 with @5 uses.=La herramienta mas usada es @1@2@3 pertenece a @4 con @5 veces. +Your tool is about to break!=Tu herramienta esta a punto de romperse! +Your @1@2@3 just leveled up!=Tu @1@2@3 acaba de subir nivel! diff --git a/mods/toolranks/locale/toolranks.fr.tr b/mods/toolranks/locale/toolranks.fr.tr new file mode 100644 index 0000000..2fbefcd --- /dev/null +++ b/mods/toolranks/locale/toolranks.fr.tr @@ -0,0 +1,11 @@ +# textdomain: toolranks +@1@2@n@3Level @4 @5@n@6Node dug: @7=@1@2@n@3@5 niveau @4@n@6Blocks minés : @7 +pickaxe=pioche +axe=hache +shovel=pelle +hoe=houe +sword=épée +tool=outil +Most used tool is now a @1@2@3 owned by @4 with @5 uses.=L’outil le plus utilisé est désormais @1@2@3 appartenant à @4 avec @5 utilisations. +Your tool is about to break!=Votre outil va se casser ! +Your @1@2@3 just leveled up!=Votre @1@2@3 a gagné un niveau ! diff --git a/mods/toolranks/mod.conf b/mods/toolranks/mod.conf new file mode 100644 index 0000000..b1341b9 --- /dev/null +++ b/mods/toolranks/mod.conf @@ -0,0 +1,4 @@ +name = toolranks +depends = +optional_depens = default +description = TOOL gains levels for digging nodes. Higher level take longer to wear out diff --git a/mods/toolranks/screenshot.png b/mods/toolranks/screenshot.png new file mode 100644 index 0000000..f460e50 Binary files /dev/null and b/mods/toolranks/screenshot.png differ diff --git a/mods/toolranks/settingtypes.txt b/mods/toolranks/settingtypes.txt new file mode 100644 index 0000000..23f0988 --- /dev/null +++ b/mods/toolranks/settingtypes.txt @@ -0,0 +1,8 @@ +# Number of tool levels +toolranks_levels (Levels) int 8 +# Number of nodes that need to be dug to reach the next tool level +toolranks_level_digs (Digs per level) int 1000 +# Dig speed multiplier at maximum tool level (1.0 to disable) +toolranks_speed_multiplier (Dig speed multiplier) float 1.1 1.0 10.0 +# Durability multiplier at maximum tool level (1.0 to disable) +toolranks_use_multiplier (Durability multiplier) float 1.1 1.0 10.0 diff --git a/mods/toolranks/sounds/toolranks_levelup.ogg b/mods/toolranks/sounds/toolranks_levelup.ogg new file mode 100644 index 0000000..603f7dc Binary files /dev/null and b/mods/toolranks/sounds/toolranks_levelup.ogg differ