parent
849d06fe91
commit
b98a93508d
91
init.lua
91
init.lua
|
@ -125,6 +125,41 @@ end
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
mobs.iterate_registry = function ( source_pos, radius, height, classes )
|
||||||
|
local length = radius * radius
|
||||||
|
local class_id = next( classes )
|
||||||
|
local key
|
||||||
|
|
||||||
|
local function is_inside_area( obj )
|
||||||
|
-- perform fast length-squared distance check
|
||||||
|
local target_pos = obj:get_pos( )
|
||||||
|
local a = source_pos.x - target_pos.x
|
||||||
|
local b = source_pos.z - target_pos.z
|
||||||
|
|
||||||
|
return a * a + b * b <= length and abs( source_pos.y - target_pos.y ) <= height
|
||||||
|
end
|
||||||
|
|
||||||
|
return function ( )
|
||||||
|
while class_id and classes[ class_id ] do
|
||||||
|
local obj
|
||||||
|
|
||||||
|
key, obj = next( registry[ class_id ], key )
|
||||||
|
if obj then
|
||||||
|
if obj:get_hp( ) > 0 and is_inside_area( obj ) then
|
||||||
|
return obj
|
||||||
|
end
|
||||||
|
else
|
||||||
|
class_id = next( classes, class_id )
|
||||||
|
key = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------
|
||||||
|
|
||||||
local function node_locator( pos, size, time, color )
|
local function node_locator( pos, size, time, color )
|
||||||
if is_debug then
|
if is_debug then
|
||||||
minetest.add_particle( {
|
minetest.add_particle( {
|
||||||
|
@ -146,6 +181,15 @@ end
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
local function to_vector3d( length, yaw, pitch )
|
||||||
|
local y = sin( pitch ) * length
|
||||||
|
local length2 = cos( pitch ) * length
|
||||||
|
local x = -sin( yaw ) * length2
|
||||||
|
local z = cos( yaw ) * length2
|
||||||
|
|
||||||
|
return { x = x, y = y, z = z }, length2
|
||||||
|
end
|
||||||
|
|
||||||
local function normalize_angle( r )
|
local function normalize_angle( r )
|
||||||
-- stackoverflow.com/questions/1878907/the-smallest-difference-between-2-angles
|
-- stackoverflow.com/questions/1878907/the-smallest-difference-between-2-angles
|
||||||
return atan2( sin( r ), cos( r ) )
|
return atan2( sin( r ), cos( r ) )
|
||||||
|
@ -210,8 +254,8 @@ minetest.register_on_leaveplayer( function( player, is_timeout )
|
||||||
local name = player:get_player_name( )
|
local name = player:get_player_name( )
|
||||||
|
|
||||||
-- delete all target references (if applicable)
|
-- delete all target references (if applicable)
|
||||||
for id, this in pairs( registry.avatars ) do
|
for id, obj in pairs( registry.avatars ) do
|
||||||
if this.target == player then
|
if obj:get_luaentity( ).target == player then
|
||||||
this:reset_target( )
|
this:reset_target( )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -241,8 +285,8 @@ builtin_item.on_activate = function ( self, staticdata, dtime, id )
|
||||||
end
|
end
|
||||||
|
|
||||||
builtin_item.on_deactivate = function ( self, id )
|
builtin_item.on_deactivate = function ( self, id )
|
||||||
for id, this in pairs( registry.avatars ) do
|
for id, obj in pairs( registry.avatars ) do
|
||||||
if this.target == self.object then
|
if obj:get_luaentity( ).target == self.object then
|
||||||
this:reset_target( )
|
this:reset_target( )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -477,39 +521,6 @@ mobs.register_mob = function ( name, def )
|
||||||
return hunger > -self.hunger_offset
|
return hunger > -self.hunger_offset
|
||||||
end,
|
end,
|
||||||
|
|
||||||
iterate_registry = function ( self, radius, height, classes )
|
|
||||||
local length = radius * radius
|
|
||||||
local class_idx = 1
|
|
||||||
local key
|
|
||||||
|
|
||||||
local function is_inside_area( obj )
|
|
||||||
-- perform fast length-squared distance check
|
|
||||||
local target_pos = obj:get_pos( )
|
|
||||||
local a = self.pos.x - target_pos.x
|
|
||||||
local b = self.pos.z - target_pos.z
|
|
||||||
|
|
||||||
return a * a + b * b < length
|
|
||||||
end
|
|
||||||
|
|
||||||
return function ( )
|
|
||||||
while classes[ class_idx ] do
|
|
||||||
local obj
|
|
||||||
|
|
||||||
key, obj = next( classes[ class_idx ], key )
|
|
||||||
if obj then
|
|
||||||
if obj:get_hp( ) > 0 and is_inside_area( obj ) then
|
|
||||||
return obj
|
|
||||||
end
|
|
||||||
else
|
|
||||||
class_idx = class_idx + 1
|
|
||||||
key = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
fire_weapon = function ( self, target_pos )
|
fire_weapon = function ( self, target_pos )
|
||||||
local params = self.weapon_params
|
local params = self.weapon_params
|
||||||
|
|
||||||
|
@ -1047,7 +1058,7 @@ mobs.register_mob = function ( name, def )
|
||||||
end
|
end
|
||||||
|
|
||||||
-- when not upset, seek out food or prey at random intervals
|
-- when not upset, seek out food or prey at random intervals
|
||||||
for obj in self:iterate_registry( 30, 30, { registry.players, registry.spawnitems } ) do
|
for obj in mobs.iterate_registry( self.pos, 30, 30, { players = true, spawnitems = true } ) do
|
||||||
local target_pos = obj:get_pos( )
|
local target_pos = obj:get_pos( )
|
||||||
|
|
||||||
if self:is_paranoid( target_pos ) then
|
if self:is_paranoid( target_pos ) then
|
||||||
|
@ -1109,7 +1120,7 @@ mobs.register_mob = function ( name, def )
|
||||||
local drag = -new_vel.y * liquid_viscosity * 1.5
|
local drag = -new_vel.y * liquid_viscosity * 1.5
|
||||||
local buoyancy = self.density - liquid_density
|
local buoyancy = self.density - liquid_density
|
||||||
self.object:set_acceleration_vert( world_gravity * buoyancy + drag )
|
self.object:set_acceleration_vert( world_gravity * buoyancy + drag )
|
||||||
self.is_floating = true
|
|
||||||
elseif self.is_swimming then
|
elseif self.is_swimming then
|
||||||
self.object:set_acceleration_vert( ramp( world_gravity, new_vel.y, 2.0 ) ) -- hack to reduce oscilations
|
self.object:set_acceleration_vert( ramp( world_gravity, new_vel.y, 2.0 ) ) -- hack to reduce oscilations
|
||||||
end
|
end
|
||||||
|
@ -1123,7 +1134,7 @@ mobs.register_mob = function ( name, def )
|
||||||
end,
|
end,
|
||||||
|
|
||||||
on_activate = function ( self, staticdata, dtime_s, id )
|
on_activate = function ( self, staticdata, dtime_s, id )
|
||||||
registry.avatars[ id ] = self
|
registry.avatars[ id ] = self.object
|
||||||
|
|
||||||
self.object:set_armor_groups( { fleshy = self.armor } )
|
self.object:set_armor_groups( { fleshy = self.armor } )
|
||||||
self:set_acceleration_vert( self.gravity )
|
self:set_acceleration_vert( self.gravity )
|
||||||
|
|
Loading…
Reference in New Issue