Rename mod: default to mcl_core

This commit is contained in:
Wuzzy 2017-01-31 23:32:56 +01:00
parent d0ecf0c66c
commit 02fe45bca2
393 changed files with 2205 additions and 2210 deletions

67
mods/mcl_core/README.txt Normal file
View file

@ -0,0 +1,67 @@
Minetest 0.4 mod: default (with lot's of custom ...)
==========================
License of source code:
-----------------------
Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
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.
http://www.gnu.org/licenses/lgpl-2.1.html
License of media (sounds)
--------------------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
http://creativecommons.org/licenses/by-sa/3.0/
default_tool_break.ogg by EdgardEdition (CC BY 3.0), http://www.freesound.org/people/EdgardEdition
Authors of media files
-----------------------
MirceaKitsune (WTFPL):
character.x
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/
3: http://www.freesound.org/people/lsprice/sounds/88808/
Mito551 (sounds) (CC BY-SA):
default_dig_choppy.ogg
default_dig_cracky.ogg
default_dig_crumbly.1.ogg
default_dig_crumbly.2.ogg
default_dig_dig_immediate.ogg
default_dig_oddly_breakable_by_hand.ogg
default_dug_node.1.ogg
default_dug_node.2.ogg
default_grass_footstep.1.ogg
default_grass_footstep.2.ogg
default_grass_footstep.3.ogg
default_gravel_footstep.1.ogg
default_gravel_footstep.2.ogg
default_gravel_footstep.3.ogg
default_gravel_footstep.4.ogg
default_grass_footstep.1.ogg
default_place_node.1.ogg
default_place_node.2.ogg
default_place_node.3.ogg
default_place_node_hard.1.ogg
default_place_node_hard.2.ogg
default_snow_footstep.1.ogg
default_snow_footstep.2.ogg
default_hard_footstep.1.ogg
default_hard_footstep.2.ogg
default_hard_footstep.3.ogg
default_sand_footstep.1.ogg
default_sand_footstep.2.ogg
default_wood_footstep.1.ogg
default_wood_footstep.2.ogg
default_dirt_footstep.1.ogg
default_dirt_footstep.2.ogg
default_glass_footstep.ogg

1058
mods/mcl_core/crafting.lua Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,206 @@
-- mods/default/craftitems.lua
--
-- Crafting items
--
minetest.register_craftitem("mcl_core:stick", {
description = "Stick",
inventory_image = "default_stick.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:paper", {
description = "Paper",
inventory_image = "default_paper.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:book", {
description = "Book",
inventory_image = "default_book.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:coal_lump", {
description = "Coal",
groups = { coal=1 },
inventory_image = "default_coal_lump.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:charcoal_lump", {
description = "Charcoal",
groups = { coal=1 },
inventory_image = "default_charcoal_lump.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:iron_nugget", {
description = "Iron Nugget",
inventory_image = "default_iron_nugget.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:gold_nugget", {
description = "Gold Nugget",
inventory_image = "default_gold_nugget.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:diamond", {
description = "Diamond",
inventory_image = "default_diamond.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:clay_lump", {
description = "Clay",
inventory_image = "default_clay_lump.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:steel_ingot", {
description = "Iron Ingot",
inventory_image = "default_steel_ingot.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:gold_ingot", {
description = "Gold Ingot",
inventory_image = "default_gold_ingot.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:emerald", {
description = "Emerald",
inventory_image = "default_emerald.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:clay_brick", {
description = "Brick",
inventory_image = "default_clay_brick.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:flint", {
description = "Flint",
inventory_image = "default_flint.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:gunpowder", {
description = "Gunpowder",
inventory_image = "default_gunpowder.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:bone", {
description = "Bone",
inventory_image = "default_bone.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:glowstone_dust", {
description = "Glowstone Dust",
inventory_image = "default_glowstone_dust.png",
stack_max = 64,
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:fish_raw", {
description = "Raw Fish",
inventory_image = "default_fish.png",
on_use = minetest.item_eat(2),
stack_max = 64,
groups = { food=1, eatable = 2 },
})
minetest.register_craftitem("mcl_core:fish", {
description = "Cooked Fish",
inventory_image = "default_fish_cooked.png",
on_use = minetest.item_eat(4),
stack_max = 64,
groups = { food=1, eatable=4 },
})
minetest.register_craftitem("mcl_core:sugar", {
description = "Sugar",
inventory_image = "default_sugar.png",
stack_max = 64,
groups = { craftitem = 1 },
})
minetest.register_craftitem("mcl_core:string",{
description = "String",
inventory_image = "default_string.png",
stack_max = 64,
groups = { craftitem = 1 },
})
minetest.register_craftitem("mcl_core:bowl",{
description = "Bowl",
inventory_image = "default_bowl.png",
stack_max = 64,
groups = { craftitem = 1 },
})
minetest.register_craftitem("mcl_core:prismarine_cry", {
description = "Prismarine Crystals",
inventory_image = "default_prismarine_crystals.png",
stack_max = 64,
groups = { craftitem = 1 },
})
minetest.register_craftitem("mcl_core:prismarine_shard", {
description = "Prismarine Shard",
inventory_image = "default_prismarine_shard.png",
stack_max = 64,
groups = { craftitem = 1 },
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:quartz_crystal", {
description = "Nether Quartz",
inventory_image = "default_quartz_crystal.png",
stack_max = 64,
groups = { craftitem = 1 },
groups = { craftitem=1 },
})
minetest.register_craftitem("mcl_core:apple", {
description = "Apple",
wield_image = "default_apple.png",
inventory_image = "default_apple.png",
stack_max = 64,
on_use = minetest.item_eat(4),
groups = { food = 2 },
})
minetest.register_craftitem("mcl_core:apple_gold", {
description = core.colorize("#55FFFF", "Golden Apple"),
wield_image = "default_apple_gold.png",
inventory_image = "default_apple_gold.png",
stack_max = 64,
on_use = minetest.item_eat(8),
groups = { food = 2 },
})
minetest.register_alias("mcl_core:iron_ingot", "mcl_core:steel_ingot")

845
mods/mcl_core/functions.lua Normal file
View file

@ -0,0 +1,845 @@
--
-- Lavacooling
--
mcl_core.cool_lava_source = function(pos)
minetest.set_node(pos, {name="mcl_core:obsidian"})
end
mcl_core.cool_lava_flowing = function(pos)
minetest.set_node(pos, {name="mcl_core:stone"})
end
minetest.register_abm({
nodenames = {"mcl_core:lava_flowing"},
neighbors = {"group:water"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
mcl_core.cool_lava_flowing(pos, node, active_object_count, active_object_count_wider)
end,
})
minetest.register_abm({
nodenames = {"mcl_core:lava_source"},
neighbors = {"group:water"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
mcl_core.cool_lava_source(pos, node, active_object_count, active_object_count_wider)
end,
})
--
-- Papyrus and cactus growing
--
-- Functions
local grow_cactus = function(pos, node)
pos.y = pos.y-1
local name = minetest.get_node(pos).name
if minetest.get_item_group(name, "sand") ~= 0 then
pos.y = pos.y+1
local height = 0
while minetest.get_node(pos).name == "mcl_core:cactus" and height < 4 do
height = height+1
pos.y = pos.y+1
end
if height < 3 then
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="mcl_core:cactus"})
end
end
end
end
local grow_reeds = function(pos, node)
pos.y = pos.y-1
local name = minetest.get_node(pos).name
if minetest.get_node_group(name, "soil_sugarcane") ~= 0 then
if minetest.find_node_near(pos, 3, {"group:water"}) == nil then
return
end
pos.y = pos.y+1
local height = 0
while minetest.get_node(pos).name == "mcl_core:reeds" and height < 3 do
height = height+1
pos.y = pos.y+1
end
if height < 3 then
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="mcl_core:reeds"})
end
end
end
end
-- ABMs
local function drop_attached_node(p)
local nn = minetest.get_node(p).name
minetest.remove_node(p)
for _, item in pairs(minetest.get_node_drops(nn, "")) do
local pos = {
x = p.x + math.random()/2 - 0.25,
y = p.y + math.random()/2 - 0.25,
z = p.z + math.random()/2 - 0.25,
}
minetest.add_item(pos, item)
end
end
-- Remove attached nodes next to flowing water
minetest.register_abm({
nodenames = {"group:dig_by_water"},
neighbors = {"group:water"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
for xp=-1,1 do
for zp=-1,1 do
local p = {x=pos.x+xp, y=pos.y, z=pos.z+zp}
local n = minetest.get_node(p)
if (n.name=="mcl_core:water_flowing") then
drop_attached_node(pos)
minetest.dig_node(pos)
break
end
end
end
for yp=-1,1 do
local p = {x=pos.x, y=pos.y+yp, z=pos.z}
local n = minetest.get_node(p)
if (n.name=="mcl_core:water_flowing") then
drop_attached_node(pos)
minetest.dig_node(pos)
break
end
end
end,
})
minetest.register_abm({
nodenames = {"mcl_core:cactus"},
neighbors = {"group:sand"},
interval = 25,
chance = 10,
action = function(pos)
grow_cactus(pos)
end,
})
minetest.register_abm({
nodenames = {"mcl_core:reeds"},
neighbors = {"mcl_core:dirt", "mcl_core:dirt_with_grass"},
interval = 25,
chance = 10,
action = function(pos)
grow_reeds(pos)
end,
})
--
-- Papyrus and cactus drop
--
local timber_nodenames={"mcl_core:reeds", "mcl_core:cactus"}
minetest.register_on_dignode(function(pos, node)
local i=1
while timber_nodenames[i]~=nil do
if node.name==timber_nodenames[i] then
local np={x=pos.x, y=pos.y+1, z=pos.z}
while minetest.get_node(np).name==timber_nodenames[i] do
minetest.remove_node(np)
minetest.add_item(np, timber_nodenames[i])
np={x=np.x, y=np.y+1, z=np.z}
end
end
i=i+1
end
end)
--
-- Flint and Steel
--
function mcl_core.set_fire(pointed_thing)
local n = minetest.get_node(pointed_thing.above)
if n.name ~= "" and n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then
minetest.add_node(pointed_thing.above, {name="fire:basic_flame"})
end
end
--
-- Fire Particles
--
function mcl_core.add_fire(pos)
local null = {x=0, y=0, z=0}
pos.y = pos.y+0.19
minetest.add_particle(pos, null, null, 1.1,
1.5, true, "default_fire_particle"..tostring(math.random(1,2)) ..".png")
pos.y = pos.y +0.01
minetest.add_particle(pos, null, null, 0.8,
1.5, true, "default_fire_particle"..tostring(math.random(1,2)) ..".png")
end
--
-- Bone Meal
--
local n
local n2
local pos
local function apple_leave()
if math.random(0, 10) == 3 then
return {name = "mcl_core:apple"}
else
return {name = "mcl_core:leaves"}
end
end
local function air_leave()
if math.random(0, 50) == 3 then
return {name = "air"}
else
return {name = "mcl_core:leaves"}
end
end
local function generate_tree(pos, trunk, leaves, typearbre)
pos.y = pos.y-1
local nodename = minetest.get_node(pos).name
pos.y = pos.y+1
if not minetest.get_node_light(pos) then
return
end
local node
if typearbre == nil or typearbre == 1 then
node = {name = ""}
for dy=1,4 do
pos.y = pos.y+dy
if minetest.get_node(pos).name ~= "air" then
return
end
pos.y = pos.y-dy
end
node = {name = trunk}
for dy=0,4 do
pos.y = pos.y+dy
if minetest.get_node(pos).name == "air" then
minetest.add_node(pos, node)
end
pos.y = pos.y-dy
end
node = {name = leaves}
pos.y = pos.y+3
local rarity = 0
if math.random(0, 10) == 3 then
rarity = 1
end
for dx=-2,2 do
for dz=-2,2 do
for dy=0,3 do
pos.x = pos.x+dx
pos.y = pos.y+dy
pos.z = pos.z+dz
if dx == 0 and dz == 0 and dy==3 then
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
minetest.add_node(pos, node)
if rarity == 1 then
minetest.add_node(pos, apple_leave())
else
minetest.add_node(pos, air_leave())
end
end
elseif dx == 0 and dz == 0 and dy==4 then
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
minetest.add_node(pos, node)
if rarity == 1 then
minetest.add_node(pos, apple_leave())
else
minetest.add_node(pos, air_leave())
end
end
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
if minetest.get_node(pos).name == "air" then
minetest.add_node(pos, node)
if rarity == 1 then
minetest.add_node(pos, apple_leave())
else
minetest.add_node(pos, air_leave())
end
end
else
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
minetest.add_node(pos, node)
if rarity == 1 then
minetest.add_node(pos, apple_leave())
else
minetest.add_node(pos, air_leave())
end
end
end
end
pos.x = pos.x-dx
pos.y = pos.y-dy
pos.z = pos.z-dz
end
end
end
elseif typearbre == 2 then
node = {name = ""}
-- can place big tree ?
local tree_size = math.random(15, 25)
for dy=1,4 do
pos.y = pos.y+dy
if minetest.get_node(pos).name ~= "air" then
return
end
pos.y = pos.y-dy
end
--Cheak for placing big tree
pos.y = pos.y-1
for dz=0,1 do
pos.z = pos.z + dz
--> 0
if minetest.get_node(pos).name == "mcl_core:dirt_with_grass"
or minetest.get_node(pos).name == "mcl_core:dirt" then else
return
end
pos.x = pos.x+1
--> 1
if minetest.get_node(pos).name == "mcl_core:dirt_with_grass"
or minetest.get_node(pos).name == "mcl_core:dirt" then else
return
end
pos.x = pos.x-1
pos.z = pos.z - dz
end
pos.y = pos.y+1
-- Make tree with vine
node = {name = trunk}
for dy=0,tree_size do
pos.y = pos.y+dy
for dz=-1,2 do
if dz == -1 then
pos.z = pos.z + dz
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 4})
end
pos.x = pos.x+1
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 4})
end
pos.x = pos.x-1
pos.z = pos.z - dz
elseif dz == 2 then
pos.z = pos.z + dz
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air"then
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 5})
end
pos.x = pos.x+1
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 5})
end
pos.x = pos.x-1
pos.z = pos.z - dz
else
pos.z = pos.z + dz
pos.x = pos.x-1
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 2})
end
pos.x = pos.x+1
if minetest.get_node(pos).name == "air" then
minetest.add_node(pos, {name = trunk, param2=2})
end
pos.x = pos.x+1
if minetest.get_node(pos).name == "air" then
minetest.add_node(pos, {name = trunk, param2=2})
end
pos.x = pos.x+1
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 3})
end
pos.x = pos.x-2
pos.z = pos.z - dz
end
end
pos.y = pos.y-dy
end
-- make leaves
node = {name = leaves}
pos.y = pos.y+tree_size-4
for dx=-5,5 do
for dz=-5,5 do
for dy=0,3 do
pos.x = pos.x+dx
pos.y = pos.y+dy
pos.z = pos.z+dz
if dx == 0 and dz == 0 and dy==3 then
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 2) == 1 then
minetest.add_node(pos, node)
end
elseif dx == 0 and dz == 0 and dy==4 then
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 5) == 1 then
minetest.add_node(pos, node)
minetest.add_node(pos, air_leave())
end
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" then
minetest.add_node(pos, node)
end
else
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 3) == 1 then
minetest.add_node(pos, node)
end
else
if math.random(1, 5) == 1 and minetest.get_node(pos).name == "air" then
minetest.add_node(pos, node)
end
end
end
pos.x = pos.x-dx
pos.y = pos.y-dy
pos.z = pos.z-dz
end
end
end
end
end
local plant_tab = {}
local rnd_max = 5
minetest.after(0.5, function()
plant_tab[0] = "air"
plant_tab[1] = "mcl_core:grass"
plant_tab[2] = "mcl_core:grass"
plant_tab[3] = "mcl_core:grass"
plant_tab[4] = "mcl_core:grass"
plant_tab[5] = "mcl_core:grass"
if minetest.get_modpath("mcl_flowers") ~= nil then
rnd_max = 15
plant_tab[6] = "mcl_flowers:dandelion"
plant_tab[7] = "mcl_flowers:blue_orchid"
plant_tab[8] = "mcl_flowers:oxeye_daisy"
plant_tab[9] = "mcl_flowers:tulip_orange"
plant_tab[10] = "mcl_flowers:tulip_red"
plant_tab[11] = "mcl_flowers:tulip_white"
plant_tab[12] = "mcl_flowers:tulip_pink"
plant_tab[13] = "mcl_flowers:allium"
plant_tab[14] = "mcl_flowers:poppy"
plant_tab[15] = "mcl_flowers:azure_bluet"
end
end)
function mcl_core.duengen(pointed_thing)
pos = pointed_thing.under
n = minetest.get_node(pos)
if n.name == "" then return false end
local stage = ""
if n.name == "mcl_core:sapling" then
minetest.add_node(pos, {name="air"})
generate_tree(pos, "mcl_core:tree", "mcl_core:leaves", 1)
return true
elseif string.find(n.name, "mcl_farming:wheat_") ~= nil then
stage = string.sub(n.name, 15)
if stage == "3" then
minetest.add_node(pos, {name="mcl_farming:wheat"})
elseif math.random(1,5) < 3 then
minetest.add_node(pos, {name="mcl_farming:wheat"})
else
minetest.add_node(pos, {name="mcl_farming:wheat_"..math.random(2,3)})
end
return true
elseif string.find(n.name, "mcl_farming:potato_") ~= nil then
stage = tonumber(string.sub(n.name, 16))
if stage == 1 then
minetest.add_node(pos, {name="mcl_farming:potato_"..math.random(stage,2)})
else
minetest.add_node(pos, {name="mcl_farming:potato"})
end
return true
elseif string.find(n.name, "mcl_farming:carrot_") ~= nil then
stage = tonumber(string.sub(n.name, 16))
if stage == 1 then
minetest.add_node(pos, {name="mcl_farming:carrot_"..math.random(stage,2)})
else
minetest.add_node(pos, {name="mcl_farming:carrot"})
end
return true
elseif string.find(n.name, "mcl_farming:pumpkin_") ~= nil then
stage = tonumber(string.sub(n.name, 17))
if stage == 1 then
minetest.add_node(pos, {name="mcl_farming:pumpkin_"..math.random(stage,2)})
else
minetest.add_node(pos, {name="mcl_farming:pumpkintige_unconnect"})
end
return true
elseif string.find(n.name, "mcl_farming:melontige_") ~= nil then
stage = tonumber(string.sub(n.name, 18))
if stage == 1 then
minetest.add_node(pos, {name="mcl_farming:melontige_"..math.random(stage,2)})
else
minetest.add_node(pos, {name="mcl_farming:melontige_unconnect"})
end
return true
elseif n.name ~= "" and n.name == "mcl_core:junglesapling" then
minetest.add_node(pos, {name="air"})
generate_tree(pos, "mcl_core:jungletree", "mcl_core:jungleleaves", 2)
return true
elseif n.name ~="" and n.name == "mcl_core:reeds" then
grow_reeds(pos)
return true
elseif n.name ~="" and n.name == "mcl_core:cactus" then
grow_cactus(pos)
return true
elseif n.name == "mcl_core:dirt_with_grass" then
for i = -2, 3, 1 do
for j = -3, 2, 1 do
pos = pointed_thing.above
pos = {x=pos.x+i, y=pos.y, z=pos.z+j}
n = minetest.get_node(pos)
n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
if n.name ~= "" and n.name == "air" and n2.name == "mcl_core:dirt_with_grass" then
if math.random(0,5) > 3 then
minetest.add_node(pos, {name=plant_tab[math.random(0, rnd_max)]})
else
minetest.add_node(pos, {name=plant_tab[math.random(0, 5)]})
end
end
end
end
return true
else
return false
end
end
------------------------------
-- Try generate grass dirt ---
------------------------------
-- turn dirt to dirt with grass
minetest.register_abm({
nodenames = {"mcl_core:dirt"},
neighbors = {"air"},
interval = 30,
chance = 20,
action = function(pos)
if pos == nil then
return
end
local can_change = 0
for i=1,4 do
local p = {x=pos.x, y=pos.y+i, z=pos.z}
local n = minetest.get_node(p)
-- On verifie si il y a de l'air
if (n.name=="air") then
can_change = can_change + 1
end
end
if can_change > 3 then
local light = minetest.get_node_light(pos)
if light or light > 10 then
minetest.add_node(pos, {name="mcl_core:dirt_with_grass"})
end
end
end,
})
--------------------------
-- Try generate tree ---
--------------------------
-- TODO: Acacia, dark oak, spruce, birch
-- Normal tree
minetest.register_abm({
nodenames = {"mcl_core:sapling"},
neighbors = {"group:soil_sapling"},
interval = 30,
chance = 15,
action = function(pos)
local light = minetest.get_node_light(pos)
local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
local soiltype = minetest.get_item_group(soilnode.name, "soil_sapling")
if soiltype >= 1 and light and light >= 9 then
minetest.add_node(pos, {name="air"})
generate_tree(pos, "mcl_core:tree", "mcl_core:leaves", 1)
end
end,
})
-- Jungle Tree
minetest.register_abm({
nodenames = {"mcl_core:junglesapling"},
neighbors = {"group:soil_sapling"},
interval = 30,
chance = 15,
action = function(pos)
local light = minetest.get_node_light(pos)
local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
local soiltype = minetest.get_item_group(soilnode.name, "soil_sapling")
if soiltype == 2 and light and light >= 9 then
minetest.add_node(pos, {name="air"})
generate_tree(pos, "mcl_core:jungletree", "mcl_core:jungleleaves", 2)
end
end,
})
---------------------
-- Vine generating --
---------------------
minetest.register_abm({
nodenames = {"mcl_core:vine"},
interval = 80,
chance = 5,
action = function(pos, node, active_object_count, active_object_count_wider)
local newpos = {x=pos.x, y=pos.y-1, z=pos.z}
local n = minetest.get_node(newpos)
if n.name == "air" then
local walldir = node.param2
minetest.add_node(newpos, {name = "mcl_core:vine", param2 = walldir})
end
end
})
--
-- Sounds
--
function mcl_core.node_sound_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="", gain=1.0}
table.dug = table.dug or
{name="default_dug_node", gain=0.25}
table.place = table.place or
{name="default_place_node_hard", gain=1.0}
return table
end
function mcl_core.node_sound_stone_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_hard_footstep", gain=0.5}
table.dug = table.dug or
{name="default_hard_footstep", gain=1.0}
mcl_core.node_sound_defaults(table)
return table
end
-- TODO: Maybe add custom metal sounds
mcl_core.node_sound_metal_defaults = mcl_core.node_sound_stone_defaults
function mcl_core.node_sound_dirt_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_dirt_footstep", gain=1.0}
table.dug = table.dug or
{name="default_dirt_footstep", gain=1.5}
table.place = table.place or
{name="default_place_node", gain=1.0}
mcl_core.node_sound_defaults(table)
return table
end
function mcl_core.node_sound_sand_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_sand_footstep", gain=0.5}
table.dug = table.dug or
{name="default_sand_footstep", gain=1.0}
table.place = table.place or
{name="default_place_node", gain=1.0}
mcl_core.node_sound_defaults(table)
return table
end
function mcl_core.node_sound_wood_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_wood_footstep", gain=0.5}
table.dug = table.dug or
{name="default_wood_footstep", gain=1.0}
mcl_core.node_sound_defaults(table)
return table
end
function mcl_core.node_sound_leaves_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_grass_footstep", gain=0.35}
table.dug = table.dug or
{name="default_grass_footstep", gain=0.85}
table.dig = table.dig or
{name="default_dig_crumbly", gain=0.4}
table.place = table.place or
{name="default_place_node", gain=1.0}
mcl_core.node_sound_defaults(table)
return table
end
function mcl_core.node_sound_glass_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_glass_footstep", gain=0.5}
table.dug = table.dug or
{name="default_break_glass", gain=1.0}
mcl_core.node_sound_defaults(table)
return table
end
-- Leaf Decay
-- To enable leaf decay for a node, add it to the "leafdecay" group.
--
-- The rating of the group determines how far from a node in the group "tree"
-- the node can be without decaying.
--
-- If param2 of the node is ~= 0, the node will always be preserved. Thus, if
-- the player places a node of that kind, you will want to set param2=1 or so.
--
-- If the node is in the leafdecay_drop group then the it will always be dropped
-- as an item
mcl_core.leafdecay_trunk_cache = {}
mcl_core.leafdecay_enable_cache = true
-- Spread the load of finding trunks
mcl_core.leafdecay_trunk_find_allow_accumulator = 0
minetest.register_globalstep(function(dtime)
local finds_per_second = 5000
mcl_core.leafdecay_trunk_find_allow_accumulator =
math.floor(dtime * finds_per_second)
end)
minetest.register_abm({
nodenames = {"group:leafdecay"},
neighbors = {"air", "group:liquid"},
-- A low interval and a high inverse chance spreads the load
interval = 2,
chance = 5,
action = function(p0, node, _, _)
--print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")")
local do_preserve = false
local d = minetest.registered_nodes[node.name].groups.leafdecay
if not d or d == 0 then
--print("not groups.leafdecay")
return
end
local n0 = minetest.get_node(p0)
if n0.param2 ~= 0 then
--print("param2 ~= 0")
return
end
local p0_hash = nil
if mcl_core.leafdecay_enable_cache then
p0_hash = minetest.hash_node_position(p0)
local trunkp = mcl_core.leafdecay_trunk_cache[p0_hash]
if trunkp then
local n = minetest.get_node(trunkp)
local reg = minetest.registered_nodes[n.name]
-- Assume ignore is a trunk, to make the thing work at the border of the active area
if n.name == "ignore" or (reg and reg.groups.tree and reg.groups.tree ~= 0) then
--print("cached trunk still exists")
return
end
--print("cached trunk is invalid")
-- Cache is invalid
table.remove(mcl_core.leafdecay_trunk_cache, p0_hash)
end
end
if mcl_core.leafdecay_trunk_find_allow_accumulator <= 0 then
return
end
mcl_core.leafdecay_trunk_find_allow_accumulator =
mcl_core.leafdecay_trunk_find_allow_accumulator - 1
-- Assume ignore is a trunk, to make the thing work at the border of the active area
local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"})
if p1 then
do_preserve = true
if mcl_core.leafdecay_enable_cache then
--print("caching trunk")
-- Cache the trunk
mcl_core.leafdecay_trunk_cache[p0_hash] = p1
end
end
if not do_preserve then
-- Drop stuff other than the node itself
local itemstacks = minetest.get_node_drops(n0.name)
for _, itemname in ipairs(itemstacks) do
if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or
itemname ~= n0.name then
local p_drop = {
x = p0.x - 0.5 + math.random(),
y = p0.y - 0.5 + math.random(),
z = p0.z - 0.5 + math.random(),
}
minetest.add_item(p_drop, itemname)
end
end
-- Remove node
minetest.remove_node(p0)
core.check_for_falling(p0)
end
end
})
------------------------
-- Create Color Glass --
------------------------
function mcl_core.add_glass(desc, recipeitem, color)
minetest.register_node("mcl_core:glass_"..color, {
description = desc,
drawtype = "glasslike",
is_ground_content = false,
tiles = {"xpanes_pane_glass_"..color..".png"},
inventory_image = minetest.inventorycube("xpanes_pane_glass_"..color..".png"),
paramtype = "light",
use_texture_alpha = true,
stack_max = 64,
groups = {cracky=3,oddly_breakable_by_hand=3, building_block=1},
sounds = mcl_core.node_sound_glass_defaults(),
drop = "",
})
minetest.register_craft({
output = 'mcl_core:glass_'..color..' 8',
recipe = {
{'mcl_core:glass','mcl_core:glass','mcl_core:glass'},
{'mcl_core:glass','group:dye,'..recipeitem,'mcl_core:glass'},
{'mcl_core:glass','mcl_core:glass','mcl_core:glass'},
}
})
end

29
mods/mcl_core/init.lua Normal file
View file

@ -0,0 +1,29 @@
-- Minetest 0.4 mod: default
-- See README.txt for licensing and other information.
-- The API documentation in here was moved into doc/lua_api.txt
-- Definitions made by this mod that other mods can use too
mcl_core = {}
mcl_core.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]"
mcl_core.gui_bg = "bgcolor[#080808BB;true]"
mcl_core.gui_bg_img = ""
mcl_core.inventory_header = mcl_core.gui_slots .. mcl_core.gui_bg
minetest.nodedef_default.stack_max = 64
minetest.craftitemdef_default.stack_max = 64
-- Load files
dofile(minetest.get_modpath("mcl_core").."/functions.lua")
dofile(minetest.get_modpath("mcl_core").."/nodes.lua")
dofile(minetest.get_modpath("mcl_core").."/tools.lua")
dofile(minetest.get_modpath("mcl_core").."/craftitems.lua")
dofile(minetest.get_modpath("mcl_core").."/crafting.lua")
dofile(minetest.get_modpath("mcl_core").."/mapgen.lua")
dofile(minetest.get_modpath("mcl_core").."/player.lua")
-- Aliases
minetest.register_alias("default:desert_sand", "mcl_core:sand")
minetest.register_alias("default:desert_stone", "mcl_core:sandstone")
minetest.register_alias("default:iron_lump", "mcl_core:iron_lump")
minetest.register_alias("default:gold_lump", "mcl_core:gold_lump")

558
mods/mcl_core/mapgen.lua Normal file
View file

@ -0,0 +1,558 @@
-- mods/default/mapgen.lua
--
-- Aliases for map generator outputs
--
minetest.register_alias("mapgen_air", "air")
minetest.register_alias("mapgen_stone", "mcl_core:stone")
minetest.register_alias("mapgen_tree", "mcl_core:tree")
minetest.register_alias("mapgen_leaves", "mcl_core:leaves")
minetest.register_alias("mapgen_jungletree", "mcl_core:jungletree")
minetest.register_alias("mapgen_jungleleaves", "mcl_core:jungleleaves")
minetest.register_alias("mapgen_pine_tree", "mcl_core:darktree")
minetest.register_alias("mapgen_pine_needles", "mcl_core:darkleaves")
minetest.register_alias("mapgen_apple", "mcl_core:leaves")
minetest.register_alias("mapgen_water_source", "mcl_core:water_source")
minetest.register_alias("mapgen_dirt", "mcl_core:dirt")
minetest.register_alias("mapgen_dirt_with_grass", "mcl_core:dirt_with_grass")
minetest.register_alias("mapgen_dirt_with_snow", "mcl_core:dirt_with_snow")
minetest.register_alias("mapgen_sand", "mcl_core:sand")
minetest.register_alias("mapgen_gravel", "mcl_core:gravel")
minetest.register_alias("mapgen_clay", "mcl_core:clay")
minetest.register_alias("mapgen_lava_source", "mcl_core:lava_source")
minetest.register_alias("mapgen_cobble", "mcl_core:cobble")
minetest.register_alias("mapgen_mossycobble", "mcl_core:mossycobble")
minetest.register_alias("mapgen_junglegrass", "mcl_core:junglegrass")
minetest.register_alias("mapgen_stone_with_coal", "mcl_core:stone_with_coal")
minetest.register_alias("mapgen_stone_with_iron", "mcl_core:stone_with_iron")
minetest.register_alias("mapgen_desert_sand", "mcl_core:sand")
minetest.register_alias("mapgen_desert_stone", "mcl_core:sandstone")
minetest.register_alias("mapgen_sandstone", "mcl_core:sandstone")
minetest.register_alias("mapgen_river_water_source", "mcl_core:water_source")
minetest.register_alias("mapgen_snow", "mcl_core:snow")
minetest.register_alias("mapgen_snowblock", "mcl_core:snowblock")
minetest.register_alias("mapgen_ice", "mcl_core:ice")
minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble")
minetest.register_alias("mapgen_sandstonebrick", "mcl_core:sandstonesmooth")
minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstone")
--
-- Ore generation
--
-- Gravel
minetest.register_ore({
ore_type = "blob",
ore = "mcl_core:gravel",
wherein = {"mcl_core:stone"},
clust_scarcity = 14*14*14,
clust_num_ores = 33,
clust_size = 5,
y_min = -90,
y_max = 90,
})
--
-- Coal
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_coal",
wherein = "mcl_core:stone",
clust_scarcity = 500,
clust_num_ores = 5,
clust_size = 3,
y_min = 13,
y_max = 31000,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_coal",
wherein = "mcl_core:stone",
clust_scarcity = 500,
clust_num_ores = 8,
clust_size = 3,
y_min = 12,
y_max = -12,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_coal",
wherein = "mcl_core:stone",
clust_scarcity = 1000,
clust_num_ores = 6,
clust_size = 3,
y_min = -11,
y_max = 64,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_coal",
wherein = "mcl_core:stone",
clust_scarcity = 5000,
clust_num_ores = 4,
clust_size = 2,
y_min = 65,
y_max = 67,
})
--
-- Iron
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_iron",
wherein = "mcl_core:stone",
clust_scarcity = 830,
clust_num_ores = 5,
clust_size = 3,
y_min = -127,
y_max = -10,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_iron",
wherein = "mcl_core:stone",
clust_scarcity = 1660,
clust_num_ores = 3,
clust_size = 2,
y_min = -9,
y_max = 1,
})
--
-- Gold
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_gold",
wherein = "mcl_core:stone",
clust_scarcity = 5000,
clust_num_ores = 5,
clust_size = 3,
y_min = -59,
y_max = -35,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_gold",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 3,
clust_size = 2,
y_min = -35,
y_max = -33,
})
--
-- Diamond
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_diamond",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 4,
clust_size = 3,
y_min = -59,
y_max = -48,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_diamond",
wherein = "mcl_core:stone",
clust_scarcity = 5000,
clust_num_ores = 2,
clust_size = 2,
y_min = -59,
y_max = -48,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_diamond",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 8,
clust_size = 3,
y_min = -55,
y_max = -52,
})
--
-- Redstone
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_redstone",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 5,
clust_size = 3,
y_min = -59,
y_max = -48,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_redstone",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 10,
clust_size = 4,
y_min = -59,
y_max = -48,
})
--
-- Emerald
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_emerald",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 1,
clust_size = 2,
y_min = -59,
y_max = -35,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_emerald",
wherein = "mcl_core:stone",
clust_scarcity = 50000,
clust_num_ores = 3,
clust_size = 2,
y_min = -59,
y_max = -35,
})
--
-- Lapis Lazuli
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_lapis",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 7,
clust_size = 4,
y_min = -50,
y_max = -46,
})
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:stone_with_lapis",
wherein = "mcl_core:stone",
clust_scarcity = 10000,
clust_num_ores = 5,
clust_size = 4,
y_min = -59,
y_max = -50,
})
--
-- Glowstone
--
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:glowstone",
wherein = "mcl_core:stone",
clust_scarcity = 50000,
clust_num_ores = 10,
clust_size = 5,
y_min = -59,
y_max = -0,
})
function mcl_core.generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, chunk_size, ore_per_chunk, y_min, y_max)
minetest.log('action', "WARNING: mcl_core.generate_ore is deprecated")
if maxp.y < y_min or minp.y > y_max then
return
end
y_min = math.max(minp.y, y_min)
y_max = math.min(maxp.y, y_max)
if chunk_size >= y_max - y_min + 1 then
return
end
local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1)
local pr = PseudoRandom(seed)
local num_chunks = math.floor(chunks_per_volume * volume)
local inverse_chance = math.floor(chunk_size*chunk_size*chunk_size / ore_per_chunk)
--print("generate_ore num_chunks: "..dump(num_chunks))
for i=1,num_chunks do
local y0 = pr:next(y_min, y_max-chunk_size+1)
if y0 >= y_min and y0 <= y_max then
local x0 = pr:next(minp.x, maxp.x-chunk_size+1)
local z0 = pr:next(minp.z, maxp.z-chunk_size+1)
local p0 = {x=x0, y=y0, z=z0}
for x1=0,chunk_size-1 do
for y1=0,chunk_size-1 do
for z1=0,chunk_size-1 do
if pr:next(1,inverse_chance) == 1 then
local x2 = x0+x1
local y2 = y0+y1
local z2 = z0+z1
local p2 = {x=x2, y=y2, z=z2}
if minetest.get_node(p2).name == wherein then
minetest.set_node(p2, {name=name})
end
end
end
end
end
end
end
--print("generate_ore done")
end
function mcl_core.make_reeds(pos, size)
for y=0,size-1 do
local p = {x=pos.x, y=pos.y+y, z=pos.z}
local nn = minetest.get_node(p).name
if minetest.registered_nodes[nn] and
minetest.registered_nodes[nn].buildable_to then
minetest.set_node(p, {name="mcl_core:reeds"})
else
return
end
end
end
function mcl_core.make_cactus(pos, size)
for y=0,size-1 do
local p = {x=pos.x, y=pos.y+y, z=pos.z}
local nn = minetest.get_node(p).name
if minetest.registered_nodes[nn] and
minetest.registered_nodes[nn].buildable_to then
minetest.set_node(p, {name="mcl_core:cactus"})
else
return
end
end
end
minetest.register_on_generated(function(minp, maxp, seed)
if maxp.y >= 2 and minp.y <= 0 then
-- Generate clay
-- Assume X and Z lengths are equal
local divlen = 4
local divs = (maxp.x-minp.x)/divlen+1;
for divx=0+1,divs-1-1 do
for divz=0+1,divs-1-1 do
local cx = minp.x + math.floor((divx+0.5)*divlen)
local cz = minp.z + math.floor((divz+0.5)*divlen)
if minetest.get_node({x=cx,y=1,z=cz}).name == "mcl_core:water_source" and
minetest.get_node({x=cx,y=0,z=cz}).name == "mcl_core:sand" then
local is_shallow = true
local num_water_around = 0
if minetest.get_node({x=cx-divlen*2,y=1,z=cz+0}).name == "mcl_core:water_source" then
num_water_around = num_water_around + 1 end
if minetest.get_node({x=cx+divlen*2,y=1,z=cz+0}).name == "mcl_core:water_source" then
num_water_around = num_water_around + 1 end
if minetest.get_node({x=cx+0,y=1,z=cz-divlen*2}).name == "mcl_core:water_source" then
num_water_around = num_water_around + 1 end
if minetest.get_node({x=cx+0,y=1,z=cz+divlen*2}).name == "mcl_core:water_source" then
num_water_around = num_water_around + 1 end
if num_water_around >= 2 then
is_shallow = false
end
if is_shallow then
for x1=-divlen,divlen do
for z1=-divlen,divlen do
if minetest.get_node({x=cx+x1,y=0,z=cz+z1}).name == "mcl_core:sand" or minetest.get_node({x=cx+x1,y=0,z=cz+z1}).name == "mcl_core:sandstone" then
minetest.set_node({x=cx+x1,y=0,z=cz+z1}, {name="mcl_core:clay"})
end
end
end
end
end
end
end
-- Generate reeds
local perlin1 = minetest.get_perlin(354, 3, 0.7, 100)
-- Assume X and Z lengths are equal
local divlen = 8
local divs = (maxp.x-minp.x)/divlen+1;
for divx=0,divs-1 do
for divz=0,divs-1 do
local x0 = minp.x + math.floor((divx+0)*divlen)
local z0 = minp.z + math.floor((divz+0)*divlen)
local x1 = minp.x + math.floor((divx+1)*divlen)
local z1 = minp.z + math.floor((divz+1)*divlen)
-- Determine reeds amount from perlin noise
local reeds_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 45 - 20)
-- Find random positions for reeds based on this random
local pr = PseudoRandom(seed+1)
for i=0,reeds_amount do
local x = pr:next(x0, x1)
local z = pr:next(z0, z1)
if minetest.get_node({x=x,y=1,z=z}).name == "mcl_core:dirt_with_grass" and
minetest.find_node_near({x=x,y=1,z=z}, 1, "mcl_core:water_source") then
mcl_core.make_reeds({x=x,y=2,z=z}, pr:next(2, 4))
end
local p = {x=x,y=1,z=z}
if minetest.get_node(p).name == "mcl_core:sand" then
if math.random(0,1000) == 1 then -- 0,12000
-- TODO: Re-enable random_struct
--random_struct.call_struct(p,2)
end
end
end
end
end
-- Generate cactuses
local perlin1 = minetest.get_perlin(230, 3, 0.6, 100)
-- Assume X and Z lengths are equal
local divlen = 16
local divs = (maxp.x-minp.x)/divlen+1;
for divx=0,divs-1 do
for divz=0,divs-1 do
local x0 = minp.x + math.floor((divx+0)*divlen)
local z0 = minp.z + math.floor((divz+0)*divlen)
local x1 = minp.x + math.floor((divx+1)*divlen)
local z1 = minp.z + math.floor((divz+1)*divlen)
-- Determine cactus amount from perlin noise
local cactus_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 6 - 3)
-- Find random positions for cactus based on this random
local pr = PseudoRandom(seed+1)
for i=0,cactus_amount do
local x = pr:next(x0, x1)
local z = pr:next(z0, z1)
-- Find ground level (0...15)
local ground_y = nil
for y=30,0,-1 do
if minetest.get_node({x=x,y=y,z=z}).name ~= "air" then
ground_y = y
break
end
end
-- If sand, make cactus
if ground_y and minetest.get_node({x=x,y=ground_y,z=z}).name == "mcl_core:sand" then
mcl_core.make_cactus({x=x,y=ground_y+1,z=z}, pr:next(3, 4))
end
end
end
end
-- Generate grass
local perlin1 = minetest.get_perlin(329, 3, 0.6, 100)
-- Assume X and Z lengths are equal
local divlen = 5
local divs = (maxp.x-minp.x)/divlen+1;
for divx=0,divs-1 do
for divz=0,divs-1 do
local x0 = minp.x + math.floor((divx+0)*divlen)
local z0 = minp.z + math.floor((divz+0)*divlen)
local x1 = minp.x + math.floor((divx+1)*divlen)
local z1 = minp.z + math.floor((divz+1)*divlen)
-- Determine grass amount from perlin noise
local grass_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 9)
-- Find random positions for grass based on this random
local pr = PseudoRandom(seed+1)
for i=0,grass_amount do
local x = pr:next(x0, x1)
local z = pr:next(z0, z1)
-- Find ground level (0...15)
local ground_y = nil
for y=30,0,-1 do
if minetest.get_node({x=x,y=y,z=z}).name ~= "air" then
ground_y = y
break
end
end
if ground_y then
local p = {x=x,y=ground_y+1,z=z}
local nn = minetest.get_node(p).name
-- Check if the node can be replaced
if minetest.registered_nodes[nn] and
minetest.registered_nodes[nn].buildable_to then
nn = minetest.get_node({x=x,y=ground_y,z=z}).name
-- If sand, add dry shrub
if nn == "mcl_core:sand" then
minetest.set_node(p,{name="mcl_core:dry_shrub"})
-- If dirt with grass, add grass
elseif nn == "mcl_core:dirt_with_grass" then
minetest.set_node(p,{name="mcl_core:grass"})
if math.random(0,12000) == 1 then
-- TODO: Re-enable random_struct
--random_struct.call_struct(p,1)
end
end
end
end
end
end
end
end
-- Generate nyan cats
--generate_nyancats(seed, minp, maxp)
end)
local function replace(old, new, min, max)
minetest.register_ore({
ore_type = "scatter",
ore = new,
wherein = old,
clust_scarcity = 1,
clust_num_ores = 1,
clust_size = 1,
y_min = min,
y_max = max,
})
end
replace("air", "mcl_core:bedrock", -90, -80)
replace("air", "mcl_core:lava_source", -80, -70)
replace("mcl_core:stone", "mcl_core:bedrock", -90, -80)
replace("mcl_core:gravel", "mcl_core:bedrock", -90, -80)
replace("mcl_core:dirt", "mcl_core:bedrock", -90, -80)
replace("mcl_core:sand", "mcl_core:bedrock", -90, -80)
replace("mcl_core:cobble", "mcl_core:bedrock", -90, -80)
replace("mcl_core:mossycobble", "mcl_core:bedrock", -90, -80)
replace("stairs:stair_cobble", "mcl_core:bedrock", -90, -80)
replace("mcl_core:lava_source", "mcl_core:bedrock", -90, -80)
replace("mcl_core:lava_flowing", "mcl_core:bedrock", -90, -80)
replace("mcl_core:water_source", "mcl_core:bedrock", -90, -80)
replace("mcl_core:water_flowing", "mcl_core:bedrock", -90, -80)
local function bedrock(old)
minetest.register_ore({
ore_type = "scatter",
ore = "mcl_core:bedrock",
wherein = old,
clust_scarcity = 5,
clust_num_ores = 3,
clust_size = 2,
y_min = -64,
y_max = -60,
})
end
bedrock("air")
bedrock("mcl_core:stone")
bedrock("mcl_core:gravel")
bedrock("mcl_core:dirt")
bedrock("mcl_core:sand")
bedrock("mcl_core:cobble")
bedrock("mcl_core:mossycobble")
bedrock("stairs:stair_cobble")
bedrock("mcl_core:lava_source")
bedrock("mcl_core:lava_flowing")
bedrock("mcl_core:water_source")
bedrock("mcl_core:water_flowing")

