This commit is contained in:
Milan2018 2021-05-16 18:16:47 +02:00
parent 5f61268cb0
commit 29d57bc728
9 changed files with 222 additions and 238 deletions

13
toolranks/.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,13 @@
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 ./

18
toolranks/.luacheckrc Normal file
View File

@ -0,0 +1,18 @@
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,14 +1,27 @@
# minetest-toolranks # minetest-toolranks [toolranks]
Minetest tool ranks mod Minetest tool ranks mod
Tool gains levels for digging nodes. Higher level tools take longer to Tools gain levels for digging nodes. Higher level tools dig faster and take longer to wear out.
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, check if it is loaded with If so, to support this mod, add this code to your mod, after your tool's code:
```minetest.get_modpath("toolranks")```
and then replace all after_use definitions with toolranks.new_afteruse. ```lua
Optionaly, you can also replace tools description with if minetest.get_modpath("toolranks") then
```toolranks.create_description("Tool Name", 0, 1)``` minetest.override_item("mymod:mytool", {
and then set original_description to your tools name. original_description = "My Tool",
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")
```

View File

@ -1,2 +1 @@
default default
moreores?

View File

@ -1,4 +1,5 @@
local mod_storage = minetest.get_mod_storage() local mod_storage = minetest.get_mod_storage()
local S = minetest.get_translator("toolranks")
toolranks = {} toolranks = {}
@ -9,270 +10,178 @@ 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 string.find(description, "Pickaxe") then if not description then
return "pickaxe"
elseif string.find(description, "Axe") then
return "axe"
elseif string.find(description, "Shovel") then
return "shovel"
elseif string.find(description, "Hoe") then
return "hoe"
else
return "tool" return "tool"
else
local d = string.lower(description)
if string.find(d, "pickaxe") then
return "pickaxe"
elseif string.find(d, "axe") then
return "axe"
elseif string.find(d, "shovel") then
return "shovel"
elseif string.find(d, "hoe") then
return "hoe"
elseif string.find(d, "sword") then
return "sword"
else
return "tool"
end
end end
end end
function toolranks.create_description(name, uses, level)
local description = name
local tooltype = toolranks.get_tool_type(description)
local newdesc = toolranks.colors.green .. description .. "\n" ..
toolranks.colors.gold .. "Level " .. (level or 1) .. " " .. tooltype .. "\n" ..
toolranks.colors.grey .. "Nodes dug: " .. (uses or 0)
return newdesc
end
function toolranks.get_level(uses) function toolranks.get_level(uses)
if uses <= 200 then if type(uses) == "number" and uses > 0 then
return 1 return math.min(max_level, math.floor(uses / level_digs))
elseif uses < 400 then
return 2
elseif uses < 1000 then
return 3
elseif uses < 2000 then
return 4
elseif uses < 3200 then
return 5
else
return 6
end end
return 0
end
function toolranks.create_description(name, uses)
local description = name
local tooltype = toolranks.get_tool_type(description)
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),
S(tooltype),
toolranks.colors.grey,
(type(uses) == "number" and uses or 0)
)
return newdesc
end end
function toolranks.new_afteruse(itemstack, user, node, digparams) function toolranks.new_afteruse(itemstack, user, node, digparams)
local itemmeta = itemstack:get_meta() -- Metadata local itemmeta = itemstack:get_meta()
local itemdef = itemstack:get_definition() -- Item Definition local itemdef = itemstack:get_definition()
local itemdesc = itemdef.original_description -- Original Description local itemdesc = itemdef.original_description or ""
local dugnodes = tonumber(itemmeta:get_string("dug")) or 0 -- Number of nodes dug local dugnodes = tonumber(itemmeta:get_string("dug")) or 0
local lastlevel = tonumber(itemmeta:get_string("lastlevel")) or 1 -- Level the tool had local lastlevel = tonumber(itemmeta:get_string("lastlevel")) or 0
-- 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
local pname = user:get_player_name()
-- Only count nodes that spend the tool if not pname then return itemstack end -- player nil check
if(digparams.wear > 0) then
dugnodes = dugnodes + 1 if digparams.wear > 0 then -- Only count nodes that spend the tool
itemmeta:set_string("dug", dugnodes) dugnodes = dugnodes + 1
itemmeta:set_string("dug", dugnodes)
end end
if(dugnodes > most_digs) then
most_digs = dugnodes if dugnodes > most_digs then
if(most_digs_user ~= user:get_player_name()) then -- Avoid spam. if most_digs_user ~= pname then -- Avoid spam.
most_digs_user = user:get_player_name() minetest.chat_send_all(S(
minetest.chat_send_all("Most used tool is now a " .. toolranks.colors.green .. itemdesc "Most used tool is now a @1@2@3 owned by @4 with @5 uses.",
.. toolranks.colors.white .. " owned by " .. user:get_player_name() toolranks.colors.green,
.. " with " .. dugnodes .. " uses.") itemdesc,
toolranks.colors.white,
pname,
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", pname)
end end
if(itemstack:get_wear() > 60135) then
minetest.chat_send_player(user:get_player_name(), "Your tool is about to break!") if itemstack:get_wear() > 60135 then
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 = pname,
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 = "Your " .. toolranks.colors.green .. local levelup_text = S(
itemdesc .. toolranks.colors.white .. "Your @1@2@3 just leveled up!",
" just leveled up!" toolranks.colors.green,
itemdesc,
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 = pname,
gain = 2.0, gain = 2.0,
}) })
minetest.chat_send_player(user:get_player_name(), levelup_text) -- Make tool better by modifying tool_capabilities (if defined)
itemmeta:set_string("lastlevel", level) 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 end
local newdesc = toolranks.create_description(itemdesc, dugnodes, level) -- Old method for compatibility with tools without tool_capabilities defined
itemmeta:set_string("description", newdesc)
local wear = digparams.wear local wear = digparams.wear
if level > 1 then if level > 0 and not itemdef.tool_capabilities then
wear = digparams.wear / (1 + level / 4) local use_multiplier = 1 + (level * level_multiplier * (max_use - 1))
wear = wear / use_multiplier
end end
--minetest.chat_send_all("wear="..wear.."Original wear: "..digparams.wear.." 1+level/4="..1+level/4) itemmeta:set_string("lastlevel", level)
-- Uncomment for testing ^ itemmeta:set_string("description", toolranks.create_description(itemdesc, dugnodes))
itemstack:add_wear(wear) itemstack:add_wear(wear)
return itemstack return itemstack
end end
minetest.override_item("default:pick_diamond", { -- Helper function
original_description = "Diamond Pickaxe", function toolranks.add_tool(name)
description = toolranks.create_description("Diamond Pickaxe", 0, 1), local desc = ItemStack(name):get_definition().description
after_use = toolranks.new_afteruse}) minetest.override_item(name, {
original_description = desc,
minetest.override_item("default:axe_diamond", { description = toolranks.create_description(desc),
original_description = "Diamond Axe", after_use = toolranks.new_afteruse
description = toolranks.create_description("Diamond Axe", 0, 1), })
after_use = toolranks.new_afteruse})
minetest.override_item("default:shovel_diamond", {
original_description = "Diamond Shovel",
description = toolranks.create_description("Diamond Shovel", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:pick_wood", {
original_description = "Wooden Pickaxe",
description = toolranks.create_description("Wooden Pickaxe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:axe_wood", {
original_description = "Wooden Axe",
description = toolranks.create_description("Wooden Axe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:shovel_wood", {
original_description = "Wooden Shovel",
description = toolranks.create_description("Wooden Shovel", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:pick_steel", {
original_description = "Steel Pickaxe",
description = toolranks.create_description("Steel Pickaxe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:axe_steel", {
original_description = "Steel Axe",
description = toolranks.create_description("Steel Axe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:shovel_steel", {
original_description = "Steel Shovel",
description = toolranks.create_description("Steel Shovel", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:pick_stone", {
original_description = "Stone Pickaxe",
description = toolranks.create_description("Stone Pickaxe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:axe_stone", {
original_description = "Stone Axe",
description = toolranks.create_description("Stone Axe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:shovel_stone", {
original_description = "Stone Shovel",
description = toolranks.create_description("Stone Shovel", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:pick_bronze", {
original_description = "Bronze Pickaxe",
description = toolranks.create_description("Bronze Pickaxe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:axe_bronze", {
original_description = "Bronze Axe",
description = toolranks.create_description("Bronze Axe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:shovel_bronze", {
original_description = "Bronze Shovel",
description = toolranks.create_description("Bronze Shovel", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:pick_mese", {
original_description = "Mese Pickaxe",
description = toolranks.create_description("Mese Pickaxe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:axe_mese", {
original_description = "Mese Axe",
description = toolranks.create_description("Mese Axe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:shovel_mese", {
original_description = "Mese Shovel",
description = toolranks.create_description("Mese Shovel", 0, 1),
after_use = toolranks.new_afteruse})
if minetest.get_modpath("moreores") then
minetest.override_item("moreores:pick_mithril", {
original_description = "Mithril Pickaxe",
description = toolranks.create_description("Mithril Pickaxe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("moreores:axe_mithril", {
original_description = "Mithril Axe",
description = toolranks.create_description("Mithril Axe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("moreores:shovel_mithril", {
original_description = "Mithril Shovel",
description = toolranks.create_description("Mithril Shovel", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("moreores:sword_mithril", {
original_description = "Mithril Sword",
description = toolranks.create_description("Mithril Sword", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("moreores:pick_silver", {
original_description = "Silver Pickaxe",
description = toolranks.create_description("Silver Pickaxe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("moreores:axe_silver", {
original_description = "Silver Axe",
description = toolranks.create_description("Silver Axe", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("moreores:shovel_silver", {
original_description = "Silver Shovel",
description = toolranks.create_description("Silver Shovel", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("moreores:sword_silver", {
original_description = "Silver Sword",
description = toolranks.create_description("Silver Sword", 0, 1),
after_use = toolranks.new_afteruse})
end end
-- add swords for snappy nodes -- Sword
minetest.override_item("default:sword_wood", { toolranks.add_tool("default:sword_wood")
original_description = "Wooden Sword", toolranks.add_tool("default:sword_stone")
description = toolranks.create_description("Wooden Sword", 0, 1), toolranks.add_tool("default:sword_steel")
after_use = toolranks.new_afteruse}) toolranks.add_tool("default:sword_bronze")
toolranks.add_tool("default:sword_mese")
toolranks.add_tool("default:sword_diamond")
minetest.override_item("default:sword_stone", { -- Pickaxe
original_description = "Stone Sword", toolranks.add_tool("default:pick_wood")
description = toolranks.create_description("Stone Sword", 0, 1), toolranks.add_tool("default:pick_stone")
after_use = toolranks.new_afteruse}) toolranks.add_tool("default:pick_steel")
toolranks.add_tool("default:pick_bronze")
toolranks.add_tool("default:pick_mese")
toolranks.add_tool("default:pick_diamond")
minetest.override_item("default:sword_steel", { -- Axe
original_description = "Steel Sword", toolranks.add_tool("default:axe_wood")
description = toolranks.create_description("Steel Sword", 0, 1), toolranks.add_tool("default:axe_stone")
after_use = toolranks.new_afteruse}) toolranks.add_tool("default:axe_steel")
toolranks.add_tool("default:axe_bronze")
toolranks.add_tool("default:axe_mese")
toolranks.add_tool("default:axe_diamond")
minetest.override_item("default:sword_bronze", { -- Shovel
original_description = "Bronze Sword", toolranks.add_tool("default:shovel_wood")
description = toolranks.create_description("Bronze Sword", 0, 1), toolranks.add_tool("default:shovel_stone")
after_use = toolranks.new_afteruse}) toolranks.add_tool("default:shovel_steel")
toolranks.add_tool("default:shovel_bronze")
minetest.override_item("default:sword_mese", { toolranks.add_tool("default:shovel_mese")
original_description = "Mese Sword", toolranks.add_tool("default:shovel_diamond")
description = toolranks.create_description("Mese Sword", 0, 1),
after_use = toolranks.new_afteruse})
minetest.override_item("default:sword_diamond", {
original_description = "Diamond Sword",
description = toolranks.create_description("Diamond Sword", 0, 1),
after_use = toolranks.new_afteruse})

View File

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

View File

@ -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.=Loutil 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 !

2
toolranks/mod.conf Normal file
View File

@ -0,0 +1,2 @@
name = toolranks
depends = default

View File

@ -0,0 +1,8 @@
# 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