SA:MP Ошибка в скрипте SignText: Can't create font Webdings

ragermann

Известный
Автор темы
19
1
Версия SA-MP
  1. 0.3.7-R2
Ситуация такая, написал скрипт ( что-то сам, что то через chat gpt, так не особо опытный в этом ) И столкнулся с проблемой что каждый раз когда я захожу в игру, скрипт работает 5 минут, после где-то в определенной части города, да почти в любом месте, появляется ошибка. SignText: Can't create font Webdings. Может быть я что-то не так сделал в скрипте из-за чего он начал ломаться? И не могу этого починить. " код оставлю ниже, кто сможет, посмотрите, и помогите мне с моей проблемой


script:
-- === Настройки ===

local MESSAGE_INTERVAL = 23 -- Интервал между сообщениями агентов (сек)

local ACCEPT_TIME = 26 -- Время на принятие контракта (сек)

local EXECUTION_TIME = 120 -- Время на выполнение контракта (сек)

local CONTRACT_GEN_INTERVAL = 30 -- Генерация контрактов каждые 30 сек

local AGENT_COUNT = 5 -- Количество агентов (1001–1005)



-- === Состояния ===

local contractQueue = {} -- Очередь контрактов

local activeContracts = {} -- { agentId = { contract, startTime, accepted, executed } }

local lastAgentMsgTime = 0 -- Время последнего сообщения агента

local lastContractTime = 0 -- Время последней генерации контракта

local nextAgentIndex = 1 -- Следующий агент для назначения (по кругу)

local messageQueue = {} -- Очередь сообщений для отправки (только для агентов/контрактов)

local agentPool = {} -- { id, isBusy }



-- === Инициализация агентов ===

for i = 1, AGENT_COUNT do

    table.insert(agentPool, { id = 1000 + i, isBusy = false })

end



-- === Сообщения агентов ===

-- ? ИСПРАВЛЕНО: УБРАНЫ ВСЕ СИМВОЛЫ, КОТОРЫЕ МОГУТ ВЫЗЫВАТЬ Webdings!

local agentMessages = {

    "Настоящий киллер не любит торопиться, все по плану.",

    "Подготавливаюсь к следующему контракту, скоро начну его исполнение.",

    "Контракты... Это бизнес, ничего личного.",

    "Помните, анонимность — наше всё, садитесь на крышах, или же стойте на горе. Так будет проще!",

    "Многие считают, что контроль над ситуацией — это ключ к выживанию.",

    "Наше агентство ценит точность и терпение новых агентов.",

    "Контрактов много, все требуют аккуратности в исполнении.",

    "Проверь оружие и маскировку перед выполнением заказа на убийство.",

    "Мои услуги стоят денег, но результат гарантирован на все сто процентов.",

    "Используйте любые возможности для выполнения контракта и для выгодных целей.",

    "Быстрота — залог успеха, не затягивайте с выполнением своего дела.",

    "Проверь свидетелей и следы, чтобы не оставить улик для ФБР.",

    "Будь осторожен и терпелив, профессия требует этого.",

    "Снайперская винтовка и маскировка — наши лучшие союзники в этом кровавом бизнесе.",

    "Подготовься — успех зависит от деталей.",

    "Время — наш главный враг, цените каждую секунду и используйте её на благо.",

    "Иногда лучше подождать подходящий момент, чем быть раскрытым.",

    "Минимизируй риски и осознавай свои ошибки.",

    "Маскировка — залог успеха.",

    "Контроль ситуации, а также исполнение — искусство.",

    "Действуй решительно при непредвиденности."

}



-- === Вспомогательные функции ===

local function getConnectedPlayers()

    local players = {}

    local maxId = sampGetMaxPlayerId()

    for i = 0, maxId do

        if sampIsPlayerConnected(i) then

            table.insert(players, i)

        end

    end

    return players

end



