Sudoku 1.8.0 upload

Game-5.4.0
Der1248 2018-08-16 18:39:57 +02:00
parent fa3a344eac
commit a17fe26c53
148 changed files with 1946 additions and 503 deletions

View File

@ -1,28 +1,12 @@
Minetest Game [minetest_game] A Game by 1248
=============================
The main subgame for the Minetest engine
========================================
To use this subgame with the Minetest engine, insert this repository as Thanks to:
/games/minetest_game /
The Minetest engine can be found in: Info:
https://github.com/minetest/minetest/ Sudoku is a mini game in minetest.
Can you solve the Sudoku??
Compatibility License:
-------------- See README.txt in each mod for more information
The Minetest Game github master HEAD is generally compatible with the github Every code written by me is LGPLv2.1
master HEAD of the Minetest engine.
Additionally, when the Minetest engine is tagged to be a certain version (eg.
0.4.10), Minetest Game is tagged with the version too.
When stable releases are made, Minetest Game is packaged and made available in
http://minetest.net/download
and in case the repository has grown too much, it may be reset. In that sense,
this is not a "real" git repository. (Package maintainers please note!)
Licensing
---------
See LICENSE.txt

Binary file not shown.

View File

@ -49,21 +49,24 @@ function beds.register_bed(name, def)
local node = minetest.get_node(under) local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name] local udef = minetest.registered_nodes[node.name]
if udef and udef.on_rightclick and if udef and udef.on_rightclick and
not (placer and placer:get_player_control().sneak) then not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return udef.on_rightclick(under, node, placer, itemstack, return udef.on_rightclick(under, node, placer, itemstack,
pointed_thing) or itemstack pointed_thing) or itemstack
end end
local pos local pos
if minetest.registered_items[minetest.get_node(under).name].buildable_to then if udef and udef.buildable_to then
pos = under pos = under
else else
pos = pointed_thing.above pos = pointed_thing.above
end end
if minetest.is_protected(pos, placer:get_player_name()) and local player_name = placer and placer:get_player_name() or ""
not minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(pos, placer:get_player_name()) if minetest.is_protected(pos, player_name) and
not minetest.check_player_privs(player_name, "protection_bypass") then
minetest.record_protection_violation(pos, player_name)
return itemstack return itemstack
end end
@ -72,12 +75,13 @@ function beds.register_bed(name, def)
return itemstack return itemstack
end end
local dir = minetest.dir_to_facedir(placer:get_look_dir()) local dir = placer and placer:get_look_dir() and
minetest.dir_to_facedir(placer:get_look_dir()) or 0
local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) local botpos = vector.add(pos, minetest.facedir_to_dir(dir))
if minetest.is_protected(botpos, placer:get_player_name()) and if minetest.is_protected(botpos, player_name) and
not minetest.check_player_privs(placer, "protection_bypass") then not minetest.check_player_privs(player_name, "protection_bypass") then
minetest.record_protection_violation(botpos, placer:get_player_name()) minetest.record_protection_violation(botpos, player_name)
return itemstack return itemstack
end end
@ -90,7 +94,7 @@ function beds.register_bed(name, def)
minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
if not (creative and creative.is_enabled_for if not (creative and creative.is_enabled_for
and creative.is_enabled_for(placer:get_player_name())) then and creative.is_enabled_for(player_name)) then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack

View File

@ -230,7 +230,8 @@ minetest.register_craftitem("boats:boat", {
local node = minetest.get_node(under) local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name] local udef = minetest.registered_nodes[node.name]
if udef and udef.on_rightclick and if udef and udef.on_rightclick and
not (placer and placer:get_player_control().sneak) then not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return udef.on_rightclick(under, node, placer, itemstack, return udef.on_rightclick(under, node, placer, itemstack,
pointed_thing) or itemstack pointed_thing) or itemstack
end end
@ -244,9 +245,12 @@ minetest.register_craftitem("boats:boat", {
pointed_thing.under.y = pointed_thing.under.y + 0.5 pointed_thing.under.y = pointed_thing.under.y + 0.5
boat = minetest.add_entity(pointed_thing.under, "boats:boat") boat = minetest.add_entity(pointed_thing.under, "boats:boat")
if boat then if boat then
boat:setyaw(placer:get_look_horizontal()) if placer then
if not (creative and creative.is_enabled_for boat:setyaw(placer:get_look_horizontal())
and creative.is_enabled_for(placer:get_player_name())) then end
local player_name = placer and placer:get_player_name() or ""
if not (creative and creative.is_enabled_for and
creative.is_enabled_for(player_name)) then
itemstack:take_item() itemstack:take_item()
end end
end end

View File

@ -68,6 +68,12 @@ minetest.register_node("bones:bones", {
on_metadata_inventory_take = function(pos, listname, index, stack, player) on_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if meta:get_inventory():is_empty("main") then if meta:get_inventory():is_empty("main") then
local inv = player:get_inventory()
if inv:room_for_item("main", {name = "bones:bones"}) then
inv:add_item("main", {name = "bones:bones"})
else
minetest.add_item(pos, "bones:bones")
end
minetest.remove_node(pos) minetest.remove_node(pos)
end end
end, end,

View File

@ -69,7 +69,8 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name
-- Call on_rightclick if the pointed node defines it -- Call on_rightclick if the pointed node defines it
if ndef and ndef.on_rightclick and if ndef and ndef.on_rightclick and
user and not user:get_player_control().sneak then not (user and user:is_player() and
user:get_player_control().sneak) then
return ndef.on_rightclick( return ndef.on_rightclick(
pointed_thing.under, pointed_thing.under,
node, user, node, user,

View File

@ -58,7 +58,8 @@ end
function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction)
local pos = self.object:getpos() local pos = self.object:getpos()
if not self.railtype then local vel = self.object:getvelocity()
if not self.railtype or vector.equals(vel, {x=0, y=0, z=0}) then
local node = minetest.get_node(pos).name local node = minetest.get_node(pos).name
self.railtype = minetest.get_item_group(node, "connect_to_raillike") self.railtype = minetest.get_item_group(node, "connect_to_raillike")
end end
@ -105,7 +106,6 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities,
return return
end end
-- Player punches cart to alter velocity -- Player punches cart to alter velocity
local vel = self.object:getvelocity()
if puncher:get_player_name() == self.driver then if puncher:get_player_name() == self.driver then
if math.abs(vel.x + vel.z) > carts.punch_speed_max then if math.abs(vel.x + vel.z) > carts.punch_speed_max then
return return
@ -367,7 +367,8 @@ minetest.register_craftitem("carts:cart", {
local node = minetest.get_node(under) local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name] local udef = minetest.registered_nodes[node.name]
if udef and udef.on_rightclick and if udef and udef.on_rightclick and
not (placer and placer:get_player_control().sneak) then not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return udef.on_rightclick(under, node, placer, itemstack, return udef.on_rightclick(under, node, placer, itemstack,
pointed_thing) or itemstack pointed_thing) or itemstack
end end

View File

@ -159,23 +159,29 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype)
end end
function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype)
if vector.equals(old_pos, pos_) then
return true
end
local pos = vector.round(pos_) local pos = vector.round(pos_)
local pf_pos = vector.round(old_pos) local pf_pos = vector.round(old_pos)
local pf_dir = vector.new(old_dir) local pf_dir = vector.new(old_dir)
for i = 1, 3 do for i = 1, 3 do
if vector.equals(pf_pos, pos) then pf_dir, pf_switch = carts:get_rail_direction(
-- Success! Cart moved on correctly pf_pos, pf_dir, ctrl, pf_switch, railtype)
return true
end
pf_dir, pf_switch = carts:get_rail_direction(pf_pos, pf_dir, ctrl, pf_switch, railtype)
if vector.equals(pf_dir, {x=0, y=0, z=0}) then if vector.equals(pf_dir, {x=0, y=0, z=0}) then
-- No way forwards -- No way forwards
return false return false
end end
pf_pos = vector.add(pf_pos, pf_dir) pf_pos = vector.add(pf_pos, pf_dir)
if vector.equals(pf_pos, pos) then
-- Success! Cart moved on correctly
return true
end
end end
-- Cart not found -- Cart not found
return false return false
@ -211,7 +217,12 @@ end
function carts:get_rail_groups(additional_groups) function carts:get_rail_groups(additional_groups)
-- Get the default rail groups and add more when a table is given -- Get the default rail groups and add more when a table is given
local groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1} local groups = {
dig_immediate = 2,
attached_node = 1,
rail = 1,
connect_to_raillike = minetest.raillike_group("rail")
}
if type(additional_groups) == "table" then if type(additional_groups) == "table" then
for k, v in pairs(additional_groups) do for k, v in pairs(additional_groups) do
groups[k] = v groups[k] = v

View File

@ -40,16 +40,16 @@ end
-- Unlimited node placement -- Unlimited node placement
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
return creative.is_enabled_for(placer:get_player_name()) if placer and placer:is_player() then
return creative.is_enabled_for(placer:get_player_name())
end
end) end)
-- Don't pick up if the item is already in the inventory -- Don't pick up if the item is already in the inventory
local old_handle_node_drops = minetest.handle_node_drops local old_handle_node_drops = minetest.handle_node_drops
function minetest.handle_node_drops(pos, drops, digger) function minetest.handle_node_drops(pos, drops, digger)
if not digger or not digger:is_player() then if not digger or not digger:is_player() or
return not creative.is_enabled_for(digger:get_player_name()) then
end
if not creative.is_enabled_for(digger:get_player_name()) then
return old_handle_node_drops(pos, drops, digger) return old_handle_node_drops(pos, drops, digger)
end end
local inv = digger:get_inventory() local inv = digger:get_inventory()

View File

@ -1,4 +1,19 @@
local player_inventory = {} local player_inventory = {}
local inventory_cache = {}
local function init_creative_cache(items)
inventory_cache[items] = {}
local i_cache = inventory_cache[items]
for name, def in pairs(items) do
if def.groups.not_in_creative_inventory ~= 1 and
def.description and def.description ~= "" then
i_cache[name] = def
end
end
table.sort(i_cache)
return i_cache
end
function creative.init_creative_inventory(player) function creative.init_creative_inventory(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
@ -10,22 +25,25 @@ function creative.init_creative_inventory(player)
minetest.create_detached_inventory("creative_" .. player_name, { minetest.create_detached_inventory("creative_" .. player_name, {
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2) allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
if not to_list == "main" then local name = player2 and player2:get_player_name() or ""
return count if not creative.is_enabled_for(name) or
else to_list == "main" then
return 0 return 0
end end
return count
end, end,
allow_put = function(inv, listname, index, stack, player2) allow_put = function(inv, listname, index, stack, player2)
return 0 return 0
end, end,
allow_take = function(inv, listname, index, stack, player2) allow_take = function(inv, listname, index, stack, player2)
local name = player2 and player2:get_player_name() or ""
if not creative.is_enabled_for(name) then
return 0
end
return -1 return -1
end, end,
on_move = function(inv, from_list, from_index, to_list, to_index, count, player2) on_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
end, end,
on_put = function(inv, listname, index, stack, player2)
end,
on_take = function(inv, listname, index, stack, player2) on_take = function(inv, listname, index, stack, player2)
if stack and stack:get_count() > 0 then if stack and stack:get_count() > 0 then
minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory") minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory")
@ -42,11 +60,11 @@ function creative.update_creative_inventory(player_name, tab_content)
creative.init_creative_inventory(minetest.get_player_by_name(player_name)) creative.init_creative_inventory(minetest.get_player_by_name(player_name))
local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
for name, def in pairs(tab_content) do local items = inventory_cache[tab_content] or init_creative_cache(tab_content)
if not (def.groups.not_in_creative_inventory == 1) and
def.description and def.description ~= "" and for name, def in pairs(items) do
(def.name:find(inv.filter, 1, true) or if def.name:find(inv.filter, 1, true) or
def.description:lower():find(inv.filter, 1, true)) then def.description:lower():find(inv.filter, 1, true) then
creative_list[#creative_list+1] = name creative_list[#creative_list+1] = name
end end
end end
@ -100,6 +118,8 @@ function creative.register_tab(name, title, items)
button[2.75,3.4;0.8,0.5;creative_clear;X] button[2.75,3.4;0.8,0.5;creative_clear;X]
tooltip[creative_search;Search] tooltip[creative_search;Search]
tooltip[creative_clear;Reset] tooltip[creative_clear;Reset]
tooltip[creative_prev;Previous page]
tooltip[creative_next;Next page]
listring[current_player;main] listring[current_player;main]
field_close_on_enter[creative_filter;false] field_close_on_enter[creative_filter;false]
]] .. ]] ..
@ -158,10 +178,6 @@ function creative.register_tab(name, title, items)
}) })
end end
minetest.register_on_joinplayer(function(player)
creative.update_creative_inventory(player:get_player_name(), minetest.registered_items)
end)
creative.register_tab("all", "All", minetest.registered_items) creative.register_tab("all", "All", minetest.registered_items)
creative.register_tab("nodes", "Nodes", minetest.registered_nodes) creative.register_tab("nodes", "Nodes", minetest.registered_nodes)
creative.register_tab("tools", "Tools", minetest.registered_tools) creative.register_tab("tools", "Tools", minetest.registered_tools)

