Add support for technic mod. recipe udpates, computer depend on power source. Laptop have rechargable battery.
parent
db7e964c70
commit
937df005c6
4
API.md
4
API.md
|
@ -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 = {
|
||||
|
|
|
@ -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, ''},
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
default
|
147
hardware_fw.lua
147
hardware_fw.lua
|
@ -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
|
||||
|
||||
|
|
|
@ -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', },
|
||||
|
|
5
mod.conf
5
mod.conf
|
@ -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
|
||||
|
||||
|
|
16
mtos.lua
16
mtos.lua
|
@ -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
|
||||
|
|
|
@ -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 |
Loading…
Reference in New Issue