aliveai/aliveai_threats/tree.lua

212 lines
5.4 KiB
Lua

aliveai_threats.spawn_tree=function(self)
if not (self and self.object) then return false end
local pos=aliveai.roundpos(self.object:get_pos())
if minetest.get_node(pos).name=="air" then return false end
self.tree_by_nodes={}
local trunk=""
local leaves=""
local tree={}
local hight=1
local g=0
local gm=2
local xx
local zz
for x=-5,5,1 do
for z=-5,5,1 do
for y=0,15,1 do
local p={x=pos.x+x,y=pos.y+y,z=pos.z+z}
local name=minetest.get_node(p).name
local det=0
if minetest.is_protected(p,"") then
return false
elseif aliveai.group(p,"leaves")>0 and (leaves=="" or name==leaves) then
det=1
elseif (aliveai.group(p,"tree")>0 or name=="default:acacia_bush_stem" or name=="default:bush_stem") and (trunk=="" or name==trunk) then
det=2
end
if det>0 then
xx=math.abs(x)
zz=math.abs(z)
if xx>g and xx<=gm then
g=xx
gm=g+1
end
if zz>g and zz<=gm then
g=zz
gm=g+1
end
if xx<gm and zz<gm then
if det==1 then leaves=name end
if det==2 then trunk=name end
table.insert(tree,{x,y,z,name,p})
if y>hight then hight=y end
end
end
end
end
end
if #tree<2 then return false end
self.storge2=hight/2
local c=self.object:get_properties().collisionbox
c[5]=self.storge2
self.object:set_properties({collisionbox=c})
if trunk~="" then
self.object:set_properties({textures={trunk}})
self.storge1=trunk
else
self.storge1="default:tree"
end
for _, d in ipairs(tree) do
if d[1]+d[2]+d[3]~=0 then
local e=minetest.add_entity(pos, "aliveai_threats:trees_block")
e:set_properties({textures={d[4]}})
e:set_attach(self.object, "", {x=d[1]*30,y=d[2]*30,z=d[3]*30}, {x=0,y=0,z=0})
e:get_luaentity().contenta=d[4]
table.insert(self.tree_by_nodes,{ob=e,pos={x=d[1],y=d[2],z=d[3]},it=d[4]})
end
minetest.remove_node(d[5])
end
return true
end
aliveai_threats.load_tree=function(self)
if not (self and self.object) then return false end
local pos=aliveai.roundpos(self.object:get_pos())
self.tree_by_nodes={}
local c=self.object:get_properties().collisionbox
c[5]=self.storge2
self.object:set_properties({textures={self.storge1},collisionbox=c})
for _, d in ipairs(self.tree_by_nodes_load) do
local e=minetest.add_entity(pos, "aliveai_threats:trees_block")
e:set_properties({textures={d[4]}})
e:set_attach(self.object, "", {x=d[1]*30,y=d[2]*30,z=d[3]*30}, {x=0,y=0,z=0})
e:get_luaentity().contenta=d[4]
table.insert(self.tree_by_nodes,{ob=e,pos={x=d[1],y=d[2],z=d[3]},it=d[4]})
end
self.tree_by_nodes_load=nil
return true
end
aliveai.savedata.trees=function(self)
if self.tree_by_nodes then
local dat=""
for _, d in ipairs(self.tree_by_nodes) do
if dat~="" then
dat=dat .. "!"
end
dat=dat .. d.pos.x .."#" .. d.pos.y .."#" .. d.pos.z .."#" .. d.it
end
return {tree_by_nodes=dat}
end
end
aliveai.loaddata.trees=function(self,r)
if r.tree_by_nodes and type(r.tree_by_nodes)=="string" then
local dat={}
local a1=r.tree_by_nodes.split(r.tree_by_nodes,"!")
for _, d in ipairs(a1) do
local a2=d.split(d,"#")
local p=aliveai.strpos(a2[1] .."," .. a2[2] .."," .. a2[3],true)
table.insert(dat,{p.x,p.y,p.z,a2[4]})
end
self.tree_by_nodes_load=dat
end
return self
end
aliveai.create_bot({
description="Living tree",
attack_players=1,
name="trees",
team="tree",
texture="default_tree.png",
talking=0,
light=0,
building=0,
type="monster",
hp=30,
dmg=9,
arm=2,
name_color="",
collisionbox={-0.5,-0.5,-0.5,0.5,3,0.5},
visual="wielditem",
basey=-0.5,
drop_dead_body=0,
escape=0,
spawn_on={"group:tree","default:acacia_bush_stem","default:bush_stem"},
spawn_y=0,
visual_size={x=0.5,y=0.5},
smartfight=0,
check_spawn_space=0,
spawn_chance=300,
spawn=function(self)
if aliveai_threats.spawn_tree(self)==false then
self.object:remove()
return self
end
end,
on_load=function(self)
if not self.tree_by_nodes_load then
self.object:remove()
return self
end
aliveai_threats.load_tree(self)
end,
death=function(self,puncher,pos)
if self.tree_by_nodes then
for _, d in ipairs(self.tree_by_nodes) do
if d and d.ob then
d.ob:set_detach()
d.ob:set_acceleration({x=0, y=-10, z=0})
d.ob:set_velocity({x=math.random(-2,2), y=math.random(0,1), z=math.random(-2,2)})
d.ob:set_pos({x=pos.x+d.pos.x,y=pos.y+d.pos.y,z=pos.z+d.pos.z})
d.ob:set_properties({visual_size={x=0.65,y=0.65}})
end
end
end
end,
on_punched=function(self,puncher)
end
})
minetest.register_entity("aliveai_threats:trees_block",{
hp_max = 10,
physical =true,
pointable=true,
visual = "wielditem",
textures ={"air"},
visual_size={x=2,y=2},
on_activate=function(self, staticdata)
minetest.after(0.1, function(self)
if not self.object:get_attach() then
self.object:remove()
end
end,self)
self.endtime=math.random(1,4)
end,
on_step=function(self, dtime)
self.time=self.time+dtime
if self.time<2 then return self end
self.time=0
if not self.object:get_attach() then
self.time2=self.time2+1
if self.time2>self.endtime then
if math.random(1,2)==1 then
minetest.add_item(self.object:get_pos(),self.contenta):get_luaentity().age=890
end
self.object:remove()
end
end
end,
endtime=1,
time=0,
time2=0,
})