201 lines
6.9 KiB
Lua
201 lines
6.9 KiB
Lua
--------------------
|
|
-- Mob Core Logic --
|
|
--------------------
|
|
------ Ver 0.1 -----
|
|
|
|
-- Defend Owner --
|
|
|
|
minetest.register_on_mods_loaded(function()
|
|
for name, def in pairs(minetest.registered_entities) do
|
|
if minetest.registered_entities[name].logic
|
|
or minetest.registered_entities[name].brainfunc then
|
|
local old_punch = def.on_punch
|
|
if not old_punch then
|
|
old_punch = function() end
|
|
end
|
|
local on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
|
|
old_punch(self, puncher, time_from_last_punch, tool_capabilities, dir)
|
|
local pos = self.object:get_pos()
|
|
if not pos then
|
|
return
|
|
end
|
|
local objects = minetest.get_objects_inside_radius(pos, 32)
|
|
for _, object in ipairs(objects) do
|
|
if object:get_luaentity()
|
|
and mob_core.is_mobkit_mob(object) then
|
|
local entity = object:get_luaentity()
|
|
if object ~= self.object
|
|
and entity.defend_owner
|
|
and entity.owner
|
|
and entity.owner == puncher:get_player_name() then
|
|
entity.owner_target = self.object
|
|
end
|
|
end
|
|
end
|
|
end
|
|
def.on_punch = on_punch
|
|
minetest.register_entity(":"..name, def)
|
|
end
|
|
end
|
|
end)
|
|
|
|
-------------
|
|
-- Runaway --
|
|
-------------
|
|
|
|
function mob_core.logic_runaway_player(self, prty) -- Runaway from player
|
|
local player = mobkit.get_nearby_player(self)
|
|
if player and vector.distance(self.object:get_pos(), player:get_pos()) < self.view_range then
|
|
if player:get_player_name() ~= self.owner then
|
|
mobkit.hq_runfrom(self,prty,player)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function mob_core.logic_runaway_mob(self, prty, tbl) -- Runaway from specified mobs
|
|
tbl = tbl or self.runaway_from
|
|
if tbl then
|
|
for i = 1, #tbl do
|
|
local runaway_mob = mobkit.get_closest_entity(self, tbl[i])
|
|
if runaway_mob and vector.distance(self.object:get_pos(), runaway_mob:get_pos()) < self.view_range then
|
|
mobkit.hq_runfrom(self, prty, runaway_mob)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
------------
|
|
-- Attack --
|
|
------------
|
|
|
|
function mob_core.logic_attack_player(self, prty, player) -- Attack player
|
|
player = player or mobkit.get_nearby_player(self)
|
|
if player
|
|
and vector.distance(self.object:get_pos(), player:get_pos()) < self.view_range
|
|
and mobkit.is_alive(player) then
|
|
mob_core.hq_hunt(self,prty,player)
|
|
return
|
|
end
|
|
return
|
|
end
|
|
|
|
function mob_core.logic_attack_mob(self, prty, target) -- Attack specified mobs
|
|
if not mobkit.exists(target) then return true end
|
|
if target
|
|
and vector.distance(self.object:get_pos(), target:get_pos()) < self.view_range
|
|
and mobkit.is_alive(target) then
|
|
if not mob_core.shared_owner(self, target) then
|
|
mob_core.hq_hunt(self, prty, target)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function mob_core.logic_attack_mobs(self, prty, tbl) -- Attack specified mobs
|
|
tbl = tbl or self.targets
|
|
if tbl then
|
|
for i = 1, #tbl do
|
|
local target = mobkit.get_closest_entity(self, tbl[i])
|
|
if target
|
|
and vector.distance(self.object:get_pos(), target:get_pos()) < self.view_range
|
|
and mobkit.is_alive(target) then
|
|
if (self.tamed == true and target:get_luaentity().owner ~= self.owner)
|
|
or not self.tamed then
|
|
mob_core.hq_hunt(self,prty,target)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mob_core.logic_aqua_attack_player(self, prty, player) -- Attack player
|
|
player = player or mobkit.get_nearby_player(self)
|
|
if player
|
|
and vector.distance(self.object:get_pos(), player:get_pos()) < self.view_range
|
|
and mobkit.is_alive(player)
|
|
and mobkit.is_in_deep(player) then
|
|
mob_core.hq_aqua_attack(self,prty,player,self.max_speed)
|
|
return
|
|
end
|
|
end
|
|
|
|
function mob_core.logic_aqua_attack_mob(self, prty, target) -- Attack specified mobs
|
|
if not mobkit.exists(target) then return true end
|
|
if target
|
|
and vector.distance(self.object:get_pos(), target:get_pos()) < self.view_range
|
|
and mobkit.is_alive(target) then
|
|
if not mob_core.shared_owner(self, target) then
|
|
mob_core.hq_aqua_attack(self, prty, target, 1)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function mob_core.logic_aqua_attack_mobs(self, prty, tbl) -- Attack specified mobs
|
|
tbl = tbl or self.targets
|
|
if tbl then
|
|
for i = 1, #tbl do
|
|
local target = mobkit.get_closest_entity(self, tbl[i])
|
|
if target
|
|
and vector.distance(self.object:get_pos(), target:get_pos()) < self.view_range
|
|
and mobkit.is_alive(target)
|
|
and mobkit.is_in_deep(target) then
|
|
if (self.tamed == true and target:get_luaentity().owner ~= self.owner)
|
|
or not self.tamed then
|
|
mob_core.hq_aqua_attack(self,prty,target,self.max_speed)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--------------
|
|
-- Run From --
|
|
--------------
|
|
|
|
function mob_core.logic_aerial_takeoff_flee_mobs(self, prty, lift_force) -- Attack specified mobs
|
|
if self.runaway_from then
|
|
for i = 1, #self.runaway_from do
|
|
local runfrom = mobkit.get_closest_entity(self, self.runaway_from[i])
|
|
if runfrom and runfrom.owner ~= self.owner then
|
|
return
|
|
end
|
|
if runfrom and vector.distance(self.object:get_pos(), runfrom:get_pos()) < 8 then
|
|
mob_core.hq_takeoff(self, prty, lift_force)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mob_core.logic_aerial_takeoff_flee_player(self, prty, lift_force) -- Attack specified mobs
|
|
local player = mobkit.get_nearby_player(self)
|
|
if player and vector.distance(self.object:get_pos(), player:get_pos()) < 8 then
|
|
mob_core.hq_takeoff(self, prty, lift_force)
|
|
return
|
|
end
|
|
end
|
|
|
|
------------------------
|
|
-- Randomly drop item --
|
|
------------------------
|
|
|
|
function mob_core.random_drop(self, interval, chance, item)
|
|
self.drop_timer = (self.drop_timer or 0) + 1
|
|
if self.drop_timer >= interval then
|
|
self.droptimer = 0
|
|
if math.random(1, chance) == 1 then
|
|
local pos = self.object:get_pos()
|
|
minetest.add_item(pos, item)
|
|
minetest.sound_play("default_place_node_hard", {
|
|
pos = pos,
|
|
gain = 1.0,
|
|
max_hear_distance = 5,
|
|
})
|
|
end
|
|
end
|
|
end |