From dab09dfd320e3284fa80cf191cf5583a506827ed Mon Sep 17 00:00:00 2001 From: mckaygerhard Date: Sun, 11 Jun 2023 14:50:11 -0400 Subject: [PATCH] mods - add tenplus1 toolranks with some backported changes features * toolranks from minenux with spanish translation and featured description * backguard compatibility --- mods/README.md | 1 + mods/toolranks/README.md | 81 ++++++++ mods/toolranks/depends.txt | 1 + mods/toolranks/description.txt | 1 + mods/toolranks/init.lua | 211 ++++++++++++++++++++ mods/toolranks/license.txt | 2 + mods/toolranks/locale/toolranks.en.tr | 11 + mods/toolranks/locale/toolranks.es.tr | 11 + mods/toolranks/locale/toolranks.fr.tr | 11 + mods/toolranks/mod.conf | 4 + mods/toolranks/screenshot.png | Bin 0 -> 17085 bytes mods/toolranks/settingtypes.txt | 8 + mods/toolranks/sounds/toolranks_levelup.ogg | Bin 0 -> 10632 bytes 13 files changed, 342 insertions(+) create mode 100644 mods/toolranks/README.md create mode 100644 mods/toolranks/depends.txt create mode 100644 mods/toolranks/description.txt create mode 100644 mods/toolranks/init.lua create mode 100644 mods/toolranks/license.txt create mode 100644 mods/toolranks/locale/toolranks.en.tr create mode 100644 mods/toolranks/locale/toolranks.es.tr create mode 100644 mods/toolranks/locale/toolranks.fr.tr create mode 100644 mods/toolranks/mod.conf create mode 100644 mods/toolranks/screenshot.png create mode 100644 mods/toolranks/settingtypes.txt create mode 100644 mods/toolranks/sounds/toolranks_levelup.ogg diff --git a/mods/README.md b/mods/README.md index cd4a7db..5e332db 100644 --- a/mods/README.md +++ b/mods/README.md @@ -28,6 +28,7 @@ Most of those mods have mirror at http://git.mirror.org | 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/c7cb79422ba19c696966472942db6177c934838d | | | 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/c7cb79422ba19c696966472942db6177c934838d | | | walls | https://codeberg.org/minenux/minetest-game-minetest | https://codeberg.org/minenux/minetest-game-minetest/commit/c7cb79422ba19c696966472942db6177c934838d | | | wool | https://codeberg.org/minenux/minetest-mod-wool | https://codeberg.org/minenux/minetest-mod-wool/commit/de642a08e80bfd7a4a1e5629e50458a609dbda3a | [wool/README.md](wool/README.md) | 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 0000000000000000000000000000000000000000..f460e50151181dc99c139ca633e0023744884602 GIT binary patch literal 17085 zcmW(-1ymbN7hPOSaVzfb?(XjH?(SYF#oeuVafbrMB{;>cXmBlFw12*T&z@u>XJ+=z zv-@&iV$@V*KOhq#0|4+rUQS8_0HDwy*N2GEkjI*q*DA;plBXn z4FD3Z@>1eje(M*(zJ5kaIq$w3zfVeY)LW<(dD@%U@$qt<`^^@hE7p=Do9Pt^^P0)W zX;AVa?@Y~#l;zf1m3hd?`)L-#!p-^(C!>Xgr&yUW=K4b9IH)YWv&OOYvj zyoT|$xfFiPuesg2dYREhTV7k^x1PWr`{wCU8uZ)OK~F@)eGfJ}+%G;ypw9SUya$9p zq_Up=l8D2Vz>C0>=e$s%?9zb(AV&1N69I0hlY;DTAH>mZybaMK=V|G#qHqL}U{cG{ zP0O;iPHa$kq|wU`9f3v)(PXRffR`zTwLR4+w+Z8;RG@hNp23Vr;{iX(#J2AyqcM$3Fd~&u zF>YdK*R{y8m?ku{Sfyb}#yKhev;WKzC4vkQewE`C_bGpFAam+?qQ=(YOQuT#6^F0# zqn50r{><^E8nGox4rfIF(c5>~M>V7zyr&K|kBZu2Qx~tu-{1Ss%0A5E?Z?m1O8Tg{ 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..603f7dcefd57efc8b49ab9c5e51dc061442fe5bb GIT binary patch literal 10632 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 F{|gO)7oq?F literal 0 HcmV?d00001