Карлан 1 049 Опубликовано 1 Июля 2015 Поделиться Опубликовано 1 Июля 2015 (изменено) , @Zander_driver, мне одному кажется что ему просто хит коллбек нужен? @Zander_driver, у тебя есть расширение от рвп, его и юзай, на нем можно очень элегантный парсер написать, который будет вполне себе быстро работать, побыстрее того что на дефолте накостылить можно это как минмум. Я месяцев несколько назад делал, но не для внутриигровых целей, тестировал, все отлично. Изменено 1 Июля 2015 пользователем Карлан Ссылка на комментарий
Zander_driver 10 334 Опубликовано 1 Июля 2015 Поделиться Опубликовано 1 Июля 2015 мне одному кажется что ему просто хит коллбек нужен? Если надо именно попадание - то можно вообще обойтись хит-колбеком неписей, мутантов, и тех кто тебе еще понадобится (если понадобится). Просто проверить кто нанес хит, и все. Нет, не одному. Просто когда вопрос как минимум наполовину "для Кашпировских", приходится пытаться угадывать разные варианты. Вопрос наверно нубский, но, кхм, оказывается я не умею пользоваться string.find... Короче ситуация: local pos = string.find(ammo_list,border_symbol,1) local ammo_return = {} local a = 1 local spos = 1 while pos ~= nil do ammo_return[a] = string.sub(ammo_list, spos, pos - 1) spos = pos + 1 pos = string.find(ammo_list, border_symbol, spos) a = a + 1 end на входе - ammo_list это строка примерно в 30 символов a..z и 0..9. Так же там _ОДИН_ раз попадается символ точка.т.е. это строка вида "скрипт.функция" border_symbol = "." т.е. просто символ точки. таким образом, string.find должен найти в строке точку. почему он ее находит в каждом символе? на выходе этого кода я получаю таблицу заполненную тридцатью пустыми строками... Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Charsi 440 Опубликовано 1 Июля 2015 Поделиться Опубликовано 1 Июля 2015 (изменено) @Zander_driver, string.find вторым аргументом принимает шаблон. Шаблон "." означает любой символ. Чтобы получить просто символ точки, её нужно экранировать вот так "%." Вообще может имеет смысл использовать gmatch? local ammo_return = {} for sName in ammo_list:gmatch("([^%"..border_symbol.."]+)") do table.insert(ammo_return, sName) end Изменено 1 Июля 2015 пользователем Charsi 1 1 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
Карлан 1 049 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 оказывается я не умею пользоваться string.find Дык матчасть жи, gmatch тут самое оно, да, если-бы тебе просто поиск был нужен то gfind, а у find (string,pattern,index) входные. Ссылка на комментарий
macron 1 884 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 (изменено) Можете исправить, где-то накосячил, наверное. Пытаюсь создать скрипт, удаляющий объект по заданным xyz координатам. Непосредственно для уничтожения задействован amk.remove_item. Но до него, наверно, даже не доходит. -- удаление объектов совпадающих по координатам с lvl14_stancia_level_changer_0001 -- координаты объекта для уничтожения local gluk_object:position() = vector():set(116.575942993164, -0.0990743637084961, 518.794067382813) local actor = db.actor local lev_name = level.name() function update() if actor and lev_name == lname then for i=1,65535 do local gluk_object = level.object_by_id(i) if gluk_object ~= nil amk.remove_item(gluk_object) else end end end end Изменено 2 Июля 2015 пользователем macron Ссылка на комментарий
Карлан 1 049 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 (изменено) if gluk_object ~= nil then забыл. и вообще функция довольно странная, что хочешь от нее? проверка программой на эту строку показывает ещё. Ну дык этож очевидно-невероятное, я и не стал указывать, макрон же не новичок. Изменено 2 Июля 2015 пользователем Карлан Ссылка на комментарий
LightOver 12.1 0 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 (изменено) local gluk_object:position() = vector():set(116.575942993164, -0.0990743637084961, 518.794067382813) проверка программой на эту строку показывает ещё. Изменено 2 Июля 2015 пользователем LightOver 12.1 Ссылка на комментарий
macron 1 884 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 (изменено) функция довольно странная, что хочешь от нее? Сам скрипт должен вызываться из bind_stalker.script в момент сохранения, дабы удалить объекты совпадающие по координатам с левелчейнжерами (игра иногда генерит такие кривые объекты, использующие координаты и parent_id от левелчейнжера, в результате чего бьются сейвы - рождаются вылеты "child registered but not found"). Соответственно, заранее зная и забив точные координаты всех левелчейнжеров в этот скрипт, можно проблему решить. Пока что отрабатываю саму возможность удаления объектов по заданным координатам. Но проблема в том, что умею только совмещать скрипты, в остальном ни хрена не разбираюсь, поэтому мои функции могут быть чрезвычайно странными. Изменено 2 Июля 2015 пользователем macron Добавлено Dennis_Chikin, 11 Июля 2015 По-моему, при сохранении удалениями заниматься как раз и нельзя. А вообще - level.object_by_id() в цикле, проверка секции предмета, проверка на отсутсвие парента, проверка на попадание в бокс из того же amk.script, ну или на вертекс. Ссылка на комментарий
Карлан 1 049 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 @macron, да ниче страшного, гляди, есть такая функция distance_to (и еще distance_to_sqr, думаю чем отличаются ясно), и вот сравниваешь где-то так: local changer = vector():set(x,y,z) --// тут позишн ченджера local actor, lev_name, dist = db.actor, level.name() if actor and lev_name == lname then for i=1,65535 do local gluk_object = level.object_by_id(i) if gluk_object then dist = changer:distance_to(gluk_object:position()) if dist < 5 then --// 'радиус ченджера' ставишь свой amk.remove_item(gluk_object) end end end end Вызывай только не на апдейте . 1 Ссылка на комментарий
Forser 47 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 А можно ли отследить процесс загрузки игры через скрипты? Ссылка на комментарий
Карлан 1 049 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 @Forser, на дефолте только две стадии: старт и синхронизация, в седьмом альпет вроде что-то делал, но я не пробовал, в любом случае можно сделать самому, в общем читай фак если интересно. Ссылка на комментарий
Forser 47 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 (изменено) @Карлан, нужно что-то типа апдейта загрузчика, тобишь чтоб был апдейтер, работающий только во время загрузки игры. Но как понимаю для этого нужно поправить движок. Изменено 2 Июля 2015 пользователем Forser Ссылка на комментарий
Карлан 1 049 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 @Forser, цель-то какая? Ссылка на комментарий
Forser 47 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 @Карлан, музыкальное сопровождение. Ссылка на комментарий
Карлан 1 049 Опубликовано 2 Июля 2015 Поделиться Опубликовано 2 Июля 2015 (изменено) @Forser, зитс импосибл, только движок, только хардкор. Заряди функцию отыгрывания звука, или прямо в движке закостыль свою музяку где-там тебе велят. Изменено 2 Июля 2015 пользователем Карлан Ссылка на комментарий
Forser 47 Опубликовано 3 Июля 2015 Поделиться Опубликовано 3 Июля 2015 local actor = db.actor local n_s local slot = actor:item_in_slot(n_s):section() function test() n_s = номер_слота if slot == "предмет" then -- функции end end Будет ли сие работать? Ссылка на комментарий
Карлан 1 049 Опубликовано 3 Июля 2015 Поделиться Опубликовано 3 Июля 2015 (изменено) @Forser, когда в слоте ничего не будет, то будет вылет. Ну и конструкция вообще весьма подозрительная. Попробуй: function check_slot(n) if db.actor and db.actor:item_in_slot(n) then local sect = db.actor:item_in_slot(n):section() if sect and sect..'' and sect == 'item_section' then --// action end end end Изменено 3 Июля 2015 пользователем Карлан Ссылка на комментарий
Forser 47 Опубликовано 3 Июля 2015 Поделиться Опубликовано 3 Июля 2015 (изменено) когда в слоте ничего не будет, то будет вылет Угу, пошаманю. А конструкцию менять не вариант, так как она не для 1-ной функции. local actor = db.actor local n_s local slot_s = actor:item_in_slot(n_s) local slot = slot_s:section() function test() n_s = номер_слота if actor and slot_s if slot == "предмет" then -- функции end end end А так будет вылет при отсутствии предмета? Изменено 3 Июля 2015 пользователем Forser Ссылка на комментарий
Kirgudu 1 217 Опубликовано 3 Июля 2015 Поделиться Опубликовано 3 Июля 2015 (изменено) @Forser, будет. И даже целых два, как и в первом варианте. Во-первых, то, что за пределами функции, выполнится уже при инициализации модуля (если, конечно, не заключено в ещё большую внешнюю функцию). А значит попытается присвоить значение переменной slot_s, которая в случае отсутствия чего-либо в слоте станет равной nil. И следующим действием ты сразу пытаешься взять секцию, что с slot_s = nil даст немедленный вылет. А во-вторых, уже actor:item_in_slot(n_s) при начальном выполнении даст, скорее всего, вылет, так как переменная n_s ещё не инициализирована. Вот вариант: local get_slot_section = function(n_s) local item = db.actor and db.actor:item_in_slot(n_s) return item and item:section() end function test() local section = get_slot_section(номер_слота) if section == "предмет" then ... end end Изменено 3 Июля 2015 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
UnLoaded 313 Опубликовано 3 Июля 2015 Поделиться Опубликовано 3 Июля 2015 (изменено) Угу, пошаманю. А конструкцию менять не вариант, так как она не для 1-ной функции Тут на тропинке лежат грабли, и когда иду по этой тропинке, всегда искры из глаз - от удара держаком этих самых грабель. Но я маршрут этой тропинки менять не буду, потому как эту тропинку знают многие, а чтоб в мозгу сильно не искрило от держака, я его поролоном обмотаю... Изменено 3 Июля 2015 пользователем UnLoaded 2 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти