fix shoot_raech and self attack

This commit is contained in:
nixnoxus 2024-03-03 10:15:44 +01:00
parent d40953b6f1
commit 0e4cc5ea44
1 changed files with 22 additions and 24 deletions

View File

@ -57,9 +57,9 @@ function mob_class:log2(msg, object)
local src = self.object
if object then
local dst = object
minetest.log("# " .. name(src) .. " " .. msg .. " " .. vector.distance(src:get_pos(), dst:get_pos()) .. " " .. name(dst))
minetest.log("# " .. msg .. " " .. name(src) .. " > " .. name(dst) .. " dist:" .. vector.distance(src:get_pos(), dst:get_pos()) .. " self:" .. dump(src == dst))
else
minetest.log("# " .. name(src) .. " " .. msg .. " ")
minetest.log("# " .. msg .. " " .. name(src))
end
end
@ -390,7 +390,8 @@ function mob_class:monster_attack()
player = obj.object
name = obj.name or ""
end
if obj and obj.type == self.type and obj.passive == false and obj.state == "attack" and obj.attack then
if obj and obj.type == self.type and obj.passive == false and obj.state == "attack" and obj.attack and self.object ~= obj.attack then
self:log2("add blacklist",obj.attack)
table.insert(blacklist_attack, obj.attack)
end
end
@ -416,8 +417,10 @@ function mob_class:monster_attack()
end
end
-- find specific mob to attack, failing that attack player/npc/animal
if specific_attack(self.specific_attack, name)
and self.object ~= player
and (type == "player" or ( type == "npc" and self.attack_npcs )
or (type == "animal" and self.attack_animals == true)
or (self.extra_hostile and not self.attack_exception(player))) then
@ -446,14 +449,19 @@ function mob_class:monster_attack()
end
end
if not min_player and #blacklist_attack > 0 then
self:log2("pre OOPS monster_attack -> do_attack", min_player)
min_player=blacklist_attack[math.random(#blacklist_attack)]
end
-- attack player
if min_player then
if self.object == min_player then
self:log2("OOPS monster_attack -> do_attack", min_player)
else
self:log2("monster_attack -> do_attack", min_player)
self:do_attack(min_player)
end
end
end
-- npc, find closest monster to attack
@ -576,6 +584,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir)
return
end
self:log2("on_punch", hitter)
-- custom punch function
if self.do_punch then
@ -841,14 +850,14 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir)
and obj.owner ~= name then
if obj.name == self.name then
--minetest.log("on_punch0 -> do_attack")
obj:log2("on_punch[0] -> do_attack", hitter)
obj:log2("group on_punch[0] -> do_attack", hitter)
obj:do_attack(hitter)
elseif type(obj.group_attack) == "table" then
for i=1, #obj.group_attack do
if obj.group_attack[i] == self.name then
obj._aggro = true
--minetest.log("on_punch1 -> do_attack")
obj:log2("on_punch[1] -> do_attack", hitter)
obj:log2("group on_punch[1] -> do_attack", hitter)
obj:do_attack(hitter)
break
end
@ -1029,7 +1038,7 @@ function mob_class:do_states_attack (dtime)
end
elseif self.attack_type == "dogfight"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2) and (dist >= self.avoid_distance or not self.shooter_avoid_enemy)
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2 and (dist >= self.avoid_distance or not self.shooter_avoid_enemy))
or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then
if self.fly
@ -1169,19 +1178,19 @@ function mob_class:do_states_attack (dtime)
s2.y = s2.y + .5
if self:line_of_sight( p2, s2) == true then
minetest.log("shoot3 " .. self.reach .. " < " .. dist .. "<" .. self.shoot_reach
minetest.log("dogfight2 " .. dist .. "<" .. self.reach
.. " sae:".. dump(self.shooter_avoid_enemy)
.. " sa:" .. dump(self.shoot_arrow and true or false))
self:mob_sound("attack")
self:log2("do_state_attack", self.attack)
-- punch player (or what player is attached to)
local attached = self.attack:get_attach()
if attached then
self.attack = attached
end
self:log2("do_state_attack", self.attack)
self.attack:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = self.damage}
@ -1197,26 +1206,15 @@ function mob_class:do_states_attack (dtime)
end
end
end
--[[
elseif self.attack_type == "dogfight"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2) and (dist >= self.avoid_distance or not self.shooter_avoid_enemy)
or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then
--]]
--[[
elseif dist < self.shoot_reach and (self.attack_type == "shoot"
elseif dist <= self.shoot_reach and (self.attack_type == "shoot"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 1)
or (self.attack_type == "dogshoot" and (dist > self.reach or dist < self.avoid_distance and self.shooter_avoid_enemy) and self:dogswitch() == 0)) then
]]--
elseif self.attack_type == "shoot"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 1)
or (self.attack_type == "dogshoot" and (dist > self.reach or dist < self.avoid_distance and self.shooter_avoid_enemy) and self:dogswitch() == 0) then
or (self.attack_type == "dogshoot" and ((dist > self.reach or dist < self.avoid_distance) and self.shooter_avoid_enemy) and self:dogswitch() == 0)) then
p.y = p.y - .5
s.y = s.y + .5
--#self:log2("shoot 3", object)
minetest.log("shoot3 " .. self.reach .. " < " .. dist .. "<" .. self.shoot_reach
minetest.log("shoot3 " .. dist .. "<=" .. self.shoot_reach
.. " sae:".. dump(self.shooter_avoid_enemy)
.. " sa:" .. dump(self.shoot_arrow and true or false))
local dist = vector.distance(p, s)