Всем привет!
написал небольшой алгоритм предназначенный для проверки Списка команд который игрок может ввести в чате.
а именно команды для изменения камеры
Столкнулся с проблемой
Блок кода!
call TriggerRegisterPlayerChatEvent(trig[4], Player(pi), "-", false)
//регистрация ивента для написания команды
//false Как Подстрока
local string array CommandsList
local integer array CommandsListGroupStart
local integer array CommandsListGroupEnd
local integer array CommandsListSubstringEnd
local integer CommandsListMaxCounter
local integer CommandsListGroupCounter
local integer CommandsListCounter
local integer CommandsListMax
set CommandsListGroupStart[1] = 1
set CommandsList[1] = "-cam"
set CommandsListSubstringEnd[1] = 4 // длина строки Первой команды
set CommandsList[2] = "-Cam"
set CommandsListSubstringEnd[2] = 4
set CommandsList[3] = "-camm"
set CommandsListSubstringEnd[3] = 5
set CommandsList[4] = "-Camm"
set CommandsListSubstringEnd[4] = 5
set CommandsList[5] = "-zoom"
set CommandsListSubstringEnd[5] = 5
set CommandsList[6] = "-Zoom"
set CommandsListSubstringEnd[6] = 5
set CommandsList[7] = "-кам"
set CommandsListSubstringEnd[7] = 7
set CommandsList[8] = "-Кам"
set CommandsListSubstringEnd[8] = 7
set CommandsList[9] = "-камм"
set CommandsListSubstringEnd[9] = 9
set CommandsList[10] = "-Камм"
set CommandsListSubstringEnd[10] = 9
set CommandsList[11] = "-зум"
set CommandsListSubstringEnd[11] = 7
set CommandsList[12] = "-Зум"
set CommandsListSubstringEnd[12] = 7
set CommandsListGroupEnd[1] = 12 // 1 group = 12

set CommandsListMax = 20

if CommandsListMax != 0 then
set CommandsListMaxCounter = 1
loop
exitwhen CommandsListMaxCounter > CommandsListMax // от 1 до 20 команд

if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMaxCounter]) == CommandsList[CommandsListMaxCounter] then //-cam, -Cam

endif
set CommandsListMaxCounter = CommandsListMaxCounter + 1
endloop
endif
SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMaxCounter]) 
//проверка Подстроки на наличие команды работает неправильно!
а именно для нее нет никакой разницы между
CommandsList[1] = "-cam"
и
CommandsList[3] = "-camm"
напишу команду
-camm сработает 2 раза
упростил его до банальной проверки в одном цикле, он все равно выводит 2 раза
Грешу на то что нельзя проверять
CommandsListSubstringEnd[CommandsListMaxCounter]
в цикле

чтож


оказывается допустил ошибку при высчитывании

Нельзя
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMaxCounter]) == CommandsList[CommandsListMaxCounter] then //-cam, -Cam
// высчитывать Значение Цикла CommandsListMaxCounter внутри переменной CommandsListSubstringEnd
endif
он подберет Индекс CommandsListMaxCounter и будет проверять CommandsListSubstringEnd на наличие Меньшего Значения начиная с 1 до
CommandsListMax
его сразу надо высчитывать чтобы значения цикла не высчитывались

if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMax]) == CommandsList[CommandsListMaxCounter] then
так должно выглядеть

отработает 1 раз для CommandsList с привязкой к СommandsListSubstringEnd

Centyrion, если удалить комментарии, то у тебя пустое условие.
Спасибо! воспользуюсь ссылкой
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
18
CommandsListSubstringEnd[3]
Призван задать ограничение чисто для Команды
дальше
будет работать
local real CamA = S2R(SubString(ChatString, 5, StringLength(ChatString)))

Посмотри в этой системе там это в примерах есть.
Хм...это я реализовал
где
requires CustomChatEvent
18
либа принимает только 1 команду
а у меня Список

