forked from VoxeLibre/VoxeLibre
Merge pull request 'Fix automated wool farm crash and elytra fly over unknown block crash' (#3809) from fix_unknown_block_crash into master
Reviewed-on: MineClone2/MineClone2#3809
This commit is contained in:
commit
a286cb5046
|
@ -6,6 +6,8 @@ local S = minetest.get_translator("mobs_mc")
|
||||||
--################### SHEEP
|
--################### SHEEP
|
||||||
--###################
|
--###################
|
||||||
|
|
||||||
|
local WOOL_REPLACE_RATE = 80
|
||||||
|
|
||||||
local colors = {
|
local colors = {
|
||||||
-- group = { wool, textures }
|
-- group = { wool, textures }
|
||||||
unicolor_white = { "mcl_wool:white", "#FFFFFF00" },
|
unicolor_white = { "mcl_wool:white", "#FFFFFF00" },
|
||||||
|
@ -113,7 +115,7 @@ mcl_mobs.register_mob("mobs_mc:sheep", {
|
||||||
view_range = 12,
|
view_range = 12,
|
||||||
|
|
||||||
-- Eat grass
|
-- Eat grass
|
||||||
replace_rate = 80,
|
replace_rate = WOOL_REPLACE_RATE,
|
||||||
replace_delay = 1.3,
|
replace_delay = 1.3,
|
||||||
replace_what = {
|
replace_what = {
|
||||||
{ "mcl_core:dirt_with_grass", "mcl_core:dirt", -1 },
|
{ "mcl_core:dirt_with_grass", "mcl_core:dirt", -1 },
|
||||||
|
@ -121,25 +123,42 @@ mcl_mobs.register_mob("mobs_mc:sheep", {
|
||||||
},
|
},
|
||||||
-- Properly regrow wool after eating grass
|
-- Properly regrow wool after eating grass
|
||||||
on_replace = function(self, pos, oldnode, newnode)
|
on_replace = function(self, pos, oldnode, newnode)
|
||||||
self.state = "eat"
|
|
||||||
self:set_animation("eat")
|
|
||||||
self:set_velocity(0)
|
|
||||||
minetest.after(self.replace_delay, function()
|
|
||||||
if self and self.object and self.object:get_velocity() and self.health > 0 then
|
|
||||||
self.object:set_velocity(vector.zero())
|
|
||||||
if not self.color or not colors[self.color] then
|
if not self.color or not colors[self.color] then
|
||||||
self.color = "unicolor_white"
|
self.color = "unicolor_white"
|
||||||
end
|
end
|
||||||
self.gotten = false
|
|
||||||
self.base_texture = sheep_texture(self.color)
|
self.base_texture = sheep_texture(self.color)
|
||||||
|
|
||||||
|
self.drops = {
|
||||||
|
{name = "mcl_mobitems:mutton",
|
||||||
|
chance = 1,
|
||||||
|
min = 1,
|
||||||
|
max = 2,},
|
||||||
|
{name = colors[self.color][1],
|
||||||
|
chance = 1,
|
||||||
|
min = 1,
|
||||||
|
max = 1,},
|
||||||
|
}
|
||||||
|
|
||||||
|
self.state = "eat"
|
||||||
|
self:set_animation("eat")
|
||||||
|
self:set_velocity(0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
minetest.after(self.replace_delay, function()
|
||||||
|
if self and self.object and self.object:get_velocity() and self.health > 0 then
|
||||||
|
self.object:set_velocity(vector.zero())
|
||||||
|
self.gotten = false
|
||||||
self.object:set_properties({ textures = self.base_texture })
|
self.object:set_properties({ textures = self.base_texture })
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.after(2.5, function()
|
minetest.after(2.5, function()
|
||||||
if self and self.object and self.state == 'eat' and self.health > 0 and self.object:get_velocity() then
|
if self and self.object and self.state == 'eat' and self.health > 0 then
|
||||||
self.state = "walk"
|
self.state = "walk"
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
end,
|
end,
|
||||||
|
|
||||||
-- Set random color on spawn
|
-- Set random color on spawn
|
||||||
|
|
|
@ -178,7 +178,9 @@ local dispenserdef = {
|
||||||
local pos = obj:get_pos()
|
local pos = obj:get_pos()
|
||||||
local used, texture = false
|
local used, texture = false
|
||||||
if entname == "mobs_mc:sheep" then
|
if entname == "mobs_mc:sheep" then
|
||||||
|
if entity.drops[2] then
|
||||||
minetest.add_item(pos, entity.drops[2].name .. " " .. math.random(1, 3))
|
minetest.add_item(pos, entity.drops[2].name .. " " .. math.random(1, 3))
|
||||||
|
end
|
||||||
if not entity.color then
|
if not entity.color then
|
||||||
entity.color = "unicolor_white"
|
entity.color = "unicolor_white"
|
||||||
end
|
end
|
||||||
|
|
|
@ -177,7 +177,7 @@ end
|
||||||
|
|
||||||
function mesecon.effector_get_rules(node)
|
function mesecon.effector_get_rules(node)
|
||||||
local effector = mesecon.get_effector(node.name)
|
local effector = mesecon.get_effector(node.name)
|
||||||
if effector then
|
if effector and effector.rules then
|
||||||
local rules = effector.rules
|
local rules = effector.rules
|
||||||
if type(rules) == "function" then
|
if type(rules) == "function" then
|
||||||
return rules(node)
|
return rules(node)
|
||||||
|
|
|
@ -239,10 +239,11 @@ minetest.register_globalstep(function(dtime)
|
||||||
elytra.speed = 1 - (direction.y/2 + 0.5)
|
elytra.speed = 1 - (direction.y/2 + 0.5)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local fly_node_walkable = minetest.registered_nodes[fly_node] and minetest.registered_nodes[fly_node].walkable
|
||||||
elytra.active = minetest.get_item_group(player:get_inventory():get_stack("armor", 3):get_name(), "elytra") ~= 0
|
elytra.active = minetest.get_item_group(player:get_inventory():get_stack("armor", 3):get_name(), "elytra") ~= 0
|
||||||
and not parent
|
and not parent
|
||||||
and (elytra.active or (is_just_jumped and player_velocity.y < -0))
|
and (elytra.active or (is_just_jumped and player_velocity.y < -0))
|
||||||
and ((not minetest.registered_nodes[fly_node].walkable) or fly_node == "ignore")
|
and ((not fly_node_walkable) or fly_node == "ignore")
|
||||||
|
|
||||||
if elytra.active then
|
if elytra.active then
|
||||||
if is_just_jumped then -- move the player up when they start flying to give some clearance
|
if is_just_jumped then -- move the player up when they start flying to give some clearance
|
||||||
|
@ -257,7 +258,8 @@ minetest.register_globalstep(function(dtime)
|
||||||
|
|
||||||
local speed_mult = elytra.speed
|
local speed_mult = elytra.speed
|
||||||
local block_below = minetest.get_node(vector.offset(fly_pos, 0, -0.9, 0)).name
|
local block_below = minetest.get_node(vector.offset(fly_pos, 0, -0.9, 0)).name
|
||||||
if (not minetest.registered_nodes[block_below].walkable) and (player_vel.y ~= 0) then
|
local reg_node_below = minetest.registered_nodes[block_below]
|
||||||
|
if (reg_node_below and not reg_node_below.walkable) and (player_vel.y ~= 0) then
|
||||||
speed_mult = speed_mult + direction_mult * elytra_vars.speedup_mult * dtime
|
speed_mult = speed_mult + direction_mult * elytra_vars.speedup_mult * dtime
|
||||||
end
|
end
|
||||||
speed_mult = speed_mult - elytra_vars.slowdown_mult * clamp(dtime, 0.09, 0.2) -- slow down but don't overdo it
|
speed_mult = speed_mult - elytra_vars.slowdown_mult * clamp(dtime, 0.09, 0.2) -- slow down but don't overdo it
|
||||||
|
|
Loading…
Reference in New Issue