Compare commits
1 Commits
master
...
fix-serial
Author | SHA1 | Date |
---|---|---|
cora | d2944da951 |
|
@ -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”
|
* `water_bucket=1`: Bucket containing a liquid of group “water”
|
||||||
* `enchantability=X`: How good the enchantments are the item gets (1 equals book)
|
* `enchantability=X`: How good the enchantments are the item gets (1 equals book)
|
||||||
* `enchanted=1`: The item is already enchanted, meaning that it can't be enchanted using an enchanting table
|
* `enchanted=1`: The item is already enchanted, meaning that it can't be enchanted using an enchanting table
|
||||||
* `cobble=1`: Cobblestone of any kind
|
|
||||||
|
|
||||||
### Material groups
|
### Material groups
|
||||||
|
|
||||||
|
|
|
@ -418,11 +418,7 @@ minetest.register_entity(":__builtin:item", {
|
||||||
end
|
end
|
||||||
local stack = ItemStack(itemstring)
|
local stack = ItemStack(itemstring)
|
||||||
if minetest.get_item_group(stack:get_name(), "compass") > 0 then
|
if minetest.get_item_group(stack:get_name(), "compass") > 0 then
|
||||||
if string.find(stack:get_name(), "_lodestone") then
|
stack:set_name("mcl_compass:16")
|
||||||
stack:set_name("mcl_compass:18_lodestone")
|
|
||||||
else
|
|
||||||
stack:set_name("mcl_compass:18")
|
|
||||||
end
|
|
||||||
itemstring = stack:to_string()
|
itemstring = stack:to_string()
|
||||||
self.itemstring = itemstring
|
self.itemstring = itemstring
|
||||||
end
|
end
|
||||||
|
@ -489,7 +485,7 @@ minetest.register_entity(":__builtin:item", {
|
||||||
local data = minetest.serialize({
|
local data = minetest.serialize({
|
||||||
itemstring = self.itemstring,
|
itemstring = self.itemstring,
|
||||||
always_collect = self.always_collect,
|
always_collect = self.always_collect,
|
||||||
age = self.age,
|
age = 0, --self.age, restart the timer when reloading ... idk why this set it to the current age?! WTF is going on why would a saved to disk item entity be a problem ? And i mean i suppose it doesnt get removed from there either until it is loaded again and actually times out....
|
||||||
_insta_collect = self._insta_collect,
|
_insta_collect = self._insta_collect,
|
||||||
_flowing = self._flowing,
|
_flowing = self._flowing,
|
||||||
_removed = self._removed,
|
_removed = self._removed,
|
||||||
|
|
|
@ -3,57 +3,22 @@ local get_node = minetest.get_node
|
||||||
local get_item_group = minetest.get_item_group
|
local get_item_group = minetest.get_item_group
|
||||||
local get_node_light = minetest.get_node_light
|
local get_node_light = minetest.get_node_light
|
||||||
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
||||||
local get_biome_name = minetest.get_biome_name
|
local new_vector = vector.new
|
||||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
|
||||||
local get_connected_players = minetest.get_connected_players
|
|
||||||
local minetest_get_perlin = minetest.get_perlin
|
|
||||||
|
|
||||||
local math_random = math.random
|
local math_random = math.random
|
||||||
local math_floor = math.floor
|
local get_biome_name = minetest.get_biome_name
|
||||||
local math_ceil = math.ceil
|
local max = math.max
|
||||||
local math_cos = math.cos
|
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||||
local math_sin = math.sin
|
local vector_distance = vector.distance
|
||||||
local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end
|
|
||||||
|
|
||||||
--local vector_distance = vector.distance
|
|
||||||
local vector_new = vector.new
|
|
||||||
local vector_floor = vector.floor
|
|
||||||
|
|
||||||
local table_copy = table.copy
|
|
||||||
local table_remove = table.remove
|
|
||||||
|
|
||||||
local pairs = pairs
|
|
||||||
|
|
||||||
-- range for mob count
|
-- range for mob count
|
||||||
local aoc_range = 32
|
local aoc_range = 32
|
||||||
|
--[[
|
||||||
|
|
||||||
--do mobs spawn?
|
THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
||||||
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
|
||||||
|
|
||||||
|
|
||||||
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:
|
|
||||||
|
|
||||||
|
underground:
|
||||||
"FlowerForest_underground",
|
"FlowerForest_underground",
|
||||||
"JungleEdge_underground",
|
"JungleEdge_underground",local spawning_position = spawning_position_list[math.random(1,#spawning_position_list)]
|
||||||
"ColdTaiga_underground",
|
"ColdTaiga_underground",
|
||||||
"IcePlains_underground",
|
"IcePlains_underground",
|
||||||
"IcePlainsSpikes_underground",
|
"IcePlainsSpikes_underground",
|
||||||
|
@ -64,8 +29,7 @@ local list_of_all_biomes = {
|
||||||
"ExtremeHillsM_underground",
|
"ExtremeHillsM_underground",
|
||||||
"JungleEdgeM_underground",
|
"JungleEdgeM_underground",
|
||||||
|
|
||||||
-- ocean:
|
ocean:
|
||||||
|
|
||||||
"RoofedForest_ocean",
|
"RoofedForest_ocean",
|
||||||
"JungleEdgeM_ocean",
|
"JungleEdgeM_ocean",
|
||||||
"BirchForestM_ocean",
|
"BirchForestM_ocean",
|
||||||
|
@ -127,15 +91,13 @@ local list_of_all_biomes = {
|
||||||
"Taiga_deep_ocean",
|
"Taiga_deep_ocean",
|
||||||
"JungleM_ocean",
|
"JungleM_ocean",
|
||||||
|
|
||||||
-- water or beach?
|
water or beach?
|
||||||
|
|
||||||
"MesaPlateauFM_sandlevel",
|
"MesaPlateauFM_sandlevel",
|
||||||
"MesaPlateauF_sandlevel",
|
"MesaPlateauF_sandlevel",
|
||||||
"MesaBryce_sandlevel",
|
"MesaBryce_sandlevel",
|
||||||
"Mesa_sandlevel",
|
"Mesa_sandlevel",
|
||||||
|
|
||||||
-- beach:
|
beach:
|
||||||
|
|
||||||
"FlowerForest_beach",
|
"FlowerForest_beach",
|
||||||
"Forest_beach",
|
"Forest_beach",
|
||||||
"StoneBeach",
|
"StoneBeach",
|
||||||
|
@ -150,13 +112,11 @@ local list_of_all_biomes = {
|
||||||
"JungleM_shore",
|
"JungleM_shore",
|
||||||
"Jungle_shore",
|
"Jungle_shore",
|
||||||
|
|
||||||
-- dimension biome:
|
dimension biome:
|
||||||
|
|
||||||
"Nether",
|
"Nether",
|
||||||
"End",
|
"End",
|
||||||
|
|
||||||
-- Overworld regular:
|
Overworld regular:
|
||||||
|
|
||||||
"Mesa",
|
"Mesa",
|
||||||
"FlowerForest",
|
"FlowerForest",
|
||||||
"Swampland",
|
"Swampland",
|
||||||
|
@ -189,16 +149,32 @@ local list_of_all_biomes = {
|
||||||
"MesaBryce",
|
"MesaBryce",
|
||||||
"JungleEdge",
|
"JungleEdge",
|
||||||
"SavannaM",
|
"SavannaM",
|
||||||
}
|
]]--
|
||||||
|
|
||||||
-- count how many mobs are in an area
|
|
||||||
local function count_mobs(pos)
|
|
||||||
|
|
||||||
|
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
||||||
|
-- count how many mobs of one type are inside an area
|
||||||
|
|
||||||
|
local count_mobs = function(pos,mobtype)
|
||||||
local num = 0
|
local num = 0
|
||||||
for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do
|
local objs = get_objects_inside_radius(pos, aoc_range)
|
||||||
if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then
|
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
|
num = num + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return num
|
return num
|
||||||
end
|
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
|
--this is where all of the spawning information is kept
|
||||||
local spawn_dictionary = {}
|
local spawn_dictionary = {}
|
||||||
local summary_chance = 0
|
|
||||||
|
|
||||||
function mobs:spawn_setup(def)
|
|
||||||
if not mobs_spawn then return end
|
|
||||||
|
|
||||||
if not def then
|
|
||||||
minetest.log("warning", "Empty mob spawn setup definition")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local name = def.name
|
|
||||||
if not name then
|
|
||||||
minetest.log("warning", "Missing mob name")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local dimension = def.dimension or "overworld"
|
|
||||||
local type_of_spawning = def.type_of_spawning or "ground"
|
|
||||||
local biomes = def.biomes or list_of_all_biomes
|
|
||||||
local min_light = def.min_light or 0
|
|
||||||
local max_light = def.max_light or (minetest.LIGHT_MAX + 1)
|
|
||||||
local chance = def.chance or 1000
|
|
||||||
local aoc = def.aoc or aoc_range
|
|
||||||
local min_height = def.min_height or mcl_mapgen.overworld.min
|
|
||||||
local max_height = def.max_height or mcl_mapgen.overworld.max
|
|
||||||
local day_toggle = def.day_toggle
|
|
||||||
local on_spawn = def.on_spawn
|
|
||||||
local check_position = def.check_position
|
|
||||||
|
|
||||||
-- chance/spawn number override in minetest.conf for registered mob
|
|
||||||
local numbers = minetest.settings:get(name)
|
|
||||||
if numbers then
|
|
||||||
numbers = numbers:split(",")
|
|
||||||
chance = tonumber(numbers[1]) or chance
|
|
||||||
aoc = tonumber(numbers[2]) or aoc
|
|
||||||
if chance == 0 then
|
|
||||||
minetest.log("warning", string.format("[mobs] %s has spawning disabled", name))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
|
||||||
end
|
|
||||||
|
|
||||||
if chance < 1 then
|
|
||||||
chance = 1
|
|
||||||
minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")")
|
|
||||||
end
|
|
||||||
|
|
||||||
spawn_dictionary[#spawn_dictionary + 1] = {
|
|
||||||
name = name,
|
|
||||||
dimension = dimension,
|
|
||||||
type_of_spawning = type_of_spawning,
|
|
||||||
biomes = biomes,
|
|
||||||
min_light = min_light,
|
|
||||||
max_light = max_light,
|
|
||||||
chance = chance,
|
|
||||||
aoc = aoc,
|
|
||||||
min_height = min_height,
|
|
||||||
max_height = max_height,
|
|
||||||
day_toggle = day_toggle,
|
|
||||||
check_position = check_position,
|
|
||||||
on_spawn = on_spawn,
|
|
||||||
}
|
|
||||||
summary_chance = summary_chance + chance
|
|
||||||
end
|
|
||||||
|
|
||||||
function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
||||||
|
|
||||||
|
--print(dump(biomes))
|
||||||
|
|
||||||
-- Do mobs spawn at all?
|
-- Do mobs spawn at all?
|
||||||
if not mobs_spawn then
|
if not mobs_spawn then
|
||||||
return
|
return
|
||||||
|
@ -324,7 +238,180 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
||||||
return
|
return
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
--load information into the spawn dictionary
|
--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]["biomes"] = biomes
|
||||||
spawn_dictionary[key]["min_light"] = min_light
|
spawn_dictionary[key]["min_light"] = min_light
|
||||||
spawn_dictionary[key]["max_light"] = max_light
|
spawn_dictionary[key]["max_light"] = max_light
|
||||||
|
spawn_dictionary[key]["interval"] = interval
|
||||||
spawn_dictionary[key]["chance"] = chance
|
spawn_dictionary[key]["chance"] = chance
|
||||||
spawn_dictionary[key]["aoc"] = aoc
|
spawn_dictionary[key]["aoc"] = aoc
|
||||||
spawn_dictionary[key]["min_height"] = min_height
|
spawn_dictionary[key]["min_height"] = min_height
|
||||||
spawn_dictionary[key]["max_height"] = max_height
|
spawn_dictionary[key]["max_height"] = max_height
|
||||||
spawn_dictionary[key]["day_toggle"] = day_toggle
|
spawn_dictionary[key]["day_toggle"] = day_toggle
|
||||||
|
--spawn_dictionary[key]["on_spawn"] = spawn_abm_action
|
||||||
|
spawn_dictionary[key]["spawn_class"] = spawn_class
|
||||||
|
|
||||||
summary_chance = summary_chance + chance
|
--[[
|
||||||
|
minetest.register_abm({
|
||||||
|
label = name .. " spawning",
|
||||||
|
nodenames = nodes,
|
||||||
|
neighbors = neighbors,
|
||||||
|
interval = interval,
|
||||||
|
chance = floor(max(1, chance * mobs_spawn_chance)),
|
||||||
|
catch_up = false,
|
||||||
|
action = spawn_abm_action,
|
||||||
|
})
|
||||||
|
]]--
|
||||||
end
|
end
|
||||||
|
|
||||||
local two_pi = 2 * math.pi
|
-- compatibility with older mob registration
|
||||||
local function get_next_mob_spawn_pos(pos)
|
-- we're going to forget about this for now -j4i
|
||||||
local distance = math_random(25, 32)
|
--[[
|
||||||
local angle = math_random() * two_pi
|
function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle)
|
||||||
return {
|
|
||||||
x = math_round(pos.x + distance * math_cos(angle)),
|
mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30,
|
||||||
y = pos.y,
|
chance, active_object_count, -31000, max_height, day_toggle)
|
||||||
z = math_round(pos.z + distance * math_sin(angle))
|
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}
|
||||||
}
|
}
|
||||||
end
|
]]--
|
||||||
|
|
||||||
local function decypher_limits(posy)
|
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
|
return posy - 32, posy + 32
|
||||||
end
|
end
|
||||||
|
|
||||||
--a simple helper function for mob_spawn
|
--a simple helper function for mob_spawn
|
||||||
local function biome_check(biome_list, biome_goal)
|
local function biome_check(biome_list, biome_goal)
|
||||||
for _, data in pairs(biome_list) do
|
for _,data in ipairs(biome_list) do
|
||||||
if data == biome_goal then
|
if data == biome_goal then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
@ -372,111 +531,125 @@ local function biome_check(biome_list, biome_goal)
|
||||||
return false
|
return false
|
||||||
end
|
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"
|
--todo mob limiting
|
||||||
end
|
--MAIN LOOP
|
||||||
|
|
||||||
if mobs_spawn then
|
if mobs_spawn then
|
||||||
|
local timer = 0
|
||||||
|
minetest.register_globalstep(function(dtime)
|
||||||
|
timer = timer + dtime
|
||||||
|
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 perlin_noise
|
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 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)]
|
local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)]
|
||||||
|
|
||||||
--hard code mob limit in area to 5 for now
|
--Prevent strange behavior/too close to player
|
||||||
if count_mobs(spawning_position) >= 5 then return end
|
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_node = get_node(spawning_position).name
|
|
||||||
local gotten_biome = minetest.get_biome_data(spawning_position)
|
local gotten_biome = minetest.get_biome_data(spawning_position)
|
||||||
if not gotten_node or not gotten_biome then return end
|
|
||||||
|
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
|
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
|
--add this so mobs don't spawn inside nodes
|
||||||
spawning_position.y = spawning_position.y + 1
|
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
|
--only need to poll for node light if everything else worked
|
||||||
local gotten_light = get_node_light(spawning_position)
|
local gotten_light = get_node_light(spawning_position)
|
||||||
|
|
||||||
local is_water = get_item_group(gotten_node, "water") ~= 0
|
--don't spawn if not in light limits
|
||||||
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then
|
||||||
local is_ground = not (is_water or is_lava)
|
break
|
||||||
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
|
end
|
||||||
local has_bed = minetest.find_node_near(pos,25,{"group:bed"})
|
|
||||||
|
|
||||||
if not is_ground then
|
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
|
spawning_position.y = spawning_position.y - 1
|
||||||
end
|
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
|
--everything is correct, spawn mob
|
||||||
local object = minetest.add_entity(spawning_position, mob_def.name)
|
minetest.add_entity(spawning_position, mob_def.name)
|
||||||
if object then
|
until true --this is a safety catch
|
||||||
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)
|
|
||||||
end
|
end
|
||||||
end
|
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,
|
dog = { mobs_mc.items.rabbit_raw, mobs_mc.items.rabbit_cooked, mobs_mc.items.mutton_raw, mobs_mc.items.mutton_cooked, mobs_mc.items.beef_raw, mobs_mc.items.beef_cooked, mobs_mc.items.chicken_raw, mobs_mc.items.chicken_cooked, mobs_mc.items.rotten_flesh,
|
||||||
-- Mobs Redo items
|
-- Mobs Redo items
|
||||||
"mobs:meat", "mobs:meat_raw" },
|
"mobs:meat", "mobs:meat_raw" },
|
||||||
villager = { "mcl_farming:bread" },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Contents for replace_what
|
-- Contents for replace_what
|
||||||
|
|
|
@ -75,7 +75,6 @@ Origin of those models:
|
||||||
* `mobs_mc_mushroom_brown.png` (CC0)
|
* `mobs_mc_mushroom_brown.png` (CC0)
|
||||||
|
|
||||||
* “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i
|
* “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i
|
||||||
* Llama decor (carpet) textures (`mobs_mc_llama_decor_*`) by erlehmann and rudzik8
|
|
||||||
* Any other texture not mentioned here are licensed under the MIT License
|
* Any other texture not mentioned here are licensed under the MIT License
|
||||||
|
|
||||||
## Sounds
|
## Sounds
|
||||||
|
|
|
@ -42,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_gray.png"},
|
||||||
{"blank.png", "blank.png", "mobs_mc_llama_white.png"},
|
{"blank.png", "blank.png", "mobs_mc_llama_white.png"},
|
||||||
{"blank.png", "blank.png", "mobs_mc_llama.png"},
|
{"blank.png", "blank.png", "mobs_mc_llama.png"},
|
||||||
|
-- TODO: Add llama carpet textures (Pixel Perfection seems to use verbatim copy from Minecraft :-( )
|
||||||
},
|
},
|
||||||
visual_size = {x=3, y=3},
|
visual_size = {x=3, y=3},
|
||||||
makes_footstep_sound = true,
|
makes_footstep_sound = true,
|
||||||
|
@ -139,6 +140,7 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
if self.tamed and not self.child and self.owner == clicker:get_player_name() then
|
if self.tamed and not self.child and self.owner == clicker:get_player_name() then
|
||||||
|
|
||||||
-- Place carpet
|
-- Place carpet
|
||||||
|
--[[ TODO: Re-enable this code when carpet textures arrived.
|
||||||
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
||||||
for group, carpetdata in pairs(carpets) do
|
for group, carpetdata in pairs(carpets) do
|
||||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||||
|
@ -168,6 +170,7 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
-- detatch player already riding llama
|
-- detatch player already riding llama
|
||||||
if self.driver and clicker == self.driver then
|
if self.driver and clicker == self.driver then
|
||||||
|
@ -187,6 +190,8 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
--[[
|
||||||
|
TODO: Enable this code when carpet textures arrived.
|
||||||
on_breed = function(parent1, parent2)
|
on_breed = function(parent1, parent2)
|
||||||
-- When breeding, make sure the child has no carpet
|
-- When breeding, make sure the child has no carpet
|
||||||
local pos = parent1.object:get_pos()
|
local pos = parent1.object:get_pos()
|
||||||
|
@ -208,6 +213,7 @@ mobs:register_mob("mobs_mc:llama", {
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
]]
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -116,14 +116,15 @@ mobs:spawn_specific(
|
||||||
"overworld",
|
"overworld",
|
||||||
"ground",
|
"ground",
|
||||||
{
|
{
|
||||||
"Desert",
|
|
||||||
"FlowerForest",
|
"FlowerForest",
|
||||||
|
"Swampland",
|
||||||
"Taiga",
|
"Taiga",
|
||||||
"ExtremeHills",
|
"ExtremeHills",
|
||||||
"BirchForest",
|
"BirchForest",
|
||||||
"MegaSpruceTaiga",
|
"MegaSpruceTaiga",
|
||||||
"MegaTaiga",
|
"MegaTaiga",
|
||||||
"ExtremeHills+",
|
"ExtremeHills+",
|
||||||
|
"Forest",
|
||||||
"Plains",
|
"Plains",
|
||||||
"ColdTaiga",
|
"ColdTaiga",
|
||||||
"SunflowerPlains",
|
"SunflowerPlains",
|
||||||
|
|
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
|
end
|
||||||
|
|
||||||
local professions = {
|
local professions = {
|
||||||
unemployed = {
|
|
||||||
name = N("Unemployed"),
|
|
||||||
texture = "mobs_mc_villager.png",
|
|
||||||
trades = nil,
|
|
||||||
},
|
|
||||||
farmer = {
|
farmer = {
|
||||||
name = N("Farmer"),
|
name = N("Farmer"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
jobsite = "mcl_composters:composter",
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_farming:wheat_item", 18, 22, }, E1 },
|
{ { "mcl_farming:wheat_item", 18, 22, }, E1 },
|
||||||
|
@ -82,19 +76,16 @@ local professions = {
|
||||||
{
|
{
|
||||||
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
||||||
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
||||||
{ E1, { "mcl_core:apple", 2, 3} },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_farming:melon", 7, 12 }, E1 },
|
{ { "mcl_farming:melon", 7, 12 }, E1 },
|
||||||
{ E1, {"mcl_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:cookie", 6, 10 } },
|
||||||
},
|
{ E1, { "mcl_cake:cake", 1, 1 } },
|
||||||
{
|
|
||||||
{ E1, { "mcl_farming:carrot_item_gold", 3, 10 } },
|
|
||||||
{ E1, { "mcl_potions:speckled_melon", 4, 1 } },
|
|
||||||
TRADE_V6_BIRCH_SAPLING,
|
TRADE_V6_BIRCH_SAPLING,
|
||||||
TRADE_V6_DARK_OAK_SAPLING,
|
TRADE_V6_DARK_OAK_SAPLING,
|
||||||
TRADE_V6_ACACIA_SAPLING,
|
TRADE_V6_ACACIA_SAPLING,
|
||||||
|
@ -104,81 +95,32 @@ local professions = {
|
||||||
fisherman = {
|
fisherman = {
|
||||||
name = N("Fisherman"),
|
name = N("Fisherman"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
jobsite = "mcl_barrels:barrel_closed",
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } },
|
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } },
|
||||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||||
{ { "mcl_core:coal_lump", 15, 10 }, E1 },
|
{ { "mcl_core:emerald", 3, 11 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
||||||
-- FIXME missing: bucket of cod + fish should be cod.
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_fishing:fish_raw", 6, 15,}, E1 },
|
|
||||||
{ { "mcl_fishing:salmon_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:salmon_cooked", 6, 6 } },
|
|
||||||
-- FIXME missing campfire
|
|
||||||
-- {{ "mcl_core:emerald", 1, 2 },{"mcl_campfires:campfire",1,1} },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_fishing:salmon_raw", 6, 13,}, E1 },
|
|
||||||
{ { "mcl_core:emerald", 7, 22 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_fishing:clownfish_raw", 6, 6,}, E1 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_fishing:pufferfish_raw", 4, 4,}, E1 },
|
|
||||||
|
|
||||||
{ { "mcl_boats:boat", 1, 1,}, E1 },
|
|
||||||
{ { "mcl_boats:boat_acacia", 1, 1,}, E1 },
|
|
||||||
{ { "mcl_boats:boat_spruce", 1, 1,}, E1 },
|
|
||||||
{ { "mcl_boats:boat_dark_oak", 1, 1,}, E1 },
|
|
||||||
{ { "mcl_boats:boat_birch", 1, 1,}, E1 },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
fletcher = {
|
fletcher = {
|
||||||
name = N("Fletcher"),
|
name = N("Fletcher"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
jobsite = "mcl_fletching_table:fletching_table",
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||||
{ E1, { "mcl_bows:arrow", 8, 12 } },
|
{ E1, { "mcl_bows:arrow", 8, 12 } },
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
{ { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } },
|
{ { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } },
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_core:flint", 26, 26 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } },
|
{ { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } },
|
||||||
},
|
},
|
||||||
{
|
|
||||||
{ { "mcl_mobitems:string", 14, 14 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_bows:crossbow", 1, 1 } },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_mobitems:string", 24, 24 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 7, 21 } , { "mcl_bows:bow_enchanted", 1, 1 } },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
--FIXME: supposed to be tripwire hook{ { "tripwirehook", 24, 24 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 8, 22 } , { "mcl_bows:crossbow_enchanted", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:healing_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:harming_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:night_vision_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:swiftness_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:slowness_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:leaping_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:poison_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:regeneration_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:invisibility_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:water_breathing_arrow", 5, 5 } },
|
|
||||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:fire_resistance_arrow", 5, 5 } },
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
shepherd ={
|
shepherd ={
|
||||||
name = N("Shepherd"),
|
name = N("Shepherd"),
|
||||||
texture = "mobs_mc_villager_farmer.png",
|
texture = "mobs_mc_villager_farmer.png",
|
||||||
jobsite = "mcl_loom:loom",
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_wool:white", 16, 22 }, E1 },
|
{ { "mcl_wool:white", 16, 22 }, E1 },
|
||||||
|
@ -208,262 +150,179 @@ local professions = {
|
||||||
librarian = {
|
librarian = {
|
||||||
name = N("Librarian"),
|
name = N("Librarian"),
|
||||||
texture = "mobs_mc_villager_librarian.png",
|
texture = "mobs_mc_villager_librarian.png",
|
||||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: lectern
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||||
{ { "mcl_books:book", 8, 10 }, E1 },
|
{ { "mcl_books:book", 8, 10 }, E1 },
|
||||||
{ { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 }},
|
{ { "mcl_core:emerald", 10, 12 }, { "mcl_compass:compass", 1 ,1 }},
|
||||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 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_books:written_book", 2, 2 }, E1 },
|
||||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
{ { "mcl_core:emerald", 10, 12 }, { "mcl_clock:clock", 1, 1 } },
|
||||||
{ E1, { "mcl_lanterns:lantern_floor", 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 },
|
{ E1, { "mcl_core:glass", 3, 5 } },
|
||||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||||
{ E1, { "mcl_core:glass", 4, 4 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ E1, { "mcl_books:writable_book", 1, 1 } },
|
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
|
||||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_compass:compass", 1 ,1 }},
|
|
||||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_clock:clock", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:emerald", 20, 20 }, { "mcl_mobs:nametag", 1, 1 } },
|
{ { "mcl_core:emerald", 20, 22 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cartographer = {
|
cartographer = {
|
||||||
name = N("Cartographer"),
|
name = N("Cartographer"),
|
||||||
texture = "mobs_mc_villager_librarian.png",
|
texture = "mobs_mc_villager_librarian.png",
|
||||||
jobsite = "mcl_cartography_table:cartography_table",
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:paper", 24, 24 }, E1 },
|
{ { "mcl_core:paper", 24, 36 }, 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_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 } },
|
-- subject to special checks
|
||||||
|
{ { "mcl_compass:compass", 1, 1 }, E1 },
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
-- TODO: replace with empty map
|
||||||
|
{ { "mcl_core:emerald", 7, 11}, { "mcl_maps:filled_map", 1, 1 } },
|
||||||
|
},
|
||||||
|
|
||||||
-- TODO: special maps
|
-- TODO: special maps
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
armorer = {
|
armorer = {
|
||||||
name = N("Armorer"),
|
name = N("Armorer"),
|
||||||
texture = "mobs_mc_villager_smith.png",
|
texture = "mobs_mc_villager_smith.png",
|
||||||
jobsite = "mcl_core:lava_source", --FIXME: blast furnace
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
{ { "mcl_core:emerald", 4, 6 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 9, 9 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:leggings_iron", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_iron", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||||
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
{ { "mcl_core:emerald", 10, 14 }, { "mcl_armor:chestplate_iron", 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:emerald", 19, 33 }, { "mcl_armor:leggings_diamond_enchanted", 1, 1 } },
|
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:boots_diamond_enchanted", 1, 1 } },
|
{ { "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", 5, 7 }, { "mcl_armor:boots_chain", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 21, 35 }, { "mcl_armor:chestplate_diamond_enchanted", 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 = {
|
leatherworker = {
|
||||||
name = N("Leatherworker"),
|
name = N("Leatherworker"),
|
||||||
texture = "mobs_mc_villager_butcher.png",
|
texture = "mobs_mc_villager_butcher.png",
|
||||||
jobsite = "mcl_cauldrons:cauldron",
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:leather", 9, 12 }, E1 },
|
{ { "mcl_mobitems:leather", 9, 12 }, E1 },
|
||||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
{ { "mcl_core:emerald", 2, 4 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
||||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 2, 4 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:flint", 26, 26 }, E1 },
|
{ { "mcl_core:emerald", 7, 12 }, { "mcl_armor:chestplate_leather_enchanted", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
|
||||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_leather", 2, 4 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:rabbit_hide", 9, 9 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 1, 1 } },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
--{ { "FIXME: scute", 4, 4 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } },
|
{ { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||||
},
|
},
|
||||||
{
|
|
||||||
{ { "mcl_core:emerald", 6, 6 }, { "mcl_mobitems:saddle", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
butcher = {
|
butcher = {
|
||||||
name = N("Butcher"),
|
name = N("Butcher"),
|
||||||
texture = "mobs_mc_villager_butcher.png",
|
texture = "mobs_mc_villager_butcher.png",
|
||||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smoker
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:beef", 14, 14 }, E1 },
|
{ { "mcl_mobitems:beef", 14, 18 }, E1 },
|
||||||
{ { "mcl_mobitems:chicken", 7, 7 }, E1 },
|
{ { "mcl_mobitems:chicken", 14, 18 }, E1 },
|
||||||
{ { "mcl_mobitems:rabbit", 4, 4 }, E1 },
|
|
||||||
{ E1, { "mcl_mobitems:rabbit_stew", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||||
{ E1, { "mcl_mobitems:cooked_porkchop", 5, 5 } },
|
{ E1, { "mcl_mobitems:cooked_beef", 5, 7 } },
|
||||||
{ E1, { "mcl_mobitems:cooked_chicken", 8, 8 } },
|
{ E1, { "mcl_mobitems:cooked_chicken", 6, 8 } },
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
|
||||||
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
|
||||||
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
--{ { "FIXME: Sweet Berries", 10, 10 }, E1 },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
weapon_smith = {
|
weapon_smith = {
|
||||||
name = N("Weapon Smith"),
|
name = N("Weapon Smith"),
|
||||||
texture = "mobs_mc_villager_smith.png",
|
texture = "mobs_mc_villager_smith.png",
|
||||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: grindstone
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_tools:axe_iron", 1, 1 } },
|
{ { "mcl_core:emerald", 6, 8 }, { "mcl_tools:axe_iron", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||||
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
{ { "mcl_core:emerald", 9, 10 }, { "mcl_tools:sword_iron_enchanted", 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: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 = {
|
tool_smith = {
|
||||||
name = N("Tool Smith"),
|
name = N("Tool Smith"),
|
||||||
texture = "mobs_mc_villager_smith.png",
|
texture = "mobs_mc_villager_smith.png",
|
||||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smithing table
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||||
{ E1, { "mcl_tools:axe_stone", 1, 1 } },
|
{ { "mcl_core:emerald", 5, 7 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
||||||
{ E1, { "mcl_tools:shovel_stone", 1, 1 } },
|
|
||||||
{ E1, { "mcl_tools:pick_stone", 1, 1 } },
|
|
||||||
{ E1, { "mcl_farming:hoe_stone", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||||
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
{ { "mcl_core:emerald", 9, 11 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:flint", 30, 30 }, E1 },
|
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||||
{ { "mcl_core:emerald", 6, 20 }, { "mcl_tools:axe_iron_enchanted", 1, 1 } },
|
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
||||||
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 8, 22 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_farming:hoe_diamond", 1, 1 } },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_core:diamond", 1, 1 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
|
||||||
{ { "mcl_core:emerald", 10, 24 }, { "mcl_tools:shovel_diamond_enchanted", 1, 1 } },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { "mcl_core:emerald", 18, 32 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cleric = {
|
cleric = {
|
||||||
name = N("Cleric"),
|
name = N("Cleric"),
|
||||||
texture = "mobs_mc_villager_priest.png",
|
texture = "mobs_mc_villager_priest.png",
|
||||||
jobsite = "mcl_brewing:stand",
|
|
||||||
trades = {
|
trades = {
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:rotten_flesh", 32, 32 }, E1 },
|
{ { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 },
|
||||||
{ E1, { "mesecons:redstone", 2, 2 } },
|
{ { "mcl_core:gold_ingot", 8, 10 }, E1 },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_core:gold_ingot", 3, 3 }, E1 },
|
{ E1, { "mesecons:redstone", 1, 4 } },
|
||||||
{ E1, { "mcl_dye:blue", 1, 1 } },
|
{ E1, { "mcl_dye:blue", 1, 2 } },
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_mobitems:rabbit_foot", 2, 2 }, E1 },
|
{ E1, { "mcl_nether:glowstone", 1, 3 } },
|
||||||
{ E1, { "mcl_nether:glowstone", 4, 4 } },
|
{ { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
||||||
},
|
|
||||||
{
|
|
||||||
--{ { "FIXME: scute", 4, 4 }, E1 },
|
|
||||||
{ { "mcl_potions:glass_bottle", 9, 9 }, E1 },
|
|
||||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
|
||||||
TRADE_V6_RED_SANDSTONE,
|
TRADE_V6_RED_SANDSTONE,
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{ { "mcl_nether:nether_wart_item", 22, 22 }, E1 },
|
{ { "mcl_nether:nether_wart_item", 22, 22 }, E1 },
|
||||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } },
|
{ { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } },
|
||||||
|
@ -488,42 +347,6 @@ local stand_still = function(self)
|
||||||
self.jump = false
|
self.jump = false
|
||||||
end
|
end
|
||||||
|
|
||||||
local function set_velocity(self, v)
|
|
||||||
local yaw = (self.object:get_yaw() or 0) + self.rotate
|
|
||||||
self.object:set_velocity({
|
|
||||||
x = (math.sin(yaw) * -v),
|
|
||||||
y = self.object:get_velocity().y,
|
|
||||||
z = (math.cos(yaw) * v),
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
local function go_to_pos(entity,b)
|
|
||||||
local s=entity.object:get_pos()
|
|
||||||
local v = { x = b.x - s.x, z = b.z - s.z }
|
|
||||||
local yaw = (math.atan(v.z / v.x) + math.pi / 2) - entity.rotate
|
|
||||||
if b.x > s.x then yaw = yaw + math.pi end
|
|
||||||
entity.object:set_yaw(yaw)
|
|
||||||
set_velocity(entity,entity.follow_velocity)
|
|
||||||
if vector.distance(b,s) < 5 then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function go_home(entity)
|
|
||||||
entity.state = "go_home"
|
|
||||||
local b=entity.bed
|
|
||||||
if not b then return end
|
|
||||||
if go_to_pos(entity,b) then
|
|
||||||
entity.state = "stand"
|
|
||||||
set_velocity(entity,0)
|
|
||||||
entity.object:set_pos(b)
|
|
||||||
local n=minetest.get_node(b)
|
|
||||||
if n and n.name ~= "mcl_beds:bed_red_bottom" then
|
|
||||||
entity.bed=nil --the stormtroopers have killed uncle owen
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local update_max_tradenum = function(self)
|
local update_max_tradenum = function(self)
|
||||||
if not self._trades then
|
if not self._trades then
|
||||||
return
|
return
|
||||||
|
@ -1164,19 +987,11 @@ mobs:register_mob("mobs_mc:villager", {
|
||||||
die_end = 220,
|
die_end = 220,
|
||||||
die_loop = false,
|
die_loop = false,
|
||||||
},
|
},
|
||||||
follow = mobs_mc.follow.villager,
|
|
||||||
view_range = 16,
|
view_range = 16,
|
||||||
fear_height = 4,
|
fear_height = 4,
|
||||||
jump = true,
|
jump = true,
|
||||||
walk_chance = DEFAULT_WALK_CHANCE,
|
walk_chance = DEFAULT_WALK_CHANCE,
|
||||||
on_rightclick = function(self, clicker)
|
on_rightclick = function(self, clicker)
|
||||||
if clicker:get_wielded_item():get_name() == "mcl_farming:bread" then
|
|
||||||
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
|
||||||
if mobs:protect(self, clicker) then return end
|
|
||||||
end
|
|
||||||
if self.child then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- Initiate trading
|
-- Initiate trading
|
||||||
local name = clicker:get_player_name()
|
local name = clicker:get_player_name()
|
||||||
self._trading_players[name] = true
|
self._trading_players[name] = true
|
||||||
|
@ -1218,11 +1033,6 @@ mobs:register_mob("mobs_mc:villager", {
|
||||||
if not self._player_scan_timer then
|
if not self._player_scan_timer then
|
||||||
self._player_scan_timer = 0
|
self._player_scan_timer = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.bed and ( self.state == "go_home" or vector.distance(self.object:get_pos(),self.bed) > 50 ) then
|
|
||||||
go_home(self)
|
|
||||||
end
|
|
||||||
|
|
||||||
self._player_scan_timer = self._player_scan_timer + dtime
|
self._player_scan_timer = self._player_scan_timer + dtime
|
||||||
-- Check infrequently to keep CPU load low
|
-- Check infrequently to keep CPU load low
|
||||||
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then
|
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then
|
||||||
|
|
|
@ -197,6 +197,7 @@ mobs:spawn_specific(
|
||||||
"ExtremeHills+",
|
"ExtremeHills+",
|
||||||
"Forest",
|
"Forest",
|
||||||
"Plains",
|
"Plains",
|
||||||
|
"Desert",
|
||||||
"ColdTaiga",
|
"ColdTaiga",
|
||||||
"MushroomIsland",
|
"MushroomIsland",
|
||||||
"IcePlainsSpikes",
|
"IcePlainsSpikes",
|
||||||
|
@ -289,6 +290,7 @@ mobs:spawn_specific(
|
||||||
"ExtremeHills+",
|
"ExtremeHills+",
|
||||||
"Forest",
|
"Forest",
|
||||||
"Plains",
|
"Plains",
|
||||||
|
"Desert",
|
||||||
"ColdTaiga",
|
"ColdTaiga",
|
||||||
"MushroomIsland",
|
"MushroomIsland",
|
||||||
"IcePlainsSpikes",
|
"IcePlainsSpikes",
|
||||||
|
@ -340,6 +342,9 @@ mobs:spawn_specific(
|
||||||
"ground",
|
"ground",
|
||||||
{
|
{
|
||||||
"Desert",
|
"Desert",
|
||||||
|
"SavannaM",
|
||||||
|
"Savanna",
|
||||||
|
"Savanna_beach",
|
||||||
},
|
},
|
||||||
0,
|
0,
|
||||||
7,
|
7,
|
||||||
|
@ -354,6 +359,9 @@ mobs:spawn_specific(
|
||||||
"ground",
|
"ground",
|
||||||
{
|
{
|
||||||
"Desert",
|
"Desert",
|
||||||
|
"SavannaM",
|
||||||
|
"Savanna",
|
||||||
|
"Savanna_beach",
|
||||||
},
|
},
|
||||||
0,
|
0,
|
||||||
7,
|
7,
|
||||||
|
|
|
@ -28,7 +28,7 @@ local function check_player(player)
|
||||||
end
|
end
|
||||||
|
|
||||||
mcl_weather.nether_dust.add_particlespawners = function(player)
|
mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||||
local name=player:get_player_name()
|
local name=player:get_player_name(name)
|
||||||
mcl_weather.nether_dust.particlespawners[name]={}
|
mcl_weather.nether_dust.particlespawners[name]={}
|
||||||
psdef.playername = name
|
psdef.playername = name
|
||||||
psdef.attached = player
|
psdef.attached = player
|
||||||
|
@ -40,7 +40,7 @@ mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||||
end
|
end
|
||||||
|
|
||||||
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
||||||
local name=player:get_player_name()
|
local name=player:get_player_name(name)
|
||||||
if mcl_weather.nether_dust.particlespawners[name] then
|
if mcl_weather.nether_dust.particlespawners[name] then
|
||||||
for i=1,3 do
|
for i=1,3 do
|
||||||
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
||||||
|
|
|
@ -21,13 +21,9 @@ minetest.register_chatcommand("awards", {
|
||||||
description = S("Show, clear, disable or enable your achievements"),
|
description = S("Show, clear, disable or enable your achievements"),
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
if param == "clear" then
|
if param == "clear" then
|
||||||
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)
|
awards.clear_player(name)
|
||||||
minetest.chat_send_player(name,
|
minetest.chat_send_player(name,
|
||||||
S("All your awards and statistics have been cleared. You can now start again."))
|
S("All your awards and statistics have been cleared. You can now start again."))
|
||||||
end
|
|
||||||
elseif param == "disable" then
|
elseif param == "disable" then
|
||||||
awards.disable(name)
|
awards.disable(name)
|
||||||
minetest.chat_send_player(name, S("You have disabled your achievements."))
|
minetest.chat_send_player(name, S("You have disabled your achievements."))
|
||||||
|
@ -35,19 +31,11 @@ minetest.register_chatcommand("awards", {
|
||||||
awards.enable(name)
|
awards.enable(name)
|
||||||
minetest.chat_send_player(name, S("You have enabled your achievements."))
|
minetest.chat_send_player(name, S("You have enabled your achievements."))
|
||||||
elseif param == "c" then
|
elseif param == "c" then
|
||||||
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)
|
awards.show_to(name, name, nil, true)
|
||||||
end
|
|
||||||
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
|
else
|
||||||
awards.show_to(name, name, nil, false)
|
awards.show_to(name, name, nil, false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_privilege("achievements", {
|
minetest.register_privilege("achievements", {
|
||||||
|
|
|
@ -61,4 +61,3 @@ Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht.
|
||||||
Write something in chat.=Schreiben Sie etwas in den Chat.
|
Write something in chat.=Schreiben Sie etwas in den Chat.
|
||||||
Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten.
|
Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten.
|
||||||
@1/@2 chat messages=@1/@2 Chatnachrichten
|
@1/@2 chat messages=@1/@2 Chatnachrichten
|
||||||
Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden!
|
|
|
@ -61,4 +61,3 @@ Achievement “@1” does not exist.=
|
||||||
@1 has made the achievement @2=
|
@1 has made the achievement @2=
|
||||||
Mine a block: @1=
|
Mine a block: @1=
|
||||||
Mine blocks: @1×@2=
|
Mine blocks: @1×@2=
|
||||||
Awards are disabled, enable them first by using /awards enable!=
|
|
||||||
|
|
|
@ -339,6 +339,14 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
||||||
if name == "inv" then
|
if name == "inv" then
|
||||||
inv_bg = "crafting_inventory_creative_survival.png"
|
inv_bg = "crafting_inventory_creative_survival.png"
|
||||||
|
|
||||||
|
-- Show armor and player image
|
||||||
|
local player_preview
|
||||||
|
if minetest.settings:get_bool("3d_player_preview", true) then
|
||||||
|
player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")
|
||||||
|
else
|
||||||
|
player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]"
|
||||||
|
end
|
||||||
|
|
||||||
-- Background images for armor slots (hide if occupied)
|
-- Background images for armor slots (hide if occupied)
|
||||||
local armor_slot_imgs = ""
|
local armor_slot_imgs = ""
|
||||||
local inv = player:get_inventory()
|
local inv = player:get_inventory()
|
||||||
|
@ -377,7 +385,7 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
||||||
mcl_formspec.get_itemslot_bg(1.5,2.025,1,1)..
|
mcl_formspec.get_itemslot_bg(1.5,2.025,1,1)..
|
||||||
armor_slot_imgs..
|
armor_slot_imgs..
|
||||||
-- player preview
|
-- player preview
|
||||||
mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")..
|
player_preview..
|
||||||
-- crafting guide button
|
-- crafting guide button
|
||||||
"image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]"..
|
"image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]"..
|
||||||
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
|
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
|
||||||
|
|
|
@ -60,6 +60,14 @@ local function set_inventory(player, armor_change_only)
|
||||||
inv:set_width("craft", 2)
|
inv:set_width("craft", 2)
|
||||||
inv:set_size("craft", 4)
|
inv:set_size("craft", 4)
|
||||||
|
|
||||||
|
-- Show armor and player image
|
||||||
|
local player_preview
|
||||||
|
if minetest.settings:get_bool("3d_player_preview", true) then
|
||||||
|
player_preview = mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")
|
||||||
|
else
|
||||||
|
player_preview = "image[1.1,0.2;2,4;"..mcl_player.player_get_preview(player).."]"
|
||||||
|
end
|
||||||
|
|
||||||
local armor_slots = {"helmet", "chestplate", "leggings", "boots"}
|
local armor_slots = {"helmet", "chestplate", "leggings", "boots"}
|
||||||
local armor_slot_imgs = ""
|
local armor_slot_imgs = ""
|
||||||
for a=1,4 do
|
for a=1,4 do
|
||||||
|
@ -74,7 +82,7 @@ local function set_inventory(player, armor_change_only)
|
||||||
|
|
||||||
local form = "size[9,8.75]"..
|
local form = "size[9,8.75]"..
|
||||||
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
|
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
|
||||||
mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")..
|
player_preview..
|
||||||
--armor
|
--armor
|
||||||
"list[current_player;armor;0,0;1,1;1]"..
|
"list[current_player;armor;0,0;1,1;1]"..
|
||||||
"list[current_player;armor;0,1;1,1;2]"..
|
"list[current_player;armor;0,1;1,1;2]"..
|
||||||
|
|
|
@ -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.
|
-- For nodes which ignore sticky sides.
|
||||||
-- They can't be pulled by sticky pistons and don't interact with slime blocks.
|
-- They can't be pulled by sticky pistons and don't interact with slime blocks.
|
||||||
|
-- TODO: This has NOT any actual effect so far. The actual functionality
|
||||||
|
-- still needs to be implemented.
|
||||||
function mesecon.register_mvps_unsticky(nodename, get_unsticky)
|
function mesecon.register_mvps_unsticky(nodename, get_unsticky)
|
||||||
if get_unsticky == nil then
|
if get_unsticky == nil then
|
||||||
get_unsticky = true
|
get_unsticky = true
|
||||||
|
@ -64,6 +66,9 @@ function mesecon.is_mvps_unsticky(node, pulldir, stack, stackid)
|
||||||
if type(get_unsticky) == "function" then
|
if type(get_unsticky) == "function" then
|
||||||
get_unsticky = get_unsticky(node, pulldir, stack, stackid)
|
get_unsticky = get_unsticky(node, pulldir, stack, stackid)
|
||||||
end
|
end
|
||||||
|
if get_unsticky == nil then
|
||||||
|
get_unsticky = false
|
||||||
|
end
|
||||||
|
|
||||||
return get_unsticky
|
return get_unsticky
|
||||||
end
|
end
|
||||||
|
@ -206,16 +211,8 @@ function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon.mvps_pull_single(pos, dir, maximum, player_name, piston_pos)
|
function mesecon.mvps_pull_single(pos, dir, maximum, player_name, piston_pos)
|
||||||
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)
|
return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- pos: pos of mvps; stackdir: direction of building the stack
|
-- pos: pos of mvps; stackdir: direction of building the stack
|
||||||
-- movedir: direction of actual movement
|
-- movedir: direction of actual movement
|
||||||
|
@ -360,14 +357,13 @@ function mesecon.mvps_move_objects(pos, dir, nodestack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Unmovable by design: nodes
|
-- Unmovable by design
|
||||||
mesecon.register_mvps_stopper("mcl_core:barrier")
|
mesecon.register_mvps_stopper("mcl_core:barrier")
|
||||||
mesecon.register_mvps_stopper("mcl_core:realm_barrier")
|
mesecon.register_mvps_stopper("mcl_core:realm_barrier")
|
||||||
mesecon.register_mvps_stopper("mcl_core:void")
|
mesecon.register_mvps_stopper("mcl_core:void")
|
||||||
mesecon.register_mvps_stopper("mcl_core:bedrock")
|
mesecon.register_mvps_stopper("mcl_core:bedrock")
|
||||||
mesecon.register_mvps_stopper("mcl_core:obsidian")
|
mesecon.register_mvps_stopper("mcl_core:obsidian")
|
||||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest")
|
mesecon.register_mvps_stopper("mcl_chests:ender_chest")
|
||||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest_small")
|
|
||||||
mesecon.register_mvps_stopper("mcl_mobspawners:spawner")
|
mesecon.register_mvps_stopper("mcl_mobspawners:spawner")
|
||||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off")
|
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off")
|
||||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on")
|
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on")
|
||||||
|
@ -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:portal_end")
|
||||||
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame")
|
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame")
|
||||||
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye")
|
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye")
|
||||||
mesecon.register_mvps_stopper("mcl_enchanting:table")
|
|
||||||
mesecon.register_mvps_stopper("mcl_jukebox:jukebox")
|
|
||||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_on")
|
|
||||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_off")
|
|
||||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on")
|
|
||||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off")
|
|
||||||
mesecon.register_mvps_stopper("mcl_banners:hanging_banner")
|
|
||||||
mesecon.register_mvps_stopper("mcl_banners:standing_banner")
|
|
||||||
|
|
||||||
-- Unmovable by technical restrictions.
|
-- Unmovable by technical restrictions.
|
||||||
-- Open formspec would screw up if node is destroyed (minor problem)
|
-- Open formspec would screw up if node is destroyed (minor problem)
|
||||||
-- Would screw up on/off state of trapped chest (big problem)
|
|
||||||
mesecon.register_mvps_stopper("mcl_furnaces:furnace")
|
mesecon.register_mvps_stopper("mcl_furnaces:furnace")
|
||||||
mesecon.register_mvps_stopper("mcl_furnaces:furnace_active")
|
mesecon.register_mvps_stopper("mcl_furnaces:furnace_active")
|
||||||
mesecon.register_mvps_stopper("mcl_hoppers:hopper")
|
mesecon.register_mvps_stopper("mcl_hoppers:hopper")
|
||||||
|
@ -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")
|
||||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1")
|
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1")
|
||||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2")
|
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2")
|
||||||
mesecon.register_mvps_stopper("mcl_chests:chest")
|
-- Would screw up on/off state of trapped chest (big problem)
|
||||||
mesecon.register_mvps_stopper("mcl_chests:chest_small")
|
|
||||||
mesecon.register_mvps_stopper("mcl_chests:chest_left")
|
|
||||||
mesecon.register_mvps_stopper("mcl_chests:chest_right")
|
|
||||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest")
|
|
||||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_small")
|
|
||||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left")
|
|
||||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right")
|
|
||||||
mesecon.register_mvps_stopper("mcl_signs:wall_sign")
|
|
||||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign")
|
|
||||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5")
|
|
||||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign45")
|
|
||||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5")
|
|
||||||
mesecon.register_mvps_stopper("mcl_barrels:barrel_open")
|
|
||||||
mesecon.register_mvps_stopper("mcl_barrels:barrel_closed")
|
|
||||||
|
|
||||||
|
-- Glazed terracotta: unpullable
|
||||||
-- Unmovable by design: objects
|
|
||||||
mesecon.register_mvps_unmov("mcl_enchanting:book")
|
|
||||||
mesecon.register_mvps_unmov("mcl_chests:chest")
|
|
||||||
mesecon.register_mvps_unmov("mcl_banners:hanging_banner")
|
|
||||||
mesecon.register_mvps_unmov("mcl_banners:standing_banner")
|
|
||||||
mesecon.register_mvps_unmov("mcl_signs:text")
|
|
||||||
mesecon.register_mvps_unmov("mcl_mobspawners:doll")
|
|
||||||
mesecon.register_mvps_unmov("mcl_armor_stand:armor_entity")
|
|
||||||
mesecon.register_mvps_unmov("mcl_itemframes:item")
|
|
||||||
mesecon.register_mvps_unmov("mcl_itemframes:map")
|
|
||||||
mesecon.register_mvps_unmov("mcl_paintings:painting")
|
|
||||||
mesecon.register_mvps_unmov("mcl_end:crystal")
|
|
||||||
|
|
||||||
|
|
||||||
-- Unpullable by design: nodes
|
|
||||||
-- Glazed Terracotta
|
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow")
|
||||||
|
@ -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_brown")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink")
|
||||||
-- Beds
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_black_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_black_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_blue_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_blue_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_brown_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_brown_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_green_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_green_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_grey_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_grey_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_lime_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_lime_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_orange_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_orange_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_pink_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_pink_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_purple_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_purple_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_red_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_red_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_silver_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_silver_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_white_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_white_bottom")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_bottom")
|
|
||||||
-- Buttons
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_stone_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_stone_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_wood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_wood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_on")
|
|
||||||
-- Cactus, Sugarcane & Vines
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:cactus")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:reeds")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:vine")
|
|
||||||
-- Cake
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cake:cake_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cake:cake_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cake:cake_3")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cake:cake_4")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cake:cake_5")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cake:cake_6")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cake:cake")
|
|
||||||
-- Carpet
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:black_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:blue_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:brown_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:cyan_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:green_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:grey_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:light_blue_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:lime_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:orange_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:magenta_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:pink_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:purple_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:red_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:silver_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:white_carpet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_wool:yellow_carpet")
|
|
||||||
-- Carved & Jack O'Lantern Pumpkins, Pumpkin & Melon
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face_light")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:melon")
|
|
||||||
-- Chorus Plant & Flower
|
|
||||||
mesecon.register_mvps_unsticky("mcl_end:chorus_plant")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_end:chorus_flower")
|
|
||||||
-- Cobweb
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:cobweb")
|
|
||||||
-- Cocoa
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_3")
|
|
||||||
-- Doors
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_2")
|
|
||||||
-- Dragon Egg
|
|
||||||
mesecon.register_mvps_unsticky("mcl_end:dragon_egg")
|
|
||||||
-- Fire
|
|
||||||
mesecon.register_mvps_unsticky("mcl_fire:fire")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_fire:eternal_fire")
|
|
||||||
-- Flower Pots
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_allium")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_azure_bluet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_blue_orchid")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_dandelion")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_fern")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_oxeye_daisy")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_poppy")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_orange")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_pink")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_red")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_white")
|
|
||||||
-- Flowers, Lilypad & Dead Bush
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:deadbush")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:allium")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:azure_bluet")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:blue_orchid")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:dandelion")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:double_fern")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:double_fern_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:fern")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:lilac")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:lilac_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:oxeye_daisy")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:peony")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:peony_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:poppy")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:rose_bush")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:rose_bush_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:sunflower")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:sunflower_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:tallgrass")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:double_grass")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:double_grass_top")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_orange")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_pink")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_red")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_white")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_flowers:waterlily")
|
|
||||||
-- Heads
|
|
||||||
mesecon.register_mvps_unsticky("mcl_heads:creeper")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_heads:skeleton")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_heads:steve")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_heads:wither_skeleton")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_heads:zombie")
|
|
||||||
-- Item Frame
|
|
||||||
mesecon.register_mvps_unsticky("mcl_itemframes:item_frame")
|
|
||||||
-- Ladder
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:ladder")
|
|
||||||
-- Lava & Water
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:lava_source")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:lava_flowing")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:water_source")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:water_flowing")
|
|
||||||
mesecon.register_mvps_unsticky("mclx_core:river_water_source")
|
|
||||||
mesecon.register_mvps_unsticky("mclx_core:river_water_flowing")
|
|
||||||
-- Leaves
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:leaves")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:acacialeaves")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:birchleaves")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:darkleaves")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:spruceleaves")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:jungleleaves")
|
|
||||||
-- Lever
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_on")
|
|
||||||
-- Mushrooms, Nether Wart & Amethyst
|
|
||||||
mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_brown")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_red")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_0")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_1")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_amethyst:amethyst_cluster")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_amethyst:budding_amethyst_block")
|
|
||||||
-- Pressure Plates
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawoood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucekwood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucewood_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_off")
|
|
||||||
-- Redstone Comparators
|
|
||||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_sub")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_sub")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_comp")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_comp")
|
|
||||||
-- Redstone Dust
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00000000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00000000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10000000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10000000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01000000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01000000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11000000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11000000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00100000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00100000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10100000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10100000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00010000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00010000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10010000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10010000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10001000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10001000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11001000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11001000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10101000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10101000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10011000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10011000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111000_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111000_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01000100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01000100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11000100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11000100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11001100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11001100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111100_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111100_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00100010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00100010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10100010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10100010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10101010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10101010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111010_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111010_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100110_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01100110_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100110_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11100110_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110110_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110110_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110110_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110110_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101110_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11101110_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111110_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111110_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00010001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00010001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10010001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10010001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10011001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10011001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111001_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111001_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010101_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01010101_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010101_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11010101_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110101_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110101_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110101_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110101_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011101_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11011101_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111101_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111101_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110011_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_00110011_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110011_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10110011_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110011_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110011_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110011_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110011_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111011_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_10111011_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111011_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111011_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110111_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_01110111_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110111_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11110111_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111111_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons:wire_11111111_off")
|
|
||||||
-- Redstone Repeater
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_1")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_2")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_3")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_4")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_1")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_2")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_3")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_4")
|
|
||||||
-- Redstone Torch
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on_wall")
|
|
||||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off_wall")
|
|
||||||
-- Sea Pickle
|
|
||||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_1_dead_brain_coral_block")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_2_dead_brain_coral_block")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_3_dead_brain_coral_block")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_4_dead_brain_coral_block")
|
|
||||||
-- Shulker chests
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:black_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:blue_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:brown_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:cyan_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:green_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:light_blue_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:lime_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:orange_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:magenta_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:pink_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:purple_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:red_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:silver_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:white_shulker_box_small")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_chests:yellow_shulker_box_small")
|
|
||||||
-- Snow
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow_3")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow_4")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow_5")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow_6")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow_7")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_core:snow_8")
|
|
||||||
-- Torch
|
|
||||||
mesecon.register_mvps_unsticky("mcl_torches:torch")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_torches:torch_wall")
|
|
||||||
-- Wheat
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:wheat")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_2")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_3")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_4")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_5")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_6")
|
|
||||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_7")
|
|
||||||
|
|
||||||
-- Includes node heat when moving them
|
-- Includes node heat when moving them
|
||||||
mesecon.register_on_mvps_move(mesecon.move_hot_nodes)
|
mesecon.register_on_mvps_move(mesecon.move_hot_nodes)
|
||||||
|
|
|
@ -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,6 +87,16 @@ mcl_armor.register_set({
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
--WARNING: 2d preview is deprecated and will be removed soon
|
||||||
|
--specify textures that will be shown in player inventory then you disabled the 3d player inventory preview
|
||||||
|
--its similar to how works the textures field
|
||||||
|
previews = {
|
||||||
|
head = "dummy_texture.png", --default: "<modname>_helmet_<material>_preview.png"
|
||||||
|
torso = "dummy_texture.png", --default: "<modname>_chestplate_<material>_preview.png"
|
||||||
|
legs = "dummy_texture.png", --default: "<modname>_leggings_<material>_preview.png"
|
||||||
|
feet = "dummy_texture.png", --default: "<modname>_boots_<material>_preview.png"
|
||||||
|
},
|
||||||
|
|
||||||
--inventory textures aren't definable using a table similar to textures or previews
|
--inventory textures aren't definable using a table similar to textures or previews
|
||||||
--you are forced to use the default texture names which are:
|
--you are forced to use the default texture names which are:
|
||||||
--head: "<modname>_inv_helmet_<material>.png
|
--head: "<modname>_inv_helmet_<material>.png
|
||||||
|
|
|
@ -94,6 +94,7 @@ function mcl_armor.register_set(def)
|
||||||
local on_unequip_callbacks = def.on_unequip_callbacks or {}
|
local on_unequip_callbacks = def.on_unequip_callbacks or {}
|
||||||
local on_break_callbacks = def.on_break_callbacks or {}
|
local on_break_callbacks = def.on_break_callbacks or {}
|
||||||
local textures = def.textures or {}
|
local textures = def.textures or {}
|
||||||
|
local previews = def.previews or {}
|
||||||
local durabilities = def.durabilities or {}
|
local durabilities = def.durabilities or {}
|
||||||
local element_groups = def.element_groups or {}
|
local element_groups = def.element_groups or {}
|
||||||
|
|
||||||
|
@ -133,6 +134,7 @@ function mcl_armor.register_set(def)
|
||||||
_on_break = on_break_callbacks[name] or def.on_break,
|
_on_break = on_break_callbacks[name] or def.on_break,
|
||||||
_mcl_armor_element = name,
|
_mcl_armor_element = name,
|
||||||
_mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png",
|
_mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png",
|
||||||
|
_mcl_armor_preview = previews[name] or modname .. "_" .. itemname .. "_preview.png",
|
||||||
})
|
})
|
||||||
|
|
||||||
if def.craft_material then
|
if def.craft_material then
|
||||||
|
@ -219,6 +221,17 @@ function mcl_armor.update(obj)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local preview = def._mcl_armor_preview
|
||||||
|
|
||||||
|
if obj:is_player() and preview then
|
||||||
|
if type(preview) == "function" then
|
||||||
|
preview = preview(obj, itemstack)
|
||||||
|
end
|
||||||
|
if preview then
|
||||||
|
info.preview = "(player.png^[opacity:0^" .. def._mcl_armor_preview .. ")" .. (info.preview and "^" .. info.preview or "" )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points")
|
info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points")
|
||||||
|
|
||||||
local mob_range_mob = def._mcl_armor_mob_range_mob
|
local mob_range_mob = def._mcl_armor_mob_range_mob
|
||||||
|
@ -241,6 +254,8 @@ function mcl_armor.update(obj)
|
||||||
info.texture = info.texture or "blank.png"
|
info.texture = info.texture or "blank.png"
|
||||||
|
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
|
info.preview = info.preview or "blank.png"
|
||||||
|
|
||||||
mcl_armor.update_player(obj, info)
|
mcl_armor.update_player(obj, info)
|
||||||
else
|
else
|
||||||
local luaentity = obj:get_luaentity()
|
local luaentity = obj:get_luaentity()
|
||||||
|
|
|
@ -63,7 +63,7 @@ mcl_player.player_register_model("mcl_armor_character_female.b3d", {
|
||||||
})
|
})
|
||||||
|
|
||||||
function mcl_armor.update_player(player, info)
|
function mcl_armor.update_player(player, info)
|
||||||
mcl_player.player_set_armor(player, info.texture)
|
mcl_player.player_set_armor(player, info.texture, info.preview)
|
||||||
|
|
||||||
local meta = player:get_meta()
|
local meta = player:get_meta()
|
||||||
meta:set_int("mcl_armor:armor_points", info.points)
|
meta:set_int("mcl_armor:armor_points", info.points)
|
||||||
|
|
After Width: | Height: | Size: 156 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 140 B |
After Width: | Height: | Size: 131 B |
After Width: | Height: | Size: 255 B |
After Width: | Height: | Size: 210 B |
After Width: | Height: | Size: 202 B |
After Width: | Height: | Size: 215 B |
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 149 B |
After Width: | Height: | Size: 208 B |
After Width: | Height: | Size: 190 B |
After Width: | Height: | Size: 162 B |
After Width: | Height: | Size: 147 B |
After Width: | Height: | Size: 133 B |
After Width: | Height: | Size: 197 B |
After Width: | Height: | Size: 171 B |
After Width: | Height: | Size: 168 B |
After Width: | Height: | Size: 165 B |
|
@ -10,4 +10,3 @@ local modpath = minetest.get_modpath("mcl_beds")
|
||||||
dofile(modpath .. "/functions.lua")
|
dofile(modpath .. "/functions.lua")
|
||||||
dofile(modpath .. "/api.lua")
|
dofile(modpath .. "/api.lua")
|
||||||
dofile(modpath .. "/beds.lua")
|
dofile(modpath .. "/beds.lua")
|
||||||
dofile(modpath .. "/respawn_anchor.lua")
|
|
|
@ -40,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 will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind.
|
||||||
You're in bed.=Sie sind im Bett.
|
You're in bed.=Sie sind im Bett.
|
||||||
Allows you to sleep=Zum Einschafen
|
Allows you to sleep=Zum Einschafen
|
||||||
Respawn Anchor=Seelenanker
|
|
|
@ -40,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 will fall asleep when @1% of all players are in bed.=
|
||||||
You're in bed.=
|
You're in bed.=
|
||||||
Allows you to sleep=
|
Allows you to sleep=
|
||||||
Respawn Anchor=
|
|
||||||
|
|
|
@ -2,4 +2,4 @@ name = mcl_beds
|
||||||
author = BlockMen
|
author = BlockMen
|
||||||
description =
|
description =
|
||||||
depends = playerphysics
|
depends = playerphysics
|
||||||
optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, 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"},
|
tiles = {"mcl_books_bookshelf_top.png", "mcl_books_bookshelf_top.png", "default_bookshelf.png"},
|
||||||
stack_max = 64,
|
stack_max = 64,
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
groups = {
|
groups = {handy=1,axey=1, flammable=3,building_block=1, material_wood=1, fire_encouragement=30, fire_flammability=20},
|
||||||
handy=1, axey=1, deco_block=1, material_wood=1,
|
|
||||||
flammable=3, fire_encouragement=30, fire_flammability=20
|
|
||||||
},
|
|
||||||
drop = "mcl_books:book 3",
|
drop = "mcl_books:book 3",
|
||||||
sounds = wood_sound,
|
sounds = wood_sound,
|
||||||
_mcl_blast_resistance = 1.5,
|
_mcl_blast_resistance = 1.5,
|
||||||
|
|