1
0
mirror of https://github.com/lisacvuk/minetest-toolranks.git synced 2025-07-14 14:00:22 +02:00

4 Commits

5 changed files with 116 additions and 162 deletions

View File

@ -1,13 +0,0 @@
name: Build
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: apt
run: sudo apt-get install -y luarocks
- name: luacheck install
run: luarocks install --local luacheck
- name: luacheck run
run: $HOME/.luarocks/bin/luacheck ./

View File

@ -1,18 +0,0 @@
unused_args = false
allow_defined_top = true
globals = {
"minetest",
}
read_globals = {
string = {fields = {"split"}},
table = {fields = {"copy", "getn"}},
-- Builtin
"vector", "ItemStack",
"dump", "DIR_DELIM", "VoxelArea", "Settings",
-- MTG
"default", "sfinv", "creative",
}

View File

@ -1,27 +1,14 @@
# minetest-toolranks [toolranks] # minetest-toolranks
Minetest tool ranks mod Minetest tool ranks mod
Tools gain levels for digging nodes. Higher level tools dig faster and take longer to wear out. Tool gains levels for digging nodes. Higher level tools take longer to
wear out.
## Are you a mod developer? ## Are you a mod developer?
Does one of your mods add new tools? Does one of your mods add new tools?
If so, to support this mod, add this code to your mod, after your tool's code: If so, to support this mod, check if it is loaded with
```minetest.get_modpath("toolranks")```
```lua and then replace all after_use definitions with toolranks.new_afteruse.
if minetest.get_modpath("toolranks") then Optionaly, you can also replace tools description with
minetest.override_item("mymod:mytool", { ```toolranks.create_description("Tool Name", 0, 1)```
original_description = "My Tool", and then set original_description to your tools name.
description = toolranks.create_description("My Tool"),
after_use = toolranks.new_afteruse
})
end
end
```
Or alternatively, you can use the helper function:
```lua
toolranks.add_tool("mymod:mytool")
```

206
init.lua
View File

@ -10,12 +10,6 @@ toolranks.colors = {
white = minetest.get_color_escape_sequence("#ffffff") white = minetest.get_color_escape_sequence("#ffffff")
} }
local max_speed = tonumber(minetest.settings:get("toolranks_speed_multiplier")) or 2.0
local max_use = tonumber(minetest.settings:get("toolranks_use_multiplier")) or 2.0
local max_level = tonumber(minetest.settings:get("toolranks_levels")) or 10
local level_digs = tonumber(minetest.settings:get("toolranks_level_digs")) or 500
local level_multiplier = 1 / max_level
function toolranks.get_tool_type(description) function toolranks.get_tool_type(description)
if not description then if not description then
return "tool" return "tool"
@ -37,140 +31,152 @@ function toolranks.get_tool_type(description)
end end
end end
function toolranks.get_level(uses) function toolranks.create_description(name, uses, level)
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 description = name
local tooltype = toolranks.get_tool_type(description) local tooltype = toolranks.get_tool_type(description)
local newdesc = S(
"@1@2\n@3Level @4 @5\n@6@Node dug: @7", local newdesc = S("@1@2\n@3Level @4 @5\n@6@Node dug: @7",
toolranks.colors.green, toolranks.colors.green,
description, description,
toolranks.colors.gold, toolranks.colors.gold,
toolranks.get_level(uses), (level or 1),
S(tooltype), S(tooltype),
toolranks.colors.grey, toolranks.colors.grey,
(type(uses) == "number" and uses or 0) (uses or 0))
)
return newdesc return newdesc
end end
function toolranks.get_level(uses)
if uses <= 250 then
return 1
elseif uses < 500 then
return 2
elseif uses < 1000 then
return 3
elseif uses < 2500 then
return 4
elseif uses < 5000 then
return 5
elseif uses < 10000 then
return 6
elseif uses < 25000 then
return 7
elseif uses < 50000 then
return 8
elseif uses < 100000 then
return 9
else
return 10
end
end
function toolranks.new_afteruse(itemstack, user, node, digparams) function toolranks.new_afteruse(itemstack, user, node, digparams)
local itemmeta = itemstack:get_meta() local itemmeta = itemstack:get_meta() -- Metadata
local itemdef = itemstack:get_definition() local itemdef = itemstack:get_definition() -- Item Definition
local itemdesc = itemdef.original_description local itemdesc = itemdef.original_description -- Original Description
local dugnodes = tonumber(itemmeta:get_string("dug")) or 0 local dugnodes = tonumber(itemmeta:get_string("dug")) or 0 -- Number of nodes dug
local lastlevel = tonumber(itemmeta:get_string("lastlevel")) or 0 local lastlevel = tonumber(itemmeta:get_string("lastlevel")) or 1 -- Level the tool had
-- on the last dig
local most_digs = mod_storage:get_int("most_digs") or 0 local most_digs = mod_storage:get_int("most_digs") or 0
local most_digs_user = mod_storage:get_string("most_digs_user") or 0 local most_digs_user = mod_storage:get_string("most_digs_user") or 0
if digparams.wear > 0 then -- Only count nodes that spend the tool -- Only count nodes that spend the tool
dugnodes = dugnodes + 1 if(digparams.wear > 0) then
itemmeta:set_string("dug", dugnodes) dugnodes = dugnodes + 1
itemmeta:set_string("dug", dugnodes)
end end
if(dugnodes > most_digs) then
if dugnodes > most_digs then most_digs = dugnodes
if most_digs_user ~= user:get_player_name() then -- Avoid spam. if(most_digs_user ~= user:get_player_name()) then -- Avoid spam.
minetest.chat_send_all(S( most_digs_user = user:get_player_name()
"Most used tool is now a @1@2@3 owned by @4 with @5 uses.", minetest.chat_send_all(S("Most used tool is now a @1@2@3 owned by @4 with @5 uses.",
toolranks.colors.green, toolranks.colors.green,
itemdesc, itemdesc,
toolranks.colors.white, toolranks.colors.white,
user:get_player_name(), user:get_player_name(),
dugnodes dugnodes))
))
end end
mod_storage:set_int("most_digs", dugnodes) mod_storage:set_int("most_digs", dugnodes)
mod_storage:set_string("most_digs_user", user:get_player_name()) mod_storage:set_string("most_digs_user", user:get_player_name())
end end
if(itemstack:get_wear() > 60135) then
if itemstack:get_wear() > 60135 then
minetest.chat_send_player(user:get_player_name(), S("Your tool is about to break!")) minetest.chat_send_player(user:get_player_name(), S("Your tool is about to break!"))
minetest.sound_play("default_tool_breaks", { minetest.sound_play("default_tool_breaks", {
to_player = user:get_player_name(), to_player = user:get_player_name(),
gain = 2.0, gain = 2.0,
}) })
end end
local level = toolranks.get_level(dugnodes) local level = toolranks.get_level(dugnodes)
if lastlevel < level then if lastlevel < level then
local levelup_text = S( local levelup_text = S("Your @1@2@3 just leveled up!",
"Your @1@2@3 just leveled up!", toolranks.colors.green,
toolranks.colors.green, itemdesc,
itemdesc, toolranks.colors.white)
toolranks.colors.white
)
minetest.chat_send_player(user:get_player_name(), levelup_text)
minetest.sound_play("toolranks_levelup", { minetest.sound_play("toolranks_levelup", {
to_player = user:get_player_name(), to_player = user:get_player_name(),
gain = 2.0, gain = 2.0,
}) })
minetest.chat_send_player(user:get_player_name(), levelup_text)
local speed_multiplier = 1 + (level * level_multiplier * (max_speed - 1)) itemmeta:set_string("lastlevel", level)
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
itemmeta:set_string("lastlevel", level) local newdesc = toolranks.create_description(itemdesc, dugnodes, level)
itemmeta:set_string("description", toolranks.create_description(itemdesc, dugnodes))
itemstack:add_wear(digparams.wear) itemmeta:set_string("description", newdesc)
local wear = digparams.wear
if level > 1 then
wear = digparams.wear / (1 + level / 4)
end
--minetest.chat_send_all("wear="..wear.."Original wear: "..digparams.wear.." 1+level/4="..1+level/4)
-- Uncomment for testing ^
itemstack:add_wear(wear)
return itemstack return itemstack
end end
-- Helper function -- Helper function
function toolranks.add_tool(name) local function add_tool(name)
local desc = ItemStack(name):get_definition().description local desc = ItemStack(name):get_definition().description
minetest.override_item(name, { minetest.override_item(name, {
original_description = desc, original_description = desc,
description = toolranks.create_description(desc), description = toolranks.create_description(desc, 0, 1),
after_use = toolranks.new_afteruse after_use = toolranks.new_afteruse
}) })
end end
-- Sword -- Sword
toolranks.add_tool("default:sword_wood") add_tool("default:sword_wood")
toolranks.add_tool("default:sword_stone") add_tool("default:sword_stone")
toolranks.add_tool("default:sword_steel") add_tool("default:sword_steel")
toolranks.add_tool("default:sword_bronze") add_tool("default:sword_bronze")
toolranks.add_tool("default:sword_mese") add_tool("default:sword_mese")
toolranks.add_tool("default:sword_diamond") add_tool("default:sword_diamond")
-- Pickaxe -- Pickaxe
toolranks.add_tool("default:pick_wood") add_tool("default:pick_wood")
toolranks.add_tool("default:pick_stone") add_tool("default:pick_stone")
toolranks.add_tool("default:pick_steel") add_tool("default:pick_steel")
toolranks.add_tool("default:pick_bronze") add_tool("default:pick_bronze")
toolranks.add_tool("default:pick_mese") add_tool("default:pick_mese")
toolranks.add_tool("default:pick_diamond") add_tool("default:pick_diamond")
-- Axe -- Axe
toolranks.add_tool("default:axe_wood") add_tool("default:axe_wood")
toolranks.add_tool("default:axe_stone") add_tool("default:axe_stone")
toolranks.add_tool("default:axe_steel") add_tool("default:axe_steel")
toolranks.add_tool("default:axe_bronze") add_tool("default:axe_bronze")
toolranks.add_tool("default:axe_mese") add_tool("default:axe_mese")
toolranks.add_tool("default:axe_diamond") add_tool("default:axe_diamond")
-- Shovel -- Shovel
toolranks.add_tool("default:shovel_wood") add_tool("default:shovel_wood")
toolranks.add_tool("default:shovel_stone") add_tool("default:shovel_stone")
toolranks.add_tool("default:shovel_steel") add_tool("default:shovel_steel")
toolranks.add_tool("default:shovel_bronze") add_tool("default:shovel_bronze")
toolranks.add_tool("default:shovel_mese") add_tool("default:shovel_mese")
toolranks.add_tool("default:shovel_diamond") add_tool("default:shovel_diamond")
minetest.log("action", "[toolranks] loaded.")

View File

@ -1,8 +0,0 @@
# Number of tool levels
toolranks_levels (Levels) int 10
# Number of nodes that need to be dug to reach the next tool level
toolranks_level_digs (Digs per level) int 500
# Dig speed multiplier at maximum tool level (1.0 to disable)
toolranks_speed_multiplier (Dig speed multiplier) float 2.0 1.0 10.0
# Durability multiplier at maximum tool level (1.0 to disable)
toolranks_use_multiplier (Durability multiplier) float 2.0 1.0 10.0