--================= NPC Firearm đứng nguyên =================--
--Xử lý OnUpdate các NPC có variable "npcQuestRifleAiming"
--NPC Firearm sẽ đứng yên, bắn, thay đạn, gỡ kẹt đạn
--Target tất cả zombie không phải là NPC của mod này
--===========================================================--

if isServer() then return end

--require "vl_quest_npc_client"
require "vl_quest_utils"
require "vl_quest_zombie_npc_utils"

assert(VLZB, "Stack trace: Missing dependency: VLZB - vl_npc_firearm.lua")

local GetZombieOnlineIDorUID = VLZB.GetZombieOnlineIDorUID
local GetZombiesNotNPCInRange = VLZB.GetZombiesNotNPCInRange
local IsCharExistAndAlive = VLZB.IsCharExistAndAlive

local function GetZombieTargetAndDistance(zNPC, minRange, maxRange)
    local target, dist
    local list = GetZombiesNotNPCInRange(zNPC, minRange, maxRange)
    if list and not (#list == 0) then
        --Lấy list zombie có thể nhìn thấy và list zombie nhìn thấy trong khoảng cách 9 ô         
        local nearTargets, allTargets = {}, {}
        for _, data in ipairs(list) do 
            if data and data.zombie and zNPC:CanSee(data.zombie) then
                if data.dist <= 9 then
                    table.insert(nearTargets, {zombie = data.zombie, dist = data.dist})
                else
                    table.insert(allTargets, {zombie = data.zombie, dist = data.dist})
                end
            end
        end

        --Chọn mục tiêu ngẫu nhiên. Ưu tiên mục tiêu trong 9 ô
        local t
        if #nearTargets > 0 then
            t = nearTargets[ZombRand(#nearTargets) + 1]
        elseif #allTargets > 0 then
            t = allTargets[ZombRand(#allTargets) + 1]
        end
        if t and t.zombie then
            target = t.zombie
            dist = t.dist
        end
    end
    return target, dist
end

--Chạy trong Events.OnZombieUpdate.Remove(OnZombieNPCUpdate) để update NPC Firearm
function VLF.UpdateRifleNPC(zNPC, npcID, qStep, zData)
    local npcData = VLF.npcData[qStep]
    --Yêu cầu server xử lý đồng bộ NPC Shoot zombie
    if not zData.requestedNPCShootZ then  --Giới hạn NPC chỉ có 1 mục tiêu trong cùng thời điểm. Reset sau khi mục tiêu zombie chết 60 tick
        if zNPC:getActionStateName() == "idle" then
            local wpnFullType = npcData.rifleType
            local weapon = getScriptManager():getItem(wpnFullType)
            local maxRange = weapon and weapon:getMaxRange() or 10
            
            --chọn mục tiêu
            local target, dist = GetZombieTargetAndDistance(zNPC, 2, maxRange)
            
            if IsCharExistAndAlive(zNPC) and IsCharExistAndAlive(target) and zNPC:CanSee(target) then
                zData.requestedNPCShootZ = true
                zNPC:faceThisObject(target)
                
                --yêu cầu server xử lý NPC shoot zombie đồng bộ các client
                local targetID = GetZombieOnlineIDorUID(target)
                local player = getPlayer()
                if player then
                    sendClientCommand(player, "NPCFirearmCM", "RequestNPCShootZombie", {qStep = qStep, npcID = npcID, targetID = targetID, wpnFullType = wpnFullType, dist = dist})
                end
            else
                --zNPC:faceThisObject(player) --FIXME: xoay quanh để cảnh giới
                zData.requestedNPCShootZ = nil
            end
        else
            zData.requestedNPCShootZ = nil
        end
    end
end
--Events.OnZombieUpdate.Remove(VLF.UpdateRifleNPC)
--Events.OnZombieUpdate.Add(VLF.UpdateRifleNPC)