local function generateContract()

    local players = getConnectedPlayers()

    if #players == 0 then

        return nil

    end

    local targetPlayerId = players[math.random(1, #players)]

    local targetName = sampGetPlayerNickname(targetPlayerId) or "Неизвестный"

    local contractPrice = math.random(3000, 70000)

    return {

        targetId = targetPlayerId,

        targetName = targetName,

        price = contractPrice,

        victimId = targetPlayerId

    }

end



local function getNextAvailableAgent()

    local len = #agentPool

    for i = 1, len do

        local idx = (nextAgentIndex - 1 + i) % len + 1

        if not agentPool[idx].isBusy then

            nextAgentIndex = idx

            agentPool[idx].isBusy = true

            return agentPool[idx].id

        end

    end

    return nil

end



local function releaseAgent(agentId)

    for i, agent in ipairs(agentPool) do

        if agent.id == agentId then

            agent.isBusy = false

            break

        end

    end

end



local function formatMessage(text)

    if not text or #text == 0 then

        return ""

    end

    -- Убираем все цветовые коды, чтобы проверить длину чистого текста

    local cleanText = text:gsub("{%x%x%x%x%x%x}", "")

    if #cleanText <= 128 then

        return text

    end

    -- Если текст слишком длинный — обрезаем с сохранением цветов

    local truncated = text:sub(1, 128)

    if #truncated < #text then

        truncated = truncated .. "..."

    end

    return truncated

end



local function addMessage(text)

    if not text or #text == 0 then

        return

    end

    text = formatMessage(text)

    table.insert(messageQueue, { text = text, time = os.clock() })

end



local function sendDirectorMessage(text)

    local formatted = string.format("{01FCFF}** {850000}Director ICA № 101: {333333}%s", text)

    sampAddChatMessage(formatted, 0xCCCCCC)

end



local function sendAgentMessage()

    if os.clock() - lastAgentMsgTime < MESSAGE_INTERVAL then

        return

    end

    lastAgentMsgTime = os.clock()

    local msg = agentMessages[math.random(1, #agentMessages)]

    local agent = agentPool[math.random(1, #agentPool)]

    addMessage(string.format("{01FCFF}** {460000}Agent № %d: {8B8B8B}%s", agent.id, msg))

end



-- === Главный цикл ===

function main()

    while not isSampAvailable() do

        wait(100)

    end



    repeat

        wait(500)

    until sampIsLocalPlayerSpawned()



    -- РЕГИСТРИРУЕМ КОМАНДУ /g — ОТПРАВЛЯЕМ СРАЗУ, БЕЗ ОЧЕРЕДИ

    sampRegisterChatCommand("g", function(text)

        local msg = text:match("^%s*(.*)")

        if msg and #msg > 0 then

            sendDirectorMessage(msg)

        end

    end)



    while true do

        local now = os.clock()



        -- Генерация нового контракта

        if now - lastContractTime >= CONTRACT_GEN_INTERVAL then

            local contract = generateContract()

            if contract then

                table.insert(contractQueue, contract)

            end

            lastContractTime = now

        end



        -- Назначение контрактов

        while #contractQueue > 0 do

            local agentId = getNextAvailableAgent()

            if not agentId then

                break

            end

            local contract = table.remove(contractQueue, 1)

            activeContracts[agentId] = {

                contract = contract,

                startTime = now,

                accepted = false,

                executed = false

            }

            local msg = string.format(

                "{850000}** {8B8B8B}Агентство: {FF0000}новый контракт на: {8B8B8B}%s[%d]{FF0000}, сумма {8B8B8B}%d$ [ Принять? ]{850000} **",

                contract.targetName, contract.targetId, contract.price

            )

            addMessage(msg)

        end



        -- Проверка активных контрактов

        for agentId, data in pairs(activeContracts) do

            local contract = data.contract

            local startTime = data.startTime

            if not data.accepted and now - startTime >= ACCEPT_TIME then

                data.accepted = true

                addMessage(string.format(

                    "{8B0000}** {8B8B8B}Агент № %d {FF0000}взялся за выполнение контракта на: {8B8B8B}%s[%d]. {00AC31}Цена: %d$ {8B0000} **",

                    agentId, contract.targetName, contract.targetId, contract.price

                ))

            end

            if data.accepted and not data.executed and now - startTime >= EXECUTION_TIME then

                data.executed = true

                addMessage(string.format(

                    "{8B0000}<< {0088ff}Агент {FFFFFF}№ %d {0088ff}выполнил контракт на {FFFFFF}%s[%d], {0088ff}и получил {00AC31}%d$ {8B0000}>>",

                    agentId, contract.targetName, contract.targetId, contract.price

                ))

                releaseAgent(agentId)

                activeContracts[agentId] = nil

            end

        end



        -- Отправка сообщений агентов

        sendAgentMessage()



        -- Отправка сообщений из очереди

        for i = #messageQueue, 1, -1 do

            local msgData = messageQueue

            if os.clock() - msgData.time >= 1.5 then

                sampAddChatMessage(msgData.text, 0xCCCCCC)

                table.remove(messageQueue, i)

            end

        end



        wait(500)

    end

end
 
Последнее редактирование:

БеzликиЙ

Автор темы
Проверенный
1,967
1,160
SignText: Can't create font Webdings
эта ошибка появляется, когда игре не хватает памяти на загрузку шрифта для табличек с текстом - вроде таких

1774125569354.png


они часто используются для маппинга, т.к. позволяют организовывать сложные геометрические навороты путём простой замены текстур - например, логотип Apple на маппинге в интерьерах некоторых домов на АРЗ.

я, на первый взгляд, не вижу ничего, что могло бы вызывать утечки памяти в этом конкретном скрипте, поэтому проблема может быть в какой-то другой модификации (кстати, а что это вообще такое должно быть в итоге?)

p.s. ИСПОЛЬЗУЙ ИНСТРУМЕНТЫ ФОРМАТИРОВАНИЯ

1774125798586.png
 
  • Нравится
Реакции: ragermann

ragermann

Известный
Автор темы
19
1
эта ошибка появляется, когда игре не хватает памяти на загрузку шрифта для табличек с текстом - вроде таких

Посмотреть вложение 289279

они часто используются для маппинга, т.к. позволяют организовывать сложные геометрические навороты путём простой замены текстур - например, логотип Apple на маппинге в интерьерах некоторых домов на АРЗ.

я, на первый взгляд, не вижу ничего, что могло бы вызывать утечки памяти в этом конкретном скрипте, поэтому проблема может быть в какой-то другой модификации (кстати, а что это вообще такое должно быть в итоге?)

p.s. ИСПОЛЬЗУЙ ИНСТРУМЕНТЫ ФОРМАТИРОВАНИЯ

Посмотреть вложение 289280
Это обычный фейк чат фейковые текста об выполнение контракта и тп, могу даже записать видео и показать как это работает на примере. Просто был написан так как раньше на одном из проектов, была организация такая.

эта ошибка появляется, когда игре не хватает памяти на загрузку шрифта для табличек с текстом - вроде таких

Посмотреть вложение 289279

они часто используются для маппинга, т.к. позволяют организовывать сложные геометрические навороты путём простой замены текстур - например, логотип Apple на маппинге в интерьерах некоторых домов на АРЗ.

я, на первый взгляд, не вижу ничего, что могло бы вызывать утечки памяти в этом конкретном скрипте, поэтому проблема может быть в какой-то другой модификации (кстати, а что это вообще такое должно быть в итоге?)

p.s. ИСПОЛЬЗУЙ ИНСТРУМЕНТЫ ФОРМАТИРОВАНИЯ

Посмотреть вложение 289280
Попробовал в конечном итоге поставить memoryfull на 4-8 gb все равно такая же проблема, думаю может из-за каких-либо скриптов ломается гта.

Это обычный фейк чат фейковые текста об выполнение контракта и тп, могу даже записать видео и показать как это работает на примере. Просто был написан так как раньше на одном из проектов, была организация такая.


Попробовал в конечном итоге поставить memoryfull на 4-8 gb все равно такая же проблема, думаю может из-за каких-либо скриптов ломается гта.
В конечном итоге пофиксил свою проблему.
 
Последнее редактирование: