make streets mod plain instead of submodule

update caverealms, markers, and moreblocks
fix junglewood texture on angled_walls,

clean out some misc .git* files that don't belong.
master
Vanessa Ezekowitz 2015-07-19 21:13:51 -04:00
parent f34662dd5e
commit d17320aecd
141 changed files with 3465 additions and 7 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 B

After

Width:  |  Height:  |  Size: 319 B

View File

@ -1,2 +0,0 @@
*~

@ -1 +1 @@
Subproject commit d65ceb30e2900c05799ea93437925b46a3e580d8
Subproject commit 9d2c0bd229600f0c6c8eb4ca142385a7dc5dbfee

@ -1 +1 @@
Subproject commit f9ede8b64d68332826675055c02488d62629c1b2
Subproject commit 22b833d93d5803b2eedfa1542b79628fa0fe59ae

@ -1 +1 @@
Subproject commit b00d4777cdfaa0c01f5a29389d1084e9e3b4ce30
Subproject commit 4cde2fd66b81bae8249acaa97f03200ab704f425

@ -1 +0,0 @@
Subproject commit 5be7aec758b23dc1773520abd0ee450b361979b6

View File

@ -0,0 +1,3 @@
default
streetsmod
building_blocks?

View File

@ -0,0 +1,27 @@
--[[
Streets Mod: All kinds of asphalt
]]
minetest.register_node(":streets:asphalt",{
description = streets.S("Asphalt"),
tiles = {"streets_asphalt.png"},
groups = {cracky=3}
})
if minetest.get_modpath("building_blocks") then
minetest.register_craft({
type = "shapeless",
output = "streets:asphalt 3",
recipe = {
"default:sand",
"default:gravel",
"building_blocks:Tar"
},
})
else
minetest.register_craft({
type = "cooking",
output = "streets:asphalt",
recipe = "default:gravel",
cooktime = 2
})
end

View File

@ -0,0 +1,3 @@
default
streetsmod
moreblocks?

View File

@ -0,0 +1,228 @@
--[[
StreetsMod: Asphalt stairs
]]
if not rawget(_G, "register_stair_slab_panel_micro")
or type(register_stair_slab_panel_micro) ~= "function" then return end
-- Asphalt
register_stair_slab_panel_micro("streets", "asphalt", "streets:asphalt", {cracky=3}, {"streets_asphalt.png"}, "Asphalt", "asphalt", nil)
minetest.register_alias("streets:asphalt_stair","stairs:stair_asphalt")
minetest.register_alias("streets:asphalt_slab","stairs:slab_asphalt")
table.insert(circular_saw.known_stairs,"streets:asphalt")
-- Asphalt solid line
-- Stair
minetest.register_node(":streets:asphalt_solid_line_stair",{
description = streets.S("Asphalt stair"),
tiles = {"streets_asphalt.png^streets_asphalt_solid_line.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_solid_line.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5},
{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:asphalt_solid_line_stair 6",
recipe = {
{"","","streets:asphalt_solid_line"},
{"","streets:asphalt_solid_line","streets:asphalt_solid_line"},
{"streets:asphalt_solid_line","streets:asphalt_solid_line","streets:asphalt_solid_line"}
}
})
minetest.register_craft({
output = "streets:asphalt_solid_line_stair 6",
recipe = {
{"streets:asphalt_solid_line","",""},
{"streets:asphalt_solid_line","streets:asphalt_solid_line",""},
{"streets:asphalt_solid_line","streets:asphalt_solid_line","streets:asphalt_solid_line"}
}
})
-- Slab
minetest.register_node(":streets:asphalt_solid_line_slab",{
description = streets.S("Asphalt slab"),
tiles = {"streets_asphalt.png^streets_asphalt_solid_line.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_solid_line.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5}
}
}
})
minetest.register_craft({
output = "streets:asphalt_solid_line_slab 3",
recipe = {
{"","",""},
{"","",""},
{"streets:asphalt_solid_line","streets:asphalt_solid_line","streets:asphalt_solid_line"}
}
})
------------------------------------------------------------
-- Asphalt dashed line
-- Stair
minetest.register_node(":streets:asphalt_dashed_line_stair",{
description = streets.S("Asphalt stair"),
tiles = {"streets_asphalt.png^streets_asphalt_dashed_line.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_dashed_line.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5},
{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:asphalt_dashed_line_stair 6",
recipe = {
{"","","streets:asphalt_dashed_line"},
{"","streets:asphalt_dashed_line","streets:asphalt_dashed_line"},
{"streets:asphalt_dashed_line","streets:asphalt_dashed_line","streets:asphalt_dashed_line"}
}
})
minetest.register_craft({
output = "streets:asphalt_dashed_line_stair 6",
recipe = {
{"streets:asphalt_dashed_line","",""},
{"streets:asphalt_dashed_line","streets:asphalt_dashed_line",""},
{"streets:asphalt_dashed_line","streets:asphalt_dashed_line","streets:asphalt_dashed_line"}
}
})
-- Slab
minetest.register_node(":streets:asphalt_dashed_line_slab",{
description = streets.S("Asphalt slab"),
tiles = {"streets_asphalt.png^streets_asphalt_dashed_line.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_dashed_line.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5}
}
}
})
minetest.register_craft({
output = "streets:asphalt_dashed_line_slab 3",
recipe = {
{"","",""},
{"","",""},
{"streets:asphalt_dashed_line","streets:asphalt_dashed_line","streets:asphalt_dashed_line"}
}
})
-- Asphalt outer line
minetest.register_node(":streets:asphalt_side_stair_l",{
description = streets.S("Asphalt stair"),
tiles = {"streets_asphalt.png^streets_asphalt_side.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_side.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5},
{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}
}
}
})
minetest.register_node(":streets:asphalt_side_stair_r",{
description = streets.S(streets.S("Asphalt stair")),
tiles = {"streets_asphalt.png^streets_asphalt_side_r.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_side_r.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
drop = "streets:asphalt_side_stair_l",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5},
{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:asphalt_side_stair_l 6",
recipe = {
{"","","streets:asphalt_side"},
{"","streets:asphalt_side","streets:asphalt_side"},
{"streets:asphalt_side","streets:asphalt_side","streets:asphalt_side"}
}
})
minetest.register_craft({
output = "streets:asphalt_side_stair_l 6",
recipe = {
{"streets:asphalt_side","",""},
{"streets:asphalt_side","streets:asphalt_side",""},
{"streets:asphalt_side","streets:asphalt_side","streets:asphalt_side"}
}
})
minetest.register_craft({
type = "shapeless",
output = "streets:asphalt_side_stair_r",
recipe = {"streets:asphalt_side_stair_l"}
})
minetest.register_craft({
type = "shapeless",
output = "streets:asphalt_side_stair_l",
recipe = {"streets:asphalt_side_stair_r"}
})
---------------------------------------------------------------------
minetest.register_node(":streets:asphalt_side_slab_l",{
description = streets.S(streets.S("Asphalt slab")),
tiles = {"streets_asphalt.png^streets_asphalt_side.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_side.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5}
}
}
})
minetest.register_node(":streets:asphalt_side_slab_r",{
description = streets.S(streets.S("Asphalt slab")),
tiles = {"streets_asphalt.png^streets_asphalt_side_r.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png","streets_asphalt.png^streets_asphalt_side_r.png"},
groups = {cracky = 3},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.0,0.5}
}
}
})
minetest.register_craft({
output = "streets:asphalt_side_slab_l 3",
recipe = {
{"","",""},
{"","",""},
{"streets:asphalt_side","streets:asphalt_side","streets:asphalt_side"}
}
})
minetest.register_craft({
type = "shapeless",
output = "streets:asphalt_side_r",
recipe = {"streets:asphalt_side_l"}
})
minetest.register_craft({
type = "shapeless",
output = "streets:asphalt_side_l",
recipe = {"streets:asphalt_side_r"}
})

View File

@ -0,0 +1,4 @@
default
streetsmod
stairs?
moreblocks?

View File

@ -0,0 +1,12 @@
--[[
StreetsMod: Concrete stairs (compatible to circular saw)
]]
if rawget(_G, "register_stair_slab_panel_micro")
and type(register_stair_slab_panel_micro) == "function" and streets.extendedBy.prefab == false then
register_stair_slab_panel_micro("streets", "concrete", "streets:concrete", {cracky=2}, {"streets_concrete.png"}, "Concrete", "concrete", nil)
table.insert(circular_saw.known_stairs,"streets:concrete")
minetest.register_alias("stairs:stair_concrete","streets:stair_concrete")
else
minetest.register_alias("stairs:stair_concrete","prefab:concrete_stair")
minetest.register_alias("stairs:slab_concrete","prefab:concrete_slab")
end

View File

@ -0,0 +1,3 @@
default
streetsmod
wool?

View File

@ -0,0 +1,70 @@
minetest.register_node(":streets:constructionfence_bottom",{
description = streets.S("Construction fence"),
tiles = {"streets_fence_fromtop.png","streets_fence_fromtop.png","streets_fence_fromtop.png","streets_fence_fromtop.png","streets_fence_bottom.png","streets_fence_bottom.png"},
groups = {cracky = 2, disable_jump = 1},
paramtype = "light",
inventory_image = "streets_fence_inv.png",
wield_image = "streets_fence_inv.png",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.1,0.5,0.0,0.1}, -- lower part
{-0.2,-0.0,-0.1,0.2,0.5,0.1} -- thing in the middle
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.1,0.5,1.0,0.1}
}
},
after_dig_node = function(pos,node,digger)
pos.y = pos.y + 1
minetest.remove_node(pos)
end,
after_place_node = function(pos,placer,itemstack)
pos.y = pos.y + 1
if minetest.get_node(pos).name == "air" then
minetest.add_node(pos,{name = "streets:constructionfence_top", param2 = minetest.dir_to_facedir(placer:get_look_dir())})
else
minetest.chat_send_player(placer:get_player_name(),"Not enough free space! A construction fence has a height of 2 blocks!")
end
end
})
minetest.register_node(":streets:constructionfence_top",{
description = streets.S("Construction fence"),
tiles = {"streets_fence_fromtop.png","streets_fence_fromtop.png","streets_fence_fromtop.png","streets_fence_fromtop.png","streets_fence_top.png","streets_fence_top.png"},
groups = {cracky = 2, not_in_creative_inventory = 1, disable_jump = 1},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
drop = "streets:constructionfence_bottom",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.1,0.5,0.0,0.1} -- upper part
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5,-1.5,-0.1,0.5,0.0,0.1}
}
},
after_dig_node = function(pos,node,digger)
pos.y = pos.y - 1
minetest.remove_node(pos)
end
})
minetest.register_craft({
output = "streets:constructionfence_bottom 8",
recipe = {
{"","",""},
{"","streets:sign_construction",""},
{"wool:red","wool:white","wool:red"}
}
})

