diff --git a/maidroid/api.lua b/maidroid/api.lua index 4ae488d..c377aee 100644 --- a/maidroid/api.lua +++ b/maidroid/api.lua @@ -22,6 +22,10 @@ maidroid.registered_maidroids = {} -- definitions of core registered by maidroid.register_core. maidroid.registered_cores = {} +-- maidroid.registered_eggs represents a table that contains +-- definition of egg registered by maidroid.register_egg. +maidroid.registered_eggs = {} + -- maidroid.is_core reports whether a item is a core item by the name. function maidroid.is_core(item_name) if maidroid.registered_cores[item_name] then @@ -139,7 +143,7 @@ end function maidroid.maidroid.move_main_to_wield(self, itemname) local inv = self:get_inventory() local main_size = inv:get_size("main") - + for i = 1, main_size do local stack = inv:get_stack("main", i) if stack:get_name() == itemname then @@ -209,7 +213,7 @@ end) minetest.register_craftitem("maidroid:dummy_empty_craftitem", { wield_image = "maidroid_dummy_empty_craftitem.png", }) - + local function on_activate(self, staticdata) -- attach to the nearest maidroid. local all_objects = minetest.get_objects_inside_radius(self.object:getpos(), 0.1) @@ -271,10 +275,29 @@ function maidroid.register_core(core_name, def) }) end +-- maidroid.register_egg registers a definition of a new egg. +function maidroid.register_egg(egg_name, def) + maidroid.registered_eggs[egg_name] = def + + minetest.register_craftitem(egg_name, { + description = def.description, + inventory_image = def.inventory_image, + stack_max = 1, + + on_use = function(item_stack, user, pointed_thing) + if pointed_thing.above ~= nil and def.product_name ~= nil then + minetest.add_entity(pointed_thing.above, def.product_name) + return itemstack + end + return nil + end, + }) +end + -- maidroid.register_maidroid registers a definition of a new maidroid. function maidroid.register_maidroid(product_name, def) maidroid.registered_maidroids[product_name] = def - + -- initialize manufacturing number of a new maidroid. if maidroid.manufacturing_data[product_name] == nil then maidroid.manufacturing_data[product_name] = 0 @@ -523,18 +546,10 @@ function maidroid.register_maidroid(product_name, def) move_main_to_wield = maidroid.maidroid.move_main_to_wield, }) - -- register a spawner for debugging maidroid mods. - minetest.register_craftitem(product_name .. "_spawner", { - description = product_name .. " spawner", - inventory_image = def.inventory_image, - stack_max = 1, - - on_use = function(item_stack, user, pointed_thing) - if pointed_thing.above ~= nil then - minetest.add_entity(pointed_thing.above, product_name) - return itemstack - end - return nil - end, + -- register maidroid egg. + maidroid.register_egg(product_name .. "_egg", { + description = product_name .. " egg", + inventory_image = def.egg_image, + product_name = product_name, }) end diff --git a/maidroid/register.lua b/maidroid/register.lua index 600f373..11f84c0 100644 --- a/maidroid/register.lua +++ b/maidroid/register.lua @@ -3,26 +3,33 @@ -- https://github.com/tacigar/maidroid ------------------------------------------------------------ -maidroid.register_maidroid("maidroid:maidroid_mk1", { - hp_max = 10, - weight = 20, - mesh = "maidroid.b3d", - textures = {"maidroid_mk1.png"}, - inventory_image = "maidroid_mk1_spawner.png", +maidroid.register_egg("maidroid:empty_egg", { + description = "Empty Egg", + inventory_image = "maidroid_empty_egg.png", }) +maidroid.register_maidroid("maidroid:maidroid_mk1", { + hp_max = 10, + weight = 20, + mesh = "maidroid.b3d", + textures = {"maidroid_mk1.png"}, + egg_image = "maidroid_maidroid_mk1_egg.png", +}) + +--[[ maidroid.register_maidroid("maidroid:maidroid_mk2", { - hp_max = 10, - weight = 20, - mesh = "maidroid.b3d", - textures = {"maidroid_mk2.png"}, - inventory_image = "maidroid_mk2_spawner.png", + hp_max = 10, + weight = 20, + mesh = "maidroid.b3d", + textures = {"maidroid_mk2.png"}, + egg_image = "maidroid_mk2_egg.png", }) maidroid.register_maidroid("maidroid:maidroid_mk3", { - hp_max = 10, - weight = 20, - mesh = "maidroid.b3d", - textures = {"maidroid_mk3.png"}, - inventory_image = "maidroid_mk3_spawner.png", + hp_max = 10, + weight = 20, + mesh = "maidroid.b3d", + textures = {"maidroid_mk3.png"}, + egg_image = "maidroid_mk3_egg.png", }) +]]-- diff --git a/maidroid/textures/maidroid_empty_egg.png b/maidroid/textures/maidroid_empty_egg.png new file mode 100644 index 0000000..1307019 Binary files /dev/null and b/maidroid/textures/maidroid_empty_egg.png differ diff --git a/maidroid/textures/maidroid_empty_egg.xcf b/maidroid/textures/maidroid_empty_egg.xcf new file mode 100644 index 0000000..5644bde Binary files /dev/null and b/maidroid/textures/maidroid_empty_egg.xcf differ diff --git a/maidroid/textures/maidroid_maidroid_mk1_egg.png b/maidroid/textures/maidroid_maidroid_mk1_egg.png new file mode 100644 index 0000000..cb97f9a Binary files /dev/null and b/maidroid/textures/maidroid_maidroid_mk1_egg.png differ diff --git a/maidroid/textures/maidroid_maidroid_mk1_egg.xcf b/maidroid/textures/maidroid_maidroid_mk1_egg.xcf new file mode 100644 index 0000000..82237fa Binary files /dev/null and b/maidroid/textures/maidroid_maidroid_mk1_egg.xcf differ diff --git a/maidroid_tool/api.lua b/maidroid_tool/api.lua new file mode 100644 index 0000000..12e1eb0 --- /dev/null +++ b/maidroid_tool/api.lua @@ -0,0 +1,214 @@ +------------------------------------------------------------ +-- Copyright (c) 2016 tacigar. All rights reserved. +-- https://github.com/tacigar/maidroid +------------------------------------------------------------ + +maidroid_tool.shared = {} + +-- maidroid_tool.shared.generate_writer is a shared +-- function called for registering egg writer and core writer. +function maidroid_tool.register_writer(nodename, options) + local description = options.description + local formspec = options.formspec + local tiles = options.tiles + local node_box = options.node_box + local selection_box = options.selection_box + local duration = options.duration + local on_activate = options.on_activate + local on_deactivate = options.on_deactivate + local empty_itemname = options.empty_itemname + local dye_item_map = options.dye_item_map + local is_mainitem = options.is_mainitem + local on_metadata_inventory_put_to_main = options.on_metadata_inventory_put_to_main + local on_metadata_inventory_take_from_main = options.on_metadata_inventory_take_from_main + + -- can_dig is a common callback. + local function can_dig(pos, player) + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() + return ( + inventory:is_empty("main") and + inventory:is_empty("fuel") and + inventory:is_empty("dye") + ) + end + + -- swap_node is a helper function that swap two nodes. + local function swap_node(pos, name) + local node = minetest.get_node(pos) + node.name = name + minetest.swap_node(pos, node) + end + + -- on_timer is a common callback. + local function on_timer(pos, elapsed) + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() + local main_list = inventory:get_list("main") + local fuel_list = inventory:get_list("fuel") + local dye_list = inventory:get_list("dye") + + local time = meta:get_float("time") + local output = meta:get_string("output") + + -- if time is positive, this node is active. + if time >= 0 then + if time <= duration then + meta:set_float("time", time + 1) + meta:set_string("formspec", formspec.active(time)) + else + meta:set_float("time", -1) + meta:set_string("output", "") + meta:set_string("formspec", formspec.inactive) + inventory:set_stack("main", 1, ItemStack(output)) + + swap_node(pos, nodename) + + if on_deactivate ~= nil then -- call on_deactivate callback. + on_deactivate(pos) + end + end + else + local main_name = main_list[1]:get_name() + + if main_name == empty_itemname and (not fuel_list[1]:is_empty()) and (not dye_list[1]:is_empty()) then + meta:set_string("time", 0) + meta:set_string("output", dye_item_map[dye_list[1]:get_name()]) + + local fuel_stack = fuel_list[1] + fuel_stack:take_item() + inventory:set_stack("fuel", 1, fuel_stack) + + local dye_stack = dye_list[1] + dye_stack:take_item() + inventory:set_stack("dye", 1, dye_stack) + + swap_node(pos, nodename .. "_active") + + if on_activate ~= nil then -- call on_activate callback. + on_activate(pos) + end + end + end + return true -- on_timer should return boolean value. + end + + -- allow_metadata_inventory_put is a common callback. + local function allow_metadata_inventory_put(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() + local itemname = stack:get_name() + + if (listname == "fuel" and itemname == "default:coal_lump") then + return stack:get_count() + elseif listname == "dye" and dye_item_map[itemname] ~= nil then + return stack:get_count() + elseif listname == "main" and itemname == empty_itemname then + return stack:get_count() + end + return 0 + end + + -- allow_metadata_inventory_move is a common callback for the node. + local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() + local stack = inventory:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, listname, to_index, stack, player) + end + + do -- register a definition of an inactive node. + local function on_construct(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec.inactive) + meta:set_string("output", "") + meta:set_string("time", -1) + + local inventory = meta:get_inventory() + inventory:set_size("main", 1) + inventory:set_size("fuel", 1) + inventory:set_size("dye", 1) + end + + local function on_metadata_inventory_put(pos, listname, index, stack, player) + local timer = minetest.get_node_timer(pos) + timer:start(0.25) + + local meta = minetest.get_meta(pos) + if listname == "main" then + if on_metadata_inventory_put_to_main ~= nil then + on_metadata_inventory_put_to_main(pos) -- call on_metadata_inventory_put_to_main callback. + end + end + end + + local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() + local stack = inventory:get_stack(from_list, from_index) + + on_metadata_inventory_put(pos, listname, to_index, stack, player) + end + + local function on_metadata_inventory_take(pos, listname, index, stack, player) + if listname == "main" then + if on_metadata_inventory_take_from_main ~= nil then + on_metadata_inventory_take_from_main(pos) -- call on_metadata_inventory_take_from_main callback. + end + end + end + + local function allow_metadata_inventory_take(pos, listname, index, stack, player) + return stack:get_count() -- maybe add more. + end + + minetest.register_node(nodename, { + description = description, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = node_box, + selection_box = selection_box, + tiles = tiles.inactive, + can_dig = can_dig, + on_timer = on_timer, + on_construct = on_construct, + on_metadata_inventory_put = on_metadata_inventory_put, + on_metadata_inventory_move = on_metadata_inventory_move, + on_metadata_inventory_take = on_metadata_inventory_take, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + }) + + end -- end register inactive node. + + do -- register a definition of an active node. + local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if listname == "main" then + return 0 + end + return stack:get_count() + end + + minetest.register_node(nodename .. "_active", { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = node_box, + selection_box = selection_box, + tiles = tiles.active, + can_dig = can_dig, + on_timer = on_timer, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + }) + end -- end register active node. +end diff --git a/maidroid_tool/core_writer.lua b/maidroid_tool/core_writer.lua index 1476920..3047939 100644 --- a/maidroid_tool/core_writer.lua +++ b/maidroid_tool/core_writer.lua @@ -3,12 +3,12 @@ -- https://github.com/tacigar/maidroid ------------------------------------------------------------ -local dye_core_map = { - ["dye:red"] = "maidroid_core:basic", -} +do -- register core writer + + local dye_item_map = { + ["dye:red"] = "maidroid_core:basic", + } --- register a definition of a core writer. -;(function() local node_box = { type = "fixed", fixed = { @@ -28,243 +28,62 @@ local dye_core_map = { }, } - local formspec_inactive = "size[8,9]" - .. default.gui_bg - .. default.gui_bg_img - .. default.gui_slots - .. "label[3.75,0;Core]" - .. "list[current_name;core;3.5,0.5;1,1;]" - .. "label[2.75,2;Coal]" - .. "list[current_name;fuel;2.5,2.5;1,1;]" - .. "label[4.75,2;Dye]" - .. "list[current_name;dye;4.5,2.5;1,1;]" - .. "image[3.5,1.5;1,2;maidroid_tool_gui_arrow.png]" - .. "image[3.1,3.5;2,1;maidroid_tool_gui_meter.png^[transformR270]" - .. "list[current_player;main;0,5;8,1;]" - .. "list[current_player;main;0,6.2;8,3;8]" - - local function generate_formspec_active(writing_time) - local arrow_percent = (100 / 40) * writing_time - - local merter_percent = 0 - if writing_time % 16 >= 8 then - meter_percent = (8 - (writing_time % 8)) * (100 / 8) - else - meter_percent = (writing_time % 8) * (100 / 8) - end - - return "size[8,9]" + local formspec = { + ["inactive"] = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. "label[3.75,0;Core]" - .. "list[current_name;core;3.5,0.5;1,1;]" + .. "list[current_name;main;3.5,0.5;1,1;]" .. "label[2.75,2;Coal]" .. "list[current_name;fuel;2.5,2.5;1,1;]" .. "label[4.75,2;Dye]" .. "list[current_name;dye;4.5,2.5;1,1;]" - .. "image[3.5,1.5;1,2;maidroid_tool_gui_arrow.png^[lowpart:" - .. arrow_percent - .. ":maidroid_tool_gui_arrow_filled.png]" - .. "image[3.1,3.5;2,1;maidroid_tool_gui_meter.png^[lowpart:" - .. meter_percent - .. ":maidroid_tool_gui_meter_filled.png^[transformR270]" + .. "image[3.5,1.5;1,2;maidroid_tool_gui_arrow.png]" + .. "image[3.1,3.5;2,1;maidroid_tool_gui_meter.png^[transformR270]" .. "list[current_player;main;0,5;8,1;]" - .. "list[current_player;main;0,6.2;8,3;8]" - end + .. "list[current_player;main;0,6.2;8,3;8]", - -- get_nearest_core_entity returns the nearest core entity. - local function get_nearest_core_entity(pos) - local all_objects = minetest.get_objects_inside_radius(pos, 1.0) - for _, object in ipairs(all_objects) do - if object:get_luaentity().name == "maidroid_tool:core_entity" then - return object:get_luaentity() + ["active"] = function(time) + local arrow_percent = (100 / 40) * time + local merter_percent = 0 + if time % 16 >= 8 then + meter_percent = (8 - (time % 8)) * (100 / 8) + else + meter_percent = (time % 8) * (100 / 8) end - end - return nil - end + return "size[8,9]" + .. default.gui_bg + .. default.gui_bg_img + .. default.gui_slots + .. "label[3.75,0;Core]" + .. "list[current_name;main;3.5,0.5;1,1;]" + .. "label[2.75,2;Coal]" + .. "list[current_name;fuel;2.5,2.5;1,1;]" + .. "label[4.75,2;Dye]" + .. "list[current_name;dye;4.5,2.5;1,1;]" + .. "image[3.5,1.5;1,2;maidroid_tool_gui_arrow.png^[lowpart:" + .. arrow_percent + .. ":maidroid_tool_gui_arrow_filled.png]" + .. "image[3.1,3.5;2,1;maidroid_tool_gui_meter.png^[lowpart:" + .. meter_percent + .. ":maidroid_tool_gui_meter_filled.png^[transformR270]" + .. "list[current_player;main;0,5;8,1;]" + .. "list[current_player;main;0,6.2;8,3;8]" + end, + } - -- can_dig is a common callback for the core writer. - local function can_dig(pos, player) - local meta = minetest.get_meta(pos) - local inventory = meta:get_inventory() - return ( - inventory:is_empty("core") and - inventory:is_empty("fuel") and - inventory:is_empty("dye") - ) - end - - -- swap_node is a helper function that swap two nodes. - local function swap_node(pos, name) - local node = minetest.get_node(pos) - node.name = name - - minetest.swap_node(pos, node) - end - - -- on_timer is a common callback for the core writer. - local function on_timer(pos, elapsed) - local meta = minetest.get_meta(pos) - local inventory = meta:get_inventory() - - local core_list = inventory:get_list("core") - local fuel_list = inventory:get_list("fuel") - local dye_list = inventory:get_list("dye") - - local writing_time = meta:get_float("writing_time") - local writing_total_time = 40 - local output_core = meta:get_string("output_core") - - -- if writing time is positive, the core writer is active. - if writing_time >= 0 then - if writing_time <= writing_total_time then - meta:set_float("writing_time", writing_time + 1) - meta:set_string("formspec", generate_formspec_active(writing_time)) - - else -- else place output core to core list. - meta:set_float("writing_time", -1) - meta:set_string("output_core", "") - meta:set_string("formspec", formspec_inactive) - inventory:set_stack("core", 1, ItemStack(output_core)) - swap_node(pos, "maidroid_tool:core_writer") - - local core_entity = get_nearest_core_entity(pos) - core_entity:stop_rotate() - end - - else -- else the core writer is inactive. - local core_name = core_list[1]:get_name() - - if core_name == "maidroid_core:empty" and (not fuel_list[1]:is_empty()) and (not dye_list[1]:is_empty()) then - meta:set_float("writing_time", 0) - meta:set_string("output_core", dye_core_map[dye_list[1]:get_name()]) - - local fuel_stack = fuel_list[1] - fuel_stack:take_item() - inventory:set_stack("fuel", 1, fuel_stack) - - local dye_stack = dye_list[1] - dye_stack:take_item() - inventory:set_stack("dye", 1, dye_stack) - - swap_node(pos, "maidroid_tool:core_writer_active") - - local core_entity = get_nearest_core_entity(pos) - core_entity:start_rotate() - end - end - return true - end - - -- allow_metadata_inventory_put is a common callback for the core writer. - local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - local inventory = meta:get_inventory() - local itemname = stack:get_name() - - if (listname == "fuel" and itemname == "default:coal_lump") then - return stack:get_count() - elseif listname == "dye" and dye_core_map[itemname] ~= nil then - return stack:get_count() - elseif listname == "core" and maidroid.is_core(itemname) then - return stack:get_count() - end - return 0 - end - - -- allow_metadata_inventory_move is a common callback for the core writer. - local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inventory = meta:get_inventory() - local stack = inventory:get_stack(from_list, from_index) - - return allow_metadata_inventory_put(pos, listname, to_index, stack, player) - end - - -------------------------------------------------------------------- - - ;(function() -- register a definition of an inactive core writer. - local tiles = { + local tiles = { + ["inactive"] = { "maidroid_tool_core_writer_top.png", "maidroid_tool_core_writer_bottom.png", "maidroid_tool_core_writer_right.png", "maidroid_tool_core_writer_right.png^[transformFX", "maidroid_tool_core_writer_front.png^[transformFX", "maidroid_tool_core_writer_front.png", - } + }, - local function on_construct(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec_inactive) - meta:set_string("output_core", "") - meta:set_float("writing_time", -1) - - local inventory = meta:get_inventory() - inventory:set_size("core", 1) - inventory:set_size("fuel", 1) - inventory:set_size("dye", 1) - end - - local function on_metadata_inventory_put(pos, listname, index, stack, player) - local timer = minetest.get_node_timer(pos) - timer:start(0.25) - - local meta = minetest.get_meta(pos) - if listname == "core" then - local entity_position = { - x = pos.x, y = pos.y + 0.65, z = pos.z - } - minetest.add_entity(entity_position, "maidroid_tool:core_entity") - end - end - - local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inventory = meta:get_inventory() - local stack = inventory:get_stack(from_list, from_index) - - on_metadata_inventory_put(pos, listname, to_index, stack, player) - end - - local function on_metadata_inventory_take(pos, listname, index, stack, player) - if listname == "core" then - local core_entity = get_nearest_core_entity(pos) - core_entity.object:remove() - end - end - - local function allow_metadata_inventory_take(pos, listname, index, stack, player) - return stack:get_count() -- maybe add more. - end - - minetest.register_node("maidroid_tool:core_writer", { - description = "maidroid tool : core writer", - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - node_box = node_box, - selection_box = selection_box, - tiles = tiles, - can_dig = can_dig, - on_timer = on_timer, - on_construct = on_construct, - on_metadata_inventory_put = on_metadata_inventory_put, - on_metadata_inventory_move = on_metadata_inventory_move, - on_metadata_inventory_take = on_metadata_inventory_take, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - }) - end) () - - -------------------------------------------------------------------- - - ;(function () -- register a definition of an active core writer. - local tiles = { + ["active"] = { "maidroid_tool_core_writer_top.png", "maidroid_tool_core_writer_bottom.png", "maidroid_tool_core_writer_right.png", @@ -291,36 +110,61 @@ local dye_core_map = { length = 1.5, }, }, - } + }, + } - local function allow_metadata_inventory_take(pos, listname, index, stack, player) - if listname == "core" then - return 0 + -- get_nearest_core_entity returns the nearest core entity. + local function get_nearest_core_entity(pos) + local all_objects = minetest.get_objects_inside_radius(pos, 1.0) + for _, object in ipairs(all_objects) do + if object:get_luaentity().name == "maidroid_tool:core_entity" then + return object:get_luaentity() end - return stack:get_count() end + return nil + end - minetest.register_node("maidroid_tool:core_writer_active", { - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - node_box = node_box, - selection_box = selection_box, - tiles = tiles, - can_dig = can_dig, - on_timer = on_timer, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - }) - end) () -end) () + local function on_deactivate(pos) + local core_entity = get_nearest_core_entity(pos) + core_entity:stop_rotate() + end + + local function on_activate(pos) + local core_entity = get_nearest_core_entity(pos) + core_entity:start_rotate() + end + + local function on_metadata_inventory_put_to_main(pos) + local entity_position = { + x = pos.x, y = pos.y + 0.65, z = pos.z, + } + minetest.add_entity(entity_position, "maidroid_tool:core_entity") + end + + local function on_metadata_inventory_take_from_main(pos) + local core_entity = get_nearest_core_entity(pos) + core_entity.object:remove() + end + + maidroid_tool.register_writer("maidroid_tool:core_writer", { + description = "maidroid tool : core writer", + formspec = formspec, + tiles = tiles, + node_box = node_box, + selection_box = selection_box, + duration = 40, + on_activate = on_activate, + on_deactivate = on_deactivate, + empty_itemname = "maidroid_core:empty", + dye_item_map = dye_item_map, + on_metadata_inventory_put_to_main = on_metadata_inventory_put_to_main, + on_metadata_inventory_take_from_main = on_metadata_inventory_take_from_main, + }) + +end -- register a definition of a core entity. -;(function() +do local node_box = { type = "fixed", fixed = { @@ -351,23 +195,45 @@ end) () local function on_activate(self, staticdata) self.object:set_properties{textures = {"maidroid_tool:core_node"}} + + print(staticdata) + + if staticdata ~= "" then + local data = minetest.deserialize(staticdata) + self.is_rotating = data["is_rotating"] + + if self.is_rotating then + self:start_rotate() + end + end end local function start_rotate(self) self.object:set_properties{automatic_rotate = 1} + self.is_rotating = true end local function stop_rotate(self) self.object:set_properties{automatic_rotate = 0} + self.is_rotating = false + end + + local function get_staticdata(self) + local data = { + ["is_rotating"] = self.is_rotating, + } + return minetest.serialize(data) end minetest.register_entity("maidroid_tool:core_entity", { - physical = false, - visual = "wielditem", - visual_size = {x = 0.5, y = 0.5}, - collisionbox = {0, 0, 0, 0, 0, 0}, - on_activate = on_activate, - start_rotate = start_rotate, - stop_rotate = stop_rotate, + physical = false, + visual = "wielditem", + visual_size = {x = 0.5, y = 0.5}, + collisionbox = {0, 0, 0, 0, 0, 0}, + on_activate = on_activate, + start_rotate = start_rotate, + stop_rotate = stop_rotate, + get_staticdata = get_staticdata, + is_rotating = false, }) -end) () +end diff --git a/maidroid_tool/crafting.lua b/maidroid_tool/crafting.lua index d4dc042..bbe1534 100644 --- a/maidroid_tool/crafting.lua +++ b/maidroid_tool/crafting.lua @@ -11,3 +11,12 @@ minetest.register_craft{ { "default:cobble", "default:cobble", "default:cobble"}, }, } + +minetest.register_craft{ + output = "maidroid_tool:egg_writer", + recipe = { + { "default:diamond", "default:diamond", "default:diamond"}, + { "default:cobble", "default:steel_ingot", "default:cobble"}, + {"default:steel_ingot", "default:cobble", "default:steel_ingot"}, + }, +} diff --git a/maidroid_tool/egg_writer.lua b/maidroid_tool/egg_writer.lua new file mode 100644 index 0000000..ae24a8d --- /dev/null +++ b/maidroid_tool/egg_writer.lua @@ -0,0 +1,93 @@ +------------------------------------------------------------ +-- Copyright (c) 2016 tacigar. All rights reserved. +-- https://github.com/tacigar/maidroid +------------------------------------------------------------ + +local dye_item_map = { + ["dye:red"] = "maidroid:maidroid_mk1_egg", +} + +local formspec = { -- want to change. + ["inactive"] = "size[8,9]" + .. default.gui_bg + .. default.gui_bg_img + .. default.gui_slots + .. "label[3.75,0;Egg]" + .. "list[current_name;main;3.5,0.5;1,1;]" + .. "label[2.75,2;Coal]" + .. "list[current_name;fuel;2.5,2.5;1,1;]" + .. "label[4.75,2;Dye]" + .. "list[current_name;dye;4.5,2.5;1,1;]" + .. "image[3.5,1.5;1,2;maidroid_tool_gui_arrow.png]" + .. "image[3.1,3.5;2,1;maidroid_tool_gui_meter.png^[transformR270]" + .. "list[current_player;main;0,5;8,1;]" + .. "list[current_player;main;0,6.2;8,3;8]", + + ["active"] = function(time) + local arrow_percent = (100 / 40) * time + local merter_percent = 0 + if time % 16 >= 8 then + meter_percent = (8 - (time % 8)) * (100 / 8) + else + meter_percent = (time % 8) * (100 / 8) + end + return "size[8,9]" + .. default.gui_bg + .. default.gui_bg_img + .. default.gui_slots + .. "label[3.75,0;Egg]" + .. "list[current_name;main;3.5,0.5;1,1;]" + .. "label[2.75,2;Coal]" + .. "list[current_name;fuel;2.5,2.5;1,1;]" + .. "label[4.75,2;Dye]" + .. "list[current_name;dye;4.5,2.5;1,1;]" + .. "image[3.5,1.5;1,2;maidroid_tool_gui_arrow.png^[lowpart:" + .. arrow_percent + .. ":maidroid_tool_gui_arrow_filled.png]" + .. "image[3.1,3.5;2,1;maidroid_tool_gui_meter.png^[lowpart:" + .. meter_percent + .. ":maidroid_tool_gui_meter_filled.png^[transformR270]" + .. "list[current_player;main;0,5;8,1;]" + .. "list[current_player;main;0,6.2;8,3;8]" + end, +} + +local tiles = { + ["active"] = { + "default_stone.png", + }, + + ["inactive"] = { + "default_stone.png", + }, +} + +local node_box = { + type = "fixed", + fixed = { + { -0.5, -0.375, -0.4375, 0.5, 0.3125, 0.4375}, + {-0.4375, -0.4375, -0.5, 0.4375, 0.25, 0.5}, + {-0.3125, -0.5, -0.3125, 0.3125, -0.4375, 0.3125}, + { -0.375, 0.3125, -0.375, -0.3125, 0.375, 0.375}, + { 0.3125, 0.3125, -0.375, 0.375, 0.375, 0.375}, + { -0.125, -0.5, -0.0625, 0.125, 0.375, 0.0625}, + }, +} + +local selection_box = { + type = "fixed", + fixed = { + {-0.4375, -0.4375, -0.4375, 0.4375, -0.4375, 0.4375}, + }, +} + +maidroid_tool.register_writer("maidroid_tool:egg_writer", { + description = "maidroid tool : egg writer", + formspec = formspec, + tiles = tiles, + node_box = node_box, + selection_box = selection_box, + duration = 40, + empty_itemname = "maidroid:empty_egg", + dye_item_map = dye_item_map, +}) diff --git a/maidroid_tool/init.lua b/maidroid_tool/init.lua index 3fa5aac..a7ae94e 100644 --- a/maidroid_tool/init.lua +++ b/maidroid_tool/init.lua @@ -8,5 +8,7 @@ maidroid_tool = {} maidroid_tool.modname = "maidroid_tool" maidroid_tool.modpath = minetest.get_modpath(maidroid_tool.modname) +dofile(maidroid_tool.modpath .. "/api.lua") dofile(maidroid_tool.modpath .. "/core_writer.lua") +dofile(maidroid_tool.modpath .. "/egg_writer.lua") dofile(maidroid_tool.modpath .. "/crafting.lua")