mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2024-12-24 17:50:37 +01:00
Added cow dung
- O_o?
This commit is contained in:
parent
26b6b69f28
commit
83984a6941
@ -61,10 +61,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
blood_texture = def.blood_texture or "mobs_blood.png",
|
blood_texture = def.blood_texture or "mobs_blood.png",
|
||||||
shoot_offset = def.shoot_offset or 0,
|
shoot_offset = def.shoot_offset or 0,
|
||||||
floats = def.floats or 1, -- floats in water by default
|
floats = def.floats or 1, -- floats in water by default
|
||||||
replace_rate = def.replace_rate,
|
replacements = def.replacements or {},
|
||||||
replace_what = def.replace_what,
|
|
||||||
replace_with = def.replace_with,
|
|
||||||
replace_offset = def.replace_offset or 0,
|
|
||||||
timer = 0,
|
timer = 0,
|
||||||
env_damage_timer = 0, -- only if state = "attack"
|
env_damage_timer = 0, -- only if state = "attack"
|
||||||
attack = {player=nil, dist=nil},
|
attack = {player=nil, dist=nil},
|
||||||
@ -86,7 +83,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
self.attack.dist = dist
|
self.attack.dist = dist
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
set_velocity = function(self, v)
|
set_velocity = function(self, v)
|
||||||
if not v then v = 0 end
|
if not v then v = 0 end
|
||||||
if def.drawtype and def.drawtype == "side" then self.rotate = 1.5 end
|
if def.drawtype and def.drawtype == "side" then self.rotate = 1.5 end
|
||||||
@ -95,7 +92,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
local z = math.cos(yaw) * v
|
local z = math.cos(yaw) * v
|
||||||
self.object:setvelocity({x=x, y=self.object:getvelocity().y, z=z})
|
self.object:setvelocity({x=x, y=self.object:getvelocity().y, z=z})
|
||||||
end,
|
end,
|
||||||
|
|
||||||
get_velocity = function(self)
|
get_velocity = function(self)
|
||||||
local v = self.object:getvelocity()
|
local v = self.object:getvelocity()
|
||||||
return (v.x^2 + v.z^2)^(0.5)
|
return (v.x^2 + v.z^2)^(0.5)
|
||||||
@ -110,11 +107,11 @@ lifetimer = def.lifetimer or 600,
|
|||||||
local ps = math.sqrt(pos.x^2 + pos.z^2)
|
local ps = math.sqrt(pos.x^2 + pos.z^2)
|
||||||
local d = { x = vx / ds, z = vz / ds }
|
local d = { x = vx / ds, z = vz / ds }
|
||||||
local p = { x = pos.x / ps, z = pos.z / ps }
|
local p = { x = pos.x / ps, z = pos.z / ps }
|
||||||
|
|
||||||
local an = ( d.x * p.x ) + ( d.z * p.z )
|
local an = ( d.x * p.x ) + ( d.z * p.z )
|
||||||
|
|
||||||
a = math.deg( math.acos( an ) )
|
a = math.deg( math.acos( an ) )
|
||||||
|
|
||||||
if a > ( self.fov / 2 ) then
|
if a > ( self.fov / 2 ) then
|
||||||
return false
|
return false
|
||||||
else
|
else
|
||||||
@ -155,7 +152,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
on_step = function(self, dtime)
|
on_step = function(self, dtime)
|
||||||
|
|
||||||
local yaw = 0
|
local yaw = 0
|
||||||
@ -180,16 +177,28 @@ lifetimer = def.lifetimer or 600,
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- check for mob drop/replace (used for chicken egg and sheep eating grass/wheat)
|
-- check for mob drop/replace (used for chicken egg and sheep eating grass/wheat)
|
||||||
if self.replace_rate
|
--[[
|
||||||
and math.random(1,self.replace_rate) == 1
|
old fields :
|
||||||
and self.child == false then
|
replace_rate = def.replace_rate,
|
||||||
local pos = self.object:getpos()
|
replace_what = def.replace_what,
|
||||||
pos.y = pos.y + self.replace_offset
|
replace_with = def.replace_with,
|
||||||
if #minetest.find_nodes_in_area(pos,pos,self.replace_what) > 0
|
replace_offset = def.replace_offset or 0,
|
||||||
and self.object:getvelocity().y == 0
|
]]--
|
||||||
and self.replace_what then
|
for _, fields in pairs(self.replacements) do
|
||||||
--and self.state == "stand" then
|
|
||||||
minetest.set_node(pos, {name = self.replace_with})
|
if fields.replace_rate
|
||||||
|
and math.random(1,fields.replace_rate) == 1
|
||||||
|
and self.child == false then
|
||||||
|
|
||||||
|
fields.replace_offset = fields.replace_offset or 0
|
||||||
|
|
||||||
|
local pos = self.object:getpos()
|
||||||
|
pos.y = pos.y + fields.replace_offset
|
||||||
|
if #minetest.find_nodes_in_area(pos,pos,fields.replace_what) > 0
|
||||||
|
and self.object:getvelocity().y == 0
|
||||||
|
and fields.replace_what then
|
||||||
|
minetest.set_node(pos, {name = fields.replace_with})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -221,7 +230,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
end
|
end
|
||||||
self.old_y = self.object:getpos().y
|
self.old_y = self.object:getpos().y
|
||||||
end
|
end
|
||||||
|
|
||||||
-- knockback timer
|
-- knockback timer
|
||||||
if self.pause_timer > 0 then
|
if self.pause_timer > 0 then
|
||||||
self.pause_timer = self.pause_timer - dtime
|
self.pause_timer = self.pause_timer - dtime
|
||||||
@ -230,7 +239,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- attack timer
|
-- attack timer
|
||||||
self.timer = self.timer + dtime
|
self.timer = self.timer + dtime
|
||||||
if self.state ~= "attack" then
|
if self.state ~= "attack" then
|
||||||
@ -243,7 +252,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
if self.sounds.random and math.random(1, 100) <= 1 then
|
if self.sounds.random and math.random(1, 100) <= 1 then
|
||||||
minetest.sound_play(self.sounds.random, {object = self.object})
|
minetest.sound_play(self.sounds.random, {object = self.object})
|
||||||
end
|
end
|
||||||
|
|
||||||
local do_env_damage = function(self)
|
local do_env_damage = function(self)
|
||||||
|
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
@ -264,7 +273,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
self.object:set_hp(self.object:get_hp()-self.water_damage)
|
self.object:set_hp(self.object:get_hp()-self.water_damage)
|
||||||
effect(pos, 5, "bubble.png")
|
effect(pos, 5, "bubble.png")
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.lava_damage and self.lava_damage ~= 0
|
if self.lava_damage and self.lava_damage ~= 0
|
||||||
and minetest.get_item_group(n.name, "lava") ~= 0 then
|
and minetest.get_item_group(n.name, "lava") ~= 0 then
|
||||||
self.object:set_hp(self.object:get_hp()-self.lava_damage)
|
self.object:set_hp(self.object:get_hp()-self.lava_damage)
|
||||||
@ -273,7 +282,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
|
|
||||||
check_for_death(self)
|
check_for_death(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local do_jump = function(self)
|
local do_jump = function(self)
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
pos.y = pos.y - (-self.collisionbox[2] + self.collisionbox[5])
|
pos.y = pos.y - (-self.collisionbox[2] + self.collisionbox[5])
|
||||||
@ -298,7 +307,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- environmental damage timer
|
-- environmental damage timer
|
||||||
self.env_damage_timer = self.env_damage_timer + dtime
|
self.env_damage_timer = self.env_damage_timer + dtime
|
||||||
if self.state == "attack" and self.env_damage_timer > 1 then
|
if self.state == "attack" and self.env_damage_timer > 1 then
|
||||||
@ -307,7 +316,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
elseif self.state ~= "attack" then
|
elseif self.state ~= "attack" then
|
||||||
do_env_damage(self)
|
do_env_damage(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- find someone to attack
|
-- find someone to attack
|
||||||
if self.type == "monster" and damage_enabled and self.state ~= "attack" then
|
if self.type == "monster" and damage_enabled and self.state ~= "attack" then
|
||||||
|
|
||||||
@ -331,7 +340,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
type = obj.type
|
type = obj.type
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if type == "player" or type == "npc" then
|
if type == "player" or type == "npc" then
|
||||||
local s = self.object:getpos()
|
local s = self.object:getpos()
|
||||||
local p = player:getpos()
|
local p = player:getpos()
|
||||||
@ -354,7 +363,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
self.do_attack(self, min_player, min_dist)
|
self.do_attack(self, min_player, min_dist)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- npc, find closest monster to attack
|
-- npc, find closest monster to attack
|
||||||
local min_dist = self.view_range + 1
|
local min_dist = self.view_range + 1
|
||||||
local min_player = nil
|
local min_player = nil
|
||||||
@ -517,7 +526,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
|
|
||||||
if self.type == "npc" then
|
if self.type == "npc" then
|
||||||
local o = minetest.get_objects_inside_radius(self.object:getpos(), 3)
|
local o = minetest.get_objects_inside_radius(self.object:getpos(), 3)
|
||||||
|
|
||||||
local yaw = 0
|
local yaw = 0
|
||||||
for _,o in ipairs(o) do
|
for _,o in ipairs(o) do
|
||||||
if o:is_player() then
|
if o:is_player() then
|
||||||
@ -533,7 +542,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
if lp.x > s.x then
|
if lp.x > s.x then
|
||||||
yaw = yaw+math.pi
|
yaw = yaw+math.pi
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
yaw = self.object:getyaw()+((math.random(0,360)-180)/180*math.pi)
|
yaw = self.object:getyaw()+((math.random(0,360)-180)/180*math.pi)
|
||||||
end
|
end
|
||||||
self.object:setyaw(yaw)
|
self.object:setyaw(yaw)
|
||||||
@ -567,7 +576,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
local s = self.object:getpos()
|
local s = self.object:getpos()
|
||||||
-- if there is water nearby, try to avoid it
|
-- if there is water nearby, try to avoid it
|
||||||
local lp = minetest.find_node_near(s, 2, {"group:water"})
|
local lp = minetest.find_node_near(s, 2, {"group:water"})
|
||||||
|
|
||||||
if lp ~= nil then
|
if lp ~= nil then
|
||||||
local vec = {x=lp.x-s.x, y=lp.y-s.y, z=lp.z-s.z}
|
local vec = {x=lp.x-s.x, y=lp.y-s.y, z=lp.z-s.z}
|
||||||
yaw = math.atan(vec.z/vec.x) + 3*math.pi / 2 + self.rotate
|
yaw = math.atan(vec.z/vec.x) + 3*math.pi / 2 + self.rotate
|
||||||
@ -594,7 +603,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- exploding mobs
|
-- exploding mobs
|
||||||
elseif self.state == "attack" and self.attack_type == "explode" then
|
elseif self.state == "attack" and self.attack_type == "explode" then
|
||||||
if not self.attack.player or not self.attack.player:is_player() then
|
if not self.attack.player or not self.attack.player:is_player() then
|
||||||
self.state = "stand"
|
self.state = "stand"
|
||||||
self:set_animation("stand")
|
self:set_animation("stand")
|
||||||
@ -618,7 +627,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
self:set_animation("walk")
|
self:set_animation("walk")
|
||||||
self.attack.dist = dist
|
self.attack.dist = dist
|
||||||
end
|
end
|
||||||
|
|
||||||
local vec = {x = p.x -s.x, y = p.y -s.y, z = p.z -s.z}
|
local vec = {x = p.x -s.x, y = p.y -s.y, z = p.z -s.z}
|
||||||
local yaw = math.atan(vec.z/vec.x)+math.pi/2 + self.rotate
|
local yaw = math.atan(vec.z/vec.x)+math.pi/2 + self.rotate
|
||||||
if p.x > s.x then
|
if p.x > s.x then
|
||||||
@ -694,7 +703,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
else
|
else
|
||||||
self.attack.dist = dist
|
self.attack.dist = dist
|
||||||
end
|
end
|
||||||
|
|
||||||
local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z}
|
local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z}
|
||||||
local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate
|
local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate
|
||||||
if p.x > s.x then
|
if p.x > s.x then
|
||||||
@ -759,7 +768,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
else
|
else
|
||||||
self.attack.dist = dist
|
self.attack.dist = dist
|
||||||
end
|
end
|
||||||
|
|
||||||
local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z}
|
local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z}
|
||||||
local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate
|
local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate
|
||||||
if p.x > s.x then
|
if p.x > s.x then
|
||||||
@ -767,7 +776,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
end
|
end
|
||||||
self.object:setyaw(yaw)
|
self.object:setyaw(yaw)
|
||||||
self.set_velocity(self, 0)
|
self.set_velocity(self, 0)
|
||||||
|
|
||||||
if self.shoot_interval and self.timer > self.shoot_interval and math.random(1, 100) <= 60 then
|
if self.shoot_interval and self.timer > self.shoot_interval and math.random(1, 100) <= 60 then
|
||||||
self.timer = 0
|
self.timer = 0
|
||||||
|
|
||||||
@ -913,7 +922,7 @@ lifetimer = def.lifetimer or 600,
|
|||||||
kb = kb * ( tflp / tool_capabilities.full_punch_interval )
|
kb = kb * ( tflp / tool_capabilities.full_punch_interval )
|
||||||
r = r * ( tflp / tool_capabilities.full_punch_interval )
|
r = r * ( tflp / tool_capabilities.full_punch_interval )
|
||||||
end
|
end
|
||||||
if v.y ~= 0 then ykb = 0 end
|
if v.y ~= 0 then ykb = 0 end
|
||||||
self.object:setvelocity({x=dir.x*kb,y=ykb,z=dir.z*kb})
|
self.object:setvelocity({x=dir.x*kb,y=ykb,z=dir.z*kb})
|
||||||
self.pause_timer = r
|
self.pause_timer = r
|
||||||
|
|
||||||
@ -949,7 +958,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter
|
|||||||
action = function(pos, node, _, active_object_count_wider)
|
action = function(pos, node, _, active_object_count_wider)
|
||||||
-- do not spawn if too many active in area
|
-- do not spawn if too many active in area
|
||||||
if active_object_count_wider > active_object_count
|
if active_object_count_wider > active_object_count
|
||||||
or not mobs.spawning_mobs[name]
|
or not mobs.spawning_mobs[name]
|
||||||
or not pos then
|
or not pos then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -56,9 +56,13 @@ mobs:register_mob("mobs:chicken", {
|
|||||||
follow = "farming:seed_wheat",
|
follow = "farming:seed_wheat",
|
||||||
view_range = 8,
|
view_range = 8,
|
||||||
-- replace air with egg (lay)
|
-- replace air with egg (lay)
|
||||||
replace_rate = 2000,
|
replacements = {
|
||||||
replace_what = {"air"},
|
{
|
||||||
replace_with = "mobs:egg",
|
replace_rate = 2000,
|
||||||
|
replace_what = {"air"},
|
||||||
|
replace_with = "mobs:egg",
|
||||||
|
}
|
||||||
|
},
|
||||||
-- right click to pick up chicken
|
-- right click to pick up chicken
|
||||||
on_rightclick = function(self, clicker)
|
on_rightclick = function(self, clicker)
|
||||||
local tool = clicker:get_wielded_item()
|
local tool = clicker:get_wielded_item()
|
||||||
|
@ -53,9 +53,19 @@ mobs:register_mob("mobs:cow", {
|
|||||||
-- follows wheat
|
-- follows wheat
|
||||||
follow = "farming:wheat", view_range = 8,
|
follow = "farming:wheat", view_range = 8,
|
||||||
-- replace grass/wheat with air (eat)
|
-- replace grass/wheat with air (eat)
|
||||||
replace_rate = 50,
|
replacements = {
|
||||||
replace_what = {"default:grass_3", "default:grass_4", "default:grass_5", "farming:wheat_8"},
|
{
|
||||||
replace_with = "air",
|
replace_rate = 50,
|
||||||
|
replace_what = {"default:grass_3", "default:grass_4",
|
||||||
|
"default:grass_5", "farming:wheat_8"},
|
||||||
|
replace_with = "air",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
replace_rate = 2000,
|
||||||
|
replace_what = {"air"},
|
||||||
|
replace_with = "mobs:dung",
|
||||||
|
}
|
||||||
|
},
|
||||||
-- right-click cow with empty bucket to get milk, then feed 8 wheat to replenish milk
|
-- right-click cow with empty bucket to get milk, then feed 8 wheat to replenish milk
|
||||||
on_rightclick = function(self, clicker)
|
on_rightclick = function(self, clicker)
|
||||||
local tool = clicker:get_wielded_item()
|
local tool = clicker:get_wielded_item()
|
||||||
@ -169,3 +179,29 @@ minetest.register_craft({
|
|||||||
{'mobs:cheeseblock'},
|
{'mobs:cheeseblock'},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Dung
|
||||||
|
-- O_o?
|
||||||
|
|
||||||
|
minetest.register_node("mobs:dung", {
|
||||||
|
description = "Cow dung",
|
||||||
|
tiles = {"mobs_dung.png"},
|
||||||
|
inventory_image = "mobs_dung.png",
|
||||||
|
visual_scale = 0.7,
|
||||||
|
drawtype = "plantlike",
|
||||||
|
wield_image = "mobs_dung.png",
|
||||||
|
paramtype = "light",
|
||||||
|
walkable = false,
|
||||||
|
is_ground_content = true,
|
||||||
|
sunlight_propagates = true,
|
||||||
|
selection_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
|
||||||
|
},
|
||||||
|
groups = {snappy=2, dig_immediate=3},
|
||||||
|
after_place_node = function(pos, placer, itemstack)
|
||||||
|
if placer:is_player() then
|
||||||
|
minetest.set_node(pos, {name="mobs:dung", param2=1})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
||||||
|
BIN
mods/mobs/textures/mobs_dung.png
Normal file
BIN
mods/mobs/textures/mobs_dung.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 635 B |
Loading…
Reference in New Issue
Block a user