mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 01:05:48 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			583 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			583 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
--
 | 
						|
-- Tool definitions
 | 
						|
--
 | 
						|
 | 
						|
--[[ TOOLS SUMMARY:
 | 
						|
 | 
						|
Tool types:
 | 
						|
 | 
						|
* Hand: basic tool/weapon (special capabilities in creative mode)
 | 
						|
* Pickaxe: dig cracky
 | 
						|
* Axe: dig choppy
 | 
						|
* Shovel: dig crumbly
 | 
						|
* Shears: dig snappy
 | 
						|
* Sword: deal damage
 | 
						|
* Dagger: deal damage, but faster
 | 
						|
 | 
						|
Tool materials:
 | 
						|
 | 
						|
* Wood: dig nodes of rating 3
 | 
						|
* Stone: dig nodes of rating 3 or 2
 | 
						|
* Steel: dig nodes of rating 3, 2 or 1
 | 
						|
* Mese: dig "everything" instantly
 | 
						|
* n-Uses: can be used n times before breaking
 | 
						|
]]
 | 
						|
 | 
						|
-- The hand
 | 
						|
if core.settings:get_bool("creative_mode") then
 | 
						|
	local digtime = 42
 | 
						|
	local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256}
 | 
						|
 | 
						|
	core.register_item(":", {
 | 
						|
		type = "none",
 | 
						|
		wield_image = "wieldhand.png",
 | 
						|
		wield_scale = {x = 1, y = 1, z = 2.5},
 | 
						|
		range = 10,
 | 
						|
		tool_capabilities = {
 | 
						|
			full_punch_interval = 0.5,
 | 
						|
			max_drop_level = 3,
 | 
						|
			groupcaps = {
 | 
						|
				crumbly = caps,
 | 
						|
				cracky  = caps,
 | 
						|
				snappy  = caps,
 | 
						|
				choppy  = caps,
 | 
						|
				oddly_breakable_by_hand = caps,
 | 
						|
				-- dig_immediate group doesn't use value 1. Value 3 is instant dig
 | 
						|
				dig_immediate =
 | 
						|
					{times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256},
 | 
						|
			},
 | 
						|
			damage_groups = {fleshy = 10},
 | 
						|
		}
 | 
						|
	})
 | 
						|
else
 | 
						|
	core.register_item(":", {
 | 
						|
		type = "none",
 | 
						|
		wield_image = "wieldhand.png",
 | 
						|
		wield_scale = {x = 1, y = 1, z = 2.5},
 | 
						|
		tool_capabilities = {
 | 
						|
			full_punch_interval = 0.9,
 | 
						|
			max_drop_level = 0,
 | 
						|
			groupcaps = {
 | 
						|
				crumbly = {times = {[2] = 3.00, [3] = 0.70}, uses = 0, maxlevel = 1},
 | 
						|
				snappy = {times = {[3] = 0.40}, uses = 0, maxlevel = 1},
 | 
						|
				oddly_breakable_by_hand =
 | 
						|
					{times = {[1] = 3.50, [2] = 2.00, [3] = 0.70}, uses = 0}
 | 
						|
			},
 | 
						|
			damage_groups = {fleshy = 1},
 | 
						|
		}
 | 
						|
	})
 | 
						|
end
 | 
						|
 | 
						|
-- Mese Pickaxe: special tool that digs "everything" instantly
 | 
						|
core.register_tool("basetools:pick_mese", {
 | 
						|
	description = "Mese Pickaxe".."\n"..
 | 
						|
			"Digs diggable nodes instantly.",
 | 
						|
	inventory_image = "basetools_mesepick.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=3,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255},
 | 
						|
			crumbly={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255},
 | 
						|
			snappy={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255},
 | 
						|
			choppy={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255},
 | 
						|
			dig_immediate={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255},
 | 
						|
		},
 | 
						|
		damage_groups = {fleshy=100},
 | 
						|
	},
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
-- A variant of the mese pickaxe that is not affected by the 0.15s digging delay
 | 
						|
