123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582 |
- --
- -- 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,
- })
|