From 3a18f4044d7e47ec742d917dfd40af1173e1fa9f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 Aug 2017 02:36:50 +0200 Subject: [PATCH] Support all minecart types in dispenser --- mods/ENTITIES/mcl_minecarts/init.lua | 92 +++++++++++++++------ mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 13 +-- 2 files changed, 73 insertions(+), 32 deletions(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 6c24eae16..76141a1b7 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -5,6 +5,8 @@ mcl_minecarts.speed_max = 10 dofile(mcl_minecarts.modpath.."/functions.lua") dofile(mcl_minecarts.modpath.."/rails.lua") +-- Table for item-to-entity mapping. Keys: itemstring, Values: Corresponding entity ID +local entity_mapping = {} local function register_entity(entity_id, mesh, textures, drop, on_rightclick) local cart = { @@ -290,7 +292,45 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) minetest.register_entity(entity_id, cart) end +-- Place a minecart at pointed_thing +mcl_minecarts.place_minecart = function(itemstack, pointed_thing) + if not pointed_thing.type == "node" then + return + end + + local railpos, node + if mcl_minecarts:is_rail(pointed_thing.under) then + railpos = pointed_thing.under + node = minetest.get_node(pointed_thing.under) + elseif mcl_minecarts:is_rail(pointed_thing.above) then + railpos = pointed_thing.above + node = minetest.get_node(pointed_thing.above) + else + return + end + + -- Activate detector rail + if node.name == "mcl_minecarts:detector_rail" then + local newnode = {name="mcl_minecarts:detector_rail_on", param2 = node.param2} + minetest.swap_node(railpos, newnode) + mesecon.receptor_on(railpos) + end + + local entity_id = entity_mapping[itemstack:get_name()] + local cart = minetest.add_entity(railpos, entity_id) + local railtype = minetest.get_item_group(node.name, "connect_to_raillike") + local cart_dir = mcl_minecarts:get_rail_direction(railpos, {x=1, y=0, z=0}, nil, nil, railtype) + cart:setyaw(minetest.dir_to_yaw(cart_dir)) + + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + return itemstack +end + local register_craftitem = function(itemstring, entity_id, description, longdesc, usagehelp, icon) + entity_mapping[itemstring] = entity_id + local def = { stack_max = 1, on_place = function(itemstack, placer, pointed_thing) @@ -306,32 +346,7 @@ local register_craftitem = function(itemstring, entity_id, description, longdesc end end - local railpos - if mcl_minecarts:is_rail(pointed_thing.under) then - railpos = pointed_thing.under - elseif mcl_minecarts:is_rail(pointed_thing.above) then - railpos = pointed_thing.above - node = minetest.get_node(pointed_thing.above) - else - return - end - - -- Activate detector rail - if node.name == "mcl_minecarts:detector_rail" then - local newnode = {name="mcl_minecarts:detector_rail_on", param2 = node.param2} - minetest.swap_node(railpos, newnode) - mesecon.receptor_on(railpos) - end - - local cart = minetest.add_entity(railpos, entity_id) - local railtype = minetest.get_item_group(node.name, "connect_to_raillike") - local cart_dir = mcl_minecarts:get_rail_direction(railpos, {x=1, y=0, z=0}, nil, nil, railtype) - cart:setyaw(minetest.dir_to_yaw(cart_dir)) - - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - return itemstack + return mcl_minecarts.place_minecart(itemstack, pointed_thing) end, groups = { minecart = 1, transport = 1}, } @@ -410,7 +425,30 @@ register_minecart( "mcl_minecarts_minecart.png", }, "mcl_minecarts_minecart_furnace.png", - {"mcl_minecarts:minecart", "mcl_furnaces:furnace"} + {"mcl_minecarts:minecart", "mcl_furnaces:furnace"}, + -- Feed furnace with coal + function(self, clicker) + if not clicker or not clicker:is_player() then + return + end + if not self._fueltime then + self._fueltime = 0 + end + local held = clicker:get_wielded_item() + if minetest.get_item_group(held:get_name(), "coal") == 1 then + self._fueltime = self._fueltime + 180 + + if not minetest.settings:get_bool("creative_mode") then + held:take_item() + local index = clicker:get_wielded_index() + local inv = clicker:get_inventory() + inv:set_stack("main", index, held) + end + + -- DEBUG + minetest.chat_send_player(clicker:get_player_name(), "Fuel: " .. tostring(self._fueltime)) + end + end ) -- Minecart with Command Block diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 7ac456405..ec63cb7e8 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -191,6 +191,7 @@ local dispenserdef = { elseif iname == "mcl_dye:white" then -- Apply bone meal, if possible + local pointed_thing if dropnode.name == "air" then pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } else @@ -202,15 +203,17 @@ local dispenserdef = { inv:set_stack("main", stack_id, stack) end - elseif iname == "mcl_minecarts:minecart" then + elseif minetest.get_item_group(iname, "minecart") == 1 then -- Place minecart as entity on rail + local placed if dropnodedef.groups.rail then - minetest.add_entity(droppos, "mcl_minecarts:minecart") - - else + -- FIXME: This places minecarts even if the spot is already occupied + local pointed_thing = { under = droppos, above = { x=droppos.x, y=droppos.y+1, z=droppos.z } } + placed = mcl_minecarts.place_minecart(stack, pointed_thing) + end + if placed == nil then -- Drop item minetest.add_item(droppos, dropitem) - end stack:take_item()