-- Сторона клиента

-- Создаем переменные для хранения координат маркеров и их ID
local marker1 = {x = 1262.9248046875, y = -2025.0537109375, z = 59.336345672607, id = "infoaboutserver"}
local marker2 = {x = 1271.0048828125, y = -2025.578125, z = 59.095985412598, id = "infoaboutwork"}

-- Создаем маркеры на карте с помощью функции createMarker
local marker1Element = createMarker(marker1.x, marker1.y, marker1.z, "cylinder", 1.5, 255, 0, 0, 150)
local marker2Element = createMarker(marker2.x, marker2.y, marker2.z, "cylinder", 1.5, 255, 0, 0, 150)

-- Создаем переменные для хранения текста, который будет отображаться в окне DxGUI
local marker1Text = "Добро пожаловать на наш увлекательный сервер жанра выживания в зомби-апокалипсисе, сейчас мы начнём небольшое обучение тому, как играть здесь и выживать, что самое главное"
local marker2Text = "Это заброшенная деревня, здесь вы можете найти множество интересных и важных артефактов, скрытых персональных заданий и получить большой опыт. Но будьте осторожны, опасность подстерегает вас за каждым углом"

-- Создаем переменную для хранения текущего маркера, с которым взаимодействует игрок
local currentMarker = nil

-- Создаем функцию для отрисовки окна DxGUI с информацией о маркере
local function drawMarkerInfo()
	-- Проверяем, что текущий маркер существует
	if currentMarker then
		-- Проверяем, что локальный игрок существует
		if isElement(localPlayer) then
			-- Получаем размеры экрана
			local screenWidth, screenHeight = guiGetScreenSize()
			-- Вычисляем размеры и координаты окна DxGUI
			local windowWidth = screenWidth * 0.5 -- 50% от ширины экрана
			local windowHeight = screenHeight * 0.3 -- 30% от высоты экрана
			local windowX = (screenWidth - windowWidth) / 2 -- центрируем по горизонтали
			local windowY = (screenHeight - windowHeight) / 2 -- центрируем по вертикали
			-- Вычисляем размеры и координаты текста
			local textWidth = windowWidth * 0.9 -- 90% от ширины окна
			local textHeight = windowHeight * 0.7 -- 70% от высоты окна
			local textX = windowX + (windowWidth - textWidth) / 2 -- центрируем по горизонтали
			local textY = windowY + (windowHeight - textHeight) / 2 -- центрируем по вертикали
			-- Вычисляем размеры и координаты кнопки
			local buttonWidth = windowWidth * 0.2 -- 20% от ширины окна
			local buttonHeight = windowHeight * 0.1 -- 10% от высоты окна
			local buttonX = windowX + (windowWidth - buttonWidth) / 2 -- центрируем по горизонтали
			local buttonY = windowY + windowHeight * 0.8 -- располагаем внизу окна
			-- Рисуем окно DxGUI с помощью функции dxDrawRectangle
			dxDrawRectangle(windowX, windowY, windowWidth, windowHeight, tocolor(0, 0, 0, 200)) -- черный цвет с прозрачностью 200
			-- Рисуем текст с помощью функции dxDrawText
			dxDrawText(currentMarker.text, textX, textY, textX + textWidth, textY + textHeight, tocolor(255, 255, 255, 255), 1, "default", "center", "center", true, true) -- белый цвет, размер 1, шрифт по умолчанию, выравнивание по центру, перенос по словам, клиппинг
			-- Рисуем кнопку с помощью функции dxDrawRectangle
			dxDrawRectangle(buttonX, buttonY, buttonWidth, buttonHeight, tocolor(255, 0, 0, 200)) -- красный цвет с прозрачностью 200
			-- Рисуем текст на кнопке с помощью функции dxDrawText
			dxDrawText("ПОНЯЛ", buttonX, buttonY, buttonX + buttonWidth, buttonY + buttonHeight, tocolor(255, 255, 255, 255), 1, "default", "center", "center") -- белый цвет, размер 1, шрифт по умолчанию, выравнивание по центру
			-- Добавляем координаты кнопки к атрибутам текущего маркера
			currentMarker.buttonX = buttonX
			currentMarker.buttonY = buttonY
			currentMarker.buttonWidth = buttonWidth
			currentMarker.buttonHeight = buttonHeight
		end
	end
