|
|
@ -1,4 +1,4 @@ |
|
|
|
-- Duck. Descended from Sapier Ostrich. |
|
|
|
-- Duck Walking. Original by Poikilos. |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
-- Media license. Applies to model and associated texture. |
|
|
@ -7,12 +7,12 @@ |
|
|
|
-- copyright notice. Of course, you're not allowed to pretend you've |
|
|
|
-- created or written the Sapier, Poikilos, or OldCoder pieces. |
|
|
|
-- |
|
|
|
-- CC-BY-SA 3.0. Attribution: Sapier, Poikilos, and OldCoder. |
|
|
|
-- CC-BY-SA 3.0. Attribution: Poikilos. |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
|
|
|
|
local lcname = "duck" |
|
|
|
local ucname = "Duck" |
|
|
|
local lcname = "duck_walking" |
|
|
|
local ucname = "Duck Walking" |
|
|
|
local msname = "codermobs_" .. lcname |
|
|
|
local obj_name = "codermobs:" .. lcname |
|
|
|
|
|
|
@ -23,18 +23,21 @@ mobs_param = { |
|
|
|
ucname = ucname , |
|
|
|
obj_name = obj_name , |
|
|
|
|
|
|
|
aoc = 2 , |
|
|
|
aoc = -1 , |
|
|
|
spawn_chance = 30000 , |
|
|
|
|
|
|
|
day_mode = true , |
|
|
|
min_light = 14 , |
|
|
|
max_light = 20 , |
|
|
|
min_height = 0 , |
|
|
|
max_height = 200 , |
|
|
|
spawn_chance = 50000 , |
|
|
|
min_light = 14 , |
|
|
|
max_light = 20 , |
|
|
|
min_height = 0 , |
|
|
|
max_height = 200 , |
|
|
|
|
|
|
|
spawn_type = "animal" , |
|
|
|
|
|
|
|
spawn_nodes = { |
|
|
|
"default:dirt_with_dry_grass" , |
|
|
|
"ethereal:mushroom_dirt" , |
|
|
|
"noisegrid:grass" , |
|
|
|
} , |
|
|
|
|
|
|
|
spawn_by = { |
|
|
@ -56,7 +59,7 @@ codermobs.adjust_param() |
|
|
|
-- Chicken-based images stand in for ostrich-based images in some |
|
|
|
-- cases. |
|
|
|
|
|
|
|
local mcname = "codermobs_duck" |
|
|
|
local mcname = "codermobs_duck_walking" |
|
|
|
|
|
|
|
local msname_cooked = mcname .. "_cooked" |
|
|
|
local msname_raw = mcname .. "_raw" |
|
|
@ -108,11 +111,16 @@ mobs_param.core_param = { |
|
|
|
water_damage = 1 , |
|
|
|
|
|
|
|
collisionbox = { -0.22, 0.0, -0.22, 0.22, 0.48, 0.22 } , |
|
|
|
mesh = "codermobs_duck-hd.b3d" , |
|
|
|
mesh = "codermobs_duck_walking.b3d" , |
|
|
|
rotate = 0 , |
|
|
|
textures = { "codermobs_duck_mallard_male.png" } , |
|
|
|
child_texture = { "codermobs_duck_mallard_male.png" } , |
|
|
|
visual = "mesh" , |
|
|
|
scale = 2 , |
|
|
|
|
|
|
|
textures = { |
|
|
|
{ msname .. "_male_mesh.png" } , |
|
|
|
{ msname .. "_female_mesh.png" } , |
|
|
|
}, |
|
|
|
|
|
|
|
visual = "mesh" , |
|
|
|
|
|
|
|
sounds = { |
|
|
|
} , |
|
|
@ -130,13 +138,13 @@ mobs_param.core_param = { |
|
|
|
run_velocity = 1.778 , |
|
|
|
|
|
|
|
animation = { |
|
|
|
stand_start = 0 , |
|
|
|
stand_end = 2 , |
|
|
|
speed_normal = 8 , |
|
|
|
walk_start = 3 , |
|
|
|
stand_start = 0 , |
|
|
|
stand_end = 2 , |
|
|
|
speed_normal = 8 , |
|
|
|
walk_start = 3 , |
|
|
|
walk_end = 11 , |
|
|
|
speed_run = 32, |
|
|
|
run_start = 3 , |
|
|
|
speed_run = 32, |
|
|
|
run_start = 3 , |
|
|
|
run_end = 11 , |
|
|
|
}, |
|
|
|
|
|
|
@ -153,193 +161,6 @@ mobs_param.core_param = { |
|
|
|
-- =================================================================== |
|
|
|
|
|
|
|
codermobs.setup_mob() |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
-- Egg. |
|
|
|
|
|
|
|
--minetest.register_node (obj_name_egg, { |
|
|
|
--description = ucname .. " Egg", |
|
|
|
--inventory_image = msname_egg_img , |
|
|
|
--wield_image = msname_egg_img , |
|
|
|
--paramtype = "light", |
|
|
|
--walkable = false, |
|
|
|
--is_ground_content = true, |
|
|
|
--sunlight_propagates = true, |
|
|
|
|
|
|
|
--drawtype = "mesh" , |
|
|
|
--mesh = "animal-materials-egg.b3d" , |
|
|
|
--tiles = { "animal_materials_egg_ent_mesh.png" } , |
|
|
|
--visual_scale = 0.24 , |
|
|
|
|
|
|
|
--selection_box = { |
|
|
|
--type = "fixed" , |
|
|
|
--fixed = { -0.25, -0.25, -0.25, 0.25, 0.25, 0.24 } , |
|
|
|
--} , |
|
|
|
|
|
|
|
--groups = {snappy = 2, dig_immediate = 3}, |
|
|
|
--after_place_node = function(pos, placer, itemstack) |
|
|
|
--if placer:is_player() then |
|
|
|
--minetest.set_node(pos, {name = obj_name_egg, param2 = 1}) |
|
|
|
--end |
|
|
|
--end, |
|
|
|
--}) |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
-- Egg entity. |
|
|
|
|
|
|
|
--mobs:register_arrow (obj_name_egg_entity, { |
|
|
|
--visual = "sprite", |
|
|
|
--visual_size = {x=.5, y=.5}, |
|
|
|
--textures = { msname_egg_img } , |
|
|
|
--velocity = 6, |
|
|
|
|
|
|
|
--hit_player = function(self, player) |
|
|
|
--player:punch(self.object, 1.0, { |
|
|
|
--full_punch_interval = 1.0, |
|
|
|
--damage_groups = {fleshy = 1}, |
|
|
|
--}, nil) |
|
|
|
--end, |
|
|
|
|
|
|
|
--hit_mob = function(self, player) |
|
|
|
--player:punch(self.object, 1.0, { |
|
|
|
--full_punch_interval = 1.0, |
|
|
|
--damage_groups = {fleshy = 1}, |
|
|
|
--}, nil) |
|
|
|
--end, |
|
|
|
|
|
|
|
--hit_node = function(self, pos, node) |
|
|
|
--local num = math.random(1, 10) |
|
|
|
|
|
|
|
--if num == 1 then |
|
|
|
--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, obj_name) |
|
|
|
--local ent2 = mob:get_luaentity() |
|
|
|
|
|
|
|
--mob:set_properties({ |
|
|
|
--textures = ent2.child_texture[1], |
|
|
|
--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 |
|
|
|
--end |
|
|
|
--}) |
|
|
|
|
|
|
|
-- Egg-throwing item |
|
|
|
|
|
|
|
--local egg_GRAVITY = 9 |
|
|
|
--local egg_VELOCITY = 19 |
|
|
|
|
|
|
|
-- Shoot egg |
|
|
|
--local mobs_shoot_egg = function (item, player, pointed_thing) |
|
|
|
|
|
|
|
--local playerpos = player:getpos() |
|
|
|
|
|
|
|
--minetest.sound_play ("default_place_node_hard", { |
|
|
|
--pos = playerpos, |
|
|
|
--gain = 1.0, |
|
|
|
--max_hear_distance = 5, |
|
|
|
--}) |
|
|
|
|
|
|
|
--local obj = minetest.add_entity({ |
|
|
|
--x = playerpos.x, |
|
|
|
--y = playerpos.y +1.5, |
|
|
|
--z = playerpos.z |
|
|
|
--}, obj_name_egg_entity) |
|
|
|
|
|
|
|
--local ent = obj:get_luaentity() |
|
|
|
--local dir = player:get_look_dir() |
|
|
|
|
|
|
|
--ent.velocity = egg_VELOCITY -- needed for api internal timing |
|
|
|
--ent.switch = 1 -- needed so that egg doesn't despawn straight away |
|
|
|
|
|
|
|
--obj:setvelocity({ |
|
|
|
--x = dir.x * egg_VELOCITY, |
|
|
|
--y = dir.y * egg_VELOCITY, |
|
|
|
--z = dir.z * egg_VELOCITY |
|
|
|
--}) |
|
|
|
|
|
|
|
--obj:setacceleration({ |
|
|
|
--x = dir.x * -3, |
|
|
|
--y = -egg_GRAVITY, |
|
|
|
--z = dir.z * -3 |
|
|
|
--}) |
|
|
|
|
|
|
|
---- pass player name to egg for chick ownership |
|
|
|
--local ent2 = obj:get_luaentity() |
|
|
|
--ent2.playername = player:get_player_name() |
|
|
|
--item:take_item() |
|
|
|
--return item |
|
|
|
--end |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
-- Fried egg. |
|
|
|
|
|
|
|
--minetest.register_craftitem (obj_name_egg_fried, { |
|
|
|
--description = "Fried " .. ucname .. " Egg" , |
|
|
|
--inventory_image = msname_egg_fried_img , |
|
|
|
--on_use = minetest.item_eat (3) , |
|
|
|
--}) |
|
|
|
|
|
|
|
--minetest.register_craft ({ |
|
|
|
--type = "cooking" , |
|
|
|
--recipe = obj_name_egg , |
|
|
|
--output = obj_name_egg_fried , |
|
|
|
--}) |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
-- Raw bird. |
|
|
|
|
|
|
|
minetest.register_craftitem (obj_name_raw, { |
|
|
|
description = "Raw " .. ucname , |
|
|
|
inventory_image = msname_raw_img , |
|
|
|
|
|
|
|
on_use = function (itemstack, player, pointed_thing) |
|
|
|
local name = player:get_player_name() |
|
|
|
local msg = name .. " ate raw " .. ucname .. ". Salmonella!" |
|
|
|
minetest.chat_send_all (msg) |
|
|
|
player:set_hp (player:get_hp() - 2) |
|
|
|
end , |
|
|
|
}) |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
-- Cooked bird. |
|
|
|
|
|
|
|
minetest.register_craftitem (obj_name_cooked, { |
|
|
|
description = "Cooked " .. ucname , |
|
|
|
inventory_image = msname_cooked_img , |
|
|
|
on_use = minetest.item_eat (6) , |
|
|
|
}) |
|
|
|
|
|
|
|
minetest.register_craft ({ |
|
|
|
type = "cooking" , |
|
|
|
recipe = obj_name_raw , |
|
|
|
output = obj_name_cooked , |
|
|
|
}) |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|
|
|
|
|
codermobs.log_done() |
|
|
|
|
|
|
|
-- =================================================================== |
|
|
|