From d4d38e4b0c00a7c4ce2dc2a45a85ba2f5da7e699 Mon Sep 17 00:00:00 2001 From: jimy-byerley Date: Sat, 28 Jun 2014 15:35:38 +0200 Subject: [PATCH] modified: init.lua modified: os.lua modified: textures/laptop_front_connect.png deleted: textures/keyboard_top.png deleted: textures/laptop_front_bigtext.png deleted: textures/laptop_front_blank.png deleted: textures/laptop_front_screensaver.png deleted: textures/laptop_front_smalltext.png deleted: textures/screen_flat_back.png deleted: textures/screen_flat_bottom.png deleted: textures/screen_flat_front_2columns.png deleted: textures/screen_flat_front_bigtext.png deleted: textures/screen_flat_front_cybertronic.png deleted: textures/screen_flat_front_cybertronic.xcf deleted: textures/screen_flat_front_map.png deleted: textures/screen_flat_front_off.png deleted: textures/screen_flat_front_smalltext.png deleted: textures/screen_flat_left.png deleted: textures/screen_flat_right.png deleted: textures/screen_flat_top.png deleted: textures/steel_armature_h_side.png --- init.lua | 116 +++++----------- os.lua | 217 +++++++++++++++++++++++++++--- textures/laptop_front_connect.png | Bin 12466 -> 23090 bytes 3 files changed, 236 insertions(+), 97 deletions(-) diff --git a/init.lua b/init.lua index ca0be43..11d2e33 100644 --- a/init.lua +++ b/init.lua @@ -1,12 +1,15 @@ -- This code is distributed under GN GPL v2 license. Copyright© Jimy-Byerley -local welcome_message = "/* welcome to cybertronic OS v2.0 */" -local default_laptop = "computers:laptop_open" +local opened_laptop = "computers:laptop_open" +local closed_laptop = "computers:laptop_close" +local connected_laptop = "computers:laptop_connect" + +local welcome_message = "/* welcome to cybertronic OS v2.2 */" +local default_laptop = opened_laptop computers = {} local computer_action = function(pos, formname, fields, sender) - local node = minetest.env:get_node(pos) --use shell computers.execute_oscommand(fields.text, pos, sender) end @@ -15,8 +18,14 @@ computers.registered_command_names = {} computers.registered_commands = {} computers.register_oscommand = function(name, short_description, long_description, exe) - computers.registered_command_names[#computers.registered_command_names+1] = name - computers.registered_commands[name] = {short_description=short_description, long_description=long_description, exe=exe} + if computers.registered_commands[name] == nil then + computers.registered_command_names[#computers.registered_command_names+1] = name + end + computers.registered_commands[name] = { + short_description=short_description, + long_description=long_description, + exe=exe + } end computers.execute_oscommand = function(cmdline, pos, player) @@ -58,7 +67,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'computers:laptop_close', + output = default_laptop, recipe = { {'technology:flat_screen_off', "technology:wire"}, {'technology:electronic_card', "technology:wire"}, @@ -91,10 +100,7 @@ minetest.register_node("computers:laptop_open", { light_source = 4, paramtype2 = "facedir", drawtype = "nodebox", - node_box = {type = "fixed", fixed = { - --{-0.45, -0.40, 0.30, 0.45, 0.30, 0.25}, - --{-0.45, -0.5, -0.45, 0.45, -0.425, 0.25}, - + node_box = {type = "fixed", fixed = { -- top part {-0.3, -0.45, 0.05, 0.3, 0.05, 0.1}, -- bottom part @@ -173,12 +179,24 @@ minetest.register_node("computers:laptop_connect", { light_source = 6, paramtype2 = "facedir", drawtype = "nodebox", - node_box = {type = "fixed", fixed = { - {-0.45, -0.40, 0.30, 0.45, 0.30, 0.25}, - {-0.45, -0.5, -0.45, 0.45, -0.425, 0.25}, + node_box = {type = "fixed", fixed = { + -- top part + {-0.3, -0.45, 0.05, 0.3, 0.05, 0.1}, + -- bottom part + {-0.3, -0.5, -0.45, 0.3, -0.45, 0.075}, }}, - selection_box = {type = "fixed", fixed = {-0.45, -0.40, 0.30, 0.45, 0.30, 0.25}}, - tiles = {"laptop_top.png", "laptop_bottom.png", "laptop_left.png", "laptop_right.png", "laptop_back.png", "laptop_front_connect.png"}, + selection_box = {type = "fixed", fixed = { + -- top part + {-0.3, -0.45, 0.05, 0.3, 0.05, 0.1}, + -- bottom part + {-0.3, -0.5, -0.45, 0.3, -0.45, 0.075}, + }}, + tiles = {"laptop_top.png", "laptop_bottom.png", "laptop_left.png", "laptop_right.png", "laptop_back.png", { + image="laptop_front_connect.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=128, aspect_h=128, length=4.5} + } + }, walkable = true, groups = {choppy=2, dig_immediate=2, not_in_creative_inventory=1}, drop = default_laptop, @@ -187,70 +205,8 @@ minetest.register_node("computers:laptop_connect", { node.name = "computers:laptop_close" minetest.env:set_node(pos, node) end, - on_receive_fields = function(pos, formname, fields, sender) - --get remote coordinates - local meta = minetest.env:get_meta(pos) - local remote_pos = {} - remote_pos.x, remote_pos.y, remote_pos.z = string.match(meta:get_string("destination"), "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") - - local self = minetest.env:get_node(pos) - local node = minetest.env:get_node(remote_pos) - - if fields.text == "disconnect" then - --change local - if math.random(1,2) == 1 then - self.name = "computers:laptop_smalltext" - else - self.name = "computers:laptop_bigtext" - end - minetest.env:set_node(pos, self) - --set local metadata - meta:set_string("formspec", "field[text;;${text}]") - meta:set_string("infotext", "") - - --change remote text - if math.random(1,2) == 1 then - node.name = "computers:laptop_smalltext" - else - node.name = "computers:laptop_bigtext" - end - minetest.env:set_node(remote_pos, node) - --set remote metadata - local meta = minetest.env:get_meta(remote_pos) - meta:set_string("formspec", "field[text;;${text}]") - meta:set_string("infotext", "") - else - - --verify host activity - if node.name ~= "computers:laptop_connect" then - minetest.chat_send_player(sender:get_player_name(), "[connection failed]") - --change text - if math.random(1,2) == 1 then - self.name = "computers:laptop_smalltext" - else - self.name = "computers:laptop_bigtext" - end - minetest.env:set_node(pos, self) - --set metadata - meta:set_string("formspec", "field[text;;${text}]") - meta:set_string("infotext", "") - end - - if remote_pos.x and remote_pos.y and remote_pos.z then - print(sender:get_player_name().." send packet to "..remote_pos.x..","..remote_pos.y..","..remote_pos.z) - --transfer message - local recievers = minetest.env:get_objects_inside_radius(remote_pos, 3) - local i=1 - while recievers[i] ~= nil do - local name = recievers[i]:get_player_name() - minetest.chat_send_player(name, "["..fields.text.."]") - i = i+1 - end - else - minetest.chat_send_player(sender:get_player_name(), "[bad address]") - end - end - end, + + on_receive_fields = computers.oscommand_com_main }) -minetest.register_alias("computers:laptop", "computers:laptop_close") +minetest.register_alias("computers:laptop", "computers:laptop_open") diff --git a/os.lua b/os.lua index 31b83b0..638912d 100644 --- a/os.lua +++ b/os.lua @@ -1,4 +1,14 @@ -computers.register_oscommand("help", "get help about a function", "help [COMMAND]", function(cmdline, pos, player) +-- This code is distributed under GN GPL v2 license. Copyright© Jimy-Byerley + +local opened_laptop = "computers:laptop_open" +local closed_laptop = "computers:laptop_close" +local connected_laptop = "computers:laptop_connect" + +local welcome_message = "/* welcome to cybertronic OS v2.2 */" +local default_laptop = opened_laptop + +computers.register_oscommand("help", "get help about a function", "help [COMMAND]", +function(cmdline, pos, player) local command = string.match(cmdline, "help *(.+)") local message = "" @@ -14,7 +24,7 @@ computers.register_oscommand("help", "get help about a function", "help [COMMAND message = command..":\t"..computers.registered_commands[command].short_description .. "\nusage:\n" .. computers.registered_commands[command].long_description end if message == "" then - message = "no help for this command" + message = "help: no help for command: "..command end return message, true @@ -26,30 +36,203 @@ computers.register_oscommand("time", "get the time of day", "time", function(cmd end) -computers.register_oscommand("gps", "localize a player", "gps [-c PLAYER get coordinates]\n [-d PLAYER get distance between computer and player]\n [-r PLAYER get relative coordinates]", +computers.register_oscommand("gps", "localize a player", "gps [-l get local coordinates] [-c PLAYER get coordinates]\n [-d PLAYER get distance between computer and player]\n [-r PLAYER get relative coordinates]", function(cmdline, pos, player) - local message = "gps: error: unable to connect to satellite (in devel program)" + local command, opt =string.match(cmdline, "^([^ ]+) *([^ ]+)") + local message = "" + + if opt == nil then + return "gps: usage error: see usage in help", true + end + + if opt == "-l" then + message = "* * * local coordinates * * *\nlatitude "..pos.x.." \nlongitude "..pos.z.." m\naltitude "..pos.y.." m" + elseif opt == '-c' then + local playername + command, opt, playername = string.match(cmdline, "^([^ ]+) *([^ ]+) *([^ ]+)") + local player = minetest.get_player_by_name(playername) + -- positioning error if player not found + if player == nil then + message = "gps: positioning error: unable to find player \""..playername.."\"" + return message, true + end + -- output message + local p = player:getpos() + message = "* * * local coordinates * * *\nlatitude "..p.x.." \nlongitude "..p.z.." m\naltitude "..p.y.." m" + elseif opt == "-r" then + local playername + command, opt, playername = string.match(cmdline, "^([^ ]+) *([^ ]+) *([^ ]+)") + local player = minetest.get_player_by_name(playername) + -- positioning error if player not found + if player == nil then + message = "gps: positioning error: unable to find player \""..playername.."\"" + return message, true + end + -- output message + local p = player:getpos() + message = "* * * local coordinates * * *\nlatitude "..p.x-pos.x.." \nlongitude "..p.z-pos.z.." m\naltitude "..p.y-pos.y.." m" + elseif opt == "-d" then + local playername + command, opt, playername = string.match(cmdline, "^([^ ]+) *([^ ]+) *([^ ]+)") + local player = minetest.get_player_by_name(playername) + -- positioning error if player not found + if player == nil then + message = "gps: positioning error: unable to find player \""..playername.."\"" + return message, true + end + -- output message + local p = player:getpos() + message = "* * * distance to player * * *\ndistance to "..playername.." is "..math.sqrt( + math.pow(p.x-pos.x,2) + math.pow(p.y-pos.y,2) + math.pow(p.z-pos.z,2) + ) + end + return message, true end) computers.register_oscommand("mat", "get the material name of a bloc next to the computer", "mat [z+1] [z-1] [y+1] [y-1] [x+1] [x-1]", function(cmdline, pos, player) local message = "mat: error: incompatible driver (in devel program)" + return message, false +end) + +computers.register_oscommand("com", "create a connexion between two computers", "com [-c COODINATES make a connexion between this computer and an other at coordinates]\n [-p PLAYERNAME make a connexion between this computer and the closest computer to the player]\nWhen connected, type EOL to disconnect", +function(cmdline, pos, player) + local command, opt = string.match(cmdline, "^([^ ]+) *([^ ]+)") + local node, remote_pos + local self = minetest.get_node(pos) + + if opt == "-c" then + remote_pos = {} + command, opt, remote_pos.x, remote_pos.y, remote_pos.z = string.match(cmdline, "^([^ ]+) *([^ ]+) *(%d+)[, ] *(%d+)[, ] *(%d+)") + + --node = minetest.get_node(remote_pos) + + elseif opt == "-p" then + local command, opt, playername = string.match(cmdline, "^([^ ]+) *([^ ]+) *([^ ]+)") + local player = minetest.get_player_by_name(playername) + if player == nil then + return "com: network error: unable to find player  \""..playername.."\"", true + end + local p = player:getpos() + + local zone = 3 + + if self.name ~= opened_laptop then + return "com: connection error: incompatible client", true + end + + for X = p.x-zone, p.x+zone do + for Y = p.y-zone, p.y+zone do + for Z = p.z-zone, p.z+zone do + node = minetest.get_node({x=X,y=Y,z=Z}) + if node.name == opened_laptop or node.name == closed_laptop then + remote_pos = {x=X, y=Y, z=Z} + break + end + end + end + end + else + return "com: usage error: see $ help com", false + end + + node = minetest.get_node(remote_pos) + print(remote_pos.x..","..remote_pos.y..","..remote_pos.z) + print(node.name) + if (node.name == opened_laptop or node.name == closed_laptop) and self.name == opened_laptop then + -- set remote machine + node.name = connected_laptop + minetest.add_node(remote_pos, node) + -- and remote meta + local rmeta = minetest.get_meta(remote_pos) + rmeta:set_string("destination", pos.x..", "..pos.y..", "..pos.z) + rmeta:set_string("formspec", "field[text;;${text}]") + rmeta:set_string("infotext", "INCOMING CONNECTION * * *") + + -- set local machine + self.name = connected_laptop + minetest.add_node(pos, self) + -- and local meta + local lmeta = minetest.get_meta(pos) + lmeta:set_string("destination", remote_pos.x..", "..remote_pos.y..", "..remote_pos.z) + lmeta:set_string("formspec", "field[text;;${text}]") + message = "CONNECTION ETABLISHED * * *" + + print("[computers]: connection etablished between ("..pos.x..","..pos.y..","..pos.z..") and ("..remote_pos.x..","..remote_pos.y..","..remote_pos.z..")") + else + return "com: connection error: unable to create a tunnel", false + end + return message, true end) -computers.register_oscommand("com", "create a connexion between two computers", "com [-c COODINATES make a connexion between this computer and an other at coordinates]\n [-p PLAYERNAME make a connexion between this computer and the closest computer to the player]", function(cmdline, pos, player) - local command, opt = string.match(cmdline, "^([^ ]+) *(%a+)") - if opt == "-c" then - local x, y, z - command, opt,x,y,z = string.match(cmdline, "^([^ ]+) *(%a+) *(%d+)[, ] *(%d+)[, ] *(%d+)") - -- ... - return command..": unable to connect: no network available (in devel program)" +-- funtion called when a "computers:laptop_connect" receive a field +computers.oscommand_com_main = function(pos, formname, fields, sender) + --get remote coordinates + local meta = minetest.env:get_meta(pos) + local remote_pos = {} + remote_pos.x, remote_pos.y, remote_pos.z = string.match(meta:get_string("destination"), "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") + + local self = minetest.env:get_node(pos) + local node = minetest.env:get_node(remote_pos) + + if fields.text == nil then + return + elseif fields.text == "EOL" then + print("[computers]: "..sender:get_player_name().." break connection from host at ("..pos.x..","..pos.y..","..pos.z..") with host at ("..remote_pos.x..","..remote_pos.y..","..remote_pos.z..")") + + + self.name = opened_laptop + minetest.add_node(pos, self) + + --set local metadata + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "END OF LINE\n* * * connection closed by local host\n\n"..welcome_message) + + + node.name = opened_laptop + minetest.add_node(remote_pos, node) + + --set remote metadata + meta = minetest.env:get_meta(remote_pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "END OF LINE\n* * * connection closed by remote host\n\n"..welcome_message) else - local command, opt, playername = string.match(cmdline, "^([^ ]+) *(%a+) *(%a+)") - local player = minetest.get_player_by_name(playername) - local p = player.getpos() - -- ... - return command..": unable to connect: no network available (in devel program)" + + --verify host activity + if node.name ~= "computers:laptop_connect" then + minetest.chat_send_player(sender:get_player_name(), "[connection failed]") + --set metadata + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "") + end + + if remote_pos.x and remote_pos.y and remote_pos.z then + print(sender:get_player_name().." send packet to "..remote_pos.x..","..remote_pos.y..","..remote_pos.z) + --transfer message + local recievers = minetest.env:get_objects_inside_radius(remote_pos, 3) + local i=1 + while recievers[i] ~= nil do + local name = recievers[i]:get_player_name() + minetest.chat_send_player(name, " "..fields.text.." ") + i = i+1 + end + else + minetest.chat_send_player(sender:get_player_name(), "[bad address]") + end end -end); +end + + +computers.register_oscommand("restart", "reload all laptops system's", "restart", +function (cmdline, pos, player) + print("[computers]: "..player:get_player_name().." has initialized a global computers system restarting. Minetest will redo file os.lua") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "** SYSTEM : "..player:get_player_name().." has initialized a global restart") + + dofile(minetest.get_modpath("computers").."/os.lua") + + print("[computers]: all computers restarted") + return welcome_message, true +end) \ No newline at end of file diff --git a/textures/laptop_front_connect.png b/textures/laptop_front_connect.png index 90d0bca93b923fbd20511b89a43b200af0bd98fe..99d0ccd47b2a920af13f4238b4b52aa9ecc502f6 100755 GIT binary patch literal 23090 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 YA`q8{Glh}|bbJs=ak(c&V$Xg5FDc`zhyVZp literal 12466 zcmeHNTTGNk6#iG(1@{8W#VsJzZK1`eiD-?Qpb;qs2!?saSMZ6m?Z_0rgvsnf#rdU6y}-mfhsv!0eeb z=YD3+nIY`_y0+3`&9f?s;;62wsK<9%@Hce|#?NfMJMm>|sIM$nn%eWdm`q()^-Y7K z*s_AZCgt~CIf~*|sw!Ak6L7vme$*ztTU-eeQio7zU@<>{F7Gk}WCzKAi(3aDa4|RMi6L z?zoE4U9y0X7$0@rW^gDlW9}D43rperrK1Po>im`U7OTx{Nx5)fm(7`(Vz;MdyI%D9 zT<*eK7hAA;et#o`Jn88U6%{3hf01!p2qAhYhqa=f}v$98~BA;nx^u=OpeQv-to*w9!a2kx|;12IRb zyWLFS*bXq#_yjlyj7B!uX%c5ZeGDR4h$E4amyeo*pN!mmOp8m)Ko4N%(sBT(s&l@q z7D^y4;nKK}f<7>>rVe!)3R-smTC}K?3Qp~Yt*JJ<_ugG~wZSS?bf}!UWVx@~^ZHpo zVBnQ^@6>jHolQyX(+BqngKp5geKTN4My*3}Llms(PQ_$`>h@F3kaq1$$@* zBkvqWe%gMrNrMo913lL}t{gi|jj8j`6A&s4k~V$eOw=3^-T@o{t22Xca-@u`$0Y~H z3wsF!*Uy{|XGiSuyaPDCU6)&NhL|b1mH~eDs28JY^uv|_G(P@cwNWo|@b}Y997dNZ z?|}OBs1;Bi=yt8fPddyyFkXWuD6Y|)A@0P{^Mlg$NfEl{wlB{g`~pbVfGgwv`cUdjP9`Pt=_ zcpTzJgo_ZaF1Qq6J0T%x+w*JcPH=$6sfERu z(nxKQJvhUdb< zuG3OwG}NDkUhhgpan=O?7a(+XqA@xV5LcT zjziVUV+0PMVAJ0;S*1s5hbAiI^sZI^trM?XGy!{NcJ{|^Trs+?w9%6q^x&d5-Ks4+ z+79pkeDP9LSbcpH9B8~*5y&L7CE08l9tr>^m7#ChP>edFSjCh|XKwMV$NzK<2LfsW zZ7_GB1rBJF8#6A>frLNAh66F%I$;zU83+@Yn4uFs1AG~cS>*Iml<*la9MEekXq97R zKx^dm;uBn_A==^i@Q)IHzh4b&)5;`7W{0lG1j1FZ10eNyJcWgY#G{6VQX(V49+`kv txoc)LET9qh0T#3P&w$v0D7}vdvQ1aLUv0E*SP`_PdPQwTQ~7t>-UBj)19$)c