Agon 2.2 upload

Game-5.4.x
Der1248 2018-06-30 18:27:46 +02:00
parent d51a3f3b4a
commit 952b6e0346
42 changed files with 379 additions and 605 deletions

12
README.txt Normal file
View File

@ -0,0 +1,12 @@
A Game by 1248
Thanks to:
/
For my Agon map you need the Agon subgame and you can not use the subgame without the map!!
You have to fight against some monsters to complete a wave.
There are 32 waves.
License:
See README.txt in each mod for more information
Every code written by me is LGPLv2.1

Binary file not shown.

View File

@ -6,7 +6,7 @@ minetest.register_on_joinplayer(function(player)
offset = {x=0, y=10},
alignment = {x=1, y=0},
number = 0xFFFFFF ,
text = "Minetest Version : 0.4.16",
text = "For Minetest : 0.4.17",
})
player:hud_add({
hud_elem_type = "text",
@ -14,7 +14,7 @@ minetest.register_on_joinplayer(function(player)
offset = {x=0, y=30},
alignment = {x=1, y=0},
number = 0xFFFFFF ,
text = "Subgame Version : 2.1",
text = "Game Version : 2.2",
})
end)
@ -47,6 +47,7 @@ minetest.register_on_joinplayer(function(player)
minetest.setting_set("time_speed", "0")
minetest.set_timeofday(0.5)
minetest.setting_set("node_highlighting", "box")
player:set_inventory_formspec("")
end)
minetest.register_on_newplayer(function(player)
player:setpos({x=-41, y=12, z=0})
@ -56,6 +57,7 @@ minetest.register_on_newplayer(function(player)
end)
local timer = 0
minetest.register_globalstep(function(dtime)
local file2 = io.open(minetest.get_worldpath().."/zw.txt", "r")
local zw = file2:read("*l")
file2:close()
@ -65,6 +67,11 @@ minetest.register_globalstep(function(dtime)
local file = io.open(minetest.get_worldpath().."/ver.txt", "r")
local ver = file:read("*l")
file:close()
local file = io.open(minetest.get_worldpath().."/timer.txt", "r")
local timerf = file:read("*l")
file:close()
timer = tonumber(timerf)
for _,object in ipairs(minetest.env:get_objects_inside_radius({x=25, y=10, z=0}, 20)) do
if not object:is_player() then
local ent = object:get_luaentity()
@ -2674,6 +2681,9 @@ minetest.register_globalstep(function(dtime)
end
end
end
fi = io.open(minetest.get_worldpath().."/timer.txt", "w")
fi:write(timer)
fi:close()
end)
minetest.register_chatcommand("start", {
@ -2684,7 +2694,7 @@ minetest.register_chatcommand("start", {
local level = lv:read("*l")
lv:close()
fi = io.open(minetest.get_worldpath().."/timer.txt", "w")
fi:write("0")
fi:write("0.1")
fi:close()
zw = io.open(minetest.get_worldpath().."/zw.txt", "w")
zw:write("0")
@ -2695,7 +2705,6 @@ minetest.register_chatcommand("start", {
if tonumber(level) == 33 then
else
local player = minetest.get_player_by_name(name)
timer = 0.1
for _,player in ipairs(minetest.get_connected_players()) do
player:setpos({x=25, y=10, z=0})
for _,object in ipairs(minetest.env:get_objects_inside_radius({x=25, y=10, z=0}, 20)) do

View File

@ -49,21 +49,24 @@ function beds.register_bed(name, def)
local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name]
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,
pointed_thing) or itemstack
end
local pos
if minetest.registered_items[minetest.get_node(under).name].buildable_to then
if udef and udef.buildable_to then
pos = under
else
pos = pointed_thing.above
end
if minetest.is_protected(pos, placer:get_player_name()) and
not minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(pos, placer:get_player_name())
local player_name = placer and placer:get_player_name() or ""
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
end
@ -72,12 +75,13 @@ function beds.register_bed(name, def)
return itemstack
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))
if minetest.is_protected(botpos, placer:get_player_name()) and
not minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(botpos, placer:get_player_name())
if minetest.is_protected(botpos, player_name) and
not minetest.check_player_privs(player_name, "protection_bypass") then
minetest.record_protection_violation(botpos, player_name)
return itemstack
end
@ -90,7 +94,7 @@ function beds.register_bed(name, def)
minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
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()
end
return itemstack

View File

@ -230,7 +230,8 @@ minetest.register_craftitem("boats:boat", {
local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name]
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,
pointed_thing) or itemstack
end
@ -244,9 +245,12 @@ minetest.register_craftitem("boats:boat", {
pointed_thing.under.y = pointed_thing.under.y + 0.5
boat = minetest.add_entity(pointed_thing.under, "boats:boat")
if boat then
boat:setyaw(placer:get_look_horizontal())
if not (creative and creative.is_enabled_for
and creative.is_enabled_for(placer:get_player_name())) then
if placer then
boat:setyaw(placer:get_look_horizontal())
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()
end
end

View File

@ -68,6 +68,12 @@ minetest.register_node("bones:bones", {
on_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
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)
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
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(
pointed_thing.under,
node, user,

View File

@ -58,7 +58,8 @@ end
function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction)
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
self.railtype = minetest.get_item_group(node, "connect_to_raillike")
end
@ -105,7 +106,6 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities,
return
end
-- Player punches cart to alter velocity
local vel = self.object:getvelocity()
if puncher:get_player_name() == self.driver then
if math.abs(vel.x + vel.z) > carts.punch_speed_max then
return
@ -367,7 +367,8 @@ minetest.register_craftitem("carts:cart", {
local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name]
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,
pointed_thing) or itemstack
end

View File

@ -159,23 +159,29 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype)
end
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 pf_pos = vector.round(old_pos)
local pf_dir = vector.new(old_dir)
for i = 1, 3 do
if vector.equals(pf_pos, pos) then
-- Success! Cart moved on correctly
return true
end
pf_dir, pf_switch = carts:get_rail_direction(
pf_pos, pf_dir, ctrl, pf_switch, railtype)
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
-- No way forwards
return false
end
pf_pos = vector.add(pf_pos, pf_dir)
if vector.equals(pf_pos, pos) then
-- Success! Cart moved on correctly
return true
end
end
-- Cart not found
return false
@ -211,7 +217,12 @@ end
function carts:get_rail_groups(additional_groups)
-- 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
for k, v in pairs(additional_groups) do
groups[k] = v

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_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_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0)
brunob.santos (CC BY-SA 4.0):
default_desert_cobble.png
@ -131,7 +132,6 @@ BlockMen (CC BY-SA 3.0):
default_gold_ingot.png
default_tool_steelsword.png
default_diamond.png
default_book.png
default_tool_*.png
default_lava_source_animated.png
default_lava_flowing_animated.png
@ -145,11 +145,7 @@ BlockMen (CC BY-SA 3.0):
bubble.png
gui_*.png
Wuzzy (CC BY-SA 3.0):
default_bookshelf_slot.png (based on default_book.png)
sofar (CC BY-SA 3.0):
default_book_written.png, based on default_book.png
default_aspen_sapling
default_aspen_tree
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_key.png
default_key_skeleton.png
default_book.png
asl97 (CC BY-SA 3.0):
default_ice.png
@ -221,6 +218,9 @@ kilbith (CC BY-SA 3.0):
default_tin_ingot.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):
1: http://www.freesound.org/people/cmusounddesign/sounds/71947/
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({
output = 'default:axe_wood',
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({
output = 'default:sword_wood',
recipe = {
@ -904,7 +853,7 @@ minetest.register_craft({
-- Fuels
--
-- Support use of group:tree
-- Support use of group:tree, includes default:tree which has the same burn time
minetest.register_craft({
type = "fuel",
recipe = "group:tree",
@ -927,12 +876,6 @@ minetest.register_craft({
burntime = 26,
})
minetest.register_craft({
type = "fuel",
recipe = "default:tree",
burntime = 30,
})
minetest.register_craft({
type = "fuel",
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({
type = "fuel",
recipe = "group:wood",
@ -965,12 +908,6 @@ minetest.register_craft({
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:wood",
burntime = 7,
})
minetest.register_craft({
type = "fuel",
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({
type = "fuel",
recipe = "group:sapling",
burntime = 10,
burntime = 5,
})
minetest.register_craft({
type = "fuel",
recipe = "default:bush_sapling",
burntime = 6,
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "default:acacia_bush_sapling",
burntime = 7,
burntime = 4,
})
minetest.register_craft({
type = "fuel",
recipe = "default:aspen_sapling",
burntime = 8,
burntime = 4,
})
minetest.register_craft({
type = "fuel",
recipe = "default:pine_sapling",
burntime = 9,
})
minetest.register_craft({
type = "fuel",
recipe = "default:sapling",
burntime = 10,
burntime = 5,
})
minetest.register_craft({
type = "fuel",
recipe = "default:acacia_sapling",
burntime = 11,
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:junglesapling",
burntime = 12,
burntime = 6,
})
@ -1080,13 +1011,13 @@ minetest.register_craft({
minetest.register_craft({
type = "fuel",
recipe = "default:junglegrass",
burntime = 2,
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "group:leaves",
burntime = 1,
burntime = 4,
})
minetest.register_craft({
@ -1098,7 +1029,7 @@ minetest.register_craft({
minetest.register_craft({
type = "fuel",
recipe = "default:papyrus",
burntime = 1,
burntime = 3,
})
minetest.register_craft({
@ -1110,7 +1041,7 @@ minetest.register_craft({
minetest.register_craft({
type = "fuel",
recipe = "default:ladder_wood",
burntime = 2,
burntime = 7,
})
minetest.register_craft({
@ -1143,12 +1074,6 @@ minetest.register_craft({
burntime = 30,
})
minetest.register_craft({
type = "fuel",
recipe = "default:apple",
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "default:coal_lump",

View File

@ -75,12 +75,16 @@ local function book_on_use(itemstack, user)
return itemstack
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)
if formname ~= "default:book" then return end
local inv = player:get_inventory()
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
if stack:get_name() ~= "default:book_written" then
local count = stack:get_count()
@ -99,11 +103,16 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
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.description = "\""..fields.title.."\" by "..data.owner
data.text = fields.text
data.text_len = #data.text
local short_title = data.title
-- Don't bother triming the title if the trailing dots would make it longer
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_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",
nodenames = {"default:lava_source", "default:lava_flowing"},
neighbors = {"group:cools_lava", "group:water"},
interval = 1,
interval = 2,
chance = 2,
catch_up = false,
action = default.cool_lava,
action = function(...)
default.cool_lava(...)
end,
})
end
@ -222,7 +224,9 @@ minetest.register_abm({
neighbors = {"group:sand"},
interval = 12,
chance = 83,
action = default.grow_cactus
action = function(...)
default.grow_cactus(...)
end
})
minetest.register_abm({
@ -231,7 +235,9 @@ minetest.register_abm({
neighbors = {"default:dirt", "default:dirt_with_grass"},
interval = 14,
chance = 71,
action = default.grow_papyrus
action = function(...)
default.grow_papyrus(...)
end
})
@ -291,7 +297,7 @@ function default.register_fence(name, def)
groups = {},
}
for k, v in pairs(default_fields) do
if not def[k] then
if def[k] == nil then
def[k] = v
end
end
@ -313,7 +319,7 @@ end
-- Prevent decay of placed leaves
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)
node.param2 = 1
minetest.set_node(pos, node)

View File

@ -119,7 +119,7 @@ local function furnace_node_timer(pos, elapsed)
local fuel
local update = true
while update do
while elapsed > 0 and update do
update = false
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})
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
if fuel_time < fuel_totaltime then
-- 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 cookable then
src_time = src_time + elapsed
src_time = src_time + el
if src_time >= cooked.time then
-- Place result in dst list if possible
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
update = true
end
else
-- Item could not be cooked: probably missing fuel
update = true
end
end
else
@ -166,8 +174,7 @@ local function furnace_node_timer(pos, elapsed)
-- Take fuel from fuel list
inv:set_stack("fuel", 1, afterfuel.items[1])
update = true
fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime)
src_time = src_time + elapsed
fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time)
end
else
-- 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
end
elapsed = 0
elapsed = elapsed - el
end
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)
Copyright (C) 2010-2016:
Copyright (C) 2010-2017:
celeron55, Perttu Ahola <celeron55@gmail.com>
Cisoun
G4JC
@ -44,6 +44,7 @@ Copyright (C) 2010-2016:
GreenXenith
kaeza
kilbith
CloudyProton
You are free to:
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)
Copyright (C) 2014-2016 Neuromancer
You are free to:
Share — copy and redistribute the material in any medium or format.
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",
{name = "default_dirt.png^default_snow_side.png",
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',
sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_snow_footstep", gain = 0.15},
@ -608,7 +608,7 @@ minetest.register_node("default:sapling", {
sounds = default.node_sound_leaves_defaults(),
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,
on_place = function(itemstack, placer, pointed_thing)
@ -673,9 +673,7 @@ minetest.register_node("default:apple", {
sounds = default.node_sound_leaves_defaults(),
after_place_node = function(pos, placer, itemstack)
if placer:is_player() then
minetest.set_node(pos, {name = "default:apple", param2 = 1})
end
minetest.set_node(pos, {name = "default:apple", param2 = 1})
end,
})
@ -742,7 +740,7 @@ minetest.register_node("default:junglesapling", {
sounds = default.node_sound_leaves_defaults(),
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,
on_place = function(itemstack, placer, pointed_thing)
@ -821,7 +819,7 @@ minetest.register_node("default:pine_sapling", {
sounds = default.node_sound_leaves_defaults(),
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,
on_place = function(itemstack, placer, pointed_thing)
@ -901,7 +899,7 @@ minetest.register_node("default:acacia_sapling", {
sounds = default.node_sound_leaves_defaults(),
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,
on_place = function(itemstack, placer, pointed_thing)
@ -979,7 +977,7 @@ minetest.register_node("default:aspen_sapling", {
sounds = default.node_sound_leaves_defaults(),
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,
on_place = function(itemstack, placer, pointed_thing)
@ -1362,7 +1360,7 @@ minetest.register_node("default:bush_sapling", {
sounds = default.node_sound_leaves_defaults(),
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,
on_place = function(itemstack, placer, pointed_thing)
@ -1433,7 +1431,7 @@ minetest.register_node("default:acacia_bush_sapling", {
sounds = default.node_sound_leaves_defaults(),
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,
on_place = function(itemstack, placer, pointed_thing)
@ -1783,13 +1781,14 @@ local function get_chest_formspec(pos)
end
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]
-- 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 == "torchlike" or
(def.drawtype == "nodebox" and def.paramtype2 == "wallmounted") then
(def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then
return false
end
return true
@ -1797,6 +1796,24 @@ end
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)
if formname ~= "default:chest" then
return
@ -1810,23 +1827,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return
end
local pos = open_chests[pn].pos
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})
chest_lid_close(pn)
return true
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)
local def = table.copy(d)
def.drawtype = "mesh"
@ -1960,6 +1971,13 @@ function default.register_chest(name, d)
open_chests[clicker:get_player_name()] = { pos = pos,
sound = def.sound_close, swap = name }
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
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() ..
" from chest at " .. minetest.pos_to_string(pos))
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_closed = table.copy(def)
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.groups.not_in_creative_inventory = 1
def_opened.selection_box = {
type = "fixed",
fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 },
}
}
def_opened.can_dig = function()
return false
end
def_opened.on_blast = function() end
def_closed.mesh = 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 def = minetest.registered_nodes[node.name]
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,
pointed_thing) or itemstack
end

View File

@ -63,7 +63,8 @@ minetest.register_node("default:torch", {
local node = minetest.get_node(under)
local def = minetest.registered_nodes[node.name]
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,
pointed_thing) or itemstack
end

View File

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

View File

@ -203,12 +203,7 @@ end
local function can_dig_door(pos, digger)
replace_old_owner_information(pos)
if default.can_interact_with_node(digger, pos) then
return true
else
minetest.record_protection_violation(pos, digger:get_player_name())
return false
end
return default.can_interact_with_node(digger, pos)
end
function doors.register(name, def)
@ -266,7 +261,8 @@ function doors.register(name, def)
local node = minetest.get_node(pointed_thing.under)
local pdef = minetest.registered_nodes[node.name]
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,
node, placer, itemstack, pointed_thing)
end
@ -290,12 +286,12 @@ function doors.register(name, def)
return itemstack
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
return itemstack
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 = {
{x = -1, y = 0, z = 0},
@ -712,7 +708,7 @@ function doors.register_fencegate(name, def)
local fence = {
description = def.description,
drawtype = "mesh",
tiles = {def.texture},
tiles = {},
paramtype = "light",
paramtype2 = "facedir",
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
fence.sounds = default.node_sound_wood_defaults()
end

View File

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

View File

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

View File

@ -98,6 +98,16 @@ minetest.register_node("farming:straw", {
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({
label = "Farming soil",
nodenames = {"group:field"},

View File

@ -127,24 +127,29 @@ function flowers.flower_spread(pos, node)
local pos0 = vector.subtract(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
end
local soils = minetest.find_nodes_in_area_under_air(
pos0, pos1, "group:soil")
if #soils > 0 then
local seedling = soils[math.random(#soils)]
local seedling_above =
{x = seedling.x, y = seedling.y + 1, z = seedling.z}
light = minetest.get_node_light(seedling_above)
if not light or light < 13 or
-- Desert sand is in the soil group
minetest.get_node(seedling).name == "default:desert_sand" then
return
local num_soils = #soils
if num_soils >= 1 then
for si = 1, math.min(3, num_soils) do
local soil = soils[math.random(num_soils)]
local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z}
light = minetest.get_node_light(soil_above)
if light and light >= 13 and
-- Desert sand is in the soil group
minetest.get_node(soil).name ~= "default:desert_sand" then
minetest.set_node(soil_above, {name = node.name})
end
end
minetest.set_node(seedling_above, {name = node.name})
end
end
@ -152,7 +157,7 @@ minetest.register_abm({
label = "Flower spread",
nodenames = {"group:flora"},
interval = 13,
chance = 96,
chance = 300,
action = function(...)
flowers.flower_spread(...)
end,
@ -204,38 +209,34 @@ minetest.register_node("flowers:mushroom_brown", {
-- 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({
label = "Mushroom spread",
nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
interval = 11,
chance = 50,
action = function(pos, node)
if minetest.get_node_light(pos, nil) == 15 then
minetest.remove_node(pos)
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
chance = 150,
action = function(...)
flowers.mushroom_spread(...)
end,
})
@ -280,12 +281,17 @@ minetest.register_node("flowers:waterlily", {
on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above
local node = minetest.get_node(pointed_thing.under).name
local def = minetest.registered_nodes[node]
local player_name = placer:get_player_name()
local node = minetest.get_node(pointed_thing.under)
local def = minetest.registered_nodes[node.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
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
minetest.set_node(pos, {name = "flowers:waterlily",
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

@ -1,16 +0,0 @@
Minetest Game mod: nyancat
==========================
See license.txt for license information.
Authors of source code
----------------------
Originally by celeron55, Perttu Ahola <celeron55@gmail.com> (LGPL 2.1)
Various Minetest developers and contributors (LGPL 2.1)
Authors of media files
----------------------
VanessaE (CC BY-SA 3.0):
nyancat_front.png
nyancat_back.png
nyancat_side.png
nyancat_rainbow.png

View File

@ -1 +0,0 @@
default

View File

@ -1,89 +0,0 @@
minetest.register_node("nyancat:nyancat", {
description = "Nyan Cat",
tiles = {"nyancat_side.png", "nyancat_side.png", "nyancat_side.png",
"nyancat_side.png", "nyancat_back.png", "nyancat_front.png"},
paramtype = "light",
light_source = default.LIGHT_MAX,
paramtype2 = "facedir",
groups = {cracky = 2},
is_ground_content = false,
legacy_facedir_simple = true,
sounds = default.node_sound_defaults(),
})
minetest.register_node("nyancat:nyancat_rainbow", {
description = "Nyan Cat Rainbow",
tiles = {
"nyancat_rainbow.png^[transformR90",
"nyancat_rainbow.png^[transformR90",
"nyancat_rainbow.png"
},
paramtype = "light",
light_source = default.LIGHT_MAX,
paramtype2 = "facedir",
groups = {cracky = 2},
is_ground_content = false,
sounds = default.node_sound_defaults(),
})
minetest.register_craft({
type = "fuel",
recipe = "nyancat:nyancat",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "nyancat:nyancat_rainbow",
burntime = 1,
})
nyancat = {}
function nyancat.place(pos, facedir, length)
if facedir > 3 then
facedir = 0
end
local tailvec = minetest.facedir_to_dir(facedir)
local p = {x = pos.x, y = pos.y, z = pos.z}
minetest.set_node(p, {name = "nyancat:nyancat", param2 = facedir})
for i = 1, length do
p.x = p.x + tailvec.x
p.z = p.z + tailvec.z
minetest.set_node(p, {name = "nyancat:nyancat_rainbow", param2 = facedir})
end
end
function nyancat.generate(minp, maxp, seed)
local height_min = -31000
local height_max = -32
if maxp.y < height_min or minp.y > height_max then
return
end
local y_min = math.max(minp.y, height_min)
local y_max = math.min(maxp.y, height_max)
local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
local pr = PseudoRandom(seed + 9324342)
local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
for i = 1, max_num_nyancats do
if pr:next(0, 1000) == 0 then
local x0 = pr:next(minp.x, maxp.x)
local y0 = pr:next(minp.y, maxp.y)
local z0 = pr:next(minp.z, maxp.z)
local p0 = {x = x0, y = y0, z = z0}
nyancat.place(p0, pr:next(0, 3), pr:next(3, 15))
end
end
end
minetest.register_on_generated(function(minp, maxp, seed)
nyancat.generate(minp, maxp, seed)
end)
-- Legacy
minetest.register_alias("default:nyancat", "nyancat:nyancat")
minetest.register_alias("default:nyancat_rainbow", "nyancat:nyancat_rainbow")
minetest.register_alias("nyancat", "nyancat:nyancat")
minetest.register_alias("nyancat_rainbow", "nyancat:nyancat_rainbow")
default.make_nyancat = nyancat.place
default.generate_nyancats = nyancat.generate

View File

@ -1,50 +0,0 @@
License of source code
----------------------
GNU Lesser General Public License, version 2.1
Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
Copyright (C) 2012-2016 Various Minetest developers and contributors
This program is free software; you can redistribute it and/or modify it under the terms
of the GNU Lesser General Public License as published by the Free Software Foundation;
either version 2.1 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details:
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
Licenses of media (textures)
----------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
Copyright (C) 2012-2016 VanessaE
You are free to:
Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and
indicate if changes were made. You may do so in any reasonable manner, but not in any way
that suggests the licensor endorses you or your use.
ShareAlike — If you remix, transform, or build upon the material, you must distribute
your contributions under the same license as the original.
No additional restrictions — You may not apply legal terms or technological measures that
legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public
domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary
for your intended use. For example, other rights such as publicity, privacy, or moral
rights may limit how you use the material.
For more details:
http://creativecommons.org/licenses/by-sa/3.0/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

View File

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

View File

@ -1,2 +1 @@
default
farming

View File

@ -22,21 +22,23 @@ local function rotate_and_place(itemstack, placer, pointed_thing)
local p1 = pointed_thing.above
local param2 = 0
local placer_pos = placer:getpos()
if placer_pos then
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
end
if placer then
local placer_pos = placer:getpos()
if placer_pos then
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
end
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
local fpos = finepos.y % 1
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
local fpos = finepos.y % 1
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
or (fpos < -0.5 and fpos > -0.999999999) then
param2 = param2 + 20
if param2 == 21 then
param2 = 23
elseif param2 == 23 then
param2 = 21
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
or (fpos < -0.5 and fpos > -0.999999999) then
param2 = param2 + 20
if param2 == 21 then
param2 = 23
elseif param2 == 23 then
param2 = 21
end
end
end
return minetest.item_place(itemstack, placer, pointed_thing, param2)
@ -46,16 +48,29 @@ end
-- Node will be called stairs:stair_<subname>
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, {
description = description,
drawtype = "mesh",
mesh = "stairs_stair.obj",
tiles = images,
tiles = stair_images,
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = groups,
groups = new_groups,
sounds = sounds,
selection_box = {
type = "fixed",
@ -89,16 +104,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
end
if recipeitem then
minetest.register_craft({
output = 'stairs:stair_' .. subname .. ' 8',
recipe = {
{recipeitem, "", ""},
{recipeitem, recipeitem, ""},
{recipeitem, recipeitem, recipeitem},
},
})
-- Flipped recipe for the silly minecrafters
-- Recipe matches appearence in inventory
minetest.register_craft({
output = 'stairs:stair_' .. subname .. ' 8',
recipe = {
@ -132,7 +138,8 @@ local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
-- Node will be called stairs:slab_<subname>
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, {
description = description,
drawtype = "nodebox",
@ -140,7 +147,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = groups,
groups = new_groups,
sounds = sounds,
node_box = {
type = "fixed",
@ -149,8 +156,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
on_place = function(itemstack, placer, pointed_thing)
local under = minetest.get_node(pointed_thing.under)
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
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
-- place slab using under node orientation
@ -166,9 +174,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
if not recipeitem then
return itemstack
end
local player_name = placer:get_player_name()
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,
player_name)
return
@ -538,16 +545,6 @@ stairs.register_stair_and_slab(
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(
"steelblock",
"default:steelblock",

View File

@ -86,8 +86,8 @@ end
local basic_flame_on_construct -- cached value
local function destroy(drops, npos, cid, c_air, c_fire,
on_blast_queue, on_construct_queue,
ignore_protection, ignore_on_blast)
if not ignore_protection and minetest.is_protected(npos, "") then
ignore_protection, ignore_on_blast, owner)
if not ignore_protection and minetest.is_protected(npos, owner) then
return cid
end
@ -208,6 +208,7 @@ local function add_effects(pos, radius, drops)
collisiondetection = false,
vertical = false,
texture = "tnt_boom.png",
glow = 15,
})
minetest.add_particlespawner({
amount = 64,
@ -266,13 +267,13 @@ function tnt.burn(pos, nodename)
elseif def.on_ignite then
def.on_ignite(pos)
elseif minetest.get_item_group(name, "tnt") > 0 then
minetest.swap_node(pos, {name = name .. "_burning"})
minetest.sound_play("tnt_ignite", {pos = pos})
minetest.set_node(pos, {name = name .. "_burning"})
minetest.get_node_timer(pos):start(1)
end
end
local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner, explode_center)
pos = vector.round(pos)
-- scan for adjacent TNT nodes first, and enlarge the explosion
local vm1 = VoxelManip()
@ -286,6 +287,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning")
local c_tnt_boom = minetest.get_content_id("tnt:boom")
local c_air = minetest.get_content_id("air")
-- make sure we still have explosion even when centre node isnt tnt related
if explode_center then
count = 1
end
for z = pos.z - 2, pos.z + 2 do
for y = pos.y - 2, pos.y + 2 do
@ -333,7 +338,7 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
if cid ~= c_air then
data[vi] = destroy(drops, p, cid, c_air, c_fire,
on_blast_queue, on_construct_queue,
ignore_protection, ignore_on_blast)
ignore_protection, ignore_on_blast, owner)
end
end
vi = vi + 1
@ -375,16 +380,26 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
queued_data.fn(queued_data.pos)
end
minetest.log("action", "TNT owned by " .. owner .. " detonated at " ..
minetest.pos_to_string(pos) .. " with radius " .. radius)
return drops, radius
end
function tnt.boom(pos, def)
def = def or {}
def.radius = def.radius or 1
def.damage_radius = def.damage_radius or def.radius * 2
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
if not def.explode_center then
minetest.set_node(pos, {name = "tnt:boom"})
end
minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64})
minetest.set_node(pos, {name = "tnt:boom"})
local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection,
def.ignore_on_blast)
def.ignore_on_blast, owner, def.explode_center)
-- append entity drops
local damage_radius = (radius / def.radius) * def.damage_radius
local damage_radius = (radius / math.max(1, def.radius)) * def.damage_radius
entity_physics(pos, damage_radius, drops)
if not def.disable_drops then
eject_drops(drops, pos, radius)
@ -400,12 +415,6 @@ minetest.register_node("tnt:boom", {
walkable = false,
drop = "",
groups = {dig_immediate = 3},
on_construct = function(pos)
minetest.get_node_timer(pos):start(0.4)
end,
on_timer = function(pos, elapsed)
minetest.remove_node(pos)
end,
-- unaffected by explosions
on_blast = function() end,
})
@ -508,17 +517,17 @@ minetest.register_node("tnt:gunpowder_burning", {
on_timer = function(pos, elapsed)
for dx = -1, 1 do
for dz = -1, 1 do
for dy = -1, 1 do
if not (dx == 0 and dz == 0) then
tnt.burn({
x = pos.x + dx,
y = pos.y + dy,
z = pos.z + dz,
})
if math.abs(dx) + math.abs(dz) == 1 then
for dy = -1, 1 do
tnt.burn({
x = pos.x + dx,
y = pos.y + dy,
z = pos.z + dz,
})
end
end
end
end
end
minetest.remove_node(pos)
end,
-- unaffected by explosions
@ -579,9 +588,16 @@ function tnt.register_tnt(def)
is_ground_content = false,
groups = {dig_immediate = 2, mesecon = 2, tnt = 1, flammable = 5},
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
if placer:is_player() then
local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name())
end
end,
on_punch = function(pos, node, puncher)
if puncher:get_wielded_item():get_name() == "default:torch" then
minetest.set_node(pos, {name = name .. "_burning"})
minetest.swap_node(pos, {name = name .. "_burning"})
minetest.registered_nodes[name .. "_burning"].on_construct(pos)
minetest.log("action", puncher:get_player_name() ..
" ignites " .. node.name .. " at " ..
minetest.pos_to_string(pos))
@ -600,10 +616,12 @@ function tnt.register_tnt(def)
}
},
on_burn = function(pos)
minetest.set_node(pos, {name = name .. "_burning"})
minetest.swap_node(pos, {name = name .. "_burning"})
minetest.registered_nodes[name .. "_burning"].on_construct(pos)
end,
on_ignite = function(pos, igniter)
minetest.set_node(pos, {name = name .. "_burning"})
minetest.swap_node(pos, {name = name .. "_burning"})
minetest.registered_nodes[name .. "_burning"].on_construct(pos)
end,
})
end