Compare commits
136 Commits
fix-mcl_en
...
master
Author | SHA1 | Date |
---|---|---|
|
e322a9e23a | |
|
dd1a58b01e | |
|
87c9969801 | |
|
fec5650711 | |
|
5abfa555eb | |
|
dead4069b0 | |
|
4bc67a174b | |
|
c71b036e6a | |
|
046698c64f | |
|
e80eebd989 | |
|
31b8ea26a2 | |
|
fd6f2be485 | |
|
07e0a90051 | |
|
f073d4d420 | |
|
89aaf6b709 | |
|
f09b578034 | |
|
0ce1a92282 | |
|
135ee97b21 | |
|
51cf92a909 | |
|
2d47ad3e5f | |
|
c28d700caf | |
|
ba861d7b74 | |
|
9b8b7ce6b4 | |
|
046b3a4ce2 | |
|
354d17a14c | |
|
11265b60de | |
|
7f3ba7d4a2 | |
|
88e87bccff | |
|
a1209b14a1 | |
|
729159f631 | |
|
baf8e0b79c | |
|
00dba67cd8 | |
|
872b708465 | |
|
74e70b674e | |
|
14c882f982 | |
|
8ae605165b | |
|
aca4aca79b | |
|
bacc7613b5 | |
|
8a4b8707fa | |
|
a8c231da34 | |
|
4d342b8365 | |
|
12a943e222 | |
|
8d0afede37 | |
|
0288581407 | |
|
3774044f86 | |
|
46dbf8c0ab | |
|
7c263c6a18 | |
|
44b1d583a7 | |
|
1565999134 | |
|
5a25e42fd3 | |
|
421995deb3 | |
|
4e3a2a7b4c | |
|
e8e565fc06 | |
|
6cb08a3c87 | |
|
31a8ddabb8 | |
|
6806ea311d | |
|
ea2b53b231 | |
|
e1ed990f58 | |
|
e4c5f81524 | |
|
53042b6f48 | |
|
fbe048087f | |
|
34e5bb0334 | |
|
c05a2d3a9d | |
|
40d2e3b2b1 | |
|
f1fc84b31b | |
|
85fb33aa4c | |
|
f9a2dacdd4 | |
|
00c70014c7 | |
|
f4020ebd31 | |
|
74322ead49 | |
|
1a83f50505 | |
|
206c98e354 | |
|
69e83d5c0a | |
|
d3dfd13f78 | |
|
e28ccd9a80 | |
|
a5fba06a2c | |
|
6c36c83a18 | |
|
48a4e069f9 | |
|
60e04438e0 | |
|
0b01d299ea | |
|
ebdf944dda | |
|
794e10df4e | |
|
1cc8a7f8df | |
|
6a2fe2eb4f | |
|
6674684998 | |
|
1266396e1d | |
|
f5abc28190 | |
|
f8f6ea22c8 | |
|
b0b8ef3921 | |
|
be6d2db7d4 | |
|
dc40ed18b3 | |
|
1b99de73d2 | |
|
c97e0cd631 | |
|
8c7a8a61d2 | |
|
6bdaa9f2d1 | |
|
8b8a133381 | |
|
dceb48bf94 | |
|
e10c06ba98 | |
|
8a47a195f6 | |
|
d0b60e2399 | |
|
3ca40cd4e4 | |
|
0e8a87befa | |
|
920b8b9654 | |
|
dab80c45fd | |
|
f1a494ea62 | |
|
64bb50dfd5 | |
|
9edb40b5c5 | |
|
b0ae135b3c | |
|
b13835dd6f | |
|
3699ca5535 | |
|
9c652df8a2 | |
|
390802a344 | |
|
a27abae045 | |
|
61a999fe5a | |
|
85afc8bd53 | |
|
ed8995acec | |
|
38f1db7a04 | |
|
f1c60a48e0 | |
|
c97fc42b68 | |
|
92cd3381ad | |
|
f7a5862df2 | |
|
ba8e072265 | |
|
f9d8b61dc1 | |
|
dd727510ba | |
|
a4e8c0b884 | |
|
057051aa6d | |
|
83aebb8b99 | |
|
deb2e1c50b | |
|
7d9cbd5f84 | |
|
deb2c4ab50 | |
|
64ec36fe36 | |
|
cbf3dc49aa | |
|
6bc676545b | |
|
77c2f9371e | |
|
4cdb1130af | |
|
5f126c4686 |
|
@ -41,6 +41,7 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
||||||
* `flammable=-1` Does not get destroyed by fire
|
* `flammable=-1` Does not get destroyed by fire
|
||||||
* `fire_encouragement`: How quickly this block catches fire
|
* `fire_encouragement`: How quickly this block catches fire
|
||||||
* `fire_flammability`: How fast the block will burn away
|
* `fire_flammability`: How fast the block will burn away
|
||||||
|
* `path_creation_possible=1`: Node can be turned into grass path by using a shovel on it
|
||||||
* `spreading_dirt_type=1`: A dirt-type block with a cover (e.g. grass) which may spread to neighbor dirt blocks
|
* `spreading_dirt_type=1`: A dirt-type block with a cover (e.g. grass) which may spread to neighbor dirt blocks
|
||||||
* `dirtifies_below_solid=1`: This node turns into dirt immediately when a solid or dirtifier node is placed on top
|
* `dirtifies_below_solid=1`: This node turns into dirt immediately when a solid or dirtifier node is placed on top
|
||||||
* `dirtifier=1`: This node turns nodes the above group into dirt when placed above
|
* `dirtifier=1`: This node turns nodes the above group into dirt when placed above
|
||||||
|
@ -101,6 +102,7 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
||||||
* `water_bucket=1`: Bucket containing a liquid of group “water”
|
* `water_bucket=1`: Bucket containing a liquid of group “water”
|
||||||
* `enchantability=X`: How good the enchantments are the item gets (1 equals book)
|
* `enchantability=X`: How good the enchantments are the item gets (1 equals book)
|
||||||
* `enchanted=1`: The item is already enchanted, meaning that it can't be enchanted using an enchanting table
|
* `enchanted=1`: The item is already enchanted, meaning that it can't be enchanted using an enchanting table
|
||||||
|
* `cobble=1`: Cobblestone of any kind
|
||||||
|
|
||||||
### Material groups
|
### Material groups
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
|
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
|
||||||
Developed by many people. Not developed or endorsed by Mojang AB.
|
Developed by many people. Not developed or endorsed by Mojang AB.
|
||||||
|
|
||||||
Version: 0.74 (in development)
|
Version: 0.75 (in development)
|
||||||
|
|
||||||
### Gameplay
|
### Gameplay
|
||||||
You start in a randomly-generated world made entirely of cubes. You can explore
|
You start in a randomly-generated world made entirely of cubes. You can explore
|
||||||
|
|
|
@ -418,7 +418,11 @@ minetest.register_entity(":__builtin:item", {
|
||||||
end
|
end
|
||||||
local stack = ItemStack(itemstring)
|
local stack = ItemStack(itemstring)
|
||||||
if minetest.get_item_group(stack:get_name(), "compass") > 0 then
|
if minetest.get_item_group(stack:get_name(), "compass") > 0 then
|
||||||
stack:set_name("mcl_compass:16")
|
if string.find(stack:get_name(), "_lodestone") then
|
||||||
|
stack:set_name("mcl_compass:18_lodestone")
|
||||||
|
else
|
||||||
|
stack:set_name("mcl_compass:18")
|
||||||
|
end
|
||||||
itemstring = stack:to_string()
|
itemstring = stack:to_string()
|
||||||
self.itemstring = itemstring
|
self.itemstring = itemstring
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,180 +1,204 @@
|
||||||
--lua locals
|
--lua locals
|
||||||
local get_node = minetest.get_node
|
local get_node = minetest.get_node
|
||||||
local get_item_group = minetest.get_item_group
|
local get_item_group = minetest.get_item_group
|
||||||
local get_node_light = minetest.get_node_light
|
local get_node_light = minetest.get_node_light
|
||||||
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
||||||
local new_vector = vector.new
|
local get_biome_name = minetest.get_biome_name
|
||||||
|
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||||
|
local get_connected_players = minetest.get_connected_players
|
||||||
|
local minetest_get_perlin = minetest.get_perlin
|
||||||
|
|
||||||
local math_random = math.random
|
local math_random = math.random
|
||||||
local get_biome_name = minetest.get_biome_name
|
local math_floor = math.floor
|
||||||
local max = math.max
|
local math_ceil = math.ceil
|
||||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
local math_cos = math.cos
|
||||||
local vector_distance = vector.distance
|
local math_sin = math.sin
|
||||||
|
local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end
|
||||||
|
|
||||||
|
--local vector_distance = vector.distance
|
||||||
|
local vector_new = vector.new
|
||||||
|
local vector_floor = vector.floor
|
||||||
|
|
||||||
|
local table_copy = table.copy
|
||||||
|
local table_remove = table.remove
|
||||||
|
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
-- range for mob count
|
-- range for mob count
|
||||||
local aoc_range = 32
|
local aoc_range = 32
|
||||||
--[[
|
|
||||||
|
|
||||||
THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
|
||||||
|
|
||||||
underground:
|
|
||||||
"FlowerForest_underground",
|
|
||||||
"JungleEdge_underground",local spawning_position = spawning_position_list[math.random(1,#spawning_position_list)]
|
|
||||||
"ColdTaiga_underground",
|
|
||||||
"IcePlains_underground",
|
|
||||||
"IcePlainsSpikes_underground",
|
|
||||||
"MegaTaiga_underground",
|
|
||||||
"Taiga_underground",
|
|
||||||
"ExtremeHills+_underground",
|
|
||||||
"JungleM_underground",
|
|
||||||
"ExtremeHillsM_underground",
|
|
||||||
"JungleEdgeM_underground",
|
|
||||||
|
|
||||||
ocean:
|
|
||||||
"RoofedForest_ocean",
|
|
||||||
"JungleEdgeM_ocean",
|
|
||||||
"BirchForestM_ocean",
|
|
||||||
"BirchForest_ocean",
|
|
||||||
"IcePlains_deep_ocean",
|
|
||||||
"Jungle_deep_ocean",
|
|
||||||
"Savanna_ocean",
|
|
||||||
"MesaPlateauF_ocean",
|
|
||||||
"ExtremeHillsM_deep_ocean",
|
|
||||||
"Savanna_deep_ocean",
|
|
||||||
"SunflowerPlains_ocean",
|
|
||||||
"Swampland_deep_ocean",
|
|
||||||
"Swampland_ocean",
|
|
||||||
"MegaSpruceTaiga_deep_ocean",
|
|
||||||
"ExtremeHillsM_ocean",
|
|
||||||
"JungleEdgeM_deep_ocean",
|
|
||||||
"SunflowerPlains_deep_ocean",
|
|
||||||
"BirchForest_deep_ocean",
|
|
||||||
"IcePlainsSpikes_ocean",
|
|
||||||
"Mesa_ocean",
|
|
||||||
"StoneBeach_ocean",
|
|
||||||
"Plains_deep_ocean",
|
|
||||||
"JungleEdge_deep_ocean",
|
|
||||||
"SavannaM_deep_ocean",
|
|
||||||
"Desert_deep_ocean",
|
|
||||||
"Mesa_deep_ocean",
|
|
||||||
"ColdTaiga_deep_ocean",
|
|
||||||
"Plains_ocean",
|
|
||||||
"MesaPlateauFM_ocean",
|
|
||||||
"Forest_deep_ocean",
|
|
||||||
"JungleM_deep_ocean",
|
|
||||||
"FlowerForest_deep_ocean",
|
|
||||||
"MushroomIsland_ocean",
|
|
||||||
"MegaTaiga_ocean",
|
|
||||||
"StoneBeach_deep_ocean",
|
|
||||||
"IcePlainsSpikes_deep_ocean",
|
|
||||||
"ColdTaiga_ocean",
|
|
||||||
"SavannaM_ocean",
|
|
||||||
"MesaPlateauF_deep_ocean",
|
|
||||||
"MesaBryce_deep_ocean",
|
|
||||||
"ExtremeHills+_deep_ocean",
|
|
||||||
"ExtremeHills_ocean",
|
|
||||||
"MushroomIsland_deep_ocean",
|
|
||||||
"Forest_ocean",
|
|
||||||
"MegaTaiga_deep_ocean",
|
|
||||||
"JungleEdge_ocean",
|
|
||||||
"MesaBryce_ocean",
|
|
||||||
"MegaSpruceTaiga_ocean",
|
|
||||||
"ExtremeHills+_ocean",
|
|
||||||
"Jungle_ocean",
|
|
||||||
"RoofedForest_deep_ocean",
|
|
||||||
"IcePlains_ocean",
|
|
||||||
"FlowerForest_ocean",
|
|
||||||
"ExtremeHills_deep_ocean",
|
|
||||||
"MesaPlateauFM_deep_ocean",
|
|
||||||
"Desert_ocean",
|
|
||||||
"Taiga_ocean",
|
|
||||||
"BirchForestM_deep_ocean",
|
|
||||||
"Taiga_deep_ocean",
|
|
||||||
"JungleM_ocean",
|
|
||||||
|
|
||||||
water or beach?
|
|
||||||
"MesaPlateauFM_sandlevel",
|
|
||||||
"MesaPlateauF_sandlevel",
|
|
||||||
"MesaBryce_sandlevel",
|
|
||||||
"Mesa_sandlevel",
|
|
||||||
|
|
||||||
beach:
|
|
||||||
"FlowerForest_beach",
|
|
||||||
"Forest_beach",
|
|
||||||
"StoneBeach",
|
|
||||||
"ColdTaiga_beach_water",
|
|
||||||
"Taiga_beach",
|
|
||||||
"Savanna_beach",
|
|
||||||
"Plains_beach",
|
|
||||||
"ExtremeHills_beach",
|
|
||||||
"ColdTaiga_beach",
|
|
||||||
"Swampland_shore",
|
|
||||||
"MushroomIslandShore",
|
|
||||||
"JungleM_shore",
|
|
||||||
"Jungle_shore",
|
|
||||||
|
|
||||||
dimension biome:
|
|
||||||
"Nether",
|
|
||||||
"End",
|
|
||||||
|
|
||||||
Overworld regular:
|
|
||||||
"Mesa",
|
|
||||||
"FlowerForest",
|
|
||||||
"Swampland",
|
|
||||||
"Taiga",
|
|
||||||
"ExtremeHills",
|
|
||||||
"Jungle",
|
|
||||||
"Savanna",
|
|
||||||
"BirchForest",
|
|
||||||
"MegaSpruceTaiga",
|
|
||||||
"MegaTaiga",
|
|
||||||
"ExtremeHills+",
|
|
||||||
"Forest",
|
|
||||||
"Plains",
|
|
||||||
"Desert",
|
|
||||||
"ColdTaiga",
|
|
||||||
"MushroomIsland",
|
|
||||||
"IcePlainsSpikes",
|
|
||||||
"SunflowerPlains",
|
|
||||||
"IcePlains",
|
|
||||||
"RoofedForest",
|
|
||||||
"ExtremeHills+_snowtop",
|
|
||||||
"MesaPlateauFM_grasstop",
|
|
||||||
"JungleEdgeM",
|
|
||||||
"ExtremeHillsM",
|
|
||||||
"JungleM",
|
|
||||||
"BirchForestM",
|
|
||||||
"MesaPlateauF",
|
|
||||||
"MesaPlateauFM",
|
|
||||||
"MesaPlateauF_grasstop",
|
|
||||||
"MesaBryce",
|
|
||||||
"JungleEdge",
|
|
||||||
"SavannaM",
|
|
||||||
]]--
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--do mobs spawn?
|
||||||
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
||||||
-- count how many mobs of one type are inside an area
|
|
||||||
|
|
||||||
local count_mobs = function(pos,mobtype)
|
|
||||||
|
local noise_params = {
|
||||||
|
offset = 0,
|
||||||
|
scale = 3,
|
||||||
|
spread = {
|
||||||
|
x = 301,
|
||||||
|
y = 50,
|
||||||
|
z = 304,
|
||||||
|
},
|
||||||
|
seed = 100,
|
||||||
|
octaves = 3,
|
||||||
|
persistence = 0.5,
|
||||||
|
}
|
||||||
|
|
||||||
|
-- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
||||||
|
-- Also used for missing parameter
|
||||||
|
-- Please update the list when adding new biomes!
|
||||||
|
|
||||||
|
local list_of_all_biomes = {
|
||||||
|
|
||||||
|
-- underground:
|
||||||
|
|
||||||
|
"FlowerForest_underground",
|
||||||
|
"JungleEdge_underground",
|
||||||
|
"ColdTaiga_underground",
|
||||||
|
"IcePlains_underground",
|
||||||
|
"IcePlainsSpikes_underground",
|
||||||
|
"MegaTaiga_underground",
|
||||||
|
"Taiga_underground",
|
||||||
|
"ExtremeHills+_underground",
|
||||||
|
"JungleM_underground",
|
||||||
|
"ExtremeHillsM_underground",
|
||||||
|
"JungleEdgeM_underground",
|
||||||
|
|
||||||
|
-- ocean:
|
||||||
|
|
||||||
|
"RoofedForest_ocean",
|
||||||
|
"JungleEdgeM_ocean",
|
||||||
|
"BirchForestM_ocean",
|
||||||
|
"BirchForest_ocean",
|
||||||
|
"IcePlains_deep_ocean",
|
||||||
|
"Jungle_deep_ocean",
|
||||||
|
"Savanna_ocean",
|
||||||
|
"MesaPlateauF_ocean",
|
||||||
|
"ExtremeHillsM_deep_ocean",
|
||||||
|
"Savanna_deep_ocean",
|
||||||
|
"SunflowerPlains_ocean",
|
||||||
|
"Swampland_deep_ocean",
|
||||||
|
"Swampland_ocean",
|
||||||
|
"MegaSpruceTaiga_deep_ocean",
|
||||||
|
"ExtremeHillsM_ocean",
|
||||||
|
"JungleEdgeM_deep_ocean",
|
||||||
|
"SunflowerPlains_deep_ocean",
|
||||||
|
"BirchForest_deep_ocean",
|
||||||
|
"IcePlainsSpikes_ocean",
|
||||||
|
"Mesa_ocean",
|
||||||
|
"StoneBeach_ocean",
|
||||||
|
"Plains_deep_ocean",
|
||||||
|
"JungleEdge_deep_ocean",
|
||||||
|
"SavannaM_deep_ocean",
|
||||||
|
"Desert_deep_ocean",
|
||||||
|
"Mesa_deep_ocean",
|
||||||
|
"ColdTaiga_deep_ocean",
|
||||||
|
"Plains_ocean",
|
||||||
|
"MesaPlateauFM_ocean",
|
||||||
|
"Forest_deep_ocean",
|
||||||
|
"JungleM_deep_ocean",
|
||||||
|
"FlowerForest_deep_ocean",
|
||||||
|
"MushroomIsland_ocean",
|
||||||
|
"MegaTaiga_ocean",
|
||||||
|
"StoneBeach_deep_ocean",
|
||||||
|
"IcePlainsSpikes_deep_ocean",
|
||||||
|
"ColdTaiga_ocean",
|
||||||
|
"SavannaM_ocean",
|
||||||
|
"MesaPlateauF_deep_ocean",
|
||||||
|
"MesaBryce_deep_ocean",
|
||||||
|
"ExtremeHills+_deep_ocean",
|
||||||
|
"ExtremeHills_ocean",
|
||||||
|
"MushroomIsland_deep_ocean",
|
||||||
|
"Forest_ocean",
|
||||||
|
"MegaTaiga_deep_ocean",
|
||||||
|
"JungleEdge_ocean",
|
||||||
|
"MesaBryce_ocean",
|
||||||
|
"MegaSpruceTaiga_ocean",
|
||||||
|
"ExtremeHills+_ocean",
|
||||||
|
"Jungle_ocean",
|
||||||
|
"RoofedForest_deep_ocean",
|
||||||
|
"IcePlains_ocean",
|
||||||
|
"FlowerForest_ocean",
|
||||||
|
"ExtremeHills_deep_ocean",
|
||||||
|
"MesaPlateauFM_deep_ocean",
|
||||||
|
"Desert_ocean",
|
||||||
|
"Taiga_ocean",
|
||||||
|
"BirchForestM_deep_ocean",
|
||||||
|
"Taiga_deep_ocean",
|
||||||
|
"JungleM_ocean",
|
||||||
|
|
||||||
|
-- water or beach?
|
||||||
|
|
||||||
|
"MesaPlateauFM_sandlevel",
|
||||||
|
"MesaPlateauF_sandlevel",
|
||||||
|
"MesaBryce_sandlevel",
|
||||||
|
"Mesa_sandlevel",
|
||||||
|
|
||||||
|
-- beach:
|
||||||
|
|
||||||
|
"FlowerForest_beach",
|
||||||
|
"Forest_beach",
|
||||||
|
"StoneBeach",
|
||||||
|
"ColdTaiga_beach_water",
|
||||||
|
"Taiga_beach",
|
||||||
|
"Savanna_beach",
|
||||||
|
"Plains_beach",
|
||||||
|
"ExtremeHills_beach",
|
||||||
|
"ColdTaiga_beach",
|
||||||
|
"Swampland_shore",
|
||||||
|
"MushroomIslandShore",
|
||||||
|
"JungleM_shore",
|
||||||
|
"Jungle_shore",
|
||||||
|
|
||||||
|
-- dimension biome:
|
||||||
|
|
||||||
|
"Nether",
|
||||||
|
"End",
|
||||||
|
|
||||||
|
-- Overworld regular:
|
||||||
|
|
||||||
|
"Mesa",
|
||||||
|
"FlowerForest",
|
||||||
|
"Swampland",
|
||||||
|
"Taiga",
|
||||||
|
"ExtremeHills",
|
||||||
|
"Jungle",
|
||||||
|
"Savanna",
|
||||||
|
"BirchForest",
|
||||||
|
"MegaSpruceTaiga",
|
||||||
|
"MegaTaiga",
|
||||||
|
"ExtremeHills+",
|
||||||
|
"Forest",
|
||||||
|
"Plains",
|
||||||
|
"Desert",
|
||||||
|
"ColdTaiga",
|
||||||
|
"MushroomIsland",
|
||||||
|
"IcePlainsSpikes",
|
||||||
|
"SunflowerPlains",
|
||||||
|
"IcePlains",
|
||||||
|
"RoofedForest",
|
||||||
|
"ExtremeHills+_snowtop",
|
||||||
|
"MesaPlateauFM_grasstop",
|
||||||
|
"JungleEdgeM",
|
||||||
|
"ExtremeHillsM",
|
||||||
|
"JungleM",
|
||||||
|
"BirchForestM",
|
||||||
|
"MesaPlateauF",
|
||||||
|
"MesaPlateauFM",
|
||||||
|
"MesaPlateauF_grasstop",
|
||||||
|
"MesaBryce",
|
||||||
|
"JungleEdge",
|
||||||
|
"SavannaM",
|
||||||
|
}
|
||||||
|
|
||||||
|
-- count how many mobs are in an area
|
||||||
|
local function count_mobs(pos)
|
||||||
local num = 0
|
local num = 0
|
||||||
local objs = get_objects_inside_radius(pos, aoc_range)
|
for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do
|
||||||
for n = 1, #objs do
|
if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then
|
||||||
local obj = objs[n]:get_luaentity()
|
num = num + 1
|
||||||
if obj and obj.name and obj._cmi_is_mob then
|
|
||||||
-- count hostile mobs only
|
|
||||||
if mobtype == "hostile" then
|
|
||||||
if obj.spawn_class == "hostile" then
|
|
||||||
num = num + 1
|
|
||||||
end
|
|
||||||
-- count passive mobs only
|
|
||||||
else
|
|
||||||
num = num + 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return num
|
return num
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -215,11 +239,73 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
|
||||||
|
|
||||||
--this is where all of the spawning information is kept
|
--this is where all of the spawning information is kept
|
||||||
local spawn_dictionary = {}
|
local spawn_dictionary = {}
|
||||||
|
local summary_chance = 0
|
||||||
|
|
||||||
|
function mobs:spawn_setup(def)
|
||||||
|
if not mobs_spawn then return end
|
||||||
|
|
||||||
|
if not def then
|
||||||
|
minetest.log("warning", "Empty mob spawn setup definition")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local name = def.name
|
||||||
|
if not name then
|
||||||
|
minetest.log("warning", "Missing mob name")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local dimension = def.dimension or "overworld"
|
||||||
|
local type_of_spawning = def.type_of_spawning or "ground"
|
||||||
|
local biomes = def.biomes or list_of_all_biomes
|
||||||
|
local min_light = def.min_light or 0
|
||||||
|
local max_light = def.max_light or (minetest.LIGHT_MAX + 1)
|
||||||
|
local chance = def.chance or 1000
|
||||||
|
local aoc = def.aoc or aoc_range
|
||||||
|
local min_height = def.min_height or mcl_mapgen.overworld.min
|
||||||
|
local max_height = def.max_height or mcl_mapgen.overworld.max
|
||||||
|
local day_toggle = def.day_toggle
|
||||||
|
local on_spawn = def.on_spawn
|
||||||
|
local check_position = def.check_position
|
||||||
|
|
||||||
|
-- chance/spawn number override in minetest.conf for registered mob
|
||||||
|
local numbers = minetest.settings:get(name)
|
||||||
|
if numbers then
|
||||||
|
numbers = numbers:split(",")
|
||||||
|
chance = tonumber(numbers[1]) or chance
|
||||||
|
aoc = tonumber(numbers[2]) or aoc
|
||||||
|
if chance == 0 then
|
||||||
|
minetest.log("warning", string.format("[mobs] %s has spawning disabled", name))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||||
|
end
|
||||||
|
|
||||||
|
if chance < 1 then
|
||||||
|
chance = 1
|
||||||
|
minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")")
|
||||||
|
end
|
||||||
|
|
||||||
|
spawn_dictionary[#spawn_dictionary + 1] = {
|
||||||
|
name = name,
|
||||||
|
dimension = dimension,
|
||||||
|
type_of_spawning = type_of_spawning,
|
||||||
|
biomes = biomes,
|
||||||
|
min_light = min_light,
|
||||||
|
max_light = max_light,
|
||||||
|
chance = chance,
|
||||||
|
aoc = aoc,
|
||||||
|
min_height = min_height,
|
||||||
|
max_height = max_height,
|
||||||
|
day_toggle = day_toggle,
|
||||||
|
check_position = check_position,
|
||||||
|
on_spawn = on_spawn,
|
||||||
|
}
|
||||||
|
summary_chance = summary_chance + chance
|
||||||
|
end
|
||||||
|
|
||||||
function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
||||||
|
|
||||||
--print(dump(biomes))
|
|
||||||
|
|
||||||
-- Do mobs spawn at all?
|
-- Do mobs spawn at all?
|
||||||
if not mobs_spawn then
|
if not mobs_spawn then
|
||||||
return
|
return
|
||||||
|
@ -238,180 +324,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.log("action",
|
minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||||
string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[
|
|
||||||
local spawn_action
|
|
||||||
spawn_action = function(pos, node, active_object_count, active_object_count_wider, name)
|
|
||||||
|
|
||||||
local orig_pos = table.copy(pos)
|
|
||||||
-- is mob actually registered?
|
|
||||||
if not mobs.spawning_mobs[name]
|
|
||||||
or not minetest.registered_entities[name] then
|
|
||||||
minetest.log("warning", "Mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- additional custom checks for spawning mob
|
|
||||||
if mobs:spawn_abm_check(pos, node, name) == true then
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- count nearby mobs in same spawn class
|
|
||||||
local entdef = minetest.registered_entities[name]
|
|
||||||
local spawn_class = entdef and entdef.spawn_class
|
|
||||||
if not spawn_class then
|
|
||||||
if entdef.type == "monster" then
|
|
||||||
spawn_class = "hostile"
|
|
||||||
else
|
|
||||||
spawn_class = "passive"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local in_class_cap = count_mobs(pos, "!"..spawn_class) < MOB_CAP[spawn_class]
|
|
||||||
-- do not spawn if too many of same mob in area
|
|
||||||
if active_object_count_wider >= max_per_block -- large-range mob cap
|
|
||||||
or (not in_class_cap) -- spawn class mob cap
|
|
||||||
or count_mobs(pos, name) >= aoc then -- per-mob mob cap
|
|
||||||
-- too many entities
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- if toggle set to nil then ignore day/night check
|
|
||||||
if day_toggle ~= nil then
|
|
||||||
|
|
||||||
local tod = (minetest.get_timeofday() or 0) * 24000
|
|
||||||
|
|
||||||
if tod > 4500 and tod < 19500 then
|
|
||||||
-- daylight, but mob wants night
|
|
||||||
if day_toggle == false then
|
|
||||||
-- mob needs night
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
else
|
|
||||||
-- night time but mob wants day
|
|
||||||
if day_toggle == true then
|
|
||||||
-- mob needs day
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- spawn above node
|
|
||||||
pos.y = pos.y + 1
|
|
||||||
|
|
||||||
-- only spawn away from player
|
|
||||||
local objs = minetest.get_objects_inside_radius(pos, 24)
|
|
||||||
|
|
||||||
for n = 1, #objs do
|
|
||||||
|
|
||||||
if objs[n]:is_player() then
|
|
||||||
-- player too close
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- mobs cannot spawn in protected areas when enabled
|
|
||||||
if not spawn_protected
|
|
||||||
and minetest.is_protected(pos, "") then
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- are we spawning within height limits?
|
|
||||||
if pos.y > max_height
|
|
||||||
or pos.y < min_height then
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- are light levels ok?
|
|
||||||
local light = minetest.get_node_light(pos)
|
|
||||||
if not light
|
|
||||||
or light > max_light
|
|
||||||
or light < min_light then
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- do we have enough space to spawn mob?
|
|
||||||
local ent = minetest.registered_entities[name]
|
|
||||||
local width_x = max(1, math.ceil(ent.collisionbox[4] - ent.collisionbox[1]))
|
|
||||||
local min_x, max_x
|
|
||||||
if width_x % 2 == 0 then
|
|
||||||
max_x = math.floor(width_x/2)
|
|
||||||
min_x = -(max_x-1)
|
|
||||||
else
|
|
||||||
max_x = math.floor(width_x/2)
|
|
||||||
min_x = -max_x
|
|
||||||
end
|
|
||||||
|
|
||||||
local width_z = max(1, math.ceil(ent.collisionbox[6] - ent.collisionbox[3]))
|
|
||||||
local min_z, max_z
|
|
||||||
if width_z % 2 == 0 then
|
|
||||||
max_z = math.floor(width_z/2)
|
|
||||||
min_z = -(max_z-1)
|
|
||||||
else
|
|
||||||
max_z = math.floor(width_z/2)
|
|
||||||
min_z = -max_z
|
|
||||||
end
|
|
||||||
|
|
||||||
local max_y = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1)
|
|
||||||
|
|
||||||
for y = 0, max_y do
|
|
||||||
for x = min_x, max_x do
|
|
||||||
for z = min_z, max_z do
|
|
||||||
local pos2 = {x = pos.x+x, y = pos.y+y, z = pos.z+z}
|
|
||||||
if minetest.registered_nodes[node_ok(pos2).name].walkable == true then
|
|
||||||
-- inside block
|
|
||||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!")
|
|
||||||
if ent.spawn_small_alternative ~= nil and (not minetest.registered_nodes[node_ok(pos).name].walkable) then
|
|
||||||
minetest.log("info", "Trying to spawn smaller alternative mob: "..ent.spawn_small_alternative)
|
|
||||||
spawn_action(orig_pos, node, active_object_count, active_object_count_wider, ent.spawn_small_alternative)
|
|
||||||
end
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- tweak X/Y/Z spawn pos
|
|
||||||
if width_x % 2 == 0 then
|
|
||||||
pos.x = pos.x + 0.5
|
|
||||||
end
|
|
||||||
if width_z % 2 == 0 then
|
|
||||||
pos.z = pos.z + 0.5
|
|
||||||
end
|
|
||||||
pos.y = pos.y - 0.5
|
|
||||||
|
|
||||||
local mob = minetest.add_entity(pos, name)
|
|
||||||
minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos))
|
|
||||||
|
|
||||||
if on_spawn then
|
|
||||||
|
|
||||||
local ent = mob:get_luaentity()
|
|
||||||
|
|
||||||
on_spawn(ent, pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function spawn_abm_action(pos, node, active_object_count, active_object_count_wider)
|
|
||||||
spawn_action(pos, node, active_object_count, active_object_count_wider, name)
|
|
||||||
end
|
|
||||||
]]--
|
|
||||||
|
|
||||||
local entdef = minetest.registered_entities[name]
|
|
||||||
local spawn_class
|
|
||||||
if entdef.type == "monster" then
|
|
||||||
spawn_class = "hostile"
|
|
||||||
else
|
|
||||||
spawn_class = "passive"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--load information into the spawn dictionary
|
--load information into the spawn dictionary
|
||||||
|
@ -423,106 +336,34 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
||||||
spawn_dictionary[key]["biomes"] = biomes
|
spawn_dictionary[key]["biomes"] = biomes
|
||||||
spawn_dictionary[key]["min_light"] = min_light
|
spawn_dictionary[key]["min_light"] = min_light
|
||||||
spawn_dictionary[key]["max_light"] = max_light
|
spawn_dictionary[key]["max_light"] = max_light
|
||||||
spawn_dictionary[key]["interval"] = interval
|
|
||||||
spawn_dictionary[key]["chance"] = chance
|
spawn_dictionary[key]["chance"] = chance
|
||||||
spawn_dictionary[key]["aoc"] = aoc
|
spawn_dictionary[key]["aoc"] = aoc
|
||||||
spawn_dictionary[key]["min_height"] = min_height
|
spawn_dictionary[key]["min_height"] = min_height
|
||||||
spawn_dictionary[key]["max_height"] = max_height
|
spawn_dictionary[key]["max_height"] = max_height
|
||||||
spawn_dictionary[key]["day_toggle"] = day_toggle
|
spawn_dictionary[key]["day_toggle"] = day_toggle
|
||||||
--spawn_dictionary[key]["on_spawn"] = spawn_abm_action
|
|
||||||
spawn_dictionary[key]["spawn_class"] = spawn_class
|
|
||||||
|
|
||||||
--[[
|
summary_chance = summary_chance + chance
|
||||||
minetest.register_abm({
|
|
||||||
label = name .. " spawning",
|
|
||||||
nodenames = nodes,
|
|
||||||
neighbors = neighbors,
|
|
||||||
interval = interval,
|
|
||||||
chance = floor(max(1, chance * mobs_spawn_chance)),
|
|
||||||
catch_up = false,
|
|
||||||
action = spawn_abm_action,
|
|
||||||
})
|
|
||||||
]]--
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- compatibility with older mob registration
|
local two_pi = 2 * math.pi
|
||||||
-- we're going to forget about this for now -j4i
|
local function get_next_mob_spawn_pos(pos)
|
||||||
--[[
|
local distance = math_random(25, 32)
|
||||||
function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle)
|
local angle = math_random() * two_pi
|
||||||
|
return {
|
||||||
mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30,
|
x = math_round(pos.x + distance * math_cos(angle)),
|
||||||
chance, active_object_count, -31000, max_height, day_toggle)
|
y = pos.y,
|
||||||
|
z = math_round(pos.z + distance * math_sin(angle))
|
||||||
|
}
|
||||||
end
|
end
|
||||||
]]--
|
|
||||||
|
|
||||||
|
|
||||||
--Don't disable this yet-j4i
|
|
||||||
-- MarkBu's spawn function
|
|
||||||
|
|
||||||
function mobs:spawn(def)
|
|
||||||
--does nothing for now
|
|
||||||
--[[
|
|
||||||
local name = def.name
|
|
||||||
local nodes = def.nodes or {"group:soil", "group:stone"}
|
|
||||||
local neighbors = def.neighbors or {"air"}
|
|
||||||
local min_light = def.min_light or 0
|
|
||||||
local max_light = def.max_light or 15
|
|
||||||
local interval = def.interval or 30
|
|
||||||
local chance = def.chance or 5000
|
|
||||||
local active_object_count = def.active_object_count or 1
|
|
||||||
local min_height = def.min_height or -31000
|
|
||||||
local max_height = def.max_height or 31000
|
|
||||||
local day_toggle = def.day_toggle
|
|
||||||
local on_spawn = def.on_spawn
|
|
||||||
|
|
||||||
mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval,
|
|
||||||
chance, active_object_count, min_height, max_height, day_toggle, on_spawn)
|
|
||||||
]]--
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local axis
|
|
||||||
--inner and outer part of square donut radius
|
|
||||||
local inner = 1
|
|
||||||
local outer = 65
|
|
||||||
local int = {-1,1}
|
|
||||||
local position_calculation = function(pos)
|
|
||||||
|
|
||||||
pos = vector.floor(pos)
|
|
||||||
|
|
||||||
--this is used to determine the axis buffer from the player
|
|
||||||
axis = math.random(0,1)
|
|
||||||
|
|
||||||
--cast towards the direction
|
|
||||||
if axis == 0 then --x
|
|
||||||
pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
|
|
||||||
pos.z = pos.z + math.random(-outer,outer)
|
|
||||||
else --z
|
|
||||||
pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
|
|
||||||
pos.x = pos.x + math.random(-outer,outer)
|
|
||||||
end
|
|
||||||
return(pos)
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[
|
|
||||||
local decypher_limits_dictionary = {
|
|
||||||
["overworld"] = {mcl_vars.mg_overworld_min,mcl_vars.mg_overworld_max},
|
|
||||||
["nether"] = {mcl_vars.mg_nether_min, mcl_vars.mg_nether_max},
|
|
||||||
["end"] = {mcl_vars.mg_end_min, mcl_vars.mg_end_max}
|
|
||||||
}
|
|
||||||
]]--
|
|
||||||
|
|
||||||
local function decypher_limits(posy)
|
local function decypher_limits(posy)
|
||||||
--local min_max_table = decypher_limits_dictionary[dimension]
|
posy = math_floor(posy)
|
||||||
--return min_max_table[1],min_max_table[2]
|
|
||||||
posy = math.floor(posy)
|
|
||||||
return posy - 32, posy + 32
|
return posy - 32, posy + 32
|
||||||
end
|
end
|
||||||
|
|
||||||
--a simple helper function for mob_spawn
|
--a simple helper function for mob_spawn
|
||||||
local function biome_check(biome_list, biome_goal)
|
local function biome_check(biome_list, biome_goal)
|
||||||
for _,data in ipairs(biome_list) do
|
for _, data in pairs(biome_list) do
|
||||||
if data == biome_goal then
|
if data == biome_goal then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
@ -531,125 +372,111 @@ local function biome_check(biome_list, biome_goal)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function is_farm_animal(n)
|
||||||
--todo mob limiting
|
return n == "mobs_mc:pig" or n == "mobs_mc:cow" or n == "mobs_mc:sheep" or n == "mobs_mc:chicken" or n == "mobs_mc:horse" or n == "mobs_mc:donkey"
|
||||||
--MAIN LOOP
|
end
|
||||||
|
|
||||||
if mobs_spawn then
|
if mobs_spawn then
|
||||||
|
|
||||||
|
local perlin_noise
|
||||||
|
|
||||||
|
local function spawn_a_mob(pos, dimension, y_min, y_max)
|
||||||
|
local dimension = dimension or mcl_worlds.pos_to_dimension(pos)
|
||||||
|
local goal_pos = get_next_mob_spawn_pos(pos)
|
||||||
|
local spawning_position_list = find_nodes_in_area_under_air(
|
||||||
|
{x = goal_pos.x, y = y_min, z = goal_pos.z},
|
||||||
|
{x = goal_pos.x, y = y_max, z = goal_pos.z},
|
||||||
|
{"group:solid", "group:water", "group:lava"}
|
||||||
|
)
|
||||||
|
if #spawning_position_list <= 0 then return end
|
||||||
|
local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
|
||||||
|
|
||||||
|
--hard code mob limit in area to 5 for now
|
||||||
|
if count_mobs(spawning_position) >= 5 then return end
|
||||||
|
|
||||||
|
local gotten_node = get_node(spawning_position).name
|
||||||
|
local gotten_biome = minetest.get_biome_data(spawning_position)
|
||||||
|
if not gotten_node or not gotten_biome then return end
|
||||||
|
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
||||||
|
|
||||||
|
--add this so mobs don't spawn inside nodes
|
||||||
|
spawning_position.y = spawning_position.y + 1
|
||||||
|
|
||||||
|
--only need to poll for node light if everything else worked
|
||||||
|
local gotten_light = get_node_light(spawning_position)
|
||||||
|
|
||||||
|
local is_water = get_item_group(gotten_node, "water") ~= 0
|
||||||
|
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
||||||
|
local is_ground = not (is_water or is_lava)
|
||||||
|
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
|
||||||
|
local has_bed = minetest.find_node_near(pos,25,{"group:bed"})
|
||||||
|
|
||||||
|
if not is_ground then
|
||||||
|
spawning_position.y = spawning_position.y - 1
|
||||||
|
end
|
||||||
|
|
||||||
|
local mob_def
|
||||||
|
|
||||||
|
--create a disconnected clone of the spawn dictionary
|
||||||
|
--prevents memory leak
|
||||||
|
local mob_library_worker_table = table_copy(spawn_dictionary)
|
||||||
|
|
||||||
|
--grab mob that fits into the spawning location
|
||||||
|
--randomly grab a mob, don't exclude any possibilities
|
||||||
|
perlin_noise = perlin_noise or minetest_get_perlin(noise_params)
|
||||||
|
local noise = perlin_noise:get_3d(spawning_position)
|
||||||
|
local current_summary_chance = summary_chance
|
||||||
|
while #mob_library_worker_table > 0 do
|
||||||
|
local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1
|
||||||
|
local mob_index = 1
|
||||||
|
local mob_chance = mob_library_worker_table[mob_index].chance
|
||||||
|
local step_chance = mob_chance
|
||||||
|
while step_chance < mob_chance_offset do
|
||||||
|
mob_index = mob_index + 1
|
||||||
|
mob_chance = mob_library_worker_table[mob_index].chance
|
||||||
|
step_chance = step_chance + mob_chance
|
||||||
|
end
|
||||||
|
local mob_def = mob_library_worker_table[mob_index]
|
||||||
|
local mob_type = minetest.registered_entities[mob_def.name].type
|
||||||
|
if mob_def
|
||||||
|
and spawning_position.y >= mob_def.min_height
|
||||||
|
and spawning_position.y <= mob_def.max_height
|
||||||
|
and mob_def.dimension == dimension
|
||||||
|
and biome_check(mob_def.biomes, gotten_biome)
|
||||||
|
and gotten_light >= mob_def.min_light
|
||||||
|
and gotten_light <= mob_def.max_light
|
||||||
|
and (is_ground or mob_def.type_of_spawning ~= "ground")
|
||||||
|
and (mob_def.check_position and mob_def.check_position(spawning_position) or true)
|
||||||
|
and (not is_farm_animal(mob_def.name) or is_grass)
|
||||||
|
and (mob_type ~= "npc" or has_bed)
|
||||||
|
then
|
||||||
|
--everything is correct, spawn mob
|
||||||
|
local object = minetest.add_entity(spawning_position, mob_def.name)
|
||||||
|
if object then
|
||||||
|
return mob_def.on_spawn and mob_def.on_spawn(object, pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
current_summary_chance = current_summary_chance - mob_chance
|
||||||
|
table_remove(mob_library_worker_table, mob_index)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--MAIN LOOP
|
||||||
|
|
||||||
local timer = 0
|
local timer = 0
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
timer = timer + dtime
|
timer = timer + dtime
|
||||||
if timer >= 8 then
|
if timer < 10 then return end
|
||||||
timer = 0
|
timer = 0
|
||||||
for _,player in pairs(minetest.get_connected_players()) do
|
for _, player in pairs(get_connected_players()) do
|
||||||
for i = 1,math_random(3,8) do
|
local pos = player:get_pos()
|
||||||
repeat -- after this line each "break" means "continue"
|
local dimension = mcl_worlds.pos_to_dimension(pos)
|
||||||
local player_pos = player:get_pos()
|
-- ignore void and unloaded area
|
||||||
|
if dimension ~= "void" and dimension ~= "default" then
|
||||||
local _,dimension = mcl_worlds.y_to_layer(player_pos.y)
|
local y_min, y_max = decypher_limits(pos.y)
|
||||||
|
for i = 1, math_random(1, 4) do
|
||||||
if dimension == "void" or dimension == "default" then
|
spawn_a_mob(pos, dimension, y_min, y_max)
|
||||||
break -- ignore void and unloaded area
|
|
||||||
end
|
|
||||||
|
|
||||||
local min,max = decypher_limits(player_pos.y)
|
|
||||||
|
|
||||||
local goal_pos = position_calculation(player_pos)
|
|
||||||
|
|
||||||
local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"})
|
|
||||||
|
|
||||||
--couldn't find node
|
|
||||||
if #spawning_position_list <= 0 then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)]
|
|
||||||
|
|
||||||
--Prevent strange behavior/too close to player
|
|
||||||
if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
local gotten_node = get_node(spawning_position)
|
|
||||||
local gotten_node_name = gotten_node.name
|
|
||||||
local gotten_node_def = minetest.registered_nodes[gotten_node_name]
|
|
||||||
|
|
||||||
if not gotten_node_name or not gotten_node_def or gotten_node_name == "air" then --skip air nodes
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
if gotten_node_def.use_texture_alpha and gotten_node_def.use_texture_alpha ~= "opaque" then
|
|
||||||
break
|
|
||||||
end --don't spawn on nonopaque nodes
|
|
||||||
|
|
||||||
local leaf = minetest.get_item_group(gotten_node_name,"leaves")
|
|
||||||
if leaf ~= 0 then
|
|
||||||
break end --don't spawn on treetops
|
|
||||||
|
|
||||||
local gotten_biome = minetest.get_biome_data(spawning_position)
|
|
||||||
|
|
||||||
if not gotten_biome then
|
|
||||||
break --skip if in unloaded area
|
|
||||||
end
|
|
||||||
|
|
||||||
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
|
||||||
|
|
||||||
--grab random mob
|
|
||||||
local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)]
|
|
||||||
|
|
||||||
if not mob_def then
|
|
||||||
break --skip if something ridiculous happens (nil mob def)
|
|
||||||
end
|
|
||||||
|
|
||||||
--skip if not correct dimension
|
|
||||||
if mob_def.dimension ~= dimension then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
--skip if not in correct biome
|
|
||||||
if not biome_check(mob_def.biomes, gotten_biome) then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
--add this so mobs don't spawn inside nodes
|
|
||||||
spawning_position.y = spawning_position.y + 1
|
|
||||||
|
|
||||||
if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
--only need to poll for node light if everything else worked
|
|
||||||
local gotten_light = get_node_light(spawning_position)
|
|
||||||
|
|
||||||
--don't spawn if not in light limits
|
|
||||||
if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
local is_water = get_item_group(gotten_node_name, "water") ~= 0
|
|
||||||
local is_lava = get_item_group(gotten_node_name, "lava") ~= 0
|
|
||||||
|
|
||||||
if mob_def.type_of_spawning == "ground" and is_water then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
if mob_def.type_of_spawning == "ground" and is_lava then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
--finally do the heavy check (for now) of mobs in area
|
|
||||||
if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
--adjust the position for water and lava mobs
|
|
||||||
if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then
|
|
||||||
spawning_position.y = spawning_position.y - 1
|
|
||||||
end
|
|
||||||
|
|
||||||
--everything is correct, spawn mob
|
|
||||||
minetest.add_entity(spawning_position, mob_def.name)
|
|
||||||
until true --this is a safety catch
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
local dim = {"x", "z"}
|
||||||
|
|
||||||
|
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||||
|
|
||||||
|
local function load_schem(filename)
|
||||||
|
local file = io.open(modpath .. "/schems/" .. filename, "r")
|
||||||
|
local data = minetest.deserialize(file:read())
|
||||||
|
file:close()
|
||||||
|
return data
|
||||||
|
end
|
||||||
|
|
||||||
|
local wither_spawn_schems = {}
|
||||||
|
|
||||||
|
for _, d in pairs(dim) do
|
||||||
|
wither_spawn_schems[d] = load_schem("wither_spawn_" .. d .. ".we")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function check_schem(pos, schem)
|
||||||
|
for _, n in pairs(schem) do
|
||||||
|
if minetest.get_node(vector.add(pos, n)).name ~= n.name then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function remove_schem(pos, schem)
|
||||||
|
for _, n in pairs(schem) do
|
||||||
|
minetest.remove_node(vector.add(pos, n))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function wither_spawn(pos)
|
||||||
|
for _, d in pairs(dim) do
|
||||||
|
for i = 0, 2 do
|
||||||
|
local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i})
|
||||||
|
local schem = wither_spawn_schems[d]
|
||||||
|
if check_schem(p, schem) then
|
||||||
|
remove_schem(p, schem)
|
||||||
|
minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local old_onplace=minetest.registered_nodes[mobs_mc.items.head_wither_skeleton].on_place
|
||||||
|
minetest.registered_nodes[mobs_mc.items.head_wither_skeleton].on_place=function(itemstack,placer,pointed)
|
||||||
|
minetest.after(0, wither_spawn, pointed.above)
|
||||||
|
old_onplace(itemstack,placer,pointed)
|
||||||
|
end
|
|
@ -0,0 +1,4 @@
|
||||||
|
name = mcl_wither_spawning
|
||||||
|
description = Wither Spawning for MineClone2
|
||||||
|
author = Fleckenstein
|
||||||
|
depends = mobs_mc, mcl_heads
|
|
@ -0,0 +1 @@
|
||||||
|
return {{["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}}
|
|
@ -0,0 +1 @@
|
||||||
|
return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 2}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 1, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 2, ["param2"] = 1, ["param1"] = 15}}
|
|
@ -169,6 +169,7 @@ mobs_mc.follow = {
|
||||||
dog = { mobs_mc.items.rabbit_raw, mobs_mc.items.rabbit_cooked, mobs_mc.items.mutton_raw, mobs_mc.items.mutton_cooked, mobs_mc.items.beef_raw, mobs_mc.items.beef_cooked, mobs_mc.items.chicken_raw, mobs_mc.items.chicken_cooked, mobs_mc.items.rotten_flesh,
|
dog = { mobs_mc.items.rabbit_raw, mobs_mc.items.rabbit_cooked, mobs_mc.items.mutton_raw, mobs_mc.items.mutton_cooked, mobs_mc.items.beef_raw, mobs_mc.items.beef_cooked, mobs_mc.items.chicken_raw, mobs_mc.items.chicken_cooked, mobs_mc.items.rotten_flesh,
|
||||||
-- Mobs Redo items
|
-- Mobs Redo items
|
||||||
"mobs:meat", "mobs:meat_raw" },
|
"mobs:meat", "mobs:meat_raw" },
|
||||||
|
villager = { "mcl_farming:bread" },
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Contents for replace_what
|
-- Contents for replace_what
|
||||||
|
|
|
@ -75,6 +75,7 @@ Origin of those models:
|
||||||
* `mobs_mc_mushroom_brown.png` (CC0)
|
* `mobs_mc_mushroom_brown.png` (CC0)
|
||||||
|
|
||||||
* “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i
|
* “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i
|
||||||
|
* Llama decor (carpet) textures (`mobs_mc_llama_decor_*`) by erlehmann and rudzik8
|
||||||
* Any other texture not mentioned here are licensed under the MIT License
|
* Any other texture not mentioned here are licensed under the MIT License
|
||||||
|
|
||||||
## Sounds
|
## Sounds
|
||||||
|
|
|
@ -42,7 +42,6 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
{"blank.png", "blank.png", "mobs_mc_llama_gray.png"},
|
{"blank.png", "blank.png", "mobs_mc_llama_gray.png"},
|
||||||
{"blank.png", "blank.png", "mobs_mc_llama_white.png"},
|
{"blank.png", "blank.png", "mobs_mc_llama_white.png"},
|
||||||
{"blank.png", "blank.png", "mobs_mc_llama.png"},
|
{"blank.png", "blank.png", "mobs_mc_llama.png"},
|
||||||
-- TODO: Add llama carpet textures (Pixel Perfection seems to use verbatim copy from Minecraft :-( )
|
|
||||||
},
|
},
|
||||||
visual_size = {x=3, y=3},
|
visual_size = {x=3, y=3},
|
||||||
makes_footstep_sound = true,
|
makes_footstep_sound = true,
|
||||||
|
@ -139,50 +138,48 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
-- Make sure tamed llama is mature and being clicked by owner only
|
-- Make sure tamed llama is mature and being clicked by owner only
|
||||||
if self.tamed and not self.child and self.owner == clicker:get_player_name() then
|
if self.tamed and not self.child and self.owner == clicker:get_player_name() then
|
||||||
|
|
||||||
-- Place carpet
|
-- Place carpet
|
||||||
--[[ TODO: Re-enable this code when carpet textures arrived.
|
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
||||||
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
for group, carpetdata in pairs(carpets) do
|
||||||
for group, carpetdata in pairs(carpets) do
|
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
item:take_item()
|
||||||
item:take_item()
|
clicker:set_wielded_item(item)
|
||||||
clicker:set_wielded_item(item)
|
|
||||||
end
|
|
||||||
local substr = carpetdata[2]
|
|
||||||
local tex_carpet = "mobs_mc_llama_decor_"..substr..".png"
|
|
||||||
self.base_texture = table.copy(self.base_texture)
|
|
||||||
self.base_texture[2] = tex_carpet
|
|
||||||
self.object:set_properties({
|
|
||||||
textures = self.base_texture,
|
|
||||||
})
|
|
||||||
self.carpet = item:get_name()
|
|
||||||
self.drops = {
|
|
||||||
{name = mobs_mc.items.leather,
|
|
||||||
chance = 1,
|
|
||||||
min = 0,
|
|
||||||
max = 2,},
|
|
||||||
{name = item:get_name(),
|
|
||||||
chance = 1,
|
|
||||||
min = 1,
|
|
||||||
max = 1,},
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
local substr = carpetdata[2]
|
||||||
|
local tex_carpet = "mobs_mc_llama_decor_"..substr..".png"
|
||||||
|
self.base_texture = table.copy(self.base_texture)
|
||||||
|
self.base_texture[2] = tex_carpet
|
||||||
|
self.object:set_properties({
|
||||||
|
textures = self.base_texture,
|
||||||
|
})
|
||||||
|
self.carpet = item:get_name()
|
||||||
|
self.drops = {
|
||||||
|
{name = mobs_mc.items.leather,
|
||||||
|
chance = 1,
|
||||||
|
min = 0,
|
||||||
|
max = 2,},
|
||||||
|
{name = item:get_name(),
|
||||||
|
chance = 1,
|
||||||
|
min = 1,
|
||||||
|
max = 1,},
|
||||||
|
}
|
||||||
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
]]
|
end
|
||||||
|
|
||||||
-- detatch player already riding llama
|
-- detatch player already riding llama
|
||||||
if self.driver and clicker == self.driver then
|
if self.driver and clicker == self.driver then
|
||||||
|
|
||||||
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||||
|
|
||||||
-- attach player to llama
|
-- attach player to llama
|
||||||
elseif not self.driver then
|
elseif not self.driver then
|
||||||
|
|
||||||
self.object:set_properties({stepheight = 1.1})
|
self.object:set_properties({stepheight = 1.1})
|
||||||
mobs.attach(self, clicker)
|
mobs.attach(self, clicker)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Used to capture llama
|
-- Used to capture llama
|
||||||
elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then
|
elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then
|
||||||
|
@ -190,8 +187,6 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
--[[
|
|
||||||
TODO: Enable this code when carpet textures arrived.
|
|
||||||
on_breed = function(parent1, parent2)
|
on_breed = function(parent1, parent2)
|
||||||
-- When breeding, make sure the child has no carpet
|
-- When breeding, make sure the child has no carpet
|
||||||
local pos = parent1.object:get_pos()
|
local pos = parent1.object:get_pos()
|
||||||
|
@ -213,7 +208,6 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
]]
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -116,15 +116,14 @@ mobs:spawn_specific(
|
||||||
"overworld",
|
"overworld",
|
||||||
"ground",
|
"ground",
|
||||||
{
|
{
|
||||||
|
"Desert",
|
||||||
"FlowerForest",
|
"FlowerForest",
|
||||||
"Swampland",
|
|
||||||
"Taiga",
|
"Taiga",
|
||||||
"ExtremeHills",
|
"ExtremeHills",
|
||||||
"BirchForest",
|
"BirchForest",
|
||||||
"MegaSpruceTaiga",
|
"MegaSpruceTaiga",
|
||||||
"MegaTaiga",
|
"MegaTaiga",
|
||||||
"ExtremeHills+",
|
"ExtremeHills+",
|
||||||
"Forest",
|
|
||||||
"Plains",
|
"Plains",
|
||||||
"ColdTaiga",
|
"ColdTaiga",
|
||||||
"SunflowerPlains",
|
"SunflowerPlains",
|
||||||
|
|
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 936 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 966 B |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
|
@ -62,9 +62,15 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then
|
||||||
end
|
end
|
||||||
|
|
||||||
local professions = {
|
local professions = {
|
||||||
|
unemployed = {
|
||||||
|
name = N("Unemployed"),
|
||||||
|
texture = "mobs_mc_villager.png",
|
||||||
|
trades = nil,
|
||||||
|
},
|
||||||
farmer = {
|
farmer = {
|
||||||
name = N("Farmer"),
|
name = N("Farmer"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
|
jobsite = "mcl_composters:composter",
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_farming:wheat_item", 18, 22, }, E1 },
|
{ { "mcl_farming:wheat_item", 18, 22, }, E1 },
|
||||||
|
@ -76,16 +82,19 @@ local professions = {
|
||||||
{
|
{
|
||||||
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
||||||
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
||||||
|
{ E1, { "mcl_core:apple", 2, 3} },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_farming:melon", 7, 12 }, E1 },
|
{ { "mcl_farming:melon", 7, 12 }, E1 },
|
||||||
{ E1, { "mcl_core:apple", 5, 7 }, },
|
{ E1, {"mcl_farming:cookie", 5, 7 }, },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ E1, { "mcl_farming:cookie", 6, 10 } },
|
{ E1, { "mcl_mushrooms:mushroom_stew", 6, 10 } }, --FIXME: expert level farmer is supposed to sell sus stews.
|
||||||
{ E1, { "mcl_cake:cake", 1, 1 } },
|
},
|
||||||
|
{
|
||||||
|
{ E1, { "mcl_farming:carrot_item_gold", 3, 10 } },
|
||||||
|
{ E1, { "mcl_potions:speckled_melon", 4, 1 } },
|
||||||
TRADE_V6_BIRCH_SAPLING,
|
TRADE_V6_BIRCH_SAPLING,
|
||||||
TRADE_V6_DARK_OAK_SAPLING,
|
TRADE_V6_DARK_OAK_SAPLING,
|
||||||
TRADE_V6_ACACIA_SAPLING,
|
TRADE_V6_ACACIA_SAPLING,
|
||||||
|
@ -95,32 +104,81 @@ local professions = {
|
||||||
fisherman = {
|
fisherman = {
|
||||||
name = N("Fisherman"),
|
name = N("Fisherman"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
|
jobsite = "mcl_barrels:barrel_closed",
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } },
|
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:fish_cooked", 6, 6 } },
|
||||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||||
{ { "mcl_core:emerald", 3, 11 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
{ { "mcl_core:coal_lump", 15, 10 }, E1 },
|
||||||
|
-- FIXME missing: bucket of cod + fish should be cod.
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_fishing:fish_raw", 6, 15,}, E1 },
|
||||||
|
{ { "mcl_fishing:salmon_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:salmon_cooked", 6, 6 } },
|
||||||
|
-- FIXME missing campfire
|
||||||
|
-- {{ "mcl_core:emerald", 1, 2 },{"mcl_campfires:campfire",1,1} },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_fishing:salmon_raw", 6, 13,}, E1 },
|
||||||
|
{ { "mcl_core:emerald", 7, 22 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_fishing:clownfish_raw", 6, 6,}, E1 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_fishing:pufferfish_raw", 4, 4,}, E1 },
|
||||||
|
|
||||||
|
{ { "mcl_boats:boat", 1, 1,}, E1 },
|
||||||
|
{ { "mcl_boats:boat_acacia", 1, 1,}, E1 },
|
||||||
|
{ { "mcl_boats:boat_spruce", 1, 1,}, E1 },
|
||||||
|
{ { "mcl_boats:boat_dark_oak", 1, 1,}, E1 },
|
||||||
|
{ { "mcl_boats:boat_birch", 1, 1,}, E1 },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
fletcher = {
|
fletcher = {
|
||||||
name = N("Fletcher"),
|
name = N("Fletcher"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
|
jobsite = "mcl_fletching_table:fletching_table",
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||||
{ E1, { "mcl_bows:arrow", 8, 12 } },
|
{ E1, { "mcl_bows:arrow", 8, 12 } },
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
{ { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } },
|
{ { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_core:flint", 26, 26 }, E1 },
|
||||||
{ { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } },
|
{ { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_mobitems:string", 14, 14 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 3, 3 }, { "mcl_bows:crossbow", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_mobitems:string", 24, 24 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 7, 21 } , { "mcl_bows:bow_enchanted", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
--FIXME: supposed to be tripwire hook{ { "tripwirehook", 24, 24 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 8, 22 } , { "mcl_bows:crossbow_enchanted", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:healing_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:harming_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:night_vision_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:swiftness_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:slowness_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:leaping_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:poison_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:regeneration_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:invisibility_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:water_breathing_arrow", 5, 5 } },
|
||||||
|
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:fire_resistance_arrow", 5, 5 } },
|
||||||
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
shepherd ={
|
shepherd ={
|
||||||
name = N("Shepherd"),
|
name = N("Shepherd"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
|
jobsite = "mcl_loom:loom",
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_wool:white", 16, 22 }, E1 },
|
{ { "mcl_wool:white", 16, 22 }, E1 },
|
||||||
|
@ -150,179 +208,262 @@ local professions = {
|
||||||
librarian = {
|
librarian = {
|
||||||
name = N("Librarian"),
|
name = N("Librarian"),
|
||||||
texture = "mobs_mc_villager_librarian.png",
|
texture = "mobs_mc_villager_librarian.png",
|
||||||
|
jobsite = "mcl_villages:stonebrickcarved", --FIXME: lectern
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||||
{ { "mcl_books:book", 8, 10 }, E1 },
|
{ { "mcl_books:book", 8, 10 }, E1 },
|
||||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_compass:compass", 1 ,1 }},
|
{ { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 }},
|
||||||
{ { "mcl_core:emerald", 3, 4 }, { "mcl_books:bookshelf", 1 ,1 }},
|
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_books:written_book", 2, 2 }, E1 },
|
{ { "mcl_books:written_book", 2, 2 }, E1 },
|
||||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_clock:clock", 1, 1 } },
|
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
{ E1, { "mcl_lanterns:lantern_floor", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
{ { "mcl_dye:black", 5, 5 }, E1 },
|
||||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||||
|
{ E1, { "mcl_core:glass", 4, 4 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
{ E1, { "mcl_books:writable_book", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||||
|
{ { "mcl_core:emerald", 4, 4 }, { "mcl_compass:compass", 1 ,1 }},
|
||||||
|
{ { "mcl_core:emerald", 5, 5 }, { "mcl_clock:clock", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:emerald", 20, 22 }, { "mcl_mobs:nametag", 1, 1 } },
|
{ { "mcl_core:emerald", 20, 20 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cartographer = {
|
cartographer = {
|
||||||
name = N("Cartographer"),
|
name = N("Cartographer"),
|
||||||
texture = "mobs_mc_villager_librarian.png",
|
texture = "mobs_mc_villager_librarian.png",
|
||||||
|
jobsite = "mcl_cartography_table:cartography_table",
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
{ { "mcl_core:paper", 24, 24 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_maps:empty_map", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
-- compass subject to special checks
|
||||||
|
{ { "xpanes:pane_natural_flat", 1, 1 }, E1 },
|
||||||
|
--{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:ocean explorer map" 1, 1} },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
-- subject to special checks
|
|
||||||
{ { "mcl_compass:compass", 1, 1 }, E1 },
|
{ { "mcl_compass:compass", 1, 1 }, E1 },
|
||||||
|
--{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:woodland explorer map" 1, 1} },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
-- TODO: replace with empty map
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 1, 1 }},
|
||||||
{ { "mcl_core:emerald", 7, 11}, { "mcl_maps:filled_map", 1, 1 } },
|
|
||||||
},
|
|
||||||
|
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_white", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_grey", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_silver", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_black", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_red", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_green", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_cyan", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_blue", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_magenta", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_orange", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_purple", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_brown", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_pink", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_lime", 1, 1 }},
|
||||||
|
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_light_blue", 1, 1 }},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
--{ { "mcl_core:emerald", 8, 8}, { "FIXME: globe banner pattern", 1, 1 } },
|
||||||
|
},
|
||||||
-- TODO: special maps
|
-- TODO: special maps
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
armorer = {
|
armorer = {
|
||||||
name = N("Armorer"),
|
name = N("Armorer"),
|
||||||
texture = "mobs_mc_villager_smith.png",
|
texture = "mobs_mc_villager_smith.png",
|
||||||
|
jobsite = "mcl_core:lava_source", --FIXME: blast furnace
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||||
{ { "mcl_core:emerald", 4, 6 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 9, 9 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:leggings_iron", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_iron", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||||
{ { "mcl_core:emerald", 10, 14 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_chain", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 1, 1 }, { "mcl_armor:boots_chain", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_buckets:bucket_lava", 1, 1 }, E1 },
|
||||||
|
{ { "mcl_core:diamond", 1, 1 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 1, 1 }, { "mcl_armor:helmet_chain", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:chestplate_chain", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 5, 5 }, { "mcl_shields:shield", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
{ { "mcl_core:emerald", 19, 33 }, { "mcl_armor:leggings_diamond_enchanted", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 16, 19 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:boots_diamond_enchanted", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_armor:boots_chain", 1, 1 } },
|
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:helmet_diamond_enchanted", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_armor:leggings_chain", 1, 1 } },
|
{ { "mcl_core:emerald", 21, 35 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_armor:helmet_chain", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 11, 15 }, { "mcl_armor:chestplate_chain", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
leatherworker = {
|
leatherworker = {
|
||||||
name = N("Leatherworker"),
|
name = N("Leatherworker"),
|
||||||
texture = "mobs_mc_villager_butcher.png",
|
texture = "mobs_mc_villager_butcher.png",
|
||||||
|
jobsite = "mcl_cauldrons:cauldron",
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:leather", 9, 12 }, E1 },
|
{ { "mcl_mobitems:leather", 9, 12 }, E1 },
|
||||||
{ { "mcl_core:emerald", 2, 4 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
{ { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
||||||
|
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 2, 4 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:emerald", 7, 12 }, { "mcl_armor:chestplate_leather_enchanted", 1, 1 } },
|
{ { "mcl_core:flint", 26, 26 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
||||||
|
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_leather", 2, 4 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
{ { "mcl_mobitems:rabbit_hide", 9, 9 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
--{ { "FIXME: scute", 4, 4 }, E1 },
|
||||||
{ { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } },
|
{ { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_core:emerald", 6, 6 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
butcher = {
|
butcher = {
|
||||||
name = N("Butcher"),
|
name = N("Butcher"),
|
||||||
texture = "mobs_mc_villager_butcher.png",
|
texture = "mobs_mc_villager_butcher.png",
|
||||||
|
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smoker
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:beef", 14, 18 }, E1 },
|
{ { "mcl_mobitems:beef", 14, 14 }, E1 },
|
||||||
{ { "mcl_mobitems:chicken", 14, 18 }, E1 },
|
{ { "mcl_mobitems:chicken", 7, 7 }, E1 },
|
||||||
|
{ { "mcl_mobitems:rabbit", 4, 4 }, E1 },
|
||||||
|
{ E1, { "mcl_mobitems:rabbit_stew", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||||
{ E1, { "mcl_mobitems:cooked_beef", 5, 7 } },
|
{ E1, { "mcl_mobitems:cooked_porkchop", 5, 5 } },
|
||||||
{ E1, { "mcl_mobitems:cooked_chicken", 6, 8 } },
|
{ E1, { "mcl_mobitems:cooked_chicken", 8, 8 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
||||||
|
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
||||||
|
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
--{ { "FIXME: Sweet Berries", 10, 10 }, E1 },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
weapon_smith = {
|
weapon_smith = {
|
||||||
name = N("Weapon Smith"),
|
name = N("Weapon Smith"),
|
||||||
texture = "mobs_mc_villager_smith.png",
|
texture = "mobs_mc_villager_smith.png",
|
||||||
|
jobsite = "mcl_villages:stonebrickcarved", --FIXME: grindstone
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||||
{ { "mcl_core:emerald", 6, 8 }, { "mcl_tools:axe_iron", 1, 1 } },
|
{ { "mcl_core:emerald", 3, 3 }, { "mcl_tools:axe_iron", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||||
{ { "mcl_core:emerald", 9, 10 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_core:flint", 7, 9 }, E1 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_core:diamond", 7, 9 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
{ { "mcl_core:emerald", 13, 27 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 9, 12 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
tool_smith = {
|
tool_smith = {
|
||||||
name = N("Tool Smith"),
|
name = N("Tool Smith"),
|
||||||
texture = "mobs_mc_villager_smith.png",
|
texture = "mobs_mc_villager_smith.png",
|
||||||
|
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smithing table
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
{ E1, { "mcl_tools:axe_stone", 1, 1 } },
|
||||||
|
{ E1, { "mcl_tools:shovel_stone", 1, 1 } },
|
||||||
|
{ E1, { "mcl_tools:pick_stone", 1, 1 } },
|
||||||
|
{ E1, { "mcl_farming:hoe_stone", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
{ { "mcl_core:flint", 30, 30 }, E1 },
|
||||||
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
{ { "mcl_core:emerald", 6, 20 }, { "mcl_tools:axe_iron_enchanted", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 8, 22 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 4, 4 }, { "mcl_farming:hoe_diamond", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_core:diamond", 1, 1 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||||
|
{ { "mcl_core:emerald", 10, 24 }, { "mcl_tools:shovel_diamond_enchanted", 1, 1 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ { "mcl_core:emerald", 18, 32 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cleric = {
|
cleric = {
|
||||||
name = N("Cleric"),
|
name = N("Cleric"),
|
||||||
texture = "mobs_mc_villager_priest.png",
|
texture = "mobs_mc_villager_priest.png",
|
||||||
|
jobsite = "mcl_brewing:stand",
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 },
|
{ { "mcl_mobitems:rotten_flesh", 32, 32 }, E1 },
|
||||||
{ { "mcl_core:gold_ingot", 8, 10 }, E1 },
|
{ E1, { "mesecons:redstone", 2, 2 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ E1, { "mesecons:redstone", 1, 4 } },
|
{ { "mcl_core:gold_ingot", 3, 3 }, E1 },
|
||||||
{ E1, { "mcl_dye:blue", 1, 2 } },
|
{ E1, { "mcl_dye:blue", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ E1, { "mcl_nether:glowstone", 1, 3 } },
|
{ { "mcl_mobitems:rabbit_foot", 2, 2 }, E1 },
|
||||||
{ { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
{ E1, { "mcl_nether:glowstone", 4, 4 } },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
--{ { "FIXME: scute", 4, 4 }, E1 },
|
||||||
|
{ { "mcl_potions:glass_bottle", 9, 9 }, E1 },
|
||||||
|
{ { "mcl_core:emerald", 5, 5 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
||||||
TRADE_V6_RED_SANDSTONE,
|
TRADE_V6_RED_SANDSTONE,
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_nether:nether_wart_item", 22, 22 }, E1 },
|
{ { "mcl_nether:nether_wart_item", 22, 22 }, E1 },
|
||||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } },
|
{ { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } },
|
||||||
|
@ -347,6 +488,42 @@ local stand_still = function(self)
|
||||||
self.jump = false
|
self.jump = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function set_velocity(self, v)
|
||||||
|
local yaw = (self.object:get_yaw() or 0) + self.rotate
|
||||||
|
self.object:set_velocity({
|
||||||
|
x = (math.sin(yaw) * -v),
|
||||||
|
y = self.object:get_velocity().y,
|
||||||
|
z = (math.cos(yaw) * v),
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local function go_to_pos(entity,b)
|
||||||
|
local s=entity.object:get_pos()
|
||||||
|
local v = { x = b.x - s.x, z = b.z - s.z }
|
||||||
|
local yaw = (math.atan(v.z / v.x) + math.pi / 2) - entity.rotate
|
||||||
|
if b.x > s.x then yaw = yaw + math.pi end
|
||||||
|
entity.object:set_yaw(yaw)
|
||||||
|
set_velocity(entity,entity.follow_velocity)
|
||||||
|
if vector.distance(b,s) < 5 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function go_home(entity)
|
||||||
|
entity.state = "go_home"
|
||||||
|
local b=entity.bed
|
||||||
|
if not b then return end
|
||||||
|
if go_to_pos(entity,b) then
|
||||||
|
entity.state = "stand"
|
||||||
|
set_velocity(entity,0)
|
||||||
|
entity.object:set_pos(b)
|
||||||
|
local n=minetest.get_node(b)
|
||||||
|
if n and n.name ~= "mcl_beds:bed_red_bottom" then
|
||||||
|
entity.bed=nil --the stormtroopers have killed uncle owen
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local update_max_tradenum = function(self)
|
local update_max_tradenum = function(self)
|
||||||
if not self._trades then
|
if not self._trades then
|
||||||
return
|
return
|
||||||
|
@ -987,11 +1164,19 @@ mobs:register_mob("mobs_mc:villager", {
|
||||||
die_end = 220,
|
die_end = 220,
|
||||||
die_loop = false,
|
die_loop = false,
|
||||||
},
|
},
|
||||||
|
follow = mobs_mc.follow.villager,
|
||||||
view_range = 16,
|
view_range = 16,
|
||||||
fear_height = 4,
|
fear_height = 4,
|
||||||
jump = true,
|
jump = true,
|
||||||
walk_chance = DEFAULT_WALK_CHANCE,
|
walk_chance = DEFAULT_WALK_CHANCE,
|
||||||
on_rightclick = function(self, clicker)
|
on_rightclick = function(self, clicker)
|
||||||
|
if clicker:get_wielded_item():get_name() == "mcl_farming:bread" then
|
||||||
|
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||||
|
if mobs:protect(self, clicker) then return end
|
||||||
|
end
|
||||||
|
if self.child then
|
||||||
|
return
|
||||||
|
end
|
||||||
-- Initiate trading
|
-- Initiate trading
|
||||||
local name = clicker:get_player_name()
|
local name = clicker:get_player_name()
|
||||||
self._trading_players[name] = true
|
self._trading_players[name] = true
|
||||||
|
@ -1033,6 +1218,11 @@ mobs:register_mob("mobs_mc:villager", {
|
||||||
if not self._player_scan_timer then
|
if not self._player_scan_timer then
|
||||||
self._player_scan_timer = 0
|
self._player_scan_timer = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if self.bed and ( self.state == "go_home" or vector.distance(self.object:get_pos(),self.bed) > 50 ) then
|
||||||
|
go_home(self)
|
||||||
|
end
|
||||||
|
|
||||||
self._player_scan_timer = self._player_scan_timer + dtime
|
self._player_scan_timer = self._player_scan_timer + dtime
|
||||||
-- Check infrequently to keep CPU load low
|
-- Check infrequently to keep CPU load low
|
||||||
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then
|
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then
|
||||||
|
|
|
@ -197,7 +197,6 @@ mobs:spawn_specific(
|
||||||
"ExtremeHills+",
|
"ExtremeHills+",
|
||||||
"Forest",
|
"Forest",
|
||||||
"Plains",
|
"Plains",
|
||||||
"Desert",
|
|
||||||
"ColdTaiga",
|
"ColdTaiga",
|
||||||
"MushroomIsland",
|
"MushroomIsland",
|
||||||
"IcePlainsSpikes",
|
"IcePlainsSpikes",
|
||||||
|
@ -290,7 +289,6 @@ mobs:spawn_specific(
|
||||||
"ExtremeHills+",
|
"ExtremeHills+",
|
||||||
"Forest",
|
"Forest",
|
||||||
"Plains",
|
"Plains",
|
||||||
"Desert",
|
|
||||||
"ColdTaiga",
|
"ColdTaiga",
|
||||||
"MushroomIsland",
|
"MushroomIsland",
|
||||||
"IcePlainsSpikes",
|
"IcePlainsSpikes",
|
||||||
|
@ -342,9 +340,6 @@ mobs:spawn_specific(
|
||||||
"ground",
|
"ground",
|
||||||
{
|
{
|
||||||
"Desert",
|
"Desert",
|
||||||
"SavannaM",
|
|
||||||
"Savanna",
|
|
||||||
"Savanna_beach",
|
|
||||||
},
|
},
|
||||||
0,
|
0,
|
||||||
7,
|
7,
|
||||||
|
@ -359,9 +354,6 @@ mobs:spawn_specific(
|
||||||
"ground",
|
"ground",
|
||||||
{
|
{
|
||||||
"Desert",
|
"Desert",
|
||||||
"SavannaM",
|
|
||||||
"Savanna",
|
|
||||||
"Savanna_beach",
|
|
||||||
},
|
},
|
||||||
0,
|
0,
|
||||||
7,
|
7,
|
||||||
|
|
|
@ -28,7 +28,7 @@ local function check_player(player)
|
||||||
end
|
end
|
||||||
|
|
||||||
mcl_weather.nether_dust.add_particlespawners = function(player)
|
mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||||
local name=player:get_player_name(name)
|
local name=player:get_player_name()
|
||||||
mcl_weather.nether_dust.particlespawners[name]={}
|
mcl_weather.nether_dust.particlespawners[name]={}
|
||||||
psdef.playername = name
|
psdef.playername = name
|
||||||
psdef.attached = player
|
psdef.attached = player
|
||||||
|
@ -40,7 +40,7 @@ mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||||
end
|
end
|
||||||
|
|
||||||
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
||||||
local name=player:get_player_name(name)
|
local name=player:get_player_name()
|
||||||
if mcl_weather.nether_dust.particlespawners[name] then
|
if mcl_weather.nether_dust.particlespawners[name] then
|
||||||
for i=1,3 do
|
for i=1,3 do
|
||||||
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
||||||
|
|
|
@ -31,6 +31,14 @@ doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def)
|
||||||
return ""
|
return ""
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- usable by shovels
|
||||||
|
doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def)
|
||||||
|
if def.groups.path_creation_possible then
|
||||||
|
return S("This block can be turned into grass path with a shovel.")
|
||||||
|
end
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
|
||||||
-- soil
|
-- soil
|
||||||
doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def)
|
doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def)
|
||||||
local datastring = ""
|
local datastring = ""
|
||||||
|
|
|
@ -21,9 +21,13 @@ minetest.register_chatcommand("awards", {
|
||||||
description = S("Show, clear, disable or enable your achievements"),
|
description = S("Show, clear, disable or enable your achievements"),
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
if param == "clear" then
|
if param == "clear" then
|
||||||
awards.clear_player(name)
|
if awards.player(name).disabled ~= nil then
|
||||||
minetest.chat_send_player(name,
|
minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!"))
|
||||||
S("All your awards and statistics have been cleared. You can now start again."))
|
else
|
||||||
|
awards.clear_player(name)
|
||||||
|
minetest.chat_send_player(name,
|
||||||
|
S("All your awards and statistics have been cleared. You can now start again."))
|
||||||
|
end
|
||||||
elseif param == "disable" then
|
elseif param == "disable" then
|
||||||
awards.disable(name)
|
awards.disable(name)
|
||||||
minetest.chat_send_player(name, S("You have disabled your achievements."))
|
minetest.chat_send_player(name, S("You have disabled your achievements."))
|
||||||
|
@ -31,9 +35,17 @@ minetest.register_chatcommand("awards", {
|
||||||
awards.enable(name)
|
awards.enable(name)
|
||||||
minetest.chat_send_player(name, S("You have enabled your achievements."))
|
minetest.chat_send_player(name, S("You have enabled your achievements."))
|
||||||
elseif param == "c" then
|
elseif param == "c" then
|
||||||
awards.show_to(name, name, nil, true)
|
if awards.player(name).disabled ~= nil then
|
||||||
|
minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!"))
|
||||||
|
else
|
||||||
|
awards.show_to(name, name, nil, true)
|
||||||
|
end
|
||||||
else
|
else
|
||||||
awards.show_to(name, name, nil, false)
|
if awards.player(name).disabled ~= nil then
|
||||||
|
minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!"))
|
||||||
|
else
|
||||||
|
awards.show_to(name, name, nil, false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
|
@ -61,3 +61,4 @@ Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht.
|
||||||
Write something in chat.=Schreiben Sie etwas in den Chat.
|
Write something in chat.=Schreiben Sie etwas in den Chat.
|
||||||
Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten.
|
Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten.
|
||||||
@1/@2 chat messages=@1/@2 Chatnachrichten
|
@1/@2 chat messages=@1/@2 Chatnachrichten
|
||||||
|
Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden!
|
|
@ -61,3 +61,4 @@ Achievement “@1” does not exist.=
|
||||||
@1 has made the achievement @2=
|
@1 has made the achievement @2=
|
||||||
Mine a block: @1=
|
Mine a block: @1=
|
||||||
Mine blocks: @1×@2=
|
Mine blocks: @1×@2=
|
||||||
|
Awards are disabled, enable them first by using /awards enable!=
|
||||||
|
|
|
@ -339,14 +339,6 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
||||||
if name == "inv" then
|
if name == "inv" then
|
||||||
inv_bg = "crafting_inventory_creative_survival.png"
|
inv_bg = "crafting_inventory_creative_survival.png"
|
||||||
|
|
||||||
-- Show armor and player image
|
|
||||||
local player_preview
|
|
||||||
if minetest.settings:get_bool("3d_player_preview", true) then
|
|
||||||
player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")
|
|
||||||
else
|
|
||||||
player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Background images for armor slots (hide if occupied)
|
-- Background images for armor slots (hide if occupied)
|
||||||
local armor_slot_imgs = ""
|
local armor_slot_imgs = ""
|
||||||
local inv = player:get_inventory()
|
local inv = player:get_inventory()
|
||||||
|
@ -385,7 +377,7 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
||||||
mcl_formspec.get_itemslot_bg(1.5,2.025,1,1)..
|
mcl_formspec.get_itemslot_bg(1.5,2.025,1,1)..
|
||||||
armor_slot_imgs..
|
armor_slot_imgs..
|
||||||
-- player preview
|
-- player preview
|
||||||
player_preview..
|
mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")..
|
||||||
-- crafting guide button
|
-- crafting guide button
|
||||||
"image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]"..
|
"image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]"..
|
||||||
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
|
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
|
||||||
|
|
|
@ -60,14 +60,6 @@ local function set_inventory(player, armor_change_only)
|
||||||
inv:set_width("craft", 2)
|
inv:set_width("craft", 2)
|
||||||
inv:set_size("craft", 4)
|
inv:set_size("craft", 4)
|
||||||
|
|
||||||
-- Show armor and player image
|
|
||||||
local player_preview
|
|
||||||
if minetest.settings:get_bool("3d_player_preview", true) then
|
|
||||||
player_preview = mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")
|
|
||||||
else
|
|
||||||
player_preview = "image[1.1,0.2;2,4;"..mcl_player.player_get_preview(player).."]"
|
|
||||||
end
|
|
||||||
|
|
||||||
local armor_slots = {"helmet", "chestplate", "leggings", "boots"}
|
local armor_slots = {"helmet", "chestplate", "leggings", "boots"}
|
||||||
local armor_slot_imgs = ""
|
local armor_slot_imgs = ""
|
||||||
for a=1,4 do
|
for a=1,4 do
|
||||||
|
@ -82,7 +74,7 @@ local function set_inventory(player, armor_change_only)
|
||||||
|
|
||||||
local form = "size[9,8.75]"..
|
local form = "size[9,8.75]"..
|
||||||
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
|
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
|
||||||
player_preview..
|
mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")..
|
||||||
--armor
|
--armor
|
||||||
"list[current_player;armor;0,0;1,1;1]"..
|
"list[current_player;armor;0,0;1,1;1]"..
|
||||||
"list[current_player;armor;0,1;1,1;2]"..
|
"list[current_player;armor;0,1;1,1;2]"..
|
||||||
|
|
|
@ -1,220 +0,0 @@
|
||||||
--[[ This mod registers 3 nodes:
|
|
||||||
- One node for the horizontal-facing dropper (mcl_droppers:dropper)
|
|
||||||
- One node for the upwards-facing droppers (mcl_droppers:dropper_up)
|
|
||||||
- One node for the downwards-facing droppers (mcl_droppers:dropper_down)
|
|
||||||
|
|
||||||
3 node definitions are needed because of the way the textures are defined.
|
|
||||||
All node definitions share a lot of code, so this is the reason why there
|
|
||||||
are so many weird tables below.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local S = minetest.get_translator(minetest.get_current_modname())
|
|
||||||
|
|
||||||
-- For after_place_node
|
|
||||||
local function setup_dropper(pos)
|
|
||||||
-- Set formspec and inventory
|
|
||||||
local form = "size[9,8.75]"..
|
|
||||||
"background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]"..
|
|
||||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
|
||||||
"list[current_player;main;0,4.5;9,3;9]"..
|
|
||||||
"list[current_player;main;0,7.74;9,1;]"..
|
|
||||||
"label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]"..
|
|
||||||
"list[context;main;3,0.5;3,3;]"..
|
|
||||||
"listring[context;main]"..
|
|
||||||
"listring[current_player;main]"
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
meta:set_string("formspec", form)
|
|
||||||
local inv = meta:get_inventory()
|
|
||||||
inv:set_size("main", 9)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function orientate_dropper(pos, placer)
|
|
||||||
-- Not placed by player
|
|
||||||
if not placer then return end
|
|
||||||
|
|
||||||
-- Pitch in degrees
|
|
||||||
local pitch = placer:get_look_vertical() * (180 / math.pi)
|
|
||||||
|
|
||||||
if pitch > 55 then
|
|
||||||
minetest.swap_node(pos, {name="mcl_droppers:dropper_up"})
|
|
||||||
elseif pitch < -55 then
|
|
||||||
minetest.swap_node(pos, {name="mcl_droppers:dropper_down"})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local on_rotate
|
|
||||||
if minetest.get_modpath("screwdriver") then
|
|
||||||
on_rotate = screwdriver.rotate_simple
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Shared core definition table
|
|
||||||
local dropperdef = {
|
|
||||||
is_ground_content = false,
|
|
||||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local meta2 = meta:to_table()
|
|
||||||
meta:from_table(oldmetadata)
|
|
||||||
local inv = meta:get_inventory()
|
|
||||||
for i=1, inv:get_size("main") do
|
|
||||||
local stack = inv:get_stack("main", i)
|
|
||||||
if not stack:is_empty() then
|
|
||||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
|
||||||
minetest.add_item(p, stack)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
meta:from_table(meta2)
|
|
||||||
end,
|
|
||||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
if minetest.is_protected(pos, name) then
|
|
||||||
minetest.record_protection_violation(pos, name)
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return count
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
if minetest.is_protected(pos, name) then
|
|
||||||
minetest.record_protection_violation(pos, name)
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return stack:get_count()
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
if minetest.is_protected(pos, name) then
|
|
||||||
minetest.record_protection_violation(pos, name)
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return stack:get_count()
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
_mcl_blast_resistance = 3.5,
|
|
||||||
_mcl_hardness = 3.5,
|
|
||||||
mesecons = {effector = {
|
|
||||||
-- Drop random item when triggered
|
|
||||||
action_on = function(pos, node)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local inv = meta:get_inventory()
|
|
||||||
local droppos
|
|
||||||
if node.name == "mcl_droppers:dropper" then
|
|
||||||
droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2))
|
|
||||||
elseif node.name == "mcl_droppers:dropper_up" then
|
|
||||||
droppos = {x=pos.x, y=pos.y+1, z=pos.z}
|
|
||||||
elseif node.name == "mcl_droppers:dropper_down" then
|
|
||||||
droppos = {x=pos.x, y=pos.y-1, z=pos.z}
|
|
||||||
end
|
|
||||||
local dropnode = minetest.get_node(droppos)
|
|
||||||
-- Do not drop into solid nodes, unless they are containers
|
|
||||||
local dropnodedef = minetest.registered_nodes[dropnode.name]
|
|
||||||
if dropnodedef.walkable and not dropnodedef.groups.container then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local stacks = {}
|
|
||||||
for i=1,inv:get_size("main") do
|
|
||||||
local stack = inv:get_stack("main", i)
|
|
||||||
if not stack:is_empty() then
|
|
||||||
table.insert(stacks, {stack = stack, stackpos = i})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if #stacks >= 1 then
|
|
||||||
local r = math.random(1, #stacks)
|
|
||||||
local stack = stacks[r].stack
|
|
||||||
local dropitem = ItemStack(stack)
|
|
||||||
dropitem:set_count(1)
|
|
||||||
local stack_id = stacks[r].stackpos
|
|
||||||
|
|
||||||
-- If it's a container, attempt to put it into the container
|
|
||||||
local dropped = mcl_util.move_item_container(pos, droppos, nil, stack_id)
|
|
||||||
-- No container?
|
|
||||||
if not dropped and not dropnodedef.groups.container then
|
|
||||||
-- Drop item normally
|
|
||||||
minetest.add_item(droppos, dropitem)
|
|
||||||
stack:take_item()
|
|
||||||
inv:set_stack("main", stack_id, stack)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
rules = mesecon.rules.alldirs,
|
|
||||||
}},
|
|
||||||
on_rotate = on_rotate,
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Horizontal dropper
|
|
||||||
|
|
||||||
local horizontal_def = table.copy(dropperdef)
|
|
||||||
horizontal_def.description = S("Dropper")
|
|
||||||
horizontal_def._doc_items_longdesc = S("A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.")
|
|
||||||
horizontal_def._doc_items_usagehelp = S("Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.")
|
|
||||||
|
|
||||||
function horizontal_def.after_place_node(pos, placer, itemstack, pointed_thing)
|
|
||||||
setup_dropper(pos)
|
|
||||||
orientate_dropper(pos, placer)
|
|
||||||
end
|
|
||||||
|
|
||||||
horizontal_def.tiles = {
|
|
||||||
"default_furnace_top.png", "default_furnace_bottom.png",
|
|
||||||
"default_furnace_side.png", "default_furnace_side.png",
|
|
||||||
"default_furnace_side.png", "mcl_droppers_dropper_front_horizontal.png",
|
|
||||||
}
|
|
||||||
horizontal_def.paramtype2 = "facedir"
|
|
||||||
horizontal_def.groups = {pickaxey=1, container=2, material_stone=1}
|
|
||||||
|
|
||||||
minetest.register_node("mcl_droppers:dropper", horizontal_def)
|
|
||||||
|
|
||||||
-- Down dropper
|
|
||||||
local down_def = table.copy(dropperdef)
|
|
||||||
down_def.description = S("Downwards-Facing Dropper")
|
|
||||||
down_def.after_place_node = setup_dropper
|
|
||||||
down_def.tiles = {
|
|
||||||
"default_furnace_top.png", "mcl_droppers_dropper_front_vertical.png",
|
|
||||||
"default_furnace_side.png", "default_furnace_side.png",
|
|
||||||
"default_furnace_side.png", "default_furnace_side.png",
|
|
||||||
}
|
|
||||||
down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1}
|
|
||||||
down_def._doc_items_create_entry = false
|
|
||||||
down_def.drop = "mcl_droppers:dropper"
|
|
||||||
minetest.register_node("mcl_droppers:dropper_down", down_def)
|
|
||||||
|
|
||||||
-- Up dropper
|
|
||||||
-- The up dropper is almost identical to the down dropper, it only differs in textures
|
|
||||||
local up_def = table.copy(down_def)
|
|
||||||
up_def.description = S("Upwards-Facing Dropper")
|
|
||||||
up_def.tiles = {
|
|
||||||
"mcl_droppers_dropper_front_vertical.png", "default_furnace_bottom.png",
|
|
||||||
"default_furnace_side.png", "default_furnace_side.png",
|
|
||||||
"default_furnace_side.png", "default_furnace_side.png",
|
|
||||||
}
|
|
||||||
minetest.register_node("mcl_droppers:dropper_up", up_def)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Ladies and gentlemen, I present to you: the crafting recipe!
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "mcl_droppers:dropper",
|
|
||||||
recipe = {
|
|
||||||
{"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",},
|
|
||||||
{"mcl_core:cobble", "", "mcl_core:cobble",},
|
|
||||||
{"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Add entry aliases for the Help
|
|
||||||
if minetest.get_modpath("doc") then
|
|
||||||
doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_down")
|
|
||||||
doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_up")
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_lbm({
|
|
||||||
label = "Update dropper formspecs (0.51.0)",
|
|
||||||
name = "mcl_droppers:update_formspecs_0_51_0",
|
|
||||||
nodenames = { "mcl_droppers:dropper", "mcl_droppers:dropper_down", "mcl_droppers:dropper_up" },
|
|
||||||
action = function(pos, node)
|
|
||||||
minetest.registered_nodes[node.name].on_construct(pos)
|
|
||||||
minetest.log("action", "[mcl_droppers] Node formspec updated at "..minetest.pos_to_string(pos))
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
|
@ -47,8 +47,6 @@ end
|
||||||
|
|
||||||
-- For nodes which ignore sticky sides.
|
-- For nodes which ignore sticky sides.
|
||||||
-- They can't be pulled by sticky pistons and don't interact with slime blocks.
|
-- They can't be pulled by sticky pistons and don't interact with slime blocks.
|
||||||
-- TODO: This has NOT any actual effect so far. The actual functionality
|
|
||||||
-- still needs to be implemented.
|
|
||||||
function mesecon.register_mvps_unsticky(nodename, get_unsticky)
|
function mesecon.register_mvps_unsticky(nodename, get_unsticky)
|
||||||
if get_unsticky == nil then
|
if get_unsticky == nil then
|
||||||
get_unsticky = true
|
get_unsticky = true
|
||||||
|
@ -66,9 +64,6 @@ function mesecon.is_mvps_unsticky(node, pulldir, stack, stackid)
|
||||||
if type(get_unsticky) == "function" then
|
if type(get_unsticky) == "function" then
|
||||||
get_unsticky = get_unsticky(node, pulldir, stack, stackid)
|
get_unsticky = get_unsticky(node, pulldir, stack, stackid)
|
||||||
end
|
end
|
||||||
if get_unsticky == nil then
|
|
||||||
get_unsticky = false
|
|
||||||
end
|
|
||||||
|
|
||||||
return get_unsticky
|
return get_unsticky
|
||||||
end
|
end
|
||||||
|
@ -211,7 +206,15 @@ function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon.mvps_pull_single(pos, dir, maximum, player_name, piston_pos)
|
function mesecon.mvps_pull_single(pos, dir, maximum, player_name, piston_pos)
|
||||||
return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos)
|
local nodes = mesecon.mvps_get_stack(pos, dir, maximum, player_name, piston_pos)
|
||||||
|
|
||||||
|
if not nodes then return end
|
||||||
|
-- ensure sticky pistons; even without slimeblocks attached adhere to the unpullable rule.
|
||||||
|
for id, n in ipairs(nodes) do
|
||||||
|
if not mesecon.is_mvps_unsticky(n.node, dir, nodes, id) then
|
||||||
|
return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- pos: pos of mvps; stackdir: direction of building the stack
|
-- pos: pos of mvps; stackdir: direction of building the stack
|
||||||
|
@ -357,13 +360,14 @@ function mesecon.mvps_move_objects(pos, dir, nodestack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Unmovable by design
|
-- Unmovable by design: nodes
|
||||||
mesecon.register_mvps_stopper("mcl_core:barrier")
|
mesecon.register_mvps_stopper("mcl_core:barrier")
|
||||||
mesecon.register_mvps_stopper("mcl_core:realm_barrier")
|
mesecon.register_mvps_stopper("mcl_core:realm_barrier")
|
||||||
mesecon.register_mvps_stopper("mcl_core:void")
|
mesecon.register_mvps_stopper("mcl_core:void")
|
||||||
mesecon.register_mvps_stopper("mcl_core:bedrock")
|
mesecon.register_mvps_stopper("mcl_core:bedrock")
|
||||||
mesecon.register_mvps_stopper("mcl_core:obsidian")
|
mesecon.register_mvps_stopper("mcl_core:obsidian")
|
||||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest")
|
mesecon.register_mvps_stopper("mcl_chests:ender_chest")
|
||||||
|
mesecon.register_mvps_stopper("mcl_chests:ender_chest_small")
|
||||||
mesecon.register_mvps_stopper("mcl_mobspawners:spawner")
|
mesecon.register_mvps_stopper("mcl_mobspawners:spawner")
|
||||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off")
|
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off")
|
||||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on")
|
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on")
|
||||||
|
@ -371,9 +375,18 @@ mesecon.register_mvps_stopper("mcl_portals:portal")
|
||||||
mesecon.register_mvps_stopper("mcl_portals:portal_end")
|
mesecon.register_mvps_stopper("mcl_portals:portal_end")
|
||||||
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame")
|
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame")
|
||||||
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye")
|
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye")
|
||||||
|
mesecon.register_mvps_stopper("mcl_enchanting:table")
|
||||||
|
mesecon.register_mvps_stopper("mcl_jukebox:jukebox")
|
||||||
|
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_on")
|
||||||
|
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_off")
|
||||||
|
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")
|
||||||
|
|
||||||
-- Unmovable by technical restrictions.
|
-- Unmovable by technical restrictions.
|
||||||
-- Open formspec would screw up if node is destroyed (minor problem)
|
-- Open formspec would screw up if node is destroyed (minor problem)
|
||||||
|
-- Would screw up on/off state of trapped chest (big problem)
|
||||||
mesecon.register_mvps_stopper("mcl_furnaces:furnace")
|
mesecon.register_mvps_stopper("mcl_furnaces:furnace")
|
||||||
mesecon.register_mvps_stopper("mcl_furnaces:furnace_active")
|
mesecon.register_mvps_stopper("mcl_furnaces:furnace_active")
|
||||||
mesecon.register_mvps_stopper("mcl_hoppers:hopper")
|
mesecon.register_mvps_stopper("mcl_hoppers:hopper")
|
||||||
|
@ -387,9 +400,39 @@ mesecon.register_mvps_stopper("mcl_dispensers:dispenser_down")
|
||||||
mesecon.register_mvps_stopper("mcl_anvils:anvil")
|
mesecon.register_mvps_stopper("mcl_anvils:anvil")
|
||||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1")
|
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1")
|
||||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2")
|
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2")
|
||||||
-- Would screw up on/off state of trapped chest (big problem)
|
mesecon.register_mvps_stopper("mcl_chests:chest")
|
||||||
|
mesecon.register_mvps_stopper("mcl_chests:chest_small")
|
||||||
|
mesecon.register_mvps_stopper("mcl_chests:chest_left")
|
||||||
|
mesecon.register_mvps_stopper("mcl_chests:chest_right")
|
||||||
|
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")
|
||||||
|
|
||||||
-- Glazed terracotta: unpullable
|
|
||||||
|
-- Unmovable by design: objects
|
||||||
|
mesecon.register_mvps_unmov("mcl_enchanting:book")
|
||||||
|
mesecon.register_mvps_unmov("mcl_chests:chest")
|
||||||
|
mesecon.register_mvps_unmov("mcl_banners:hanging_banner")
|
||||||
|
mesecon.register_mvps_unmov("mcl_banners:standing_banner")
|
||||||
|
mesecon.register_mvps_unmov("mcl_signs:text")
|
||||||
|
mesecon.register_mvps_unmov("mcl_mobspawners:doll")
|
||||||
|
mesecon.register_mvps_unmov("mcl_armor_stand:armor_entity")
|
||||||
|
mesecon.register_mvps_unmov("mcl_itemframes:item")
|
||||||
|
mesecon.register_mvps_unmov("mcl_itemframes:map")
|
||||||
|
mesecon.register_mvps_unmov("mcl_paintings:painting")
|
||||||
|
mesecon.register_mvps_unmov("mcl_end:crystal")
|
||||||
|
|
||||||
|
|
||||||
|
-- Unpullable by design: nodes
|
||||||
|
-- Glazed Terracotta
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow")
|
||||||
|
@ -406,6 +449,446 @@ mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_black")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_brown")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_brown")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink")
|
||||||
|
-- Beds
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_black_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_black_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_blue_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_blue_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_brown_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_brown_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_green_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_green_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_grey_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_grey_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_lime_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_lime_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_orange_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_orange_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_pink_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_pink_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_purple_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_purple_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_red_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_red_bottom")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_silver_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_beds:bed_silver_bottom")
|
||||||
|
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")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:vine")
|
||||||
|
-- Cake
|
||||||
|
mesecon.register_mvps_unsticky("mcl_cake:cake_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_cake:cake_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_cake:cake_3")
|
||||||
|
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")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:pumpkin")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:melon")
|
||||||
|
-- Chorus Plant & Flower
|
||||||
|
mesecon.register_mvps_unsticky("mcl_end:chorus_plant")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_end:chorus_flower")
|
||||||
|
-- Cobweb
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:cobweb")
|
||||||
|
-- Cocoa
|
||||||
|
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_3")
|
||||||
|
-- Doors
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_2")
|
||||||
|
-- Dragon Egg
|
||||||
|
mesecon.register_mvps_unsticky("mcl_end:dragon_egg")
|
||||||
|
-- Fire
|
||||||
|
mesecon.register_mvps_unsticky("mcl_fire:fire")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_fire:eternal_fire")
|
||||||
|
-- Flower Pots
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_allium")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_azure_bluet")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_blue_orchid")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_dandelion")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_fern")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_oxeye_daisy")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_poppy")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_orange")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_pink")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_red")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_white")
|
||||||
|
-- Flowers, Lilypad & Dead Bush
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:deadbush")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:allium")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:azure_bluet")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:blue_orchid")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:dandelion")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:double_fern")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:double_fern_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:fern")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:lilac")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:lilac_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:oxeye_daisy")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:peony")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:peony_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:poppy")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:rose_bush")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:rose_bush_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:sunflower")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:sunflower_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:tallgrass")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:double_grass")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:double_grass_top")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:tulip_orange")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:tulip_pink")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:tulip_red")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:tulip_white")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_flowers:waterlily")
|
||||||
|
-- Heads
|
||||||
|
mesecon.register_mvps_unsticky("mcl_heads:creeper")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_heads:skeleton")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_heads:steve")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_heads:wither_skeleton")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_heads:zombie")
|
||||||
|
-- Item Frame
|
||||||
|
mesecon.register_mvps_unsticky("mcl_itemframes:item_frame")
|
||||||
|
-- Ladder
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:ladder")
|
||||||
|
-- Lava & Water
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:lava_source")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:lava_flowing")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:water_source")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:water_flowing")
|
||||||
|
mesecon.register_mvps_unsticky("mclx_core:river_water_source")
|
||||||
|
mesecon.register_mvps_unsticky("mclx_core:river_water_flowing")
|
||||||
|
-- Leaves
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:leaves")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:acacialeaves")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:birchleaves")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:darkleaves")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:spruceleaves")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:jungleleaves")
|
||||||
|
-- Lever
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_on")
|
||||||
|
-- Mushrooms, Nether Wart & Amethyst
|
||||||
|
mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_brown")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_red")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_0")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_nether:nether_wart")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_amethyst:amethyst_cluster")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_amethyst:budding_amethyst_block")
|
||||||
|
-- Pressure Plates
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawood_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawoood_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucekwood_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucewood_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_off")
|
||||||
|
-- Redstone Comparators
|
||||||
|
mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_sub")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_sub")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_comp")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_comp")
|
||||||
|
-- Redstone Dust
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00000000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00000000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10000000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10000000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01000000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01000000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11000000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11000000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00100000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00100000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10100000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10100000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00010000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00010000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10010000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10010000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10001000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10001000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11001000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11001000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10101000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10101000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10011000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10011000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111000_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111000_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01000100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01000100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11000100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11000100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11001100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11001100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111100_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111100_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00100010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00100010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10100010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10100010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10101010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10101010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111010_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111010_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100110_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01100110_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100110_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11100110_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110110_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110110_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110110_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110110_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101110_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11101110_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111110_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111110_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00010001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00010001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10010001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10010001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10011001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10011001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111001_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111001_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010101_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01010101_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010101_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11010101_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110101_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110101_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110101_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110101_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011101_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11011101_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111101_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111101_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110011_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_00110011_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110011_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10110011_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110011_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110011_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110011_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110011_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111011_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_10111011_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111011_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111011_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110111_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_01110111_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110111_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11110111_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111111_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons:wire_11111111_off")
|
||||||
|
-- Redstone Repeater
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_1")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_2")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_3")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_4")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_1")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_2")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_3")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_4")
|
||||||
|
-- Redstone Torch
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on_wall")
|
||||||
|
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off_wall")
|
||||||
|
-- Sea Pickle
|
||||||
|
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_1_dead_brain_coral_block")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_2_dead_brain_coral_block")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_3_dead_brain_coral_block")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_4_dead_brain_coral_block")
|
||||||
|
-- Shulker chests
|
||||||
|
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: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:red_shulker_box_small")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_chests:silver_shulker_box_small")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_chests:white_shulker_box_small")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_chests:yellow_shulker_box_small")
|
||||||
|
-- Snow
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow_3")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow_4")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow_5")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow_6")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow_7")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_core:snow_8")
|
||||||
|
-- Torch
|
||||||
|
mesecon.register_mvps_unsticky("mcl_torches:torch")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_torches:torch_wall")
|
||||||
|
-- Wheat
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:wheat")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:wheat_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:wheat_3")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:wheat_4")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:wheat_5")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:wheat_6")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_farming:wheat_7")
|
||||||
|
|
||||||
-- Includes node heat when moving them
|
-- Includes node heat when moving them
|
||||||
mesecon.register_on_mvps_move(mesecon.move_hot_nodes)
|
mesecon.register_on_mvps_move(mesecon.move_hot_nodes)
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
local interval = 10
|
||||||
|
local chance = 5
|
||||||
|
|
||||||
|
local function grow(pos, node)
|
||||||
|
local def = minetest.registered_nodes[node.name]
|
||||||
|
local next_gen = def._mcl_amethyst_next_grade
|
||||||
|
if not next_gen then return end
|
||||||
|
|
||||||
|
local dir = minetest.wallmounted_to_dir(node.param2)
|
||||||
|
local ba_pos = vector.add(pos, dir)
|
||||||
|
local ba_node = minetest.get_node(ba_pos)
|
||||||
|
if ba_node.name ~= "mcl_amethyst:budding_amethyst_block" then return end
|
||||||
|
|
||||||
|
local swap_result = table.copy(node)
|
||||||
|
swap_result.name = next_gen
|
||||||
|
minetest.swap_node(pos, swap_result)
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
label = "Amethyst Bud Growth",
|
||||||
|
nodenames = {"group:amethyst_buds"},
|
||||||
|
neighbors = {"mcl_amethyst:budding_amethyst_block"},
|
||||||
|
interval = interval,
|
||||||
|
chance = chance,
|
||||||
|
action = grow,
|
||||||
|
})
|
||||||
|
|
||||||
|
local all_directions = {
|
||||||
|
vector.new(1, 0, 0),
|
||||||
|
vector.new(0, 1, 0),
|
||||||
|
vector.new(0, 0, 1),
|
||||||
|
vector.new(-1, 0, 0),
|
||||||
|
vector.new(0, -1, 0),
|
||||||
|
vector.new(0, 0, -1),
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
label = "Spawn Amethyst Bud",
|
||||||
|
nodenames = {"mcl_amethyst:budding_amethyst_block"},
|
||||||
|
neighbors = {"air", "group:water"},
|
||||||
|
interval = 20,
|
||||||
|
chance = 2,
|
||||||
|
action = function(pos)
|
||||||
|
local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos)
|
||||||
|
local check_node = minetest.get_node(check_pos)
|
||||||
|
local check_node_name = check_node.name
|
||||||
|
if check_node_name ~= "air" and minetest.get_item_group(check_node_name, "water") == 0 then return end
|
||||||
|
local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos))
|
||||||
|
local new_node = {name = "mcl_amethyst:small_amethyst_bud", param2 = param2}
|
||||||
|
minetest.swap_node(check_pos, new_node)
|
||||||
|
end,
|
||||||
|
})
|
|
@ -0,0 +1,220 @@
|
||||||
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
|
||||||
|
local sounds = mcl_sounds.node_sound_glass_defaults({
|
||||||
|
footstep = {name = "mcl_amethyst_amethyst_walk", gain = 0.4},
|
||||||
|
dug = {name = "mcl_amethyst_amethyst_break", gain = 0.44},
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Amethyst block
|
||||||
|
minetest.register_node("mcl_amethyst:amethyst_block",{
|
||||||
|
description = S("Block of Amethyst"),
|
||||||
|
_doc_items_longdesc = S("The Block of Amethyst is a decoration block crafted from amethyst shards."),
|
||||||
|
tiles = {"mcl_amethyst_amethyst_block.png"},
|
||||||
|
groups = {pickaxey = 1, building_block = 1},
|
||||||
|
sounds = sounds,
|
||||||
|
is_ground_content = true,
|
||||||
|
_mcl_hardness = 1.5,
|
||||||
|
_mcl_blast_resistance = 1.5,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node("mcl_amethyst:budding_amethyst_block",{
|
||||||
|
description = S("Budding Amethyst"),
|
||||||
|
_doc_items_longdesc = S("The Budding Amethyst can grow amethyst"),
|
||||||
|
tiles = {"mcl_amethyst_budding_amethyst.png"},
|
||||||
|
drop = "",
|
||||||
|
groups = {
|
||||||
|
pickaxey = 1,
|
||||||
|
building_block = 1,
|
||||||
|
dig_by_piston = 1,
|
||||||
|
},
|
||||||
|
sounds = sounds,
|
||||||
|
is_ground_content = true,
|
||||||
|
_mcl_hardness = 1.5,
|
||||||
|
_mcl_blast_resistance = 1.5,
|
||||||
|
})
|
||||||
|
|
||||||
|
mcl_wip.register_wip_item("mcl_amethyst:budding_amethyst_block")
|
||||||
|
|
||||||
|
-- Amethyst Shard
|
||||||
|
minetest.register_craftitem("mcl_amethyst:amethyst_shard",{
|
||||||
|
description = S("Amethyst Shard"),
|
||||||
|
_doc_items_longdesc = S("An amethyst shard is a crystalline mineral."),
|
||||||
|
inventory_image = "mcl_amethyst_amethyst_shard.png",
|
||||||
|
groups = {craftitem = 1},
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Calcite
|
||||||
|
minetest.register_node("mcl_amethyst:calcite",{
|
||||||
|
description = S("Calcite"),
|
||||||
|
_doc_items_longdesc = S("Calcite can be found as part of amethyst geodes."),
|
||||||
|
tiles = {"mcl_amethyst_calcite_block.png"},
|
||||||
|
groups = {pickaxey = 1, building_block = 1},
|
||||||
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||||
|
is_ground_content = true,
|
||||||
|
_mcl_hardness = 0.75,
|
||||||
|
_mcl_blast_resistance = 0.75,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Tinied Glass
|
||||||
|
minetest.register_node("mcl_amethyst:tinted_glass",{
|
||||||
|
description = S("Tinted Glass"),
|
||||||
|
_doc_items_longdesc = S("Tinted Glass is a type of glass which blocks lights while it is visually transparent."),
|
||||||
|
tiles = {"mcl_amethyst_tinted_glass.png"},
|
||||||
|
_mcl_hardness = 0.3,
|
||||||
|
_mcl_blast_resistance = 0.3,
|
||||||
|
drawtype = "glasslike",
|
||||||
|
use_texture_alpha = "blend",
|
||||||
|
sunlight_propagates = false,
|
||||||
|
groups = {handy = 1, building_block = 1, deco_block = 1},
|
||||||
|
sounds = mcl_sounds.node_sound_glass_defaults(),
|
||||||
|
is_ground_content = false,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Amethyst Cluster
|
||||||
|
local bud_def = {
|
||||||
|
{
|
||||||
|
size = "small",
|
||||||
|
description = S("Small Amethyst Bud"),
|
||||||
|
long_desc = S("Small Amethyst Bud is the first growth of amethyst bud."),
|
||||||
|
light_source = 3,
|
||||||
|
next_stage = "mcl_amethyst:medium_amethyst_bud",
|
||||||
|
selection_box = { -4/16, -7/16, -4/16, 4/16, -3/16, 4/16 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
size = "medium",
|
||||||
|
description = S("Medium Amethyst Bud"),
|
||||||
|
long_desc = S("Medium Amethyst Bud is the second growth of amethyst bud."),
|
||||||
|
light_source = 4,
|
||||||
|
next_stage = "mcl_amethyst:large_amethyst_bud",
|
||||||
|
selection_box = { -4.5/16, -8/16, -4.5/16, 4.5/16, -2/16, 4.5/16 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
size = "large",
|
||||||
|
description = S("Large Amethyst Bud"),
|
||||||
|
long_desc = S("Large Amethyst Bud is the third growth of amethyst bud."),
|
||||||
|
light_source = 5,
|
||||||
|
next_stage = "mcl_amethyst:amethyst_cluster",
|
||||||
|
selection_box = { -4.5/16, -8/16, -4.5/16, 4.5/16, -1/16, 4.5/16 },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, def in pairs(bud_def) do
|
||||||
|
local size = def.size
|
||||||
|
local name = "mcl_amethyst:" .. size .. "_amethyst_bud"
|
||||||
|
local tile = "mcl_amethyst_amethyst_bud_" .. size .. ".png"
|
||||||
|
local inventory_image = "mcl_amethyst_amethyst_bud_" .. size .. ".png"
|
||||||
|
minetest.register_node(name, {
|
||||||
|
description = def.description,
|
||||||
|
_doc_items_longdesc = def.longdesc,
|
||||||
|
drop = "",
|
||||||
|
tiles = {tile},
|
||||||
|
inventory_image = inventory_image,
|
||||||
|
paramtype1 = "light",
|
||||||
|
paramtype2 = "wallmounted",
|
||||||
|
drawtype = "plantlike",
|
||||||
|
use_texture_alpha = "clip",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
walkable = false,
|
||||||
|
light_source = def.light_source,
|
||||||
|
groups = {
|
||||||
|
dig_by_water = 1,
|
||||||
|
destroy_by_lava_flow = 1,
|
||||||
|
dig_by_piston = 1,
|
||||||
|
pickaxey = 1,
|
||||||
|
deco_block = 1,
|
||||||
|
amethyst_buds = 1,
|
||||||
|
attached_node = 1,
|
||||||
|
},
|
||||||
|
sounds = sounds,
|
||||||
|
selection_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = def.selection_box
|
||||||
|
},
|
||||||
|
_mcl_hardness = 1.5,
|
||||||
|
_mcl_blast_resistance = 1.5,
|
||||||
|
_mcl_silk_touch_drop = true,
|
||||||
|
_mcl_amethyst_next_grade = def.next_stage,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_node("mcl_amethyst:amethyst_cluster",{
|
||||||
|
description = S("Amethyst Cluster"),
|
||||||
|
_doc_items_longdesc = S("Amethyst Cluster is the final growth of amethyst bud."),
|
||||||
|
drop = {
|
||||||
|
max_items = 1,
|
||||||
|
items = {
|
||||||
|
{
|
||||||
|
tools = {"~mcl_tools:pick_"},
|
||||||
|
items = {"mcl_amethyst:amethyst_shard 4"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
items = {"mcl_amethyst:amethyst_shard 2"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tiles = {"mcl_amethyst_amethyst_cluster.png",},
|
||||||
|
inventory_image = "mcl_amethyst_amethyst_cluster.png",
|
||||||
|
paramtype2 = "wallmounted",
|
||||||
|
drawtype = "plantlike",
|
||||||
|
paramtype1 = "light",
|
||||||
|
use_texture_alpha = "clip",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
walkable = false,
|
||||||
|
light_source = 7,
|
||||||
|
groups = {
|
||||||
|
dig_by_water = 1,
|
||||||
|
destroy_by_lava_flow = 1,
|
||||||
|
dig_by_piston = 1,
|
||||||
|
pickaxey = 1,
|
||||||
|
deco_block = 1,
|
||||||
|
attached_node = 1,
|
||||||
|
},
|
||||||
|
sounds = sounds,
|
||||||
|
selection_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = { -4.8/16, -8/16, -4.8/16, 4.8/16, 3.9/16, 4.8/16 },
|
||||||
|
},
|
||||||
|
_mcl_hardness = 1.5,
|
||||||
|
_mcl_blast_resistance = 1.5,
|
||||||
|
_mcl_silk_touch_drop = true,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Register Crafts
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "mcl_amethyst:amethyst_block",
|
||||||
|
recipe = {
|
||||||
|
{"mcl_amethyst:amethyst_shard", "mcl_amethyst:amethyst_shard"},
|
||||||
|
{"mcl_amethyst:amethyst_shard", "mcl_amethyst:amethyst_shard"},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "mcl_amethyst:tinted_glass 2",
|
||||||
|
recipe = {
|
||||||
|
{"", "mcl_amethyst:amethyst_shard", ""},
|
||||||
|
{"mcl_amethyst:amethyst_shard", "mcl_core:glass", "mcl_amethyst:amethyst_shard",},
|
||||||
|
{"", "mcl_amethyst:amethyst_shard", ""},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if minetest.get_modpath("mcl_spyglass") then
|
||||||
|
minetest.clear_craft({output = "mcl_spyglass:spyglass",})
|
||||||
|
local function craft_spyglass(ingot)
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "mcl_spyglass:spyglass",
|
||||||
|
recipe = {
|
||||||
|
{"mcl_amethyst:amethyst_shard"},
|
||||||
|
{ingot},
|
||||||
|
{ingot},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
if minetest.get_modpath("mcl_copper") then
|
||||||
|
craft_spyglass("mcl_copper:copper_ingot")
|
||||||
|
else
|
||||||
|
craft_spyglass("mcl_core:iron_ingot")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Amethyst Growing
|
||||||
|
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/grow.lua")
|
|
@ -0,0 +1,19 @@
|
||||||
|
# textdomain: mcl_amethyst
|
||||||
|
Amethyst Cluster=Agrégat d'améthyste
|
||||||
|
Amethyst Cluster is the final growth of amethyst bud.=L'agrégat d'améthyste est le stade final de la croissance du bourgeon d'améthyste.
|
||||||
|
Amethyst Shard=Éclat d'améthyste
|
||||||
|
An amethyst shard is a crystalline mineral.=Un éclat d'améthyste est un minéral cristallin.
|
||||||
|
Block of Amethyst=Bloc d'améthyste
|
||||||
|
Budding Amethyst=Améthyste bourgeonante
|
||||||
|
Calcite=Calcite
|
||||||
|
Calcite can be found as part of amethyst geodes.=La calcite peut être trouvée dans les géodes d'améthyste.
|
||||||
|
Large Amethyst Bud=Grand bourgeon d'améthyste
|
||||||
|
Large Amethyst Bud is the third growth of amethyst bud.=Le grand bourgeon d'améthyste est le troisième stade de la croissance du bourgeon d'améthyste.
|
||||||
|
Medium Amethyst Bud=Bourgeon d'améthyste moyen
|
||||||
|
Medium Amethyst Bud is the second growth of amethyst bud.=Le bourgeon d'améthyste moyen est le deuxième stade de la croissance du bourgeon d'améthyste.
|
||||||
|
Small Amethyst Bud=Petit bourgeon d'améthyste
|
||||||
|
Small Amethyst Bud is the first growth of amethyst bud.=Le petit bourgeon d'améthyste est le premier stade de la croissance du bourgeon d'améthyste.
|
||||||
|
The Block of Amethyst is a decoration block crafted from amethyst shards.=Le bloc d'améthyste est un bloc décoratif fabriqué à partir d'éclats d'améthyste.
|
||||||
|
The Budding Amethyst can grow amethyst=L'améthyste bourgeonante peut faire croître de l'améthyste.
|
||||||
|
Tinted Glass=Verre teinté
|
||||||
|
Tinted Glass is a type of glass which blocks lights while it is visually transparent.=Le verre teinté est un type de verre qui bloque la lumière tout en étant visuellement transparent.
|
|
@ -0,0 +1,19 @@
|
||||||
|
# textdomain: mcl_amethyst
|
||||||
|
Amethyst Cluster=Аметистовая друза
|
||||||
|
Amethyst Cluster is the final growth of amethyst bud.=Аметистовая друза - это последняя 4-я стадия роста аметистового бутона.
|
||||||
|
Amethyst Shard=Осколок аметиста
|
||||||
|
An amethyst shard is a crystalline mineral.=Осколок аметиста - это кристаллический минерал, получаемый в результате разрушения кластеров аметиста.
|
||||||
|
Block of Amethyst=Аметистовый блок
|
||||||
|
Budding Amethyst=Растущий аметист
|
||||||
|
Calcite=Кальцит
|
||||||
|
Calcite can be found as part of amethyst geodes.=Кальцит можно найти в составе аметистовых жеод.
|
||||||
|
Large Amethyst Bud=Большой росток аметиста
|
||||||
|
Large Amethyst Bud is the third growth of amethyst bud.=Большой росток - третья стадия роста аметиста.
|
||||||
|
Medium Amethyst Bud=Средний росток аметиста
|
||||||
|
Medium Amethyst Bud is the second growth of amethyst bud.=Средний росток - вторая стадия роста аметиста.
|
||||||
|
Small Amethyst Bud=Маленький росток аметиста
|
||||||
|
Small Amethyst Bud is the first growth of amethyst bud.=Маленький росток - первая стадия роста аметиста.
|
||||||
|
The Block of Amethyst is a decoration block crafted from amethyst shards.=Блок аметиста - декоративный блок, скрафченный из осколков аметиста.
|
||||||
|
The Budding Amethyst can grow amethyst=Растущий аметист может вырастить аметист
|
||||||
|
Tinted Glass=Тонированное стекло
|
||||||
|
Tinted Glass is a type of glass which blocks lights while it is visually transparent.=Тонированное стекло блокирует свет, но визуально прозрачно.
|
|
@ -0,0 +1,19 @@
|
||||||
|
# textdomain: mcl_amethyst
|
||||||
|
Amethyst Cluster=
|
||||||
|
Amethyst Cluster is the final growth of amethyst bud.=
|
||||||
|
Amethyst Shard=
|
||||||
|
An amethyst shard is a crystalline mineral.=
|
||||||
|
Block of Amethyst=
|
||||||
|
Budding Amethyst=
|
||||||
|
Calcite=
|
||||||
|
Calcite can be found as part of amethyst geodes.=
|
||||||
|
Large Amethyst Bud=
|
||||||
|
Large Amethyst Bud is the third growth of amethyst bud.=
|
||||||
|
Medium Amethyst Bud=
|
||||||
|
Medium Amethyst Bud is the second growth of amethyst bud.=
|
||||||
|
Small Amethyst Bud=
|
||||||
|
Small Amethyst Bud is the first growth of amethyst bud.=
|
||||||
|
The Block of Amethyst is a decoration block crafted from amethyst shards.=
|
||||||
|
The Budding Amethyst can grow amethyst=
|
||||||
|
Tinted Glass=
|
||||||
|
Tinted Glass is a type of glass which blocks lights while it is visually transparent.=
|
|
@ -0,0 +1,5 @@
|
||||||
|
name = mcl_amethyst
|
||||||
|
author = Emojiminetest, kay27
|
||||||
|
description = Amethyst related stuff
|
||||||
|
depends = mcl_init, mcl_core, mcl_wip
|
||||||
|
optional_depends = mcl_spyglass, mcl_copper
|
|
@ -0,0 +1 @@
|
||||||
|
Nova_Wostra Creative Commons Attribution-Share Alike 4.0 International License https://creativecommons.org/licenses/by-sa/4.0/
|
After Width: | Height: | Size: 7.2 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 6.6 KiB |
After Width: | Height: | Size: 6.2 KiB |
|
@ -87,16 +87,6 @@ mcl_armor.register_set({
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
--WARNING: 2d preview is deprecated and will be removed soon
|
|
||||||
--specify textures that will be shown in player inventory then you disabled the 3d player inventory preview
|
|
||||||
--its similar to how works the textures field
|
|
||||||
previews = {
|
|
||||||
head = "dummy_texture.png", --default: "<modname>_helmet_<material>_preview.png"
|
|
||||||
torso = "dummy_texture.png", --default: "<modname>_chestplate_<material>_preview.png"
|
|
||||||
legs = "dummy_texture.png", --default: "<modname>_leggings_<material>_preview.png"
|
|
||||||
feet = "dummy_texture.png", --default: "<modname>_boots_<material>_preview.png"
|
|
||||||
},
|
|
||||||
|
|
||||||
--inventory textures aren't definable using a table similar to textures or previews
|
--inventory textures aren't definable using a table similar to textures or previews
|
||||||
--you are forced to use the default texture names which are:
|
--you are forced to use the default texture names which are:
|
||||||
--head: "<modname>_inv_helmet_<material>.png
|
--head: "<modname>_inv_helmet_<material>.png
|
||||||
|
|
|
@ -94,7 +94,6 @@ function mcl_armor.register_set(def)
|
||||||
local on_unequip_callbacks = def.on_unequip_callbacks or {}
|
local on_unequip_callbacks = def.on_unequip_callbacks or {}
|
||||||
local on_break_callbacks = def.on_break_callbacks or {}
|
local on_break_callbacks = def.on_break_callbacks or {}
|
||||||
local textures = def.textures or {}
|
local textures = def.textures or {}
|
||||||
local previews = def.previews or {}
|
|
||||||
local durabilities = def.durabilities or {}
|
local durabilities = def.durabilities or {}
|
||||||
local element_groups = def.element_groups or {}
|
local element_groups = def.element_groups or {}
|
||||||
|
|
||||||
|
@ -134,7 +133,6 @@ function mcl_armor.register_set(def)
|
||||||
_on_break = on_break_callbacks[name] or def.on_break,
|
_on_break = on_break_callbacks[name] or def.on_break,
|
||||||
_mcl_armor_element = name,
|
_mcl_armor_element = name,
|
||||||
_mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png",
|
_mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png",
|
||||||
_mcl_armor_preview = previews[name] or modname .. "_" .. itemname .. "_preview.png",
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if def.craft_material then
|
if def.craft_material then
|
||||||
|
@ -221,17 +219,6 @@ function mcl_armor.update(obj)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local preview = def._mcl_armor_preview
|
|
||||||
|
|
||||||
if obj:is_player() and preview then
|
|
||||||
if type(preview) == "function" then
|
|
||||||
preview = preview(obj, itemstack)
|
|
||||||
end
|
|
||||||
if preview then
|
|
||||||
info.preview = "(player.png^[opacity:0^" .. def._mcl_armor_preview .. ")" .. (info.preview and "^" .. info.preview or "" )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points")
|
info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points")
|
||||||
|
|
||||||
local mob_range_mob = def._mcl_armor_mob_range_mob
|
local mob_range_mob = def._mcl_armor_mob_range_mob
|
||||||
|
@ -254,8 +241,6 @@ function mcl_armor.update(obj)
|
||||||
info.texture = info.texture or "blank.png"
|
info.texture = info.texture or "blank.png"
|
||||||
|
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
info.preview = info.preview or "blank.png"
|
|
||||||
|
|
||||||
mcl_armor.update_player(obj, info)
|
mcl_armor.update_player(obj, info)
|
||||||
else
|
else
|
||||||
local luaentity = obj:get_luaentity()
|
local luaentity = obj:get_luaentity()
|
||||||
|
|
|
@ -63,7 +63,7 @@ mcl_player.player_register_model("mcl_armor_character_female.b3d", {
|
||||||
})
|
})
|
||||||
|
|
||||||
function mcl_armor.update_player(player, info)
|
function mcl_armor.update_player(player, info)
|
||||||
mcl_player.player_set_armor(player, info.texture, info.preview)
|
mcl_player.player_set_armor(player, info.texture)
|
||||||
|
|
||||||
local meta = player:get_meta()
|
local meta = player:get_meta()
|
||||||
meta:set_int("mcl_armor:armor_points", info.points)
|
meta:set_int("mcl_armor:armor_points", info.points)
|
||||||
|
|
Before Width: | Height: | Size: 156 B |
Before Width: | Height: | Size: 157 B |
Before Width: | Height: | Size: 150 B |
Before Width: | Height: | Size: 140 B |
Before Width: | Height: | Size: 131 B |
Before Width: | Height: | Size: 255 B |
Before Width: | Height: | Size: 210 B |
Before Width: | Height: | Size: 202 B |
Before Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 150 B |
Before Width: | Height: | Size: 149 B |
Before Width: | Height: | Size: 208 B |
Before Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 147 B |
Before Width: | Height: | Size: 133 B |
Before Width: | Height: | Size: 197 B |
Before Width: | Height: | Size: 171 B |
Before Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 165 B |
|
@ -10,3 +10,4 @@ local modpath = minetest.get_modpath("mcl_beds")
|
||||||
dofile(modpath .. "/functions.lua")
|
dofile(modpath .. "/functions.lua")
|
||||||
dofile(modpath .. "/api.lua")
|
dofile(modpath .. "/api.lua")
|
||||||
dofile(modpath .. "/beds.lua")
|
dofile(modpath .. "/beds.lua")
|
||||||
|
dofile(modpath .. "/respawn_anchor.lua")
|
|
@ -40,3 +40,4 @@ You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn a
|
||||||
You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind.
|
You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind.
|
||||||
You're in bed.=Sie sind im Bett.
|
You're in bed.=Sie sind im Bett.
|
||||||
Allows you to sleep=Zum Einschafen
|
Allows you to sleep=Zum Einschafen
|
||||||
|
Respawn Anchor=Seelenanker
|
|
@ -40,3 +40,4 @@ You will fall asleep when all players are in bed.=
|
||||||
You will fall asleep when @1% of all players are in bed.=
|
You will fall asleep when @1% of all players are in bed.=
|
||||||
You're in bed.=
|
You're in bed.=
|
||||||
Allows you to sleep=
|
Allows you to sleep=
|
||||||
|
Respawn Anchor=
|
||||||
|
|
|
@ -2,4 +2,4 @@ name = mcl_beds
|
||||||
author = BlockMen
|
author = BlockMen
|
||||||
description =
|
description =
|
||||||
depends = playerphysics
|
depends = playerphysics
|
||||||
optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc
|
optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mesecon
|
|
@ -0,0 +1,96 @@
|
||||||
|
--TODO: Add sounds for the respawn anchor (charge sounds etc.)
|
||||||
|
|
||||||
|
--Nether ends at y -29077
|
||||||
|
--Nether roof at y -28933
|
||||||
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
--local mod_doc = minetest.get_modpath("doc") -> maybe add documentation ?
|
||||||
|
|
||||||
|
for i=0,4 do
|
||||||
|
local nodebox_uncharged = { --Reused the composter nodebox, since it is basicly the same
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||||
|
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||||
|
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||||
|
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||||
|
{-0.5, -0.5, -0.5, 0.5, -0.47, 0.5}, -- Bottom level, -0.47 because -0.5 is so low that you can see the texture of the block below through
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local nodebox_charged = { --Reused the composter nodebox, since it is basicly the same
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||||
|
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||||
|
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||||
|
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||||
|
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local function rightclick(pos, node, player, itemstack)
|
||||||
|
if itemstack.get_name(itemstack) == "mcl_nether:glowstone" and i ~= 4 then
|
||||||
|
minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_" .. i+1})
|
||||||
|
itemstack:take_item()
|
||||||
|
elseif mcl_worlds.pos_to_dimension(pos) ~= "nether" then
|
||||||
|
if node.name ~= "mcl_beds:respawn_anchor" then --only charged respawn anchors are exploding in the overworld & end in minecraft
|
||||||
|
mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true})
|
||||||
|
end
|
||||||
|
elseif string.match(node.name, "mcl_beds:respawn_anchor_charged_") then
|
||||||
|
minetest.chat_send_player(player.get_player_name(player), S"New respawn position set!")
|
||||||
|
mcl_spawn.set_spawn_pos(player, pos, nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if i == 0 then
|
||||||
|
minetest.register_node("mcl_beds:respawn_anchor",{
|
||||||
|
description=S("Respawn Anchor"),
|
||||||
|
tiles = {
|
||||||
|
"respawn_anchor_top_off.png",
|
||||||
|
"respawn_anchor_bottom.png",
|
||||||
|
"respawn_anchor_side0.png"
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
node_box = nodebox_uncharged,
|
||||||
|
on_rightclick = rightclick,
|
||||||
|
groups = {pickaxey=1, material_stone=1},
|
||||||
|
_mcl_hardness = 22.5,
|
||||||
|
sounds= mcl_sounds.node_sound_stone_defaults(),
|
||||||
|
})
|
||||||
|
mesecon.register_mvps_stopper("mcl_beds:respawn_anchor")
|
||||||
|
else
|
||||||
|
minetest.register_node("mcl_beds:respawn_anchor_charged_"..i,{
|
||||||
|
description=S("Respawn Anchor"),
|
||||||
|
tiles = {
|
||||||
|
"portal.png",
|
||||||
|
"respawn_anchor_bottom.png",
|
||||||
|
"respawn_anchor_side"..i ..".png"
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
node_box = nodebox_charged,
|
||||||
|
on_rightclick = rightclick,
|
||||||
|
groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1},
|
||||||
|
_mcl_hardness = 22.5,
|
||||||
|
sounds= mcl_sounds.node_sound_stone_defaults(),
|
||||||
|
drop = {
|
||||||
|
max_items = 1,
|
||||||
|
items = {
|
||||||
|
{items = {"mcl_beds:respawn_anchor"}},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
light_source = (4 * i) - 1
|
||||||
|
})
|
||||||
|
mesecon.register_mvps_stopper("mcl_beds:respawn_anchor_charged_"..i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
minetest.register_craft({ --TODO: Please change this crafting recipe once crying obsidian is implemented!
|
||||||
|
output = "mcl_beds:respawn_anchor",
|
||||||
|
recipe = {
|
||||||
|
{"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"},
|
||||||
|
{"mcl_nether:glowstone", "mcl_nether:glowstone", "mcl_nether:glowstone"},
|
||||||
|
{"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}
|
||||||
|
}
|
||||||
|
})
|
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 6.6 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.7 KiB |