Charakterbewegungen hinzugefügt, Deko hinzugefügt, Kochrezepte angepasst
This commit is contained in:
parent
95945c0306
commit
a0c893ca0b
1124 changed files with 64294 additions and 763 deletions
646
mods/stairs/init.lua
Normal file
646
mods/stairs/init.lua
Normal file
|
@ -0,0 +1,646 @@
|
|||
stairs = {mod = "redo"}
|
||||
|
||||
|
||||
-- cache creative
|
||||
local creative = core.settings:get_bool("creative_mode")
|
||||
|
||||
local function is_creative_enabled_for(name)
|
||||
|
||||
if creative or core.check_player_privs(name, {creative = true}) then
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
-- process textures
|
||||
local set_textures = function(images, worldaligntex)
|
||||
|
||||
local stair_images = {}
|
||||
|
||||
|
||||
for i, image in ipairs(images) do
|
||||
|
||||
stair_images[i] = type(image) == "string" and {name = image} or table.copy(image)
|
||||
|
||||
if stair_images[i].backface_culling == nil then
|
||||
stair_images[i].backface_culling = true
|
||||
end
|
||||
|
||||
if worldaligntex and stair_images[i].align_style == nil then
|
||||
stair_images[i].align_style = "world"
|
||||
end
|
||||
end
|
||||
|
||||
return stair_images
|
||||
end
|
||||
|
||||
|
||||
-- placement helper
|
||||
local stair_place = function(itemstack, placer, pointed_thing, stair_node)
|
||||
|
||||
-- if sneak pressed then use param2 in node pointed at when placing
|
||||
if placer:is_player() and placer:get_player_control().sneak then
|
||||
|
||||
local name = placer:get_player_name()
|
||||
local pos_a = pointed_thing.above
|
||||
local node_a = core.get_node(pos_a)
|
||||
local def_a = core.registered_nodes[node_a.name]
|
||||
|
||||
if not def_a.buildable_to or core.is_protected(pos_a, name) then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local pos_u = pointed_thing.under
|
||||
local node_u = core.get_node(pos_u)
|
||||
|
||||
if core.get_item_group(node_u.name, "stair") > 0
|
||||
or core.get_item_group(node_u.name, "slab") > 0 then
|
||||
|
||||
core.set_node(pos_a, {
|
||||
name = stair_node,
|
||||
param2 = node_u.param2
|
||||
})
|
||||
|
||||
if not is_creative_enabled_for(name) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
|
||||
return itemstack
|
||||
end
|
||||
end
|
||||
|
||||
core.rotate_and_place(itemstack, placer, pointed_thing,
|
||||
is_creative_enabled_for(placer:get_player_name()),
|
||||
{invert_wall = placer:get_player_control().sneak})
|
||||
|
||||
return itemstack
|
||||
end
|
||||
|
||||
|
||||
-- if recipeitem can be burned then stair can also
|
||||
local function set_burn(recipeitem, stair_name, v)
|
||||
|
||||
local burntime = core.get_craft_result({
|
||||
method = "fuel", width = 1, items = {recipeitem} }).time
|
||||
|
||||
if burntime > 0 then
|
||||
|
||||
core.register_craft({
|
||||
type = "fuel",
|
||||
recipe = stair_name,
|
||||
burntime = math.floor(burntime * v)
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Node will be called stairs:stair_<subname>
|
||||
function stairs.register_stair(
|
||||
subname, recipeitem, groups, images, description, snds, wat)
|
||||
|
||||
local stair_images = set_textures(images, wat)
|
||||
local new_groups = table.copy(groups)
|
||||
|
||||
new_groups.stair = 1
|
||||
|
||||
local def = core.registered_nodes[recipeitem] or {}
|
||||
|
||||
core.register_node(":stairs:stair_" .. subname, {
|
||||
description = description,
|
||||
drawtype = "nodebox",
|
||||
tiles = stair_images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = def.use_texture_alpha,
|
||||
light_source = def.light_source,
|
||||
sunlight_propagates = def.sunlight_propagates,
|
||||
groups = new_groups,
|
||||
sounds = snds or def.sounds,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5}
|
||||
}
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
return stair_place(
|
||||
itemstack, placer, pointed_thing, "stairs:stair_" .. subname)
|
||||
end
|
||||
})
|
||||
|
||||
-- if no recipe item provided then skip craft recipes
|
||||
if not recipeitem then
|
||||
return
|
||||
end
|
||||
|
||||
-- stair recipes
|
||||
core.register_craft({
|
||||
output = "stairs:stair_" .. subname .. " 8",
|
||||
recipe = {
|
||||
{recipeitem, "", ""},
|
||||
{recipeitem, recipeitem, ""},
|
||||
{recipeitem, recipeitem, recipeitem}
|
||||
}
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
output = "stairs:stair_" .. subname .. " 8",
|
||||
recipe = {
|
||||
{"", "", recipeitem},
|
||||
{"", recipeitem, recipeitem},
|
||||
{recipeitem, recipeitem, recipeitem}
|
||||
}
|
||||
})
|
||||
|
||||
-- stair to original material recipe
|
||||
core.register_craft({
|
||||
output = recipeitem .. " 3",
|
||||
recipe = {
|
||||
{"stairs:stair_" .. subname, "stairs:stair_" .. subname},
|
||||
{"stairs:stair_" .. subname, "stairs:stair_" .. subname}
|
||||
}
|
||||
})
|
||||
|
||||
set_burn(recipeitem, "stairs:stair_" .. subname, 0.75)
|
||||
end
|
||||
|
||||
|
||||
-- Node will be called stairs:slab_<subname>
|
||||
function stairs.register_slab(
|
||||
subname, recipeitem, groups, images, description, snds, wat)
|
||||
|
||||
local slab_images = set_textures(images, wat)
|
||||
local new_groups = table.copy(groups)
|
||||
|
||||
new_groups.slab = 1
|
||||
|
||||
local def = core.registered_nodes[recipeitem] or {}
|
||||
|
||||
core.register_node(":stairs:slab_" .. subname, {
|
||||
description = description,
|
||||
drawtype = "nodebox",
|
||||
tiles = slab_images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = def.use_texture_alpha,
|
||||
light_source = def.light_source,
|
||||
sunlight_propagates = def.sunlight_propagates,
|
||||
groups = new_groups,
|
||||
sounds = snds or def.sounds,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
||||
return stair_place(
|
||||
itemstack, placer, pointed_thing, "stairs:slab_" .. subname)
|
||||
end
|
||||
})
|
||||
|
||||
-- if no recipe item provided then skip craft recipes
|
||||
if not recipeitem then
|
||||
return
|
||||
end
|
||||
|
||||
-- slab recipe
|
||||
core.register_craft({
|
||||
output = "stairs:slab_" .. subname .. " 6",
|
||||
recipe = {
|
||||
{recipeitem, recipeitem, recipeitem}
|
||||
}
|
||||
})
|
||||
|
||||
-- slab to original material recipe
|
||||
core.register_craft({
|
||||
output = recipeitem,
|
||||
recipe = {
|
||||
{"stairs:slab_" .. subname},
|
||||
{"stairs:slab_" .. subname}
|
||||
}
|
||||
})
|
||||
|
||||
set_burn(recipeitem, "stairs:slab_" .. subname, 0.5)
|
||||
end
|
||||
|
||||
|
||||
-- Node will be called stairs:stair_outer_<subname>
|
||||
function stairs.register_stair_outer(
|
||||
subname, recipeitem, groups, images, description, snds, wat, fdesc)
|
||||
|
||||
local stair_images = set_textures(images, wat)
|
||||
local new_groups = table.copy(groups)
|
||||
|
||||
new_groups.stair = 1
|
||||
|
||||
local def = core.registered_nodes[recipeitem] or {}
|
||||
|
||||
core.register_node(":stairs:stair_outer_" .. subname, {
|
||||
description = fdesc or "Outer " .. description,
|
||||
drawtype = "nodebox",
|
||||
tiles = stair_images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = def.use_texture_alpha,
|
||||
light_source = def.light_source,
|
||||
sunlight_propagates = def.sunlight_propagates,
|
||||
groups = new_groups,
|
||||
sounds = snds or def.sounds,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0, 0.5, 0.5}
|
||||
},
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
||||
return stair_place(
|
||||
itemstack, placer, pointed_thing, "stairs:stair_outer_" .. subname)
|
||||
end
|
||||
})
|
||||
|
||||
-- add alias for old stairs redo name
|
||||
core.register_alias("stairs:corner_" .. subname,
|
||||
"stairs:stair_outer_" .. subname)
|
||||
|
||||
-- if no recipe item provided then skip craft recipes
|
||||
if not recipeitem then
|
||||
return
|
||||
end
|
||||
|
||||
-- corner stair recipe
|
||||
core.register_craft({
|
||||
output = "stairs:stair_outer_" .. subname .. " 6",
|
||||
recipe = {
|
||||
{"", "", ""},
|
||||
{"", recipeitem, ""},
|
||||
{recipeitem, recipeitem, recipeitem}
|
||||
},
|
||||
})
|
||||
|
||||
-- corner stair to original material recipe
|
||||
core.register_craft({
|
||||
output = recipeitem .. " 2",
|
||||
recipe = {
|
||||
{"stairs:stair_outer_" .. subname, "stairs:stair_outer_" .. subname},
|
||||
{"stairs:stair_outer_" .. subname, "stairs:stair_outer_" .. subname}
|
||||
}
|
||||
})
|
||||
|
||||
set_burn(recipeitem, "stairs:stair_outer_" .. subname, 0.625)
|
||||
end
|
||||
|
||||
|
||||
-- Node will be called stairs:stair_inner_<subname>
|
||||
function stairs.register_stair_inner(
|
||||
subname, recipeitem, groups, images, description, snds, wat, fdesc)
|
||||
|
||||
local stair_images = set_textures(images, wat)
|
||||
local new_groups = table.copy(groups)
|
||||
|
||||
new_groups.stair = 1
|
||||
|
||||
local def = core.registered_nodes[recipeitem] or {}
|
||||
|
||||
core.register_node(":stairs:stair_inner_" .. subname, {
|
||||
description = fdesc or "Inner " .. description,
|
||||
drawtype = "nodebox",
|
||||
tiles = stair_images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = def.use_texture_alpha,
|
||||
light_source = def.light_source,
|
||||
sunlight_propagates = def.sunlight_propagates,
|
||||
groups = new_groups,
|
||||
sounds = snds or def.sounds,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
{-0.5, 0, -0.5, 0, 0.5, 0}
|
||||
}
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
||||
return stair_place(
|
||||
itemstack, placer, pointed_thing, "stairs:stair_inner_" .. subname)
|
||||
end,
|
||||
})
|
||||
|
||||
-- add alias for old stairs redo name
|
||||
core.register_alias("stairs:invcorner_" .. subname,
|
||||
"stairs:stair_inner_" .. subname)
|
||||
|
||||
-- if no recipe item provided then skip craft recipes
|
||||
if not recipeitem then
|
||||
return
|
||||
end
|
||||
|
||||
-- inside corner stair recipe
|
||||
core.register_craft({
|
||||
output = "stairs:stair_inner_" .. subname .. " 9",
|
||||
recipe = {
|
||||
{recipeitem, recipeitem, ""},
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
}
|
||||
})
|
||||
|
||||
-- inside corner stair to original material recipe
|
||||
core.register_craft({
|
||||
output = recipeitem .. " 3",
|
||||
recipe = {
|
||||
{"stairs:stair_inner_" .. subname, "stairs:stair_inner_" .. subname},
|
||||
{"stairs:stair_inner_" .. subname, "stairs:stair_inner_" .. subname}
|
||||
}
|
||||
})
|
||||
|
||||
set_burn(recipeitem, "stairs:stair_inner_" .. subname, 0.875)
|
||||
end
|
||||
|
||||
|
||||
-- Node will be called stairs:slope_<subname>
|
||||
function stairs.register_slope(
|
||||
subname, recipeitem, groups, images, description, snds, wat)
|
||||
|
||||
local stair_images = set_textures(images, wat)
|
||||
local new_groups = table.copy(groups)
|
||||
|
||||
new_groups.stair = 1
|
||||
|
||||
local def = core.registered_nodes[recipeitem] or {}
|
||||
|
||||
core.register_node(":stairs:slope_" .. subname, {
|
||||
description = description,
|
||||
drawtype = "mesh",
|
||||
mesh = "stairs_slope.obj",
|
||||
tiles = stair_images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = def.use_texture_alpha,
|
||||
light_source = def.light_source,
|
||||
sunlight_propagates = def.sunlight_propagates,
|
||||
groups = new_groups,
|
||||
sounds = snds or def.sounds,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5}
|
||||
},
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
||||
return stair_place(
|
||||
itemstack, placer, pointed_thing, "stairs:slope_" .. subname)
|
||||
end
|
||||
})
|
||||
|
||||
-- slope recipe
|
||||
core.register_craft({
|
||||
output = "stairs:slope_" .. subname .. " 6",
|
||||
recipe = {
|
||||
{recipeitem, "", ""},
|
||||
{recipeitem, recipeitem, ""}
|
||||
}
|
||||
})
|
||||
|
||||
-- slope to original material recipe
|
||||
core.register_craft({
|
||||
output = recipeitem,
|
||||
recipe = {
|
||||
{"stairs:slope_" .. subname, "stairs:slope_" .. subname}
|
||||
}
|
||||
})
|
||||
|
||||
set_burn(recipeitem, "stairs:slope_" .. subname, 0.5)
|
||||
end
|
||||
|
||||
|
||||
-- Node will be called stairs:slope_inner_<subname>
|
||||
function stairs.register_slope_inner(
|
||||
subname, recipeitem, groups, images, description, snds, wat)
|
||||
|
||||
local stair_images = set_textures(images, wat)
|
||||
local new_groups = table.copy(groups)
|
||||
|
||||
new_groups.stair = 1
|
||||
|
||||
local def = core.registered_nodes[recipeitem] or {}
|
||||
|
||||
core.register_node(":stairs:slope_inner_" .. subname, {
|
||||
description = description,
|
||||
drawtype = "mesh",
|
||||
mesh = "stairs_slope_inner.obj",
|
||||
tiles = stair_images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = def.use_texture_alpha,
|
||||
light_source = def.light_source,
|
||||
sunlight_propagates = def.sunlight_propagates,
|
||||
groups = new_groups,
|
||||
sounds = snds or def.sounds,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
{-0.5, 0, -0.5, 0, 0.5, 0}
|
||||
}
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
{-0.5, 0, -0.5, 0, 0.5, 0}
|
||||
}
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
||||
return stair_place(
|
||||
itemstack, placer, pointed_thing, "stairs:slope_inner_" .. subname)
|
||||
end
|
||||
})
|
||||
|
||||
-- slope recipe
|
||||
core.register_craft({
|
||||
output = "stairs:slope_inner_" .. subname .. " 6",
|
||||
recipe = {
|
||||
{"", recipeitem, recipeitem},
|
||||
{recipeitem, recipeitem, recipeitem}
|
||||
}
|
||||
})
|
||||
|
||||
-- slope to original material recipe
|
||||
core.register_craft({
|
||||
output = recipeitem,
|
||||
recipe = {
|
||||
{"stairs:slope_inner_" .. subname, "stairs:slope_inner_" .. subname}
|
||||
}
|
||||
})
|
||||
|
||||
set_burn(recipeitem, "stairs:slope_inner_" .. subname, 0.5)
|
||||
end
|
||||
|
||||
|
||||
-- Node will be called stairs:slope_outer_<subname>
|
||||
function stairs.register_slope_outer(
|
||||
subname, recipeitem, groups, images, description, snds, wat)
|
||||
|
||||
local stair_images = set_textures(images, wat)
|
||||
local new_groups = table.copy(groups)
|
||||
|
||||
new_groups.stair = 1
|
||||
|
||||
local def = core.registered_nodes[recipeitem] or {}
|
||||
|
||||
core.register_node(":stairs:slope_outer_" .. subname, {
|
||||
description = description,
|
||||
drawtype = "mesh",
|
||||
mesh = "stairs_slope_outer.obj",
|
||||
tiles = stair_images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = def.use_texture_alpha,
|
||||
light_source = def.light_source,
|
||||
sunlight_propagates = def.sunlight_propagates,
|
||||
groups = new_groups,
|
||||
sounds = snds or def.sounds,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0, 0.5, 0.5}
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0, 0.5, 0.5}
|
||||
},
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
||||
return stair_place(
|
||||
itemstack, placer, pointed_thing, "stairs:slope_outer_" .. subname)
|
||||
end
|
||||
})
|
||||
|
||||
-- slope recipe
|
||||
core.register_craft({
|
||||
output = "stairs:slope_outer_" .. subname .. " 6",
|
||||
recipe = {
|
||||
{"", "", recipeitem},
|
||||
{"", recipeitem, recipeitem}
|
||||
}
|
||||
})
|
||||
|
||||
-- slope to original material recipe
|
||||
core.register_craft({
|
||||
output = recipeitem,
|
||||
recipe = {
|
||||
{"stairs:slope_outer_" .. subname, "stairs:slope_outer_" .. subname}
|
||||
}
|
||||
})
|
||||
|
||||
set_burn(recipeitem, "stairs:slope_outer_" .. subname, 0.5)
|
||||
end
|
||||
|
||||
|
||||
-- Nodes will be called stairs:{stair,slab}_<subname>
|
||||
function stairs.register_stair_and_slab(
|
||||
subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, wat)
|
||||
|
||||
stairs.register_stair(
|
||||
subname, recipeitem, groups, images, desc_stair, sounds, wat)
|
||||
|
||||
stairs.register_stair_inner(
|
||||
subname, recipeitem, groups, images, desc_stair, sounds, wat)
|
||||
|
||||
stairs.register_stair_outer(
|
||||
subname, recipeitem, groups, images, desc_stair, sounds, wat)
|
||||
|
||||
stairs.register_slab(
|
||||
subname, recipeitem, groups, images, desc_slab, sounds, wat)
|
||||
end
|
||||
|
||||
|
||||
-- Nodes will be called stairs:{stair,slab,corner,invcorner,slope}_<subname>
|
||||
function stairs.register_all(
|
||||
subname, recipeitem, groups, images, desc, snds, wat)
|
||||
|
||||
stairs.register_stair(
|
||||
subname, recipeitem, groups, images, desc .. " Stair", snds, wat)
|
||||
|
||||
stairs.register_slab(
|
||||
subname, recipeitem, groups, images, desc .. " Slab", snds, wat)
|
||||
|
||||
stairs.register_stair_inner(
|
||||
subname, recipeitem, groups, images, desc .. " Stair", snds, wat)
|
||||
|
||||
stairs.register_stair_outer(
|
||||
subname, recipeitem, groups, images, desc .. " Stair", snds, wat)
|
||||
|
||||
stairs.register_slope(
|
||||
subname, recipeitem, groups, images, desc .. " Slope", snds, wat)
|
||||
|
||||
stairs.register_slope_inner(
|
||||
subname, recipeitem, groups, images, desc .. " Slope", snds, wat)
|
||||
|
||||
stairs.register_slope_outer(
|
||||
subname, recipeitem, groups, images, desc .. " Slope", snds, wat)
|
||||
end
|
||||
|
||||
|
||||
-- compatibility function for previous stairs:invcorner_<subname>
|
||||
function stairs.register_invcorner(
|
||||
subname, recipeitem, groups, images, desc, snds, wat)
|
||||
|
||||
stairs.register_stair_inner(
|
||||
subname, recipeitem, groups, images, desc .. " Stair", snds, wat)
|
||||
end
|
||||
|
||||
|
||||
-- compatibility function for previous stairs:corner_<subname>
|
||||
function stairs.register_corner(
|
||||
subname, recipeitem, groups, images, desc, snds, wat)
|
||||
|
||||
stairs.register_stair_outer(
|
||||
subname, recipeitem, groups, images, desc .. " Stair", snds, wat)
|
||||
end
|
||||
|
||||
|
||||
-- Register stairs after mods loaded
|
||||
core.register_on_mods_loaded(function()
|
||||
dofile(core.get_modpath("stairs") .. "/stairs.lua")
|
||||
end)
|
||||
|
||||
print ("[MOD] Stairs Redo loaded")
|
Loading…
Add table
Add a link
Reference in a new issue