1
mods/mcl_core/mod.conf Normal file
View file

@ -0,0 +1 @@
name = mcl_core

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

File diff suppressed because it is too large Load diff

1681
mods/mcl_core/nodes.lua Normal file

File diff suppressed because it is too large Load diff

205
mods/mcl_core/player.lua Normal file
View file

@ -0,0 +1,205 @@
-- Minetest 0.4 mod: player
-- See README.txt for licensing and other information.
--[[
API
---
mcl_core.player_register_model(name, def)
^ Register a new model to be used by players.
^ <name> is the model filename such as "character.x", "foo.b3d", etc.
^ See Model Definition below for format of <def>.
mcl_core.registered_player_models[name]
^ See Model Definition below for format.
mcl_core.player_set_model(player, model_name)
^ <player> is a PlayerRef.
^ <model_name> is a model registered with player_register_model.
mcl_core.player_set_animation(player, anim_name [, speed])
^ <player> is a PlayerRef.
^ <anim_name> is the name of the animation.
^ <speed> is in frames per second. If nil, default from the model is used
mcl_core.player_set_textures(player, textures)
^ <player> is a PlayerRef.
^ <textures> is an array of textures
^ If <textures> is nil, the default textures from the model def are used
mcl_core.player_get_animation(player)
^ <player> is a PlayerRef.
^ Returns a table containing fields "model", "textures" and "animation".
^ Any of the fields of the returned table may be nil.
Model Definition
----------------
model_def = {
animation_speed = 30, -- Default animation speed, in FPS.
textures = {"character.png", }, -- Default array of textures.
visual_size = {x=1, y=1,}, -- Used to scale the model.
animations = {
-- <anim_name> = { x=<start_frame>, y=<end_frame>, },
foo = { x= 0, y=19, },
bar = { x=20, y=39, },
-- ...
},
}
]]
-- Player animation blending
-- Note: This is currently broken due to a bug in Irrlicht, leave at 0
local animation_blend = 0
mcl_core.registered_player_models = { }
-- Local for speed.
local models = mcl_core.registered_player_models
function mcl_core.player_register_model(name, def)
models[name] = def
end
-- Default player appearance
mcl_core.player_register_model("character.x", {
animation_speed = 30,
textures = {"character.png", },
animations = {
-- Standard animations.
stand = { x= 0, y= 79, },
lay = { x=162, y=166, },
walk = { x=168, y=187, },
mine = { x=189, y=198, },
walk_mine = { x=200, y=219, },
-- Extra animations (not currently used by the game).
sit = { x= 81, y=160, },
},
})
-- Player stats and animations
local player_model = {}
local player_textures = {}
local player_anim = {}
local player_sneak = {}
mcl_core.player_attached = {}
function mcl_core.player_get_animation(player)
local name = player:get_player_name()
return {
model = player_model[name],
textures = player_textures[name],
animation = player_anim[name],
}
end
-- Called when a player's appearance needs to be updated
function mcl_core.player_set_model(player, model_name)
local name = player:get_player_name()
local model = models[model_name]
if model then
if player_model[name] == model_name then
return
end
player:set_properties({
mesh = model_name,
textures = player_textures[name] or model.textures,
visual = "mesh",
visual_size = model.visual_size or {x=1, y=1},
})
mcl_core.player_set_animation(player, "stand")
else
player:set_properties({
textures = { "player.png", "player_back.png", },
visual = "upright_sprite",
})
end
player_model[name] = model_name
end
function mcl_core.player_set_textures(player, textures)
local name = player:get_player_name()
player_textures[name] = textures
player:set_properties({textures = textures,})
end
function mcl_core.player_set_animation(player, anim_name, speed)
local name = player:get_player_name()
if player_anim[name] == anim_name then
return
end
local model = player_model[name] and models[player_model[name]]
if not (model and model.animations[anim_name]) then
return
end
local anim = model.animations[anim_name]
player_anim[name] = anim_name
player:set_animation(anim, speed or model.animation_speed, animation_blend)
end
-- Update appearance when the player joins
minetest.register_on_joinplayer(function(player)
mcl_core.player_attached[player:get_player_name()] = false
mcl_core.player_set_model(player, "character.x")
-- Minecraft has no sneak glitch
-- sneak is also disabled because it is buggy in Minetest (can be used to negate fall damage)
player:set_physics_override({sneak_glitch=false})
-- Minecraft also offers no minimap for free
player:hud_set_flags({minimap=false})
player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
player_model[name] = nil
player_anim[name] = nil
player_textures[name] = nil
end)
-- Localize for better performance.
local player_set_animation = mcl_core.player_set_animation
-- Check each player and apply animations
minetest.register_globalstep(function(dtime)
for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name()
local model_name = player_model[name]
local model = model_name and models[model_name]
if model and not mcl_core.player_attached[name] then
local controls = player:get_player_control()
local walking = false
local animation_speed_mod = model.animation_speed or 30
-- Determine if the player is walking
if controls.up or controls.down or controls.left or controls.right then
walking = true
end
-- Determine if the player is sneaking, and reduce animation speed if so
if controls.sneak then
animation_speed_mod = animation_speed_mod / 2
end
-- Apply animations based on what the player is doing
if player:get_hp() == 0 then
player_set_animation(player, "lay")
elseif walking then
if player_sneak[name] ~= controls.sneak then
player_anim[name] = nil
player_sneak[name] = controls.sneak
end
if controls.LMB then
player_set_animation(player, "walk_mine", animation_speed_mod)
else
player_set_animation(player, "walk", animation_speed_mod)
end
elseif controls.LMB then
player_set_animation(player, "mine")
else
player_set_animation(player, "stand", animation_speed_mod)
end
end
end
end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 956 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

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