123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- ---------------------------------------------------------------------------------------
- -- simple anvil that can be used to repair tools
- ---------------------------------------------------------------------------------------
- -- * can be used to repair tools
- -- * the hammer gets dammaged a bit at each repair step
- ---------------------------------------------------------------------------------------
- -- License of the hammer picture: CC-by-SA; done by GloopMaster; source:
- -- https://github.com/GloopMaster/glooptest/blob/master/glooptest/textures/glooptest_tool_steelhammer.png
- local S = cottages.S
- -- disable repair with anvil by setting a message for the item in question
- cottages.forbid_repair = {}
- -- example for hammer no longer beeing able to repair the hammer
- --cottages.forbid_repair["cottages:hammer"] = 'The hammer is too complex for repairing.'
- -- the hammer for the anvil
- minetest.register_tool("cottages:hammer", {
- description = S("Steel hammer for repairing tools on the anvil"),
- image = "glooptest_tool_steelhammer.png",
- inventory_image = "glooptest_tool_steelhammer.png",
- tool_capabilities = {
- full_punch_interval = 0.8,
- max_drop_level=1,
- groupcaps={
- -- about equal to a stone pick (it's not intended as a tool)
- cracky={times={[2]=2.00, [3]=1.20}, uses=30, maxlevel=1},
- },
- damage_groups = {fleshy=6},
- }
- })
- local cottages_anvil_formspec =
- "size[8,8]"..
- "image[7,3;1,1;glooptest_tool_steelhammer.png]"..
- -- "list[current_name;sample;0,0.5;1,1;]"..
- "list[current_name;input;2.5,1.5;1,1;]"..
- -- "list[current_name;material;5,0;3,3;]"..
- "list[current_name;hammer;5,3;1,1;]"..
- -- "label[0.0,0.0;Sample:]"..
- -- "label[0.0,1.0;(Receipe)]"..
- "label[2.5,1.0;"..S("Workpiece:").."]"..
- -- "label[6.0,-0.5;Materials:]"..
- "label[6.0,2.7;"..S("Optional").."]"..
- "label[6.0,3.0;"..S("storage for").."]"..
- "label[6.0,3.3;"..S("your hammer").."]"..
- "label[0,-0.5;"..S("Anvil").."]"..
- "label[0,3.0;"..S("Punch anvil with hammer to").."]"..
- "label[0,3.3;"..S("repair tool in workpiece-slot.").."]"..
- "list[current_player;main;0,4;8,4;]";
- minetest.register_node("cottages:anvil", {
- drawtype = "nodebox",
- description = S("anvil"),
- tiles = {"cottages_stone.png"}, -- TODO default_steel_block.png, default_obsidian.png are also nice
- paramtype = "light",
- paramtype2 = "facedir",
- groups = {cracky=2},
- -- the nodebox model comes from realtest
- node_box = {
- type = "fixed",
- fixed = {
- {-0.5,-0.5,-0.3,0.5,-0.4,0.3},
- {-0.35,-0.4,-0.25,0.35,-0.3,0.25},
- {-0.3,-0.3,-0.15,0.3,-0.1,0.15},
- {-0.35,-0.1,-0.2,0.35,0.1,0.2},
- },
- },
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5,-0.5,-0.3,0.5,-0.4,0.3},
- {-0.35,-0.4,-0.25,0.35,-0.3,0.25},
- {-0.3,-0.3,-0.15,0.3,-0.1,0.15},
- {-0.35,-0.1,-0.2,0.35,0.1,0.2},
- }
- },
- on_construct = function(pos)
- local meta = minetest.get_meta(pos);
- meta:set_string("infotext", S("Anvil"));
- local inv = meta:get_inventory();
- inv:set_size("input", 1);
- -- inv:set_size("material", 9);
- -- inv:set_size("sample", 1);
- inv:set_size("hammer", 1);
- meta:set_string("formspec", cottages_anvil_formspec );
- end,
- after_place_node = function(pos, placer)
- local meta = minetest.get_meta(pos);
- meta:set_string("owner", placer:get_player_name() or "");
- meta:set_string("infotext", S("Anvil (owned by %s)"):format((meta:get_string("owner") or "")));
- meta:set_string("formspec",
- cottages_anvil_formspec,
- "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]");
- end,
- can_dig = function(pos,player)
- local meta = minetest.get_meta(pos);
- local inv = meta:get_inventory();
- local owner = meta:get_string('owner');
- if( not( inv:is_empty("input"))
- -- or not( inv:is_empty("material"))
- -- or not( inv:is_empty("sample"))
- or not( inv:is_empty("hammer"))
- or not( player )
- or ( owner and owner ~= '' and player:get_player_name() ~= owner )) then
- return false;
- end
- return true;
- end,
- allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
- local meta = minetest.get_meta(pos)
- if( player and player:get_player_name() ~= meta:get_string('owner' ) and from_list~="input") then
- return 0
- end
- return count;
- end,
- allow_metadata_inventory_put = function(pos, listname, index, stack, player)
- local meta = minetest.get_meta(pos)
- if( player and player:get_player_name() ~= meta:get_string('owner' ) and listname~="input") then
- return 0;
- end
- if( listname=='hammer' and stack and stack:get_name() ~= 'cottages:hammer') then
- return 0;
- end
- if( listname=='input'
- and( stack:get_wear() == 0
- or stack:get_name() == "technic:water_can"
- or stack:get_name() == "technic:lava_can" )) then
- minetest.chat_send_player( player:get_player_name(),
- S('The workpiece slot is for damaged tools only.'));
- return 0;
- end
- if( listname=='input'
- and cottages.forbid_repair[ stack:get_name() ]) then
- minetest.chat_send_player( player:get_player_name(),
- S(cottages.forbid_repair[ stack:get_name() ]));
- return 0;
- end
- return stack:get_count()
- end,
- allow_metadata_inventory_take = function(pos, listname, index, stack, player)
- local meta = minetest.get_meta(pos)
- if( player and player:get_player_name() ~= meta:get_string('owner' ) and listname~="input") then
- return 0
- end
- return stack:get_count()
- end,
- on_punch = function(pos, node, puncher)
- if( not( pos ) or not( node ) or not( puncher )) then
- return;
- end
- -- only punching with the hammer is supposed to work
- local wielded = puncher:get_wielded_item();
- if( not( wielded ) or not( wielded:get_name() ) or wielded:get_name() ~= 'cottages:hammer') then
- return;
- end
- local name = puncher:get_player_name();
- local meta = minetest.get_meta(pos);
- local inv = meta:get_inventory();
- local input = inv:get_stack('input',1);
- -- only tools can be repaired
- if( not( input )
- or input:is_empty()
- or input:get_name() == "technic:water_can"
- or input:get_name() == "technic:lava_can" ) then
- meta:set_string("formspec",
- cottages_anvil_formspec,
- "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]");
- return;
- end
- -- 65535 is max damage
- local damage_state = 40-math.floor(input:get_wear()/1638);
- -- just to make sure that it really can't get repaired if it should not
- -- (if the check of placing the item in the input slot failed somehow)
- if( puncher and name and cottages.forbid_repair[ input:get_name() ]) then
- minetest.chat_send_player( name,
- S(cottages.forbid_repair[ input:get_name() ]));
- return;
- end
- local tool_name = input:get_name();
- local hud_image = "";
- if( tool_name
- and minetest.registered_items[ tool_name ] ) then
- if( minetest.registered_items[ tool_name ].inventory_image ) then
- hud_image = minetest.registered_items[ tool_name ].inventory_image;
- elseif( minetest.registered_items[ tool_name ].textures
- and type(minetest.registered_items[ tool_name ].textures)=='table') then
- hud_image = minetest.registered_items[ tool_name ].textures[1];
- elseif( minetest.registered_items[ tool_name ].textures
- and type(minetest.registered_items[ tool_name ].textures)=='string') then
- hud_image = minetest.registered_items[ tool_name ].textures;
- end
- end
-
- local hud1 = puncher:hud_add({
- hud_elem_type = "image",
- scale = {x = 15, y = 15},
- text = hud_image,
- position = {x = 0.5, y = 0.5},
- alignment = {x = 0, y = 0}
- });
- local hud2 = nil;
- local hud3 = nil;
- if( input:get_wear()>0 ) then
- hud2 = puncher:hud_add({
- hud_elem_type = "statbar",
- text = "default_cloud.png^[colorize:#ff0000:256",
- number = 40,
- direction = 0, -- left to right
- position = {x=0.5, y=0.65},
- alignment = {x = 0, y = 0},
- offset = {x = -320, y = 0},
- size = {x=32, y=32},
- })
- hud3 = puncher:hud_add({
- hud_elem_type = "statbar",
- text = "default_cloud.png^[colorize:#00ff00:256",
- number = damage_state,
- direction = 0, -- left to right
- position = {x=0.5, y=0.65},
- alignment = {x = 0, y = 0},
- offset = {x = -320, y = 0},
- size = {x=32, y=32},
- });
- end
- minetest.after(2, function()
- if( puncher ) then
- if(hud1) then puncher:hud_remove(hud1); end
- if(hud2) then puncher:hud_remove(hud2); end
- if(hud3) then puncher:hud_remove(hud3); end
- end
- end)
- -- tell the player when the job is done
- if( input:get_wear() == 0 ) then
- -- minetest.chat_send_player( puncher:get_player_name(),
- -- S('Your tool has been repaired successfully.'));
- return;
- end
- -- do the actual repair
- input:add_wear( -5000 ); -- equals to what technic toolshop does in 5 seconds
- inv:set_stack("input", 1, input)
- -- damage the hammer slightly
- wielded:add_wear( 100 );
- puncher:set_wielded_item( wielded );
- -- do not spam too much
- -- if( math.random( 1,5 )==1 ) then
- -- minetest.chat_send_player( puncher:get_player_name(),
- -- S('Your workpiece improves.'));
- -- end
- end,
- is_ground_content = false,
- })
- ---------------------------------------------------------------------------------------
- -- crafting receipes
- ---------------------------------------------------------------------------------------
- minetest.register_craft({
- output = "cottages:anvil",
- recipe = {
- {cottages.craftitem_steel,cottages.craftitem_steel,cottages.craftitem_steel},
- {'', cottages.craftitem_steel,'' },
- {cottages.craftitem_steel,cottages.craftitem_steel,cottages.craftitem_steel} },
- })
- -- the castle-mod has an anvil as well - with the same receipe. convert the two into each other
- if ( minetest.get_modpath("castle") ~= nil ) then
- minetest.register_craft({
- output = "cottages:anvil",
- recipe = {
- {'castle:anvil'},
- },
- })
- minetest.register_craft({
- output = "castle:anvil",
- recipe = {
- {'cottages:anvil'},
- },
- })
- end
- minetest.register_craft({
- output = "cottages:hammer",
- recipe = {
- {cottages.craftitem_steel},
- {'cottages:anvil'},
- {cottages.craftitem_stick} }
- })
|