From b90bf738866d8bcea960c2001169658fcc8fd6a3 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Sat, 17 Aug 2019 16:09:25 +0300 Subject: [PATCH] start cauldrons --- cauldron.lua | 190 ++++++++++++++++++ init.lua | 3 + mod.conf | 2 +- textures/magicalities_cauldron.png | Bin 0 -> 831 bytes textures/magicalities_cauldron_with_water.png | Bin 0 -> 2432 bytes wands.lua | 37 +++- 6 files changed, 220 insertions(+), 12 deletions(-) create mode 100644 cauldron.lua create mode 100644 textures/magicalities_cauldron.png create mode 100644 textures/magicalities_cauldron_with_water.png diff --git a/cauldron.lua b/cauldron.lua new file mode 100644 index 0000000..5c7afec --- /dev/null +++ b/cauldron.lua @@ -0,0 +1,190 @@ + +local _fldlib = minetest.get_modpath("fluid_lib") ~= nil + +magicalities.cauldron = { + recipes = { + { + items = {"default:coal_lump 9"}, + requirements = { + earth = 5 + }, + output = "default:diamond" + } + } +} + +local function flatten_stacks(stacks) + local temp = {} + for _, stack in pairs(stacks) do + local name = stack:get_name() + if not temp[name] then + temp[name] = stack:get_count() + else + temp[name] = temp[name] + stack:get_count() + end + end + + local stacks_new = {} + for name,count in pairs(temp) do + table.insert(stacks_new, ItemStack(name .. " " .. count)) + end + + return stacks_new +end + +local function get_recipe(items_found, wand) + local match = {} + for _,r in pairs(magicalities.cauldron.recipes) do + local pass = true + for _,item in pairs(r.items) do + local found = false + for _,item2 in pairs(items_found) do + local i1 = ItemStack(item) + local i2 = ItemStack(item2) + if i1:get_name() == i2:get_name() and i2:get_count() >= i1:get_count() then + found = true + break + end + end + if not found then + pass = false + break + end + end + if pass then + table.insert(match,r) + end + end + + if #match == 0 then return nil end + local fulfilled = {} + for _,a in pairs(match) do + if magicalities.wands.wand_has_contents(wand, a.requirements) then + table.insert(fulfilled, a) + end + end + + if #fulfilled == 0 then return nil end + return fulfilled[1] +end + +-- Return a list of items dropped into the cauldron +local function sample_items(pos, pickup) + local items = {} + for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if object:get_luaentity().itemstring ~= "" then + table.insert(items, object:get_luaentity().itemstring) + end + if pickup then + object:get_luaentity().itemstring = "" + object:remove() + end + end + end + if #items == 0 then return nil end + return items +end + +local _clddef = { + description = "Cauldron", + tiles = {"magicalities_cauldron.png"}, + groups = {cracky = 2, cauldron = 1}, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.4375, -0.4375, 0.4375, -0.3125, 0.4375}, + {-0.375, -0.5, -0.375, -0.25, -0.4375, -0.25}, + {0.25, -0.5, 0.25, 0.375, -0.4375, 0.375}, + {0.25, -0.5, -0.375, 0.375, -0.4375, -0.25}, + {-0.375, -0.5, 0.25, -0.25, -0.4375, 0.375}, + {-0.4375, -0.3125, -0.4375, 0.4375, 0.5, -0.3125}, + {-0.4375, -0.3125, 0.3125, 0.4375, 0.5, 0.4375}, + {-0.4375, -0.3125, -0.3125, -0.3125, 0.5, 0.3125}, + {0.3125, -0.3125, -0.3125, 0.4375, 0.5, 0.3125}, + } + }, + on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("items", 8) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if node.name ~= "magicalities:cauldron" then return itemstack end + if itemstack:get_name() == "bucket:bucket_water" and not _fldlib then + node.name = "magicalities:cauldron_with_water" + minetest.swap_node(pos, node) + return ItemStack("bucket:bucket_empty") + end + return itemstack + end, + _wand_use = function (pos, node, itemstack, user, pointed_thing) + if not user or user:get_player_name() == "" then return itemstack end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stacks = flatten_stacks(inv:get_list("items")) + local recipe = get_recipe(stacks, itemstack) + + if user:get_player_control().sneak then + inv:set_list("items", {}) + node.name = "magicalities:cauldron" + minetest.swap_node(pos, node) + return itemstack + end + + if not recipe then return itemstack end + + for _,st in pairs(recipe.items) do + for _,sta in pairs(stacks) do + if sta:get_name() == st then + sta:take_item(ItemStack(st):get_count()) + end + end + end + + --inv:set_list("items", stacks) + inv:set_list("items", {}) + node.name = "magicalities:cauldron" + minetest.swap_node(pos, node) + minetest.item_drop(ItemStack(recipe.output), user, user:get_pos()) + itemstack = magicalities.wands.wand_take_contents(itemstack, recipe.requirements) + magicalities.wands.update_wand_desc(itemstack) + + return itemstack + end +} + +local _clddefw = table.copy(_clddef) +_clddefw.groups.not_in_creative_inventory = 1 +_clddefw.drop = "magicalities:cauldron" +_clddefw.tiles = {"magicalities_cauldron_with_water.png", "magicalities_cauldron.png", "magicalities_cauldron.png", + "magicalities_cauldron.png", "magicalities_cauldron.png", "magicalities_cauldron.png"} +table.insert(_clddefw.node_box.fixed, {-0.3125, -0.3125, -0.3125, 0.3125, 0.375, 0.3125}) + +minetest.register_node("magicalities:cauldron", _clddef) +minetest.register_node("magicalities:cauldron_with_water", _clddefw) + +minetest.register_abm({ + label = "Cauldron", + interval = 1, + chance = 1, + --name = "magicalities:cauldron_insert", + nodenames = {"magicalities:cauldron_with_water"}, + neighbors = {"group:igniter"}, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local pickup = sample_items(pos, true) + if not pickup then return end + for _,i in pairs(pickup) do + local stack = ItemStack(i) + if inv:room_for_item("items", stack) then + inv:add_item("items", stack) + else + minetest.item_drop(stack, "", vector.add(pos, {x=0,y=1,z=0})) + end + end + end +}) \ No newline at end of file diff --git a/init.lua b/init.lua index 3ec7005..3d16064 100644 --- a/init.lua +++ b/init.lua @@ -37,5 +37,8 @@ dofile(modpath.."/craftitems.lua") -- Scanner dofile(modpath.."/scanner.lua") +-- Cauldron +dofile(modpath.."/cauldron.lua") + -- Register dofile(modpath.."/register.lua") diff --git a/mod.conf b/mod.conf index 9b448fb..5d850c7 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,4 @@ name = magicalities description = Magic mod. depends = default -optional_depends = craftguide +optional_depends = craftguide,fluid_lib diff --git a/textures/magicalities_cauldron.png b/textures/magicalities_cauldron.png new file mode 100644 index 0000000000000000000000000000000000000000..26cabea2dd2f6d1595aedd55c8980eef02a976af GIT binary patch literal 831 zcmV-F1Hk-=P)EX>4Tx04R}tkv&MmKp2MKwn~ds6zm}4kfAzR5f#x*t5Adrp;ls5OimEM7-^F;Acio?(TgjOW@Cn4TOgAjz4dSUy zOXs{#9AQOCAwDM_G3bKCk6f2se&bwl*v~T~MmjZ593d78Z7jDjD;g^CBym(xHOlvA zTvj-5aaPM!*1RWwVK}F)EOVXKAQD)_5=01)QAG)5ScuWCkzyi6=W!4Jfa4d*C6lWJ zMvetkph9x|;D7MDw`P7~+)WC{fzB7({uly+yFjC6+uz5w-8caP&%l+|@>lA>^e5@H zmKHq%dbWX!>y{?(0hc>K|C25mk|PCZ`SW?;{fxdT3-sLrU2AUNn&&uu0MgW}%jmdfQ2+n{24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jd735HL8`5Ax3d000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0003NNkl8pXY_ z)Ij0-*j}$!OClmLGpY(Rqq~U+T7vuk^Z7(2ekvIebT?x)x;ySpL{L=#bT`~!BZADt z%oulncQeckb>o0kbb}<^ozJf%% zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1Y;((5P;{Ld-o2uSS5VXc}Q%<-oI;W*BhS8o=( zViOQrx+P)N|N3*NKX5TcudEBvC+{^bn{48YLDc)o>q*+Kr~J`p@HVfm1;&)Y+w8y5 z%Y4T?L!M>6ik^&lcT<$QER^?!EQ&aafn!k&8QKPP6Gd4R85YZS|1V-wJT2=Ge8M=gwgI>`w>EN``&>DS-v6s3%J7N1A*0umx0ePXm}D~E z5l@1}Il~wm0`jn->KU*?5vby)B$3+BO+zurI2 zlRJtYv@Y&$mVLY|zs*yffV?hs=$pSWS{$SA=(6<)*-KC-lr@4}nP{zD9(T}QAqgV} z^G>)U%Az8dny$Lwu9S#DRh;W``31q_gL+~6czloiN94Z}9}1X`l(cu%7l8mo*$@da>$(ga!7I^<8V5jm8d zan?EKU2xGQm%Z_`!n_ZDcGVnAu)zf%LWnA)kfVtBme zJ@q`0YQqdW-0&l)5l0&NVohlMxc>obB&_jbY6^ynHOz)^RM2cEZgK|3*b)d2U=55R zu_tFblC?aUo1E#ys0zn$(oJ$2O~$~W?Zj@-#hoyxfa3qcn+kF9#{ZQ$HL3ee=017* ziM2M5=eii%WjI0A2Guv%XO4NEl*Kx-=Z`}Fy~0?^py2y<lA5|%FS(fyV(9FT4+X*$smzlCt5ALk{9 zV?MSumsSs)!$eUWqMDpqVuN$QX;Pk4eV}_JLfAG#b2N;1c88X0y2x~CJA=KnM-k`U zc56nFkNXehiaGi%hH6iHZ|M#hWwvOFFD~;JBuybDJBuEv(B5HV4T~RVnfIQQ*p)3h z5!!Md4T3h2pkHD#IL9A3Ow~0((1wQ6JM&i-)Ds;5Q}6lLD+|fl^l;_+<)D7A515xy zj4Gcs?pvC*6Y}dTA56@GfvqEZdRCQh>PuD!P`df`lV5r)zfx%kwaT6~n~t}|Y|N2* znLO#kMe{y`K)|G!(P7B&aEk5l>Gkms{YoWLP6J$kQ z4B0)x7nF;qZlxgccb>Ukfij)zDcE#H3Jc#|)c+`7c+z;Wk@=Qx{5QFkw59*b|A6(^cx%6y- zy5(IWpQqT_%U_ke;*t`%HO%%rjS@eIo5ug{HVv$G#x2Dj7XOKAS< z=Mp~2lKLCcRQI$ozaCBi00D(*LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~N##VQpM zJBT<0sk&GY6>-!m6rn<>6nNgNw7S4z7YA_yOYL>ZIr* zCH^ldw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dt5dgfL?TB2%|Eyj5$e)qviOz zhmWs!5uVlh+@GUc%~%ZZiNv$aFm2)u;^|G>;Ji;9VtH95J|`YC>4LwAiI9>Klt6Pm7SdMl7dm7{l#%U zhJlVAEysMlDdlD00)P_NRG1CTf95a+}por>izuya^-TTuf!Kq z00006VoOIv04M+`04NI?U>E=Z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;|LK6 zBpn&<4o3h002y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00F>BL_t(I z%Vm>IcH1xvgg*e3ti)-PRS(dO@6n6(3cXeD(p3`2&$37YU653rS8l{d0fV2Jk<;lE z?v9xuBGg(D5h4OJBiy0C9}Wk+I=L2-84*DmfvSqCVrJA@0f-3bV9AV93L--4@ex51 z5j+9~+$#~_?x-sFr@A8||A6~90SGN={qc+EV@rIyILU-%hV!LBEl_U&JpTT0000