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

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

Коли так, то у него наклон получить сложнее будет. Это же не объект, а всего лишь кость худа.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Пытаюсь допилить 3D-гильзы от выстрелов. Механизм уже готов для ГГ, сейчас вот адаптирую схему под НПС, в связи с тем нет возможности использовать векторы от камеры =\

В принципе в момент выстрела ствол обычно смотрит ровно, но ведь НПС может стрелять и из укрытия вслепую, но в принципе это всё довольно редкие события поэтому наличие таких мелких "недоработок" в принципе не критично.

Дирекция мне нужна чтобы указать в какую сторону отлететь гильзе (для хита)

 

X-Ray ext применять не хочу, также можно было бы ещё просто в оружии добавить новые кости (одна у затвора, другая левее) и через них считать направляющий вектор, но в обоих случаях схема перестаёт быть универсальной.

 

 

malandrinus

Я именно про оружие в руках НПС, а не про худ - с худом то как раз проблем нету :)

Просто я тестировал с камерой игрока т.к у меня скрипт был под неё настроен + можно было сравнить получившиеся векторы с "эталонными" от device()

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

antreg, я не думаю, что ваш вопрос уместен в этой теме. Поискав нужное вам в файлах игры, найдя рестриктор, после которого активируется сцена, я наткнулся на следующий файл логики: config/scripts/agr/agr_knockdown.ltx

Вопрос более чем уместен в этой теме.

Алгоритмы из agr_knockdown.ltx не являются решением вышеописанной задачи.

Задача совсем другая.

 

Более чем НЕ уместен!

К скриптам не относится не коим образом.

Либо меняй постановку задачи либо пиши в "ковырялку", хотя абсолютно не за чем - решается с помощью кат сцены.

ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

Есть такой мод на ЧН "Наемники", позволяет нанимать отряды. Этот мод добавлялся в разные солянки, но у всех одна и та же проблема, вылет при попыке нанять отряд:

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\priquel\sources\engine\xrServerEntities\script_engine.cpp

[error]Line : 180

[error]Description :

[error]Arguments : LUA error: ...er clear sky\gamedata\scripts\actor_need_help.script:744: attempt to index field '?' (a nil value)

 

 

 

stack trace:

Что ж идем туда, куда нас послали: в 744 строку скрипта.

 smart = squad.board.smarts[v].smrt

Это из куска функции, в функцию передается параметр squad, который равен

 local se_npc = alife():object(npc:id())
local squad = se_npc.board.squads[se_npc.squad_id]

Так вот вопрос какое значение он не может получить? Подскажите, или хотя бы пошлите меня туда, куда ссылается smart = squad.board.smarts[v].smrt на какую там функцию, или скрипт.

Вот сам скрипт целиком: http://yadi.sk/d/Ob8RCGAn2ZHOG

Изменено пользователем Старлей
  • Нравится 1
  • Не нравится 1
Ссылка на комментарий

Нашел старый скрипт от колгомора для возрождения НПЦ. Вот он-

local need_update = 0
local heart = nil
local id

function on_item_drop(item)
if item:section() ~= "mega_heart" then
return
end
--dbg.log("RES: on_item_drop item=%s", item:name())
heart = item
need_update = 1
end

function update()
if need_update == 0 then return end
--dbg.log("RES: update stage=%s", need_update)
if need_update == 1 then
local obj = heart:parent()
if obj == nil then
--dbg.log("RES: only drop. return")
return
end
id = obj:id()

local inv = level.main_input_receiver()
if inv ~= nil then
level.start_stop_menu(inv, false)
--dbg.log("RES: close inv")
end

amk.convert_npc[id] = true
local sim = alife ()
sim:set_switch_online (id, false)
sim:set_switch_offline (id, true)
--dbg.log("RES: [%s] move offline", obj:name())
need_update = 2
elseif need_update == 2 then
--dbg.log("RES: update 2")
local obj = level.object_by_id(id)
if obj == nil then
--dbg.log("RES: real move offline")
else
--dbg.log("RES: wait offline")
return
end
--dbg.log("RES: update 3")
local sobj = alife():object(id)
--dbg.log("RES: update 4")
t = amk.read_stalker_params(sobj)
--dbg.log("RES: update 5")
t.health=0.1
t.killerid=65535
for i=1,8 do t.game_death_time[i] = 0 end
t.updhealth = 0.1
t.skeleton_flags=0
--dbg.log("RES: update 6")
amk.write_stalker_params(t, sobj)
--dbg.log("RES: repack packet")
need_update = 0
end

 

Если положить арт нпц то как и положенно закроется меню рюкзака но нпц возраждатся не хочет. Почему не пойму. Может потому что я этого нпц сам делал и у него id нету?

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

Не соответствует правилам.

Ссылка на комментарий

Старлей

Видимо скрипт ни в одном моде не тестировали :D

 

 

[size=4]local smart_ids = {4869,209}[/size]
for k,v in pairs(smart_ids) do
smart = squad.board.smarts[v].smrt

 

Таблица smarts находится в скрипте sim_board.script

 

--' Таблица содержащая смарты и данные о них в формате:
--' smart = {smrt, targets = {}, dangers = {}, squads = {}, stayed_squad_quan = 0}
self.smarts = {}

 

И она в качестве индекса содержит id (идентификатор) объекта (смарта)

self.smarts[obj.id] = ...

 

Который при КАЖДОЙ новой игре всегда разный. (здесь видимо спутали со story id)

 

В скрипте же идёт попытка получить смарт по его id, который к новой игре уже не применим, т.к объекта с таким id уже просто не существует.

 

squad.board.smarts[v]

Где v = 4869 - нет такого смарта, что и генерирует вылет при попытке далее взять значение поля smrt

 

_______________________________________________

 

А вообще при беглом осмотре там какой то бред получается, скрипт скорее всего не доделан и как он попал в моды вообще не понятно.

 

В частности вся суть function update_squad(squad,pflag) сводится к тому, чтобы проверить два указанных смарта с id {4869,209}, (притом что при новой игре эти значения уже будут не верны, что наводит на мысль что автор скрипта просто тестировал что то своё)

 

Далее если смарт находится не на одном уровне с игроком, то из него выгоняются все отряды кроме одного, который был передан в функцию.

 

Как вариант попробуй сократить функцию до:

[/size]
function update_squad(squad,pflag)
for k,v in pairs(squad.squad_npc) do
 local npc = level.object_by_id(k)
  if npc ~= nil then
     npc:remove_all_restrictions()
  end
end
end

 

М.б всё заработает.

 

 

 

CRAZY_STALKER666

 

Раскоментируй везде dbg.log (если у тебя в моде есть такой скрипт, в противном случае выводи сообщения любым другим способом) и смотри в консоли\в игре в каком моменте скрипт перестаёт выполняться.

  • Нравится 2

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Shoker

Обрывается на этом -

amk.convert_npc[id] = true
local sim = alife ()
sim:set_switch_online (id, false)
sim:set_switch_offline (id, true)

Как понял? Кргда ложиш стаалкеру в инвертарь арт он исправно закрывается. А далее простой.

 

Раз уж взялся писать в данную тему - "шапку" прочти, пожалуйста!

ColR_iT

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

Не соответствует правилам.

Ссылка на комментарий

sim:set_switch_online (id, false)
sim:set_switch_offline (id, true)

Добавь проверку на то, что id не nil и и в игре существует такой объект (alife():object(id)). Не могу точно утверждать, но у меня в ЗП был случай, когда я долго искал ошибку, оказалось что передавал в alife():object() nil. Вылета не было, но биндер зависал.

Ссылка на комментарий

Пожалуйста, подскажите, таймер такого вида будет работать, через месяц игрового времени:

 

 

--Таймер игрового времени
function g_timer(day, hou, min, void)
if day == nil or hou == nil or min == nil then
 den.cout("den.g_timer(day=nil or hou=nil or min=nil)")
 return nil
end
local n_day = level.get_time_days() + day
local n_hou = level.get_time_hours() + hou
local n_min = level.get_time_minutes() + min
if n_hou > 24 then
 n_hou = n_hou - 24
end
if n_min > 60 then
 n_min = n_min - 60
end
if n_day > 30 then
 n_day = n_day - 30
end
local col = den.load_variable("den_g_timers_col")
if col == nil then
 col = 0
end
col = col + 1
den.save_variable("dgtd_"..col, n_day)
den.save_variable("dgth_"..col, n_hou)
den.save_variable("dgtm_"..col, n_min)
if void ~= nil then
 den.save_variable("dgtf_"..col, void)
else
 den.cout("den.g_timer(void=nil)")
end
den.save_variable("den_g_timers_col", col)
end

--Таймер реального времени
function timer(val, void)
if val ~= nil then
 local col = den.load_variable("den_timer_col")
 if col == nil then
  col = 0
 end
 col = col + 1
 den.save_variable("drtt_"..col, game.time() + val * 1000 * system_ini():r_float("alife","time_factor"))
 if void ~= nil then
  den.save_variable("drtf_"..col, void)
 else
  den.cout("den.timer(void=nil)")
 end
 den.save_variable("den_timer_col", col)
else
 den.cout("den.timer(val=nil)")
end
end

local day, hou, min = 0, 0, 0
local col = 0
--Обновление таймеров
function update()
--Таймер игрового времени
col = den.load_variable("den_g_timers_col")
if col ~= nil then
 for key=1,col do
  if level.get_time_days() == den.load_variable("dgtd_"..key) and
  level.get_time_hours() == den.load_variable("dgth_"..key) and
  level.get_time_minutes() == den.load_variable("dgtm_"..key) then
   den.del_variable("dgtd_"..key)
   den.del_variable("dgth_"..key)
   den.del_variable("dgtm_"..key)
   local void = den.load_variable("dgtf_"..key)
   if void ~= nil then
    den.del_variable("dgtf_"..key)
    den.save_variable("den_g_timers_col", col - 1)
    for val=key,col do
     den.save_variable("dgtd_"..val, den.load_variable("dgtd_"..val+1))
     den.save_variable("dgth_"..val, den.load_variable("dgth_"..val+1))
     den.save_variable("dgtm_"..val, den.load_variable("dgtm_"..val+1))
     den.save_variable("dgtf_"..val, den.load_variable("dgtf_"..val+1))
    end
    if this[void] ~= nil then
     this[void]()
    else
     den.cout("den_timer-this["..void.."]=nil")
    end
   end
  end
 end
end
--Таймер реального времени
col = den.load_variable("den_timer_col")
if col ~= nil then
 for key=1,col do
  if game.time() >= den.load_variable("drtt_"..key) then
   den.del_variable("drtt_"..key)
   local void = den.load_variable("drtf_"..key)
   if void ~= nil then
    den.del_variable("drtf_"..key)
    den.save_variable("den_timer_col", col - 1)
    for val=key,col do
     den.save_variable("drtt_"..val, den.load_variable("drtt_"..val+1))
     den.save_variable("drtf_"..val, den.load_variable("drtf_"..val+1))
    end
    if this[void] ~= nil then
     this[void]()
    else
     den.cout("den_timer-this["..void.."]=nil")
    end
   end
  end
 end
end
end

 

 

Ссылка на комментарий

В amk есть функция amk_mod.spawn_unspawned_respawners()

Она крейтит эти самые респавнеры, и пишет им параметры в customdata. Затем они подхватываются, и записанное волшебным образом можно считать из obj:spawn_ini(). Но как сделан этот фокус ?

 

И, кстати, в чем смысл функции se_respawn.reinit_spawner_params(), если на момент ее вызова фокус еще не произошел ?

Ссылка на комментарий
А где фокус?

Разобрался. Фокус был в том, что :init() дергается сразу же, как объект создан. Или непосредственно прямо в alife():create(), или при возвращении из нее.

Соответственно, obj:spawn_ini() возвращало первый раз пустую строку, и только потом уже можно записать customdata.

Ссылка на комментарий

Вот интересно, в bind_physic_object.script в generic_physics_binder:update() все нормально с установкой коллбэков ? В оригинале имеется в виду.

 

Действительно есть такие events, после которых их надо заново выставлять в каждом апдейте ?

А сбрасывать их при дестрое не надо ?

Ссылка на комментарий

Доброго времени  суток. Возник вопрос по внедрению ПНВ через скрипт : 
  А) Возможно ли узнать, включен ли встроенный в костюм ПНВ, считав net_packet() (т.е. какой нет пакет/значение пакета, если таковые существуют, нужны, чтобы узнать включен ли ПНВ) ?
  Б) Возможно ли узнать, включен ли встроенный в костюм ПНВ из pstor актора при помощи xr_logic.pstor_retrieve() ?
  В) Вопрос связан с предыдущими двумя :

Если существует положительный ответ на пункт А или Б , то есть ли возможность принудительно (через запись в pstor / net_packet) включить / выключить ПНВ ?

 

Ничто общее из частного не следует.

Ссылка на комментарий

Alex Rinic, а покопаться по исходным(ПЫСовским) скриптам слабо? Только дам наводку, xr_effects.script, в нем есть нужные тебе функции(ну прям в 200% точности, то, что тебе нужно, судя по вопросам). И мб еще что интересного для себя найдешь...

Ссылка на комментарий

Viнt@rь , если это намёк на 


function main()
    game.start_tutorial("part_1_pda")
end
 
 
function pnv1()
    level.add_pp_effector("nightvision_bad.ppe", 1034, true)
end
 
function pnv2()
    level.add_pp_effector("nightvision_good.ppe", 1034, true)
end
 
function clear()
    level.remove_pp_effector(1034)
end

 

 

 

в test.script , то это не то, что мне нужно , так как требуется реализация именно включения - выключения ПНВ через чтение/запись Pstor или нет пакет, а не просто удалениe эффектора nightvision_bad/nightvision_good.ppe через level.remove_pp_effector()  ...



UPd  

 

 

function run_postprocess(actor, npc, p)    if p[1] then
        local loop, num = false, (2000 + math.random(100))
        
        if p[2] and type(p[2]) == "number" and p[2] > 0 then
            num = p[2]
        end


        if p[3] and p[3] == "true" then
            loop = true
        end
        
        level.add_pp_effector(p[1] .. ".ppe", num, loop)
    end
end


function stop_postprocess(actor, npc, p)
    if p[1] and type(p[1]) == "number" and p[1] > 0 then
        level.remove_pp_effector(p[1])
    end
end
 

 

 

сюда тоже прошу не отсылать ... просьба модераторам объединить мои посты в один ...

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

Ничто общее из частного не следует.

Ссылка на комментарий

Alex Rinic, ответ нужно было искать в этой теме.

 

Во-первых, незашоривайся. 'Pstor' - это всего лишь (суб)табличка в которую 'кто-то что-то' заносит и она запоминается в сэйвах. Подобная мелочевка (nightvision) конечно же туда не пишется, иначе бы никакого объема нет-пакета не хватит... Все подобное обрабатывается и запоминается движком в самом объекте.

А вот если бы заглянул в посты по нет-пакетам и почитал бы повнимательнее, то мог бы найти не раз упоминавшуюся табличку флагов, в частности:

 

torch_flags.Active            = 1
torch_flags.NightVisionActive = 2 --/< то что ищешь!
torch_flags.Unknown           = 4
Т.о. читая нет-пакет фонарика (cse_alife_item_torch), который у актора в соотв.слоте (а не в рюкзаке!), по бит-флагу можешь узнавать, включен ли 'nightvision'.
А вот изменять, т.е. устанавливать требуемое состояние для  'nightvision- это уже посложнее, т.к. изменение нет-пакета производится с серверным объектом фонарика, и для того, чтобы изменения вступили в силу потребуется фонарик отправить в оффлайн и вернуть обратно... Т.е. потребуется "отобрать" у актора его слотовый фонарик и после появления в онлайне - вернуть обратно в слот.
(дальше сам экспериментируй, модули работы с нет-пакетами и подобными флагами доступны в инете).
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Alex Rinic, когда задаешь вопрос, пиши плз по какой версии игры? в ЗП есть функции контроля фонариком и пнв в xr_effects.

 

Оффтоп

Artos, ты вернулся? :)

Изменено пользователем Viнt@rь
Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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