Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

Нужна помощь со строками

Нужно получить из строки(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, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь.

Оболочки сделаны для более удобного вызова, так как в них сразу проверки на пустоту и тд.

Спасибо за наводки:)

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Не получается вывести рандомное значение из таблицы, ругается на аргумент

 

 

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)

 

 

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Сделал просто через индексированный.

 

 

Расширение RvP что это и с чем едят, объясните по простому, пожалуйста:)

И как соорудить ассоциативный

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Как правильно достать профиль?

 

Сохраняю npc:id() непися, затем загружаю и мне нужно получить его профиль, но не через npc = level.object_by_id(id), ибо в оффлайне если нпс, то крашится игра

затем передать npc другой фунции, а там уже она снова возьмёт npc:id()

Пробовал после загрузки профиль вытаскивать через npc = alife():object(a), но он вроде как даёт сид, а дальше нужно передать "npc" с "id()"

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Вот что я думаю по этому поводу

 

Составлял не я, не имея опыта в луа, опирался на уже написанное, используя и изменяя в своих целях.

Про "проверки на пустоту"- имел ввиду, что-то вроде "здесь просто проверка на «дурака», чтобы избежать вылета"..

Спасибо за развёрнутый коммент:)

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
Как узнать/установить позицию курсора?

 

В оригинале есть в начале действо- когда ГГ показывают ПДА, посмотрел в коде- вроде как в движке всё мутится

Так и не понял как с курсором работать, мне хотя бы получение координат его нужно, и ещё желательно сделать в какой-то момент прозрачным, а потом снова вернуть ему картинку, это возможно?

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
@CRAZY_STALKER666Выложите свою геймдату, так легче найти ошибку Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Как можно сделать динамическм указание [[путь\]], то есть к [[]] добавить окончание из переменной со строковым значением perem_string = "дин.окончание пути"?

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Извиняюсь за глупый вопрос, просто первый раз к звукам притронулся.

Так вот, а зачем пути к звукам используют как [[abc/def]] ?

А не просто строкой "abc/def" ?

 

И ещё один вопрос в догонку, реально ли сделать так, чтобы при прокрутке игрового времени, допустим во время сна, чтобы вокруг(на тек. левеле) все действия ускорялись- то есть нпс быстрее бегали, физика ускоряла движения объектов и т.д и т.п., чтобы после того же сна, мы видели что было реальное увеличение скорости течения времени(а не как сейчас- всего лишь прокрутка циферок времени)

Понятное дело, что для этого придётся изменять двиг+ такое кратковременное ускорение течения времени повлечёт в такие моменты колоссальную нагрузку

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

У меня есть вот такое диалоговое окно

https://yadi.sk/d/y_NZn-eUpq7wr

Основное окно у меня на классе CUIScriptWnd.

В его инитконтроле цепляются ещё 4 окна на классе CUIWindow.

 

В основном окне я успешно использую CUIScriptWnd.Update(self) для обновления часов.

А в дочернем от основного окне(окно чата) пришлось повесить обновление этого чата на калбек апдейта игры.

 

Вопрос вот в чём:

Есть ли для CUIWindow похожий простой апдейт, как для CUIScriptWnd?

 

Если нет, то как мне мои дочерние окна на CUIWindow переделать на класс CUIScriptWnd, чтобы не использовать каллбек на апдейт, а использовать CUIScriptWnd.Update(self)?

Что-то не выходит. Запутался%(

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Создаваемый класс гуи виртуальный чтоли, не пойму?

В одном и том же скрипте класс находится, и обычная функция, если в классе создаётся/изменяется глобальная переменная, то её не видит обычная функция, и наоборот манипуляции с переменными в скрипте не видны внутри классп гуи.

 

И ещё вопром: в чём прок локальных функций "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

 

Не сочтите за наглость, просто не знаю где на это всё самому найти ответы, ещё один вопрос:D

Как поймать открытие/закрытие системных уи элементов(вроде пда, инвенторя и т.д.)?

Платформа ЗП

В ТЧ нормально получалось, а вот в ЗП что-то не получается. Вроде так же ловлю info_id (инфопоршень), но ловится только 1 раз открытие ПДА и закрытие его же, и больше не срабатывает, инвентарь и другое даже и 1 раза не ловится.

Если это важно- ковыряюсь на моде Call of Chernobyl

Изменено пользователем FonSwong

Поделиться этим сообщением


Ссылка на сообщение

@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

Поделиться этим сообщением


Ссылка на сообщение

Нет ли способа вырисовывать в реальном времени direction?

А то жутко неудобно работать с ними, не видя визуально.

Поделиться этим сообщением


Ссылка на сообщение

Взял функцию из этого поста

Но как можно в 3д вырисовать линию направления?(от одного вектора до другого)

Поделиться этим сообщением


Ссылка на сообщение

взгляд скриптово на каждую кость можно отследить? Или только на "особенные"?

Список где увидеть можно?

Можно ли узнать направление кости, т.е. допустим сторона коленки спереди сзади, сбоку?

Поделиться этим сообщением


Ссылка на сообщение

Как без отключения кнопок передвижения, отобрать управление клавой, но управление мышью не отбирая?

Поделиться этим сообщением


Ссылка на сообщение

Как ловить хиты по актору?

Причём так же важен тип хита и от кого получен.

Т.е. удар от монстра или человека, или выстрел из опред. Оружия, или же хит от жарки и т.д.

У ГГ есть кости?

Тогда так же если хит от удара или выстрела, то ещё и по какой кости ГГ пришёлся удар/выстрел.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...