Delete core.lua
parent
e06f469ed4
commit
788de7ae2b
227
core.lua
227
core.lua
|
@ -1,227 +0,0 @@
|
||||||
|
|
||||||
local function execute_queues(self)
|
|
||||||
--Execute hqueue
|
|
||||||
if #self.hqueue > 0 then
|
|
||||||
local func = self.hqueue[1].func
|
|
||||||
if func(self) then
|
|
||||||
table.remove(self.hqueue,1)
|
|
||||||
self.lqueue = {}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- Execute lqueue
|
|
||||||
if #self.lqueue > 0 then
|
|
||||||
local func = self.lqueue[1]
|
|
||||||
if func(self) then
|
|
||||||
table.remove(self.lqueue,1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function sensors()
|
|
||||||
local timer = 2
|
|
||||||
local pulse = 1
|
|
||||||
return function(self)
|
|
||||||
timer=timer-self.dtime
|
|
||||||
if timer < 0 then
|
|
||||||
|
|
||||||
pulse = pulse + 1 -- do full range every third scan
|
|
||||||
local range = self.view_range
|
|
||||||
if pulse > 2 then
|
|
||||||
pulse = 1
|
|
||||||
else
|
|
||||||
range = self.view_range*0.5
|
|
||||||
end
|
|
||||||
|
|
||||||
local pos = self.object:get_pos()
|
|
||||||
--local tim = minetest.get_us_time()
|
|
||||||
self.nearby_objects = minetest.get_objects_inside_radius(pos, range)
|
|
||||||
--minetest.chat_send_all(minetest.get_us_time()-tim)
|
|
||||||
for i,obj in ipairs(self.nearby_objects) do
|
|
||||||
if obj == self.object then
|
|
||||||
table.remove(self.nearby_objects,i)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
timer=2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
------------
|
|
||||||
-- CALLBACKS
|
|
||||||
------------
|
|
||||||
|
|
||||||
function mobkit.default_brain(self)
|
|
||||||
if mobkit.is_queue_empty_high(self) then mobkit.hq_roam(self,0) end
|
|
||||||
end
|
|
||||||
|
|
||||||
function mobkit.statfunc(self)
|
|
||||||
local tmptab={}
|
|
||||||
tmptab.memory = self.memory
|
|
||||||
tmptab.hp = self.hp
|
|
||||||
tmptab.texture_no = self.texture_no
|
|
||||||
return minetest.serialize(tmptab)
|
|
||||||
end
|
|
||||||
|
|
||||||
function mobkit.actfunc(self, staticdata, dtime_s)
|
|
||||||
self.lqueue = {}
|
|
||||||
self.hqueue = {}
|
|
||||||
self.nearby_objects = {}
|
|
||||||
self.nearby_players = {}
|
|
||||||
self.pos_history = {}
|
|
||||||
self.path_dir = 1
|
|
||||||
self.time_total = 0
|
|
||||||
|
|
||||||
local sdata = minetest.deserialize(staticdata)
|
|
||||||
if sdata then
|
|
||||||
for k,v in pairs(sdata) do
|
|
||||||
self[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if self.timeout and self.timeout>0 and dtime_s > self.timeout and next(self.memory)==nil then
|
|
||||||
self.object:remove()
|
|
||||||
end
|
|
||||||
|
|
||||||
if not self.memory then -- this is the initial activation
|
|
||||||
self.memory = {}
|
|
||||||
|
|
||||||
-- texture variation
|
|
||||||
if #self.textures > 1 then self.texture_no = random(#self.textures) end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- apply texture
|
|
||||||
if self.texture_no then
|
|
||||||
local props = {}
|
|
||||||
props.textures = {self.textures[self.texture_no]}
|
|
||||||
self.object:set_properties(props)
|
|
||||||
end
|
|
||||||
|
|
||||||
--hp
|
|
||||||
self.hp = self.hp or (self.max_hp or 10)
|
|
||||||
--armor
|
|
||||||
if type(self.armor_groups) ~= 'table' then
|
|
||||||
self.armor_groups={}
|
|
||||||
end
|
|
||||||
self.armor_groups.immortal = 1
|
|
||||||
self.object:set_armor_groups(self.armor_groups)
|
|
||||||
|
|
||||||
self.oxygen = self.oxygen or self.lung_capacity
|
|
||||||
self.lastvelocity = {x=0,y=0,z=0}
|
|
||||||
self.height = self.collisionbox[5] - self.collisionbox[2]
|
|
||||||
self.sensefunc=sensors()
|
|
||||||
end
|
|
||||||
|
|
||||||
function mobkit.stepfunc(self,dtime) -- not intended to be modified
|
|
||||||
self.dtime = dtime
|
|
||||||
-- physics comes first
|
|
||||||
-- self.object:set_acceleration({x=0,y=mobkit.gravity,z=0})
|
|
||||||
local vel = self.object:get_velocity()
|
|
||||||
|
|
||||||
-- if self.lastvelocity.y == vel.y then
|
|
||||||
if abs(self.lastvelocity.y-vel.y)<0.001 then
|
|
||||||
self.isonground = true
|
|
||||||
else
|
|
||||||
self.isonground = false
|
|
||||||
end
|
|
||||||
|
|
||||||
-- dumb friction
|
|
||||||
if self.isonground then
|
|
||||||
self.object:set_velocity({x= vel.x> 0.2 and vel.x*mobkit.friction or 0,
|
|
||||||
y=vel.y,
|
|
||||||
z=vel.z > 0.2 and vel.z*mobkit.friction or 0})
|
|
||||||
end
|
|
||||||
|
|
||||||
-- bounciness
|
|
||||||
if self.springiness and self.springiness > 0 then
|
|
||||||
local vnew = vector.new(vel)
|
|
||||||
|
|
||||||
if not self.collided then -- ugly workaround for inconsistent collisions
|
|
||||||
for _,k in ipairs({'y','z','x'}) do
|
|
||||||
if vel[k]==0 and abs(self.lastvelocity[k])> 0.1 then
|
|
||||||
vnew[k]=-self.lastvelocity[k]*self.springiness
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not vector.equals(vel,vnew) then
|
|
||||||
self.collided = true
|
|
||||||
else
|
|
||||||
if self.collided then
|
|
||||||
vnew = vector.new(self.lastvelocity)
|
|
||||||
end
|
|
||||||
self.collided = false
|
|
||||||
end
|
|
||||||
|
|
||||||
self.object:set_velocity(vnew)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- buoyancy
|
|
||||||
local spos = mobkit.get_stand_pos(self)
|
|
||||||
spos.y = spos.y+0.01
|
|
||||||
-- get surface height
|
|
||||||
-- local surface = mobkit.get_node_pos(spos).y+0.5
|
|
||||||
local surface = nil
|
|
||||||
local snodepos = mobkit.get_node_pos(spos)
|
|
||||||
local surfnode = mobkit.nodeatpos(spos)
|
|
||||||
while surfnode and surfnode.drawtype == 'liquid' do
|
|
||||||
surface = snodepos.y+0.5
|
|
||||||
if surface > spos.y+self.height then break end
|
|
||||||
snodepos.y = snodepos.y+1
|
|
||||||
surfnode = mobkit.nodeatpos(snodepos)
|
|
||||||
end
|
|
||||||
if surface then -- standing in liquid
|
|
||||||
self.isinliquid = true
|
|
||||||
local submergence = min(surface-spos.y,self.height)
|
|
||||||
local balance = self.buoyancy*self.height
|
|
||||||
local buoyacc = mobkit.gravity*((balance - submergence)^2/balance^2*sign(balance - submergence))
|
|
||||||
self.object:set_acceleration({x=-vel.x,y=buoyacc-vel.y*abs(vel.y)*0.7,z=-vel.z})
|
|
||||||
else
|
|
||||||
self.isinliquid = false
|
|
||||||
self.object:set_acceleration({x=0,y=mobkit.gravity,z=0})
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- local footnode = mobkit.nodeatpos(spos)
|
|
||||||
-- local headnode
|
|
||||||
-- if footnode and footnode.drawtype == 'liquid' then
|
|
||||||
|
|
||||||
-- vel = self.object:get_velocity()
|
|
||||||
-- headnode = mobkit.nodeatpos(mobkit.pos_shift(spos,{y=self.height or 0})) -- TODO: height may be nil
|
|
||||||
-- local submergence = headnode.drawtype=='liquid'
|
|
||||||
-- and self.buoyancy-1
|
|
||||||
-- or (self.buoyancy*self.height-(1-(spos.y+0.5)%1))^2/(self.buoyancy*self.height)^2*sign(self.buoyancy*self.height-(1-(spos.y+0.5)%1))
|
|
||||||
|
|
||||||
-- local buoyacc = submergence * mobkit.gravity
|
|
||||||
-- self.object:set_acceleration({x=-vel.x,y=buoyacc-vel.y*abs(vel.y)*0.5,z=-vel.z})
|
|
||||||
|
|
||||||
-- end
|
|
||||||
|
|
||||||
if self.brainfunc then
|
|
||||||
-- vitals: fall damage
|
|
||||||
vel = self.object:get_velocity()
|
|
||||||
local velocity_delta = abs(self.lastvelocity.y - vel.y)
|
|
||||||
if velocity_delta > mobkit.safe_velocity then
|
|
||||||
self.hp = self.hp - floor((self.max_hp-100) * min(1, velocity_delta/mobkit.terminal_velocity))
|
|
||||||
end
|
|
||||||
|
|
||||||
-- vitals: oxygen
|
|
||||||
local headnode = mobkit.nodeatpos(mobkit.pos_shift(self.object:get_pos(),{y=self.collisionbox[5]})) -- node at hitbox top
|
|
||||||
if headnode and headnode.drawtype == 'liquid' then
|
|
||||||
self.oxygen = self.oxygen - self.dtime
|
|
||||||
else
|
|
||||||
self.oxygen = self.lung_capacity
|
|
||||||
end
|
|
||||||
|
|
||||||
if self.oxygen <= 0 then self.hp=0 end -- drown
|
|
||||||
|
|
||||||
|
|
||||||
self:sensefunc()
|
|
||||||
self:brainfunc()
|
|
||||||
execute_queues(self)
|
|
||||||
end
|
|
||||||
|
|
||||||
self.lastvelocity = self.object:get_velocity()
|
|
||||||
self.time_total=self.time_total+self.dtime
|
|
||||||
end
|
|
Loading…
Reference in New Issue