515 lines
14 KiB
Lua
515 lines
14 KiB
Lua
local USES = 200
|
|
local color = '#FF6700'
|
|
local TechnicMaxCharge = 300000
|
|
|
|
chisel.materials = {}
|
|
chisel.mods = {}
|
|
chisel.selected = {}
|
|
chisel.active = {}
|
|
chisel.program = {}
|
|
chisel.mode = {}
|
|
|
|
|
|
|
|
|
|
local wehavetechnic = minetest.get_modpath("technic")
|
|
|
|
|
|
|
|
|
|
|
|
local default_material = {
|
|
{"default:cobble", "default_cobble", "Cobble"},
|
|
{"default:sandstone","default_sandstone", "Sandstone"},
|
|
{"default:clay","default_clay", "Clay"},
|
|
{"default:coalblock","default_coal_block", "Coal Block"},
|
|
{"default:stone","default_stone", "Stone"},
|
|
{"default:desert_stone","default_desert_stone", "Desert Stone"},
|
|
{"default:wood","default_wood", "Wood"},
|
|
{"default:acacia_wood","default_acacia_wood", "Acacia Wood"},
|
|
{"default:aspen_wood","default_aspen_wood", "Aspen Wood"},
|
|
{"default:pine_wood","default_pine_wood", "Pine Wood"},
|
|
{"default:desert_cobble","default_desert_cobble", "Desert Cobble"},
|
|
{"default:junglewood","default_junglewood", "Jungle Wood"},
|
|
{"default:sandstonebrick","default_sandstone_brick", "Sandstone Brick"},
|
|
{"default:stonebrick","default_stone_brick", "Stone Brick"},
|
|
{"default:desert_stonebrick","default_desert_stone_brick", "Desert Stone Brick"},
|
|
}
|
|
|
|
|
|
|
|
function chisel.register_node(modname, prefix, raw, design) -- global function to register new stuff
|
|
local counter = chisel.count_stuff() +1
|
|
chisel.materials [counter] = {}
|
|
chisel.materials [counter][1] = modname
|
|
chisel.materials [counter][2] = prefix
|
|
chisel.materials [counter][3] = raw
|
|
chisel.materials [counter][4] = design
|
|
end
|
|
|
|
|
|
function chisel.add_mod(modname,number) -- global function to init a new mod for the chisel.
|
|
local counter = chisel.count_mods() +1
|
|
chisel.mods [counter] = {}
|
|
chisel.mods [counter][1] = modname
|
|
chisel.mods [counter][2] = number
|
|
end
|
|
|
|
|
|
|
|
function chisel.count_stuff() -- how many materials have been registered already ?
|
|
local counter = 0
|
|
for i in ipairs (chisel.materials) do counter = counter +1 end
|
|
return counter
|
|
end
|
|
|
|
|
|
|
|
function chisel.count_mods() -- how many different mods are registered ?
|
|
|
|
local counter = 0
|
|
for i in ipairs (chisel.mods) do counter = counter +1 end
|
|
return counter
|
|
end
|
|
|
|
|
|
|
|
|
|
-- init chisel for each player joining
|
|
|
|
local function chiselinit(name)
|
|
chisel.selected[name] = 1
|
|
chisel.active[name] = "default"
|
|
chisel.program[name] = 1
|
|
chisel.mode[name] = "1"
|
|
end
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
chiselinit(player:get_player_name())
|
|
end)
|
|
|
|
-- end init
|
|
|
|
|
|
|
|
|
|
local function parti(pos)
|
|
minetest.add_particlespawner(25, 0.3,
|
|
pos, pos,
|
|
{x=2, y=0.2, z=2}, {x=-2, y=2, z=-2},
|
|
{x=0, y=-6, z=0}, {x=0, y=-10, z=0},
|
|
0.2, 1,
|
|
0.2, 2,
|
|
true, "mychisel_parti.png")
|
|
end
|
|
|
|
|
|
|
|
|
|
local function chiselcut(pos,user,node)
|
|
local name = user:get_player_name()
|
|
|
|
for i in ipairs (chisel.materials) do
|
|
|
|
if chisel.materials[i][1] == chisel.active[name] then
|
|
if node.name == chisel.materials[i][3] and chisel.materials[i][4] == chisel.materials[chisel.program[name]][4] then
|
|
|
|
minetest.set_node(pos, {name=chisel.materials[i][1]..":"..chisel.materials[i][2].."_"..chisel.materials[i][4], param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
local function change_mode(user, choice)
|
|
|
|
local name = user:get_player_name()
|
|
|
|
|
|
if choice then
|
|
if chisel.mode[name] == "1" then
|
|
chisel.mode[name] = "2"
|
|
minetest.chat_send_player(name,core.colorize(color, "Horizontal Groove"))
|
|
|
|
elseif chisel.mode[name] == "2" then
|
|
chisel.mode[name] = "3"
|
|
minetest.chat_send_player(name,core.colorize(color, "Vertical Groove"))
|
|
|
|
elseif chisel.mode[name] == "3" then
|
|
chisel.mode[name] = "4"
|
|
minetest.chat_send_player(name, core.colorize(color, "Cross Grooves"))
|
|
|
|
elseif chisel.mode[name] == "4" then
|
|
chisel.mode[name] = "5"
|
|
minetest.chat_send_player(name, core.colorize(color, "Square"))
|
|
|
|
elseif chisel.mode[name] == "5" then
|
|
chisel.mode[name] = "1"
|
|
minetest.chat_send_player(name, core.colorize(color, "Chisel 4 Edges"))
|
|
end
|
|
else
|
|
chisel.program[name] = chisel.program[name] +1
|
|
if chisel.program[name] > chisel.mods [chisel.selected[name]][2] then chisel.program[name] = 1 end
|
|
minetest.chat_send_player(name, core.colorize(color, chisel.materials [chisel.program[name]][4]))
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function chiselme(pos, user, node)
|
|
|
|
|
|
local name = user:get_player_name()
|
|
|
|
|
|
|
|
for i in ipairs (default_material) do
|
|
local item = default_material [i][1]
|
|
local mat = default_material [i][2]
|
|
local desc = default_material [i][3]
|
|
|
|
|
|
if chisel.mode[name] == "1" then
|
|
|
|
if node.name == item then
|
|
minetest.set_node(pos,{name = "mychisel:chiseled_"..mat.."1", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:chiseled_"..mat.."1" then
|
|
minetest.set_node(pos,{name = "mychisel:chiseled_"..mat.."2", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:chiseled_"..mat.."2" then
|
|
minetest.set_node(pos,{name = "mychisel:chiseled_"..mat.."3", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:chiseled_"..mat.."3" then
|
|
minetest.set_node(pos,{name = "mychisel:chiseled_"..mat.."4", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
if chisel.mode[name] == "2" then
|
|
|
|
if node.name == item then
|
|
minetest.set_node(pos,{name = "mychisel:horizontal_"..mat.."1", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:horizontal_"..mat.."1" then
|
|
minetest.set_node(pos,{name = "mychisel:horizontal_"..mat.."2", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:horizontal_"..mat.."2" then
|
|
minetest.set_node(pos,{name = "mychisel:horizontal_"..mat.."3", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:horizontal_"..mat.."3" then
|
|
minetest.set_node(pos,{name = "mychisel:horizontal_"..mat.."4", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if chisel.mode[name] == "3" then
|
|
|
|
if node.name == item then
|
|
minetest.set_node(pos,{name = "mychisel:vertical_"..mat.."1", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:vertical_"..mat.."1" then
|
|
minetest.set_node(pos,{name = "mychisel:vertical_"..mat.."2", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:vertical_"..mat.."2" then
|
|
minetest.set_node(pos,{name = "mychisel:vertical_"..mat.."3", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:vertical_"..mat.."3" then
|
|
minetest.set_node(pos,{name = "mychisel:vertical_"..mat.."4", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if chisel.mode[name] == "4" then
|
|
|
|
if node.name == item then
|
|
minetest.set_node(pos,{name = "mychisel:cross_"..mat.."1", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:cross_"..mat.."1" then
|
|
minetest.set_node(pos,{name = "mychisel:cross_"..mat.."2", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:cross_"..mat.."2" then
|
|
minetest.set_node(pos,{name = "mychisel:cross_"..mat.."3", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:cross_"..mat.."3" then
|
|
minetest.set_node(pos,{name = "mychisel:cross_"..mat.."4", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if chisel.mode[name] == "5" then
|
|
|
|
if node.name == item then
|
|
minetest.set_node(pos,{name = "mychisel:square_"..mat.."1", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:square_"..mat.."1" then
|
|
minetest.set_node(pos,{name = "mychisel:square_"..mat.."2", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:square_"..mat.."2" then
|
|
minetest.set_node(pos,{name = "mychisel:square_"..mat.."3", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
if node.name == "mychisel:square_"..mat.."3" then
|
|
minetest.set_node(pos,{name = "mychisel:square_"..mat.."4", param2=minetest.dir_to_facedir(user:get_look_dir())})
|
|
parti(pos)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
if not wehavetechnic then
|
|
|
|
minetest.register_tool( "mychisel:chisel",{
|
|
description = "Chisel",
|
|
inventory_image = "mychisel_chisel.png",
|
|
wield_image = "mychisel_chisel.png",
|
|
|
|
on_use = function(itemstack, user, pointed_thing)
|
|
|
|
if pointed_thing.type ~= "node" then
|
|
return
|
|
end
|
|
|
|
local pos = pointed_thing.under
|
|
local node = minetest.get_node(pos)local feedback = false
|
|
local name = user:get_player_name()
|
|
|
|
|
|
|
|
|
|
if minetest.is_protected(pos, user:get_player_name()) then
|
|
minetest.record_protection_violation(pos, user:get_player_name())
|
|
return
|
|
end
|
|
|
|
|
|
if chisel.active[name] == "default" then
|
|
chiselme(pos,user,node)
|
|
|
|
else
|
|
|
|
chiselcut(pos,user,node)
|
|
|
|
end
|
|
|
|
|
|
if not minetest.setting_getbool("creative_mode") then
|
|
itemstack:add_wear(65535 / (USES - 1))
|
|
end
|
|
|
|
return itemstack
|
|
|
|
end,
|
|
|
|
on_place = function(itemstack, user, pointed_thing)
|
|
|
|
|
|
local number = chisel.count_mods()
|
|
local keys = user:get_player_control()
|
|
local name = user:get_player_name()
|
|
|
|
|
|
|
|
-- change design mode of chisel by pressing sneak while right-clicking
|
|
if( not( keys["sneak"] )) then
|
|
if chisel.active[name] == "default" then
|
|
change_mode(user,true)
|
|
else
|
|
|
|
change_mode(user,false)
|
|
|
|
end
|
|
else
|
|
chisel.selected[name] = chisel.selected[name] +1
|
|
if chisel.selected[name] > chisel.count_mods() then chisel.selected[name] = 1 end
|
|
|
|
chisel.active[name] = chisel.mods[chisel.selected[name]][1]
|
|
minetest.chat_send_player(user:get_player_name(), core.colorize(color, " ***>>> switched to mod: "..chisel.active[name]))
|
|
|
|
end
|
|
|
|
return itemstack
|
|
|
|
end
|
|
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "mychisel:chisel",
|
|
recipe = {
|
|
{"default:steel_ingot"},
|
|
{"wool:brown"},
|
|
},
|
|
})
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
local S = technic.getter
|
|
|
|
technic.register_power_tool("mychisel:chisel",TechnicMaxCharge)
|
|
local chisel_charge_per_node =math.floor( TechnicMaxCharge / USES )
|
|
|
|
|
|
minetest.register_tool("mychisel:chisel", {
|
|
description = S("Chisel"),
|
|
inventory_image = "mychisel_chisel.png",
|
|
stack_max = 1,
|
|
wear_represents = "technic_RE_charge",
|
|
on_refill = technic.refill_RE_charge,
|
|
on_use = function(itemstack, user, pointed_thing)
|
|
|
|
|
|
if pointed_thing.type ~= "node" then
|
|
return
|
|
end
|
|
|
|
local pos = pointed_thing.under
|
|
local node = minetest.get_node(pos)
|
|
local name = user:get_player_name()
|
|
|
|
|
|
|
|
if minetest.is_protected(pos, user:get_player_name()) then
|
|
minetest.record_protection_violation(pos, user:get_player_name())
|
|
return
|
|
end
|
|
|
|
--
|
|
|
|
local meta = minetest.deserialize(itemstack:get_metadata())
|
|
if not meta or not meta.charge or
|
|
meta.charge < chisel_charge_per_node then
|
|
return
|
|
end
|
|
|
|
if chisel.active[name] == "default" then
|
|
chiselme(pos,user,node)
|
|
meta.charge = meta.charge - chisel_charge_per_node
|
|
else
|
|
|
|
chiselcut(pos,user,node)
|
|
meta.charge = meta.charge - chisel_charge_per_node
|
|
end
|
|
|
|
|
|
|
|
if not technic.creative_mode then
|
|
technic.set_RE_wear(itemstack, meta.charge, TechnicMaxCharge)
|
|
itemstack:set_metadata(minetest.serialize(meta))
|
|
end
|
|
|
|
return itemstack
|
|
|
|
|
|
end,
|
|
|
|
on_place = function(itemstack, user, pointed_thing)
|
|
|
|
local number = chisel.count_mods()
|
|
local keys = user:get_player_control()
|
|
local name = user:get_player_name()
|
|
|
|
|
|
|
|
-- change design mode of chisel by pressing sneak while right-clicking
|
|
if( not( keys["sneak"] )) then
|
|
if chisel.active[name] == "default" then
|
|
change_mode(user,true)
|
|
else
|
|
|
|
change_mode(user,false)
|
|
|
|
end
|
|
else
|
|
chisel.selected[name] = chisel.selected[name] +1
|
|
if chisel.selected[name] > chisel.count_mods() then chisel.selected[name] = 1 end
|
|
|
|
chisel.active[name] = chisel.mods[chisel.selected[name]][1]
|
|
minetest.chat_send_player(user:get_player_name(),core.colorize(color, " ***>>> switched to mod: "..chisel.active[name]))
|
|
|
|
end
|
|
|
|
return itemstack
|
|
|
|
end
|
|
})
|
|
|
|
|
|
minetest.register_craft({
|
|
output = "mychisel:chisel",
|
|
recipe = {
|
|
{"default:diamond", "default:diamond" , "default:diamond" },
|
|
{"", "technic:stainless_steel_ingot", ""},
|
|
{"", "technic:battery", ""},
|
|
}
|
|
})
|
|
|
|
|
|
|
|
end
|
|
|
|
chisel.add_mod("default",5) |