Крашит/зависает игра при попытке вывести значение форматирования

RoffDaniel

Известный
Автор темы
77
20
Всем привет! Есть у меня скриптец, в котором я могу создавать свои бинды, которые я могу активировать по команде, или кнопке. Например:
Я создаю бинд, который активирую по команде. Команда "/test". Команда вызывает строку бинда в которой я написал например "/n {1}". То есть, я должен написать "/test БХ".
Но, вместо того, чтобы получить строку "(( Roff_Daniel[LOX]: БХ ))", на ПК у меня игра просто зависает, а на ноуте крашит. В логе все чисто.
Вот код:
Скрытое содержимое доступно для зарегистрированных пользователей!
 
Последнее редактирование:
Решение
В общем, как обычно проверяя каждую строку, ничего не помогло. Потом задумался на счет SAMPFUNCS. Я использовал версию 5.3.3. Зная что 5.4.0+ больше для разработчиков чем для обычных пользователей, я до этой версии не обновлялся. Но все таки решил обновиться, попробовать. И да, у меня перестало крашить/вылетать, потому что есть зависимость с новой версии SF... Вопрос решен.


UPD.
А крашило, потому что я использую другую систему отправки сообщений в чат:

Lua:
if send and bind:find('%S+') then
    sampProcessChatInput(bind)
else
    sampSetChatInputEnabled(true)
    sampSetChatInputText(bind)
end
Потому что нужно, чтобы работали не только серверные команды, но и скрипта.

RoffDaniel

Известный
Автор темы
77
20
Может я тупой, конечно, или чет не понимаю, но string.gsub заменяет в строке шаблон на шаблон замены, разве нет? А что он у тебя делает? :/
Ну так, я ввожу /test и куча текста. "и куча текста" и есть шаблон который нужно заменить.
 

RoffDaniel

Известный
Автор темы
77
20
Как я понял, у тебя команда /test должна отправлять аргумент в команду /n ? Или что? По-подробнее опиши работу скрипта, потому что твоя формулировка - это нечто.
Соррян. Да, он должен отпрвлять аргумент в строку бинда, и заменять {1} собой.
 

FBenz

Активный
328
40
Соррян. Да, он должен отпрвлять аргумент в строку бинда, и заменять {1} собой.
Не понимаю тогда, зачем тебе столько всего:
Lua:
sampRegisterChatCommand('test', function(arg) -- в main до беск цикла
    sampSendChat('/n '..arg)
end)
Если командой /test ты регистрируешь строку и сохраняешь ее в ini, чтобы потом вставить аргументом в /n .., то:
Lua:
local inicfg = require 'inicfg'
local ini = inicfg.load({
    settings = { bind = 'Это строка по умолчанию' }
}, '   '--[[Тут типа тожа путь, ага]])
-- В начало



sampRegisterChatCommand('test', function(arg)
    ini.settings.bind = arg
    inicfg.save(ini, '   '--[[Ну тут типа путь, окда]])
end)

sampRegisterChatCommand('realise', function() sampSendChat('/n '..ini.settings.bind) end)
--В main до беск цикла
Вроде ничего не забыл. Последний код будет брать с ini файла переменную bind и вставлять ее после /n при вводе /realise. При вводе /test [text] будет брать аргумент text и сохранять в ini Файл в переменную bind. Пример:
Lua:
--[[
/realise - при отсутствии изменения в bind выведет "Это строка по умолчанию"

/test Это не ОвноКод, не правда!11! - сохранит строку в ini.

/realise - теперь выведет "Это не ОвноКод, не правда!11!"
]]
Если хочешь сделать подобие МВД хелпера :
Lua:
local inicfg = require 'inicfg'

local ini = inicfg.load({
    settings = {
        bindString = '/n {bind}' --[[ вместо {bind} будет аргумент от /test [arg]
                                  а вместо /n может быть любая команда итд]]
    }
})
-- В начало



sampRegisterChatCommand('test', function(arg)
    local yourBind = string.gsub(ini.settings.bindString, '{bind}', arg)
    sampSendChat(yourBind)
end)
В твоем же коде меня напрягает эта строка:
Lua:
bind = bind:gsub('{(%d+)}', function(n)
        n = tonumber(n) -- У тебя n по идее равна nil, а ты делаешь на него tonumber
        return args[n] or ''
end)
Также может крашить из-за ошибки в адресе памяти - memory.setuint8(sampGetBase() + 0x119CBC, 1)
 
Последнее редактирование:

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Не понимаю тогда, зачем тебе столько всего:
Lua:
sampRegisterChatCommand('test', function(arg) -- в main до беск цикла
    sampSendChat('/n '..arg)
end)
Если командой /test ты регистрируешь строку и сохраняешь ее в ini, чтобы потом вставить аргументом в /n .., то:
Lua:
local inicfg = require 'inicfg'
local ini = inicfg.load({
    settings = { bind = 'Это строка по умолчанию' }
}, '   '--[[Тут типа тожа путь, ага]])
-- В начало



sampRegisterChatCommand('test', function(arg)
    ini.settings.bind = arg
    inicfg.save(ini, '   '--[[Ну тут типа путь, окда]])
end)

sampRegisterChatCommand('realise', function() sampSendChat('/n '..ini.settings.bind) end)
--В main до беск цикла
Вроде ничего не забыл. Последний код будет брать с ini файла переменную bind и вставлять ее после /n при вводе /realise. При вводе /test [text] будет брать аргумент text и сохранять в ini Файл в переменную bind. Пример:
Lua:
--[[
/realise - при отсутствии изменения в bind выведет "Это строка по умолчанию"

/test Это не ОвноКод, не правда!11! - сохранит строку в ini.

/realise - теперь выведет "Это не ОвноКод, не правда!11!"
]]
нахуя ты это написал, та функция является частью биндера.
У тебя n по идее равна nil, а ты делаешь на него tonumber
ты знаешь работу gsub? видимо нет. gsub бы не давал функе nil.
и да для tonumber можно и nil
37553

Также может крашить из-за ошибки в адресе памяти - memory.setuint8(sampGetBase() + 0x119CBC, 1)
ты проверил адрес функи? я да, и там всё верно
37554

кстати он {screen} не писал, так что перезапись не произошла.
 
  • Влюблен
  • Грустно
Реакции: RoffDaniel и FBenz

FBenz

Активный
328
40
кстати он {screen} не писал, так что перезапись не произошла.
Я не настолько опытен, чтобы, имея лишь кусок функции, сказать в чем проблема нормально. Чем помог, тем помог, не надо сразу наезжать.
Я хотя бы пытаюсь)
 
  • Нравится
Реакции: RoffDaniel

RoffDaniel

Известный
Автор темы
77
20
В общем, как обычно проверяя каждую строку, ничего не помогло. Потом задумался на счет SAMPFUNCS. Я использовал версию 5.3.3. Зная что 5.4.0+ больше для разработчиков чем для обычных пользователей, я до этой версии не обновлялся. Но все таки решил обновиться, попробовать. И да, у меня перестало крашить/вылетать, потому что есть зависимость с новой версии SF... Вопрос решен.


UPD.
А крашило, потому что я использую другую систему отправки сообщений в чат:

Lua:
if send and bind:find('%S+') then
    sampProcessChatInput(bind)
else
    sampSetChatInputEnabled(true)
    sampSetChatInputText(bind)
end
Потому что нужно, чтобы работали не только серверные команды, но и скрипта.
 
Последнее редактирование:
  • Ха-ха
Реакции: FBenz