Или отслеживаем ввод стандартных чит-кодов в сингл-плеере. Сразу скажу, что это явно не самый производительный способ, ибо тут обновляются строки по каждому изменению поля для ввода, но это наработка для сингл-плеера, где чат в 99% случаев нужен только для ввода читов, так что думаю, что способ имеет место быть.

Принцип работы

Ставим невидимого даммика с жаром преисподней в угол карты В таблице states хранятся два последних состояния стандартного EditBox, служащего для ввода текста от игрока. При срабатывании события отправки сообщения в чат происходит проверка на наличие в предпоследнем состоянии запрещённых слов из таблицы cheatsTable. Дальше можно придумать любое действие, в моём случае просто сразу вызывается поражение для локального игрока в функции IfEditBoxContentEntered(). Можно реализовать другие подлянки, можно даже усложнить и проверять не по таблице, а по каждому читу, например при вводе greedisgood запускать таймер обнуления ресурсов, или при вводе thereisnospoon удалять все способности. Короче кампании про Артаса должны заиграть новыми красками.

Код

Таймер в функции InitEditBoxAnalyzer() присутствует по той причине, что нужна небольшая задержка перед обращением к стандартным фреймам в случае вызова этой функции в момент инициализации карты. Этот таймер можно убрать из данного кода и применить перед вызовом, например.
Два последних состояния хранится именно потому, что в момент ввода срабатывают оба события, причём TEXT_CHANGED срабатывает раньше.
function InitEditBoxAnalyzer()
    local states = {"", ""}
    
    local cheatsTable = {
    "warpten",
    "whosyourdaddy",
    "keysersoze",
    "leafittome",
    "greedisgood",
    "pointbreak",
    "thereisnospoon",
    "somebodysetupusthebomb",
    "allyourbasearebelongtous",
    "whoisjohngalt",
    "sharpandshiny",
    "iseedeadpeople"
    }
    
    local textChangedTrigger = CreateTrigger() 
    local textEnterTrigger = CreateTrigger() 

    local function IfEditBoxContentEntered()
        for i = 1, #cheatsTable do
            if string.find(string.lower(states[2]), cheatsTable[i]) then 
                CustomDefeatBJ(GetLocalPlayer(), "Good luck next time!") --Сюда можно добавить любую реакцию на ввод чита
            end    
        end
    end

    local function IfEditBoxContentChanged()
        states[2] = states[1]
        states[1] = BlzGetTriggerFrameText()
    end

    local t = CreateTimer()
    TimerStart(t, 0.10, false, function()
        local frameGameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
        local frameInputBox = BlzFrameGetChild(frameGameUI, 11)
        local frameEditBox = BlzFrameGetChild(frameInputBox, 1)

        BlzTriggerRegisterFrameEvent(textChangedTrigger, frameEditBox, FRAMEEVENT_EDITBOX_TEXT_CHANGED)
        BlzTriggerRegisterFrameEvent(textEnterTrigger, frameEditBox, FRAMEEVENT_EDITBOX_ENTER)
        TriggerAddCondition(textChangedTrigger, Condition(IfEditBoxContentChanged))
        TriggerAddCondition(textEnterTrigger, Condition(IfEditBoxContentEntered))
    DestroyTimer(t)
    end)
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
26
Волчачка, да, всё ещё можно через артмани к памяти игры подключиться и статы подкрутить
26
Вышла новая версия! Прокрутить к ресурсу
Обновил немного. Переименовал функции кондишонов, закинул весь код под одну функцию и сделал всё локалками.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.