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

[SoC] Ковыряемся в файлах


Halford

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

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

 

но это вообще никак не работает - нет ни вылета, ни действия (если функция в корне неправильная - подскажите где)

Есть рабочая метода портирования эктора на заданную дистанцию?

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

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


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

Kirag

интересно будет увидеть твою работу в действии. :good:

 

Телепорт - насчет метода 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 не задавать смещение?

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

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


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

Bak

Огромное спасибо. Отличная формула - то что она работает тока на ЧН и ЗП не совсем точно:

я ее слегка поправил (строчку local lvid = level.vertex_id(want_pos) - на которую игра ругалась) и она заработала и на ТЧ.

Никаких казусов под карту - отлично перемещает. Жаль что сквозь стены не получается - эктор упирается в объект в случае если на пути телепортации таковой встретится.

 

Теперь наконец то добавил кнопку телепортация в свой ручной пульт, на который вешаю разные полезные функции. :ok5:

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

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


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

strong

Я чисто для собственного удобства - для тестирования функций - сделал себе в игре итемс с меню - а там разные кнопочки на которые я подвесил то мне надо - например, чтобы разные враждебные элементы не мешали мне ходить свободно по карте я могу быстро сменить эктору группировку и спокойно отправляться к бандитам или воякам - я на них тестирую бомбу с дистанционным подрывом и таймером :)

Теперь для быстрого перемещения по карте есть и кнопочка телепортация.

На любую доп. кнопочку могу подвесить активацию нужного скрипта.

Очень удобно - а то раньше все новые функции для через дроп вещи запускал.

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

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


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

Gonarh

а также все кому нужно.

Чит-меню (открывается через использование ноутбука - итемс продается у сидора) для вступления в группировки, телепортации и активации любых скриптов.

вот ссылка _http://ifolder.ru/14360707

 

добавил две свободные кнопки для доп. скриптов - (они чуть вышли за рамку меню - но это не имеет значения, так как все кнопки работают)

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

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


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

Помогите разобраться с функциями 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

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


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

Monnoroch

вопрос снимается - разобрался (теперь все пишется как надо) - насчет того что не импортированы мне сегодня на SP сказали - жаль...

Так что получается в сталкере вообще нереально делать скриптовую перезапись файлов?

 

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


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

Вопрос: как правильно использовать io.tmpfile() для записи во временный файл данных из файла-исходника, а затем чтения из него и перезаписи исходника.

у меня пока в него ниче не пишется почему то... (поэтому пишу данные из исходника - с заменой части данных - в новый файл, а это ведь совершенно лишняя операция)

 

не понял как сюда еще и os.tmpname() приплести - она ведь тоже нужна - чтобы имя времянки получить....пробовал и в паре их использовать и поодиночке - результат пока ноль.

в общем кто знает - дайте пример пожалуйста

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


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

Monnoroch

Таки что?

мне ж для себя надо понять - я моды не делаю (кроме небольших разработок) - я lua изучаю - а сталкер для меня полигон для тестов - и коли в нем не все функции пашут - значит надо забить на них? <_< К тому ж в ЗП пригодится...когда начну и там ковыряться

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

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


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

Monnoroch

Вопрос решил - все оказалось не так сложно - всего лишь через file:seek("set") позицию чтения времянки к началу файла вернуть надо было :-) а то пустая строка возвращалaсь.

Что ж к ЗП я думаю скоро перейду... в теме справочник по функциям и классам я был и читал - но там ведь особо не поспрашиваешь - тема то больше для инфы, а не для вопросов - засорять не хочется, да и заходят в нее не часто. не хватает у вас отдельной темки для вопросов по lua - как впрочем и на других сайтах по сталкеру.

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


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

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

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

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


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

вопрос простой - как получить список вещей в инвентаре непися.

видел не раз в модах такую конструкцию

но так как не пользовался iterate_inventory поэтому непонятно откуда берутся значения для dummy и item

obj:iterate_inventory(function (dummy, item)

local sec = item:section()

end, nil) --и зачем тут вместо переменной передается nil либо иногда что то другое.

как вообще правильно получить лист значений (для вывода в мессидж) состоящий из объектов инвентаря NPC? (уточню - в моем скрипте неписи - клиентские объекты вытащенные из db.storage)

надо ли загонять все инвентарные вещи в таблицу а потом распаковывать ее? через table.concat() (получше unpack'а будет) это не проблема. если надо конечно...

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

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


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

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 здесь нужен или нет?

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

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


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

Вот здесь то что не так?

 

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 передаем ее эктору

активируется она вроде бы через скрипт тайников - точно уже не помню.

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


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

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)

Так как все таки правильно заполнить таблицу?

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

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


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

Monnoroch

спасибо:-) - позже затестю.

 

делаю обширный скрипт с выводом всей инфы о сталкерах в оналйне - (такое досье на каждого)

помимо инвентаря осталось добавить в мессиджы объекты из памяти NPC - через функции мемори - если конечно получится.

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


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

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

 

 

 

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

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


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

Gonarh

Спасибо.

Но это мою проблему до конца не решает - ты же видишь - у меня СВОЙ код и нужно решить проблему именно этого кода, а ты просто предлагаешь свой вариант.

как сделать по другому (попроще) - я примерно знаю. Но мне нужно именно так как у меня. С таблицей внутри db.storage - и со всеми теми полями которые у меня там есть. Мне нужно понять почему не читаются все элементы из таблицы (не поняв это - я не смогу работать с многоуровневыми таблицами).

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


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

Gonarh

посылать меня курить маны не стоит - все существующие мануалы по lua я и так прочитал. И тебе должно быть хорошо известно что в том же руководстве по lua не поясняется как работать с многомерными массивами (есть ли это в книге Роберта Иерусалимского - не знаю - так как читал только ее частичный перевод - полный перевод в инете not exist).

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

И если ты не знаешь как с ними работать, то так и скажи - а посыл оставь для других.

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

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


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

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 просто сразу указал бы (как сделал ты) на вероятную ошибку в коде (или сказал что не знает причину или просто ничего не писал так как

"я тебе (равно как и ты мне) ничего не должен и ничем не обязан"
, а не посылал меня как совсем не рубящего в теме к тому руководству, которое у меня и так лежит распечатанное на раб. столе.
Изменено пользователем Garry_Galler

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


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

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