Add support for technic mod. recipe udpates, computer depend on power source. Laptop have rechargable battery.

master
SFENCE 2021-11-07 15:34:38 +01:00
parent db7e964c70
commit 937df005c6
10 changed files with 231 additions and 24 deletions

4
API.md
View File

@ -12,11 +12,15 @@
- `hwdef.tty_monochrome` - Old computer with monochrome CRT screen
- `hwdef.custom_theme` - optional - custom initial theme name
- `hwdef.hw_capabilities` = { "hdd", "floppy", "usb", "net", "liveboot" } Table with hardware capabilities. Default is all, if nothing set
- `hwdef.battery_capacity` - battery capacity (used if technic mod is aviable)
- `hwdef.node_defs` - A list for node definitions for each variant. with hw_state parameter for OS-initialization
```
hwdef.node_defs = {
variant_1_name = {
hw_state = "resume", "power_on" or "power_off", -- Hardware state
_eu_demand = 100, -- required technic power
_power_off_seq = "variant_name", -- name of variant for switch when power source is not aviable
_battery_charge = 400, -- speed of batter charging (with technin mod)
--node 1 definiton
},
variant_2_name = {

View File

@ -68,9 +68,9 @@ minetest.register_craftitem("laptop:bat", {
minetest.register_craft({
output = 'laptop:bat',
recipe = {
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.gates_diode, rc.steel},
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.battery, rc.steel},
{rc.battery, rc.gates_diode, rc.battery},
{rc.steel, rc.battery, rc.steel},
}
})
@ -152,9 +152,9 @@ minetest.register_craftitem("laptop:gpu", {
minetest.register_craft({
output = 'laptop:gpu',
recipe = {
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.fpga, rc.steel},
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.silicon, rc.steel},
{'laptop:fan', rc.fpga, 'laptop:fan'},
{rc.steel, rc.silicon, rc.steel},
}
})
@ -182,7 +182,7 @@ minetest.register_craft({
recipe = {
{rc.controller, rc.fpga, rc.gates_nand},
{'dye:dark_green', 'dye:dark_green', 'dye:dark_green'},
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.copper, rc.steel},
}
})
@ -194,9 +194,9 @@ minetest.register_craftitem("laptop:fan", {
minetest.register_craft({
output = 'laptop:fan',
recipe = {
{'', rc.steel, ''},
{rc.steel, rc.steel, rc.steel},
{'', rc.steel, ''},
{rc.plastic, rc.steel, rc.plastic},
{rc.steel, rc.motor, rc.steel},
{rc.plastic, rc.steel, rc.plastic},
}
})
@ -208,9 +208,9 @@ minetest.register_craftitem("laptop:psu", {
minetest.register_craft({
output = 'laptop:psu',
recipe = {
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.lv_transformer, rc.steel},
{rc.controller, rc.fpga, 'laptop:fan'},
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.lv_transformer, rc.steel},
}
})
@ -224,9 +224,9 @@ minetest.register_craftitem("laptop:floppy", {
minetest.register_craft({
output = 'laptop:floppy',
recipe = {
{rc.steel, rc.steel, rc.steel},
{rc.steel, rc.programmer, rc.steel},
{rc.steel, rc.steel, rc.steel},
{rc.plastic, rc.plastic, rc.plastic},
{rc.plastic, rc.programmer, rc.plastic},
{rc.plastic, rc.plastic, rc.plastic},
}
})
@ -240,9 +240,9 @@ minetest.register_craftitem("laptop:usbstick", {
minetest.register_craft({
output = 'laptop:usbstick',
recipe = {
{'', rc.steel, ''},
{'', rc.silicon, ''},
{'', rc.programmer, ''},
{'', rc.steel, ''},
{'', rc.plastic, ''},
}
})

View File

@ -1 +0,0 @@
default

View File

@ -1,6 +1,8 @@
laptop.node_config = {}
local have_technic = minetest.get_modpath("technic")
local function on_construct(pos)
laptop.mtos_cache:free(pos)
local mtos = laptop.os_get(pos)
@ -132,6 +134,19 @@ local function after_place_node(pos, placer, itemstack, pointed_thing)
local removable = mtos.bdev:get_removable_disk()
removable:reload(ItemStack(save.removable_disk))
end
-- battery support
if have_technic then
local node = minetest.get_node(pos)
local hwdef = laptop.node_config[node.name]
if hwdef.battery_capacity then
local metadata = minetest.deserialize(itemstack:get_metadata())
if metadata and metadata.charge then
local meta = minetest.get_meta(pos)
meta:set_int("battery", metadata.charge)
end
end
end
mtos.bdev:sync()
itemstack:clear()
@ -157,6 +172,78 @@ local function preserve_metadata(pos, oldnode, oldmetadata, drops)
for _, stack in pairs(drops) do
if stack:get_name() == item_name then
stack:get_meta():set_string("laptop_metadata", minetest.serialize(save))
if have_technic then
local hwdef = laptop.node_config[oldnode.name]
if hwdef.battery_capacity then
stack:set_metadata(minetest.serialize({charge=tonumber(oldmetadata.battery or "0")}))
technic.set_RE_wear(stack, oldmetadata.battery or 0, hwdef.battery_capacity)
end
end
end
end
end
local function technic_run(pos, node)
local mtos = laptop.os_get(pos)
if not mtos then
return
end
local meta = minetest.get_meta(pos)
local demand = meta:get_int("LV_EU_demand")
local supply = meta:get_int("LV_EU_input")
if (supply<demand) and (demand>0) then
local hwdef = laptop.node_config[node.name]
if hwdef.power_off_node then
local hwdef_next = laptop.node_config[hwdef.power_off_node]
if hwdef_next.hw_state then
mtos[hwdef_next.hw_state](mtos, hwdef.power_off_node)
else
mtos:power_off(hwdef.power_off_node)
mtos:save()
end
end
elseif (demand>0) then
local hwdef = laptop.node_config[node.name]
if hwdef.battery_capacity then
local battery = meta:get_int("battery")
battery = battery+(hwdef.battery_charge or 400)
battery = math.min(battery, hwdef.battery_capacity)
meta:set_int("battery", battery)
end
end
end
local function technic_on_disable(pos, node)
local meta = minetest.get_meta(pos)
local demand = meta:get_int("LV_EU_demand")
if (demand==0) then
return
end
local mtos = laptop.os_get(pos)
if not mtos then
return
end
local hwdef = laptop.node_config[node.name]
if hwdef.battery_capacity then
local battery = meta:get_int("battery")
if (battery>demand) then
meta:set_int("battery", battery - demand)
return
end
meta:set_int("battery", 0)
end
meta:set_int("LV_EU_demand", 0)
if hwdef.power_off_node then
local hwdef_next = laptop.node_config[hwdef.power_off_node]
if hwdef_next.hw_state then
mtos[hwdef_next.hw_state](mtos, hwdef.power_off_node)
else
mtos:power_off(hwdef.power_off_node)
mtos:save()
end
end
end
@ -172,7 +259,12 @@ function laptop.register_hardware(name, hwdef)
if def.groups then
def.groups = table.copy(def.groups)
else
def.groups = {choppy=2, oddly_breakably_by_hand=2, dig_immediate = 2}
def.groups = {choppy=2, oddly_breakably_by_hand=2, dig_immediate = 2, technic_machine = 1, technic_lv = 1}
end
if def.connect_sides then
def.connect_sides = table.copy(def.connect_sides)
else
def.connect_sides = {"back"}
end
if nodename ~= default_nodename then
def.drop = default_nodename
@ -196,8 +288,20 @@ function laptop.register_hardware(name, hwdef)
def.on_metadata_inventory_put = on_metadata_inventory_put
def.on_metadata_inventory_take = on_metadata_inventory_take
def.on_timer = on_timer
def.technic_run = technic_run
def.technic_on_disable = technic_on_disable
if have_technic then
if hwdef.battery_capacity then
def.groups.not_in_creative_inventory = 1
def.drop = name.."_item"
end
end
minetest.register_node(nodename, def)
if have_technic then
technic.register_machine("LV", nodename, technic.receiver)
end
-- set node configuration for hooks
local merged_hwdef = table.copy(hwdef)
merged_hwdef.name = name
@ -210,10 +314,49 @@ function laptop.register_hardware(name, hwdef)
if next_node ~= nodename then
merged_hwdef.next_node = next_node
end
-- power off node
if def._power_off_seq then
local power_off_node = name.."_"..def._power_off_seq
if power_off_node ~= nodename then
merged_hwdef.power_off_node = power_off_node
end
end
-- battery charge
if def._battery_charge then
merged_hwdef.battery_charge = def._battery_charge
end
-- eu demand
if def._eu_demand then
merged_hwdef.eu_demand = def._eu_demand
end
-- Defaults
merged_hwdef.hw_capabilities = merged_hwdef.hw_capabilities or {"hdd", "floppy", "usb", "net", "liveboot"}
laptop.node_config[nodename] = merged_hwdef
end
if hwdef.battery_capacity then
if have_technic then
technic.register_power_tool(name.."_item", hwdef.battery_capacity)
minetest.register_tool(name.."_item", {
description = hwdef.description,
inventory_image = hwdef.inventory_image,
stack_max = 1,
wear_represents = "technic_RE_charge",
on_refill = technic.refill_RE_charge,
on_place = function(itemstack, placer, pointed_thing)
itemstack:set_name(default_nodename)
minetest.item_place_node(itemstack, placer, pointed_thing)
itemstack:clear()
return itemstack
end,
})
else
minetest.register_alias(name.."_item", default_nodename)
end
end
end

View File

@ -4,6 +4,8 @@ laptop.register_hardware("laptop:core", {
sequence = { "closed", "open", "open_on" },
custom_theme = "Red",
hw_capabilities = { 'hdd', 'usb', 'net' },
battery_capacity = 80000,
inventory_image = "laptop_lap_car_item.png",
node_defs = {
["open"] = {
hw_state = "power_off",
@ -28,6 +30,9 @@ laptop.register_hardware("laptop:core", {
},
["open_on"] = {
hw_state = "resume",
_power_off_seq = "open",
_eu_demand = 100,
_battery_charge = 400,
light_source = 4,
tiles = {
"laptop_lap_car_open_on_top.png",
@ -72,7 +77,7 @@ laptop.register_hardware("laptop:core", {
})
minetest.register_craft({
output = 'laptop:core_closed',
output = 'laptop:core_item',
recipe = {
{'dye:red', 'laptop:lcd', 'dye:red', },
{'laptop:HDD', 'laptop:motherboard', 'laptop:gpu', },
@ -91,6 +96,7 @@ laptop.register_hardware("laptop:printer", {
["powersave"] = {
hw_state = "power_off",
_power_off_seq = "off",
tiles = {
"laptop_printer_top.png",
"laptop_printer_bottom.png",
@ -102,7 +108,7 @@ laptop.register_hardware("laptop:printer", {
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy=2, oddly_breakably_by_hand=2, dig_immediate = 2, laptop_printer = 1},
groups = {choppy=2, oddly_breakably_by_hand=2, dig_immediate = 2, laptop_printer = 1, technic_machine = 1, technic_lv = 1},
node_box = {
type = "fixed",
fixed = {
@ -114,6 +120,8 @@ laptop.register_hardware("laptop:printer", {
},
["on"] = {
hw_state = "power_on",
_power_off_seq = "off",
_eu_demand = 100,
tiles = {
"laptop_printer_top.png",
"laptop_printer_bottom.png",
@ -125,7 +133,7 @@ laptop.register_hardware("laptop:printer", {
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy=2, oddly_breakably_by_hand=2, dig_immediate = 2, laptop_printer = 1},
groups = {choppy=2, oddly_breakably_by_hand=2, dig_immediate = 2, laptop_printer = 1, technic_machine = 1, technic_lv = 1},
node_box = {
type = "fixed",
fixed = {
@ -178,6 +186,8 @@ laptop.register_hardware("laptop:cube", {
node_defs = {
["on"] = {
hw_state = "power_on",
_power_off_seq = "off",
_eu_demand = 150,
light_source = 4,
tiles = {
"laptop_cube_monitor_top.png^laptop_cube_tower_top.png",
@ -243,6 +253,8 @@ laptop.register_hardware("laptop:fruit_zero", {
node_defs = {
["on"] = {
hw_state = "power_on",
_power_off_seq = "off",
_eu_demand = 300,
light_source = 4,
tiles = {
"laptop_fruit_stand_top.png",
@ -310,6 +322,8 @@ laptop.register_hardware("laptop:bell_crossover", {
node_defs = {
["on"] = {
hw_state = "power_on",
_power_off_seq = "off",
_eu_demand = 250,
light_source = 4,
tiles = {
"laptop_opti_pc_top.png^laptop_opti_kb_top.png^laptop_opti_ms_top.png^laptop_opti_lcb_top.png^laptop_opti_lcp_top.png^laptop_opti_lcd_top.png",
@ -381,6 +395,8 @@ laptop.register_hardware("laptop:kodiak_1000", {
node_defs = {
["on"] = {
hw_state = "power_on",
_power_off_seq = "off",
_eu_demand = 100,
light_source = 3,
tiles = {
"laptop_k_top.png^laptop_t_top.png^laptop_p_top.png^laptop_m_top.png",
@ -445,6 +461,8 @@ laptop.register_hardware("laptop:portable_workstation_2", {
os_version = "5.02",
custom_theme = "Argyle",
sequence = { "closed", "open", "open_on"},
battery_capacity = 80000,
inventory_image = "laptop_lap_base_item.png",
node_defs = {
["closed"] = {
hw_state = "power_off",
@ -489,6 +507,9 @@ laptop.register_hardware("laptop:portable_workstation_2", {
},
["open_on"] = {
hw_state = "resume",
_power_off_seq = "open",
_eu_demand = 200,
_battery_charge = 400,
light_source = 4,
tiles = {
"laptop_lap_base_open_on_top.png",
@ -513,7 +534,7 @@ laptop.register_hardware("laptop:portable_workstation_2", {
})
minetest.register_craft({
output = 'laptop:portable_workstation_2_closed',
output = 'laptop:portable_workstation_2_item',
recipe = {
{'dye:dark_grey', 'laptop:lcd', 'dye:dark_grey', },
{'laptop:HDD', 'laptop:motherboard', 'laptop:cpu_d75a', },

View File

@ -1 +1,6 @@
name = laptop
title = Laptop
description = Adds laptops/computers to your MT world.
depends = default
optional_depends = mesecons_materials, mesecons_gates, mesecons_fpga, mesecons_delayer, mesecons_luacontroller, mesecons_lightstone, homedecor, basic_materials, technic

View File

@ -63,6 +63,8 @@ laptop.supported_textcolors = {
WHITE = "#FFFFFF",
}
-- have technic
local have_technic = minetest.get_modpath("technic")
-----------------------------------------------------
-- Operating System cache
@ -154,6 +156,12 @@ end
-- Power on the system and start the launcher
function os_class:power_on(new_node_name)
if new_node_name then
local meta = minetest.get_meta(self.pos)
local hwdef = laptop.node_config[new_node_name]
meta:set_int("LV_EU_demand", hwdef.eu_demand or 100)
meta:set_int("LV_EU_input", hwdef.eu_demand or 100)
end
self.bdev:free_ram_disk()
mtos_cache:free(self.pos)
-- update current instance with reinitialized data
@ -166,12 +174,20 @@ end
-- Power on the system / and resume last running app
function os_class:resume(new_node_name)
if new_node_name then
local meta = minetest.get_meta(self.pos)
local hwdef = laptop.node_config[new_node_name]
meta:set_int("LV_EU_demand", hwdef.eu_demand or 100)
meta:set_int("LV_EU_input", hwdef.eu_demand or 100)
end
self:swap_node(new_node_name)
self:set_app('<pop>')
end
-- Power off the system
function os_class:power_off(new_node_name)
local meta = minetest.get_meta(self.pos)
local demand = meta:set_int("LV_EU_demand", 0)
self:swap_node(new_node_name)
self:set_app('os:power_off')
end

View File

@ -8,6 +8,8 @@ laptop.recipe_compat = {
fpga = '-unknown-', programmer = '-unknown-', delayer = '-unknown-',
controller = '-unknown-', light_red = '-unknown-', light_green = '-unknown-',
light_blue = '-unknown-',
plastic = '-unknown-', motor = '-unknown-',
battery = '-unknown-', lv_transformer = '-unknown-',
}
local rc = laptop.recipe_compat
@ -20,6 +22,10 @@ if minetest.get_modpath('default') then
rc.steel = 'default:steel_ingot'
rc.glass = 'default:glass'
rc.diamond = 'default:diamond'
rc.plastic = 'default:steel_ingot'
rc.motor = 'default:steel_ingot'
rc.battery = 'default:steel_ingot'
rc.lv_transformer = 'default:copper_ingot'
end
if minetest.get_modpath('homedecor') then
@ -32,6 +38,7 @@ if minetest.get_modpath('homedecor') then
rc.fpga = 'homedecor:ic'
rc.programmer = 'homedecor:heating_element'
rc.controller = 'homedecor:motor'
rc.motor = 'homedecor:motor'
end
if minetest.get_modpath('mesecons_materials') then
@ -66,3 +73,15 @@ if minetest.get_modpath('mesecons_lightstone') then
rc.light_green = 'mesecons_lightstone:lightstone_green_off'
rc.light_blue = 'mesecons_lightstone:lightstone_blue_off'
end
if minetest.get_modpath('basic_materials') then
rc.plastic = 'basic_materials:plastic_sheet'
rc.motor = 'basic_materials:motor'
end
if minetest.get_modpath('technic') then
rc.battery = 'technic:battery'
rc.lv_transformer = 'technic:lv_transformer'
rc.silicon = 'technic:doped_silicon_wafer'
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B