Compare commits

..

2 Commits

36 changed files with 179 additions and 281 deletions

View File

@ -1,21 +0,0 @@
Survive, farm, build, explore, play with friends, and do much more. Inspired by a well known block game, pushing beyond.
How to play:
#### Download Minetest
- Navigate to https://www.minetest.net/ to download the client.
- Once installed, open and select the "Content" tab
#### Install MineClone2 from ContentDB
- Click "Browse Online Content" and filter by Games (select "Games" from the dropdown box)
- Find "MineClone2" (should be first on the list or on the first page)
- Click the [+] button next to MineClone2 and wait for download to finish
- Click "Back to Main Menu"
#### Create new world and play
- Click "Start Game" tab
- At the bottom click the MineClone2 icon (the 2 dirt with grass blocks)
- Click "New", give your world a name
- You can leave seed blank or put in a word of your choice
- Select your new world
- Click "Play Game" and enjoy!

View File

@ -2,6 +2,8 @@
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
Developed by many people. Not developed or endorsed by Mojang AB.
Version: 0.82 (in development)
### Gameplay
You start in a randomly-generated world made entirely of cubes. You can explore
the world and dig and build almost every block in the world to create new

View File

@ -1,22 +1,19 @@
#File to document release steps with a view to evolving into a script
#Update CREDITS.md
#Update version in game.conf
#Update version in README.md (soon to be game.conf from of 0.82.0)
lua tools/generate_ingame_credits.lua
git add CREDITS.md
git add mods/HUD/mcl_credits/people.lua
git add game.conf
#git add RELEASE.md
git add README.md
# To uncomment when applicable
#git add game.conf
git commit -m "Pre-release update credits and set version 0.82.0"
git commit -m "Pre-release update credits and set version 0.81.1"
git tag 0.82.0
git tag 0.81.1
git push origin 0.82.0
#Update version in game.conf to -SNAPSHOT
git commit -m "Post-release set version 0.82.0-SNAPSHOT"
git push origin 0.81.1

View File

@ -1,4 +1,4 @@
title = MineClone 2
description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more.
disallowed_mapgens = v6
version=0.82.0-SNAPSHOT
version=MCL2-0.82-indev

View File

@ -204,7 +204,7 @@ end
-- Checks if the given node would drop its useful drop if dug by a given tool.
-- Returns true if it will yield its useful drop, false otherwise.
function mcl_autogroup.can_harvest(nodename, toolname)
function mcl_autogroup.can_harvest(nodename, toolname, player)
local ndef = minetest.registered_nodes[nodename]
if not ndef then
@ -228,7 +228,9 @@ function mcl_autogroup.can_harvest(nodename, toolname)
end
-- Check if it can be dug by hand
local tdef = minetest.registered_tools[""]
if not player or not player:is_player() then return false end
local name = player:get_inventory():get_stack("hand", 1):get_name()
local tdef = minetest.registered_items[name]
if tdef then
for g, gdef in pairs(tdef._mcl_diggroups) do
if ndef.groups[g] then
@ -260,7 +262,7 @@ local function get_tool_capabilities(tdef)
-- If the damage group and punch interval from hand is not included,
-- then the user will not be able to attack with the tool.
local hand_toolcaps = minetest.registered_tools[""].tool_capabilities
local hand_toolcaps = mcl_meshhand.survival_hand_tool_caps
return {
full_punch_interval = hand_toolcaps.full_punch_interval,
damage_groups = hand_toolcaps.damage_groups
@ -280,7 +282,7 @@ end
-- would have to add _mcl_autogroup as a dependency which would break the mod
-- loading order.
function mcl_autogroup.get_groupcaps(toolname, efficiency)
local tdef = minetest.registered_tools[toolname]
local tdef = minetest.registered_items[toolname]
local groupcaps = table.copy(get_tool_capabilities(tdef).groupcaps or {})
add_groupcaps(toolname, groupcaps, tdef._mcl_diggroups, efficiency)
return groupcaps
@ -350,7 +352,7 @@ local function overwrite()
end
end
for tname, tdef in pairs(minetest.registered_tools) do
for tname, tdef in pairs(minetest.registered_items) do
-- Assign groupcaps for digging the registered digging groups
-- depending on the _mcl_diggroups in the tool definition
if tdef._mcl_diggroups then

View File

@ -1,10 +1,11 @@
# mcl_autogroup
This mod emulate digging times from mc.
## mcl_autogroup.can_harvest(nodename, toolname)
Return true if <nodename> can be dig with <toolname>.
## mcl_autogroup.can_harvest(nodename, toolname, player)
Return true if <nodename> can be dig with <toolname> by <player>.
* nodename: string, valid nodename
* toolname: (optional) string, valid toolname
* player: (optinal) ObjectRef, valid player
## mcl_autogroup.get_groupcaps(toolname, efficiency)
This function is used to calculate diggroups for tools.

View File

@ -155,6 +155,7 @@ end, true)
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
if not damage_enabled then return 0 end
if player:get_hp() > 0 then
mt_reason.approved = true
if hp_change < 0 then
mcl_damage.run_damage_callbacks(player, -hp_change, mcl_damage.from_mt(mt_reason))
end
@ -162,7 +163,9 @@ minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
end, false)
minetest.register_on_dieplayer(function(player, mt_reason)
mcl_damage.run_death_callbacks(player, mcl_damage.from_mt(mt_reason))
if mt_reason.approved then
mcl_damage.run_death_callbacks(player, mcl_damage.from_mt(mt_reason))
end
minetest.log("action","Player "..player:get_player_name().." died at "..minetest.pos_to_string(vector.round(player:get_pos())))
end)

View File

@ -252,10 +252,17 @@ function minetest.handle_node_drops(pos, drops, digger)
-- NOTE: This function override allows digger to be nil.
-- This means there is no digger. This is a special case which allows this function to be called
-- by hand. Creative Mode is intentionally ignored in this case.
if (digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name())) or doTileDrops == false then
if digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name()) then
local inv = digger:get_inventory()
if inv then
for _, item in ipairs(drops) do
if not inv:contains_item("main", item, true) then
inv:add_item("main", item)
end
end
end
return
end
elseif not doTileDrops then return end
-- Check if node will yield its useful drop by the digger's tool
local dug_node = minetest.get_node(pos)
@ -263,9 +270,9 @@ function minetest.handle_node_drops(pos, drops, digger)
local tool
if digger then
tool = digger:get_wielded_item()
tooldef = minetest.registered_tools[tool:get_name()]
tooldef = minetest.registered_items[tool:get_name()]
if not mcl_autogroup.can_harvest(dug_node.name, tool:get_name()) then
if not mcl_autogroup.can_harvest(dug_node.name, tool:get_name(), digger) then
return
end
end

View File

@ -37,7 +37,6 @@ return {
"MrRar",
"talamh",
"Faerraven / Michieal",
"FossFanatic",
}},
{S("Contributors"), 0x52FF00, {
"Laurent Rocher",
@ -97,9 +96,6 @@ return {
"anarquimico",
"TheOnlyJoeEnderman",
"Ranko Saotome",
"Gregor Parzefall",
"Wbjitscool",
"b3nderman",
}},
{S("MineClone5"), 0xA60014, {
"kay27",
@ -172,7 +168,6 @@ return {
"RandomLegoBrick",
"cora",
"Faerraven / Michieal",
"Nicu",
}},
{S("Translations"), 0x00FF60, {
"Wuzzy",
@ -186,12 +181,9 @@ return {
"Emojigit",
"snowyu",
"3raven",
"SakuraRiu",
}},
{S("Funders"), 0xF7FF00, {
"40W",
"bauknecht",
"Cora",
}},
{S("Special thanks"), 0x00E9FF, {
"celeron55 for creating Minetest",
@ -199,6 +191,5 @@ return {
"wsor for working tirelessly in the shadows for the good of all of us, particularly helping with solving contentDB and copyright issues.",
"The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game",
"Notch and Jeb for being the major forces behind Minecraft",
"Dark Reaven Music (https://soundcloud.com/dark-reaven-music) for the main menu theme (Calmed Cube), which is licensed under https://creativecommons.org/licenses/by-sa/3.0/",
}},
}

View File

@ -156,6 +156,7 @@ local function set_inv_page(page, player)
creative_list = inventory_lists[page]
end
inv:set_size("main", #creative_list)
players[playername].inv_size = #creative_list
inv:set_list("main", creative_list)
end
@ -304,37 +305,21 @@ minetest.register_on_joinplayer(function (player)
end
end)
function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter)
--reset_menu_item_bg()
pagenum = math.floor(pagenum) or 1
function mcl_inventory.set_creative_formspec(player)
local playername = player:get_player_name()
if not players[playername] then return end
if not inv_size then
if page == "nix" then
local inv = minetest.get_inventory({type="detached", name="creative_"..playername})
inv_size = inv:get_size("main")
elseif page and page ~= "inv" then
inv_size = #(inventory_lists[page])
else
inv_size = 0
end
end
local start_i = players[playername].start_i
local pagenum = start_i / (9*5) + 1
local name = players[playername].page
local inv_size = players[playername].inv_size
local filter = players[playername].filter
local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1))
local name = "nix"
local main_list
local listrings = "listring[detached:creative_"..playername..";main]"..
"listring[current_player;main]"..
"listring[detached:trash;main]"
if page then
name = page
if players[playername] then
players[playername].page = page
end
end
--bg[name] = "crafting_creative_bg.png"
local inv_bg = "crafting_inventory_creative.png"
if name == "inv" then
inv_bg = "crafting_inventory_creative_survival.png"
@ -493,9 +478,6 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
listrings
if name == "nix" then
if filter == nil then
filter = ""
end
formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]"
formspec = formspec .. "field_close_on_enter[search;false]"
end
@ -582,16 +564,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if page then
players[name].page = page
end
if players[name].page then
else
page = players[name].page
end
-- Figure out current scroll bar from formspec
--local formspec = player:get_inventory_formspec()
local start_i = players[name].start_i
if fields.creative_prev then
start_i = start_i - 9*5
elseif fields.creative_next then
@ -613,6 +590,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
else
inv_size = 0
end
players[name].inv_size = inv_size
if start_i >= inv_size then
start_i = start_i - 9*5
@ -622,72 +600,19 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
players[name].start_i = start_i
local filter = ""
if not fields.nix and fields.search and fields.search ~= "" then
filter = fields.search
players[name].filter = filter
if not fields.nix and fields.search then
players[name].filter = fields.search
else
players[name].filter = ""
end
mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter)
mcl_inventory.set_creative_formspec(player)
end)
if minetest.is_creative_enabled("") then
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
-- Place infinite nodes, except for shulker boxes
local group = minetest.get_item_group(itemstack:get_name(), "shulker_box")
return group == 0 or group == nil
end)
function minetest.handle_node_drops(pos, drops, digger)
if not digger or not digger:is_player() then
for _,item in ipairs(drops) do
minetest.add_item(pos, item)
end
end
local inv = digger:get_inventory()
if inv then
for _,item in ipairs(drops) do
if not inv:contains_item("main", item, true) then
inv:add_item("main", item)
end
end
end
end
mcl_inventory.update_inventory_formspec = function(player)
local page
local name = player:get_player_name()
if players[name].page then
page = players[name].page
else
page = "nix"
end
-- Figure out current scroll bar from formspec
--local formspec = player:get_inventory_formspec()
local start_i = players[name].start_i
local inv_size
if page == "nix" then
local inv = minetest.get_inventory({type="detached", name="creative_"..name})
inv_size = inv:get_size("main")
elseif page and page ~= "inv" then
inv_size = #(inventory_lists[page])
else
inv_size = 0
end
local filter = players[name].filter
if filter == nil then
filter = ""
end
mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter)
end
end
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
return placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name())
end)
minetest.register_on_joinplayer(function(player)
-- Initialize variables and inventory
@ -700,7 +625,7 @@ minetest.register_on_joinplayer(function(player)
end
init(player)
-- Setup initial creative inventory to the "nix" page.
mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "")
mcl_inventory.set_creative_formspec(player)
end)
minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info)

