Проверка скрипта.

rokku

Новичок
Автор темы
3
1
Версия SA-MP
  1. 0.3.7 (R1)
  2. 0.3.7-R2
  3. 0.3.7-R3
Всем привет!

Недавно открыл для себя мир Lua, да и вообще скриптинга для сампа. Почекал я гайдики полчаса и вкачестве тренировки написал маленький скрипт, который полностью выключают флуд новостей в чате. Хоть все и работает, но что-то мне подсказывает, что я сделал все не совсем правильно, ибо уже видел тут скрипт ADBlocker написанный где-то на 1к строк.
Хотелось бы чтобы опытные скриптеры взглянули на мой говнокод и оценили его.

P.S Скрипт подохдить скорее всего только на Самп-рп.
Заранее спасибо за ответ.

Скрипт:
script_loaded = false
local ev = require "lib.samp.events"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("newsoff", bool_off)
    sampRegisterChatCommand("newson", bool_on)  

wait(-1)
end

function bool_off()
    script_loaded = true
    sampAddChatMessage("{9b27ff}[NewsScript]:{FFFFFF} Новости были отключены", -1)
end
function bool_on()
    script_loaded = false
    sampAddChatMessage("{9b27ff}[NewsScript]:{FFFFFF} Новости были включены", -1)
end


function ev.onServerMessage(color, text)
        if script_loaded == true then
            if color == 14221567 then
                return false
        end
    end
end
sa-mp-002.png
 

Вложения

  • off_news.lua
    949 байт · Просмотры: 2
Решение
переключатель переменной зря в отдельные две функции вынес
в условиях явно указывать == true нужно только в случае, если могут быть иные варианты, кроме как true или false
тернарный оператор для сообщения в зависимости от состояния переменной в одну строку https://ilovelua.wordpress.com/2010/09/22/тернарный-оператор/
в хуке ошибся с табуляцией, ну и можно второе условие в другую ветку не пихать а проверять сразу два через and
Lua:
local script_loaded = false
local ev = require "lib.samp.events"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end...

Rei

Известный
Друг
1,593
1,627
переключатель переменной зря в отдельные две функции вынес
в условиях явно указывать == true нужно только в случае, если могут быть иные варианты, кроме как true или false
тернарный оператор для сообщения в зависимости от состояния переменной в одну строку https://ilovelua.wordpress.com/2010/09/22/тернарный-оператор/
в хуке ошибся с табуляцией, ну и можно второе условие в другую ветку не пихать а проверять сразу два через and
Lua:
local script_loaded = false
local ev = require "lib.samp.events"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("newsst", function()
        script_loaded = not script_loaded
        sampAddChatMessage("{9b27ff}[NewsScript]:{FFFFFF} Новости были "..(script_loaded and 'включены' or 'отключены'), -1)
    end)

    wait(-1)
end


function ev.onServerMessage(color, text)
    if script_loaded and color == 14221567 then
       return false
    end
end
 
  • Нравится
Реакции: rokku

Hatiko

Известный
Проверенный
1,471
612
Делать фильтрацию по цвету не самое лучше решение, т.к. может появиться другое сообщение с таким же цветом, и оно у тебя пропадёт. По тексту желательно, можно и в комбинации с цветом, тогда точность будет высокая, всё зависит от вероятность повторения сообщения и точности составления шаблона поиска.
Вот тебе дополнительная обязательная тема для изучения как регулярные выражения, ну как обязательная, её каждый уважающий себе человек должен знать. Достаточно проста в понимании, главное не лениться.

Lua:
function ev.onServerMessage(color, text)
    if script_loaded color == 14221567 and (text:find("^%s+Отредактировал сотрудник") or text:find("^%s+Объявление:  .* Прислал:  .* Тел: %d+")) then    -- Приблизительно так, по минимуму. 
        return false
    end
end