@@ -8,11 +8,11 @@ -- do not show recipes for items in these groups exclude_groups = { }; exclude_names = { - '_stairs'; - '_slab'; - 'slope_'; + 'stairs'; + 'slab'; + 'slope'; }; -- do not show recipes from this namespace blacklist_mods = { 'group'; -- WHY IS THIS NECESSARY @@ -19,8 +19,22 @@ 'moreblocks'; -- too much noise }; recipes_per_cookbook_page = 3; + + group_ids = { + wood = { caption = 'Any Wood', cnitem = 'default:wood' }; + tree = { caption = 'Any Tree', cnitem = 'default:tree' }; + leaves = { caption = 'Any Leaves', cnitem = 'default:leaves' }; + stone = { caption = 'Any Stone', cnitem = 'default:stone' }; + dye = { caption = 'Any Dye', cnitem = 'dye:black' }; + bone = { caption = 'Any Bone', cnitem = 'bonemeal:bone' }; + vessel = { caption = 'Any Bottle', cnitem = 'vessels:glass_bottle' }; + flower = { caption = 'Any Flower', cnitem = 'flowers:rose' }; + mushroom = { caption = 'Any Mushroom', cnitem = 'flowers:mushroom_brown' }; + water_bucket = { caption = 'Water Bucket', cnitem = 'bucket:bucket_water' }; + sorcery_ley_cable = { caption = 'Cable', cnitem = 'sorcery:cable_vidrium' }; + }; } local slot3x3 = { {0,0}, {1,0}, {2,0}; @@ -46,13 +60,13 @@ local rec = minetest.get_craft_recipe(k) if rec.items ~= nil and (rec.method == kind or (rec.method == 'shapeless' and kind == 'normal')) then -- is this last bit necessary? local excluded = false for _,n in pairs(constants.exclude_names) do - if string.find(p,n) then + if string.find(k,n) ~= nil then excluded = true break end end if not excluded then for _,g in pairs(constants.exclude_groups) do - if minetest.get_item_group(p, g) > 0 then + if minetest.get_item_group(k, g) > 0 then excluded = true break end end end local props = minetest.registered_items[k]._sorcery local module = modofname(k) @@ -80,10 +94,33 @@ end end return rec end -local desc_builtin = function(i) - local desc = minetest.registered_items[i].description +local function group_eval(i) + if string.sub(i,1,6) == 'group:' then + local g = string.sub(i,7) + if constants.group_ids[g] then + return constants.group_ids[g].cnitem, + constants.group_ids[g].caption + end + for i,v in pairs(minetest.registered_items) do + if minetest.get_item_group(i, g) > 0 then + return i, v.description + end + end + return i + end + return i +end +local function desc_builtin(i) + local desc + i, desc = group_eval(i) + -- print('describing ',i,dump(minetest.registered_items[i])) + if not minetest.registered_items[i] then + minetest.log('WARNING: unknown item in recipe ' .. i) + return 'Unknown Item' + end + if not desc then desc = minetest.registered_items[i].description end if not desc then return 'Peculiar Item' end local eol = string.find(desc,'\n') if not eol then return desc else return string.sub(desc,1,eol-1) end @@ -267,9 +304,9 @@ if k.indesc then tt = k.indesc(ingredients[i]) else tt = desc_builtin(ingredients[i]) end t = t .. string.format([[ item_image[%f,%f;1,1;%s] tooltip[%f,%f;1,1;%s] - ]], x,y, minetest.formspec_escape(ingredients[i]), + ]], x,y, minetest.formspec_escape(group_eval(ingredients[i])), x,y, minetest.formspec_escape(tt)) else if k.drawslots == nil or k.drawslots then t = string.format('box[%f,%f;0.1,0.1;#00000060]',x+0.45,y+0.45) .. t @@ -339,17 +376,11 @@ chance = 0.9; count = {1,7}; } -minetest.register_craft { type = 'fuel', recipe = 'sorcery:recipe', burntime = 3 } -minetest.register_craft { - type = 'cooking'; - recipe = 'sorcery:recipe'; - output = 'sorcery:ash'; - cooktime = 3; -} - default.register_craft_metadata_copy('default:paper','sorcery:recipe') +-- this seems bugged; it doesn't like it when its item shows up in another +-- recipe. so we'll do it manually :/ -- default.register_craft_metadata_copy('default:book','sorcery:cookbook') for i=1,8 do local rcp = {} @@ -361,8 +392,16 @@ type = 'shapeless', recipe = rcp, output = 'sorcery:cookbook'; } end +minetest.register_craft { + type = 'shapeless'; + recipe = { + 'sorcery:cookbook'; + 'default:book'; + }; + output = 'sorcery:cookbook'; +}; local m = sorcery.lib.marshal local encbook, decbook = m.transcoder { pages = m.g.array(8, m.g.struct { @@ -462,17 +501,32 @@ bookform(stack,user) end) minetest.register_on_craft(function(stack,player,grid,inv) + -- god this is messy. i'm sorry. minetest made me do it if stack:get_name() ~= 'sorcery:cookbook' then return nil end local oldbook local topic, onetopic = nil, true local recipes = {} - for _,s in pairs(grid) do + local copybook = false + local obindex + for i,s in pairs(grid) do if s:get_name() == 'sorcery:recipe' then recipes[#recipes+1] = s - elseif s:get_name() == 'sorcery:cookbook' then oldbook = s end + elseif s:get_name() == 'default:book' then copybook = true + elseif s:get_name() == 'sorcery:cookbook' then oldbook = s obindex = i end + end + + if #recipes == 0 and copybook and oldbook then + inv:set_stack('craft',obindex,oldbook) + local newmeta = stack:get_meta() + local copy = function(field) + newmeta:set_string(field,oldbook:get_meta():get_string(field)) + end + copy('cookbook') copy('description') + newmeta:set_string('owner',player:get_player_name()) + return stack end oldbook = oldbook or stack local bookmeta = oldbook:get_meta() @@ -497,13 +551,11 @@ bookmeta:set_string('description',namebook(topic,player:get_player_name())) bookmeta:set_string('owner',player:get_player_name()) end - print('new book',bookmeta:get_string('description')) - print('new book',dump(book)) bookmeta:set_string('cookbook', sorcery.lib.str.meta_armor(encbook(book),true)) return oldbook end) if minetest.get_modpath('books') then -- make our own placeable cookbook somehow end