2014-07-07 04:11:36 +02:00

204 lines
5.9 KiB
Lua

-- get intllib optionally
if (minetest.get_modpath("intllib")) then
dofile(minetest.get_modpath("intllib").."/intllib.lua")
S = intllib.Getter(minetest.get_current_modname())
else
S = function ( s ) return s end
end
--Register beanstalk nodes
minetest.register_node("magicbeans_w:leaves", {
description = S("magic beanstalk leaves"),
tiles = {"magicbeans_w_leaves.png"},
inventory_image = "magicbeans_w_leaves.png",
drawtype = "plantlike",
walkable = false,
climbable = true,
paramtype = "light",
groups = {leaves = 1, snappy = 3, flammable = 2},
sounds = default.node_sound_leaves_defaults()
})
minetest.register_node("magicbeans_w:blank", {
description = S("magic beanstalk climbable blank"),
drawtype = "airlike",
inventory_image = "unknown_node.png",
wield_image = "unknown_node.png",
walkable = false,
climbable = true,
paramtype = "light",
buildable_to = true,
pointable = false,
diggable = false,
drop = "",
groups = {not_in_creative_inventory = 1},
})
minetest.register_node("magicbeans_w:stem", {
description = S("magic beanstalk stem"),
tiles = {"magicbeans_w_stem_topbottom.png", "magicbeans_w_stem_topbottom.png", "magicbeans_w_stem.png"},
paramtype2 = "facedir",
groups = {oddly_breakable_by_hand = 1, choppy = 3, flammable = 2},
sounds = default.node_sound_wood_defaults(),
on_place = minetest.rotate_node,
})
minetest.register_node("magicbeans_w:cloud", {
description = S("cloud"),
tiles = {"default_cloud.png"},
walkable = false,
climbable = true,
paramtype = "light",
sunlight_propagates = true,
groups = {dig_immediate = 3},
sounds = { dig = { name = "", gain = 0 }, footstep = { name = "", gain = 0 },
dug = { name = "", gain = 0 }, player = { name = "", gain = 0 } }
})
magicbeans_w_list = {
{ S("magic jumping bean"), S("Magic super jump"), "jumping", nil, 5, nil, {"jump"}},
{ S("magic flying bean"), S("Magic flying"), "flying", 2, nil, 0.02, {"speed", "gravity"}},
{ S("magic running bean"), S("Magic super speed"), "running", 3, nil, nil, {"speed"}},
{ S("magic beanstalk bean"), nil, "beanstalk", nil, nil, nil, nil},
}
for i in ipairs(magicbeans_w_list) do
local beandesc = magicbeans_w_list[i][1]
local effdesc = magicbeans_w_list[i][2]
local bean = magicbeans_w_list[i][3]
local beanspeed = magicbeans_w_list[i][4]
local beanjump = magicbeans_w_list[i][5]
local beangrav = magicbeans_w_list[i][6]
local beangroups = magicbeans_w_list[i][7]
--Register effect types
if(beangroups ~= nil) then
playereffects.register_effect_type("bean_"..bean, effdesc, beangroups,
function(player)
player:set_physics_override({speed=beanspeed, jump=beanjump, gravity=beangrav})
end,
function(effect)
local player = minetest.get_player_by_name(effect.playername)
local speed, jump, grav
if beanspeed ~= nil then speed = 1 end
if beanjump ~= nil then jump = 1 end
if beangrav ~= nil then grav = 1 end
player:set_physics_override({speed=speed, jump=jump, gravity=grav})
end
)
end
--Register beans
minetest.register_craftitem("magicbeans_w:"..bean, {
description = beandesc,
inventory_image = "magicbeans_w_"..bean..".png",
on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.above then
if bean ~= "beanstalk" then
minetest.env:add_item(pointed_thing.above, {name="magicbeans_w:"..bean})
else
-- Grow Beanstalk
minetest.chat_send_player(placer:get_player_name(),S("It's gonna grow - wait for it!"))
math.randomseed(os.time())
local stalk = pointed_thing.above
stalk.x = stalk.x - 2
stalk.z = stalk.z - 2
local height = 127 - stalk.y
local c = {1, 1, 1, 1, 2, 1, 1, 1, 1}
local d = {1, 2, 3, 6}
local e = {9, 8, 7, 4}
local ex = 0
local zed = 1
local blank = 0
for why = 0,height do
blank = blank + 1
if blank > 4 then blank = 1 end
why1 = stalk.y + why
for i = 1,9 do
ex = ex + 1
if ex > 3 then
zed = zed + 1
ex = 1
end
if c[i] == 1 then
node = "magicbeans_w:leaves"
if i == d[blank] or i == e[blank] then node = "magicbeans_w:blank" end
else
node = "magicbeans_w:stem"
end
ex1 = stalk.x + ex
zed1 = stalk.z + zed
minetest.set_node({x=ex1, y=why1, z=zed1},{name=node})
end
zed = 0
end
-- Build cloud platform
for ex = -10,20 do
for zed = -10,20 do
ex1 = stalk.x + ex
zed1 = stalk.z + zed
minetest.set_node({x=ex1, y=why1, z=zed1},{name="magicbeans_w:cloud"})
end
end
end
itemstack:take_item()
end
return itemstack
end,
on_use = function(itemstack, user, pointed_thing)
if bean == "beanstalk" then
minetest.chat_send_player(user:get_player_name(),S("You can't eat magic beanstalk beans - you have to plant them."))
return
end
playereffects.apply_effect_type("bean_"..bean, 30, user)
itemstack:take_item()
return itemstack
end,
})
end
-- Bean Spawning
minetest.register_abm(
{nodenames = {"default:dirt_with_grass"},
interval = 600,
chance = 3000,
action = function(pos)
pos.y = pos.y + 1
math.randomseed(os.time())
local j = math.random(4)
local bean = magicbeans_w_list[j][3]
minetest.env:add_item(pos, {name="magicbeans_w:"..bean})
end,
})
-- Remove beanstalk blanks
minetest.register_abm(
{nodenames = {"magicbeans_w:blank"},
interval = 5,
chance = 1,
action = function(pos)
local neighbors = {
{ x=pos.x, y=pos.y, z=pos.z-1 },
{ x=pos.x, y=pos.y, z=pos.z+1 },
{ x=pos.x, y=pos.y-1, z=pos.z },
{ x=pos.x, y=pos.y+1, z=pos.z },
{ x=pos.x-1, y=pos.y, z=pos.z },
{ x=pos.x+1, y=pos.y, z=pos.z },
}
local attached = false
for i=1,#neighbors do
local node = minetest.get_node_or_nil(neighbors[i])
if(node ~= nil) then
if node.name == "magicbeans_w:leaves" or node.name == "magicbeans_w:stem" then
attached = true
break
end
end
end
if(attached == false) then
minetest.remove_node(pos)
end
end
})