- 19
- 1
- Версия SA-MP
-
- 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
Последнее редактирование: