Fix workbench and chicken egg

master
stujones11 2019-06-27 21:45:48 +01:00 committed by MoNTE48
parent 190299ceba
commit f96f0dfebf
4 changed files with 83 additions and 119 deletions

View File

@ -49,7 +49,7 @@ mobs:register_mob("mobs_animal:chicken", {
self.egg_timer = 0
if self.child
or math.random(1, 100) > 1 then
or math.random(1, 100) ~= 1 then
return
end
@ -84,121 +84,45 @@ mobs:spawn({
mobs:register_egg("mobs_animal:chicken", "Chicken egg", "mobs_chicken_egg_inv.png", 1)
-- egg entity
-- egg throwing
mobs:register_arrow("mobs_animal:egg_entity", {
visual = "sprite",
visual_size = {x=.5, y=.5},
textures = {"mobs_chicken_egg.png"},
velocity = 6,
hit_player = function(self, player)
player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
function egg_impact(thrower, pos, dir, hit_object)
if hit_object then
local punch_damage = {
full_punch_interval = 1.0,
damage_groups = {fleshy=1},
}, nil)
end,
}
hit_object:punch(thrower, 1.0, punch_damage, dir)
end
hit_mob = function(self, player)
player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy=1},
}, nil)
end,
if math.random(1, 8) == 8 then
pos.y = pos.y + 1
local nod = minetest.get_node_or_nil(pos)
hit_node = function(self, pos, node)
if math.random(1, 8) > 1 then
if not nod or
not minetest.registered_nodes[nod.name] or
minetest.registered_nodes[nod.name].walkable == true then
return
end
pos.y = pos.y + 1
local nod = minetest.get_node_or_nil(pos)
if not nod
or not minetest.registered_nodes[nod.name]
or minetest.registered_nodes[nod.name].walkable == true then
return
end
local mob = minetest.add_entity(pos, "mobs_animal:chicken")
local ent2 = mob:get_luaentity()
mob:set_properties({
visual_size = {
x = ent2.base_size.x / 2,
y = ent2.base_size.y / 2
},
collisionbox = {
ent2.base_colbox[1] / 2,
ent2.base_colbox[2] / 2,
ent2.base_colbox[3] / 2,
ent2.base_colbox[4] / 2,
ent2.base_colbox[5] / 2,
ent2.base_colbox[6] / 2
},
})
ent2.child = true
ent2.tamed = true
ent2.owner = self.playername
end
})
-- egg throwing item
-- shoot egg
local mobs_shoot_egg = function (item, player, pointed_thing)
local playerpos = player:get_pos()
minetest.sound_play("throwing_sound", {
pos = playerpos,
gain = 0.7,
max_hear_distance = 10,
})
local obj = minetest.add_entity({
x = playerpos.x,
y = playerpos.y +1.5,
z = playerpos.z
}, "mobs_animal:egg_entity")
local ent = obj:get_luaentity()
local dir = player:get_look_dir()
ent.switch = 1 -- needed so that egg doesn't despawn straight away
obj:setvelocity({
x = dir.x * 19,
y = dir.y * 19,
z = dir.z * 19
})
obj:set_acceleration({
x = dir.x * -3,
y = -9.81,
z = dir.z * -3
})
-- pass player name to egg for chick ownership
local ent2 = obj:get_luaentity()
ent2.playername = player:get_player_name()
if not mobs.is_creative(player) or
not minetest.is_singleplayer() then
item:take_item()
local mob = minetest.add_entity(pos, "mobs_animal:chicken")
local ent2 = mob:get_luaentity()
mob:set_properties({
visual_size = {
x = ent2.base_size.x / 2,
y = ent2.base_size.y / 2
},
collisionbox = {
ent2.base_colbox[1] / 2,
ent2.base_colbox[2] / 2,
ent2.base_colbox[3] / 2,
ent2.base_colbox[4] / 2,
ent2.base_colbox[5] / 2,
ent2.base_colbox[6] / 2
},
})
ent2.child = true
ent2.tamed = true
ent2.owner = thrower
end
return item
end
-- egg
minetest.register_craftitem(":mobs:chicken_egg", {
description = "Chicken Egg",
inventory_image = "mobs_chicken_egg.png",
visual_scale = 0.7,
on_use = mobs_shoot_egg,
groups = {snappy = 2, dig_immediate = 3}
})
minetest.register_alias("mobs:egg", "air")

