Compare commits
1 Commits
master
...
evokers_sp
Author | SHA1 | Date |
---|---|---|
cora | d35e3f78c7 |
21
CREDITS.md
|
@ -6,14 +6,10 @@
|
|||
## Creator of MineClone2
|
||||
* Wuzzy
|
||||
|
||||
|
||||
## Maintainers
|
||||
* Nicu
|
||||
* cora
|
||||
|
||||
## Previous Maintainers
|
||||
* Fleckenstein
|
||||
* jordan4ibanez
|
||||
* Nicu
|
||||
* kay27
|
||||
|
||||
## Developers
|
||||
* bzoss
|
||||
|
@ -26,7 +22,8 @@
|
|||
* aligator
|
||||
* Code-Sploit
|
||||
* NO11
|
||||
* kabou
|
||||
* cora
|
||||
* jordan4ibanez
|
||||
|
||||
## Contributors
|
||||
* Laurent Rocher
|
||||
|
@ -78,16 +75,6 @@
|
|||
* epCode
|
||||
* NO11
|
||||
* j45
|
||||
* 3raven
|
||||
* PrarieWind
|
||||
* Gustavo1
|
||||
* CableGuy67
|
||||
|
||||
## Mineclonia
|
||||
* erlehmann
|
||||
* Li0n
|
||||
* E
|
||||
* n_to
|
||||
|
||||
## Original Mod Authors
|
||||
* Wuzzy
|
||||
|
|
|
@ -41,7 +41,6 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
|||
* `flammable=-1` Does not get destroyed by fire
|
||||
* `fire_encouragement`: How quickly this block catches fire
|
||||
* `fire_flammability`: How fast the block will burn away
|
||||
* `path_creation_possible=1`: Node can be turned into grass path by using a shovel on it
|
||||
* `spreading_dirt_type=1`: A dirt-type block with a cover (e.g. grass) which may spread to neighbor dirt blocks
|
||||
* `dirtifies_below_solid=1`: This node turns into dirt immediately when a solid or dirtifier node is placed on top
|
||||
* `dirtifier=1`: This node turns nodes the above group into dirt when placed above
|
||||
|
@ -57,7 +56,6 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
|||
* `no_eat_delay=1`: Only for foodstuffs. When eating this, all eating delays are ignored.
|
||||
* `can_eat_when_full=1`: Only for foodstuffs. This item can be eaten when the user has a full hunger bar
|
||||
* `attached_node_facedir=1`: Like `attached_node`, but for facedir nodes
|
||||
* `supported_node=1`: Like `attached_node`, but can be placed on any nodes that do not have the `drawtype="airlike"` attribute.
|
||||
* `cauldron`: Cauldron. 1: Empty. 2-4: Water height
|
||||
* `anvil`: Anvil. 1: No damage. 2-3: Higher damage levels
|
||||
* `no_rename=1`: Item cannot be renamed by anvil
|
||||
|
@ -73,7 +71,6 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
|||
* `coral_block=X`: Coral block (1 = alive, 2 = dead)
|
||||
* `coral_species=X`: Specifies the species of a coral; equal X means equal species
|
||||
* `set_on_fire=X`: Sets any (not fire-resistant) mob or player on fire for X seconds when touching
|
||||
* `compostability=X`: Item can be used on a composter block; X (1-100) is the % chance of adding a level of compost
|
||||
|
||||
#### Footnotes
|
||||
|
||||
|
@ -102,7 +99,6 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
|||
* `water_bucket=1`: Bucket containing a liquid of group “water”
|
||||
* `enchantability=X`: How good the enchantments are the item gets (1 equals book)
|
||||
* `enchanted=1`: The item is already enchanted, meaning that it can't be enchanted using an enchanting table
|
||||
* `cobble=1`: Cobblestone of any kind
|
||||
|
||||
### Material groups
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
|
||||
Developed by many people. Not developed or endorsed by Mojang AB.
|
||||
|
||||
Version: 0.75 (in development)
|
||||
Version: 0.72.0 (in development)
|
||||
|
||||
### Gameplay
|
||||
You start in a randomly-generated world made entirely of cubes. You can explore
|
||||
|
@ -66,7 +66,7 @@ Use the `/giveme` chat command to obtain them. See the in-game help for
|
|||
an explanation.
|
||||
|
||||
## Installation
|
||||
This game requires [Minetest](http://minetest.net) to run (version 5.4.1 or
|
||||
This game requires [Minetest](http://minetest.net) to run (version 5.3.0 or
|
||||
later). So you need to install Minetest first. Only stable versions of Minetest
|
||||
are officially supported.
|
||||
There is no support for running MineClone2 in development versions of Minetest.
|
||||
|
|
|
@ -1,93 +1,29 @@
|
|||
-- Overrides the builtin minetest.check_single_for_falling.
|
||||
-- We need to do this in order to handle nodes in mineclone specific groups
|
||||
-- "supported_node" and "attached_node_facedir".
|
||||
--
|
||||
-- Nodes in group "supported_node" can be placed on any node that does not
|
||||
-- have the "airlike" drawtype. Carpets are an example of this type.
|
||||
|
||||
local vector = vector
|
||||
|
||||
local facedir_to_dir = minetest.facedir_to_dir
|
||||
local get_item_group = minetest.get_item_group
|
||||
local remove_node = minetest.remove_node
|
||||
local get_node = minetest.get_node
|
||||
local get_meta = minetest.get_meta
|
||||
local registered_nodes = minetest.registered_nodes
|
||||
local get_node_drops = minetest.get_node_drops
|
||||
local add_item = minetest.add_item
|
||||
|
||||
-- drop_attached_node(p)
|
||||
--
|
||||
-- This function is copied verbatim from minetest/builtin/game/falling.lua
|
||||
-- We need this to do the exact same dropping node handling in our override
|
||||
-- minetest.check_single_for_falling() function as in the builtin function.
|
||||
--
|
||||
local function drop_attached_node(p)
|
||||
local n = get_node(p)
|
||||
local drops = get_node_drops(n, "")
|
||||
local def = registered_nodes[n.name]
|
||||
if def and def.preserve_metadata then
|
||||
local oldmeta = get_meta(p):to_table().fields
|
||||
-- Copy pos and node because the callback can modify them.
|
||||
local pos_copy = vector.new(p)
|
||||
local node_copy = {name=n.name, param1=n.param1, param2=n.param2}
|
||||
local drop_stacks = {}
|
||||
for k, v in pairs(drops) do
|
||||
drop_stacks[k] = ItemStack(v)
|
||||
end
|
||||
drops = drop_stacks
|
||||
def.preserve_metadata(pos_copy, node_copy, oldmeta, drops)
|
||||
end
|
||||
if def and def.sounds and def.sounds.fall then
|
||||
core.sound_play(def.sounds.fall, {pos = p}, true)
|
||||
end
|
||||
remove_node(p)
|
||||
for _, item in pairs(drops) do
|
||||
local pos = {
|
||||
x = p.x + math.random()/2 - 0.25,
|
||||
y = p.y + math.random()/2 - 0.25,
|
||||
z = p.z + math.random()/2 - 0.25,
|
||||
}
|
||||
add_item(pos, item)
|
||||
end
|
||||
end
|
||||
|
||||
-- minetest.check_single_for_falling(pos)
|
||||
--
|
||||
-- * causes an unsupported `group:falling_node` node to fall and causes an
|
||||
-- unattached `group:attached_node` or `group:attached_node_facedir` node
|
||||
-- or unsupported `group:supported_node` node to drop.
|
||||
-- * does not spread these updates to neighbours.
|
||||
--
|
||||
-- Returns true if the node at <pos> has spawned a falling node or has been
|
||||
-- dropped as item(s).
|
||||
--
|
||||
local original_function = minetest.check_single_for_falling
|
||||
|
||||
function minetest.check_single_for_falling(pos)
|
||||
if original_function(pos) then
|
||||
return true
|
||||
end
|
||||
|
||||
local node = get_node(pos)
|
||||
local ret_o = original_function(pos)
|
||||
local ret = false
|
||||
local node = minetest.get_node(pos)
|
||||
if get_item_group(node.name, "attached_node_facedir") ~= 0 then
|
||||
local dir = facedir_to_dir(node.param2)
|
||||
if dir then
|
||||
if get_item_group(get_node(vector.add(pos, dir)).name, "solid") == 0 then
|
||||
drop_attached_node(pos)
|
||||
return true
|
||||
remove_node(pos)
|
||||
local drops = minetest.get_node_drops(node.name, "")
|
||||
for dr=1, #drops do
|
||||
minetest.add_item(pos, drops[dr])
|
||||
end
|
||||
ret = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if get_item_group(node.name, "supported_node") ~= 0 then
|
||||
local def = registered_nodes[get_node(vector.offset(pos, 0, -1, 0)).name]
|
||||
if def and def.drawtype == "airlike" then
|
||||
drop_attached_node(pos)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
return ret_o or ret
|
||||
end
|
||||
|
||||
|
|
|
@ -153,22 +153,3 @@ minetest.register_globalstep(function(dtime)
|
|||
end
|
||||
end)
|
||||
|
||||
function mcl_worlds.get_cloud_parameters()
|
||||
if minetest.get_mapgen_setting("mg_name") == "valleys" then
|
||||
return {
|
||||
height = 384, --valleys has a much higher average elevation thus often "normal" landscape ends up in the clouds
|
||||
speed = {x=-2, z=0},
|
||||
thickness=5,
|
||||
color="#FFF0FEF",
|
||||
ambient = "#201060",
|
||||
}
|
||||
else
|
||||
-- MC-style clouds: Layer 127, thickness 4, fly to the “West”
|
||||
return {
|
||||
height = mcl_worlds.layer_to_y(127),
|
||||
speed = {x=-2, z=0},
|
||||
thickness = 4,
|
||||
color = "#FFF0FEF",
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -84,7 +84,7 @@ function image:encode()
|
|||
end
|
||||
|
||||
function image:save(filename)
|
||||
local f = assert(io.open(filename, "wb"))
|
||||
local f = assert(io.open(filename, "w"))
|
||||
f:write(self.data)
|
||||
f:close()
|
||||
end
|
||||
|
|
|
@ -26,64 +26,20 @@ function mcl_burning.get_collisionbox(obj, smaller, storage)
|
|||
end
|
||||
end
|
||||
|
||||
local find_nodes_in_area = minetest.find_nodes_in_area
|
||||
|
||||
function mcl_burning.get_touching_nodes(obj, nodenames, storage)
|
||||
local pos = obj:get_pos()
|
||||
local minp, maxp = mcl_burning.get_collisionbox(obj, true, storage)
|
||||
local nodes = find_nodes_in_area(vector.add(pos, minp), vector.add(pos, maxp), nodenames)
|
||||
local nodes = minetest.find_nodes_in_area(vector.add(pos, minp), vector.add(pos, maxp), nodenames)
|
||||
return nodes
|
||||
end
|
||||
|
||||
-- Manages the fire animation on a burning player's HUD
|
||||
--
|
||||
-- Parameters:
|
||||
-- player - a valid player object;
|
||||
--
|
||||
-- If the player already has a fire HUD, updates the burning animation.
|
||||
-- If the fire does not have a fire HUD, initializes the HUD.
|
||||
--
|
||||
function mcl_burning.update_hud(player)
|
||||
local animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8
|
||||
local hud_flame_animated = "mcl_burning_hud_flame_animated.png^[opacity:180^[verticalframe:" .. animation_frames .. ":"
|
||||
|
||||
local storage = mcl_burning.get_storage(player)
|
||||
if not storage.fire_hud_id then
|
||||
storage.animation_frame = 1
|
||||
storage.fire_hud_id = player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
position = {x = 0.5, y = 0.5},
|
||||
scale = {x = -100, y = -100},
|
||||
text = hud_flame_animated .. storage.animation_frame,
|
||||
z_index = 1000,
|
||||
})
|
||||
else
|
||||
storage.animation_frame = storage.animation_frame + 1
|
||||
if storage.animation_frame > animation_frames - 1 then
|
||||
storage.animation_frame = 0
|
||||
end
|
||||
player:hud_change(storage.fire_hud_id, "text", hud_flame_animated .. storage.animation_frame)
|
||||
end
|
||||
end
|
||||
|
||||
-- Sets and object state as burning and adds a fire animation to the object.
|
||||
--
|
||||
-- Parameters:
|
||||
-- obj - may be a player or a lua_entity;
|
||||
-- burn_time - sets the object's burn duration;
|
||||
--
|
||||
-- If obj is a player, adds a fire animation to the HUD, if obj is a
|
||||
-- lua_entity, adds an animated fire entity to obj.
|
||||
-- The effective burn duration is modified by obj's armor protection.
|
||||
-- If obj was already burning, its burn duration is updated if the current
|
||||
-- duration is less than burn_time.
|
||||
-- If obj is dead, fireproof or a creative player, this function does nothing.
|
||||
--
|
||||
function mcl_burning.set_on_fire(obj, burn_time)
|
||||
if obj:get_hp() < 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local storage = mcl_burning.get_storage(obj)
|
||||
|
||||
local luaentity = obj:get_luaentity()
|
||||
if luaentity and luaentity.fire_resistant then
|
||||
return
|
||||
|
@ -104,32 +60,44 @@ function mcl_burning.set_on_fire(obj, burn_time)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
if max_fire_prot_lvl > 0 then
|
||||
burn_time = burn_time - math.floor(burn_time * max_fire_prot_lvl * 0.15)
|
||||
end
|
||||
end
|
||||
|
||||
local storage = mcl_burning.get_storage(obj)
|
||||
if storage.burn_time then
|
||||
if burn_time > storage.burn_time then
|
||||
storage.burn_time = burn_time
|
||||
if not storage.burn_time or burn_time >= storage.burn_time then
|
||||
if obj:is_player() then
|
||||
mcl_burning.channels[obj]:send_all(tostring(mcl_burning.animation_frames))
|
||||
mcl_burning.channels[obj]:send_all("start")
|
||||
end
|
||||
return
|
||||
end
|
||||
storage.burn_time = burn_time
|
||||
storage.fire_damage_timer = 0
|
||||
storage.burn_time = burn_time
|
||||
storage.fire_damage_timer = 0
|
||||
|
||||
local minp, maxp = mcl_burning.get_collisionbox(obj, false, storage)
|
||||
local size = vector.subtract(maxp, minp)
|
||||
size = vector.multiply(size, vector.new(1.1, 1.2, 1.1))
|
||||
size = vector.divide(size, obj:get_properties().visual_size)
|
||||
local fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire")
|
||||
local minp, maxp = mcl_burning.get_collisionbox(obj, false, storage)
|
||||
local obj_size = obj:get_properties().visual_size
|
||||
|
||||
local fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire")
|
||||
fire_entity:set_properties({visual_size = size})
|
||||
fire_entity:set_attach(obj, "", vector.new(0, size.y * 5, 0), vector.new(0, 0, 0))
|
||||
local vertical_grow_factor = 1.2
|
||||
local horizontal_grow_factor = 1.1
|
||||
local grow_vector = vector.new(horizontal_grow_factor, vertical_grow_factor, horizontal_grow_factor)
|
||||
|
||||
if obj:is_player() then
|
||||
mcl_burning.update_hud(obj)
|
||||
local size = vector.subtract(maxp, minp)
|
||||
size = vector.multiply(size, grow_vector)
|
||||
size = vector.divide(size, obj_size)
|
||||
local offset = vector.new(0, size.y * 10 / 2, 0)
|
||||
|
||||
fire_entity:set_properties({visual_size = size})
|
||||
fire_entity:set_attach(obj, "", offset, {x = 0, y = 0, z = 0})
|
||||
local fire_luaentity = fire_entity:get_luaentity()
|
||||
|
||||
for _, other in pairs(minetest.get_objects_inside_radius(fire_entity:get_pos(), 0)) do
|
||||
local other_luaentity = other:get_luaentity()
|
||||
if other_luaentity and other_luaentity.name == "mcl_burning:fire" and other_luaentity ~= fire_luaentity then
|
||||
other:remove()
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -137,9 +105,7 @@ function mcl_burning.extinguish(obj)
|
|||
if mcl_burning.is_burning(obj) then
|
||||
local storage = mcl_burning.get_storage(obj)
|
||||
if obj:is_player() then
|
||||
if storage.fire_hud_id then
|
||||
obj:hud_remove(storage.fire_hud_id)
|
||||
end
|
||||
mcl_burning.channels[obj]:send_all("stop")
|
||||
mcl_burning.storage[obj] = {}
|
||||
else
|
||||
storage.burn_time = nil
|
||||
|
|
|
@ -1,27 +1,18 @@
|
|||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
local pairs = pairs
|
||||
|
||||
local get_connected_players = minetest.get_connected_players
|
||||
local get_item_group = minetest.get_item_group
|
||||
|
||||
mcl_burning = {
|
||||
-- the storage table holds a list of objects (players,luaentities) and tables
|
||||
-- associated with these objects. These tables have the following attributes:
|
||||
-- burn_time:
|
||||
-- Remaining time that object will burn.
|
||||
-- fire_damage_timer:
|
||||
-- Timer for dealing damage every second while burning.
|
||||
-- fire_hud_id:
|
||||
-- HUD id of the flames animation on a burning player's HUD.
|
||||
-- animation_frame:
|
||||
-- The HUD's current animation frame, used by update_hud().
|
||||
-- collisionbox_cache:
|
||||
-- Used by mcl_burning.get_collisionbox() to avoid recalculations.
|
||||
storage = {}
|
||||
storage = {},
|
||||
channels = {},
|
||||
animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8
|
||||
}
|
||||
|
||||
dofile(modpath .. "/api.lua")
|
||||
|
||||
local pairs = pairs
|
||||
local get_connected_players = minetest.get_connected_players
|
||||
local get_item_group = minetest.get_item_group
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
local storage = mcl_burning.storage[player]
|
||||
|
@ -53,43 +44,25 @@ minetest.register_on_respawnplayer(function(player)
|
|||
mcl_burning.extinguish(player)
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local storage = {}
|
||||
local burn_data = player:get_meta():get_string("mcl_burning:data")
|
||||
if burn_data ~= "" then
|
||||
storage = minetest.deserialize(burn_data) or storage
|
||||
function mcl_burning.init_player(player)
|
||||
local meta = player:get_meta()
|
||||
-- NOTE: mcl_burning:data may be "return nil" (which deserialize into nil) for reasons unknown.
|
||||
if meta:get_string("mcl_burning:data"):find("return nil", 1, true) then
|
||||
minetest.log("warning", "[mcl_burning] 'mcl_burning:data' player meta field is invalid! Please report this bug")
|
||||
end
|
||||
mcl_burning.storage[player] = storage
|
||||
if storage.burn_time and storage.burn_time > 0 then
|
||||
mcl_burning.update_hud(player)
|
||||
end
|
||||
end)
|
||||
|
||||
local function on_leaveplayer(player)
|
||||
local storage = mcl_burning.storage[player]
|
||||
if not storage then
|
||||
-- For some unexplained reasons, mcl_burning.storage can be `nil` here.
|
||||
-- Logging this exception to assist in finding the cause of this.
|
||||
minetest.log("warning", "on_leaveplayer: missing mcl_burning.storage "
|
||||
.. "for player " .. player:get_player_name())
|
||||
storage = {}
|
||||
end
|
||||
storage.fire_hud_id = nil
|
||||
player:get_meta():set_string("mcl_burning:data", minetest.serialize(storage))
|
||||
mcl_burning.storage[player] = nil
|
||||
mcl_burning.storage[player] = meta:contains("mcl_burning:data") and minetest.deserialize(meta:get_string("mcl_burning:data")) or {}
|
||||
mcl_burning.channels[player] = minetest.mod_channel_join("mcl_burning:" .. player:get_player_name())
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
mcl_burning.init_player(player)
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
on_leaveplayer(player)
|
||||
player:get_meta():set_string("mcl_burning:data", minetest.serialize(mcl_burning.storage[player]))
|
||||
mcl_burning.storage[player] = nil
|
||||
end)
|
||||
|
||||
minetest.register_on_shutdown(function()
|
||||
for _,player in ipairs(minetest.get_connected_players()) do
|
||||
on_leaveplayer(player)
|
||||
end
|
||||
end)
|
||||
|
||||
local animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8
|
||||
|
||||
minetest.register_entity("mcl_burning:fire", {
|
||||
initial_properties = {
|
||||
|
@ -97,35 +70,42 @@ minetest.register_entity("mcl_burning:fire", {
|
|||
collisionbox = {0, 0, 0, 0, 0, 0},
|
||||
visual = "upright_sprite",
|
||||
textures = {
|
||||
"mcl_burning_entity_flame_animated.png",
|
||||
"mcl_burning_entity_flame_animated.png"
|
||||
name = "mcl_burning_entity_flame_animated.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 1.0,
|
||||
},
|
||||
},
|
||||
spritediv = {x = 1, y = animation_frames},
|
||||
spritediv = {x = 1, y = mcl_burning.animation_frames},
|
||||
pointable = false,
|
||||
glow = -1,
|
||||
backface_culling = false,
|
||||
},
|
||||
_mcl_animation_timer = 0,
|
||||
animation_frame = 0,
|
||||
animation_timer = 0,
|
||||
on_activate = function(self)
|
||||
self.object:set_sprite({x = 0, y = 0}, animation_frames, 1.0 / animation_frames)
|
||||
self.object:set_sprite({x = 0, y = 0}, mcl_burning.animation_frames, 1.0 / mcl_burning.animation_frames)
|
||||
end,
|
||||
on_step = function(self, dtime)
|
||||
on_step = function(self)
|
||||
if not self:sanity_check() then
|
||||
self.object:remove()
|
||||
end
|
||||
end,
|
||||
sanity_check = function(self)
|
||||
local parent = self.object:get_attach()
|
||||
|
||||
if not parent then
|
||||
self.object:remove()
|
||||
return
|
||||
return false
|
||||
end
|
||||
|
||||
local storage = mcl_burning.get_storage(parent)
|
||||
|
||||
if not storage or not storage.burn_time then
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
if parent:is_player() then
|
||||
self._mcl_animation_timer = self._mcl_animation_timer + dtime
|
||||
if self._mcl_animation_timer >= 0.1 then
|
||||
self._mcl_animation_timer = 0
|
||||
mcl_burning.update_hud(parent)
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end,
|
||||
})
|
||||
|
|
|
@ -110,7 +110,7 @@ minetest.register_globalstep(function(dtime)
|
|||
if tick == true and pool[name] > 0 then
|
||||
minetest.sound_play("item_drop_pickup", {
|
||||
pos = pos,
|
||||
gain = 0.3,
|
||||
gain = 0.7,
|
||||
max_hear_distance = 16,
|
||||
pitch = math.random(70,110)/100
|
||||
})
|
||||
|
@ -256,8 +256,6 @@ function minetest.handle_node_drops(pos, drops, digger)
|
|||
|
||||
local silk_touch_drop = false
|
||||
local nodedef = minetest.registered_nodes[dug_node.name]
|
||||
if not nodedef then return end
|
||||
|
||||
if shearsy_level and shearsy_level > 0 and nodedef._mcl_shears_drop then
|
||||
if nodedef._mcl_shears_drop == true then
|
||||
drops = { dug_node.name }
|
||||
|
@ -418,11 +416,7 @@ minetest.register_entity(":__builtin:item", {
|
|||
end
|
||||
local stack = ItemStack(itemstring)
|
||||
if minetest.get_item_group(stack:get_name(), "compass") > 0 then
|
||||
if string.find(stack:get_name(), "_lodestone") then
|
||||
stack:set_name("mcl_compass:18_lodestone")
|
||||
else
|
||||
stack:set_name("mcl_compass:18")
|
||||
end
|
||||
stack:set_name("mcl_compass:16")
|
||||
itemstring = stack:to_string()
|
||||
self.itemstring = itemstring
|
||||
end
|
||||
|
|
|
@ -432,8 +432,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
|
|||
-- Slow down or speed up
|
||||
local acc = dir.y * -1.8
|
||||
local friction = 0.4
|
||||
local ndef = minetest.registered_nodes[minetest.get_node(pos).name]
|
||||
local speed_mod = ndef and ndef._rail_acceleration
|
||||
local speed_mod = minetest.registered_nodes[minetest.get_node(pos).name]._rail_acceleration
|
||||
|
||||
acc = acc - friction
|
||||
|
||||
|
@ -861,4 +860,4 @@ if has_mcl_wip then
|
|||
mcl_wip.register_wip_item("mcl_minecarts:furnace_minecart")
|
||||
mcl_wip.register_wip_item("mcl_minecarts:command_block_minecart")
|
||||
mcl_wip.register_wip_item("mcl_minecarts:hopper_minecart")
|
||||
end
|
||||
end
|
|
@ -222,8 +222,8 @@ local collision = function(self)
|
|||
|
||||
for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do
|
||||
|
||||
local ent = object:get_luaentity()
|
||||
if object:is_player() or (ent and ent._cmi_is_mob and object ~= self.object) then
|
||||
if object:is_player()
|
||||
or (object:get_luaentity()._cmi_is_mob == true and object ~= self.object) then
|
||||
|
||||
local pos2 = object:get_pos()
|
||||
local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z}
|
||||
|
@ -1328,8 +1328,8 @@ local do_jump = function(self)
|
|||
return false
|
||||
end
|
||||
|
||||
local ndef = minetest.registered_nodes[nod.name]
|
||||
if self.walk_chance == 0 or ndef and ndef.walkable then
|
||||
if self.walk_chance == 0
|
||||
or minetest.registered_items[nod.name].walkable then
|
||||
|
||||
if minetest.get_item_group(nod.name, "fence") == 0
|
||||
and minetest.get_item_group(nod.name, "fence_gate") == 0
|
||||
|
@ -2833,10 +2833,6 @@ local do_states = function(self, dtime)
|
|||
end
|
||||
ent.switch = 1
|
||||
ent.owner_id = tostring(self.object) -- add unique owner id to arrow
|
||||
|
||||
-- important for mcl_shields
|
||||
ent._shooter = self.object
|
||||
ent._saved_shooter_pos = self.object:get_pos()
|
||||
end
|
||||
|
||||
local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5
|
||||
|
@ -4082,6 +4078,7 @@ end
|
|||
|
||||
-- make explosion with protection and tnt mod check
|
||||
function mobs:boom(self, pos, strength, fire)
|
||||
self.object:remove()
|
||||
if mod_explosions then
|
||||
if mobs_griefing and not minetest.is_protected(pos, "") then
|
||||
mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object)
|
||||
|
@ -4091,9 +4088,6 @@ function mobs:boom(self, pos, strength, fire)
|
|||
else
|
||||
mobs:safe_boom(self, pos, strength)
|
||||
end
|
||||
|
||||
-- delete the object after it punched the player to avoid nil entities in e.g. mcl_shields!!
|
||||
self.object:remove()
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -1,204 +1,180 @@
|
|||
--lua locals
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
||||
local get_biome_name = minetest.get_biome_name
|
||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||
local get_connected_players = minetest.get_connected_players
|
||||
local minetest_get_perlin = minetest.get_perlin
|
||||
|
||||
local new_vector = vector.new
|
||||
local math_random = math.random
|
||||
local math_floor = math.floor
|
||||
local math_ceil = math.ceil
|
||||
local math_cos = math.cos
|
||||
local math_sin = math.sin
|
||||
local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end
|
||||
|
||||
--local vector_distance = vector.distance
|
||||
local vector_new = vector.new
|
||||
local vector_floor = vector.floor
|
||||
|
||||
local table_copy = table.copy
|
||||
local table_remove = table.remove
|
||||
|
||||
local pairs = pairs
|
||||
local get_biome_name = minetest.get_biome_name
|
||||
local max = math.max
|
||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||
local vector_distance = vector.distance
|
||||
|
||||
-- range for mob count
|
||||
local aoc_range = 32
|
||||
--[[
|
||||
|
||||
THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
||||
|
||||
underground:
|
||||
"FlowerForest_underground",
|
||||
"JungleEdge_underground",local spawning_position = spawning_position_list[math.random(1,#spawning_position_list)]
|
||||
"ColdTaiga_underground",
|
||||
"IcePlains_underground",
|
||||
"IcePlainsSpikes_underground",
|
||||
"MegaTaiga_underground",
|
||||
"Taiga_underground",
|
||||
"ExtremeHills+_underground",
|
||||
"JungleM_underground",
|
||||
"ExtremeHillsM_underground",
|
||||
"JungleEdgeM_underground",
|
||||
|
||||
ocean:
|
||||
"RoofedForest_ocean",
|
||||
"JungleEdgeM_ocean",
|
||||
"BirchForestM_ocean",
|
||||
"BirchForest_ocean",
|
||||
"IcePlains_deep_ocean",
|
||||
"Jungle_deep_ocean",
|
||||
"Savanna_ocean",
|
||||
"MesaPlateauF_ocean",
|
||||
"ExtremeHillsM_deep_ocean",
|
||||
"Savanna_deep_ocean",
|
||||
"SunflowerPlains_ocean",
|
||||
"Swampland_deep_ocean",
|
||||
"Swampland_ocean",
|
||||
"MegaSpruceTaiga_deep_ocean",
|
||||
"ExtremeHillsM_ocean",
|
||||
"JungleEdgeM_deep_ocean",
|
||||
"SunflowerPlains_deep_ocean",
|
||||
"BirchForest_deep_ocean",
|
||||
"IcePlainsSpikes_ocean",
|
||||
"Mesa_ocean",
|
||||
"StoneBeach_ocean",
|
||||
"Plains_deep_ocean",
|
||||
"JungleEdge_deep_ocean",
|
||||
"SavannaM_deep_ocean",
|
||||
"Desert_deep_ocean",
|
||||
"Mesa_deep_ocean",
|
||||
"ColdTaiga_deep_ocean",
|
||||
"Plains_ocean",
|
||||
"MesaPlateauFM_ocean",
|
||||
"Forest_deep_ocean",
|
||||
"JungleM_deep_ocean",
|
||||
"FlowerForest_deep_ocean",
|
||||
"MushroomIsland_ocean",
|
||||
"MegaTaiga_ocean",
|
||||
"StoneBeach_deep_ocean",
|
||||
"IcePlainsSpikes_deep_ocean",
|
||||
"ColdTaiga_ocean",
|
||||
"SavannaM_ocean",
|
||||
"MesaPlateauF_deep_ocean",
|
||||
"MesaBryce_deep_ocean",
|
||||
"ExtremeHills+_deep_ocean",
|
||||
"ExtremeHills_ocean",
|
||||
"MushroomIsland_deep_ocean",
|
||||
"Forest_ocean",
|
||||
"MegaTaiga_deep_ocean",
|
||||
"JungleEdge_ocean",
|
||||
"MesaBryce_ocean",
|
||||
"MegaSpruceTaiga_ocean",
|
||||
"ExtremeHills+_ocean",
|
||||
"Jungle_ocean",
|
||||
"RoofedForest_deep_ocean",
|
||||
"IcePlains_ocean",
|
||||
"FlowerForest_ocean",
|
||||
"ExtremeHills_deep_ocean",
|
||||
"MesaPlateauFM_deep_ocean",
|
||||
"Desert_ocean",
|
||||
"Taiga_ocean",
|
||||
"BirchForestM_deep_ocean",
|
||||
"Taiga_deep_ocean",
|
||||
"JungleM_ocean",
|
||||
|
||||
water or beach?
|
||||
"MesaPlateauFM_sandlevel",
|
||||
"MesaPlateauF_sandlevel",
|
||||
"MesaBryce_sandlevel",
|
||||
"Mesa_sandlevel",
|
||||
|
||||
beach:
|
||||
"FlowerForest_beach",
|
||||
"Forest_beach",
|
||||
"StoneBeach",
|
||||
"ColdTaiga_beach_water",
|
||||
"Taiga_beach",
|
||||
"Savanna_beach",
|
||||
"Plains_beach",
|
||||
"ExtremeHills_beach",
|
||||
"ColdTaiga_beach",
|
||||
"Swampland_shore",
|
||||
"MushroomIslandShore",
|
||||
"JungleM_shore",
|
||||
"Jungle_shore",
|
||||
|
||||
dimension biome:
|
||||
"Nether",
|
||||
"End",
|
||||
|
||||
Overworld regular:
|
||||
"Mesa",
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"Jungle",
|
||||
"Savanna",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
"SunflowerPlains",
|
||||
"IcePlains",
|
||||
"RoofedForest",
|
||||
"ExtremeHills+_snowtop",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"JungleEdgeM",
|
||||
"ExtremeHillsM",
|
||||
"JungleM",
|
||||
"BirchForestM",
|
||||
"MesaPlateauF",
|
||||
"MesaPlateauFM",
|
||||
"MesaPlateauF_grasstop",
|
||||
"MesaBryce",
|
||||
"JungleEdge",
|
||||
"SavannaM",
|
||||
]]--
|
||||
|
||||
|
||||
|
||||
|
||||
--do mobs spawn?
|
||||
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
||||
-- count how many mobs of one type are inside an area
|
||||
|
||||
|
||||
local noise_params = {
|
||||
offset = 0,
|
||||
scale = 3,
|
||||
spread = {
|
||||
x = 301,
|
||||
y = 50,
|
||||
z = 304,
|
||||
},
|
||||
seed = 100,
|
||||
octaves = 3,
|
||||
persistence = 0.5,
|
||||
}
|
||||
|
||||
-- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
||||
-- Also used for missing parameter
|
||||
-- Please update the list when adding new biomes!
|
||||
|
||||
local list_of_all_biomes = {
|
||||
|
||||
-- underground:
|
||||
|
||||
"FlowerForest_underground",
|
||||
"JungleEdge_underground",
|
||||
"ColdTaiga_underground",
|
||||
"IcePlains_underground",
|
||||
"IcePlainsSpikes_underground",
|
||||
"MegaTaiga_underground",
|
||||
"Taiga_underground",
|
||||
"ExtremeHills+_underground",
|
||||
"JungleM_underground",
|
||||
"ExtremeHillsM_underground",
|
||||
"JungleEdgeM_underground",
|
||||
|
||||
-- ocean:
|
||||
|
||||
"RoofedForest_ocean",
|
||||
"JungleEdgeM_ocean",
|
||||
"BirchForestM_ocean",
|
||||
"BirchForest_ocean",
|
||||
"IcePlains_deep_ocean",
|
||||
"Jungle_deep_ocean",
|
||||
"Savanna_ocean",
|
||||
"MesaPlateauF_ocean",
|
||||
"ExtremeHillsM_deep_ocean",
|
||||
"Savanna_deep_ocean",
|
||||
"SunflowerPlains_ocean",
|
||||
"Swampland_deep_ocean",
|
||||
"Swampland_ocean",
|
||||
"MegaSpruceTaiga_deep_ocean",
|
||||
"ExtremeHillsM_ocean",
|
||||
"JungleEdgeM_deep_ocean",
|
||||
"SunflowerPlains_deep_ocean",
|
||||
"BirchForest_deep_ocean",
|
||||
"IcePlainsSpikes_ocean",
|
||||
"Mesa_ocean",
|
||||
"StoneBeach_ocean",
|
||||
"Plains_deep_ocean",
|
||||
"JungleEdge_deep_ocean",
|
||||
"SavannaM_deep_ocean",
|
||||
"Desert_deep_ocean",
|
||||
"Mesa_deep_ocean",
|
||||
"ColdTaiga_deep_ocean",
|
||||
"Plains_ocean",
|
||||
"MesaPlateauFM_ocean",
|
||||
"Forest_deep_ocean",
|
||||
"JungleM_deep_ocean",
|
||||
"FlowerForest_deep_ocean",
|
||||
"MushroomIsland_ocean",
|
||||
"MegaTaiga_ocean",
|
||||
"StoneBeach_deep_ocean",
|
||||
"IcePlainsSpikes_deep_ocean",
|
||||
"ColdTaiga_ocean",
|
||||
"SavannaM_ocean",
|
||||
"MesaPlateauF_deep_ocean",
|
||||
"MesaBryce_deep_ocean",
|
||||
"ExtremeHills+_deep_ocean",
|
||||
"ExtremeHills_ocean",
|
||||
"MushroomIsland_deep_ocean",
|
||||
"Forest_ocean",
|
||||
"MegaTaiga_deep_ocean",
|
||||
"JungleEdge_ocean",
|
||||
"MesaBryce_ocean",
|
||||
"MegaSpruceTaiga_ocean",
|
||||
"ExtremeHills+_ocean",
|
||||
"Jungle_ocean",
|
||||
"RoofedForest_deep_ocean",
|
||||
"IcePlains_ocean",
|
||||
"FlowerForest_ocean",
|
||||
"ExtremeHills_deep_ocean",
|
||||
"MesaPlateauFM_deep_ocean",
|
||||
"Desert_ocean",
|
||||
"Taiga_ocean",
|
||||
"BirchForestM_deep_ocean",
|
||||
"Taiga_deep_ocean",
|
||||
"JungleM_ocean",
|
||||
|
||||
-- water or beach?
|
||||
|
||||
"MesaPlateauFM_sandlevel",
|
||||
"MesaPlateauF_sandlevel",
|
||||
"MesaBryce_sandlevel",
|
||||
"Mesa_sandlevel",
|
||||
|
||||
-- beach:
|
||||
|
||||
"FlowerForest_beach",
|
||||
"Forest_beach",
|
||||
"StoneBeach",
|
||||
"ColdTaiga_beach_water",
|
||||
"Taiga_beach",
|
||||
"Savanna_beach",
|
||||
"Plains_beach",
|
||||
"ExtremeHills_beach",
|
||||
"ColdTaiga_beach",
|
||||
"Swampland_shore",
|
||||
"MushroomIslandShore",
|
||||
"JungleM_shore",
|
||||
"Jungle_shore",
|
||||
|
||||
-- dimension biome:
|
||||
|
||||
"Nether",
|
||||
"End",
|
||||
|
||||
-- Overworld regular:
|
||||
|
||||
"Mesa",
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"Jungle",
|
||||
"Savanna",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
"SunflowerPlains",
|
||||
"IcePlains",
|
||||
"RoofedForest",
|
||||
"ExtremeHills+_snowtop",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"JungleEdgeM",
|
||||
"ExtremeHillsM",
|
||||
"JungleM",
|
||||
"BirchForestM",
|
||||
"MesaPlateauF",
|
||||
"MesaPlateauFM",
|
||||
"MesaPlateauF_grasstop",
|
||||
"MesaBryce",
|
||||
"JungleEdge",
|
||||
"SavannaM",
|
||||
}
|
||||
|
||||
-- count how many mobs are in an area
|
||||
local function count_mobs(pos)
|
||||
local count_mobs = function(pos,mobtype)
|
||||
local num = 0
|
||||
for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do
|
||||
if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then
|
||||
num = num + 1
|
||||
local objs = get_objects_inside_radius(pos, aoc_range)
|
||||
for n = 1, #objs do
|
||||
local obj = objs[n]:get_luaentity()
|
||||
if obj and obj.name and obj._cmi_is_mob then
|
||||
-- count hostile mobs only
|
||||
if mobtype == "hostile" then
|
||||
if obj.spawn_class == "hostile" then
|
||||
num = num + 1
|
||||
end
|
||||
-- count passive mobs only
|
||||
else
|
||||
num = num + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return num
|
||||
end
|
||||
|
||||
|
@ -239,73 +215,11 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
|
|||
|
||||
--this is where all of the spawning information is kept
|
||||
local spawn_dictionary = {}
|
||||
local summary_chance = 0
|
||||
|
||||
function mobs:spawn_setup(def)
|
||||
if not mobs_spawn then return end
|
||||
|
||||
if not def then
|
||||
minetest.log("warning", "Empty mob spawn setup definition")
|
||||
return
|
||||
end
|
||||
|
||||
local name = def.name
|
||||
if not name then
|
||||
minetest.log("warning", "Missing mob name")
|
||||
return
|
||||
end
|
||||
|
||||
local dimension = def.dimension or "overworld"
|
||||
local type_of_spawning = def.type_of_spawning or "ground"
|
||||
local biomes = def.biomes or list_of_all_biomes
|
||||
local min_light = def.min_light or 0
|
||||
local max_light = def.max_light or (minetest.LIGHT_MAX + 1)
|
||||
local chance = def.chance or 1000
|
||||
local aoc = def.aoc or aoc_range
|
||||
local min_height = def.min_height or mcl_mapgen.overworld.min
|
||||
local max_height = def.max_height or mcl_mapgen.overworld.max
|
||||
local day_toggle = def.day_toggle
|
||||
local on_spawn = def.on_spawn
|
||||
local check_position = def.check_position
|
||||
|
||||
-- chance/spawn number override in minetest.conf for registered mob
|
||||
local numbers = minetest.settings:get(name)
|
||||
if numbers then
|
||||
numbers = numbers:split(",")
|
||||
chance = tonumber(numbers[1]) or chance
|
||||
aoc = tonumber(numbers[2]) or aoc
|
||||
if chance == 0 then
|
||||
minetest.log("warning", string.format("[mobs] %s has spawning disabled", name))
|
||||
return
|
||||
end
|
||||
minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||
end
|
||||
|
||||
if chance < 1 then
|
||||
chance = 1
|
||||
minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")")
|
||||
end
|
||||
|
||||
spawn_dictionary[#spawn_dictionary + 1] = {
|
||||
name = name,
|
||||
dimension = dimension,
|
||||
type_of_spawning = type_of_spawning,
|
||||
biomes = biomes,
|
||||
min_light = min_light,
|
||||
max_light = max_light,
|
||||
chance = chance,
|
||||
aoc = aoc,
|
||||
min_height = min_height,
|
||||
max_height = max_height,
|
||||
day_toggle = day_toggle,
|
||||
check_position = check_position,
|
||||
on_spawn = on_spawn,
|
||||
}
|
||||
summary_chance = summary_chance + chance
|
||||
end
|
||||
|
||||
function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
||||
|
||||
--print(dump(biomes))
|
||||
|
||||
-- Do mobs spawn at all?
|
||||
if not mobs_spawn then
|
||||
return
|
||||
|
@ -324,7 +238,180 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
|||
return
|
||||
end
|
||||
|
||||
minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||
minetest.log("action",
|
||||
string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||
end
|
||||
|
||||
--[[
|
||||
local spawn_action
|
||||
spawn_action = function(pos, node, active_object_count, active_object_count_wider, name)
|
||||
|
||||
local orig_pos = table.copy(pos)
|
||||
-- is mob actually registered?
|
||||
if not mobs.spawning_mobs[name]
|
||||
or not minetest.registered_entities[name] then
|
||||
minetest.log("warning", "Mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!")
|
||||
return
|
||||
end
|
||||
|
||||
-- additional custom checks for spawning mob
|
||||
if mobs:spawn_abm_check(pos, node, name) == true then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!")
|
||||
return
|
||||
end
|
||||
|
||||
-- count nearby mobs in same spawn class
|
||||
local entdef = minetest.registered_entities[name]
|
||||
local spawn_class = entdef and entdef.spawn_class
|
||||
if not spawn_class then
|
||||
if entdef.type == "monster" then
|
||||
spawn_class = "hostile"
|
||||
else
|
||||
spawn_class = "passive"
|
||||
end
|
||||
end
|
||||
local in_class_cap = count_mobs(pos, "!"..spawn_class) < MOB_CAP[spawn_class]
|
||||
-- do not spawn if too many of same mob in area
|
||||
if active_object_count_wider >= max_per_block -- large-range mob cap
|
||||
or (not in_class_cap) -- spawn class mob cap
|
||||
or count_mobs(pos, name) >= aoc then -- per-mob mob cap
|
||||
-- too many entities
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!")
|
||||
return
|
||||
end
|
||||
|
||||
-- if toggle set to nil then ignore day/night check
|
||||
if day_toggle ~= nil then
|
||||
|
||||
local tod = (minetest.get_timeofday() or 0) * 24000
|
||||
|
||||
if tod > 4500 and tod < 19500 then
|
||||
-- daylight, but mob wants night
|
||||
if day_toggle == false then
|
||||
-- mob needs night
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!")
|
||||
return
|
||||
end
|
||||
else
|
||||
-- night time but mob wants day
|
||||
if day_toggle == true then
|
||||
-- mob needs day
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!")
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- spawn above node
|
||||
pos.y = pos.y + 1
|
||||
|
||||
-- only spawn away from player
|
||||
local objs = minetest.get_objects_inside_radius(pos, 24)
|
||||
|
||||
for n = 1, #objs do
|
||||
|
||||
if objs[n]:is_player() then
|
||||
-- player too close
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- mobs cannot spawn in protected areas when enabled
|
||||
if not spawn_protected
|
||||
and minetest.is_protected(pos, "") then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!")
|
||||
return
|
||||
end
|
||||
|
||||
-- are we spawning within height limits?
|
||||
if pos.y > max_height
|
||||
or pos.y < min_height then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!")
|
||||
return
|
||||
end
|
||||
|
||||
-- are light levels ok?
|
||||
local light = minetest.get_node_light(pos)
|
||||
if not light
|
||||
or light > max_light
|
||||
or light < min_light then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!")
|
||||
return
|
||||
end
|
||||
|
||||
-- do we have enough space to spawn mob?
|
||||
local ent = minetest.registered_entities[name]
|
||||
local width_x = max(1, math.ceil(ent.collisionbox[4] - ent.collisionbox[1]))
|
||||
local min_x, max_x
|
||||
if width_x % 2 == 0 then
|
||||
max_x = math.floor(width_x/2)
|
||||
min_x = -(max_x-1)
|
||||
else
|
||||
max_x = math.floor(width_x/2)
|
||||
min_x = -max_x
|
||||
end
|
||||
|
||||
local width_z = max(1, math.ceil(ent.collisionbox[6] - ent.collisionbox[3]))
|
||||
local min_z, max_z
|
||||
if width_z % 2 == 0 then
|
||||
max_z = math.floor(width_z/2)
|
||||
min_z = -(max_z-1)
|
||||
else
|
||||
max_z = math.floor(width_z/2)
|
||||
min_z = -max_z
|
||||
end
|
||||
|
||||
local max_y = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1)
|
||||
|
||||
for y = 0, max_y do
|
||||
for x = min_x, max_x do
|
||||
for z = min_z, max_z do
|
||||
local pos2 = {x = pos.x+x, y = pos.y+y, z = pos.z+z}
|
||||
if minetest.registered_nodes[node_ok(pos2).name].walkable == true then
|
||||
-- inside block
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!")
|
||||
if ent.spawn_small_alternative ~= nil and (not minetest.registered_nodes[node_ok(pos).name].walkable) then
|
||||
minetest.log("info", "Trying to spawn smaller alternative mob: "..ent.spawn_small_alternative)
|
||||
spawn_action(orig_pos, node, active_object_count, active_object_count_wider, ent.spawn_small_alternative)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- tweak X/Y/Z spawn pos
|
||||
if width_x % 2 == 0 then
|
||||
pos.x = pos.x + 0.5
|
||||
end
|
||||
if width_z % 2 == 0 then
|
||||
pos.z = pos.z + 0.5
|
||||
end
|
||||
pos.y = pos.y - 0.5
|
||||
|
||||
local mob = minetest.add_entity(pos, name)
|
||||
minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos))
|
||||
|
||||
if on_spawn then
|
||||
|
||||
local ent = mob:get_luaentity()
|
||||
|
||||
on_spawn(ent, pos)
|
||||
end
|
||||
end
|
||||
|
||||
local function spawn_abm_action(pos, node, active_object_count, active_object_count_wider)
|
||||
spawn_action(pos, node, active_object_count, active_object_count_wider, name)
|
||||
end
|
||||
]]--
|
||||
|
||||
local entdef = minetest.registered_entities[name]
|
||||
local spawn_class
|
||||
if entdef.type == "monster" then
|
||||
spawn_class = "hostile"
|
||||
else
|
||||
spawn_class = "passive"
|
||||
end
|
||||
|
||||
--load information into the spawn dictionary
|
||||
|
@ -336,34 +423,106 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
|||
spawn_dictionary[key]["biomes"] = biomes
|
||||
spawn_dictionary[key]["min_light"] = min_light
|
||||
spawn_dictionary[key]["max_light"] = max_light
|
||||
spawn_dictionary[key]["interval"] = interval
|
||||
spawn_dictionary[key]["chance"] = chance
|
||||
spawn_dictionary[key]["aoc"] = aoc
|
||||
spawn_dictionary[key]["min_height"] = min_height
|
||||
spawn_dictionary[key]["max_height"] = max_height
|
||||
spawn_dictionary[key]["day_toggle"] = day_toggle
|
||||
--spawn_dictionary[key]["on_spawn"] = spawn_abm_action
|
||||
spawn_dictionary[key]["spawn_class"] = spawn_class
|
||||
|
||||
summary_chance = summary_chance + chance
|
||||
--[[
|
||||
minetest.register_abm({
|
||||
label = name .. " spawning",
|
||||
nodenames = nodes,
|
||||
neighbors = neighbors,
|
||||
interval = interval,
|
||||
chance = floor(max(1, chance * mobs_spawn_chance)),
|
||||
catch_up = false,
|
||||
action = spawn_abm_action,
|
||||
})
|
||||
]]--
|
||||
end
|
||||
|
||||
local two_pi = 2 * math.pi
|
||||
local function get_next_mob_spawn_pos(pos)
|
||||
local distance = math_random(25, 32)
|
||||
local angle = math_random() * two_pi
|
||||
return {
|
||||
x = math_round(pos.x + distance * math_cos(angle)),
|
||||
y = pos.y,
|
||||
z = math_round(pos.z + distance * math_sin(angle))
|
||||
}
|
||||
-- compatibility with older mob registration
|
||||
-- we're going to forget about this for now -j4i
|
||||
--[[
|
||||
function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle)
|
||||
|
||||
mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30,
|
||||
chance, active_object_count, -31000, max_height, day_toggle)
|
||||
end
|
||||
]]--
|
||||
|
||||
|
||||
--Don't disable this yet-j4i
|
||||
-- MarkBu's spawn function
|
||||
|
||||
function mobs:spawn(def)
|
||||
--does nothing for now
|
||||
--[[
|
||||
local name = def.name
|
||||
local nodes = def.nodes or {"group:soil", "group:stone"}
|
||||
local neighbors = def.neighbors or {"air"}
|
||||
local min_light = def.min_light or 0
|
||||
local max_light = def.max_light or 15
|
||||
local interval = def.interval or 30
|
||||
local chance = def.chance or 5000
|
||||
local active_object_count = def.active_object_count or 1
|
||||
local min_height = def.min_height or -31000
|
||||
local max_height = def.max_height or 31000
|
||||
local day_toggle = def.day_toggle
|
||||
local on_spawn = def.on_spawn
|
||||
|
||||
mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval,
|
||||
chance, active_object_count, min_height, max_height, day_toggle, on_spawn)
|
||||
]]--
|
||||
end
|
||||
|
||||
|
||||
|
||||
local axis
|
||||
--inner and outer part of square donut radius
|
||||
local inner = 1
|
||||
local outer = 65
|
||||
local int = {-1,1}
|
||||
local position_calculation = function(pos)
|
||||
|
||||
pos = vector.floor(pos)
|
||||
|
||||
--this is used to determine the axis buffer from the player
|
||||
axis = math.random(0,1)
|
||||
|
||||
--cast towards the direction
|
||||
if axis == 0 then --x
|
||||
pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
|
||||
pos.z = pos.z + math.random(-outer,outer)
|
||||
else --z
|
||||
pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
|
||||
pos.x = pos.x + math.random(-outer,outer)
|
||||
end
|
||||
return(pos)
|
||||
end
|
||||
|
||||
--[[
|
||||
local decypher_limits_dictionary = {
|
||||
["overworld"] = {mcl_vars.mg_overworld_min,mcl_vars.mg_overworld_max},
|
||||
["nether"] = {mcl_vars.mg_nether_min, mcl_vars.mg_nether_max},
|
||||
["end"] = {mcl_vars.mg_end_min, mcl_vars.mg_end_max}
|
||||
}
|
||||
]]--
|
||||
|
||||
local function decypher_limits(posy)
|
||||
posy = math_floor(posy)
|
||||
--local min_max_table = decypher_limits_dictionary[dimension]
|
||||
--return min_max_table[1],min_max_table[2]
|
||||
posy = math.floor(posy)
|
||||
return posy - 32, posy + 32
|
||||
end
|
||||
|
||||
--a simple helper function for mob_spawn
|
||||
local function biome_check(biome_list, biome_goal)
|
||||
for _, data in pairs(biome_list) do
|
||||
for _,data in ipairs(biome_list) do
|
||||
if data == biome_goal then
|
||||
return true
|
||||
end
|
||||
|
@ -372,111 +531,115 @@ local function biome_check(biome_list, biome_goal)
|
|||
return false
|
||||
end
|
||||
|
||||
local function is_farm_animal(n)
|
||||
return n == "mobs_mc:pig" or n == "mobs_mc:cow" or n == "mobs_mc:sheep" or n == "mobs_mc:chicken" or n == "mobs_mc:horse" or n == "mobs_mc:donkey"
|
||||
end
|
||||
|
||||
--todo mob limiting
|
||||
--MAIN LOOP
|
||||
|
||||
if mobs_spawn then
|
||||
|
||||
local perlin_noise
|
||||
|
||||
local function spawn_a_mob(pos, dimension, y_min, y_max)
|
||||
local dimension = dimension or mcl_worlds.pos_to_dimension(pos)
|
||||
local goal_pos = get_next_mob_spawn_pos(pos)
|
||||
local spawning_position_list = find_nodes_in_area_under_air(
|
||||
{x = goal_pos.x, y = y_min, z = goal_pos.z},
|
||||
{x = goal_pos.x, y = y_max, z = goal_pos.z},
|
||||
{"group:solid", "group:water", "group:lava"}
|
||||
)
|
||||
if #spawning_position_list <= 0 then return end
|
||||
local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
|
||||
|
||||
--hard code mob limit in area to 5 for now
|
||||
if count_mobs(spawning_position) >= 5 then return end
|
||||
|
||||
local gotten_node = get_node(spawning_position).name
|
||||
local gotten_biome = minetest.get_biome_data(spawning_position)
|
||||
if not gotten_node or not gotten_biome then return end
|
||||
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
||||
|
||||
--add this so mobs don't spawn inside nodes
|
||||
spawning_position.y = spawning_position.y + 1
|
||||
|
||||
--only need to poll for node light if everything else worked
|
||||
local gotten_light = get_node_light(spawning_position)
|
||||
|
||||
local is_water = get_item_group(gotten_node, "water") ~= 0
|
||||
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
||||
local is_ground = not (is_water or is_lava)
|
||||
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
|
||||
local has_bed = minetest.find_node_near(pos,25,{"group:bed"})
|
||||
|
||||
if not is_ground then
|
||||
spawning_position.y = spawning_position.y - 1
|
||||
end
|
||||
|
||||
local mob_def
|
||||
|
||||
--create a disconnected clone of the spawn dictionary
|
||||
--prevents memory leak
|
||||
local mob_library_worker_table = table_copy(spawn_dictionary)
|
||||
|
||||
--grab mob that fits into the spawning location
|
||||
--randomly grab a mob, don't exclude any possibilities
|
||||
perlin_noise = perlin_noise or minetest_get_perlin(noise_params)
|
||||
local noise = perlin_noise:get_3d(spawning_position)
|
||||
local current_summary_chance = summary_chance
|
||||
while #mob_library_worker_table > 0 do
|
||||
local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1
|
||||
local mob_index = 1
|
||||
local mob_chance = mob_library_worker_table[mob_index].chance
|
||||
local step_chance = mob_chance
|
||||
while step_chance < mob_chance_offset do
|
||||
mob_index = mob_index + 1
|
||||
mob_chance = mob_library_worker_table[mob_index].chance
|
||||
step_chance = step_chance + mob_chance
|
||||
end
|
||||
local mob_def = mob_library_worker_table[mob_index]
|
||||
local mob_type = minetest.registered_entities[mob_def.name].type
|
||||
if mob_def
|
||||
and spawning_position.y >= mob_def.min_height
|
||||
and spawning_position.y <= mob_def.max_height
|
||||
and mob_def.dimension == dimension
|
||||
and biome_check(mob_def.biomes, gotten_biome)
|
||||
and gotten_light >= mob_def.min_light
|
||||
and gotten_light <= mob_def.max_light
|
||||
and (is_ground or mob_def.type_of_spawning ~= "ground")
|
||||
and (mob_def.check_position and mob_def.check_position(spawning_position) or true)
|
||||
and (not is_farm_animal(mob_def.name) or is_grass)
|
||||
and (mob_type ~= "npc" or has_bed)
|
||||
then
|
||||
--everything is correct, spawn mob
|
||||
local object = minetest.add_entity(spawning_position, mob_def.name)
|
||||
if object then
|
||||
return mob_def.on_spawn and mob_def.on_spawn(object, pos)
|
||||
end
|
||||
end
|
||||
current_summary_chance = current_summary_chance - mob_chance
|
||||
table_remove(mob_library_worker_table, mob_index)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--MAIN LOOP
|
||||
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer < 10 then return end
|
||||
timer = 0
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
local pos = player:get_pos()
|
||||
local dimension = mcl_worlds.pos_to_dimension(pos)
|
||||
-- ignore void and unloaded area
|
||||
if dimension ~= "void" and dimension ~= "default" then
|
||||
local y_min, y_max = decypher_limits(pos.y)
|
||||
for i = 1, math_random(1, 4) do
|
||||
spawn_a_mob(pos, dimension, y_min, y_max)
|
||||
if timer >= 8 then
|
||||
timer = 0
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
for i = 1,math_random(3,8) do
|
||||
repeat -- after this line each "break" means "continue"
|
||||
local player_pos = player:get_pos()
|
||||
|
||||
local _,dimension = mcl_worlds.y_to_layer(player_pos.y)
|
||||
|
||||
if dimension == "void" or dimension == "default" then
|
||||
break -- ignore void and unloaded area
|
||||
end
|
||||
|
||||
local min,max = decypher_limits(player_pos.y)
|
||||
|
||||
local goal_pos = position_calculation(player_pos)
|
||||
|
||||
local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"})
|
||||
|
||||
--couldn't find node
|
||||
if #spawning_position_list <= 0 then
|
||||
break
|
||||
end
|
||||
|
||||
local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)]
|
||||
|
||||
--Prevent strange behavior/too close to player
|
||||
if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then
|
||||
break
|
||||
end
|
||||
|
||||
local gotten_node = get_node(spawning_position).name
|
||||
|
||||
if not gotten_node or gotten_node == "air" then --skip air nodes
|
||||
break
|
||||
end
|
||||
|
||||
local gotten_biome = minetest.get_biome_data(spawning_position)
|
||||
|
||||
if not gotten_biome then
|
||||
break --skip if in unloaded area
|
||||
end
|
||||
|
||||
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
||||
|
||||
--grab random mob
|
||||
local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)]
|
||||
|
||||
if not mob_def then
|
||||
break --skip if something ridiculous happens (nil mob def)
|
||||
end
|
||||
|
||||
--skip if not correct dimension
|
||||
if mob_def.dimension ~= dimension then
|
||||
break
|
||||
end
|
||||
|
||||
--skip if not in correct biome
|
||||
if not biome_check(mob_def.biomes, gotten_biome) then
|
||||
break
|
||||
end
|
||||
|
||||
--add this so mobs don't spawn inside nodes
|
||||
spawning_position.y = spawning_position.y + 1
|
||||
|
||||
if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then
|
||||
break
|
||||
end
|
||||
|
||||
--only need to poll for node light if everything else worked
|
||||
local gotten_light = get_node_light(spawning_position)
|
||||
|
||||
--don't spawn if not in light limits
|
||||
if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then
|
||||
break
|
||||
end
|
||||
|
||||
local is_water = get_item_group(gotten_node, "water") ~= 0
|
||||
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
||||
|
||||
if mob_def.type_of_spawning == "ground" and is_water then
|
||||
break
|
||||
end
|
||||
|
||||
if mob_def.type_of_spawning == "ground" and is_lava then
|
||||
break
|
||||
end
|
||||
|
||||
--finally do the heavy check (for now) of mobs in area
|
||||
if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then
|
||||
break
|
||||
end
|
||||
|
||||
--adjust the position for water and lava mobs
|
||||
if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then
|
||||
spawning_position.y = spawning_position.y - 1
|
||||
end
|
||||
|
||||
--everything is correct, spawn mob
|
||||
minetest.add_entity(spawning_position, mob_def.name)
|
||||
until true --this is a safety catch
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
local dim = {"x", "z"}
|
||||
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
local function load_schem(filename)
|
||||
local file = io.open(modpath .. "/schems/" .. filename, "r")
|
||||
local data = minetest.deserialize(file:read())
|
||||
file:close()
|
||||
return data
|
||||
end
|
||||
|
||||
local wither_spawn_schems = {}
|
||||
|
||||
for _, d in pairs(dim) do
|
||||
wither_spawn_schems[d] = load_schem("wither_spawn_" .. d .. ".we")
|
||||
end
|
||||
|
||||
local function check_schem(pos, schem)
|
||||
for _, n in pairs(schem) do
|
||||
if minetest.get_node(vector.add(pos, n)).name ~= n.name then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local function remove_schem(pos, schem)
|
||||
for _, n in pairs(schem) do
|
||||
minetest.remove_node(vector.add(pos, n))
|
||||
end
|
||||
end
|
||||
|
||||
local function wither_spawn(pos)
|
||||
for _, d in pairs(dim) do
|
||||
for i = 0, 2 do
|
||||
local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i})
|
||||
local schem = wither_spawn_schems[d]
|
||||
if check_schem(p, schem) then
|
||||
remove_schem(p, schem)
|
||||
minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local old_onplace=minetest.registered_nodes[mobs_mc.items.head_wither_skeleton].on_place
|
||||
minetest.registered_nodes[mobs_mc.items.head_wither_skeleton].on_place=function(itemstack,placer,pointed)
|
||||
minetest.after(0, wither_spawn, pointed.above)
|
||||
old_onplace(itemstack,placer,pointed)
|
||||
end
|
|
@ -1,4 +0,0 @@
|
|||
name = mcl_wither_spawning
|
||||
description = Wither Spawning for MineClone2
|
||||
author = Fleckenstein
|
||||
depends = mobs_mc, mcl_heads
|
|
@ -1 +0,0 @@
|
|||
return {{["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}}
|
|
@ -1 +0,0 @@
|
|||
return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 2}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 1, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 2, ["param2"] = 1, ["param1"] = 15}}
|
|
@ -169,7 +169,6 @@ mobs_mc.follow = {
|
|||
dog = { mobs_mc.items.rabbit_raw, mobs_mc.items.rabbit_cooked, mobs_mc.items.mutton_raw, mobs_mc.items.mutton_cooked, mobs_mc.items.beef_raw, mobs_mc.items.beef_cooked, mobs_mc.items.chicken_raw, mobs_mc.items.chicken_cooked, mobs_mc.items.rotten_flesh,
|
||||
-- Mobs Redo items
|
||||
"mobs:meat", "mobs:meat_raw" },
|
||||
villager = { "mcl_farming:bread" },
|
||||
}
|
||||
|
||||
-- Contents for replace_what
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
-- NOTE: Most strings intentionally not marked for translation, other mods already have these items.
|
||||
-- TODO: Remove this file eventually, most items are already outsourced in other mods.
|
||||
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
local c = mobs_mc.is_item_variable_overridden
|
||||
|
||||
|
@ -234,8 +234,8 @@ end
|
|||
if c("ender_eye") and c("blaze_powder") and c("blaze_rod") then
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "mobs_mc:ender_eye",
|
||||
recipe = { "mobs_mc:blaze_powder", "mobs_mc:blaze_rod"},
|
||||
output = 'mobs_mc:ender_eye',
|
||||
recipe = { 'mobs_mc:blaze_powder', 'mobs_mc:blaze_rod'},
|
||||
})
|
||||
end
|
||||
|
||||
|
@ -525,7 +525,7 @@ if c("totem") then
|
|||
inventory_image = "mcl_totems_totem.png",
|
||||
wield_image = "mcl_totems_totem.png",
|
||||
stack_max = 1,
|
||||
groups = {combat_item = 1, offhand_item = 1},
|
||||
groups = {combat_item=1},
|
||||
})
|
||||
end
|
||||
|
||||
|
|
|
@ -50,10 +50,8 @@ mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval)
|
|||
local telepos_below = {x=telepos.x, y=telepos.y-1, z=telepos.z}
|
||||
table.remove(check_offsets, r)
|
||||
-- Long story short, spawn on a platform
|
||||
local trynode = minetest.registered_nodes[minetest.get_node(telepos).name]
|
||||
local trybelownode = minetest.registered_nodes[minetest.get_node(telepos_below).name]
|
||||
if trynode and not trynode.walkable and
|
||||
trybelownode and trybelownode.walkable then
|
||||
if minetest.registered_nodes[minetest.get_node(telepos).name].walkable == false and
|
||||
minetest.registered_nodes[minetest.get_node(telepos_below).name].walkable == true then
|
||||
-- Correct position found! Let's teleport.
|
||||
self.object:set_pos(telepos)
|
||||
return
|
||||
|
|
|
@ -75,7 +75,6 @@ Origin of those models:
|
|||
* `mobs_mc_mushroom_brown.png` (CC0)
|
||||
|
||||
* “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i
|
||||
* Llama decor (carpet) textures (`mobs_mc_llama_decor_*`) by erlehmann and rudzik8
|
||||
* Any other texture not mentioned here are licensed under the MIT License
|
||||
|
||||
## Sounds
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
local mod_target = minetest.get_modpath("mcl_target")
|
||||
|
||||
--###################
|
||||
--################### BLAZE
|
||||
--###################
|
||||
|
@ -180,20 +178,17 @@ mobs:register_arrow("mobs_mc:blaze_fireball", {
|
|||
|
||||
-- Node hit, make fire
|
||||
hit_node = function(self, pos, node)
|
||||
if node == "air" then
|
||||
minetest.set_node(pos, {name = mobs_mc.items.fire})
|
||||
if node.name == "air" then
|
||||
minetest.set_node(pos_above, {name=mobs_mc.items.fire})
|
||||
else
|
||||
if self._shot_from_dispenser and mod_target and node == "mcl_target:target_off" then
|
||||
mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks
|
||||
end
|
||||
local v = vector.normalize(self.object:get_velocity())
|
||||
local v = self.object:get_velocity()
|
||||
v = vector.normalize(v)
|
||||
local crashpos = vector.subtract(pos, v)
|
||||
local crashnode = minetest.get_node(crashpos)
|
||||
local cndef = minetest.registered_nodes[crashnode.name]
|
||||
-- Set fire if node is air, or a replacable flammable node (e.g. a plant)
|
||||
if crashnode.name == "air" or
|
||||
(cndef and cndef.buildable_to and minetest.get_item_group(crashnode.name, "flammable") >= 1) then
|
||||
minetest.set_node(crashpos, {name = mobs_mc.items.fire})
|
||||
(minetest.registered_nodes[crashnode.name].buildable_to and minetest.get_item_group(crashnode.name, "flammable") >= 1) then
|
||||
minetest.set_node(crashpos, {name=mobs_mc.items.fire})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -106,42 +106,22 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"flat",
|
||||
"IcePlainsSpikes",
|
||||
"ColdTaiga",
|
||||
"ColdTaiga_beach",
|
||||
"ColdTaiga_beach_water",
|
||||
"MegaTaiga",
|
||||
"MegaSpruceTaiga",
|
||||
"ExtremeHills",
|
||||
"ExtremeHills_beach",
|
||||
"ExtremeHillsM",
|
||||
"ExtremeHills+",
|
||||
"ExtremeHills+_snowtop",
|
||||
"StoneBeach",
|
||||
"Plains",
|
||||
"Plains_beach",
|
||||
"SunflowerPlains",
|
||||
"Taiga",
|
||||
"Taiga_beach",
|
||||
"Forest",
|
||||
"Forest_beach",
|
||||
"FlowerForest",
|
||||
"FlowerForest_beach",
|
||||
"BirchForest",
|
||||
"BirchForestM",
|
||||
"RoofedForest",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
"SavannaM",
|
||||
"Jungle",
|
||||
"Jungle_shore",
|
||||
"JungleM",
|
||||
"JungleM_shore",
|
||||
"JungleEdge",
|
||||
"JungleEdgeM",
|
||||
"Swampland",
|
||||
"Swampland_shore"
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
"RoofedForest",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"ExtremeHillsM",
|
||||
"BirchForestM",
|
||||
},
|
||||
9,
|
||||
minetest.LIGHT_MAX+1,
|
||||
|
|
|
@ -151,42 +151,22 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"flat",
|
||||
"IcePlainsSpikes",
|
||||
"ColdTaiga",
|
||||
"ColdTaiga_beach",
|
||||
"ColdTaiga_beach_water",
|
||||
"MegaTaiga",
|
||||
"MegaSpruceTaiga",
|
||||
"ExtremeHills",
|
||||
"ExtremeHills_beach",
|
||||
"ExtremeHillsM",
|
||||
"ExtremeHills+",
|
||||
"ExtremeHills+_snowtop",
|
||||
"StoneBeach",
|
||||
"Plains",
|
||||
"Plains_beach",
|
||||
"SunflowerPlains",
|
||||
"Taiga",
|
||||
"Taiga_beach",
|
||||
"Forest",
|
||||
"Forest_beach",
|
||||
"FlowerForest",
|
||||
"FlowerForest_beach",
|
||||
"BirchForest",
|
||||
"BirchForestM",
|
||||
"RoofedForest",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
"SavannaM",
|
||||
"Jungle",
|
||||
"Jungle_shore",
|
||||
"JungleM",
|
||||
"JungleM_shore",
|
||||
"JungleEdge",
|
||||
"JungleEdgeM",
|
||||
"Swampland",
|
||||
"Swampland_shore"
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
"RoofedForest",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"ExtremeHillsM",
|
||||
"BirchForestM",
|
||||
},
|
||||
9,
|
||||
minetest.LIGHT_MAX+1,
|
||||
|
|
|
@ -395,9 +395,8 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
local node = minetest.get_node(take_pos)
|
||||
-- Don't destroy protected stuff.
|
||||
if not minetest.is_protected(take_pos, "") then
|
||||
minetest.remove_node(take_pos)
|
||||
local dug = minetest.get_node_or_nil(take_pos)
|
||||
if dug and dug.name == "air" then
|
||||
local dug = minetest.dig_node(take_pos)
|
||||
if dug then
|
||||
if mobs_mc.enderman_replace_on_take[node.name] then
|
||||
self._taken_node = mobs_mc.enderman_replace_on_take[node.name]
|
||||
else
|
||||
|
@ -479,8 +478,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
-- Selected node needs to have 3 nodes of free space above
|
||||
for u=1, 3 do
|
||||
local node = minetest.get_node({x=nodepos.x, y=nodepos.y+u, z=nodepos.z})
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if ndef and ndef.walkable then
|
||||
if minetest.registered_nodes[node.name].walkable then
|
||||
node_ok = false
|
||||
break
|
||||
end
|
||||
|
@ -514,8 +512,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
node_ok = true
|
||||
for u=1, 3 do
|
||||
local node = minetest.get_node({x=nodepos.x, y=nodepos.y+u, z=nodepos.z})
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if ndef and ndef.walkable then
|
||||
if minetest.registered_nodes[node.name].walkable then
|
||||
node_ok = false
|
||||
break
|
||||
end
|
||||
|
|
|
@ -520,42 +520,22 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"flat",
|
||||
"IcePlainsSpikes",
|
||||
"ColdTaiga",
|
||||
"ColdTaiga_beach",
|
||||
"ColdTaiga_beach_water",
|
||||
"MegaTaiga",
|
||||
"MegaSpruceTaiga",
|
||||
"ExtremeHills",
|
||||
"ExtremeHills_beach",
|
||||
"ExtremeHillsM",
|
||||
"ExtremeHills+",
|
||||
"ExtremeHills+_snowtop",
|
||||
"StoneBeach",
|
||||
"Plains",
|
||||
"Plains_beach",
|
||||
"SunflowerPlains",
|
||||
"Taiga",
|
||||
"Taiga_beach",
|
||||
"Forest",
|
||||
"Forest_beach",
|
||||
"FlowerForest",
|
||||
"FlowerForest_beach",
|
||||
"BirchForest",
|
||||
"BirchForestM",
|
||||
"RoofedForest",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
"SavannaM",
|
||||
"Jungle",
|
||||
"Jungle_shore",
|
||||
"JungleM",
|
||||
"JungleM_shore",
|
||||
"JungleEdge",
|
||||
"JungleEdgeM",
|
||||
"Swampland",
|
||||
"Swampland_shore"
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
"RoofedForest",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"ExtremeHillsM",
|
||||
"BirchForestM",
|
||||
},
|
||||
0,
|
||||
minetest.LIGHT_MAX+1,
|
||||
|
|
|
@ -42,6 +42,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
{"blank.png", "blank.png", "mobs_mc_llama_gray.png"},
|
||||
{"blank.png", "blank.png", "mobs_mc_llama_white.png"},
|
||||
{"blank.png", "blank.png", "mobs_mc_llama.png"},
|
||||
-- TODO: Add llama carpet textures (Pixel Perfection seems to use verbatim copy from Minecraft :-( )
|
||||
},
|
||||
visual_size = {x=3, y=3},
|
||||
makes_footstep_sound = true,
|
||||
|
@ -138,48 +139,50 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
-- Make sure tamed llama is mature and being clicked by owner only
|
||||
if self.tamed and not self.child and self.owner == clicker:get_player_name() then
|
||||
|
||||
-- Place carpet
|
||||
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
||||
for group, carpetdata in pairs(carpets) do
|
||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
-- Place carpet
|
||||
--[[ TODO: Re-enable this code when carpet textures arrived.
|
||||
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
||||
for group, carpetdata in pairs(carpets) do
|
||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
end
|
||||
local substr = carpetdata[2]
|
||||
local tex_carpet = "mobs_mc_llama_decor_"..substr..".png"
|
||||
self.base_texture = table.copy(self.base_texture)
|
||||
self.base_texture[2] = tex_carpet
|
||||
self.object:set_properties({
|
||||
textures = self.base_texture,
|
||||
})
|
||||
self.carpet = item:get_name()
|
||||
self.drops = {
|
||||
{name = mobs_mc.items.leather,
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
{name = item:get_name(),
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
}
|
||||
return
|
||||
end
|
||||
local substr = carpetdata[2]
|
||||
local tex_carpet = "mobs_mc_llama_decor_"..substr..".png"
|
||||
self.base_texture = table.copy(self.base_texture)
|
||||
self.base_texture[2] = tex_carpet
|
||||
self.object:set_properties({
|
||||
textures = self.base_texture,
|
||||
})
|
||||
self.carpet = item:get_name()
|
||||
self.drops = {
|
||||
{name = mobs_mc.items.leather,
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
{name = item:get_name(),
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
}
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
]]
|
||||
|
||||
-- detatch player already riding llama
|
||||
if self.driver and clicker == self.driver then
|
||||
-- detatch player already riding llama
|
||||
if self.driver and clicker == self.driver then
|
||||
|
||||
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
|
||||
-- attach player to llama
|
||||
elseif not self.driver then
|
||||
-- attach player to llama
|
||||
elseif not self.driver then
|
||||
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mobs.attach(self, clicker)
|
||||
end
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mobs.attach(self, clicker)
|
||||
end
|
||||
|
||||
-- Used to capture llama
|
||||
elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then
|
||||
|
@ -187,6 +190,8 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
end
|
||||
end,
|
||||
|
||||
--[[
|
||||
TODO: Enable this code when carpet textures arrived.
|
||||
on_breed = function(parent1, parent2)
|
||||
-- When breeding, make sure the child has no carpet
|
||||
local pos = parent1.object:get_pos()
|
||||
|
@ -208,6 +213,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
return false
|
||||
end
|
||||
end,
|
||||
]]
|
||||
|
||||
})
|
||||
|
||||
|
@ -217,18 +223,12 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"Mesa",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"MesaPlateauF",
|
||||
"MesaPlateauFM",
|
||||
"MesaPlateauF_grasstop",
|
||||
"MesaBryce",
|
||||
"Jungle",
|
||||
"Jungle_shore",
|
||||
"JungleM",
|
||||
"JungleM_shore",
|
||||
"JungleEdge",
|
||||
"JungleEdgeM",
|
||||
"Mesa",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"MesaPlateauF",
|
||||
"MesaPlateauFM",
|
||||
"MesaPlateauF_grasstop",
|
||||
"MesaBryce",
|
||||
},
|
||||
0,
|
||||
minetest.LIGHT_MAX+1,
|
||||
|
|
|
@ -188,42 +188,22 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"flat",
|
||||
"IcePlainsSpikes",
|
||||
"ColdTaiga",
|
||||
"ColdTaiga_beach",
|
||||
"ColdTaiga_beach_water",
|
||||
"MegaTaiga",
|
||||
"MegaSpruceTaiga",
|
||||
"ExtremeHills",
|
||||
"ExtremeHills_beach",
|
||||
"ExtremeHillsM",
|
||||
"ExtremeHills+",
|
||||
"ExtremeHills+_snowtop",
|
||||
"StoneBeach",
|
||||
"Plains",
|
||||
"Plains_beach",
|
||||
"SunflowerPlains",
|
||||
"Taiga",
|
||||
"Taiga_beach",
|
||||
"Forest",
|
||||
"Forest_beach",
|
||||
"FlowerForest",
|
||||
"FlowerForest_beach",
|
||||
"BirchForest",
|
||||
"BirchForestM",
|
||||
"RoofedForest",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
"SavannaM",
|
||||
"Jungle",
|
||||
"Jungle_shore",
|
||||
"JungleM",
|
||||
"JungleM_shore",
|
||||
"JungleEdge",
|
||||
"JungleEdgeM",
|
||||
"Swampland",
|
||||
"Swampland_shore"
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
"RoofedForest",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"ExtremeHillsM",
|
||||
"BirchForestM",
|
||||
},
|
||||
9,
|
||||
minetest.LIGHT_MAX+1,
|
||||
|
|
|
@ -116,14 +116,15 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"Desert",
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
|
|
|
@ -309,42 +309,22 @@ mobs:spawn_specific(
|
|||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"flat",
|
||||
"IcePlainsSpikes",
|
||||
"ColdTaiga",
|
||||
"ColdTaiga_beach",
|
||||
"ColdTaiga_beach_water",
|
||||
"MegaTaiga",
|
||||
"MegaSpruceTaiga",
|
||||
"ExtremeHills",
|
||||
"ExtremeHills_beach",
|
||||
"ExtremeHillsM",
|
||||
"ExtremeHills+",
|
||||
"ExtremeHills+_snowtop",
|
||||
"StoneBeach",
|
||||
"Plains",
|
||||
"Plains_beach",
|
||||
"SunflowerPlains",
|
||||
"Taiga",
|
||||
"Taiga_beach",
|
||||
"Forest",
|
||||
"Forest_beach",
|
||||
"FlowerForest",
|
||||
"FlowerForest_beach",
|
||||
"BirchForest",
|
||||
"BirchForestM",
|
||||
"RoofedForest",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
"SavannaM",
|
||||
"Jungle",
|
||||
"Jungle_shore",
|
||||
"JungleM",
|
||||
"JungleM_shore",
|
||||
"JungleEdge",
|
||||
"JungleEdgeM",
|
||||
"Swampland",
|
||||
"Swampland_shore"
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
"RoofedForest",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"ExtremeHillsM",
|
||||
"BirchForestM",
|
||||
},
|
||||
0,
|
||||
minetest.LIGHT_MAX+1,
|
||||
|
|
|
@ -16,8 +16,7 @@ local spawn_children_on_die = function(child_mob, children_count, spawn_distance
|
|||
if not eject_speed then
|
||||
eject_speed = 1
|
||||
end
|
||||
local mndef = minetest.registered_nodes[minetest.get_node(pos).name]
|
||||
local mother_stuck = mndef and mndef.walkable
|
||||
local mother_stuck = minetest.registered_nodes[minetest.get_node(pos).name].walkable
|
||||
angle = math.random(0, math.pi*2)
|
||||
local children = {}
|
||||
for i=1,children_count do
|
||||
|
@ -27,8 +26,7 @@ local spawn_children_on_die = function(child_mob, children_count, spawn_distance
|
|||
-- If child would end up in a wall, use position of the "mother", unless
|
||||
-- the "mother" was stuck as well
|
||||
local speed_penalty = 1
|
||||
local cndef = minetest.registered_nodes[minetest.get_node(newpos).name]
|
||||
if (not mother_stuck) and cndef and cndef.walkable then
|
||||
if (not mother_stuck) and minetest.registered_nodes[minetest.get_node(newpos).name].walkable then
|
||||
newpos = pos
|
||||
speed_penalty = 0.5
|
||||
end
|
||||
|
|
|
@ -124,10 +124,6 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
local pos = self.object:get_pos()
|
||||
minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true)
|
||||
|
||||
if minetest.registered_items["mcl_farming:pumpkin_face"] then
|
||||
minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_farming:pumpkin_face")
|
||||
end
|
||||
|
||||
-- Wear out
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:add_wear(mobs_mc.misc.shears_wear)
|
||||
|
|
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 936 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 966 B |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
|
@ -62,15 +62,9 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then
|
|||
end
|
||||
|
||||
local professions = {
|
||||
unemployed = {
|
||||
name = N("Unemployed"),
|
||||
texture = "mobs_mc_villager.png",
|
||||
trades = nil,
|
||||
},
|
||||
farmer = {
|
||||
name = N("Farmer"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_composters:composter",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_farming:wheat_item", 18, 22, }, E1 },
|
||||
|
@ -80,21 +74,18 @@ local professions = {
|
|||
},
|
||||
|
||||
{
|
||||
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
||||
{ { "mcl_farming:pumpkin_face", 8, 13 }, E1 },
|
||||
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
||||
{ E1, { "mcl_core:apple", 2, 3} },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_farming:melon", 7, 12 }, E1 },
|
||||
{ E1, {"mcl_farming:cookie", 5, 7 }, },
|
||||
{ E1, { "mcl_core:apple", 5, 7 }, },
|
||||
},
|
||||
|
||||
{
|
||||
{ E1, { "mcl_mushrooms:mushroom_stew", 6, 10 } }, --FIXME: expert level farmer is supposed to sell sus stews.
|
||||
},
|
||||
{
|
||||
{ E1, { "mcl_farming:carrot_item_gold", 3, 10 } },
|
||||
{ E1, { "mcl_potions:speckled_melon", 4, 1 } },
|
||||
{ E1, { "mcl_farming:cookie", 6, 10 } },
|
||||
{ E1, { "mcl_cake:cake", 1, 1 } },
|
||||
TRADE_V6_BIRCH_SAPLING,
|
||||
TRADE_V6_DARK_OAK_SAPLING,
|
||||
TRADE_V6_ACACIA_SAPLING,
|
||||
|
@ -104,81 +95,32 @@ local professions = {
|
|||
fisherman = {
|
||||
name = N("Fisherman"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_barrels:barrel_closed",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:fish_cooked", 6, 6 } },
|
||||
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } },
|
||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||
{ { "mcl_core:coal_lump", 15, 10 }, E1 },
|
||||
-- FIXME missing: bucket of cod + fish should be cod.
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:fish_raw", 6, 15,}, E1 },
|
||||
{ { "mcl_fishing:salmon_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:salmon_cooked", 6, 6 } },
|
||||
-- FIXME missing campfire
|
||||
-- {{ "mcl_core:emerald", 1, 2 },{"mcl_campfires:campfire",1,1} },
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:salmon_raw", 6, 13,}, E1 },
|
||||
{ { "mcl_core:emerald", 7, 22 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:clownfish_raw", 6, 6,}, E1 },
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:pufferfish_raw", 4, 4,}, E1 },
|
||||
|
||||
{ { "mcl_boats:boat", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_acacia", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_spruce", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_dark_oak", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_birch", 1, 1,}, E1 },
|
||||
{ { "mcl_core:emerald", 3, 11 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
||||
},
|
||||
},
|
||||
},
|
||||
fletcher = {
|
||||
name = N("Fletcher"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_fletching_table:fletching_table",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||
{ E1, { "mcl_bows:arrow", 8, 12 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:flint", 26, 26 }, E1 },
|
||||
{ { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:string", 14, 14 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_bows:crossbow", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:string", 24, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 7, 21 } , { "mcl_bows:bow_enchanted", 1, 1 } },
|
||||
},
|
||||
{
|
||||
--FIXME: supposed to be tripwire hook{ { "tripwirehook", 24, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 8, 22 } , { "mcl_bows:crossbow_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:healing_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:harming_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:night_vision_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:swiftness_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:slowness_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:leaping_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:poison_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:regeneration_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:invisibility_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:water_breathing_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:fire_resistance_arrow", 5, 5 } },
|
||||
},
|
||||
}
|
||||
},
|
||||
shepherd ={
|
||||
name = N("Shepherd"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
jobsite = "mcl_loom:loom",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_wool:white", 16, 22 }, E1 },
|
||||
|
@ -208,262 +150,179 @@ local professions = {
|
|||
librarian = {
|
||||
name = N("Librarian"),
|
||||
texture = "mobs_mc_villager_librarian.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: lectern
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||
{ { "mcl_books:book", 8, 10 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_compass:compass", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 3, 4 }, { "mcl_books:bookshelf", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_books:written_book", 2, 2 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ E1, { "mcl_lanterns:lantern_floor", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_clock:clock", 1, 1 } },
|
||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_dye:black", 5, 5 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ E1, { "mcl_core:glass", 4, 4 } },
|
||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ E1, { "mcl_books:writable_book", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_compass:compass", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_clock:clock", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 20, 20 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 20, 22 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||
}
|
||||
},
|
||||
},
|
||||
cartographer = {
|
||||
name = N("Cartographer"),
|
||||
texture = "mobs_mc_villager_librarian.png",
|
||||
jobsite = "mcl_cartography_table:cartography_table",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:paper", 24, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_maps:empty_map", 1, 1 } },
|
||||
},
|
||||
{
|
||||
-- compass subject to special checks
|
||||
{ { "xpanes:pane_natural_flat", 1, 1 }, E1 },
|
||||
--{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:ocean explorer map" 1, 1} },
|
||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||
},
|
||||
|
||||
{
|
||||
-- subject to special checks
|
||||
{ { "mcl_compass:compass", 1, 1 }, E1 },
|
||||
--{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:woodland explorer map" 1, 1} },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 1, 1 }},
|
||||
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_white", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_grey", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_silver", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_black", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_red", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_green", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_cyan", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_blue", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_magenta", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_orange", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_purple", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_brown", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_pink", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_lime", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_light_blue", 1, 1 }},
|
||||
},
|
||||
{
|
||||
--{ { "mcl_core:emerald", 8, 8}, { "FIXME: globe banner pattern", 1, 1 } },
|
||||
-- TODO: replace with empty map
|
||||
{ { "mcl_core:emerald", 7, 11}, { "mcl_maps:filled_map", 1, 1 } },
|
||||
},
|
||||
|
||||
-- TODO: special maps
|
||||
},
|
||||
},
|
||||
armorer = {
|
||||
name = N("Armorer"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
jobsite = "mcl_core:lava_source", --FIXME: blast furnace
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 9, 9 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:leggings_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_iron", 1, 1 } },
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 4, 6 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 1, 1 }, { "mcl_armor:boots_chain", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_buckets:bucket_lava", 1, 1 }, E1 },
|
||||
{ { "mcl_core:diamond", 1, 1 }, E1 },
|
||||
{ { "mcl_core:emerald", 1, 1 }, { "mcl_armor:helmet_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:chestplate_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_shields:shield", 1, 1 } },
|
||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 10, 14 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 19, 33 }, { "mcl_armor:leggings_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:boots_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 16, 19 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:helmet_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 21, 35 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_armor:boots_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_armor:leggings_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_armor:helmet_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 11, 15 }, { "mcl_armor:chestplate_chain", 1, 1 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
leatherworker = {
|
||||
name = N("Leatherworker"),
|
||||
texture = "mobs_mc_villager_butcher.png",
|
||||
jobsite = "mcl_cauldrons:cauldron",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:leather", 9, 12 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 2, 4 } },
|
||||
{ { "mcl_core:emerald", 2, 4 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:flint", 26, 26 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_leather", 2, 4 } },
|
||||
{ { "mcl_core:emerald", 7, 12 }, { "mcl_armor:chestplate_leather_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_mobitems:rabbit_hide", 9, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 1, 1 } },
|
||||
},
|
||||
{
|
||||
--{ { "FIXME: scute", 4, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:emerald", 6, 6 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
butcher = {
|
||||
name = N("Butcher"),
|
||||
texture = "mobs_mc_villager_butcher.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smoker
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:beef", 14, 14 }, E1 },
|
||||
{ { "mcl_mobitems:chicken", 7, 7 }, E1 },
|
||||
{ { "mcl_mobitems:rabbit", 4, 4 }, E1 },
|
||||
{ E1, { "mcl_mobitems:rabbit_stew", 1, 1 } },
|
||||
{ { "mcl_mobitems:beef", 14, 18 }, E1 },
|
||||
{ { "mcl_mobitems:chicken", 14, 18 }, E1 },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ E1, { "mcl_mobitems:cooked_porkchop", 5, 5 } },
|
||||
{ E1, { "mcl_mobitems:cooked_chicken", 8, 8 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
||||
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
||||
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
||||
},
|
||||
{
|
||||
--{ { "FIXME: Sweet Berries", 10, 10 }, E1 },
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ E1, { "mcl_mobitems:cooked_beef", 5, 7 } },
|
||||
{ E1, { "mcl_mobitems:cooked_chicken", 6, 8 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
weapon_smith = {
|
||||
name = N("Weapon Smith"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: grindstone
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_tools:axe_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 6, 8 }, { "mcl_tools:axe_iron", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:flint", 7, 9 }, E1 },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:diamond", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 10 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 9, 12 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
tool_smith = {
|
||||
name = N("Tool Smith"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
jobsite = "mcl_villages:stonebrickcarved", --FIXME: smithing table
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ E1, { "mcl_tools:axe_stone", 1, 1 } },
|
||||
{ E1, { "mcl_tools:shovel_stone", 1, 1 } },
|
||||
{ E1, { "mcl_tools:pick_stone", 1, 1 } },
|
||||
{ E1, { "mcl_farming:hoe_stone", 1, 1 } },
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
--{ { "mcl_core:emerald", 36, 36 }, { "FIXME: Bell", 1, 1 } },
|
||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:flint", 30, 30 }, E1 },
|
||||
{ { "mcl_core:emerald", 6, 20 }, { "mcl_tools:axe_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 8, 22 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_farming:hoe_diamond", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:diamond", 1, 1 }, E1 },
|
||||
{ { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 10, 24 }, { "mcl_tools:shovel_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:emerald", 18, 32 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
cleric = {
|
||||
name = N("Cleric"),
|
||||
texture = "mobs_mc_villager_priest.png",
|
||||
jobsite = "mcl_brewing:stand",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:rotten_flesh", 32, 32 }, E1 },
|
||||
{ E1, { "mesecons:redstone", 2, 2 } },
|
||||
{ { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 },
|
||||
{ { "mcl_core:gold_ingot", 8, 10 }, E1 },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:gold_ingot", 3, 3 }, E1 },
|
||||
{ E1, { "mcl_dye:blue", 1, 1 } },
|
||||
{ E1, { "mesecons:redstone", 1, 4 } },
|
||||
{ E1, { "mcl_dye:blue", 1, 2 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_mobitems:rabbit_foot", 2, 2 }, E1 },
|
||||
{ E1, { "mcl_nether:glowstone", 4, 4 } },
|
||||
},
|
||||
{
|
||||
--{ { "FIXME: scute", 4, 4 }, E1 },
|
||||
{ { "mcl_potions:glass_bottle", 9, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
||||
{ E1, { "mcl_nether:glowstone", 1, 3 } },
|
||||
{ { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
||||
TRADE_V6_RED_SANDSTONE,
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_nether:nether_wart_item", 22, 22 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } },
|
||||
|
@ -488,42 +347,6 @@ local stand_still = function(self)
|
|||
self.jump = false
|
||||
end
|
||||
|
||||
local function set_velocity(self, v)
|
||||
local yaw = (self.object:get_yaw() or 0) + self.rotate
|
||||
self.object:set_velocity({
|
||||
x = (math.sin(yaw) * -v),
|
||||
y = self.object:get_velocity().y,
|
||||
z = (math.cos(yaw) * v),
|
||||
})
|
||||
end
|
||||
|
||||
local function go_to_pos(entity,b)
|
||||
local s=entity.object:get_pos()
|
||||
local v = { x = b.x - s.x, z = b.z - s.z }
|
||||
local yaw = (math.atan(v.z / v.x) + math.pi / 2) - entity.rotate
|
||||
if b.x > s.x then yaw = yaw + math.pi end
|
||||
entity.object:set_yaw(yaw)
|
||||
set_velocity(entity,entity.follow_velocity)
|
||||
if vector.distance(b,s) < 5 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local function go_home(entity)
|
||||
entity.state = "go_home"
|
||||
local b=entity.bed
|
||||
if not b then return end
|
||||
if go_to_pos(entity,b) then
|
||||
entity.state = "stand"
|
||||
set_velocity(entity,0)
|
||||
entity.object:set_pos(b)
|
||||
local n=minetest.get_node(b)
|
||||
if n and n.name ~= "mcl_beds:bed_red_bottom" then
|
||||
entity.bed=nil --the stormtroopers have killed uncle owen
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local update_max_tradenum = function(self)
|
||||
if not self._trades then
|
||||
return
|
||||
|
@ -1164,19 +987,11 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
die_end = 220,
|
||||
die_loop = false,
|
||||
},
|
||||
follow = mobs_mc.follow.villager,
|
||||
view_range = 16,
|
||||
fear_height = 4,
|
||||
jump = true,
|
||||
walk_chance = DEFAULT_WALK_CHANCE,
|
||||
on_rightclick = function(self, clicker)
|
||||
if clicker:get_wielded_item():get_name() == "mcl_farming:bread" then
|
||||
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
end
|
||||
if self.child then
|
||||
return
|
||||
end
|
||||
-- Initiate trading
|
||||
local name = clicker:get_player_name()
|
||||
self._trading_players[name] = true
|
||||
|
@ -1218,11 +1033,6 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
if not self._player_scan_timer then
|
||||
self._player_scan_timer = 0
|
||||
end
|
||||
|
||||
if self.bed and ( self.state == "go_home" or vector.distance(self.object:get_pos(),self.bed) > 50 ) then
|
||||
go_home(self)
|
||||
end
|
||||
|
||||
self._player_scan_timer = self._player_scan_timer + dtime
|
||||
-- Check infrequently to keep CPU load low
|
||||
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then
|
||||
|
|
|
@ -85,3 +85,17 @@ mobs:register_mob("mobs_mc:evoker", {
|
|||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:evoker", S("Evoker"), "mobs_mc_spawn_icon_evoker.png", 0)
|
||||
mobs:spawn_specific(
|
||||
"mobs_mc:evoker",
|
||||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"RoofedForest",
|
||||
},
|
||||
0,
|
||||
7,
|
||||
30,
|
||||
65000,
|
||||
8,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
|
|
|
@ -197,6 +197,7 @@ mobs:spawn_specific(
|
|||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
|
@ -289,6 +290,7 @@ mobs:spawn_specific(
|
|||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
|
@ -340,6 +342,9 @@ mobs:spawn_specific(
|
|||
"ground",
|
||||
{
|
||||
"Desert",
|
||||
"SavannaM",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
},
|
||||
0,
|
||||
7,
|
||||
|
@ -354,6 +359,9 @@ mobs:spawn_specific(
|
|||
"ground",
|
||||
{
|
||||
"Desert",
|
||||
"SavannaM",
|
||||
"Savanna",
|
||||
"Savanna_beach",
|
||||
},
|
||||
0,
|
||||
7,
|
||||
|
|
|
@ -1,66 +1,36 @@
|
|||
mcl_weather.nether_dust = {}
|
||||
mcl_weather.nether_dust.particlespawners = {}
|
||||
mcl_weather.nether_dust.particles_count = 99
|
||||
|
||||
local psdef= {
|
||||
amount = 150,
|
||||
time = 0,
|
||||
minpos = vector.new(-15,-15,-15),
|
||||
maxpos =vector.new(15,15,15),
|
||||
minvel = vector.new(-0.3,-0.15,-1),
|
||||
maxvel = vector.new(0.3,0.15,0.3),
|
||||
minacc = vector.new(-1,-0.4,-1),
|
||||
maxacc = vector.new(1,0.4,1),
|
||||
minexptime = 1,
|
||||
maxexptime = 10,
|
||||
minsize = 0.2,
|
||||
maxsize = 0.7,
|
||||
collisiondetection = false,
|
||||
collision_removal = false,
|
||||
object_collision = false,
|
||||
vertical = false
|
||||
}
|
||||
|
||||
local function check_player(player)
|
||||
local name=player:get_player_name()
|
||||
if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||
local name=player:get_player_name()
|
||||
mcl_weather.nether_dust.particlespawners[name]={}
|
||||
psdef.playername = name
|
||||
psdef.attached = player
|
||||
psdef.glow = math.random(0,minetest.LIGHT_MAX)
|
||||
for i=1,3 do
|
||||
psdef.texture="mcl_particles_nether_dust"..i..".png"
|
||||
mcl_weather.nether_dust.particlespawners[name][i]=minetest.add_particlespawner(psdef)
|
||||
-- calculates coordinates and draw particles for Nether dust
|
||||
function mcl_weather.nether_dust.add_dust_particles(player)
|
||||
for i=mcl_weather.nether_dust.particles_count, 1,-1 do
|
||||
local rpx, rpy, rpz = mcl_weather.get_random_pos_by_player_look_dir(player)
|
||||
minetest.add_particle({
|
||||
pos = {x = rpx, y = rpy - math.random(6, 18), z = rpz},
|
||||
velocity = {x = math.random(-30,30)*0.01, y = math.random(-15,15)*0.01, z = math.random(-30,30)*0.01},
|
||||
acceleration = {x = math.random(-50,50)*0.02, y = math.random(-20,20)*0.02, z = math.random(-50,50)*0.02},
|
||||
expirationtime = 3,
|
||||
size = math.random(6,20)*0.01,
|
||||
collisiondetection = false,
|
||||
object_collision = false,
|
||||
vertical = false,
|
||||
glow = math.random(0,minetest.LIGHT_MAX),
|
||||
texture = "mcl_particles_nether_dust"..tostring(i%3+1)..".png",
|
||||
playername = player:get_player_name()
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
||||
local name=player:get_player_name()
|
||||
if mcl_weather.nether_dust.particlespawners[name] then
|
||||
for i=1,3 do
|
||||
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer < 0.7 then return end
|
||||
timer = 0
|
||||
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
if not mcl_worlds.has_dust(player:get_pos()) then
|
||||
return false
|
||||
end
|
||||
mcl_weather.nether_dust.particlespawners[name]=nil
|
||||
end
|
||||
end
|
||||
|
||||
mcl_worlds.register_on_dimension_change(function(player, dimension)
|
||||
if check_player(player) then
|
||||
return mcl_weather.nether_dust.add_particlespawners(player)
|
||||
end
|
||||
mcl_weather.nether_dust.delete_particlespawners(player)
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
if check_player(player) then
|
||||
mcl_weather.nether_dust.add_particlespawners(player)
|
||||
mcl_weather.nether_dust.add_dust_particles(player)
|
||||
end
|
||||
end)
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
mcl_weather.nether_dust.delete_particlespawners(player)
|
||||
end)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
local PARTICLES_COUNT_RAIN = 100
|
||||
local PARTICLES_COUNT_THUNDER = 300
|
||||
local PARTICLES_COUNT_RAIN = 30
|
||||
local PARTICLES_COUNT_THUNDER = 45
|
||||
|
||||
local get_connected_players = minetest.get_connected_players
|
||||
|
||||
|
@ -19,45 +19,6 @@ mcl_weather.rain = {
|
|||
|
||||
init_done = false,
|
||||
}
|
||||
local update_sound={}
|
||||
local vel=math.random(0,3)
|
||||
local falling_speed=math.random(10,15)
|
||||
local size = math.random(1,3)
|
||||
local psdef= {
|
||||
amount = mcl_weather.rain.particles_count,
|
||||
time=0,
|
||||
minpos = vector.new(-6,3,-6),
|
||||
maxpos = vector.new(6,15,6),
|
||||
minvel = vector.new(-vel,-falling_speed,-vel),
|
||||
maxvel = vector.new(vel,-falling_speed+vel,vel),
|
||||
minacc = vector.new(0,0,0),
|
||||
maxacc = vector.new(0,-0.4,0),
|
||||
minexptime = 0.5,
|
||||
maxexptime = 2,
|
||||
minsize = size,
|
||||
maxsize= size*2,
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
vertical = true,
|
||||
}
|
||||
local psdef_backsplash= {
|
||||
amount = 10,
|
||||
time=0,
|
||||
minpos = vector.new(-3,-1,-3),
|
||||
maxpos = vector.new(3,0,3),
|
||||
minvel = vector.new(-vel,falling_speed*2,-vel),
|
||||
maxvel = vector.new(vel,falling_speed*2+vel,vel),
|
||||
minacc = vector.new(0,0,0),
|
||||
maxacc = vector.new(0,0,0),
|
||||
minexptime = 0.1,
|
||||
maxexptime = 0.2,
|
||||
minsize = size*0.1,
|
||||
maxsize= size*0.5,
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
vertical = true,
|
||||
}
|
||||
local textures = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png", "weather_pack_rain_raindrop_1.png"}
|
||||
|
||||
function mcl_weather.rain.sound_handler(player)
|
||||
return minetest.sound_play("weather_rain", {
|
||||
|
@ -83,18 +44,42 @@ function mcl_weather.rain.set_sky_box()
|
|||
end
|
||||
end
|
||||
|
||||
-- no no no NO NO f*.. no. no manual particle creatin' PLS!! this sends EVERY particle over the net.
|
||||
-- creating manually parctiles instead of particles spawner because of easier to control
|
||||
-- spawn position.
|
||||
function mcl_weather.rain.add_rain_particles(player)
|
||||
mcl_weather.rain.last_rp_count = mcl_weather.rain.particles_count
|
||||
for k,v in pairs(textures) do
|
||||
psdef.texture=v
|
||||
mcl_weather.add_spawner_player(player,"rain"..k,psdef)
|
||||
mcl_weather.rain.last_rp_count = 0
|
||||
for i=mcl_weather.rain.particles_count, 1,-1 do
|
||||
local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player)
|
||||
if mcl_weather.is_outdoor({x=random_pos_x, y=random_pos_y, z=random_pos_z}) then
|
||||
mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1
|
||||
minetest.add_particle({
|
||||
pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z},
|
||||
velocity = {x=0, y=-10, z=0},
|
||||
acceleration = {x=0, y=-30, z=0},
|
||||
expirationtime = 1.0,
|
||||
size = math.random(0.5, 3),
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
vertical = true,
|
||||
texture = mcl_weather.rain.get_texture(),
|
||||
playername = player:get_player_name()
|
||||
})
|
||||
end
|
||||
end
|
||||
psdef_backsplash.texture=textures[math.random(1,#textures)]
|
||||
local l=mcl_weather.add_spawner_player(player,"rainbacksplash",psdef_backsplash)
|
||||
if l then
|
||||
update_sound[player:get_player_name()]=true
|
||||
end
|
||||
|
||||
-- Simple random texture getter
|
||||
function mcl_weather.rain.get_texture()
|
||||
local texture_name
|
||||
local random_number = math.random()
|
||||
if random_number > 0.33 then
|
||||
texture_name = "weather_pack_rain_raindrop_1.png"
|
||||
elseif random_number > 0.66 then
|
||||
texture_name = "weather_pack_rain_raindrop_2.png"
|
||||
else
|
||||
texture_name = "weather_pack_rain_raindrop_3.png"
|
||||
end
|
||||
return texture_name;
|
||||
end
|
||||
|
||||
-- register player for rain weather.
|
||||
|
@ -104,7 +89,6 @@ function mcl_weather.rain.add_player(player)
|
|||
local player_meta = {}
|
||||
player_meta.origin_sky = {player:get_sky()}
|
||||
mcl_weather.players[player:get_player_name()] = player_meta
|
||||
update_sound[player:get_player_name()]=true
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -115,15 +99,26 @@ function mcl_weather.rain.remove_player(player)
|
|||
if player_meta and player_meta.origin_sky then
|
||||
player:set_clouds({color="#FFF0F0E5"})
|
||||
mcl_weather.players[player:get_player_name()] = nil
|
||||
update_sound[player:get_player_name()]=true
|
||||
end
|
||||
end
|
||||
|
||||
mcl_worlds.register_on_dimension_change(function(player, dimension)
|
||||
if dimension ~= "overworld" and dimension ~= "void" then
|
||||
mcl_weather.rain.remove_sound(player)
|
||||
mcl_weather.rain.remove_player(player)
|
||||
elseif dimension == "overworld" then
|
||||
mcl_weather.rain.update_sound(player)
|
||||
if mcl_weather.rain.raining then
|
||||
mcl_weather.rain.add_rain_particles(player)
|
||||
mcl_weather.rain.add_player(player)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- adds and removes rain sound depending how much rain particles around player currently exist.
|
||||
-- have few seconds delay before each check to avoid on/off sound too often
|
||||
-- when player stay on 'edge' where sound should play and stop depending from random raindrop appearance.
|
||||
function mcl_weather.rain.update_sound(player)
|
||||
if not update_sound[player:get_player_name()] then return end
|
||||
local player_meta = mcl_weather.players[player:get_player_name()]
|
||||
if player_meta then
|
||||
if player_meta.sound_updated and player_meta.sound_updated + 5 > minetest.get_gametime() then
|
||||
|
@ -141,7 +136,6 @@ function mcl_weather.rain.update_sound(player)
|
|||
|
||||
player_meta.sound_updated = minetest.get_gametime()
|
||||
end
|
||||
update_sound[player:get_player_name()]=false
|
||||
end
|
||||
|
||||
-- rain sound removed from player.
|
||||
|
@ -164,8 +158,7 @@ function mcl_weather.rain.clear()
|
|||
for _, player in pairs(get_connected_players()) do
|
||||
mcl_weather.rain.remove_sound(player)
|
||||
mcl_weather.rain.remove_player(player)
|
||||
mcl_weather.remove_spawners_player(player)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
|
@ -184,10 +177,8 @@ function mcl_weather.rain.make_weather()
|
|||
end
|
||||
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
local pos=player:get_pos()
|
||||
if mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(pos) or not mcl_weather.is_outdoor(pos) then
|
||||
if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then
|
||||
mcl_weather.rain.remove_sound(player)
|
||||
mcl_weather.remove_spawners_player(player)
|
||||
return false
|
||||
end
|
||||
mcl_weather.rain.add_player(player)
|
||||
|
@ -199,12 +190,8 @@ end
|
|||
-- Switch the number of raindrops: "thunder" for many raindrops, otherwise for normal raindrops
|
||||
function mcl_weather.rain.set_particles_mode(mode)
|
||||
if mode == "thunder" then
|
||||
psdef.amount=PARTICLES_COUNT_THUNDER
|
||||
psdef_backsplash.amount=PARTICLES_COUNT_THUNDER
|
||||
mcl_weather.rain.particles_count = PARTICLES_COUNT_THUNDER
|
||||
else
|
||||
psdef.amount=PARTICLES_COUNT_RAIN
|
||||
psdef_backsplash.amount=PARTICLES_COUNT_RAIN
|
||||
mcl_weather.rain.particles_count = PARTICLES_COUNT_RAIN
|
||||
end
|
||||
end
|
||||
|
|
|
@ -240,7 +240,8 @@ local function initsky(player)
|
|||
mcl_weather.skycolor.force_update = true
|
||||
end
|
||||
|
||||
player:set_clouds(mcl_worlds:get_cloud_parameters() or {height=mcl_worlds.layer_to_y(127), speed={x=-2, z=0}, thickness=4, color="#FFF0FEF"})
|
||||
-- MC-style clouds: Layer 127, thickness 4, fly to the “West”
|
||||
player:set_clouds({height=mcl_worlds.layer_to_y(127), speed={x=-2, z=0}, thickness=4, color="#FFF0FEF"})
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(initsky)
|
||||
|
|
|
@ -5,25 +5,30 @@ mcl_weather.snow = {}
|
|||
mcl_weather.snow.particles_count = 15
|
||||
mcl_weather.snow.init_done = false
|
||||
|
||||
local psdef= {
|
||||
amount = 99,
|
||||
time = 0, --stay on til we turn it off
|
||||
minpos = vector.new(-15,-5,-15),
|
||||
maxpos =vector.new(15,10,15),
|
||||
minvel = vector.new(0,-1,0),
|
||||
maxvel = vector.new(0,-4,0),
|
||||
minacc = vector.new(0,-1,0),
|
||||
maxacc = vector.new(0,-4,0),
|
||||
minexptime = 1,
|
||||
maxexptime = 1,
|
||||
minsize = 0.5,
|
||||
maxsize = 5,
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
object_collision = true,
|
||||
vertical = true,
|
||||
glow = 1
|
||||
}
|
||||
-- calculates coordinates and draw particles for snow weather
|
||||
function mcl_weather.snow.add_snow_particles(player)
|
||||
mcl_weather.rain.last_rp_count = 0
|
||||
for i=mcl_weather.snow.particles_count, 1,-1 do
|
||||
local random_pos_x, _, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player)
|
||||
local random_pos_y = math.random() + math.random(player:get_pos().y - 1, player:get_pos().y + 7)
|
||||
if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then
|
||||
mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1
|
||||
minetest.add_particle({
|
||||
pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z},
|
||||
velocity = {x = math.random(-100,100)*0.001, y = math.random(-300,-100)*0.004, z = math.random(-100,100)*0.001},
|
||||
acceleration = {x = 0, y=0, z = 0},
|
||||
expirationtime = 8.0,
|
||||
size = 1,
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
object_collision = false,
|
||||
vertical = false,
|
||||
texture = mcl_weather.snow.get_texture(),
|
||||
playername = player:get_player_name()
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_weather.snow.set_sky_box()
|
||||
mcl_weather.skycolor.add_layer(
|
||||
|
@ -43,7 +48,6 @@ end
|
|||
function mcl_weather.snow.clear()
|
||||
mcl_weather.skycolor.remove_layer("weather-pack-snow-sky")
|
||||
mcl_weather.snow.init_done = false
|
||||
mcl_weather.remove_all_spawners()
|
||||
end
|
||||
|
||||
-- Simple random texture getter
|
||||
|
@ -70,14 +74,10 @@ minetest.register_globalstep(function(dtime)
|
|||
end
|
||||
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos()) or not mcl_weather.is_outdoor(player:get_pos())) then
|
||||
mcl_weather.remove_spawners_player(player)
|
||||
if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then
|
||||
return false
|
||||
end
|
||||
for i=1,2 do
|
||||
psdef.texture="weather_pack_snow_snowflake"..i..".png"
|
||||
mcl_weather.add_spawner_player(player,"snow"..i,psdef)
|
||||
end
|
||||
mcl_weather.snow.add_snow_particles(player)
|
||||
end
|
||||
end)
|
||||
|
||||
|
|
|
@ -47,35 +47,6 @@ local function save_weather()
|
|||
end
|
||||
minetest.register_on_shutdown(save_weather)
|
||||
|
||||
local particlespawners={}
|
||||
function mcl_weather.add_spawner_player(pl,id,ps)
|
||||
local name=pl:get_player_name()
|
||||
if not particlespawners[name] then
|
||||
particlespawners[name] = {}
|
||||
end
|
||||
if not particlespawners[name][id] then
|
||||
ps.playername =name
|
||||
ps.attached = pl
|
||||
particlespawners[name][id]=minetest.add_particlespawner(ps)
|
||||
return particlespawners[name][id]
|
||||
end
|
||||
end
|
||||
function mcl_weather.remove_spawners_player(pl)
|
||||
local name=pl:get_player_name()
|
||||
if not particlespawners[name] then return end
|
||||
for k,v in pairs(particlespawners[name]) do
|
||||
minetest.delete_particlespawner(v)
|
||||
end
|
||||
particlespawners[name] = nil
|
||||
return true
|
||||
end
|
||||
|
||||
function mcl_weather.remove_all_spawners()
|
||||
for k,v in pairs(minetest.get_connected_players()) do
|
||||
mcl_weather.remove_spawners_player(v)
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_weather.get_rand_end_time(min_duration, max_duration)
|
||||
local r
|
||||
if min_duration and max_duration then
|
||||
|
@ -121,6 +92,36 @@ function mcl_weather.is_underwater(player)
|
|||
return false
|
||||
end
|
||||
|
||||
-- trying to locate position for particles by player look direction for performance reason.
|
||||
-- it is costly to generate many particles around player so goal is focus mainly on front view.
|
||||
function mcl_weather.get_random_pos_by_player_look_dir(player)
|
||||
local look_dir = player:get_look_dir()
|
||||
local player_pos = player:get_pos()
|
||||
|
||||
local random_pos_x, random_pos_y, random_pos_z
|
||||
|
||||
if look_dir.x > 0 then
|
||||
if look_dir.z > 0 then
|
||||
random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5)
|
||||
random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5)
|
||||
else
|
||||
random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5)
|
||||
random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5)
|
||||
end
|
||||
else
|
||||
if look_dir.z > 0 then
|
||||
random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5)
|
||||
random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5)
|
||||
else
|
||||
random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5)
|
||||
random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5)
|
||||
end
|
||||
end
|
||||
|
||||
random_pos_y = math.random() + math.random(player_pos.y + 10, player_pos.y + 15)
|
||||
return random_pos_x, random_pos_y, random_pos_z
|
||||
end
|
||||
|
||||
local t, wci = 0, mcl_weather.check_interval
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
|
|
|
@ -548,7 +548,7 @@ local function get_recipe_fs(data, iY)
|
|||
shapeless and "shapeless" or "furnace"
|
||||
|
||||
if recipe.type == "cooking" then
|
||||
icon = "craftguide_furnace.png"
|
||||
icon = "default_furnace_front_active.png"
|
||||
elseif not custom_recipe then
|
||||
icon = fmt("craftguide_%s.png", icon)
|
||||
end
|
||||
|
|
Before Width: | Height: | Size: 300 B |
|
@ -31,14 +31,6 @@ doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def)
|
|||
return ""
|
||||
end)
|
||||
|
||||
-- usable by shovels
|
||||
doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def)
|
||||
if def.groups.path_creation_possible then
|
||||
return S("This block can be turned into grass path with a shovel.")
|
||||
end
|
||||
return ""
|
||||
end)
|
||||
|
||||
-- soil
|
||||
doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def)
|
||||
local datastring = ""
|
||||
|
|
|
@ -76,6 +76,8 @@ function tt.reload_itemstack_description(itemstack)
|
|||
orig_desc = minetest.colorize(tt.NAME_COLOR, meta:get_string("name"))
|
||||
end
|
||||
local desc = apply_snippets(orig_desc, itemstring, toolcaps or def.tool_capabilities, itemstack)
|
||||
meta:set_string("description", desc)
|
||||
if desc ~= orig_desc then
|
||||
meta:set_string("description", desc)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -21,13 +21,9 @@ minetest.register_chatcommand("awards", {
|
|||
description = S("Show, clear, disable or enable your achievements"),
|
||||
func = function(name, param)
|
||||
if param == "clear" then
|
||||
if awards.player(name).disabled ~= nil then
|
||||
minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!"))
|
||||
else
|
||||
awards.clear_player(name)
|
||||
minetest.chat_send_player(name,
|
||||
S("All your awards and statistics have been cleared. You can now start again."))
|
||||
end
|
||||
awards.clear_player(name)
|
||||
minetest.chat_send_player(name,
|
||||
S("All your awards and statistics have been cleared. You can now start again."))
|
||||
elseif param == "disable" then
|
||||
awards.disable(name)
|
||||
minetest.chat_send_player(name, S("You have disabled your achievements."))
|
||||
|
@ -35,17 +31,9 @@ minetest.register_chatcommand("awards", {
|
|||
awards.enable(name)
|
||||
minetest.chat_send_player(name, S("You have enabled your achievements."))
|
||||
elseif param == "c" then
|
||||
if awards.player(name).disabled ~= nil then
|
||||
minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!"))
|
||||
else
|
||||
awards.show_to(name, name, nil, true)
|
||||
end
|
||||
awards.show_to(name, name, nil, true)
|
||||
else
|
||||
if awards.player(name).disabled ~= nil then
|
||||
minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!"))
|
||||
else
|
||||
awards.show_to(name, name, nil, false)
|
||||
end
|
||||
awards.show_to(name, name, nil, false)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
|
|
@ -61,4 +61,3 @@ Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht.
|
|||
Write something in chat.=Schreiben Sie etwas in den Chat.
|
||||
Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten.
|
||||
@1/@2 chat messages=@1/@2 Chatnachrichten
|
||||
Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden!
|
|
@ -61,4 +61,3 @@ Achievement “@1” does not exist.=
|
|||
@1 has made the achievement @2=
|
||||
Mine a block: @1=
|
||||
Mine blocks: @1×@2=
|
||||
Awards are disabled, enable them first by using /awards enable!=
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local mod_target = minetest.get_modpath("mcl_target")
|
||||
|
||||
minetest.register_entity("mcl_experience:bottle",{
|
||||
textures = {"mcl_experience_bottle.png"},
|
||||
hp_max = 1,
|
||||
|
@ -32,9 +30,6 @@ minetest.register_entity("mcl_experience:bottle",{
|
|||
vertical = false,
|
||||
texture = "mcl_particles_effect.png^[colorize:blue:127",
|
||||
})
|
||||
if mod_target and n == "mcl_target:target_off" then
|
||||
mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks
|
||||
end
|
||||
self.object:remove()
|
||||
end
|
||||
end,
|
||||
|
|
|
@ -339,6 +339,14 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
|||
if name == "inv" then
|
||||
inv_bg = "crafting_inventory_creative_survival.png"
|
||||
|
||||
-- Show armor and player image
|
||||
local player_preview
|
||||
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)
|
||||
local armor_slot_imgs = ""
|
||||
local inv = player:get_inventory()
|
||||
|
@ -355,10 +363,6 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
|||
armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]"
|
||||
end
|
||||
|
||||
if inv:get_stack("offhand", 1):is_empty() then
|
||||
armor_slot_imgs = armor_slot_imgs .. "image[1.5,2.025;1,1;mcl_inventory_empty_armor_slot_shield.png]"
|
||||
end
|
||||
|
||||
local stack_size = get_stack_size(player)
|
||||
|
||||
-- Survival inventory slots
|
||||
|
@ -373,11 +377,9 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
|
|||
mcl_formspec.get_itemslot_bg(2.5,2.75,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(5.5,1.3,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(5.5,2.75,1,1)..
|
||||
"list[current_player;offhand;1.5,2.025;1,1]"..
|
||||
mcl_formspec.get_itemslot_bg(1.5,2.025,1,1)..
|
||||
armor_slot_imgs..
|
||||
-- player preview
|
||||
mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")..
|
||||
player_preview..
|
||||
-- crafting guide button
|
||||
"image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]"..
|
||||
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
|
||||
|
|
|
@ -60,6 +60,14 @@ local function set_inventory(player, armor_change_only)
|
|||
inv:set_width("craft", 2)
|
||||
inv:set_size("craft", 4)
|
||||
|
||||
-- Show armor and player image
|
||||
local player_preview
|
||||
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_slot_imgs = ""
|
||||
for a=1,4 do
|
||||
|
@ -68,13 +76,9 @@ local function set_inventory(player, armor_change_only)
|
|||
end
|
||||
end
|
||||
|
||||
if inv:get_stack("offhand", 1):is_empty() then
|
||||
armor_slot_imgs = armor_slot_imgs .. "image[3,2;1,1;mcl_inventory_empty_armor_slot_shield.png]"
|
||||
end
|
||||
|
||||
local form = "size[9,8.75]"..
|
||||
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
|
||||
mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")..
|
||||
player_preview..
|
||||
--armor
|
||||
"list[current_player;armor;0,0;1,1;1]"..
|
||||
"list[current_player;armor;0,1;1,1;2]"..
|
||||
|
@ -84,8 +88,6 @@ local function set_inventory(player, armor_change_only)
|
|||
mcl_formspec.get_itemslot_bg(0,1,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(0,2,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(0,3,1,1)..
|
||||
"list[current_player;offhand;3,2;1,1]"..
|
||||
mcl_formspec.get_itemslot_bg(3,2,1,1)..
|
||||
armor_slot_imgs..
|
||||
-- craft and inventory
|
||||
"label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
|
@ -146,10 +148,8 @@ end)
|
|||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
--init inventory
|
||||
local inv = player:get_inventory()
|
||||
inv:set_width("main", 9)
|
||||
inv:set_size("main", 36)
|
||||
inv:set_size("offhand", 1)
|
||||
player:get_inventory():set_width("main", 9)
|
||||
player:get_inventory():set_size("main", 36)
|
||||
|
||||
--set hotbar size
|
||||
player:hud_set_hotbar_itemcount(9)
|
||||
|
|
|
@ -1,171 +0,0 @@
|
|||
local minetest, math = minetest, math
|
||||
mcl_offhand = {}
|
||||
|
||||
local max_offhand_px = 128
|
||||
-- only supports up to 128px textures
|
||||
|
||||
function mcl_offhand.get_offhand(player)
|
||||
return player:get_inventory():get_stack("offhand", 1)
|
||||
end
|
||||
|
||||
local function offhand_get_wear(player)
|
||||
return mcl_offhand.get_offhand(player):get_wear()
|
||||
end
|
||||
|
||||
local function offhand_get_count(player)
|
||||
return mcl_offhand.get_offhand(player):get_count()
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player, last_login)
|
||||
mcl_offhand[player] = {
|
||||
hud = {},
|
||||
last_wear = offhand_get_wear(player),
|
||||
last_count = offhand_get_count(player),
|
||||
}
|
||||
end)
|
||||
|
||||
local function remove_hud(player, hud)
|
||||
local offhand_hud = mcl_offhand[player].hud[hud]
|
||||
if offhand_hud then
|
||||
player:hud_remove(offhand_hud)
|
||||
mcl_offhand[player].hud[hud] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function rgb_to_hex(r, g, b)
|
||||
return string.format("%02x%02x%02x", r, g, b)
|
||||
end
|
||||
|
||||
local function update_wear_bar(player, itemstack)
|
||||
local wear_bar_percent = (65535 - offhand_get_wear(player)) / 65535
|
||||
|
||||
local color = {255, 255, 255}
|
||||
local wear = itemstack:get_wear() / 65535;
|
||||
local wear_i = math.min(math.floor(wear * 600), 511);
|
||||
wear_i = math.min(wear_i + 10, 511);
|
||||
if wear_i <= 255 then
|
||||
color = {wear_i, 255, 0}
|
||||
else
|
||||
color = {255, 511 - wear_i, 0}
|
||||
end
|
||||
local wear_bar = mcl_offhand[player].hud.wear_bar
|
||||
player:hud_change(wear_bar, "text", "mcl_wear_bar.png^[colorize:#" .. rgb_to_hex(color[1], color[2], color[3]))
|
||||
player:hud_change(wear_bar, "scale", {x = 40 * wear_bar_percent, y = 3})
|
||||
player:hud_change(wear_bar, "offset", {x = -320 - (20 - player:hud_get(wear_bar).scale.x / 2), y = -13})
|
||||
end
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
local itemstack = mcl_offhand.get_offhand(player)
|
||||
local offhand_item = itemstack:get_name()
|
||||
local offhand_hud = mcl_offhand[player].hud
|
||||
if offhand_item ~= "" then
|
||||
local item_texture = minetest.registered_items[offhand_item].inventory_image .. "^[resize:" .. max_offhand_px .. "x" .. max_offhand_px
|
||||
local position = {x = 0.5, y = 1}
|
||||
local offset = {x = -320, y = -32}
|
||||
|
||||
if not offhand_hud.slot then
|
||||
offhand_hud.slot = player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
position = position,
|
||||
offset = offset,
|
||||
scale = {x = 2.75, y = 2.75},
|
||||
text = "mcl_offhand_slot.png",
|
||||
z_index = 0,
|
||||
})
|
||||
end
|
||||
if not offhand_hud.item then
|
||||
offhand_hud.item = player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
position = position,
|
||||
offset = offset,
|
||||
scale = {x = 0.4, y = 0.4},
|
||||
text = item_texture,
|
||||
z_index = 1,
|
||||
})
|
||||
else
|
||||
player:hud_change(offhand_hud.item, "text", item_texture)
|
||||
end
|
||||
if not offhand_hud.wear_bar_bg and minetest.registered_tools[offhand_item] then
|
||||
if offhand_get_wear(player) > 0 then
|
||||
local texture = "mcl_wear_bar.png^[colorize:#000000"
|
||||
offhand_hud.wear_bar_bg = player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
position = {x = 0.5, y = 1},
|
||||
offset = {x = -320, y = -13},
|
||||
scale = {x = 40, y = 3},
|
||||
text = texture,
|
||||
z_index = 2,
|
||||
})
|
||||
offhand_hud.wear_bar = player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
position = {x = 0.5, y = 1},
|
||||
offset = {x = -320, y = -13},
|
||||
scale = {x = 10, y = 3},
|
||||
text = texture,
|
||||
z_index = 3,
|
||||
})
|
||||
update_wear_bar(player, itemstack)
|
||||
end
|
||||
end
|
||||
|
||||
if not offhand_hud.item_count and offhand_get_count(player) > 1 then
|
||||
offhand_hud.item_count = player:hud_add({
|
||||
hud_elem_type = "text",
|
||||
position = {x = 0.5, y = 1},
|
||||
offset = {x = -298, y = -18},
|
||||
scale = {x = 1, y = 1},
|
||||
alignment = {x = -1, y = 0},
|
||||
text = offhand_get_count(player),
|
||||
z_index = 4,
|
||||
number = 0xFFFFFF,
|
||||
})
|
||||
end
|
||||
|
||||
if offhand_hud.wear_bar then
|
||||
if offhand_hud.last_wear ~= offhand_get_wear(player) then
|
||||
update_wear_bar(player, itemstack)
|
||||
offhand_hud.last_wear = offhand_get_wear(player)
|
||||
end
|
||||
if offhand_get_wear(player) <= 0 or not minetest.registered_tools[offhand_item] then
|
||||
remove_hud(player, "wear_bar_bg")
|
||||
remove_hud(player, "wear_bar")
|
||||
end
|
||||
end
|
||||
|
||||
if offhand_hud.item_count then
|
||||
if offhand_hud.last_count ~= offhand_get_count(player) then
|
||||
player:hud_change(offhand_hud.item_count, "text", offhand_get_count(player))
|
||||
offhand_hud.last_count = offhand_get_count(player)
|
||||
end
|
||||
if offhand_get_count(player) <= 1 then
|
||||
remove_hud(player, "item_count")
|
||||
end
|
||||
end
|
||||
|
||||
elseif offhand_hud.slot then
|
||||
for index, _ in pairs(mcl_offhand[player].hud) do
|
||||
remove_hud(player, index)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info)
|
||||
if action == "move" and inventory_info.to_list == "offhand" then
|
||||
local itemstack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index)
|
||||
if not (minetest.get_item_group(itemstack:get_name(), "offhand_item") > 0) then
|
||||
return 0
|
||||
else
|
||||
return itemstack:get_stack_max()
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info)
|
||||
local from_offhand = inventory_info.from_list == "offhand"
|
||||
local to_offhand = inventory_info.to_list == "offhand"
|
||||
if action == "move" and from_offhand or to_offhand then
|
||||
mcl_inventory.update_inventory_formspec(player)
|
||||
end
|
||||
end)
|
|
@ -1,3 +0,0 @@
|
|||
name = mcl_offhand
|
||||
author = NO11
|
||||
depends = mcl_inventory
|
Before Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 168 B |
|
@ -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,
|
||||
})
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
local S = minetest.get_translator("mcl_target")
|
||||
|
||||
local mod_farming = minetest.get_modpath("mcl_farming")
|
||||
|
||||
mcl_target = {}
|
||||
|
||||
function mcl_target.hit(pos, time)
|
||||
minetest.set_node(pos, {name="mcl_target:target_on"})
|
||||
mesecon.receptor_on(pos, mesecon.rules.alldirs)
|
||||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(time)
|
||||
end
|
||||
|
||||
minetest.register_node("mcl_target:target_off", {
|
||||
description = S("Target"),
|
||||
_doc_items_longdesc = S("A target is a block that provides a temporary redstone charge when hit by a projectile."),
|
||||
_doc_items_usagehelp = S("Throw a projectile on the target to activate it."),
|
||||
tiles = {"mcl_target_target_top.png", "mcl_target_target_top.png", "mcl_target_target_side.png"},
|
||||
groups = {hoey = 1},
|
||||
sounds = mcl_sounds.node_sound_dirt_defaults({
|
||||
footstep = {name="default_grass_footstep", gain=0.1},
|
||||
}),
|
||||
mesecons = {
|
||||
receptor = {
|
||||
state = mesecon.state.off,
|
||||
rules = mesecon.rules.alldirs,
|
||||
},
|
||||
},
|
||||
_mcl_blast_resistance = 0.5,
|
||||
_mcl_hardness = 0.5,
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_target:target_on", {
|
||||
description = S("Target"),
|
||||
_doc_items_create_entry = false,
|
||||
tiles = {"mcl_target_target_top.png", "mcl_target_target_top.png", "mcl_target_target_side.png"},
|
||||
groups = {hoey = 1, not_in_creative_inventory = 1},
|
||||
drop = "mcl_target:target_off",
|
||||
sounds = mcl_sounds.node_sound_dirt_defaults({
|
||||
footstep = {name="default_grass_footstep", gain=0.1},
|
||||
}),
|
||||
on_timer = function(pos, elapsed)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == "mcl_target:target_on" then --has not been dug
|
||||
minetest.set_node(pos, {name="mcl_target:target_off"})
|
||||
mesecon.receptor_off(pos, mesecon.rules.alldirs)
|
||||
end
|
||||
end,
|
||||
mesecons = {
|
||||
receptor = {
|
||||
state = mesecon.state.on,
|
||||
rules = mesecon.rules.alldirs,
|
||||
},
|
||||
},
|
||||
_mcl_blast_resistance = 0.5,
|
||||
_mcl_hardness = 0.5,
|
||||
})
|
||||
|
||||
|
||||
if mod_farming then
|
||||
minetest.register_craft({
|
||||
output = "mcl_target:target_off",
|
||||
recipe = {
|
||||
{"", "mesecons:redstone", ""},
|
||||
{"mesecons:redstone", "mcl_farming:hay_block", "mesecons:redstone"},
|
||||
{"", "mesecons:redstone", ""},
|
||||
},
|
||||
})
|
||||
end
|
|
@ -1,4 +0,0 @@
|
|||
# textdomain: mcl_target
|
||||
Target=Cible
|
||||
A target is a block that provides a temporary redstone charge when hit by a projectile.=La cible est un bloc qui se comporte comme une source d'énergie temporaire quand elle est frappée par un projectile.
|
||||
Throw a projectile on the target to activate it.=Lancer un projectile sur la cible pour l'activer.
|
|
@ -1,4 +0,0 @@
|
|||
# textdomain: mcl_target
|
||||
Target=
|
||||
A target is a block that provides a temporary redstone charge when hit by a projectile.=
|
||||
Throw a projectile on the target to activate it.=
|
|
@ -1,3 +0,0 @@
|
|||
name = mcl_target
|
||||
author = AFCMS
|
||||
depends = mesecons, mcl_sounds
|
Before Width: | Height: | Size: 752 B |
Before Width: | Height: | Size: 752 B |
|
@ -47,6 +47,8 @@ end
|
|||
|
||||
-- For nodes which ignore sticky sides.
|
||||
-- They can't be pulled by sticky pistons and don't interact with slime blocks.
|
||||
-- TODO: This has NOT any actual effect so far. The actual functionality
|
||||
-- still needs to be implemented.
|
||||
function mesecon.register_mvps_unsticky(nodename, get_unsticky)
|
||||
if get_unsticky == nil then
|
||||
get_unsticky = true
|
||||
|
@ -64,6 +66,9 @@ function mesecon.is_mvps_unsticky(node, pulldir, stack, stackid)
|
|||
if type(get_unsticky) == "function" then
|
||||
get_unsticky = get_unsticky(node, pulldir, stack, stackid)
|
||||
end
|
||||
if get_unsticky == nil then
|
||||
get_unsticky = false
|
||||
end
|
||||
|
||||
return get_unsticky
|
||||
end
|
||||
|
@ -206,15 +211,7 @@ function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos)
|
|||
end
|
||||
|
||||
function mesecon.mvps_pull_single(pos, dir, maximum, player_name, piston_pos)
|
||||
local nodes = mesecon.mvps_get_stack(pos, dir, maximum, player_name, piston_pos)
|
||||
|
||||
if not nodes then return end
|
||||
-- ensure sticky pistons; even without slimeblocks attached adhere to the unpullable rule.
|
||||
for id, n in ipairs(nodes) do
|
||||
if not mesecon.is_mvps_unsticky(n.node, dir, nodes, id) then
|
||||
return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos)
|
||||
end
|
||||
end
|
||||
return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, player_name, piston_pos)
|
||||
end
|
||||
|
||||
-- pos: pos of mvps; stackdir: direction of building the stack
|
||||
|
@ -360,14 +357,13 @@ function mesecon.mvps_move_objects(pos, dir, nodestack)
|
|||
end
|
||||
end
|
||||
|
||||
-- Unmovable by design: nodes
|
||||
-- Unmovable by design
|
||||
mesecon.register_mvps_stopper("mcl_core:barrier")
|
||||
mesecon.register_mvps_stopper("mcl_core:realm_barrier")
|
||||
mesecon.register_mvps_stopper("mcl_core:void")
|
||||
mesecon.register_mvps_stopper("mcl_core:bedrock")
|
||||
mesecon.register_mvps_stopper("mcl_core:obsidian")
|
||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest")
|
||||
mesecon.register_mvps_stopper("mcl_chests:ender_chest_small")
|
||||
mesecon.register_mvps_stopper("mcl_mobspawners:spawner")
|
||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off")
|
||||
mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on")
|
||||
|
@ -375,18 +371,9 @@ mesecon.register_mvps_stopper("mcl_portals:portal")
|
|||
mesecon.register_mvps_stopper("mcl_portals:portal_end")
|
||||
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame")
|
||||
mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye")
|
||||
mesecon.register_mvps_stopper("mcl_enchanting:table")
|
||||
mesecon.register_mvps_stopper("mcl_jukebox:jukebox")
|
||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_on")
|
||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_off")
|
||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on")
|
||||
mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off")
|
||||
mesecon.register_mvps_stopper("mcl_banners:hanging_banner")
|
||||
mesecon.register_mvps_stopper("mcl_banners:standing_banner")
|
||||
|
||||
-- Unmovable by technical restrictions.
|
||||
-- Open formspec would screw up if node is destroyed (minor problem)
|
||||
-- Would screw up on/off state of trapped chest (big problem)
|
||||
mesecon.register_mvps_stopper("mcl_furnaces:furnace")
|
||||
mesecon.register_mvps_stopper("mcl_furnaces:furnace_active")
|
||||
mesecon.register_mvps_stopper("mcl_hoppers:hopper")
|
||||
|
@ -400,39 +387,9 @@ mesecon.register_mvps_stopper("mcl_dispensers:dispenser_down")
|
|||
mesecon.register_mvps_stopper("mcl_anvils:anvil")
|
||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1")
|
||||
mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2")
|
||||
mesecon.register_mvps_stopper("mcl_chests:chest")
|
||||
mesecon.register_mvps_stopper("mcl_chests:chest_small")
|
||||
mesecon.register_mvps_stopper("mcl_chests:chest_left")
|
||||
mesecon.register_mvps_stopper("mcl_chests:chest_right")
|
||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest")
|
||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_small")
|
||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left")
|
||||
mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right")
|
||||
mesecon.register_mvps_stopper("mcl_signs:wall_sign")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign45")
|
||||
mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5")
|
||||
mesecon.register_mvps_stopper("mcl_barrels:barrel_open")
|
||||
mesecon.register_mvps_stopper("mcl_barrels:barrel_closed")
|
||||
-- Would screw up on/off state of trapped chest (big problem)
|
||||
|
||||
|
||||
-- Unmovable by design: objects
|
||||
mesecon.register_mvps_unmov("mcl_enchanting:book")
|
||||
mesecon.register_mvps_unmov("mcl_chests:chest")
|
||||
mesecon.register_mvps_unmov("mcl_banners:hanging_banner")
|
||||
mesecon.register_mvps_unmov("mcl_banners:standing_banner")
|
||||
mesecon.register_mvps_unmov("mcl_signs:text")
|
||||
mesecon.register_mvps_unmov("mcl_mobspawners:doll")
|
||||
mesecon.register_mvps_unmov("mcl_armor_stand:armor_entity")
|
||||
mesecon.register_mvps_unmov("mcl_itemframes:item")
|
||||
mesecon.register_mvps_unmov("mcl_itemframes:map")
|
||||
mesecon.register_mvps_unmov("mcl_paintings:painting")
|
||||
mesecon.register_mvps_unmov("mcl_end:crystal")
|
||||
|
||||
|
||||
-- Unpullable by design: nodes
|
||||
-- Glazed Terracotta
|
||||
-- Glazed terracotta: unpullable
|
||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red")
|
||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange")
|
||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow")
|
||||
|
@ -449,446 +406,6 @@ mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_black")
|
|||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_brown")
|
||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue")
|
||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink")
|
||||
-- Beds
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_black_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_black_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_blue_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_blue_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_brown_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_brown_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_cyan_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_green_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_green_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_grey_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_grey_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_light_blue_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_lime_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_lime_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_magenta_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_orange_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_orange_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_pink_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_pink_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_purple_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_purple_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_red_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_red_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_silver_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_silver_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_white_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_white_bottom")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_top")
|
||||
mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_bottom")
|
||||
-- Buttons
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_stone_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_stone_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_wood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_wood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_on")
|
||||
-- Cactus, Sugarcane & Vines
|
||||
mesecon.register_mvps_unsticky("mcl_core:cactus")
|
||||
mesecon.register_mvps_unsticky("mcl_core:reeds")
|
||||
mesecon.register_mvps_unsticky("mcl_core:vine")
|
||||
-- Cake
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake_1")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake_2")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake_3")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake_4")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake_5")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake_6")
|
||||
mesecon.register_mvps_unsticky("mcl_cake:cake")
|
||||
-- Carpet
|
||||
mesecon.register_mvps_unsticky("mcl_wool:black_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:blue_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:brown_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:cyan_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:green_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:grey_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:light_blue_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:lime_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:orange_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:magenta_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:pink_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:purple_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:red_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:silver_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:white_carpet")
|
||||
mesecon.register_mvps_unsticky("mcl_wool:yellow_carpet")
|
||||
-- Carved & Jack O'Lantern Pumpkins, Pumpkin & Melon
|
||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face_light")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:pumpkin")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:melon")
|
||||
-- Chorus Plant & Flower
|
||||
mesecon.register_mvps_unsticky("mcl_end:chorus_plant")
|
||||
mesecon.register_mvps_unsticky("mcl_end:chorus_flower")
|
||||
-- Cobweb
|
||||
mesecon.register_mvps_unsticky("mcl_core:cobweb")
|
||||
-- Cocoa
|
||||
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_1")
|
||||
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_2")
|
||||
mesecon.register_mvps_unsticky("mcl_cocoas:cocoa_3")
|
||||
-- Doors
|
||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_t_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:wooden_door_b_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_t_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:iron_door_b_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_t_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:acacia_door_b_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_t_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:birch_door_b_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_t_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:dark_oak_door_b_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_t_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:spruce_door_b_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_1")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_t_2")
|
||||
mesecon.register_mvps_unsticky("mcl_doors:jungle_door_b_2")
|
||||
-- Dragon Egg
|
||||
mesecon.register_mvps_unsticky("mcl_end:dragon_egg")
|
||||
-- Fire
|
||||
mesecon.register_mvps_unsticky("mcl_fire:fire")
|
||||
mesecon.register_mvps_unsticky("mcl_fire:eternal_fire")
|
||||
-- Flower Pots
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_allium")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_azure_bluet")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_blue_orchid")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_dandelion")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_fern")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_oxeye_daisy")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_poppy")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_orange")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_pink")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_red")
|
||||
mesecon.register_mvps_unsticky("mcl_flowerpots:flower_pot_tulip_white")
|
||||
-- Flowers, Lilypad & Dead Bush
|
||||
mesecon.register_mvps_unsticky("mcl_core:deadbush")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:allium")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:azure_bluet")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:blue_orchid")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:dandelion")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:double_fern")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:double_fern_top")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:fern")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:lilac")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:lilac_top")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:oxeye_daisy")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:peony")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:peony_top")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:poppy")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:rose_bush")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:rose_bush_top")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:sunflower")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:sunflower_top")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:tallgrass")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:double_grass")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:double_grass_top")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_orange")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_pink")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_red")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:tulip_white")
|
||||
mesecon.register_mvps_unsticky("mcl_flowers:waterlily")
|
||||
-- Heads
|
||||
mesecon.register_mvps_unsticky("mcl_heads:creeper")
|
||||
mesecon.register_mvps_unsticky("mcl_heads:skeleton")
|
||||
mesecon.register_mvps_unsticky("mcl_heads:steve")
|
||||
mesecon.register_mvps_unsticky("mcl_heads:wither_skeleton")
|
||||
mesecon.register_mvps_unsticky("mcl_heads:zombie")
|
||||
-- Item Frame
|
||||
mesecon.register_mvps_unsticky("mcl_itemframes:item_frame")
|
||||
-- Ladder
|
||||
mesecon.register_mvps_unsticky("mcl_core:ladder")
|
||||
-- Lava & Water
|
||||
mesecon.register_mvps_unsticky("mcl_core:lava_source")
|
||||
mesecon.register_mvps_unsticky("mcl_core:lava_flowing")
|
||||
mesecon.register_mvps_unsticky("mcl_core:water_source")
|
||||
mesecon.register_mvps_unsticky("mcl_core:water_flowing")
|
||||
mesecon.register_mvps_unsticky("mclx_core:river_water_source")
|
||||
mesecon.register_mvps_unsticky("mclx_core:river_water_flowing")
|
||||
-- Leaves
|
||||
mesecon.register_mvps_unsticky("mcl_core:leaves")
|
||||
mesecon.register_mvps_unsticky("mcl_core:acacialeaves")
|
||||
mesecon.register_mvps_unsticky("mcl_core:birchleaves")
|
||||
mesecon.register_mvps_unsticky("mcl_core:darkleaves")
|
||||
mesecon.register_mvps_unsticky("mcl_core:spruceleaves")
|
||||
mesecon.register_mvps_unsticky("mcl_core:jungleleaves")
|
||||
-- Lever
|
||||
mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_walllever:wall_lever_on")
|
||||
-- Mushrooms, Nether Wart & Amethyst
|
||||
mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_brown")
|
||||
mesecon.register_mvps_unsticky("mcl_mushroom:mushroom_red")
|
||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_0")
|
||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_1")
|
||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart_2")
|
||||
mesecon.register_mvps_unsticky("mcl_nether:nether_wart")
|
||||
mesecon.register_mvps_unsticky("mcl_amethyst:amethyst_cluster")
|
||||
mesecon.register_mvps_unsticky("mcl_amethyst:budding_amethyst_block")
|
||||
-- Pressure Plates
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_wood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_stone_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_acaciawoood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_birchwood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_darkwood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucekwood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_sprucewood_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_pressureplates:pressure_plate_junglewood_off")
|
||||
-- Redstone Comparators
|
||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_sub")
|
||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_sub")
|
||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_on_comp")
|
||||
mesecon.register_mvps_unsticky("mcl_comparators:comparator_off_comp")
|
||||
-- Redstone Dust
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00000000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00000000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10000000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10000000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01000000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01000000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11000000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11000000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00100000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00100000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10100000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10100000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00010000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00010000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10010000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10010000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10001000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10001000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11001000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11001000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10101000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10101000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10011000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10011000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111000_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111000_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01000100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01000100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11000100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11000100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11001100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11001100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111100_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111100_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00100010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00100010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10100010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10100010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10101010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10101010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111010_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111010_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100110_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01100110_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100110_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11100110_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110110_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110110_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110110_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110110_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101110_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11101110_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111110_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111110_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00010001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00010001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10010001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10010001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10011001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10011001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111001_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111001_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010101_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01010101_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010101_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11010101_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110101_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110101_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110101_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110101_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011101_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11011101_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111101_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111101_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110011_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_00110011_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110011_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10110011_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110011_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110011_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110011_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110011_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111011_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_10111011_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111011_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111011_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110111_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_01110111_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110111_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11110111_off")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111111_on")
|
||||
mesecon.register_mvps_unsticky("mesecons:wire_11111111_off")
|
||||
-- Redstone Repeater
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_1")
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_2")
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_3")
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_off_4")
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_1")
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_2")
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_3")
|
||||
mesecon.register_mvps_unsticky("mesecons_delayer:delayer_on_4")
|
||||
-- Redstone Torch
|
||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on")
|
||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off")
|
||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_on_wall")
|
||||
mesecon.register_mvps_unsticky("mesecons_torch:mesecon_torch_off_wall")
|
||||
-- Sea Pickle
|
||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_1_dead_brain_coral_block")
|
||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_2_dead_brain_coral_block")
|
||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_3_dead_brain_coral_block")
|
||||
mesecon.register_mvps_unsticky("mcl_ocean:sea_pickle_4_dead_brain_coral_block")
|
||||
-- Shulker chests
|
||||
mesecon.register_mvps_unsticky("mcl_chests:black_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:blue_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:brown_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:cyan_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:green_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:light_blue_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:lime_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:orange_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:magenta_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:pink_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:purple_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:red_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:silver_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:white_shulker_box_small")
|
||||
mesecon.register_mvps_unsticky("mcl_chests:yellow_shulker_box_small")
|
||||
-- Snow
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow")
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow_2")
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow_3")
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow_4")
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow_5")
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow_6")
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow_7")
|
||||
mesecon.register_mvps_unsticky("mcl_core:snow_8")
|
||||
-- Torch
|
||||
mesecon.register_mvps_unsticky("mcl_torches:torch")
|
||||
mesecon.register_mvps_unsticky("mcl_torches:torch_wall")
|
||||
-- Wheat
|
||||
mesecon.register_mvps_unsticky("mcl_farming:wheat")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_2")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_3")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_4")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_5")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_6")
|
||||
mesecon.register_mvps_unsticky("mcl_farming:wheat_7")
|
||||
|
||||
-- Includes node heat when moving them
|
||||
mesecon.register_on_mvps_move(mesecon.move_hot_nodes)
|
||||
|
|
|
@ -1,69 +1,5 @@
|
|||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local function path_to_sunlight_exists(position, light_level)
|
||||
local neighbours = {
|
||||
{ x = 0, y = 0, z =-1 },
|
||||
{ x = 0, y = 0, z = 1 },
|
||||
{ x = 0, y =-1, z = 0 },
|
||||
{ x = 0, y = 1, z = 0 },
|
||||
{ x =-1, y = 0, z = 0 },
|
||||
{ x = 1, y = 0, z = 0 },
|
||||
}
|
||||
for i=1, #neighbours do
|
||||
local offset = neighbours[i]
|
||||
local position_new = vector.add(
|
||||
position,
|
||||
offset
|
||||
)
|
||||
local light_level_new = minetest.get_node_light(
|
||||
position_new,
|
||||
nil
|
||||
)
|
||||
if 15 == light_level_new then
|
||||
-- found the sunlight
|
||||
return true
|
||||
elseif light_level_new > light_level then
|
||||
-- search where light is brighter
|
||||
if path_to_sunlight_exists(
|
||||
position_new,
|
||||
light_level_new
|
||||
) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function sunlight_visible(position)
|
||||
local light_level
|
||||
-- Minetest 5.4.0+ can measure the daylight level at a position
|
||||
if nil ~= minetest.get_natural_light then
|
||||
light_level = minetest.get_natural_light(
|
||||
position,
|
||||
nil
|
||||
)
|
||||
if light_level >= 12 then
|
||||
return true
|
||||
end
|
||||
else -- Minetest 5.3.0 or less can only measure the light level
|
||||
local time = minetest.get_timeofday() * 24000
|
||||
-- only check light level during day
|
||||
if time > 6000 and time < 18000 then
|
||||
light_level = minetest.get_node_light(
|
||||
position,
|
||||
nil
|
||||
)
|
||||
if light_level >= 12 then
|
||||
return path_to_sunlight_exists(
|
||||
position,
|
||||
12
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local boxes = { -8/16, -8/16, -8/16, 8/16, -2/16, 8/16 }
|
||||
|
||||
-- Daylight Sensor
|
||||
|
@ -159,7 +95,9 @@ minetest.register_abm({
|
|||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
if sunlight_visible(pos) then
|
||||
local light = minetest.get_node_light(pos, nil)
|
||||
|
||||
if light >= 12 and minetest.get_timeofday() > 0.2 and minetest.get_timeofday() < 0.8 then
|
||||
minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2})
|
||||
mesecon.receptor_on(pos, mesecon.rules.pplate)
|
||||
end
|
||||
|
@ -172,7 +110,9 @@ minetest.register_abm({
|
|||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
if not sunlight_visible(pos) then
|
||||
local light = minetest.get_node_light(pos, nil)
|
||||
|
||||
if light < 12 then
|
||||
minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2})
|
||||
mesecon.receptor_off(pos, mesecon.rules.pplate)
|
||||
end
|
||||
|
@ -262,7 +202,9 @@ minetest.register_abm({
|
|||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
if not sunlight_visible(pos) then
|
||||
local light = minetest.get_node_light(pos, nil)
|
||||
|
||||
if light < 12 then
|
||||
minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_on", param2=node.param2})
|
||||
mesecon.receptor_on(pos, mesecon.rules.pplate)
|
||||
end
|
||||
|
@ -275,7 +217,9 @@ minetest.register_abm({
|
|||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
if sunlight_visible(pos) then
|
||||
local light = minetest.get_node_light(pos, nil)
|
||||
|
||||
if light >= 12 and minetest.get_timeofday() > 0.8 and minetest.get_timeofday() < 0.2 then
|
||||
minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_off", param2=node.param2})
|
||||
mesecon.receptor_off(pos, mesecon.rules.pplate)
|
||||
end
|
||||
|
|
|
@ -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 |