mirror of
				https://github.com/tacigar/maidroid.git
				synced 2025-10-31 03:05:33 +01:00 
			
		
		
		
	Merge pull request #59 from tacigar/maidroid_egg_creator
[WIP] Add maidroid egg writer Close #55
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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", | ||||
| }) | ||||
| ]]-- | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_empty_egg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_empty_egg.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 337 B | 
							
								
								
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_empty_egg.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_empty_egg.xcf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_maidroid_mk1_egg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_maidroid_mk1_egg.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 439 B | 
							
								
								
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_maidroid_mk1_egg.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								maidroid/textures/maidroid_maidroid_mk1_egg.xcf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										214
									
								
								maidroid_tool/api.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								maidroid_tool/api.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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"}, | ||||
| 	}, | ||||
| } | ||||
|   | ||||
							
								
								
									
										93
									
								
								maidroid_tool/egg_writer.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								maidroid_tool/egg_writer.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -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, | ||||
| }) | ||||
| @@ -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") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user