--TƯƠNG THÍCH VỚI MOD Bandits NPC --mod ID = Bandits2
--1, NPC Quest không nhận điều khiển từ OnZombieUpdate của Bandits NPC mod 
--2, NPC Quest bị biến thành zombie khi infected Không bị ảnh hưởng bởi Bandits NPC mod 


require "BanditZombie"
require "BanditUpdate"
require "BanditUtils"

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

BanditZombie = BanditZombie or {}
BanditZombie.Cache = BanditZombie.Cache or {}
BanditZombie.CacheLight = BanditZombie.CacheLight or {}
BanditZombie.CacheLightZ = BanditZombie.CacheLightZ or {}
BanditZombie.CacheLightB = BanditZombie.CacheLightB or {}
BanditUtils = BanditUtils or {}

local Cache
local CacheLight
local CacheLightZ
local CacheLightB
local GetZombieID_BanditsNPC
local hasBanditsNPC

local GetZombieOnlineIDorUID = VLZB.GetZombieOnlineIDorUID
local GetQuestGlobalModData = VLGMD.GetQuestGlobalModData
local RemoveNPCQuest = VLZB.RemoveNPCQuest
local GetZombieModDataQuest = VLZB.GetZombieModDataQuest

local function removeZombieFromCaches(id)
    Cache[id] = nil
    CacheLight[id] = nil
    CacheLightB[id] = nil
    CacheLightZ[id] = nil
end

local function HasMod_BanditsNPC()
	if getActivatedMods():contains("\\Bandits2") or getActivatedMods():contains("\\KnoxEventExpandedNpc") then --Đang active mod Bandits NPC | và thử cả KnoxEventExpandedNpc
		Cache        = BanditZombie.Cache
		CacheLight   = BanditZombie.CacheLight
		CacheLightZ  = BanditZombie.CacheLightZ
		CacheLightB  = BanditZombie.CacheLightB
		GetZombieID_BanditsNPC = BanditUtils.GetZombieID
		hasBanditsNPC = true
        print("Client---HasMod_BanditsNPC or KnoxEventExpandedNpc= ", hasBanditsNPC)
    end
end
Events.OnGameStart.Remove(HasMod_BanditsNPC)
Events.OnGameStart.Add(HasMod_BanditsNPC)

local function ZombieNPCUpdate_BanditsNPC(zombie)
	if not hasBanditsNPC then
		Events.OnZombieUpdate.Remove(ZombieNPCUpdate_BanditsNPC)
		return
	end
	
	local zID = GetZombieOnlineIDorUID(zombie)
    local questMD = GetQuestGlobalModData(nil)
    local qStep = questMD.NPCqStep[zID]
    if not qStep then return end
	
	local npcData = VLF.npcData[qStep]
	--Nếu zombie đang có variable của NPC Quest | hoặc NPC turnToZombie == true (NPC chuẩn bị biến thành zombie vì infected)
	if zombie:getVariableBoolean(npcData.variable) == true or (zombie:getVariableBoolean(npcData.variable) == false and not questMD.NPC[qStep]["turnToZombie"]) then
		local id = GetZombieID_BanditsNPC(zombie)
        if id then
			removeZombieFromCaches(id) --xóa data chạy bên Bandits NPC mod
			zombie:setUseless(true)
			--zombie:setNoTeeth(true)
			zombie:setTarget(nil)
			zombie:setIgnoreMovement(true)
			zombie:clearAggroList()
			
			local banditData = zombie:getModData()
			banditData.zid = nil --Xóa zid của BanditsNPC mod --FIXME
			banditData.brain = nil --Xóa brain của BanditsNPC mod --FIXME
			
			--luôn tele zombie tới vị trí spawn
			local zData = GetZombieModDataQuest(zombie)
			local spawnPoint = zData.spawnPoint
            if spawnPoint then
				local x, y, z = spawnPoint:getX(), spawnPoint:getY(), spawnPoint:getZ()
				
				--Không cho NPC di chuyển
				if zombie:getZ() == z then
					zombie:teleportTo(spawnPoint:getX(), spawnPoint:getY(), spawnPoint:getZ())
				else
					--Nếu NPC rơi xuống tầng dưới thì biến mất
					if math.abs(z - zombie:getZ()) >= 1 then
						RemoveNPCQuest(zombie)
					end
				end
			end
		end
	end
	
end
Events.OnZombieUpdate.Remove(ZombieNPCUpdate_BanditsNPC)
Events.OnZombieUpdate.Add(ZombieNPCUpdate_BanditsNPC)
