-- zombieSys_client.lua СТОРОНА КЛИЕНТА

-- Функция поведения NPC на спавне
function idleOnSpawnNPC()
	for _, NPC in ipairs(getElementsByType("ped")) do
		if getElementData(NPC, "isZombie") and getElementData(NPC, "isIdleOnSpawn") then -- Проверка, является ли NPC зомби и находится ли он в состоянии покоя на спавне
			local spawnX = getElementData(NPC, "spawnX")
			local spawnY = getElementData(NPC, "spawnY")
			local spawnZ = getElementData(NPC, "spawnZ")
			local nx, ny, nz = getElementPosition(NPC)

			if math.random() < 0.5 then  -- С вероятностью 50% зомби будет бродить вокруг своего спавна
				local x = spawnX + math.random() * 2 - 1  -- Добавляем случайный сдвиг по X
				local y = spawnY + math.random() * 2 - 1  -- Добавляем случайный сдвиг по Y
				local rotation = math.atan2(y - ny, x - nx) * 180 / math.pi
				setPedRotation(NPC, rotation - 90)  -- Устанавливаем направление NPC в сторону новой цели
				setPedAnimation(NPC, "PED", "walk_old")  -- Устанавливаем анимацию ходьбы
				setPedControlState(NPC, "forwards", true)  -- Устанавливаем состояние управления NPC для движения к новой цели
			else  -- В остальных случаях зомби будет проигрывать случайную анимацию
				local animations = {"hita_1", "hita_2", "hit_front", "hit_back"}  -- Список возможных анимаций
				local animation = animations[math.random(#animations)]  -- Выбираем случайную анимацию
				setPedAnimation(NPC, "PED", animation, -1, true, false, false, false)  -- Применяем выбранную анимацию
			end
		end
	end
end
setTimer(idleOnSpawnNPC, 1000, 0) -- Обновляем поведение NPC на спавне каждую секунду

-- Создаем функцию для движения NPC
function moveNPC()
    for _, NPC in ipairs(getElementsByType("ped")) do
        local spawnX = getElementData(NPC, "spawnX")
        local spawnY = getElementData(NPC, "spawnY")
        local spawnZ = getElementData(NPC, "spawnZ")

        for _, player in ipairs(getElementsByType("player")) do
			if getElementData(NPC, "isZombie") then  -- Проверка, является ли NPC зомби
				if not isElement(player) then return end  -- Проверка наличия игрока
				if isPedDead(player) then return end  -- Проверка жив ли игрок

				local px, py, pz = getElementPosition(player)
				local nx, ny, nz = getElementPosition(NPC)
				local distance = getDistanceBetweenPoints3D(px, py, pz, nx, ny, nz)
				local isFollowing = getElementData(NPC, "isFollowing")
				local isAttacking = getElementData(NPC, "isAttacking")

				if distance <= 8 and not isFollowing and not isAttacking then  -- Если игрок находится в радиусе 8 метров, NPC еще не следует за игроком и не атакует
					setElementData(NPC, "isFollowing", player)  -- Устанавливаем, что NPC следует за игроком
					setElementData(NPC, "isIdleOnSpawn", false)  -- Устанавливаем, что NPC больше не находится в состоянии покоя на спавне
					playSound3D("sound/s_zombie_see.wav", nx, ny, nz)  -- Воспроизводим звук, когда NPC замечает игрока
				elseif distance > 15 and isFollowing == player then  -- Если игрок находится дальше, чем на 15 метров и NPC следует за этим игроком
					setElementData(NPC, "isFollowing", nil)  -- Устанавливаем, что NPC больше не следует за игроком
					setElementData(NPC, "isIdleOnSpawn", true)  -- Устанавливаем, что NPC возвращается в состояние покоя на спавне
					setElementData(NPC, "isAttacking", false)  -- Устанавливаем, что NPC больше не атакует
				end

				if isFollowing == player and not isAttacking then  -- Если NPC следует за игроком и не атакует
					local rotation = math.atan2(py - ny, px - nx) * 180 / math.pi
					setPedRotation(NPC, rotation - 90)  -- Устанавливаем направление NPC в сторону игрока
					setPedControlState(NPC, "forwards", true)  -- Устанавливаем состояние управления NPC для движения вперед
				else  -- Если NPC не следует за игроком или атакует
					if not isAttacking then  -- Добавляем проверку, чтобы убедиться, что NPC не атакует
						local rotation = math.atan2(spawnY - ny, spawnX - nx) * 180 / math.pi
						setPedRotation(NPC, rotation - 90)  -- Устанавливаем направление NPC в сторону начальных координат
						if getDistanceBetweenPoints3D(nx, ny, nz, spawnX, spawnY, spawnZ) > 1 then  -- Если NPC находится дальше, чем на 1 метр от начальных координат
							setPedAnimation(NPC, "PED", "walk_old")  -- Устанавливаем анимацию ходьбы
							setPedControlState(NPC, "forwards", true)  -- Устанавливаем состояние управления NPC для движения обратно к начальным координатам
						else
							setPedControlState(NPC, "forwards", false)  -- Если NPC достаточно близко к начальным координатам, останавливаем его
						end
					end
				end
			end
		end
    end
end
setTimer(moveNPC, 500, 0)  -- Перемещаем NPC каждые 0.5 секунды

-- Создаем функцию для атаки NPC
function attackNPC()
    local peds = getElementsByType("ped")
    local players = getElementsByType("player")
    
    for _, NPC in ipairs(peds) do
        local nx, ny, nz = getElementPosition(NPC)
        local isAttacking = getElementData(NPC, "isAttacking")
        
        for _, player in ipairs(players) do
            if isElement(player) and not isPedDead(player) then  -- Проверяем, существует ли игрок и жив ли он
				if getElementData(NPC, "isZombie") then  -- Проверка, является ли NPC зомби
					local px, py, pz = getElementPosition(player)
					local distance = getDistanceBetweenPoints3D(px, py, pz, nx, ny, nz)
					local isFollowing = getElementData(NPC, "isFollowing") == player

					if distance <= 1.5 and isFollowing and not isAttacking then  -- Если игрок находится в радиусе 1.5 метров, NPC следует за игроком и не атакует
						setElementData(NPC, "isAttacking", true)  -- Устанавливаем, что NPC атакует
						setPedControlState(NPC, "fire", true)  -- Имитируем атаку кулаком
						setTimer(function()  -- Задаем таймер, чтобы NPC прекратил атаку через 1 секунду
							setPedControlState(NPC, "fire", false)
							setElementData(NPC, "isAttacking", false)
						end, 1000, 1)
						createProjectile(NPC, 16, nx, ny, nz)  -- Создаем метательное оружие (кулак)
					end
				end
            end
        end
    end
end
setTimer(attackNPC, 1000, 0)  -- Атакуем каждую секунду

Придумай 5 нововведений в функцию moveNPC и выдай эти нововведений в виде кода