Compare commits
63 Commits
3d7155c1b9
...
a764818e13
Author | SHA1 | Date |
---|---|---|
Mikita Wiśniewski | a764818e13 | |
Aliaksei Urbanski | 32ef89aca3 | |
the-real-herowl | accb8742dd | |
codiac | 71282e196e | |
codiac | 89c97690c8 | |
codiac | 06f9486e4d | |
codiac | ae5564e658 | |
the-real-herowl | fdf823fff6 | |
Araca | 52b65554d9 | |
the-real-herowl | 5a069af072 | |
the-real-herowl | 14f73a8c55 | |
the-real-herowl | dbab70ea38 | |
chmodsayshello | 952a96b57d | |
Dehydrate6684 | e5a260b563 | |
Dehydrate6684 | 9b2b8ee56e | |
seventeenthShulker | 00cfca5947 | |
seventeenthShulker | c37da143da | |
seventeenthShulker | 520fd773fb | |
seventeenthShulker | 378df76e5f | |
seventeenthShulker | 3e12b3c700 | |
seventeenthShulker | 0637182697 | |
seventeenthShulker | 0580b14310 | |
seventeenthShulker | 98cf3b7f7a | |
seventeenthShulker | e5829f719d | |
seventeenthShulker | 089e3d46f1 | |
seventeenthShulker | 5d8688dbeb | |
seventeenthShulker | 058684f17f | |
seventeenthShulker | 918b8eee38 | |
seventeenthShulker | af206ed8b3 | |
seventeenthShulker | f2eca64e42 | |
the-real-herowl | 262100be24 | |
Eliy21 | 69dc013799 | |
Michieal | a425d359f5 | |
Freedom | 83d6e2a5d2 | |
FossFanatic | ce403b9245 | |
Eliy21 | da911bd4d4 | |
the-real-herowl | 8789411ab7 | |
the-real-herowl | 5b1deedaf0 | |
SmokeyDope | fa1d8dfc47 | |
SmokeyDope | d2a4a6d042 | |
SmokeyDope | 5e194b33bd | |
Araca | 35bb569ee1 | |
chmodsayshello | 5be506830f | |
codiac | 4fcd1ae541 | |
the-real-herowl | f941817c39 | |
seventeenthShulker | bc3bde4cf8 | |
seventeenthShulker | 8099a4bd17 | |
seventeenthShulker | e2ed1ab4a6 | |
seventeenthShulker | e43a8e267d | |
seventeenthShulker | 570caf47eb | |
the-real-herowl | 59f3b53a51 | |
chmodsayshello | ec7e99019e | |
Dehydrate6684 | b320d008ca | |
Dehydrate6684 | 23468cc2dd | |
Dehydrate6684 | 0c48a46f7c | |
codiac | 95db118361 | |
codiac | d2d7887e0f | |
codiac | 7577d37b38 | |
codiac | bf4c7e1913 | |
codiac | 11e3674926 | |
Dehydrate6684 | cc217d0089 | |
Dehydrate6684 | e6653b78ee | |
Dehydrate6684 | a960bf2e8e |
14
README.md
|
@ -27,7 +27,7 @@ Or you can play in “creative mode” in which you can build almost anything in
|
|||
## How to play (quick start)
|
||||
### Getting started
|
||||
* **Punch a tree** trunk until it breaks and collect wood
|
||||
* Place the **wood into the 2×2 grid** (your “crafting grid” in your inventory menu and craft 4 wood planks
|
||||
* Place the **wood into the 2×2 grid** (your “crafting grid” in your inventory menu) and craft 4 wood planks
|
||||
* Place the 4 wood planks in a 2×2 shape in the crafting grid to **make a crafting table**
|
||||
* **Rightclick the crafting table** for a 3×3 crafting grid to craft more complex things
|
||||
* Use the **crafting guide** (book icon) to learn all the possible crafting recipes
|
||||
|
@ -37,15 +37,15 @@ Or you can play in “creative mode” in which you can build almost anything in
|
|||
|
||||
### Farming
|
||||
* Find seeds
|
||||
* Craft hoe
|
||||
* Rightclick dirt or similar block with hoe to create farmland
|
||||
* Craft a hoe
|
||||
* Rightclick dirt or a similar block with a hoe to create farmland
|
||||
* Place seeds on farmland and watch them grow
|
||||
* Collect plant when fully grown
|
||||
* Collect plants when fully grown
|
||||
* If near water, farmland becomes wet and speeds up growth
|
||||
|
||||
### Furnace
|
||||
* Craft furnace
|
||||
* Furnace allows you to obtain more items
|
||||
* Craft a furnace
|
||||
* The furnace allows you to obtain more items
|
||||
* Upper slot must contain a smeltable item (example: iron ore)
|
||||
* Lower slot must contain a fuel item (example: coal)
|
||||
* See tooltips in crafting guide to learn about fuels and smeltable items
|
||||
|
@ -162,7 +162,7 @@ Bonus features (not found in Minecraft):
|
|||
* Built-in crafting guide which shows you crafting and smelting recipes
|
||||
* In-game help system containing extensive help about gameplay basics, blocks, items and more
|
||||
* Temporary crafting recipes. They only exist to make some otherwise unaccessible items available when you're not in creative mode. These recipes will be removed as development goes on an more features become available
|
||||
* Saplings in chests in mapgen v6
|
||||
* Saplings in chests in [mapgen v6](https://wiki.minetest.net/Map_generator#v6)
|
||||
* Fully moddable (thanks to Minetest's powerful Lua API)
|
||||
* New blocks and items:
|
||||
* Lookup tool, shows you the help for whatever it touches
|
||||
|
|
|
@ -137,7 +137,7 @@ Fonctionnalités bonus (absentes de Minecraft) :
|
|||
* Guide d'artisanat intégré au jeu qui montre les recettes d'artisanat et de cuisson
|
||||
* Système d'aide intégré au jeu contenant des informations à propos des techniques de base, blocs, objets et plus
|
||||
* Recettes d'artisanat temporaires. Elles existent uniquement pour rendre des objets accessibles qui ne le seraient pas autrement sauf en mode créatif. Elles seront retirées au cours de l'avancement du développement et de l'ajout de nouvelles fonctionnalités.
|
||||
* Pousses dans les coffres en mapgen v6
|
||||
* Pousses dans les coffres en [mapgen v6](https://wiki.minetest.net/Map_generator#v6)
|
||||
* Entièrement moddable (grâce la puissante API Lua de Minetest)
|
||||
* Nouveaux blocs et objets :
|
||||
* Outil de recherche, montre l'aide de ce qu'il touche
|
||||
|
|
|
@ -154,12 +154,12 @@ Mineclone2, то ветка master обычно относительно ста
|
|||
* Некоторые вагонетки (с сундуком и с воронкой уже работают)
|
||||
* Пара нетривиальных блоков и предметов
|
||||
|
||||
Бонусные воронкой (нет в Minecraft-е):
|
||||
Бонусные возможности (нет в Minecraft-е):
|
||||
|
||||
* Встроенный гайд для крафта покажет вам рецепты крафта и переплавки
|
||||
* Внутриигровая справка содержит всестороннюю информацию об основах игры, блоках, предметах и прочее
|
||||
* Временные рецепты крафта. Они существуют, чтобы получить доступ к ранее недоступным предметам вне творческого режима. Они будут удалены как только разработка позволит им стать доступными
|
||||
* Саженцы в сундуках мапгена v6
|
||||
* Саженцы в сундуках в [mapgen v6](https://wiki.minetest.net/Map_generator#v6)
|
||||
* Полностью модифицируема (благодаря мощному Lua API в Minetest)
|
||||
* Новые блоки и предметы:
|
||||
* Инструмент просмотра покажет справку о том чего коснется
|
||||
|
@ -177,7 +177,7 @@ Mineclone2, то ветка master обычно относительно ста
|
|||
* Недостающие блоки, предметы, мобы
|
||||
* Некоторые предметы с другими названиями, чтобы лучше их различать
|
||||
* Другая музыка для проигрывателей
|
||||
* Другие текступы (Pixel Perfection)
|
||||
* Другие текстуры (Pixel Perfection)
|
||||
* Другие звуки (разные источники)
|
||||
* Другой движок (Minetest)
|
||||
* Другие пасхалки
|
||||
|
|
|
@ -62,8 +62,13 @@ end
|
|||
local function set_double_attach(boat)
|
||||
boat._driver:set_attach(boat.object, "",
|
||||
{x = 0, y = 0.42, z = 0.8}, {x = 0, y = 0, z = 0})
|
||||
boat._passenger:set_attach(boat.object, "",
|
||||
{x = 0, y = 0.42, z = -2.2}, {x = 0, y = 0, z = 0})
|
||||
if boat._passenger:is_player() then
|
||||
boat._passenger:set_attach(boat.object, "",
|
||||
{x = 0, y = 0.42, z = -6.2}, {x = 0, y = 0, z = 0})
|
||||
else
|
||||
boat._passenger:set_attach(boat.object, "",
|
||||
{x = 0, y = 0.42, z = -4.5}, {x = 0, y = 270, z = 0})
|
||||
end
|
||||
end
|
||||
local function set_choat_attach(boat)
|
||||
boat._driver:set_attach(boat.object, "",
|
||||
|
@ -155,7 +160,7 @@ local boat = {
|
|||
minetest.register_on_respawnplayer(detach_object)
|
||||
|
||||
function boat.on_rightclick(self, clicker)
|
||||
if self._passenger or not clicker or clicker:get_attach() then
|
||||
if self._passenger or not clicker or clicker:get_attach() or (self.name == "mcl_boats:chest_boat" and self._driver) then
|
||||
return
|
||||
end
|
||||
attach_object(self, clicker)
|
||||
|
|
|
@ -1,36 +1,36 @@
|
|||
# mcl_dripping
|
||||
|
||||
Dripping Mod by kddekadenz, modified for MineClone 2 by Wuzzy, NO11 and AFCM
|
||||
|
||||
## Manual
|
||||
|
||||
- drops are generated rarely under solid nodes
|
||||
- they will stay some time at the generated block and than they fall down
|
||||
- when they collide with the ground, a sound is played and they are destroyed
|
||||
|
||||
Water and Lava have builtin drops registered.
|
||||
|
||||
## License
|
||||
|
||||
code & sounds: CC0
|
||||
|
||||
## API
|
||||
|
||||
```lua
|
||||
mcl_dripping.register_drop({
|
||||
-- The group the liquid's nodes belong to
|
||||
liquid = "water",
|
||||
-- The texture used (particles will take a random 2x2 area of it)
|
||||
texture = "default_water_source_animated.png",
|
||||
-- Define particle glow, ranges from `0` to `minetest.LIGHT_MAX`
|
||||
light = 1,
|
||||
-- The nodes (or node group) the particles will spawn under
|
||||
nodes = { "group:opaque", "group:leaves" },
|
||||
-- The sound that will be played then the particle detaches from the roof, see SimpleSoundSpec in lua_api.txt
|
||||
sound = "drippingwater_drip",
|
||||
-- The interval for the ABM to run
|
||||
interval = 60,
|
||||
-- The chance of the ABM
|
||||
chance = 10,
|
||||
})
|
||||
```
|
||||
# mcl_dripping
|
||||
|
||||
Dripping Mod by kddekadenz, modified for MineClone 2 by Wuzzy, NO11 and AFCM
|
||||
|
||||
## Manual
|
||||
|
||||
- drops are generated rarely under solid nodes
|
||||
- they will stay some time at the generated block and than they fall down
|
||||
- when they collide with the ground, a sound is played and they are destroyed
|
||||
|
||||
Water and Lava have builtin drops registered.
|
||||
|
||||
## License
|
||||
|
||||
code & sounds: CC0
|
||||
|
||||
## API
|
||||
|
||||
```lua
|
||||
mcl_dripping.register_drop({
|
||||
-- The group the liquid's nodes belong to
|
||||
liquid = "water",
|
||||
-- The texture used (particles will take a random 2x2 area of it)
|
||||
texture = "mcl_core_water_source_animation.png",
|
||||
-- Define particle glow, ranges from `0` to `minetest.LIGHT_MAX`
|
||||
light = 1,
|
||||
-- The nodes (or node group) the particles will spawn under
|
||||
nodes = { "group:opaque", "group:leaves" },
|
||||
-- The sound that will be played then the particle detaches from the roof, see SimpleSoundSpec in lua_api.txt
|
||||
sound = "drippingwater_drip",
|
||||
-- The interval for the ABM to run
|
||||
interval = 60,
|
||||
-- The chance of the ABM
|
||||
chance = 10,
|
||||
})
|
||||
```
|
||||
|
|
|
@ -82,7 +82,7 @@ end
|
|||
|
||||
mcl_dripping.register_drop({
|
||||
liquid = "water",
|
||||
texture = "default_water_source_animated.png",
|
||||
texture = "mcl_core_water_source_animation.png",
|
||||
light = 1,
|
||||
nodes = { "group:opaque", "group:leaves" },
|
||||
sound = "drippingwater_drip",
|
||||
|
@ -92,7 +92,7 @@ mcl_dripping.register_drop({
|
|||
|
||||
mcl_dripping.register_drop({
|
||||
liquid = "lava",
|
||||
texture = "default_lava_source_animated.png",
|
||||
texture = "mcl_core_lava_source_animation.png",
|
||||
light = math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3),
|
||||
nodes = { "group:opaque" },
|
||||
sound = "drippingwater_lavadrip",
|
||||
|
|
|
@ -410,7 +410,7 @@ function mob_class:check_head_swivel(dtime)
|
|||
--final_rotation = vector.new(0,0,0)
|
||||
end
|
||||
|
||||
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
|
||||
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horizontal_head_height), final_rotation)
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ function mcl_mobs.register_mob(name, def)
|
|||
head_eye_height = def.head_eye_height or def.bone_eye_height or 0, -- how hight aproximatly the mobs head is fromm the ground to tell the mob how high to look up at the player
|
||||
curiosity = def.curiosity or 1, -- how often mob will look at player on idle
|
||||
head_yaw = def.head_yaw or "y", -- axis to rotate head on
|
||||
horrizonatal_head_height = def.horrizonatal_head_height or 0,
|
||||
horizontal_head_height = def.horizontal_head_height or 0,
|
||||
wears_armor = def.wears_armor, -- a number value used to index texture slot for armor
|
||||
stepheight = def.stepheight or 0.6,
|
||||
name = name,
|
||||
|
@ -287,6 +287,7 @@ function mcl_mobs.register_mob(name, def)
|
|||
spawn_in_group_min = def.spawn_in_group_min,
|
||||
noyaw = def.noyaw or false,
|
||||
particlespawners = def.particlespawners,
|
||||
spawn_check = def.spawn_check,
|
||||
-- End of MCL2 extensions
|
||||
on_spawn = def.on_spawn,
|
||||
on_blast = def.on_blast or function(self,damage)
|
||||
|
|
|
@ -2,6 +2,13 @@
|
|||
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
|
||||
local mob_class = mcl_mobs.mob_class
|
||||
|
||||
local modern_lighting = minetest.settings:get_bool("mcl_mobs_modern_lighting", true)
|
||||
local nether_threshold = tonumber(minetest.settings:get("mcl_mobs_nether_threshold")) or 11
|
||||
local end_threshold = tonumber(minetest.settings:get("mcl_mobs_end_threshold")) or 0
|
||||
local overworld_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_threshold")) or 0
|
||||
local overworld_sky_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_sky_threshold")) or 7
|
||||
local overworld_passive_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_passive_threshold")) or 7
|
||||
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
|
@ -709,9 +716,6 @@ local function spawn_check(pos, spawn_def)
|
|||
and spawn_def.dimension == dimension
|
||||
and biome_check(spawn_def.biomes, gotten_biome) then
|
||||
|
||||
--mcl_log("Level 1 spawn check passed")
|
||||
--minetest.log("Mob: " .. mob_def.name)
|
||||
|
||||
if (is_ground or spawn_def.type_of_spawning ~= "ground")
|
||||
and (spawn_def.type_of_spawning ~= "ground" or not is_leaf)
|
||||
and (not is_farm_animal(spawn_def.name) or is_grass)
|
||||
|
@ -721,20 +725,42 @@ local function spawn_check(pos, spawn_def)
|
|||
and (spawn_def.check_position and spawn_def.check_position(pos) or spawn_def.check_position == nil)
|
||||
and ( not spawn_protected or not minetest.is_protected(pos, "") ) then
|
||||
|
||||
--mcl_log("Level 2 spawn check passed")
|
||||
|
||||
local gotten_light = get_node_light(pos)
|
||||
if gotten_light >= spawn_def.min_light and gotten_light <= spawn_def.max_light then
|
||||
--mcl_log("Level 3 spawn check passed")
|
||||
return true
|
||||
|
||||
if modern_lighting then
|
||||
local my_node = get_node(pos)
|
||||
local sky_light = minetest.get_natural_light(pos)
|
||||
local art_light = minetest.get_artificial_light(my_node.param1)
|
||||
|
||||
if dimension == "nether" then
|
||||
if art_light <= nether_threshold then
|
||||
return true
|
||||
end
|
||||
elseif dimension == "end" then
|
||||
if art_light <= end_threshold then
|
||||
return true
|
||||
end
|
||||
elseif dimension == "overworld" then
|
||||
if mob_type == "monster" then
|
||||
if mob_def.spawn_check then
|
||||
return mob_def.spawn_check(pos, gotten_light, art_light, sky_light)
|
||||
elseif art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then
|
||||
return true
|
||||
end
|
||||
else
|
||||
if mob_def.spawn_check then
|
||||
return mob_def.spawn_check(pos, gotten_light, art_light, sky_light)
|
||||
elseif gotten_light > overworld_passive_threshold then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
--mcl_log("Spawn check level 3 failed")
|
||||
if gotten_light >= spawn_def.min_light and gotten_light <= spawn_def.max_light then
|
||||
return true
|
||||
end
|
||||
end
|
||||
else
|
||||
--mcl_log("Spawn check level 2 failed")
|
||||
end
|
||||
else
|
||||
--mcl_log("Spawn check level 1 failed")
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
|
|
@ -13,7 +13,7 @@ local axolotl = {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = -1,
|
||||
head_eye_height = -0.5,
|
||||
horrizonatal_head_height = 0,
|
||||
horizontal_head_height = 0,
|
||||
curiosity = 10,
|
||||
head_yaw="z",
|
||||
|
||||
|
|
|
@ -2,6 +2,18 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
local function spawn_check(pos, environmental_light, artificial_light, sky_light)
|
||||
local date = os.date("*t")
|
||||
local maxlight
|
||||
if (date.month == 10 and date.day >= 20) or (date.month == 11 and date.day <= 3) then
|
||||
maxlight = 6
|
||||
else
|
||||
maxlight = 3
|
||||
end
|
||||
|
||||
return artificial_light <= maxlight
|
||||
end
|
||||
|
||||
mcl_mobs.register_mob("mobs_mc:bat", {
|
||||
description = S("Bat"),
|
||||
type = "animal",
|
||||
|
@ -50,6 +62,7 @@ mcl_mobs.register_mob("mobs_mc:bat", {
|
|||
jump = false,
|
||||
fly = true,
|
||||
makes_footstep_sound = false,
|
||||
spawn_check = spawn_check,
|
||||
})
|
||||
|
||||
|
||||
|
|
|
@ -11,6 +11,9 @@ local mod_target = minetest.get_modpath("mcl_target")
|
|||
--################### BLAZE
|
||||
--###################
|
||||
|
||||
local function spawn_check(pos, environmental_light, artificial_light, sky_light)
|
||||
return artificial_light <= 11
|
||||
end
|
||||
|
||||
mcl_mobs.register_mob("mobs_mc:blaze", {
|
||||
description = S("Blaze"),
|
||||
|
@ -137,6 +140,7 @@ mcl_mobs.register_mob("mobs_mc:blaze", {
|
|||
},
|
||||
})
|
||||
end,
|
||||
spawn_check = spawn_check,
|
||||
})
|
||||
|
||||
mcl_mobs:spawn_specific(
|
||||
|
|
|
@ -23,7 +23,7 @@ mcl_mobs.register_mob("mobs_mc:chicken", {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 4,
|
||||
head_eye_height = 1.5,
|
||||
horrizonatal_head_height = -.3,
|
||||
horizontal_head_height = -.3,
|
||||
curiosity = 10,
|
||||
head_yaw="z",
|
||||
visual_size = {x=1,y=1},
|
||||
|
|
|
@ -24,7 +24,7 @@ local cow_def = {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 10,
|
||||
head_eye_height = 1.1,
|
||||
horrizonatal_head_height=-1.8,
|
||||
horizontal_head_height=-1.8,
|
||||
curiosity = 2,
|
||||
head_yaw="z",
|
||||
makes_footstep_sound = true,
|
||||
|
|
|
@ -4,12 +4,14 @@
|
|||
--License for code WTFPL and otherwise stated in readmes
|
||||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
local allow_nav_hacks = minetest.settings:get_bool("mcl_mob_allow_nav_hacks ",false)
|
||||
|
||||
--###################
|
||||
--################### IRON GOLEM
|
||||
--###################
|
||||
|
||||
local etime = 0
|
||||
local walk_dist = 40
|
||||
local tele_dist = 80
|
||||
|
||||
mcl_mobs.register_mob("mobs_mc:iron_golem", {
|
||||
description = S("Iron Golem"),
|
||||
|
@ -85,11 +87,23 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", {
|
|||
punch_start = 40, punch_end = 50,
|
||||
},
|
||||
jump = true,
|
||||
on_step = function(self,dtime)
|
||||
etime = etime + dtime
|
||||
if etime > 10 then
|
||||
if self._home and vector.distance(self._home,self.object:get_pos()) > 50 then
|
||||
self:gopath(self._home)
|
||||
do_custom = function(self, dtime)
|
||||
self.home_timer = (self.home_timer or 0) + dtime
|
||||
|
||||
if self.home_timer > 10 then
|
||||
self.home_timer = 0
|
||||
if self._home and self.state ~= "attack" then
|
||||
local dist = vector.distance(self._home,self.object:get_pos())
|
||||
if allow_nav_hacks and dist >= tele_dist then
|
||||
self.object:set_pos(self._home)
|
||||
self.state = "stand"
|
||||
self.order = "follow"
|
||||
elseif dist >= walk_dist then
|
||||
self:gopath(self._home, function(self)
|
||||
self.state = "stand"
|
||||
self.order = "follow"
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
|
|
@ -62,7 +62,7 @@ mcl_mobs.register_mob("mobs_mc:llama", {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 11,
|
||||
head_eye_height = 3,
|
||||
horrizonatal_head_height=0,
|
||||
horizontal_head_height=0,
|
||||
curiosity = 60,
|
||||
head_yaw = "z",
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ local ocelot = {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 6.2,
|
||||
head_eye_height = 0.4,
|
||||
horrizonatal_head_height=-0,
|
||||
horizontal_head_height=-0,
|
||||
head_yaw="z",
|
||||
curiosity = 4,
|
||||
collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3},
|
||||
|
|
|
@ -137,7 +137,7 @@ mcl_mobs.register_mob("mobs_mc:parrot", {
|
|||
xp_max = 3,
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 1.1,
|
||||
horrizonatal_head_height=0,
|
||||
horizontal_head_height=0,
|
||||
curiosity = 10,
|
||||
collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25},
|
||||
visual = "mesh",
|
||||
|
|
|
@ -22,7 +22,7 @@ mcl_mobs.register_mob("mobs_mc:pig", {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 7.5,
|
||||
head_eye_height = 0.8,
|
||||
horrizonatal_head_height=-1,
|
||||
horizontal_head_height=-1,
|
||||
curiosity = 3,
|
||||
head_yaw="z",
|
||||
makes_footstep_sound = true,
|
||||
|
|
|
@ -219,6 +219,10 @@ mcl_mobs.register_mob("mobs_mc:sword_piglin", sword_piglin)
|
|||
-- Zombified Piglin --
|
||||
|
||||
|
||||
local function spawn_check(pos, environmental_light, artificial_light, sky_light)
|
||||
return artificial_light <= 11
|
||||
end
|
||||
|
||||
local zombified_piglin = {
|
||||
description = S("Zombie Piglin"),
|
||||
-- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked
|
||||
|
@ -256,6 +260,7 @@ local zombified_piglin = {
|
|||
},
|
||||
jump = true,
|
||||
makes_footstep_sound = true,
|
||||
spawn_check = spawn_check,
|
||||
walk_velocity = .8,
|
||||
run_velocity = 2.6,
|
||||
pathfinding = 1,
|
||||
|
|
|
@ -27,7 +27,7 @@ mcl_mobs.register_mob("mobs_mc:polar_bear", {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 2.6,
|
||||
head_eye_height = 1,
|
||||
horrizonatal_head_height = 0,
|
||||
horizontal_head_height = 0,
|
||||
curiosity = 20,
|
||||
head_yaw="z",
|
||||
visual_size = {x=3.0, y=3.0},
|
||||
|
|
|
@ -18,7 +18,7 @@ local rabbit = {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 2,
|
||||
head_eye_height = 0.5,
|
||||
horrizonatal_head_height = -.3,
|
||||
horizontal_head_height = -.3,
|
||||
curiosity = 20,
|
||||
head_yaw="z",
|
||||
visual = "mesh",
|
||||
|
|
|
@ -67,7 +67,7 @@ mcl_mobs.register_mob("mobs_mc:sheep", {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 3.3,
|
||||
head_eye_height = 1.1,
|
||||
horrizonatal_head_height=-.7,
|
||||
horizontal_head_height=-.7,
|
||||
curiosity = 6,
|
||||
head_yaw="z",
|
||||
visual = "mesh",
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
local function spawn_check(pos, environmental_light, artificial_light, sky_light)
|
||||
return artificial_light <= 11
|
||||
end
|
||||
|
||||
mcl_mobs.register_mob("mobs_mc:silverfish", {
|
||||
description = S("Silverfish"),
|
||||
type = "monster",
|
||||
|
@ -53,6 +57,7 @@ mcl_mobs.register_mob("mobs_mc:silverfish", {
|
|||
view_range = 16,
|
||||
attack_type = "dogfight",
|
||||
damage = 1,
|
||||
spawn_check = spawn_check,
|
||||
})
|
||||
|
||||
mcl_mobs.register_egg("mobs_mc:silverfish", S("Silverfish"), "#6d6d6d", "#313131", 0)
|
||||
|
|
|
@ -161,6 +161,18 @@ local spawn_children_on_die = function(child_mob, spawn_distance, eject_speed)
|
|||
end
|
||||
end
|
||||
|
||||
local swamp_light_max = 7
|
||||
|
||||
local function slime_spawn_check(pos, environmental_light, artificial_light, sky_light)
|
||||
local maxlight = swamp_light_max
|
||||
|
||||
if is_slime_chunk(pos) then
|
||||
maxlight = minetest.LIGHT_MAX + 1
|
||||
end
|
||||
|
||||
return artificial_light <= maxlight
|
||||
end
|
||||
|
||||
-- Slime
|
||||
local slime_big = {
|
||||
description = S("Slime"),
|
||||
|
@ -213,6 +225,7 @@ local slime_big = {
|
|||
spawn_small_alternative = "mobs_mc:slime_small",
|
||||
on_die = spawn_children_on_die("mobs_mc:slime_small", 1.0, 1.5),
|
||||
use_texture_alpha = true,
|
||||
spawn_check = slime_spawn_check,
|
||||
}
|
||||
mcl_mobs.register_mob("mobs_mc:slime_big", slime_big)
|
||||
|
||||
|
@ -297,7 +310,6 @@ local cave_min = mcl_vars.mg_overworld_min
|
|||
local cave_max = water_level - 23
|
||||
|
||||
local swampy_biomes = {"Swampland", "MangroveSwamp"}
|
||||
local swamp_light_max = 7
|
||||
local swamp_min = water_level
|
||||
local swamp_max = water_level + 27
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ local wolf = {
|
|||
head_swivel = "head.control",
|
||||
bone_eye_height = 3.5,
|
||||
head_eye_height = 1.1,
|
||||
horrizonatal_head_height=0,
|
||||
horizontal_head_height=0,
|
||||
curiosity = 3,
|
||||
head_yaw="z",
|
||||
sounds = {
|
||||
|
|
|
@ -774,7 +774,7 @@ local function search(data)
|
|||
for i = 1, #data.items_raw do
|
||||
local item = data.items_raw[i]
|
||||
local def = reg_items[item]
|
||||
local desc = lower(def.description)
|
||||
local desc = string.lower(M.get_translated_string(data.lang_code, def.description))
|
||||
local search_in = item .. desc
|
||||
local to_add
|
||||
|
||||
|
@ -838,6 +838,7 @@ local function init_data(name)
|
|||
iX = sfinv_only and 8 or DEFAULT_SIZE,
|
||||
items = init_items,
|
||||
items_raw = init_items,
|
||||
lang_code = M.get_player_information(name).lang_code or 'en',
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
@ -431,6 +431,27 @@ awards.register_achievement("mcl:wax_off", {
|
|||
group = "Husbandry",
|
||||
})
|
||||
|
||||
-- Triggered in mcl_smithing_table
|
||||
awards.register_achievement("mcl:trim", {
|
||||
title = S("Crafting a New Look"),
|
||||
description = S("Craft a trimmed armor at a Smithing Table"),
|
||||
icon = "dune_armor_trim_smithing_template.png",
|
||||
type = "Advancement",
|
||||
group = "Adventure",
|
||||
})
|
||||
|
||||
awards.register_achievement("mcl:lots_of_trimming", {
|
||||
title = S("Smithing with Style"),
|
||||
description = S("Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder"),
|
||||
icon = "silence_armor_trim_smithing_template.png",
|
||||
type = "Advancement",
|
||||
group = "Adventure",
|
||||
on_unlock = function(name, awdef)
|
||||
-- delete json that is no longer needed
|
||||
minetest.get_player_by_name(name):get_meta():set_string("mcl_smithing_table:achievement_trims", "")
|
||||
end,
|
||||
})
|
||||
|
||||
-- NON-PC ACHIEVEMENTS (XBox, Pocket Edition, etc.)
|
||||
|
||||
if non_pc_achievements then
|
||||
|
|
|
@ -51,3 +51,7 @@ Bring Home the Beacon=Den Nachbarn heimleuchten
|
|||
Use a beacon.=Benutzen Sie ein Leuchtfeuer.
|
||||
Beaconator=Leuchtturmwärter
|
||||
Use a fully powered beacon.=Benutzen Sie ein vollständiges Leuchtfeuer.
|
||||
Crafting a New Look=Ein neues Aussehen
|
||||
Craft a trimmed armor at a Smithing Table=Versieh ein Rüstungsteil an einem Schmiedetisch mit einem Rüstungsbesatz
|
||||
Smithing with Style=Schmieden mit Stil
|
||||
Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=Wende jede dieser Schmiedevorlagen mindestens einmal an: Turmspitze, Schnauze, Rippe, Warthof, Stille, Plagegeist, Gezeiten und Wegfinder
|
|
@ -111,3 +111,7 @@ Voluntary Exile=
|
|||
Kill a raid captain. Maybe consider staying away from the local villages for the time being...=
|
||||
Tactical Fishing=
|
||||
Catch a fish... without a fishing rod!=
|
||||
Crafting a New Look=
|
||||
Craft a trimmed armor at a Smithing Table=
|
||||
Smithing with Style=
|
||||
Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=
|
|
@ -741,12 +741,14 @@ if minetest.is_creative_enabled("") 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)
|
||||
else
|
||||
-- If there is a player
|
||||
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
|
||||
|
|
|
@ -246,6 +246,15 @@ function mesecon.mergetable(source, dest)
|
|||
return rval
|
||||
end
|
||||
|
||||
--
|
||||
function mesecon.join_table(t1, t2)
|
||||
local rval = mesecon.tablecopy(t2)
|
||||
for i, v in ipairs(t1) do
|
||||
table.insert(rval, mesecon.tablecopy(v))
|
||||
end
|
||||
return rval
|
||||
end
|
||||
|
||||
function mesecon.register_node(name, spec_common, spec_off, spec_on)
|
||||
spec_common.drop = spec_common.drop or name .. "_off"
|
||||
spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode
|
||||
|
|
|
@ -211,6 +211,11 @@ function mesecon.register_button(basename, description, texture, recipeitem, sou
|
|||
output = "mesecons_button:button_"..basename.."_off",
|
||||
recipe = {{ recipeitem }},
|
||||
})
|
||||
|
||||
if minetest.get_modpath("mesecons_mvps") then
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_"..basename.."_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_"..basename.."_on")
|
||||
end
|
||||
end
|
||||
|
||||
mesecon.register_button(
|
||||
|
|
|
@ -117,7 +117,7 @@ local function is_available(pos)
|
|||
return false, n
|
||||
end
|
||||
if minetest.registered_nodes[name] then
|
||||
return minetest.registered_nodes[name].buildable_to, n or false, n
|
||||
return minetest.registered_nodes[name].buildable_to or minetest.get_item_group(name, "dig_by_piston") == 1, n or false, n
|
||||
end
|
||||
return false, n
|
||||
end
|
||||
|
@ -126,6 +126,7 @@ end
|
|||
function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos)
|
||||
-- determine the number of nodes to be pushed
|
||||
local nodes = {}
|
||||
local dig_nodes = {}
|
||||
local frontiers = {pos}
|
||||
|
||||
while #frontiers > 0 do
|
||||
|
@ -140,47 +141,50 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos)
|
|||
return
|
||||
end
|
||||
|
||||
if not node_replaceable(nn.name) then
|
||||
if #nodes >= maximum then return nil, false end
|
||||
table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}})
|
||||
|
||||
-- add connected nodes to frontiers, connected is a vector list
|
||||
-- the vectors must be absolute positions
|
||||
local connected = {}
|
||||
local has_loop
|
||||
if minetest.registered_nodes[nn.name]
|
||||
and minetest.registered_nodes[nn.name].mvps_sticky then
|
||||
connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos)
|
||||
if has_loop then
|
||||
return {}, true
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(connected, vector.add(np, dir))
|
||||
|
||||
-- Make sure there are no duplicates in frontiers / nodes before
|
||||
-- adding nodes in "connected" to frontiers
|
||||
for _, cp in ipairs(connected) do
|
||||
local duplicate = false
|
||||
for _, rp in ipairs(nodes) do
|
||||
if vector.equals(cp, rp.pos) then
|
||||
duplicate = true
|
||||
if minetest.get_item_group(nn.name, "dig_by_piston") == 1 then
|
||||
-- if we want the node to drop, e.g. sugar cane, do not count towards push limit
|
||||
table.insert(dig_nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}})
|
||||
else
|
||||
if not node_replaceable(nn.name) then
|
||||
table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}})
|
||||
if #nodes > maximum then return nil, nil, false, true end
|
||||
|
||||
-- add connected nodes to frontiers, connected is a vector list
|
||||
-- the vectors must be absolute positions
|
||||
local connected = {}
|
||||
local has_loop
|
||||
if minetest.registered_nodes[nn.name] and minetest.registered_nodes[nn.name].mvps_sticky then
|
||||
connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos)
|
||||
if has_loop then
|
||||
return {}, {}, true, false
|
||||
end
|
||||
end
|
||||
for _, fp in ipairs(frontiers) do
|
||||
if vector.equals(cp, fp) then
|
||||
duplicate = true
|
||||
table.insert(connected, vector.add(np, dir))
|
||||
|
||||
-- Make sure there are no duplicates in frontiers / nodes before
|
||||
-- adding nodes in "connected" to frontiers
|
||||
for _, cp in ipairs(connected) do
|
||||
local duplicate = false
|
||||
for _, rp in ipairs(nodes) do
|
||||
if vector.equals(cp, rp.pos) then
|
||||
duplicate = true
|
||||
end
|
||||
end
|
||||
for _, fp in ipairs(frontiers) do
|
||||
if vector.equals(cp, fp) then
|
||||
duplicate = true
|
||||
end
|
||||
end
|
||||
if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) and minetest.get_item_group(nn.name, "dig_by_piston") == 0 then
|
||||
table.insert(frontiers, cp)
|
||||
end
|
||||
end
|
||||
if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) then
|
||||
table.insert(frontiers, cp)
|
||||
end
|
||||
end
|
||||
end
|
||||
table.remove(frontiers, 1)
|
||||
end
|
||||
|
||||
return nodes, false
|
||||
return nodes, dig_nodes, false, false
|
||||
end
|
||||
|
||||
function mesecon.mvps_set_owner(pos, placer)
|
||||
|
@ -203,6 +207,11 @@ local function are_protected(nodes, player_name)
|
|||
end
|
||||
|
||||
function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos)
|
||||
-- check if the node in front of the piston is protected against player_name (to prevent replacing air)
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return false
|
||||
end
|
||||
|
||||
return mesecon.mvps_push_or_pull(pos, dir, dir, maximum, player_name, piston_pos)
|
||||
end
|
||||
|
||||
|
@ -222,9 +231,9 @@ end
|
|||
-- movedir: direction of actual movement
|
||||
-- maximum: maximum nodes to be pushed
|
||||
function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, piston_pos)
|
||||
local nodes, has_loop = mesecon.mvps_get_stack(pos, movedir, maximum, piston_pos)
|
||||
local nodes, dig_nodes, has_loop, too_many = mesecon.mvps_get_stack(pos, movedir, maximum, piston_pos)
|
||||
|
||||
if has_loop then
|
||||
if has_loop or too_many then
|
||||
return false
|
||||
end
|
||||
|
||||
|
@ -237,6 +246,9 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
|||
if (newpos[i].x == piston_pos.x) and (newpos[i].y == piston_pos.y) and (newpos[i].z == piston_pos.z) then
|
||||
return
|
||||
end
|
||||
if minetest.is_protected(newpos[i], player_name) then
|
||||
return
|
||||
end
|
||||
if not is_available(newpos[i]) then
|
||||
local available = false
|
||||
for j in ipairs(nodes) do
|
||||
|
@ -253,18 +265,35 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
|||
end
|
||||
end
|
||||
|
||||
if are_protected(nodes, player_name) then
|
||||
local all_nodes = nodes
|
||||
if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.join_table(dig_nodes, nodes) end
|
||||
if are_protected(all_nodes, player_name) then
|
||||
return
|
||||
end
|
||||
|
||||
local first_dropper = nil
|
||||
-- remove all nodes
|
||||
for id, n in ipairs(nodes) do
|
||||
for id, n in ipairs(all_nodes) do
|
||||
n.meta = minetest.get_meta(n.pos):to_table()
|
||||
local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, nodes, id)
|
||||
local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, all_nodes, id)
|
||||
if is_dropper then
|
||||
--local drops = minetest.get_node_drops(n.node.name, "")
|
||||
minetest.dig_node(n.pos)
|
||||
-- if current node has already been destroyed (e.g. chain reaction of sugar cane breaking), skip it
|
||||
if minetest.get_node(n.pos).name == n.node.name then
|
||||
-- simulate dig_node using handle_node_drops
|
||||
local drops = minetest.get_node_drops(n.node.name, "")
|
||||
local counted_drops = {}
|
||||
minetest.remove_node(n.pos)
|
||||
for _, callback in pairs(minetest.registered_on_dignodes) do
|
||||
callback(n.pos, n)
|
||||
end
|
||||
for _, item in ipairs(drops) do
|
||||
if type(item) ~= "string" then
|
||||
item = item:get_name() .. item:get_count()
|
||||
end
|
||||
table.insert(counted_drops, item)
|
||||
end
|
||||
minetest.handle_node_drops(n.pos, counted_drops)
|
||||
end
|
||||
else
|
||||
minetest.remove_node(n.pos)
|
||||
local node_timer = minetest.get_node_timer(n.pos)
|
||||
|
@ -273,13 +302,13 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
|||
end
|
||||
end
|
||||
if is_dropper then
|
||||
first_dropper = id
|
||||
break
|
||||
-- get id of the first dropper, but we still let everything else drop, so don't break here
|
||||
if not first_dropper then first_dropper = id end
|
||||
end
|
||||
end
|
||||
|
||||
-- update mesecons for removed nodes ( has to be done after all nodes have been removed )
|
||||
for id, n in ipairs(nodes) do
|
||||
for id, n in ipairs(all_nodes) do
|
||||
if first_dropper and id >= first_dropper then
|
||||
break
|
||||
end
|
||||
|
@ -287,7 +316,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
|||
end
|
||||
|
||||
-- add nodes
|
||||
for id, n in ipairs(nodes) do
|
||||
for id, n in ipairs(all_nodes) do
|
||||
if first_dropper and id >= first_dropper then
|
||||
break
|
||||
end
|
||||
|
@ -394,6 +423,7 @@ mesecon.register_mvps_stopper("mcl_core:realm_barrier")
|
|||
mesecon.register_mvps_stopper("mcl_core:void")
|
||||
mesecon.register_mvps_stopper("mcl_core:bedrock")
|
||||
mesecon.register_mvps_stopper("mcl_core:obsidian")
|
||||
mesecon.register_mvps_stopper("mcl_core:crying_obsidian")
|
||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest")
|
||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest_small")
|
||||
mesecon.register_mvps_stopper("mcl_mobspawners:spawner")
|
||||
|
@ -411,10 +441,9 @@ mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on")
|
|||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off")
|
||||
mesecon.register_mvps_stopper("mcl_banners:hanging_banner")
|
||||
mesecon.register_mvps_stopper("mcl_banners:standing_banner")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:campfire")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:campfire_lit")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:soul_campfire")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:soul_campfire_lit")
|
||||
mesecon.register_mvps_stopper("mcl_beehives:bee_nest")
|
||||
mesecon.register_mvps_stopper("mcl_beehives:beehive")
|
||||
mesecon.register_mvps_stopper("mcl_compass:lodestone")
|
||||
|
||||
-- Unmovable by technical restrictions.
|
||||
-- Open formspec would screw up if node is destroyed (minor problem)
|
||||
|
@ -445,13 +474,14 @@ mesecon.register_mvps_stopper("mcl_chests:trapped_chest")
|
|||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_small")
|
||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left")
|
||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right")
|
||||
mesecon.register_mvps_stopper("mcl_signs:wall_sign")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign45")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5")
|
||||
mesecon.register_mvps_stopper("mcl_barrels:barrel_open")
|
||||
mesecon.register_mvps_stopper("mcl_barrels:barrel_closed")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:campfire")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:campfire_lit")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:soul_campfire")
|
||||
mesecon.register_mvps_stopper("mcl_campfires:soul_campfire_lit")
|
||||
mesecon.register_mvps_stopper("mcl_lectern:lectern")
|
||||
mesecon.register_mvps_stopper("mcl_grindstone:grindstone")
|
||||
|
||||
|
||||
-- Unmovable by design: objects
|
||||
|
@ -495,8 +525,6 @@ mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_2")
|
|||
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_3")
|
||||
|
||||
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_door")
|
||||
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_trapdoor")
|
||||
mesecon.register_mvps_unsticky("mcl_signs:wall_sign_bamboo")
|
||||
mesecon.register_mvps_unsticky("mcl_bamboo:scaffolding")
|
||||
|
||||
-- Beds
|
||||
|
@ -532,21 +560,6 @@ mesecon.register_mvps_unsticky("mcl_beds:bed_white_top")
|
|||
mesecon.register_mvps_unsticky("mcl_beds:bed_white_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_bottom")
|
||||
-- Buttons
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_stone_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_stone_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_wood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_wood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_on")
|
||||
-- Cactus, Sugarcane & Vines
|
||||
mesecon.register_mvps_unsticky("mcl_core:cactus")
|
||||
mesecon.register_mvps_unsticky("mcl_core:reeds")
|
||||
|
@ -559,23 +572,6 @@ mesecon.register_mvps_unsticky("mcl_cake:cake_4")
|
|||
mesecon.register_mvps_unsticky("mcl_cake:cake_5")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake_6")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake")
|
||||
-- Carpet
|
||||
mesecon.register_mvps_unsticky("mcl_wool:black_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:blue_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:brown_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:cyan_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:green_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:grey_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:light_blue_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:lime_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:orange_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:magenta_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:pink_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:purple_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:red_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:silver_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:white_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:yellow_carpet")
|
||||
-- Carved & Jack O'Lantern Pumpkins, Pumpkin & Melon
|
||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face_light")
|
||||
|
@ -907,16 +903,16 @@ mesecon.register_mvps_unsticky("mcl_chests:black_shulker_box_small")
|
|||
mesecon.register_mvps_unsticky("mcl_chests:blue_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:brown_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:cyan_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:dark_green_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:dark_grey_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:lightblue_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:green_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:light_blue_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:lime_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:orange_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:magenta_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:pink_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:purple_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:violet_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:red_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:silver_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:white_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:yellow_shulker_box_small")
|
||||
-- Snow
|
||||
|
|
|
@ -152,8 +152,6 @@ function mesecon.noteblock_play(pos, param2)
|
|||
soundname="mesecons_noteblock_xylophone_metal"
|
||||
elseif block_below_name == "mcl_nether:soul_sand" then
|
||||
soundname="mesecons_noteblock_cowbell"
|
||||
elseif block_below_name == "mcl_farming:pumpkin" or block_below_name == "mcl_farming:pumpkin_face" or block_below_name == "mcl_farming:pumpkin_face_light" then
|
||||
soundname="mesecons_noteblock_didgeridoo"
|
||||
elseif block_below_name == "mcl_core:emeraldblock" then
|
||||
soundname="mesecons_noteblock_squarewave"
|
||||
elseif block_below_name == "mcl_farming:hay_block" then
|
||||
|
@ -162,6 +160,8 @@ function mesecon.noteblock_play(pos, param2)
|
|||
soundname="mesecons_noteblock_piano_digital"
|
||||
elseif minetest.get_item_group(block_below_name, "wool") ~= 0 then
|
||||
soundname="mesecons_noteblock_guitar"
|
||||
elseif minetest.get_item_group(block_below_name, "pumpkin") ~= 0 then
|
||||
soundname="mesecons_noteblock_didgeridoo"
|
||||
elseif minetest.get_item_group(block_below_name, "material_glass") ~= 0 then
|
||||
soundname="mesecons_noteblock_hit"
|
||||
elseif minetest.get_item_group(block_below_name, "material_wood") ~= 0 then
|
||||
|
|
|
@ -138,14 +138,12 @@ local function piston_off(pos, node)
|
|||
end
|
||||
|
||||
local function piston_orientate(pos, placer)
|
||||
mesecon.mvps_set_owner(pos, placer)
|
||||
|
||||
-- not placed by player
|
||||
if not placer then return end
|
||||
|
||||
|
||||
-- placer pitch in degrees
|
||||
local pitch = placer:get_look_vertical() * (180 / math.pi)
|
||||
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
local pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||
if pitch > 55 then
|
||||
|
@ -153,6 +151,9 @@ local function piston_orientate(pos, placer)
|
|||
elseif pitch < -55 then
|
||||
minetest.add_node(pos, {name=pistonspec.piston_down})
|
||||
end
|
||||
|
||||
-- set owner meta after setting node, or it will not keep
|
||||
mesecon.mvps_set_owner(pos, placer)
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -326,11 +326,17 @@ end
|
|||
tt.register_snippet(function(itemstring, toolcaps, stack)
|
||||
if not stack then return nil end
|
||||
local meta = stack:get_meta()
|
||||
if meta:get_string("mcl_armor:trim_overlay") == "" then return nil end -- remember, get_string returns "" if the key doesn't exist
|
||||
if not mcl_armor.is_trimmed(stack) then return nil end
|
||||
-- we need to get the part of the overlay image between the overlay begin ( and the trim name end _
|
||||
-- we COULD easily store this info in meta, but that would bloat the meta storage, as the same few values would be stored over and over again on every trimmed item
|
||||
-- this is fine here as this code gets only executed when you put armor and a trim in a smithing table
|
||||
local full_overlay = meta:get_string("mcl_armor:trim_overlay")
|
||||
local trim_name = full_overlay:match("%((.-)%_")
|
||||
return "Upgrade:\n " .. trim_name:gsub("^%l", string.upper) .. " Armor Trim"
|
||||
end)
|
||||
end)
|
||||
|
||||
function mcl_armor.is_trimmed(itemstack)
|
||||
-- this meta value will be there for every trimmed armor piece
|
||||
-- remember, get_string returns "" if the key doesn't exist
|
||||
return itemstack:get_meta():get_string("mcl_armor:trim_overlay") ~= ""
|
||||
end
|
|
@ -60,7 +60,7 @@ mcl_armor = {
|
|||
trims = {
|
||||
core_textures = {},
|
||||
blacklisted = {["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true},
|
||||
overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"},
|
||||
overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire","silence","wayfinder"},
|
||||
colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"},
|
||||
},
|
||||
}
|
||||
|
|
|
@ -43,4 +43,22 @@ minetest.register_craft({
|
|||
{"mcl_core:diamond","mcl_core:goldblock","mcl_core:diamond"},
|
||||
{"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = mod_registername .. "silence",
|
||||
recipe = {
|
||||
{"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"},
|
||||
{"mcl_core:diamond", mod_registername.."ward","mcl_core:diamond"},
|
||||
{"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = mod_registername .. "wayfinder",
|
||||
recipe = {
|
||||
{"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"},
|
||||
{"mcl_core:diamond", "mcl_maps:empty_map","mcl_core:diamond"},
|
||||
{"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"},
|
||||
}
|
||||
})
|
|
@ -251,7 +251,7 @@ local bamboo_def = {
|
|||
minetest.register_node(BAMBOO, bamboo_def)
|
||||
|
||||
local bamboo_top = table.copy(bamboo_def)
|
||||
bamboo_top.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3}
|
||||
bamboo_top.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3}
|
||||
bamboo_top.tiles = {"mcl_bamboo_endcap.png"}
|
||||
bamboo_top.drawtype = "plantlike_rooted" --"plantlike"
|
||||
--bamboo_top.paramtype2 = "meshoptions"
|
||||
|
@ -361,7 +361,7 @@ bamboo_one_def.selection_box = {
|
|||
{-0.05, -0.5, 0.285, -0.275, 0.5, 0.06},
|
||||
}
|
||||
}
|
||||
bamboo_one_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3}
|
||||
bamboo_one_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3}
|
||||
mcl_bamboo.mcl_log(dump(mcl_bamboo.bamboo_index))
|
||||
minetest.register_node(mcl_bamboo.bamboo_index[2], bamboo_one_def)
|
||||
local bamboo_two_def = table.copy(bamboo_def)
|
||||
|
@ -385,7 +385,7 @@ bamboo_two_def.selection_box = {
|
|||
{0.25, -0.5, 0.325, 0.025, 0.5, 0.100},
|
||||
}
|
||||
}
|
||||
bamboo_two_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3}
|
||||
bamboo_two_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3}
|
||||
minetest.register_node(mcl_bamboo.bamboo_index[3], bamboo_two_def)
|
||||
local bamboo_three_def = table.copy(bamboo_def)
|
||||
|
||||
|
@ -408,5 +408,5 @@ bamboo_three_def.selection_box = {
|
|||
{-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125},
|
||||
}
|
||||
}
|
||||
bamboo_three_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3}
|
||||
bamboo_three_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3}
|
||||
minetest.register_node(mcl_bamboo.bamboo_index[4], bamboo_three_def)
|
||||
|
|
|
@ -192,10 +192,23 @@ if minetest.get_modpath("mcl_fences") then
|
|||
local wood_groups = { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }
|
||||
local wood_connect = { "group:fence_wood" }
|
||||
|
||||
local fence_id = mcl_fences.register_fence(id, S("Bamboo Fence"), "mcl_bamboo_fence_bamboo.png", wood_groups,
|
||||
2, 15, wood_connect, node_sound)
|
||||
local gate_id = mcl_fences.register_fence_gate(id, S("Bamboo Fence Gate"), "mcl_bamboo_fence_gate_bamboo.png",
|
||||
wood_groups, 2, 15, node_sound) -- note: about missing params.. will use defaults.
|
||||
local fence_id = mcl_fences.register_fence(
|
||||
id,
|
||||
S("Bamboo Fence"),
|
||||
"mcl_bamboo_fence_bamboo.png",
|
||||
wood_groups,
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_hardness,
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance,
|
||||
wood_connect, node_sound)
|
||||
|
||||
local gate_id = mcl_fences.register_fence_gate(
|
||||
id,
|
||||
S("Bamboo Fence Gate"),
|
||||
"mcl_bamboo_fence_gate_bamboo.png",
|
||||
wood_groups,
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_hardness,
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance,
|
||||
node_sound) -- note: about missing params.. will use defaults.
|
||||
|
||||
mcl_bamboo.mcl_log(dump(fence_id))
|
||||
mcl_bamboo.mcl_log(dump(gate_id))
|
||||
|
|
|
@ -67,7 +67,7 @@ end
|
|||
|
||||
local BAMBOO_ENDCAP_NAME = "mcl_bamboo:bamboo_endcap"
|
||||
|
||||
-- For when I learn more about the pistons...
|
||||
-- check if supporting block is broken. pistons now break the bamboo plant.
|
||||
function mcl_bamboo.break_orphaned(pos)
|
||||
mcl_bamboo.mcl_log("Break_Orphaned called.")
|
||||
local node_below = minetest.get_node(vector.offset(pos, 0, -1, 0))
|
||||
|
|
|
@ -33,7 +33,7 @@ minetest.register_node("mcl_bells:bell", {
|
|||
"mcl_bells_bell_side.png",
|
||||
},
|
||||
is_ground_content = false,
|
||||
groups = {pickaxey=2, deco_block=1 },
|
||||
groups = {pickaxey=2, deco_block=1, dig_by_piston=1 },
|
||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||
_mcl_blast_resistance = 5,
|
||||
_mcl_hardness = 5,
|
||||
|
|
|
@ -199,7 +199,11 @@ mcl_stairs.register_stair_and_slab_simple("blackstone_chiseled_polished", "mcl_b
|
|||
mcl_stairs.register_stair_and_slab_simple("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", S("Polished Blackstone Brick Stair"), S("Polished Blackstone Brick Slab"), S("Double Polished Blackstone Brick Slab"))
|
||||
|
||||
--Wall
|
||||
mcl_walls.register_wall("mcl_blackstone:wall", S("Blackstone Wall"), "mcl_blackstone:blackstone")
|
||||
mcl_walls.register_wall(
|
||||
"mcl_blackstone:wall",
|
||||
S("Blackstone Wall"),
|
||||
"mcl_blackstone:blackstone"
|
||||
)
|
||||
|
||||
--lavacooling
|
||||
|
||||
|
|
|
@ -67,12 +67,12 @@ local function register_filled_cauldron(water_level, description, liquid)
|
|||
local water_tex
|
||||
if liquid == "river_water" then
|
||||
id = id .. "r"
|
||||
water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#0084FF"
|
||||
water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#0084FF"
|
||||
elseif liquid == "lava" then
|
||||
id = id .. "_lava"
|
||||
water_tex = "default_lava_source_animated.png^[verticalframe:16:0"
|
||||
water_tex = "mcl_core_lava_source_animation.png^[verticalframe:16:0"
|
||||
else
|
||||
water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#3F76E4"
|
||||
water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#3F76E4"
|
||||
end
|
||||
minetest.register_node(id, {
|
||||
description = description,
|
||||
|
|
|
@ -66,9 +66,16 @@ mcl_signs.register_sign_custom("mcl_cherry_blossom", "_cherrywood",
|
|||
"mcl_cherry_blossom_sign_inv.png", "mcl_cherry_blossom_sign_inv.png", S("Cherry Sign"))
|
||||
|
||||
-- Fences & Gates
|
||||
mcl_fences.register_fence_and_fence_gate("cherry_fence", S("Cherry Fence"), S("Cherry Gate"),
|
||||
"mcl_cherry_blossom_planks.png", {handy=1, axey=1, flammable=2, fence_wood=1, fire_encouragement=5, fire_flammability=20}, 2, 15,
|
||||
{"group:fence_wood"}, mcl_sounds.node_sound_wood_defaults())
|
||||
mcl_fences.register_fence_and_fence_gate(
|
||||
"cherry_fence",
|
||||
S("Cherry Fence"),
|
||||
S("Cherry Gate"),
|
||||
"mcl_cherry_blossom_planks.png",
|
||||
{handy=1, axey=1, flammable=2, fence_wood=1, fire_encouragement=5, fire_flammability=20},
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_hardness,
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance,
|
||||
{"group:fence_wood"},
|
||||
mcl_sounds.node_sound_wood_defaults())
|
||||
|
||||
-- Redstone
|
||||
mesecon.register_pressure_plate(
|
||||
|
|
|
@ -406,7 +406,7 @@ mcl_core.register_snowed_node("mcl_core:dirt_with_grass_snow", "mcl_core:dirt_wi
|
|||
minetest.register_node("mcl_core:grass_path", {
|
||||
tiles = {"mcl_core_grass_path_top.png", "default_dirt.png", "mcl_core_grass_path_side.png"},
|
||||
description = S("Grass Path"),
|
||||
_doc_items_longdesc = S("Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block."),
|
||||
_doc_items_longdesc = S("Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created by right clicking with a shovel. A grass path turns into dirt when it is below a solid block or when shift+right clicked with a shovel."),
|
||||
drop = "mcl_core:dirt",
|
||||
is_ground_content = true,
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
||||
|
@ -419,7 +419,7 @@ minetest.register_node("mcl_core:grass_path", {
|
|||
{-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5},
|
||||
}
|
||||
},
|
||||
groups = {handy=1,shovely=1, cultivatable=2, dirtifies_below_solid=1, dirtifier=1, deco_block=1 },
|
||||
groups = {handy=1,shovely=1, cultivatable=2, dirtifies_below_solid=1, dirtifier=1, deco_block=1, path_remove_possible=1 },
|
||||
sounds = mcl_sounds.node_sound_dirt_defaults({
|
||||
footstep = {name="default_grass_footstep", gain=0.1},
|
||||
}),
|
||||
|
|
|
@ -11,12 +11,39 @@ local function rotate_climbable(pos, node, user, mode)
|
|||
return false
|
||||
end
|
||||
|
||||
---Updates the trapdoor above (if any).
|
||||
---
|
||||
---@param pos mt.Vector The position of the ladder.
|
||||
---@param event "place" | "destruct" The place or destruct event.
|
||||
function mcl_core.update_trapdoor(pos, event)
|
||||
local top_pos = vector.offset(pos, 0, 1, 0)
|
||||
local top_node = minetest.get_node_or_nil(top_pos)
|
||||
|
||||
if top_node and minetest.get_item_group(top_node.name, "trapdoor") == 2 then
|
||||
local new_name = top_node.name
|
||||
if event == "place" then
|
||||
new_name = string.gsub(new_name, "open$", "ladder")
|
||||
elseif event == "destruct" then
|
||||
new_name = string.gsub(new_name, "ladder$", "open")
|
||||
end
|
||||
|
||||
-- If node above is an opened trapdoor
|
||||
minetest.swap_node(top_pos, {
|
||||
name = new_name,
|
||||
param1 = top_node.param1,
|
||||
param2 = top_node.param2,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
-- TODO: Move ladders into their own API.
|
||||
minetest.register_node("mcl_core:ladder", {
|
||||
description = S("Ladder"),
|
||||
_doc_items_longdesc = S("A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."),
|
||||
_doc_items_longdesc = S(
|
||||
"A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."),
|
||||
drawtype = "signlike",
|
||||
is_ground_content = false,
|
||||
tiles = {"default_ladder.png"},
|
||||
tiles = { "default_ladder.png" },
|
||||
inventory_image = "default_ladder.png",
|
||||
wield_image = "default_ladder.png",
|
||||
paramtype = "light",
|
||||
|
@ -26,14 +53,21 @@ minetest.register_node("mcl_core:ladder", {
|
|||
climbable = true,
|
||||
node_box = {
|
||||
type = "wallmounted",
|
||||
wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 },
|
||||
wall_side = { -0.5, -0.5, -0.5, -7 / 16, 0.5, 0.5 },
|
||||
},
|
||||
selection_box = {
|
||||
type = "wallmounted",
|
||||
wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 },
|
||||
wall_side = { -0.5, -0.5, -0.5, -7 / 16, 0.5, 0.5 },
|
||||
},
|
||||
stack_max = 64,
|
||||
groups = {handy=1,axey=1, attached_node=1, deco_block=1, dig_by_piston=1},
|
||||
groups = {
|
||||
handy = 1,
|
||||
axey = 1,
|
||||
attached_node = 1,
|
||||
deco_block = 1,
|
||||
dig_by_piston = 1,
|
||||
ladder = 1
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
node_placement_prediction = "",
|
||||
-- Restrict placement of ladders
|
||||
|
@ -53,7 +87,7 @@ minetest.register_node("mcl_core:ladder", {
|
|||
|
||||
-- Don't allow to place the ladder at particular nodes
|
||||
if (groups and (groups.glass or groups.leaves or groups.slab)) or
|
||||
node.name == "mcl_core:ladder" or node.name == "mcl_core:ice" or node.name == "mcl_nether:glowstone" or node.name == "mcl_ocean:sea_lantern" then
|
||||
node.name == "mcl_core:ladder" or node.name == "mcl_core:ice" or node.name == "mcl_nether:glowstone" or node.name == "mcl_ocean:sea_lantern" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
|
@ -75,12 +109,17 @@ minetest.register_node("mcl_core:ladder", {
|
|||
|
||||
if success then
|
||||
if idef.sounds and idef.sounds.place then
|
||||
minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true)
|
||||
minetest.sound_play(idef.sounds.place, { pos = above, gain = 1 }, true)
|
||||
end
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
|
||||
after_destruct = function(pos, old)
|
||||
mcl_core.update_trapdoor(pos, "destruct")
|
||||
end,
|
||||
after_place_node = function(pos)
|
||||
mcl_core.update_trapdoor(pos, "place")
|
||||
end,
|
||||
_mcl_blast_resistance = 0.4,
|
||||
_mcl_hardness = 0.4,
|
||||
on_rotate = rotate_climbable,
|
||||
|
@ -89,9 +128,10 @@ minetest.register_node("mcl_core:ladder", {
|
|||
|
||||
minetest.register_node("mcl_core:vine", {
|
||||
description = S("Vines"),
|
||||
_doc_items_longdesc = S("Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."),
|
||||
_doc_items_longdesc = S(
|
||||
"Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."),
|
||||
drawtype = "signlike",
|
||||
tiles = {"mcl_core_vine.png"},
|
||||
tiles = { "mcl_core_vine.png" },
|
||||
color = "#48B518",
|
||||
inventory_image = "mcl_core_vine.png",
|
||||
wield_image = "mcl_core_vine.png",
|
||||
|
@ -107,9 +147,19 @@ minetest.register_node("mcl_core:vine", {
|
|||
},
|
||||
stack_max = 64,
|
||||
groups = {
|
||||
handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1,
|
||||
dig_by_piston = 1, destroy_by_lava_flow = 1, compostability = 50,
|
||||
flammable = 2, fire_encouragement = 15, fire_flammability = 100, foliage_palette_wallmounted = 1
|
||||
handy = 1,
|
||||
axey = 1,
|
||||
shearsy = 1,
|
||||
swordy = 1,
|
||||
deco_block = 1,
|
||||
dig_by_piston = 1,
|
||||
destroy_by_lava_flow = 1,
|
||||
compostability = 50,
|
||||
flammable = 2,
|
||||
fire_encouragement = 15,
|
||||
fire_flammability = 100,
|
||||
foliage_palette_wallmounted = 1,
|
||||
ladder = 1
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
||||
drop = "",
|
||||
|
@ -151,7 +201,7 @@ minetest.register_node("mcl_core:vine", {
|
|||
|
||||
if success then
|
||||
if idef.sounds and idef.sounds.place then
|
||||
minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true)
|
||||
minetest.sound_play(idef.sounds.place, { pos = above, gain = 1 }, true)
|
||||
end
|
||||
end
|
||||
return itemstack
|
||||
|
@ -174,13 +224,19 @@ minetest.register_node("mcl_core:vine", {
|
|||
-- If dug, also dig a “dependant” vine below it.
|
||||
-- A vine is dependant if it hangs from this node and has no supporting block.
|
||||
on_dig = function(pos, node, digger)
|
||||
local below = vector.offset(pos,0,-1,0)
|
||||
local below = vector.offset(pos, 0, -1, 0)
|
||||
local belownode = minetest.get_node(below)
|
||||
minetest.node_dig(pos, node, digger)
|
||||
if belownode.name == node.name and (not mcl_core.check_vines_supported(below, belownode)) then
|
||||
minetest.registered_nodes[node.name].on_dig(below, node, digger)
|
||||
end
|
||||
end,
|
||||
after_destruct = function(pos, old)
|
||||
mcl_core.update_trapdoor(pos, "destruct")
|
||||
end,
|
||||
after_place_node = function(pos)
|
||||
mcl_core.update_trapdoor(pos, "place")
|
||||
end,
|
||||
|
||||
|
||||
_mcl_blast_resistance = 0.2,
|
||||
|
|
|
@ -18,17 +18,17 @@ end
|
|||
minetest.register_node("mcl_core:water_flowing", {
|
||||
description = S("Flowing Water"),
|
||||
_doc_items_create_entry = false,
|
||||
wield_image = "default_water_flowing_animated.png^[verticalframe:64:0",
|
||||
wield_image = "mcl_core_water_flow_animation.png^[verticalframe:64:0",
|
||||
drawtype = "flowingliquid",
|
||||
tiles = {"default_water_flowing_animated.png^[verticalframe:64:0"},
|
||||
tiles = {"mcl_core_water_flow_animation.png^[verticalframe:64:0"},
|
||||
special_tiles = {
|
||||
{
|
||||
image="default_water_flowing_animated.png",
|
||||
image="mcl_core_water_flow_animation.png",
|
||||
backface_culling=false,
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.5}
|
||||
},
|
||||
{
|
||||
image="default_water_flowing_animated.png",
|
||||
image="mcl_core_water_flow_animation.png",
|
||||
backface_culling=false,
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.5}
|
||||
},
|
||||
|
@ -71,12 +71,12 @@ S("• When water is directly below lava, the water turns into stone."),
|
|||
drawtype = "liquid",
|
||||
waving = 3,
|
||||
tiles = {
|
||||
{name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
|
||||
{name="mcl_core_water_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
|
||||
},
|
||||
special_tiles = {
|
||||
-- New-style water source material (mostly unused)
|
||||
{
|
||||
name="default_water_source_animated.png",
|
||||
name="mcl_core_water_source_animation.png",
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0},
|
||||
backface_culling = false,
|
||||
}
|
||||
|
@ -119,17 +119,17 @@ S("• When water is directly below lava, the water turns into stone."),
|
|||
minetest.register_node("mcl_core:lava_flowing", {
|
||||
description = S("Flowing Lava"),
|
||||
_doc_items_create_entry = false,
|
||||
wield_image = "default_lava_flowing_animated.png^[verticalframe:64:0",
|
||||
wield_image = "mcl_core_lava_flow_animation.png^[verticalframe:64:0",
|
||||
drawtype = "flowingliquid",
|
||||
tiles = {"default_lava_flowing_animated.png^[verticalframe:64:0"},
|
||||
tiles = {"mcl_core_lava_flow_animation.png^[verticalframe:64:0"},
|
||||
special_tiles = {
|
||||
{
|
||||
image="default_lava_flowing_animated.png",
|
||||
image="mcl_core_lava_flow_animation.png",
|
||||
backface_culling=false,
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=6.6}
|
||||
},
|
||||
{
|
||||
image="default_lava_flowing_animated.png",
|
||||
image="mcl_core_lava_flow_animation.png",
|
||||
backface_culling=false,
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=6.6}
|
||||
},
|
||||
|
@ -182,12 +182,12 @@ S("• When flowing water touches flowing lava either from above or horizontally
|
|||
S("• When lava is directly above water, the water turns into stone."),
|
||||
drawtype = "liquid",
|
||||
tiles = {
|
||||
{name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
|
||||
{name="mcl_core_lava_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
|
||||
},
|
||||
special_tiles = {
|
||||
-- New-style lava source material (mostly unused)
|
||||
{
|
||||
name="default_lava_source_animated.png",
|
||||
name="mcl_core_lava_source_animation.png",
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0},
|
||||
backface_culling = false,
|
||||
}
|
||||
|
|
|
@ -139,8 +139,8 @@ minetest.register_node("mcl_core:deadbush", {
|
|||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
groups = {handy = 1, shearsy = 1, flammable = 3, attached_node = 1, plant = 1, non_mycelium_plant = 1, dig_by_water = 1,
|
||||
destroy_by_lava_flow = 1, deco_block = 1, fire_encouragement = 60, fire_flammability = 100},
|
||||
groups = {handy = 1, shearsy = 1, flammable = 3, attached_node = 1, plant = 1, non_mycelium_plant = 1, dig_by_piston = 1,
|
||||
dig_by_water = 1, destroy_by_lava_flow = 1, deco_block = 1, fire_encouragement = 60, fire_flammability = 100},
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
|
|
|
@ -218,7 +218,10 @@ local function register_deepslate_variant(item, desc, longdesc)
|
|||
end
|
||||
if item ~= "chiseled" then
|
||||
mcl_stairs.register_stair_and_slab_simple("deepslate_"..item, "mcl_deepslate:deepslate_"..item, S(desc.." Stairs"), S(desc.." Slab"), S("Double "..desc.." Slab"))
|
||||
mcl_walls.register_wall("mcl_deepslate:deepslate"..item.."wall", S(desc.." Wall"), "mcl_deepslate:deepslate_"..item)
|
||||
mcl_walls.register_wall(
|
||||
"mcl_deepslate:deepslate"..item.."wall",
|
||||
S(desc.." Wall"),
|
||||
"mcl_deepslate:deepslate_"..item)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -67,12 +67,23 @@ function mcl_doors:register_trapdoor(name, def)
|
|||
local tmp_node
|
||||
-- Close
|
||||
if minetest.get_item_group(me.name, "trapdoor") == 2 then
|
||||
minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true)
|
||||
tmp_node = {name=name, param1=me.param1, param2=me.param2}
|
||||
-- Open
|
||||
minetest.sound_play(def.sound_close, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true)
|
||||
tmp_node = { name = name, param1 = me.param1, param2 = me.param2 }
|
||||
-- Open
|
||||
else
|
||||
minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true)
|
||||
tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2}
|
||||
minetest.sound_play(def.sound_open, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true)
|
||||
|
||||
local bottom_node = minetest.get_node_or_nil(vector.offset(pos, 0, -1, 0))
|
||||
local name_end = "_open"
|
||||
|
||||
-- Checking if there is something underneath the trapdoor
|
||||
if bottom_node then
|
||||
local is_ladder = minetest.get_item_group(bottom_node.name, "ladder")
|
||||
if is_ladder > 0 then
|
||||
name_end = "_ladder"
|
||||
end
|
||||
end
|
||||
tmp_node = { name = name .. name_end, param1 = me.param1, param2 = me.param2 }
|
||||
end
|
||||
minetest.set_node(pos, tmp_node)
|
||||
end
|
||||
|
@ -89,20 +100,22 @@ function mcl_doors:register_trapdoor(name, def)
|
|||
longdesc = def._doc_items_longdesc
|
||||
if not longdesc then
|
||||
if def.only_redstone_can_open then
|
||||
longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.")
|
||||
longdesc = S(
|
||||
"Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.")
|
||||
else
|
||||
longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.")
|
||||
longdesc = S(
|
||||
"Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.")
|
||||
end
|
||||
end
|
||||
usagehelp = def._doc_items_usagehelp
|
||||
if not usagehelp and not def.only_redstone_can_open then
|
||||
usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.")
|
||||
end
|
||||
if def.only_redstone_can_open then
|
||||
tt_help = S("Openable by redstone power")
|
||||
else
|
||||
tt_help = S("Openable by players and redstone power")
|
||||
end
|
||||
if def.only_redstone_can_open then
|
||||
tt_help = S("Openable by redstone power")
|
||||
else
|
||||
tt_help = S("Openable by players and redstone power")
|
||||
end
|
||||
|
||||
-- Closed trapdoor
|
||||
|
||||
|
@ -128,7 +141,7 @@ function mcl_doors:register_trapdoor(name, def)
|
|||
_doc_items_usagehelp = usagehelp,
|
||||
drawtype = "nodebox",
|
||||
tiles = tiles_closed,
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true,
|
||||
use_texture_alpha = "clip",
|
||||
inventory_image = def.inventory_image,
|
||||
wield_image = def.wield_image,
|
||||
is_ground_content = false,
|
||||
|
@ -143,13 +156,15 @@ function mcl_doors:register_trapdoor(name, def)
|
|||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},},
|
||||
{ -8 / 16, -8 / 16, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, },
|
||||
},
|
||||
mesecons = {
|
||||
effector = {
|
||||
action_on = (function(pos, node)
|
||||
punch(pos)
|
||||
end),
|
||||
}
|
||||
},
|
||||
mesecons = {effector = {
|
||||
action_on = (function(pos, node)
|
||||
punch(pos)
|
||||
end),
|
||||
}},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local p0 = pointed_thing.under
|
||||
local p1 = pointed_thing.above
|
||||
|
@ -164,7 +179,7 @@ function mcl_doors:register_trapdoor(name, def)
|
|||
|
||||
--local origname = itemstack:get_name()
|
||||
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
|
||||
or (fpos < -0.5 and fpos > -0.999999999) then
|
||||
or (fpos < -0.5 and fpos > -0.999999999) then
|
||||
param2 = param2 + 20
|
||||
if param2 == 21 then
|
||||
param2 = 23
|
||||
|
@ -193,16 +208,44 @@ function mcl_doors:register_trapdoor(name, def)
|
|||
|
||||
groups_open.trapdoor = 2
|
||||
groups_open.not_in_creative_inventory = 1
|
||||
minetest.register_node(name.."_open", {
|
||||
-- Non-climbable opened
|
||||
minetest.register_node(name .. "_open", {
|
||||
drawtype = "nodebox",
|
||||
tiles = tiles_open,
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true,
|
||||
use_texture_alpha = "clip",
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
pointable = true,
|
||||
groups = groups_open,
|
||||
_mcl_hardness = def._mcl_hardness,
|
||||
_mcl_blast_resistance = def._mcl_blast_resistance,
|
||||
sounds = def.sounds,
|
||||
drop = name,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.5, -0.5, 5 / 16, 0.5, 0.5, 0.5 }
|
||||
},
|
||||
on_rightclick = on_rightclick,
|
||||
mesecons = {
|
||||
effector = {
|
||||
action_off = (function(pos, node)
|
||||
punch(pos)
|
||||
end),
|
||||
}
|
||||
},
|
||||
on_rotate = on_rotate,
|
||||
})
|
||||
|
||||
-- Climbable opened
|
||||
minetest.register_node(name .. "_ladder", {
|
||||
drawtype = "nodebox",
|
||||
tiles = tiles_open,
|
||||
use_texture_alpha = "clip",
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
-- TODO: Implement Minecraft behaviour: Climbable if directly above
|
||||
-- ladder w/ matching orientation.
|
||||
-- Current behavour: Always climbable
|
||||
climbable = true,
|
||||
sunlight_propagates = true,
|
||||
pointable = true,
|
||||
|
@ -213,19 +256,20 @@ function mcl_doors:register_trapdoor(name, def)
|
|||
drop = name,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5}
|
||||
fixed = { -0.5, -0.5, 5 / 16, 0.5, 0.5, 0.5 }
|
||||
},
|
||||
on_rightclick = on_rightclick,
|
||||
mesecons = {effector = {
|
||||
action_off = (function(pos, node)
|
||||
punch(pos)
|
||||
end),
|
||||
}},
|
||||
mesecons = {
|
||||
effector = {
|
||||
action_off = (function(pos, node)
|
||||
punch(pos)
|
||||
end),
|
||||
}
|
||||
},
|
||||
on_rotate = on_rotate,
|
||||
})
|
||||
|
||||
if minetest.get_modpath("doc") then
|
||||
doc.add_entry_alias("nodes", name, "nodes", name.."_open")
|
||||
doc.add_entry_alias("nodes", name, "nodes", name .. "_open")
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -180,16 +180,18 @@ function mcl_enchanting.combine(itemstack, combine_with)
|
|||
return false
|
||||
end
|
||||
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
||||
local any_new_enchantment = false
|
||||
for enchantment, combine_level in pairs(mcl_enchanting.get_enchantments(combine_with)) do
|
||||
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
||||
local enchantment_level = enchantments[enchantment]
|
||||
if enchantment_level then
|
||||
if enchantment_level then -- The enchantment already exist in the provided item
|
||||
if enchantment_level == combine_level then
|
||||
enchantment_level = math.min(enchantment_level + 1, enchantment_def.max_level)
|
||||
else
|
||||
enchantment_level = math.max(enchantment_level, combine_level)
|
||||
end
|
||||
elseif mcl_enchanting.item_supports_enchantment(itemname, enchantment) then
|
||||
any_new_enchantment = any_new_enchantment or ( enchantment_level ~= enchantments[enchantment] )
|
||||
elseif mcl_enchanting.item_supports_enchantment(itemname, enchantment) then -- this is a new enchantement to try to add
|
||||
local supported = true
|
||||
for incompatible in pairs(enchantment_def.incompatible) do
|
||||
if enchantments[incompatible] then
|
||||
|
@ -199,24 +201,18 @@ function mcl_enchanting.combine(itemstack, combine_with)
|
|||
end
|
||||
if supported then
|
||||
enchantment_level = combine_level
|
||||
any_new_enchantment = true
|
||||
end
|
||||
end
|
||||
if enchantment_level and enchantment_level > 0 then
|
||||
enchantments[enchantment] = enchantment_level
|
||||
end
|
||||
end
|
||||
local any_enchantment = false
|
||||
for enchantment, enchantment_level in pairs(enchantments) do
|
||||
if enchantment_level > 0 then
|
||||
any_enchantment = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if any_enchantment then
|
||||
if any_new_enchantment then
|
||||
itemstack:set_name(enchanted_itemname)
|
||||
mcl_enchanting.set_enchantments(itemstack, enchantments)
|
||||
end
|
||||
mcl_enchanting.set_enchantments(itemstack, enchantments)
|
||||
return true
|
||||
return any_new_enchantment
|
||||
end
|
||||
|
||||
function mcl_enchanting.enchantments_snippet(_, _, itemstack)
|
||||
|
|
|
@ -101,7 +101,7 @@ local pumpkin_base_def = {
|
|||
tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"},
|
||||
groups = {
|
||||
handy = 1, axey = 1, plant = 1, building_block = 1, dig_by_piston = 1, dig_immediate_piston = 1,
|
||||
enderman_takable = 1, compostability = 65
|
||||
pumpkin = 1, enderman_takable = 1, compostability = 65
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
on_rotate = on_rotate,
|
||||
|
@ -199,7 +199,7 @@ minetest.register_node("mcl_farming:pumpkin_face_light", {
|
|||
paramtype2 = "facedir",
|
||||
light_source = minetest.LIGHT_MAX,
|
||||
tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face_light.png"},
|
||||
groups = {handy=1,axey=1, building_block=1, dig_by_piston=1 },
|
||||
groups = {handy=1, axey=1, pumpkin=1, building_block=1, dig_by_piston=1 },
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
on_construct = function(pos)
|
||||
-- Attempt to spawn iron golem or snow golem
|
||||
|
|
|
@ -269,7 +269,16 @@ for w=1, #woods do
|
|||
id = wood[1].."_fence"
|
||||
id_gate = wood[1].."_fence_gate"
|
||||
end
|
||||
mcl_fences.register_fence_and_fence_gate(id, wood[2], wood[3], wood[4], wood_groups, 2, 15, wood_connect, wood_sounds)
|
||||
mcl_fences.register_fence_and_fence_gate(
|
||||
id,
|
||||
wood[2],
|
||||
wood[3],
|
||||
wood[4],
|
||||
wood_groups,
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_hardness,
|
||||
minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance,
|
||||
wood_connect,
|
||||
wood_sounds)
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_fences:"..id.." 3",
|
||||
|
@ -289,7 +298,15 @@ end
|
|||
|
||||
|
||||
-- Nether Brick Fence (without fence gate!)
|
||||
mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults())
|
||||
mcl_fences.register_fence(
|
||||
"nether_brick_fence",
|
||||
S("Nether Brick Fence"),
|
||||
"mcl_fences_fence_nether_brick.png",
|
||||
{pickaxey=1, deco_block=1, fence_nether_brick=1},
|
||||
minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_hardness,
|
||||
minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_blast_resistance,
|
||||
{"group:fence_nether_brick"},
|
||||
mcl_sounds.node_sound_stone_defaults())
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_fences:nether_brick_fence 6",
|
||||
|
|
|
@ -128,8 +128,6 @@ local fortune_wheat_seed_drop = {
|
|||
overwrite = true,
|
||||
}
|
||||
|
||||
-- CHECKME: How does tall grass behave when pushed by a piston?
|
||||
|
||||
--- Tall Grass ---
|
||||
local def_tallgrass = {
|
||||
description = S("Tall Grass"),
|
||||
|
@ -155,7 +153,7 @@ local def_tallgrass = {
|
|||
groups = {
|
||||
handy = 1, shearsy = 1, attached_node = 1, deco_block = 1,
|
||||
plant = 1, place_flowerlike = 2, non_mycelium_plant = 1,
|
||||
flammable = 3, fire_encouragement = 60, fire_flammability = 100,
|
||||
flammable = 3, fire_encouragement = 60, fire_flammability = 10, dig_by_piston = 1,
|
||||
dig_by_water = 1, destroy_by_lava_flow = 1, compostability = 30, grass_palette = 1
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
||||
|
@ -252,7 +250,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
|
|||
paramtype2 = paramtype2,
|
||||
palette = palette,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
buildable_to = false,
|
||||
drop = drop_bottom,
|
||||
_mcl_shears_drop = shears_drop,
|
||||
_mcl_fortune_drop = fortune_drop,
|
||||
|
@ -354,7 +352,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
|
|||
paramtype2 = paramtype2,
|
||||
palette = palette,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
buildable_to = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius },
|
||||
|
|
|
@ -118,7 +118,7 @@ function mcl_lanterns.register_lantern(name, def)
|
|||
node_placement_prediction = "",
|
||||
sunlight_propagates = true,
|
||||
light_source = def.light_level,
|
||||
groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1},
|
||||
groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1, dig_by_piston=1},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
|
|
|
@ -183,7 +183,7 @@ mcl_flowerpots.register_potted_flower("mcl_mangrove:propagule", {
|
|||
image = "mcl_mangrove_propagule.png",
|
||||
})
|
||||
|
||||
local water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#3F76E4"
|
||||
local water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#3F76E4"
|
||||
|
||||
local wlroots = {
|
||||
description = S("water logged mangrove roots"),
|
||||
|
@ -194,12 +194,12 @@ local wlroots = {
|
|||
S("These cannot be crafted yet only occure when get in contact of water."),
|
||||
_doc_items_hidden = false,
|
||||
tiles = {
|
||||
{name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}}
|
||||
{name="mcl_core_water_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}}
|
||||
},
|
||||
special_tiles = {
|
||||
-- New-style water source material (mostly unused)
|
||||
{
|
||||
name="default_water_source_animated.png",
|
||||
name="mcl_core_water_source_animation.png",
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0},
|
||||
backface_culling = false,
|
||||
}
|
||||
|
@ -221,7 +221,7 @@ local wlroots = {
|
|||
liquids_pointable = true,
|
||||
drop = "mcl_mangrove:mangrove_roots",
|
||||
groups = {
|
||||
handy = 1, hoey = 1, water=3, liquid=3, puts_out_fire=1, dig_by_piston = 1, deco_block = 1, not_in_creative_inventory=1 },
|
||||
handy = 1, hoey = 1, water=3, liquid=3, puts_out_fire=1, dig_by_piston = 1, deco_block = 1, waterlogged = 1, not_in_creative_inventory=1 },
|
||||
_mcl_blast_resistance = 100,
|
||||
_mcl_hardness = -1, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
|
||||
on_construct = function(pos)
|
||||
|
@ -245,7 +245,7 @@ local rwlroots = table.copy(wlroots)
|
|||
-- FIXME luacheck complains that this is a repeated definition of water_tex.
|
||||
-- Maybe the tiles definition below should be replaced with the animated tile
|
||||
-- definition as per above?
|
||||
water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#0084FF"
|
||||
water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#0084FF"
|
||||
rwlroots.tiles = {
|
||||
"("..water_tex..")^mcl_mangrove_roots_top.png",
|
||||
"("..water_tex..")^mcl_mangrove_roots_side.png",
|
||||
|
|
|
@ -4664,7 +4664,7 @@
|
|||
126,
|
||||
164
|
||||
],
|
||||
"default_water_source_animated.png": [
|
||||
"mcl_core_water_source_animation.png": [
|
||||
37,
|
||||
98,
|
||||
129
|
||||
|
@ -4984,7 +4984,7 @@
|
|||
79,
|
||||
64
|
||||
],
|
||||
"default_water_flowing_animated.png": [
|
||||
"mcl_core_water_flow_animation.png": [
|
||||
38,
|
||||
101,
|
||||
129
|
||||
|
@ -5009,7 +5009,7 @@
|
|||
89,
|
||||
86
|
||||
],
|
||||
"default_lava_flowing_animated.png": [
|
||||
"mcl_core_lava_flow_animation.png": [
|
||||
177,
|
||||
42,
|
||||
16
|
||||
|
@ -5059,7 +5059,7 @@
|
|||
142,
|
||||
123
|
||||
],
|
||||
"default_lava_source_animated.png": [
|
||||
"mcl_core_lava_source_animation.png": [
|
||||
180,
|
||||
45,
|
||||
17
|
||||
|
@ -6604,16 +6604,6 @@
|
|||
56,
|
||||
64
|
||||
],
|
||||
"default_river_water_flowing_animated.png": [
|
||||
38,
|
||||
123,
|
||||
130
|
||||
],
|
||||
"default_river_water_source_animated.png": [
|
||||
37,
|
||||
120,
|
||||
130
|
||||
],
|
||||
"mcl_armor_stand_item.png": [
|
||||
134,
|
||||
114,
|
||||
|
@ -9009,17 +8999,17 @@
|
|||
127,
|
||||
113
|
||||
],
|
||||
"bucket_river_water.png": [
|
||||
"mcl_buckets_river_water_bucket.png": [
|
||||
139,
|
||||
152,
|
||||
155
|
||||
],
|
||||
"bucket_water.png": [
|
||||
"mcl_buckets_water_bucket.png": [
|
||||
139,
|
||||
147,
|
||||
155
|
||||
],
|
||||
"bucket.png": [
|
||||
"mcl_buckets_bucket.png": [
|
||||
147,
|
||||
143,
|
||||
139
|
||||
|
|
|
@ -267,7 +267,8 @@ function kelp.next_height(pos, node, pos_tip, node_tip, submerged, downward_flow
|
|||
-- Flowing liquid: Grow 1 step, but also turn the tip node into a liquid source.
|
||||
if downward_flowing then
|
||||
local alt_liq = mt_registered_nodes[node_tip.name].liquid_alternative_source
|
||||
if alt_liq then
|
||||
local alt_liq_accessible = mt_get_item_group(node_tip.name,"waterlogged") -- returns 0 if it isn't waterlogged.
|
||||
if alt_liq and not alt_liq_accessible then
|
||||
mt_set_node(pos_tip, {name=alt_liq})
|
||||
end
|
||||
end
|
||||
|
|
|
@ -52,7 +52,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", {
|
|||
tiles = {"mcl_ocean_prismarine_bricks.png"},
|
||||
groups = {pickaxey=1, building_block=1, material_stone=1},
|
||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
_mcl_blast_resistance = 1.5,
|
||||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 1.5,
|
||||
})
|
||||
|
||||
|
@ -64,7 +64,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", {
|
|||
tiles = {"mcl_ocean_prismarine_dark.png"},
|
||||
groups = {pickaxey=1, building_block=1, material_stone=1},
|
||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
_mcl_blast_resistance = 1.5,
|
||||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 1.5,
|
||||
})
|
||||
|
||||
|
|
|
@ -215,9 +215,23 @@ minetest.register_node("mcl_sculk:vein", {
|
|||
type = "wallmounted",
|
||||
},
|
||||
groups = {
|
||||
handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1,
|
||||
dig_by_piston = 1, destroy_by_lava_flow = 1, sculk = 1, dig_by_water = 1,
|
||||
handy = 1,
|
||||
axey = 1,
|
||||
shearsy = 1,
|
||||
swordy = 1,
|
||||
deco_block = 1,
|
||||
dig_by_piston = 1,
|
||||
destroy_by_lava_flow = 1,
|
||||
sculk = 1,
|
||||
dig_by_water = 1,
|
||||
ladder = 1
|
||||
},
|
||||
after_destruct = function(pos, old)
|
||||
mcl_core.update_trapdoor(pos, "destruct")
|
||||
end,
|
||||
after_place_node = function(pos)
|
||||
mcl_core.update_trapdoor(pos, "place")
|
||||
end,
|
||||
sounds = sounds,
|
||||
drop = "",
|
||||
_mcl_shears_drop = true,
|
||||
|
|
|
@ -85,7 +85,7 @@ end
|
|||
mcl_signs = {}
|
||||
|
||||
-- GLOBALS
|
||||
mcl_signs.sign_groups = { handy = 1, axey = 1, deco_block = 1, material_wood = 1, attached_node = 1, dig_by_piston = 1, flammable = -1 }
|
||||
mcl_signs.sign_groups = { handy = 1, axey = 1, deco_block = 1, material_wood = 1, attached_node = 1, flammable = -1 }
|
||||
--- colors used for wools.
|
||||
mcl_signs.mcl_wool_colors = {
|
||||
unicolor_white = "#FFFFFF",
|
||||
|
@ -764,6 +764,15 @@ function mcl_signs.register_sign (modname, color, _name, ttsign)
|
|||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign22_5" .. _name, 1 })
|
||||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 })
|
||||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 })
|
||||
|
||||
-- register as unpushable
|
||||
if minetest.get_modpath("mesecons_mvps") then
|
||||
mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name)
|
||||
end
|
||||
end
|
||||
|
||||
--- The same as register_sign, except caller defines the textures. Note, there is a greyscale version of the sign,
|
||||
|
@ -1002,6 +1011,14 @@ function mcl_signs.register_sign_custom (modname, _name, tiles, color, inventory
|
|||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 })
|
||||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 })
|
||||
|
||||
-- register as unpushable
|
||||
if minetest.get_modpath("mesecons_mvps") then
|
||||
mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name)
|
||||
end
|
||||
end
|
||||
|
||||
--- Override an existing sign, tint the textures, and gives it an unique node name. Creates both wall and standing signs.
|
||||
|
@ -1234,6 +1251,15 @@ function mcl_signs.reregister_sign (modname, color, _name, ttsign)
|
|||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign22_5" .. _name, 1 })
|
||||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 })
|
||||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 })
|
||||
|
||||
-- register as unpushable
|
||||
if minetest.get_modpath("mesecons_mvps") then
|
||||
mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name)
|
||||
end
|
||||
end
|
||||
|
||||
--- The same as reregister_sign, except caller defines the textures. Note, there is a greyscale version of the sign,
|
||||
|
@ -1469,6 +1495,14 @@ function mcl_signs.reregister_sign_custom (modname, _name, tiles, color, invento
|
|||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 })
|
||||
table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 })
|
||||
|
||||
-- register as unpushable
|
||||
if minetest.get_modpath("mesecons_mvps") then
|
||||
mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name)
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name)
|
||||
end
|
||||
end
|
||||
|
||||
--- Usage: Call this with the mod's name, the wood's item string (for the planks), and with the sign's suffix.
|
||||
|
|
|
@ -88,7 +88,18 @@ local smithing_materials = {
|
|||
["mcl_copper:copper_ingot"] = "copper",
|
||||
["mcl_core:emerald"] = "emerald",
|
||||
["mcl_nether:quartz"] = "quartz"
|
||||
}
|
||||
}
|
||||
|
||||
local achievement_trims = {
|
||||
["mcl_armor:spire"] = true,
|
||||
["mcl_armor:snout"] = true,
|
||||
["mcl_armor:rib"] = true,
|
||||
["mcl_armor:ward"] = true,
|
||||
["mcl_armor:silence"] = true,
|
||||
["mcl_armor:vex"] = true,
|
||||
["mcl_armor:tide"] = true,
|
||||
["mcl_armor:wayfinder"] = true
|
||||
}
|
||||
|
||||
function mcl_smithing_table.upgrade_trimmed(itemstack, color_mineral, template)
|
||||
--get information required
|
||||
|
@ -156,16 +167,19 @@ minetest.register_node("mcl_smithing_table:table", {
|
|||
end,
|
||||
|
||||
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
local stackname = stack:get_name()
|
||||
local def = stack:get_definition()
|
||||
if
|
||||
listname == "upgrade_item"
|
||||
and string.find(stack:get_name(),"mcl_armor:") -- allow any armor piece to go in (in case the player wants to trim them)
|
||||
and not mcl_armor.trims.blacklisted[stack:get_name()]
|
||||
and def._mcl_armor_element -- allow any armor piece to go in (in case the player wants to trim them)
|
||||
and not mcl_armor.trims.blacklisted[stackname]
|
||||
or def._mcl_upgradable -- for diamond tools
|
||||
|
||||
or listname == "mineral"
|
||||
and mcl_smithing_table.is_smithing_mineral(stack:get_name())
|
||||
and mcl_smithing_table.is_smithing_mineral(stackname)
|
||||
|
||||
or listname == "template"
|
||||
and string.find(stack:get_name(),"mcl_armor")
|
||||
and string.find(stackname, "mcl_armor")
|
||||
then
|
||||
return stack:get_count()
|
||||
end
|
||||
|
@ -181,27 +195,51 @@ minetest.register_node("mcl_smithing_table:table", {
|
|||
|
||||
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
local inv = minetest.get_meta(pos):get_inventory()
|
||||
|
||||
|
||||
local function take_item(listname)
|
||||
local itemstack = inv:get_stack(listname, 1)
|
||||
itemstack:take_item()
|
||||
inv:set_stack(listname, 1, itemstack)
|
||||
end
|
||||
|
||||
|
||||
if listname == "upgraded_item" then
|
||||
-- ToDo: make epic sound
|
||||
minetest.sound_play("mcl_smithing_table_upgrade", { pos = pos, max_hear_distance = 16 })
|
||||
|
||||
if stack:get_name() == "mcl_farming:hoe_netherite" then
|
||||
awards.unlock(player:get_player_name(), "mcl:seriousDedication")
|
||||
elseif mcl_armor.is_trimmed(stack) then
|
||||
local template_name = inv:get_stack("template", 1):get_name()
|
||||
local playername = player:get_player_name()
|
||||
awards.unlock(playername, "mcl:trim")
|
||||
|
||||
if not awards.players[playername].unlocked["mcl:lots_of_trimming"] and achievement_trims[template_name] then
|
||||
local meta = player:get_meta()
|
||||
local used_achievement_trims = minetest.deserialize(meta:get_string("mcl_smithing_table:achievement_trims")) or {}
|
||||
if not used_achievement_trims[template_name] then
|
||||
used_achievement_trims[template_name] = true
|
||||
end
|
||||
|
||||
local used_all = true
|
||||
for name, _ in pairs(achievement_trims) do
|
||||
if not used_achievement_trims[name] then
|
||||
used_all = false
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if used_all then
|
||||
awards.unlock(playername, "mcl:lots_of_trimming")
|
||||
else
|
||||
meta:set_string("mcl_smithing_table:achievement_trims", minetest.serialize(used_achievement_trims))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
take_item("upgrade_item")
|
||||
take_item("mineral")
|
||||
take_item("template")
|
||||
|
||||
-- ToDo: make epic sound
|
||||
minetest.sound_play("mcl_smithing_table_upgrade", { pos = pos, max_hear_distance = 16 })
|
||||
end
|
||||
if listname == "upgraded_item" then
|
||||
if stack:get_name() == "mcl_farming:hoe_netherite" then
|
||||
awards.unlock(player:get_player_name(), "mcl:seriousDedication")
|
||||
end
|
||||
end
|
||||
|
||||
reset_upgraded_item(pos)
|
||||
end,
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ minetest.register_node("mcl_sponges:sponge_wet", {
|
|||
buildable_to = false,
|
||||
stack_max = 64,
|
||||
sounds = mcl_sounds.node_sound_dirt_defaults(),
|
||||
groups = {handy=1, hoey=1, building_block=1},
|
||||
groups = {handy=1, hoey=1, waterlogged = 1, building_block=1},
|
||||
on_place = place_wet_sponge,
|
||||
_mcl_blast_resistance = 0.6,
|
||||
_mcl_hardness = 0.6,
|
||||
|
@ -175,7 +175,7 @@ if minetest.get_modpath("mclx_core") then
|
|||
buildable_to = false,
|
||||
stack_max = 64,
|
||||
sounds = mcl_sounds.node_sound_dirt_defaults(),
|
||||
groups = {handy=1, building_block=1},
|
||||
groups = {handy=1, waterlogged = 1, building_block=1},
|
||||
on_place = place_wet_sponge,
|
||||
_mcl_blast_resistance = 0.6,
|
||||
_mcl_hardness = 0.6,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
-- ____________________________
|
||||
--_________________________________________/ Variables & Functions \_________
|
||||
--_________________________________________/ Variables & Functions \_________
|
||||
|
||||
local eat = minetest.item_eat(6, "mcl_core:bowl") --6 hunger points, player receives mcl_core:bowl after eating
|
||||
|
||||
|
@ -12,7 +12,7 @@ local flower_effect = {
|
|||
[ "mcl_flowers:dandelion" ] = "hunger",
|
||||
[ "mcl_flowers:cornflower" ] = "jump",
|
||||
[ "mcl_flowers:oxeye_daisy" ] = "regeneration",
|
||||
[ "mcl_flowers:poppy" ] = "night_vision"
|
||||
[ "mcl_flowers:poppy" ] = "night_vision"
|
||||
}
|
||||
|
||||
local effects = {
|
||||
|
@ -53,13 +53,27 @@ local function get_random_effect()
|
|||
return effects[keys[math.random(#keys)]]
|
||||
end
|
||||
|
||||
local function eat_stew(itemstack, placer, pointed_thing)
|
||||
local function eat_stew(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type == "node" then
|
||||
if user and not user:get_player_control().sneak then
|
||||
-- Use pointed node's on_rightclick function first, if present
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
if user and not user:get_player_control().sneak then
|
||||
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
|
||||
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif pointed_thing.type == "object" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local e = itemstack:get_meta():get_string("effect")
|
||||
local f = effects[e]
|
||||
if not f then
|
||||
f = get_random_effect()
|
||||
end
|
||||
if f(itemstack,placer,pointed_thing) then
|
||||
if f(itemstack, user, pointed_thing) then
|
||||
return "mcl_core:bowl"
|
||||
end
|
||||
end
|
||||
|
|
|
@ -165,12 +165,36 @@ local make_grass_path = function(itemstack, placer, pointed_thing)
|
|||
end
|
||||
end
|
||||
|
||||
-- Only make grass path if tool used on side or top of target node
|
||||
-- Only make or remove grass path if tool used on side or top of target node
|
||||
if pointed_thing.above.y < pointed_thing.under.y then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
if (minetest.get_item_group(node.name, "path_creation_possible") == 1) then
|
||||
-- Remove grass paths
|
||||
if (minetest.get_item_group(node.name, "path_remove_possible") == 1) and placer:get_player_control().sneak then
|
||||
local above = table.copy(pointed_thing.under)
|
||||
above.y = above.y + 1
|
||||
if minetest.get_node(above).name == "air" then
|
||||
if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
|
||||
minetest.record_protection_violation(pointed_thing.under, placer:get_player_name())
|
||||
return itemstack
|
||||
end
|
||||
|
||||
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
||||
-- Add wear (as if digging a shovely node)
|
||||
local toolname = itemstack:get_name()
|
||||
local wear = mcl_autogroup.get_wear(toolname, "shovely")
|
||||
if wear then
|
||||
itemstack:add_wear(wear)
|
||||
end
|
||||
end
|
||||
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above, max_hear_distance = 16}, true)
|
||||
minetest.swap_node(pointed_thing.under, {name="mcl_core:dirt"})
|
||||
end
|
||||
end
|
||||
|
||||
-- Make grass paths
|
||||
if (minetest.get_item_group(node.name, "path_creation_possible") == 1) and not placer:get_player_control().sneak then
|
||||
local above = table.copy(pointed_thing.under)
|
||||
above.y = above.y + 1
|
||||
if minetest.get_node(above).name == "air" then
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
This API allows you to add more walls (like the cobblestone wall) to MineClone 2.
|
||||
|
||||
## `mcl_walls.register_wall(nodename, description, craft_material, tiles, invtex, groups, sounds)`
|
||||
## `mcl_walls.register_wall(nodename, description, craft_material, tiles, invtex, groups, sounds, hardness, blast_resistance)`
|
||||
|
||||
Adds a new wall type. This is optimized for stone-based walls, but other materials are theoretically possible, too.
|
||||
|
||||
|
@ -25,6 +25,8 @@ If `craft_material` is not `nil` it also adds a crafting recipe of the following
|
|||
* `inventory_image`: Inventory image (optional if `source` is set)
|
||||
* `groups`: Base group memberships (optional, default is `{pickaxey=1}`)
|
||||
* `sounds`: Sound table (optional, by default default uses stone sounds)
|
||||
* `hardness`: Hardness of node (optional, default matches `source` node or fallback value 2)
|
||||
* `blast_resistance`: Blast resistance of node (optional, default matches `source` node or fallback value 6)
|
||||
|
||||
The following groups will automatically be added to the nodes (where applicable), you do not need to add them
|
||||
to the `groups` table:
|
||||
|
|
|
@ -97,8 +97,10 @@ local full_blocks = {
|
|||
* inventory_image: Inventory image (optional)
|
||||
* groups: Base group memberships (optional, default is {pickaxey=1})
|
||||
* sounds: Sound table (optional, default is stone)
|
||||
* hardness: Hardness of node (optional, default matches `source` node or fallback value 2)
|
||||
* blast_resistance: Blast resistance of node (optional, default matches `source` node or fallback value 6)
|
||||
]]
|
||||
function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, sounds)
|
||||
function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, sounds, hardness, blast_resistance)
|
||||
|
||||
local base_groups = groups
|
||||
if not base_groups then
|
||||
|
@ -112,15 +114,29 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory
|
|||
local main_node_groups = table.copy(base_groups)
|
||||
main_node_groups.deco_block = 1
|
||||
|
||||
-- TODO: Stop hardcoding blast resistance
|
||||
|
||||
if not sounds then
|
||||
sounds = mcl_sounds.node_sound_stone_defaults()
|
||||
end
|
||||
|
||||
if (not tiles) and source then
|
||||
if minetest.registered_nodes[source] then
|
||||
tiles = minetest.registered_nodes[source].tiles
|
||||
if source then
|
||||
-- Default values from `source` node
|
||||
if not hardness then
|
||||
hardness = minetest.registered_nodes[source]._mcl_hardness
|
||||
end
|
||||
if not blast_resistance then
|
||||
blast_resistance = minetest.registered_nodes[source]._mcl_blast_resistance
|
||||
end
|
||||
if not sounds then
|
||||
sounds = minetest.registered_nodes[source].sounds
|
||||
end
|
||||
if not tiles then
|
||||
if minetest.registered_nodes[source] then
|
||||
tiles = minetest.registered_nodes[source].tiles
|
||||
end
|
||||
end
|
||||
else
|
||||
-- Fallback in case no `source` given
|
||||
if not hardness then
|
||||
hardness = 2
|
||||
end
|
||||
if not blast_resistance then
|
||||
blast_resistance = 6
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -169,8 +185,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory
|
|||
fixed = take
|
||||
},
|
||||
sounds = sounds,
|
||||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 2,
|
||||
_mcl_blast_resistance = blast_resistance,
|
||||
_mcl_hardness = hardness,
|
||||
})
|
||||
|
||||
-- Add entry alias for the Help
|
||||
|
@ -197,8 +213,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory
|
|||
fixed = {pillar, full_blocks[1]}
|
||||
},
|
||||
sounds = sounds,
|
||||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 2,
|
||||
_mcl_blast_resistance = blast_resistance,
|
||||
_mcl_hardness = hardness,
|
||||
})
|
||||
-- Add entry alias for the Help
|
||||
if minetest.get_modpath("doc") then
|
||||
|
@ -223,8 +239,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory
|
|||
fixed = {pillar, full_blocks[2]}
|
||||
},
|
||||
sounds = sounds,
|
||||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 2,
|
||||
_mcl_blast_resistance = blast_resistance,
|
||||
_mcl_hardness = hardness,
|
||||
})
|
||||
-- Add entry alias for the Help
|
||||
if minetest.get_modpath("doc") then
|
||||
|
@ -255,8 +271,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory
|
|||
collisionbox = {-0.2, 0, -0.2, 0.2, 1.4, 0.2},
|
||||
on_construct = update_wall,
|
||||
sounds = sounds,
|
||||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 2,
|
||||
_mcl_blast_resistance = blast_resistance,
|
||||
_mcl_hardness = hardness,
|
||||
})
|
||||
if source then
|
||||
minetest.register_craft({
|
||||
|
|
|
@ -194,6 +194,19 @@ mcl_mob_active_range (Active mob range) int 48 0 256
|
|||
# Zombie siege raid (default:false)
|
||||
mcl_raids_zombie_siege (Zombie siege raid) bool false
|
||||
|
||||
# Use MC 1.18+ light levels to control monster spawning.
|
||||
# Disable to use older mob specific light levels.
|
||||
mcl_mobs_modern_lighting (Use MC 1.18+ light rules for spawning) bool true
|
||||
|
||||
# These only take effect if mcl_mobs_modern_lighting is enabled
|
||||
# Light levels greater than these block mobs spawning
|
||||
# See https://minecraft.fandom.com/wiki/Light#Internal_light_level
|
||||
mcl_mobs_nether_threshold (Artificial light threshold to stop spawns in the Nether) int 11 0 14
|
||||
mcl_mobs_end_threshold (Artificial light threshold to stop spawns in the End) int 0 0 14
|
||||
mcl_mobs_overworld_threshold (Artificial light threshold to stop monster spawns in the Overworld) int 0 0 14
|
||||
mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14
|
||||
mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14
|
||||
|
||||
[Audio]
|
||||
# Enable flame sound.
|
||||
flame_sound (Flame sound) bool true
|
||||
|
@ -277,6 +290,10 @@ fix_doubleplants (Mcimport double plant fixes) bool true
|
|||
# Allow players to create Minecraft-like maps.
|
||||
enable_real_maps (Enable Real Maps) bool true
|
||||
|
||||
# Enable workarounds for faulty mob navigation.
|
||||
# Hack 1: teleport golems home if they are very far from home
|
||||
mcl_mob_allow_nav_hacks (Mob navigation hacks) bool false
|
||||
|
||||
[Additional Features]
|
||||
# Enable Bookshelf inventories
|
||||
mcl_bookshelf_inventories (Enable bookshelf inventories) bool true
|
||||
|
|
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 248 B |
Before Width: | Height: | Size: 990 B After Width: | Height: | Size: 990 B |
Before Width: | Height: | Size: 854 B After Width: | Height: | Size: 854 B |
Before Width: | Height: | Size: 551 B After Width: | Height: | Size: 551 B |
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 302 B |
After Width: | Height: | Size: 617 B |
After Width: | Height: | Size: 529 B |
After Width: | Height: | Size: 641 B |
After Width: | Height: | Size: 238 B |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 390 B |
After Width: | Height: | Size: 321 B |
After Width: | Height: | Size: 4.3 KiB |
|
@ -7,9 +7,9 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted?
|
|||
/assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_icon_breath.png,16,18,9,9,0,0,y
|
||||
/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,heart.png,52,0,9,9,0,0,y
|
||||
/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,bubble.png,16,18,9,9,0,0,y
|
||||
/assets/minecraft/textures/items,bucket_empty.png,/mods/ITEMS/mcl_buckets/textures,bucket.png,,,,,,,
|
||||
/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_water.png,,,,,,,
|
||||
/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_river_water.png,,,,,,,
|
||||
/assets/minecraft/textures/items,bucket_empty.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_bucket.png,,,,,,,
|
||||
/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_water_bucket.png,,,,,,,
|
||||
/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_river_water_bucket.png,,,,,,,
|
||||
/assets/minecraft/textures/items,bucket_lava.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_lava_bucket.png,,,,,,,
|
||||
/assets/minecraft/textures/items,item_frame.png,/mods/ITEMS/mcl_itemframes/textures,mcl_itemframes_item_frame.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,anvil_base.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_base.png,,,,,,,
|
||||
|
@ -171,8 +171,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted?
|
|||
/assets/minecraft/textures/blocks,log_jungle_top.png,/mods/ITEMS/mcl_core/textures,default_jungletree_top.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,planks_jungle.png,/mods/ITEMS/mcl_core/textures,default_junglewood.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,ladder.png,/mods/ITEMS/mcl_core/textures,default_ladder.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,lava_still.png,/mods/ITEMS/mcl_core/textures,default_lava_source_animated.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,lava_flow.png,/mods/ITEMS/mcl_core/textures,default_lava_flowing_animated.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,lava_still.png,/mods/ITEMS/mcl_core/textures,mcl_core_lava_source_animation.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,lava_flow.png,/mods/ITEMS/mcl_core/textures,mcl_core_lava_flow_animation.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,cobblestone_mossy.png,/mods/ITEMS/mcl_core/textures,default_mossycobble.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,obsidian.png,/mods/ITEMS/mcl_core/textures,default_obsidian.png,,,,,,,
|
||||
/assets/minecraft/textures/items,paper.png,/mods/ITEMS/mcl_core/textures,default_paper.png,,,,,,,
|
||||
|
@ -187,10 +187,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted?
|
|||
/assets/minecraft/textures/blocks,stone.png,/mods/ITEMS/mcl_core/textures,default_stone.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,log_oak.png,/mods/ITEMS/mcl_core/textures,default_tree.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,log_oak_top.png,/mods/ITEMS/mcl_core/textures,default_tree_top.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,default_water_source_animated.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,default_water_flowing_animated.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,default_river_water_source_animated.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,default_river_water_flowing_animated.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,mcl_core_water_source_animation.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,mcl_core_water_flow_animation.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_core/textures,default_wood.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,stone_andesite.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite.png,,,,,,,
|
||||
/assets/minecraft/textures/blocks,stone_andesite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite_smooth.png,,,,,,,
|
||||
|
|
|