diff options
-rw-r--r-- | car.lua | 15 | ||||
-rw-r--r-- | controllerfw.lua | 15 | ||||
-rw-r--r-- | drive_entity.lua | 36 |
3 files changed, 56 insertions, 10 deletions
@@ -301,6 +301,21 @@ local pieces = { if carid == 0 then return end local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) if not (carinfo and carinfo.controllerpos) then return end + if control == "inspectswitch" then + local boxpos = vector.add(pos,vector.new(0,1,0)) + local erefs = minetest.get_objects_inside_radius(boxpos,0.5) + for _,ref in pairs(erefs) do + if ref:get_luaentity().name == "celevator:car_top_box" then + local state = ref:get_properties().wield_item + if state == "celevator:car_top_box_off" then + state = "celevator:car_top_box_on" + elseif state == "celevator:car_top_box_on" then + state = "celevator:car_top_box_off" + end + ref:set_properties({wield_item = state}) + end + end + end celevator.controller.handlecartopbox(carinfo.controllerpos,control) end, after_dig_node = function(pos) diff --git a/controllerfw.lua b/controllerfw.lua index 6e257d9..bfe7485 100644 --- a/controllerfw.lua +++ b/controllerfw.lua @@ -63,6 +63,7 @@ local faultnames = { drivemetaload = "Drive Metadata Load Failure", drivebadorigin = "Drive Origin Invalid", drivedoorinterlock = "Attempted to Move Doors With Car in Motion", + driveoutofbounds = "Target Position Out of Bounds", } local function drivecmd(command) @@ -100,10 +101,12 @@ local function gotofloor(floor) command = "setmaxvel", maxvel = mem.params.contractspeed }) - drivecmd({ - command = "moveto", - pos = gettarget(floor) - }) + if gettarget(floor) ~= mem.drive.status.apos then + drivecmd({ + command = "moveto", + pos = gettarget(floor) + }) + end interrupt(0,"checkdrive") juststarted = true end @@ -608,14 +611,14 @@ elseif mem.testsw then mem.upcalls = {} mem.dncalls = {} if mem.carstate ~= "resync" then mem.carstate = "test" end - if oldstate == "stop" or oldstate == "mrinspect" or oldstate == "fault" then + if oldstate == "stop" or oldstate == "mrinspect" or oldstate == "carinspect" or oldstate == "fault" then mem.carstate = "resync" gotofloor(getpos()) end elseif mem.capturesw then mem.upcalls = {} mem.dncalls = {} - if oldstate == "stop" or oldstate == "mrinspect" or oldstate == "fault" then + if oldstate == "stop" or oldstate == "mrinspect" or oldstate == "carinspect" or oldstate == "fault" then mem.carstate = "resync" gotofloor(getpos()) elseif mem.carstate ~= "resync" and not mem.direction then diff --git a/drive_entity.lua b/drive_entity.lua index 8799b2f..ecf5bf8 100644 --- a/drive_entity.lua +++ b/drive_entity.lua @@ -275,11 +275,20 @@ function celevator.drives.entity.entitiestonodes(refs,carid) ok = false end for _,i in ipairs(minetest.get_objects_inside_radius(pos,1)) do + i:set_velocity(vector.new(0,0,0)) if i:is_player() then local ppos = i:get_pos() - if top then ppos.y = ppos.y+1 end + ppos.y=ppos.y-0.4 + if top then ppos.y = ppos.y+1.1 end i:set_pos(ppos) minetest.after(0.5,i.set_pos,i,ppos) + elseif i:get_luaentity().name == "celevator:car_top_box" or i:get_luaentity().name == "celevator:car_door" then + local epos = i:get_pos() + epos.y = math.floor(epos.y+0.5) + if i:get_luaentity().name == "celevator:car_top_box" then + epos.y = epos.y+0.1 + end + i:set_pos(epos) end end end @@ -455,6 +464,19 @@ minetest.register_globalstep(celevator.drives.entity.step) function celevator.drives.entity.moveto(pos,target) local meta = minetest.get_meta(pos) if meta:get_string("state") ~= "stopped" then return end + local carid = minetest.get_meta(pos):get_int("carid") + local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) + if not (carinfo and carinfo.machinepos) then return end + local origin = minetest.string_to_pos(meta:get_string("origin")) + if not origin then + minetest.log("error","[celevator] [entity drive] Invalid origin for drive at "..minetest.pos_to_string(pos)) + meta:set_string("fault","badorigin") + return + end + if target < 0 or origin.y + target > (carinfo.machinepos.y-3) then + meta:set_string("fault","outofbounds") + return + end meta:set_string("dpos",tostring(target)) meta:set_string("state","start") meta:set_string("startpos",meta:get_string("apos")) @@ -470,7 +492,13 @@ function celevator.drives.entity.moveto(pos,target) if not running then table.insert(entitydrives_running,hash) celevator.storage:set_string("entitydrives_running",minetest.serialize(entitydrives_running)) - meta:set_string("vel","0.0001") --Controller needs to see something so it knows the drive is running + --Controller needs to see something so it knows the drive is running + local apos = tonumber(meta:get_string("apos")) + if apos and apos > target then + meta:set_string("vel","-0.0001") + else + meta:set_string("vel","0.0001") + end end end @@ -489,10 +517,10 @@ function celevator.drives.entity.estop(pos) local handles = celevator.drives.entity.entityinfo[hash].handles meta:set_string("state","stopped") meta:set_string("vel","0") - celevator.drives.entity.entitiestonodes(handles) + local carid = meta:get_int("carid") + celevator.drives.entity.entitiestonodes(handles,carid) stopbuzz(pos) motorsound(pos,"idle") - local carid = meta:get_int("carid") if carid ~= 0 then celevator.drives.entity.sheavetonode(carid) end minetest.after(0.25,celevator.drives.entity.updatecopformspec,pos) end |