View File

@ -46,14 +46,9 @@ function return_fields(player, name)
end
end
local function set_inventory(player, armor_change_only)
local function set_inventory(player)
if minetest.is_creative_enabled(player:get_player_name()) then
if armor_change_only then
-- Stay on survival inventory plage if only the armor has been changed
mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv")
else
mcl_inventory.set_creative_formspec(player, 0, 1)
end
mcl_inventory.set_creative_formspec(player)
return
end
local inv = player:get_inventory()
@ -143,11 +138,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
end)
if not minetest.is_creative_enabled("") then
function mcl_inventory.update_inventory_formspec(player)
set_inventory(player)
end
end
mcl_inventory.update_inventory_formspec = set_inventory
-- Drop crafting grid items on leaving
minetest.register_on_leaveplayer(function(player)
@ -199,24 +190,6 @@ function minetest.is_creative_enabled(name)
return false
end
--Insta "digging" nodes in gamemode-creative
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
if not puncher or not puncher:is_player() then return end
local name = puncher:get_player_name()
if not minetest.is_creative_enabled(name) then return end
if pointed_thing.type ~= "node" then return end
local def = minetest.registered_nodes[node.name]
if def then
minetest.node_dig(pos,node,puncher)
return true
end
end)
--Don't subtract from inv when placing in gamemode-creative
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end
end)
local function in_table(n,h)
for k,v in pairs(h) do
if v == n then return true end
@ -238,6 +211,7 @@ function mcl_inventory.player_set_gamemode(p,g)
elseif g == "creative" then
mcl_experience.remove_hud(p)
end
mcl_meshhand.update_player(p)
set_inventory(p)
end

View File

@ -3,13 +3,16 @@ mcl_bamboo
This mod adds working, familiar bamboo nodes to your Mineclone 2 world.
Code: MineClone2 dev team. Original (basic) bamboo code by: Small Joker.
Code: Michieal. Original (basic) bamboo code by: Small Joker.
License for code: GPLv3.
License for images / textures: CC-BY-SA except where noted.
Images Created by Nicu, except for:
Images Created by Michieal, except for:
* Inventory / wield image for Bamboo Stalk: created by RandomLegoBrick#8692 and is CC0.
* The Bamboo door image, which is a variant of this image: https://www.flickr.com/photos/basheertome/5179849901/ which
is CC-BY 2.0,
Basheer Tome (2015).
Dependencies: mcl_core, mcl_sounds, mcl_tools

View File

@ -301,7 +301,7 @@ minetest.register_node("mcl_bamboo:bamboo_block", bamboo_block_def)
local bamboo_stripped_block = table.copy(bamboo_block_def)
bamboo_stripped_block.on_rightclick = nil
bamboo_stripped_block.description = S("Stripped Bamboo Block")
bamboo_stripped_block.tiles = {"mcl_bamboo_bamboo_bottom_stripped.png", "mcl_bamboo_bamboo_bottom_stripped.png",
bamboo_stripped_block.tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png",
"mcl_bamboo_bamboo_block_stripped.png"}
minetest.register_node("mcl_bamboo:bamboo_block_stripped", bamboo_stripped_block)
minetest.register_node("mcl_bamboo:bamboo_plank", {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 B

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 B

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 612 B

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 622 B

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 577 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 567 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 485 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 B

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 B

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 B

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 662 B

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 588 B

After

Width:  |  Height:  |  Size: 463 B

View File

@ -19,50 +19,6 @@ dig_speed_class group:
- 7: Instantaneous
]]
-- The hand
local groupcaps, hand_range, hand_groups
if minetest.is_creative_enabled("") then
-- Instant breaking in creative mode
groupcaps = { creative_breakable = { times = {0}, uses = 0 } }
hand_range = tonumber(minetest.settings:get("mcl_hand_range_creative")) or 10
hand_groups = { dig_speed_class = 7 }
else
groupcaps = {}
hand_range = tonumber(minetest.settings:get("mcl_hand_range")) or 4.5
hand_groups = { dig_speed_class = 1 }
end
minetest.register_tool(":", {
type = "none",
_doc_items_longdesc = S("You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.").."\n"..
S("When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.").."\n"..
S("In Creative Mode, the hand is able to break all blocks instantly."),
wield_image = "blank.png",
wield_scale = {x=1.0,y=1.0,z=2.0},
-- According to Minecraft Wiki, the exact range is 3.975.
-- Minetest seems to only support whole numbers, so we use 4.
range = hand_range,
tool_capabilities = {
full_punch_interval = 0.25,
max_drop_level = 0,
groupcaps = groupcaps,
damage_groups = {fleshy=1},
},
groups = hand_groups,
_mcl_diggroups = {
handy = { speed = 1, level = 1, uses = 0 },
axey = { speed = 1, level = 1, uses = 0 },
shovely = { speed = 1, level = 1, uses = 0 },
hoey = { speed = 1, level = 1, uses = 0 },
pickaxey = { speed = 1, level = 0, uses = 0 },
swordy = { speed = 1, level = 0, uses = 0 },
swordy_cobweb = { speed = 1, level = 0, uses = 0 },
shearsy = { speed = 1, level = 0, uses = 0 },
shearsy_wool = { speed = 1, level = 0, uses = 0 },
shearsy_cobweb = { speed = 1, level = 0, uses = 0 },
}
})
-- Help texts
local pickaxe_longdesc = S("Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.")
local axe_longdesc = S("An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.")