core.register_tool("basetools:pick_mese_no_delay", {
 | 
						|
	description = "Mese Pickaxe (no delay)".."\n"..
 | 
						|
			"Digs diggable nodes instantly.".."\n"..
 | 
						|
			"There is no delay between digging each node,\n"..
 | 
						|
			'but the "repeat_dig_time" setting is still respected.',
 | 
						|
	inventory_image = "basetools_mesepick_no_delay.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=3,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255},
 | 
						|
			crumbly={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255},
 | 
						|
			snappy={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255},
 | 
						|
			choppy={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255},
 | 
						|
			dig_immediate={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255},
 | 
						|
		},
 | 
						|
		damage_groups = {fleshy=100},
 | 
						|
	},
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
--
 | 
						|
-- Pickaxes: Dig cracky
 | 
						|
--
 | 
						|
 | 
						|
core.register_tool("basetools:pick_wood", {
 | 
						|
	description = "Wooden Pickaxe".."\n"..
 | 
						|
		"Digs cracky=3",
 | 
						|
	inventory_image = "basetools_woodpick.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[3]=2.00}, uses=30, maxlevel=0}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:pick_stone", {
 | 
						|
	description = "Stone Pickaxe".."\n"..
 | 
						|
		"Digs cracky=2..3",
 | 
						|
	inventory_image = "basetools_stonepick.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[2]=1.20, [3]=0.80}, uses=60, maxlevel=0}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:pick_steel", {
 | 
						|
	description = "Steel Pickaxe".."\n"..
 | 
						|
		"Digs cracky=1..3",
 | 
						|
	inventory_image = "basetools_steelpick.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=1,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=0}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:pick_steel_l1", {
 | 
						|
	description = "Steel Pickaxe Level 1".."\n"..
 | 
						|
		"Digs cracky=1..3".."\n"..
 | 
						|
		"maxlevel=1",
 | 
						|
	inventory_image = "basetools_steelpick_l1.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=1,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=1}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:pick_steel_l2", {
 | 
						|
	description = "Steel Pickaxe Level 2".."\n"..
 | 
						|
		"Digs cracky=1..3".."\n"..
 | 
						|
		"maxlevel=2",
 | 
						|
	inventory_image = "basetools_steelpick_l2.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=1,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=2}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
 | 
						|
--
 | 
						|
-- Shovels (dig crumbly)
 | 
						|
--
 | 
						|
 | 
						|
core.register_tool("basetools:shovel_wood", {
 | 
						|
	description = "Wooden Shovel".."\n"..
 | 
						|
		"Digs crumbly=3",
 | 
						|
	inventory_image = "basetools_woodshovel.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			crumbly={times={[3]=0.50}, uses=30, maxlevel=0}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:shovel_stone", {
 | 
						|
	description = "Stone Shovel".."\n"..
 | 
						|
		"Digs crumbly=2..3",
 | 
						|
	inventory_image = "basetools_stoneshovel.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			crumbly={times={[2]=0.50, [3]=0.30}, uses=60, maxlevel=0}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:shovel_steel", {
 | 
						|
	description = "Steel Shovel".."\n"..
 | 
						|
		"Digs crumbly=1..3",
 | 
						|
	inventory_image = "basetools_steelshovel.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=1,
 | 
						|
		groupcaps={
 | 
						|
			crumbly={times={[1]=1.00, [2]=0.70, [3]=0.60}, uses=90, maxlevel=0}
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
 | 
						|
--
 | 
						|
-- Axes (dig choppy)
 | 
						|
--
 | 
						|
 | 
						|
core.register_tool("basetools:axe_wood", {
 | 
						|
	description = "Wooden Axe".."\n"..
 | 
						|
		"Digs choppy=3",
 | 
						|
	inventory_image = "basetools_woodaxe.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			choppy={times={[3]=0.80}, uses=30, maxlevel=0},
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:axe_stone", {
 | 
						|
	description = "Stone Axe".."\n"..
 | 
						|
		"Digs choppy=2..3",
 | 
						|
	inventory_image = "basetools_stoneaxe.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			choppy={times={[2]=1.00, [3]=0.60}, uses=60, maxlevel=0},
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:axe_steel", {
 | 
						|
	description = "Steel Axe".."\n"..
 | 
						|
		"Digs choppy=1..3",
 | 
						|
	inventory_image = "basetools_steelaxe.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=1,
 | 
						|
		groupcaps={
 | 
						|
			choppy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=90, maxlevel=0},
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
 | 
						|
--
 | 
						|
-- Shears (dig snappy)
 | 
						|
--
 | 
						|
 | 
						|
core.register_tool("basetools:shears_wood", {
 | 
						|
	description = "Wooden Shears".."\n"..
 | 
						|
		"Digs snappy=3",
 | 
						|
	inventory_image = "basetools_woodshears.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			snappy={times={[3]=1.00}, uses=30, maxlevel=0},
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:shears_stone", {
 | 
						|
	description = "Stone Shears".."\n"..
 | 
						|
		"Digs snappy=2..3",
 | 
						|
	inventory_image = "basetools_stoneshears.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			snappy={times={[2]=1.00, [3]=0.50}, uses=60, maxlevel=0},
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
core.register_tool("basetools:shears_steel", {
 | 
						|
	description = "Steel Shears".."\n"..
 | 
						|
		"Digs snappy=1..3",
 | 
						|
	inventory_image = "basetools_steelshears.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=1,
 | 
						|
		groupcaps={
 | 
						|
			snappy={times={[1]=1.00, [2]=0.50, [3]=0.25}, uses=90, maxlevel=0},
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
 | 
						|
--
 | 
						|
-- Swords (deal damage)
 | 
						|
--
 | 
						|
 | 
						|
core.register_tool("basetools:sword_wood", {
 | 
						|
	description = "Wooden Sword".."\n"..
 | 
						|
		"Damage: fleshy=2",
 | 
						|
	inventory_image = "basetools_woodsword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		damage_groups = {fleshy=2},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_stone", {
 | 
						|
	description = "Stone Sword".."\n"..
 | 
						|
		"Damage: fleshy=5",
 | 
						|
	inventory_image = "basetools_stonesword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=0,
 | 
						|
		damage_groups = {fleshy=5},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_steel", {
 | 
						|
	description = "Steel Sword".."\n"..
 | 
						|
		"Damage: fleshy=10",
 | 
						|
	inventory_image = "basetools_steelsword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=1,
 | 
						|
		damage_groups = {fleshy=10},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_titanium", {
 | 
						|
	description = "Titanium Sword".."\n"..
 | 
						|
		"Damage: fleshy=100",
 | 
						|
	inventory_image = "basetools_titaniumsword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=1,
 | 
						|
		damage_groups = {fleshy=100},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_blood", {
 | 
						|
	description = "Blood Sword".."\n"..
 | 
						|
		"Damage: fleshy=1000",
 | 
						|
	inventory_image = "basetools_bloodsword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=1,
 | 
						|
		damage_groups = {fleshy=1000},
 | 
						|
	}
 | 
						|
})
 | 
						|
 | 
						|
-- Max. damage sword
 | 
						|
core.register_tool("basetools:sword_mese", {
 | 
						|
	description = "Mese Sword".."\n"..
 | 
						|
		"Damage: fleshy=32767, fiery=32767, icy=32767".."\n"..
 | 
						|
		"Full Punch Interval: 0.0s",
 | 
						|
	inventory_image = "basetools_mesesword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 0.0,
 | 
						|
		max_drop_level=1,
 | 
						|
		damage_groups = {fleshy=32767, fiery=32767, icy=32767},
 | 
						|
	}
 | 
						|
})
 | 
						|
 | 
						|
-- Fire/Ice sword: Deal damage to non-fleshy damage groups
 | 
						|
core.register_tool("basetools:sword_fire", {
 | 
						|
	description = "Fire Sword".."\n"..
 | 
						|
		"Damage: icy=10",
 | 
						|
	inventory_image = "basetools_firesword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=0,
 | 
						|
		damage_groups = {icy=10},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_ice", {
 | 
						|
	description = "Ice Sword".."\n"..
 | 
						|
		"Damage: fiery=10",
 | 
						|
	inventory_image = "basetools_icesword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=0,
 | 
						|
		damage_groups = {fiery=10},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_elemental", {
 | 
						|
	description = "Elemental Sword".."\n"..
 | 
						|
		"Damage: fiery=10, icy=10",
 | 
						|
	inventory_image = "basetools_elementalsword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		max_drop_level=0,
 | 
						|
		damage_groups = {fiery=10, icy=10},
 | 
						|
	}
 | 
						|
})
 | 
						|
 | 
						|
-- Healing weapons: heal HP
 | 
						|
core.register_tool("basetools:dagger_heal", {
 | 
						|
	description = "Healing Dagger".."\n"..
 | 
						|
		"Heal: fleshy=1".."\n"..
 | 
						|
		"Full Punch Interval: 0.5s",
 | 
						|
	inventory_image = "basetools_healdagger.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 0.5,
 | 
						|
		damage_groups = {fleshy=-1},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_heal", {
 | 
						|
	description = "Healing Sword".."\n"..
 | 
						|
		"Heal: fleshy=10",
 | 
						|
	inventory_image = "basetools_healsword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		damage_groups = {fleshy=-10},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:sword_heal_super", {
 | 
						|
	description = "Super Healing Sword".."\n"..
 | 
						|
		"Heal: fleshy=32768, fiery=32768, icy=32768",
 | 
						|
	inventory_image = "basetools_superhealsword.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 1.0,
 | 
						|
		damage_groups = {fleshy=-32768, fiery=-32768, icy=-32768},
 | 
						|
	}
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
--
 | 
						|
-- Dagger: Low damage, fast punch interval
 | 
						|
--
 | 
						|
core.register_tool("basetools:dagger_wood", {
 | 
						|
	description = "Wooden Dagger".."\n"..
 | 
						|
		"Damage: fleshy=1".."\n"..
 | 
						|
		"Full Punch Interval: 0.5s",
 | 
						|
	inventory_image = "basetools_wooddagger.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 0.5,
 | 
						|
		max_drop_level=0,
 | 
						|
		damage_groups = {fleshy=1},
 | 
						|
	}
 | 
						|
})
 | 
						|
core.register_tool("basetools:dagger_steel", {
 | 
						|
	description = "Steel Dagger".."\n"..
 | 
						|
		"Damage: fleshy=2".."\n"..
 | 
						|
		"Full Punch Interval: 0.5s",
 | 
						|
	inventory_image = "basetools_steeldagger.png",
 | 
						|
	tool_capabilities = {
 | 
						|
		full_punch_interval = 0.5,
 | 
						|
		max_drop_level=0,
 | 
						|
		damage_groups = {fleshy=2},
 | 
						|
	}
 | 
						|
})
 | 
						|
 | 
						|
-- Test tool uses, punch_attack_uses, and wear bar coloring
 | 
						|
local tool_params = {
 | 
						|
	{uses = 1},
 | 
						|
	{uses = 2},
 | 
						|
	{uses = 3},
 | 
						|
	{
 | 
						|
		uses = 5,
 | 
						|
		wear_color = "#5865f2",
 | 
						|
		wear_description = "Solid color: #5865f2",
 | 
						|
	},
 | 
						|
	{
 | 
						|
		uses = 10,
 | 
						|
		wear_color = "slateblue",
 | 
						|
		wear_description = "Solid color: slateblue",
 | 
						|
	},
 | 
						|
	{
 | 
						|
		uses = 50,
 | 
						|
		wear_color = {
 | 
						|
			color_stops = {
 | 
						|
				[0] = "red",
 | 
						|
				[0.5] = "yellow",
 | 
						|
				[1.0] = "blue"
 | 
						|
			},
 | 
						|
			blend = "linear"
 | 
						|
		},
 | 
						|
		wear_description = "Ranges from blue to yellow to red",
 | 
						|
	},
 | 
						|
	{
 | 
						|
		uses = 100,
 | 
						|
		wear_color = {
 | 
						|
			color_stops = {
 | 
						|
				[0] = "#ffff00",
 | 
						|
				[0.2] = "#ff00ff",
 | 
						|
				[0.3] = "#ffff00",
 | 
						|
				[0.45] = "#c0ffee",
 | 
						|
				[0.6] = {r=255, g=255, b=0, a=100}, -- continues until the end
 | 
						|
			},
 | 
						|
			blend = "constant"
 | 
						|
		},
 | 
						|
		wear_description = "Misc. colors, constant interpolation",
 | 
						|
	},
 | 
						|
	{uses = 1e3},
 | 
						|
	{uses = 1e4},
 | 
						|
	{uses = 65535},
 | 
						|
}
 | 
						|
 | 
						|
for i, params in ipairs(tool_params) do
 | 
						|
	local uses = params.uses
 | 
						|
	local ustring = uses.."-Use"..(uses == 1 and "" or "s")
 | 
						|
	local color = string.format("#FF00%02X", math.floor(((i-1)/#tool_params) * 255))
 | 
						|
	core.register_tool("basetools:pick_uses_"..string.format("%05d", uses), {
 | 
						|
		description = ustring.." Pickaxe".."\n"..
 | 
						|
			"Digs cracky=3"..
 | 
						|
			(params.wear_description and "\n".."Wear bar: " .. params.wear_description or ""),
 | 
						|
		inventory_image = "basetools_usespick.png^[colorize:"..color..":127",
 | 
						|
		tool_capabilities = {
 | 
						|
			max_drop_level=0,
 | 
						|
			groupcaps={
 | 
						|
				cracky={times={[3]=0.1, [2]=0.2, [1]=0.3}, uses=uses, maxlevel=0}
 | 
						|
			},
 | 
						|
		},
 | 
						|
		wear_color = params.wear_color
 | 
						|
	})
 | 
						|
 | 
						|
	core.register_tool("basetools:sword_uses_"..string.format("%05d", uses), {
 | 
						|
		description = ustring.." Sword".."\n"..
 | 
						|
			"Damage: fleshy=1",
 | 
						|
		inventory_image = "basetools_usessword.png^[colorize:"..color..":127",
 | 
						|
		tool_capabilities = {
 | 
						|
			damage_groups = {fleshy=1},
 | 
						|
			punch_attack_uses = uses,
 | 
						|
		},
 | 
						|
	})
 | 
						|
end
 | 
						|
 | 
						|
core.register_chatcommand("wear_color", {
 | 
						|
	params = "[idx]",
 | 
						|
	description = "Set wear bar color override",
 | 
						|
	func = function(player_name, param)
 | 
						|
		local player = core.get_player_by_name(player_name)
 | 
						|
		if not player then return end
 | 
						|
 | 
						|
		local wear_color = nil
 | 
						|
		local wear_desc = "Reset override"
 | 
						|
 | 
						|
		if param ~= "" then
 | 
						|
			local params = tool_params[tonumber(param)]
 | 
						|
			if not params then
 | 
						|
				return false, "idx out of bounds"
 | 
						|
			end
 | 
						|
			wear_color = params.wear_color
 | 
						|
			wear_desc = "Set override: "..(params.wear_description or "Default behavior")
 | 
						|
		end
 | 
						|
		local tool = player:get_wielded_item()
 | 
						|
		if tool:get_count() == 0 then
 | 
						|
			return false, "Tool not found"
 | 
						|
		end
 | 
						|
		tool:get_meta():set_wear_bar_params(wear_color)
 | 
						|
		player:set_wielded_item(tool)
 | 
						|
		return true, wear_desc
 | 
						|
	end
 | 
						|
})
 | 
						|
 | 
						|
-- Punch handler to set random color & wear
 | 
						|
local wear_on_use = function(itemstack, user, pointed_thing)
 | 
						|
	local meta = itemstack:get_meta()
 | 
						|
	local color = math.random(0, 0xFFFFFF)
 | 
						|
	local colorstr = string.format("#%06x", color)
 | 
						|
	meta:set_wear_bar_params(colorstr)
 | 
						|
	core.log("action", "[basetool] Wear bar color of "..itemstack:get_name().." changed to "..colorstr)
 | 
						|
	itemstack:set_wear(math.random(0, 65535))
 | 
						|
	return itemstack
 | 
						|
end
 | 
						|
 | 
						|
-- Place handler to clear item metadata color
 | 
						|
local wear_on_place = function(itemstack, user, pointed_thing)
 | 
						|
	local meta = itemstack:get_meta()
 | 
						|
	meta:set_wear_bar_params(nil)
 | 
						|
	return itemstack
 | 
						|
end
 | 
						|
 | 
						|
core.register_tool("basetools:random_wear_bar", {
 | 
						|
	description = "Wear Bar Color Test\n" ..
 | 
						|
			"Punch: Set random color & wear\n" ..
 | 
						|
			"Place: Clear color",
 | 
						|
	-- Base texture: A grayscale square (can be colorized)
 | 
						|
	inventory_image = "basetools_usespick.png^[colorize:#FFFFFF:127",
 | 
						|
	tool_capabilities = {
 | 
						|
		max_drop_level=0,
 | 
						|
		groupcaps={
 | 
						|
			cracky={times={[3]=0.1, [2]=0.2, [1]=0.3}, uses=1000, maxlevel=0}
 | 
						|
		},
 | 
						|
	},
 | 
						|
 | 
						|
	on_use = wear_on_use,
 | 
						|
	on_place = wear_on_place,
 | 
						|
	on_secondary_use = wear_on_place,
 | 
						|
})
 |