Garry_Galler 7 Опубликовано 5 Октября 2009 (изменено) kirag - чисто любопытствую - через какую схему ты сделал управление ракетой? (и в каком плане управление - вправо_влево, вверх-вниз? Я тут тоже с партиклами вожусь - но у меня проще - просто бомба с дистанционным управлением - (знаю что здесь на АМК сайте - уже кто-то сделал что то подобное - но у меня свой скрипт) Вот ты в качестве позиции для отыгрыша партикла использовал self.object:position()) у меня же particles_object("explosions\\explosion_01"):play_at_pos(pos) где local pos = bomb_obj:position() а bomb_obj = level.object_by_id(obj_id) - айди объекта получаю при его спавне перед ГГ после удаления из инвентаря - получается фишка с закладкой бомбы через меню дистанционного пульта (ну дальше врубаем таймер через пульт и вали подальше :-)) не знаю в чем разница (наверно - тебя целая схема - поэтому и self, а у меня - одиночный скрипт) - но позиция моего объекта так же вроде как отслеживается и при его перемещении, и вылетов никаких нет. правда как мне пояснили кол-во задействованных партиклов может иметь значение - так как это грузит систему. В общем ладно: вопрос то у меня другой: столкнулся с проблемой телепортации эктора без указания точных координат точки перемещения: мне нужно было перемещение на заданную дистанцию, а не в конкретную точку. использовал в качестве позиции точки перемещения - позишен ГГ со смещением по радиусу от ГГ и позишен ГГ со смещение по вектору z - но оба метода портируют эктора под карту. (при спавне объектов оба метода отлично работают) попробовал накидать вот такую функцию с использованеим метода level.vertex_in_direction function set_pos() local ang = 0.5 local dir = vector_rotate_y(db.actor:direction(), ang) local pos = db.actor:position() local dist = 50 local lvid = level.vertex_in_direction(db.actor:level_vertex_id(),dir, dist) local gvid = db.actor:game_vertex_id() db.actor:set_actor_position(pos, lvid, gvid) end но это вообще никак не работает - нет ни вылета, ни действия (если функция в корне неправильная - подскажите где) Есть рабочая метода портирования эктора на заданную дистанцию? Изменено 5 Октября 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 5 Октября 2009 (изменено) Kirag интересно будет увидеть твою работу в действии. Телепорт - насчет метода db.actor:set_actor_position я понял, что вертексы туда вообще не передаются, а значит метод level.vertex_in_direction вообще не в тему. но альтернатива в виде function set_teleport() local radius = 100 local ang = 0.5 local dir = vector_rotate_y(db.actor:direction(),ang) local a = db.actor:position():add(dir:mul(radius)) db.actor:set_actor_position(a) end и этого function set_tele() local pos, z_offset z_offset = 50 pos = db.actor:position() pos.z = pos.z + z_offset db.actor:set_actor_position(pos) end портирует строго под карту. То что туда обычно передаются точные координаты по векторам - я знаю. Но мне ведь надо другое - перемещение эктора на заданную дистанцию. И как тут исхитриться задать правильный позишен через смещение я не понял. Если конечно это вообще возможно. короче поэкспериментировал сразу со всем векторами - задал по x и z по 50 и 5 по y (50 оказалось много - получались прыжки в длину и высоту одновременно) - для страховки на случай если точка перемещения окажется выше начальной позиции - прогресс есть, но из 10 портаций - две-три все равно под карту. И есть уклон перемещения от прямой линии. Может по x не задавать смещение? Изменено 5 Октября 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 6 Октября 2009 (изменено) Bak Огромное спасибо. Отличная формула - то что она работает тока на ЧН и ЗП не совсем точно: я ее слегка поправил (строчку local lvid = level.vertex_id(want_pos) - на которую игра ругалась) и она заработала и на ТЧ. Никаких казусов под карту - отлично перемещает. Жаль что сквозь стены не получается - эктор упирается в объект в случае если на пути телепортации таковой встретится. Теперь наконец то добавил кнопку телепортация в свой ручной пульт, на который вешаю разные полезные функции. Изменено 6 Октября 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 6 Октября 2009 (изменено) strong Я чисто для собственного удобства - для тестирования функций - сделал себе в игре итемс с меню - а там разные кнопочки на которые я подвесил то мне надо - например, чтобы разные враждебные элементы не мешали мне ходить свободно по карте я могу быстро сменить эктору группировку и спокойно отправляться к бандитам или воякам - я на них тестирую бомбу с дистанционным подрывом и таймером Теперь для быстрого перемещения по карте есть и кнопочка телепортация. На любую доп. кнопочку могу подвесить активацию нужного скрипта. Очень удобно - а то раньше все новые функции для через дроп вещи запускал. Изменено 6 Октября 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 6 Октября 2009 (изменено) Gonarh а также все кому нужно. Чит-меню (открывается через использование ноутбука - итемс продается у сидора) для вступления в группировки, телепортации и активации любых скриптов. вот ссылка _http://ifolder.ru/14360707 добавил две свободные кнопки для доп. скриптов - (они чуть вышли за рамку меню - но это не имеет значения, так как все кнопки работают) Изменено 6 Октября 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Ноября 2009 Помогите разобраться с функциями io вот чисто тестовый вариант написанный просто для того чтобы понять как это работает. что здесь не так? файл который я хочу изменить вроде как меняется (это видно по времени последнего изменения) - однако сами изменения в нем не отражаются. function name() local file = assert(io.open("C:\\test\\items.ltx", "r+")) local fsize = file:seek("end") if fsize == 0 then file:close() return "" end for line in io.lines("C:\\test\\items.ltx") do if string.find(line,"^%s*(inv_weight)%s*%=%s*%d*%.?%d+%A*") then k = string.upper(line) print (k) -- все что надо меняется и выводится в консоль SCITE file:write(k) -- однако сюда не пишется file:flush() -- или не сохраняется end end end Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Ноября 2009 Monnoroch вопрос снимается - разобрался (теперь все пишется как надо) - насчет того что не импортированы мне сегодня на SP сказали - жаль... Так что получается в сталкере вообще нереально делать скриптовую перезапись файлов? Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 9 Ноября 2009 Вопрос: как правильно использовать io.tmpfile() для записи во временный файл данных из файла-исходника, а затем чтения из него и перезаписи исходника. у меня пока в него ниче не пишется почему то... (поэтому пишу данные из исходника - с заменой части данных - в новый файл, а это ведь совершенно лишняя операция) не понял как сюда еще и os.tmpname() приплести - она ведь тоже нужна - чтобы имя времянки получить....пробовал и в паре их использовать и поодиночке - результат пока ноль. в общем кто знает - дайте пример пожалуйста Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 9 Ноября 2009 (изменено) Monnoroch Таки что? мне ж для себя надо понять - я моды не делаю (кроме небольших разработок) - я lua изучаю - а сталкер для меня полигон для тестов - и коли в нем не все функции пашут - значит надо забить на них? К тому ж в ЗП пригодится...когда начну и там ковыряться Изменено 9 Ноября 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 9 Ноября 2009 Monnoroch Вопрос решил - все оказалось не так сложно - всего лишь через file:seek("set") позицию чтения времянки к началу файла вернуть надо было :-) а то пустая строка возвращалaсь. Что ж к ЗП я думаю скоро перейду... в теме справочник по функциям и классам я был и читал - но там ведь особо не поспрашиваешь - тема то больше для инфы, а не для вопросов - засорять не хочется, да и заходят в нее не часто. не хватает у вас отдельной темки для вопросов по lua - как впрочем и на других сайтах по сталкеру. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 10 Ноября 2009 (изменено) max_max_08 насчет амкашного таймера не знаю но можно и так ставишь на апдейт в биндер эктора эту функцию filename.start_delay() саму функцию пишешь куда хошь в файл .script local flag_delay = false local time_delay = 0 function start_delay() if not flag_delay then return end if time_global() - time_delay > 15000 then -- задержка 15 сек db.actor:give_info_portion("info_dialog_saxar") -- включаем поршень flag_delay = false -- выключаем флаг end end вот эту функцию активируешь либо через экшен в диалоге либо через что хочешь - по ситуации function start_flag() flag_delay = true -- включаем флаг для апдейта функции time_delay = time_global() end а еще поршень можно выдать через логику непися - поставив туда таймер on_timer = 15000| %+info_dialog_saxar% -- вроде должно работать - переключение на другие схемы и запуск постэффектов я делал - а вот с поршнями не помню делал или нет... Изменено 10 Ноября 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Декабря 2009 (изменено) вопрос простой - как получить список вещей в инвентаре непися. видел не раз в модах такую конструкцию но так как не пользовался iterate_inventory поэтому непонятно откуда берутся значения для dummy и item obj:iterate_inventory(function (dummy, item) local sec = item:section() end, nil) --и зачем тут вместо переменной передается nil либо иногда что то другое. как вообще правильно получить лист значений (для вывода в мессидж) состоящий из объектов инвентаря NPC? (уточню - в моем скрипте неписи - клиентские объекты вытащенные из db.storage) надо ли загонять все инвентарные вещи в таблицу а потом распаковывать ее? через table.concat() (получше unpack'а будет) это не проблема. если надо конечно... Изменено 8 Декабря 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Декабря 2009 (изменено) Monnoroch дак пример бы подсказал вот идет у меня скрипт for k, v in pairs(st) do local obj = level.object_by_id(k) if (obj and IsStalker(obj) and obj:id()~=0) then if obj:position():distance_to_sqr(apos) < 900 then local dummy = что указать то? local item= obj:iterate_inventory(function (dummy, item) local inv = item:section() end, obj) --и obj здесь нужен или нет? Изменено 8 Декабря 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Декабря 2009 Вот здесь то что не так? obj:iterate_inventory(function (obj, item) table.insert(tbl, item:id(), item:section()) --local n = unpack(tbl) local n = table.concat(tbl,"\n") --обе попытки получить лист значений приводят к вылету end,obj) Alert я не знаю какие файлы в указанных тобой модах, но ищи скрипт такого вида - в разных модах они могу отличаться но метод съема в принципе везде одинаков function lootmoney(npc) if npc ~= nil then local npc_rank, deadmoney npc_rank = ranks.get_obj_rank_name(npc) if npc_rank == "novice" then deadmoney = math.random(25,101) elseif npc_rank == "experienced" then deadmoney = math.random(25,201) elseif npc_rank == "veteran" then deadmoney = math.random(50,401) elseif npc_rank == "master" then deadmoney = math.random(70,801) end if npc_rank ~= nil then news_manager.relocate_money(db.actor, "in", deadmoney) end local mylootingid = game.translate_string("looting_id") local news_texti = "%c[255,255,0,0]" .. mylootingid .. " \\n"..npc:character_name()..": $"..game.translate_string(tostring(deadmoney).."RU") db.actor:give_game_news(news_texti, "ui\\ui_iconsTotal", Frect():set(0,0,83,47), 0, 10000) db.actor:give_money(deadmoney) game_stats.money_quest_update(deadmoney) end return else return end end суть надеюсь понятна - в зависимости от ранга трупа получаем рандомную сумму и через метод give_money передаем ее эктору активируется она вроде бы через скрипт тайников - точно уже не помню. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Декабря 2009 (изменено) Monnoroch, Gonarh парни вы конечно скриптеры опытные, но ваши варианты не совсем то: 1. вывод в консоль мне действительно не нужен. 2. мне нужно получить инвентарь всех неписей в онлайне - с выводом данных в мессидж на экран и в текст метки - (что у меня сейчас и происходит с другими данными по сталкерам). Так как получить список инвентаря не так просто, нужна таблица - причем таблица должна быть заполнена очень аккуратно - дабы не было как у поэта - "смешались в кучу люди, кони.." в идеале таблица должна выглядеть так: local tbl= {[id]={[item:id()] = item:section(),[item:id] = item:section() и т.д. каждая вещь в инвентаре одного NPC },[next_id] ={[item:id()] = item:section(),[item:id()] = item:section(), и т.д.} и т.д. } [id] = это одновременно и ключ для будущей итерации и айди конкретного непися - такими образом для каждого NPC создается отдельная таблица, в которой содержатся все его итемсы. получить список вещей для каждого конкретного непиcя из такой таблицы труда не составляет local str = table.concat(tbl[k],"\n") --получаем строку(точнее строчки) из всех объектов инвентаря отдельного непися с переносом каждого слова\объекта на новую строку Главный вопрос - как создать такую таблицу? ведь через iterate_inventory мы получаем только один итемс за один вызов, а не все сразу и поэтому такое заполнение - table.insert(tbl, k, {[item:id()] = item:section()}) - ничего путного не дает --у меня это вообще никак в игре не проявилось - что странно - хоть бы вылетело что ли - ведь переменная str конкатенировалась к строке с данными (другие варианты приводили к вылету с логом table contains non-strings) Так как все таки правильно заполнить таблицу? Изменено 8 Декабря 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Декабря 2009 Monnoroch спасибо:-) - позже затестю. делаю обширный скрипт с выводом всей инфы о сталкерах в оналйне - (такое досье на каждого) помимо инвентаря осталось добавить в мессиджы объекты из памяти NPC - через функции мемори - если конечно получится. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 11 Декабря 2009 (изменено) Gonarh , Monnoroch Требуется еще ваша помощь. Понимаю что функция под спойлером может показаться на ваш взгляд переусложненной (нежели ваши варианты) но вот захотелось мне именно так сделать. В общем там проблема с чтением элементов таблиц четвертого уровня - в текст метки выводится только по одному итемсу у каждого непися - то есть получается читается не все что должно читаться. то что там закомментировано это попытка создать счетчик вещей (пока видимо неудачная) и удалить повторяющиеся по секции итемсы. урезанный вариант функции для вывода инфы о всех онлайн NPC - выводится только имя и инвентарь. function inventory_npc() local str = "" --local flag for k, v in pairs (db.storage) do local npc = level.object_by_id(k) if npc and IsStalker(npc) then -- local count = 0 db.storage[k].inventory = {} npc:iterate_inventory(function (tmp, item) local invName = game.translate_string(this.get_inv_name(item:section())) --flag = true --for k, vv in pairs(db.storage[k].inventory) do --if vv.sec == invName then --vv.count = vv.count+1 --table.remove(db.storage[k].inventory, vv.sec) --flag =false -- break --end --end --if flag then table.insert(db.storage[k].inventory, {item_id=item:id(), sec =item:section(), inv=invName, count=1}) --end end,npc) local id = npc:id() local name = level.object_by_id(id) for i=1, #db.storage[npc:id()].inventory do --введение допол. цикла для чтения всех таблиц ничего не дало for k, data in pairs(db.storage[npc:id()].inventory) do local text_inv = "\\nинвентарь:".."\\n"..data.inv local text_count = " ["..tostring(data.count).."]" str = name:character_name()..text_inv..text_count.."\\n" level.map_add_object_spot(id, "alife_presentation_smart_ready", str) end end end end end когда я делал трехуровневую таблицу - там все итемсы выводились как надо - но полным списком - если у непися 20 пачек патронов - то все 20 пачек построчно и выводились - хотелось бы избавиться от этого, чтобы было только имя предмета и его кол-во. Изменено 11 Декабря 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 11 Декабря 2009 Gonarh Спасибо. Но это мою проблему до конца не решает - ты же видишь - у меня СВОЙ код и нужно решить проблему именно этого кода, а ты просто предлагаешь свой вариант. как сделать по другому (попроще) - я примерно знаю. Но мне нужно именно так как у меня. С таблицей внутри db.storage - и со всеми теми полями которые у меня там есть. Мне нужно понять почему не читаются все элементы из таблицы (не поняв это - я не смогу работать с многоуровневыми таблицами). Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 11 Декабря 2009 (изменено) Gonarh посылать меня курить маны не стоит - все существующие мануалы по lua я и так прочитал. И тебе должно быть хорошо известно что в том же руководстве по lua не поясняется как работать с многомерными массивами (есть ли это в книге Роберта Иерусалимского - не знаю - так как читал только ее частичный перевод - полный перевод в инете not exist). Как такового понятия многомерного массива в lua вообще не существует (как например в паскале или визуал бейсике) - однако есть возможность создавать их через таблицы разных уровней. И соотвественно чем больше у таблицы уровней тем сложнее ее итерировать (особенное если это хэш массив). И если ты не знаешь как с ними работать, то так и скажи - а посыл оставь для других. Изменено 11 Декабря 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 12 Декабря 2009 (изменено) malandrinus банальную ошибку я уже исправил - пришлось правда что бы понять ее, в scite создать имитацию моей таблицы. все как ты и указал - был неправильный вывод инфы в итоговую строку. и for k, data in pairs(db.storage[npc:id()].inventory) do local text_inv = "\\nинвентарь:".."\\n"..data.inv local text_count = " ["..tostring(data.count).."]" str = name:character_name()..text_inv..text_count.."\\n" level.map_add_object_spot(id, "alife_presentation_smart_ready", str) надо бы исправить на этот: local id = npc:id() local name = level.object_by_id(id):character_name() str = name.."\\n".."инвентарь:".."\\n" for k, data in pairs(db.storage[npc:id()].inventory) do local text_inv = data.inv local text_count = "["..tostring(data.count).."]" str = str..text_inv..text_count.."\\n" level.map_add_object_spot(id, "alife_presentation_smart_ready", str) я бы не кипятился если бы Gonarh просто сразу указал бы (как сделал ты) на вероятную ошибку в коде (или сказал что не знает причину или просто ничего не писал так как "я тебе (равно как и ты мне) ничего не должен и ничем не обязан", а не посылал меня как совсем не рубящего в теме к тому руководству, которое у меня и так лежит распечатанное на раб. столе. Изменено 12 Декабря 2009 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение