stain.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. local function set_wear(itemstack, level, max_level)
  2. local temp
  3. if level == 0 then
  4. temp = 0
  5. else
  6. temp = 65536 - math.floor(level / max_level * 65535)
  7. if temp > 65535 then temp = 65535 end
  8. if temp < 1 then temp = 1 end
  9. end
  10. itemstack:set_wear(temp)
  11. end
  12. local function get_wear(itemstack)
  13. if itemstack:get_metadata() == "" then
  14. return 30
  15. else
  16. return tonumber(itemstack:get_metadata())
  17. end
  18. end
  19. local stain_table = {
  20. {'Golden Oak', '1', 32, '#cc7431'},
  21. {'Country Pine', '2', 64, '#b76126'},
  22. {'Cinnamon', '3', 96, '#9c4a1b'},
  23. {'Cherry', '4', 128, '#873a14'},
  24. {'Mahogany', '5', 160, '#712b0d'},
  25. {'Walnut', '6', 192, '#5b1e07'},
  26. {'Black', '7', 224, '#461404'}
  27. }
  28. for i in ipairs (stain_table) do
  29. local desc = stain_table[i][1]
  30. local name = stain_table[i][2]
  31. local indx = stain_table[i][3]
  32. local colo = stain_table[i][4]
  33. minetest.register_tool('furniture:stain_brush'..name, {
  34. description = desc..' Stain brush',
  35. inventory_image = 'furniture_brush.png^(furniture_brush_overlay.png^[colorize:'..colo..':255)',
  36. stack_max = 1,
  37. wear_represents = 'content_level',
  38. groups = {stain_brush=1},
  39. on_use = function(itemstack, user, pointed_thing)
  40. if pointed_thing.type ~= 'node' then return end
  41. local player_name = user:get_player_name()
  42. local pos = minetest.get_pointed_thing_position(pointed_thing)
  43. if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(user, 'protection_bypass') then
  44. return
  45. end
  46. local node = minetest.get_node(pos)
  47. if minetest.get_item_group(node.name, 'stainable') > 0 then
  48. --local mod = string.sub(node.name, 1, 9)
  49. --if mod == 'furniture' then
  50. local fdir = node.param2 % 32
  51. local stain = get_wear(itemstack)
  52. if stain == 0 then
  53. itemstack:set_name('furniture:brush')
  54. return itemstack end
  55. if node.param2 == (fdir + indx) then
  56. local player = user:get_player_name()
  57. minetest.chat_send_player(player, "Already stained this color.")
  58. return
  59. elseif node.param2 >= (fdir + indx) then
  60. local player = user:get_player_name()
  61. minetest.chat_send_player(player, "You can only stain things darker.")
  62. return end
  63. minetest.swap_node(pos, {name = node.name, param2 = fdir + indx})
  64. stain = stain - 1
  65. itemstack:set_metadata(tostring(stain))
  66. set_wear(itemstack, stain, 30)
  67. return itemstack
  68. else
  69. local player = user:get_player_name()
  70. minetest.chat_send_player(player, "You can't stain that item.")
  71. end
  72. end,
  73. })
  74. end
  75. minetest.register_tool('furniture:sanding', {
  76. description = 'Sanding pad',
  77. inventory_image = 'furniture_sanding.png',
  78. stack_max = 1,
  79. wear_represents = 'content_level',
  80. on_use = function(itemstack, user, pointed_thing)
  81. if pointed_thing.type ~= 'node' then return end
  82. local player_name = user:get_player_name()
  83. local pos = minetest.get_pointed_thing_position(pointed_thing)
  84. if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(user, 'protection_bypass') then
  85. return
  86. end
  87. local node = minetest.get_node(pos)
  88. if minetest.get_item_group(node.name, 'stainable') > 0 then
  89. --local mod = string.sub(node.name, 1, 9)
  90. --if mod == 'furniture' then
  91. local fdir = node.param2 % 32
  92. if node.param2 == fdir then
  93. local player = user:get_player_name()
  94. minetest.chat_send_player(player, "Already sanded.")
  95. return end
  96. minetest.swap_node(pos, {name = node.name, param2 = fdir})
  97. itemstack:add_wear(65535 / 48)
  98. return itemstack
  99. else
  100. local player = user:get_player_name()
  101. minetest.chat_send_player(player, "You can't sand that item.")
  102. end
  103. end,
  104. })