View File

@ -119,6 +119,7 @@ paramat (CC BY-SA 3.0):
default_silver_sandstone.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0)
default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0)
default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0)
default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0)
brunob.santos (CC BY-SA 4.0): brunob.santos (CC BY-SA 4.0):
default_desert_cobble.png default_desert_cobble.png
@ -131,7 +132,6 @@ BlockMen (CC BY-SA 3.0):
default_gold_ingot.png default_gold_ingot.png
default_tool_steelsword.png default_tool_steelsword.png
default_diamond.png default_diamond.png
default_book.png
default_tool_*.png default_tool_*.png
default_lava_source_animated.png default_lava_source_animated.png
default_lava_flowing_animated.png default_lava_flowing_animated.png
@ -145,11 +145,7 @@ BlockMen (CC BY-SA 3.0):
bubble.png bubble.png
gui_*.png gui_*.png
Wuzzy (CC BY-SA 3.0):
default_bookshelf_slot.png (based on default_book.png)
sofar (CC BY-SA 3.0): sofar (CC BY-SA 3.0):
default_book_written.png, based on default_book.png
default_aspen_sapling default_aspen_sapling
default_aspen_tree default_aspen_tree
default_aspen_tree_top, derived from default_pine_tree_top (by paramat) default_aspen_tree_top, derived from default_pine_tree_top (by paramat)
@ -186,6 +182,7 @@ Gambit (CC BY-SA 3.0):
default_snowball.png default_snowball.png
default_key.png default_key.png
default_key_skeleton.png default_key_skeleton.png
default_book.png
asl97 (CC BY-SA 3.0): asl97 (CC BY-SA 3.0):
default_ice.png default_ice.png
@ -221,6 +218,9 @@ kilbith (CC BY-SA 3.0):
default_tin_ingot.png default_tin_ingot.png
default_tin_lump.png default_tin_lump.png
CloudyProton (CC BY-SA 3.0):
default_book_written.png, based on default_book.png by Gambit
Glass breaking sounds (CC BY 3.0): Glass breaking sounds (CC BY 3.0):
1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/
2: http://www.freesound.org/people/Tomlija/sounds/97669/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/

View File

@ -190,6 +190,9 @@ minetest.register_craft({
} }
}) })
-- Axes
-- Recipes face left to match appearence in textures and inventory
minetest.register_craft({ minetest.register_craft({
output = 'default:axe_wood', output = 'default:axe_wood',
recipe = { recipe = {
@ -244,60 +247,6 @@ minetest.register_craft({
} }
}) })
minetest.register_craft({
output = 'default:axe_wood',
recipe = {
{'group:wood', 'group:wood'},
{'group:stick', 'group:wood'},
{'group:stick',''},
}
})
minetest.register_craft({
output = 'default:axe_stone',
recipe = {
{'group:stone', 'group:stone'},
{'group:stick', 'group:stone'},
{'group:stick', ''},
}
})
minetest.register_craft({
output = 'default:axe_steel',
recipe = {
{'default:steel_ingot', 'default:steel_ingot'},
{'group:stick', 'default:steel_ingot'},
{'group:stick', ''},
}
})
minetest.register_craft({
output = 'default:axe_bronze',
recipe = {
{'default:bronze_ingot', 'default:bronze_ingot'},
{'group:stick', 'default:bronze_ingot'},
{'group:stick', ''},
}
})
minetest.register_craft({
output = 'default:axe_mese',
recipe = {
{'default:mese_crystal', 'default:mese_crystal'},
{'group:stick', 'default:mese_crystal'},
{'group:stick', ''},
}
})
minetest.register_craft({
output = 'default:axe_diamond',
recipe = {
{'default:diamond', 'default:diamond'},
{'group:stick', 'default:diamond'},
{'group:stick', ''},
}
})
minetest.register_craft({ minetest.register_craft({
output = 'default:sword_wood', output = 'default:sword_wood',
recipe = { recipe = {
@ -904,7 +853,7 @@ minetest.register_craft({
-- Fuels -- Fuels
-- --
-- Support use of group:tree -- Support use of group:tree, includes default:tree which has the same burn time
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "group:tree", recipe = "group:tree",
@ -927,12 +876,6 @@ minetest.register_craft({
burntime = 26, burntime = 26,
}) })
minetest.register_craft({
type = "fuel",
recipe = "default:tree",
burntime = 30,
})
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:acacia_tree", recipe = "default:acacia_tree",
@ -946,7 +889,7 @@ minetest.register_craft({
}) })
-- Support use of group:wood -- Support use of group:wood, includes default:wood which has the same burn time
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "group:wood", recipe = "group:wood",
@ -965,12 +908,6 @@ minetest.register_craft({
burntime = 6, burntime = 6,
}) })
minetest.register_craft({
type = "fuel",
recipe = "default:wood",
burntime = 7,
})
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:acacia_wood", recipe = "default:acacia_wood",
@ -984,53 +921,47 @@ minetest.register_craft({
}) })
-- Support use of group:sapling -- Support use of group:sapling, includes default:sapling which has the same burn time
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "group:sapling", recipe = "group:sapling",
burntime = 10, burntime = 5,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:bush_sapling", recipe = "default:bush_sapling",
burntime = 6, burntime = 3,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:acacia_bush_sapling", recipe = "default:acacia_bush_sapling",
burntime = 7, burntime = 4,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:aspen_sapling", recipe = "default:aspen_sapling",
burntime = 8, burntime = 4,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:pine_sapling", recipe = "default:pine_sapling",
burntime = 9, burntime = 5,
})
minetest.register_craft({
type = "fuel",
recipe = "default:sapling",
burntime = 10,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:acacia_sapling", recipe = "default:acacia_sapling",
burntime = 11, burntime = 6,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:junglesapling", recipe = "default:junglesapling",
burntime = 12, burntime = 6,
}) })
@ -1080,13 +1011,13 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:junglegrass", recipe = "default:junglegrass",
burntime = 2, burntime = 3,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "group:leaves", recipe = "group:leaves",
burntime = 1, burntime = 4,
}) })
minetest.register_craft({ minetest.register_craft({
@ -1098,7 +1029,7 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:papyrus", recipe = "default:papyrus",
burntime = 1, burntime = 3,
}) })
minetest.register_craft({ minetest.register_craft({
@ -1110,7 +1041,7 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:ladder_wood", recipe = "default:ladder_wood",
burntime = 2, burntime = 7,
}) })
minetest.register_craft({ minetest.register_craft({
@ -1143,12 +1074,6 @@ minetest.register_craft({
burntime = 30, burntime = 30,
}) })
minetest.register_craft({
type = "fuel",
recipe = "default:apple",
burntime = 3,
})
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "default:coal_lump", recipe = "default:coal_lump",

View File

@ -75,12 +75,16 @@ local function book_on_use(itemstack, user)
return itemstack return itemstack
end end
local max_text_size = 10000
local max_title_size = 80
local short_title_size = 35
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "default:book" then return end if formname ~= "default:book" then return end
local inv = player:get_inventory() local inv = player:get_inventory()
local stack = player:get_wielded_item() local stack = player:get_wielded_item()
if fields.save and fields.title ~= "" and fields.text ~= "" then if fields.save and fields.title and fields.text
and fields.title ~= "" and fields.text ~= "" then
local new_stack, data local new_stack, data
if stack:get_name() ~= "default:book_written" then if stack:get_name() ~= "default:book_written" then
local count = stack:get_count() local count = stack:get_count()
@ -99,11 +103,16 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
if not data then data = {} end if not data then data = {} end
data.title = fields.title data.title = fields.title:sub(1, max_title_size)
data.owner = player:get_player_name() data.owner = player:get_player_name()
data.description = "\""..fields.title.."\" by "..data.owner local short_title = data.title
data.text = fields.text -- Don't bother triming the title if the trailing dots would make it longer
data.text_len = #data.text if #short_title > short_title_size + 3 then
short_title = short_title:sub(1, short_title_size) .. "..."
end
data.description = "\""..short_title.."\" by "..data.owner
data.text = fields.text:sub(1, max_text_size)
data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n")
data.page = 1 data.page = 1
data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp)

View File

@ -136,10 +136,12 @@ if minetest.settings:get_bool("enable_lavacooling") ~= false then
label = "Lava cooling", label = "Lava cooling",
nodenames = {"default:lava_source", "default:lava_flowing"}, nodenames = {"default:lava_source", "default:lava_flowing"},
neighbors = {"group:cools_lava", "group:water"}, neighbors = {"group:cools_lava", "group:water"},
interval = 1, interval = 2,
chance = 2, chance = 2,
catch_up = false, catch_up = false,
action = default.cool_lava, action = function(...)
default.cool_lava(...)
end,
}) })
end end
@ -222,7 +224,9 @@ minetest.register_abm({
neighbors = {"group:sand"}, neighbors = {"group:sand"},
interval = 12, interval = 12,
chance = 83, chance = 83,
action = default.grow_cactus action = function(...)
default.grow_cactus(...)
end
}) })
minetest.register_abm({ minetest.register_abm({
@ -231,7 +235,9 @@ minetest.register_abm({
neighbors = {"default:dirt", "default:dirt_with_grass"}, neighbors = {"default:dirt", "default:dirt_with_grass"},
interval = 14, interval = 14,
chance = 71, chance = 71,
action = default.grow_papyrus action = function(...)
default.grow_papyrus(...)
end
}) })
@ -291,7 +297,7 @@ function default.register_fence(name, def)
groups = {}, groups = {},
} }
for k, v in pairs(default_fields) do for k, v in pairs(default_fields) do
if not def[k] then if def[k] == nil then
def[k] = v def[k] = v
end end
end end
@ -313,7 +319,7 @@ end
-- Prevent decay of placed leaves -- Prevent decay of placed leaves
default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) default.after_place_leaves = function(pos, placer, itemstack, pointed_thing)
if placer and not placer:get_player_control().sneak then if placer and placer:is_player() and not placer:get_player_control().sneak then
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
node.param2 = 1 node.param2 = 1
minetest.set_node(pos, node) minetest.set_node(pos, node)

View File

@ -119,7 +119,7 @@ local function furnace_node_timer(pos, elapsed)
local fuel local fuel
local update = true local update = true
while update do while elapsed > 0 and update do
update = false update = false
srclist = inv:get_list("src") srclist = inv:get_list("src")
@ -134,13 +134,18 @@ local function furnace_node_timer(pos, elapsed)
cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
cookable = cooked.time ~= 0 cookable = cooked.time ~= 0
local el = math.min(elapsed, fuel_totaltime - fuel_time)
if cookable then -- fuel lasts long enough, adjust el to cooking duration
el = math.min(el, cooked.time - src_time)
end
-- Check if we have enough fuel to burn -- Check if we have enough fuel to burn
if fuel_time < fuel_totaltime then if fuel_time < fuel_totaltime then
-- The furnace is currently active and has enough fuel -- The furnace is currently active and has enough fuel
fuel_time = fuel_time + elapsed fuel_time = fuel_time + el
-- If there is a cookable item then check if it is ready yet -- If there is a cookable item then check if it is ready yet
if cookable then if cookable then
src_time = src_time + elapsed src_time = src_time + el
if src_time >= cooked.time then if src_time >= cooked.time then
-- Place result in dst list if possible -- Place result in dst list if possible
if inv:room_for_item("dst", cooked.item) then if inv:room_for_item("dst", cooked.item) then
@ -149,6 +154,9 @@ local function furnace_node_timer(pos, elapsed)
src_time = src_time - cooked.time src_time = src_time - cooked.time
update = true update = true
end end
else
-- Item could not be cooked: probably missing fuel
update = true
end end
end end
else else
@ -166,8 +174,7 @@ local function furnace_node_timer(pos, elapsed)
-- Take fuel from fuel list -- Take fuel from fuel list
inv:set_stack("fuel", 1, afterfuel.items[1]) inv:set_stack("fuel", 1, afterfuel.items[1])
update = true update = true
fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime) fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time)
src_time = src_time + elapsed
end end
else else
-- We don't need to get new fuel since there is no cookable item -- We don't need to get new fuel since there is no cookable item
@ -177,7 +184,7 @@ local function furnace_node_timer(pos, elapsed)
fuel_time = 0 fuel_time = 0
end end
elapsed = 0 elapsed = elapsed - el
end end
if fuel and fuel_totaltime > fuel.time then if fuel and fuel_totaltime > fuel.time then

View File

@ -19,7 +19,7 @@ Licenses of media (textures, models and sounds)
----------------------------------------------- -----------------------------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
Copyright (C) 2010-2016: Copyright (C) 2010-2017:
celeron55, Perttu Ahola <celeron55@gmail.com> celeron55, Perttu Ahola <celeron55@gmail.com>
Cisoun Cisoun
G4JC G4JC
@ -44,6 +44,7 @@ Copyright (C) 2010-2016:
GreenXenith GreenXenith
kaeza kaeza
kilbith kilbith
CloudyProton
You are free to: You are free to:
Share — copy and redistribute the material in any medium or format. Share — copy and redistribute the material in any medium or format.
@ -111,7 +112,6 @@ http://creativecommons.org/licenses/by-sa/4.0/
Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0) Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0)
Copyright (C) 2014-2016 Neuromancer Copyright (C) 2014-2016 Neuromancer
You are free to: You are free to:
Share — copy and redistribute the material in any medium or format. Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially. Adapt — remix, transform, and build upon the material for any purpose, even commercially.

View File

@ -440,7 +440,7 @@ minetest.register_node("default:dirt_with_snow", {
tiles = {"default_snow.png", "default_dirt.png", tiles = {"default_snow.png", "default_dirt.png",
{name = "default_dirt.png^default_snow_side.png", {name = "default_dirt.png^default_snow_side.png",
tileable_vertical = false}}, tileable_vertical = false}},
groups = {crumbly = 3, spreading_dirt_type = 1, snowy = 1}, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1},
drop = 'default:dirt', drop = 'default:dirt',
sounds = default.node_sound_dirt_defaults({ sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_snow_footstep", gain = 0.15}, footstep = {name = "default_snow_footstep", gain = 0.15},
@ -608,7 +608,7 @@ minetest.register_node("default:sapling", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -673,9 +673,7 @@ minetest.register_node("default:apple", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
after_place_node = function(pos, placer, itemstack) after_place_node = function(pos, placer, itemstack)
if placer:is_player() then minetest.set_node(pos, {name = "default:apple", param2 = 1})
minetest.set_node(pos, {name = "default:apple", param2 = 1})
end
end, end,
}) })
@ -742,7 +740,7 @@ minetest.register_node("default:junglesapling", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -821,7 +819,7 @@ minetest.register_node("default:pine_sapling", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -901,7 +899,7 @@ minetest.register_node("default:acacia_sapling", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -979,7 +977,7 @@ minetest.register_node("default:aspen_sapling", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -1362,7 +1360,7 @@ minetest.register_node("default:bush_sapling", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(1200, 2400)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -1433,7 +1431,7 @@ minetest.register_node("default:acacia_bush_sapling", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(1200, 2400)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -1783,13 +1781,14 @@ local function get_chest_formspec(pos)
end end
local function chest_lid_obstructed(pos) local function chest_lid_obstructed(pos)
local above = { x = pos.x, y = pos.y + 1, z = pos.z } local above = {x = pos.x, y = pos.y + 1, z = pos.z}
local def = minetest.registered_nodes[minetest.get_node(above).name] local def = minetest.registered_nodes[minetest.get_node(above).name]
-- allow ladders, signs, wallmounted things and torches to not obstruct -- allow ladders, signs, wallmounted things and torches to not obstruct
if def.drawtype == "airlike" or if def and
(def.drawtype == "airlike" or
def.drawtype == "signlike" or def.drawtype == "signlike" or
def.drawtype == "torchlike" or def.drawtype == "torchlike" or
(def.drawtype == "nodebox" and def.paramtype2 == "wallmounted") then (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then
return false return false
end end
return true return true
@ -1797,6 +1796,24 @@ end
local open_chests = {} local open_chests = {}
local function chest_lid_close(pn)
local pos = open_chests[pn].pos
local sound = open_chests[pn].sound
local swap = open_chests[pn].swap
open_chests[pn] = nil
for k, v in pairs(open_chests) do
if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
return true
end
end
local node = minetest.get_node(pos)
minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap,
param2 = node.param2 })
minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10})
end
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "default:chest" then if formname ~= "default:chest" then
return return
@ -1810,23 +1827,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return return
end end
local pos = open_chests[pn].pos chest_lid_close(pn)
local sound = open_chests[pn].sound
local swap = open_chests[pn].swap
local node = minetest.get_node(pos)
open_chests[pn] = nil
for k, v in pairs(open_chests) do
if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
return true
end
end
minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap,
param2 = node.param2 })
minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10})
return true return true
end) end)
minetest.register_on_leaveplayer(function(player)
local pn = player:get_player_name()
if open_chests[pn] then
chest_lid_close(pn)
end
end)
function default.register_chest(name, d) function default.register_chest(name, d)
local def = table.copy(d) local def = table.copy(d)
def.drawtype = "mesh" def.drawtype = "mesh"
@ -1960,6 +1971,13 @@ function default.register_chest(name, d)
open_chests[clicker:get_player_name()] = { pos = pos, open_chests[clicker:get_player_name()] = { pos = pos,
sound = def.sound_close, swap = name } sound = def.sound_close, swap = name }
end end
def.on_blast = function(pos)
local drops = {}
default.get_inventory_drops(pos, "main", drops)
drops[#drops+1] = "default:" .. name
minetest.remove_node(pos)
return drops
end
end end
def.on_metadata_inventory_move = function(pos, from_list, from_index, def.on_metadata_inventory_move = function(pos, from_list, from_index,
@ -1977,27 +1995,28 @@ function default.register_chest(name, d)
" takes " .. stack:get_name() .. " takes " .. stack:get_name() ..
" from chest at " .. minetest.pos_to_string(pos)) " from chest at " .. minetest.pos_to_string(pos))
end end
def.on_blast = function(pos)
local drops = {}
default.get_inventory_drops(pos, "main", drops)
drops[#drops+1] = "default:chest"
minetest.remove_node(pos)
return drops
end
local def_opened = table.copy(def) local def_opened = table.copy(def)
local def_closed = table.copy(def) local def_closed = table.copy(def)
def_opened.mesh = "chest_open.obj" def_opened.mesh = "chest_open.obj"
for i = 1, #def_opened.tiles do
if type(def_opened.tiles[i]) == "string" then
def_opened.tiles[i] = {name = def_opened.tiles[i], backface_culling = true}
elseif def_opened.tiles[i].backface_culling == nil then
def_opened.tiles[i].backface_culling = true
end
end
def_opened.drop = "default:" .. name def_opened.drop = "default:" .. name
def_opened.groups.not_in_creative_inventory = 1 def_opened.groups.not_in_creative_inventory = 1
def_opened.selection_box = { def_opened.selection_box = {
type = "fixed", type = "fixed",
fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 },
} }
def_opened.can_dig = function() def_opened.can_dig = function()
return false return false
end end
def_opened.on_blast = function() end
def_closed.mesh = nil def_closed.mesh = nil
def_closed.drawtype = nil def_closed.drawtype = nil

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

After

Width:  |  Height:  |  Size: 140 B

View File

@ -389,7 +389,8 @@ minetest.register_tool("default:key", {
local node = minetest.get_node(under) local node = minetest.get_node(under)
local def = minetest.registered_nodes[node.name] local def = minetest.registered_nodes[node.name]
if def and def.on_rightclick and if def and def.on_rightclick and
not (placer and placer:get_player_control().sneak) then not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return def.on_rightclick(under, node, placer, itemstack, return def.on_rightclick(under, node, placer, itemstack,
pointed_thing) or itemstack pointed_thing) or itemstack
end end

View File

@ -63,7 +63,8 @@ minetest.register_node("default:torch", {
local node = minetest.get_node(under) local node = minetest.get_node(under)
local def = minetest.registered_nodes[node.name] local def = minetest.registered_nodes[node.name]
if def and def.on_rightclick and if def and def.on_rightclick and
((not placer) or (placer and not placer:get_player_control().sneak)) then not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return def.on_rightclick(under, node, placer, itemstack, return def.on_rightclick(under, node, placer, itemstack,
pointed_thing) or itemstack pointed_thing) or itemstack
end end

View File

@ -31,12 +31,12 @@ local function is_snow_nearby(pos)
end end
-- Sapling ABM -- Grow sapling
function default.grow_sapling(pos) function default.grow_sapling(pos)
if not default.can_grow(pos) then if not default.can_grow(pos) then
-- try a bit later again -- try again 5 min later
minetest.get_node_timer(pos):start(math.random(240, 600)) minetest.get_node_timer(pos):start(300)
return return
end end
@ -94,7 +94,7 @@ minetest.register_lbm({
"default:pine_sapling", "default:acacia_sapling", "default:pine_sapling", "default:acacia_sapling",
"default:aspen_sapling"}, "default:aspen_sapling"},
action = function(pos) action = function(pos)
minetest.get_node_timer(pos):start(math.random(1200, 2400)) minetest.get_node_timer(pos):start(math.random(300, 1500))
end end
}) })
@ -468,7 +468,9 @@ function default.sapling_on_place(itemstack, placer, pointed_thing,
local node = minetest.get_node_or_nil(pos) local node = minetest.get_node_or_nil(pos)
local pdef = node and minetest.registered_nodes[node.name] local pdef = node and minetest.registered_nodes[node.name]
if pdef and pdef.on_rightclick and not placer:get_player_control().sneak then if pdef and pdef.on_rightclick and
not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing)
end end
@ -481,7 +483,7 @@ function default.sapling_on_place(itemstack, placer, pointed_thing,
end end
end end
local player_name = placer:get_player_name() local player_name = placer and placer:get_player_name() or ""
-- Check sapling position for protection -- Check sapling position for protection
if minetest.is_protected(pos, player_name) then if minetest.is_protected(pos, player_name) then
minetest.record_protection_violation(pos, player_name) minetest.record_protection_violation(pos, player_name)

View File

@ -203,12 +203,7 @@ end
local function can_dig_door(pos, digger) local function can_dig_door(pos, digger)
replace_old_owner_information(pos) replace_old_owner_information(pos)
if default.can_interact_with_node(digger, pos) then return default.can_interact_with_node(digger, pos)
return true
else
minetest.record_protection_violation(pos, digger:get_player_name())
return false
end
end end
function doors.register(name, def) function doors.register(name, def)
@ -266,7 +261,8 @@ function doors.register(name, def)
local node = minetest.get_node(pointed_thing.under) local node = minetest.get_node(pointed_thing.under)
local pdef = minetest.registered_nodes[node.name] local pdef = minetest.registered_nodes[node.name]
if pdef and pdef.on_rightclick and if pdef and pdef.on_rightclick and
not placer:get_player_control().sneak then not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return pdef.on_rightclick(pointed_thing.under, return pdef.on_rightclick(pointed_thing.under,
node, placer, itemstack, pointed_thing) node, placer, itemstack, pointed_thing)
end end
@ -290,12 +286,12 @@ function doors.register(name, def)
return itemstack return itemstack
end end
local pn = placer:get_player_name() local pn = placer and placer:get_player_name() or ""
if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then
return itemstack return itemstack
end end
local dir = minetest.dir_to_facedir(placer:get_look_dir()) local dir = placer and minetest.dir_to_facedir(placer:get_look_dir()) or 0
local ref = { local ref = {
{x = -1, y = 0, z = 0}, {x = -1, y = 0, z = 0},
@ -712,7 +708,7 @@ function doors.register_fencegate(name, def)
local fence = { local fence = {
description = def.description, description = def.description,
drawtype = "mesh", drawtype = "mesh",
tiles = {def.texture}, tiles = {},
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
sunlight_propagates = true, sunlight_propagates = true,
@ -734,6 +730,16 @@ function doors.register_fencegate(name, def)
}, },
} }
if type(def.texture) == "string" then
fence.tiles[1] = {name = def.texture, backface_culling = true}
elseif def.texture.backface_culling == nil then
fence.tiles[1] = table.copy(def.texture)
fence.tiles[1].backface_culling = true
else
fence.tiles[1] = def.texture
end
if not fence.sounds then if not fence.sounds then
fence.sounds = default.node_sound_wood_defaults() fence.sounds = default.node_sound_wood_defaults()
end end

View File

@ -118,15 +118,6 @@ farming.register_hoe = function(name, def)
{"", "group:stick", ""} {"", "group:stick", ""}
} }
}) })
-- Reverse Recipe
minetest.register_craft({
output = name:sub(2),
recipe = {
{"", def.material, def.material},
{"", "group:stick", ""},
{"", "group:stick", ""}
}
})
end end
end end
@ -153,12 +144,14 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname)
local under = minetest.get_node(pt.under) local under = minetest.get_node(pt.under)
local above = minetest.get_node(pt.above) local above = minetest.get_node(pt.above)
if minetest.is_protected(pt.under, placer:get_player_name()) then local player_name = placer and placer:get_player_name() or ""
minetest.record_protection_violation(pt.under, placer:get_player_name())
if minetest.is_protected(pt.under, player_name) then
minetest.record_protection_violation(pt.under, player_name)
return return
end end
if minetest.is_protected(pt.above, placer:get_player_name()) then if minetest.is_protected(pt.above, player_name) then
minetest.record_protection_violation(pt.above, placer:get_player_name()) minetest.record_protection_violation(pt.above, player_name)
return return
end end
@ -189,7 +182,7 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname)
minetest.add_node(pt.above, {name = plantname, param2 = 1}) minetest.add_node(pt.above, {name = plantname, param2 = 1})
tick(pt.above) tick(pt.above)
if not (creative and creative.is_enabled_for if not (creative and creative.is_enabled_for
and creative.is_enabled_for(placer:get_player_name())) then and creative.is_enabled_for(player_name)) then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
@ -319,7 +312,8 @@ farming.register_plant = function(name, def)
local node = minetest.get_node(under) local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name] local udef = minetest.registered_nodes[node.name]
if udef and udef.on_rightclick and if udef and udef.on_rightclick and
not (placer and placer:get_player_control().sneak) then not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return udef.on_rightclick(under, node, placer, itemstack, return udef.on_rightclick(under, node, placer, itemstack,
pointed_thing) or itemstack pointed_thing) or itemstack
end end

View File

@ -1,2 +1,3 @@
default default
wool wool
stairs

View File

@ -98,6 +98,16 @@ minetest.register_node("farming:straw", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
}) })
stairs.register_stair_and_slab(
"straw",
"farming:straw",
{snappy = 3, flammable = 4},
{"farming_straw.png"},
"Straw Stair",
"Straw Slab",
default.node_sound_leaves_defaults()
)
minetest.register_abm({ minetest.register_abm({
label = "Farming soil", label = "Farming soil",
nodenames = {"group:field"}, nodenames = {"group:field"},

View File

@ -127,24 +127,29 @@ function flowers.flower_spread(pos, node)
local pos0 = vector.subtract(pos, 4) local pos0 = vector.subtract(pos, 4)
local pos1 = vector.add(pos, 4) local pos1 = vector.add(pos, 4)
if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then -- Maximum flower density created by mapgen is 13 per 9x9 area.
-- The limit of 7 below was tuned by in-game testing to result in a maximum
-- flower density by ABM spread of 13 per 9x9 area.
-- Warning: Setting this limit theoretically without in-game testing
-- results in a maximum flower density by ABM spread that is far too high.
if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 7 then
return return
end end
local soils = minetest.find_nodes_in_area_under_air( local soils = minetest.find_nodes_in_area_under_air(
pos0, pos1, "group:soil") pos0, pos1, "group:soil")
if #soils > 0 then local num_soils = #soils
local seedling = soils[math.random(#soils)] if num_soils >= 1 then
local seedling_above = for si = 1, math.min(3, num_soils) do
{x = seedling.x, y = seedling.y + 1, z = seedling.z} local soil = soils[math.random(num_soils)]
light = minetest.get_node_light(seedling_above) local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z}
if not light or light < 13 or light = minetest.get_node_light(soil_above)
-- Desert sand is in the soil group if light and light >= 13 and
minetest.get_node(seedling).name == "default:desert_sand" then -- Desert sand is in the soil group
return minetest.get_node(soil).name ~= "default:desert_sand" then
minetest.set_node(soil_above, {name = node.name})
end
end end
minetest.set_node(seedling_above, {name = node.name})
end end
end end
@ -152,7 +157,7 @@ minetest.register_abm({
label = "Flower spread", label = "Flower spread",
nodenames = {"group:flora"}, nodenames = {"group:flora"},
interval = 13, interval = 13,
chance = 96, chance = 300,
action = function(...) action = function(...)
flowers.flower_spread(...) flowers.flower_spread(...)
end, end,
@ -204,38 +209,34 @@ minetest.register_node("flowers:mushroom_brown", {
-- Mushroom spread and death -- Mushroom spread and death
function flowers.mushroom_spread(pos, node)
if minetest.get_node_light(pos, nil) == 15 then
minetest.remove_node(pos)
return
end
local positions = minetest.find_nodes_in_area_under_air(
{x = pos.x - 1, y = pos.y - 2, z = pos.z - 1},
{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
{"group:soil", "group:tree"})
if #positions == 0 then
return
end
local pos2 = positions[math.random(#positions)]
pos2.y = pos2.y + 1
if minetest.get_node_light(pos, 0.5) <= 3 and
minetest.get_node_light(pos2, 0.5) <= 3 then
minetest.set_node(pos2, {name = node.name})
end
end
minetest.register_abm({ minetest.register_abm({
label = "Mushroom spread", label = "Mushroom spread",
nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"}, nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
interval = 11, interval = 11,
chance = 50, chance = 150,
action = function(pos, node) action = function(...)
if minetest.get_node_light(pos, nil) == 15 then flowers.mushroom_spread(...)
minetest.remove_node(pos) end,
return
end
local random = {
x = pos.x + math.random(-2, 2),
y = pos.y + math.random(-1, 1),
z = pos.z + math.random(-2, 2)
}
local random_node = minetest.get_node_or_nil(random)
if not random_node or random_node.name ~= "air" then
return
end
local node_under = minetest.get_node_or_nil({x = random.x,
y = random.y - 1, z = random.z})
if not node_under then
return
end
if (minetest.get_item_group(node_under.name, "soil") ~= 0 or
minetest.get_item_group(node_under.name, "tree") ~= 0) and
minetest.get_node_light(pos, 0.5) <= 3 and
minetest.get_node_light(random, 0.5) <= 3 then
minetest.set_node(random, {name = node.name})
end
end
}) })
@ -280,12 +281,17 @@ minetest.register_node("flowers:waterlily", {
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above local pos = pointed_thing.above
local node = minetest.get_node(pointed_thing.under).name local node = minetest.get_node(pointed_thing.under)
local def = minetest.registered_nodes[node] local def = minetest.registered_nodes[node.name]
local player_name = placer:get_player_name() local player_name = placer and placer:get_player_name() or ""
if def and def.on_rightclick then
return def.on_rightclick(pointed_thing.under, node, placer, itemstack,
pointed_thing)
end
if def and def.liquidtype == "source" and if def and def.liquidtype == "source" and
minetest.get_item_group(node, "water") > 0 then minetest.get_item_group(node.name, "water") > 0 then
if not minetest.is_protected(pos, player_name) then if not minetest.is_protected(pos, player_name) then
minetest.set_node(pos, {name = "flowers:waterlily", minetest.set_node(pos, {name = "flowers:waterlily",
param2 = math.random(0, 3)}) param2 = math.random(0, 3)})

View File

@ -1,120 +0,0 @@
local sound_time = 0
local sound_play_on = 0
local sound_play_regnum = nil
local inst_list = {}
minetest.register_globalstep(function(dtime)
if sound_play_on == 0 then
sound_play_on = 1
inst_list = {}
for _,player in ipairs(minetest.get_connected_players()) do
local player_inv = player:get_inventory()
local inst1 = player_inv:get_stack("inst", 1):get_count()
local inst2 = player_inv:get_stack("inst", 2):get_count()
if inst1 == 1 then
table.insert(inst_list, "Theme1")
end
if inst2 == 1 then
table.insert(inst_list, "Theme2")
end
local inst = inst_list[ math.random(#inst_list)]
local music = player_inv:get_stack("music", 1):get_count()
if music == 1 then
sound_play_regnum = minetest.sound_play(inst, {
to_player = player,
})
end
end
end
sound_time = sound_time+dtime
if sound_time > 120 then
sound_time = 0
sound_play_on = 0
end
end)
set = {}
set.get_formspec = function(player, pos)
if player == nil then
return
end
local player_inv = player:get_inventory()
player_inv:set_size("music", 1)
player_inv:set_size("inst", 10)
local music = player_inv:get_stack("music", 1):get_count()
local inst1 = player_inv:get_stack("inst", 1):get_count()
local inst2 = player_inv:get_stack("inst", 2):get_count()
formspec = "size[6,5]"
.."background[9,10.3;1,1;gui_formbg.png;true]"
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]"
if music == 0 then
formspec = formspec.."checkbox[0,0;music;Background Music on;false]"
end
if music == 1 then
formspec = formspec.."checkbox[0,0;music;Background Music on;true]"
end
if inst1 == 0 and music == 1 then
formspec = formspec.."checkbox[0.5,1;inst1;1248's Theme 1;false]"
end
if inst1 == 1 and music == 1 then
formspec = formspec.."checkbox[0.5,1;inst1;1248's Theme 1;true]"
end
if inst2 == 0 and music == 1 then
formspec = formspec.."checkbox[0.5,1.3;inst2;1248's Theme 2;false]"
end
if inst2 == 1 and music == 1 then
formspec = formspec.."checkbox[0.5,1.3;inst2;1248's Theme 2;true]"
end
return formspec
end
minetest.register_on_joinplayer(function(player)
player:set_inventory_formspec(set.get_formspec(player, player:get_pos()))
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if player == nil then
return
end
local player_inv = player:get_inventory()
if fields.inst1 then
local inst = player_inv:get_stack("inst", 1):get_count()
if inst == 0 then
player_inv:set_stack("inst", 1, "default:dirt")
else
player_inv:set_stack("inst", 1, nil)
end
local inst1 = player_inv:get_stack("inst", 1):get_count()
local inst2 = player_inv:get_stack("inst", 2):get_count()
if inst1 == 0 and inst2 == 0 then
player_inv:set_stack("music", 1, nil)
end
player:set_inventory_formspec(set.get_formspec(player, player:get_pos()))
end
if fields.inst2 then
local inst = player_inv:get_stack("inst", 2):get_count()
if inst == 0 then
player_inv:set_stack("inst", 2, "default:dirt")
else
player_inv:set_stack("inst", 2, nil)
end
local inst1 = player_inv:get_stack("inst", 1):get_count()
local inst2 = player_inv:get_stack("inst", 2):get_count()
if inst1 == 0 and inst2 == 0 then
player_inv:set_stack("music", 1, nil)
end
player:set_inventory_formspec(set.get_formspec(player, player:get_pos()))
end
if fields.music then
local music = player_inv:get_stack("music", 1):get_count()
if music == 0 then
player_inv:set_stack("music", 1, "default:dirt")
player_inv:set_stack("inst", 1, "default:dirt")
player_inv:set_stack("inst", 2, nil)
else
player_inv:set_stack("music", 1, nil)
if sound_play_regnum ~= nil then
minetest.sound_stop(sound_play_regnum)
end
end
player:set_inventory_formspec(set.get_formspec(player, player:get_pos()))
end
end)

View File

@ -85,9 +85,10 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses)
end end
local pos = pointed_thing.under local pos = pointed_thing.under
local player_name = user and user:get_player_name() or ""
if minetest.is_protected(pos, user:get_player_name()) then if minetest.is_protected(pos, player_name) then
minetest.record_protection_violation(pos, user:get_player_name()) minetest.record_protection_violation(pos, player_name)
return return
end end
@ -133,8 +134,8 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses)
minetest.check_for_falling(pos) minetest.check_for_falling(pos)
end end
if not (creative and creative.is_enabled_for if not (creative and creative.is_enabled_for and
and creative.is_enabled_for(user:get_player_name())) then creative.is_enabled_for(player_name)) then
itemstack:add_wear(65535 / ((uses or 200) - 1)) itemstack:add_wear(65535 / ((uses or 200) - 1))
end end

View File

@ -1,2 +1 @@
default default
farming

View File

@ -22,21 +22,23 @@ local function rotate_and_place(itemstack, placer, pointed_thing)
local p1 = pointed_thing.above local p1 = pointed_thing.above
local param2 = 0 local param2 = 0
local placer_pos = placer:getpos() if placer then
if placer_pos then local placer_pos = placer:getpos()
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) if placer_pos then
end param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
end
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
local fpos = finepos.y % 1 local fpos = finepos.y % 1
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
or (fpos < -0.5 and fpos > -0.999999999) then or (fpos < -0.5 and fpos > -0.999999999) then
param2 = param2 + 20 param2 = param2 + 20
if param2 == 21 then if param2 == 21 then
param2 = 23 param2 = 23
elseif param2 == 23 then elseif param2 == 23 then
param2 = 21 param2 = 21
end
end end
end end
return minetest.item_place(itemstack, placer, pointed_thing, param2) return minetest.item_place(itemstack, placer, pointed_thing, param2)
@ -46,16 +48,29 @@ end
-- Node will be called stairs:stair_<subname> -- Node will be called stairs:stair_<subname>
function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) function stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
groups.stair = 1 local stair_images = {}
for i, image in ipairs(images) do
if type(image) == "string" then
stair_images[i] = {
name = image,
backface_culling = true,
}
elseif image.backface_culling == nil then -- override using any other value
stair_images[i] = table.copy(image)
stair_images[i].backface_culling = true
end
end
local new_groups = table.copy(groups)
new_groups.stair = 1
minetest.register_node(":stairs:stair_" .. subname, { minetest.register_node(":stairs:stair_" .. subname, {
description = description, description = description,
drawtype = "mesh", drawtype = "mesh",
mesh = "stairs_stair.obj", mesh = "stairs_stair.obj",
tiles = images, tiles = stair_images,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
groups = groups, groups = new_groups,
sounds = sounds, sounds = sounds,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
@ -89,16 +104,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
end end
if recipeitem then if recipeitem then
minetest.register_craft({ -- Recipe matches appearence in inventory
output = 'stairs:stair_' .. subname .. ' 8',
recipe = {
{recipeitem, "", ""},
{recipeitem, recipeitem, ""},
{recipeitem, recipeitem, recipeitem},
},
})
-- Flipped recipe for the silly minecrafters
minetest.register_craft({ minetest.register_craft({
output = 'stairs:stair_' .. subname .. ' 8', output = 'stairs:stair_' .. subname .. ' 8',
recipe = { recipe = {
@ -132,7 +138,8 @@ local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
-- Node will be called stairs:slab_<subname> -- Node will be called stairs:slab_<subname>
function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) function stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
groups.slab = 1 local new_groups = table.copy(groups)
new_groups.slab = 1
minetest.register_node(":stairs:slab_" .. subname, { minetest.register_node(":stairs:slab_" .. subname, {
description = description, description = description,
drawtype = "nodebox", drawtype = "nodebox",
@ -140,7 +147,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
groups = groups, groups = new_groups,
sounds = sounds, sounds = sounds,
node_box = { node_box = {
type = "fixed", type = "fixed",
@ -149,8 +156,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local under = minetest.get_node(pointed_thing.under) local under = minetest.get_node(pointed_thing.under)
local wield_item = itemstack:get_name() local wield_item = itemstack:get_name()
local player_name = placer and placer:get_player_name() or ""
local creative_enabled = (creative and creative.is_enabled_for local creative_enabled = (creative and creative.is_enabled_for
and creative.is_enabled_for(placer:get_player_name())) and creative.is_enabled_for(player_name))
if under and under.name:find("stairs:slab_") then if under and under.name:find("stairs:slab_") then
-- place slab using under node orientation -- place slab using under node orientation
@ -166,9 +174,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
if not recipeitem then if not recipeitem then
return itemstack return itemstack
end end
local player_name = placer:get_player_name()
if minetest.is_protected(pointed_thing.under, player_name) and not if minetest.is_protected(pointed_thing.under, player_name) and not
minetest.check_player_privs(placer, "protection_bypass") then minetest.check_player_privs(player_name, "protection_bypass") then
minetest.record_protection_violation(pointed_thing.under, minetest.record_protection_violation(pointed_thing.under,
player_name) player_name)
return return
@ -538,16 +545,6 @@ stairs.register_stair_and_slab(
default.node_sound_stone_defaults() default.node_sound_stone_defaults()
) )
stairs.register_stair_and_slab(
"straw",
"farming:straw",
{snappy = 3, flammable = 4},
{"farming_straw.png"},
"Straw Stair",
"Straw Slab",
default.node_sound_leaves_defaults()
)
stairs.register_stair_and_slab( stairs.register_stair_and_slab(
"steelblock", "steelblock",
"default:steelblock", "default:steelblock",

View File

@ -9,7 +9,7 @@ minetest.register_on_joinplayer(function(player)
offset = {x=0, y=10}, offset = {x=0, y=10},
alignment = {x=1, y=0}, alignment = {x=1, y=0},
number = 0xFFFFFF , number = 0xFFFFFF ,
text = "For Minetest : 0.4.16", text = "For Minetest : 0.4.17.x",
}) })
player:hud_add({ player:hud_add({
hud_elem_type = "text", hud_elem_type = "text",
@ -17,7 +17,7 @@ minetest.register_on_joinplayer(function(player)
offset = {x=0, y=30}, offset = {x=0, y=30},
alignment = {x=1, y=0}, alignment = {x=1, y=0},
number = 0xFFFFFF , number = 0xFFFFFF ,
text = "Game Version : 1.7.1", text = "Game Version : 1.8.0",
}) })
hud_levels[name] = player:hud_add({ hud_levels[name] = player:hud_add({
hud_elem_type = "text", hud_elem_type = "text",
@ -28,7 +28,9 @@ minetest.register_on_joinplayer(function(player)
text = "Level: /", text = "Level: /",
}) })
end) end)
minetest.register_on_joinplayer(function(player)
player:set_inventory_formspec("")
end)
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
for _,player in ipairs(players) do for _,player in ipairs(players) do
@ -1771,7 +1773,7 @@ w31.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;1]" .."button[0,1;1,1;;1]"
if tonumber(level2) > 1 then if tonumber(level2) > 1 then
formspec = formspec.."button[1,1;1,1;;2]" formspec = formspec.."button[1,1;1,1;;2]"
@ -1864,7 +1866,7 @@ w32.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;26]" .."button[0,1;1,1;;26]"
.."button[1.5,6;1,1;waa;<]" .."button[1.5,6;1,1;waa;<]"
if tonumber(level2) > 26 then if tonumber(level2) > 26 then
@ -1958,7 +1960,7 @@ w33.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;51]" .."button[0,1;1,1;;51]"
.."button[1.5,6;1,1;wab;<]" .."button[1.5,6;1,1;wab;<]"
if tonumber(level2) > 51 then if tonumber(level2) > 51 then
@ -2052,7 +2054,7 @@ w34.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;76]" .."button[0,1;1,1;;76]"
.."button[1.5,6;1,1;wac;<]" .."button[1.5,6;1,1;wac;<]"
if tonumber(level2) > 76 then if tonumber(level2) > 76 then
@ -2146,7 +2148,7 @@ w35.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;101]" .."button[0,1;1,1;;101]"
.."button[1.5,6;1,1;wad;<]" .."button[1.5,6;1,1;wad;<]"
if tonumber(level2) > 101 then if tonumber(level2) > 101 then
@ -2240,7 +2242,7 @@ w36.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;126]" .."button[0,1;1,1;;126]"
.."button[1.5,6;1,1;wae;<]" .."button[1.5,6;1,1;wae;<]"
if tonumber(level2) > 126 then if tonumber(level2) > 126 then
@ -2334,7 +2336,7 @@ w37.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;151]" .."button[0,1;1,1;;151]"
.."button[1.5,6;1,1;waf;<]" .."button[1.5,6;1,1;waf;<]"
if tonumber(level2) > 151 then if tonumber(level2) > 151 then
@ -2428,7 +2430,7 @@ w38.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;176]" .."button[0,1;1,1;;176]"
.."button[1.5,6;1,1;wag;<]" .."button[1.5,6;1,1;wag;<]"
if tonumber(level2) > 176 then if tonumber(level2) > 176 then
@ -2522,7 +2524,7 @@ w39.get_formspec = function(player, pos)
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]" .."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;201]" .."button[0,1;1,1;;201]"
.."button[1.5,6;1,1;wah;<]" .."button[1.5,6;1,1;wah;<]"
if tonumber(level2) > 201 then if tonumber(level2) > 201 then
@ -2589,7 +2591,435 @@ w39.get_formspec = function(player, pos)
formspec = formspec.."button[1,5;1,1;;222]" formspec = formspec.."button[1,5;1,1;;222]"
end end
if tonumber(level2) > 222 then if tonumber(level2) > 222 then
formspec = formspec.."label[0,5.8;wait until the next update]" formspec = formspec.."button[2,5;1,1;;223]"
end
if tonumber(level2) > 223 then
formspec = formspec.."button[3,5;1,1;;224]"
end
if tonumber(level2) > 224 then
formspec = formspec.."button[4,5;1,1;;225]"
end
if tonumber(level2) > 225 then
formspec = formspec.."button[2.5,6;1,1;waj;>]"
end
return formspec
end
local w310 = {}
w310.get_formspec = function(player, pos)
if player == nil then
return
end
local player_inv = player:get_inventory()
lv = io.open(minetest.get_worldpath().."/level3.txt", "r")
local level2 = lv:read("*l")
lv:close()
formspec = "size[5,6.5]"
.."background[5,6.5;1,1;gui_formbg.png;true]"
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;226]"
.."button[1.5,6;1,1;wai;<]"
if tonumber(level2) > 226 then
formspec = formspec.."button[1,1;1,1;;227]"
end
if tonumber(level2) > 227 then
formspec = formspec.."button[2,1;1,1;;228]"
end
if tonumber(level2) > 228 then
formspec = formspec.."button[3,1;1,1;;229]"
end
if tonumber(level2) > 229 then
formspec = formspec.."button[4,1;1,1;;230]"
end
if tonumber(level2) > 230 then
formspec = formspec.."button[0,2;1,1;;231]"
end
if tonumber(level2) > 231 then
formspec = formspec.."button[1,2;1,1;;232]"
end
if tonumber(level2) > 232 then
formspec = formspec.."button[2,2;1,1;;233]"
end
if tonumber(level2) > 233 then
formspec = formspec.."button[3,2;1,1;;234]"
end
if tonumber(level2) > 234 then
formspec = formspec.."button[4,2;1,1;;235]"
end
if tonumber(level2) > 235 then
formspec = formspec.."button[0,3;1,1;;236]"
end
if tonumber(level2) > 236 then
formspec = formspec.."button[1,3;1,1;;237]"
end
if tonumber(level2) > 237 then
formspec = formspec.."button[2,3;1,1;;238]"
end
if tonumber(level2) > 238 then
formspec = formspec.."button[3,3;1,1;;239]"
end
if tonumber(level2) > 239 then
formspec = formspec.."button[4,3;1,1;;240]"
end
if tonumber(level2) > 240 then
formspec = formspec.."button[0,4;1,1;;241]"
end
if tonumber(level2) > 241 then
formspec = formspec.."button[1,4;1,1;;242]"
end
if tonumber(level2) > 242 then
formspec = formspec.."button[2,4;1,1;;243]"
end
if tonumber(level2) > 243 then
formspec = formspec.."button[3,4;1,1;;244]"
end
if tonumber(level2) > 244 then
formspec = formspec.."button[4,4;1,1;;245]"
end
if tonumber(level2) > 245 then
formspec = formspec.."button[0,5;1,1;;246]"
end
if tonumber(level2) > 246 then
formspec = formspec.."button[1,5;1,1;;247]"
end
if tonumber(level2) > 247 then
formspec = formspec.."button[2,5;1,1;;248]"
end
if tonumber(level2) > 248 then
formspec = formspec.."button[3,5;1,1;;249]"
end
if tonumber(level2) > 249 then
formspec = formspec.."button[4,5;1,1;;250]"
end
if tonumber(level2) > 250 then
formspec = formspec.."button[2.5,6;1,1;wak;>]"
end
return formspec
end
local w311 = {}
w311.get_formspec = function(player, pos)
if player == nil then
return
end
local player_inv = player:get_inventory()
lv = io.open(minetest.get_worldpath().."/level3.txt", "r")
local level2 = lv:read("*l")
lv:close()
formspec = "size[5,6.5]"
.."background[5,6.5;1,1;gui_formbg.png;true]"
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;251]"
.."button[1.5,6;1,1;waj;<]"
if tonumber(level2) > 251 then
formspec = formspec.."button[1,1;1,1;;252]"
end
if tonumber(level2) > 252 then
formspec = formspec.."button[2,1;1,1;;253]"
end
if tonumber(level2) > 253 then
formspec = formspec.."button[3,1;1,1;;254]"
end
if tonumber(level2) > 254 then
formspec = formspec.."button[4,1;1,1;;255]"
end
if tonumber(level2) > 255 then
formspec = formspec.."button[0,2;1,1;;256]"
end
if tonumber(level2) > 256 then
formspec = formspec.."button[1,2;1,1;;257]"
end
if tonumber(level2) > 257 then
formspec = formspec.."button[2,2;1,1;;258]"
end
if tonumber(level2) > 258 then
formspec = formspec.."button[3,2;1,1;;259]"
end
if tonumber(level2) > 259 then
formspec = formspec.."button[4,2;1,1;;260]"
end
if tonumber(level2) > 260 then
formspec = formspec.."button[0,3;1,1;;261]"
end
if tonumber(level2) > 261 then
formspec = formspec.."button[1,3;1,1;;262]"
end
if tonumber(level2) > 262 then
formspec = formspec.."button[2,3;1,1;;263]"
end
if tonumber(level2) > 263 then
formspec = formspec.."button[3,3;1,1;;264]"
end
if tonumber(level2) > 264 then
formspec = formspec.."button[4,3;1,1;;265]"
end
if tonumber(level2) > 265 then
formspec = formspec.."button[0,4;1,1;;266]"
end
if tonumber(level2) > 266 then
formspec = formspec.."button[1,4;1,1;;267]"
end
if tonumber(level2) > 267 then
formspec = formspec.."button[2,4;1,1;;268]"
end
if tonumber(level2) > 268 then
formspec = formspec.."button[3,4;1,1;;269]"
end
if tonumber(level2) > 269 then
formspec = formspec.."button[4,4;1,1;;270]"
end
if tonumber(level2) > 270 then
formspec = formspec.."button[0,5;1,1;;271]"
end
if tonumber(level2) > 271 then
formspec = formspec.."button[1,5;1,1;;272]"
end
if tonumber(level2) > 272 then
formspec = formspec.."button[2,5;1,1;;273]"
end
if tonumber(level2) > 273 then
formspec = formspec.."button[3,5;1,1;;274]"
end
if tonumber(level2) > 274 then
formspec = formspec.."button[4,5;1,1;;275]"
end
if tonumber(level2) > 275 then
formspec = formspec.."button[2.5,6;1,1;wal;>]"
end
return formspec
end
local w312 = {}
w312.get_formspec = function(player, pos)
if player == nil then
return
end
local player_inv = player:get_inventory()
lv = io.open(minetest.get_worldpath().."/level3.txt", "r")
local level2 = lv:read("*l")
lv:close()
formspec = "size[5,6.5]"
.."background[5,6.5;1,1;gui_formbg.png;true]"
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;276]"
.."button[1.5,6;1,1;wak;<]"
if tonumber(level2) > 276 then
formspec = formspec.."button[1,1;1,1;;277]"
end
if tonumber(level2) > 277 then
formspec = formspec.."button[2,1;1,1;;278]"
end
if tonumber(level2) > 278 then
formspec = formspec.."button[3,1;1,1;;279]"
end
if tonumber(level2) > 279 then
formspec = formspec.."button[4,1;1,1;;280]"
end
if tonumber(level2) > 280 then
formspec = formspec.."button[0,2;1,1;;281]"
end
if tonumber(level2) > 281 then
formspec = formspec.."button[1,2;1,1;;282]"
end
if tonumber(level2) > 282 then
formspec = formspec.."button[2,2;1,1;;283]"
end
if tonumber(level2) > 283 then
formspec = formspec.."button[3,2;1,1;;284]"
end
if tonumber(level2) > 284 then
formspec = formspec.."button[4,2;1,1;;285]"
end
if tonumber(level2) > 285 then
formspec = formspec.."button[0,3;1,1;;286]"
end
if tonumber(level2) > 286 then
formspec = formspec.."button[1,3;1,1;;287]"
end
if tonumber(level2) > 287 then
formspec = formspec.."button[2,3;1,1;;288]"
end
if tonumber(level2) > 288 then
formspec = formspec.."button[3,3;1,1;;289]"
end
if tonumber(level2) > 289 then
formspec = formspec.."button[4,3;1,1;;290]"
end
if tonumber(level2) > 290 then
formspec = formspec.."button[0,4;1,1;;291]"
end
if tonumber(level2) > 291 then
formspec = formspec.."button[1,4;1,1;;292]"
end
if tonumber(level2) > 292 then
formspec = formspec.."button[2,4;1,1;;293]"
end
if tonumber(level2) > 293 then
formspec = formspec.."button[3,4;1,1;;294]"
end
if tonumber(level2) > 294 then
formspec = formspec.."button[4,4;1,1;;295]"
end
if tonumber(level2) > 295 then
formspec = formspec.."button[0,5;1,1;;296]"
end
if tonumber(level2) > 296 then
formspec = formspec.."button[1,5;1,1;;297]"
end
if tonumber(level2) > 297 then
formspec = formspec.."button[2,5;1,1;;298]"
end
if tonumber(level2) > 298 then
formspec = formspec.."button[3,5;1,1;;299]"
end
if tonumber(level2) > 299 then
formspec = formspec.."button[4,5;1,1;;300]"
end
if tonumber(level2) > 300 then
formspec = formspec.."button[2.5,6;1,1;wam;>]"
end
return formspec
end
local w313 = {}
w313.get_formspec = function(player, pos)
if player == nil then
return
end
local player_inv = player:get_inventory()
lv = io.open(minetest.get_worldpath().."/level3.txt", "r")
local level2 = lv:read("*l")
lv:close()
formspec = "size[5,6.5]"
.."background[5,6.5;1,1;gui_formbg.png;true]"
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;301]"
.."button[1.5,6;1,1;wal;<]"
if tonumber(level2) > 301 then
formspec = formspec.."button[1,1;1,1;;302]"
end
if tonumber(level2) > 302 then
formspec = formspec.."button[2,1;1,1;;303]"
end
if tonumber(level2) > 303 then
formspec = formspec.."button[3,1;1,1;;304]"
end
if tonumber(level2) > 304 then
formspec = formspec.."button[4,1;1,1;;305]"
end
if tonumber(level2) > 305 then
formspec = formspec.."button[0,2;1,1;;306]"
end
if tonumber(level2) > 306 then
formspec = formspec.."button[1,2;1,1;;307]"
end
if tonumber(level2) > 307 then
formspec = formspec.."button[2,2;1,1;;308]"
end
if tonumber(level2) > 308 then
formspec = formspec.."button[3,2;1,1;;309]"
end
if tonumber(level2) > 309 then
formspec = formspec.."button[4,2;1,1;;310]"
end
if tonumber(level2) > 310 then
formspec = formspec.."button[0,3;1,1;;311]"
end
if tonumber(level2) > 311 then
formspec = formspec.."button[1,3;1,1;;312]"
end
if tonumber(level2) > 312 then
formspec = formspec.."button[2,3;1,1;;313]"
end
if tonumber(level2) > 313 then
formspec = formspec.."button[3,3;1,1;;314]"
end
if tonumber(level2) > 314 then
formspec = formspec.."button[4,3;1,1;;315]"
end
if tonumber(level2) > 315 then
formspec = formspec.."button[0,4;1,1;;316]"
end
if tonumber(level2) > 316 then
formspec = formspec.."button[1,4;1,1;;317]"
end
if tonumber(level2) > 317 then
formspec = formspec.."button[2,4;1,1;;318]"
end
if tonumber(level2) > 318 then
formspec = formspec.."button[3,4;1,1;;319]"
end
if tonumber(level2) > 319 then
formspec = formspec.."button[4,4;1,1;;320]"
end
if tonumber(level2) > 320 then
formspec = formspec.."button[0,5;1,1;;321]"
end
if tonumber(level2) > 321 then
formspec = formspec.."button[1,5;1,1;;322]"
end
if tonumber(level2) > 322 then
formspec = formspec.."button[2,5;1,1;;323]"
end
if tonumber(level2) > 323 then
formspec = formspec.."button[3,5;1,1;;324]"
end
if tonumber(level2) > 324 then
formspec = formspec.."button[4,5;1,1;;325]"
end
if tonumber(level2) > 325 then
formspec = formspec.."button[2.5,6;1,1;wan;>]"
end
return formspec
end
local w314 = {}
w314.get_formspec = function(player, pos)
if player == nil then
return
end
local player_inv = player:get_inventory()
lv = io.open(minetest.get_worldpath().."/level3.txt", "r")
local level2 = lv:read("*l")
lv:close()
formspec = "size[5,6.5]"
.."background[5,6.5;1,1;gui_formbg.png;true]"
.."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
.."bgcolor[#080808BB;true]"
.."image_button[4.5,-0.3;0.8,0.8;;esc;X]"
.."label[0,0;World Level: "..(tonumber(level2)-1).."/333]"
.."button[0,1;1,1;;326]"
.."button[1.5,6;1,1;wam;<]"
if tonumber(level2) > 326 then
formspec = formspec.."button[1,1;1,1;;327]"
end
if tonumber(level2) > 327 then
formspec = formspec.."button[2,1;1,1;;328]"
end
if tonumber(level2) > 328 then
formspec = formspec.."button[3,1;1,1;;329]"
end
if tonumber(level2) > 329 then
formspec = formspec.."button[4,1;1,1;;330]"
end
if tonumber(level2) > 330 then
formspec = formspec.."button[0,2;1,1;;331]"
end
if tonumber(level2) > 331 then
formspec = formspec.."button[1,2;1,1;;332]"
end
if tonumber(level2) > 332 then
formspec = formspec.."button[2,2;1,1;;333]"
end
if tonumber(level2) > 333 then
formspec = formspec.."label[0,3;play world 1 and 2]"
end end
return formspec return formspec
end end
@ -2681,6 +3111,16 @@ minetest.register_node("sudoku:new_w3",{
minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player))
elseif page == 9 then elseif page == 9 then
minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player)) minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player))
elseif page == 10 then
minetest.show_formspec(player:get_player_name(), "w310" , w310.get_formspec(player))
elseif page == 11 then
minetest.show_formspec(player:get_player_name(), "w311" , w311.get_formspec(player))
elseif page == 12 then
minetest.show_formspec(player:get_player_name(), "w312" , w312.get_formspec(player))
elseif page == 13 then
minetest.show_formspec(player:get_player_name(), "w313" , w313.get_formspec(player))
elseif page == 14 then
minetest.show_formspec(player:get_player_name(), "w314" , w314.get_formspec(player))
end end
end, end,
}) })
@ -2701,7 +3141,7 @@ minetest.register_node("sudoku:new_w5",{
end, end,
}) })
minetest.register_node("sudoku:new_ws",{ minetest.register_node("sudoku:new_ws",{
tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_ws.png"}, tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_w6.png"},
description = "New", description = "New",
--groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
on_punch = function(pos, node, player, pointed_thing) on_punch = function(pos, node, player, pointed_thing)
@ -3158,6 +3598,101 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.wah then if fields.wah then
player_inv:set_stack("page3", 1,"default:dirt 7") player_inv:set_stack("page3", 1,"default:dirt 7")
minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player))
elseif fields.waj then
player_inv:set_stack("page3", 1, "default:dirt 9")
minetest.show_formspec(player:get_player_name(), "w310" , w310.get_formspec(player))
else
minetest.show_formspec(player:get_player_name(), "", "")
end
end
if formname == "w310" then
d = 1
for k, v in pairs(fields) do
if tonumber(v) ~= nil then
New(player,"3_"..v)
player_inv:set_stack("l", 3, "default:dirt "..v)
player_inv:set_stack("ll", 1, "default:dirt 3")
end
end
if fields.wai then
player_inv:set_stack("page3", 1,"default:dirt 8")
minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player))
elseif fields.wak then
player_inv:set_stack("page3", 1, "default:dirt 10")
minetest.show_formspec(player:get_player_name(), "w311" , w311.get_formspec(player))
else
minetest.show_formspec(player:get_player_name(), "", "")
end
end
if formname == "w311" then
d = 1
for k, v in pairs(fields) do
if tonumber(v) ~= nil then
New(player,"3_"..v)
player_inv:set_stack("l", 3, "default:dirt "..v)
player_inv:set_stack("ll", 1, "default:dirt 3")
end
end
if fields.waj then
player_inv:set_stack("page3", 1,"default:dirt 9")
minetest.show_formspec(player:get_player_name(), "w310" , w310.get_formspec(player))
elseif fields.wal then
player_inv:set_stack("page3", 1, "default:dirt 11")
minetest.show_formspec(player:get_player_name(), "w312" , w312.get_formspec(player))
else
minetest.show_formspec(player:get_player_name(), "", "")
end
end
if formname == "w312" then
d = 1
for k, v in pairs(fields) do
if tonumber(v) ~= nil then
New(player,"3_"..v)
player_inv:set_stack("l", 3, "default:dirt "..v)
player_inv:set_stack("ll", 1, "default:dirt 3")
end
end
if fields.wak then
player_inv:set_stack("page3", 1,"default:dirt 10")
minetest.show_formspec(player:get_player_name(), "w311" , w311.get_formspec(player))
elseif fields.wam then
player_inv:set_stack("page3", 1, "default:dirt 12")
minetest.show_formspec(player:get_player_name(), "w313" , w313.get_formspec(player))
else
minetest.show_formspec(player:get_player_name(), "", "")
end
end
if formname == "w313" then
d = 1
for k, v in pairs(fields) do
if tonumber(v) ~= nil then
New(player,"3_"..v)
player_inv:set_stack("l", 3, "default:dirt "..v)
player_inv:set_stack("ll", 1, "default:dirt 3")
end
end
if fields.wal then
player_inv:set_stack("page3", 1,"default:dirt 11")
minetest.show_formspec(player:get_player_name(), "w312" , w312.get_formspec(player))
elseif fields.wan then
player_inv:set_stack("page3", 1, "default:dirt 13")
minetest.show_formspec(player:get_player_name(), "w314" , w314.get_formspec(player))
else
minetest.show_formspec(player:get_player_name(), "", "")
end
end
if formname == "w314" then
d = 1
for k, v in pairs(fields) do
if tonumber(v) ~= nil then
New(player,"3_"..v)
player_inv:set_stack("l", 3, "default:dirt "..v)
player_inv:set_stack("ll", 1, "default:dirt 3")
end
end
if fields.wam then
player_inv:set_stack("page3", 1,"default:dirt 12")
minetest.show_formspec(player:get_player_name(), "w313" , w313.get_formspec(player))
else else
minetest.show_formspec(player:get_player_name(), "", "") minetest.show_formspec(player:get_player_name(), "", "")
end end

9
mods/sudoku/lv3_223.txt Normal file
View File

@ -0,0 +1,9 @@
059000000
600000200
008740001
005920000
400000002
000038600
200083900
001000008
000000370

9
mods/sudoku/lv3_224.txt Normal file
View File

@ -0,0 +1,9 @@
000050400
370000001
200300060
000080003
009203600
100090000
090002005
500000084
002070000

9
mods/sudoku/lv3_225.txt Normal file
View File

@ -0,0 +1,9 @@
000003000
000860700
056000130
000000602
024000870
809000000
013000950
005016000
000400000

9
mods/sudoku/lv3_226.txt Normal file
View File

@ -0,0 +1,9 @@
000107000
006000100
090205040
000400006
041000830
900008000
010603020
007000300
000501000

9
mods/sudoku/lv3_227.txt Normal file
View File

@ -0,0 +1,9 @@
005002000
000419000
004650000
000000403
078000620
609000000
000025100
000183000
000700500

9
mods/sudoku/lv3_228.txt Normal file
View File

@ -0,0 +1,9 @@
100405000
800060200
000300704
028000009
000000000
500000670
905003000
006080003
000601007

9
mods/sudoku/lv3_229.txt Normal file
View File

@ -0,0 +1,9 @@
030000000
100009000
050801004
090602340
000000000
065307010
700408050
000500002
000000090

9
mods/sudoku/lv3_230.txt Normal file
View File

@ -0,0 +1,9 @@
002060103
000580020
000200008
000000036
800000004
920000000
200006000
050047000
601090700

9
mods/sudoku/lv3_231.txt Normal file
View File

@ -0,0 +1,9 @@
050070100
800004020
000000008
092000005
400503009
600000780
700000000
020400003
001060050

9
mods/sudoku/lv3_232.txt Normal file
View File

@ -0,0 +1,9 @@
000030006
800400010
002581700
509000000
000000000
000000604
001364500
040002003
900070000

9
mods/sudoku/lv3_233.txt Normal file
View File

@ -0,0 +1,9 @@
010000002
700090005
020607080
000000034
090000020
130000000
050704090
900060001
800000070

9
mods/sudoku/lv3_234.txt Normal file
View File

@ -0,0 +1,9 @@
000000060
905300004
400780009
820000000
004000100
000000056
100079008
700002901
030000000

9
mods/sudoku/lv3_235.txt Normal file
View File

@ -0,0 +1,9 @@
003600000
150200000
900070084
030000006
001000900
700000050
380010009
000004067
000002100

9
mods/sudoku/lv3_236.txt Normal file
View File

@ -0,0 +1,9 @@
000200008
004050076
005007900
007000003
008000600
900000400
002300100
340020500
100006000

9
mods/sudoku/lv3_237.txt Normal file
View File

@ -0,0 +1,9 @@
008006000
020470000
350009000
003000206
080000040
709000500
000100032
000068010
000900400

9
mods/sudoku/lv3_238.txt Normal file
View File

@ -0,0 +1,9 @@
000400001
000008050
000760098
240000080
800000007
050000032
410093000
060800000
700004000

9
mods/sudoku/lv3_239.txt Normal file
View File

@ -0,0 +1,9 @@
060000800
080002093
000067100
000400300
200000001
005008000
006210000
940700010
007000050

9
mods/sudoku/lv3_240.txt Normal file
View File

@ -0,0 +1,9 @@
005000300
400000009
000714000
092000150
700000006
086000970
000853000
800000007
009000200

9
mods/sudoku/lv3_241.txt Normal file
View File

@ -0,0 +1,9 @@
406000500
000300200
070004019
600000003
008000400
500000002
810200060
004009000
003000708

9
mods/sudoku/lv3_242.txt Normal file
View File

@ -0,0 +1,9 @@
092000070
000000605
000100900
904800000
010306090
000007204
008004000
503000000
040000520

9
mods/sudoku/lv3_243.txt Normal file
View File

@ -0,0 +1,9 @@
000000000
702000504
005108200
300205009
000000000
100607005
006804300
907000801
000000000

9
mods/sudoku/lv3_244.txt Normal file
View File

@ -0,0 +1,9 @@
001050037
005001900
000003080
900000400
800000006
002000008
060100000
009700800
340080200

9
mods/sudoku/lv3_245.txt Normal file
View File

@ -0,0 +1,9 @@
070080504
000001026
002000000
900000600
030109040
004000001
000000300
720500000
601020080

9
mods/sudoku/lv3_246.txt Normal file
View File

@ -0,0 +1,9 @@
069000000
140080009
000000300
006002004
020804030
900700800
005000000
400010095
000000740

9
mods/sudoku/lv3_247.txt Normal file
View File

@ -0,0 +1,9 @@
600043070
000010006
000009010
080002300
100000005
002600090
060900000
700050000
040320008

9
mods/sudoku/lv3_248.txt Normal file
View File

@ -0,0 +1,9 @@
000001090
605002000
409300000
007050900
200000008
008040100
000005309
000100706
030800000

9
mods/sudoku/lv3_249.txt Normal file
View File

@ -0,0 +1,9 @@
000600079
001200040
050000008
048300007
000000000
900006420
300000050
070008300
510009000

9
mods/sudoku/lv3_250.txt Normal file
View File

@ -0,0 +1,9 @@
000306000
100000002
079000310
007603400
000000000
001804900
083000590
200000008
000705000

9
mods/sudoku/lv3_251.txt Normal file
View File

@ -0,0 +1,9 @@
095000630
000000000
100607004
020803090
000000000
040501060
300402006
000000000
057000480

9
mods/sudoku/lv3_252.txt Normal file
View File

@ -0,0 +1,9 @@
800002594
007003010
020000000
000600000
960000038
000004000
000000070
050300900
794100006

9
mods/sudoku/lv3_253.txt Normal file
View File

@ -0,0 +1,9 @@
002000090
801007000
000460300
050010009
003000800
600020050
007035000
000700904
080000700

9
mods/sudoku/lv3_254.txt Normal file
View File

@ -0,0 +1,9 @@
060000710
000600003
930700000
002480000
800000007
000056100
000008059
100004000
097000020

9
mods/sudoku/lv3_255.txt Normal file
View File

@ -0,0 +1,9 @@
005008006
170040000
008006000
300200019
000000000
510007003
000500700
000060021
200900400

9
mods/sudoku/lv3_256.txt Normal file
View File

@ -0,0 +1,9 @@
004800061
000500700
600040005
050000609
000000000
201000080
100030007
003002000
460009500

9
mods/sudoku/lv3_257.txt Normal file
View File

@ -0,0 +1,9 @@
001000008
000316002
005008900
600040090
000000000
010080003
007900800
400271000
500000600

9
mods/sudoku/lv3_258.txt Normal file
View File

@ -0,0 +1,9 @@
000900083
002005000
900470000
000000014
700806009
430000000
000059001
000200600
250008000

9
mods/sudoku/lv3_259.txt Normal file
View File

@ -0,0 +1,9 @@
902000000
080600250
003080600
000017000
600000005
000430000
001040900
079008010
000000403

9
mods/sudoku/lv3_260.txt Normal file
View File

@ -0,0 +1,9 @@
700000800
000237001
050080000
000900310
004000500
076001000
000010040
900476000
003000002

9
mods/sudoku/lv3_261.txt Normal file
View File

@ -0,0 +1,9 @@
000004958
070000000
020060300
006050030
300000009
050070600
005090080
000000010
248100000

9
mods/sudoku/lv3_262.txt Normal file
View File

@ -0,0 +1,9 @@
600000000
850031000
040600003
095200600
000000000
001007280
900008010
000720058
000000004

9
mods/sudoku/lv3_263.txt Normal file
View File

@ -0,0 +1,9 @@
000000040
015080000
040209060
070008006
800000001
200100030
090407080
000020310
050000000

9
mods/sudoku/lv3_264.txt Normal file
View File

@ -0,0 +1,9 @@
000041090
521000600
000000002
090400000
300705001
000003060
200000000
009000487
040830000

9
mods/sudoku/lv3_265.txt Normal file
View File

@ -0,0 +1,9 @@
500040007
000000200
009508403
003000060
000801000
090000700
608207500
002000000
900010006

9
mods/sudoku/lv3_266.txt Normal file
View File

@ -0,0 +1,9 @@
001000080
004307000
090006000
500000098
102000703
970000004
000900050
000208600
010000200

9
mods/sudoku/lv3_267.txt Normal file
View File

@ -0,0 +1,9 @@
000000052
704005800
000206000
008100030
400000007
030004600
000502000
006800209
190000000

9
mods/sudoku/lv3_268.txt Normal file
View File

@ -0,0 +1,9 @@
480007009
002000000
001039080
050000000
109000508
000000070
040180600
000000100
600200034

9
mods/sudoku/lv3_269.txt Normal file
View File

@ -0,0 +1,9 @@
002000010
709015008
000204060
800001000
000000000
000300004
080903000
200570301
030000600

9
mods/sudoku/lv3_270.txt Normal file
View File

@ -0,0 +1,9 @@
002708096
040000000
030201007
000000000
470000053
000000000
700809060
000000070
850107200

9
mods/sudoku/lv3_271.txt Normal file
View File

@ -0,0 +1,9 @@
600050004
000820700
000100800
070000052
400000007
120000030
004002000
009076000
300040009

9
mods/sudoku/lv3_272.txt Normal file
View File

@ -0,0 +1,9 @@
700001005
300900210
000205000
000000804
030000020
402000000
000406000
016003007
900500002

9
mods/sudoku/lv3_273.txt Normal file
View File

@ -0,0 +1,9 @@
400000000
050980000
927005000
036000000
700401008
000000210
000300876
000079050
000000002

9
mods/sudoku/lv3_274.txt Normal file
View File

@ -0,0 +1,9 @@
000007042
000003008
004080900
300690000
001000400
000038009
003070100
500300000
680500000

9
mods/sudoku/lv3_275.txt Normal file
View File

@ -0,0 +1,9 @@
026000005
400000620
900605070
000700100
000000000
009002000
090806007
045000006
100000480

9
mods/sudoku/lv3_276.txt Normal file
View File

@ -0,0 +1,9 @@
613000000
000084000
400900070
205008000
700000008
000400302
060005001
000290000
000000523

9
mods/sudoku/lv3_277.txt Normal file
View File

@ -0,0 +1,9 @@
530007004
000000080
408009000
800006001
002000800
300100007
000400306
090000000
600300052

9
mods/sudoku/lv3_278.txt Normal file
View File

@ -0,0 +1,9 @@
500072100
040000002
089600000
000000403
000809000
402000000
000006970
100000030
004180005

9
mods/sudoku/lv3_279.txt Normal file
View File

@ -0,0 +1,9 @@
920000036
001000400
000094000
850100060
006000200
010008057
000530000
007000600
040000093

9
mods/sudoku/lv3_280.txt Normal file
View File

@ -0,0 +1,9 @@
009010200
064007000
030600000
000005790
000301000
026400000
000006040
000500180
008020900

9
mods/sudoku/lv3_281.txt Normal file
View File

@ -0,0 +1,9 @@
407600002
000000007
008010000
050008200
010509070
002300080
000040300
600000000
100005908

9
mods/sudoku/lv3_282.txt Normal file
View File

@ -0,0 +1,9 @@
050000000
600070802
200301000
006000408
000508000
109000600
000902003
705030004
000000050

9
mods/sudoku/lv3_283.txt Normal file
View File

@ -0,0 +1,9 @@
000005000
100004009
080000053
400900070
906000204
030007008
750000080
200400001
000600000

9
mods/sudoku/lv3_284.txt Normal file
View File

@ -0,0 +1,9 @@
000900400
703100005
000050018
000000080
045000790
010000000
860040000
300008602
002009000

9
mods/sudoku/lv3_285.txt Normal file
View File

@ -0,0 +1,9 @@
200000050
000006400
301705200
000000590
800000002
034000000
009108704
008600000
060000001

9
mods/sudoku/lv3_286.txt Normal file
View File

@ -0,0 +1,9 @@
000000400
080070000
003820009
038700060
004000100
020001950
500017800
000060020
009000000

9
mods/sudoku/lv3_287.txt Normal file
View File

@ -0,0 +1,9 @@
007040000
280005400
006007000
070300085
000000000
830004060
000900800
001200097
000010200

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