View File

@ -3545,7 +3545,7 @@ local function register_decorations()
place_on = {"group:grass_block_no_snow", "mcl_core:dirt"},
sidelen = 80,
fill_ratio = 0.004,
biomes = {"Jungle", "JungleM"},
biomes = {"Jungle", "JungleM","BambooJungle", "BambooJungleM"},
y_min = 1,
y_max = mcl_vars.mg_overworld_max,
schematic = mod_mcl_core .. "/schematics/mcl_core_oak_classic.mts",
@ -4459,7 +4459,7 @@ local function register_decorations()
end
register_double_fern(0.01, 0.03, {"Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "ColdTaiga", "MegaTaiga", "MegaSpruceTaiga", "BambooJungle", "BambooJungleM", "BambooJungleEdge", "BambooJungleEdgeM", })
register_double_fern(0.15, 0.1, {"JungleM", "BambooJungleM", "BambooJungle"})
register_double_fern(0.15, 0.1, {"JungleM", "BambooJungleM"})
-- Large flowers
local function register_large_flower(name, biomes, seed, offset, flower_forest_offset)
@ -4545,7 +4545,7 @@ local function register_decorations()
octaves = 4,
persist = 0.6,
},
biomes = {"Jungle", },
biomes = {"Jungle", "BambooJungle"},
y_min = 3,
y_max = mcl_vars.mg_overworld_max,
schematic = mod_mcl_core .. "/schematics/mcl_core_jungle_bush_oak_leaves_2.mts",
@ -4581,7 +4581,7 @@ local function register_decorations()
octaves = 4,
persist = 0.6,
},
biomes = {"JungleEdge", "JungleEdgeM", "BambooJungleEdgeM"},
biomes = {"JungleEdge", "JungleEdgeM","BambooJungleEdge", "BambooJungleEdgeM"},
y_min = 3,
y_max = mcl_vars.mg_overworld_max,
schematic = mod_mcl_core .. "/schematics/mcl_core_jungle_bush_oak_leaves.mts",
@ -4614,10 +4614,26 @@ local function register_decorations()
y_max = mcl_vars.mg_overworld_max,
decoration = "mcl_bamboo:bamboo",
height = 9,
max_height = 10,
max_height = 12,
flags = "place_center_x, place_center_z",
rotation = "random",
})
--[[
-- commenting out this section because with the new grow code, bamboo creates its own height, and therefore places it's own top.
minetest.register_decoration({
deco_type = "simple",
place_on = {"mcl_bamboo:bamboo"},
sidelen = 80,
fill_ratio = 1,
biomes = {"BambooJungle", "BambooJungleM", "BambooJungleEdge", "BambooJungleEdgeM", "Jungle", "JungleM", "JungleEdge", "JungleEdgeM"},
y_min = 1,
y_max = mcl_vars.mg_overworld_max,
decoration = "mcl_bamboo:bamboo_endcap",
height = 1,
max_height = 4,
flags = "all_floors",
})
]]
minetest.register_decoration({
deco_type = "simple",

View File

@ -1,4 +1,5 @@
local mcl_skins_enabled = minetest.global_exists("mcl_skins")
mcl_meshhand = { }
---This is a fake node that should never be placed in the world
---@type node_definition
@ -15,43 +16,77 @@ local node_def = {
end,
drop = "",
on_drop = function(_, _, _) return ItemStack() end,
groups = { dig_immediate = 3, not_in_creative_inventory = 1 },
range = minetest.registered_items[""].range
groups = {
dig_immediate = 3,
not_in_creative_inventory = 1,
dig_speed_class = 1,
},
tool_capabilities = {
full_punch_interval = 0.25,
max_drop_level = 0,
groupcaps = { },
damage_groups = { fleshy = 1 },
},
_mcl_diggroups = {
handy = { speed = 1, level = 1, uses = 0 },
axey = { speed = 1, level = 1, uses = 0 },
shovely = { speed = 1, level = 1, uses = 0 },
hoey = { speed = 1, level = 1, uses = 0 },
pickaxey = { speed = 1, level = 0, uses = 0 },
swordy = { speed = 1, level = 0, uses = 0 },
swordy_cobweb = { speed = 1, level = 0, uses = 0 },
shearsy = { speed = 1, level = 0, uses = 0 },
shearsy_wool = { speed = 1, level = 0, uses = 0 },
shearsy_cobweb = { speed = 1, level = 0, uses = 0 },
},
range = tonumber(minetest.settings:get("mcl_hand_range")) or 4.5
}
-- This is for _mcl_autogroup to know about the survival hand tool capabilites
mcl_meshhand.survival_hand_tool_caps = node_def.tool_capabilities
local creative_dig_speed = tonumber(minetest.settings:get("mcl_creative_dig_speed")) or 0.2
local creative_hand_range = tonumber(minetest.settings:get("mcl_hand_range_creative")) or 10
if mcl_skins_enabled then
-- Generate a node for every skin
local list = mcl_skins.get_skin_list()
for _, skin in pairs(list) do
if skin.slim_arms then
local female = table.copy(node_def)
female._mcl_hand_id = skin.id
female.mesh = "mcl_meshhand_female.b3d"
female.tiles = { skin.texture }
minetest.register_node("mcl_meshhand:" .. skin.id, female)
else
local male = table.copy(node_def)
male._mcl_hand_id = skin.id
male.mesh = "mcl_meshhand.b3d"
male.tiles = { skin.texture }
minetest.register_node("mcl_meshhand:" .. skin.id, male)
local node_def = table.copy(node_def)
node_def._mcl_hand_id = skin.id
node_def.tiles = { skin.texture }
node_def.mesh = skin.slim_arms and "mcl_meshhand_female.b3d" or "mcl_meshhand.b3d"
if skin.creative then
node_def.range = creative_hand_range
node_def.groups.dig_speed_class = 7
node_def.tool_capabilities.groupcaps.creative_breakable = { times = { creative_dig_speed }, uses = 0 }
end
minetest.register_node("mcl_meshhand:" .. skin.id, node_def)
end
else
node_def._mcl_hand_id = "hand"
node_def.mesh = "mcl_meshhand.b3d"
node_def.tiles = { "character.png" }
minetest.register_node("mcl_meshhand:hand", node_def)
minetest.register_node("mcl_meshhand:hand_surv", node_def)
node_def = table.copy(node_def)
node_def.range = creative_hand_range
node_def.groups.dig_speed_class = 7
node_def.tool_capabilities.groupcaps.creative_breakable = { times = { creative_dig_speed }, uses = 0 }
minetest.register_node("mcl_meshhand:hand_crea", node_def)
end
function mcl_meshhand.update_player(player)
if mcl_skins_enabled then
local node_id = mcl_skins.get_node_id_by_player(player)
player:get_inventory():set_stack("hand", 1, "mcl_meshhand:" .. node_id)
else
local creative = minetest.is_creative_enabled(player:get_player_name())
player:get_inventory():set_stack("hand", 1, "mcl_meshhand:hand" .. (creative and "_crea" or "_surv"))
end
end
if mcl_skins_enabled then
-- Change the player's hand to their skin
mcl_player.register_on_visual_change(function(player)
local node_id = mcl_skins.get_node_id_by_player(player)
player:get_inventory():set_stack("hand", 1, "mcl_meshhand:" .. node_id)
end)
mcl_player.register_on_visual_change(mcl_meshhand.update_player)
else
minetest.register_on_joinplayer(function(player)
player:get_inventory():set_stack("hand", 1, ItemStack("mcl_meshhand:hand"))
end)
minetest.register_on_joinplayer(mcl_meshhand.update_player)
end

View File

@ -11,43 +11,47 @@ end
function mcl_skins.get_skin_list()
local list = {}
for _, base in pairs(mcl_skins.base) do
for _, base_color in pairs(mcl_skins.base_color) do
local id = base:gsub(".png$", "") .. minetest.colorspec_to_colorstring(base_color):gsub("#", "")
local female = {
texture = make_texture(base, base_color),
slim_arms = true,
id = id .. "_female"
}
table.insert(list, female)
local male = {
texture = make_texture(base, base_color),
slim_arms = false,
id = id .. "_male"
}
table.insert(list, male)
for _, game_mode in pairs({"_crea", "_surv"}) do
for _, base in pairs(mcl_skins.base) do
for _, base_color in pairs(mcl_skins.base_color) do
local id = base:gsub(".png$", "") .. minetest.colorspec_to_colorstring(base_color):gsub("#", "")
local female = {
texture = make_texture(base, base_color),
slim_arms = true,
id = id .. "_female" .. game_mode,
creative = game_mode == "_crea"
}
table.insert(list, female)
local male = {
texture = make_texture(base, base_color),
slim_arms = false,
id = id .. "_male" .. game_mode,
creative = game_mode == "_crea"
}
table.insert(list, male)
end
end
for _, skin in pairs(mcl_skins.simple_skins) do
table.insert(list, {
texture = skin.texture,
slim_arms = skin.slim_arms,
id = skin.texture:gsub(".png$", "") .. (skin.slim_arms and "_female" or "_male") .. game_mode,
})
end
end
for _, skin in pairs(mcl_skins.simple_skins) do
table.insert(list, {
texture = skin.texture,
slim_arms = skin.slim_arms,
id = skin.texture:gsub(".png$", "") .. "_" .. (skin.slim_arms and "female" or "male"),
})
end
return list
end
function mcl_skins.get_node_id_by_player(player)
local skin = mcl_skins.players[player]
local creative = minetest.is_creative_enabled(player:get_player_name())
local append = (skin.slim_arms and "_female" or "_male") .. (creative and "_crea" or "_surv")
if skin.simple_skins_id then
local skin = mcl_skins.simple_skins[skin.simple_skins_id]
return skin.texture:gsub(".png$", "") ..
"_" .. (skin.slim_arms and "female" or "male")
return skin.texture:gsub(".png$", "") .. append
else
return skin.base:gsub(".png$", "") ..
minetest.colorspec_to_colorstring(skin.base_color):gsub("#", "") ..
"_" .. (skin.slim_arms and "female" or "male")
minetest.colorspec_to_colorstring(skin.base_color):gsub("#", "") .. append
end
end

View File

@ -76,10 +76,13 @@ mcl_enable_skin_customization (Enable player skin customization) bool true
# Default:4.5
mcl_hand_range (Hand range) float 4.5 1 128
# How far the player hand can reach in creative mode (not gamemode-creative)
# How far the player hand can reach in creative mode
# Default:10
mcl_hand_range_creative (Creative mode hand range) float 10 1 128
# Creative mode dig speed in seconds
mcl_creative_dig_speed (Creative mode dig speed) float 0.2
# If enabled the hunger mechanic will be active
mcl_enable_hunger (Hunger mechanic) bool true