FonSwong 33 Опубликовано 16 Октября 2015 Нужна помощь со строками Нужно получить из строки(s) текст от 1 пробела до второго. индекс 1 пробела нахожу, а вот со 2 пробелом проблема. Подскажите пожалуйста. local s = "! Волк где ты?"--ввод с пда log1(get_substr_since_first_to_two_space(s))--запуск функции которая должна вернуть слово Волк function get_substr_since_first_to_two_space(line) if not contains(line," ") then return "" end local space1 = index_of(line," ")+1--узнаём индекс 1 пробела + 1 local space2 = -1--узнаём индекс 2 пробела - 1 return substring(line,space1,space2) end ------------------------------------------------------ -- Автор DukeKan -- 25.04.2013 ------------------------------------------------------ ------------------------------------------------------ -- Служебные функции для удобной работы со строками ------------------------------------------------------ -- Функция возвращает подстроку с 1 символа и до ближайшего пробела, не включая его function get_substr_until_first_space(line) if not contains(line," ") then return "" end return substring(line,1,index_of(line," ") - 1) end --[[ function get_substr_since_first_to_two_space(line) if not contains(line," ") then return "" end local sbst = index_of(line," ") local sbst2 = substring(line,sbst + 1,sbst - 1) return substring(line,sbst + 1,sbst2) return substring(line,index_of(line," ") + 1,substring(line,index_of(line," ") + 1,index_of(line," ") - 1)) end ]] -- Функция возвращает подстроку с пробела (первого) и до конца function get_substr_since_space_to_end(line) if not contains(line," ") then return "" end return substring(line, index_of(line," ") + 1) end -- Вычисление длины строки function length(line) if line == nil then return nil end return string.len(line) end -- Выделение подстроки по индексам function substring(line,begin,ends) if ends == nil then ends = length(line) end return string.sub(line, begin, ends) end -- Находит первое вхождение в строку второго аргумента, -- возвращается не только первое вхождение, но и индекс, на котором вхождение заканчивается function index_of(line,substring) return string.find(line, substring) end -- Содержит ли строка данную подстроку function contains(line,substr, first, simple) if (length(line) < length(substr)) then return false end if string.find(line,substr,firts, simple) == nil then return false else return true end end -- Заменяет первое вхождение old в строке line на new function replace_first(line,old, new) if contains(line,old) then line = substring(line,1,index_of(line,old) - 1)..new..substring(line,index_of(line,old) + 1) end return line end -- Заменяет все вхождения old в строке line на new function replace_all(line,old,new) return string.gsub(line, old, new) end -- Проверяет, начинается ли строка с данной подстроки function starts_with(line,substring) local b,e = index_of(line,substring) return (b == 1 and e == length(substring) ) end -- Проверяет, заканчивается ли срока line последовательностью substring function ends_width(line,substring) if (length(substring) > length(line)) then return false end local begin,ends = index_of(line,substring) if (begin == nil) then return false end return (ends == length(line) and begin == length(line) - length(substring) + 1) end -- Проверяет, является ли строка пустой. true, если пустая, false иначе function is_empty(line) return length(line) == 0 end -- Переводит все буквы в нижний регистр function to_lower_case(line) return string.lower(line) end -- Переводит все буквы в верхний регистр function to_upper_case(line) return string.upper(line) end ------------------------------------------------------ -- Тесты ------------------------------------------------------ function accert_true(boolean, message) if not boolean then err_log("Error at "..message) end end function accert_false(boolean, message) if boolean then err_log("Error at "..message) end end function accert_equals(arg1, arg2, message) if arg1 ~= arg2 then err_log("Error at " .. message) end end function accert_not_equals(arg1, arg2, message) if arg1 == arg2 then err_log("Error at " .. message) end end function test_script() local a = "abcdefghijk" local b = "aaabbbcccddd" local c = "somestring" local d = "aabbccaabbcc" local e = "vvv ccc" local g = " vvv ccc " local j = "" local f = nil local h = "AaBb" accert_equals(get_substr_until_first_space(e),"vvv","get_substr_until_first_space") accert_equals(get_substr_until_first_space(g),"","get_substr_until_first_space") accert_equals(get_substr_since_space_to_end(e),"ccc","get_substr_since_space_to_end") accert_equals(get_substr_since_space_to_end(g),"vvv ccc ","get_substr_since_space_to_end") accert_true(length(a) == 11, "length") accert_true(length(j) == 0, "length") accert_true(length(f) == nil, "length") accert_equals(substring(b,4,6),"bbb","substring") local x,z = index_of(d,"cc") accert_true(x == 5 and z == 6, "index_of") accert_true(contains(e,"cc"),"contains") accert_false(contains(e,"dd"),"contains") accert_equals(replace_first(d,"b", ""),"aabccaabbcc","replace_first") accert_equals(replace_first(d,"a", ""),"abbccaabbcc","replace_first") accert_equals(replace_all(d,"b", ""),"aaccaacc","replace_all") accert_true(starts_with(c,"some"),"starts_with") accert_true(ends_width(c,"string"),"ends_width") accert_true(is_empty(j),"is_empty") accert_false(is_empty(h),"is_empty") accert_equals(to_lower_case(h),"aabb","to_lower_case") accert_equals(to_upper_case(h),"AABB","to_upper_case") end Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 16 Октября 2015 , где можно почитать по работе со строками? или готовые примеры понятные (ссылку можете дать?) Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 16 Октября 2015 Карлан, чего жуть то Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 17 Октября 2015 @FonSwong, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь.Оболочки сделаны для более удобного вызова, так как в них сразу проверки на пустоту и тд.Спасибо за наводки Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 19 Октября 2015 (изменено) Не получается вывести рандомное значение из таблицы, ругается на аргумент tbl_sos = {} for id, human in pairs(db.creature) do if human then local npc = level.object_by_id(id) if npc~=nil and npc:alive() then if poisk.npc_will_help(npc,db.actor) then end end end end -- в npc_will_help идёт проверка по условиям и в таблицу записываются ид нпс через tbl_sos[npc:id()] = "SOS" local abc = tbl_sos[math.random(#tbl_sos)] log1(abc) Изменено 19 Октября 2015 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 19 Октября 2015 (изменено) Сделал просто через индексированный. Расширение RvP что это и с чем едят, объясните по простому, пожалуйста И как соорудить ассоциативный Изменено 19 Октября 2015 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 20 Октября 2015 (изменено) Как правильно достать профиль? Сохраняю npc:id() непися, затем загружаю и мне нужно получить его профиль, но не через npc = level.object_by_id(id), ибо в оффлайне если нпс, то крашится игра затем передать npc другой фунции, а там уже она снова возьмёт npc:id() Пробовал после загрузки профиль вытаскивать через npc = alife():object(a), но он вроде как даёт сид, а дальше нужно передать "npc" с "id()" Изменено 20 Октября 2015 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 29 Октября 2015 (изменено) Вот что я думаю по этому поводу Составлял не я, не имея опыта в луа, опирался на уже написанное, используя и изменяя в своих целях.Про "проверки на пустоту"- имел ввиду, что-то вроде "здесь просто проверка на «дурака», чтобы избежать вылета".. Спасибо за развёрнутый коммент Изменено 29 Октября 2015 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 25 Февраля 2016 Как узнать/установить позицию курсора? В оригинале есть в начале действо- когда ГГ показывают ПДА, посмотрел в коде- вроде как в движке всё мутится Так и не понял как с курсором работать, мне хотя бы получение координат его нужно, и ещё желательно сделать в какой-то момент прозрачным, а потом снова вернуть ему картинку, это возможно? Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 27 Февраля 2016 (изменено) @CRAZY_STALKER666Выложите свою геймдату, так легче найти ошибку Изменено 27 Февраля 2016 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 28 Февраля 2016 (изменено) Как можно сделать динамическм указание [[путь\]], то есть к [[]] добавить окончание из переменной со строковым значением perem_string = "дин.окончание пути"? Изменено 28 Февраля 2016 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 29 Февраля 2016 (изменено) Извиняюсь за глупый вопрос, просто первый раз к звукам притронулся. Так вот, а зачем пути к звукам используют как [[abc/def]] ? А не просто строкой "abc/def" ? И ещё один вопрос в догонку, реально ли сделать так, чтобы при прокрутке игрового времени, допустим во время сна, чтобы вокруг(на тек. левеле) все действия ускорялись- то есть нпс быстрее бегали, физика ускоряла движения объектов и т.д и т.п., чтобы после того же сна, мы видели что было реальное увеличение скорости течения времени(а не как сейчас- всего лишь прокрутка циферок времени) Понятное дело, что для этого придётся изменять двиг+ такое кратковременное ускорение течения времени повлечёт в такие моменты колоссальную нагрузку Изменено 29 Февраля 2016 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 2 Марта 2016 (изменено) У меня есть вот такое диалоговое окно https://yadi.sk/d/y_NZn-eUpq7wr Основное окно у меня на классе CUIScriptWnd. В его инитконтроле цепляются ещё 4 окна на классе CUIWindow. В основном окне я успешно использую CUIScriptWnd.Update(self) для обновления часов. А в дочернем от основного окне(окно чата) пришлось повесить обновление этого чата на калбек апдейта игры. Вопрос вот в чём: Есть ли для CUIWindow похожий простой апдейт, как для CUIScriptWnd? Если нет, то как мне мои дочерние окна на CUIWindow переделать на класс CUIScriptWnd, чтобы не использовать каллбек на апдейт, а использовать CUIScriptWnd.Update(self)? Что-то не выходит. Запутался%( Изменено 2 Марта 2016 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 4 Марта 2016 (изменено) Создаваемый класс гуи виртуальный чтоли, не пойму? В одном и том же скрипте класс находится, и обычная функция, если в классе создаётся/изменяется глобальная переменная, то её не видит обычная функция, и наоборот манипуляции с переменными в скрипте не видны внутри классп гуи. И ещё вопром: в чём прок локальных функций "local function bla()"? Что даёт то, что мы обзываем её локальной? Вот ещё вопрос: как указать путь к папке, не прописанной в fsgame.ltx? И как указать путь к звук. файлу не от папки sounds, а от любой другой? Вот код наполнения, но тут во первых я указываю путь в файле fsgame.ltx $music_for_player$ по пути от папки sounds "/music_for_player. А во вторых указываю туда, по тому что не знаю как указать путь к звуку не от sounds -- Заполнение листа с треками(считывает папку "gamedata\sounds\music_for_player") function music_player:FillList() self.mp3_list:Clear() local list_music_player = {} local f = getFS() local flist = f:file_list_open_ex('$music_for_player$',bit_or(FS.FS_ListFiles,FS.FS_ClampExt),"*.ogg") local f_cnt = flist:Size() for it=0, f_cnt-1 do local file = flist:GetAt(it) local file_name = file:NameShort() table.insert(list_music_player,{sound = [[music_for_player\]]..file_name, title = 'Трек №'..(it+1), autor = file_name}) end if debug_on then print_table(list_music_player) end for k,v in pairs(list_music_player) do self:AddItemToList(v.title,v.sound,v.autor) end Не сочтите за наглость, просто не знаю где на это всё самому найти ответы, ещё один вопрос Как поймать открытие/закрытие системных уи элементов(вроде пда, инвенторя и т.д.)? Платформа ЗП В ТЧ нормально получалось, а вот в ЗП что-то не получается. Вроде так же ловлю info_id (инфопоршень), но ловится только 1 раз открытие ПДА и закрытие его же, и больше не срабатывает, инвентарь и другое даже и 1 раза не ловится. Если это важно- ковыряюсь на моде Call of Chernobyl Изменено 4 Марта 2016 пользователем FonSwong Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 6 Марта 2016 @ZeeK, А если так?: ignore = {"wpn_beretta","wpn_colt1911","wpn_desert_eagle","wpn_fort","wpn_hpsa"} if not string.find(item:section(),ignore) then db.actor:transfer_item(item, inv_box_1) end Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 11 Марта 2016 Нет ли способа вырисовывать в реальном времени direction? А то жутко неудобно работать с ними, не видя визуально. Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 12 Марта 2016 Взял функцию из этого поста Но как можно в 3д вырисовать линию направления?(от одного вектора до другого) Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 15 Марта 2016 взгляд скриптово на каждую кость можно отследить? Или только на "особенные"? Список где увидеть можно? Можно ли узнать направление кости, т.е. допустим сторона коленки спереди сзади, сбоку? Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 20 Марта 2016 Как без отключения кнопок передвижения, отобрать управление клавой, но управление мышью не отбирая? Поделиться этим сообщением Ссылка на сообщение
FonSwong 33 Опубликовано 20 Марта 2016 Как ловить хиты по актору? Причём так же важен тип хита и от кого получен. Т.е. удар от монстра или человека, или выстрел из опред. Оружия, или же хит от жарки и т.д. У ГГ есть кости? Тогда так же если хит от удара или выстрела, то ещё и по какой кости ГГ пришёлся удар/выстрел. Поделиться этим сообщением Ссылка на сообщение