а вот
    function onInit(){
        msg("Чтобы изменить имя напечатайте |cffffff00-zoom |cff909090" + I2S(R2I(Min)) + "<>" + I2S(R2I(Max)));
        
        CustomChatEvent
            .create("zoom") // ловим -zoom
            .addSynonym("зум") // ловим -зум
            .addSynonym("ящщь") // не забываем тех, кто перепутал раскладку
            .onSuccess(function setZoom) // указываем функцию, которая сработает при удачном отлове
        ;

а если без Либы
Стандартным методом проверки Подстроки?
30
либа принимает только 1 команду
Ты внимательно пробовал описание либы читать?

а если без Либы
Открываем исходники либы, и копируем всю логику себе в код.
Загруженные файлы
18
у меня немножко по другому устроено, в одной функции хочу проверить Список всех команд и делать действия, не хочу заморачиваться с Либами
30
в одной функции хочу проверить Список всех команд и делать действия
Кто тебе мешает?
18
да понял что здесь происходит
нет заметил это...думал экземпляр структуры в другом месте

ну вот это и пытаюсь сделать

по какойто причине
SubString неправильно высчитывает значения Индексов Массива
30
SubString неправильно высчитывает значения Индексов Массива
Как это не правильно? Пример в студию.
18
if CommandsListMax != 0 then
set CommandsListMaxCounter = 1
loop
exitwhen CommandsListMaxCounter > CommandsListMax // от 1 до 20 команд
//проверить в массиве список Групп Комманд 
//set CommandsListGroupCounter = CommandsListGroupStart[1]
//loop
//exitwhen CommandsListGroupCounter > CommandsListGroupEnd[CommandsListMax] //от 1 до 20 Групп
//проверить в Группе команд Список Команд
set CommandsListCounter = 1
loop
exitwhen CommandsListCounter > CommandsListGroupCounter
//проверить список внутри группы комманд
//if CommandsList[CommandsListCounter] == CommandsList[CommandsListMax] then

//set CommandsListSubstringEnd[CommandsListGroupCounter] = CommandsListGroupCounter

if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListCounter]) == CommandsList[CommandsListCounter] then //-cam, -Cam



endif

//endif

set CommandsListCounter = CommandsListCounter + 1
endloop
//set CommandsListGroupCounter = CommandsListGroupCounter + 1
//endloop
set CommandsListMaxCounter = CommandsListMaxCounter + 1
endloop
endif

CommandsListSubstringEnd[3] = 5
CommandsListSubstringEnd[1] = 4 // длина строки Первой команды
local real CamA = S2R(SubString(ChatString, 5, StringLength(ChatString)))

if SubString(ChatString, 0, CommandsListSubstringEnd[3]) == CommandsList[1] then
думает что это одно и тоже

четко занес в переменную Длину строки...Подстрока когда дойдет до CommandsListSubstringEnd остановится
дальше
local real CamA = S2R(SubString(ChatString, 5, StringLength(ChatString)))

CommandsList[1] = "-cam"
так и
CommandsList[3] = "-camm"

//===========================================================================
// The parameters for the API Substring function are unintuitive, so this
// merely performs a translation for the starting index.
//
function SubStringBJ takes string source, integer start, integer end returns string
    return SubString(source, start-1, end)
endfunction  
30
Centyrion, если удалить комментарии, то у тебя пустое условие.
Загруженные файлы
18
чтож


оказывается допустил ошибку при высчитывании

Нельзя
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMaxCounter]) == CommandsList[CommandsListMaxCounter] then //-cam, -Cam
// высчитывать Значение Цикла CommandsListMaxCounter внутри переменной CommandsListSubstringEnd
endif
он подберет Индекс CommandsListMaxCounter и будет проверять CommandsListSubstringEnd на наличие Меньшего Значения начиная с 1 до
CommandsListMax
его сразу надо высчитывать чтобы значения цикла не высчитывались

if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMax]) == CommandsList[CommandsListMaxCounter] then
так должно выглядеть

отработает 1 раз для CommandsList с привязкой к СommandsListSubstringEnd

Centyrion, если удалить комментарии, то у тебя пустое условие.
Спасибо! воспользуюсь ссылкой
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.