diff --git a/api/api.lua b/api/api.lua index 5262e30..de9b443 100644 --- a/api/api.lua +++ b/api/api.lua @@ -524,4 +524,60 @@ function better_fauna.on_activate(self, staticdata, dtime_s) self.breeding = mobkit.recall(self, "breeding") or false self.breeding_time = mobkit.recall(self, "breeding_time") or 0 self.breeding_cooldown = mobkit.recall(self, "breeding_cooldown") or 0 -end \ No newline at end of file +end + +------------- +-- Physics -- +------------- + +function better_fauna.lightweight_physics(self) + local vel = self.object:get_velocity() + if self.isonground and not self.isinliquid 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 + if self.springiness and self.springiness > 0 then + local vnew = vector.new(vel) + + if not self.collided then + 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 + local surface = nil + local surfnodename = nil + local spos = mobkit.get_stand_pos(self) + spos.y = spos.y+0.01 + local snodepos = mobkit.get_node_pos(spos) + local surfnode = mobkit.nodeatpos(spos) + while surfnode and surfnode.drawtype == 'liquid' do + surfnodename = surfnode.name + surface = snodepos.y+0.5 + if surface > spos.y+self.height then break end + snodepos.y = snodepos.y+1 + surfnode = mobkit.nodeatpos(snodepos) + end + self.isinliquid = surfnodename + if surface then + local submergence = min(surface-spos.y,self.height)/self.height + local buoyacc = mobkit.gravity*(self.buoyancy-submergence) + mobkit.set_acceleration(self.object, + {x=-vel.x*self.water_drag,y=buoyacc-vel.y*abs(vel.y)*0.4,z=-vel.z*self.water_drag}) + else + self.object:set_acceleration({x=0,y=-2.8,z=0}) + end +end