local function spawngovsheave(pos) local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5) for _,i in pairs(entitiesnearby) do if i:get_luaentity() and i:get_luaentity().name == "celevator:governor_sheave" then return end end local entity = minetest.add_entity(pos,"celevator:governor_sheave") local fdir = minetest.fourdir_to_dir(minetest.get_node(pos).param2) local yaw = minetest.dir_to_yaw(fdir) local offset = vector.rotate_around_axis(vector.new(0,-0.05,-0.143),vector.new(0,1,0),yaw) entity:set_yaw(yaw) entity:set_pos(vector.add(pos,offset)) end minetest.register_node("celevator:governor",{ description = "Elevator Governor", groups = { cracky = 1, }, paramtype = "light", paramtype2 = "4dir", tiles = { "celevator_machine_top.png", "celevator_machine_top.png", "celevator_machine_top.png", "celevator_machine_top.png", "celevator_governor_back.png", "celevator_governor_front.png", }, drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.2,-0.5,-0.1,0.2,0.1,-0.07}, {-0.2,-0.5,0.07,0.2,0.1,0.1}, {-0.2,-0.5,-0.25,0.2,-0.45,-0.1}, {-0.2,-0.5,0.1,0.2,-0.45,0.25}, }, }, on_construct = function(pos) minetest.get_meta(pos):set_string("formspec","field[carid;Car ID;]") spawngovsheave(pos) end, after_dig_node = function(pos) local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5) for _,i in pairs(entitiesnearby) do if i:get_luaentity() and i:get_luaentity().name == "celevator:governor_sheave" then i:remove() end end end, on_receive_fields = function(pos,_,fields) if not (fields.carid and tonumber(fields.carid)) then return end local carid = tonumber(fields.carid) local carinfo = minetest.deserialize(celevator.storage:get_string("car"..carid)) if not (carinfo and carinfo.controllerpos) then return end if not celevator.controller.iscontroller(carinfo.controllerpos) then return end local meta = minetest.get_meta(pos) meta:set_string("controllerpos",minetest.pos_to_string(carinfo.controllerpos)) meta:set_string("formspec","") end, }) minetest.register_node("celevator:governor_sheave",{ description = "Governor Sheave (you hacker you!)", groups = { not_in_creative_inventory = 1, }, drop = "", paramtype = "light", paramtype2 = "4dir", tiles = { "celevator_governor_sheave_sides.png^[transformR90", "celevator_governor_sheave_sides.png^[transformR270", "celevator_governor_sheave_sides.png", "celevator_governor_sheave_sides.png^[transformR180", "celevator_sheave_front_centered.png", "celevator_sheave_front_centered.png", }, drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.3,-0.3,0.2,0.3,0.3,0.5}, {-0.4,-0.2,0.2,-0.3,0.2,0.5}, {0.3,-0.2,0.2,0.4,0.2,0.5}, {-0.2,0.3,0.2,0.2,0.4,0.5}, {-0.2,-0.4,0.2,0.2,-0.3,0.5}, }, }, selection_box = { type = "fixed", fixed = {}, }, }) minetest.register_entity("celevator:governor_sheave",{ initial_properties = { visual = "wielditem", visual_size = vector.new(0.4,0.4,0.27), wield_item = "celevator:governor_sheave", static_save = false, pointable = false, }, on_step = function(self) local sheave = self.object if not sheave then return end local governorpos = vector.round(sheave:get_pos()) local governormeta = celevator.get_meta(governorpos) local controllerpos = minetest.string_to_pos(governormeta:get_string("controllerpos")) if not controllerpos then return end local controllermeta = celevator.get_meta(controllerpos) local vel = tonumber(controllermeta:get_string("vel")) or 0 if vel == 0 then return end local drivepos = celevator.controller.finddrive(controllerpos) local drivemeta = celevator.get_meta(drivepos) local apos = tonumber(drivemeta:get_string("apos")) or 0 local rotation = sheave:get_rotation() rotation.z = apos*2*math.pi sheave:set_rotation(rotation) end, }) minetest.register_lbm({ name = "celevator:spawngovsheave", label = "Spawn governor sheaves", nodenames = {"celevator:governor"}, run_at_every_load = true, action = spawngovsheave, })