end

-- Создаем функцию для обработки события onClientMarkerHit, когда игрок входит в маркер
local function onMarkerHit(hitElement, matchingDimension)
    -- Проверяем, что элемент, вошедший в маркер, это игрок и он находится в том же измерении, что и маркер
	if hitElement == localPlayer and matchingDimension then
		-- Проверяем, что игрок не находится в транспортном средстве
		if not isPedInVehicle(localPlayer) then
			-- Проверяем, какой маркер был активирован
			if source == marker1Element then
				-- Устанавливаем текущий маркер равным первому маркеру
				currentMarker = marker1
			elseif source == marker2Element then
				-- Устанавливаем текущий маркер равным второму маркеру
				currentMarker = marker2
			end
			-- Добавляем текст к текущему маркеру в зависимости от его ID
			if currentMarker.id == "infoaboutserver" then
				currentMarker.text = marker1Text
			elseif currentMarker.id == "infoaboutwork" then
				currentMarker.text = marker2Text
			end
			-- Добавляем обработчик события onClientRender, чтобы отрисовывать окно DxGUI
			addEventHandler("onClientRender", root, drawMarkerInfo)
			-- Включаем курсор мыши
			showCursor(true)
		end
	end
end

local function onMarkerLeave(leftElement, matchingDimension)
	-- Проверяем, что элемент, покинувший маркер, это игрок и он находится в том же измерении, что и маркер
    if leftElement == localPlayer and matchingDimension then
		-- Удаляем обработчик события onClientRender
        removeEventHandler("onClientRender", root, drawMarkerInfo)
		-- Выключаем курсор мыши
        showCursor(false)
		-- Обнуляем текущий маркер
        currentMarker = nil
    end
end

-- Создаем функцию для обработки события onClientMarkerLeave, когда игрок выходит из маркера
local function onClick(button, state, absoluteX, absoluteY)
    -- Проверяем, что кнопка мыши это левая и состояние это нажатие
    if button == "left" and state == "down" then
        -- Проверяем, что текущий маркер существует
        if currentMarker then
            -- Получаем координаты кнопки из атрибутов текущего маркера
            local buttonX = currentMarker.buttonX
            local buttonY = currentMarker.buttonY
            local buttonWidth = currentMarker.buttonWidth
            local buttonHeight = currentMarker.buttonHeight
            -- Проверяем, что координаты клика мыши попадают в область кнопки
            if absoluteX >= buttonX and absoluteX <= buttonX + buttonWidth and absoluteY >= buttonY and absoluteY <= buttonY + buttonHeight then
                outputChatBox("Вы нажали на кнопку", localPlayer, 255, 255, 255)
                -- Удаляем обработчик события onClientRender, чтобы перестать отрисовывать окно DxGUI
                removeEventHandler("onClientRender", root, drawMarkerInfo)
                -- Выключаем курсор мыши
                showCursor(false)
                -- Обнуляем текущий маркер
                currentMarker = nil
            end
        end
    end
end
addEventHandler("onClientClick", root, onClick) -- Добавляем обработчик события onClientClick

-- Добавляем обработчики событий для маркеров
addEventHandler("onClientMarkerHit", marker1Element, onMarkerHit)
addEventHandler("onClientMarkerHit", marker2Element, onMarkerHit)
addEventHandler("onClientMarkerLeave", marker1Element, onMarkerLeave)
addEventHandler("onClientMarkerLeave", marker2Element, onMarkerLeave)

Найди баги и ошибки, логические упущения в этом скрипте и скажи как исправить