Rename mod: default to mcl_core
67
mods/mcl_core/README.txt
Normal 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
206
mods/mcl_core/craftitems.lua
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -0,0 +1 @@
|
|||
name = mcl_core
|
BIN
mods/mcl_core/models/character.blend
Normal file
BIN
mods/mcl_core/models/character.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
6556
mods/mcl_core/models/character.x
Normal file
1681
mods/mcl_core/nodes.lua
Normal file
205
mods/mcl_core/player.lua
Normal 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)
|
BIN
mods/mcl_core/sounds/default_break_glass.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_break_glass.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_break_glass.3.ogg
Normal file
BIN
mods/mcl_core/sounds/default_cool_lava.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_cool_lava.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_cool_lava.3.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dig_choppy.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dig_cracky.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dig_crumbly.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dig_dig_immediate.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dig_oddly_breakable_by_hand.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dirt_footstep.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dirt_footstep.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dug_node.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_dug_node.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_glass_footstep.ogg
Normal file
BIN
mods/mcl_core/sounds/default_grass_footstep.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_grass_footstep.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_grass_footstep.3.ogg
Normal file
BIN
mods/mcl_core/sounds/default_gravel_footstep.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_gravel_footstep.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_gravel_footstep.3.ogg
Normal file
BIN
mods/mcl_core/sounds/default_gravel_footstep.4.ogg
Normal file
BIN
mods/mcl_core/sounds/default_hard_footstep.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_hard_footstep.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_hard_footstep.3.ogg
Normal file
BIN
mods/mcl_core/sounds/default_place_node.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_place_node.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_place_node.3.ogg
Normal file
BIN
mods/mcl_core/sounds/default_place_node_hard.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_place_node_hard.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_sand_footstep.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_sand_footstep.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_snow_footstep.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_snow_footstep.2.ogg
Normal file
BIN
mods/mcl_core/sounds/default_snow_footstep.3.ogg
Normal file
BIN
mods/mcl_core/sounds/default_tool_break.ogg
Normal file
BIN
mods/mcl_core/sounds/default_wood_footstep.1.ogg
Normal file
BIN
mods/mcl_core/sounds/default_wood_footstep.2.ogg
Normal file
BIN
mods/mcl_core/textures/bubble.png
Normal file
After Width: | Height: | Size: 175 B |
BIN
mods/mcl_core/textures/crack_anylength.png
Normal file
After Width: | Height: | Size: 780 B |
BIN
mods/mcl_core/textures/crafting_inventory_furnace.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
mods/mcl_core/textures/crafting_inventory_furnace_on.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
mods/mcl_core/textures/crosshair.png
Normal file
After Width: | Height: | Size: 115 B |
BIN
mods/mcl_core/textures/default_acacialeaves.png
Normal file
After Width: | Height: | Size: 867 B |
BIN
mods/mcl_core/textures/default_acaciasapling.png
Normal file
After Width: | Height: | Size: 365 B |
BIN
mods/mcl_core/textures/default_acaciatree.png
Normal file
After Width: | Height: | Size: 790 B |
BIN
mods/mcl_core/textures/default_acaciatree_top.png
Normal file
After Width: | Height: | Size: 786 B |
BIN
mods/mcl_core/textures/default_acaciawood.png
Normal file
After Width: | Height: | Size: 346 B |
BIN
mods/mcl_core/textures/default_andesite.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
mods/mcl_core/textures/default_andesite_smooth.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
mods/mcl_core/textures/default_apple.png
Normal file
After Width: | Height: | Size: 331 B |
BIN
mods/mcl_core/textures/default_apple_gold.png
Normal file
After Width: | Height: | Size: 261 B |
BIN
mods/mcl_core/textures/default_barrier.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
mods/mcl_core/textures/default_bedrock.png
Normal file
After Width: | Height: | Size: 327 B |
BIN
mods/mcl_core/textures/default_bone.png
Normal file
After Width: | Height: | Size: 256 B |
BIN
mods/mcl_core/textures/default_book.png
Normal file
After Width: | Height: | Size: 278 B |
BIN
mods/mcl_core/textures/default_bookshelf.png
Normal file
After Width: | Height: | Size: 476 B |
BIN
mods/mcl_core/textures/default_bowl.png
Normal file
After Width: | Height: | Size: 283 B |
BIN
mods/mcl_core/textures/default_brick.png
Normal file
After Width: | Height: | Size: 548 B |
BIN
mods/mcl_core/textures/default_cactus_bottom.png
Normal file
After Width: | Height: | Size: 187 B |
BIN
mods/mcl_core/textures/default_cactus_side.png
Normal file
After Width: | Height: | Size: 662 B |
BIN
mods/mcl_core/textures/default_cactus_top.png
Normal file
After Width: | Height: | Size: 527 B |
BIN
mods/mcl_core/textures/default_charcoal_lump.png
Normal file
After Width: | Height: | Size: 902 B |
BIN
mods/mcl_core/textures/default_clay.png
Normal file
After Width: | Height: | Size: 626 B |
BIN
mods/mcl_core/textures/default_clay_brick.png
Normal file
After Width: | Height: | Size: 253 B |
BIN
mods/mcl_core/textures/default_clay_lump.png
Normal file
After Width: | Height: | Size: 265 B |
BIN
mods/mcl_core/textures/default_coal_block.png
Normal file
After Width: | Height: | Size: 956 B |
BIN
mods/mcl_core/textures/default_coal_lump.png
Normal file
After Width: | Height: | Size: 347 B |
BIN
mods/mcl_core/textures/default_coarse_dirt.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
mods/mcl_core/textures/default_cobble.png
Normal file
After Width: | Height: | Size: 786 B |
BIN
mods/mcl_core/textures/default_diamond.png
Normal file
After Width: | Height: | Size: 334 B |
BIN
mods/mcl_core/textures/default_diamond_block.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
mods/mcl_core/textures/default_diorite.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
mods/mcl_core/textures/default_diorite_smooth.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
mods/mcl_core/textures/default_dirt.png
Normal file
After Width: | Height: | Size: 800 B |
BIN
mods/mcl_core/textures/default_dirt_podzol_side.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
mods/mcl_core/textures/default_dirt_podzol_top.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
mods/mcl_core/textures/default_dry_shrub.png
Normal file
After Width: | Height: | Size: 275 B |
BIN
mods/mcl_core/textures/default_emerald.png
Normal file
After Width: | Height: | Size: 435 B |
BIN
mods/mcl_core/textures/default_emerald_block.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/mcl_core/textures/default_fire_particle1.png
Normal file
After Width: | Height: | Size: 408 B |
BIN
mods/mcl_core/textures/default_fire_particle2.png
Normal file
After Width: | Height: | Size: 561 B |
BIN
mods/mcl_core/textures/default_fish.png
Normal file
After Width: | Height: | Size: 301 B |
BIN
mods/mcl_core/textures/default_fish_cooked.png
Normal file
After Width: | Height: | Size: 296 B |
BIN
mods/mcl_core/textures/default_flint.png
Normal file
After Width: | Height: | Size: 243 B |
BIN
mods/mcl_core/textures/default_frosted_ice_0.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
mods/mcl_core/textures/default_frosted_ice_1.png
Normal file
After Width: | Height: | Size: 2.9 KiB |