View File

@ -0,0 +1,2 @@
default
streetsmod

View File

@ -0,0 +1,27 @@
--[[
StreetsMod: Delineator
]]
minetest.register_node(":streets:delineator", {
description = streets.S("Delineator"),
tiles = {"streets_delineator_top.png","streets_delineator.png"},
drawtype = "nodebox",
paramtype = "light",
groups = {cracky=3, oddly_breakable_by_hand=2},
light_source = 8,
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = {
{-0.1, -0.5, -0.1, 0.1, 0.5, 0.1},
},
}
})
minetest.register_craft({
output = "streets:delineator 4",
recipe = {
{"","",""},
{"","default:torch",""},
{"","default:fence_wood",""}
}
})

View File

@ -0,0 +1 @@
With the StreetsMod, you can build your own realistic streets with arrows, lines, manholes and many more cool stuff. You don't need any additional mod, but it's recommended to have stairs (default), wool (default) and bucket (default) installed. It's easy for you to enable/disable certain parts of this mod because it's organised as a modpack, which you can configure in Minetest's Main Menu -> Configure.

View File

@ -0,0 +1,3 @@
default
streetsmod
wool?

View File

@ -0,0 +1,25 @@
--[[
StreetsMod: Emergency Phone
]]
minetest.register_node(":streets:emergencyphone",{
description = streets.S("Emergency Phone"),
tiles = {"streets_sos_top.png","streets_sos_bottom.png","streets_sos_side.png","streets_sos_side.png","streets_sos_side.png","streets_sos_front.png"},
groups = {cracky = 3},
paramtype2 = "facedir",
light_source = 5,
on_rightclick = function(pos,node,clicker)
if clicker:is_player() and clicker:get_hp() < 6 then
clicker:set_hp(6)
minetest.log("action",clicker:get_player_name() .. " healed by emergency phone at pos " .. minetest.pos_to_string(pos) .. "")
end
end
})
minetest.register_alias("streets:emergency_phone","streets:emergencyphone")
minetest.register_craft({
output = "streets:emergencyphone",
recipe = {
{"wool:orange","default:torch","wool:orange"},
{"wool:orange","default:apple","wool:orange"},
{"default:steel_ingot","default:diamondblock","default:steel_ingot"}
}
})

View File

@ -0,0 +1,3 @@
default
streetsmod
wool?

View File