View File

@ -3765,6 +3765,10 @@ end
-- Spawn egg throwing
local function throw_spawn_egg(itemstack, user, pointed_thing)
local playerpos = user:get_pos()
if not minetest.is_valid_pos(playerpos) then
return
end
local mob = itemstack:get_name():gsub("_set$", "")
local egg_impact = function(thrower, pos, dir, hit_object)
if hit_object then
@ -3776,17 +3780,13 @@ local function throw_spawn_egg(itemstack, user, pointed_thing)
end
spawn_mob(pos, mob, itemstack:get_metadata(), user)
end
local playerpos = user:get_pos()
if not minetest.is_valid_pos(playerpos) then
return
end
local obj = minetest.item_throw(mob.."_set", user, 19, -3, egg_impact)
if obj then
local def = minetest.registered_items[mob.."_set"]
if def and def.inventory_image and def.inventory_image ~= "" then
obj:set_properties({
visual = "sprite",
visual_size = {x=1, y=1},
visual_size = {x=0.5, y=0.5},
textures = {def.inventory_image},
})
end

View File

@ -104,6 +104,42 @@ minetest.register_craft({
}
})
-- chicken egg
local function mobs_shoot_egg(itemstack, thrower, pointed_thing)
local playerpos = thrower:get_pos()
if not minetest.is_valid_pos(playerpos) then
return
end
local obj = minetest.item_throw("mobs:chicken_egg", thrower, 19, -3, egg_impact)
if obj then
obj:set_properties({
visual = "sprite",
visual_size = {x=0.5, y=0.5},
textures = {"mobs_chicken_egg.png"},
})
minetest.sound_play("throwing_sound", {
pos = playerpos,
gain = 0.7,
max_hear_distance = 10,
})
if not mobs.is_creative(thrower) or
not minetest.is_singleplayer() then
itemstack:take_item()
end
end
return itemstack
end
minetest.register_craftitem(":mobs:chicken_egg", {
description = "Chicken Egg",
inventory_image = "mobs_chicken_egg.png",
visual_scale = 0.7,
on_use = mobs_shoot_egg,
groups = {snappy = 2, dig_immediate = 3}
})
minetest.register_alias("mobs:egg", "air")
-- fried egg
minetest.register_craftitem("mobs:chicken_egg_fried", {
description = "Fried Egg",
@ -142,7 +178,7 @@ minetest.register_craft({
-- bucket of milk
minetest.register_craftitem("mobs:bucket_milk", {
description = "Bucket of Milk",
description = "Milk Bucket",
inventory_image = "mobs_bucket_milk.png",
stack_max = 1,
on_use = minetest.item_eat(8, "bucket:bucket_empty"),

View File

@ -29,6 +29,11 @@ setmetatable(nodes, {
end
})
local valid_block = {}
for _, v in pairs(nodes) do
valid_block[v] = true
end
-- Nodeboxes definitions
workbench.defs = {
-- Name Yield X Y Z W H L
@ -192,7 +197,7 @@ function workbench.put(_, listname, _, stack)
local stackname = stack:get_name()
if (listname == "tool" and stack:get_wear() > 0 and
workbench:repairable(stackname)) or
(listname == "input" and minetest.registered_nodes[stackname.."_cube"]) or
(listname == "input" and valid_block[stackname]) or
(listname == "hammer" and stackname == "workbench:hammer") or
listname == "storage" then
return stack:get_count()
@ -220,9 +225,8 @@ function workbench.on_take(pos, listname, index, stack, player)
local input = inv:get_stack("input", 1)
local inputname = input:get_name()
local stackname = stack:get_name()
if stackname == inputname and minetest.registered_nodes[inputname.."_cube"] then
if stackname == inputname then
if listname == "input" then
if stackname == inputname and valid_block[stackname] then
workbench:get_output(inv, input, stackname)
else
inv:set_list("forms", {})