mirror of
https://github.com/jimy-byerley/minetest-computers.git
synced 2024-11-16 15:30:29 +01:00
Create init.lua
This commit is contained in:
parent
572cb01ff8
commit
a53e649c08
254
init.lua
Normal file
254
init.lua
Normal file
|
@ -0,0 +1,254 @@
|
|||
-- 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"
|
||||
|
||||
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
|
||||
|
||||
computers.registered_oscommands = {}
|
||||
computers.computer_help = {}
|
||||
|
||||
computers.register_oscommand = function(name, exe, help)
|
||||
computers.registered_oscommands[name] = exe
|
||||
computers.computer_help[name] = help
|
||||
end
|
||||
|
||||
computers.execute_oscommand = function(cmdline, pos, player)
|
||||
if cmdline == nil then return end
|
||||
local command = string.match(cmdline, "([^ ]+) *")
|
||||
if command == nil then return end
|
||||
local message = "["..command.." : command not found]"
|
||||
local continue = false
|
||||
|
||||
print("pass command to computer : "..command)
|
||||
local func = computers.registered_oscommands[command]
|
||||
if func then
|
||||
continue = true
|
||||
message, continue = func(cmdline, pos, player)
|
||||
end
|
||||
|
||||
--minetest.chat_send_player(player:get_player_name(), message)
|
||||
--display message
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("infotext", message)
|
||||
|
||||
return continue
|
||||
end
|
||||
|
||||
dofile(minetest.get_modpath("computers").."/os.lua")
|
||||
|
||||
-- crafting
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'computers:keyboard',
|
||||
recipe = {
|
||||
{'technology:button', 'technology:button', 'technology:button'},
|
||||
{'technology:button', 'technology:button', 'technology:button'},
|
||||
{'technology:button', 'technology:button', 'technology:button'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'computers:laptop_close',
|
||||
recipe = {
|
||||
{'technology:flat_screen_off', "technology:wire"},
|
||||
{'technology:electronic_card', "technology:wire"},
|
||||
{'technology:keyboard', "technology:wire"},
|
||||
}
|
||||
})
|
||||
|
||||
-- node defs
|
||||
|
||||
minetest.register_node("computers:keyboard", {
|
||||
description = "keyboard",
|
||||
stack_max = 1,
|
||||
node_placement_prediction = "",
|
||||
paramtype = "light",
|
||||
light_source = 3,
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
node_box = {type = "fixed", fixed = {-0.44, -0.5, -0.44, 0.44, -0.45, -0.02}},
|
||||
selection_box = {type = "fixed", fixed = {-0.44, -0.5, -0.44, 0.44, -0.45, -0.02}},
|
||||
tiles = {"keyboard_top.png", "keyboard_bottom.png", "keyboard_side.png", "keyboard_side.png", "keyboard_side.png", "keyboard_side.png"},
|
||||
walkable = true,
|
||||
groups = {choppy=2, dig_immediate=2},
|
||||
})
|
||||
|
||||
minetest.register_node("computers:laptop_open", {
|
||||
description = "Laptop from computers mod",
|
||||
stack_max = 1,
|
||||
node_placement_prediction = "",
|
||||
paramtype = "light",
|
||||
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},
|
||||
|
||||
-- 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 = {
|
||||
-- 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_general.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},
|
||||
drop = default_laptop,
|
||||
on_punch = function(pos, node, puncher)
|
||||
node.name = "computers:laptop_close"
|
||||
minetest.env:set_node(pos, node)
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
--set metadata
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("formspec", "field[text;;${text}]")
|
||||
meta:set_string("infotext", welcome_message)
|
||||
end,
|
||||
on_receive_fields = computer_action,
|
||||
})
|
||||
|
||||
laptop_open_action = function(pos, node, puncher)
|
||||
--set opened computer
|
||||
node.name = "computers:laptop_open"
|
||||
minetest.env:set_node(pos, node)
|
||||
--set metadata
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("formspec", "field[text;;${text}]")
|
||||
meta:set_string("infotext", welcome_message)
|
||||
end
|
||||
|
||||
minetest.register_node("computers:laptop_close", {
|
||||
description = "Laptop from computers mod",
|
||||
stack_max = 1,
|
||||
node_placement_prediction = "",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
node_box = {type = "fixed", fixed = {
|
||||
-- bottom part
|
||||
{-0.3, -0.5, -0.45, 0.3, -0.4, 0.075},
|
||||
}},
|
||||
selection_box = {type = "fixed", fixed = {-0.3, -0.5, -0.45, 0.3, -0.4, 0.075},},
|
||||
tiles = {"laptop_cover.png", "laptop_bottom.png", "laptop_left.png", "laptop_right.png", "laptop_back.png", {
|
||||
image="laptop_front_general.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,
|
||||
|
||||
on_punch = laptop_open_action,
|
||||
on_rightclick = laptop_open_action,
|
||||
})
|
||||
|
||||
minetest.register_node("computers:laptop_connect", {
|
||||
inventory_image = "laptop_wielded.png",
|
||||
wield_image = "laptop_wielded.png",
|
||||
stack_max = 1,
|
||||
node_placement_prediction = "",
|
||||
paramtype = "light",
|
||||
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},
|
||||
}},
|
||||
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"},
|
||||
walkable = true,
|
||||
groups = {choppy=2, dig_immediate=2, not_in_creative_inventory=1},
|
||||
drop = default_laptop,
|
||||
|
||||
on_punch = function(pos, node, puncher)
|
||||
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,
|
||||
})
|
||||
|
||||
minetest.register_alias("computers:laptop", "computers:laptop_close")
|
Loading…
Reference in New Issue
Block a user