@ -0,0 +1,178 @@
--[[
StreetsMod: All kinds of asphalt with labels
]]
minetest.register_node(":streets:asphalt_sideline",{
description = streets.S("Asphalt with sideline"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_asphalt_side.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
minetest.register_alias("streets:asphalt_side","streets:asphalt_sideline")
minetest.register_craft({
output = "streets:asphalt_side 6",
recipe = {
{"dye:white","streets:asphalt","streets:asphalt"},
{"dye:white","streets:asphalt","streets:asphalt"},
{"dye:white","streets:asphalt","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_solid_line",{
description = streets.S("Asphalt with solid line"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_asphalt_solid_line.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
minetest.register_alias("streets:asphalt_middle","streets:asphalt_solid_line")
minetest.register_craft({
output = "streets:asphalt_solid_line 6",
recipe = {
{"streets:asphalt","dye:white","streets:asphalt"},
{"streets:asphalt","dye:white","streets:asphalt"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_dashed_line",{
description = streets.S("Asphalt with dashed line"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_asphalt_dashed_line.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
minetest.register_alias("streets:asphalt_middle_dashed","streets:asphalt_dashed_line")
minetest.register_craft({
output = "streets:asphalt_dashed_line 6",
recipe = {
{"streets:asphalt","dye:white","streets:asphalt"},
{"streets:asphalt","streets:asphalt","streets:asphalt"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_outer_edge",{
description = streets.S("Asphalt with sideline (edge)"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_asphalt_outer_edge.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_outer_edge 4",
recipe = {
{"dye:white","dye:white","dye:white"},
{"dye:white","streets:asphalt","streets:asphalt"},
{"dye:white","streets:asphalt","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_parking",{
description = streets.S("Asphalt with parking label"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_parking.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_parking 4",
recipe = {
{"streets:asphalt","dye:white","dye:white"},
{"streets:asphalt","dye:white","dye:white"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_arrow_straight",{
description = streets.S("Asphalt with arrow"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_arrow_straight.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_arrow_straight 4",
recipe = {
{"streets:asphalt","streets:asphalt","streets:asphalt"},
{"streets:asphalt","dye:white","streets:asphalt"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_arrow_left",{
description = streets.S("Asphalt with arrow"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_arrow_left.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_arrow_left 4",
recipe = {
{"streets:asphalt","streets:asphalt","streets:asphalt"},
{"dye:white","dye:white","streets:asphalt"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_arrow_right",{
description = streets.S("Asphalt with arrow"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_arrow_right.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_arrow_right 4",
recipe = {
{"streets:asphalt","streets:asphalt","streets:asphalt"},
{"streets:asphalt","dye:white","dye:white"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_arrow_straight_left",{
description = streets.S("Asphalt with arrow"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_arrow_straight_left.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_arrow_straight_left 4",
recipe = {
{"streets:asphalt","dye:white","streets:asphalt"},
{"dye:white","dye:white","streets:asphalt"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_arrow_straight_right",{
description = streets.S("Asphalt with arrow"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_arrow_straight_right.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_arrow_straight_right 4",
recipe = {
{"streets:asphalt","dye:white","streets:asphalt"},
{"streets:asphalt","dye:white","dye:white"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})
minetest.register_node(":streets:asphalt_arrow_alldirs",{
description = streets.S("Asphalt with arrow"),
groups = {cracky=3},
tiles = {"streets_asphalt.png^streets_arrow_alldirs.png","streets_asphalt.png"},
paramtype2 = "facedir"
})
-- no minetest.register_alias() needed
minetest.register_craft({
output = "streets:asphalt_arrow_alldirs 4",
recipe = {
{"streets:asphalt","dye:white","streets:asphalt"},
{"dye:white","dye:white","dye:white"},
{"streets:asphalt","dye:white","streets:asphalt"}
}
})

60
mods/streets/license.txt Normal file
View File

@ -0,0 +1,60 @@
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
1. Definitions
"Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
"Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined below) for the purposes of this License.
"Creative Commons Compatible License" means a license that is listed at http://creativecommons.org/compatiblelicenses that has been approved by Creative Commons as being essentially equivalent to this License, including, at a minimum, because that license: (i) contains terms that have the same purpose, meaning and effect as the License Elements of this License; and, (ii) explicitly permits the relicensing of adaptations of works made available under that license under this License or a Creative Commons jurisdiction license with the same License Elements as this License.
"Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
"License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike.
"Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
"Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
"Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
"Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
"Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
to Distribute and Publicly Perform Adaptations.
For the avoidance of doubt:
Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and,
Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License.
The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved.
4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested.
You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible License. If you license the Adaptation under one of the licenses mentioned in (iv), you must comply with the terms of that license. If you license the Adaptation under the terms of any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), you must comply with the terms of the Applicable License generally and the following provisions: (I) You must include a copy of, or the URI for, the Applicable License with every copy of each Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License; (III) You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License.
If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Ssection 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.
5. Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. Termination
This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
8. Miscellaneous
Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.

View File

@ -0,0 +1,2 @@
default
streetsmod

View File

@ -0,0 +1,88 @@
--[[
StreetsMod: Manholes in asphalt
]]
minetest.register_node(":streets:manhole",{
description = streets.S("Simple manhole"),
tiles = {"streets_asphalt.png^streets_manhole.png","streets_asphalt.png"},
groups = {cracky=3}
})
minetest.register_node(":streets:manhole_adv_closed",{
description = streets.S("Advanced manhole"),
tiles = {"streets_asphalt.png^streets_manhole_advanced.png","streets_asphalt.png"},
groups = {cracky=3},
drawtype = "nodebox",
paramtype = "light",
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = {
--Walls
{-0.5,-0.5,-0.5,-0.3,0.5,0.5},
{-0.5,-0.5,-0.5,0.5,0.5,-0.3},
{0.3,-0.5,-0.5,0.5,0.5,0.5},
{-0.5,-0.5,0.3,0.5,0.5,0.5},
--Cover
{-0.5,0.4,-0.1,0.5,0.5,0.1},
{-0.1,0.4,-0.5,0.1,0.5,0.5},
{-0.2,0.4,-0.2,0.2,0.5,0.2}
}
},
selection_box = {
type = "regular",
},
on_rightclick = function(pos,node,clicker)
minetest.set_node(pos,{name="streets:manhole_adv_open"})
end
})
minetest.register_node(":streets:manhole_adv_open",{
description = streets.S("Advanced manhole"),
tiles = {"streets_asphalt.png^streets_manhole_advanced.png","streets_asphalt.png"},
groups = {cracky=3,not_in_creative_inventory=1},
drawtype = "nodebox",
paramtype = "light",
drop = "streets:manhole_adv_closed",
climbable = true,
walkable = false,
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = {
--Walls
{-0.5,-0.5,-0.5,-0.3,0.5,0.5},
{-0.5,-0.5,-0.5,0.5,0.5,-0.3},
{0.3,-0.5,-0.5,0.5,0.5,0.5},
{-0.5,-0.5,0.3,0.5,0.5,0.5},
}
},
selection_box = {
type = "fixed",
fixed = {
--Walls
{-0.5,-0.5,-0.5,-0.3,0.5,0.5},
{-0.5,-0.5,-0.5,0.5,0.5,-0.3},
{0.3,-0.5,-0.5,0.5,0.5,0.5},
{-0.5,-0.5,0.3,0.5,0.5,0.5},
}
},
on_rightclick = function(pos,node,clicker)
minetest.set_node(pos,{name="streets:manhole_adv_closed"})
end
})
minetest.register_craft({
output = "streets:manhole_adv_closed 2",
recipe = {
{"streets:asphalt", "default:steel_ingot", "streets:asphalt"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"streets:asphalt", "default:steel_ingot", "streets:asphalt"}
}
})
minetest.register_craft({
output = "streets:manhole 3",
recipe = {
{"streets:asphalt", "streets:asphalt", "streets:asphalt"},
{"streets:asphalt", "default:steel_ingot", "streets:asphalt"},
{"streets:asphalt", "streets:asphalt", "streets:asphalt"}
}
})

1
mods/streets/modpack.txt Normal file
View File

@ -0,0 +1 @@
This file indicates that the current folder is a modpack. Please also read readme.txt for more information.

BIN
mods/streets/readme.txt Normal file

Binary file not shown.

View File

@ -0,0 +1,2 @@
default
streetsmod?

View File

@ -0,0 +1,42 @@
--[[
StreetsMod: Poles and signs
]]
streets.workshop = {}
streets.workshop.register_sign = function(nodename, desc, img, rrecipe, rtime)
minetest.register_node(nodename,{
description = desc,
tiles = {img},
inventory_image = img,
wield_image = img,
groups = {snappy = 1,attached_node = 1},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", desc)
end,
drawtype = "nodebox",
node_box = {
type = "wallmounted",
fixed = {
{-0.4,-0.5,-0.4,0.4,-0.4,0.4}
}
},
paramtype = "light",
paramtype2 = "wallmounted",
walkable = false,
sunlight_propagates = true,
selection_box = {
type = "wallmounted"
},
streets = {
signworkshop = {
recipe = rrecipe,
time = rtime
}
}
})
end
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/signs.lua")
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/workshop.lua")

View File

@ -0,0 +1,17 @@
-- example: streets.workshop.register_sign(nodename, desc, img, recipe, time)
streets.workshop.register_sign(":streets:sign_blank", streets.S("Empty sign"), "streets_sign_back.png", {"default:steel_ingot","","",""}, 3)
streets.workshop.register_sign(":streets:sign_lava", streets.S("Warning sign (lava)"), "streets_sign_lava.png", {"streets:sign_blank","bucket:bucket_lava","",""}, 5)
streets.workshop.register_sign(":streets:sign_water", streets.S("Warning sign (water)"), "streets_sign_water.png", {"streets:sign_blank","bucket:bucket_water","",""}, 5)
streets.workshop.register_sign(":streets:sign_construction", streets.S("Warning sign (Construction area)"), "streets_sign_construction.png", {"streets:sign_blank","default:dirt","",""}, 5)
streets.workshop.register_sign(":streets:sign_mine", streets.S("Notice sign (Public Mine Ahead)"), "streets_sign_mine.png", {"streets:sign_blank","default:dirt","",""}, 5)
streets.workshop.register_sign(":streets:sign_shop", streets.S("Notice sign (Shop/Mall Ahead)"), "streets_sign_construction.png", {"streets:sign_blank","default:dirt","",""}, 5)
streets.workshop.register_sign(":streets:sign_workshop", streets.S("Notice sign (Public Workshop Ahead)"), "streets_sign_workshop.png", {"streets:sign_blank","default:dirt","",""}, 5)
streets.workshop.register_sign(":streets:sign_grasswalk", streets.S("Warning sign (No walking on the grass)"), "streets_sign_grasswalk.png", {"streets:sign_blank","default:dirt","",""}, 5)

View File

@ -0,0 +1,158 @@
--[[
StreetsMod: Create signs in the signworkshop
]]
local forms = {
inactive = {
"size[12,10]",
"label[3.5,0;"..streets.S("Sign workshop - Create signs for your roads!").."]",
"label[0,0.5;"..streets.S("Available signs:").."]",
"list[context;streets:signworkshop_list;0,1;5,4]",
"label[9,0.5;"..streets.S("Needed stuff:").."]",
"list[context;streets:signworkshop_recipe;8,1;4,1]",
"label[9,2;"..streets.S("Put it here:").."]",
"list[context;streets:signworkshop_input;8,3;4,1]",
"button[8,4;2,1;streets:signworkshop_send;"..streets.S("Start!").."]",
"label[5.8,0.5;"..streets.S("Selected:").."]",
"list[context;streets:signworkshop_select;6,1;1,1]",
"label[5.8,2.5;"..streets.S("Output:").."]",
"list[context;streets:signworkshop_output;6,3;1,1]",
"list[current_player;main;2,6;8,1]",
"list[current_player;main;2,7.25;8,3;8]",
default.gui_bg,
default.gui_bg_img,
default.gui_slots,
default.get_hotbar_bg(2, 6)
},
active = {
"size[12,10]",
"label[3.5,0;"..streets.S("Sign workshop - Create signs for your roads!").."]",
"label[0,0.5;"..streets.S("Available signs:").."]",
"list[context;streets:signworkshop_list;0,1;5,4]",
"label[9,0.5;"..streets.S("Needed stuff:").."]",
"list[context;streets:signworkshop_recipe;8,1;4,1]",
"label[9,2;"..streets.S("Put it here:").."]",
"list[context;streets:signworkshop_input;8,3;4,1]",
"label[5.8,0.5;"..streets.S("Selected:").."]",
"list[context;streets:signworkshop_select;6,1;1,1]",
"label[5.8,2.5;"..streets.S("Output:").."]",
"list[context;streets:signworkshop_output;6,3;1,1]",
"list[current_player;main;2,6;8,1]",
"list[current_player;main;2,7.25;8,3;8]",
default.gui_bg,
default.gui_bg_img,
default.gui_slots,
default.get_hotbar_bg(2, 6),
--
}
}
streets.workshop.signs = {}
minetest.after(0, function()
for k, v in pairs(minetest.registered_nodes) do
if v.streets and v.streets.signworkshop then
table.insert(streets.workshop.signs, k)
end
end
end)
minetest.register_node(":streets:signworkshop",{
description = streets.S("Sign workshop"),
tiles = {"streets_signworkshop_top.png","streets_signworkshop_bottom.png","streets_signworkshop_side.png","streets_signworkshop_side.png","streets_signworkshop_side.png","streets_signworkshop_front.png"},
groups = {cracky = 1, level = 2},
paramtype2 = "facedir",
after_place_node = function(pos)
minetest.get_meta(pos):set_string("formspec",table.concat(forms.inactive))
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("streets:signworkshop_list",5*4)
inv:set_size("streets:signworkshop_recipe",3*2)
inv:set_size("streets:signworkshop_input",4*1)
inv:set_size("streets:signworkshop_select",1*1)
inv:set_size("streets:signworkshop_output",1*1)
-- Fill
for k, v in pairs(streets.workshop.signs) do
inv:add_item("streets:signworkshop_list", v)
end
-- Meta
meta:set_string("infotext",streets.S("Sign workshop idle"))
meta:set_string("idle","y")
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname ~= "streets:signworkshop_input" then
return 0
else
return 1
end
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
-- Move items inside input slots
if to_list == "streets:signworkshop_input" and from_list == "streets:signworkshop_input" then
return 1
-- List -> selection
elseif from_list == "streets:signworkshop_list" and to_list == "streets:signworkshop_select" then
local inv = minetest.get_meta(pos):get_inventory()
local selected = inv:get_stack("streets:signworkshop_list",from_index):to_table()
local need = minetest.registered_nodes[selected.name].streets.signworkshop.recipe
inv:set_list("streets:signworkshop_recipe",{need[1],need[2],need[3],need[4]})
return 1
-- selection -> list
elseif from_list == "streets:signworkshop_select" and to_list == "streets:signworkshop_list" then
local inv = minetest.get_meta(pos):get_inventory()
inv:set_list("streets:signworkshop_recipe",{"","","",""})
return 1
-- Every other case
else
return 0
end
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if listname == "streets:signworkshop_input" or listname == "streets:signworkshop_output" then
return 99
else
return 0
end
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
--
if inv:is_empty("streets:signworkshop_input") ~= true and inv:is_empty("streets:signworkshop_select") ~= true and meta:get_string("idle") == "y" then
local selection = inv:get_stack("streets:signworkshop_select",1):get_name()
local def = minetest.registered_nodes[selection].streets.signworkshop
local need = inv:get_list("streets:signworkshop_recipe")
local has = inv:get_list("streets:signworkshop_input")
for k, v in pairs(need) do
need[k] = need[k]:to_table()
if need[k] == nil then need[k] = { name = "" } end
end
for k, v in pairs(has) do
has[k] = has[k]:to_table()
if has[k] == nil then has[k] = { name = "" } end
end
if need[1].name == has[1].name and need[2].name == has[2].name and need[3].name == has[3].name and need[4].name == has[4].name then
meta:set_string("infotext",streets.S("Sign workshop working"))
meta:set_string("idle","n")
meta:set_string("formspec",table.concat(forms.active) .. "label[8,4;"..streets.S("Please wait %s seconds..."):format(def.time).."]")
-- Clear input
inv:set_list("streets:signworkshop_input",{"","","",""})
minetest.after(def.time,function()
-- Reset infotext and meta
meta:set_string("infotext",streets.S("Sign workshop idle"))
meta:set_string("idle","y")
meta:set_string("formspec",table.concat(forms.inactive))
-- Fill output
inv:add_item("streets:signworkshop_output",selection)
end)
end
end
end
})
minetest.register_craft({
output = "streets:signworkshop",
recipe = {
{"default:steel_ingot","default:glass","default:steel_ingot"},
{"default:steel_ingot","default:diamond","default:steel_ingot"},
{"default:cobble","default:cobble","default:cobble"}
}
})

View File

@ -0,0 +1,3 @@
default
streetsmod
wool?

View File

@ -0,0 +1,353 @@
--[[
StreetsMod: Yellow labels for construction areas on roads,
which "override" the white ones.
Construction area fence.
]]
local box = {-0.5,-0.5,-0.5,0.5,-0.45,0.5}
minetest.register_node(":streets:rw_asphalt_solid",{
description = streets.S("Solid line (yellow)"),
tiles = {"streets_rw_solid_line.png","streets_rw_solid_line_curve.png","streets_rw_solid_line_tjunction.png","streets_rw_solid_line_crossing.png"},
drawtype = "raillike",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_solid_line.png",
wield_image = "streets_rw_solid_line.png",
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
}
})
minetest.register_node(":streets:rw_asphalt_dashed",{
description = streets.S("Dashed line (yellow)"),
tiles = {"streets_rw_dashed_line.png","streets_rw_dashed_line_curve.png","streets_rw_dashed_line_tjunction.png","streets_rw_dashed_line_crossing.png"},
drawtype = "raillike",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_dashed_line.png",
wield_image = "streets_rw_dashed_line.png",
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
}
})
minetest.register_node(":streets:rw_cross",{
description = streets.S("Cross (yellow)"),
tiles = {"streets_rw_cross.png"},
drawtype = "signlike",
paramtype = "light",
paramtype2 = "wallmounted",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_cross.png",
wield_image = "streets_rw_cross.png",
selection_box = {
type = "wallmounted"
}
})
minetest.register_node(":streets:rw_outer_edge",{
description = streets.S("Outer edge (yellow)"),
tiles = {"streets_rw_outer_edge.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_outer_edge.png",
wield_image = "streets_rw_outer_edge.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_parking",{
description = streets.S("Parking (yellow)"),
tiles = {"streets_rw_parking.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_parking.png",
wield_image = "streets_rw_parking.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_alldirs",{
description = streets.S("Arrow (yellow)"),
tiles = {"streets_rw_arrow_alldirs.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_arrow_alldirs.png",
wield_image = "streets_rw_arrow_alldirs.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_left",{
description = streets.S("Arrow (yellow)"),
tiles = {"streets_rw_arrow_left.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_arrow_left.png",
wield_image = "streets_rw_arrow_left.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_right",{
description = streets.S("Arrow (yellow)"),
tiles = {"streets_rw_arrow_right.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_arrow_right.png",
wield_image = "streets_rw_arrow_right.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_straight_right",{
description = streets.S("Arrow (yellow)"),
tiles = {"streets_rw_arrow_straight_right.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_arrow_straight_right.png",
wield_image = "streets_rw_arrow_straight_right.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_straight_left",{
description = streets.S("Arrow (yellow)"),
tiles = {"streets_rw_arrow_straight_left.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_arrow_straight_left.png",
wield_image = "streets_rw_arrow_straight_left.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_straight",{
description = streets.S("Arrow (yellow)"),
tiles = {"streets_rw_arrow_straight.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_arrow_straight.png",
wield_image = "streets_rw_arrow_straight.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_node(":streets:rw_sideline",{
description = streets.S("Sideline (yellow)"),
tiles = {"streets_rw_asphalt_side.png","streets_rw_transparent.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy = 3,attached_node = 1,oddly_breakable_by_hand = 1},
sunlight_propagates = true,
walkable = false,
inventory_image = "streets_rw_asphalt_side.png",
wield_image = "streets_rw_asphalt_side.png",
node_box = {
type = "fixed",
fixed = box
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}
}
})
minetest.register_craft({
output = "streets:rw_asphalt_solid 3",
recipe = {
{"","dye:yellow",""},
{"","dye:yellow",""},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_sideline 3",
recipe = {
{"dye:yellow","dye:yellow",""},
{"dye:yellow","dye:yellow",""},
{"dye:yellow","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_asphalt_dashed 3",
recipe = {
{"","dye:yellow",""},
{"","",""},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_cross 3",
recipe = {
{"dye:yellow","","dye:yellow"},
{"","dye:yellow",""},
{"dye:yellow","","dye:yellow"}
}
})
minetest.register_craft({
output = "streets:rw_outer_edge 3",
recipe = {
{"dye:yellow","dye:yellow","dye:yellow"},
{"dye:yellow","",""},
{"dye:yellow","",""}
}
})
minetest.register_craft({
output = "streets:rw_parking 3",
recipe = {
{"","dye:yellow","dye:yellow"},
{"","dye:yellow","dye:yellow"},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_alldirs 3",
recipe = {
{"","dye:yellow",""},
{"dye:yellow","dye:yellow","dye:yellow"},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_left 3",
recipe = {
{"","",""},
{"dye:yellow","dye:yellow",""},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_right 3",
recipe = {
{"","",""},
{"","dye:yellow","dye:yellow"},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_straight_left 3",
recipe = {
{"","dye:yellow",""},
{"dye:yellow","dye:yellow",""},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_straight_right 3",
recipe = {
{"","dye:yellow",""},
{"","dye:yellow","dye:yellow"},
{"","dye:yellow",""}
}
})
minetest.register_craft({
output = "streets:rw_straight 3",
recipe = {
{"","",""},
{"","dye:yellow",""},
{"","dye:yellow",""}
}
})

BIN
mods/streets/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 KiB

View File

@ -0,0 +1,2 @@
default
streetsmod

View File

@ -0,0 +1,20 @@
--[[
StreetsMod: Steel support for hanging signs on highways etc.
]]
minetest.register_node(":streets:steel_support",{
description = streets.S("Steel support"),
tiles = {"streets_support.png"},
groups = {cracky = 1},
drawtype = "glasslike_framed",
climbable = true,
sunlight_propagates = true,
paramtype = "light",
})
minetest.register_craft({
output = "streets:steel_support 5",
recipe = {
{"default:steel_ingot","","default:steel_ingot"},
{"","default:steel_ingot",""},
{"default:steel_ingot","","default:steel_ingot"}
}
})

View File

@ -0,0 +1,3 @@
default
streetsmod
mesecons?

View File

@ -0,0 +1,128 @@
--[[
StreetsMod: Streetlamps
]]
--[[minetest.register_node(":streets:streetlamp_basic_controller",{
description = streets.S("Trafficlight"),
tiles = {"streets_lampcontroller_top.png","streets_lampcontroller_bottom.png","streets_lampcontroller_sides.png"},
groups = {cracky = 1, not_in_creative_inventory = 1},
drawtype = "nodebox",
paramtype = "light",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.5,0.5},
{-0.05,0.5,-0.05,0.05,1.6,0.05}
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,0.5,0.5},
{-0.3,1.5,-0.3,0.3,4.5,0.3}
}
},
mesecons = {
effector = {
action_on = function(pos,node)
minetest.set_node({x = pos.x, y = pos.y + 4, z = pos.z},{name = "streets:streetlamp_basic_top_on"})
end,
action_off = function(pos,node)
minetest.set_node({x = pos.x, y = pos.y + 4, z = pos.z},{name = "streets:streetlamp_basic_top_off"})
end
}
},
after_dig_node = function(pos)
minetest.remove_node({x = pos.x, y = pos.y + 2, z = pos.z})
minetest.remove_node({x = pos.x, y = pos.y + 3, z = pos.z})
minetest.remove_node({x = pos.x, y = pos.y + 4, z = pos.z})
minetest.chat_send_all("!!!")
end
})]]
minetest.register_node(":streets:streetlamp_basic_bottom",{
drop = "",
description = streets.S("Street lamp"),
tiles = {"streets_lamps_basic_bottom.png"},
inventory_image = "streets_lamps_basi_inv.png",
groups = {cracky = 1},
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.15,-0.5,-0.15,0.15,0.4,0.15},
{-0.1,0.4,-0.1,0.1,0.5,0.1}
}
},
pointable = false,
after_place_node = function(pos,placer,itemstack)
minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z},{name = "streets:streetlamp_basic_middle"})
minetest.set_node({x = pos.x, y = pos.y + 2, z = pos.z},{name = "streets:streetlamp_basic_top_on"})
-- minetest.set_node({x = pos.x, y = pos.y - 2, z = pos.z},{name = "streets:streetlamp_basic_controller"})
end
})
minetest.register_node(":streets:streetlamp_basic_middle",{
drop = "",
description = streets.S("U cheater U"),
groups = {cracky = 1, not_in_creative_inventory = 1},
tiles = {"streets_lamps_basic_middle.png"},
paramtype = "light",
drawtype = "nodebox",
pointable = false,
node_box = {
type = "fixed",
fixed = {
{-0.1,-0.5,-0.1,0.1,0.5,0.1}
}
}
})
--[[minetest.register_node(":streets:streetlamp_basic_top_off",{
drop = "",
description = streets.S("U cheater U"),
groups = {cracky = 1, not_in_creative_inventory = 1},
paramtype = "light",
drawtype = "nodebox",
pointable = false,
node_box = {
type = "fixed",
fixed = {
{-0.1,-0.5,-0.1,0.1,-0.4,0.1},
{-0.3,-0.4,-0.3,0.3,0.5,0.3}
}
}
})]]
minetest.register_node(":streets:streetlamp_basic_top_on",{
drop = "streets:streetlamp_basic_bottom",
description = streets.S("U cheater U"),
groups = {cracky = 1, not_in_creative_inventory = 1},
tiles = {"streets_lamps_basic_top_top.png","streets_lamps_basic_top_top.png","streets_lamps_basic_top.png","streets_lamps_basic_top.png","streets_lamps_basic_top.png","streets_lamps_basic_top.png"},
paramtype = "light",
drawtype = "nodebox",
light_source = 10,
node_box = {
type = "fixed",
fixed = {
{-0.1,-0.5,-0.1,0.1,-0.4,0.1},
{-0.3,-0.4,-0.3,0.3,0.5,0.3}
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.3,0.5,-0.3,0.3,-2.5,0.3},
}
},
after_dig_node = function(pos)
minetest.remove_node({x = pos.x, y = pos.y - 1, z = pos.z})
minetest.remove_node({x = pos.x, y = pos.y - 2, z = pos.z})
end
})
minetest.register_craft({
output = "streets:streetlamp_basic_bottom",
recipe = {
{"","default:torch",""},
{"","default:stick",""},
{"","default:stick",""}
}
})

View File

@ -0,0 +1,2 @@
streetsmod
awards?

View File

@ -0,0 +1,22 @@
if streets.extendedBy.awards == true then
awards.register_achievement("award_countryroads",{
title = "Roadbuilder",
description = "You built some quite big roads!",
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "streets:asphalt",
target = 175,
},
})
awards.register_achievement("award_underworld",{
title = "Start your sewers!",
description = "You placed your first manhole! Did you know that you can open it with a right-click?",
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "streets:manhole_adv_closed",
target = 1,
},
})
end

View File

@ -0,0 +1,2 @@
default
streetsmod

View File

@ -0,0 +1,156 @@
--[[
StreetsMod: Concrete, Concrete wall (flat), Concrete wall (full)
]]
if streets.extendedBy.technic == true then
minetest.register_alias("streets:concrete","technic:concrete")
-- Use technic's concrete block for the seperating wall
minetest.register_node(":streets:concrete_wall",{
description = streets.S("Concrete wall"),
tiles = {"technic_concrete_block.png"},
groups = {cracky=2},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.4, -0.5, -0.5, 0.4, -0.4, 0.5},
{-0.1, -0.4, -0.5, 0.1, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:concrete_wall 3",
recipe = {
{"","technic:concrete",""},
{"","technic:concrete",""},
{"technic:concrete","technic:concrete","technic:concrete"}
}
})
minetest.register_node(":streets:concrete_wall_flat",{
description = streets.S("Concrete wall"),
tiles = {"technic_concrete_block.png"},
groups = {cracky=2},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.1, -0.5, -0.5, 0.1, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:concrete_wall_flat 3",
recipe = {
{"","technic:concrete",""},
{"","technic:concrete",""},
{"","",""}
}
})
elseif streets.extendedBy.prefab then
minetest.register_alias("streets:concrete","prefab:concrete")
minetest.register_node(":streets:concrete_wall",{
description = streets.S("Concrete wall"),
tiles = {"prefab_concrete.png"},
groups = {cracky=2},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.4, -0.5, -0.5, 0.4, -0.4, 0.5},
{-0.1, -0.4, -0.5, 0.1, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:concrete_wall 3",
recipe = {
{"","streets:concrete",""},
{"","streets:concrete",""},
{"streets:concrete","streets:concrete","streets:concrete"}
}
})
minetest.register_node(":streets:concrete_wall_flat",{
description = streets.S("Concrete wall"),
tiles = {"prefab_concrete.png"},
groups = {cracky=2},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.1, -0.5, -0.5, 0.1, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:concrete_wall_flat 3",
recipe = {
{"","streets:concrete",""},
{"","streets:concrete",""},
{"","",""}
}
})
else
-- Register concrete block with streets' texture and then the seperating wall
minetest.register_node(":streets:concrete",{
description = streets.S("Concrete"),
tiles = {"streets_concrete.png"},
groups = {cracky=2}
})
minetest.register_node(":streets:concrete_wall",{
description = streets.S("Concrete wall"),
tiles = {"streets_concrete.png"},
groups = {cracky=2},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.4, -0.5, -0.5, 0.4, -0.4, 0.5},
{-0.1, -0.4, -0.5, 0.1, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:concrete_wall 3",
recipe = {
{"","streets:concrete",""},
{"","streets:concrete",""},
{"streets:concrete","streets:concrete","streets:concrete"}
}
})
minetest.register_node(":streets:concrete_wall_flat",{
description = streets.S("Concrete wall"),
tiles = {"streets_concrete.png"},
groups = {cracky=2},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.1, -0.5, -0.5, 0.1, 0.5, 0.5}
}
}
})
minetest.register_craft({
output = "streets:concrete_wall_flat 3",
recipe = {
{"","streets:concrete",""},
{"","streets:concrete",""},
{"","",""}
}
})
minetest.register_craft({
type = "shapeless",
output = "streets:concrete",
recipe = {"default:stone"}
})
end

View File

@ -0,0 +1 @@
streetsmod

View File

@ -0,0 +1,9 @@
--[[
StreetsMod Hotfixes in order of creation, signed with date
]]
-- Hotfix #1; April 14, 2014; https://github.com/webdesigner97/streets/issues/11
minetest.register_alias("stairs:stair_asphalt","streets:stair_asphalt")
-- Hotfix #2; June 27, 2014; https://github.com/webdesigner97/streets/issues/25
minetest.register_alias("streets:asphalt_stair","streets:stair_asphalt")
minetest.register_alias("streets:asphalt_slab","streets:slab_asphalt")

View File

@ -0,0 +1,3 @@
default
intllib?
smartfs?

View File

@ -0,0 +1,4 @@
-- Form for chatcommand /streets
streets.forms.chatcmd = smartfs.create("streets:chatcmd", function(state)
state:load(streets.modpath .. "/forms/cmd_streets.smartfs")
end)

View File

@ -0,0 +1 @@
return { ["ele"] = { ["streets:chatcmd_version"] = { ["type"] = "label", ["pos"] = { ["y"] = 1, ["x"] = 6.5 }, ["name"] = "streets:chatcmd_version", ["value"] = "Running version: 1.4.4dev" }, ["streets:chatcmd_guibg"] = { ["type"] = "code", ["name"] = "streets:chatcmd_guibg", ["code"] = "bgcolor[#080808BB;true]background[5,5;1,1;gui_formbg.png;true]" }, ["streets:chatcmd_modlist"] = { ["pos"] = { ["y"] = 1, ["x"] = 0 }, ["size"] = { ["h"] = 5, ["w"] = 6 }, ["type"] = "list", ["name"] = "streets:chatcmd_modlist", ["items"] = { "digilines installed: false", "mesecons installed: false", "moreblocks installed: false", "wool installed: true", "technic installed: false", "prefab installed: false", "awards installed: false" } } }, ["size"] = { ["h"] = 6, ["w"] = 10 } }

View File

@ -0,0 +1,89 @@
--[[
StreetsMod 1.5 by webdesigner97:
License : CC-BY-SA 3.0 Unported (see license.txt)
Readme : see readme.txt
Forum : http://bit.ly/12cPMeo
Depends : default
]]
streets = {}
-- Kaeza intllib
-- Boilerplate to support localized strings if intllib mod is installed.
if minetest.get_modpath("intllib") then
streets.S = intllib.Getter()
else
streets.S = function(s) return s end
end
-- Create variable and tables
print("Streets: " .. streets.S("Creating variables and tables..."))
streets.version = "1.5"
streets.modpath = minetest.get_modpath("streetsmod")
streets.extendedBy = {}
streets.load = {
start = os.clock(),
fin = 0
}
streets.forms = {}
-- rubenwardy: smartfs
if not minetest.get_modpath("smartfs") then
dofile(streets.modpath .. "/libs/smartfs/smartfs.lua")
end
-- Load forms
dofile(streets.modpath .. "/forms.lua")
-- Check for mods which change this mod's beahaviour
print("Streets: " .. streets.S("Checking installed mods..."))
if minetest.get_modpath("wool") then
streets.extendedBy.wool = true
else
streets.extendedBy.wool = false
end
if minetest.get_modpath("technic") then
streets.extendedBy.technic = true
else
streets.extendedBy.technic = false
end
if minetest.get_modpath("moreblocks") then
streets.extendedBy.moreblocks = true
else
streets.extendedBy.moreblocks = false
end
if minetest.get_modpath("mesecons") then
streets.extendedBy.mesecons = true
else
streets.extendedBy.mesecons = false
end
if minetest.get_modpath("digilines") then
streets.extendedBy.digilines = true
else
streets.extendedBy.digilines = false
end
if minetest.get_modpath("prefab") then
streets.extendedBy.prefab = true
else
streets.extendedBy.prefab = false
end
if minetest.get_modpath("awards") then
streets.extendedBy.awards = true
else
streets.extendedBy.awards = false
end
-- Streets chatcommand
local function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
minetest.register_chatcommand("streets",{
description = streets.S("Check version of your installed StreetsMod and find information"),
func = function(name,param)
streets.forms.chatcmd:show(name);
end
})
-- Done
print("Streets: " .. streets.S("Setup completed, have fun with StreetsMod") .. " " .. streets.version .. "!")
streets.load.fin = os.clock()

View File

@ -0,0 +1,88 @@
smartfs
=======
This mod provides a 2nd generation way of creating forms - this means that the modder does not need to worry about complex formspec strings
* Expandable: you can register your own elements to use on the form.
* Easy event handling: use binding to handle events.
* New elements: Includes a toggle button
License: WTFPL
To install this library, place the smartfs.lua file in your mod and then include it (dofile).
There is an init.lua file in the download that shows you how to do this.
#Using Smart Formspec
Smartfs provides 2nd generation Minetest forms to replace clunky formspec strings. Each smartfs form is a container filled with GUI elements. A number of default elements are included with smartfs, but modders can also define their own custom elements. This document describes the basic usage of the smartfs API.
##Installation
Smartfs can be used as a library or a mod.
To use smartfs as a library, copy the smartfs.lua file to your mod folder and add
dofile(minetest.get\_modpath(minetest.get\_current\_modname()).."/smartfs.lua")
to the top of any files that use it.
To use smartfs as a mod, add it to your game's mods folder or to the user mods folder and enable it.
## Creating and showing forms
A form is a rectangular area of the screen upon which all elements are placed. Use the smartfs.create() function to create a new form. This function takes two arguments and returns a form object.
The first argument is a unique string that identifies the form. The second argument is a function that should take a single argument called state which is used to set form properties like size and background color. State also has constructors for all form elements and can be used with state:element_name. Below is a quick example.
myform = smartfs.create("My Form",function(state)
--sets the form's size
-- (width, hieght)
state:size(5,5)
--creates a label and places it on the form
--(x-pos, y-pos, name, text)
state:label(3,3,"label1", "A label!")
end)
Forms can be shown to the player by using the show(target) function. The target argument is the name of the player that will see the form.
myform:show("singleplayer")
Here is a list of steps the library takes.
* You create a new form using smartfs.create().
* The form is registered and stored for later use.
* You show a form to a player using the myform:show()
* The state is created and stored.
* The function in smartfs.create runs and creates the elements.
* The form is displayed to the player.
## Modifying Elements
Elements have functions of the form element:function(args) where you need to have access to the element object.
You can get the element object by assigning a variable to its creation function like so:
local button1 = state:button(0,0, 1,4, "btn1", "A button")
--button1 is now a table representing the button
You can also get the element by using state:get(name). The example below will retrieve a button with the name "btn1":
button1 = state:get("btn1")
--or
state:get("btn1"):onClick(your\_onclick\_function
Both of these methods should be used inside the form creation callback function, the function you pass to smartfs.create, or in event callbacks.
Now that you have located your element you can modify it.
button1:setPos(4,0)
## Inventory Support
Smartfs supports adding a button to Inventory+ or Unified Inventory which will open one of your own custom forms. Use the smartfs.add\_to\_inventory(form, icon, title) function where form is the smartfs form linked to by the button, icon is the button image (only for unified inventory), and title is the button text (only for inventory+).
smartfs.add_to_inventory(form, icon, title)
## Dynamic forms
Dynamic forms allow you to make a form without having to register it before the game finished loading.
local state = smartfs.dynamic("smartfs:dyn_form", name)
state:load(minetest.get_modpath("smartfs").."/example.smartfs")
state:get("btn"):click(function(self,state)
print("Button clicked!")
end)
state:show()
Make sure you call state:show()

View File

@ -0,0 +1,107 @@
#Full API
##Smartfs
* smartfs( name ) - returns the form regisered with the name 'name'
* smartfs.create( name,function ) - creates a new form and adds elements to it by running the function. Use before Minetest loads. (like minetest.register_node)
* smartfs.element( name, data ) - creates a new element type.
* smartfs.dynamic( formname, playername ) - creates a dynamic form. Returns state. See example.lua for example. Remember to call state:show()
* smartfs.add\_to\_inventory(form, icon, title) - Adds a form to an installed advanced inventory. Returns true on success.
* smartfs.inventory_mod() - Returns the name of an installed and supported inventory mod that will be used above, or null.
* smartfs.override\_load\_checks() - Allows you to use smartfs.create after the game loads. Not recommended!
##Form
* form:show( playername [, parameters] ) - shows the form to a player. See state.param.
* form.name - the name of the form.
##State
### Methods
* state:size( width,height ) - sets the forms width and height.
* state:get( name ) - gets an element by name.
* state:show() - reshows the form to the player.
* state:close() - closes the form (does not work yet, due to no MT api support).
* state:load( filepath ) - Loads elements from a file.
* state:save( filepath ) - Saves elements to a file.
* state:button( x,y,w,h,name,text [, exit_on_click] ) - create a new button at x,y with name and caption (text)
* ^ optional: exit_on_click - set to true to exit the form when the button is clicked. ( Also see button.setClose() )
* state:toggle( x,y,w,h,name,list ) - create a new toggle button at x,y with name and possible list of values
* state:label( x,y,name,text ) - create a new label at x,y with name and caption (text)
* state:field( x,y,w,h,name,label ) - create a new field at x,y with label
* state:pwdfield( x,y,w,h,name,label ) - create a password field
* state:textarea( x,y,w,h,name,label ) - create a new textarea
* state:image( x,y,w,h,name,imagepath ) - create an image box.
* state:inventory( x,y,w,h,name ) - create an inventory listing (use 'main' as name for the main player inventory)
* state:checkbox( x,y,name,label,selected ) - create a check box.
* state:element( element_type, data ) - Semi-private, create an element with type and data.
### Variables
* state.player - The name of the player.
* state.param - The parameters supplied by form:show.
* state.def - The form definition.
* state.is_inv - Boolean which is true if this form is being shown as an inventory.
##Button
* element:setPosition( x,y ) - change the position
* element:getPosition() - get the current position
* element:setSize( w,h ) - set the size
* element:getSize() - get the size
* element:setText( text ) - set the caption of the button
* element:getText() - get the caption of the button
* element:setImage( filename ) - sets the background of the button
* element:getImage() - get the background filename of the button
* element:click( func(self,state) ) - specify a function to run when the button is clicked
##Toggle Button
* element:setPosition( x,y ) - change the position
* element:getPosition() - get the current position
* element:setSize( w,h ) - set the size
* element:getSize() - get the size
* element:getText() - get the text of the toggle option
* element:setId( filename ) - sets the selected id
* element:getId() - get the selected id
* element:onToggle( func(self,state) ) - specify a function to run when the value if toggled
##Label
* element:setPosition( x,y ) - change the position
* element:getPosition() - get the current position
* element:setText( text ) - set the caption of the label
* element:getText() - get the caption of the label
##Field and Text Area
* element:setPosition( x,y ) - change the position
* element:getPosition() - get the current position
* element:setSize( w,h ) - set the size
* element:getSize() - get the size
* element:setText( text ) - set the caption of the button
* element:getText() - get the caption of the field
* element:setImage( filename ) - sets the background of the field
* element:getImage() - get the background filename of the field
##List box
* element:onClick( func(self,state,idx) ) - function to run when listbox item idx is clicked
* element:onDoubleClick( func(self,state,idx) ) - function to run when listbox item idx is double clicked
* element:setPosition( x,y ) - set the position
* element:getPosition() - returns {x=x, y=y}
* element:setSize( w,h ) - set the size
* element:getSize() - gets the size {w=w, h=h}
* element:addItem( item ) - appends and item
* element:removeItem( idx ) - remove item
* element:popItem() - removes last item and returns
##Inventory listing
* element:setPosition( x,y ) - set the position
* element:getPosition() - returns {x=x, y=y}
* element:setSize( w,h ) - set the size
* element:getSize() - gets the size {w=w, h=h}
* element:setLocation( location ) - set a custom inventory location or nil for the default (current_player)
* element:usePosition( position ) - use a node metadata attached inventory of the node at the given positon
* element:useDetached( name ) - use a detached inventory with the given name
* element:usePlayer( name ) - use a player inventory other than the current player
* element:getLocation() - returns the inventory location (default: current_player)
* element:setIndex( index ) - set the inventory starting index
* element:getIndex() - returns the inventory starting index
##Custom Code
* element:onSubmit( func(self) ) - on form submit
* element:onBuild( func(self) ) - run every time form is shown. You can set code from here
* element:setCode( code ) - set the formspec code
* element:getCode( code ) - get the formspec code

View File

@ -0,0 +1,2 @@
unified_inventory?
inventory_plus?

View File

@ -0,0 +1,66 @@
dofile(minetest.get_modpath("smartfs").."/smartfs.lua")
s = smartfs.create("smartfs:form",function(state)
state:size(10,7)
state:label(2,0,"lbl","SmartFS example formspec!")
state:field(7,1,3,1,"txt","Textbox")
state:image(0,0,2,2,"img","default_stone.png")
state:toggle(0,2,3,1,"tg",{"plenty..","of..","custom..","elements"})
state:checkbox(2,1,"c","Easy code",true)
local res = "smartfs.create(\"smartfs:form\",function(state)\n"
res = res .. "\tstate:size(10,7)\n"
res = res .. "\tstate:label(2,0,\"lbl\",\"SmartFS example formspec!\")\n"
res = res .. "\tstate:field(7,1,3,1,\"txt\",\"Textbox\")\n"
res = res .. "\tstate:image(0,0,2,2,\"img\",\"default_stone.png\")\n"
res = res .. "\tstate:toggle(0,2,3,1,\"tg\",{\"plenty..\",\"of..\",\"custom..\",\"elements\"})\n"
res = res .. "\tstate:checkbox(2,1,\"c\",\"Easy code\",true)\n"
res = res .. "end)"
state:textarea(1,3.5,9,4,"ta","Code:"):setText(res)
return true
end)
l = smartfs.create("smartfs:load",function(state)
state:load(minetest.get_modpath("smartfs").."/example.smartfs")
state:get("btn"):click(function(self,state)
print("Button clicked!")
end)
return true
end)
smartfs.add_to_inventory(l,"icon.png","SmartFS")
minetest.register_chatcommand("sfs_s", {
params = "",
description = "SmartFS test formspec 1: basics",
func = function(name, param)
s:show(name)
end,
})
minetest.register_chatcommand("sfs_l", {
params = "",
description = "SmartFS test formspec 2: loading",
func = function(name, param)
l:show(name)
end,
})
minetest.register_chatcommand("sfs_d", {
params = "",
description = "SmartFS test formspec 3: dynamic",
func = function(name, param)
local state = smartfs.dynamic("smartfs:dyn_form", name)
state:load(minetest.get_modpath("smartfs").."/example.smartfs")
state:get("btn"):click(function(self,state)
print("Button clicked!")
end)
state:show()
end,
})
minetest.register_chatcommand("sfs_lc", {
params = "",
description = "SmartFS test formspec 4: smartfs.create error catching",
func = function(name, param)
smartfs.create("asdinas",function() end)
end
})

View File

@ -0,0 +1 @@
return { ["ele"] = { ["c"] = { ["pos"] = { ["y"] = 1, ["x"] = 1 }, ["label"] = "Check", ["value"] = true, ["type"] = "checkbox", ["name"] = "c" }, ["btn"] = { ["pos"] = { ["y"] = 2, ["x"] = 1 }, ["size"] = { ["h"] = 1, ["w"] = 1 }, ["value"] = "Button", ["type"] = "button", ["name"] = "btn" } }, ["size"] = { ["h"] = 3, ["w"] = 5 } }

View File

@ -0,0 +1,2 @@
dofile(minetest.get_modpath("smartfs").."/smartfs.lua")
--dofile(minetest.get_modpath("smartfs").."/example.lua")

View File

@ -0,0 +1,760 @@
---------------------------
-- SmartFS: Smart Formspecs
-- by Rubenwardy
---------------------------
smartfs = {
_fdef = {},
_edef = {},
opened = {},
inv = {}
}
-- the smartfs() function
function smartfs.__call(self, name)
return smartfs._fdef[name]
end
-- Register forms and elements
function smartfs.create(name,onload)
if smartfs._fdef[name] then
error("SmartFS - (Error) Form "..name.." already exists!")
end
if smartfs.loaded and not smartfs._loaded_override then
error("SmartFS - (Error) Forms should be declared while the game loads.")
end
smartfs._fdef[name] = {
_reg = onload,
name = name,
show = smartfs._show_
}
return smartfs._fdef[name]
end
function smartfs.override_load_checks()
smartfs._loaded_override = true
end
minetest.after(0, function()
smartfs.loaded = true
end)
function smartfs.dynamic(name,player)
if not smartfs._dynamic_warned then
smartfs._dynamic_warned = true
print("SmartFS - (Warning) On the fly forms are being used. May cause bad things to happen")
end
local state = smartfs._makeState_({name=name},player,nil,false)
state.show = state._show_
smartfs.opened[player] = state
return state
end
function smartfs.element(name,data)
if smartfs._edef[name] then
error("SmartFS - (Error) Element type "..name.." already exists!")
end
smartfs._edef[name] = data
return smartfs._edef[name]
end
function smartfs.inventory_mod()
if unified_inventory then
return "unified_inventory"
elseif inventory_plus then
return "inventory_plus"
else
return nil
end
end
function smartfs.add_to_inventory(form,icon,title)
if unified_inventory then
unified_inventory.register_button(form.name, {
type = "image",
image = icon,
})
unified_inventory.register_page(form.name, {
get_formspec = function(player, formspec)
local name = player:get_player_name()
local opened = smartfs._show_(form, name, nil, true)
return {formspec = opened:_getFS_(false)}
end
})
return true
elseif inventory_plus then
minetest.register_on_joinplayer(function(player)
inventory_plus.register_button(player, form.name, title)
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "" and fields[form.name] then
local name = player:get_player_name()
local opened = smartfs._show_(form, name, nil, true)
inventory_plus.set_inventory_formspec(player, opened:_getFS_(true))
end
end)
return true
else
return false
end
end
function smartfs._makeState_(form,player,params,is_inv)
return {
_ele = {},
def = form,
player = player,
param = params,
is_inv = is_inv,
get = function(self,name)
return self._ele[name]
end,
close = function(self)
self.closed = true
end,
size = function(self,w,h)
self._size = {w=w,h=h}
end,
_getFS_ = function(self,size)
local res = ""
if self._size and size then
res = "size["..self._size.w..","..self._size.h.."]"
end
for key,val in pairs(self._ele) do
res = res .. val:build()
end
return res
end,
_show_ = function(self)
if self.is_inv then
if unified_inventory then
unified_inventory.set_inventory_formspec(minetest.get_player_by_name(self.player), self.def.name)
elseif inventory_plus then
inventory_plus.set_inventory_formspec(minetest.get_player_by_name(self.player), self:_getFS_(true))
end
else
local res = self:_getFS_(true)
minetest.show_formspec(player,form.name,res)
end
end,
load = function(self,file)
local file = io.open(file, "r")
if file then
local table = minetest.deserialize(file:read("*all"))
if type(table) == "table" then
if table.size then
self._size = table.size
end
for key,val in pairs(table.ele) do
self:element(val.type,val)
end
return true
end
end
return false
end,
save = function(self,file)
local res = {ele={}}
if self._size then
res.size = self._size
end
for key,val in pairs(self._ele) do
res.ele[key] = val.data
end
local file = io.open(file, "w")
if file then
file:write(minetest.serialize(res))
file:close()
return true
end
return false
end,
button = function(self,x,y,w,h,name,text,exitf)
if exitf == nil then exitf = false end
return self:element("button",{pos={x=x,y=y},size={w=w,h=h},name=name,value=text,closes=exitf})
end,
label = function(self,x,y,name,text)
return self:element("label",{pos={x=x,y=y},name=name,value=text})
end,
toggle = function(self,x,y,w,h,name,list)
return self:element("toggle",{pos={x=x,y=y},size={w=w,h=h},name=name,id=1,list=list})
end,
field = function(self,x,y,w,h,name,label)
return self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label})
end,
pwdfield = function(self,x,y,w,h,name,label)
local res = self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label})
res:isPassword(true)
return res
end,
textarea = function(self,x,y,w,h,name,label)
local res = self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label})
res:isMultiline(true)
return res
end,
image = function(self,x,y,w,h,name,img)
return self:element("image",{pos={x=x,y=y},size={w=w,h=h},name=name,value=img})
end,
checkbox = function(self,x,y,name,label,selected)
return self:element("checkbox",{pos={x=x,y=y},name=name,value=selected,label=label})
end,
listbox = function(self,x,y,w,h,name)
return self:element("list", { pos={x=x,y=y}, size={w=w,h=h}, name=name })
end,
inventory = function(self,x,y,w,h,name)
return self:element("inventory", { pos={x=x,y=y}, size={w=w,h=h}, name=name })
end,
element = function(self,typen,data)
local type = smartfs._edef[typen]
if not type then
error("Element type "..typen.." does not exist!")
end
if self._ele[data.name] then
error("Element "..data.name.." already exists")
end
data.type = typen
local ele = {
name = data.name,
root = self,
data = data,
remove = function(self)
self.root._ele[self.name] = nil
end
}
for key,val in pairs(type) do
ele[key] = val
end
self._ele[data.name] = ele
return self._ele[data.name]
end
}
end
-- Show a formspec to a user
function smartfs._show_(form, player, params, is_inv)
local state = smartfs._makeState_(form, player, params, is_inv)
state.show = state._show_
if form._reg(state)~=false then
if not is_inv then
smartfs.opened[player] = state
state:_show_()
else
smartfs.inv[player] = state
end
end
return state
end
-- Receive fields from formspec
local function _sfs_recieve_(state,name,fields)
if (fields.quit == "true") then
if not state.is_inv then
smartfs.opened[name] = nil
end
return true
end
for key,val in pairs(fields) do
if state._ele[key] then
state._ele[key].data.value = val
end
end
for key,val in pairs(state._ele) do
if val.submit then
if (val:submit(fields)==true) then
return true
end
end
end
if state.closed ~= true then
state:_show_()
else
minetest.show_formspec(name,"","size[5,1]label[0,0;Formspec closing not yet created!]")
if not state.is_inv then
smartfs.opened[name] = nil
end
end
return true
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
local name = player:get_player_name()
if smartfs.opened[name] and not smartfs.opened[name].is_inv then
if smartfs.opened[name].def.name == formname then
local state = smartfs.opened[name]
return _sfs_recieve_(state,name,fields)
else
smartfs.opened[name] = nil
end
elseif smartfs.inv[name] and smartfs.inv[name].is_inv then
local state = smartfs.inv[name]
_sfs_recieve_(state,name,fields)
end
return false
end)
-----------------------------------------------------------------
------------------------- ELEMENTS ----------------------------
-----------------------------------------------------------------
smartfs.element("button",{
build = function(self)
if self.data.img then
return "image_button["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.data.img..
";"..
self.name..
";"..
self.data.value..
"]"
else
if self.data.closes then
return "button_exit["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.name..
";"..
self.data.value..
"]"
else
return "button["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.name..
";"..
self.data.value..
"]"
end
end
end,
submit = function(self,fields,state)
if fields[self.name] and self._click then
self:_click(self.root)
end
if self.data.closes then
return true
end
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setSize = function(self,w,h)
self.data.size = {w=w,h=h}
end,
getSize = function(self,x,y)
return self.data.size
end,
onClick = function(self,func)
self._click = func
end,
click = function(self,func)
self._click = func
end,
setText = function(self,text)
self.data.value = text
end,
getText = function(self)
return self.data.value
end,
setImage = function(self,image)
self.data.img = image
end,
getImage = function(self)
return self.data.img
end,
setClose = function(self,bool)
self.data.closes = bool
end
})
smartfs.element("toggle",{
build = function(self)
return "button["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.name..
";"..
self.data.list[self.data.id]..
"]"
end,
submit = function(self,fields)
if fields[self.name] then
self.data.id = self.data.id + 1
if self.data.id > #self.data.list then
self.data.id = 1
end
if self._tog then
self:_tog(self.root)
end
end
end,
onToggle = function(self,func)
self._tog = func
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setSize = function(self,w,h)
self.data.size = {w=w,h=h}
end,
getSize = function(self,x,y)
return self.data.size
end,
setId = function(self,id)
self.data.id = id
end,
getId = function(self)
return self.data.id
end,
getText = function(self)
return self.data.list[self.data.id]
end
})
smartfs.element("label",{
build = function(self)
return "label["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.value..
"]"
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setText = function(self,text)
self.data.value = text
end,
getText = function(self)
return self.data.value
end
})
smartfs.element("field",{
build = function(self)
if self.data.ml then
return "textarea["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.name..
";"..
self.data.label..
";"..
self.data.value..
"]"
elseif self.data.pwd then
return "pwdfield["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.name..
";"..
self.data.label..
"]"
else
return "field["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.name..
";"..
self.data.label..
";"..
self.data.value..
"]"
end
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setSize = function(self,w,h)
self.data.size = {w=w,h=h}
end,
getSize = function(self,x,y)
return self.data.size
end,
setText = function(self,text)
self.data.value = text
end,
getText = function(self)
return self.data.value
end,
isPassword = function(self,bool)
self.data.pwd = bool
end,
isMultiline = function(self,bool)
self.data.ml = bool
end
})
smartfs.element("image",{
build = function(self)
return "image["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.data.value..
"]"
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setSize = function(self,w,h)
self.data.size = {w=w,h=h}
end,
getSize = function(self,x,y)
return self.data.size
end,
setImage = function(self,text)
self.data.value = text
end,
getImage = function(self)
return self.data.value
end
})
smartfs.element("checkbox",{
build = function(self)
if self.data.value then
return "checkbox["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.name..
";"..
self.data.label..
";true]"
else
return "checkbox["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.name..
";"..
self.data.label..
";false]"
end
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setSize = function(self,w,h)
self.data.size = {w=w,h=h}
end,
getSize = function(self,x,y)
return self.data.size
end,
setText = function(self,text)
self.data.value = text
end,
getText = function(self)
return self.data.value
end
})
smartfs.element("list",{
build = function(self)
local listformspec = "textlist["..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
self.data.name..
";"
--loop through the list's items and add them to the formspec
if not self.data.items then
self.data.items = {" "}
end
for i,value in ipairs(self.data.items) do
listformspec = listformspec..value..","
end
listformspec = string.sub(listformspec, 0, -2) --removes extra ,
--close out the list items section
listformspec = listformspec..";"
--TODO support selected idx and transparency
--close formspec definition and return formspec
listformspec = listformspec.."]"
return listformspec
end,
submit = function(self,fields)
if fields[self.name] then
local _type = string.sub(fields[self.data.name],1,3)
local index = string.sub(fields[self.data.name],5)
if _type == "CHG" and self._click then
self:_click(self.root, index)
elseif _type == "DCL" and self._doubleClick then
self:_doubleClick(self.root, index)
end
end
end,
onClick = function(self, func)
self._click = func
end,
click = function(self, func)
self._click = func
end,
onDoubleClick = function(self, func)
self._doubleClick = func
end,
doubleclick = function(self, func)
self._doubleClick = func
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setSize = function(self,w,h)
self.data.size = {w=w,h=h}
end,
getSize = function(self,x,y)
return self.data.size
end,
addItem = function(self, item)
if not self.data.items then
self.data.items = {" "}
end
table.insert(self.data.items, item)
end,
removeItem = function(self,idx)
if not self.data.items then
self.data.items = {" "}
end
table.remove(self.data.items,idx)
end,
popItem = function(self)
if not self.data.items then
self.data.items = {" "}
end
local item = self.data.items[#self.data.items]
table.remove(self.data.items)
return item
end
})
smartfs.element("inventory",{
build = function(self)
return "list["..
(self.data.location or "current_player") ..
";"..
self.name..
";"..
self.data.pos.x..","..self.data.pos.y..
";"..
self.data.size.w..","..self.data.size.h..
";"..
(self.data.index or "") ..
"]"
end,
setPosition = function(self,x,y)
self.data.pos = {x=x,y=y}
end,
getPosition = function(self,x,y)
return self.data.pos
end,
setSize = function(self,w,h)
self.data.size = {w=w,h=h}
end,
getSize = function(self,x,y)
return self.data.size
end,
-- available inventory locations
-- "current_player": Player to whom the menu is shown
-- "player:<name>": Any player
-- "nodemeta:<X>,<Y>,<Z>": Any node metadata
-- "detached:<name>": A detached inventory
-- "context" does not apply to smartfs, since there is no node-metadata as context available
setLocation = function(self,location)
self.data.location = location
end,
getLocation = function(self)
return self.data.location or "current_player"
end,
usePosition = function(self, pos)
self.data.location = string.format("nodemeta:%d,%d,%d", pos.x, pos.y, pos.z)
end,
usePlayer = function(self, name)
self.data.location = "player:" .. name
end,
useDetached = function(self, name)
self.data.location = "detached:" .. name
end,
setIndex = function(self,index)
self.data.index = index
end,
getIndex = function(self)
return self.data.index
end
})
smartfs.element("code",{
build = function(self)
if self._build then
self:_build()
end
return self.data.code
end,
submit = function(self,fields)
if self._sub then
self:_sub(fields)
end
end,
onSubmit = function(self,func)
self._sub = func
end,
onBuild = function(self,func)
self._build = func
end,
setCode = function(self,code)
self.data.code = code
end,
getCode = function(self)
return self.data.code
end
})

View File

@ -0,0 +1,59 @@
# Translation file GERMAN
Setup completed, have fun with StreetsMod=Setup abgeschlossen, viel Spass mit StreetsMod
Creating variables and tables...=Erstelle Variablen und Tabellen...
Checking installed mods...=Ueberpruefe installierte Mods...
Check version of your installed StreetsMod and find information=Ueberpruefe die installierte StreetsMod Version und weitere Infos
Asphalt=Asphalt
Asphalt stair=Asphalt Treppe
Asphalt slab=Asphalt Platte
Construction fence=Bauzaun
Delineator=Leitpfosten
Emergency Phone=Notrufsaeule
Asphalt with sideline=Asphalt mit Seitenlinie
Asphalt with solid line=Asphalt mit durchgezogener Linie
Asphalt with dashed line=Asphalt mit unterbrochener Linie
Asphalt with sideline (edge)=Asphalt mit Seitenlinie (Ecke)
Asphalt with parking label=Asphalt mit Parkplatzsymbol
Asphalt with arrow=Asphalt mit Richtungspfeil
Simple manhole=Einfacher Gulli
Advanced manhole=Gulli
Pole=Stange
Empty sign=Leeres Schild
Warning sign (lava)=Gefahrenschild Lava
Warning sign (water)=Gefahrenschild Wasser
Warning sign (Construction area)=Gefahrenschild Baustelle
Warning: Careful of lava=Achtung: Lava
Warning: Water nearby=Achtung: Wasser
Warning: Construction area, possible deep excavations=Achtung Baustelle, eventuell tiefe Graeben
Sign workshop - Create signs for your roads!=Schilderworkshop - Baue Schilder fuer deine Strassen!
Available signs:=Verfuegbare Schilder
Needed stuff:=Benoetigt
Put it here:=Rohstoffe
Selected:=Ausgewaehlt
Output:=Ausgabe
Sign workshop=Schilderworkshop
Sign workshop idle=Schilderworkshop bereit
Sign workshop working=Schilderworkshop arbeitet
Please wait %s seconds... = Bitte warte %s Sekunden...
Solid line (yellow)=Durchgezogene Linie (gelb)
Dashed line (yellow)=Unterbrochene Linie (gelb)
Cross (yellow)=Kreuz (gelb)
Outer edge (yellow)=Ecklinie (gelb)
Parking (yellow)=Parkplatzsymbol (gelb)
Arrow (yellow)=Pfeil (gelb)
Sideline (yellow)=Seitenlinie (gelb)
Steel support=Stahlrahmen
Street lamp=Strassenlampe
Concrete wall=Betonwand
Concrete=Beton
Trafficlight=Ampel
Running version=Version
Cheater=Schummler
Cheater!=Schummler!
Off=Aus
Channel=Kanal
green=Gruen
red=Rot
warn=Warnung
off=Aus
U cheater U=Du Schummler Du

View File

@ -0,0 +1,59 @@
# Translation file for StreetsMod might not be up-to-date.
Setup completed, have fun with StreetsMod=
Creating variables and tables...=
Checking installed mods...=
Check version of your installed StreetsMod and find information=
Asphalt=
Asphalt stair=
Asphalt slab=
Construction fence=
Delineator=
Emergency Phone=
Asphalt with sideline=
Asphalt with solid line=
Asphalt with dashed line=
Asphalt with sideline (edge)=
Asphalt with parking label=
Asphalt with arrow=
Simple manhole=
Advanced manhole=
Pole=
Empty sign=
Warning sign (lava)=
Warning sign (water)=
Warning sign (Construction area)=
Warning: Careful of lava=
Warning: Water nearby=
Warning: Construction area, possible deep excavations=
Sign workshop - Create signs for your roads!=
Available signs:=
Needed stuff:=
Put it here:=
Selected:=
Output:=
Sign workshop=
Sign workshop idle=
Sign workshop working=
Please wait %s seconds... =
Solid line (yellow)=
Dashed line (yellow)=
Cross (yellow)=
Outer edge (yellow)=
Parking (yellow)=
Arrow (yellow)=
Sideline (yellow)=
Steel support=
Street lamp=
Concrete wall=
Concrete=
Trafficlight=
Running version=
Cheater=
Cheater!=
Off=
Channel=
green=
red=
warn=
off=
U cheater U=

View File

@ -0,0 +1,19 @@
MINETEST NODEBOX EDITOR
PARSER 1
NAME test
NODE node1
POSITION 0 0 0
NODEBOX nodebox1 -0.1875 -0.5 0.5 0.1875 0.5 0.75
NODEBOX nodebox2 -0.0625 0.375 0.3125 0.0625 0.4375 0.5
NODEBOX nodebox3 -0.0625 0.0625 0.3125 0.0625 0.125 0.5
NODEBOX nodebox4 -0.0625 -0.25 0.3125 0.0625 -0.1875 0.5
NODEBOX nodebox5 0.0625 0.3125 0.3125 0.125 0.38 0.5
NODEBOX nodebox6 -0.125 0.3125 0.3125 -0.0625 0.375 0.5
NODEBOX nodebox7 0.0625 0 0.3125 0.125 0.0625 0.5
NODEBOX nodebox8 -0.125 0 0.3125 -0.0625 0.0625 0.5
NODEBOX nodebox9 0.0625 -0.3125 0.3125 0.125 -0.25 0.5
NODEBOX nodebox10 -0.125 -0.3125 0.3125 -0.0625 -0.25 0.5
NODEBOX NodeBox11 -0.125 -0.125 0.85 0.125 0.125 0.75
END NODE

View File

@ -0,0 +1 @@
This is the first loaded mod in this modpack which prepares tables, variables etc.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Some files were not shown because too many files have changed in this diff Show More