AIplayer/init.lua

110 lines
3.2 KiB
Lua

AIplayer = {
version = 20201001,
maintainer = "Pevernow",
S = minetest.get_translator("aiplayer"),
ticktime = 0.5
}
local node_ok = function(pos, fallback)
local node = minetest.get_node_or_nil(pos)
if node and minetest.registered_nodes[node.name] then
return node
end
return minetest.registered_nodes[fallback]
end
AIplayer.roundpos = function(pos)
if pos and pos.x and pos.y and pos.z then
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
return pos
end
return nil
end
AIplayer.on_activate = function(self)
self.deltatime = 0
self.old_y = self.object:get_pos().y
self.falling = function(self,pos)
if(self.standing_on=="air") then
self.object:set_acceleration({
x = 0,
y = -9.8,
z = 0
})
else
if(self.old_y-self.pos.y>3) then
self.object:set_hp(self.object:get_hp()-(self.old_y-self.pos.y-3), "Fall down")
if(self.object:get_hp()==0) then
self.object:remove()
end
end
self.old_y = self.pos.y
end
end
end
AIplayer.on_step = function(self, dtime, null)
self.deltatime = self.deltatime + dtime
if(deltatime>=AIplayer.ticktime) then
self.deltatime = self.deltatime - AIplayer.ticktime
else
return
end
self.pos = self.object:get_pos()
local y_level = self.collisionbox[2]
self.dtime = dtime
self.standing_on = node_ok({x = self.pos.x, y = self.pos.y-1.5, z = self.pos.z}, "air").name
self.standing_in = node_ok({x = self.pos.x, y = self.pos.y-0.5, z = self.pos.z}, "air").name
if minetest.registered_nodes[self.standing_in].walkable and
minetest.registered_nodes[self.standing_in].drawtype == "normal" then
self.object:set_velocity({
x = 0,
y = 1,
z = 0
})
end
self:falling(pos)
end
AIplayer.register_NPC = function(name,def)
minetest.register_entity("aiplayer:"..name,{
hp_max = def.hp or 20,
physical = true,
weight = 5,
collisionbox = def.collisionbox or {-0.35,-1.0,-0.35,0.35,0.8,0.35}, -- new box {-0.35,0,-0.35,0.35,1.8,0.35}
visual = def.visual or "mesh",
visual_size = def.visual_size or {x=1,y=1},
mesh = def.mesh or "aiplayer_character.b3d",
textures = {def.texture},
colors = {},
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = true,
automatic_rotate = 0,
on_activate = AIplayer.on_activate,
on_step = AIplayer.on_step
})
minetest.register_craftitem("aiplayer:Sam_egg", {
description = "Sam_egg",
inventory_image = def.texture,
on_place = function(itemstack, user, pointed_thing)
if pointed_thing.type=="node" then
local pos=AIplayer.roundpos(pointed_thing.above)
minetest.add_entity(pos, "aiplayer:Sam"):set_yaw(math.random(0,6.28))
itemstack:take_item()
end
return itemstack
end
})
end
AIplayer.register_NPC("Sam",{
texture = "aiplayer_Sam.png"
})