Compare commits
33 Commits
master
...
dyable-lea
Author | SHA1 | Date |
---|---|---|
AFCMS | 1504d64647 | |
AFCMS | 132529d8f4 | |
AFCMS | a3d2761215 | |
AFCMS | 0e42e58901 | |
AFCMS | f6f0690253 | |
AFCMS | a7484b1389 | |
AFCMS | 56d14619cd | |
AFCMS | 459f142fc5 | |
AFCMS | d9fef2966f | |
AFCMS | 126d74b428 | |
AFCMS | b4611dc20f | |
AFCMS | 95e165b50b | |
AFCMS | 45ca8dfbfb | |
AFCMS | 39481d8b10 | |
AFCMS | 422d48f658 | |
AFCMS | c1eefab8d6 | |
AFCMS | e573dd25e1 | |
AFCMS | 98226d677c | |
AFCMS | 547291c333 | |
AFCMS | 5637b649e8 | |
AFCMS | 16b4a6e5c2 | |
AFCMS | fb0a687bdc | |
AFCMS | 2aa7218126 | |
AFCMS | e0aa16cf06 | |
AFCMS | 69629d4ca3 | |
AFCMS | e7166430d7 | |
AFCMS | 31027aca2e | |
AFCMS | 9990db92b4 | |
AFCMS | c1ea059a14 | |
AFCMS | a01813e421 | |
AFCMS | d7ae8c62db | |
AFCMS | 2d585c9517 | |
AFCMS | 896b213f17 |
|
@ -102,7 +102,6 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
|||
* `water_bucket=1`: Bucket containing a liquid of group “water”
|
||||
* `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
|
||||
* `cobble=1`: Cobblestone of any kind
|
||||
|
||||
### Material groups
|
||||
|
||||
|
|
|
@ -418,11 +418,7 @@ minetest.register_entity(":__builtin:item", {
|
|||
end
|
||||
local stack = ItemStack(itemstring)
|
||||
if minetest.get_item_group(stack:get_name(), "compass") > 0 then
|
||||
if string.find(stack:get_name(), "_lodestone") then
|
||||
stack:set_name("mcl_compass:18_lodestone")
|
||||
else
|
||||
stack:set_name("mcl_compass:18")
|
||||
end
|
||||
stack:set_name("mcl_compass:16")
|
||||
itemstring = stack:to_string()
|
||||
self.itemstring = itemstring
|
||||
end
|
||||
|
|
|
@ -1,204 +1,180 @@
|
|||
--lua locals
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
||||
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 new_vector = vector.new
|
||||
local math_random = math.random
|
||||
local math_floor = math.floor
|
||||
local math_ceil = math.ceil
|
||||
local math_cos = math.cos
|
||||
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
|
||||
local get_biome_name = minetest.get_biome_name
|
||||
local max = math.max
|
||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||
local vector_distance = vector.distance
|
||||
|
||||
-- range for mob count
|
||||
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
|
||||
-- count how many mobs of one type are inside an area
|
||||
|
||||
|
||||
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 count_mobs = function(pos,mobtype)
|
||||
local num = 0
|
||||
for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do
|
||||
if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then
|
||||
num = num + 1
|
||||
local objs = get_objects_inside_radius(pos, aoc_range)
|
||||
for n = 1, #objs do
|
||||
local obj = objs[n]:get_luaentity()
|
||||
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
|
||||
|
||||
return num
|
||||
end
|
||||
|
||||
|
@ -239,73 +215,11 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
|
|||
|
||||
--this is where all of the spawning information is kept
|
||||
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)
|
||||
|
||||
--print(dump(biomes))
|
||||
|
||||
-- Do mobs spawn at all?
|
||||
if not mobs_spawn then
|
||||
return
|
||||
|
@ -324,7 +238,180 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
|||
return
|
||||
end
|
||||
|
||||
minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||
minetest.log("action",
|
||||
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
|
||||
|
||||
--load information into the spawn dictionary
|
||||
|
@ -336,34 +423,106 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
|||
spawn_dictionary[key]["biomes"] = biomes
|
||||
spawn_dictionary[key]["min_light"] = min_light
|
||||
spawn_dictionary[key]["max_light"] = max_light
|
||||
spawn_dictionary[key]["interval"] = interval
|
||||
spawn_dictionary[key]["chance"] = chance
|
||||
spawn_dictionary[key]["aoc"] = aoc
|
||||
spawn_dictionary[key]["min_height"] = min_height
|
||||
spawn_dictionary[key]["max_height"] = max_height
|
||||
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
|
||||
|
||||
local two_pi = 2 * math.pi
|
||||
local function get_next_mob_spawn_pos(pos)
|
||||
local distance = math_random(25, 32)
|
||||
local angle = math_random() * two_pi
|
||||
return {
|
||||
x = math_round(pos.x + distance * math_cos(angle)),
|
||||
y = pos.y,
|
||||
z = math_round(pos.z + distance * math_sin(angle))
|
||||
}
|
||||
-- compatibility with older mob registration
|
||||
-- we're going to forget about this for now -j4i
|
||||
--[[
|
||||
function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle)
|
||||
|
||||
mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30,
|
||||
chance, active_object_count, -31000, max_height, day_toggle)
|
||||
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)
|
||||
posy = math_floor(posy)
|
||||
--local min_max_table = decypher_limits_dictionary[dimension]
|
||||
--return min_max_table[1],min_max_table[2]
|
||||
posy = math.floor(posy)
|
||||
return posy - 32, posy + 32
|
||||
end
|
||||
|
||||
--a simple helper function for mob_spawn
|
||||
local function biome_check(biome_list, biome_goal)
|
||||
for _, data in pairs(biome_list) do
|
||||
for _,data in ipairs(biome_list) do
|
||||
if data == biome_goal then
|
||||
return true
|
||||
end
|
||||
|
@ -372,111 +531,125 @@ local function biome_check(biome_list, biome_goal)
|
|||
return false
|
||||
end
|
||||
|
||||
local function is_farm_animal(n)
|
||||
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"
|
||||
end
|
||||
|
||||
--todo mob limiting
|
||||
--MAIN LOOP
|
||||
|
||||
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
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer < 10 then return end
|
||||
timer = 0
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
local pos = player:get_pos()
|
||||
local dimension = mcl_worlds.pos_to_dimension(pos)
|
||||
-- ignore void and unloaded area
|
||||
if dimension ~= "void" and dimension ~= "default" then
|
||||
local y_min, y_max = decypher_limits(pos.y)
|
||||
for i = 1, math_random(1, 4) do
|
||||
spawn_a_mob(pos, dimension, y_min, y_max)
|
||||
if timer >= 8 then
|
||||
timer = 0
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
for i = 1,math_random(3,8) do
|
||||
repeat -- after this line each "break" means "continue"
|
||||
local player_pos = player:get_pos()
|
||||
|
||||
local _,dimension = mcl_worlds.y_to_layer(player_pos.y)
|
||||
|
||||
if dimension == "void" or dimension == "default" then
|
||||
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
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
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
|
|
@ -1,4 +0,0 @@
|
|||
name = mcl_wither_spawning
|
||||
description = Wither Spawning for MineClone2
|
||||
author = Fleckenstein
|
||||
depends = mobs_mc, mcl_heads
|
|
@ -1 +0,0 @@
|
|||
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}}
|
|
@ -1 +0,0 @@
|
|||
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,7 +169,6 @@ 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,
|
||||
-- Mobs Redo items
|
||||
"mobs:meat", "mobs:meat_raw" },
|
||||
villager = { "mcl_farming:bread" },
|
||||
}
|
||||
|
||||
-- Contents for replace_what
|
||||
|
|
|
@ -75,7 +75,6 @@ Origin of those models:
|
|||
* `mobs_mc_mushroom_brown.png` (CC0)
|
||||
|
||||
* “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
|
||||
|
||||
## Sounds
|
||||
|
|
|
@ -42,6 +42,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
{"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.png"},
|
||||
-- TODO: Add llama carpet textures (Pixel Perfection seems to use verbatim copy from Minecraft :-( )
|
||||
},
|
||||
visual_size = {x=3, y=3},
|
||||
makes_footstep_sound = true,
|
||||
|
@ -138,48 +139,50 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
-- 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
|
||||
|
||||
-- Place carpet
|
||||
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
||||
for group, carpetdata in pairs(carpets) do
|
||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
-- 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
|
||||
for group, carpetdata in pairs(carpets) do
|
||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:take_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
|
||||
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
|
||||
]]
|
||||
|
||||
-- detatch player already riding llama
|
||||
if self.driver and clicker == self.driver then
|
||||
-- detatch player already riding llama
|
||||
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
|
||||
elseif not self.driver then
|
||||
-- attach player to llama
|
||||
elseif not self.driver then
|
||||
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mobs.attach(self, clicker)
|
||||
end
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mobs.attach(self, clicker)
|
||||
end
|
||||
|
||||
-- Used to capture llama
|
||||
elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then
|
||||
|
@ -187,6 +190,8 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
end
|
||||
end,
|
||||
|
||||
--[[
|
||||
TODO: Enable this code when carpet textures arrived.
|
||||
on_breed = function(parent1, parent2)
|
||||
-- When breeding, make sure the child has no carpet
|
||||
local pos = parent1.object:get_pos()
|
||||
|
@ -208,6 +213,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
return false
|
||||
end
|
||||
end,
|
||||
]]
|
||||
|
||||
})
|
||||
|
||||
|
|
|
@ -116,14 +116,15 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"Desert",
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
|
|
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 936 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 966 B |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
|
@ -62,15 +62,9 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then
|
|||
end
|
||||
|
||||
local professions = {
|
||||
unemployed = {
|
||||
name = N("Unemployed"),
|
||||
texture = "mobs_mc_villager.png",
|
||||
trades = nil,
|
||||
},
|
||||
farmer = {
|
||||
name = N("Farmer"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_composters:composter",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_farming:wheat_item", 18, 22, }, E1 },
|
||||
|
@ -82,19 +76,16 @@ local professions = {
|
|||
{
|
||||
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
||||
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
||||
{ E1, { "mcl_core:apple", 2, 3} },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_farming:melon", 7, 12 }, E1 },
|
||||
{ E1, {"mcl_farming:cookie", 5, 7 }, },
|
||||
{ E1, { "mcl_core:apple", 5, 7 }, },
|
||||
},
|
||||
|
||||
{
|
||||
{ E1, { "mcl_mushrooms:mushroom_stew", 6, 10 } }, --FIXME: expert level farmer is supposed to sell sus stews.
|
||||
},
|
||||
{
|
||||
{ E1, { "mcl_farming:carrot_item_gold", 3, 10 } },
|
||||
{ E1, { "mcl_potions:speckled_melon", 4, 1 } },
|
||||
{ E1, { "mcl_farming:cookie", 6, 10 } },
|
||||
{ E1, { "mcl_cake:cake", 1, 1 } },
|
||||
TRADE_V6_BIRCH_SAPLING,
|
||||
TRADE_V6_DARK_OAK_SAPLING,
|
||||
TRADE_V6_ACACIA_SAPLING,
|
||||
|
@ -104,81 +95,32 @@ local professions = {
|
|||
fisherman = {
|
||||
name = N("Fisherman"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_barrels:barrel_closed",
|
||||
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_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 },
|
||||
{ { "mcl_core:emerald", 3, 11 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
||||
},
|
||||
},
|
||||
},
|
||||
fletcher = {
|
||||
name = N("Fletcher"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_fletching_table:fletching_table",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||
{ E1, { "mcl_bows:arrow", 8, 12 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "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_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 ={
|
||||
name = N("Shepherd"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_loom:loom",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_wool:white", 16, 22 }, E1 },
|
||||
|
@ -208,262 +150,179 @@ local professions = {
|
|||
librarian = {
|
||||
name = N("Librarian"),
|
||||
texture = "mobs_mc_villager_librarian.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: lectern
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||
{ { "mcl_books:book", 8, 10 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_compass:compass", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 3, 4 }, { "mcl_books:bookshelf", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_books:written_book", 2, 2 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ E1, { "mcl_lanterns:lantern_floor", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_clock:clock", 1, 1 } },
|
||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_dye:black", 5, 5 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ E1, { "mcl_core:glass", 4, 4 } },
|
||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
||||
{ { "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", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 20, 20 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 20, 22 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||
}
|
||||
},
|
||||
},
|
||||
cartographer = {
|
||||
name = N("Cartographer"),
|
||||
texture = "mobs_mc_villager_librarian.png",
|
||||
jobsite = "mcl_cartography_table:cartography_table",
|
||||
trades = {
|
||||
{
|
||||
{ { "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} },
|
||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||
},
|
||||
|
||||
{
|
||||
-- subject to special checks
|
||||
{ { "mcl_compass:compass", 1, 1 }, E1 },
|
||||
--{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:woodland explorer map" 1, 1} },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 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: replace with empty map
|
||||
{ { "mcl_core:emerald", 7, 11}, { "mcl_maps:filled_map", 1, 1 } },
|
||||
},
|
||||
|
||||
-- TODO: special maps
|
||||
},
|
||||
},
|
||||
armorer = {
|
||||
name = N("Armorer"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
jobsite = "mcl_core:lava_source", --FIXME: blast furnace
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ { "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:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 4, 6 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
--{ { "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:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 10, 14 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 19, 33 }, { "mcl_armor:leggings_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:boots_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 16, 19 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:helmet_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 21, 35 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_armor:boots_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_armor:leggings_chain", 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 = {
|
||||
name = N("Leatherworker"),
|
||||
texture = "mobs_mc_villager_butcher.png",
|
||||
jobsite = "mcl_cauldrons:cauldron",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:leather", 9, 12 }, E1 },
|
||||
{ { "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", 2, 4 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "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_core:emerald", 7, 12 }, { "mcl_armor:chestplate_leather_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "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", 6, 6 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
butcher = {
|
||||
name = N("Butcher"),
|
||||
texture = "mobs_mc_villager_butcher.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smoker
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:beef", 14, 14 }, E1 },
|
||||
{ { "mcl_mobitems:chicken", 7, 7 }, E1 },
|
||||
{ { "mcl_mobitems:rabbit", 4, 4 }, E1 },
|
||||
{ E1, { "mcl_mobitems:rabbit_stew", 1, 1 } },
|
||||
{ { "mcl_mobitems:beef", 14, 18 }, E1 },
|
||||
{ { "mcl_mobitems:chicken", 14, 18 }, E1 },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ E1, { "mcl_mobitems:cooked_porkchop", 5, 5 } },
|
||||
{ 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 },
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ E1, { "mcl_mobitems:cooked_beef", 5, 7 } },
|
||||
{ E1, { "mcl_mobitems:cooked_chicken", 6, 8 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
weapon_smith = {
|
||||
name = N("Weapon Smith"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: grindstone
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ { "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:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 6, 8 }, { "mcl_tools:axe_iron", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
--{ { "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:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 10 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "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 = {
|
||||
name = N("Tool Smith"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smithing table
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ 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:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:flint", 30, 30 }, E1 },
|
||||
{ { "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 } },
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
cleric = {
|
||||
name = N("Cleric"),
|
||||
texture = "mobs_mc_villager_priest.png",
|
||||
jobsite = "mcl_brewing:stand",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:rotten_flesh", 32, 32 }, E1 },
|
||||
{ E1, { "mesecons:redstone", 2, 2 } },
|
||||
{ { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 },
|
||||
{ { "mcl_core:gold_ingot", 8, 10 }, E1 },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:gold_ingot", 3, 3 }, E1 },
|
||||
{ E1, { "mcl_dye:blue", 1, 1 } },
|
||||
{ E1, { "mesecons:redstone", 1, 4 } },
|
||||
{ E1, { "mcl_dye:blue", 1, 2 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_mobitems:rabbit_foot", 2, 2 }, E1 },
|
||||
{ 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 } },
|
||||
{ E1, { "mcl_nether:glowstone", 1, 3 } },
|
||||
{ { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
||||
TRADE_V6_RED_SANDSTONE,
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_nether:nether_wart_item", 22, 22 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } },
|
||||
|
@ -488,42 +347,6 @@ local stand_still = function(self)
|
|||
self.jump = false
|
||||
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)
|
||||
if not self._trades then
|
||||
return
|
||||
|
@ -1164,19 +987,11 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
die_end = 220,
|
||||
die_loop = false,
|
||||
},
|
||||
follow = mobs_mc.follow.villager,
|
||||
view_range = 16,
|
||||
fear_height = 4,
|
||||
jump = true,
|
||||
walk_chance = DEFAULT_WALK_CHANCE,
|
||||
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
|
||||
local name = clicker:get_player_name()
|
||||
self._trading_players[name] = true
|
||||
|
@ -1218,11 +1033,6 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
if not self._player_scan_timer then
|
||||
self._player_scan_timer = 0
|
||||
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
|
||||
-- Check infrequently to keep CPU load low
|
||||
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then
|
||||
|
|
|
@ -197,6 +197,7 @@ mobs:spawn_specific(
|
|||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
|
@ -289,6 +290,7 @@ mobs:spawn_specific(
|
|||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
|
@ -340,6 +342,9 @@ mobs:spawn_specific(
|
|||
"ground",
|
||||
{
|
||||
"Desert",
|
||||
"SavannaM",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
},
|
||||
0,
|
||||
7,
|
||||
|
@ -354,6 +359,9 @@ mobs:spawn_specific(
|
|||
"ground",
|
||||
{
|
||||
"Desert",
|
||||
"SavannaM",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
},
|
||||
0,
|
||||
7,
|
||||
|
|
|
@ -28,7 +28,7 @@ local function check_player(player)
|
|||
end
|
||||
|
||||
mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||
local name=player:get_player_name()
|
||||
local name=player:get_player_name(name)
|
||||
mcl_weather.nether_dust.particlespawners[name]={}
|
||||
psdef.playername = name
|
||||
psdef.attached = player
|
||||
|
@ -40,7 +40,7 @@ mcl_weather.nether_dust.add_particlespawners = function(player)
|
|||
end
|
||||
|
||||
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
||||
local name=player:get_player_name()
|
||||
local name=player:get_player_name(name)
|
||||
if mcl_weather.nether_dust.particlespawners[name] then
|
||||
for i=1,3 do
|
||||
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
||||
|
|
|
@ -21,13 +21,9 @@ minetest.register_chatcommand("awards", {
|
|||
description = S("Show, clear, disable or enable your achievements"),
|
||||
func = function(name, param)
|
||||
if param == "clear" then
|
||||
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.clear_player(name)
|
||||
minetest.chat_send_player(name,
|
||||
S("All your awards and statistics have been cleared. You can now start again."))
|
||||
end
|
||||
awards.clear_player(name)
|
||||
minetest.chat_send_player(name,
|
||||
S("All your awards and statistics have been cleared. You can now start again."))
|
||||
elseif param == "disable" then
|
||||
awards.disable(name)
|
||||
minetest.chat_send_player(name, S("You have disabled your achievements."))
|
||||
|
@ -35,17 +31,9 @@ minetest.register_chatcommand("awards", {
|
|||
awards.enable(name)
|
||||
minetest.chat_send_player(name, S("You have enabled your achievements."))
|
||||
elseif param == "c" then
|
||||
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
|
||||
awards.show_to(name, name, nil, true)
|
||||
else
|
||||
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
|
||||
awards.show_to(name, name, nil, false)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
|
|
@ -61,4 +61,3 @@ Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht.
|
|||
Write something in chat.=Schreiben Sie etwas in den Chat.
|
||||
Write @1 chat messages.=Schreiben Sie @1 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,4 +61,3 @@ Achievement “@1” does not exist.=
|
|||
@1 has made the achievement @2=
|
||||
Mine a block: @1=
|
||||
Mine blocks: @1×@2=
|
||||
Awards are disabled, enable them first by using /awards enable!=
|
||||
|
|
|
@ -339,6 +339,9 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
|||
if name == "inv" then
|
||||
inv_bg = "crafting_inventory_creative_survival.png"
|
||||
|
||||
-- Show armor and player image
|
||||
local player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")
|
||||
|
||||
-- Background images for armor slots (hide if occupied)
|
||||
local armor_slot_imgs = ""
|
||||
local inv = player:get_inventory()
|
||||
|
@ -360,7 +363,7 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
|||
end
|
||||
|
||||
local stack_size = get_stack_size(player)
|
||||
|
||||
|
||||
-- Survival inventory slots
|
||||
main_list = "list[current_player;main;0,3.75;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,3.75,9,3)..
|
||||
|
@ -377,7 +380,7 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
|||
mcl_formspec.get_itemslot_bg(1.5,2.025,1,1)..
|
||||
armor_slot_imgs..
|
||||
-- player preview
|
||||
mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")..
|
||||
player_preview..
|
||||
-- crafting guide button
|
||||
"image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]"..
|
||||
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
|
||||
|
|
|
@ -60,6 +60,9 @@ local function set_inventory(player, armor_change_only)
|
|||
inv:set_width("craft", 2)
|
||||
inv:set_size("craft", 4)
|
||||
|
||||
-- Show armor and player image
|
||||
local player_preview = mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")
|
||||
|
||||
local armor_slots = {"helmet", "chestplate", "leggings", "boots"}
|
||||
local armor_slot_imgs = ""
|
||||
for a=1,4 do
|
||||
|
@ -74,7 +77,7 @@ local function set_inventory(player, armor_change_only)
|
|||
|
||||
local form = "size[9,8.75]"..
|
||||
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
|
||||
mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")..
|
||||
player_preview..
|
||||
--armor
|
||||
"list[current_player;armor;0,0;1,1;1]"..
|
||||
"list[current_player;armor;0,1;1,1;2]"..
|
||||
|
|
|
@ -0,0 +1,220 @@
|
|||
--[[ 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,6 +47,8 @@ end
|
|||
|
||||
-- For nodes which ignore sticky sides.
|
||||
-- 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)
|
||||
if get_unsticky == nil then
|
||||
get_unsticky = true
|
||||
|
@ -64,6 +66,9 @@ function mesecon.is_mvps_unsticky(node, pulldir, stack, stackid)
|
|||
if type(get_unsticky) == "function" then
|
||||
get_unsticky = get_unsticky(node, pulldir, stack, stackid)
|
||||
end
|
||||
if get_unsticky == nil then
|
||||
get_unsticky = false
|
||||
end
|
||||
|
||||
return get_unsticky
|
||||
end
|
||||
|
@ -206,15 +211,7 @@ function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos)
|
|||
end
|
||||
|
||||
function mesecon.mvps_pull_single(pos, 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
|
||||
return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos)
|
||||
end
|
||||
|
||||
-- pos: pos of mvps; stackdir: direction of building the stack
|
||||
|
@ -360,14 +357,13 @@ function mesecon.mvps_move_objects(pos, dir, nodestack)
|
|||
end
|
||||
end
|
||||
|
||||
-- Unmovable by design: nodes
|
||||
-- Unmovable by design
|
||||
mesecon.register_mvps_stopper("mcl_core:barrier")
|
||||
mesecon.register_mvps_stopper("mcl_core:realm_barrier")
|
||||
mesecon.register_mvps_stopper("mcl_core:void")
|
||||
mesecon.register_mvps_stopper("mcl_core:bedrock")
|
||||
mesecon.register_mvps_stopper("mcl_core:obsidian")
|
||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest")
|
||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest_small")
|
||||
mesecon.register_mvps_stopper("mcl_mobspawners:spawner")
|
||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off")
|
||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on")
|
||||
|
@ -375,18 +371,9 @@ mesecon.register_mvps_stopper("mcl_portals:portal")
|
|||
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_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.
|
||||
-- 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_active")
|
||||
mesecon.register_mvps_stopper("mcl_hoppers:hopper")
|
||||
|
@ -400,39 +387,9 @@ mesecon.register_mvps_stopper("mcl_dispensers:dispenser_down")
|
|||
mesecon.register_mvps_stopper("mcl_anvils:anvil")
|
||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1")
|
||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2")
|
||||
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")
|
||||
-- Would screw up on/off state of trapped chest (big problem)
|
||||
|
||||
|
||||
-- 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
|
||||
-- Glazed terracotta: unpullable
|
||||
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_yellow")
|
||||
|
@ -449,446 +406,6 @@ 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_light_blue")
|
||||
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
|
||||
mesecon.register_on_mvps_move(mesecon.move_hot_nodes)
|
||||
|
|
|
@ -1,52 +0,0 @@
|
|||
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,
|
||||
})
|
|
@ -1,220 +0,0 @@
|
|||
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")
|
|
@ -1,19 +0,0 @@
|
|||
# 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.
|
|
@ -1,19 +0,0 @@
|
|||
# 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.=Тонированное стекло блокирует свет, но визуально прозрачно.
|
|
@ -1,19 +0,0 @@
|
|||
# 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.=
|
|
@ -1,5 +0,0 @@
|
|||
name = mcl_amethyst
|
||||
author = Emojiminetest, kay27
|
||||
description = Amethyst related stuff
|
||||
depends = mcl_init, mcl_core, mcl_wip
|
||||
optional_depends = mcl_spyglass, mcl_copper
|
|
@ -1 +0,0 @@
|
|||
Nova_Wostra Creative Commons Attribution-Share Alike 4.0 International License https://creativecommons.org/licenses/by-sa/4.0/
|
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 6.2 KiB |
|
@ -87,12 +87,14 @@ mcl_armor.register_set({
|
|||
end,
|
||||
},
|
||||
|
||||
--inventory textures aren't definable using a table similar to textures or previews
|
||||
--you are forced to use the default texture names which are:
|
||||
--head: "<modname>_inv_helmet_<material>.png
|
||||
--torso: "<modname>_inv_chestplate_<material>.png
|
||||
--legs: "<modname>_inv_leggings_<material>.png
|
||||
--feet: "<modname>_inv_boots_<material>.png
|
||||
--specify textures that will be shown in player inventory
|
||||
--its similar to how works the textures field except you can't use functions
|
||||
inventory = {
|
||||
head = "inv_dummy_texture.png", --default: "<modname>_inv_helmet_<material>.png"
|
||||
torso = "inv_dummy_texture.png", --default: "<modname>_inv_chestplate_<material>.png"
|
||||
legs = "inv_dummy_texture.png", --default: "<modname>_inv_leggings_<material>.png"
|
||||
feet = "inv_dummy_texture.png", --default: "<modname>_inv_boots_<material>.png"
|
||||
},
|
||||
|
||||
--this callback table allow you to define functions that will be called each time an entity equip an armor piece or the mcl_armor.on_equip() function is called
|
||||
--the functions accept two arguments: obj and itemstack
|
||||
|
|
|
@ -94,6 +94,7 @@ function mcl_armor.register_set(def)
|
|||
local on_unequip_callbacks = def.on_unequip_callbacks or {}
|
||||
local on_break_callbacks = def.on_break_callbacks or {}
|
||||
local textures = def.textures or {}
|
||||
local inventory = def.inventory or {}
|
||||
local durabilities = def.durabilities or {}
|
||||
local element_groups = def.element_groups or {}
|
||||
|
||||
|
@ -119,7 +120,7 @@ function mcl_armor.register_set(def)
|
|||
description = S(def.description .. " " .. (descriptions[name] or element.description)),
|
||||
_doc_items_longdesc = mcl_armor.longdesc,
|
||||
_doc_items_usagehelp = mcl_armor.usage,
|
||||
inventory_image = modname .. "_inv_" .. itemname .. ".png",
|
||||
inventory_image = inventory[name] or modname .. "_inv_" .. itemname .. ".png",
|
||||
_repair_material = def.repair_material or def.craft_material,
|
||||
groups = groups,
|
||||
sounds = {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
local S = minetest.get_translator("mcl_armor")
|
||||
local modpath = minetest.get_modpath("mcl_armor")
|
||||
|
||||
mcl_armor = {
|
||||
longdesc = S("This is a piece of equippable armor which reduces the amount of damage you receive."),
|
||||
|
@ -59,10 +60,9 @@ mcl_armor = {
|
|||
player_view_range_factors = {},
|
||||
}
|
||||
|
||||
local modpath = minetest.get_modpath("mcl_armor")
|
||||
|
||||
dofile(modpath .. "/api.lua")
|
||||
dofile(modpath .. "/player.lua")
|
||||
dofile(modpath .. "/damage.lua")
|
||||
dofile(modpath .. "/register.lua")
|
||||
dofile(modpath .. "/alias.lua")
|
||||
dofile(modpath .."/leather.lua")
|
||||
|
|
|
@ -0,0 +1,113 @@
|
|||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local colors = {
|
||||
-- { ID, decription, wool, dye }
|
||||
{ "red", "Red", "mcl_dye:red", "#951d1d" },
|
||||
{ "blue", "Blue", "mcl_dye:blue", "#2a2c94" },
|
||||
{ "cyan", "Cyan", "mcl_dye:cyan", "#0d7d8e" },
|
||||
{ "grey", "Grey", "mcl_dye:dark_grey", "#363a3f" },
|
||||
{ "silver", "Light Grey", "mcl_dye:grey", "#818177" },
|
||||
{ "black", "Black", "mcl_dye:black", "#020307" },
|
||||
{ "yellow", "Yellow", "mcl_dye:yellow", "#f2b410" },
|
||||
{ "green", "Green", "mcl_dye:dark_green", "#495d20" },
|
||||
{ "magenta", "Magenta", "mcl_dye:magenta", "#ae2ea4" },
|
||||
{ "orange", "Orange", "mcl_dye:orange", "#e36501" },
|
||||
{ "purple", "Purple", "mcl_dye:violet", "#681ba1" },
|
||||
{ "brown", "Brown", "mcl_dye:brown", "#623b1a" },
|
||||
{ "pink", "Pink", "mcl_dye:pink", "#d66691" },
|
||||
{ "lime", "Lime", "mcl_dye:green", "#60ad13" },
|
||||
{ "light_blue", "Light Blue", "mcl_dye:lightblue", "#1f8eca" },
|
||||
{ "white", "White", "mcl_dye:white", "#d1d7d8" },
|
||||
}
|
||||
|
||||
--local function get_color_rgb(color)
|
||||
-- return tonumber(str.sub(first, 2, 3)), tonumber(str.sub(first, 4, 5)), tonumber(str.sub(first, 6, 7))
|
||||
--end
|
||||
|
||||
local function calculate_color(first, last)
|
||||
--local first_r = tonumber(str.sub(first, 2, 3))
|
||||
--local first_g = tonumber(str.sub(first, 4, 5))
|
||||
return tonumber(first)*tonumber(last)
|
||||
end
|
||||
|
||||
local function get_texture_function(texture)
|
||||
local function get_texture(_, itemstack)
|
||||
local out
|
||||
local color = itemstack:get_meta():get_string("color")
|
||||
if color == "" or color == nil then
|
||||
out = texture
|
||||
else
|
||||
out = texture.."^[multiply:"..color
|
||||
end
|
||||
|
||||
if mcl_enchanting.is_enchanted(itemstack) then
|
||||
return out.."^"..mcl_enchanting.overlay
|
||||
else
|
||||
return out
|
||||
end
|
||||
end
|
||||
return get_texture
|
||||
end
|
||||
|
||||
mcl_armor.register_set({
|
||||
name = "leather_colored",
|
||||
description = "Colored Leather",
|
||||
descriptions = {
|
||||
head = "Cap",
|
||||
torso = "Tunic",
|
||||
legs = "Pants",
|
||||
},
|
||||
durability = 80,
|
||||
enchantability = 15,
|
||||
points = {
|
||||
head = 1,
|
||||
torso = 3,
|
||||
legs = 2,
|
||||
feet = 1,
|
||||
},
|
||||
textures = {
|
||||
head = get_texture_function("mcl_armor_helmet_colored_leather.png"),
|
||||
torso = get_texture_function("mcl_armor_chestplate_colored_leather.png"),
|
||||
legs = get_texture_function("mcl_armor_leggings_colored_leather.png"),
|
||||
feet = get_texture_function("mcl_armor_boots_colored_leather.png"),
|
||||
},
|
||||
inventory = {
|
||||
head = "mcl_armor_inv_helmet_colored_leather.png",
|
||||
torso = "mcl_armor_inv_chestplate_colored_leather.png",
|
||||
legs = "mcl_armor_inv_leggings_colored_leather.png",
|
||||
feet = "mcl_armor_inv_boots_colored_leather.png",
|
||||
},
|
||||
repair_material = "mcl_mobitems:leather",
|
||||
groups = {armor_leather_colored = 1},
|
||||
})
|
||||
|
||||
tt.register_priority_snippet(function(_, _, itemstack)
|
||||
if not itemstack or not itemstack:get_definition().groups.armor_leather_colored == 1 then
|
||||
return
|
||||
end
|
||||
local color = itemstack:get_meta():get_string("color")
|
||||
if color and color ~= "" then
|
||||
local text = "Color: "..color
|
||||
return text, false
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
-- This command is only temporary
|
||||
|
||||
minetest.register_chatcommand("color_leather", {
|
||||
params = "<color>",
|
||||
description = "Colorize a leather armor",
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if player then
|
||||
local item = player:get_wielded_item()
|
||||
item:get_meta():set_string("color", param)
|
||||
tt.reload_itemstack_description(item)
|
||||
player:set_wielded_item(item)
|
||||
return true, "Done."
|
||||
else
|
||||
return false, "Player isn't online"
|
||||
end
|
||||
end,
|
||||
})
|
|
@ -1,5 +1,5 @@
|
|||
name = mcl_armor
|
||||
author = stu
|
||||
description = Adds craftable armor that is visible to other players.
|
||||
depends = mcl_core, mcl_player, mcl_enchanting, mcl_damage
|
||||
depends = mcl_core, mcl_player, mcl_enchanting, mcl_damage, tt
|
||||
optional_depends = mcl_fire, ethereal, bakedclay
|
||||
|
|
After Width: | Height: | Size: 140 B |
After Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 316 B After Width: | Height: | Size: 310 B |
Before Width: | Height: | Size: 227 B After Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 271 B After Width: | Height: | Size: 218 B |
After Width: | Height: | Size: 275 B |
After Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 409 B After Width: | Height: | Size: 207 B |
Before Width: | Height: | Size: 278 B After Width: | Height: | Size: 274 B |
After Width: | Height: | Size: 194 B |
Before Width: | Height: | Size: 355 B After Width: | Height: | Size: 261 B |
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 217 B |
After Width: | Height: | Size: 159 B |
After Width: | Height: | Size: 174 B |
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 197 B |
After Width: | Height: | Size: 190 B |
|
@ -10,4 +10,3 @@ local modpath = minetest.get_modpath("mcl_beds")
|
|||
dofile(modpath .. "/functions.lua")
|
||||
dofile(modpath .. "/api.lua")
|
||||
dofile(modpath .. "/beds.lua")
|
||||
dofile(modpath .. "/respawn_anchor.lua")
|
|
@ -40,4 +40,3 @@ 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're in bed.=Sie sind im Bett.
|
||||
Allows you to sleep=Zum Einschafen
|
||||
Respawn Anchor=Seelenanker
|
|
@ -40,4 +40,3 @@ You will fall asleep when all players are in bed.=
|
|||
You will fall asleep when @1% of all players are in bed.=
|
||||
You're in bed.=
|
||||
Allows you to sleep=
|
||||
Respawn Anchor=
|
||||
|
|
|
@ -2,4 +2,4 @@ name = mcl_beds
|
|||
author = BlockMen
|
||||
description =
|
||||
depends = playerphysics
|
||||
optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mesecon
|
||||
optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc
|
||||
|
|
|
@ -1,96 +0,0 @@
|
|||
--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"}
|
||||
}
|
||||
})
|
Before Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 6.4 KiB |
|
@ -338,10 +338,7 @@ minetest.register_node("mcl_books:bookshelf", {
|
|||
tiles = {"mcl_books_bookshelf_top.png", "mcl_books_bookshelf_top.png", "default_bookshelf.png"},
|
||||
stack_max = 64,
|
||||
is_ground_content = false,
|
||||
groups = {
|
||||
handy=1, axey=1, deco_block=1, material_wood=1,
|
||||
flammable=3, fire_encouragement=30, fire_flammability=20
|
||||
},
|
||||
groups = {handy=1,axey=1, flammable=3,building_block=1, material_wood=1, fire_encouragement=30, fire_flammability=20},
|
||||
drop = "mcl_books:book 3",
|
||||
sounds = wood_sound,
|
||||
_mcl_blast_resistance = 1.5,
|
||||
|
|
|
@ -959,7 +959,7 @@ minetest.register_craft({
|
|||
output = "mcl_brewing:stand_000",
|
||||
recipe = {
|
||||
{ "", "mcl_mobitems:blaze_rod", "" },
|
||||
{ "group:cobble", "group:cobble", "group:cobble" },
|
||||
{ "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" },
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
mcl_cartography_table
|
||||
-------------------
|
||||
Cartography Tables, by PrairieWind
|
||||
|
||||
Adds Cartography Tables to MineClone 2/5.
|
||||
|
||||
License of source code
|
||||
----------------------
|
||||
LGPLv2.1
|
||||
|
||||
License of media
|
||||
----------------
|
||||
See the main MineClone 2 README.md file.
|