summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--.luacheckrc3
-rw-r--r--README54
-rw-r--r--callbuttons.lua96
-rw-r--r--car.lua118
-rw-r--r--car_glassback.lua41
-rw-r--r--car_metal.lua43
-rw-r--r--car_metalglass.lua419
-rw-r--r--car_standard.lua45
-rw-r--r--chatcommands.lua124
-rw-r--r--controller.lua194
-rw-r--r--controllerfw.lua397
-rw-r--r--crafts.lua120
-rw-r--r--dbdkiosk.lua61
-rw-r--r--decorations.lua98
-rw-r--r--digilines.lua70
-rw-r--r--dispatcher.lua158
-rw-r--r--dispatcherfw.lua200
-rw-r--r--docs/README2
-rw-r--r--docs/celevator_controller_manual.pdfbin2193128 -> 2192852 bytes
-rw-r--r--docs/file_sources4
-rw-r--r--doors.lua295
-rw-r--r--drive_entity.lua358
-rw-r--r--drive_null.lua88
-rw-r--r--framework.lua12
-rw-r--r--fs1switch.lua71
-rw-r--r--genericswitch.lua158
-rw-r--r--governor.lua35
-rw-r--r--init.lua5
-rw-r--r--laptop.lua223
-rw-r--r--locale/celevator.es.tr359
-rw-r--r--locale/template.txt359
-rw-r--r--mesecons.lua224
-rw-r--r--pilantern.lua206
-rw-r--r--screenshot.pngbin0 -> 236634 bytes
-rw-r--r--textures/celevator_car_metal_glassback_inventory.pngbin0 -> 535 bytes
-rw-r--r--textures/celevator_car_metal_glassback_wield.pngbin0 -> 423 bytes
-rw-r--r--textures/celevator_door_glass_inventory.pngbin573 -> 244 bytes
-rw-r--r--textures/celevator_menu_small_arrow.pngbin0 -> 231 bytes
39 files changed, 3062 insertions, 1580 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ffc8a2e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+i18n.py
+locale/*.old
diff --git a/.luacheckrc b/.luacheckrc
index 427b2d9..3fbc5b1 100644
--- a/.luacheckrc
+++ b/.luacheckrc
@@ -5,10 +5,9 @@ globals = {
}
read_globals = {
- "DIR_DELIM",
"vector",
"screwdriver",
- "minetest",
+ "core",
"table.copy",
"VoxelManip",
"laptop",
diff --git a/README b/README
new file mode 100644
index 0000000..a4a8104
--- /dev/null
+++ b/README
@@ -0,0 +1,54 @@
+celevator
+Fully functional realistic elevators for Luanti/Minetest (5.7+)
+===============================================================
+
+Description
+-----------
+
+Adds fully functional, realistic elevators capable of moving players between multiple floors in a building.
+
+Features include:
+
+ 2 to 100 floors with customizable names
+ Travel speed adjustable for each elevator independently, up to 20m/s (more than 7.5m/s not recommended in multiplayer)
+ Can travel through loaded or unloaded mapblocks
+ Full selective-collective operation
+ Group dispatching with up to 16 cars in a group and true ETA dispatching
+ Optional destination-based dispatching
+ Swing car operation
+ Animated doors, hoist machine, and tapehead
+ Controller interface with diagnostic LEDs, display, and GUI configuration
+ Optional car call security settings (require area access to place a car call, or disallow car calls to a specific floor entirely)
+ Functional independent service and fire service phase I and II (approximately following ASME A17.1 codes) modes
+ Car top and machine room inspection operation with adjustable speed
+ Adjustable door dwell and nudging timers
+ mView remote monitoring software (optional, available if "laptop" mod is installed)
+ Mesecons input and output modules (optional, available if "mesecons" mod is installed)
+ Communication with Luacontrollers via digilines input/output modules (optional, available if "digilines" mod is installed)
+
+Documentation
+-------------
+
+Documentation is located in the "docs" subdirectory.
+See "docs/celevator_controller_manual.pdf" for full installation and setup instructions.
+
+Contributing
+------------
+
+If you would like to contribute code, the easiest way is to publish your changes somewhere and request that I pull them.
+I can be reached on Libera.Chat in #luanti as "cheapie", or you can contact me via ContentDB or the Luanti forums (same username).
+If you don't have anywhere to publish your changes, I can also accept patches.
+
+Reporting Issues
+----------------
+
+See the previous "Contributing" section for contact information.
+You are encouraged to report any issues you have to me using any of those contact methods.
+If you just have a question or you're not sure if something is a bug, IRC is probably the easiest method.
+
+License
+-------
+
+This software is offered under The Unlicense.
+See the LICENSE file for the full license text.
+If you do use this code for something I'd love to hear what it is, but you're not required to tell me.
diff --git a/callbuttons.lua b/callbuttons.lua
index 7e19de6..84ccf12 100644
--- a/callbuttons.lua
+++ b/callbuttons.lua
@@ -1,5 +1,7 @@
celevator.callbutton = {}
+local S = core.get_translator("celevator")
+
local function makebuttontex(dir,upon,downon,inventory)
local tex = "[combine:64x64"..
":0,0=celevator_cabinet_sides.png"..
@@ -42,52 +44,57 @@ local function makebuttontex(dir,upon,downon,inventory)
return(tex)
end
+local upname = S("Elevator Up Call Button")
+local dnname = S("Elevator Down Call Button")
+local bothname = S("Elevator Up and Down Call Buttons")
+local onname = S("Elevator Call Button (on state - you hacker you!)")
+
local validstates = {
- {"up",false,false,"Up"},
- {"up",true,false,"Up"},
- {"down",false,false,"Down"},
- {"down",false,true,"Down"},
- {"both",false,false,"Up and Down"},
- {"both",true,false,"Up and Down"},
- {"both",false,true,"Up and Down"},
- {"both",true,true,"Up and Down"},
+ {"up",false,false,upname},
+ {"up",true,false,onname},
+ {"down",false,false,dnname},
+ {"down",false,true,onname},
+ {"both",false,false,bothname},
+ {"both",true,false,onname},
+ {"both",false,true,onname},
+ {"both",true,true,onname},
}
function celevator.callbutton.setlight(pos,dir,newstate)
local node = celevator.get_node(pos)
- if minetest.get_item_group(node.name,"_celevator_callbutton") ~= 1 then return end
+ if core.get_item_group(node.name,"_celevator_callbutton") ~= 1 then return end
if dir == "up" then
- if minetest.get_item_group(node.name,"_celevator_callbutton_has_up") ~= 1 then return end
- local lit = minetest.get_item_group(node.name,"_celevator_callbutton_up_lit") == 1
+ if core.get_item_group(node.name,"_celevator_callbutton_has_up") ~= 1 then return end
+ local lit = core.get_item_group(node.name,"_celevator_callbutton_up_lit") == 1
if lit == newstate then return end
local newname = "celevator:callbutton_"
- if minetest.get_item_group(node.name,"_celevator_callbutton_has_down") == 1 then
+ if core.get_item_group(node.name,"_celevator_callbutton_has_down") == 1 then
newname = newname.."both"
else
newname = newname.."up"
end
if newstate then newname = newname.."_upon" end
- if minetest.get_item_group(node.name,"_celevator_callbutton_down_lit") == 1 then
+ if core.get_item_group(node.name,"_celevator_callbutton_down_lit") == 1 then
newname = newname.."_downon"
end
node.name = newname
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
elseif dir == "down" then
- if minetest.get_item_group(node.name,"_celevator_callbutton_has_down") ~= 1 then return end
- local lit = minetest.get_item_group(node.name,"_celevator_callbutton_down_lit") == 1
+ if core.get_item_group(node.name,"_celevator_callbutton_has_down") ~= 1 then return end
+ local lit = core.get_item_group(node.name,"_celevator_callbutton_down_lit") == 1
if lit == newstate then return end
local newname = "celevator:callbutton_"
- if minetest.get_item_group(node.name,"_celevator_callbutton_has_up") == 1 then
+ if core.get_item_group(node.name,"_celevator_callbutton_has_up") == 1 then
newname = newname.."both"
else
newname = newname.."down"
end
- if minetest.get_item_group(node.name,"_celevator_callbutton_up_lit") == 1 then
+ if core.get_item_group(node.name,"_celevator_callbutton_up_lit") == 1 then
newname = newname.."_upon"
end
if newstate then newname = newname.."_downon" end
node.name = newname
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
end
end
@@ -97,13 +104,13 @@ local function disambiguatedir(pos,player)
local lookdir = player:get_look_dir()
local distance = vector.distance(eyepos,pos)
local endpos = vector.add(eyepos,vector.multiply(lookdir,distance+1))
- local ray = minetest.raycast(eyepos,endpos,true,false)
+ local ray = core.raycast(eyepos,endpos,true,false)
local pointed,button,hitpos
repeat
pointed = ray:next()
if pointed and pointed.type == "node" then
- local node = minetest.get_node(pointed.under)
- if node.name and (minetest.get_item_group(node.name,"_celevator_callbutton") == 1) then
+ local node = core.get_node(pointed.under)
+ if node.name and (core.get_item_group(node.name,"_celevator_callbutton") == 1) then
button = pointed.under
hitpos = vector.subtract(pointed.intersection_point,button)
end
@@ -134,8 +141,8 @@ for _,state in ipairs(validstates) do
light = light + 5
end
local idle = not (state[2] or state[3])
- local description = string.format("Elevator %s Call Button%s%s",state[4],(state[1] == "both" and "s" or ""),(idle and "" or " (on state, you hacker you!)"))
- minetest.register_node(nname,{
+ local description = state[4]
+ core.register_node(nname,{
description = description,
groups = {
dig_immediate = 2,
@@ -167,45 +174,52 @@ for _,state in ipairs(validstates) do
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]field[0.5,2;7,1;landing;Landing Number;]button[3,3.5;2,1;save;Save]")
+ local meta = core.get_meta(pos)
+ local idmsg = S("Car ID")
+ local landingmsg = S("Landing Number")
+ local savemsg = S("Save")
+ local fs = "formspec_version[7]size[8,5]"
+ fs = fs.."field[0.5,0.5;7,1;carid;"..idmsg..";]"
+ fs = fs.."field[0.5,2;7,1;landing;"..landingmsg..";]"
+ fs = fs.."button[3,3.5;2,1;save;"..savemsg.."]"
+ meta:set_string("formspec",fs)
end,
on_receive_fields = function(pos,_,fields)
if tonumber(fields.carid) and tonumber(fields.landing) then
local carid = tonumber(fields.carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
table.insert(carinfo.callbuttons,{pos=pos,landing=tonumber(fields.landing)})
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
- local meta = minetest.get_meta(pos)
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
+ local meta = core.get_meta(pos)
meta:set_int("carid",carid)
meta:set_int("landing",tonumber(fields.landing))
meta:set_string("formspec","")
end
end,
on_destruct = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
for i,button in pairs(carinfo.callbuttons) do
if vector.equals(pos,button.pos) then
table.remove(carinfo.callbuttons,i)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end,
on_rightclick = function(pos,_,clicker)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local controllerpos = carinfo.controllerpos or carinfo.dispatcherpos
local isdispatcher = carinfo.dispatcherpos
if not controllerpos then return end
- local controllermeta = minetest.get_meta(controllerpos)
+ local controllermeta = core.get_meta(controllerpos)
if controllermeta:get_int("carid") ~= carid then return end
local landing = meta:get_int("landing")
if state[1] == "up" then
@@ -240,24 +254,24 @@ for _,state in ipairs(validstates) do
})
end
-minetest.register_abm({
+core.register_abm({
label = "Check call buttons for missing/replaced controllers",
nodenames = {"group:_celevator_callbutton",},
interval = 15,
chance = 1,
action = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if not (carid and carid > 0) then return end --Not set up yet
- local carinfo = minetest.deserialize(celevator.storage:get_string("car"..carid))
+ local carinfo = core.deserialize(celevator.storage:get_string("car"..carid))
if not carinfo then
- meta:set_string("infotext","Error reading car information!\nPlease remove and replace this node.")
+ meta:set_string("infotext",S("Error reading car information!\nPlease remove and replace this node."))
return
end
local iscontroller = (carinfo.controllerpos and celevator.controller.iscontroller(carinfo.controllerpos))
local isdispatcher = (carinfo.dispatcherpos and celevator.dispatcher.isdispatcher(carinfo.dispatcherpos))
if not (iscontroller or isdispatcher) then
- meta:set_string("infotext","Controller/dispatcher is missing!\nPlease remove and replace this node.")
+ meta:set_string("infotext",S("Controller/dispatcher is missing!\nPlease remove and replace this node."))
return
end
local metacarid = 0
@@ -267,7 +281,7 @@ minetest.register_abm({
metacarid = celevator.get_meta(carinfo.dispatcherpos):get_int("carid")
end
if metacarid ~= carid then
- meta:set_string("infotext","Controller/dispatcher found but with incorrect ID!\nPlease remove and replace this node.")
+ meta:set_string("infotext",S("Controller/dispatcher found but with incorrect ID!\nPlease remove and replace this node."))
end
end,
})
diff --git a/car.lua b/car.lua
index e8eca64..94eac20 100644
--- a/car.lua
+++ b/car.lua
@@ -1,18 +1,20 @@
celevator.car = {}
+local S = core.get_translator("celevator")
+
local function disambiguatecartopbutton(pos,facedir,player)
if player and not player.is_fake_player then
local eyepos = vector.add(player:get_pos(),vector.add(player:get_eye_offset(),vector.new(0,1.5,0)))
local lookdir = player:get_look_dir()
local distance = vector.distance(eyepos,pos)
local endpos = vector.add(eyepos,vector.multiply(lookdir,distance+1))
- local ray = minetest.raycast(eyepos,endpos,true,false)
+ local ray = core.raycast(eyepos,endpos,true,false)
local pointed,button,hitpos
repeat
pointed = ray:next()
if pointed and pointed.type == "node" then
- local node = minetest.get_node(pointed.under)
- local ndef = minetest.registered_nodes[node.name] or {}
+ local node = core.get_node(pointed.under)
+ local ndef = core.registered_nodes[node.name] or {}
if ndef._cartopbox then
button = pointed.under
hitpos = vector.subtract(pointed.intersection_point,button)
@@ -20,7 +22,7 @@ local function disambiguatecartopbutton(pos,facedir,player)
end
until button or not pointed
if not hitpos then return end
- hitpos = vector.rotate_around_axis(hitpos,vector.new(0,-1,0),minetest.dir_to_yaw(facedir)+(math.pi/2))
+ hitpos = vector.rotate_around_axis(hitpos,vector.new(0,-1,0),core.dir_to_yaw(facedir)+(math.pi/2))
if hitpos.y < 0.55 then return end
if hitpos.z > 0.36 or hitpos.z < 0.09 then return end
if hitpos.x >= -0.36 and hitpos.x <= -0.16 then
@@ -35,33 +37,33 @@ end
local function updatecartopbox(pos)
local toppos = vector.add(pos,vector.new(0,1.1,0))
- local entitiesnearby = minetest.get_objects_inside_radius(toppos,0.5)
+ local entitiesnearby = core.get_objects_inside_radius(toppos,0.5)
for _,i in pairs(entitiesnearby) do
if i:get_luaentity() and i:get_luaentity().name == "celevator:car_top_box" then
i:remove()
end
end
- local carmeta = minetest.get_meta(pos)
+ local carmeta = core.get_meta(pos)
local carid = carmeta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
- local entity = minetest.add_entity(pos,"celevator:car_top_box")
+ local entity = core.add_entity(pos,"celevator:car_top_box")
local inspon = carinfo.cartopinspect
entity:set_properties({
wield_item = inspon and "celevator:car_top_box_on" or "celevator:car_top_box_off",
})
- local fdir = minetest.fourdir_to_dir(minetest.get_node(pos).param2)
+ local fdir = core.fourdir_to_dir(core.get_node(pos).param2)
fdir = vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi/2)
- entity:set_yaw(minetest.dir_to_yaw(fdir))
+ entity:set_yaw(core.dir_to_yaw(fdir))
entity:set_pos(toppos)
end
local held = {}
-minetest.register_globalstep(function()
+core.register_globalstep(function()
for k,v in ipairs(held) do
- local player = minetest.get_player_by_name(v.name)
+ local player = core.get_player_by_name(v.name)
if not (player and player:get_player_control()[v.button]) then
table.remove(held,k)
celevator.controller.handlecartopbox(v.pos,v.control.."_release")
@@ -105,18 +107,18 @@ function celevator.car.register(name,defs,size)
def.paramtype = "light"
def.paramtype2 = "4dir"
def.drawtype = "nodebox"
- def.description = "Car "..def._position.." (you hacker you!)"
+ def.description = S("Car (part @1 - you hacker you!)",def._position)
def.light_source = 9
def.drop = ""
if def._cop then
def.on_receive_fields = function(pos,_,fields,player)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local playername = player:get_player_name()
- local protected = minetest.is_protected(pos,playername) and not minetest.check_player_privs(playername,{protection_bypass=true})
+ local protected = core.is_protected(pos,playername) and not core.check_player_privs(playername,{protection_bypass=true})
local event = {
type = "cop",
fields = fields,
@@ -128,15 +130,15 @@ function celevator.car.register(name,defs,size)
elseif def._keyswitches then
def.on_receive_fields = function(pos,_,fields,player)
if fields.quit then return end
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local playername = player:get_player_name()
- if minetest.is_protected(pos,playername) and not minetest.check_player_privs(playername,{protection_bypass=true}) then
- minetest.chat_send_player(playername,"You don't have access to these switches.")
- minetest.record_protection_violation(pos,playername)
+ if core.is_protected(pos,playername) and not core.check_player_privs(playername,{protection_bypass=true}) then
+ core.chat_send_player(playername,S("You don't have access to these switches."))
+ core.record_protection_violation(pos,playername)
return
end
local event = {
@@ -154,17 +156,17 @@ function celevator.car.register(name,defs,size)
for _,v in ipairs(held) do
if playername == v.name then return end
end
- local fdir = minetest.fourdir_to_dir(node.param2)
+ local fdir = core.fourdir_to_dir(node.param2)
local control = disambiguatecartopbutton(pos,fdir,clicker)
if not control then return end
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.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)
+ local erefs = core.get_objects_inside_radius(boxpos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and ref:get_luaentity().name == "celevator:car_top_box" then
local state = ref:get_properties().wield_item
@@ -187,7 +189,7 @@ function celevator.car.register(name,defs,size)
end
def.after_dig_node = function(pos)
local toppos = vector.add(pos,vector.new(0,1.1,0))
- local entitiesnearby = minetest.get_objects_inside_radius(toppos,0.5)
+ local entitiesnearby = core.get_objects_inside_radius(toppos,0.5)
for _,i in pairs(entitiesnearby) do
if i:get_luaentity() and i:get_luaentity().name == "celevator:car_top_box" then
i:remove()
@@ -205,29 +207,29 @@ function celevator.car.register(name,defs,size)
def.groups._celevator_car_root = 1
def._root = true
def.on_construct = function(pos)
- minetest.get_meta(pos):set_string("doorstate","closed")
+ core.get_meta(pos):set_string("doorstate","closed")
end
def.on_punch = function(pos,_,player)
if player.is_fake_player then return end
local playername = player:get_player_name()
local sneak = player:get_player_control().sneak
if not sneak then return end
- if minetest.is_protected(pos,playername) and not minetest.check_player_privs(playername,{protection_bypass=true}) then
- minetest.record_protection_violation(pos,playername)
+ if core.is_protected(pos,playername) and not core.check_player_privs(playername,{protection_bypass=true}) then
+ core.record_protection_violation(pos,playername)
return
end
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
local fs = "formspec_version[7]size[6,4]"
- fs = fs.."label[0.5,1;Really remove this car?]"
- fs = fs.."button_exit[0.5,2;2,1;yes;Yes]"
- fs = fs.."button_exit[3,2;2,1;no;No]"
- minetest.show_formspec(playername,string.format("celevator:remove_car_%d",hash),fs)
+ fs = fs.."label[0.5,1;"..S("Really remove this car?").."]"
+ fs = fs.."button_exit[0.5,2;2,1;yes;"..S("Yes").."]"
+ fs = fs.."button_exit[3,2;2,1;no;"..S("No").."]"
+ core.show_formspec(playername,string.format("celevator:remove_car_%d",hash),fs)
end
def.on_timer = function(pos)
- local carid = minetest.get_meta(pos):get_int("carid")
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carid = core.get_meta(pos):get_int("carid")
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.controllerpos) then return end
- local yaw = minetest.dir_to_yaw(minetest.fourdir_to_dir(minetest.get_node(pos).param2))
+ local yaw = core.dir_to_yaw(core.fourdir_to_dir(core.get_node(pos).param2))
local positions = {
vector.new(-0.25,-0.1,-0.5),
vector.new(0.25,-0.1,-0.5),
@@ -237,7 +239,7 @@ function celevator.car.register(name,defs,size)
local playerseen = false
for _,searchpos in ipairs(positions) do
local rotatedpos = vector.rotate_around_axis(searchpos,vector.new(0,1,0),yaw)
- local erefs = minetest.get_objects_inside_radius(vector.add(pos,rotatedpos),0.5)
+ local erefs = core.get_objects_inside_radius(vector.add(pos,rotatedpos),0.5)
for _,ref in pairs(erefs) do
if ref:is_player() then
playerseen = true
@@ -254,7 +256,7 @@ function celevator.car.register(name,defs,size)
return true
end
end
- minetest.register_node("celevator:car_"..name.."_"..def._position,def)
+ core.register_node("celevator:car_"..name.."_"..def._position,def)
end
end
@@ -273,10 +275,10 @@ function celevator.car.spawncar(origin,yaw,carid,name,doortype)
pos = vector.add(pos,vector.multiply(up,y))
local node = {
name = string.format("celevator:car_%s_%d%d%d",name,x,y,z),
- param2 = minetest.dir_to_fourdir(minetest.yaw_to_dir(yaw)),
+ param2 = core.dir_to_fourdir(core.yaw_to_dir(yaw)),
}
- minetest.set_node(pos,node)
- local meta = minetest.get_meta(pos)
+ core.set_node(pos,node)
+ local meta = core.get_meta(pos)
if carid then meta:set_int("carid",carid) end
meta:set_string("doortype",doortype or "glass")
end
@@ -284,31 +286,31 @@ function celevator.car.spawncar(origin,yaw,carid,name,doortype)
end
end
-minetest.register_abm({
+core.register_abm({
label = "Respawn in-car PI displays",
nodenames = {"group:_celevator_car_spawnspi"},
interval = 1,
chance = 1,
action = function(pos)
- local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5)
+ local entitiesnearby = core.get_objects_inside_radius(pos,0.5)
for _,i in pairs(entitiesnearby) do
if i:get_luaentity() and i:get_luaentity().name == "celevator:incar_pi_entity" then
return
end
end
- local entity = minetest.add_entity(pos,"celevator:incar_pi_entity")
- local fdir = vector.rotate_around_axis(minetest.facedir_to_dir(minetest.get_node(pos).param2),vector.new(0,1,0),math.pi/2)
+ local entity = core.add_entity(pos,"celevator:incar_pi_entity")
+ local fdir = vector.rotate_around_axis(core.facedir_to_dir(core.get_node(pos).param2),vector.new(0,1,0),math.pi/2)
local etex = celevator.pi.generatetexture(" --",false,false,false,true)
entity:set_properties({
textures = {etex},
})
- entity:set_yaw(minetest.dir_to_yaw(fdir))
+ entity:set_yaw(core.dir_to_yaw(fdir))
entity:set_pos(vector.add(pos,vector.multiply(fdir,0.44)))
end,
})
-minetest.register_node("celevator:car_top_box_off",{
- description = "Car-top Inspection Box, Off State (you hacker you!)",
+core.register_node("celevator:car_top_box_off",{
+ description = S("Car-top Inspection Box, Off State (you hacker you!)"),
drop = "",
groups = {
not_in_creative_inventory = 1,
@@ -327,8 +329,8 @@ minetest.register_node("celevator:car_top_box_off",{
},
})
-minetest.register_node("celevator:car_top_box_on",{
- description = "Car-top Inspection Box, On State (you hacker you!)",
+core.register_node("celevator:car_top_box_on",{
+ description = S("Car-top Inspection Box, On State (you hacker you!)"),
drop = "",
groups = {
not_in_creative_inventory = 1,
@@ -347,18 +349,18 @@ minetest.register_node("celevator:car_top_box_on",{
},
})
-minetest.register_entity("celevator:car_top_box",{
+core.register_entity("celevator:car_top_box",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.667,0.667,0.667),
wield_item = "celevator:car_top_box_off",
static_save = false,
pointable = false,
- glow = minetest.LIGHT_MAX,
+ glow = core.LIGHT_MAX,
},
})
-minetest.register_abm({
+core.register_abm({
label = "Respawn car-top inspection boxes",
nodenames = {"group:_celevator_car_spawnstopbox"},
interval = 1,
@@ -366,16 +368,16 @@ minetest.register_abm({
action = updatecartopbox,
})
-minetest.register_on_player_receive_fields(function(_,formname,fields)
+core.register_on_player_receive_fields(function(_,formname,fields)
if string.sub(formname,1,21) ~= "celevator:remove_car_" then return false end
if not fields.yes then return true end
local hash = tonumber(string.sub(formname,22,-1))
if not hash then return true end
- local rootpos = minetest.get_position_from_hash(hash)
- local rootdef = minetest.registered_nodes[celevator.get_node(rootpos).name] or {}
+ local rootpos = core.get_position_from_hash(hash)
+ local rootdef = core.registered_nodes[celevator.get_node(rootpos).name] or {}
local cartype = rootdef._celevator_car_type
if cartype and celevator.car.types[cartype] then
- local rootdir = minetest.dir_to_yaw(minetest.fourdir_to_dir(minetest.get_node(rootpos).param2))
+ local rootdir = core.dir_to_yaw(core.fourdir_to_dir(core.get_node(rootpos).param2))
celevator.car.types[cartype].remove(rootpos,rootdir)
end
end)
diff --git a/car_glassback.lua b/car_glassback.lua
index 58d4c7a..8569396 100644
--- a/car_glassback.lua
+++ b/car_glassback.lua
@@ -1,3 +1,5 @@
+local S = core.get_translator("celevator")
+
local pieces = {
{
_position = "000",
@@ -332,8 +334,8 @@ local pieces = {
celevator.car.register("glassback",pieces,vector.new(2,3,3))
-minetest.register_node("celevator:car_glassback",{
- description = "Glass-Back Elevator Car",
+core.register_node("celevator:car_glassback",{
+ description = S("Glass-Back Elevator Car"),
paramtype2 = "4dir",
buildable_to = true,
inventory_image = "celevator_car_glassback_inventory.png",
@@ -342,28 +344,29 @@ minetest.register_node("celevator:car_glassback",{
tiles = {"celevator_transparent.png"},
after_place_node = function(pos,player)
if not player:is_player() then
- minetest.remove_node(pos)
+ core.remove_node(pos)
return true
end
local name = player:get_player_name()
- local newnode = minetest.get_node(pos)
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(newnode.param2))
+ local newnode = core.get_node(pos)
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2))
for x=0,1,1 do
for y=0,2,1 do
for z=0,2,1 do
- local offsetdesc = string.format("%dm to the right, %dm up, and %dm back",x,y,z)
local placeoffset = vector.new(x,y,z)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- local replaces = minetest.get_node(placepos).name
- if not (minetest.registered_nodes[replaces] and minetest.registered_nodes[replaces].buildable_to) then
- minetest.chat_send_player(name,string.format("Can't place car here - position %s is blocked!",offsetdesc))
- minetest.remove_node(pos)
+ local replaces = core.get_node(placepos).name
+ if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is blocked!",x,y,z)
+ core.chat_send_player(name,message)
+ core.remove_node(pos)
return true
end
- if minetest.is_protected(placepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,string.format("Can't place car here - position %s is protected!",offsetdesc))
- minetest.record_protection_violation(placepos,name)
- minetest.remove_node(pos)
+ if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is protected!",x,y,z)
+ core.chat_send_player(name,message)
+ core.record_protection_violation(placepos,name)
+ core.remove_node(pos)
return true
end
end
@@ -375,7 +378,7 @@ minetest.register_node("celevator:car_glassback",{
local piecename = string.format("celevator:car_glassback_%d%d%d",x,y,z)
local placeoffset = vector.new(x,y,z)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- minetest.set_node(placepos,{name=piecename,param2=newnode.param2})
+ core.set_node(placepos,{name=piecename,param2=newnode.param2})
end
end
end
@@ -394,9 +397,9 @@ celevator.car.types.glassback.remove = function(rootpos,rootdir)
local piecename = string.format("celevator:car_glassback_%d%d%d",x,y,z)
local pieceoffset = vector.new(x,y,z)
local piecepos = vector.add(rootpos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),rootdir))
- if minetest.get_node(piecepos).name == piecename then
- minetest.remove_node(piecepos)
- local erefs = minetest.get_objects_inside_radius(piecepos,0.5)
+ if core.get_node(piecepos).name == piecename then
+ core.remove_node(piecepos)
+ local erefs = core.get_objects_inside_radius(piecepos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
ref:remove()
@@ -407,7 +410,7 @@ celevator.car.types.glassback.remove = function(rootpos,rootdir)
end
end
local cartopboxpos = vector.add(rootpos,vector.rotate_around_axis(vector.new(0,3,1),vector.new(0,1,0),rootdir))
- local erefs = minetest.get_objects_inside_radius(cartopboxpos,0.5)
+ local erefs = core.get_objects_inside_radius(cartopboxpos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
ref:remove()
diff --git a/car_metal.lua b/car_metal.lua
index 1b18ced..0516b95 100644
--- a/car_metal.lua
+++ b/car_metal.lua
@@ -1,3 +1,5 @@
+local S = core.get_translator("celevator")
+
local pieces = {
{
_position = "000",
@@ -326,8 +328,8 @@ local pieces = {
celevator.car.register("metal",pieces,vector.new(2,3,3))
-minetest.register_node("celevator:car_metal",{
- description = "Metal Elevator Car",
+core.register_node("celevator:car_metal",{
+ description = S("Metal Elevator Car"),
paramtype2 = "4dir",
buildable_to = true,
inventory_image = "celevator_car_metal_inventory.png",
@@ -336,29 +338,30 @@ minetest.register_node("celevator:car_metal",{
tiles = {"celevator_transparent.png"},
after_place_node = function(pos,player)
if not player:is_player() then
- minetest.remove_node(pos)
+ core.remove_node(pos)
return true
end
local name = player:get_player_name()
- local newnode = minetest.get_node(pos)
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(newnode.param2))
+ local newnode = core.get_node(pos)
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2))
for x=0,1,1 do
for y=0,2,1 do
for z=0,2,1 do
- local offsetdesc = string.format("%dm to the right, %dm up, and %dm back",x,y,z)
local placeoffset = vector.new(x,y,z)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- local replaces = minetest.get_node(placepos).name
- if not (minetest.registered_nodes[replaces] and minetest.registered_nodes[replaces].buildable_to) then
- minetest.chat_send_player(name,string.format("Can't place car here - position %s is blocked!",offsetdesc))
- minetest.remove_node(pos)
+ local replaces = core.get_node(placepos).name
+ if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is blocked!",x,y,z)
+ core.chat_send_player(name,message)
+ core.remove_node(pos)
return true
end
- if minetest.is_protected(placepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,string.format("Can't place car here - position %s is protected!",offsetdesc))
- minetest.record_protection_violation(placepos,name)
- minetest.remove_node(pos)
- return true
+ if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is protected!",x,y,z)
+ core.chat_send_player(name,message)
+ core.record_protection_violation(placepos,name)
+ core.remove_node(pos)
+ return true
end
end
end
@@ -369,7 +372,7 @@ minetest.register_node("celevator:car_metal",{
local piecename = string.format("celevator:car_metal_%d%d%d",x,y,z)
local placeoffset = vector.new(x,y,z)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- minetest.set_node(placepos,{name=piecename,param2=newnode.param2})
+ core.set_node(placepos,{name=piecename,param2=newnode.param2})
end
end
end
@@ -388,9 +391,9 @@ celevator.car.types.metal.remove = function(rootpos,rootdir)
local piecename = string.format("celevator:car_metal_%d%d%d",x,y,z)
local pieceoffset = vector.new(x,y,z)
local piecepos = vector.add(rootpos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),rootdir))
- if minetest.get_node(piecepos).name == piecename then
- minetest.remove_node(piecepos)
- local erefs = minetest.get_objects_inside_radius(piecepos,0.5)
+ if core.get_node(piecepos).name == piecename then
+ core.remove_node(piecepos)
+ local erefs = core.get_objects_inside_radius(piecepos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
ref:remove()
@@ -401,7 +404,7 @@ celevator.car.types.metal.remove = function(rootpos,rootdir)
end
end
local cartopboxpos = vector.add(rootpos,vector.rotate_around_axis(vector.new(0,3,1),vector.new(0,1,0),rootdir))
- local erefs = minetest.get_objects_inside_radius(cartopboxpos,0.5)
+ local erefs = core.get_objects_inside_radius(cartopboxpos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
ref:remove()
diff --git a/car_metalglass.lua b/car_metalglass.lua
new file mode 100644
index 0000000..985cfa6
--- /dev/null
+++ b/car_metalglass.lua
@@ -0,0 +1,419 @@
+local S = core.get_translator("celevator")
+
+local pieces = {
+ {
+ _position = "000",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.6,-0.5,0.5,-0.5,0.5},
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ {-0.5,-1.5,-0.5,0.5,-0.6,-0.45},
+ },
+ },
+ tiles = {
+ "celevator_car_metal_floor.png^celevator_door_sill_single.png",
+ "celevator_car_bottom.png",
+ "celevator_car_metal.png^celevator_car_wall_bottom.png^celevator_car_switch_panel.png",
+ "celevator_cabinet_sides.png^celevator_car_side_overlay.png^[transformR90",
+ "celevator_cabinet_sides.png",
+ },
+ _keyswitches = true,
+ },
+ {
+ _position = "001",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.6,-0.5,0.5,-0.5,0.5},
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_car_metal_floor.png",
+ "celevator_car_bottom_center.png",
+ "celevator_car_metal.png^celevator_car_wall_bottom.png^celevator_car_wall_vent.png",
+ "celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
+ "celevator_cabinet_sides.png",
+ },
+ },
+ {
+ _position = "002",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.6,-0.5,0.5,-0.5,0.5},
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ {-0.45,-0.5,0.45,0.5,0.5,0.5},
+ },
+ },
+ use_texture_alpha = "clip",
+ tiles = {
+ "celevator_car_metal_floor.png",
+ "celevator_car_bottom.png",
+ "celevator_car_metal.png^celevator_car_wall_bottom.png",
+ "celevator_cabinet_sides.png^celevator_car_side_overlay.png",
+ "celevator_car_glass.png",
+ "celevator_car_glass.png^celevator_car_wall_bottom.png",
+ },
+ },
+ {
+ _position = "100",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.6,-0.5,0.5,-0.5,0.5},
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ {-0.5,-1.5,-0.5,0.5,-0.6,-0.45},
+ },
+ },
+ tiles = {
+ "celevator_car_metal_floor.png^celevator_door_sill_double.png",
+ "celevator_car_bottom.png",
+ "celevator_cabinet_sides.png^celevator_car_side_overlay.png",
+ "celevator_car_metal.png^celevator_car_wall_bottom.png",
+ "celevator_cabinet_sides.png",
+ },
+ },
+ {
+ _position = "101",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.6,-0.5,0.5,-0.5,0.5},
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_car_metal_floor.png",
+ "celevator_car_bottom_center.png^[transformFX",
+ "celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
+ "celevator_car_metal.png^celevator_car_wall_bottom.png^celevator_car_wall_vent.png",
+ "celevator_cabinet_sides.png",
+ },
+ },
+ {
+ _position = "102",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.6,-0.5,0.5,-0.5,0.5},
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ {-0.5,-0.5,0.45,0.45,0.5,0.5},
+ },
+ },
+ use_texture_alpha = "clip",
+ tiles = {
+ "celevator_car_metal_floor.png",
+ "celevator_car_bottom.png",
+ "celevator_cabinet_sides.png^celevator_car_side_overlay.png^[transformR90",
+ "celevator_car_metal.png^celevator_car_wall_bottom.png",
+ "celevator_car_glass.png",
+ "celevator_car_glass.png^celevator_car_wall_bottom.png",
+ },
+ },
+ {
+ _position = "010",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal_2x.png^celevator_cop.png",
+ "celevator_cabinet_sides.png",
+ },
+ _cop = true,
+ },
+ {
+ _position = "011",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal.png^celevator_car_handrail_end.png",
+ "celevator_cabinet_sides.png^celevator_car_side_center2_overlay.png",
+ "celevator_cabinet_sides.png",
+ },
+ },
+ {
+ _position = "012",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ {-0.45,-0.5,0.45,0.5,0.5,0.5},
+ },
+ },
+ use_texture_alpha = "clip",
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal.png^(celevator_car_handrail_end.png^[transformFX)",
+ "celevator_cabinet_sides.png",
+ "celevator_car_glass.png",
+ "celevator_car_glass.png",
+ },
+ },
+ {
+ _position = "110",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal.png^(celevator_car_handrail_end.png^[transformFX)",
+ "celevator_cabinet_sides.png",
+ },
+ },
+ {
+ _position = "111",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png^celevator_car_side_center2_overlay.png",
+ "celevator_car_metal.png^celevator_car_handrail_center.png",
+ "celevator_cabinet_sides.png",
+ },
+ },
+ {
+ _position = "112",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ {-0.5,-0.5,0.45,0.45,0.5,0.5},
+ },
+ },
+ use_texture_alpha = "clip",
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal.png^celevator_car_handrail_end.png",
+ "celevator_car_glass.png",
+ "celevator_car_glass.png",
+ },
+ },
+ {
+ _position = "020",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,0.5,-0.5,0.5,0.6,0.5},
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ {-0.5,0.6,-0.4,0.5,1,-0.1},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal_ceiling.png",
+ "celevator_car_metal_top.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_dooroperator_left.png",
+ },
+ _pi = true,
+ },
+ {
+ _position = "021",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,0.5,-0.5,0.5,0.6,0.5},
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png^celevator_car_top_center_overlay.png",
+ "celevator_car_metal_ceiling.png",
+ "celevator_car_metal_top.png",
+ "celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
+ "celevator_cabinet_sides.png",
+ },
+ _cartopbox = true,
+ },
+ {
+ _position = "022",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,0.5,-0.5,0.5,0.6,0.5},
+ {-0.5,-0.5,-0.5,-0.45,0.5,0.5},
+ {-0.45,-0.5,0.45,0.5,0.5,0.5},
+ },
+ },
+ use_texture_alpha = "clip",
+ tiles = {
+ "celevator_cabinet_sides.png^celevator_car_top_hatch.png",
+ "celevator_car_metal_ceiling.png",
+ "celevator_car_metal_top.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_glass.png",
+ "celevator_car_glass.png",
+ },
+ },
+ {
+ _position = "120",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,0.5,-0.5,0.5,0.6,0.5},
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ {-0.5,0.6,-0.4,0.5,1,-0.1},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal_ceiling.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal_top.png",
+ "celevator_cabinet_sides.png",
+ "celevator_dooroperator_right.png",
+ },
+ },
+ {
+ _position = "121",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,0.5,-0.5,0.5,0.6,0.5},
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ },
+ },
+ tiles = {
+ "celevator_cabinet_sides.png^celevator_car_top_center_overlay.png^[transformFX",
+ "celevator_car_metal_ceiling.png",
+ "celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
+ "celevator_car_metal_top.png",
+ "celevator_cabinet_sides.png",
+ },
+ },
+ {
+ _position = "122",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,0.5,-0.5,0.5,0.6,0.5},
+ {0.45,-0.5,-0.5,0.5,0.5,0.5},
+ {-0.5,-0.5,0.45,0.45,0.5,0.5},
+ },
+ },
+ use_texture_alpha = "clip",
+ tiles = {
+ "celevator_cabinet_sides.png^celevator_car_top_misc.png",
+ "celevator_car_metal_ceiling.png",
+ "celevator_cabinet_sides.png",
+ "celevator_car_metal_top.png",
+ "celevator_car_glass.png",
+ "celevator_car_glass.png",
+ },
+ _tapehead = true,
+ },
+}
+
+celevator.car.register("metal_glassback",pieces,vector.new(2,3,3))
+
+
+core.register_node("celevator:car_metal_glassback",{
+ description = S("Metal Glass-Back Elevator Car"),
+ paramtype2 = "4dir",
+ buildable_to = true,
+ inventory_image = "celevator_car_metal_glassback_inventory.png",
+ wield_image = "celevator_car_metal_glassback_wield.png",
+ wield_scale = vector.new(1,1,10),
+ tiles = {"celevator_transparent.png"},
+ after_place_node = function(pos,player)
+ if not player:is_player() then
+ core.remove_node(pos)
+ return true
+ end
+ local name = player:get_player_name()
+ local newnode = core.get_node(pos)
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2))
+ for x=0,1,1 do
+ for y=0,2,1 do
+ for z=0,2,1 do
+ local placeoffset = vector.new(x,y,z)
+ local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
+ local replaces = core.get_node(placepos).name
+ if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is blocked!",x,y,z)
+ core.chat_send_player(name,message)
+ core.remove_node(pos)
+ return true
+ end
+ if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is protected!",x,y,z)
+ core.chat_send_player(name,message)
+ core.record_protection_violation(placepos,name)
+ core.remove_node(pos)
+ return true
+ end
+ end
+ end
+ end
+ for x=0,1,1 do
+ for y=0,2,1 do
+ for z=0,2,1 do
+ local piecename = string.format("celevator:car_metal_glassback_%d%d%d",x,y,z)
+ local placeoffset = vector.new(x,y,z)
+ local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
+ core.set_node(placepos,{name=piecename,param2=newnode.param2})
+ end
+ end
+ end
+ end,
+})
+
+celevator.car.types.metal_glassback.remove = function(rootpos,rootdir)
+ local toberemoved = {
+ ["celevator:car_top_box"] = true,
+ ["celevator:incar_pi_entity"] = true,
+ ["celevator:car_door"] = true,
+ }
+ for x=0,1,1 do
+ for y=0,2,1 do
+ for z=0,2,1 do
+ local piecename = string.format("celevator:car_metal_glassback_%d%d%d",x,y,z)
+ local pieceoffset = vector.new(x,y,z)
+ local piecepos = vector.add(rootpos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),rootdir))
+ if core.get_node(piecepos).name == piecename then
+ core.remove_node(piecepos)
+ local erefs = core.get_objects_inside_radius(piecepos,0.5)
+ for _,ref in pairs(erefs) do
+ if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
+ ref:remove()
+ end
+ end
+ end
+ end
+ end
+ end
+ local cartopboxpos = vector.add(rootpos,vector.rotate_around_axis(vector.new(0,3,1),vector.new(0,1,0),rootdir))
+ local erefs = core.get_objects_inside_radius(cartopboxpos,0.5)
+ for _,ref in pairs(erefs) do
+ if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
+ ref:remove()
+ end
+ end
+end
diff --git a/car_standard.lua b/car_standard.lua
index 70cb91f..0a70ed0 100644
--- a/car_standard.lua
+++ b/car_standard.lua
@@ -1,3 +1,5 @@
+local S = core.get_translator("celevator")
+
local pieces = {
{
_position = "000",
@@ -328,13 +330,13 @@ celevator.car.register("standard",pieces,vector.new(2,3,3))
for x=0,1,1 do
for y=0,2,1 do
for z=0,2,1 do
- minetest.register_alias(string.format("celevator:car_%d%d%d",x,y,z),string.format("celevator:car_standard_%d%d%d",x,y,z))
+ core.register_alias(string.format("celevator:car_%d%d%d",x,y,z),string.format("celevator:car_standard_%d%d%d",x,y,z))
end
end
end
-minetest.register_node("celevator:car_standard",{
- description = "Basic Elevator Car",
+core.register_node("celevator:car_standard",{
+ description = S("Basic Elevator Car"),
paramtype2 = "4dir",
buildable_to = true,
inventory_image = "celevator_car_inventory.png",
@@ -343,28 +345,29 @@ minetest.register_node("celevator:car_standard",{
tiles = {"celevator_transparent.png"},
after_place_node = function(pos,player)
if not player:is_player() then
- minetest.remove_node(pos)
+ core.remove_node(pos)
return true
end
local name = player:get_player_name()
- local newnode = minetest.get_node(pos)
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(newnode.param2))
+ local newnode = core.get_node(pos)
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2))
for x=0,1,1 do
for y=0,2,1 do
for z=0,2,1 do
- local offsetdesc = string.format("%dm to the right, %dm up, and %dm back",x,y,z)
local placeoffset = vector.new(x,y,z)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- local replaces = minetest.get_node(placepos).name
- if not (minetest.registered_nodes[replaces] and minetest.registered_nodes[replaces].buildable_to) then
- minetest.chat_send_player(name,string.format("Can't place car here - position %s is blocked!",offsetdesc))
- minetest.remove_node(pos)
+ local replaces = core.get_node(placepos).name
+ if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is blocked!",x,y,z)
+ core.chat_send_player(name,message)
+ core.remove_node(pos)
return true
end
- if minetest.is_protected(placepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,string.format("Can't place car here - position %s is protected!",offsetdesc))
- minetest.record_protection_violation(placepos,name)
- minetest.remove_node(pos)
+ if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ local message = S("Can't place car here - position @1m to the right, @2m up, and @3m back is protected!",x,y,z)
+ core.chat_send_player(name,message)
+ core.record_protection_violation(placepos,name)
+ core.remove_node(pos)
return true
end
end
@@ -376,14 +379,14 @@ minetest.register_node("celevator:car_standard",{
local piecename = string.format("celevator:car_standard_%d%d%d",x,y,z)
local placeoffset = vector.new(x,y,z)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- minetest.set_node(placepos,{name=piecename,param2=newnode.param2})
+ core.set_node(placepos,{name=piecename,param2=newnode.param2})
end
end
end
end,
})
-minetest.register_alias("celevator:car","celevator:car_standard")
+core.register_alias("celevator:car","celevator:car_standard")
celevator.car.types.standard.remove = function(rootpos,rootdir)
local toberemoved = {
@@ -397,9 +400,9 @@ celevator.car.types.standard.remove = function(rootpos,rootdir)
local piecename = string.format("celevator:car_standard_%d%d%d",x,y,z)
local pieceoffset = vector.new(x,y,z)
local piecepos = vector.add(rootpos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),rootdir))
- if minetest.get_node(piecepos).name == piecename then
- minetest.remove_node(piecepos)
- local erefs = minetest.get_objects_inside_radius(piecepos,0.5)
+ if core.get_node(piecepos).name == piecename then
+ core.remove_node(piecepos)
+ local erefs = core.get_objects_inside_radius(piecepos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
ref:remove()
@@ -410,7 +413,7 @@ celevator.car.types.standard.remove = function(rootpos,rootdir)
end
end
local cartopboxpos = vector.add(rootpos,vector.rotate_around_axis(vector.new(0,3,1),vector.new(0,1,0),rootdir))
- local erefs = minetest.get_objects_inside_radius(cartopboxpos,0.5)
+ local erefs = core.get_objects_inside_radius(cartopboxpos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
ref:remove()
diff --git a/chatcommands.lua b/chatcommands.lua
index bfd79c7..eacb4f0 100644
--- a/chatcommands.lua
+++ b/chatcommands.lua
@@ -1,62 +1,64 @@
-minetest.register_chatcommand("carcall",{
- description = "Places a car call at the specified landing on the specified elevator",
- params = "<car ID> <landing number>",
+local S = core.get_translator("celevator")
+
+core.register_chatcommand("carcall",{
+ description = S("Places a car call at the specified landing on the specified elevator"),
+ params = S("<car ID> <landing number>"),
func = function(name,param)
local carid,landing = string.match(param,"(%d+) (%d+)")
if not (carid and tonumber(carid)) then
- return false,"Invalid car ID"
+ return false,S("Invalid car ID")
end
if not (landing and tonumber(landing)) then
- return false,"Invalid landing number"
+ return false,S("Invalid landing number")
end
- local carinfo = minetest.deserialize(celevator.storage:get_string("car"..carid))
+ local carinfo = core.deserialize(celevator.storage:get_string("car"..carid))
if not (carinfo and carinfo.controllerpos) then
- return false,"No such car or car info is missing"
+ return false,S("No such car or car info is missing")
end
if not celevator.controller.iscontroller(carinfo.controllerpos) then
- return false,"Controller is missing"
+ return false,S("Controller is missing")
end
if celevator.get_meta(carinfo.controllerpos):get_int("carid") ~= tonumber(carid) then
- return false,"Controller found but with wrong ID"
+ return false,S("Controller found but with wrong ID")
end
- if minetest.is_protected(carinfo.controllerpos,name) then
- minetest.record_protection_violation(carinfo.controllerpos,name)
- return false,"Controller is protected"
+ if core.is_protected(carinfo.controllerpos,name) then
+ core.record_protection_violation(carinfo.controllerpos,name)
+ return false,S("Controller is protected")
end
celevator.controller.run(carinfo.controllerpos,{
type = "remotemsg",
channel = "carcall",
msg = tonumber(landing),
})
- return true,"Command sent"
+ return true,S("Command sent")
end,
})
-minetest.register_chatcommand("upcall",{
- description = "Places an up hall call at the specified landing on the specified elevator or dispatcher",
- params = "<car ID> <landing number>",
+core.register_chatcommand("upcall",{
+ description = S("Places an up hall call at the specified landing on the specified elevator or dispatcher"),
+ params = S("<car ID> <landing number>"),
func = function(name,param)
local carid,landing = string.match(param,"(%d+) (%d+)")
if not (carid and tonumber(carid)) then
- return false,"Invalid car ID"
+ return false,S("Invalid car ID")
end
if not (landing and tonumber(landing)) then
- return false,"Invalid landing number"
+ return false,S("Invalid landing number")
end
- local carinfo = minetest.deserialize(celevator.storage:get_string("car"..carid))
+ local carinfo = core.deserialize(celevator.storage:get_string("car"..carid))
if not (carinfo and (carinfo.controllerpos or carinfo.dispatcherpos)) then
- return false,"No such car or car info is missing"
+ return false,S("No such car or car info is missing")
end
if carinfo.controllerpos then
if not celevator.controller.iscontroller(carinfo.controllerpos) then
- return false,"Controller is missing"
+ return false,S("Controller is missing")
end
if celevator.get_meta(carinfo.controllerpos):get_int("carid") ~= tonumber(carid) then
- return false,"Controller found but with wrong ID"
+ return false,S("Controller found but with wrong ID")
end
- if minetest.is_protected(carinfo.controllerpos,name) then
- minetest.record_protection_violation(carinfo.controllerpos,name)
- return false,"Controller is protected"
+ if core.is_protected(carinfo.controllerpos,name) then
+ core.record_protection_violation(carinfo.controllerpos,name)
+ return false,S("Controller is protected")
end
--One of these will work depending on the mode, the other will be ignored
celevator.controller.run(carinfo.controllerpos,{
@@ -69,53 +71,53 @@ minetest.register_chatcommand("upcall",{
channel = "swingupcall",
msg = tonumber(landing),
})
- return true,"Command sent"
+ return true,S("Command sent")
elseif carinfo.dispatcherpos then
if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then
- return false,"Dispatcher is missing"
+ return false,S("Dispatcher is missing")
end
if celevator.get_meta(carinfo.dispatcherpos):get_int("carid") ~= tonumber(carid) then
- return false,"Dispatcher found but with wrong ID"
+ return false,S("Dispatcher found but with wrong ID")
end
- if minetest.is_protected(carinfo.dispatcherpos,name) then
- minetest.record_protection_violation(carinfo.dispatcherpos,name)
- return false,"Dispatcher is protected"
+ if core.is_protected(carinfo.dispatcherpos,name) then
+ core.record_protection_violation(carinfo.dispatcherpos,name)
+ return false,S("Dispatcher is protected")
end
celevator.dispatcher.run(carinfo.dispatcherpos,{
type = "remotemsg",
channel = "upcall",
msg = tonumber(landing),
})
- return true,"Command sent"
+ return true,S("Command sent")
end
end,
})
-minetest.register_chatcommand("downcall",{
- description = "Places a down hall call at the specified landing on the specified elevator or dispatcher",
- params = "<car ID> <landing number>",
+core.register_chatcommand("downcall",{
+ description = S("Places a down hall call at the specified landing on the specified elevator or dispatcher"),
+ params = S("<car ID> <landing number>"),
func = function(name,param)
local carid,landing = string.match(param,"(%d+) (%d+)")
if not (carid and tonumber(carid)) then
- return false,"Invalid car ID"
+ return false,S("Invalid car ID")
end
if not (landing and tonumber(landing)) then
- return false,"Invalid landing number"
+ return false,S("Invalid landing number")
end
- local carinfo = minetest.deserialize(celevator.storage:get_string("car"..carid))
+ local carinfo = core.deserialize(celevator.storage:get_string("car"..carid))
if not (carinfo and (carinfo.controllerpos or carinfo.dispatcherpos)) then
- return false,"No such car or car info is missing"
+ return false,S("No such car or car info is missing")
end
if carinfo.controllerpos then
if not celevator.controller.iscontroller(carinfo.controllerpos) then
- return false,"Controller is missing"
+ return false,S("Controller is missing")
end
if celevator.get_meta(carinfo.controllerpos):get_int("carid") ~= tonumber(carid) then
- return false,"Controller found but with wrong ID"
+ return false,S("Controller found but with wrong ID")
end
- if minetest.is_protected(carinfo.controllerpos,name) then
- minetest.record_protection_violation(carinfo.controllerpos,name)
- return false,"Controller is protected"
+ if core.is_protected(carinfo.controllerpos,name) then
+ core.record_protection_violation(carinfo.controllerpos,name)
+ return false,S("Controller is protected")
end
--One of these will work depending on the mode, the other will be ignored
celevator.controller.run(carinfo.controllerpos,{
@@ -128,49 +130,49 @@ minetest.register_chatcommand("downcall",{
channel = "swingdncall",
msg = tonumber(landing),
})
- return true,"Command sent"
+ return true,S("Command sent")
elseif carinfo.dispatcherpos then
if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then
- return false,"Dispatcher is missing"
+ return false,S("Dispatcher is missing")
end
if celevator.get_meta(carinfo.dispatcherpos):get_int("carid") ~= tonumber(carid) then
- return false,"Dispatcher found but with wrong ID"
+ return false,S("Dispatcher found but with wrong ID")
end
- if minetest.is_protected(carinfo.dispatcherpos,name) then
- minetest.record_protection_violation(carinfo.dispatcherpos,name)
- return false,"Dispatcher is protected"
+ if core.is_protected(carinfo.dispatcherpos,name) then
+ core.record_protection_violation(carinfo.dispatcherpos,name)
+ return false,S("Dispatcher is protected")
end
celevator.dispatcher.run(carinfo.dispatcherpos,{
type = "remotemsg",
channel = "dncall",
msg = tonumber(landing),
})
- return true,"Command sent"
+ return true,S("Command sent")
end
end,
})
-minetest.register_chatcommand("elevstatus",{
- description = "View the status of the specified elevator",
- params = "<car ID>",
+core.register_chatcommand("elevstatus",{
+ description = S("View the status of the specified elevator"),
+ params = S("<car ID>"),
func = function(_,param)
if not (param and tonumber(param)) then
- return false,"Invalid car ID"
+ return false,S("Invalid car ID")
end
- local carinfo = minetest.deserialize(celevator.storage:get_string("car"..param))
+ local carinfo = core.deserialize(celevator.storage:get_string("car"..param))
if not (carinfo and carinfo.controllerpos) then
- return false,"No such car or car info is missing"
+ return false,S("No such car or car info is missing")
end
if not celevator.controller.iscontroller(carinfo.controllerpos) then
- return false,"Controller is missing"
+ return false,S("Controller is missing")
end
local controllermeta = celevator.get_meta(carinfo.controllerpos)
if controllermeta:get_int("carid") ~= tonumber(param) then
- return false,"Controller found but with wrong ID"
+ return false,S("Controller found but with wrong ID")
end
- local mem = minetest.deserialize(controllermeta:get_string("mem"))
+ local mem = core.deserialize(controllermeta:get_string("mem"))
if not mem then
- return false,"Failed to load controller memory"
+ return false,S("Failed to load controller memory")
end
local infotext = controllermeta:get_string("infotext")
if mem.drive and mem.drive.status and mem.drive.status.vel and mem.drive.status.apos then
diff --git a/controller.lua b/controller.lua
index cbe9ab3..2c6c9b6 100644
--- a/controller.lua
+++ b/controller.lua
@@ -1,23 +1,25 @@
celevator.controller = {}
-celevator.controller.iqueue = minetest.deserialize(celevator.storage:get_string("controller_iqueue")) or {}
+local S = core.get_translator("celevator")
-celevator.controller.equeue = minetest.deserialize(celevator.storage:get_string("controller_equeue")) or {}
+celevator.controller.iqueue = core.deserialize(celevator.storage:get_string("controller_iqueue")) or {}
+
+celevator.controller.equeue = core.deserialize(celevator.storage:get_string("controller_equeue")) or {}
celevator.controller.running = {}
-local fw,err = loadfile(minetest.get_modpath("celevator")..DIR_DELIM.."controllerfw.lua")
+local fw,err = loadfile(core.get_modpath("celevator").."/controllerfw.lua")
if not fw then error(err) end
-minetest.register_chatcommand("celevator_reloadcontroller",{
+core.register_chatcommand("celevator_reloadcontroller",{
params = "",
- description = "Reload celevator controller firmware from disk",
+ description = S("Reload celevator controller firmware from disk"),
privs = {server = true},
func = function()
- local newfw,loaderr = loadfile(minetest.get_modpath("celevator")..DIR_DELIM.."controllerfw.lua")
+ local newfw,loaderr = loadfile(core.get_modpath("celevator").."/controllerfw.lua")
if newfw then
fw = newfw
- return true,"Firmware reloaded successfully"
+ return true,S("Firmware reloaded successfully")
else
return false,loaderr
end
@@ -25,32 +27,32 @@ minetest.register_chatcommand("celevator_reloadcontroller",{
})
local function after_place(pos,placer)
- local node = minetest.get_node(pos)
+ local node = core.get_node(pos)
local toppos = {x=pos.x,y=pos.y + 1,z=pos.z}
- local topnode = minetest.get_node(toppos)
+ local topnode = core.get_node(toppos)
local placername = placer:get_player_name()
if topnode.name ~= "air" then
if placer:is_player() then
- minetest.chat_send_player(placername,"Can't place cabinet - no room for the top half!")
+ core.chat_send_player(placername,S("Can't place cabinet - no room for the top half!"))
end
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
return true
end
- if minetest.is_protected(toppos,placername) and not minetest.check_player_privs(placername,{protection_bypass=true}) then
+ if core.is_protected(toppos,placername) and not core.check_player_privs(placername,{protection_bypass=true}) then
if placer:is_player() then
- minetest.chat_send_player(placername,"Can't place cabinet - top half is protected!")
- minetest.record_protection_violation(toppos,placername)
+ core.chat_send_player(placername,S("Can't place cabinet - top half is protected!"))
+ core.record_protection_violation(toppos,placername)
end
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
return true
end
node.name = "celevator:controller_top"
- minetest.set_node(toppos,node)
+ core.set_node(toppos,node)
end
local function ondestruct(pos)
pos.y = pos.y + 1
- local topnode = minetest.get_node(pos)
+ local topnode = core.get_node(pos)
local controllertops = {
["celevator:controller_top"] = true,
["celevator:controller_top_running"] = true,
@@ -58,26 +60,26 @@ local function ondestruct(pos)
["celevator:controller_top_open_running"] = true,
}
if controllertops[topnode.name] then
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
end
- celevator.controller.equeue[minetest.hash_node_position(pos)] = nil
- celevator.storage:set_string("controller_equeue",minetest.serialize(celevator.controller.equeue))
- local carid = minetest.get_meta(pos):get_int("carid")
+ celevator.controller.equeue[core.hash_node_position(pos)] = nil
+ celevator.storage:set_string("controller_equeue",core.serialize(celevator.controller.equeue))
+ local carid = core.get_meta(pos):get_int("carid")
if carid ~= 0 then celevator.storage:set_string(string.format("car%d",carid),"") end
end
local function onrotate(controllerpos,node,user,mode,new_param2)
- if not minetest.global_exists("screwdriver") then
+ if not core.global_exists("screwdriver") then
return false
end
local ret = screwdriver.rotate_simple(controllerpos,node,user,mode,new_param2)
- minetest.after(0,function(pos)
- local newnode = minetest.get_node(pos)
+ core.after(0,function(pos)
+ local newnode = core.get_node(pos)
local param2 = newnode.param2
pos.y = pos.y + 1
- local topnode = minetest.get_node(pos)
+ local topnode = core.get_node(pos)
topnode.param2 = param2
- minetest.set_node(pos,topnode)
+ core.set_node(pos,topnode)
end,controllerpos)
return ret
end
@@ -99,20 +101,20 @@ local function controllerleds(pos,running)
}
if node.name == "celevator:controller_top_open" and running then
node.name = "celevator:controller_top_open_running"
- minetest.swap_node(toppos,node)
- minetest.sound_play("celevator_controller_start",sparams,true)
+ core.swap_node(toppos,node)
+ core.sound_play("celevator_controller_start",sparams,true)
elseif node.name == "celevator:controller_top" and running then
node.name = "celevator:controller_top_running"
- minetest.swap_node(toppos,node)
- minetest.sound_play("celevator_controller_start",sparams,true)
+ core.swap_node(toppos,node)
+ core.sound_play("celevator_controller_start",sparams,true)
elseif node.name == "celevator:controller_top_open_running" and not running then
node.name = "celevator:controller_top_open"
- minetest.swap_node(toppos,node)
- minetest.sound_play("celevator_controller_stop",sparams,true)
+ core.swap_node(toppos,node)
+ core.sound_play("celevator_controller_stop",sparams,true)
elseif node.name == "celevator:controller_top_running" and not running then
node.name = "celevator:controller_top"
- minetest.swap_node(toppos,node)
- minetest.sound_play("celevator_controller_stop",sparams,true)
+ core.swap_node(toppos,node)
+ core.sound_play("celevator_controller_stop",sparams,true)
end
end
@@ -121,13 +123,13 @@ local function candig(_,player)
if controls.sneak then
return true
else
- minetest.chat_send_player(player:get_player_name(),"Hold the sneak button while digging to remove.")
+ core.chat_send_player(player:get_player_name(),S("Hold the sneak button while digging to remove."))
return false
end
end
-minetest.register_node("celevator:controller",{
- description = "Elevator Controller",
+core.register_node("celevator:controller",{
+ description = S("Elevator Controller"),
groups = {
cracky = 1,
},
@@ -160,15 +162,15 @@ minetest.register_node("celevator:controller",{
on_receive_fields = handlefields,
can_dig = candig,
on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("mem",minetest.serialize({}))
+ local meta = core.get_meta(pos)
+ meta:set_string("mem",core.serialize({}))
meta:mark_as_private("mem")
local event = {}
event.type = "program"
local carid = celevator.storage:get_int("maxcarid")+1
meta:set_int("carid",carid)
celevator.storage:set_int("maxcarid",carid)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize({controllerpos=pos,pis={},lanterns={},callbuttons={},fs1switches={}}))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize({controllerpos=pos,pis={},lanterns={},callbuttons={},fs1switches={}}))
celevator.controller.run(pos,event)
end,
on_punch = function(pos,node,puncher)
@@ -176,24 +178,24 @@ minetest.register_node("celevator:controller",{
return
end
local name = puncher:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"Can't open cabinet - cabinet is locked.")
- minetest.record_protection_violation(pos,name)
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("Can't open cabinet - cabinet is locked."))
+ core.record_protection_violation(pos,name)
return
end
node.name = "celevator:controller_open"
- minetest.swap_node(pos,node)
- local meta = minetest.get_meta(pos)
+ core.swap_node(pos,node)
+ local meta = core.get_meta(pos)
meta:set_string("formspec",meta:get_string("formspec_hidden"))
pos.y = pos.y + 1
- node = minetest.get_node(pos)
+ node = core.get_node(pos)
if node.name == "celevator:controller_top_running" then
node.name = "celevator:controller_top_open_running"
else
node.name = "celevator:controller_top_open"
end
- minetest.swap_node(pos,node)
- minetest.sound_play("celevator_cabinet_open",{
+ core.swap_node(pos,node)
+ core.sound_play("celevator_cabinet_open",{
pos = pos,
gain = 0.5,
max_hear_distance = 10
@@ -201,8 +203,8 @@ minetest.register_node("celevator:controller",{
end,
})
-minetest.register_node("celevator:controller_open",{
- description = "Controller (door open - you hacker you!)",
+core.register_node("celevator:controller_open",{
+ description = S("Controller (door open - you hacker you!)"),
groups = {
cracky = 1,
not_in_creative_inventory = 1,
@@ -243,18 +245,18 @@ minetest.register_node("celevator:controller_open",{
return
end
node.name = "celevator:controller"
- minetest.swap_node(pos,node)
- local meta = minetest.get_meta(pos)
+ core.swap_node(pos,node)
+ local meta = core.get_meta(pos)
meta:set_string("formspec","")
pos.y = pos.y + 1
- node = minetest.get_node(pos)
+ node = core.get_node(pos)
if node.name == "celevator:controller_top_open_running" then
node.name = "celevator:controller_top_running"
else
node.name = "celevator:controller_top"
end
- minetest.swap_node(pos,node)
- minetest.sound_play("celevator_cabinet_close",{
+ core.swap_node(pos,node)
+ core.sound_play("celevator_cabinet_close",{
pos = pos,
gain = 0.5,
max_hear_distance = 10
@@ -262,8 +264,8 @@ minetest.register_node("celevator:controller_open",{
end,
})
-minetest.register_node("celevator:controller_top",{
- description = "Controller (top section - you hacker you!)",
+core.register_node("celevator:controller_top",{
+ description = S("Controller (top section - you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -293,8 +295,8 @@ minetest.register_node("celevator:controller_top",{
},
})
-minetest.register_node("celevator:controller_top_running",{
- description = "Controller (top section, car in motion - you hacker you!)",
+core.register_node("celevator:controller_top_running",{
+ description = S("Controller (top section, car in motion - you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -324,8 +326,8 @@ minetest.register_node("celevator:controller_top_running",{
},
})
-minetest.register_node("celevator:controller_top_open",{
- description = "Controller (top section, open - you hacker you!)",
+core.register_node("celevator:controller_top_open",{
+ description = S("Controller (top section, open - you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -360,8 +362,8 @@ minetest.register_node("celevator:controller_top_open",{
},
})
-minetest.register_node("celevator:controller_top_open_running",{
- description = "Controller (top section, open, car in motion - you hacker you!)",
+core.register_node("celevator:controller_top_open_running",{
+ description = S("Controller (top section, open, car in motion - you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -403,24 +405,24 @@ end
function celevator.controller.finddrive(pos)
local node = celevator.get_node(pos)
- local dir = minetest.facedir_to_dir(node.param2)
+ local dir = core.facedir_to_dir(node.param2)
local drivepos = vector.add(pos,vector.new(0,1,0))
drivepos = vector.add(drivepos,vector.rotate_around_axis(dir,vector.new(0,-1,0),math.pi/2))
drivepos = vector.round(drivepos)
local drivename = celevator.get_node(drivepos).name
- return drivepos,minetest.registered_nodes[drivename]._celevator_drive_type
+ return drivepos,core.registered_nodes[drivename]._celevator_drive_type
end
function celevator.controller.finish(pos,mem,changedinterrupts)
if not celevator.controller.iscontroller(pos) then
return
else
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
local carinfodirty = false
if not carinfo then
- minetest.log("error","[celevator] [controller] Bad car info for controller at "..minetest.pos_to_string(pos))
+ core.log("error",string.format("[celevator] [controller] Bad car info for controller at %s",core.pos_to_string(pos)))
return
end
local drivepos,drivetype = celevator.controller.finddrive(pos)
@@ -435,7 +437,7 @@ function celevator.controller.finish(pos,mem,changedinterrupts)
elseif command.command == "estop" then
celevator.drives[drivetype].estop(drivepos)
elseif command.command == "open" then
- minetest.after(0.25,celevator.drives[drivetype].movedoors,drivepos,"open")
+ core.after(0.25,celevator.drives[drivetype].movedoors,drivepos,"open")
elseif command.command == "close" then
celevator.drives[drivetype].movedoors(drivepos,"close",command.nudge)
elseif command.command == "resetfault" then
@@ -449,11 +451,17 @@ function celevator.controller.finish(pos,mem,changedinterrupts)
end
end
local node = celevator.get_node(pos)
- local oldmem = minetest.deserialize(meta:get_string("mem")) or {}
+ local oldmem = core.deserialize(meta:get_string("mem")) or {}
local oldupbuttonlights = oldmem.upcalls or {}
local olddownbuttonlights = oldmem.dncalls or {}
local newupbuttonlights = mem.upcalls or {}
local newdownbuttonlights = mem.dncalls or {}
+ if mem.params and mem.params.groupmode == "group" then
+ oldupbuttonlights = oldmem.swingupcalls
+ olddownbuttonlights = oldmem.swingdncalls
+ newupbuttonlights = mem.swingupcalls
+ newdownbuttonlights = mem.swingdncalls
+ end
local callbuttons = carinfo.callbuttons
for _,button in pairs(callbuttons) do
if oldupbuttonlights[button.landing] ~= newupbuttonlights[button.landing] then
@@ -536,10 +544,10 @@ function celevator.controller.finish(pos,mem,changedinterrupts)
meta:set_string("copformspec",mem.copformspec)
meta:set_string("switchformspec",mem.switchformspec)
if (mem.copformspec ~= oldmem.copformspec or mem.switchformspec ~= oldmem.switchformspec) and drivetype then
- minetest.after(0.25,celevator.drives[drivetype].updatecopformspec,drivepos)
+ core.after(0.25,celevator.drives[drivetype].updatecopformspec,drivepos)
end
for _,message in ipairs(mem.messages) do
- local destinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",message.carid)))
+ local destinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",message.carid)))
if destinfo and destinfo.dispatcherpos then
celevator.dispatcher.run(destinfo.dispatcherpos,{
type = "controllermsg",
@@ -549,26 +557,26 @@ function celevator.controller.finish(pos,mem,changedinterrupts)
})
end
end
- meta:set_string("mem",minetest.serialize(mem))
+ meta:set_string("mem",core.serialize(mem))
if node.name == "celevator:controller_open" then meta:set_string("formspec",mem.formspec or "") end
meta:set_string("formspec_hidden",mem.formspec or "")
meta:set_string("infotext",mem.infotext or "")
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if not celevator.controller.iqueue[hash] then celevator.controller.iqueue[hash] = mem.interrupts end
for iid in pairs(changedinterrupts) do
celevator.controller.iqueue[hash][iid] = mem.interrupts[iid]
end
- celevator.storage:set_string("controller_iqueue",minetest.serialize(celevator.controller.iqueue))
+ celevator.storage:set_string("controller_iqueue",core.serialize(celevator.controller.iqueue))
controllerleds(pos,mem.showrunning)
celevator.controller.running[hash] = nil
if #celevator.controller.equeue[hash] > 0 then
local event = celevator.controller.equeue[hash][1]
table.remove(celevator.controller.equeue[hash],1)
- celevator.storage:set_string("controller_equeue",minetest.serialize(celevator.controller.equeue))
+ celevator.storage:set_string("controller_equeue",core.serialize(celevator.controller.equeue))
celevator.controller.run(pos,event)
end
if carinfodirty then
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end
@@ -577,25 +585,27 @@ function celevator.controller.run(pos,event)
if not celevator.controller.iscontroller(pos) then
return
else
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if not celevator.controller.equeue[hash] then
celevator.controller.equeue[hash] = {}
- celevator.storage:set_string("controller_equeue",minetest.serialize(celevator.controller.equeue))
+ celevator.storage:set_string("controller_equeue",core.serialize(celevator.controller.equeue))
end
if celevator.controller.running[hash] then
table.insert(celevator.controller.equeue[hash],event)
- celevator.storage:set_string("controller_equeue",minetest.serialize(celevator.controller.equeue))
+ celevator.storage:set_string("controller_equeue",core.serialize(celevator.controller.equeue))
if #celevator.controller.equeue[hash] > 5 then
- local message = "[celevator] [controller] Async process for controller at %s is falling behind, %d events in queue"
- minetest.log("warning",string.format(message,minetest.pos_to_string(pos),#celevator.controller.equeue[hash]))
+ local pstring = core.pos_to_string(pos)
+ local queuelen = #celevator.controller.queue[hash]
+ local message = string.format("[celevator] [controller] Async process for controller at %s is falling behind, %d events in queue",pstring,queuelen)
+ core.log("warning",message)
end
return
end
celevator.controller.running[hash] = true
- local meta = minetest.get_meta(pos)
- local mem = minetest.deserialize(meta:get_string("mem"))
+ local meta = core.get_meta(pos)
+ local mem = core.deserialize(meta:get_string("mem"))
if not mem then
- minetest.log("error","[celevator] [controller] Failed to load controller memory at "..minetest.pos_to_string(pos))
+ core.log("error",string.format("[celevator] [controller] Failed to load controller memory at %s",core.pos_to_string(pos)))
return
end
mem.drive = {}
@@ -605,9 +615,9 @@ function celevator.controller.run(pos,event)
mem.drive.type = drivetype
mem.drive.status = celevator.drives[drivetype].getstatus(drivepos)
end
- mem.interrupts = celevator.controller.iqueue[minetest.hash_node_position(pos)] or {}
+ mem.interrupts = celevator.controller.iqueue[core.hash_node_position(pos)] or {}
mem.carid = meta:get_int("carid")
- minetest.handle_async(fw,celevator.controller.finish,pos,event,mem)
+ core.handle_async(fw,celevator.controller.finish,pos,event,mem)
end
end
@@ -638,8 +648,10 @@ end
function celevator.controller.checkiqueue(dtime)
for hash,iqueue in pairs(celevator.controller.iqueue) do
- local pos = minetest.get_position_from_hash(hash)
+ local pos = core.get_position_from_hash(hash)
+ local noneleft = true
for iid,time in pairs(iqueue) do
+ noneleft = false
iqueue[iid] = time-dtime
if iqueue[iid] < 0 then
iqueue[iid] = nil
@@ -649,7 +661,11 @@ function celevator.controller.checkiqueue(dtime)
celevator.controller.run(pos,event)
end
end
+ if noneleft then
+ celevator.controller.iqueue[hash] = nil
+ celevator.storage:set_string("controller_iqueue",core.serialize(celevator.controller.iqueue))
+ end
end
end
-minetest.register_globalstep(celevator.controller.checkiqueue)
+core.register_globalstep(celevator.controller.checkiqueue)
diff --git a/controllerfw.lua b/controllerfw.lua
index 5abb165..75ecb4d 100644
--- a/controllerfw.lua
+++ b/controllerfw.lua
@@ -1,5 +1,7 @@
local pos,event,mem = ...
+local S = core.get_translator("celevator")
+
local changedinterrupts = {}
mem.messages = {}
@@ -40,44 +42,44 @@ end
local juststarted = false
local modenames = {
- normal = "Normal Operation",
- uninit = "Uninitialized",
- resync = "Position Sync - Floor",
- bfdemand = "Position Sync - Terminal",
- fault = "Fault",
- stop = "Emergency Stop",
- mrinspect = "Machine Room Inspection",
- carinspect = "Car Top Inspection",
+ normal = S("Normal Operation"),
+ uninit = S("Uninitialized"),
+ resync = S("Position Sync - Floor"),
+ bfdemand = S("Position Sync - Terminal"),
+ fault = S("Fault"),
+ stop = S("Emergency Stop"),
+ mrinspect = S("Machine Room Inspection"),
+ carinspect = S("Car Top Inspection"),
inspconflict = "Inspection Conflict", --No longer used but some controllers may be in it at update time
- fs1 = "Fire Service - Phase 1",
- fs2 = "Fire Service - Phase 2",
- fs2hold = "Fire Service - Phase 2 Hold",
- indep = "Independent Service",
- capture = "Captured",
- test = "Test Mode",
- swing = "Swing Operation",
+ fs1 = S("Fire Service - Phase 1"),
+ fs2 = S("Fire Service - Phase 2"),
+ fs2hold = S("Fire Service - Phase 2 Hold"),
+ indep = S("Independent Service"),
+ capture = S("Captured"),
+ test = S("Test Mode"),
+ swing = S("Swing Operation"),
}
local doorstates = {
- open = "Open",
- opening = "Opening",
- closing = "Closing",
- closed = "Closed",
- testtiming = "Closed",
+ open = S("Doors Open"),
+ opening = S("Doors Opening"),
+ closing = S("Doors Closing"),
+ closed = S("Doors Closed"),
+ testtiming = S("Doors Closed"),
}
local faultnames = {
- opentimeout = "Door Open Timeout",
- closetimeout = "Door Close Timeout",
- drivecomm = "Lost Communication With Drive",
- driveuninit = "Drive Not Configured",
- drivemetaload = "Drive Metadata Load Failure",
- drivebadorigin = "Drive Origin Invalid",
- drivedoorinterlock = "Attempted to Move Doors With Car in Motion",
- driveoutofbounds = "Target Position Out of Bounds",
- drivenomachine = "Hoist Machine Missing",
- drivemachinemismatch = "Drive<->Machine ID Mismatch",
- drivecontrollermismatch = "Controller<->Drive ID Mismatch",
+ opentimeout = S("Door Open Timeout"),
+ closetimeout = S("Door Close Timeout"),
+ drivecomm = S("Lost Communication With Drive"),
+ driveuninit = S("Drive Not Configured"),
+ drivemetaload = S("Drive Metadata Load Failure"),
+ drivebadorigin = S("Drive Origin Invalid"),
+ drivedoorinterlock = S("Attempted to Move Doors With Car in Motion"),
+ driveoutofbounds = S("Target Position Out of Bounds"),
+ drivenomachine = S("Hoist Machine Missing"),
+ drivemachinemismatch = S("Drive<->Machine ID Mismatch"),
+ drivecontrollermismatch = S("Controller<->Drive ID Mismatch"),
}
local function drivecmd(command)
@@ -97,7 +99,7 @@ local function getpos(pioffset)
ret = ret+v
if ret > searchpos then return k end
end
- return mem.params.floorheights[#mem.params.floorheights]
+ return #mem.params.floorheights
end
local function gettarget(floor)
@@ -232,8 +234,27 @@ if mem.params and not mem.recallto then mem.recallto = mem.params.mainlanding or
if mem.params and not mem.params.inspectionspeed then mem.params.inspectionspeed = 0.2 end
if mem.params and not mem.params.indepunlock then mem.params.indepunlock = {} end
if mem.params and not mem.params.secoverrideusers then mem.params.secoverrideusers = {} end
+if mem.params and mem.params.swingcallwhennotswing == nil then mem.params.swingcallwhennotswing = true end
if not mem.editinguser then mem.editinguser = 1 end
+if mem.params and #mem.params.floornames < 2 then
+ mem.params.floornames = {"1","2","3"}
+ mem.params.floorheights = {5,5,5}
+ mem.carstate = "bfdemand"
+ if mem.doorstate == "closed" then
+ drivecmd({
+ command = "setmaxvel",
+ maxvel = mem.params.contractspeed,
+ })
+ drivecmd({command = "resetpos"})
+ interrupt(0.1,"checkdrive")
+ mem.carmotion = true
+ juststarted = true
+ else
+ close()
+ end
+end
+
if event.type == "program" then
mem.carstate = "uninit"
mem.editingfloor = 1
@@ -279,6 +300,7 @@ if event.type == "program" then
inspectionspeed = 0.2,
indepunlock = {},
secoverrideusers = {},
+ swingcallwhennotswing = true,
}
end
elseif event.type == "ui" then
@@ -307,7 +329,7 @@ elseif event.type == "ui" then
mem.screenstate = "oobe_groupmode"
end
elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" then
- local exp = event.fields.floor and minetest.explode_textlist_event(event.fields.floor) or {}
+ local exp = event.fields.floor and core.explode_textlist_event(event.fields.floor) or {}
if event.fields.back then
mem.screenstate = "oobe_groupmode"
elseif event.fields.next then
@@ -342,7 +364,7 @@ elseif event.type == "ui" then
elseif event.fields.add then
table.insert(mem.params.floorheights,5)
table.insert(mem.params.floornames,tostring(#mem.params.floornames+1))
- elseif event.fields.remove then
+ elseif event.fields.remove and #mem.params.floornames > 2 then
table.remove(mem.params.floorheights,mem.editingfloor)
table.remove(mem.params.floornames,mem.editingfloor)
mem.editingfloor = math.max(1,mem.editingfloor-1)
@@ -508,10 +530,13 @@ elseif event.type == "ui" then
if event.fields.indepunlock then
mem.params.indepunlock[mem.editingfloor] = (event.fields.indepunlock == "true")
end
+ if event.fields.swingcallwhennotswing then
+ mem.params.swingcallwhennotswing = (event.fields.swingcallwhennotswing == "true")
+ end
if event.fields.save then
mem.screenstate = "parameters"
elseif event.fields.floor then
- local exp = minetest.explode_textlist_event(event.fields.floor) or {}
+ local exp = core.explode_textlist_event(event.fields.floor) or {}
if exp.type == "CHG" then
mem.editingfloor = #mem.params.floornames-exp.index+1
elseif exp.type == "DCL" then
@@ -538,7 +563,7 @@ elseif event.type == "ui" then
if not mem.params.secoverrideusers[mem.editingfloor] then
mem.params.secoverrideusers[mem.editingfloor] = {}
end
- local exp = minetest.explode_textlist_event(event.fields.user) or {}
+ local exp = core.explode_textlist_event(event.fields.user) or {}
if exp.type == "CHG" then
mem.editinguser = exp.index
elseif exp.type == "DCL" then
@@ -585,7 +610,7 @@ elseif event.iid == "closed" and (mem.doorstate == "closing" or mem.doorstate ==
end
elseif event.type == "callbutton" and (mem.carstate == "normal" or mem.carstate == "swing") then
if mem.doorstate == "closed" or mem.direction ~= event.dir or getpos() ~= event.landing then
- if mem.params.groupmode == "group" then
+ if mem.params.groupmode == "group" and not (mem.carstate == "normal" and not mem.params.swingcallwhennotswing) then
if event.dir == "up" and event.landing >= 1 and event.landing < #mem.params.floornames then
mem.swingupcalls[event.landing] = true
elseif event.dir == "down" and event.landing > 1 and event.landing <= #mem.params.floornames then
@@ -755,6 +780,12 @@ elseif event.type == "cartopbox" then
})
end
elseif event.type == "dispatchermsg" then
+ local swingstateok = false
+ if mem.carstate == "normal" then
+ swingstateok = mem.params.swingcallwhennotswing
+ elseif mem.carstate == "swing" then
+ swingstateok = true
+ end
if event.channel == "pairrequest" and mem.screenstate == "oobe_dispatcherconnect" then
mem.params.floornames = event.msg.floornames
mem.params.floorheights = event.msg.floorheights
@@ -804,9 +835,9 @@ elseif event.type == "dispatchermsg" then
mem.groupupcalls[event.msg] = nil
elseif event.channel == "groupdncancel" then
mem.groupdncalls[event.msg] = nil
- elseif event.channel == "swingupcall" and (mem.carstate == "normal" or mem.carstate == "swing") then
+ elseif event.channel == "swingupcall" and swingstateok then
mem.swingupcalls[event.msg] = true
- elseif event.channel == "swingdncall" and (mem.carstate == "normal" or mem.carstate == "swing") then
+ elseif event.channel == "swingdncall" and swingstateok then
mem.swingdncalls[event.msg] = true
elseif event.channel == "carcall" and (mem.carstate == "normal" or mem.carstate == "swing") then
mem.carcalls[event.msg] = true
@@ -820,13 +851,19 @@ elseif event.type == "dispatchermsg" then
if not event.msg then mem.flashfirehat = false end
end
elseif event.type == "remotemsg" then
+ local swingstateok = false
+ if mem.carstate == "normal" then
+ swingstateok = mem.params.swingcallwhennotswing
+ elseif mem.carstate == "swing" then
+ swingstateok = true
+ end
if event.channel == "groupupcall" and mem.carstate == "normal" then
mem.groupupcalls[event.msg] = true
elseif event.channel == "groupdncall" and mem.carstate == "normal" then
mem.groupdncalls[event.msg] = true
- elseif event.channel == "swingupcall" and (mem.carstate == "normal" or mem.carstate == "swing") then
+ elseif event.channel == "swingupcall" and swingstateok then
mem.swingupcalls[event.msg] = true
- elseif event.channel == "swingdncall" and (mem.carstate == "normal" or mem.carstate == "swing") then
+ elseif event.channel == "swingdncall" and swingstateok then
mem.swingdncalls[event.msg] = true
elseif event.channel == "upcall" and (mem.carstate == "normal" or mem.carstate == "swing") then
mem.upcalls[event.msg] = true
@@ -1261,75 +1298,100 @@ fs("no_prepend[]")
fs("background9[0,0;16,12;celevator_fs_bg.png;true;3]")
if mem.screenstate == "oobe_welcome" then
fs("image[6,1;4,2;celevator_logo.png]")
- fs("label[1,4;Welcome to your new MTronic XT elevator controller!]")
- fs("label[1,4.5;This setup wizard is designed to get your elevator up and running as quickly as possible.]")
- fs("label[1,5.5;Press Next to begin.]")
- fs("button[1,10;2,1;license;License Info]")
- fs("button[13,10;2,1;next;Next >]")
+ local welcomemsg = S("Welcome to your new MTronic XT elevator controller!")
+ local wizardmsg = S("This setup wizard is designed to get your elevator up and running as quickly as possible.")
+ local pressnextmsg = S("Press Next to begin.")
+ local licensemsg = S("License Info")
+ local nextbuttonmsg = S("Next >")
+ fs("label[1,4;"..welcomemsg.."]")
+ fs("label[1,4.5;"..wizardmsg.."]")
+ fs("label[1,5.5;"..pressnextmsg.."]")
+ fs("button[1,10;3,1;license;"..licensemsg.."]")
+ fs("button[13,10;2,1;next;"..nextbuttonmsg.."]")
elseif mem.screenstate == "oobe_license" then
- local licensefile = io.open(minetest.get_modpath("celevator")..DIR_DELIM.."LICENSE")
- local license = minetest.formspec_escape(licensefile:read("*all"))
+ local licensefile = io.open(core.get_modpath("celevator").."/LICENSE")
+ local license = core.formspec_escape(licensefile:read("*all"))
licensefile:close()
- fs("textarea[1,1;14,8;license;This applies to the whole celevator mod\\, not just this controller:;"..license.."]")
- fs("button[7,10.5;2,1;back;OK]")
+ local licenseinfo = core.formspec_escape(S("This applies to the whole celevator mod, not just this controller:"))
+ fs("textarea[1,1;14,8;license;"..licenseinfo..";"..license.."]")
+ local okmsg = S("OK")
+ fs("button[7,10.5;2,1;back;"..okmsg.."]")
elseif mem.screenstate == "oobe_groupmode" then
- fs("button[1,10;2,1;back;< Back]")
- fs("label[1,1;Select a group operation mode:]")
- fs("button[1,3;2,1;simplex;Simplex]")
- fs("label[1,4.5;This will be the only elevator in the group. Hall calls will be handled by this controller.]")
- fs("button[1,6;2,1;group;Group]")
- fs("label[1,7.5;This elevator will participate in a group with others. Hall calls will be handled by a dispatcher.]")
+ local backmsg = S("< Back")
+ fs("button[1,10;2,1;back;"..backmsg.."]")
+ local modeselectmsg = S("Select a group operation mode:")
+ fs("label[1,1;"..modeselectmsg.."]")
+ local simplexmsg = S("Simplex")
+ fs("button[1,3;2,1;simplex;"..simplexmsg.."]")
+ local simplexlongmsg = S("This will be the only elevator in the group. Hall calls will be handled by this controller.")
+ fs("label[1,4.5;"..simplexlongmsg.."]")
+ local groupmsg = S("Group")
+ fs("button[1,6;2,1;group;"..groupmsg.."]")
+ local grouplongmsg = S("This elevator will participate in a group with others. Hall calls will be handled by a dispatcher.")
+ fs("label[1,7.5;"..grouplongmsg.."]")
elseif mem.screenstate == "oobe_dispatcherconnect" then
- fs("button[1,10;2,1;back;< Cancel]")
- fs("label[1,1;Waiting for connection from dispatcher...]")
- fs(string.format("label[1,1.5;This controller's car ID is: %d]",mem.carid))
+ local cancelmsg = S("Cancel")
+ fs("button[1,10;2,1;back;"..cancelmsg.."]")
+ local waitingmsg = S("Waiting for connection from dispatcher...")
+ fs("label[1,1;"..waitingmsg.."]")
+ local idmsg = S("This controller's car ID is: @1",mem.carid)
+ fs("label[1,1.5;"..idmsg.."]")
elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" then
if mem.screenstate == "oobe_floortable" then
- fs("label[1,1;Enter details of all floors this elevator will serve, then press Done.]")
- fs("button[1,10;2,1;back;< Back]")
- fs("button[13,10;2,1;next;Done >]")
+ local helpmsg = S("Enter details of all floors this elevator will serve, then press Done.")
+ fs("label[1,1;"..helpmsg.."]")
+ local backmsg = S("< Back")
+ fs("button[1,10;2,1;back;"..backmsg.."]")
+ local donemsg = S("Done")
+ fs("button[13,10;2,1;next;"..donemsg.."]")
else
- fs("label[1,1;EDIT FLOOR TABLE]")
- fs("button[1,10;2,1;next;Done]")
+ local titlemsg = S("EDIT FLOOR TABLE")
+ fs("label[1,1;"..titlemsg.."]")
+ local donemsg = S("Done")
+ fs("button[1,10;2,1;next;"..donemsg.."]")
end
fs("textlist[1,2;6,7;floor;")
for i=#mem.params.floornames,1,-1 do
- fs(minetest.formspec_escape(string.format("%d - Height: %d - PI: %s",i,mem.params.floorheights[i],mem.params.floornames[i]))..(i==1 and "" or ","))
+ local floortext = S("@1 - Height: @2 - PI: @3",i,mem.params.floorheights[i],mem.params.floornames[i])
+ fs(core.formspec_escape(floortext)..(i==1 and "" or ","))
end
fs(";"..tostring(#mem.params.floornames-mem.editingfloor+1)..";false]")
- if #mem.params.floornames < 100 then fs("button[8,2;2,1;add;New Floor]") end
- fs("button[8,3.5;2,1;edit;Edit Floor]")
- if #mem.params.floornames > 2 then fs("button[8,5;2,1;remove;Remove Floor]") end
- if mem.editingfloor < #mem.params.floornames then fs("button[8,6.5;2,1;moveup;Move Up]") end
- if mem.editingfloor > 1 then fs("button[8,8;2,1;movedown;Move Down") end
+ if #mem.params.floornames < 100 then fs("button[8,2;2,1;add;"..S("New Floor").."]") end
+ fs("button[8,3.5;2,1;edit;"..S("Edit Floor").."]")
+ if #mem.params.floornames > 2 then fs("button[8,5;2,1;remove;"..S("Remove Floor").."]") end
+ if mem.editingfloor < #mem.params.floornames then fs("button[8,6.5;2,1;moveup;"..S("Move Up").."]") end
+ if mem.editingfloor > 1 then fs("button[8,8;2,1;movedown;"..S("Move Down").."]") end
elseif mem.screenstate == "oobe_floortable_edit" or mem.screenstate == "floortable_edit" then
if mem.screenstate == "oobe_floortable_edit" then
- fs("button[7,10.5;2,1;back;OK]")
- fs("label[1,5;The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.]")
- fs("label[1,5.5;(not used at the highest floor)]")
- fs("label[1,6.5;The Floor Name is how the floor will be displayed on the position indicators.]")
+ fs("button[7,10.5;2,1;back;"..S("OK").."]")
+ local help1 = S("The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.")
+ local help2 = S("(not used at the highest floor)")
+ local help3 = S("The Floor Name is how the floor will be displayed on the position indicators.")
+ fs("label[1,5;"..help1.."]")
+ fs("label[1,5.5;"..help2.."]")
+ fs("label[1,6.5;"..help3.."]")
else
- fs("button[7,10.5;2,1;save;Save]")
+ fs("button[7,10.5;2,1;save;"..S("Save").."]")
end
- fs("label[1,1;Editing floor "..tostring(mem.editingfloor).."]")
- fs("field[1,3;3,1;height;Floor Height;"..tostring(mem.params.floorheights[mem.editingfloor]).."]")
- fs("field[5,3;3,1;name;Floor Name;"..minetest.formspec_escape(mem.params.floornames[mem.editingfloor]).."]")
+ fs("label[1,1;"..S("Editing Floor @1",tostring(mem.editingfloor)).."]")
+ fs("field[1,3;3,1;height;"..S("Floor Height")..";"..tostring(mem.params.floorheights[mem.editingfloor]).."]")
+ fs("field[5,3;3,1;name;"..S("Floor Name")..";"..core.formspec_escape(mem.params.floornames[mem.editingfloor]).."]")
elseif mem.screenstate == "status" then
fs("style_type[image_button;font=mono;font_size=*0.75]")
fs("box[12,2.5;0.1,9;#AAAAAAFF]")
fs("box[13.12,2.5;0.05,9;#AAAAAAFF]")
fs("box[14.12,2.5;0.05,9;#AAAAAAFF]")
fs("box[15.25,2.5;0.1,9;#AAAAAAFF]")
- fs("label[12.5,2;UP]")
- fs("label[13.38,2;CAR]")
- fs("label[14.25,2;DOWN]")
+ fs("image[12.5,1.9;0.2,0.4;celevator_menu_small_arrow.png]")
+ fs("label[13.38,2;"..S("CAR").."]")
+ fs("image[14.6,1.9;0.2,0.4;celevator_menu_small_arrow.png^[transformFY]")
local maxfloor = #mem.params.floornames
local bottom = (mem.screenpage-1)*10+1
for i=0,9,1 do
local ypos = 11-(i*0.9)
local floornum = bottom+i
if floornum > maxfloor then break end
- fs(string.format("label[11.25,%f;%s]",ypos,minetest.formspec_escape(mem.params.floornames[floornum])))
+ fs(string.format("label[11.25,%f;%s]",ypos,core.formspec_escape(mem.params.floornames[floornum])))
local ccdot = mem.carcalls[floornum] and "*" or ""
if getpos() == floornum then
local cargraphics = {
@@ -1341,31 +1403,31 @@ elseif mem.screenstate == "status" then
}
ccdot = cargraphics[mem.doorstate]
if mem.direction == "up" then
- ccdot = minetest.colorize("#55FF55",ccdot)
+ ccdot = core.colorize("#55FF55",ccdot)
elseif mem.direction == "down" then
- ccdot = minetest.colorize("#FF5555",ccdot)
+ ccdot = core.colorize("#FF5555",ccdot)
end
end
fs(string.format("image_button[13.25,%f;0.75,0.75;celevator_fs_bg.png;carcall%d;%s]",ypos-0.25,floornum,ccdot))
if floornum < maxfloor then
- local arrow = mem.upcalls[floornum] and minetest.colorize("#55FF55","^") or ""
+ local arrow = mem.upcalls[floornum] and core.colorize("#55FF55","^") or ""
if mem.params.groupmode == "group" then
- arrow = mem.groupupcalls[floornum] and minetest.colorize("#55FF55","^") or ""
- arrow = (mem.swingupcalls[floornum] and minetest.colorize("#FFFF55","^") or "")..arrow
+ arrow = mem.groupupcalls[floornum] and core.colorize("#55FF55","^") or ""
+ arrow = (mem.swingupcalls[floornum] and core.colorize("#FFFF55","^") or "")..arrow
end
fs(string.format("image_button[12.25,%f;0.75,0.75;celevator_fs_bg.png;upcall%d;%s]",ypos-0.25,floornum,arrow))
end
if floornum > 1 then
- local arrow = mem.dncalls[floornum] and minetest.colorize("#FF5555","v") or ""
+ local arrow = mem.dncalls[floornum] and core.colorize("#FF5555","v") or ""
if mem.params.groupmode == "group" then
- arrow = mem.swingdncalls[floornum] and minetest.colorize("#FFFF55","v") or ""
- arrow = (mem.groupdncalls[floornum] and minetest.colorize("#FF5555","v") or "")..arrow
+ arrow = mem.swingdncalls[floornum] and core.colorize("#FFFF55","v") or ""
+ arrow = (mem.groupdncalls[floornum] and core.colorize("#FF5555","v") or "")..arrow
end
fs(string.format("image_button[14.25,%f;0.75,0.75;celevator_fs_bg.png;downcall%d;%s]",ypos-0.25,floornum,arrow))
end
end
if maxfloor > 10 then
- fs(string.format("checkbox[13,1.25;scrollfollowscar;Follow Car;%s]",tostring(mem.scrollfollowscar)))
+ fs(string.format("checkbox[13,1.25;scrollfollowscar;"..S("Follow Car")..";%s]",tostring(mem.scrollfollowscar)))
if bottom+9 < maxfloor then
fs("image_button[12.75,0.25;0.75,0.75;celevator_menu_arrow.png;scrollup;;false;false;celevator_menu_arrow.png]")
end
@@ -1373,18 +1435,21 @@ elseif mem.screenstate == "status" then
fs("image_button[13.87,0.25;0.75,0.75;celevator_menu_arrow.png^\\[transformFY;scrolldown;;false;false;celevator_menu_arrow.png^\\[transformFY]")
end
end
- fs("label[1,1;CAR STATUS]")
+ fs("label[1,1;"..S("CAR STATUS").."]")
fs(string.format("label[1,2;%s]",modenames[mem.carstate]))
- fs(string.format("label[1,2.5;Doors %s]",doorstates[mem.doorstate]))
- local currentfloor = minetest.formspec_escape(mem.params.floornames[getpos()])
- fs(string.format("label[1,3;Position: %0.02fm Speed: %+0.02fm/s PI: %s]",mem.drive.status.apos,mem.drive.status.vel,currentfloor))
+ fs(string.format("label[1,2.5;%s]",doorstates[mem.doorstate]))
+ local currentfloor = core.formspec_escape(mem.params.floornames[getpos()])
+ local posfmt = string.format("%0.02f",mem.drive.status.apos)
+ local speedfmt = string.format("%+0.02f",mem.drive.status.vel)
+ local posmsg = S("Position: @1m Speed: @2m/s PI: @3",posfmt,speedfmt,currentfloor)
+ fs("label[1,3;"..posmsg.."]")
if #mem.faultlog > 0 then
- fs("label[1,3.5;Fault(s) Active]")
+ fs("label[1,3.5;"..S("Fault(s) Active").."]")
else
- fs("label[1,3.5;No Current Faults]")
+ fs("label[1,3.5;"..S("No Current Faults").."]")
end
- fs("button[1,10;3,1;faults;Fault History]")
- fs("button[4.5,10;3,1;parameters;Edit Parameters]")
+ fs("button[1,10;3,1;faults;"..S("Fault History").."]")
+ fs("button[4.5,10;3,1;parameters;"..S("Edit Parameters").."]")
local redon = "celevator_led_red_on.png"
local redoff = "celevator_led_red_off.png"
local yellowon = "celevator_led_yellow_on.png"
@@ -1392,64 +1457,64 @@ elseif mem.screenstate == "status" then
local greenon = "celevator_led_green_on.png"
local greenoff = "celevator_led_green_off.png"
fs(string.format("image[7,1;0.7,0.7;%s]",mem.carstate == "fault" and redon or redoff))
- fs("label[8,1.35;FAULT]")
+ fs("label[8,1.35;"..S("FAULT").."]")
local inspectionstates = {
mrinspect = true,
carinspect = true,
inspconflict = true,
}
fs(string.format("image[7,1.9;0.7,0.7;%s]",inspectionstates[mem.carstate] and yellowon or yellowoff))
- fs("label[8,2.25;INSP/ACCESS]")
+ fs("label[8,2.25;"..S("INSP/ACCESS").."]")
fs(string.format("image[7,2.8;0.7,0.7;%s]",mem.carstate == "normal" and greenon or greenoff))
- fs("label[8,3.15;NORMAL OPERATION]")
+ fs("label[8,3.15;"..S("NORMAL OPERATION").."]")
fs(string.format("image[7,3.7;0.7,0.7;%s]",mem.drive.status.vel > 0.01 and yellowon or yellowoff))
- fs("label[8,4.05;UP]")
+ fs("label[8,4.05;"..S("UP").."]")
fs(string.format("image[7,4.6;0.7,0.7;%s]",math.abs(mem.drive.status.vel) > 0.01 and yellowon or yellowoff))
- fs("label[8,4.95;DRIVE CMD]")
+ fs("label[8,4.95;"..S("DRIVE CMD").."]")
fs(string.format("image[7,5.5;0.7,0.7;%s]",mem.drive.status.vel < -0.01 and yellowon or yellowoff))
- fs("label[8,5.85;DOWN]")
+ fs("label[8,5.85;"..S("DOWN").."]")
fs(string.format("image[7,6.4;0.7,0.7;%s]",math.abs(mem.drive.status.vel) > math.min(0.4,mem.params.contractspeed/2) and yellowon or yellowoff))
- fs("label[8,6.75;HIGH SPEED]")
+ fs("label[8,6.75;"..S("HIGH SPEED").."]")
fs(string.format("image[7,7.3;0.7,0.7;%s]",math.abs(gettarget(getpos(true))-mem.drive.status.apos) < 0.5 and greenon or greenoff))
- fs("label[8,7.65;DOOR ZONE]")
+ fs("label[8,7.65;"..S("DOOR ZONE").."]")
fs(string.format("image[7,8.2;0.7,0.7;%s]",mem.doorstate == "closed" and greenon or greenoff))
- fs("label[8,8.55;DOORS LOCKED]")
+ fs("label[8,8.55;"..S("DOORS LOCKED").."]")
fs("style[*;font=mono]")
local stopswimg = "celevator_toggle_switch.png"..(mem.controllerstopsw and "^\\[transformFY" or "")
fs(string.format("image_button[1,5;1,1.33;%s;stopsw;;false;false;%s]",stopswimg,stopswimg))
- fs("label[1.3,4.75;RUN]")
- fs("label[1.2,6.6;STOP]")
+ fs("label[1.3,4.75;"..S("RUN").."]")
+ fs("label[1.2,6.6;"..S("STOP").."]")
local captureswimg = "celevator_toggle_switch.png"..(mem.capturesw and "" or "^\\[transformFY")
fs(string.format("image_button[3,5;1,1.33;%s;capturesw;;false;false;%s]",captureswimg,captureswimg))
- fs("label[3,4.75;CAPTURE]")
+ fs("label[3,4.75;"..S("CAPTURE").."]")
local testswimg = "celevator_toggle_switch.png"..(mem.testsw and "" or "^\\[transformFY")
fs(string.format("image_button[5,5;1,1.33;%s;testsw;;false;false;%s]",testswimg,testswimg))
- fs("label[5.23,4.75;TEST]")
+ fs("label[5.23,4.75;"..S("TEST").."]")
local inspectswimg = "celevator_toggle_switch.png"..(mem.controllerinspectsw and "" or "^\\[transformFY")
fs(string.format("image_button[1,8;1,1.33;%s;inspectsw;;false;false;%s]",inspectswimg,inspectswimg))
- fs("label[1.05,7.75;INSPECT]")
- fs("label[1.1,9.6;NORMAL]")
+ fs("label[1.05,7.75;"..S("INSPECT").."]")
+ fs("label[1.1,9.6;"..S("NORMAL").."]")
fs(string.format("image_button[3,8.25;1,1;%s;inspectup;;false;false;%s]","celevator_button_black.png","celevator_button_black.png"))
- fs("label[3.4,7.75;UP]")
+ fs("label[3.4,7.75;"..S("UP ").."]")
fs(string.format("image_button[5,8.25;1,1;%s;inspectdown;;false;false;%s]","celevator_button_black.png","celevator_button_black.png"))
- fs("label[5.25,7.75;DOWN]")
+ fs("label[5.25,7.75;"..S("DOWN ").."]")
elseif mem.screenstate == "parameters" then
- fs("label[1,1;EDIT PARAMETERS]")
- fs("button[1,10;3,1;save;Save]")
- fs("button[4.5,10;3,1;cancel;Cancel]")
- if mem.params.groupmode == "simplex" then fs("button[8,10;3,1;floortable;Edit Floor Table]") end
- fs(string.format("field[1,3;3,1;doortimer;Door Dwell Timer;%0.1f]",mem.params.doortimer))
- fs(string.format("field[1,5;3,1;contractspeed;Contract Speed (m/s);%0.1f]",mem.params.contractspeed))
- fs(string.format("field[4.5,5;3,1;inspectionspeed;Inspection Speed (m/s);%0.1f]",mem.params.inspectionspeed))
- fs(string.format("field[1,7;3,1;mainlanding;Main Egress Landing;%d]",mem.params.mainlanding or 1))
- fs(string.format("field[4.5,3;3,1;nudgetimer;Nudging Timer (0 = None);%0.1f]",mem.params.nudgetimer))
- fs(string.format("field[4.5,7;3,1;altrecalllanding;Alternate Recall Landing;%d]",mem.params.altrecalllanding))
+ fs("label[1,1;"..S("EDIT PARAMETERS").."]")
+ fs("button[1,10;3,1;save;"..S("Save").."]")
+ fs("button[4.5,10;3,1;cancel;"..S("Cancel").."]")
+ if mem.params.groupmode == "simplex" then fs("button[8,10;3,1;floortable;"..S("Edit Floor Table").."]") end
+ fs(string.format("field[1,3;3,1;doortimer;"..S("Door Dwell Timer")..";%0.1f]",mem.params.doortimer))
+ fs(string.format("field[1,5;3,1;contractspeed;"..S("Contract Speed (m/s)")..";%0.1f]",mem.params.contractspeed))
+ fs(string.format("field[4.5,5;3,1;inspectionspeed;"..S("Inspection Speed (m/s)")..";%0.1f]",mem.params.inspectionspeed))
+ fs(string.format("field[1,7;3,1;mainlanding;"..S("Main Egress Landing")..";%d]",mem.params.mainlanding or 1))
+ fs(string.format("field[4.5,3;3,1;nudgetimer;"..S("Nudging Timer")..";%0.1f]",mem.params.nudgetimer))
+ fs(string.format("field[4.5,7;3,1;altrecalllanding;"..S("Alternate Recall Landing")..";%d]",mem.params.altrecalllanding))
fs("style[resetdoors,resetcontroller;bgcolor=#DD3333]")
- fs("button[12,1;3,1;resetdoors;Reset Doors]")
- fs("button[12,2.5;3,1;resetcontroller;Reset Controller]")
- fs("button[1,8.5;3,1;carcallsecurity;Car Call Security]")
+ fs("button[12,1;3,1;resetdoors;"..S("Reset Doors").."]")
+ fs("button[12,2.5;3,1;resetcontroller;"..S("Reset Controller").."]")
+ fs("button[1,8.5;3,1;carcallsecurity;"..S("Car Call Security").."]")
elseif mem.screenstate == "faults" then
- fs("label[1,1;FAULT HISTORY]")
+ fs("label[1,1;"..S("FAULT HISTORY").."]")
if #mem.faultlog > 0 then
for i=0,9,1 do
if #mem.faultlog-i >= 1 then
@@ -1460,28 +1525,30 @@ elseif mem.screenstate == "faults" then
end
end
else
- fs("label[1,2;No Current Faults]")
+ fs("label[1,2;"..S("No Current Faults").."]")
end
- fs("button[1,10;3,1;back;Back]")
- fs("button[4.5,10;3,1;clear;Clear]")
+ fs("button[1,10;3,1;back;"..S("Back").."]")
+ fs("button[4.5,10;3,1;clear;"..S("Clear").."]")
elseif mem.screenstate == "carcallsecurity" then
- fs("label[1,1;CAR CALL SECURITY]")
- fs("button[1,10;3,1;save;Done]")
+ fs("label[1,1;"..S("CAR CALL SECURITY").."]")
+ fs("button[1,10;3,1;save;"..S("Done").."]")
fs("textlist[1,2;6,7;floor;")
for i=#mem.params.floornames,1,-1 do
local secmode = mem.params.carcallsecurity[i]
if secmode == "auth" then
- secmode = "Authorized Users Only"
+ secmode = S("Authorized Users Only")
elseif secmode == "deny" then
- secmode = "Locked"
+ secmode = S("Locked")
else
- secmode = "Security Disabled"
+ secmode = S("Security Disabled")
end
- fs(minetest.formspec_escape(string.format("%s - %s",mem.params.floornames[i],secmode))..(i==1 and "" or ","))
+ fs(core.formspec_escape(string.format("%s - %s",mem.params.floornames[i],secmode))..(i==1 and "" or ","))
end
fs(";"..tostring(#mem.params.floornames-mem.editingfloor+1)..";false]")
+ local swingmsg = S("Allow Swing Calls When Not In Swing Operation")
+ fs("checkbox[1,9.5;swingcallwhennotswing;"..swingmsg..";"..tostring(mem.params.swingcallwhennotswing).."]")
if mem.editingfloor ~= (mem.params.mainlanding or 1) then
- fs("dropdown[8,2;4,1;secmode;Security Disabled,Authorized Users Only,Locked;")
+ fs("dropdown[8,2;4,1;secmode;"..S("Security Disabled")..","..S("Authorized Users Only")..","..S("Locked")..";")
if mem.params.carcallsecurity[mem.editingfloor] == "auth" then
fs("2;true]")
elseif mem.params.carcallsecurity[mem.editingfloor] == "deny" then
@@ -1490,24 +1557,24 @@ elseif mem.screenstate == "carcallsecurity" then
fs("1;true]")
end
if mem.params.carcallsecurity[mem.editingfloor] then
- fs(string.format("checkbox[8,3.5;indepunlock;Unlock in Independent;%s]",(mem.params.indepunlock[mem.editingfloor] and "true" or "false")))
- fs("label[8,4.7;Extra Allowed Users]")
+ fs(string.format("checkbox[8,3.5;indepunlock;"..S("Unlock in Independent")..";%s]",(mem.params.indepunlock[mem.editingfloor] and "true" or "false")))
+ fs("label[8,4.7;"..S("Extra Allowed Users").."]")
if not mem.params.secoverrideusers[mem.editingfloor] then mem.params.secoverrideusers[mem.editingfloor] = {} end
if #mem.params.secoverrideusers[mem.editingfloor] > 0 then
fs("textlist[8,6;4,2;user;")
for i=1,#mem.params.secoverrideusers[mem.editingfloor],1 do
- fs(minetest.formspec_escape(mem.params.secoverrideusers[mem.editingfloor][i])..(i==#mem.params.secoverrideusers[mem.editingfloor] and "" or ","))
+ fs(core.formspec_escape(mem.params.secoverrideusers[mem.editingfloor][i])..(i==#mem.params.secoverrideusers[mem.editingfloor] and "" or ","))
end
fs(";"..tostring(mem.editinguser)..";false]")
else
- fs("label[8,6.25;(none)]")
+ fs("label[8,6.25;"..S("(none)").."]")
end
fs("field[8,5;3,1;username;;]")
fs("button[11.25,5;0.5,1;adduser;+]")
fs("button[12,5;0.5,1;deluser;-]")
end
else
- fs("label[8,2;Main landing cannot be locked]")
+ fs("label[8,2;"..S("Main landing cannot be locked").."]")
end
end
@@ -1520,7 +1587,7 @@ end
local floorname = mem.params.floornames[getpos()]
local modename = modenames[mem.carstate]
local doorstate = doorstates[mem.doorstate]
-mem.infotext = string.format("ID %d: Floor %s %s - %s - Doors %s",mem.carid,floorname,arrow,modename,doorstate)
+mem.infotext = S("ID @1: Floor @2 - @3 - @4",mem.carid,(floorname.." "..arrow),modename,doorstate)
if mem.drive.type then
mem.showrunning = mem.drive.status.vel ~= 0
@@ -1553,6 +1620,7 @@ local arrowenabled = {
indep = true,
capture = true,
test = true,
+ swing = true,
}
mem.piuparrow = mem.drive.status.vel > 0 and arrowenabled[mem.carstate]
mem.pidownarrow = mem.drive.status.vel < 0 and arrowenabled[mem.carstate]
@@ -1600,12 +1668,12 @@ for i=1,floorcount,1 do
local xp = col*1.25
local tex = mem.carcalls[i] and litimg or unlitimg
local star = (i == (mem.params.mainlanding or 1) and "*" or "")
- local label = minetest.formspec_escape(star..mem.params.floornames[i])
+ local label = core.formspec_escape(star..mem.params.floornames[i])
mem.copformspec = mem.copformspec..string.format("image_button[%f,%f;1.2,1.2;%s;carcall%d;%s;false;false;%s]",xp,yp,tex,i,label,litimg)
end
local doxp = (copcols == 1) and 0.5 or 1.25
-local openlabel = minetest.formspec_escape("<|>")
+local openlabel = core.formspec_escape("<|>")
mem.copformspec = mem.copformspec..string.format("image_button[%f,%f;1.2,1.2;%s;open;%s;false;false;%s]",doxp,coprows*1.25+2.5,unlitimg,openlabel,litimg)
local dcxp = 3.75
@@ -1614,10 +1682,11 @@ if copcols == 1 then
elseif copcols == 2 then
dcxp = 2.5
end
-local closelabel = minetest.formspec_escape(">|<")
+local closelabel = core.formspec_escape(">|<")
mem.copformspec = mem.copformspec..string.format("image_button[%f,%f;1.2,1.2;%s;close;%s;false;false;%s]",dcxp,coprows*1.25+2.5,unlitimg,closelabel,litimg)
-mem.copformspec = mem.copformspec..string.format("image_button[0.4,0.5;1.4,1.4;%s;callcancel;Call\nCancel;false;false;%s]",unlitimg,litimg)
+local callcancellabel = S("Call\nCancel")
+mem.copformspec = mem.copformspec..string.format("image_button[0.4,0.5;1.4,1.4;%s;callcancel;"..callcancellabel..";false;false;%s]",unlitimg,litimg)
if mem.flashfirehat then
mem.copformspec = mem.copformspec.."animated_image[2.2,0.5;1.4,1.4;firehat;celevator_fire_hat_flashing.png;2;750]"
@@ -1626,31 +1695,33 @@ else
mem.copformspec = mem.copformspec..string.format("image[2.2,0.5;1.4,1.4;%s]",firehat)
end
+local switchboilerplate = ";false;false;celevator_button_rect_active.png"
+
mem.switchformspec = "formspec_version[7]size[8,10]no_prepend[]background9[0,0;16,12;celevator_fs_bg.png;true;3]"
local fs2ontex = (mem.fs2sw == "on") and "celevator_button_rect_active.png" or "celevator_button_rect.png"
local fs2holdtex = (mem.fs2sw == "hold") and "celevator_button_rect_active.png" or "celevator_button_rect.png"
local fs2offtex = (mem.fs2sw == "off" or not mem.fs2sw) and "celevator_button_rect_active.png" or "celevator_button_rect.png"
-mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,1.5;1.5,1;%s;fs2on;ON;false;false;celevator_button_rect_active.png]",fs2ontex)
-mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,2.5;1.5,1;%s;fs2hold;HOLD;false;false;celevator_button_rect_active.png]",fs2holdtex)
-mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,3.5;1.5,1;%s;fs2off;OFF;false;false;celevator_button_rect_active.png]",fs2offtex)
-mem.switchformspec = mem.switchformspec.."label[1.6,4.75;FIRE SVC]"
+mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,1.5;1.5,1;%s;fs2on;"..S("ON")..switchboilerplate.."]",fs2ontex)
+mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,2.5;1.5,1;%s;fs2hold;"..S("HOLD")..switchboilerplate.."]",fs2holdtex)
+mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,3.5;1.5,1;%s;fs2off;"..S("OFF")..switchboilerplate.."]",fs2offtex)
+mem.switchformspec = mem.switchformspec.."label[1.6,4.75;"..S("FIRE SVC").."]"
local indontex = mem.indsw and "celevator_button_rect_active.png" or "celevator_button_rect.png"
local indofftex = (not mem.indsw) and "celevator_button_rect_active.png" or "celevator_button_rect.png"
-mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,1.5;1.5,1;%s;indon;ON;false;false;celevator_button_rect_active.png]",indontex)
-mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,3.5;1.5,1;%s;indoff;OFF;false;false;celevator_button_rect_active.png]",indofftex)
-mem.switchformspec = mem.switchformspec.."label[4.6,4.75;IND SVC]"
+mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,1.5;1.5,1;%s;indon;"..S("ON")..switchboilerplate.."]",indontex)
+mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,3.5;1.5,1;%s;indoff;"..S("OFF")..switchboilerplate.."]",indofftex)
+mem.switchformspec = mem.switchformspec.."label[4.6,4.75;"..S("IND SVC").."]"
local lightontex = mem.lightsw and "celevator_button_rect_active.png" or "celevator_button_rect.png"
local lightofftex = (not mem.lightsw) and "celevator_button_rect_active.png" or "celevator_button_rect.png"
-mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,5.5;1.5,1;%s;lighton;ON;false;false;celevator_button_rect_active.png]",lightontex)
-mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,7.5;1.5,1;%s;lightoff;OFF;false;false;celevator_button_rect_active.png]",lightofftex)
-mem.switchformspec = mem.switchformspec.."label[1.6,8.75;CAR LIGHT]"
+mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,5.5;1.5,1;%s;lighton;"..S("ON")..switchboilerplate.."]",lightontex)
+mem.switchformspec = mem.switchformspec..string.format("image_button[1.5,7.5;1.5,1;%s;lightoff;"..S("OFF")..switchboilerplate.."]",lightofftex)
+mem.switchformspec = mem.switchformspec.."label[1.6,8.75;"..S("CAR LIGHT").."]"
local fanontex = mem.fansw and "celevator_button_rect_active.png" or "celevator_button_rect.png"
local fanofftex = (not mem.fansw) and "celevator_button_rect_active.png" or "celevator_button_rect.png"
-mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,5.5;1.5,1;%s;fanon;ON;false;false;celevator_button_rect_active.png]",fanontex)
-mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,7.5;1.5,1;%s;fanoff;OFF;false;false;celevator_button_rect_active.png]",fanofftex)
-mem.switchformspec = mem.switchformspec.."label[4.6,8.75;CAR FAN]"
+mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,5.5;1.5,1;%s;fanon;"..S("ON")..switchboilerplate.."]",fanontex)
+mem.switchformspec = mem.switchformspec..string.format("image_button[4.5,7.5;1.5,1;%s;fanoff;"..S("OFF")..switchboilerplate.."]",fanofftex)
+mem.switchformspec = mem.switchformspec.."label[4.6,8.75;"..S("CAR FAN").."]"
return pos,mem,changedinterrupts
diff --git a/crafts.lua b/crafts.lua
index 05303c6..6851918 100644
--- a/crafts.lua
+++ b/crafts.lua
@@ -1,9 +1,9 @@
-local xcompat_available = minetest.global_exists("xcompat")
+local xcompat_available = core.global_exists("xcompat")
local m = xcompat_available and table.copy(xcompat.materials) or {}
-- provide required materials if xcompat is missing
if not xcompat_available then
- if minetest.get_modpath("default") then
+ if core.get_modpath("default") then
m.empty_bucket = "bucket:bucket_empty"
m.iron_lump = "default:iron_lump"
m.steel_ingot = "default:steel_ingot"
@@ -16,7 +16,7 @@ if not xcompat_available then
m.mese = "default:mese"
m.pick_steel = "default:pick_steel"
m.torch = "default:torch"
- elseif minetest.get_modpath("mcl_core") then
+ elseif core.get_modpath("mcl_core") then
m.empty_bucket = "mcl_buckets:bucket_empty"
m.iron_lump = "mcl_raw_ores:raw_iron"
m.steel_ingot = "mcl_core:iron_ingot"
@@ -29,18 +29,21 @@ if not xcompat_available then
m.mese = "mesecons_torch:redstoneblock" -- mcla still carries this as an alias
m.pick_steel = "mcl_core:pick_steel"
m.torch = "mcl_torches:torch"
+ else
+ core.log("warning","[celevator] Unsupported game and xcompat not found, not registering craft recipes")
+ return
end
- if minetest.get_modpath("dye") then
+ if core.get_modpath("dye") then
m.dye_black = "dye:black"
m.dye_blue = "dye:blue"
m.dye_red = "dye:red"
m.dye_green = "dye:green"
- elseif minetest.get_modpath("mcl_dyes") then
+ elseif core.get_modpath("mcl_dyes") then
m.dye_black = "mcl_dyes:black"
m.dye_blue = "mcl_dyes:blue"
m.dye_red = "mcl_dyes:red"
m.dye_green = "mcl_dyes:green"
- elseif minetest.get_modpath("mcl_dye") then
+ elseif core.get_modpath("mcl_dye") then
m.dye_black = "mcl_dye:black"
m.dye_blue = "mcl_dye:blue"
m.dye_red = "mcl_dye:red"
@@ -48,7 +51,7 @@ if not xcompat_available then
end
end
-if minetest.get_modpath("basic_materials") then
+if core.get_modpath("basic_materials") then
m.steel_bar = "basic_materials:steel_bar"
m.steel_strip = "basic_materials:steel_strip"
m.steel_gear = "basic_materials:gear_steel"
@@ -69,8 +72,8 @@ else
end
-- vl mesecons has colored lightstone with different naming scheme
-local mc_lightstone = minetest.registered_nodes["mesecons_lightstone:lightstone_blue_off"]
-local vl_lightstone = minetest.registered_nodes["mesecons_lightstone:lightstone_off_blue"]
+local mc_lightstone = core.registered_nodes["mesecons_lightstone:lightstone_blue_off"]
+local vl_lightstone = core.registered_nodes["mesecons_lightstone:lightstone_off_blue"]
if mc_lightstone then
-- real mesecons_lightstone
m.lightstone_blue = "mesecons_lightstone:lightstone_blue_off"
@@ -93,36 +96,36 @@ else
m.lightstone_extra = m.torch
end
-local mesecons_button = minetest.registered_nodes["mesecons_button:button_off"]
+local mesecons_button = core.registered_nodes["mesecons_button:button_off"]
if mesecons_button then
-- real mesecons
m.button = mesecons_button.name
-elseif minetest.get_modpath("mcl_core") then
+elseif core.get_modpath("mcl_core") then
m.button = "group:button"
else
m.button = m.mese
end
-if minetest.get_modpath("mesecons_switch") then
+if core.get_modpath("mesecons_switch") then
-- real mesecons
m.switch = "mesecons_switch:mesecon_switch_off"
-elseif minetest.get_modpath("mcl_lever") then
+elseif core.get_modpath("mcl_lever") then
-- mcla
m.switch = "mcl_lever:lever_off"
-elseif minetest.get_modpath("mesecons_walllever") then
+elseif core.get_modpath("mesecons_walllever") then
-- other mcl
m.switch = "mesecons_walllever:wall_lever_off"
else
m.switch = m.mese
end
-if minetest.get_modpath("digilines") then
+if core.get_modpath("digilines") then
m.lcd = "digilines:lcd"
else
m.lcd = m.mese
end
-minetest.register_craft({
+core.register_craft({
output = "celevator:buffer_oil",
recipe = {
{"",m.steel_bar,""},
@@ -131,7 +134,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:buffer_rubber",
recipe = {
{m.plastic_sheet,m.dye_black,m.plastic_sheet},
@@ -140,7 +143,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:callbutton_both",
recipe = {
{m.steel_strip,m.lightstone_blue,m.button},
@@ -149,7 +152,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:callbutton_up",
recipe = {
{m.steel_strip,m.lightstone_blue,m.button},
@@ -158,7 +161,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:callbutton_down",
recipe = {
{m.steel_strip,"",""},
@@ -167,7 +170,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:car_standard",
recipe = {
{m.steel_ingot,m.steel_ingot,m.steel_ingot},
@@ -176,7 +179,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:car_glassback",
recipe = {
{m.steel_ingot,m.steel_ingot,m.steel_ingot},
@@ -185,7 +188,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:car_metal",
recipe = {
{"",m.steel_strip,""},
@@ -194,7 +197,16 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
+ output = "celevator:car_metal_glassback",
+ recipe = {
+ {"",m.steel_strip,""},
+ {m.steel_strip,"celevator:car_glassback",m.steel_strip},
+ {"",m.steel_strip,""},
+ },
+})
+
+core.register_craft({
output = "celevator:controller",
recipe = {
{m.steel_strip,m.ic,m.steel_strip},
@@ -203,7 +215,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:dispatcher",
recipe = {
{m.steel_strip,m.ic,m.steel_strip},
@@ -212,7 +224,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:drive",
recipe = {
{m.silicon,m.steel_strip,m.silicon},
@@ -221,7 +233,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:digilines_io",
recipe = {
{"","",""},
@@ -230,7 +242,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:mesecons_input_off",
recipe = {
{"","",""},
@@ -239,7 +251,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:mesecons_output_off",
recipe = {
{"","",""},
@@ -248,7 +260,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:fs1switch_off",
recipe = {
{m.steel_strip,m.lightstone_red,m.lightstone_extra},
@@ -257,7 +269,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:guide_rail 10",
recipe = {
{m.steel_strip,m.steel_ingot,m.steel_strip},
@@ -266,14 +278,14 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:guide_rail_bracket",
recipe = {
{m.steel_strip,"celevator:guide_rail",m.steel_strip},
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:hwdoor_glass",
recipe = {
{m.steel_bar,m.steel_bar,m.steel_bar},
@@ -282,7 +294,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:hwdoor_steel",
recipe = {
{m.steel_bar,m.steel_bar,m.steel_bar},
@@ -291,7 +303,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_up",
recipe = {
{m.steel_strip,m.lightstone_green},
@@ -300,7 +312,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_down",
recipe = {
{m.steel_strip,""},
@@ -309,7 +321,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_both",
recipe = {
{m.steel_strip,m.lightstone_green},
@@ -318,7 +330,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_vertical_up",
type = "shapeless",
recipe = {
@@ -326,7 +338,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_vertical_down",
type = "shapeless",
recipe = {
@@ -334,7 +346,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_vertical_both",
type = "shapeless",
recipe = {
@@ -342,7 +354,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_up",
type = "shapeless",
recipe = {
@@ -350,7 +362,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_down",
type = "shapeless",
recipe = {
@@ -358,7 +370,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:lantern_both",
type = "shapeless",
recipe = {
@@ -366,7 +378,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:machine",
recipe = {
{m.steel_gear,m.copper_wire,""},
@@ -375,7 +387,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:pi",
recipe = {
{m.steel_strip,m.lightstone_extra},
@@ -384,7 +396,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:pilantern_up",
type = "shapeless",
recipe = {
@@ -393,7 +405,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:pilantern_down",
type = "shapeless",
recipe = {
@@ -402,7 +414,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:pilantern_both",
type = "shapeless",
recipe = {
@@ -411,7 +423,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:tape 15",
recipe = {
{m.steel_strip,"",m.steel_strip},
@@ -420,7 +432,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:tape_magnets",
type = "shapeless",
recipe = {
@@ -430,7 +442,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:tape_bracket",
type = "shapeless",
recipe = {
@@ -439,7 +451,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:dbdkiosk",
recipe = {
{m.steel_strip,m.ic,m.glass},
@@ -448,7 +460,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:genericswitch",
recipe = {
{m.steel_strip,"",""},
@@ -457,7 +469,7 @@ minetest.register_craft({
},
})
-minetest.register_craft({
+core.register_craft({
output = "celevator:governor",
recipe = {
{m.steel_strip,m.steel_bar,m.button},
diff --git a/dbdkiosk.lua b/dbdkiosk.lua
index 1250685..8fa9946 100644
--- a/dbdkiosk.lua
+++ b/dbdkiosk.lua
@@ -1,32 +1,33 @@
celevator.dbdkiosk = {}
+local S = core.get_translator("celevator")
+
function celevator.dbdkiosk.checkprot(pos,name)
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"Can't open cabinet - cabinet is locked.")
- minetest.record_protection_violation(pos,name)
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.record_protection_violation(pos,name)
return false
end
return true
end
function celevator.dbdkiosk.updatefields(pos)
- if minetest.get_node(pos).name ~= "celevator:dbdkiosk" then return end
- local meta = minetest.get_meta(pos)
+ if core.get_node(pos).name ~= "celevator:dbdkiosk" then return end
+ local meta = core.get_meta(pos)
local screenstate = meta:get_string("screenstate")
if screenstate == "connect" then
meta:set_string("formspec","formspec_version[7]"..
"size[8,5]"..
- "field[0.5,0.5;7,1;carid;Dispatcher ID;]"..
- "field[0.5,2;7,1;landing;Landing Number;]"..
- "button[3,3.5;2,1;save;Save]"
+ "field[0.5,0.5;7,1;carid;"..S("Dispatcher ID")..";]"..
+ "field[0.5,2;7,1;landing;"..S("Landing Number")..";]"..
+ "button[3,3.5;2,1;save;"..S("Save").."]"
)
elseif screenstate == "main" then
local landing = meta:get_int("landing")
local fs = "formspec_version[7]"
fs = fs.."size[8,14]"
- fs = fs.."label[3,0.5;Please select a floor\\:]"
- local floornames = minetest.deserialize(meta:get_string("floornames"))
- local floorsavailable = minetest.deserialize(meta:get_string("floorsavailable"))
+ fs = fs.."label[3,0.5;"..core.formspec_escape(S("Please select a floor:")).."]"
+ local floornames = core.deserialize(meta:get_string("floornames"))
+ local floorsavailable = core.deserialize(meta:get_string("floorsavailable"))
local showfloors = {}
for i=1,#floornames,1 do
if floorsavailable[i] then
@@ -38,7 +39,7 @@ function celevator.dbdkiosk.updatefields(pos)
local floornum = showfloors[startfloor+i-1]
local floorname = floornum and floornames[floornum]
if floorname and floornum ~= landing then
- fs = fs..string.format("button[2,%f;4,1;floor%d;%s]",12-i,floornum,minetest.formspec_escape(floorname))
+ fs = fs..string.format("button[2,%f;4,1;floor%d;%s]",12-i,floornum,core.formspec_escape(floorname))
end
end
if startfloor > 1 then
@@ -51,39 +52,39 @@ function celevator.dbdkiosk.updatefields(pos)
elseif screenstate == "assignment" then
local fs = "formspec_version[7]"
fs = fs.."size[8,14]"
- fs = fs.."label[3,3;Please use elevator]"
+ fs = fs.."label[3,3;"..S("Please use elevator").."]"
fs = fs.."style_type[label;font_size=*4]"
fs = fs.."label[3.5,5;"..meta:get_string("assignedcar").."]"
meta:set_string("formspec",fs)
elseif screenstate == "error" then
local fs = "formspec_version[7]"
fs = fs.."size[8,14]"
- fs = fs.."label[3.5,0.5;ERROR]"
- fs = fs.."label[2.5,3;Could not find a suitable elevator]"
- fs = fs.."label[2.5,3.5;Please try again later]"
+ fs = fs.."label[3.5,0.5;"..S("ERROR").."]"
+ fs = fs.."label[2.5,3;"..S("Could not find a suitable elevator").."]"
+ fs = fs.."label[2.5,3.5;"..S("Please try again later").."]"
meta:set_string("formspec",fs)
end
end
function celevator.dbdkiosk.handlefields(pos,_,fields,player)
local name = player:get_player_name()
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local screenstate = meta:get_string("screenstate")
if screenstate == "connect" then
if not (fields.save and celevator.dbdkiosk.checkprot(pos,name)) then return end
if not (tonumber(fields.carid) and tonumber(fields.landing)) then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",fields.carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",fields.carid)))
if not carinfo then return end
if not (carinfo.dispatcherpos and celevator.dispatcher.isdispatcher(carinfo.dispatcherpos)) then return end
- local dmem = minetest.deserialize(minetest.get_meta(carinfo.dispatcherpos):get_string("mem"))
+ local dmem = core.deserialize(core.get_meta(carinfo.dispatcherpos):get_string("mem"))
if not dmem then return end
local floornames = dmem.params.floornames
local floorsavailable = {}
for i=1,#floornames,1 do
floorsavailable[i] = true
end
- meta:set_string("floornames",minetest.serialize(floornames))
- meta:set_string("floorsavailable",minetest.serialize(floorsavailable))
+ meta:set_string("floornames",core.serialize(floornames))
+ meta:set_string("floorsavailable",core.serialize(floorsavailable))
meta:set_int("screenpage",1)
meta:set_string("screenstate","main")
meta:set_int("carid",tonumber(fields.carid))
@@ -95,17 +96,17 @@ function celevator.dbdkiosk.handlefields(pos,_,fields,player)
local floor = tonumber(string.sub(k,6,-1))
if not floor then return end
local carid = meta:get_int("carid")
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
if not (carinfo.dispatcherpos and celevator.dispatcher.isdispatcher(carinfo.dispatcherpos)) then return end
- local dmem = minetest.deserialize(minetest.get_meta(carinfo.dispatcherpos):get_string("mem"))
+ local dmem = core.deserialize(core.get_meta(carinfo.dispatcherpos):get_string("mem"))
if dmem then
local floornames = dmem.params.floornames
- meta:set_string("floornames",minetest.serialize(floornames))
+ meta:set_string("floornames",core.serialize(floornames))
end
local event = {
type = "dbdkiosk",
- source = minetest.hash_node_position(pos),
+ source = core.hash_node_position(pos),
player = name,
srcfloor = meta:get_int("landing"),
destfloor = floor,
@@ -128,7 +129,7 @@ function celevator.dbdkiosk.handlefields(pos,_,fields,player)
end
function celevator.dbdkiosk.showassignment(pos,assignment)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
if meta:get_string("screenstate") == "main" then
local carnames = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P"}
if carnames[assignment] then
@@ -138,15 +139,15 @@ function celevator.dbdkiosk.showassignment(pos,assignment)
meta:set_string("screenstate","error")
end
celevator.dbdkiosk.updatefields(pos)
- minetest.after(5,function()
+ core.after(5,function()
meta:set_string("screenstate","main")
celevator.dbdkiosk.updatefields(pos)
end)
end
end
-minetest.register_node("celevator:dbdkiosk",{
- description = "Elevator Destination Entry Kiosk",
+core.register_node("celevator:dbdkiosk",{
+ description = S("Elevator Destination Entry Kiosk"),
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
@@ -168,7 +169,7 @@ minetest.register_node("celevator:dbdkiosk",{
"celevator_cabinet_sides.png^celevator_dbdkiosk.png",
},
on_construct = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("screenstate","connect")
celevator.dbdkiosk.updatefields(pos)
end,
diff --git a/decorations.lua b/decorations.lua
index 7c408e4..6070d8d 100644
--- a/decorations.lua
+++ b/decorations.lua
@@ -1,5 +1,7 @@
-minetest.register_node("celevator:buffer_rubber",{
- description = "Elevator Elastomeric Buffer",
+local S = core.get_translator("celevator")
+
+core.register_node("celevator:buffer_rubber",{
+ description = S("Elevator Elastomeric Buffer"),
groups = {
choppy = 1,
bouncy = 60,
@@ -39,8 +41,8 @@ minetest.register_node("celevator:buffer_rubber",{
},
})
-minetest.register_node("celevator:buffer_oil",{
- description = "Elevator Oil-Filled Buffer",
+core.register_node("celevator:buffer_oil",{
+ description = S("Elevator Oil-Filled Buffer"),
groups = {
choppy = 1,
},
@@ -65,39 +67,39 @@ minetest.register_node("celevator:buffer_oil",{
},
},
after_place_node = function(pos,placer)
- local node = minetest.get_node(pos)
+ local node = core.get_node(pos)
local toppos = {x=pos.x,y=pos.y + 1,z=pos.z}
- local topnode = minetest.get_node(toppos)
+ local topnode = core.get_node(toppos)
local placername = placer:get_player_name()
if topnode.name ~= "air" then
if placer:is_player() then
- minetest.chat_send_player(placername,"Can't place buffer - no room for the top half!")
+ core.chat_send_player(placername,"Can't place buffer - no room for the top half!")
end
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
return true
end
- if minetest.is_protected(toppos,placername) and not minetest.check_player_privs(placername,{protection_bypass=true}) then
+ if core.is_protected(toppos,placername) and not core.check_player_privs(placername,{protection_bypass=true}) then
if placer:is_player() then
- minetest.chat_send_player(placername,"Can't place buffer - top half is protected!")
- minetest.record_protection_violation(toppos,placername)
+ core.chat_send_player(placername,"Can't place buffer - top half is protected!")
+ core.record_protection_violation(toppos,placername)
end
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
return true
end
node.name = "celevator:buffer_oil_top"
- minetest.set_node(toppos,node)
+ core.set_node(toppos,node)
end,
on_destruct = function(pos)
pos.y = pos.y + 1
- local topnode = minetest.get_node(pos)
+ local topnode = core.get_node(pos)
if topnode.name == "celevator:buffer_oil_top" then
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
end
end,
})
-minetest.register_node("celevator:buffer_oil_top",{
- description = "Elevator Oil-Filled Buffer (top half - you hacker you!)",
+core.register_node("celevator:buffer_oil_top",{
+ description = S("Elevator Oil-Filled Buffer (top half - you hacker you!)"),
groups = {
choppy = 1,
not_in_creative_inventory = 1,
@@ -116,8 +118,8 @@ minetest.register_node("celevator:buffer_oil_top",{
},
})
-minetest.register_node("celevator:guide_rail",{
- description = "Elevator Guide Rail",
+core.register_node("celevator:guide_rail",{
+ description = S("Elevator Guide Rail"),
groups = {
choppy = 1,
},
@@ -140,8 +142,8 @@ minetest.register_node("celevator:guide_rail",{
},
})
-minetest.register_node("celevator:guide_rail_bracket",{
- description = "Elevator Guide Rail with Bracket",
+core.register_node("celevator:guide_rail_bracket",{
+ description = S("Elevator Guide Rail with Bracket"),
groups = {
choppy = 1,
},
@@ -169,8 +171,8 @@ minetest.register_node("celevator:guide_rail_bracket",{
},
})
-minetest.register_node("celevator:tape",{
- description = "Elevator Positioning System Tape",
+core.register_node("celevator:tape",{
+ description = S("Elevator Positioning System Tape"),
groups = {
choppy = 1,
},
@@ -194,8 +196,8 @@ minetest.register_node("celevator:tape",{
},
})
-minetest.register_node("celevator:tape_magnets",{
- description = "Elevator Positioning System Tape with Magnets",
+core.register_node("celevator:tape_magnets",{
+ description = S("Elevator Positioning System Tape with Magnets"),
groups = {
choppy = 1,
},
@@ -219,8 +221,8 @@ minetest.register_node("celevator:tape_magnets",{
},
})
-minetest.register_node("celevator:tape_bracket",{
- description = "Elevator Positioning System Tape with Bracket",
+core.register_node("celevator:tape_bracket",{
+ description = S("Elevator Positioning System Tape with Bracket"),
groups = {
choppy = 1,
},
@@ -246,14 +248,14 @@ minetest.register_node("celevator:tape_bracket",{
},
})
-minetest.register_entity("celevator:tapehead",{
+core.register_entity("celevator:tapehead",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.667,0.667,0.667),
wield_item = "celevator:tapehead",
static_save = false,
pointable = false,
- glow = minetest.LIGHT_MAX,
+ glow = core.LIGHT_MAX,
},
on_step = function(self)
local obj = self.object
@@ -261,9 +263,9 @@ minetest.register_entity("celevator:tapehead",{
local pos = obj:get_pos()
if not pos then return end
local roundpos = vector.round(pos)
- local backdir = minetest.yaw_to_dir(obj:get_yaw())
+ local backdir = core.yaw_to_dir(obj:get_yaw())
local tapepos = vector.add(roundpos,backdir)
- local tapename = minetest.get_node(tapepos).name
+ local tapename = core.get_node(tapepos).name
if tapename ~= "celevator:tape" and tapename ~= "celevator:tape_magnets" and tapename ~= "celevator:tape_bracket" then
obj:remove()
return
@@ -289,20 +291,20 @@ minetest.register_entity("celevator:tapehead",{
local function spawntapehead(pos)
local toppos = vector.add(pos,vector.new(0,1,0))
- local entitiesnearby = minetest.get_objects_inside_radius(toppos,0.5)
+ local entitiesnearby = core.get_objects_inside_radius(toppos,0.5)
for _,i in pairs(entitiesnearby) do
if i:get_luaentity() and i:get_luaentity().name == "celevator:tapehead" then
return
end
end
- local entity = minetest.add_entity(pos,"celevator:tapehead")
- local fdir = minetest.fourdir_to_dir(minetest.get_node(pos).param2)
+ local entity = core.add_entity(pos,"celevator:tapehead")
+ local fdir = core.fourdir_to_dir(core.get_node(pos).param2)
fdir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)
- entity:set_yaw(minetest.dir_to_yaw(fdir))
+ entity:set_yaw(core.dir_to_yaw(fdir))
entity:set_pos(toppos)
end
-minetest.register_abm({
+core.register_abm({
label = "Spawn tapeheads",
nodenames = {"group:_celevator_car_spawnstapehead"},
neighbors = {"celevator:tape","celevator:tape_magnets","celevator:tape_bracket"},
@@ -311,8 +313,8 @@ minetest.register_abm({
action = spawntapehead,
})
-minetest.register_node("celevator:tapehead",{
- description = "Elevator Positioning System Tapehead (off, you hacker you!)",
+core.register_node("celevator:tapehead",{
+ description = S("Elevator Positioning System Tapehead (off, you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -338,8 +340,8 @@ minetest.register_node("celevator:tapehead",{
},
})
-minetest.register_node("celevator:tapehead_ulm",{
- description = "Elevator Positioning System Tapehead (ULM on, you hacker you!)",
+core.register_node("celevator:tapehead_ulm",{
+ description = S("Elevator Positioning System Tapehead (ULM on, you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -365,8 +367,8 @@ minetest.register_node("celevator:tapehead_ulm",{
},
})
-minetest.register_node("celevator:tapehead_ulm_dz",{
- description = "Elevator Positioning System Tapehead (ULM and DZ on, you hacker you!)",
+core.register_node("celevator:tapehead_ulm_dz",{
+ description = S("Elevator Positioning System Tapehead (ULM and DZ on, you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -392,8 +394,8 @@ minetest.register_node("celevator:tapehead_ulm_dz",{
},
})
-minetest.register_node("celevator:tapehead_ulm_dlm_dz",{
- description = "Elevator Positioning System Tapehead (ULM, DLM, and DZ on, you hacker you!)",
+core.register_node("celevator:tapehead_ulm_dlm_dz",{
+ description = S("Elevator Positioning System Tapehead (ULM, DLM, and DZ on, you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -419,8 +421,8 @@ minetest.register_node("celevator:tapehead_ulm_dlm_dz",{
},
})
-minetest.register_node("celevator:tapehead_dlm_dz",{
- description = "Elevator Positioning System Tapehead (DLM and DZ on, you hacker you!)",
+core.register_node("celevator:tapehead_dlm_dz",{
+ description = S("Elevator Positioning System Tapehead (DLM and DZ on, you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -446,8 +448,8 @@ minetest.register_node("celevator:tapehead_dlm_dz",{
},
})
-minetest.register_node("celevator:tapehead_dlm",{
- description = "Elevator Positioning System Tapehead (DLM on, you hacker you!)",
+core.register_node("celevator:tapehead_dlm",{
+ description = S("Elevator Positioning System Tapehead (DLM on, you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
diff --git a/digilines.lua b/digilines.lua
index 8f5c220..60fa469 100644
--- a/digilines.lua
+++ b/digilines.lua
@@ -1,15 +1,17 @@
+local S = core.get_translator("celevator")
+
local function handledigilines(pos,node,channel,msg)
local multi = node.name == "celevator:digilines_multi_io"
if msg == "GET" then msg = {command = "GET"} end
if type(msg) ~= "table" or type(msg.command) ~= "string" then return end
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local setchannel = meta:get_string("channel")
if setchannel ~= channel then return end
if multi and type(msg.carid) ~= "number" then return end
local carid = multi and msg.carid or meta:get_int("carid")
if carid == 0 then return end
local dmode = meta:get_int("dispatcher") == 1
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if multi then
dmode = carinfo.dispatcherpos
end
@@ -18,7 +20,7 @@ local function handledigilines(pos,node,channel,msg)
if not carinfo.dispatcherpos then return end
if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then return end
if msg.command == "get" then
- local mem = minetest.deserialize(minetest.get_meta(carinfo.dispatcherpos):get_string("mem"))
+ local mem = core.deserialize(core.get_meta(carinfo.dispatcherpos):get_string("mem"))
if not mem then return end
local ret = {
upcalls = {},
@@ -67,7 +69,7 @@ local function handledigilines(pos,node,channel,msg)
if not carinfo.controllerpos then return end
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
if msg.command == "get" then
- local mem = minetest.deserialize(minetest.get_meta(carinfo.controllerpos):get_string("mem"))
+ local mem = core.deserialize(core.get_meta(carinfo.controllerpos):get_string("mem"))
if not mem then return end
local ret = {
carstate = mem.carstate,
@@ -174,8 +176,8 @@ local function handledigilines(pos,node,channel,msg)
end
end
-minetest.register_node("celevator:digilines_io",{
- description = "Elevator Digilines Input/Output",
+core.register_node("celevator:digilines_io",{
+ description = S("Elevator Digilines Input/Output"),
tiles = {
"celevator_digilinesio_top.png",
"celevator_cabinet_sides.png",
@@ -199,27 +201,27 @@ minetest.register_node("celevator:digilines_io",{
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local fs = "formspec_version[7]size[8,4.5]"
- fs = fs.."field[0.5,0.5;3,1;channel;Channel;${channel}]"
- fs = fs.."field[4.5,0.5;3,1;carid;Car ID;${carid}]"
- fs = fs.."button_exit[2.5,2;3,1;save;Save]"
+ fs = fs.."field[0.5,0.5;3,1;channel;"..S("Channel")..";${channel}]"
+ fs = fs.."field[4.5,0.5;3,1;carid;"..S("Car ID")..";${carid}]"
+ fs = fs.."button_exit[2.5,2;3,1;save;"..S("Save").."]"
meta:set_string("formspec",fs)
end,
on_receive_fields = function(pos,_,fields,player)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
if not fields.save then return end
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.record_protection_violation(pos,name)
+ core.record_protection_violation(pos,name)
end
return
end
if not tonumber(fields.carid) then return end
meta:set_int("carid",fields.carid)
local carid = tonumber(fields.carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if not (carinfo.controllerpos or carinfo.dispatcherpos) then return end
local dmode = false
if carinfo.dispatcherpos then
@@ -229,31 +231,31 @@ minetest.register_node("celevator:digilines_io",{
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
end
if dmode then
- if minetest.is_protected(carinfo.dispatcherpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.dispatcherpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a dispatcher you don't have access to.")
- minetest.record_protection_violation(carinfo.dispatcherpos,name)
+ core.chat_send_player(name,S("Can't connect to a dispatcher you don't have access to."))
+ core.record_protection_violation(carinfo.dispatcherpos,name)
end
return
end
else
- if minetest.is_protected(carinfo.controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.controllerpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a controller you don't have access to.")
- minetest.record_protection_violation(carinfo.controllerpos,name)
+ core.chat_send_player(name,S("Can't connect to a controller you don't have access to."))
+ core.record_protection_violation(carinfo.controllerpos,name)
end
return
end
end
meta:set_int("dispatcher",dmode and 1 or 0)
meta:set_string("channel",fields.channel)
- local infotext = "Car: "..carid
+ local infotext = S("ID: @1",carid)
meta:set_string("infotext",infotext)
end,
})
-minetest.register_node("celevator:digilines_multi_io",{
- description = "Elevator Digilines Multi-Car Input/Output",
+core.register_node("celevator:digilines_multi_io",{
+ description = S("Elevator Digilines Multi-Car Input/Output"),
tiles = {
"celevator_digilinesio_multi_top.png",
"celevator_cabinet_sides.png",
@@ -279,28 +281,28 @@ minetest.register_node("celevator:digilines_multi_io",{
},
after_place_node = function(pos,player)
local name = player:get_player_name()
- if not (minetest.check_player_privs(name,{protection_bypass=true}) or minetest.check_player_privs(name,{server=true})) then
+ if not (core.check_player_privs(name,{protection_bypass=true}) or core.check_player_privs(name,{server=true})) then
if player:is_player() then
- minetest.chat_send_player(name,"You need either the 'protection_bypass' or 'server' privilege to use this.")
- minetest.record_protection_violation(pos,name)
+ core.chat_send_player(name,S("You need either the 'protection_bypass' or 'server' privilege to use this."))
+ core.record_protection_violation(pos,name)
end
- minetest.remove_node(pos)
+ core.remove_node(pos)
return
end
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local fs = "formspec_version[7]size[8,4.5]"
- fs = fs.."field[0.5,0.5;7,1;channel;Channel;${channel}]"
- fs = fs.."button_exit[2.5,2;3,1;save;Save]"
+ fs = fs.."field[0.5,0.5;7,1;channel;"..S("Channel")..";${channel}]"
+ fs = fs.."button_exit[2.5,2;3,1;save;"..S("Save").."]"
meta:set_string("formspec",fs)
end,
on_receive_fields = function(pos,_,fields,player)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
if not fields.save then return end
local name = player:get_player_name()
- if not (minetest.check_player_privs(name,{protection_bypass=true}) or minetest.check_player_privs(name,{server=true})) then
+ if not (core.check_player_privs(name,{protection_bypass=true}) or core.check_player_privs(name,{server=true})) then
if player:is_player() then
- minetest.chat_send_player(name,"You need either the 'protection_bypass' or 'server' privilege to use this.")
- minetest.record_protection_violation(pos,name)
+ core.chat_send_player(name,S("You need either the 'protection_bypass' or 'server' privilege to use this."))
+ core.record_protection_violation(pos,name)
end
return
end
diff --git a/dispatcher.lua b/dispatcher.lua
index a8bcf1c..5a2cef5 100644
--- a/dispatcher.lua
+++ b/dispatcher.lua
@@ -1,23 +1,25 @@
celevator.dispatcher = {}
-celevator.dispatcher.iqueue = minetest.deserialize(celevator.storage:get_string("dispatcher_iqueue")) or {}
+local S = core.get_translator("celevator")
-celevator.dispatcher.equeue = minetest.deserialize(celevator.storage:get_string("dispatcher_equeue")) or {}
+celevator.dispatcher.iqueue = core.deserialize(celevator.storage:get_string("dispatcher_iqueue")) or {}
+
+celevator.dispatcher.equeue = core.deserialize(celevator.storage:get_string("dispatcher_equeue")) or {}
celevator.dispatcher.running = {}
-local fw,err = loadfile(minetest.get_modpath("celevator")..DIR_DELIM.."dispatcherfw.lua")
+local fw,err = loadfile(core.get_modpath("celevator").."/dispatcherfw.lua")
if not fw then error(err) end
-minetest.register_chatcommand("celevator_reloaddispatcher",{
+core.register_chatcommand("celevator_reloaddispatcher",{
params = "",
description = "Reload celevator dispatcher firmware from disk",
privs = {server = true},
func = function()
- local newfw,loaderr = loadfile(minetest.get_modpath("celevator")..DIR_DELIM.."dispatcherfw.lua")
+ local newfw,loaderr = loadfile(core.get_modpath("celevator").."/dispatcherfw.lua")
if newfw then
fw = newfw
- return true,"Firmware reloaded successfully"
+ return true,S("Firmware reloaded successfully")
else
return false,loaderr
end
@@ -25,57 +27,57 @@ minetest.register_chatcommand("celevator_reloaddispatcher",{
})
local function after_place(pos,placer)
- local node = minetest.get_node(pos)
+ local node = core.get_node(pos)
local toppos = {x=pos.x,y=pos.y + 1,z=pos.z}
- local topnode = minetest.get_node(toppos)
+ local topnode = core.get_node(toppos)
local placername = placer:get_player_name()
if topnode.name ~= "air" then
if placer:is_player() then
- minetest.chat_send_player(placername,"Can't place cabinet - no room for the top half!")
+ core.chat_send_player(placername,S("Can't place cabinet - no room for the top half!"))
end
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
return true
end
- if minetest.is_protected(toppos,placername) and not minetest.check_player_privs(placername,{protection_bypass=true}) then
+ if core.is_protected(toppos,placername) and not core.check_player_privs(placername,{protection_bypass=true}) then
if placer:is_player() then
- minetest.chat_send_player(placername,"Can't place cabinet - top half is protected!")
- minetest.record_protection_violation(toppos,placername)
+ core.chat_send_player(placername,S("Can't place cabinet - top half is protected!"))
+ core.record_protection_violation(toppos,placername)
end
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
return true
end
node.name = "celevator:dispatcher_top"
- minetest.set_node(toppos,node)
+ core.set_node(toppos,node)
end
local function ondestruct(pos)
pos.y = pos.y + 1
- local topnode = minetest.get_node(pos)
+ local topnode = core.get_node(pos)
local dispatchertops = {
["celevator:dispatcher_top"] = true,
["celevator:dispatcher_top_open"] = true,
}
if dispatchertops[topnode.name] then
- minetest.set_node(pos,{name="air"})
+ core.set_node(pos,{name="air"})
end
- celevator.dispatcher.equeue[minetest.hash_node_position(pos)] = nil
- celevator.storage:set_string("dispatcher_equeue",minetest.serialize(celevator.dispatcher.equeue))
- local carid = minetest.get_meta(pos):get_int("carid")
+ celevator.dispatcher.equeue[core.hash_node_position(pos)] = nil
+ celevator.storage:set_string("dispatcher_equeue",core.serialize(celevator.dispatcher.equeue))
+ local carid = core.get_meta(pos):get_int("carid")
if carid ~= 0 then celevator.storage:set_string(string.format("car%d",carid),"") end
end
local function onrotate(controllerpos,node,user,mode,new_param2)
- if not minetest.global_exists("screwdriver") then
+ if not core.global_exists("screwdriver") then
return false
end
local ret = screwdriver.rotate_simple(controllerpos,node,user,mode,new_param2)
- minetest.after(0,function(pos)
- local newnode = minetest.get_node(pos)
+ core.after(0,function(pos)
+ local newnode = core.get_node(pos)
local param2 = newnode.param2
pos.y = pos.y + 1
- local topnode = minetest.get_node(pos)
+ local topnode = core.get_node(pos)
topnode.param2 = param2
- minetest.set_node(pos,topnode)
+ core.set_node(pos,topnode)
end,controllerpos)
return ret
end
@@ -94,13 +96,13 @@ local function candig(_,player)
if controls.sneak then
return true
else
- minetest.chat_send_player(player:get_player_name(),"Hold the sneak button while digging to remove.")
+ core.chat_send_player(player:get_player_name(),S("Hold the sneak button while digging to remove."))
return false
end
end
-minetest.register_node("celevator:dispatcher",{
- description = "Elevator Dispatcher",
+core.register_node("celevator:dispatcher",{
+ description = S("Elevator Dispatcher"),
groups = {
cracky = 1,
},
@@ -133,15 +135,15 @@ minetest.register_node("celevator:dispatcher",{
on_receive_fields = handlefields,
can_dig = candig,
on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("mem",minetest.serialize({}))
+ local meta = core.get_meta(pos)
+ meta:set_string("mem",core.serialize({}))
meta:mark_as_private("mem")
local event = {}
event.type = "program"
local carid = celevator.storage:get_int("maxcarid")+1
meta:set_int("carid",carid)
celevator.storage:set_int("maxcarid",carid)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize({dispatcherpos=pos,callbuttons={},fs1switches={}}))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize({dispatcherpos=pos,callbuttons={},fs1switches={}}))
celevator.dispatcher.run(pos,event)
end,
on_punch = function(pos,node,puncher)
@@ -149,20 +151,20 @@ minetest.register_node("celevator:dispatcher",{
return
end
local name = puncher:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"Can't open cabinet - cabinet is locked.")
- minetest.record_protection_violation(pos,name)
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("Can't open cabinet - cabinet is locked."))
+ core.record_protection_violation(pos,name)
return
end
node.name = "celevator:dispatcher_open"
- minetest.swap_node(pos,node)
- local meta = minetest.get_meta(pos)
+ core.swap_node(pos,node)
+ local meta = core.get_meta(pos)
meta:set_string("formspec",meta:get_string("formspec_hidden"))
pos.y = pos.y + 1
- node = minetest.get_node(pos)
+ node = core.get_node(pos)
node.name = "celevator:dispatcher_top_open"
- minetest.swap_node(pos,node)
- minetest.sound_play("celevator_cabinet_open",{
+ core.swap_node(pos,node)
+ core.sound_play("celevator_cabinet_open",{
pos = pos,
gain = 0.5,
max_hear_distance = 10
@@ -170,8 +172,8 @@ minetest.register_node("celevator:dispatcher",{
end,
})
-minetest.register_node("celevator:dispatcher_open",{
- description = "Dispatcher (door open - you hacker you!)",
+core.register_node("celevator:dispatcher_open",{
+ description = S("Dispatcher (door open - you hacker you!)"),
groups = {
cracky = 1,
not_in_creative_inventory = 1,
@@ -215,14 +217,14 @@ minetest.register_node("celevator:dispatcher_open",{
return
end
node.name = "celevator:dispatcher"
- minetest.swap_node(pos,node)
- local meta = minetest.get_meta(pos)
+ core.swap_node(pos,node)
+ local meta = core.get_meta(pos)
meta:set_string("formspec","")
pos.y = pos.y + 1
- node = minetest.get_node(pos)
+ node = core.get_node(pos)
node.name = "celevator:dispatcher_top"
- minetest.swap_node(pos,node)
- minetest.sound_play("celevator_cabinet_close",{
+ core.swap_node(pos,node)
+ core.sound_play("celevator_cabinet_close",{
pos = pos,
gain = 0.5,
max_hear_distance = 10
@@ -230,8 +232,8 @@ minetest.register_node("celevator:dispatcher_open",{
end,
})
-minetest.register_node("celevator:dispatcher_top",{
- description = "Dispatcher (top section - you hacker you!)",
+core.register_node("celevator:dispatcher_top",{
+ description = S("Dispatcher (top section - you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -261,8 +263,8 @@ minetest.register_node("celevator:dispatcher_top",{
},
})
-minetest.register_node("celevator:dispatcher_top_open",{
- description = "Dispatcher (top section, open - you hacker you!)",
+core.register_node("celevator:dispatcher_top_open",{
+ description = S("Dispatcher (top section, open - you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -303,16 +305,16 @@ function celevator.dispatcher.finish(pos,mem,changedinterrupts)
if not celevator.dispatcher.isdispatcher(pos) then
return
else
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
local carinfodirty = false
if not carinfo then
- minetest.log("error","[celevator] [controller] Bad car info for dispatcher at "..minetest.pos_to_string(pos))
+ core.log("error",string.format("[celevator] [dispatcher] Bad car info for dispatcher at %s",core.pos_to_string(pos)))
return
end
local node = celevator.get_node(pos)
- local oldmem = minetest.deserialize(meta:get_string("mem")) or {}
+ local oldmem = core.deserialize(meta:get_string("mem")) or {}
local oldupbuttonlights = oldmem.upcalls or {}
local olddownbuttonlights = oldmem.dncalls or {}
local newupbuttonlights = mem.upcalls or {}
@@ -335,7 +337,7 @@ function celevator.dispatcher.finish(pos,mem,changedinterrupts)
end
end
for _,message in ipairs(mem.messages) do
- local destinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",message.carid)))
+ local destinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",message.carid)))
if destinfo and destinfo.controllerpos then
celevator.controller.run(destinfo.controllerpos,{
type = "dispatchermsg",
@@ -346,27 +348,27 @@ function celevator.dispatcher.finish(pos,mem,changedinterrupts)
end
end
for _,message in ipairs(mem.kioskmessages) do
- celevator.dbdkiosk.showassignment(minetest.get_position_from_hash(message.pos),message.car)
+ celevator.dbdkiosk.showassignment(core.get_position_from_hash(message.pos),message.car)
end
- meta:set_string("mem",minetest.serialize(mem))
+ meta:set_string("mem",core.serialize(mem))
if node.name == "celevator:dispatcher_open" then meta:set_string("formspec",mem.formspec or "") end
meta:set_string("formspec_hidden",mem.formspec or "")
meta:set_string("infotext",mem.infotext or "")
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if not celevator.dispatcher.iqueue[hash] then celevator.dispatcher.iqueue[hash] = mem.interrupts end
for iid in pairs(changedinterrupts) do
celevator.dispatcher.iqueue[hash][iid] = mem.interrupts[iid]
end
- celevator.storage:set_string("dispatcher_iqueue",minetest.serialize(celevator.dispatcher.iqueue))
+ celevator.storage:set_string("dispatcher_iqueue",core.serialize(celevator.dispatcher.iqueue))
celevator.dispatcher.running[hash] = nil
if #celevator.dispatcher.equeue[hash] > 0 then
local event = celevator.dispatcher.equeue[hash][1]
table.remove(celevator.dispatcher.equeue[hash],1)
- celevator.storage:set_string("dispatcher_equeue",minetest.serialize(celevator.dispatcher.equeue))
+ celevator.storage:set_string("dispatcher_equeue",core.serialize(celevator.dispatcher.equeue))
celevator.dispatcher.run(pos,event)
end
if carinfodirty then
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end
@@ -375,30 +377,32 @@ function celevator.dispatcher.run(pos,event)
if not celevator.dispatcher.isdispatcher(pos) then
return
else
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if not celevator.dispatcher.equeue[hash] then
celevator.dispatcher.equeue[hash] = {}
- celevator.storage:set_string("dispatcher_equeue",minetest.serialize(celevator.dispatcher.equeue))
+ celevator.storage:set_string("dispatcher_equeue",core.serialize(celevator.dispatcher.equeue))
end
if celevator.dispatcher.running[hash] then
table.insert(celevator.dispatcher.equeue[hash],event)
- celevator.storage:set_string("dispatcher_equeue",minetest.serialize(celevator.dispatcher.equeue))
+ celevator.storage:set_string("dispatcher_equeue",core.serialize(celevator.dispatcher.equeue))
if #celevator.dispatcher.equeue[hash] > 20 then
- local message = "[celevator] [dispatcher] Async process for dispatcher at %s is falling behind, %d events in queue"
- minetest.log("warning",string.format(message,minetest.pos_to_string(pos),#celevator.dispatcher.equeue[hash]))
+ local pstring = core.pos_to_string(pos)
+ local queuelen = #celevator.dispatcher.equeue[hash]
+ local message = string.format("[celevator] [dispatcher] Async process for dispatcher at %s is falling behind, %d events in queue",pstring,queuelen)
+ core.log("warning",message)
end
return
end
celevator.dispatcher.running[hash] = true
- local meta = minetest.get_meta(pos)
- local mem = minetest.deserialize(meta:get_string("mem"))
+ local meta = core.get_meta(pos)
+ local mem = core.deserialize(meta:get_string("mem"))
if not mem then
- minetest.log("error","[celevator] [controller] Failed to load dispatcher memory at "..minetest.pos_to_string(pos))
+ core.log("error",string.format("[celevator] [dispatcher] Failed to load dispatcher memory at %s",core.pos_to_string(pos)))
return
end
- mem.interrupts = celevator.dispatcher.iqueue[minetest.hash_node_position(pos)] or {}
+ mem.interrupts = celevator.dispatcher.iqueue[core.hash_node_position(pos)] or {}
mem.carid = meta:get_int("carid")
- minetest.handle_async(fw,celevator.dispatcher.finish,pos,event,mem)
+ core.handle_async(fw,celevator.dispatcher.finish,pos,event,mem)
end
end
@@ -421,8 +425,10 @@ end
function celevator.dispatcher.checkiqueue(dtime)
for hash,iqueue in pairs(celevator.dispatcher.iqueue) do
- local pos = minetest.get_position_from_hash(hash)
+ local pos = core.get_position_from_hash(hash)
+ local noneleft = true
for iid,time in pairs(iqueue) do
+ noneleft = false
iqueue[iid] = time-dtime
if iqueue[iid] < 0 then
iqueue[iid] = nil
@@ -432,12 +438,16 @@ function celevator.dispatcher.checkiqueue(dtime)
celevator.dispatcher.run(pos,event)
end
end
+ if noneleft then
+ celevator.dispatcher.iqueue[hash] = nil
+ celevator.storage:set_string("dispatcher_iqueue",core.serialize(celevator.dispatcher.iqueue))
+ end
end
end
-minetest.register_globalstep(celevator.dispatcher.checkiqueue)
+core.register_globalstep(celevator.dispatcher.checkiqueue)
-minetest.register_abm({
+core.register_abm({
label = "Run otherwise idle dispatchers if a user is nearby",
nodenames = {"celevator:dispatcher","celevator:dispatcher_open"},
interval = 1,
diff --git a/dispatcherfw.lua b/dispatcherfw.lua
index 25ad4f8..4d6aa82 100644
--- a/dispatcherfw.lua
+++ b/dispatcherfw.lua
@@ -1,5 +1,7 @@
local pos,event,mem = ...
+local S = core.get_translator("celevator")
+
local changedinterrupts = {}
local function interrupt(time,iid)
@@ -240,6 +242,7 @@ local function estimatetraveltime(carid,src,dest)
end
local function buildstopsequence(carid,startfloor,direction,target,targetdir,leaving)
+ if not startfloor then return {} end
local carcalls = cartorealfloor(carid,mem.carstatus[carid].carcalls)
local upcalls = cartorealfloor(carid,mem.carstatus[carid].upcalls)
local dncalls = cartorealfloor(carid,mem.carstatus[carid].dncalls)
@@ -258,7 +261,9 @@ local function buildstopsequence(carid,startfloor,direction,target,targetdir,lea
end
repeat
local src = carpos
+ if not src then return sequence end
carpos,direction = predictnextstop(carid,carpos,direction,carcalls,upcalls,dncalls,leaving)
+ if not carpos then return sequence end
carcalls[carpos] = nil
if direction == "up" then
upcalls[carpos] = nil
@@ -300,6 +305,27 @@ local function fs(element)
mem.formspec = mem.formspec..element
end
+if mem.params and #mem.params.floornames < 2 then
+ mem.params.floorheights = {5,5,5}
+ mem.params.floornames = {"1","2","3"}
+ for _,carid in ipairs(mem.params.carids) do
+ local floornames = {}
+ local floorheights = {}
+ for i=1,#mem.params.floornames,1 do
+ if mem.params.floorsserved[carid][i] then
+ table.insert(floornames,mem.params.floornames[i])
+ table.insert(floorheights,mem.params.floorheights[i])
+ elseif #floornames > 0 then
+ floorheights[#floorheights] = floorheights[#floorheights]+mem.params.floorheights[i]
+ end
+ end
+ send(carid,"newfloortable",{
+ floornames = floornames,
+ floorheights = floorheights,
+ })
+ end
+end
+
if event.type == "program" then
mem.carstatus = {}
mem.screenstate = "oobe_welcome"
@@ -335,7 +361,7 @@ elseif event.type == "ui" then
mem.screenstate = "oobe_welcome"
end
elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" then
- local exp = event.fields.floor and minetest.explode_textlist_event(event.fields.floor) or {}
+ local exp = event.fields.floor and core.explode_textlist_event(event.fields.floor) or {}
if event.fields.back then
mem.screenstate = "oobe_welcome"
elseif event.fields.next then
@@ -367,7 +393,7 @@ elseif event.type == "ui" then
elseif event.fields.add then
table.insert(mem.params.floorheights,5)
table.insert(mem.params.floornames,tostring(#mem.params.floornames+1))
- elseif event.fields.remove then
+ elseif event.fields.remove and #mem.params.floornames > 2 then
table.remove(mem.params.floorheights,mem.editingfloor)
table.remove(mem.params.floornames,mem.editingfloor)
mem.editingfloor = math.max(1,mem.editingfloor-1)
@@ -399,7 +425,7 @@ elseif event.type == "ui" then
mem.params.floornames[mem.editingfloor] = string.sub(event.fields.name,1,256)
end
elseif mem.screenstate == "oobe_connections" or mem.screenstate == "connections" then
- local exp = event.fields.connection and minetest.explode_textlist_event(event.fields.connection) or {}
+ local exp = event.fields.connection and core.explode_textlist_event(event.fields.connection) or {}
if event.fields.back then
mem.screenstate = "oobe_floortable"
elseif event.fields.next and #mem.params.carids > 0 then
@@ -425,7 +451,7 @@ elseif event.type == "ui" then
mem.editingconnection = math.max(1,mem.editingconnection-1)
end
elseif mem.screenstate == "oobe_newconnection" or mem.screenstate == "newconnection" then
- local exp = event.fields.floors and minetest.explode_textlist_event(event.fields.floors) or {}
+ local exp = event.fields.floors and core.explode_textlist_event(event.fields.floors) or {}
if event.fields.back then
mem.screenstate = (mem.screenstate == "oobe_newconnection" and "oobe_connections" or "connections")
elseif event.fields.connect and fields.carid and tonumber(fields.carid) then
@@ -450,7 +476,7 @@ elseif event.type == "ui" then
mem.newconnfloors[floor] = not mem.newconnfloors[floor]
end
elseif mem.screenstate == "oobe_connection" or mem.screenstate == "connection" then
- local exp = event.fields.floors and minetest.explode_textlist_event(event.fields.floors) or {}
+ local exp = event.fields.floors and core.explode_textlist_event(event.fields.floors) or {}
if event.fields.back then
mem.screenstate = (mem.screenstate == "oobe_connection" and "oobe_connections" or "connections")
elseif event.fields.save then
@@ -906,134 +932,138 @@ fs("background9[0,0;16,12;celevator_fs_bg.png;true;3]")
if mem.screenstate == "oobe_welcome" then
fs("image[6,1;4,2;celevator_logo.png]")
- fs("label[1,4;Welcome to your new MTronic XT elevator dispatcher!]")
- fs("label[1,4.5;Before continuing, make sure you have at least two controllers in group operation mode and ready to connect.]")
- fs("label[1,5.5;Press Next to begin.]")
- fs("button[1,10;2,1;license;License Info]")
- fs("button[13,10;2,1;next;Next >]")
+ fs("label[1,4;"..S("Welcome to your new MTronic XT elevator dispatcher!").."]")
+ fs("label[1,4.5;"..S("Before continuing, make sure you have at least two controllers in group operation mode and ready to connect.").."]")
+ fs("label[1,5.5;"..S("Press Next to begin.").."]")
+ fs("button[1,10;3,1;license;"..S("License Info").."]")
+ fs("button[13,10;2,1;next;"..S("Next >").."]")
elseif mem.screenstate == "oobe_license" then
- local licensefile = io.open(minetest.get_modpath("celevator")..DIR_DELIM.."LICENSE")
- local license = minetest.formspec_escape(licensefile:read("*all"))
+ local licensefile = io.open(core.get_modpath("celevator").."/LICENSE")
+ local license = core.formspec_escape(licensefile:read("*all"))
licensefile:close()
- fs("textarea[1,1;14,8;license;This applies to the whole celevator mod\\, not just this dispatcher:;"..license.."]")
+ fs("textarea[1,1;14,8;license;"..core.formspec_escape(S("This applies to the whole celevator mod, not just this dispatcher:"))..";"..license.."]")
fs("button[7,10.5;2,1;back;OK]")
elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" then
if mem.screenstate == "oobe_floortable" then
- fs("label[1,1;Enter details of all floors this group will serve, then press Next.]")
- fs("label[1,1.3;Include all floors served by any car in the group, even if not served by all cars.]")
- fs("button[1,10;2,1;back;< Back]")
- fs("button[13,10;2,1;next;Next >]")
+ fs("label[1,1;"..S("Enter details of all floors this group will serve, then press Next.").."]")
+ fs("label[1,1.3;"..S("Include all floors served by any car in the group, even if not served by all cars.").."]")
+ fs("button[1,10;2,1;back;"..S("< Back").."]")
+ fs("button[13,10;2,1;next;"..S("Next >").."]")
else
- fs("label[1,1;EDIT FLOOR TABLE]")
- fs("button[1,10;2,1;next;Done]")
+ fs("label[1,1;"..S("EDIT FLOOR TABLE").."]")
+ fs("button[1,10;2,1;next;"..S("Done").."]")
end
fs("textlist[1,2;6,7;floor;")
for i=#mem.params.floornames,1,-1 do
- fs(minetest.formspec_escape(string.format("%d - Height: %d - PI: %s",i,mem.params.floorheights[i],mem.params.floornames[i]))..(i==1 and "" or ","))
+ local floortext = S("@1 - Height: @2 - PI: @3",i,mem.params.floorheights[i],mem.params.floornames[i])
+ fs(core.formspec_escape(floortext)..(i==1 and "" or ","))
end
fs(";"..tostring(#mem.params.floornames-mem.editingfloor+1)..";false]")
- if #mem.params.floornames < 100 then fs("button[8,2;2,1;add;New Floor]") end
- fs("button[8,3.5;2,1;edit;Edit Floor]")
- if #mem.params.floornames > 2 then fs("button[8,5;2,1;remove;Remove Floor]") end
- if mem.editingfloor < #mem.params.floornames then fs("button[8,6.5;2,1;moveup;Move Up]") end
- if mem.editingfloor > 1 then fs("button[8,8;2,1;movedown;Move Down") end
+ if #mem.params.floornames < 100 then fs("button[8,2;2,1;add;"..S("New Floor").."]") end
+ fs("button[8,3.5;2,1;edit;"..S("Edit Floor").."]")
+ if #mem.params.floornames > 2 then fs("button[8,5;2,1;remove;"..S("Remove Floor").."]") end
+ if mem.editingfloor < #mem.params.floornames then fs("button[8,6.5;2,1;moveup;"..S("Move Up").."]") end
+ if mem.editingfloor > 1 then fs("button[8,8;2,1;movedown;"..S("Move Down").."]") end
elseif mem.screenstate == "oobe_floortable_edit" or mem.screenstate == "floortable_edit" then
if mem.screenstate == "oobe_floortable_edit" then
- fs("button[7,10.5;2,1;back;OK]")
- fs("label[1,5;The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.]")
- fs("label[1,5.5;(not used at the highest floor)]")
- fs("label[1,6.5;The Floor Name is how the floor will be displayed on the position indicators.]")
+ fs("button[7,10.5;2,1;back;"..S("OK").."]")
+ local help1 = S("The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.")
+ local help2 = S("(not used at the highest floor)")
+ local help3 = S("The Floor Name is how the floor will be displayed on the position indicators.")
+ fs("label[1,5;"..help1.."]")
+ fs("label[1,5.5;"..help2.."]")
+ fs("label[1,6.5;"..help3.."]")
else
- fs("button[7,10.5;2,1;save;Save]")
+ fs("button[7,10.5;2,1;save;"..S("Save").."]")
end
- fs("label[1,1;Editing floor "..tostring(mem.editingfloor).."]")
- fs("field[1,3;3,1;height;Floor Height;"..tostring(mem.params.floorheights[mem.editingfloor]).."]")
- fs("field[5,3;3,1;name;Floor Name;"..minetest.formspec_escape(mem.params.floornames[mem.editingfloor]).."]")
+ fs("label[1,1;"..S("Editing Floor @1",tostring(mem.editingfloor)).."]")
+ fs("field[1,3;3,1;height;"..S("Floor Height")..";"..tostring(mem.params.floorheights[mem.editingfloor]).."]")
+ fs("field[5,3;3,1;name;"..S("Floor Name")..";"..core.formspec_escape(mem.params.floornames[mem.editingfloor]).."]")
elseif mem.screenstate == "oobe_connections" or mem.screenstate == "connections" then
if mem.screenstate == "oobe_connections" then
- fs("label[1,1;Connect to each car in the group, then click Done.]")
- fs("button[1,10;2,1;back;< Back]")
- if #mem.params.carids > 0 then fs("button[13,10;2,1;next;Done >]") end
+ fs("label[1,1;"..S("Connect to each car in the group, then click Done.").."]")
+ fs("button[1,10;2,1;back;"..S("< Back").."]")
+ if #mem.params.carids > 0 then fs("button[13,10;2,1;next;"..S("Done").."]") end
else
- fs("label[1,1;EDIT CONNECTIONS]")
- if #mem.params.carids > 0 then fs("button[1,10;2,1;next;Done]") end
+ fs("label[1,1;"..S("EDIT CONNECTIONS").."]")
+ if #mem.params.carids > 0 then fs("button[1,10;2,1;next;"..S("Done").."]") end
end
if #mem.params.carids > 0 then
fs("textlist[1,2;6,7;connection;")
for i=#mem.params.carids,1,-1 do
- fs(string.format("Car %d - ID #%d",i,mem.params.carids[i])..(i==1 and "" or ","))
+ local connectiontext = S("Car @1 - ID #@2",i,mem.params.carids[i])
+ fs(connectiontext..(i==1 and "" or ","))
end
fs(";"..tostring(#mem.params.carids-mem.editingconnection+1)..";false]")
else
- fs("label[1,2;No Connections]")
+ fs("label[1,2;"..S("No Connections").."]")
end
- if #mem.params.carids < 16 then fs("button[8,2;3,1;add;New Connection]") end
- if #mem.params.carids > 0 then fs("button[8,3.5;3,1;edit;Edit Connection]") end
- if #mem.params.carids > 0 then fs("button[8,5;3,1;remove;Remove Connection]") end
+ if #mem.params.carids < 16 then fs("button[8,2;3,1;add;"..S("New Connection").."]") end
+ if #mem.params.carids > 0 then fs("button[8,3.5;3,1;edit;"..S("Edit Connection").."]") end
+ if #mem.params.carids > 0 then fs("button[8,5;3,1;remove;"..S("Remove Connection").."]") end
elseif mem.screenstate == "oobe_newconnection" or mem.screenstate == "newconnection" then
local numfloors = 0
for _,v in ipairs(mem.newconnfloors) do
if v then numfloors = numfloors + 1 end
end
if mem.screenstate == "oobe_newconnection" then
- fs("label[1,1;Enter the car ID and select the floors served (click them to toggle), then click Connect.]")
- fs("label[1,1.3;You must select at least two floors.]")
- fs("button[1,10;2,1;back;< Back]")
- if numfloors >= 2 then fs("button[13,10;2,1;connect;Connect >]") end
+ fs("label[1,1;"..S("Enter the car ID and select the floors served (click them to toggle), then click Connect.").."]")
+ fs("label[1,1.3;"..S("You must select at least two floors.").."]")
+ fs("button[1,10;2,1;back;"..S("< Back").."]")
+ if numfloors >= 2 then fs("button[13,10;2,1;connect;"..S("Connect").."]") end
else
- fs("label[1,1;NEW CONNECTION]")
- fs("button[1,10;2,1;back;Back]")
- if numfloors >= 2 then fs("button[13,10;2,1;connect;Connect]") end
+ fs("label[1,1;"..S("NEW CONNECTION").."]")
+ fs("button[1,10;2,1;back;"..S("Back").."]")
+ if numfloors >= 2 then fs("button[13,10;2,1;connect;"..S("Connect").."]") end
end
fs("textlist[8,2;6,7;floors;")
for i=#mem.params.floornames,1,-1 do
- fs(string.format("%s - %s",minetest.formspec_escape(mem.params.floornames[i]),mem.newconnfloors[i] and "YES" or "NO")..(i==1 and "" or ","))
+ fs(string.format("%s - %s",core.formspec_escape(mem.params.floornames[i]),mem.newconnfloors[i] and S("YES") or S("NO"))..(i==1 and "" or ","))
end
fs(";0;false]")
- fs("field[2,3;4,1;carid;Car ID;]")
+ fs("field[2,3;4,1;carid;"..S("Car ID")..";]")
elseif mem.screenstate == "oobe_connection" or mem.screenstate == "connection" then
local numfloors = 0
for _,v in ipairs(mem.newconnfloors) do
if v then numfloors = numfloors + 1 end
end
if mem.screenstate == "oobe_newconnection" then
- fs("label[1,1;Enter the car ID and select the floors served (click them to toggle), then click Connect.]")
- fs("label[1,1.3;You must select at least two floors.]")
- fs("button[1,10;2,1;back;< Back]")
- if numfloors >= 2 then fs("button[13,10;2,1;save;Save >]") end
+ fs("label[1,1;"..S("Enter the car ID and select the floors served (click them to toggle), then click Connect.").."]")
+ fs("label[1,1.3;"..S("You must select at least two floors.").."]")
+ fs("button[1,10;2,1;back;"..S("< Back").."]")
+ if numfloors >= 2 then fs("button[13,10;2,1;save;"..S("Save").."]") end
else
- fs("label[1,1;EDIT CONNECTION]")
- fs("button[1,10;2,1;back;< Back]")
- if numfloors >= 2 then fs("button[13,10;2,1;save;Save >]") end
+ fs("label[1,1;"..S("EDIT CONNECTION").."]")
+ fs("button[1,10;2,1;back;"..S("< Back").."]")
+ if numfloors >= 2 then fs("button[13,10;2,1;save;"..S("Save").."]") end
end
fs("textlist[8,2;6,7;floors;")
for i=#mem.params.floornames,1,-1 do
- fs(string.format("%s - %s",minetest.formspec_escape(mem.params.floornames[i]),mem.newconnfloors[i] and "YES" or "NO")..(i==1 and "" or ","))
+ fs(string.format("%s - %s",core.formspec_escape(mem.params.floornames[i]),mem.newconnfloors[i] and S("YES") or S("NO"))..(i==1 and "" or ","))
end
fs(";0;false]")
- fs("label[2,3;Car ID: "..mem.params.carids[mem.editingconnection].."]")
+ fs("label[2,3;"..S("Car ID: @1",mem.params.carids[mem.editingconnection]).."]")
elseif mem.screenstate == "oobe_connecting" or mem.screenstate == "connecting" then
- fs("label[1,1;Connecting to controller...]")
+ fs("label[1,1;"..S("Connecting to controller...").."]")
elseif mem.screenstate == "oobe_connectionfailed" or mem.screenstate == "connectionfailed" then
- fs("label[4,4;Connection timed out!]")
- fs("label[4,5;Make sure the car ID is correct and]")
- fs("label[4,5.5;that the controller is ready to pair.]")
- fs("button[1,10;2,1;back;< Back]")
+ fs("label[4,4;"..S("Connection timed out!").."]")
+ fs("label[4,5;"..S("Make sure the car ID is correct and\nthat the controller is ready to connect.").."]")
+ fs("button[1,10;2,1;back;"..S("< Back").."]")
elseif mem.screenstate == "status" then
if not mem.screenpage then mem.screenpage = 1 end
- fs("label[1,1;GROUP DISPLAY]")
+ fs("label[1,1;"..S("GROUP DISPLAY").."]")
fs("box[1.5,1.5;0.1,10;#AAAAAAFF]")
fs("box[18.5,1.5;0.1,10;#AAAAAAFF]")
- fs("label[0.55,11.5;UP]")
- fs("label[18.85,11.5;DOWN]")
- fs("button[15,0.5;2,1;menu;Menu]")
+ fs("image[0.45,11;0.2,0.4;celevator_menu_small_arrow.png]")
+ fs("image[19.4,11;0.2,0.4;celevator_menu_small_arrow.png^[transformFY]")
+ fs("button[15,0.5;2,1;menu;"..S("Menu").."]")
fs("style_type[image_button;font=mono;font_size=*0.75]")
for car=1,#mem.params.carids,1 do
local xp = 1.7+(car-1)
local carid = mem.params.carids[car]
local carstate = mem.carstatus[carid].state
- fs(string.format("label[%f,11;CAR %d]",xp,car))
- fs(string.format("label[%f,11.35;%s]",xp+0.1,minetest.colorize("#ff5555",(carstate == "normal" and " IN" or "OUT"))))
+ fs(string.format("label[%f,11;%s]",xp,S("CAR @1",car)))
+ fs(string.format("label[%f,11.35;%s]",xp+0.1,core.colorize("#ff5555",(carstate == "normal" and S(" IN") or S("OUT")))))
end
local lowestfloor = (mem.screenpage-1)*10+1
for i=1,math.min(10,#mem.params.floornames-lowestfloor+1),1 do
@@ -1041,11 +1071,11 @@ elseif mem.screenstate == "status" then
local floor = i+lowestfloor-1
fs(string.format("label[0.9,%f;%s]",yp+0.35,mem.params.floornames[floor]))
local uplabel = ""
- if mem.upcalls[floor] then uplabel = minetest.colorize("#55FF55",math.floor(mem.upeta[floor] or 0)) end
+ if mem.upcalls[floor] then uplabel = core.colorize("#55FF55",math.floor(mem.upeta[floor] or 0)) end
if floor < #mem.params.floornames then fs(string.format("image_button[0.15,%f;0.75,0.75;celevator_fs_bg.png;upcall%d;%s]",yp,floor,uplabel)) end
fs(string.format("label[18.65,%f;%s]",yp+0.35,mem.params.floornames[floor]))
local dnlabel = ""
- if mem.dncalls[floor] then dnlabel = minetest.colorize("#FF5555",math.floor(mem.dneta[floor] or 0)) end
+ if mem.dncalls[floor] then dnlabel = core.colorize("#FF5555",math.floor(mem.dneta[floor] or 0)) end
if floor > 1 then fs(string.format("image_button[19.1,%f;0.75,0.75;celevator_fs_bg.png;dncall%d;%s]",yp,floor,dnlabel)) end
for car=1,#mem.params.carids,1 do
local xp = 1.7+(car-1)
@@ -1053,10 +1083,10 @@ elseif mem.screenstate == "status" then
local carfloor = realtocarfloor(carid,floor)
if carfloor then
local ccdot = mem.carstatus[carid].carcalls[carfloor] and "*" or ""
- local groupup = mem.carstatus[carid].groupupcalls[carfloor] and minetest.colorize("#55FF55","^") or ""
- local swingup = mem.carstatus[carid].swingupcalls[carfloor] and minetest.colorize("#FFFF55","^") or ""
- local swingdn = mem.carstatus[carid].swingdncalls[carfloor] and minetest.colorize("#FFFF55","v") or ""
- local groupdn = mem.carstatus[carid].groupdncalls[carfloor] and minetest.colorize("#FF5555","v") or ""
+ local groupup = mem.carstatus[carid].groupupcalls[carfloor] and core.colorize("#55FF55","^") or ""
+ local swingup = mem.carstatus[carid].swingupcalls[carfloor] and core.colorize("#FFFF55","^") or ""
+ local swingdn = mem.carstatus[carid].swingdncalls[carfloor] and core.colorize("#FFFF55","v") or ""
+ local groupdn = mem.carstatus[carid].groupdncalls[carfloor] and core.colorize("#FF5555","v") or ""
ccdot = groupup..swingup..ccdot..swingdn..groupdn
if getpos(carid) == floor then
local cargraphics = {
@@ -1068,9 +1098,9 @@ elseif mem.screenstate == "status" then
}
ccdot = cargraphics[mem.carstatus[carid].doorstate]
if mem.carstatus[carid].direction == "up" then
- ccdot = minetest.colorize("#55FF55",ccdot)
+ ccdot = core.colorize("#55FF55",ccdot)
elseif mem.carstatus[carid].direction == "down" then
- ccdot = minetest.colorize("#FF5555",ccdot)
+ ccdot = core.colorize("#FF5555",ccdot)
end
end
fs(string.format("image_button[%f,%f;0.75,0.75;celevator_fs_bg.png;carcall%02d%d;%s]",xp,yp,car,floor,ccdot))
@@ -1084,12 +1114,12 @@ elseif mem.screenstate == "status" then
fs("image_button[5,0.5;0.75,0.75;celevator_menu_arrow.png;scrollup;;false;false;celevator_menu_arrow.png]")
end
elseif mem.screenstate == "menu" then
- fs("label[1,1;MAIN MENU]")
- fs("button[1,3;3,1;floortable;Edit Floor Table]")
- fs("button[1,4.5;3,1;connections;Edit Connections]")
- fs("button[1,10;3,1;back;< Back]")
+ fs("label[1,1;"..S("MAIN MENU").."]")
+ fs("button[1,3;3,1;floortable;"..S("Edit Floor Table").."]")
+ fs("button[1,4.5;3,1;connections;"..S("Edit Connections").."]")
+ fs("button[1,10;3,1;back;"..S("< Back").."]")
end
-mem.infotext = string.format("ID: %d",mem.carid)
+mem.infotext = S("ID: @1",mem.carid)
return pos,mem,changedinterrupts
diff --git a/docs/README b/docs/README
index 4928bef..a53637c 100644
--- a/docs/README
+++ b/docs/README
@@ -1,2 +1,4 @@
Source for celevator_controller_manual.pdf is not included in this repository due to its large size.
If desired, the file can be downloaded from: https://cheapiesystems.com/media/celevator_controller_manual.odt
+
+This isn't the README for the whole project, go up one folder for that.
diff --git a/docs/celevator_controller_manual.pdf b/docs/celevator_controller_manual.pdf
index 2da5ca1..0bca94b 100644
--- a/docs/celevator_controller_manual.pdf
+++ b/docs/celevator_controller_manual.pdf
Binary files differ
diff --git a/docs/file_sources b/docs/file_sources
index 9de4fc7..3f90baa 100644
--- a/docs/file_sources
+++ b/docs/file_sources
@@ -2,6 +2,10 @@ Code: Written by the following contributors:
* cheapie
* j-r (Jürgen Rühle)
+Locales: Translated by the following contributors:
+* cheapie (es)
+* pgimeno (es)
+
All textures: Hand-drawn by cheapie using GIMP
Sounds:
diff --git a/doors.lua b/doors.lua
index 8528449..e79aeb5 100644
--- a/doors.lua
+++ b/doors.lua
@@ -1,14 +1,22 @@
celevator.doors = {}
+local S = core.get_translator("celevator")
+
celevator.doors.erefs = {}
+--These get overwritten on globalstep and aren't settings.
+--They're just set to true here so the globalstep functions run at least once,
+--in case a door was moving when the server last shut down.
+celevator.doors.hwdoor_step_enabled = true
+celevator.doors.cardoor_step_enabled = true
+
local function placesill(pos,node)
- local erefs = minetest.get_objects_inside_radius(pos,0.5)
+ local erefs = core.get_objects_inside_radius(pos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then return end
end
- local yaw = minetest.dir_to_yaw(minetest.fourdir_to_dir(node.param2))
- local entity = minetest.add_entity(pos,"celevator:door_sill")
+ local yaw = core.dir_to_yaw(core.fourdir_to_dir(node.param2))
+ local entity = core.add_entity(pos,"celevator:door_sill")
if node.name == "celevator:hwdoor_slow_glass_bottom" or node.name == "celevator:hwdoor_slow_steel_bottom" then
entity:set_properties({
wield_item = "celevator:door_sill_double",
@@ -17,8 +25,8 @@ local function placesill(pos,node)
entity:set_yaw(yaw)
end
-minetest.register_node("celevator:hwdoor_fast_glass_bottom",{
- description = "Glass Hoistway Door (fast, bottom - you hacker you!)",
+core.register_node("celevator:hwdoor_fast_glass_bottom",{
+ description = S("Glass Hoistway Door (fast, bottom - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_door_glass_edge.png",
@@ -44,11 +52,11 @@ minetest.register_node("celevator:hwdoor_fast_glass_bottom",{
},
},
after_dig_node = function(pos,node)
- local erefs = minetest.get_objects_inside_radius(pos,1.5)
+ local erefs = core.get_objects_inside_radius(pos,1.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end
end
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(node.param2))
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2))
local xnames = {
[0] = "fast",
[1] = "slow",
@@ -63,14 +71,14 @@ minetest.register_node("celevator:hwdoor_fast_glass_bottom",{
local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y])
local pieceoffset = vector.new(x,y,0)
local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir))
- if minetest.get_node(piecepos).name == piecename then minetest.remove_node(piecepos) end
+ if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end
end
end
end,
})
-minetest.register_node("celevator:hwdoor_fast_glass_middle",{
- description = "Glass Hoistway Door (fast, middle - you hacker you!)",
+core.register_node("celevator:hwdoor_fast_glass_middle",{
+ description = S("Glass Hoistway Door (fast, middle - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_transparent.png",
@@ -95,8 +103,8 @@ minetest.register_node("celevator:hwdoor_fast_glass_middle",{
},
})
-minetest.register_node("celevator:hwdoor_fast_glass_top",{
- description = "Glass Hoistway Door (fast, top - you hacker you!)",
+core.register_node("celevator:hwdoor_fast_glass_top",{
+ description = S("Glass Hoistway Door (fast, top - you hacker you!)"),
tiles = {
"celevator_door_glass_edge.png",
"celevator_transparent.png",
@@ -121,8 +129,8 @@ minetest.register_node("celevator:hwdoor_fast_glass_top",{
},
})
-minetest.register_node("celevator:hwdoor_slow_glass_bottom",{
- description = "Glass Hoistway Door (slow, bottom - you hacker you!)",
+core.register_node("celevator:hwdoor_slow_glass_bottom",{
+ description = S("Glass Hoistway Door (slow, bottom - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_door_glass_edge.png",
@@ -147,8 +155,8 @@ minetest.register_node("celevator:hwdoor_slow_glass_bottom",{
},
})
-minetest.register_node("celevator:hwdoor_slow_glass_middle",{
- description = "Glass Hoistway Door (slow, middle - you hacker you!)",
+core.register_node("celevator:hwdoor_slow_glass_middle",{
+ description = S("Glass Hoistway Door (slow, middle - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_transparent.png",
@@ -173,8 +181,8 @@ minetest.register_node("celevator:hwdoor_slow_glass_middle",{
},
})
-minetest.register_node("celevator:hwdoor_slow_glass_top",{
- description = "Glass Hoistway Door (slow, top - you hacker you!)",
+core.register_node("celevator:hwdoor_slow_glass_top",{
+ description = S("Glass Hoistway Door (slow, top - you hacker you!)"),
tiles = {
"celevator_door_glass_edge.png",
"celevator_transparent.png",
@@ -199,8 +207,8 @@ minetest.register_node("celevator:hwdoor_slow_glass_top",{
},
})
-minetest.register_node("celevator:hwdoor_fast_steel_bottom",{
- description = "Steel Hoistway Door (fast, bottom - you hacker you!)",
+core.register_node("celevator:hwdoor_fast_steel_bottom",{
+ description = S("Steel Hoistway Door (fast, bottom - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_door_glass_edge.png",
@@ -225,11 +233,11 @@ minetest.register_node("celevator:hwdoor_fast_steel_bottom",{
},
},
after_dig_node = function(pos,node)
- local erefs = minetest.get_objects_inside_radius(pos,1.5)
+ local erefs = core.get_objects_inside_radius(pos,1.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end
end
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(node.param2))
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2))
local xnames = {
[0] = "fast",
[1] = "slow",
@@ -244,14 +252,14 @@ minetest.register_node("celevator:hwdoor_fast_steel_bottom",{
local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y])
local pieceoffset = vector.new(x,y,0)
local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir))
- if minetest.get_node(piecepos).name == piecename then minetest.remove_node(piecepos) end
+ if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end
end
end
end,
})
-minetest.register_node("celevator:hwdoor_fast_steel_middle",{
- description = "Steel Hoistway Door (fast, middle - you hacker you!)",
+core.register_node("celevator:hwdoor_fast_steel_middle",{
+ description = S("Steel Hoistway Door (fast, middle - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_transparent.png",
@@ -275,8 +283,8 @@ minetest.register_node("celevator:hwdoor_fast_steel_middle",{
},
})
-minetest.register_node("celevator:hwdoor_fast_steel_top",{
- description = "Steel Hoistway Door (fast, top - you hacker you!)",
+core.register_node("celevator:hwdoor_fast_steel_top",{
+ description = S("Steel Hoistway Door (fast, top - you hacker you!)"),
tiles = {
"celevator_door_glass_edge.png",
"celevator_transparent.png",
@@ -300,8 +308,8 @@ minetest.register_node("celevator:hwdoor_fast_steel_top",{
},
})
-minetest.register_node("celevator:hwdoor_slow_steel_bottom",{
- description = "Steel Hoistway Door (slow, bottom - you hacker you!)",
+core.register_node("celevator:hwdoor_slow_steel_bottom",{
+ description = S("Steel Hoistway Door (slow, bottom - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_door_glass_edge.png",
@@ -325,8 +333,8 @@ minetest.register_node("celevator:hwdoor_slow_steel_bottom",{
},
})
-minetest.register_node("celevator:hwdoor_slow_steel_middle",{
- description = "Steel Hoistway Door (slow, middle - you hacker you!)",
+core.register_node("celevator:hwdoor_slow_steel_middle",{
+ description = S("Steel Hoistway Door (slow, middle - you hacker you!)"),
tiles = {
"celevator_transparent.png",
"celevator_transparent.png",
@@ -350,8 +358,8 @@ minetest.register_node("celevator:hwdoor_slow_steel_middle",{
},
})
-minetest.register_node("celevator:hwdoor_slow_steel_top",{
- description = "Steel Hoistway Door (slow, top - you hacker you!)",
+core.register_node("celevator:hwdoor_slow_steel_top",{
+ description = S("Steel Hoistway Door (slow, top - you hacker you!)"),
tiles = {
"celevator_door_glass_edge.png",
"celevator_transparent.png",
@@ -375,8 +383,8 @@ minetest.register_node("celevator:hwdoor_slow_steel_top",{
},
})
-minetest.register_node("celevator:hwdoor_placeholder",{
- description = "Hoistway Door Open-State Placeholder (you hacker you!)",
+core.register_node("celevator:hwdoor_placeholder",{
+ description = S("Hoistway Door Open-State Placeholder (you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -401,7 +409,7 @@ minetest.register_node("celevator:hwdoor_placeholder",{
},
})
-minetest.register_entity("celevator:hwdoor_moving",{
+core.register_entity("celevator:hwdoor_moving",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.667,0.667,0.667),
@@ -412,11 +420,12 @@ minetest.register_entity("celevator:hwdoor_moving",{
})
function celevator.doors.hwopen(pos,drivepos)
- local hwdoors_moving = minetest.deserialize(celevator.storage:get_string("hwdoors_moving")) or {}
- local hash = minetest.hash_node_position(pos)
+ celevator.doors.hwdoor_step_enabled = true
+ local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {}
+ local hash = core.hash_node_position(pos)
if not hwdoors_moving[hash] then
local param2 = celevator.get_node(pos).param2
- local fdir = minetest.fourdir_to_dir(param2)
+ local fdir = core.fourdir_to_dir(param2)
local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2))
local positions = {
pos,
@@ -446,53 +455,54 @@ function celevator.doors.hwopen(pos,drivepos)
doortype = doortype,
}
celevator.doors.erefs[hash] = erefs
- celevator.storage:set_string("hwdoors_moving",minetest.serialize(hwdoors_moving))
- minetest.set_node(pos,{name="celevator:hwdoor_placeholder",param2=param2})
+ celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving))
+ core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=param2})
local pmeta = celevator.get_meta(pos)
- pmeta:set_string("data",minetest.serialize(hwdoors_moving[hash]))
+ pmeta:set_string("data",core.serialize(hwdoors_moving[hash]))
pmeta:set_string("state","opening")
pmeta:set_string("doortype",doortype)
local carpos = vector.add(pos,fdir)
- local carndef = minetest.registered_nodes[celevator.get_node(carpos).name] or {}
+ local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {}
if carndef._root then
celevator.doors.caropen(carpos)
end
elseif hwdoors_moving[hash].direction == "close" then
hwdoors_moving[hash].direction = "open"
hwdoors_moving[hash].time = math.pi-hwdoors_moving[hash].time
- celevator.storage:set_string("hwdoors_moving",minetest.serialize(hwdoors_moving))
- local fdir = minetest.fourdir_to_dir(hwdoors_moving[hash].param2)
+ celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving))
+ local fdir = core.fourdir_to_dir(hwdoors_moving[hash].param2)
local carpos = vector.add(pos,fdir)
- local carndef = minetest.registered_nodes[celevator.get_node(carpos).name] or {}
+ local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {}
if carndef._root then
celevator.doors.caropen(carpos)
end
- minetest.set_node(pos,{name="celevator:hwdoor_placeholder",param2=hwdoors_moving[hash].param2})
+ core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=hwdoors_moving[hash].param2})
local pmeta = celevator.get_meta(pos)
- pmeta:set_string("data",minetest.serialize(hwdoors_moving[hash]))
+ pmeta:set_string("data",core.serialize(hwdoors_moving[hash]))
pmeta:set_string("state","opening")
end
end
function celevator.doors.hwclose(pos,drivepos,nudge)
- local hwdoors_moving = minetest.deserialize(celevator.storage:get_string("hwdoors_moving")) or {}
- local hash = minetest.hash_node_position(pos)
+ celevator.doors.hwdoor_step_enabled = true
+ local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {}
+ local hash = core.hash_node_position(pos)
if hwdoors_moving[hash] then
return
end
local pmeta = celevator.get_meta(pos)
local state = pmeta:get_string("state")
if state ~= "open" then return end
- local fdir = minetest.fourdir_to_dir(celevator.get_node(pos).param2)
+ local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2)
local carpos = vector.add(pos,fdir)
- local carndef = minetest.registered_nodes[celevator.get_node(carpos).name] or {}
+ local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {}
if carndef._root then
celevator.doors.carclose(carpos,nudge)
end
- local data = minetest.deserialize(pmeta:get_string("data"))
+ local data = core.deserialize(pmeta:get_string("data"))
if not data then return end
for i=1,6,1 do
- minetest.set_node(data.positions[i],data.nodes[i])
+ core.set_node(data.positions[i],data.nodes[i])
end
data.direction = "close"
data.time = 0
@@ -509,11 +519,12 @@ function celevator.doors.hwclose(pos,drivepos,nudge)
end
celevator.doors.erefs[hash] = erefs
hwdoors_moving[hash] = data
- celevator.storage:set_string("hwdoors_moving",minetest.serialize(hwdoors_moving))
+ celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving))
end
function celevator.doors.hwstep(dtime)
- local hwdoors_moving = minetest.deserialize(celevator.storage:get_string("hwdoors_moving")) or {}
+ if not celevator.doors.hwdoor_step_enabled then return end
+ local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {}
local save = false
for hash,data in pairs(hwdoors_moving) do
save = true
@@ -576,7 +587,7 @@ function celevator.doors.hwstep(dtime)
hwdoors_moving[hash] = nil
elseif data.direction == "close" then
for i=1,6,1 do
- minetest.set_node(data.positions[i],data.nodes[i])
+ core.set_node(data.positions[i],data.nodes[i])
end
celevator.get_meta(data.positions[1]):set_string("state","closed")
if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end
@@ -585,14 +596,16 @@ function celevator.doors.hwstep(dtime)
end
end
if save then
- celevator.storage:set_string("hwdoors_moving",minetest.serialize(hwdoors_moving))
+ celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving))
end
+ celevator.doors.hwdoor_step_enabled = save
end
-minetest.register_globalstep(celevator.doors.hwstep)
+core.register_globalstep(celevator.doors.hwstep)
function celevator.doors.carstep(dtime)
- local cardoors_moving = minetest.deserialize(celevator.storage:get_string("cardoors_moving")) or {}
+ if not celevator.doors.cardoor_step_enabled then return end
+ local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {}
local save = false
for hash,data in pairs(cardoors_moving) do
save = true
@@ -635,12 +648,17 @@ function celevator.doors.carstep(dtime)
end
if data.time >= math.pi then
for _,ref in ipairs(celevator.doors.erefs[hash]) do
- ref:set_velocity(vector.new(0,0,0))
+ ref:remove()
end
- celevator.get_meta(data.positions[1]):set_string("doorstate","closed")
+ local carmeta = celevator.get_meta(data.positions[1])
+ carmeta:set_string("doorstate","closed")
cardoors_moving[hash] = nil
- local cartimer = minetest.get_node_timer(data.positions[1])
+ local cartimer = core.get_node_timer(data.positions[1])
cartimer:stop()
+ local fdir = core.facedir_to_dir(core.get_node(data.positions[1]).param2)
+ local doortype = carmeta:get_string("doortype")
+ if (not doortype) or doortype == "" then doortype = "glass" end
+ celevator.doors.spawncardoors(data.positions[1],fdir,doortype)
end
end
else
@@ -653,7 +671,7 @@ function celevator.doors.carstep(dtime)
celevator.get_meta(data.positions[1]):set_string("doorstate","open")
cardoors_moving[hash] = nil
elseif data.direction == "close" then
- local fdir = minetest.fourdir_to_dir(celevator.get_node(data.positions[1]).param2)
+ local fdir = core.fourdir_to_dir(celevator.get_node(data.positions[1]).param2)
celevator.doors.spawncardoors(data.positions[1],vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi))
celevator.get_meta(data.positions[1]):set_string("doorstate","closed")
cardoors_moving[hash] = nil
@@ -661,20 +679,21 @@ function celevator.doors.carstep(dtime)
end
end
if save then
- celevator.storage:set_string("cardoors_moving",minetest.serialize(cardoors_moving))
+ celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving))
end
+ celevator.doors.cardoor_step_enabled = save
end
-minetest.register_globalstep(celevator.doors.carstep)
+core.register_globalstep(celevator.doors.carstep)
-minetest.register_entity("celevator:car_door",{
+core.register_entity("celevator:car_door",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.667,0.667,0.667),
wield_item = "default:dirt",
static_save = false,
pointable = false,
- glow = minetest.LIGHT_MAX,
+ glow = core.LIGHT_MAX,
},
})
@@ -683,20 +702,20 @@ function celevator.doors.spawncardoors(pos,dir,doortype,replace)
local refs = {}
for x=2,1,-1 do
for y=1,3,1 do
- local yaw = minetest.dir_to_yaw(dir)+math.pi
+ local yaw = core.dir_to_yaw(dir)+math.pi
local doorpos = vector.add(pos,vector.rotate_around_axis(vector.new(x-2,y-1,0),vector.new(0,1,0),yaw))
local xnames = {"slow","fast"}
local ynames = {"bottom","middle","top"}
local nname = string.format("celevator:hwdoor_%s_%s_%s",xnames[x],doortype,ynames[y])
if replace then
- local oldrefs = minetest.get_objects_inside_radius(doorpos,0.1)
+ local oldrefs = core.get_objects_inside_radius(doorpos,0.1)
for _,i in pairs(oldrefs) do
if i:get_luaentity() and i:get_luaentity().name == "celevator:car_door" then
i:remove()
end
end
end
- local ref = minetest.add_entity(doorpos,"celevator:car_door")
+ local ref = core.add_entity(doorpos,"celevator:car_door")
ref:set_yaw(yaw)
ref:set_properties({
wield_item = nname,
@@ -708,12 +727,13 @@ function celevator.doors.spawncardoors(pos,dir,doortype,replace)
end
function celevator.doors.caropen(pos)
- local cardoors_moving = minetest.deserialize(celevator.storage:get_string("cardoors_moving")) or {}
- local hash = minetest.hash_node_position(pos)
- local cartimer = minetest.get_node_timer(pos)
+ celevator.doors.cardoor_step_enabled = true
+ local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {}
+ local hash = core.hash_node_position(pos)
+ local cartimer = core.get_node_timer(pos)
cartimer:start(0.25)
if not cardoors_moving[hash] then
- local fdir = minetest.fourdir_to_dir(celevator.get_node(pos).param2)
+ local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2)
local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2))
local positions = {
pos,
@@ -725,7 +745,7 @@ function celevator.doors.caropen(pos)
}
local erefs = {}
for _,dpos in ipairs(positions) do
- local objs = minetest.get_objects_inside_radius(dpos,0.1)
+ local objs = core.get_objects_inside_radius(dpos,0.5)
for _,obj in pairs(objs) do
if obj:get_luaentity() and obj:get_luaentity().name == "celevator:car_door" then
table.insert(erefs,obj)
@@ -738,26 +758,26 @@ function celevator.doors.caropen(pos)
time = 0,
opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2),
}
- minetest.sound_play("celevator_door_open",{
+ core.sound_play("celevator_door_open",{
pos = pos,
gain = 0.4,
max_hear_distance = 10
},true)
celevator.doors.erefs[hash] = erefs
- celevator.storage:set_string("cardoors_moving",minetest.serialize(cardoors_moving))
+ celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving))
local meta = celevator.get_meta(pos)
- meta:set_string("doordata",minetest.serialize(cardoors_moving[hash]))
+ meta:set_string("doordata",core.serialize(cardoors_moving[hash]))
meta:set_string("doorstate","opening")
elseif cardoors_moving[hash].direction == "close" then
if cardoors_moving[hash].soundhandle then
- minetest.sound_stop(cardoors_moving[hash].soundhandle)
+ core.sound_stop(cardoors_moving[hash].soundhandle)
end
- minetest.sound_play("celevator_door_reverse",{
+ core.sound_play("celevator_door_reverse",{
pos = pos,
gain = 1,
max_hear_distance = 10
},true)
- minetest.sound_play("celevator_door_open",{
+ core.sound_play("celevator_door_open",{
pos = pos,
gain = 0.4,
start_time = math.max(0,2.75-cardoors_moving[hash].time),
@@ -765,22 +785,23 @@ function celevator.doors.caropen(pos)
},true)
cardoors_moving[hash].direction = "open"
cardoors_moving[hash].time = math.pi-cardoors_moving[hash].time
- celevator.storage:set_string("cardoors_moving",minetest.serialize(cardoors_moving))
+ celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving))
end
end
function celevator.doors.carclose(pos,nudge)
- local cardoors_moving = minetest.deserialize(celevator.storage:get_string("cardoors_moving")) or {}
- local hash = minetest.hash_node_position(pos)
+ celevator.doors.cardoor_step_enabled = true
+ local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {}
+ local hash = core.hash_node_position(pos)
if cardoors_moving[hash] then
return
end
local meta = celevator.get_meta(pos)
local state = meta:get_string("doorstate")
if state ~= "open" then return end
- local data = minetest.deserialize(meta:get_string("doordata"))
+ local data = core.deserialize(meta:get_string("doordata"))
if not data then return end
- local dir = minetest.fourdir_to_dir(celevator.get_node(pos).param2)
+ local dir = core.fourdir_to_dir(celevator.get_node(pos).param2)
data.direction = "close"
data.time = 0
local doortype = meta:get_string("doortype")
@@ -796,13 +817,13 @@ function celevator.doors.carclose(pos,nudge)
end
celevator.doors.erefs[hash] = erefs
if nudge then
- data.soundhandle = minetest.sound_play("celevator_nudge",{
+ data.soundhandle = core.sound_play("celevator_nudge",{
pos = pos,
gain = 0.75,
max_hear_distance = 10
})
else
- data.soundhandle = minetest.sound_play("celevator_door_close",{
+ data.soundhandle = core.sound_play("celevator_door_close",{
pos = pos,
gain = 0.3,
max_hear_distance = 10
@@ -810,32 +831,32 @@ function celevator.doors.carclose(pos,nudge)
end
data.nudging = nudge
cardoors_moving[hash] = data
- celevator.storage:set_string("cardoors_moving",minetest.serialize(cardoors_moving))
+ celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving))
end
-minetest.register_abm({
+core.register_abm({
label = "Respawn car doors",
nodenames = {"group:_celevator_car_root"},
interval = 1,
chance = 1,
action = function(pos)
- if minetest.get_meta(pos):get_string("doorstate") ~= "closed" then return end
- local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5)
+ if core.get_meta(pos):get_string("doorstate") ~= "closed" then return end
+ local entitiesnearby = core.get_objects_inside_radius(pos,0.5)
for _,i in pairs(entitiesnearby) do
if i:get_luaentity() and i:get_luaentity().name == "celevator:car_door" then
return
end
end
- local fdir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
- local carmeta = minetest.get_meta(pos)
+ local fdir = core.facedir_to_dir(core.get_node(pos).param2)
+ local carmeta = core.get_meta(pos)
local doortype = carmeta:get_string("doortype")
if (not doortype) or doortype == "" then doortype = "glass" end
celevator.doors.spawncardoors(pos,fdir,doortype)
end,
})
-minetest.register_node("celevator:hwdoor_glass",{
- description = "Glass Elevator Hoistway Door",
+core.register_node("celevator:hwdoor_glass",{
+ description = S("Glass Elevator Hoistway Door"),
paramtype2 = "4dir",
buildable_to = true,
inventory_image = "celevator_door_glass_inventory.png",
@@ -844,12 +865,12 @@ minetest.register_node("celevator:hwdoor_glass",{
tiles = {"celevator_transparent.png"},
after_place_node = function(pos,player)
if not player:is_player() then
- minetest.remove_node(pos)
+ core.remove_node(pos)
return true
end
local name = player:get_player_name()
- local newnode = minetest.get_node(pos)
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(newnode.param2))
+ local newnode = core.get_node(pos)
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2))
local xnames = {
[0] = "fast",
[1] = "slow",
@@ -861,19 +882,20 @@ minetest.register_node("celevator:hwdoor_glass",{
}
for x=0,1,1 do
for y=0,2,1 do
- local offsetdesc = string.format("%dm to the right and %dm up",x,y)
local placeoffset = vector.new(x,y,0)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- local replaces = minetest.get_node(placepos).name
- if not (minetest.registered_nodes[replaces] and minetest.registered_nodes[replaces].buildable_to) then
- minetest.chat_send_player(name,string.format("Can't place door here - position %s is blocked!",offsetdesc))
- minetest.remove_node(pos)
+ local replaces = core.get_node(placepos).name
+ if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then
+ local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y)
+ core.chat_send_player(name,errormsg)
+ core.remove_node(pos)
return true
end
- if minetest.is_protected(placepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,string.format("Can't place door here - position %s is protected!",offsetdesc))
- minetest.record_protection_violation(placepos,name)
- minetest.remove_node(pos)
+ if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y)
+ core.chat_send_player(name,errormsg)
+ core.record_protection_violation(placepos,name)
+ core.remove_node(pos)
return true
end
end
@@ -883,23 +905,23 @@ minetest.register_node("celevator:hwdoor_glass",{
local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y])
local placeoffset = vector.new(x,y,0)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- minetest.set_node(placepos,{name=piecename,param2=newnode.param2})
+ core.set_node(placepos,{name=piecename,param2=newnode.param2})
if y==0 then
placesill(placepos,{name=piecename,param2=newnode.param2})
end
end
end
local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir))
- local carndef = minetest.registered_nodes[celevator.get_node(carpos).name] or {}
+ local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {}
if carndef._root then
celevator.get_meta(carpos):set_string("doortype","glass")
- celevator.doors.spawncardoors(carpos,minetest.fourdir_to_dir(newnode.param2),"glass",true)
+ celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"glass",true)
end
end,
})
-minetest.register_node("celevator:hwdoor_steel",{
- description = "Steel Elevator Hoistway Door",
+core.register_node("celevator:hwdoor_steel",{
+ description = S("Steel Elevator Hoistway Door"),
paramtype2 = "4dir",
buildable_to = true,
inventory_image = "celevator_door_metal_inventory.png",
@@ -908,12 +930,12 @@ minetest.register_node("celevator:hwdoor_steel",{
tiles = {"celevator_transparent.png"},
after_place_node = function(pos,player)
if not player:is_player() then
- minetest.remove_node(pos)
+ core.remove_node(pos)
return true
end
local name = player:get_player_name()
- local newnode = minetest.get_node(pos)
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(newnode.param2))
+ local newnode = core.get_node(pos)
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2))
local xnames = {
[0] = "fast",
[1] = "slow",
@@ -925,19 +947,20 @@ minetest.register_node("celevator:hwdoor_steel",{
}
for x=0,1,1 do
for y=0,2,1 do
- local offsetdesc = string.format("%dm to the right and %dm up",x,y)
local placeoffset = vector.new(x,y,0)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- local replaces = minetest.get_node(placepos).name
- if not (minetest.registered_nodes[replaces] and minetest.registered_nodes[replaces].buildable_to) then
- minetest.chat_send_player(name,string.format("Can't place door here - position %s is blocked!",offsetdesc))
- minetest.remove_node(pos)
+ local replaces = core.get_node(placepos).name
+ if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then
+ local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y)
+ core.chat_send_player(name,errormsg)
+ core.remove_node(pos)
return true
end
- if minetest.is_protected(placepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,string.format("Can't place door here - position %s is protected!",offsetdesc))
- minetest.record_protection_violation(placepos,name)
- minetest.remove_node(pos)
+ if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y)
+ core.chat_send_player(name,errormsg)
+ core.record_protection_violation(placepos,name)
+ core.remove_node(pos)
return true
end
end
@@ -947,23 +970,23 @@ minetest.register_node("celevator:hwdoor_steel",{
local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y])
local placeoffset = vector.new(x,y,0)
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
- minetest.set_node(placepos,{name=piecename,param2=newnode.param2})
+ core.set_node(placepos,{name=piecename,param2=newnode.param2})
if y==0 then
placesill(placepos,{name=piecename,param2=newnode.param2})
end
end
end
local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir))
- local carndef = minetest.registered_nodes[celevator.get_node(carpos).name] or {}
+ local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {}
if carndef._root then
celevator.get_meta(carpos):set_string("doortype","steel")
- celevator.doors.spawncardoors(carpos,minetest.fourdir_to_dir(newnode.param2),"steel",true)
+ celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"steel",true)
end
end,
})
-minetest.register_node("celevator:door_sill_single",{
- description = "Hoistway Door Sill, Single Track (you hacker you!)",
+core.register_node("celevator:door_sill_single",{
+ description = S("Hoistway Door Sill, Single Track (you hacker you!)"),
drop = "",
groups = {
not_in_creative_inventory = 1,
@@ -982,8 +1005,8 @@ minetest.register_node("celevator:door_sill_single",{
},
})
-minetest.register_node("celevator:door_sill_double",{
- description = "Hoistway Door Sill, Double Track (you hacker you!)",
+core.register_node("celevator:door_sill_double",{
+ description = S("Hoistway Door Sill, Double Track (you hacker you!)"),
drop = "",
groups = {
not_in_creative_inventory = 1,
@@ -1002,18 +1025,18 @@ minetest.register_node("celevator:door_sill_double",{
},
})
-minetest.register_entity("celevator:door_sill",{
+core.register_entity("celevator:door_sill",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.667,0.667,0.667),
wield_item = "celevator:door_sill_single",
static_save = false,
pointable = false,
- glow = minetest.LIGHT_MAX,
+ glow = core.LIGHT_MAX,
},
})
-minetest.register_lbm({
+core.register_lbm({
label = "Respawn hoistway door sills",
name = "celevator:spawn_sill",
nodenames = {
diff --git a/drive_entity.lua b/drive_entity.lua
index 0ddd4c4..e2d2655 100644
--- a/drive_entity.lua
+++ b/drive_entity.lua
@@ -1,6 +1,8 @@
+local S = core.get_translator("celevator")
+
celevator.drives.entity = {
- name = "Drive",
- description = "Normal entity-based drive",
+ name = S("Elevator Drive"),
+ description = S("Normal entity-based drive"),
nname = "celevator:drive",
buzzsoundhandles = {},
movementsoundhandles = {},
@@ -9,32 +11,37 @@ celevator.drives.entity = {
carsoundstate = {},
entityinfo = {},
sheaverefs = {},
+ step_enabled = true, --Not a setting, is overwritten on globalstep, true here to check for running drives on startup
}
local playerposlimits = {}
local function update_ui(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local apos = tonumber(meta:get_string("apos")) or 0
- local status = "Idle"
+ local status
local vel = tonumber(meta:get_string("vel")) or 0
local state = meta:get_string("state")
+ local velstr = string.format("%0.02f",math.abs(vel))
+ local aposstr = string.format("%0.02f",apos)
if state == "running" and vel > 0 then
- status = string.format("Running: Up, %0.02f m/s",vel)
+ status = S("Drive - Running: Up, @1m/s - Position: @2m",velstr,aposstr)
elseif state == "running" and vel < 0 then
- status = string.format("Running: Down, %0.02f m/s",math.abs(vel))
+ status = S("Drive - Running: Down, @1m/s - Position: @2m",velstr,aposstr)
elseif state == "fakerunning" and vel > 0 then
- status = string.format("Running (simulated): Up, %0.02f m/s",vel)
+ status = S("Drive - Running (simulated): Up, @1m/s - Position: @2m",velstr,aposstr)
elseif state == "fakerunning" and vel < 0 then
- status = string.format("Running (simulated): Down, %0.02f m/s",math.abs(vel))
+ status = S("Drive - Running (simulated): Down, @1m/s - Position: @2m",velstr,aposstr)
+ else
+ status = S("Drive - Idle")
end
- meta:set_string("infotext",string.format("Drive - %s - Position: %0.02f m",status,apos))
+ meta:set_string("infotext",status)
end
local function playbuzz(pos)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if celevator.drives.entity.buzzsoundhandles[hash] == "cancel" then return end
- celevator.drives.entity.buzzsoundhandles[hash] = minetest.sound_play("celevator_drive_run",{
+ celevator.drives.entity.buzzsoundhandles[hash] = core.sound_play("celevator_drive_run",{
pos = pos,
loop = true,
gain = 0.1,
@@ -42,78 +49,78 @@ local function playbuzz(pos)
end
local function startbuzz(pos)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if celevator.drives.entity.buzzsoundhandles[hash] == "cancel" then
celevator.drives.entity.buzzsoundhandles[hash] = nil
return
end
if celevator.drives.entity.buzzsoundhandles[hash] then return end
celevator.drives.entity.buzzsoundhandles[hash] = "pending"
- minetest.after(0.5,playbuzz,pos)
+ core.after(0.5,playbuzz,pos)
end
local function stopbuzz(pos)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if not celevator.drives.entity.buzzsoundhandles[hash] then return end
if celevator.drives.entity.buzzsoundhandles[hash] == "pending" then
celevator.drives.entity.buzzsoundhandles[hash] = "cancel"
end
if type(celevator.drives.entity.buzzsoundhandles[hash]) ~= "string" then
- minetest.sound_stop(celevator.drives.entity.buzzsoundhandles[hash])
+ core.sound_stop(celevator.drives.entity.buzzsoundhandles[hash])
celevator.drives.entity.buzzsoundhandles[hash] = nil
end
end
local function motorsound(pos,newstate)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
local oldstate = celevator.drives.entity.movementsoundstate[hash]
oldstate = oldstate or "idle"
if oldstate == newstate 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)))
+ local carid = core.get_meta(pos):get_int("carid")
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.machinepos) then return end
local oldhandle = celevator.drives.entity.movementsoundhandles[hash]
if newstate == "slow" then
if oldstate == "idle" then
- minetest.sound_play("celevator_brake_release",{
+ core.sound_play("celevator_brake_release",{
pos = carinfo.machinepos,
gain = 1,
},true)
- celevator.drives.entity.movementsoundhandles[hash] = minetest.sound_play("celevator_motor_slow",{
+ celevator.drives.entity.movementsoundhandles[hash] = core.sound_play("celevator_motor_slow",{
pos = carinfo.machinepos,
loop = true,
gain = 1,
})
elseif oldstate == "accel" or oldstate == "fast" or oldstate == "decel" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- celevator.drives.entity.movementsoundhandles[hash] = minetest.sound_play("celevator_motor_slow",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ celevator.drives.entity.movementsoundhandles[hash] = core.sound_play("celevator_motor_slow",{
pos = carinfo.machinepos,
loop = true,
gain = 1,
})
end
elseif newstate == "accel" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- celevator.drives.entity.movementsoundhandles[hash] = minetest.sound_play("celevator_motor_accel",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ celevator.drives.entity.movementsoundhandles[hash] = core.sound_play("celevator_motor_accel",{
pos = carinfo.machinepos,
gain = 1,
})
elseif newstate == "fast" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- celevator.drives.entity.movementsoundhandles[hash] = minetest.sound_play("celevator_motor_fast",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ celevator.drives.entity.movementsoundhandles[hash] = core.sound_play("celevator_motor_fast",{
pos = carinfo.machinepos,
loop = true,
gain = 1,
})
elseif newstate == "decel" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- celevator.drives.entity.movementsoundhandles[hash] = minetest.sound_play("celevator_motor_decel",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ celevator.drives.entity.movementsoundhandles[hash] = core.sound_play("celevator_motor_decel",{
pos = carinfo.machinepos,
gain = 1,
})
elseif newstate == "idle" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- minetest.sound_play("celevator_brake_apply",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ core.sound_play("celevator_brake_apply",{
pos = carinfo.machinepos,
gain = 1,
},true)
@@ -123,7 +130,7 @@ end
local function carsound(pos,newstate,speed)
if speed < 0.5 then return end
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
local oldstate = celevator.drives.entity.carsoundstate[hash]
oldstate = oldstate or "idle"
if oldstate == newstate then return end
@@ -133,37 +140,37 @@ local function carsound(pos,newstate,speed)
local oldhandle = celevator.drives.entity.carsoundhandles[hash]
local gain = math.min(1,speed/6)
if newstate == "accel" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- celevator.drives.entity.carsoundhandles[hash] = minetest.sound_play("celevator_car_start",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ celevator.drives.entity.carsoundhandles[hash] = core.sound_play("celevator_car_start",{
object = eref,
gain = gain,
})
- minetest.after(3,function()
+ core.after(3,function()
if celevator.drives.entity.carsoundstate[hash] == "accel" then
carsound(pos,"run",speed)
end
end)
elseif newstate == "run" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- celevator.drives.entity.carsoundhandles[hash] = minetest.sound_play("celevator_car_run",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ celevator.drives.entity.carsoundhandles[hash] = core.sound_play("celevator_car_run",{
object = eref,
loop = true,
gain = gain,
})
elseif newstate == "decel" then
- if oldhandle then minetest.sound_stop(oldhandle) end
- celevator.drives.entity.carsoundhandles[hash] = minetest.sound_play("celevator_car_stop",{
+ if oldhandle then core.sound_stop(oldhandle) end
+ celevator.drives.entity.carsoundhandles[hash] = core.sound_play("celevator_car_stop",{
object = eref,
gain = gain,
})
elseif newstate == "stopped" then
- if oldhandle then minetest.sound_stop(oldhandle) end
+ if oldhandle then core.sound_stop(oldhandle) end
end
celevator.drives.entity.carsoundstate[hash] = newstate
end
local function compareexchangesound(pos,compare,new)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
local oldstate = celevator.drives.entity.movementsoundstate[hash]
if oldstate == compare then
motorsound(pos,new)
@@ -172,17 +179,17 @@ end
local function accelsound(pos)
motorsound(pos,"slow")
- minetest.after(1,compareexchangesound,pos,"slow","accel")
- minetest.after(4,compareexchangesound,pos,"accel","fast")
+ core.after(1,compareexchangesound,pos,"slow","accel")
+ core.after(4,compareexchangesound,pos,"accel","fast")
end
local function decelsound(pos)
motorsound(pos,"decel")
- minetest.after(2,compareexchangesound,pos,"decel","slow")
+ core.after(2,compareexchangesound,pos,"decel","slow")
end
-minetest.register_node("celevator:drive",{
- description = "Elevator "..celevator.drives.entity.name,
+core.register_node("celevator:drive",{
+ description = celevator.drives.entity.name,
groups = {
cracky = 1,
_celevator_drive = 1,
@@ -208,7 +215,7 @@ minetest.register_node("celevator:drive",{
},
_celevator_drive_type = "entity",
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("apos","0")
meta:set_string("dpos","0")
meta:set_string("vel","0")
@@ -222,18 +229,18 @@ minetest.register_node("celevator:drive",{
on_destruct = stopbuzz,
})
-minetest.register_entity("celevator:car_moving",{
+core.register_entity("celevator:car_moving",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.667,0.667,0.667),
wield_item = "default:dirt",
static_save = false,
- glow = minetest.LIGHT_MAX,
+ glow = core.LIGHT_MAX,
pointable = false,
},
})
-minetest.register_entity("celevator:player_holder",{
+core.register_entity("celevator:player_holder",{
initial_properties = {
visual = "cube",
textures = {
@@ -309,25 +316,25 @@ minetest.register_entity("celevator:player_holder",{
function celevator.drives.entity.gathercar(pos,yaw,nodes)
if not nodes then nodes = {} end
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if nodes[hash] then return nodes end
nodes[hash] = true
- if minetest.get_item_group(celevator.get_node(pos).name,"_connects_xp") == 1 then
+ if core.get_item_group(celevator.get_node(pos).name,"_connects_xp") == 1 then
celevator.drives.entity.gathercar(vector.add(pos,vector.rotate_around_axis(vector.new(1,0,0),vector.new(0,1,0),yaw)),yaw,nodes)
end
- if minetest.get_item_group(celevator.get_node(pos).name,"_connects_xm") == 1 then
+ if core.get_item_group(celevator.get_node(pos).name,"_connects_xm") == 1 then
celevator.drives.entity.gathercar(vector.add(pos,vector.rotate_around_axis(vector.new(-1,0,0),vector.new(0,1,0),yaw)),yaw,nodes)
end
- if minetest.get_item_group(celevator.get_node(pos).name,"_connects_yp") == 1 then
+ if core.get_item_group(celevator.get_node(pos).name,"_connects_yp") == 1 then
celevator.drives.entity.gathercar(vector.add(pos,vector.new(0,1,0)),yaw,nodes)
end
- if minetest.get_item_group(celevator.get_node(pos).name,"_connects_ym") == 1 then
+ if core.get_item_group(celevator.get_node(pos).name,"_connects_ym") == 1 then
celevator.drives.entity.gathercar(vector.add(pos,vector.new(0,-1,0)),yaw,nodes)
end
- if minetest.get_item_group(celevator.get_node(pos).name,"_connects_zp") == 1 then
+ if core.get_item_group(celevator.get_node(pos).name,"_connects_zp") == 1 then
celevator.drives.entity.gathercar(vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),yaw)),yaw,nodes)
end
- if minetest.get_item_group(celevator.get_node(pos).name,"_connects_zm") == 1 then
+ if core.get_item_group(celevator.get_node(pos).name,"_connects_zm") == 1 then
celevator.drives.entity.gathercar(vector.add(pos,vector.rotate_around_axis(vector.new(0,0,-1),vector.new(0,1,0),yaw)),yaw,nodes)
end
return nodes
@@ -347,17 +354,17 @@ function celevator.drives.entity.nodestoentities(nodes,ename)
end
for _,pos in ipairs(nodes) do
local node = celevator.get_node(pos)
- local attach = minetest.get_objects_inside_radius(pos,0.9)
- local eref = minetest.add_entity(pos,(ename or "celevator:car_moving"))
+ local attach = core.get_objects_inside_radius(pos,0.9)
+ local eref = core.add_entity(pos,(ename or "celevator:car_moving"))
eref:set_properties({
wield_item = node.name,
})
- eref:set_yaw(minetest.dir_to_yaw(minetest.fourdir_to_dir(node.param2)))
+ eref:set_yaw(core.dir_to_yaw(core.fourdir_to_dir(node.param2)))
table.insert(refs,eref)
- local ndef = minetest.registered_nodes[node.name] or {}
+ local ndef = core.registered_nodes[node.name] or {}
if ndef._cartopbox or ndef._tapehead then
local toppos = vector.add(pos,vector.new(0,1,0))
- local topattach = minetest.get_objects_inside_radius(toppos,0.75)
+ local topattach = core.get_objects_inside_radius(toppos,0.75)
for _,ref in pairs(topattach) do
table.insert(attach,ref)
end
@@ -377,7 +384,7 @@ function celevator.drives.entity.nodestoentities(nodes,ename)
local basepos = eref:get_pos()
local attachoffset = vector.subtract(attachpos,basepos)
attachoffset = vector.rotate_around_axis(attachoffset,vector.new(0,-1,0),eref:get_yaw())
- local holder = minetest.add_entity(attachpos,"celevator:player_holder")
+ local holder = core.add_entity(attachpos,"celevator:player_holder")
holder:set_attach(eref,"",vector.multiply(attachoffset,30),vector.new(0,0,0))
attachref:set_attach(holder,"")
local extra = 0.25 --To allow getting closer to walls
@@ -396,7 +403,7 @@ function celevator.drives.entity.nodestoentities(nodes,ename)
end
end
end
- minetest.remove_node(pos)
+ core.remove_node(pos)
end
return refs
end
@@ -411,10 +418,10 @@ function celevator.drives.entity.entitiestonodes(refs,carid)
pos = vector.round(pos)
local node = {
name = eref:get_properties().wield_item,
- param2 = minetest.dir_to_fourdir(minetest.yaw_to_dir(eref:get_yaw()))
+ param2 = core.dir_to_fourdir(core.yaw_to_dir(eref:get_yaw()))
}
- if minetest.get_item_group(eref:get_properties().wield_item,"_connects_yp") ~= 1 then top = true end
- minetest.set_node(pos,node)
+ if core.get_item_group(eref:get_properties().wield_item,"_connects_yp") ~= 1 then top = true end
+ core.set_node(pos,node)
eref:remove()
if carid then celevator.get_meta(pos):set_int("carid",carid) end
elseif pos and ename == "celevator:incar_pi_entity" then
@@ -431,14 +438,14 @@ function celevator.drives.entity.entitiestonodes(refs,carid)
["celevator:car_door"] = true,
["celevator:tapehead"] = true,
}
- for _,i in ipairs(minetest.get_objects_inside_radius(pos,0.9)) do
+ for _,i in ipairs(core.get_objects_inside_radius(pos,0.9)) do
i:set_velocity(vector.new(0,0,0))
if i:is_player() then
local ppos = i:get_pos()
ppos.y=ppos.y-0.48
if top then ppos.y = ppos.y+1.02 end
i:set_pos(ppos)
- minetest.after(0.5,function()
+ core.after(0.5,function()
if not i:is_player() then return end
local newpos = i:get_pos()
newpos.y = math.max(newpos.y,ppos.y)
@@ -459,15 +466,16 @@ function celevator.drives.entity.entitiestonodes(refs,carid)
end
function celevator.drives.entity.step(dtime)
- local entitydrives_running = minetest.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
+ if not celevator.drives.entity.step_enabled then return end
+ local entitydrives_running = core.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
local save = false
for i,hash in ipairs(entitydrives_running) do
save = true
- local pos = minetest.get_position_from_hash(hash)
+ local pos = core.get_position_from_hash(hash)
local node = celevator.get_node(pos)
local sound = false
if node.name == "ignore" then
- minetest.forceload_block(pos,true)
+ core.forceload_block(pos,true)
elseif node.name ~= "celevator:drive" then
table.remove(entitydrives_running,i)
else
@@ -482,9 +490,9 @@ function celevator.drives.entity.step(dtime)
local startpos = tonumber(meta:get_string("startpos")) or 0
local oldvel = tonumber(meta:get_string("vel")) or 0
local inspection = meta:get_int("inspection") == 1
- local origin = minetest.string_to_pos(meta:get_string("origin"))
+ local origin = core.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))
+ core.log("error","[celevator] [entity drive] Invalid origin for drive at "..core.pos_to_string(pos))
meta:set_string("fault","badorigin")
table.remove(entitydrives_running,i)
return
@@ -499,10 +507,10 @@ function celevator.drives.entity.step(dtime)
end
end
local startv = vector.add(origin,vector.new(0,startpos,0))
- local hashes = celevator.drives.entity.gathercar(startv,minetest.dir_to_yaw(minetest.fourdir_to_dir(celevator.get_node(startv).param2)))
+ local hashes = celevator.drives.entity.gathercar(startv,core.dir_to_yaw(core.fourdir_to_dir(celevator.get_node(startv).param2)))
local nodes = {}
for carhash in pairs(hashes) do
- local carpos = minetest.get_position_from_hash(carhash)
+ local carpos = core.get_position_from_hash(carhash)
if vector.equals(startv,carpos) then
table.insert(nodes,1,carpos) --0,0,0 node must be first in the list
else
@@ -510,7 +518,7 @@ function celevator.drives.entity.step(dtime)
end
end
local carparam2 = celevator.get_node(nodes[1]).param2
- local cardef = minetest.registered_nodes[celevator.get_node(nodes[1]).name] or {}
+ local cardef = core.registered_nodes[celevator.get_node(nodes[1]).name] or {}
local cartype = cardef._celevator_car_type or "standard"
local carmeta = celevator.get_meta(startv)
meta:set_int("carparam2",carparam2)
@@ -558,12 +566,12 @@ function celevator.drives.entity.step(dtime)
if not ok then
local carparam2 = meta:get_int("carparam2")
local cartype = meta:get_string("cartype")
- celevator.car.spawncar(spawnpos,minetest.dir_to_yaw(minetest.fourdir_to_dir(carparam2)),carid,cartype,doortype)
+ celevator.car.spawncar(spawnpos,core.dir_to_yaw(core.fourdir_to_dir(carparam2)),carid,cartype,doortype)
else
celevator.get_meta(spawnpos):set_string("doortype",doortype)
end
apos = math.floor(apos+0.5)
- minetest.after(0.25,celevator.drives.entity.updatecopformspec,pos)
+ core.after(0.25,celevator.drives.entity.updatecopformspec,pos)
table.remove(entitydrives_running,i)
elseif dremain < 0.1 and not inspection then
vel = 0.1
@@ -610,9 +618,9 @@ function celevator.drives.entity.step(dtime)
local doortype = meta:get_string("doortype")
if (not doortype) or doortype == "" then doortype = "glass" end
local spawnpos = vector.round(vector.add(origin,vector.new(0,apos,0)))
- celevator.car.spawncar(spawnpos,minetest.dir_to_yaw(minetest.fourdir_to_dir(carparam2)),carid,cartype,doortype)
+ celevator.car.spawncar(spawnpos,core.dir_to_yaw(core.fourdir_to_dir(carparam2)),carid,cartype,doortype)
apos = math.floor(apos+0.5)
- minetest.after(0.25,celevator.drives.entity.updatecopformspec,pos)
+ core.after(0.25,celevator.drives.entity.updatecopformspec,pos)
table.remove(entitydrives_running,i)
elseif dremain < 0.1 and not inspection then
vel = 0.1
@@ -642,17 +650,18 @@ function celevator.drives.entity.step(dtime)
end
end
if save then
- celevator.storage:set_string("entitydrives_running",minetest.serialize(entitydrives_running))
+ celevator.storage:set_string("entitydrives_running",core.serialize(entitydrives_running))
end
+ celevator.drives.entity.step_enabled = save
end
-minetest.register_globalstep(celevator.drives.entity.step)
+core.register_globalstep(celevator.drives.entity.step)
function celevator.drives.entity.moveto(pos,target,inspection)
local meta = celevator.get_meta(pos)
meta:mark_as_private({"apos","dpos","vel","maxvel","state","startpos","doorstate"})
local carid = celevator.get_meta(pos):get_int("carid")
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.machinepos and celevator.get_node(carinfo.machinepos).name == "celevator:machine") then
meta:set_string("fault","nomachine")
return
@@ -668,9 +677,9 @@ function celevator.drives.entity.moveto(pos,target,inspection)
meta:set_string("fault","machinemismatch")
return
end
- local origin = minetest.string_to_pos(meta:get_string("origin"))
+ local origin = core.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))
+ core.log("error","[celevator] [entity drive] Invalid origin for drive at "..core.pos_to_string(pos))
meta:set_string("fault","badorigin")
return
end
@@ -694,8 +703,8 @@ function celevator.drives.entity.moveto(pos,target,inspection)
meta:set_string("state","start")
meta:set_int("inspection",inspection and 1 or 0)
meta:set_string("startpos",meta:get_string("apos"))
- local hash = minetest.hash_node_position(pos)
- local entitydrives_running = minetest.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
+ local hash = core.hash_node_position(pos)
+ local entitydrives_running = core.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
local running = false
for _,dhash in ipairs(entitydrives_running) do
if hash == dhash then
@@ -704,8 +713,9 @@ function celevator.drives.entity.moveto(pos,target,inspection)
end
end
if not running then
+ celevator.drives.entity.step_enabled = true
table.insert(entitydrives_running,hash)
- celevator.storage:set_string("entitydrives_running",minetest.serialize(entitydrives_running))
+ celevator.storage:set_string("entitydrives_running",core.serialize(entitydrives_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
@@ -728,7 +738,7 @@ function celevator.drives.entity.estop(pos)
local apos = math.floor(tonumber(meta:get_string("apos"))+0.5)
meta:set_string("dpos",tostring(apos))
meta:set_string("apos",tostring(apos))
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
local handles = celevator.drives.entity.entityinfo[hash].handles
meta:set_string("state","stopped")
meta:set_string("vel","0")
@@ -737,7 +747,7 @@ function celevator.drives.entity.estop(pos)
stopbuzz(pos)
motorsound(pos,"idle")
if carid ~= 0 then celevator.drives.entity.sheavetonode(carid) end
- minetest.after(0.25,celevator.drives.entity.updatecopformspec,pos)
+ core.after(0.25,celevator.drives.entity.updatecopformspec,pos)
end
@@ -752,12 +762,12 @@ function celevator.drives.entity.rezero(pos)
end
function celevator.drives.entity.getstatus(pos,call2)
- local node = minetest.get_node(pos)
+ local node = core.get_node(pos)
if node.name == "ignore" and not call2 then
- minetest.forceload_block(pos,true)
+ core.forceload_block(pos,true)
return celevator.drives.entity.get_status(pos,true)
elseif node.name ~= "celevator:drive" then
- minetest.log("error","[celevator] [entity drive] Could not load drive status at "..minetest.pos_to_string(pos))
+ core.log("error","[celevator] [entity drive] Could not load drive status at "..core.pos_to_string(pos))
return {fault = "metaload"}
else
local meta = celevator.get_meta(pos)
@@ -776,27 +786,27 @@ function celevator.drives.entity.getstatus(pos,call2)
end
function celevator.drives.entity.movedoors(drivepos,direction,nudge)
- local drivehash = minetest.hash_node_position(drivepos)
- local entitydrives_running = minetest.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
+ local drivehash = core.hash_node_position(drivepos)
+ local entitydrives_running = core.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
local drivemeta = celevator.get_meta(drivepos)
for _,hash in pairs(entitydrives_running) do
if drivehash == hash then
- minetest.log("error","[celevator] [entity drive] Attempted to open doors while drive at "..minetest.pos_to_string(drivepos).." was still moving")
+ core.log("error","[celevator] [entity drive] Attempted to open doors while drive at "..core.pos_to_string(drivepos).." was still moving")
drivemeta:set_string("fault","doorinterlock")
return
end
end
- local origin = minetest.string_to_pos(drivemeta:get_string("origin"))
+ local origin = core.string_to_pos(drivemeta:get_string("origin"))
if not origin then
- minetest.log("error","[celevator] [entity drive] Invalid origin for drive at "..minetest.pos_to_string(drivepos))
+ core.log("error","[celevator] [entity drive] Invalid origin for drive at "..core.pos_to_string(drivepos))
drivemeta:set_string("fault","badorigin")
return
end
local apos = tonumber(drivemeta:get_string("apos")) or 0
local carpos = vector.add(origin,vector.new(0,apos,0))
local carnode = celevator.get_node(carpos)
- local hwdoorpos = vector.add(carpos,vector.rotate_around_axis(minetest.fourdir_to_dir(carnode.param2),vector.new(0,1,0),math.pi))
- local isroot = minetest.get_item_group(celevator.get_node(hwdoorpos).name,"_celevator_hwdoor_root") == 1
+ local hwdoorpos = vector.add(carpos,vector.rotate_around_axis(core.fourdir_to_dir(carnode.param2),vector.new(0,1,0),math.pi))
+ local isroot = core.get_item_group(celevator.get_node(hwdoorpos).name,"_celevator_hwdoor_root") == 1
if direction == "open" and (isroot or drivemeta:get_string("doorstate") == "closing") then
celevator.doors.hwopen(hwdoorpos,drivepos)
drivemeta:set_string("doorstate","opening")
@@ -812,15 +822,15 @@ end
function celevator.drives.entity.pibeep(drivepos)
local drivemeta = celevator.get_meta(drivepos)
- local origin = minetest.string_to_pos(drivemeta:get_string("origin"))
+ local origin = core.string_to_pos(drivemeta:get_string("origin"))
if not origin then
- minetest.log("error","[celevator] [entity drive] Invalid origin for drive at "..minetest.pos_to_string(drivepos))
+ core.log("error","[celevator] [entity drive] Invalid origin for drive at "..core.pos_to_string(drivepos))
drivemeta:set_string("fault","badorigin")
return
end
local apos = tonumber(drivemeta:get_string("apos")) or 0
local beeppos = vector.add(origin,vector.new(0,apos+2,0))
- minetest.sound_play("celevator_pi_beep",{
+ core.sound_play("celevator_pi_beep",{
pos = beeppos,
gain = 1,
},true)
@@ -830,9 +840,9 @@ local function carsearch(pos)
for i=1,500,1 do
local searchpos = vector.subtract(pos,vector.new(0,i,0))
local node = celevator.get_node(searchpos)
- if minetest.get_item_group(node.name,"_celevator_car") == 1 then
- local yaw = minetest.dir_to_yaw(minetest.fourdir_to_dir(node.param2))
- local offsettext = minetest.registered_nodes[node.name]._position
+ if core.get_item_group(node.name,"_celevator_car") == 1 then
+ local yaw = core.dir_to_yaw(core.fourdir_to_dir(node.param2))
+ local offsettext = core.registered_nodes[node.name]._position
local xoffset = tonumber(string.sub(offsettext,1,1))
local yoffset = tonumber(string.sub(offsettext,2,2))
local zoffset = tonumber(string.sub(offsettext,3,3))
@@ -848,36 +858,36 @@ local function updatecarpos(pos)
if meta:get_int("carid") == 0 then return end
local carpos = carsearch(pos)
if carpos then
- meta:set_string("origin",minetest.pos_to_string(carpos))
- celevator.get_meta(carpos):set_string("machinepos",minetest.pos_to_string(pos))
- meta:set_string("infotext",string.format("Using car with origin %s",minetest.pos_to_string(carpos)))
+ meta:set_string("origin",core.pos_to_string(carpos))
+ celevator.get_meta(carpos):set_string("machinepos",core.pos_to_string(pos))
+ meta:set_string("infotext",S("Using car with origin @1",core.pos_to_string(carpos)))
local carid = meta:get_int("carid")
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.controllerpos) then return end
carinfo.origin = carpos
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
local drivepos = celevator.controller.finddrive(carinfo.controllerpos)
if drivepos then
local drivemeta = celevator.get_meta(drivepos)
if drivemeta:get_string("state") == "uninit" then
- drivemeta:set_string("origin",minetest.pos_to_string(carpos))
+ drivemeta:set_string("origin",core.pos_to_string(carpos))
drivemeta:set_string("state","stopped")
drivemeta:set_int("carid",carid)
end
end
- local caryaw = minetest.dir_to_yaw(minetest.fourdir_to_dir(celevator.get_node(carpos).param2))
+ local caryaw = core.dir_to_yaw(core.fourdir_to_dir(celevator.get_node(carpos).param2))
local carnodes = celevator.drives.entity.gathercar(carpos,caryaw)
for hash in pairs(carnodes) do
- local carmeta = celevator.get_meta(minetest.get_position_from_hash(hash))
+ local carmeta = celevator.get_meta(core.get_position_from_hash(hash))
carmeta:set_int("carid",carid)
end
else
- meta:set_string("infotext","No car found! Punch to try again")
+ meta:set_string("infotext",S("No car found! Punch to try again"))
end
end
-minetest.register_node("celevator:machine",{
- description = "Elevator Hoist Machine",
+core.register_node("celevator:machine",{
+ description = S("Elevator Hoist Machine"),
groups = {
dig_immediate = 2,
_celevator_machine = 1,
@@ -921,54 +931,54 @@ minetest.register_node("celevator:machine",{
},
after_place_node = function(pos,player)
if not player:is_player() then
- minetest.remove_node(pos)
+ core.remove_node(pos)
return true
end
- local newnode = minetest.get_node(pos)
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(newnode.param2))
+ local newnode = core.get_node(pos)
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2))
local motorpos = vector.add(pos,vector.rotate_around_axis(vector.new(-1,0,0),vector.new(0,1,0),facedir))
- local motorreplaces = minetest.get_node(motorpos).name
+ local motorreplaces = core.get_node(motorpos).name
local sheavepos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,-1),vector.new(0,1,0),facedir))
- local sheavereplaces = minetest.get_node(sheavepos).name
+ local sheavereplaces = core.get_node(sheavepos).name
local name = player:get_player_name()
- if not (minetest.registered_nodes[motorreplaces] and minetest.registered_nodes[motorreplaces].buildable_to) then
- minetest.chat_send_player(name,"Can't place machine here - no room for the motor (to the left)!")
- minetest.remove_node(pos)
+ if not (core.registered_nodes[motorreplaces] and core.registered_nodes[motorreplaces].buildable_to) then
+ core.chat_send_player(name,S("Can't place machine here - no room for the motor (to the left)!"))
+ core.remove_node(pos)
return true
end
- if minetest.is_protected(motorpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"Can't place machine here - space for the motor (to the left) is protected!")
- minetest.record_protection_violation(motorpos,name)
- minetest.remove_node(pos)
+ if core.is_protected(motorpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("Can't place machine here - space for the motor (to the left) is protected!"))
+ core.record_protection_violation(motorpos,name)
+ core.remove_node(pos)
return true
end
- if not (minetest.registered_nodes[sheavereplaces] and minetest.registered_nodes[sheavereplaces].buildable_to) then
- minetest.chat_send_player(name,"Can't place machine here - no room for the sheave (in front)!")
- minetest.remove_node(pos)
+ if not (core.registered_nodes[sheavereplaces] and core.registered_nodes[sheavereplaces].buildable_to) then
+ core.chat_send_player(name,S("Can't place machine here - no room for the sheave (in front)!"))
+ core.remove_node(pos)
return true
end
- if minetest.is_protected(sheavepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"Can't place machine here - space for the sheave (in front) is protected!")
- minetest.record_protection_violation(sheavepos,name)
- minetest.remove_node(pos)
+ if core.is_protected(sheavepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("Can't place machine here - space for the sheave (in front) is protected!"))
+ core.record_protection_violation(sheavepos,name)
+ core.remove_node(pos)
return true
end
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]button[3,3.5;2,1;save;Save]")
- minetest.set_node(motorpos,{name="celevator:motor",param2=newnode.param2})
- minetest.set_node(sheavepos,{name="celevator:sheave",param2=newnode.param2})
+ local meta = core.get_meta(pos)
+ meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;"..S("Car ID")..";]button[3,3.5;2,1;save;"..S("Save").."]")
+ core.set_node(motorpos,{name="celevator:motor",param2=newnode.param2})
+ core.set_node(sheavepos,{name="celevator:sheave",param2=newnode.param2})
end,
after_dig_node = function(pos,node)
- local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(node.param2))
+ local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2))
local motorpos = vector.add(pos,vector.rotate_around_axis(vector.new(-1,0,0),vector.new(0,1,0),facedir))
- if minetest.get_node(motorpos).name == "celevator:motor" then
- minetest.remove_node(motorpos)
+ if core.get_node(motorpos).name == "celevator:motor" then
+ core.remove_node(motorpos)
end
local sheavepos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,-1),vector.new(0,1,0),facedir))
- if minetest.get_node(sheavepos).name == "celevator:sheave" then
- minetest.remove_node(sheavepos)
+ if core.get_node(sheavepos).name == "celevator:sheave" then
+ core.remove_node(sheavepos)
end
- local erefs = minetest.get_objects_inside_radius(sheavepos,0.5)
+ local erefs = core.get_objects_inside_radius(sheavepos,0.5)
for _,ref in pairs(erefs) do
if ref:get_luaentity() and ref:get_luaentity().name == "celevator:sheave_moving" then
ref:remove()
@@ -976,15 +986,15 @@ minetest.register_node("celevator:machine",{
end
end,
on_punch = function(pos)
- local meta = minetest.get_meta(pos)
- if not minetest.string_to_pos(meta:get_string("origin")) then
+ local meta = core.get_meta(pos)
+ if not core.string_to_pos(meta:get_string("origin")) then
updatecarpos(pos)
end
end,
on_receive_fields = function(pos,_,fields)
if tonumber(fields.carid) then
local carid = tonumber(fields.carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local oldmachinepos = carinfo.machinepos
if oldmachinepos then
@@ -994,8 +1004,8 @@ minetest.register_node("celevator:machine",{
end
end
carinfo.machinepos = pos
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
- local meta = minetest.get_meta(pos)
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
+ local meta = core.get_meta(pos)
meta:set_int("carid",carid)
meta:set_string("formspec","")
updatecarpos(pos)
@@ -1003,8 +1013,8 @@ minetest.register_node("celevator:machine",{
end,
})
-minetest.register_node("celevator:motor",{
- description = "Hoist Motor (you hacker you!)",
+core.register_node("celevator:motor",{
+ description = S("Hoist Motor (you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -1037,8 +1047,8 @@ minetest.register_node("celevator:motor",{
},
})
-minetest.register_node("celevator:sheave",{
- description = "Sheave (you hacker you!)",
+core.register_node("celevator:sheave",{
+ description = S("Sheave (you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -1070,8 +1080,8 @@ minetest.register_node("celevator:sheave",{
},
})
-minetest.register_node("celevator:sheave_centered",{
- description = "Centered Sheave (you hacker you!)",
+core.register_node("celevator:sheave_centered",{
+ description = S("Centered Sheave (you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -1103,7 +1113,7 @@ minetest.register_node("celevator:sheave_centered",{
},
})
-minetest.register_entity("celevator:sheave_moving",{
+core.register_entity("celevator:sheave_moving",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.667,0.667,0.667),
@@ -1114,13 +1124,13 @@ minetest.register_entity("celevator:sheave_moving",{
})
function celevator.drives.entity.sheavetoentity(carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.machinepos) then return end
- local dir = minetest.fourdir_to_dir(celevator.get_node(carinfo.machinepos).param2)
+ local dir = core.fourdir_to_dir(celevator.get_node(carinfo.machinepos).param2)
local pos = vector.add(carinfo.machinepos,vector.multiply(dir,-1))
- minetest.set_node(pos,{
+ core.set_node(pos,{
name = "celevator:sheave",
- param2 = minetest.dir_to_fourdir(dir),
+ param2 = core.dir_to_fourdir(dir),
})
local sheaverefs = celevator.drives.entity.nodestoentities({pos},"celevator:sheave_moving")
celevator.drives.entity.sheaverefs[carid] = sheaverefs
@@ -1129,44 +1139,44 @@ function celevator.drives.entity.sheavetoentity(carid)
end
function celevator.drives.entity.sheavetonode(carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.machinepos) then return end
- local dir = minetest.fourdir_to_dir(celevator.get_node(carinfo.machinepos).param2)
+ local dir = core.fourdir_to_dir(celevator.get_node(carinfo.machinepos).param2)
local pos = vector.add(carinfo.machinepos,vector.multiply(dir,-1))
local erefs = celevator.drives.entity.sheaverefs[carid]
if erefs and erefs[1] then
erefs[1]:remove()
end
- minetest.set_node(pos,{
+ core.set_node(pos,{
name = "celevator:sheave",
- param2 = minetest.dir_to_fourdir(dir),
+ param2 = core.dir_to_fourdir(dir),
})
end
function celevator.drives.entity.updatecopformspec(drivepos)
- local entitydrives_running = minetest.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
- if entitydrives_running[minetest.hash_node_position(drivepos)] then return end
+ local entitydrives_running = core.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
+ if entitydrives_running[core.hash_node_position(drivepos)] then return end
local drivemeta = celevator.get_meta(drivepos)
local carid = drivemeta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local copformspec = celevator.get_meta(carinfo.controllerpos):get_string("copformspec")
local switchformspec = celevator.get_meta(carinfo.controllerpos):get_string("switchformspec")
- local origin = minetest.string_to_pos(drivemeta:get_string("origin"))
+ local origin = core.string_to_pos(drivemeta:get_string("origin"))
if not origin then
- minetest.log("error","[celevator] [entity drive] Invalid origin for drive at "..minetest.pos_to_string(drivepos))
+ core.log("error","[celevator] [entity drive] Invalid origin for drive at "..core.pos_to_string(drivepos))
drivemeta:set_string("fault","badorigin")
return
end
local apos = tonumber(drivemeta:get_string("apos")) or 0
if apos == math.floor(apos) then
local carpos = vector.add(origin,vector.new(0,apos,0))
- local carnodes = celevator.drives.entity.gathercar(carpos,minetest.dir_to_yaw(minetest.fourdir_to_dir(celevator.get_node(carpos).param2)))
+ local carnodes = celevator.drives.entity.gathercar(carpos,core.dir_to_yaw(core.fourdir_to_dir(celevator.get_node(carpos).param2)))
for hash in pairs(carnodes) do
- local piecepos = minetest.get_position_from_hash(hash)
+ local piecepos = core.get_position_from_hash(hash)
local piece = celevator.get_node(piecepos)
- local ndef = minetest.registered_nodes[piece.name] or {}
+ local ndef = core.registered_nodes[piece.name] or {}
if ndef._cop then
celevator.get_meta(piecepos):set_string("formspec",copformspec)
elseif ndef._keyswitches then
diff --git a/drive_null.lua b/drive_null.lua
index 1a22e22..e2eb1f4 100644
--- a/drive_null.lua
+++ b/drive_null.lua
@@ -1,27 +1,34 @@
+local S = core.get_translator("celevator")
+
celevator.drives.null = {
- name = "Null Drive",
- description = "Simulation only, no movement, for testing and demonstration",
+ name = S("Null Drive"),
+ description = S("Simulation only, no movement, for testing and demonstration"),
nname = "celevator:drive_null",
soundhandles = {},
+ step_enabled = true, --Not a setting, is overwritten on globalstep, true here to check for running drives on startup
}
local function update_ui(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local apos = tonumber(meta:get_string("apos")) or 0
- local status = "Idle"
+ local status
local vel = tonumber(meta:get_string("vel")) or 0
+ local velstr = string.format("%0.02f",math.abs(vel))
+ local aposstr = string.format("%0.02f",apos)
if vel > 0 then
- status = string.format("Running: Up, %0.02f m/s",vel)
+ status = S("Null Drive - Running: Up, @1m/s - Position: @2m",velstr,aposstr)
elseif vel < 0 then
- status = string.format("Running: Down, %0.02f m/s",math.abs(vel))
+ status = S("Null Drive - Running: Down, @1m/s - Position: @2m",velstr,aposstr)
+ else
+ status = S("Null Drive - Idle")
end
- meta:set_string("infotext",string.format("Null Drive - %s - Position: %0.02f m",status,apos))
+ meta:set_string("infotext",status)
end
local function playbuzz(pos)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if celevator.drives.null.soundhandles[hash] == "cancel" then return end
- celevator.drives.null.soundhandles[hash] = minetest.sound_play("celevator_drive_run",{
+ celevator.drives.null.soundhandles[hash] = core.sound_play("celevator_drive_run",{
pos = pos,
loop = true,
gain = 0.4,
@@ -29,29 +36,29 @@ local function playbuzz(pos)
end
local function startbuzz(pos)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if celevator.drives.null.soundhandles[hash] == "cancel" then
celevator.drives.null.soundhandles[hash] = nil
return
end
if celevator.drives.null.soundhandles[hash] then return end
celevator.drives.null.soundhandles[hash] = "pending"
- minetest.after(0.5,playbuzz,pos)
+ core.after(0.5,playbuzz,pos)
end
local function stopbuzz(pos)
- local hash = minetest.hash_node_position(pos)
+ local hash = core.hash_node_position(pos)
if not celevator.drives.null.soundhandles[hash] then return end
if celevator.drives.null.soundhandles[hash] == "pending" then
celevator.drives.null.soundhandles[hash] = "cancel"
end
if type(celevator.drives.null.soundhandles[hash]) ~= "string" then
- minetest.sound_stop(celevator.drives.null.soundhandles[hash])
+ core.sound_stop(celevator.drives.null.soundhandles[hash])
celevator.drives.null.soundhandles[hash] = nil
end
end
-minetest.register_node("celevator:drive_null",{
+core.register_node("celevator:drive_null",{
description = celevator.drives.null.name,
groups = {
cracky = 1,
@@ -78,7 +85,7 @@ minetest.register_node("celevator:drive_null",{
},
_celevator_drive_type = "null",
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("apos","0")
meta:set_string("dpos","0")
meta:set_string("vel","0")
@@ -90,19 +97,20 @@ minetest.register_node("celevator:drive_null",{
})
function celevator.drives.null.step(dtime)
- local nulldrives_running = minetest.deserialize(celevator.storage:get_string("nulldrives_running")) or {}
+ if not celevator.drives.null.step_enabled then return end
+ local nulldrives_running = core.deserialize(celevator.storage:get_string("nulldrives_running")) or {}
local save = false
for i,hash in ipairs(nulldrives_running) do
save = true
- local pos = minetest.get_position_from_hash(hash)
+ local pos = core.get_position_from_hash(hash)
local node = celevator.get_node(pos)
local sound = false
if node.name == "ignore" then
- minetest.forceload_block(pos,true)
+ core.forceload_block(pos,true)
elseif node.name ~= "celevator:drive_null" then
table.remove(nulldrives_running,i)
else
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local apos = tonumber(meta:get_string("apos")) or 0
local dpos = tonumber(meta:get_string("dpos")) or 0
local maxvel = tonumber(meta:get_string("maxvel")) or 0.2
@@ -144,17 +152,18 @@ function celevator.drives.null.step(dtime)
end
end
if save then
- celevator.storage:set_string("nulldrives_running",minetest.serialize(nulldrives_running))
+ celevator.storage:set_string("nulldrives_running",core.serialize(nulldrives_running))
end
+ celevator.drives.null.step_enabled = save
end
-minetest.register_globalstep(celevator.drives.null.step)
+core.register_globalstep(celevator.drives.null.step)
function celevator.drives.null.moveto(pos,target)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("dpos",tostring(target))
- local hash = minetest.hash_node_position(pos)
- local nulldrives_running = minetest.deserialize(celevator.storage:get_string("nulldrives_running")) or {}
+ local hash = core.hash_node_position(pos)
+ local nulldrives_running = core.deserialize(celevator.storage:get_string("nulldrives_running")) or {}
local running = false
for _,dhash in ipairs(nulldrives_running) do
if hash == dhash then
@@ -163,8 +172,9 @@ function celevator.drives.null.moveto(pos,target)
end
end
if not running then
+ celevator.drives.null.step_enabled = true
table.insert(nulldrives_running,hash)
- celevator.storage:set_string("nulldrives_running",minetest.serialize(nulldrives_running))
+ celevator.storage:set_string("nulldrives_running",core.serialize(nulldrives_running))
end
end
@@ -173,13 +183,13 @@ function celevator.drives.null.resetpos(pos)
end
function celevator.drives.null.estop(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("dpos",meta:get_string("apos"))
meta:set_string("vel","0")
end
function celevator.drives.null.setmaxvel(pos,maxvel)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("maxvel",tostring(maxvel))
end
@@ -188,35 +198,35 @@ function celevator.drives.null.rezero(pos)
end
function celevator.drives.null.movedoors(drivepos,direction)
- local drivehash = minetest.hash_node_position(drivepos)
- local nulldrives_running = minetest.deserialize(celevator.storage:get_string("nulldrives_running")) or {}
+ local drivehash = core.hash_node_position(drivepos)
+ local nulldrives_running = core.deserialize(celevator.storage:get_string("nulldrives_running")) or {}
for _,hash in pairs(nulldrives_running) do
if drivehash == hash then return end
end
- local drivemeta = minetest.get_meta(drivepos)
+ local drivemeta = core.get_meta(drivepos)
if direction == "open" then
drivemeta:set_string("doorstate","opening")
- minetest.after(math.pi+0.5,function()
- minetest.get_meta(drivepos):set_string("doorstate","open")
+ core.after(math.pi+0.5,function()
+ core.get_meta(drivepos):set_string("doorstate","open")
end)
elseif direction == "close" then
drivemeta:set_string("doorstate","closing")
- minetest.after((math.pi/0.66)+0.5,function()
- minetest.get_meta(drivepos):set_string("doorstate","closed")
+ core.after((math.pi/0.66)+0.5,function()
+ core.get_meta(drivepos):set_string("doorstate","closed")
end)
end
end
function celevator.drives.null.getstatus(pos,call2)
- local node = minetest.get_node(pos)
+ local node = core.get_node(pos)
if node.name == "ignore" and not call2 then
- minetest.forceload_block(pos,true)
+ core.forceload_block(pos,true)
return celevator.drives.null.get_status(pos,true)
elseif node.name ~= "celevator:drive_null" then
- minetest.log("error","[celevator] [null drive] Could not load drive status at "..minetest.pos_to_string(pos))
+ core.log("error","[celevator] [null drive] Could not load drive status at "..core.pos_to_string(pos))
return
else
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local ret = {}
ret.apos = tonumber(meta:get_string("apos")) or 0
ret.dpos = tonumber(meta:get_string("dpos")) or 0
@@ -232,7 +242,7 @@ function celevator.drives.null.resetfault(pos)
--This drive has no possible faults at this time
--(drive communication faults are generated by the controller),
--but the controller expects to be able to call this
- minetest.get_meta(pos):set_string("fault","")
+ core.get_meta(pos):set_string("fault","")
end
function celevator.drives.null.updatecopformspec()
diff --git a/framework.lua b/framework.lua
index 1793634..e2aed27 100644
--- a/framework.lua
+++ b/framework.lua
@@ -1,20 +1,20 @@
celevator = {
drives = {},
- storage = minetest.get_mod_storage(),
+ storage = core.get_mod_storage(),
}
function celevator.get_node(pos)
- local node = minetest.get_node_or_nil(pos)
+ local node = core.get_node_or_nil(pos)
if node then return node end
VoxelManip(pos,pos)
- return minetest.get_node(pos)
+ return core.get_node(pos)
end
function celevator.get_meta(pos)
- if minetest.get_node_or_nil(pos) then
- return minetest.get_meta(pos)
+ if core.get_node_or_nil(pos) then
+ return core.get_meta(pos)
else
VoxelManip(pos,pos)
- return minetest.get_meta(pos)
+ return core.get_meta(pos)
end
end
diff --git a/fs1switch.lua b/fs1switch.lua
index 5949250..49be80a 100644
--- a/fs1switch.lua
+++ b/fs1switch.lua
@@ -1,5 +1,7 @@
celevator.fs1switch = {}
+local S = core.get_translator("celevator")
+
local function maketex(switchpos,lit)
local tex = "celevator_fs1switch_"..switchpos..".png"
if lit then tex = tex.."^celevator_fs1switch_led.png" end
@@ -12,42 +14,42 @@ local nodebox = {
}
local function resetspring(pos)
- local node = minetest.get_node(pos)
+ local node = core.get_node(pos)
local offstates = {
["celevator:fs1switch_reset"] = "celevator:fs1switch_off",
["celevator:fs1switch_reset_lit"] = "celevator:fs1switch_off_lit",
}
if offstates[node.name] then
node.name = offstates[node.name]
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
end
end
local function rightclick(pos,node,player)
if not (player and player:is_player()) then return end
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
if meta:get_string("formspec") ~= "" then return end
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"You don't have a key for this switch.")
- minetest.record_protection_violation(pos,name)
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("You don't have a key for this switch."))
+ core.record_protection_violation(pos,name)
return
end
if node.name == "celevator:fs1switch_off" then
node.name = "celevator:fs1switch_on"
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
elseif node.name == "celevator:fs1switch_on" then
node.name = "celevator:fs1switch_reset"
- minetest.swap_node(pos,node)
- minetest.after(0.5,resetspring,pos)
+ core.swap_node(pos,node)
+ core.after(0.5,resetspring,pos)
elseif node.name == "celevator:fs1switch_off_lit" or node.name == "celevator:fs1switch_on_lit" then
node.name = "celevator:fs1switch_reset_lit"
- minetest.swap_node(pos,node)
- minetest.after(0.5,resetspring,pos)
+ core.swap_node(pos,node)
+ core.after(0.5,resetspring,pos)
end
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local controllerpos = carinfo.controllerpos
local dispatcher = false
@@ -56,7 +58,7 @@ local function rightclick(pos,node,player)
dispatcher = true
end
if not controllerpos then return end
- local controllermeta = minetest.get_meta(controllerpos)
+ local controllermeta = core.get_meta(controllerpos)
if controllermeta:get_int("carid") ~= carid then return end
if node.name == "celevator:fs1switch_reset" or node.name == "celevator:fs1switch_reset_lit" then
if dispatcher then
@@ -87,32 +89,41 @@ function celevator.fs1switch.setled(pos,on)
local node = celevator.get_node(pos)
if on and onstates[node.name] then
node.name = onstates[node.name]
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
elseif (not on) and offstates[node.name] then
node.name = offstates[node.name]
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
end
end
local function unpair(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.fs1switches) then return end
for i,fs1switch in pairs(carinfo.fs1switches) do
if vector.equals(pos,fs1switch.pos) then
table.remove(carinfo.fs1switches,i)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end
local switchstates = {"off","on","reset"}
+local descriptions = {
+ off = S("Elevator Fire Service Phase 1 Keyswitch"),
+ on = S("Elevator Fire Service Phase 1 Keyswitch (on state - you hacker you!)"),
+ reset = S("Elevator Fire Service Phase 1 Keyswitch (reset state - you hacker you!)"),
+ offlit = S("Elevator Fire Service Phase 1 Keyswitch (lit - you hacker you!)"),
+ onlit = S("Elevator Fire Service Phase 1 Keyswitch (on state, lit - you hacker you!)"),
+ resetlit = S("Elevator Fire Service Phase 1 Keyswitch (reset state, lit - you hacker you!)"),
+}
+
for _,switchpos in ipairs(switchstates) do
- minetest.register_node("celevator:fs1switch_"..switchpos,{
- description = "Elevator Fire Service Phase 1 Keyswitch"..(switchpos == "off" and "" or string.format(" (%s state - you hacker you!)",switchpos)),
+ core.register_node("celevator:fs1switch_"..switchpos,{
+ description = descriptions[switchpos],
groups = {
dig_immediate = 2,
not_in_creative_inventory = (switchpos == "off" and 0 or 1),
@@ -136,36 +147,36 @@ for _,switchpos in ipairs(switchstates) do
fixed = nodebox,
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]button[3,3.5;2,1;save;Save]")
+ local meta = core.get_meta(pos)
+ meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;"..S("Car ID")..";]button[3,3.5;2,1;save;"..S("Save").."]")
end,
on_receive_fields = function(pos,_,fields,player)
local carid = tonumber(fields.carid or 0)
if not (carid and carid >= 1 and carid == math.floor(carid)) then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local controllerpos = carinfo.controllerpos or carinfo.dispatcherpos
if not controllerpos then return end
local name = player:get_player_name()
- if minetest.is_protected(controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(controllerpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a controller/dispatcher you don't have access to.")
- minetest.record_protection_violation(controllerpos,name)
+ core.chat_send_player(name,S("Can't connect to a controller/dispatcher you don't have access to."))
+ core.record_protection_violation(controllerpos,name)
end
return
end
if not carinfo.fs1switches then carinfo.fs1switches = {} end
table.insert(carinfo.fs1switches,{pos=pos})
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
- local meta = minetest.get_meta(pos)
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
+ local meta = core.get_meta(pos)
meta:set_int("carid",carid)
meta:set_string("formspec","")
end,
on_rightclick = rightclick,
on_destruct = unpair,
})
- minetest.register_node("celevator:fs1switch_"..switchpos.."_lit",{
- description = "Elevator Fire Service Phase 1 Keyswitch"..string.format(" (%s state, lit - you hacker you!)",switchpos),
+ core.register_node("celevator:fs1switch_"..switchpos.."_lit",{
+ description = descriptions[switchpos.."lit"],
groups = {
dig_immediate = 2,
not_in_creative_inventory = 1,
diff --git a/genericswitch.lua b/genericswitch.lua
index 9cdf31c..71342f8 100644
--- a/genericswitch.lua
+++ b/genericswitch.lua
@@ -1,13 +1,15 @@
+local S = core.get_translator("celevator")
+
local inputoptions = {
{
id = "none",
- desc = "(none)",
+ desc = S("(none)"),
func_on = function() end,
needsfloor = false,
},
{
id = "carcall",
- desc = "Car Call at Landing:",
+ desc = S("Car Call at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -19,7 +21,7 @@ local inputoptions = {
},
{
id = "upcall",
- desc = "Up Call (simplex car) at Landing:",
+ desc = S("Up Call (simplex car) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -31,7 +33,7 @@ local inputoptions = {
},
{
id = "downcall",
- desc = "Down Call (simplex car) at Landing:",
+ desc = S("Down Call (simplex car) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -43,7 +45,7 @@ local inputoptions = {
},
{
id = "swingupcall",
- desc = "Up Call (swing) at Landing:",
+ desc = S("Up Call (swing) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -55,7 +57,7 @@ local inputoptions = {
},
{
id = "swingdowncall",
- desc = "Down Call (swing) at Landing:",
+ desc = S("Down Call (swing) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -67,7 +69,7 @@ local inputoptions = {
},
{
id = "fs1off",
- desc = "Deactivate Fire Service Phase 1",
+ desc = S("Deactivate Fire Service Phase 1"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "fs1switch",
@@ -78,7 +80,7 @@ local inputoptions = {
},
{
id = "fs1on",
- desc = "Activate Fire Service (main landing) Phase 1",
+ desc = S("Activate Fire Service (main landing) Phase 1"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "fs1switch",
@@ -89,7 +91,7 @@ local inputoptions = {
},
{
id = "fs1onalt",
- desc = "Activate Fire Service (alternate landing) Phase 1",
+ desc = S("Activate Fire Service (alternate landing) Phase 1"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "fs1switch",
@@ -101,7 +103,7 @@ local inputoptions = {
},
{
id = "mrsmoke",
- desc = "Machine Room or Hoistway Smoke Detector",
+ desc = S("Machine Room or Hoistway Smoke Detector"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "mrsmoke",
@@ -111,7 +113,7 @@ local inputoptions = {
},
{
id = "secdeny",
- desc = "Lock Car Calls at Landing:",
+ desc = S("Lock Car Calls at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -126,7 +128,7 @@ local inputoptions = {
},
{
id = "secauth",
- desc = "Require Auth for Car Calls at Landing:",
+ desc = S("Require Auth for Car Calls at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -141,7 +143,7 @@ local inputoptions = {
},
{
id = "secallow",
- desc = "Unlock Car Calls at Landing:",
+ desc = S("Unlock Car Calls at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -156,7 +158,7 @@ local inputoptions = {
},
{
id = "swingon",
- desc = "Activate Swing Operation",
+ desc = S("Activate Swing Operation"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -168,7 +170,7 @@ local inputoptions = {
},
{
id = "swingoff",
- desc = "Deactivate Swing Operation",
+ desc = S("Deactivate Swing Operation"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -183,13 +185,13 @@ local inputoptions = {
local dinputoptions = {
{
id = "none",
- desc = "(none)",
+ desc = S("(none)"),
func_on = function() end,
needsfloor = false,
},
{
id = "upcall",
- desc = "Up Call at Landing:",
+ desc = S("Up Call at Landing:"),
func_on = function(dispatcherpos,floor)
celevator.dispatcher.run(dispatcherpos,{
type = "remotemsg",
@@ -201,7 +203,7 @@ local dinputoptions = {
},
{
id = "downcall",
- desc = "Down Call at Landing:",
+ desc = S("Down Call at Landing:"),
func_on = function(dispatcherpos,floor)
celevator.dispatcher.run(dispatcherpos,{
type = "remotemsg",
@@ -213,7 +215,7 @@ local dinputoptions = {
},
{
id = "fs1off",
- desc = "Deactivate Fire Service Phase 1",
+ desc = S("Deactivate Fire Service Phase 1"),
func_on = function(dispatcherpos)
celevator.dispatcher.run(dispatcherpos,{
type = "fs1switch",
@@ -224,7 +226,7 @@ local dinputoptions = {
},
{
id = "fs1on",
- desc = "Activate Fire Service Phase 1",
+ desc = S("Activate Fire Service Phase 1"),
func_on = function(dispatcherpos)
celevator.dispatcher.run(dispatcherpos,{
type = "fs1switch",
@@ -236,46 +238,46 @@ local dinputoptions = {
}
local function updateinputform(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local dmode = meta:get_int("dispatcher") == 1
- local fs = "formspec_version[7]size[8,8.5]"
- fs = fs.."tabheader[0,0;1;tab;Controller,Dispatcher;"..(dmode and "2" or "1")..";true;true]"
- fs = fs.."vertlabel[0.33,1;ON]"
- fs = fs.."dropdown[1,0.5;6,1;signal_on;"
+ local fs = "formspec_version[7]size[9,8.5]"
+ fs = fs.."tabheader[0,0;1;tab;"..S("Controller")..","..S("Dispatcher")..";"..(dmode and "2" or "1")..";true;true]"
+ fs = fs.."vertlabel[0.33,1;"..S("ON").."]"
+ fs = fs.."dropdown[1,0.5;7,1;signal_on;"
local selected_on = 1
local currentid_on = meta:get_string("signal_on")
for k,v in ipairs(dmode and dinputoptions or inputoptions) do
- fs = fs..minetest.formspec_escape(v.desc)..","
+ fs = fs..core.formspec_escape(v.desc)..","
if v.id == currentid_on then selected_on = k end
end
fs = string.sub(fs,1,-2)
fs = fs..";"..selected_on..";false]"
- fs = fs.."field[0.5,2;3,1;carid;"..(dmode and "Dispatcher ID" or "Car ID")..";${carid}]"
- fs = fs.."field[4.5,2;3,1;floor_on;Landing Number;${floor_on}]"
- fs = fs.."box[0,3.25;8,0.1;#CCCCCC]"
- fs = fs.."vertlabel[0.33,4;OFF]"
- fs = fs.."dropdown[1,3.5;6,1;signal_off;"
+ fs = fs.."field[0.5,2;3,1;carid;"..(dmode and S("Dispatcher ID") or S("Car ID"))..";${carid}]"
+ fs = fs.."field[4.5,2;3,1;floor_on;"..S("Landing Number")..";${floor_on}]"
+ fs = fs.."box[0,3.25;9,0.1;#CCCCCC]"
+ fs = fs.."vertlabel[0.33,4;"..S("OFF").."]"
+ fs = fs.."dropdown[1,3.5;7,1;signal_off;"
local selected_off = 1
local currentid_off = meta:get_string("signal_off")
for k,v in ipairs(dmode and dinputoptions or inputoptions) do
- fs = fs..minetest.formspec_escape(v.desc)..","
+ fs = fs..core.formspec_escape(v.desc)..","
if v.id == currentid_off then selected_off = k end
end
fs = string.sub(fs,1,-2)
fs = fs..";"..selected_off..";false]"
- fs = fs.."field[4.5,5;3,1;floor_off;Landing Number;${floor_off}]"
- fs = fs.."label[1.5,6.5;Not all signal options require a landing number.]"
- fs = fs.."button_exit[2.5,7;3,1;save;Save]"
+ fs = fs.."field[4.5,5;3,1;floor_off;"..S("Landing Number")..";${floor_off}]"
+ fs = fs.."label[1.5,6.5;"..S("Not all signal options require a landing number.").."]"
+ fs = fs.."button_exit[2.5,7;3,1;save;"..S("Save").."]"
meta:set_string("formspec",fs)
end
local function handleinputfields(pos,_,fields,player)
if fields.quit and not fields.save then return end
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.record_protection_violation(pos,name)
+ core.record_protection_violation(pos,name)
end
return
end
@@ -284,24 +286,24 @@ local function handleinputfields(pos,_,fields,player)
if not tonumber(fields.carid) then return end
meta:set_int("carid",fields.carid)
local carid = tonumber(fields.carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if dmode then
if not carinfo.dispatcherpos then return end
if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then return end
- if minetest.is_protected(carinfo.dispatcherpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.dispatcherpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a dispatcher you don't have access to.")
- minetest.record_protection_violation(carinfo.dispatcherpos,name)
+ core.chat_send_player(name,S("Can't connect to a dispatcher you don't have access to."))
+ core.record_protection_violation(carinfo.dispatcherpos,name)
end
return
end
else
if not carinfo.controllerpos then return end
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
- if minetest.is_protected(carinfo.controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.controllerpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a controller you don't have access to.")
- minetest.record_protection_violation(carinfo.controllerpos,name)
+ core.chat_send_player(name,S("Can't connect to a controller you don't have access to."))
+ core.record_protection_violation(carinfo.controllerpos,name)
end
return
end
@@ -329,22 +331,22 @@ local function handleinputfields(pos,_,fields,player)
meta:set_string("signal_on",def_on.id)
meta:set_string("signal_off",def_off.id)
updateinputform(pos)
- local infotext = carid.." - "..def_on.desc..(def_on.needsfloor and " "..floor_on or "")
+ local infotext = " - "..def_on.desc..(def_on.needsfloor and " "..floor_on or "")
if def_on.id == "none" or def_off.id ~= "none" then
infotext = infotext.." / "..def_off.desc..(def_off.needsfloor and " "..floor_off or "")
end
if dmode then
- infotext = "Dispatcher: "..infotext
+ infotext = S("Dispatcher: @1",carid)..infotext
else
- infotext = "Car: "..infotext
+ infotext = S("Car: @1",carid)..infotext
end
meta:set_string("infotext",infotext)
if def_on.id ~= "none" or def_off.id ~= "none" then
meta:set_string("formspec","")
local momentary = def_off.id == "none"
- local node = minetest.get_node(pos)
+ local node = core.get_node(pos)
node.name = (momentary and "celevator:genericswitch_momentary_off" or "celevator:genericswitch_maintained_off")
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
end
elseif fields.tab then
meta:set_int("dispatcher",tonumber(fields.tab)-1)
@@ -353,10 +355,10 @@ local function handleinputfields(pos,_,fields,player)
end
local function handleinput(pos,on)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
local dmode = meta:get_int("dispatcher") == 1
if dmode then
if not carinfo.dispatcherpos then return end
@@ -382,8 +384,8 @@ local function handleinput(pos,on)
end
end
-minetest.register_node("celevator:genericswitch",{
- description = "Elevator Keyswitch",
+core.register_node("celevator:genericswitch",{
+ description = S("Elevator Keyswitch"),
tiles = {
"celevator_cabinet_sides.png",
"celevator_cabinet_sides.png",
@@ -405,15 +407,15 @@ minetest.register_node("celevator:genericswitch",{
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_int("floor",1)
updateinputform(pos)
end,
on_receive_fields = handleinputfields,
})
-minetest.register_node("celevator:genericswitch_maintained_off",{
- description = "Elevator Keyswitch (maintained, off state - you hacker you!)",
+core.register_node("celevator:genericswitch_maintained_off",{
+ description = S("Elevator Keyswitch (maintained, off state - you hacker you!)"),
tiles = {
"celevator_cabinet_sides.png",
"celevator_cabinet_sides.png",
@@ -438,19 +440,19 @@ minetest.register_node("celevator:genericswitch_maintained_off",{
},
on_rightclick = function(pos,node,player)
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"You don't have a key for this switch.")
- minetest.record_protection_violation(pos,name)
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("You don't have a key for this switch."))
+ core.record_protection_violation(pos,name)
return
end
node.name = "celevator:genericswitch_maintained_on"
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
handleinput(pos,true)
end,
})
-minetest.register_node("celevator:genericswitch_maintained_on",{
- description = "Elevator Keyswitch (maintained, on state - you hacker you!)",
+core.register_node("celevator:genericswitch_maintained_on",{
+ description = S("Elevator Keyswitch (maintained, on state - you hacker you!)"),
tiles = {
"celevator_cabinet_sides.png",
"celevator_cabinet_sides.png",
@@ -475,19 +477,19 @@ minetest.register_node("celevator:genericswitch_maintained_on",{
},
on_rightclick = function(pos,node,player)
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"You don't have a key for this switch.")
- minetest.record_protection_violation(pos,name)
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("You don't have a key for this switch."))
+ core.record_protection_violation(pos,name)
return
end
node.name = "celevator:genericswitch_maintained_off"
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
handleinput(pos,false)
end,
})
-minetest.register_node("celevator:genericswitch_momentary_off",{
- description = "Elevator Keyswitch (momentary, off state - you hacker you!)",
+core.register_node("celevator:genericswitch_momentary_off",{
+ description = S("Elevator Keyswitch (momentary, off state - you hacker you!)"),
tiles = {
"celevator_cabinet_sides.png",
"celevator_cabinet_sides.png",
@@ -512,26 +514,26 @@ minetest.register_node("celevator:genericswitch_momentary_off",{
},
on_rightclick = function(pos,node,player)
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
- minetest.chat_send_player(name,"You don't have a key for this switch.")
- minetest.record_protection_violation(pos,name)
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("You don't have a key for this switch."))
+ core.record_protection_violation(pos,name)
return
end
node.name = "celevator:genericswitch_momentary_on"
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
handleinput(pos,true)
- minetest.after(1,function()
- local newnode = minetest.get_node(pos)
+ core.after(1,function()
+ local newnode = core.get_node(pos)
if newnode.name == "celevator:genericswitch_momentary_on" then
newnode.name = "celevator:genericswitch_momentary_off"
- minetest.swap_node(pos,newnode)
+ core.swap_node(pos,newnode)
end
end)
end,
})
-minetest.register_node("celevator:genericswitch_momentary_on",{
- description = "Elevator Keyswitch (momentary, on state - you hacker you!)",
+core.register_node("celevator:genericswitch_momentary_on",{
+ description = S("Elevator Keyswitch (momentary, on state - you hacker you!)"),
tiles = {
"celevator_cabinet_sides.png",
"celevator_cabinet_sides.png",
diff --git a/governor.lua b/governor.lua
index 4333c92..15700fd 100644
--- a/governor.lua
+++ b/governor.lua
@@ -1,20 +1,22 @@
+local S = core.get_translator("celevator")
+
local function spawngovsheave(pos)
- local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5)
+ local entitiesnearby = core.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 entity = core.add_entity(pos,"celevator:governor_sheave")
+ local fdir = core.fourdir_to_dir(core.get_node(pos).param2)
+ local yaw = core.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",
+core.register_node("celevator:governor",{
+ description = S("Elevator Governor"),
groups = {
cracky = 1,
},
@@ -39,11 +41,11 @@ minetest.register_node("celevator:governor",{
},
},
on_construct = function(pos)
- minetest.get_meta(pos):set_string("formspec","field[carid;Car ID;]")
+ core.get_meta(pos):set_string("formspec","field[carid;"..S("Car ID")..";]")
spawngovsheave(pos)
end,
after_dig_node = function(pos)
- local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5)
+ local entitiesnearby = core.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()
@@ -53,17 +55,17 @@ minetest.register_node("celevator:governor",{
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))
+ local carinfo = core.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))
+ local meta = core.get_meta(pos)
+ meta:set_string("controllerpos",core.pos_to_string(carinfo.controllerpos))
meta:set_string("formspec","")
end,
})
-minetest.register_node("celevator:governor_sheave",{
- description = "Governor Sheave (you hacker you!)",
+core.register_node("celevator:governor_sheave",{
+ description = S("Governor Sheave (you hacker you!)"),
groups = {
not_in_creative_inventory = 1,
},
@@ -95,7 +97,7 @@ minetest.register_node("celevator:governor_sheave",{
},
})
-minetest.register_entity("celevator:governor_sheave",{
+core.register_entity("celevator:governor_sheave",{
initial_properties = {
visual = "wielditem",
visual_size = vector.new(0.4,0.4,0.27),
@@ -107,8 +109,9 @@ minetest.register_entity("celevator:governor_sheave",{
local sheave = self.object
if not sheave then return end
local governorpos = vector.round(sheave:get_pos())
+ if not core.compare_block_status(governorpos,"active") then return self.object:remove() end
local governormeta = celevator.get_meta(governorpos)
- local controllerpos = minetest.string_to_pos(governormeta:get_string("controllerpos"))
+ local controllerpos = core.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
@@ -122,7 +125,7 @@ minetest.register_entity("celevator:governor_sheave",{
end,
})
-minetest.register_lbm({
+core.register_lbm({
name = "celevator:spawngovsheave",
label = "Spawn governor sheaves",
nodenames = {"celevator:governor"},
diff --git a/init.lua b/init.lua
index c38c1ff..5348231 100644
--- a/init.lua
+++ b/init.lua
@@ -4,6 +4,7 @@ local components = {
"car_standard",
"car_glassback",
"car_metal",
+ "car_metalglass",
"doors",
"drive_null",
"drive_entity",
@@ -27,9 +28,9 @@ local integrations = {
}
for _,i in ipairs(integrations) do
- if minetest.get_modpath(i) then table.insert(components,i) end
+ if core.get_modpath(i) then table.insert(components,i) end
end
for _,v in ipairs(components) do
- dofile(string.format("%s%s%s.lua",minetest.get_modpath("celevator"),DIR_DELIM,v))
+ dofile(string.format("%s/%s.lua",core.get_modpath("celevator"),v))
end
diff --git a/laptop.lua b/laptop.lua
index a65739c..a44bf2b 100644
--- a/laptop.lua
+++ b/laptop.lua
@@ -1,11 +1,13 @@
+local S = core.get_translator("celevator")
+
laptop.register_app("celevator",{
app_name = "mView",
- app_info = "Remote interface for MTronic XT elevator controllers",
+ app_info = S("Remote interface for MTronic XT elevator controllers"),
app_icon = "celevator_laptop_icon.png",
formspec_func = function(_,mtos)
local ram = mtos.bdev:get_app_storage("ram","celevator")
local mem = mtos.bdev:get_app_storage("hdd","celevator")
- if not mem then return mtos.theme:get_label("0.5,0.5","This application requires a hard disk drive.") end
+ if not mem then return mtos.theme:get_label("0.5,0.5",S("This application requires a hard disk drive.")) end
if not mem.connections then mem.connections = {} end
if not ram.screenstate then ram.screenstate = (#mem.connections > 0 and "connections" or "welcome") end
if not mem.selectedconnection then mem.selectedconnection = 1 end
@@ -16,73 +18,77 @@ laptop.register_app("celevator",{
if ram.screenstate == "welcome" then
fs = fs.."background9[5.5,1;4,2;celevator_fs_bg.png;false;3]"
fs = fs.."image[5.75,1;4,2;celevator_logo.png]"
- fs = fs..mtos.theme:get_label("2,4","Welcome to the mView remote interface for MTronic XT elevator controllers!")
- fs = fs..mtos.theme:get_label("2,6","Add a connection to get started.")
- fs = fs..mtos.theme:get_button("5.5,7;4,1","major","connections","Add/Edit Connections")
+ fs = fs..mtos.theme:get_label("2,4",S("Welcome to the mView remote interface for MTronic XT elevator controllers!"))
+ fs = fs..mtos.theme:get_label("2,6",S("Add a connection to get started."))
+ fs = fs..mtos.theme:get_button("5.5,7;4,1","major","connections",S("Add/Edit Connections"))
elseif ram.screenstate == "connections" then
- fs = fs..mtos.theme:get_label("0.5,0.5","MANAGE CONNECTIONS")
+ fs = fs..mtos.theme:get_label("0.5,0.5",S("MANAGE CONNECTIONS"))
if #mem.connections > 0 then
fs = fs.."textlist[1,2;6,7;connection;"
for i=#mem.connections,1,-1 do
- local text = string.format("ID %d - %s",mem.connections[i].carid,mem.connections[i].name)
- fs = fs..minetest.formspec_escape(text)
+ local text = S("ID @1 - @2",mem.connections[i].carid,mem.connections[i].name)
+ fs = fs..core.formspec_escape(text)
fs = fs..(i==1 and "" or ",")
end
fs = fs..";"..tostring(#mem.connections-mem.selectedconnection+1)..";false]"
else
- fs = fs..mtos.theme:get_label("1,2","No Connections")
+ fs = fs..mtos.theme:get_label("1,2",S("No Connections"))
end
- fs = fs..mtos.theme:get_button("8,2;3,1","major","new","New Connection")
+ fs = fs..mtos.theme:get_button("8,2;3,1","major","new",S("New Connection"))
if mem.connections[mem.selectedconnection] then
- fs = fs..mtos.theme:get_button("8,3;3,1","major","edit","Edit Connection")
- fs = fs..mtos.theme:get_button("8,4;3,1","major","delete","Delete Connection")
- fs = fs..mtos.theme:get_button("8,7;3,1","major","connect","Connect >")
- if #mem.connections > mem.selectedconnection then fs = fs..mtos.theme:get_button("8,5;3,1","major","moveup","Move Up") end
- if mem.selectedconnection > 1 then fs = fs..mtos.theme:get_button("8,6;3,1","major","movedown","Move Down") end
+ fs = fs..mtos.theme:get_button("8,3;3,1","major","edit",S("Edit Connection"))
+ fs = fs..mtos.theme:get_button("8,4;3,1","major","delete",S("Delete Connection"))
+ fs = fs..mtos.theme:get_button("8,7;3,1","major","connect",S("Connect >"))
+ if #mem.connections > mem.selectedconnection then fs = fs..mtos.theme:get_button("8,5;3,1","major","moveup",S("Move Up")) end
+ if mem.selectedconnection > 1 then fs = fs..mtos.theme:get_button("8,6;3,1","major","movedown",S("Move Down")) end
end
elseif ram.screenstate == "newconnection" then
- fs = fs..mtos.theme:get_label("0.5,0.5","NEW CONNECTION")
- fs = fs..mtos.theme:get_label("0.5,1","Please enter the ID you would like to connect to and a name for the connection.")
- fs = fs..mtos.theme:get_label("0.7,1.8","ID")
- fs = fs..mtos.theme:get_label("3.7,1.8","Name")
- fs = fs..string.format("field[1,2.5;2,1;carid;;%s]",minetest.formspec_escape(mem.newconnection.carid))
- fs = fs..string.format("field[4,2.5;4,1;name;;%s]",minetest.formspec_escape(mem.newconnection.name))
- fs = fs..mtos.theme:get_button("3,4;3,1","major","save","Save")
- fs = fs..mtos.theme:get_button("3,5.5;3,1","major","cancel","Cancel")
+ fs = fs..mtos.theme:get_label("0.5,0.5",S("NEW CONNECTION"))
+ fs = fs..mtos.theme:get_label("0.5,1",S("Please enter the ID you would like to connect to and a name for the connection."))
+ fs = fs..mtos.theme:get_label("0.7,1.8",S("ID"))
+ fs = fs..mtos.theme:get_label("3.7,1.8",S("Name"))
+ fs = fs..string.format("field[1,2.5;2,1;carid;;%s]",core.formspec_escape(mem.newconnection.carid))
+ fs = fs..string.format("field[4,2.5;4,1;name;;%s]",core.formspec_escape(mem.newconnection.name))
+ fs = fs..mtos.theme:get_button("3,4;3,1","major","save",S("Save"))
+ fs = fs..mtos.theme:get_button("3,5.5;3,1","major","cancel",S("Cancel"))
elseif ram.screenstate == "editconnection" then
- fs = fs..mtos.theme:get_label("0.5,0.5","EDIT CONNECTION")
- fs = fs..mtos.theme:get_label("0.7,1.8","ID: "..mem.connections[mem.selectedconnection].carid)
- fs = fs..mtos.theme:get_label("3.7,1.8","Name")
- fs = fs..string.format("field[4,2.5;4,1;name;;%s]",minetest.formspec_escape(mem.connections[mem.selectedconnection].name))
- fs = fs..mtos.theme:get_button("3,4;3,1","major","save","Save")
- fs = fs..mtos.theme:get_button("3,5.5;3,1","major","cancel","Cancel")
+ fs = fs..mtos.theme:get_label("0.5,0.5",S("EDIT CONNECTION"))
+ fs = fs..mtos.theme:get_label("0.7,1.8",S("ID: @1",mem.connections[mem.selectedconnection].carid))
+ fs = fs..mtos.theme:get_label("3.7,1.8",S("Name"))
+ fs = fs..string.format("field[4,2.5;4,1;name;;%s]",core.formspec_escape(mem.connections[mem.selectedconnection].name))
+ fs = fs..mtos.theme:get_button("3,4;3,1","major","save",S("Save"))
+ fs = fs..mtos.theme:get_button("3,5.5;3,1","major","cancel",S("Cancel"))
elseif ram.screenstate == "notfound" then
- fs = fs..mtos.theme:get_label("0.5,0.5","Error")
- fs = fs..mtos.theme:get_label("0.5,1","Could not find a controller or dispatcher with the given ID.")
- fs = fs..mtos.theme:get_label("0.5,1.3","Please check the ID number and try again.")
- fs = fs..mtos.theme:get_button("0.5,3;2,1","major","ok","OK")
+ fs = fs..mtos.theme:get_label("0.5,0.5",S("Error"))
+ fs = fs..mtos.theme:get_label("0.5,1",S("Could not find a controller or dispatcher with the given ID."))
+ fs = fs..mtos.theme:get_label("0.5,1.3",S("Please check the ID number and try again."))
+ fs = fs..mtos.theme:get_button("0.5,3;2,1","major","ok",S("OK"))
+ elseif ram.screenstate == "protected" then
+ fs = fs..mtos.theme:get_label("0.5,0.5",S("Error"))
+ fs = fs..mtos.theme:get_label("0.5,1",S("Controller or dispatcher is protected."))
+ fs = fs..mtos.theme:get_button("0.5,3;2,1","major","ok",S("OK"))
elseif ram.screenstate == "dispatcherstatus" then
local connection = mem.connections[mem.selectedconnection]
local pos = connection.pos
if celevator.dispatcher.isdispatcher(pos) then
- local meta = minetest.get_meta(pos)
- local dmem = minetest.deserialize(meta:get_string("mem"))
+ local meta = core.get_meta(pos)
+ local dmem = core.deserialize(meta:get_string("mem"))
if not dmem then return end
fs = fs.."background9[-0.1,0.4;15.2,10.05;celevator_fs_bg.png;false;3]"
- fs = fs.."label[0.5,0.5;"..string.format("Connected to %s (ID %d)",connection.name,connection.carid).."]"
- fs = fs.."button[1,1;2,1;disconnect;Disconnect]"
+ fs = fs.."label[0.5,0.5;"..S("Connected to @1 (ID @2)",connection.name,connection.carid).."]"
+ fs = fs.."button[1,1;2,1;disconnect;"..S("Disconnect").."]"
fs = fs.."box[0.5,1;0.1,9;#AAAAAAFF]"
fs = fs.."box[14.25,1;0.1,9;#AAAAAAFF]"
fs = fs.."style_type[label;font_size=*0.75]"
- fs = fs.."label[0.05,10;UP]"
- fs = fs.."label[14.35,10;DOWN]"
+ fs = fs.."image[0.15,9.8;0.2,0.4;celevator_menu_small_arrow.png]"
+ fs = fs.."image[14.55,9.8;0.2,0.4;celevator_menu_small_arrow.png^[transformFY]"
fs = fs.."style_type[image_button;font=mono;font_size=*0.66]"
for car=1,#dmem.params.carids,1 do
local xp = (car-1)*0.75+1
local carid = dmem.params.carids[car]
local carstate = dmem.carstatus[carid].state
- fs = fs..string.format("label[%f,9.8;CAR %d]",xp,car)
- fs = fs..string.format("label[%f,10;%s]",xp+0.1,minetest.colorize("#ff5555",(carstate == "normal" and " IN" or "OUT")))
+ fs = fs..string.format("label[%f,9.8;%s]",xp,S("CAR @1",car))
+ fs = fs..string.format("label[%f,10;%s]",xp+0.1,core.colorize("#ff5555",(carstate == "normal" and S(" IN") or S("OUT"))))
end
local lowestfloor = (mem.screenpage-1)*10+1
local maxfloor = #dmem.params.floornames
@@ -138,11 +144,11 @@ laptop.register_app("celevator",{
local floor = i+lowestfloor-1
fs = fs..string.format("label[0.62,%f;%s]",yp+0.05,dmem.params.floornames[floor])
local uplabel = ""
- if dmem.upcalls[floor] then uplabel = minetest.colorize("#55FF55",math.floor(dmem.upeta[floor] or 0)) end
+ if dmem.upcalls[floor] then uplabel = core.colorize("#55FF55",math.floor(dmem.upeta[floor] or 0)) end
if floor < #dmem.params.floornames then fs = fs..string.format("image_button[0,%f;0.66,0.66;celevator_fs_bg.png;upcall%d;%s]",yp,floor,uplabel) end
fs = fs..string.format("label[14,%f;%s]",yp+0.05,dmem.params.floornames[floor])
local dnlabel = ""
- if dmem.dncalls[floor] then dnlabel = minetest.colorize("#FF5555",math.floor(dmem.dneta[floor] or 0)) end
+ if dmem.dncalls[floor] then dnlabel = core.colorize("#FF5555",math.floor(dmem.dneta[floor] or 0)) end
if floor > 1 then fs = fs..string.format("image_button[14.4,%f;0.66,0.66;celevator_fs_bg.png;dncall%d;%s]",yp,floor,dnlabel) end
for car=1,#dmem.params.carids,1 do
local xp = (car-1)*0.75+1
@@ -150,10 +156,10 @@ laptop.register_app("celevator",{
local carfloor = realtocarfloor(carid,floor)
if carfloor then
local ccdot = dmem.carstatus[carid].carcalls[carfloor] and "*" or ""
- local groupup = dmem.carstatus[carid].groupupcalls[carfloor] and minetest.colorize("#55FF55","^") or ""
- local swingup = dmem.carstatus[carid].swingupcalls[carfloor] and minetest.colorize("#FFFF55","^") or ""
- local swingdn = dmem.carstatus[carid].swingdncalls[carfloor] and minetest.colorize("#FFFF55","v") or ""
- local groupdn = dmem.carstatus[carid].groupdncalls[carfloor] and minetest.colorize("#FF5555","v") or ""
+ local groupup = dmem.carstatus[carid].groupupcalls[carfloor] and core.colorize("#55FF55","^") or ""
+ local swingup = dmem.carstatus[carid].swingupcalls[carfloor] and core.colorize("#FFFF55","^") or ""
+ local swingdn = dmem.carstatus[carid].swingdncalls[carfloor] and core.colorize("#FFFF55","v") or ""
+ local groupdn = dmem.carstatus[carid].groupdncalls[carfloor] and core.colorize("#FF5555","v") or ""
ccdot = groupup..swingup..ccdot..swingdn..groupdn
if getpos(carid) == floor then
local cargraphics = {
@@ -165,9 +171,9 @@ laptop.register_app("celevator",{
}
ccdot = cargraphics[dmem.carstatus[carid].doorstate]
if dmem.carstatus[carid].direction == "up" then
- ccdot = minetest.colorize("#55FF55",ccdot)
+ ccdot = core.colorize("#55FF55",ccdot)
elseif dmem.carstatus[carid].direction == "down" then
- ccdot = minetest.colorize("#FF5555",ccdot)
+ ccdot = core.colorize("#FF5555",ccdot)
end
end
fs = fs..string.format("image_button[%f,%f;0.66,0.66;celevator_fs_bg.png;carcall%02d%d;%s]",xp,yp,car,floor,ccdot)
@@ -182,32 +188,33 @@ laptop.register_app("celevator",{
local connection = mem.connections[mem.selectedconnection]
local pos = connection.pos
if celevator.controller.iscontroller(pos) then
- local meta = minetest.get_meta(pos)
- local cmem = minetest.deserialize(meta:get_string("mem"))
+ local meta = core.get_meta(pos)
+ local cmem = core.deserialize(meta:get_string("mem"))
if not cmem then return end
local modenames = {
- normal = "Normal Operation",
- uninit = "Uninitialized",
- resync = "Position Sync - Floor",
- bfdemand = "Position Sync - Terminal",
- fault = "Fault",
- stop = "Emergency Stop",
- mrinspect = "Machine Room Inspection",
- carinspect = "Car Top Inspection",
- inspconflict = "Inspection Conflict",
- fs1 = "Fire Service - Phase 1",
- fs2 = "Fire Service - Phase 2",
- fs2hold = "Fire Service - Phase 2 Hold",
- indep = "Independent Service",
- capture = "Captured",
- test = "Test Mode",
+ normal = S("Normal Operation"),
+ uninit = S("Uninitialized"),
+ resync = S("Position Sync - Floor"),
+ bfdemand = S("Position Sync - Terminal"),
+ fault = S("Fault"),
+ stop = S("Emergency Stop"),
+ mrinspect = S("Machine Room Inspection"),
+ carinspect = S("Car Top Inspection"),
+ inspconflict = "Inspection Conflict", -- No longer used
+ fs1 = S("Fire Service - Phase 1"),
+ fs2 = S("Fire Service - Phase 2"),
+ fs2hold = S("Fire Service - Phase 2 Hold"),
+ indep = S("Independent Service"),
+ capture = S("Captured"),
+ test = S("Test Mode"),
+ swing = S("Swing Operation"),
}
local doorstates = {
- open = "Open",
- opening = "Opening",
- closing = "Closing",
- closed = "Closed",
- testtiming = "Closed",
+ open = S("Doors Open"),
+ opening = S("Doors Opening"),
+ closing = S("Doors Closing"),
+ closed = S("Doors Closed"),
+ testtiming = S("Doors Closed"),
}
local carpos = 0
local carfloor = 0
@@ -219,15 +226,18 @@ laptop.register_app("celevator",{
break
end
end
- fs = fs..mtos.theme:get_label("1,1",string.format("Connected to %s (ID %d)",connection.name,connection.carid))
+ fs = fs..mtos.theme:get_label("1,1",S("Connected to @1 (ID @2)",connection.name,connection.carid))
fs = fs..mtos.theme:get_label("1,2",modenames[cmem.carstate])
- fs = fs..mtos.theme:get_label("1,2.5",string.format("Doors %s",doorstates[cmem.doorstate]))
- local pi = minetest.formspec_escape(cmem.params.floornames[carfloor])
- fs = fs..mtos.theme:get_label("1,3",string.format("Position: %0.02fm Speed: %+0.02fm/s PI: %s",cmem.drive.status.apos,cmem.drive.status.vel,pi))
+ fs = fs..mtos.theme:get_label("1,2.5",doorstates[cmem.doorstate])
+ local pi = core.formspec_escape(cmem.params.floornames[carfloor])
+ local posfmt = string.format("%0.02f",cmem.drive.status.apos)
+ local speedfmt = string.format("%+0.02f",cmem.drive.status.vel)
+ local posmsg = S("Position: @1m Speed: @2m/s PI: @3",posfmt,speedfmt,pi)
+ fs = fs..mtos.theme:get_label("1,3",posmsg)
if #cmem.faultlog > 0 then
- fs = fs..mtos.theme:get_label("1,3.5","Fault(s) Active")
+ fs = fs..mtos.theme:get_label("1,3.5",S("Fault(s) Active"))
else
- fs = fs..mtos.theme:get_label("1,3.5","No Current Faults")
+ fs = fs..mtos.theme:get_label("1,3.5",S("No Current Faults"))
end
fs = fs.."background9[8,0.3;6.2,10;celevator_fs_bg.png;false;3]"
fs = fs.."style_type[image_button;font=mono;font_size=*0.75]"
@@ -235,14 +245,14 @@ laptop.register_app("celevator",{
fs = fs.."box[11.808,0.75;0.05,9;#AAAAAAFF]"
fs = fs.."box[12.708,0.75;0.05,9;#AAAAAAFF]"
fs = fs.."box[13.725,0.75;0.1,9;#AAAAAAFF]"
- fs = fs.."label[11.25,0.3;UP]"
- fs = fs.."label[12.042,0.3;CAR]"
- fs = fs.."label[12.825,0.3;DOWN]"
+ fs = fs.."image[11.2,0.3;0.2,0.4;celevator_menu_small_arrow.png]"
+ fs = fs.."label[12.042,0.3;"..S("CAR").."]"
+ fs = fs.."image[13.1,0.3;0.2,0.4;celevator_menu_small_arrow.png^[transformFY]"
if mem.scrollfollowscar then mem.screenpage = math.floor((carfloor-1)/10)+1 end
local maxfloor = #cmem.params.floornames
local bottom = (mem.screenpage-1)*10+1
if maxfloor > 10 then
- fs = fs..string.format("checkbox[8.4,1.5;scrollfollowscar;Follow Car;%s]",tostring(mem.scrollfollowscar))
+ fs = fs..string.format("checkbox[8.4,1.7;scrollfollowscar;"..S("Follow Car")..";%s]",tostring(mem.scrollfollowscar))
if bottom+9 < maxfloor then
fs = fs.."image_button[8.5,1;0.75,0.75;celevator_menu_arrow.png;scrollup;;false;false;celevator_menu_arrow.png]"
end
@@ -254,7 +264,7 @@ laptop.register_app("celevator",{
local ypos = (11-(i*0.9))*0.9-0.75
local floornum = bottom+i
if floornum > maxfloor then break end
- fs = fs..string.format("label[10.125,%f;%s]",ypos-0.2,minetest.formspec_escape(cmem.params.floornames[floornum]))
+ fs = fs..string.format("label[10.125,%f;%s]",ypos-0.2,core.formspec_escape(cmem.params.floornames[floornum]))
local ccdot = cmem.carcalls[floornum] and "*" or ""
if carfloor == floornum then
local cargraphics = {
@@ -266,25 +276,25 @@ laptop.register_app("celevator",{
}
ccdot = cargraphics[cmem.doorstate]
if cmem.direction == "up" then
- ccdot = minetest.colorize("#55FF55",ccdot)
+ ccdot = core.colorize("#55FF55",ccdot)
elseif cmem.direction == "down" then
- ccdot = minetest.colorize("#FF5555",ccdot)
+ ccdot = core.colorize("#FF5555",ccdot)
end
end
fs = fs..string.format("image_button[11.925,%f;0.75,0.75;celevator_fs_bg.png;carcall%d;%s]",ypos-0.25,floornum,ccdot)
if floornum < maxfloor then
- local arrow = cmem.upcalls[floornum] and minetest.colorize("#55FF55","^") or ""
+ local arrow = cmem.upcalls[floornum] and core.colorize("#55FF55","^") or ""
if cmem.params.groupmode == "group" then
- arrow = cmem.groupupcalls[floornum] and minetest.colorize("#55FF55","^") or ""
- arrow = (cmem.swingupcalls[floornum] and minetest.colorize("#FFFF55","^") or "")..arrow
+ arrow = cmem.groupupcalls[floornum] and core.colorize("#55FF55","^") or ""
+ arrow = (cmem.swingupcalls[floornum] and core.colorize("#FFFF55","^") or "")..arrow
end
fs = fs..string.format("image_button[11.025,%f;0.75,0.75;celevator_fs_bg.png;upcall%d;%s]",ypos-0.25,floornum,arrow)
end
if floornum > 1 then
- local arrow = cmem.dncalls[floornum] and minetest.colorize("#FF5555","v") or ""
+ local arrow = cmem.dncalls[floornum] and core.colorize("#FF5555","v") or ""
if cmem.params.groupmode == "group" then
- arrow = cmem.swingdncalls[floornum] and minetest.colorize("#FFFF55","v") or ""
- arrow = (cmem.groupdncalls[floornum] and minetest.colorize("#FF5555","v") or "")..arrow
+ arrow = cmem.swingdncalls[floornum] and core.colorize("#FFFF55","v") or ""
+ arrow = (cmem.groupdncalls[floornum] and core.colorize("#FF5555","v") or "")..arrow
end
fs = fs..string.format("image_button[12.825,%f;0.75,0.75;celevator_fs_bg.png;downcall%d;%s]",ypos-0.25,floornum,arrow)
end
@@ -292,7 +302,7 @@ laptop.register_app("celevator",{
else
ram.screenstate = "notfound"
end
- fs = fs..mtos.theme:get_button("1,8;3,1","major","disconnect","Disconnect")
+ fs = fs..mtos.theme:get_button("1,8;3,1","major","disconnect",S("Disconnect"))
end
return fs
end,
@@ -305,7 +315,7 @@ laptop.register_app("celevator",{
ram.screenstate = "connections"
end
elseif ram.screenstate == "connections" then
- local exp = fields.connection and minetest.explode_textlist_event(fields.connection) or {}
+ local exp = fields.connection and core.explode_textlist_event(fields.connection) or {}
if fields.new then
ram.screenstate = "newconnection"
mem.newconnection.name = "Untitled"
@@ -331,10 +341,16 @@ laptop.register_app("celevator",{
mem.screenpage = 1
if exp.type == "DCL" then mem.selectedconnection = #mem.connections-exp.index+1 end
local connection = mem.connections[mem.selectedconnection]
- if connection.itemtype == "controller" and celevator.controller.iscontroller(connection.pos) then
+ local cpos = connection.pos
+ if core.is_protected(cpos,mtos.sysram.current_player) and not core.check_player_privs(mtos.sysram.current_player,{protection_bypass=true}) then
+ core.record_protection_violation(cpos,mtos.sysram.current_player)
+ ram.screenstate = "protected"
+ return
+ end
+ if connection.itemtype == "controller" and celevator.controller.iscontroller(cpos) then
ram.screenstate = "controllerstatus"
app:get_timer():start(0.2)
- elseif connection.itemtype == "dispatcher" and celevator.dispatcher.isdispatcher(connection.pos) then
+ elseif connection.itemtype == "dispatcher" and celevator.dispatcher.isdispatcher(cpos) then
ram.screenstate = "dispatcherstatus"
app:get_timer():start(0.2)
else
@@ -352,7 +368,7 @@ laptop.register_app("celevator",{
if fields.save then
local carid = tonumber(fields.carid)
if not (carid and math.floor(carid) == carid) then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not carinfo then return end
local pos = carinfo.controllerpos
local itemtype
@@ -365,6 +381,11 @@ laptop.register_app("celevator",{
ram.screenstate = "notfound"
return
end
+ if core.is_protected(pos,mtos.sysram.current_player) and not core.check_player_privs(mtos.sysram.current_player,{protection_bypass=true}) then
+ core.record_protection_violation(pos,mtos.sysram.current_player)
+ ram.screenstate = "protected"
+ return
+ end
local connection = {
name = fields.name,
carid = carid,
@@ -381,6 +402,10 @@ laptop.register_app("celevator",{
if fields.ok then
ram.screenstate = "newconnection"
end
+ elseif ram.screenstate == "protected" then
+ if fields.ok then
+ ram.screenstate = #mem.connections > 0 and "connections" or "newconnection"
+ end
elseif ram.screenstate == "dispatcherstatus" then
if fields.disconnect then
ram.screenstate = "connections"
@@ -388,8 +413,8 @@ laptop.register_app("celevator",{
end
local pos = mem.connections[mem.selectedconnection].pos
if celevator.dispatcher.isdispatcher(pos) then
- local meta = minetest.get_meta(pos)
- local dmem = minetest.deserialize(meta:get_string("mem"))
+ local meta = core.get_meta(pos)
+ local dmem = core.deserialize(meta:get_string("mem"))
if not dmem then return end
for k in pairs(fields) do
if string.sub(k,1,7) == "carcall" then
@@ -446,8 +471,8 @@ laptop.register_app("celevator",{
end
local pos = mem.connections[mem.selectedconnection].pos
if celevator.controller.iscontroller(pos) then
- local meta = minetest.get_meta(pos)
- local cmem = minetest.deserialize(meta:get_string("mem"))
+ local meta = core.get_meta(pos)
+ local cmem = core.deserialize(meta:get_string("mem"))
if not cmem then return end
local carcallacceptstates = {
normal = true,
diff --git a/locale/celevator.es.tr b/locale/celevator.es.tr
new file mode 100644
index 0000000..0bfe8ba
--- /dev/null
+++ b/locale/celevator.es.tr
@@ -0,0 +1,359 @@
+# textdomain: celevator
+Elevator Up Call Button=Botón de llamada de ascensor (subir)
+Elevator Down Call Button=Botón de llamada de ascensor (bajar)
+Elevator Up and Down Call Buttons=Botón de llamada de ascensor (subir y bajar)
+Elevator Call Button (on state - you hacker you!)=Botón de llamada de ascensor (estado activado)
+Error reading car information!@nPlease remove and replace this node.=¡Error al leer la información de la cabina!@nRetire y reemplace este bloque.
+Controller/dispatcher is missing!@nPlease remove and replace this node.=¡El controlador/despachador no está presente!@nRetire y reemplace este bloque.
+Controller/dispatcher found but with incorrect ID!@nPlease remove and replace this node.=¡El controlador/despachador tiene el número incorrecto!@nRetire y reemplace este bloque.
+Car (part @1 - you hacker you!)=Cabina del ascensor (parte @1)
+You don't have access to these switches.=No tienes acceso a estos interruptores.
+Really remove this car?=¿De verdad quieres eliminar esta cabina?
+Yes=Sí
+No=No
+Car-top Inspection Box, Off State (you hacker you!)=Controles de inspección en el techo de la cabina (estado desactivado)
+Car-top Inspection Box, On State (you hacker you!)=Controles de inspección en el techo de la cabina (estado activado)
+Glass-Back Elevator Car=Cabina del ascensor con parte trasera en vidrio
+Metal Elevator Car=Cabina del ascensor en metal
+Metal Glass-Back Elevator Car=Cabina del ascensor en metal con parte trasera en vidrio
+Basic Elevator Car=Cabina del ascensor básica
+Can't place car here - position @1m to the right, @2m up, and @3m back is blocked!=No se puede colocar la cabina aquí - hay una posición bloqueada @1 m a la derecha, @2 m hacia arriba, y @3 m hacia atrás
+Can't place car here - position @1m to the right, @2m up, and @3m back is protected!=No se puede colocar la cabina aquí - hay una posición protegida @1 m a la derecha, @2 m hacia arriba, y @3 m hacia atrás
+Places a car call at the specified landing on the specified elevator=Realiza una llamada de cabina en la planta y el ascensor especificado
+<car ID> <landing number>=<número del ascensor> <número de planta>
+Invalid car ID=Número de ascensor no válido
+Invalid landing number=Número de planta no válido
+No such car or car info is missing=El ascensor especificado o su información no existe
+Controller is missing=El controlador no está presente
+Controller found but with wrong ID=El controlador tiene un número incorrecto
+Controller is protected=El controlador está protegido
+Command sent=Comando enviado
+Places an up hall call at the specified landing on the specified elevator or dispatcher=Realiza una llamada para subir a la planta y el ascensor/despachador especificado
+Dispatcher is missing=El despachador no está presente
+Dispatcher found but with wrong ID=El despachador tiene un número incorrecto
+Dispatcher is protected=El despachador está protegido
+Places a down hall call at the specified landing on the specified elevator or dispatcher=Realiza una llamada para bajar a la planta y el ascensor/despachador especificado
+View the status of the specified elevator=Mostrar el estado del ascensor especificado
+<car ID>=<número del ascensor>
+Failed to load controller memory=Error al leer la memoria del controlador
+Reload celevator controller firmware from disk=Recargar el firmware del controlador celevator
+Elevator Controller=Controlador de ascensor
+Controller (door open - you hacker you!)=Controlador (con puerta abierta)
+Controller (top section - you hacker you!)=Controlador (mitad superior)
+Controller (top section, car in motion - you hacker you!)=Controlador (mitad superior con cabina en movimiento)
+Controller (top section, open - you hacker you!)=Controlador (mitad superior con puerta abierta)
+Controller (top section, open, car in motion - you hacker you!)=Controlador (mitad superior con puerta abierta y cabina en movimiento)
+Door Open Timeout=Se acabó el tiempo para abrir las puertas
+Door Close Timeout=Se acabó el tiempo para cerrar las puertas
+Lost Communication With Drive=Comunicación perdida con el inversor
+Drive Not Configured=Inversor no inicializado
+Drive Metadata Load Failure=Error al leer la memoria del inversor
+Drive Origin Invalid=Error en posición de origen del inversor
+Attempted to Move Doors With Car in Motion=Intentó abrir las puertas con la cabina en movimiento
+Target Position Out of Bounds=Error en posición objetivo
+Hoist Machine Missing=La máquina no está presente
+Drive<->Machine ID Mismatch=Desajuste del número inversor <-> máquina
+Controller<->Drive ID Mismatch=Desajuste del número controlador <-> inversor
+Welcome to your new MTronic XT elevator controller!=¡Bienvenido a su nuevo controlador de ascensor MTronic XT!
+This setup wizard is designed to get your elevator up and running as quickly as possible.=Este asistente de configuración está diseñado para poner en funcionamiento su ascensor lo más rápido posible.
+This applies to the whole celevator mod, not just this controller:=Esto se aplica a todo el mod «celevator», no solo a este controlador:
+Select a group operation mode:=Seleccione un modo de operación en grupo:
+Simplex=Único ascensor
+This will be the only elevator in the group. Hall calls will be handled by this controller.=Este será el único ascensor del grupo.@nLas llamadas desde los pisos serán gestionadas por este controlador.
+Group=Grupo
+This elevator will participate in a group with others. Hall calls will be handled by a dispatcher.=Este ascensor participará en un grupo con otros ascensores.@nLas llamadas desde los pisos serán gestionadas por un despachador.
+Waiting for connection from dispatcher...=Esperando la conexión del despachador...
+This controller's car ID is: @1=El número de este ascensor es: @1
+Enter details of all floors this elevator will serve, then press Done.=Introduzca los detalles de todas las plantas a las que dará servicio este ascensor y, a continuación, haga clic en «Listo».
+CAR STATUS=ESTADO DE LA CABINA
+Fault History=Historial de averías
+Edit Parameters=Editar parámetros
+FAULT=AVERÍA
+INSP/ACCESS=INSP/ACCESO
+NORMAL OPERATION=FUNCIONAMIENTO NORMAL
+UP=SUBIENDO
+DRIVE CMD=COMANDO AL INVERSOR
+DOWN=BAJANDO
+HIGH SPEED=ALTA VELOCIDAD
+DOOR ZONE=ZONA DE PUERTA
+DOORS LOCKED=PUERTAS BLOQUEADAS
+RUN=MARCHA
+STOP=PARADA
+CAPTURE=CAPTURAR
+TEST=PRUEBA
+INSPECT=INSPECC.
+NORMAL=NORMAL
+UP =SUBIR
+DOWN =BAJAR
+EDIT PARAMETERS=EDITAR PARÁMETROS
+Door Dwell Timer=Temporizador de puerta
+Contract Speed (m/s)=Velocidad max. (m/s)
+Inspection Speed (m/s)=Velocidad insp. (m/s)
+Main Egress Landing=Planta principal
+Nudging Timer=Temporizador de empuje
+Alternate Recall Landing=Planta alterna
+Reset Doors=Restablecer puertas
+Reset Controller=Restablecer controlador
+Car Call Security=Seguridad de llamadas
+FAULT HISTORY=HISTORIAL DE AVERÍAS
+Clear=Borrar
+CAR CALL SECURITY=SEGURIDAD DE LLAMADAS
+Authorized Users Only=Solo usarios autorizados
+Locked=Bloqueado
+Security Disabled=Función de seguridad deshabilitada
+Allow Swing Calls When Not In Swing Operation=Permitir llamadas separadas aun cuando esté en modo grupo
+Unlock in Independent=Desbloqear en modo de servicio independiente
+Extra Allowed Users=Usuarios adicionales permitidos
+Main landing cannot be locked=La planta principal no se puede bloquear.
+ID @1: Floor @2 - @3 - @4=Número @1: Planta @2 - @3 - @4
+Call@nCancel=Cancelar
+HOLD=MANTENIDO
+FIRE SVC=INCENDIO
+IND SVC=INDEPENDIENTE
+CAR LIGHT=LUZ
+CAR FAN=VENTILADOR
+Please select a floor:=Por favor, seleccione una planta:
+Please use elevator=Por favor, use el ascensor
+ERROR=ERROR
+Could not find a suitable elevator=No se pudo encontrar un ascensor adecuado.
+Please try again later=Por favor, inténtelo de nuevo más tarde.
+Elevator Destination Entry Kiosk=Puesto de selección de destino del ascensor
+Elevator Elastomeric Buffer=Amortiguador de goma para ascensor
+Elevator Oil-Filled Buffer=Amortiguador lleno de aceite para ascensor
+Elevator Oil-Filled Buffer (top half - you hacker you!)=Amortiguador lleno de aceite para ascensor (mitad superior)
+Elevator Guide Rail=Carril guía de ascensor
+Elevator Guide Rail with Bracket=Carril guía con soporte de ascensor
+Elevator Positioning System Tape=Cinta del sistema de posicionamiento de ascensor
+Elevator Positioning System Tape with Magnets=Cinta con imanes del sistema de posicionamiento de ascensor
+Elevator Positioning System Tape with Bracket=Cinta con soporte del sistema de posicionamiento de ascensor
+Elevator Positioning System Tapehead (off, you hacker you!)=Lector de cinta del sistema de posicionamiento de ascensor (desactivado)
+Elevator Positioning System Tapehead (ULM on, you hacker you!)=Lector de cinta del sistema de posicionamiento de ascensor (señal ULM activado)
+Elevator Positioning System Tapehead (ULM and DZ on, you hacker you!)=Lector de cinta del sistema de posicionamiento de ascensor (señales ULM y DZ activado)
+Elevator Positioning System Tapehead (ULM, DLM, and DZ on, you hacker you!)=Lector de cinta del sistema de posicionamiento de ascensor (señales ULM, DLM, y DZ activado)
+Elevator Positioning System Tapehead (DLM and DZ on, you hacker you!)=Lector de cinta del sistema de posicionamiento de ascensor (señales DLM y DZ activado)
+Elevator Positioning System Tapehead (DLM on, you hacker you!)=Lector de cinta del sistema de posicionamiento de ascensor (señal DLM activado)
+Elevator Digilines Input/Output=Módulo de entrada/salida del ascensor para digilines
+Channel=Canal
+Elevator Digilines Multi-Car Input/Output=Módulo de entrada/salida de múltiples ascensores para digilines
+You need either the 'protection_bypass' or 'server' privilege to use this.=Necesitas el privilegio 'protection_bypass' o 'server' para poder usar esto.
+Elevator Dispatcher=Despachador de ascensor
+Dispatcher (door open - you hacker you!)=Despachador de ascensor (con puerta abierta)
+Dispatcher (top section - you hacker you!)=Despachador de ascensor (mitad superior)
+Dispatcher (top section, open - you hacker you!)=Despachador de ascensor (mitad superior con puerta abierta)
+Firmware reloaded successfully=El firmware se recargó correctamente
+Can't place cabinet - no room for the top half!=No se puede colocar el armario de control aquí - no hay espacio para la mitad superior!
+Can't place cabinet - top half is protected!=No se puede colocar el armario de control aquí - el espacio para la mitad superior está protegido!
+Hold the sneak button while digging to remove.=Mantén pulsado el botón de sigilo mientras cavas para eliminarlo.
+Can't open cabinet - cabinet is locked.=No se puede abrir el gabinete - la puerta está bloqueada
+Welcome to your new MTronic XT elevator dispatcher!=Bienvenido a su nuevo despachador de ascensores MTronic XT!
+Before continuing, make sure you have at least two controllers in group operation mode and ready to connect.=Antes de continuar, asegúrese de tener al menos dos controladores en modo de funcionamiento grupal y listos para conectarse.
+This applies to the whole celevator mod, not just this dispatcher:=Esto se aplica a todo el mod «celevator», no solo a este despachador:
+Enter details of all floors this group will serve, then press Next.=Introduzca los detalles de todas las plantas a las que dará servicio este grupo y, a continuación, haga clic en «Siguiente».
+Include all floors served by any car in the group, even if not served by all cars.=Incluya todas las plantas a las que pueda acceder cualquiera de los ascensores del grupo, incluso si no todas las plantas son accesibles por todos los ascensores.
+Connect to each car in the group, then click Done.=Conéctese a cada ascensor del grupo y luego haga clic en «Listo».
+EDIT CONNECTIONS=EDITAR CONEXIONES
+Car @1 - ID #@2=Ascensor @1 - Número @2
+Remove Connection=Eliminar conexión
+Enter the car ID and select the floors served (click them to toggle), then click Connect.=Ingrese la identificación del ascensor y seleccione las plantas servidas (haga clic en ellas para alternar), luego haga clic en «Conectar».
+You must select at least two floors.=Debe seleccionar al menos dos plantas.
+Connect=Conectar
+YES=SÍ
+NO=NO
+Car ID: @1=Número del ascensor: @1
+Connecting to controller...=Conectando al controlador...
+Connection timed out!=¡Se agotó el tiempo de conexión!
+Make sure the car ID is correct and@nthat the controller is ready to connect.=Asegúrese de que el número del ascensor esté correcto@ny que el controlador esté listo para conectar
+GROUP DISPLAY=ESTADO DEL GRUPO
+Menu=Menú
+MAIN MENU=MENÚ PRINCIPAL
+Edit Connections=Editar conexiones
+Press Next to begin.=Haz clic en «siguiente» para comenzar.
+License Info=Información de la licencia
+Next >=Siguiente >
+< Back=< Atrás
+Done=Listo
+EDIT FLOOR TABLE=EDICIÓN DE LA TABLA DE PLANTAS
+@1 - Height: @2 - PI: @3=@1 - Height: @2 - Nombre: @3
+New Floor=Planta nueva
+Edit Floor=Editar planta
+Remove Floor=Eliminar planta
+The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.=La altura de la planta es la distancia (en metros/nodos) desde el nivel del suelo de este planta hasta el nivel del suelo de la planta siguiente.
+(not used at the highest floor)=(No se utiliza en la planta más alta)
+The Floor Name is how the floor will be displayed on the position indicators.=El nombre de la planta es la forma en que se mostrará la planta en los indicadores de posición.
+Editing Floor @1=Editando la planta @1
+Floor Height=Altura de la planta
+Floor Name=Nombre de la planta
+Edit Floor Table=Tabla de plantas
+Back=Atrás
+No Connections=Nignún conexión
+New Connection=Conexión nueva
+Edit Connection=Editar conexión
+NEW CONNECTION=CONEXIÓN NUEVA
+EDIT CONNECTION=EDITAR CONEXIÓN
+ID: @1=Número: @1
+CAR @1=ASC. @1
+ IN= OK
+OUT= --
+OK=OK
+Move Up=Subir
+Move Down=Bajar
+Glass Hoistway Door (fast, bottom - you hacker you!)=Puerta de ascensor en vidrio (alta velocidad, parte inferior)
+Glass Hoistway Door (fast, middle - you hacker you!)=Puerta de ascensor en vidrio (alta velocidad, parte media)
+Glass Hoistway Door (fast, top - you hacker you!)=Puerta de ascensor en vidrio (alta velocidad, parte superior)
+Glass Hoistway Door (slow, bottom - you hacker you!)=Puerta de ascensor en vidrio (baja velocidad, parte inferior)
+Glass Hoistway Door (slow, middle - you hacker you!)=Puerta de ascensor en vidrio (baja velocidad, parte media)
+Glass Hoistway Door (slow, top - you hacker you!)=Puerta de ascensor en vidrio (baja velocidad, parte superior)
+Steel Hoistway Door (fast, bottom - you hacker you!)=Puerta de ascensor en acero (alta velocidad, parte inferior)
+Steel Hoistway Door (fast, middle - you hacker you!)=Puerta de ascensor en acero (alta velocidad, parte media)
+Steel Hoistway Door (fast, top - you hacker you!)=Puerta de ascensor en acero (alta velocidad, parte superior)
+Steel Hoistway Door (slow, bottom - you hacker you!)=Puerta de ascensor en acero (baja velocidad, parte inferior)
+Steel Hoistway Door (slow, middle - you hacker you!)=Puerta de ascensor en acero (baja velocidad, parte media)
+Steel Hoistway Door (slow, top - you hacker you!)=Puerta de ascensor en acero (baja velocidad, parte superior)
+Hoistway Door Open-State Placeholder (you hacker you!)=Marcador de posición para puertas de ascensor abiertas
+Glass Elevator Hoistway Door=Puerta de ascensor en vidrio
+Can't place door here - position @1m to the right and @2m up is blocked!=No se puede colocar la puerta aquí - hay una posición bloqueada @1 m a la derecha y @2 m hacia arriba
+Can't place door here - position @1m to the right and @2m up is protected!=No se puede colocar la puerta aquí - hay una posición protegida @1 m a la derecha y @2 m hacia arriba
+Steel Elevator Hoistway Door=Puerta de ascensor en acero
+Hoistway Door Sill, Single Track (you hacker you!)=Alféizar de puerta para ascensor (pista única)
+Hoistway Door Sill, Double Track (you hacker you!)=Alféizar de puerta para ascensor (pista doble)
+Elevator Drive=Inversor de frecuencia para ascensor
+Normal entity-based drive=Inversor de frecuencia normal basado en entidades
+Drive - Running: Up, @1m/s - Position: @2m=Inversor - Subiendo a @1 m/s - Posición: @2 m
+Drive - Running: Down, @1m/s - Position: @2m=Inversor - Bajando a @1 m/s - Posición: @2 m
+Drive - Running (simulated): Up, @1m/s - Position: @2m=Inversor - Subiendo (simulado) a @1 m/s - Posición: @2 m
+Drive - Running (simulated): Down, @1m/s - Position: @2m=Inversor - Bajando (simulado) a @1 m/s - Posición: @2 m
+Drive - Idle=Inversor - Inactivo
+Using car with origin @1=Usando la cabina con posición de origen @1
+No car found! Punch to try again=¡No se encontró ninguna cabina! Golpea para intentarlo de nuevo
+Elevator Hoist Machine=Máquina del ascensor
+Can't place machine here - no room for the motor (to the left)!=No se puede colocar la máquina aquí - ¡no hay espacio para el motor (a la izquierda)!
+Can't place machine here - space for the motor (to the left) is protected!=No se puede colocar la máquina aquí - ¡el espacio para el motor (a la izquierda) está protegida!
+Can't place machine here - no room for the sheave (in front)!=No se puede colocar la máquina aquí - ¡no hay espacio para la polea (al frente)!
+Can't place machine here - space for the sheave (in front) is protected!=No se puede colocar la máquina aquí - ¡el espacio para la polea (al frente) está protegida!
+Hoist Motor (you hacker you!)=Motor
+Sheave (you hacker you!)=Polea
+Centered Sheave (you hacker you!)=Polea centrada
+Null Drive=Inversor de frecuencia simulado
+Simulation only, no movement, for testing and demonstration=Sólo para simulación y prueba, sin movimiento
+Null Drive - Running: Up, @1m/s - Position: @2m=Inversor Simulado - Subiendo a @1 m/s - Posición: @2 m
+Null Drive - Running: Down, @1m/s - Position: @2m=Inversor Simulado - Bajando a @1 m/s - Posición: @2 m
+Null Drive - Idle=Inversor Simulado - Inactivo
+Elevator Fire Service Phase 1 Keyswitch=Interruptor de la fase 1 del modo de incendio del ascensor
+Elevator Fire Service Phase 1 Keyswitch (on state - you hacker you!)=Interruptor de la fase 1 del modo de incendio del ascensor (estado activado)
+Elevator Fire Service Phase 1 Keyswitch (reset state - you hacker you!)=Interruptor de la fase 1 del modo de incendio del ascensor (estado de reinicio)
+Elevator Fire Service Phase 1 Keyswitch (lit - you hacker you!)=Interruptor de la fase 1 del modo de incendio del ascensor (con luz activado)
+Elevator Fire Service Phase 1 Keyswitch (on state, lit - you hacker you!)=Interruptor de la fase 1 del modo de incendio del ascensor (estado activado y con luz activado)
+Elevator Fire Service Phase 1 Keyswitch (reset state, lit - you hacker you!)=Interruptor de la fase 1 del modo de incendio del ascensor (estado de reinicio y con luz activado)
+Can't connect to a controller/dispatcher you don't have access to.=No se puede conectar a un controlador/despachador al que no se tiene acceso.
+You don't have a key for this switch.=No tienes la llave para este interruptor.
+Elevator Keyswitch=Interruptor de llave del ascensor
+Elevator Keyswitch (maintained, off state - you hacker you!)=Interruptor de llave del ascensor (mantenido, en estado desactivado)
+Elevator Keyswitch (maintained, on state - you hacker you!)=Interruptor de llave del ascensor (mantenido, en estado activado)
+Elevator Keyswitch (momentary, off state - you hacker you!)=Interruptor de llave del ascensor (momentáneo, en estado desactivado)
+Elevator Keyswitch (momentary, on state - you hacker you!)=Interruptor de llave del ascensor (momentáneo, en estado activado)
+(none)=(ningún)
+ON=ENCENDIDO
+OFF=APAGADO
+Elevator Governor=Limitador de velocidad del ascensor
+Governor Sheave (you hacker you!)=Polea de limitador de velocidad
+Remote interface for MTronic XT elevator controllers=Interfaz remota para controladores de ascensores MTronic XT
+This application requires a hard disk drive.=Este aplicación necesita un disco duro.
+Welcome to the mView remote interface for MTronic XT elevator controllers!=¡Bienvenido a la interfaz remota mView para los controladores de ascensores MTronic XT!
+Add a connection to get started.=Añade una conexión para empezar.
+Add/Edit Connections=Añadir/editar conexiones
+MANAGE CONNECTIONS=GESTIONAR CONEXIONES
+ID @1 - @2=Número @1 - @2
+Delete Connection=Eliminar conexión
+Connect >=Conectar >
+Please enter the ID you would like to connect to and a name for the connection.=Por favor, introduzca el número al que desea conectarse y un nombre para la conexión.
+ID=Número
+Name=Nombre
+Error=Error
+Could not find a controller or dispatcher with the given ID.=No se pudo encontrar un controlador o despachador con el número proporcionado.
+Please check the ID number and try again.=Por favor, comprueba el número y inténtelo de nuevo.
+Controller or dispatcher is protected.=Controlador or despachador está protegido.
+Connected to @1 (ID @2)=Conectado a @1 (Número @2)
+Disconnect=Desconectar
+Uninitialized=No inicializado
+Position Sync - Floor=Sincronización de posición - planta
+Position Sync - Terminal=Sincronización de posición - terminal
+Machine Room Inspection=Modo de inspección (sala de máquinas)
+Car Top Inspection=Modo de inspección (techo de la cabina)
+Fire Service - Phase 1=Modo de incendio (fase 1)
+Fire Service - Phase 2=Modo de incendio (fase 2)
+Fire Service - Phase 2 Hold=Modo de incendio (fase 2, modo de retención)
+Captured=Capturado
+Test Mode=Modo de prueba
+Cancel=Cancelar
+CAR=CABINA
+Follow Car=Seguimiento de cabina
+Position: @1m Speed: @2m/s PI: @3=Posición: @1 m Velocidad: @2 m/s Planta: @3
+Fault(s) Active=Avería(s) activa(s)
+No Current Faults=Ninguna avería
+Inspection (Any)=Modo de inspección (cualquier)
+Fire Service=Modo de incendio
+Fire Service Phase 1=Modo de incendio - fase 1
+Fire Service Phase 2=Modo de incendio - fase 2
+Moving Up=Subiendo
+Moving Down=Bajando
+Moving (Any Direction)=Moviéndose en cualquier dirección
+Collecting Up Calls=Recopilando llamadas para subir
+Collecting Down Calls=Recopilando llamadas para bajar
+Car Light Switch=Interruptor de luz
+Car Fan Switch=Interruptor de ventilador
+Up Call Exists at Landing:=Existe una llamada de subida en la planta:
+Down Call Exists at Landing:=Existe una llamada de bajada en la planta:
+Car Call Exists at Landing:=Existe una llamada entre del ascensor en la planta:
+Car at Landing:=Está en la planta:
+Moving to Landing:=Está moviéndose a la planta:
+Elevator Mesecons Output=Salida mesecons para ascensor
+Elevator Mesecons Output (on state - you hacker you!)=Salida mesecons para ascensor (estado activado)
+Elevator Mesecons Input=Entrada mesecons para ascensor
+Elevator Mesecons Input (on state - you hacker you!)=Entrada mesecons para ascensor (estado activado)
+Car Call at Landing:=Llamada de cabina a la planta:
+Up Call (simplex car) at Landing:=Llamada para subir (único ascensor) de la planta:
+Down Call (simplex car) at Landing:=Llamada para bajar (único ascensor) de la planta:
+Up Call (swing) at Landing:=Llamada para subir (modo separado) de la planta:
+Down Call (swing) at Landing:=Llamada para bajar (modo separado) de la planta:
+Deactivate Fire Service Phase 1=Desactivar la fase 1 del modo de incendio
+Activate Fire Service (main landing) Phase 1=Activar (planta primaria) la fase 1 del modo de incendio
+Activate Fire Service (alternate landing) Phase 1=Activar (planta alternativa) la fase 1 del modo de incendio
+Machine Room or Hoistway Smoke Detector=Detector de humo en la sala de máquinas o en el hueco
+Lock Car Calls at Landing:=Bloquea las llamadas a la planta:
+Require Auth for Car Calls at Landing:=Requiere autenticación para las llamadas a la planta:
+Unlock Car Calls at Landing:=Desbloquea las llamadas a la planta:
+Activate Swing Operation=Activar modo separado
+Deactivate Swing Operation=Desactivar modo separado
+Up Call at Landing:=Llamada para subir de la planta:
+Down Call at Landing:=Llamada para bajar de la planta:
+Activate Fire Service Phase 1=Activar la fase 1 del modo de incendio
+Controller=Controlador
+Dispatcher=Despachador
+Not all signal options require a landing number.=No todas las opciones de señalización requieren@nun número de planta.
+Dispatcher: @1=Despachador: @1
+Car: @1=Ascensor: @1
+Dispatcher ID=Número del despachador
+Can't connect to a dispatcher you don't have access to.=No se puede conectar a un despachador al que no se tiene acceso.
+Can't connect to a controller you don't have access to.=No se puede conectar a un controlador al que no se tiene acceso.
+Normal Operation=Funcionamiento normal
+Fault=Avería
+Emergency Stop=Parada de emergencia
+Independent Service=Modo de servicio independiente
+Swing Operation=Modo separado
+Doors Opening=Puertas abriéndose
+Doors Open=Puertas abiertas
+Doors Closing=Puertas cerrándose
+Doors Closed=Puertas cerradas
+Elevator Position Indicator=Indicador de posición del ascensor
+Elevator Up Lantern=Luz indicadora de llegada del ascensor (subiendo)
+Elevator Up Lantern (vertical)=Luz vertical indicadora de llegada del ascensor (subiendo)
+Elevator Up Position Indicator / Lantern Combo=Luz indicadora de llegada del ascensor (subiendo) y indicador de su posición
+Elevator Down Lantern=Luz indicadora de llegada del ascensor (bajando)
+Elevator Down Lantern (vertical)=Luz vertical indicadora de llegada del ascensor (bajando)
+Elevator Down Position Indicator / Lantern Combo=Luz indicadora de llegada del ascensor (bajando) y indicador de su posición
+Elevator Up and Down Lantern=Luz indicadora de llegada del ascensor (subiendo y bajando)
+Elevator Up and Down Lantern (vertical)=Luz vertical indicadora de llegada del ascensor (subiendo y bajando)
+Elevator Up and Down Position Indicator / Lantern Combo=Luz indicadora de llegada del ascensor (subiendo y bajando) y indicador de su posición
+Car ID=Número del ascensor
+Save=Guardar
+Landing Number=Número de planta
diff --git a/locale/template.txt b/locale/template.txt
new file mode 100644
index 0000000..023ea26
--- /dev/null
+++ b/locale/template.txt
@@ -0,0 +1,359 @@
+# textdomain: celevator
+Elevator Up Call Button=
+Elevator Down Call Button=
+Elevator Up and Down Call Buttons=
+Elevator Call Button (on state - you hacker you!)=
+Error reading car information!@nPlease remove and replace this node.=
+Controller/dispatcher is missing!@nPlease remove and replace this node.=
+Controller/dispatcher found but with incorrect ID!@nPlease remove and replace this node.=
+Car (part @1 - you hacker you!)=
+You don't have access to these switches.=
+Really remove this car?=
+Yes=
+No=
+Car-top Inspection Box, Off State (you hacker you!)=
+Car-top Inspection Box, On State (you hacker you!)=
+Glass-Back Elevator Car=
+Metal Elevator Car=
+Metal Glass-Back Elevator Car=
+Basic Elevator Car=
+Can't place car here - position @1m to the right, @2m up, and @3m back is blocked!=
+Can't place car here - position @1m to the right, @2m up, and @3m back is protected!=
+Places a car call at the specified landing on the specified elevator=
+<car ID> <landing number>=
+Invalid car ID=
+Invalid landing number=
+No such car or car info is missing=
+Controller is missing=
+Controller found but with wrong ID=
+Controller is protected=
+Command sent=
+Places an up hall call at the specified landing on the specified elevator or dispatcher=
+Dispatcher is missing=
+Dispatcher found but with wrong ID=
+Dispatcher is protected=
+Places a down hall call at the specified landing on the specified elevator or dispatcher=
+View the status of the specified elevator=
+<car ID>=
+Failed to load controller memory=
+Reload celevator controller firmware from disk=
+Elevator Controller=
+Controller (door open - you hacker you!)=
+Controller (top section - you hacker you!)=
+Controller (top section, car in motion - you hacker you!)=
+Controller (top section, open - you hacker you!)=
+Controller (top section, open, car in motion - you hacker you!)=
+Door Open Timeout=
+Door Close Timeout=
+Lost Communication With Drive=
+Drive Not Configured=
+Drive Metadata Load Failure=
+Drive Origin Invalid=
+Attempted to Move Doors With Car in Motion=
+Target Position Out of Bounds=
+Hoist Machine Missing=
+Drive<->Machine ID Mismatch=
+Controller<->Drive ID Mismatch=
+Welcome to your new MTronic XT elevator controller!=
+This setup wizard is designed to get your elevator up and running as quickly as possible.=
+This applies to the whole celevator mod, not just this controller:=
+Select a group operation mode:=
+Simplex=
+This will be the only elevator in the group. Hall calls will be handled by this controller.=
+Group=
+This elevator will participate in a group with others. Hall calls will be handled by a dispatcher.=
+Waiting for connection from dispatcher...=
+This controller's car ID is: @1=
+Enter details of all floors this elevator will serve, then press Done.=
+CAR STATUS=
+Fault History=
+Edit Parameters=
+FAULT=
+INSP/ACCESS=
+NORMAL OPERATION=
+UP=
+DRIVE CMD=
+DOWN=
+HIGH SPEED=
+DOOR ZONE=
+DOORS LOCKED=
+RUN=
+STOP=
+CAPTURE=
+TEST=
+INSPECT=
+NORMAL=
+UP =
+DOWN =
+EDIT PARAMETERS=
+Door Dwell Timer=
+Contract Speed (m/s)=
+Inspection Speed (m/s)=
+Main Egress Landing=
+Nudging Timer=
+Alternate Recall Landing=
+Reset Doors=
+Reset Controller=
+Car Call Security=
+FAULT HISTORY=
+Clear=
+CAR CALL SECURITY=
+Authorized Users Only=
+Locked=
+Security Disabled=
+Allow Swing Calls When Not In Swing Operation=
+Unlock in Independent=
+Extra Allowed Users=
+Main landing cannot be locked=
+ID @1: Floor @2 - @3 - @4=
+Call@nCancel=
+HOLD=
+FIRE SVC=
+IND SVC=
+CAR LIGHT=
+CAR FAN=
+Please select a floor:=
+Please use elevator=
+ERROR=
+Could not find a suitable elevator=
+Please try again later=
+Elevator Destination Entry Kiosk=
+Elevator Elastomeric Buffer=
+Elevator Oil-Filled Buffer=
+Elevator Oil-Filled Buffer (top half - you hacker you!)=
+Elevator Guide Rail=
+Elevator Guide Rail with Bracket=
+Elevator Positioning System Tape=
+Elevator Positioning System Tape with Magnets=
+Elevator Positioning System Tape with Bracket=
+Elevator Positioning System Tapehead (off, you hacker you!)=
+Elevator Positioning System Tapehead (ULM on, you hacker you!)=
+Elevator Positioning System Tapehead (ULM and DZ on, you hacker you!)=
+Elevator Positioning System Tapehead (ULM, DLM, and DZ on, you hacker you!)=
+Elevator Positioning System Tapehead (DLM and DZ on, you hacker you!)=
+Elevator Positioning System Tapehead (DLM on, you hacker you!)=
+Elevator Digilines Input/Output=
+Channel=
+Elevator Digilines Multi-Car Input/Output=
+You need either the 'protection_bypass' or 'server' privilege to use this.=
+Elevator Dispatcher=
+Dispatcher (door open - you hacker you!)=
+Dispatcher (top section - you hacker you!)=
+Dispatcher (top section, open - you hacker you!)=
+Firmware reloaded successfully=
+Can't place cabinet - no room for the top half!=
+Can't place cabinet - top half is protected!=
+Hold the sneak button while digging to remove.=
+Can't open cabinet - cabinet is locked.=
+Welcome to your new MTronic XT elevator dispatcher!=
+Before continuing, make sure you have at least two controllers in group operation mode and ready to connect.=
+This applies to the whole celevator mod, not just this dispatcher:=
+Enter details of all floors this group will serve, then press Next.=
+Include all floors served by any car in the group, even if not served by all cars.=
+Connect to each car in the group, then click Done.=
+EDIT CONNECTIONS=
+Car @1 - ID #@2=
+Remove Connection=
+Enter the car ID and select the floors served (click them to toggle), then click Connect.=
+You must select at least two floors.=
+Connect=
+YES=
+NO=
+Car ID: @1=
+Connecting to controller...=
+Connection timed out!=
+Make sure the car ID is correct and@nthat the controller is ready to connect.=
+GROUP DISPLAY=
+Menu=
+MAIN MENU=
+Edit Connections=
+Press Next to begin.=
+License Info=
+Next >=
+< Back=
+Done=
+EDIT FLOOR TABLE=
+@1 - Height: @2 - PI: @3=
+New Floor=
+Edit Floor=
+Remove Floor=
+The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.=
+(not used at the highest floor)=
+The Floor Name is how the floor will be displayed on the position indicators.=
+Editing Floor @1=
+Floor Height=
+Floor Name=
+Edit Floor Table=
+Back=
+No Connections=
+New Connection=
+Edit Connection=
+NEW CONNECTION=
+EDIT CONNECTION=
+ID: @1=
+CAR @1=
+ IN=
+OUT=
+OK=
+Move Up=
+Move Down=
+Glass Hoistway Door (fast, bottom - you hacker you!)=
+Glass Hoistway Door (fast, middle - you hacker you!)=
+Glass Hoistway Door (fast, top - you hacker you!)=
+Glass Hoistway Door (slow, bottom - you hacker you!)=
+Glass Hoistway Door (slow, middle - you hacker you!)=
+Glass Hoistway Door (slow, top - you hacker you!)=
+Steel Hoistway Door (fast, bottom - you hacker you!)=
+Steel Hoistway Door (fast, middle - you hacker you!)=
+Steel Hoistway Door (fast, top - you hacker you!)=
+Steel Hoistway Door (slow, bottom - you hacker you!)=
+Steel Hoistway Door (slow, middle - you hacker you!)=
+Steel Hoistway Door (slow, top - you hacker you!)=
+Hoistway Door Open-State Placeholder (you hacker you!)=
+Glass Elevator Hoistway Door=
+Can't place door here - position @1m to the right and @2m up is blocked!=
+Can't place door here - position @1m to the right and @2m up is protected!=
+Steel Elevator Hoistway Door=
+Hoistway Door Sill, Single Track (you hacker you!)=
+Hoistway Door Sill, Double Track (you hacker you!)=
+Elevator Drive=
+Normal entity-based drive=
+Drive - Running: Up, @1m/s - Position: @2m=
+Drive - Running: Down, @1m/s - Position: @2m=
+Drive - Running (simulated): Up, @1m/s - Position: @2m=
+Drive - Running (simulated): Down, @1m/s - Position: @2m=
+Drive - Idle=
+Using car with origin @1=
+No car found! Punch to try again=
+Elevator Hoist Machine=
+Can't place machine here - no room for the motor (to the left)!=
+Can't place machine here - space for the motor (to the left) is protected!=
+Can't place machine here - no room for the sheave (in front)!=
+Can't place machine here - space for the sheave (in front) is protected!=
+Hoist Motor (you hacker you!)=
+Sheave (you hacker you!)=
+Centered Sheave (you hacker you!)=
+Null Drive=
+Simulation only, no movement, for testing and demonstration=
+Null Drive - Running: Up, @1m/s - Position: @2m=
+Null Drive - Running: Down, @1m/s - Position: @2m=
+Null Drive - Idle=
+Elevator Fire Service Phase 1 Keyswitch=
+Elevator Fire Service Phase 1 Keyswitch (on state - you hacker you!)=
+Elevator Fire Service Phase 1 Keyswitch (reset state - you hacker you!)=
+Elevator Fire Service Phase 1 Keyswitch (lit - you hacker you!)=
+Elevator Fire Service Phase 1 Keyswitch (on state, lit - you hacker you!)=
+Elevator Fire Service Phase 1 Keyswitch (reset state, lit - you hacker you!)=
+Can't connect to a controller/dispatcher you don't have access to.=
+You don't have a key for this switch.=
+Elevator Keyswitch=
+Elevator Keyswitch (maintained, off state - you hacker you!)=
+Elevator Keyswitch (maintained, on state - you hacker you!)=
+Elevator Keyswitch (momentary, off state - you hacker you!)=
+Elevator Keyswitch (momentary, on state - you hacker you!)=
+(none)=
+ON=
+OFF=
+Elevator Governor=
+Governor Sheave (you hacker you!)=
+Remote interface for MTronic XT elevator controllers=
+This application requires a hard disk drive.=
+Welcome to the mView remote interface for MTronic XT elevator controllers!=
+Add a connection to get started.=
+Add/Edit Connections=
+MANAGE CONNECTIONS=
+ID @1 - @2=
+Delete Connection=
+Connect >=
+Please enter the ID you would like to connect to and a name for the connection.=
+ID=
+Name=
+Error=
+Could not find a controller or dispatcher with the given ID.=
+Please check the ID number and try again.=
+Controller or dispatcher is protected.=
+Connected to @1 (ID @2)=
+Disconnect=
+Uninitialized=
+Position Sync - Floor=
+Position Sync - Terminal=
+Machine Room Inspection=
+Car Top Inspection=
+Fire Service - Phase 1=
+Fire Service - Phase 2=
+Fire Service - Phase 2 Hold=
+Captured=
+Test Mode=
+Cancel=
+CAR=
+Follow Car=
+Position: @1m Speed: @2m/s PI: @3=
+Fault(s) Active=
+No Current Faults=
+Inspection (Any)=
+Fire Service=
+Fire Service Phase 1=
+Fire Service Phase 2=
+Moving Up=
+Moving Down=
+Moving (Any Direction)=
+Collecting Up Calls=
+Collecting Down Calls=
+Car Light Switch=
+Car Fan Switch=
+Up Call Exists at Landing:=
+Down Call Exists at Landing:=
+Car Call Exists at Landing:=
+Car at Landing:=
+Moving to Landing:=
+Elevator Mesecons Output=
+Elevator Mesecons Output (on state - you hacker you!)=
+Elevator Mesecons Input=
+Elevator Mesecons Input (on state - you hacker you!)=
+Car Call at Landing:=
+Up Call (simplex car) at Landing:=
+Down Call (simplex car) at Landing:=
+Up Call (swing) at Landing:=
+Down Call (swing) at Landing:=
+Deactivate Fire Service Phase 1=
+Activate Fire Service (main landing) Phase 1=
+Activate Fire Service (alternate landing) Phase 1=
+Machine Room or Hoistway Smoke Detector=
+Lock Car Calls at Landing:=
+Require Auth for Car Calls at Landing:=
+Unlock Car Calls at Landing:=
+Activate Swing Operation=
+Deactivate Swing Operation=
+Up Call at Landing:=
+Down Call at Landing:=
+Activate Fire Service Phase 1=
+Controller=
+Dispatcher=
+Not all signal options require a landing number.=
+Dispatcher: @1=
+Car: @1=
+Dispatcher ID=
+Can't connect to a dispatcher you don't have access to.=
+Can't connect to a controller you don't have access to.=
+Normal Operation=
+Fault=
+Emergency Stop=
+Independent Service=
+Swing Operation=
+Doors Opening=
+Doors Open=
+Doors Closing=
+Doors Closed=
+Elevator Position Indicator=
+Elevator Up Lantern=
+Elevator Up Lantern (vertical)=
+Elevator Up Position Indicator / Lantern Combo=
+Elevator Down Lantern=
+Elevator Down Lantern (vertical)=
+Elevator Down Position Indicator / Lantern Combo=
+Elevator Up and Down Lantern=
+Elevator Up and Down Lantern (vertical)=
+Elevator Up and Down Position Indicator / Lantern Combo=
+Car ID=
+Save=
+Landing Number=
diff --git a/mesecons.lua b/mesecons.lua
index f505649..51917ed 100644
--- a/mesecons.lua
+++ b/mesecons.lua
@@ -1,3 +1,5 @@
+local S = core.get_translator("celevator")
+
local iorules = {
vector.new(-1,0,0),
vector.new(1,0,0),
@@ -20,7 +22,7 @@ end
local outputoptions = {
{
id = "normal",
- desc = "Normal Operation",
+ desc = S("Normal Operation"),
func = function(mem)
return (mem.carstate == "normal")
end,
@@ -28,7 +30,7 @@ local outputoptions = {
},
{
id = "fault",
- desc = "Fault",
+ desc = S("Fault"),
func = function(mem)
return (mem.carstate == "fault")
end,
@@ -36,7 +38,7 @@ local outputoptions = {
},
{
id = "estop",
- desc = "Emergency Stop",
+ desc = S("Emergency Stop"),
func = function(mem)
return (mem.carstate == "stop")
end,
@@ -44,7 +46,7 @@ local outputoptions = {
},
{
id = "inspect",
- desc = "Inspection (Any)",
+ desc = S("Inspection (Any)"),
func = function(mem)
return (mem.carstate == "mrinspect" or mem.carstate == "inspconflict" or mem.carstate == "carinspect")
end,
@@ -52,7 +54,7 @@ local outputoptions = {
},
{
id = "fire",
- desc = "Fire Service",
+ desc = S("Fire Service"),
func = function(mem)
return (mem.carstate == "fs1" or mem.carstate == "fs2" or mem.carstate == "fs2hold")
end,
@@ -60,7 +62,7 @@ local outputoptions = {
},
{
id = "fire1",
- desc = "Fire Service Phase 1",
+ desc = S("Fire Service Phase 1"),
func = function(mem)
return (mem.carstate == "fs1")
end,
@@ -68,7 +70,7 @@ local outputoptions = {
},
{
id = "fire2",
- desc = "Fire Service Phase 2",
+ desc = S("Fire Service Phase 2"),
func = function(mem)
return (mem.carstate == "fs2" or mem.carstate == "fs2hold")
end,
@@ -76,7 +78,7 @@ local outputoptions = {
},
{
id = "independent",
- desc = "Independent Service",
+ desc = S("Independent Service"),
func = function(mem)
return (mem.carstate == "indep")
end,
@@ -84,7 +86,7 @@ local outputoptions = {
},
{
id = "swing",
- desc = "Swing Operation",
+ desc = S("Swing Operation"),
func = function(mem)
return (mem.carstate == "swing")
end,
@@ -92,7 +94,7 @@ local outputoptions = {
},
{
id = "opening",
- desc = "Doors Opening",
+ desc = S("Doors Opening"),
func = function(mem)
return (mem.doorstate == "opening")
end,
@@ -100,7 +102,7 @@ local outputoptions = {
},
{
id = "open",
- desc = "Doors Open",
+ desc = S("Doors Open"),
func = function(mem)
return (mem.doorstate == "open")
end,
@@ -108,7 +110,7 @@ local outputoptions = {
},
{
id = "closing",
- desc = "Doors Closing",
+ desc = S("Doors Closing"),
func = function(mem)
return (mem.doorstate == "closing")
end,
@@ -116,7 +118,7 @@ local outputoptions = {
},
{
id = "closed",
- desc = "Doors Closed",
+ desc = S("Doors Closed"),
func = function(mem)
return (mem.doorstate == "closed")
end,
@@ -124,7 +126,7 @@ local outputoptions = {
},
{
id = "moveup",
- desc = "Moving Up",
+ desc = S("Moving Up"),
func = function(mem)
return (mem.drive.status and mem.drive.status.vel > 0)
end,
@@ -132,7 +134,7 @@ local outputoptions = {
},
{
id = "movedown",
- desc = "Moving Down",
+ desc = S("Moving Down"),
func = function(mem)
return (mem.drive.status and mem.drive.status.vel < 0)
end,
@@ -140,7 +142,7 @@ local outputoptions = {
},
{
id = "moving",
- desc = "Moving (Any Direction)",
+ desc = S("Moving (Any Direction)"),
func = function(mem)
return (mem.drive.status and mem.drive.status.vel ~= 0)
end,
@@ -148,7 +150,7 @@ local outputoptions = {
},
{
id = "collectorup",
- desc = "Collecting Up Calls",
+ desc = S("Collecting Up Calls"),
func = function(mem)
return (mem.carstate == "normal" and mem.direction == "up")
end,
@@ -156,7 +158,7 @@ local outputoptions = {
},
{
id = "collectordown",
- desc = "Collecting Down Calls",
+ desc = S("Collecting Down Calls"),
func = function(mem)
return (mem.carstate == "normal" and mem.direction == "down")
end,
@@ -164,7 +166,7 @@ local outputoptions = {
},
{
id = "lightsw",
- desc = "Car Light Switch",
+ desc = S("Car Light Switch"),
func = function(mem)
return mem.lightsw
end,
@@ -172,7 +174,7 @@ local outputoptions = {
},
{
id = "fansw",
- desc = "Car Fan Switch",
+ desc = S("Car Fan Switch"),
func = function(mem)
return mem.fansw
end,
@@ -180,7 +182,7 @@ local outputoptions = {
},
{
id = "upcall",
- desc = "Up Call Exists at Landing:",
+ desc = S("Up Call Exists at Landing:"),
func = function(mem,floor)
return mem.upcalls[floor]
end,
@@ -188,7 +190,7 @@ local outputoptions = {
},
{
id = "downcall",
- desc = "Down Call Exists at Landing:",
+ desc = S("Down Call Exists at Landing:"),
func = function(mem,floor)
return mem.dncalls[floor]
end,
@@ -196,7 +198,7 @@ local outputoptions = {
},
{
id = "carcall",
- desc = "Car Call Exists at Landing:",
+ desc = S("Car Call Exists at Landing:"),
func = function(mem,floor)
return mem.carcalls[floor]
end,
@@ -204,7 +206,7 @@ local outputoptions = {
},
{
id = "apos",
- desc = "Car at Landing:",
+ desc = S("Car at Landing:"),
func = function(mem,floor)
if mem.drive.status then
return (getpos(mem,nil,true) == floor)
@@ -214,7 +216,7 @@ local outputoptions = {
},
{
id = "dpos",
- desc = "Moving to Landing:",
+ desc = S("Moving to Landing:"),
func = function(mem,floor)
if mem.drive.status then
return (getpos(mem,mem.drive.status.dpos) == floor)
@@ -227,7 +229,7 @@ local outputoptions = {
local doutputoptions = {
{
id = "fire",
- desc = "Fire Service",
+ desc = S("Fire Service"),
func = function(mem)
return mem.fs1led
end,
@@ -235,7 +237,7 @@ local doutputoptions = {
},
{
id = "upcall",
- desc = "Up Call Exists at Landing:",
+ desc = S("Up Call Exists at Landing:"),
func = function(mem,floor)
return mem.upcalls[floor]
end,
@@ -243,7 +245,7 @@ local doutputoptions = {
},
{
id = "downcall",
- desc = "Down Call Exists at Landing:",
+ desc = S("Down Call Exists at Landing:"),
func = function(mem,floor)
return mem.dncalls[floor]
end,
@@ -254,7 +256,7 @@ local doutputoptions = {
local inputoptions = {
{
id = "carcall",
- desc = "Car Call at Landing:",
+ desc = S("Car Call at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -266,7 +268,7 @@ local inputoptions = {
},
{
id = "upcall",
- desc = "Up Call (simplex car) at Landing:",
+ desc = S("Up Call (simplex car) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -278,7 +280,7 @@ local inputoptions = {
},
{
id = "downcall",
- desc = "Down Call (simplex car) at Landing:",
+ desc = S("Down Call (simplex car) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -290,7 +292,7 @@ local inputoptions = {
},
{
id = "swingupcall",
- desc = "Up Call (swing) at Landing:",
+ desc = S("Up Call (swing) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -302,7 +304,7 @@ local inputoptions = {
},
{
id = "swingdowncall",
- desc = "Down Call (swing) at Landing:",
+ desc = S("Down Call (swing) at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -314,7 +316,7 @@ local inputoptions = {
},
{
id = "fs1off",
- desc = "Deactivate Fire Service Phase 1",
+ desc = S("Deactivate Fire Service Phase 1"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "fs1switch",
@@ -325,7 +327,7 @@ local inputoptions = {
},
{
id = "fs1on",
- desc = "Activate Fire Service (main landing) Phase 1",
+ desc = S("Activate Fire Service (main landing) Phase 1"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "fs1switch",
@@ -336,7 +338,7 @@ local inputoptions = {
},
{
id = "fs1onalt",
- desc = "Activate Fire Service (alternate landing) Phase 1",
+ desc = S("Activate Fire Service (alternate landing) Phase 1"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "fs1switch",
@@ -348,7 +350,7 @@ local inputoptions = {
},
{
id = "mrsmoke",
- desc = "Machine Room or Hoistway Smoke Detector",
+ desc = S("Machine Room or Hoistway Smoke Detector"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "mrsmoke",
@@ -358,7 +360,7 @@ local inputoptions = {
},
{
id = "secdeny",
- desc = "Lock Car Calls at Landing:",
+ desc = S("Lock Car Calls at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -373,7 +375,7 @@ local inputoptions = {
},
{
id = "secauth",
- desc = "Require Auth for Car Calls at Landing:",
+ desc = S("Require Auth for Car Calls at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -388,7 +390,7 @@ local inputoptions = {
},
{
id = "secallow",
- desc = "Unlock Car Calls at Landing:",
+ desc = S("Unlock Car Calls at Landing:"),
func_on = function(controllerpos,floor)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -403,7 +405,7 @@ local inputoptions = {
},
{
id = "swingon",
- desc = "Activate Swing Operation",
+ desc = S("Activate Swing Operation"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -415,7 +417,7 @@ local inputoptions = {
},
{
id = "swingoff",
- desc = "Deactivate Swing Operation",
+ desc = S("Deactivate Swing Operation"),
func_on = function(controllerpos)
celevator.controller.run(controllerpos,{
type = "remotemsg",
@@ -430,7 +432,7 @@ local inputoptions = {
local dinputoptions = {
{
id = "upcall",
- desc = "Up Call at Landing:",
+ desc = S("Up Call at Landing:"),
func_on = function(dispatcherpos,floor)
celevator.dispatcher.run(dispatcherpos,{
type = "remotemsg",
@@ -442,7 +444,7 @@ local dinputoptions = {
},
{
id = "downcall",
- desc = "Down Call at Landing:",
+ desc = S("Down Call at Landing:"),
func_on = function(dispatcherpos,floor)
celevator.dispatcher.run(dispatcherpos,{
type = "remotemsg",
@@ -454,7 +456,7 @@ local dinputoptions = {
},
{
id = "fs1off",
- desc = "Deactivate Fire Service Phase 1",
+ desc = S("Deactivate Fire Service Phase 1"),
func_on = function(dispatcherpos)
celevator.dispatcher.run(dispatcherpos,{
type = "fs1switch",
@@ -465,7 +467,7 @@ local dinputoptions = {
},
{
id = "fs1on",
- desc = "Activate Fire Service Phase 1",
+ desc = S("Activate Fire Service Phase 1"),
func_on = function(dispatcherpos)
celevator.dispatcher.run(dispatcherpos,{
type = "fs1switch",
@@ -477,33 +479,33 @@ local dinputoptions = {
}
local function updateoutputform(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local dmode = meta:get_int("dispatcher") == 1
- local fs = "formspec_version[7]size[8,6.5]"
- fs = fs.."tabheader[0,0;1;tab;Controller,Dispatcher;"..(dmode and "2" or "1")..";true;true]"
- fs = fs.."dropdown[1,0.5;6,1;signal;"
+ local fs = "formspec_version[7]size[9,6.5]"
+ fs = fs.."tabheader[0,0;1;tab;"..S("Controller")..","..S("Dispatcher")..";"..(dmode and "2" or "1")..";true;true]"
+ fs = fs.."dropdown[1,0.5;7,1;signal;"
local selected = 1
local currentid = meta:get_string("signal")
for k,v in ipairs(dmode and doutputoptions or outputoptions) do
- fs = fs..minetest.formspec_escape(v.desc)..","
+ fs = fs..core.formspec_escape(v.desc)..","
if v.id == currentid then selected = k end
end
fs = string.sub(fs,1,-2)
fs = fs..";"..selected..";false]"
- fs = fs.."field[0.5,2.5;3,1;carid;"..(dmode and "Dispatcher ID" or "Car ID")..";${carid}]"
- fs = fs.."field[4.5,2.5;3,1;floor;Landing Number;${floor}]"
- fs = fs.."label[1.5,4;Not all signal options require a landing number.]"
- fs = fs.."button_exit[2.5,5;3,1;save;Save]"
+ fs = fs.."field[0.5,2.5;3,1;carid;"..(dmode and S("Dispatcher ID") or S("Car ID"))..";${carid}]"
+ fs = fs.."field[4.5,2.5;3,1;floor;"..S("Landing Number")..";${floor}]"
+ fs = fs.."label[1.5,4;"..S("Not all signal options require a landing number.").."]"
+ fs = fs.."button_exit[2.5,5;3,1;save;"..S("Save").."]"
meta:set_string("formspec",fs)
end
local function handleoutputfields(pos,_,fields,player)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
if fields.quit and not fields.save then return end
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.record_protection_violation(pos,name)
+ core.record_protection_violation(pos,name)
end
return
end
@@ -512,24 +514,24 @@ local function handleoutputfields(pos,_,fields,player)
if not tonumber(fields.carid) then return end
meta:set_int("carid",fields.carid)
local carid = tonumber(fields.carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if dmode then
if not carinfo.dispatcherpos then return end
if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then return end
- if minetest.is_protected(carinfo.dispatcherpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.dispatcherpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a dispatcher you don't have access to.")
- minetest.record_protection_violation(carinfo.dispatcherpos,name)
+ core.chat_send_player(name,S("Can't connect to a dispatcher you don't have access to."))
+ core.record_protection_violation(carinfo.dispatcherpos,name)
end
return
end
else
if not carinfo.controllerpos then return end
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
- if minetest.is_protected(carinfo.controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.controllerpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a controller you don't have access to.")
- minetest.record_protection_violation(carinfo.controllerpos,name)
+ core.chat_send_player(name,S("Can't connect to a controller you don't have access to."))
+ core.record_protection_violation(carinfo.controllerpos,name)
end
return
end
@@ -546,11 +548,11 @@ local function handleoutputfields(pos,_,fields,player)
if def.needsfloor and not floor then return end
meta:set_string("signal",def.id)
updateoutputform(pos)
- local infotext = carid.." - "..def.desc..(def.needsfloor and " "..floor or "")
+ local infotext = " - "..def.desc..(def.needsfloor and " "..floor or "")
if dmode then
- infotext = "Dispatcher: "..infotext
+ infotext = S("Dispatcher: @1",carid)..infotext
else
- infotext = "Car: "..infotext
+ infotext = S("Car: @1",carid)..infotext
end
meta:set_string("infotext",infotext)
elseif fields.tab then
@@ -559,8 +561,8 @@ local function handleoutputfields(pos,_,fields,player)
end
end
-minetest.register_node("celevator:mesecons_output_off",{
- description = "Elevator Mesecons Output",
+core.register_node("celevator:mesecons_output_off",{
+ description = S("Elevator Mesecons Output"),
tiles = {
"celevator_meseconsoutput_top_off.png",
"celevator_cabinet_sides.png",
@@ -584,15 +586,15 @@ minetest.register_node("celevator:mesecons_output_off",{
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_int("floor",1)
updateoutputform(pos)
end,
on_receive_fields = handleoutputfields,
})
-minetest.register_node("celevator:mesecons_output_on",{
- description = "Elevator Mesecons Output (on state - you hacker you!)",
+core.register_node("celevator:mesecons_output_on",{
+ description = S("Elevator Mesecons Output (on state - you hacker you!)"),
tiles = {
"celevator_meseconsoutput_top_on.png",
"celevator_cabinet_sides.png",
@@ -618,25 +620,25 @@ minetest.register_node("celevator:mesecons_output_on",{
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_int("floor",1)
updateoutputform(pos)
end,
on_receive_fields = handleoutputfields,
})
-minetest.register_abm({
+core.register_abm({
label = "Update mesecons output",
nodenames = {"celevator:mesecons_output_off","celevator:mesecons_output_on",},
interval = 1,
chance = 1,
action = function(pos,node)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local dmode = meta:get_int("dispatcher") == 1
local oldstate = (node.name == "celevator:mesecons_output_on")
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if dmode then
if not carinfo.dispatcherpos then return end
if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then return end
@@ -645,7 +647,7 @@ minetest.register_abm({
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
end
local floor = meta:get_int("floor")
- local mem = minetest.deserialize(minetest.get_meta(dmode and carinfo.dispatcherpos or carinfo.controllerpos):get_string("mem")) or {}
+ local mem = core.deserialize(core.get_meta(dmode and carinfo.dispatcherpos or carinfo.controllerpos):get_string("mem")) or {}
local signal = meta:get_string("signal")
local def
for _,v in ipairs(dmode and doutputoptions or outputoptions) do
@@ -658,7 +660,7 @@ minetest.register_abm({
local newstate = def.func(mem,floor)
if newstate ~= oldstate then
node.name = (newstate and "celevator:mesecons_output_on" or "celevator:mesecons_output_off")
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
if newstate then
mesecon.receptor_on(pos,iorules)
else
@@ -669,33 +671,33 @@ minetest.register_abm({
})
local function updateinputform(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local dmode = meta:get_int("dispatcher") == 1
- local fs = "formspec_version[7]size[8,6.5]"
- fs = fs.."tabheader[0,0;1;tab;Controller,Dispatcher;"..(dmode and "2" or "1")..";true;true]"
- fs = fs.."dropdown[1,0.5;6,1;signal;"
+ local fs = "formspec_version[7]size[9,6.5]"
+ fs = fs.."tabheader[0,0;1;tab;"..S("Controller")..","..S("Dispatcher")..";"..(dmode and "2" or "1")..";true;true]"
+ fs = fs.."dropdown[1,0.5;7,1;signal;"
local selected = 1
local currentid = meta:get_string("signal")
for k,v in ipairs(dmode and dinputoptions or inputoptions) do
- fs = fs..minetest.formspec_escape(v.desc)..","
+ fs = fs..core.formspec_escape(v.desc)..","
if v.id == currentid then selected = k end
end
fs = string.sub(fs,1,-2)
fs = fs..";"..selected..";false]"
- fs = fs.."field[0.5,2.5;3,1;carid;"..(dmode and "Dispatcher ID" or "Car ID")..";${carid}]"
- fs = fs.."field[4.5,2.5;3,1;floor;Landing Number;${floor}]"
- fs = fs.."label[1.5,4;Not all signal options require a landing number.]"
- fs = fs.."button_exit[2.5,5;3,1;save;Save]"
+ fs = fs.."field[0.5,2.5;3,1;carid;"..(dmode and S("Dispatcher ID") or S("Car ID"))..";${carid}]"
+ fs = fs.."field[4.5,2.5;3,1;floor;"..S("Landing Number")..";${floor}]"
+ fs = fs.."label[1.5,4;"..S("Not all signal options require a landing number.").."]"
+ fs = fs.."button_exit[2.5,5;3,1;save;"..S("Save").."]"
meta:set_string("formspec",fs)
end
local function handleinputfields(pos,_,fields,player)
if fields.quit and not fields.save then return end
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local name = player:get_player_name()
- if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.record_protection_violation(pos,name)
+ core.record_protection_violation(pos,name)
end
return
end
@@ -704,24 +706,24 @@ local function handleinputfields(pos,_,fields,player)
if not tonumber(fields.carid) then return end
meta:set_int("carid",fields.carid)
local carid = tonumber(fields.carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if dmode then
if not carinfo.dispatcherpos then return end
if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then return end
- if minetest.is_protected(carinfo.dispatcherpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.dispatcherpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a dispatcher you don't have access to.")
- minetest.record_protection_violation(carinfo.dispatcherpos,name)
+ core.chat_send_player(name,S("Can't connect to a dispatcher you don't have access to."))
+ core.record_protection_violation(carinfo.dispatcherpos,name)
end
return
end
else
if not carinfo.controllerpos then return end
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
- if minetest.is_protected(carinfo.controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if core.is_protected(carinfo.controllerpos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
- minetest.chat_send_player(name,"Can't connect to a controller you don't have access to.")
- minetest.record_protection_violation(carinfo.controllerpos,name)
+ core.chat_send_player(name,S("Can't connect to a controller you don't have access to."))
+ core.record_protection_violation(carinfo.controllerpos,name)
end
return
end
@@ -738,11 +740,11 @@ local function handleinputfields(pos,_,fields,player)
if def.needsfloor and not floor then return end
meta:set_string("signal",def.id)
updateinputform(pos)
- local infotext = carid.." - "..def.desc..(def.needsfloor and " "..floor or "")
+ local infotext = " - "..def.desc..(def.needsfloor and " "..floor or "")
if dmode then
- infotext = "Dispatcher: "..infotext
+ infotext = S("Dispatcher: @1",carid)..infotext
else
- infotext = "Car: "..infotext
+ infotext = S("Car: @1",carid)..infotext
end
meta:set_string("infotext",infotext)
elseif fields.tab then
@@ -752,10 +754,10 @@ local function handleinputfields(pos,_,fields,player)
end
local function handleinput(pos,on)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
local dmode = meta:get_int("dispatcher") == 1
if dmode then
if not carinfo.dispatcherpos then return end
@@ -789,8 +791,8 @@ local function handleinput(pos,on)
end
end
-minetest.register_node("celevator:mesecons_input_off",{
- description = "Elevator Mesecons Input",
+core.register_node("celevator:mesecons_input_off",{
+ description = S("Elevator Mesecons Input"),
tiles = {
"celevator_meseconsinput_top_off.png",
"celevator_cabinet_sides.png",
@@ -812,21 +814,21 @@ minetest.register_node("celevator:mesecons_input_off",{
rules = iorules,
action_on = function(pos,node)
node.name = "celevator:mesecons_input_on"
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
handleinput(pos,true)
end,
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_int("floor",1)
updateinputform(pos)
end,
on_receive_fields = handleinputfields,
})
-minetest.register_node("celevator:mesecons_input_on",{
- description = "Elevator Mesecons Input (on state - you hacker you!)",
+core.register_node("celevator:mesecons_input_on",{
+ description = S("Elevator Mesecons Input (on state - you hacker you!)"),
tiles = {
"celevator_meseconsinput_top_on.png",
"celevator_cabinet_sides.png",
@@ -850,13 +852,13 @@ minetest.register_node("celevator:mesecons_input_on",{
rules = iorules,
action_off = function(pos,node)
node.name = "celevator:mesecons_input_off"
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
handleinput(pos,false)
end,
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_int("floor",1)
updateinputform(pos)
end,
diff --git a/pilantern.lua b/pilantern.lua
index 29f3cf7..c778fed 100644
--- a/pilantern.lua
+++ b/pilantern.lua
@@ -1,6 +1,8 @@
celevator.pi = {}
celevator.lantern = {}
+local S = core.get_translator("celevator")
+
local boringside = "[combine:64x64"..
":0,0=celevator_cabinet_sides.png"..
":32,0=celevator_cabinet_sides.png"..
@@ -8,31 +10,33 @@ local boringside = "[combine:64x64"..
":32,32=celevator_cabinet_sides.png"
local displaytex = boringside..":16,40=celevator_pi_background.png"
-minetest.register_entity("celevator:pi_entity",{
+core.register_entity("celevator:pi_entity",{
initial_properties = {
visual = "upright_sprite",
physical = false,
collisionbox = {0,0,0,0,0,0,},
textures = {"celevator_transparent.png",},
static_save = false,
- glow = minetest.LIGHT_MAX,
+ glow = core.LIGHT_MAX,
},
})
-minetest.register_entity("celevator:incar_pi_entity",{
+core.register_entity("celevator:incar_pi_entity",{
initial_properties = {
visual = "upright_sprite",
physical = false,
collisionbox = {0,0,0,0,0,0,},
textures = {"celevator_transparent.png",},
static_save = false,
- glow = minetest.LIGHT_MAX,
+ glow = core.LIGHT_MAX,
},
on_step = function(self)
+ if not self.object then return end
local pos = self.object:get_pos()
+ if not core.compare_block_status(pos,"active") then return self.object:remove() end
local props = self.object:get_properties()
if props.breath_max and props.breath_max ~= 0 then
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",props.breath_max)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",props.breath_max)))
if not carinfo then return end
local text = carinfo.pitext or "--"
if string.len(text) < 3 then text = string.rep(" ",3-string.len(text))..text end
@@ -48,7 +52,7 @@ minetest.register_entity("celevator:incar_pi_entity",{
self.object:set_properties({textures = {etex}})
else
local carpos = vector.round(pos)
- local carmeta = minetest.get_meta(carpos)
+ local carmeta = core.get_meta(carpos)
local carid = carmeta:get_int("carid")
if carid > 0 then self.object:set_properties({breath_max=carid}) end
end
@@ -56,7 +60,7 @@ minetest.register_entity("celevator:incar_pi_entity",{
})
function celevator.pi.removeentity(pos)
- local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5)
+ local entitiesnearby = core.get_objects_inside_radius(pos,0.5)
for _,i in pairs(entitiesnearby) do
if i:get_luaentity() and (i:get_luaentity().name == "celevator:pi_entity" or i:get_luaentity().name == "celevator:incar_pi_entity") then
i:remove()
@@ -80,16 +84,16 @@ end
function celevator.pi.updatedisplay(pos)
celevator.pi.removeentity(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local text = meta:get_string("text")
- local entity = minetest.add_entity(pos,"celevator:pi_entity")
- local fdir = minetest.facedir_to_dir(celevator.get_node(pos).param2)
+ local entity = core.add_entity(pos,"celevator:pi_entity")
+ local fdir = core.facedir_to_dir(celevator.get_node(pos).param2)
local uparrow = meta:get_int("uparrow") > 0
local downarrow = meta:get_int("downarrow") > 0
local flash_fs = meta:get_int("flash_fs") > 0
local flash_is = meta:get_int("flash_is") > 0
local flashtimer = meta:get_int("flashtimer") > 0
- local islantern = minetest.get_item_group(celevator.get_node(pos).name,"_celevator_lantern") == 1
+ local islantern = core.get_item_group(celevator.get_node(pos).name,"_celevator_lantern") == 1
local etex = celevator.pi.generatetexture(text,uparrow,downarrow,islantern)
if flash_fs then
if flashtimer then etex = celevator.pi.generatetexture(" FS",uparrow,downarrow,islantern) end
@@ -106,8 +110,8 @@ function celevator.pi.updatedisplay(pos)
end
function celevator.pi.flash(pos,what)
- if minetest.get_item_group(celevator.get_node(pos).name,"_celevator_pi") ~= 1 then return end
- local meta = minetest.get_meta(pos)
+ if core.get_item_group(celevator.get_node(pos).name,"_celevator_pi") ~= 1 then return end
+ local meta = core.get_meta(pos)
if what == "FS" then
meta:set_int("flash_is",0)
meta:set_int("flash_fs",1)
@@ -123,8 +127,8 @@ end
function celevator.pi.settext(pos,text)
if not text then text = " --" end
- if minetest.get_item_group(celevator.get_node(pos).name,"_celevator_pi") ~= 1 then return end
- local meta = minetest.get_meta(pos)
+ if core.get_item_group(celevator.get_node(pos).name,"_celevator_pi") ~= 1 then return end
+ local meta = core.get_meta(pos)
if string.len(text) < 3 then
text = string.rep(" ",3-string.len(text))..text
end
@@ -133,8 +137,8 @@ function celevator.pi.settext(pos,text)
end
function celevator.pi.setarrow(pos,which,active)
- if minetest.get_item_group(celevator.get_node(pos).name,"_celevator_pi") ~= 1 then return end
- local meta = minetest.get_meta(pos)
+ if core.get_item_group(celevator.get_node(pos).name,"_celevator_pi") ~= 1 then return end
+ local meta = core.get_meta(pos)
if which == "up" then
meta:set_int("uparrow",active and 1 or 0)
elseif which == "down" then
@@ -143,8 +147,8 @@ function celevator.pi.setarrow(pos,which,active)
celevator.pi.updatedisplay(pos)
end
-minetest.register_node("celevator:pi",{
- description = "Elevator Position Indicator",
+core.register_node("celevator:pi",{
+ description = S("Elevator Position Indicator"),
groups = {
dig_immediate = 2,
_celevator_pi = 1,
@@ -169,17 +173,17 @@ minetest.register_node("celevator:pi",{
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]button[3,3.5;2,1;save;Save]")
+ local meta = core.get_meta(pos)
+ meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;"..S("Car ID")..";]button[3,3.5;2,1;save;"..S("Save").."]")
end,
on_receive_fields = function(pos,_,fields)
if tonumber(fields.carid) then
local carid = tonumber(fields.carid)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.pis) then return end
table.insert(carinfo.pis,{pos=pos})
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
- local meta = minetest.get_meta(pos)
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
+ local meta = core.get_meta(pos)
meta:set_int("carid",carid)
meta:set_string("formspec","")
celevator.pi.settext(pos,carinfo.pitext)
@@ -187,20 +191,20 @@ minetest.register_node("celevator:pi",{
end,
on_destruct = function(pos)
celevator.pi.removeentity(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.pis) then return end
for i,pi in pairs(carinfo.pis) do
if vector.equals(pos,pi.pos) then
table.remove(carinfo.pis,i)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end,
on_construct = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("text","--")
celevator.pi.updatedisplay(pos)
end,
@@ -208,49 +212,49 @@ minetest.register_node("celevator:pi",{
function celevator.lantern.setlight(pos,dir,newstate)
local node = celevator.get_node(pos)
- if minetest.get_item_group(node.name,"_celevator_lantern") ~= 1 then return end
+ if core.get_item_group(node.name,"_celevator_lantern") ~= 1 then return end
if dir == "up" then
- if minetest.get_item_group(node.name,"_celevator_lantern_has_up") ~= 1 then return end
- local lit = minetest.get_item_group(node.name,"_celevator_lantern_up_lit") == 1
+ if core.get_item_group(node.name,"_celevator_lantern_has_up") ~= 1 then return end
+ local lit = core.get_item_group(node.name,"_celevator_lantern_up_lit") == 1
if lit == newstate then return end
local newname = "celevator:lantern_"
- if minetest.get_item_group(node.name,"_celevator_pi") == 1 then newname = "celevator:pilantern_" end
- if minetest.get_item_group(node.name,"_celevator_lantern_vertical") == 1 then newname = "celevator:lantern_vertical_" end
- if minetest.get_item_group(node.name,"_celevator_lantern_has_down") == 1 then
+ if core.get_item_group(node.name,"_celevator_pi") == 1 then newname = "celevator:pilantern_" end
+ if core.get_item_group(node.name,"_celevator_lantern_vertical") == 1 then newname = "celevator:lantern_vertical_" end
+ if core.get_item_group(node.name,"_celevator_lantern_has_down") == 1 then
newname = newname.."both"
else
newname = newname.."up"
end
if newstate then
newname = newname.."_upon"
- minetest.sound_play("celevator_chime_up",{pos = pos},true)
+ core.sound_play("celevator_chime_up",{pos = pos},true)
end
- if minetest.get_item_group(node.name,"_celevator_lantern_down_lit") == 1 then
+ if core.get_item_group(node.name,"_celevator_lantern_down_lit") == 1 then
newname = newname.."_downon"
end
node.name = newname
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
elseif dir == "down" then
- if minetest.get_item_group(node.name,"_celevator_lantern_has_down") ~= 1 then return end
- local lit = minetest.get_item_group(node.name,"_celevator_lantern_down_lit") == 1
+ if core.get_item_group(node.name,"_celevator_lantern_has_down") ~= 1 then return end
+ local lit = core.get_item_group(node.name,"_celevator_lantern_down_lit") == 1
if lit == newstate then return end
local newname = "celevator:lantern_"
- if minetest.get_item_group(node.name,"_celevator_pi") == 1 then newname = "celevator:pilantern_" end
- if minetest.get_item_group(node.name,"_celevator_lantern_vertical") == 1 then newname = "celevator:lantern_vertical_" end
- if minetest.get_item_group(node.name,"_celevator_lantern_has_up") == 1 then
+ if core.get_item_group(node.name,"_celevator_pi") == 1 then newname = "celevator:pilantern_" end
+ if core.get_item_group(node.name,"_celevator_lantern_vertical") == 1 then newname = "celevator:lantern_vertical_" end
+ if core.get_item_group(node.name,"_celevator_lantern_has_up") == 1 then
newname = newname.."both"
else
newname = newname.."down"
end
- if minetest.get_item_group(node.name,"_celevator_lantern_up_lit") == 1 then
+ if core.get_item_group(node.name,"_celevator_lantern_up_lit") == 1 then
newname = newname.."_upon"
end
if newstate then
newname = newname.."_downon"
- minetest.sound_play("celevator_chime_down",{pos = pos},true)
+ core.sound_play("celevator_chime_down",{pos = pos},true)
end
node.name = newname
- minetest.swap_node(pos,node)
+ core.swap_node(pos,node)
end
end
@@ -326,15 +330,25 @@ local function makeverticallanterntex(dir,upon,downon)
return(tex)
end
+local upname = S("Elevator Up Lantern")
+local upvname = S("Elevator Up Lantern (vertical)")
+local upcname = S("Elevator Up Position Indicator / Lantern Combo")
+local downname = S("Elevator Down Lantern")
+local downvname = S("Elevator Down Lantern (vertical)")
+local downcname = S("Elevator Down Position Indicator / Lantern Combo")
+local bothname = S("Elevator Up and Down Lantern")
+local bothvname = S("Elevator Up and Down Lantern (vertical)")
+local bothcname = S("Elevator Up and Down Position Indicator / Lantern Combo")
+
local validstates = {
- {"up",false,false,"Up"},
- {"up",true,false,"Up"},
- {"down",false,false,"Down"},
- {"down",false,true,"Down"},
- {"both",false,false,"Up and Down"},
- {"both",true,false,"Up and Down"},
- {"both",false,true,"Up and Down"},
- {"both",true,true,"Up and Down"},
+ {"up",false,false,upname,upvname,upcname},
+ {"up",true,false,upname,upvname,upcname},
+ {"down",false,false,downname,downvname,downcname},
+ {"down",false,true,downname,downvname,downcname},
+ {"both",false,false,bothname,bothvname,bothcname},
+ {"both",true,false,bothname,bothvname,bothcname},
+ {"both",false,true,bothname,bothvname,bothcname},
+ {"both",true,true,bothname,bothvname,bothcname},
}
for _,state in ipairs(validstates) do
@@ -350,8 +364,8 @@ for _,state in ipairs(validstates) do
light = light + 4
end
local idle = not (state[2] or state[3])
- local description = string.format("Elevator %s Position Indicator/Lantern Combo%s",state[4],(idle and "" or " (on state, you hacker you!)"))
- minetest.register_node(nname,{
+ local description = state[6]
+ core.register_node(nname,{
description = description,
groups = {
dig_immediate = 2,
@@ -384,19 +398,23 @@ for _,state in ipairs(validstates) do
},
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]field[0.5,2;7,1;landing;Landing Number;]button[3,3.5;2,1;save;Save]")
+ local meta = core.get_meta(pos)
+ local fs = "formspec_version[7]size[8,5]"
+ fs = fs.."field[0.5,0.5;7,1;carid;"..S("Car ID")..";]"
+ fs = fs.."field[0.5,2;7,1;landing;"..S("Landing Number")..";]"
+ fs = fs.."button[3,3.5;2,1;save;"..S("Save").."]"
+ meta:set_string("formspec",fs)
end,
on_receive_fields = function(pos,_,fields)
if tonumber(fields.carid) and tonumber(fields.landing) then
local carid = tonumber(fields.carid)
local landing = tonumber(fields.landing)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.pis and carinfo.lanterns) then return end
table.insert(carinfo.pis,{pos=pos})
table.insert(carinfo.lanterns,{pos=pos,landing=landing})
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
- local meta = minetest.get_meta(pos)
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
+ local meta = core.get_meta(pos)
meta:set_int("carid",carid)
meta:set_string("formspec","")
celevator.pi.settext(pos,carinfo.pitext)
@@ -404,26 +422,26 @@ for _,state in ipairs(validstates) do
end,
on_destruct = function(pos)
celevator.pi.removeentity(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.pis and carinfo.lanterns) then return end
for i,pi in pairs(carinfo.pis) do
if vector.equals(pos,pi.pos) then
table.remove(carinfo.pis,i)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
for i,lantern in pairs(carinfo.lanterns) do
if vector.equals(pos,lantern.pos) then
table.remove(carinfo.lanterns,i)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end,
on_construct = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
meta:set_string("text","--")
celevator.pi.updatedisplay(pos)
end,
@@ -433,8 +451,8 @@ for _,state in ipairs(validstates) do
if state[2] then nname = nname.."_upon" end
if state[3] then nname = nname.."_downon" end
idle = not (state[2] or state[3])
- description = string.format("Elevator %s Lantern%s",state[4],(idle and "" or " (on state, you hacker you!)"))
- minetest.register_node(nname,{
+ description = state[4]
+ core.register_node(nname,{
description = description,
inventory_image = string.format("[combine:32x32:0,5=celevator_lantern_background_%s.png",(state[1] == "both" and "updown" or state[1])),
groups = {
@@ -456,32 +474,36 @@ for _,state in ipairs(validstates) do
makelanterntex(state[1],state[2],state[3])
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]field[0.5,2;7,1;landing;Landing Number;]button[3,3.5;2,1;save;Save]")
+ local meta = core.get_meta(pos)
+ local fs = "formspec_version[7]size[8,5]"
+ fs = fs.."field[0.5,0.5;7,1;carid;"..S("Car ID")..";]"
+ fs = fs.."field[0.5,2;7,1;landing;"..S("Landing Number")..";]"
+ fs = fs.."button[3,3.5;2,1;save;"..S("Save").."]"
+ meta:set_string("formspec",fs)
end,
on_receive_fields = function(pos,_,fields)
if tonumber(fields.carid) and tonumber(fields.landing) then
local carid = tonumber(fields.carid)
local landing = tonumber(fields.landing)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.lanterns) then return end
table.insert(carinfo.lanterns,{pos=pos,landing=landing})
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
- local meta = minetest.get_meta(pos)
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
+ local meta = core.get_meta(pos)
meta:set_int("carid",carid)
meta:set_string("formspec","")
end
end,
on_destruct = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.lanterns) then return end
for i,lantern in pairs(carinfo.lanterns) do
if vector.equals(pos,lantern.pos) then
table.remove(carinfo.lanterns,i)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end,
@@ -500,8 +522,8 @@ for _,state in ipairs(validstates) do
dropname = nname
if state[2] then nname = nname.."_upon" end
if state[3] then nname = nname.."_downon" end
- description = string.format("Elevator %s Lantern (vertical)%s",state[4],(idle and "" or " (on state, you hacker you!)"))
- minetest.register_node(nname,{
+ description = state[5]
+ core.register_node(nname,{
description = description,
inventory_image = string.format("[combine:40x40:10,0=celevator_lantern_vertical_background_%s.png",(state[1] == "both" and "updown" or state[1])),
groups = {
@@ -524,32 +546,36 @@ for _,state in ipairs(validstates) do
makeverticallanterntex(state[1],state[2],state[3])
},
after_place_node = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]field[0.5,2;7,1;landing;Landing Number;]button[3,3.5;2,1;save;Save]")
+ local meta = core.get_meta(pos)
+ local fs = "formspec_version[7]size[8,5]"
+ fs = fs.."field[0.5,0.5;7,1;carid;"..S("Car ID")..";]"
+ fs = fs.."field[0.5,2;7,1;landing;"..S("Landing Number")..";]"
+ fs = fs.."button[3,3.5;2,1;save;"..S("Save").."]"
+ meta:set_string("formspec",fs)
end,
on_receive_fields = function(pos,_,fields)
if tonumber(fields.carid) and tonumber(fields.landing) then
local carid = tonumber(fields.carid)
local landing = tonumber(fields.landing)
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.lanterns) then return end
table.insert(carinfo.lanterns,{pos=pos,landing=landing})
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
- local meta = minetest.get_meta(pos)
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
+ local meta = core.get_meta(pos)
meta:set_int("carid",carid)
meta:set_string("formspec","")
end
end,
on_destruct = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if carid == 0 then return end
- local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
+ local carinfo = core.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
if not (carinfo and carinfo.lanterns) then return end
for i,lantern in pairs(carinfo.lanterns) do
if vector.equals(pos,lantern.pos) then
table.remove(carinfo.lanterns,i)
- celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo))
+ celevator.storage:set_string(string.format("car%d",carid),core.serialize(carinfo))
end
end
end,
@@ -566,29 +592,29 @@ for _,state in ipairs(validstates) do
})
end
-minetest.register_abm({
+core.register_abm({
label = "Respawn / Flash PI displays",
nodenames = {"group:_celevator_pi"},
interval = 1,
chance = 1,
action = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local flashtimer = meta:get_int("flashtimer") > 0
meta:set_int("flashtimer",flashtimer and 0 or 1)
celevator.pi.updatedisplay(pos)
end,
})
-minetest.register_abm({
+core.register_abm({
label = "Check PIs/lanterns for missing/replaced controllers",
nodenames = {"group:_celevator_pi","group:_celevator_lantern"},
interval = 15,
chance = 1,
action = function(pos)
- local meta = minetest.get_meta(pos)
+ local meta = core.get_meta(pos)
local carid = meta:get_int("carid")
if not (carid and carid > 0) then return end --Not set up yet
- local carinfo = minetest.deserialize(celevator.storage:get_string("car"..carid))
+ local carinfo = core.deserialize(celevator.storage:get_string("car"..carid))
if not carinfo then
celevator.pi.settext(pos," --")
meta:set_string("infotext","Error reading car information!\nPlease remove and replace this node.")
diff --git a/screenshot.png b/screenshot.png
new file mode 100644
index 0000000..907df06
--- /dev/null
+++ b/screenshot.png
Binary files differ
diff --git a/textures/celevator_car_metal_glassback_inventory.png b/textures/celevator_car_metal_glassback_inventory.png
new file mode 100644
index 0000000..5c7cc22
--- /dev/null
+++ b/textures/celevator_car_metal_glassback_inventory.png
Binary files differ
diff --git a/textures/celevator_car_metal_glassback_wield.png b/textures/celevator_car_metal_glassback_wield.png
new file mode 100644
index 0000000..a072b41
--- /dev/null
+++ b/textures/celevator_car_metal_glassback_wield.png
Binary files differ
diff --git a/textures/celevator_door_glass_inventory.png b/textures/celevator_door_glass_inventory.png
index 4ebf6f9..2538465 100644
--- a/textures/celevator_door_glass_inventory.png
+++ b/textures/celevator_door_glass_inventory.png
Binary files differ
diff --git a/textures/celevator_menu_small_arrow.png b/textures/celevator_menu_small_arrow.png
new file mode 100644
index 0000000..5ab4761
--- /dev/null
+++ b/textures/celevator_menu_small_arrow.png
Binary files differ