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

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


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

использовать к примеру модуль нет-пакетов от Artos

а где его можно посмотреть? Изменено пользователем Kirgudu
Ссылка на комментарий

Привет. Подскажите пожалуйста, как исправить баг с взятием предметов через стены\двери? Помню, давно где-то было решение. И как можно отключить взятие предметов пачкой, чтобы при одном нажатии кнопки подбирался только один, как это было в ТЧ?

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

Здоровенько, товарищ.

как исправить баг с взятием предметов через стены\двери?

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

По второму вопросу и я бы тоже послушал, что люди добрые скажут.

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

Ранее я спрашивал:

При наведении курсора на квестовый предмет появляется надпись "Поднять предмет(а)". Сам предмет заспавнен с начала игры. Можно-ли сделать так, чтобы до получения определенного инфопоршня эта надпись не появлялась и предмет невозможно было бы подобрать?

На что был получен ответ от Serge! об использовании nonscript_usable (true/false). Посмотрел в оригинальных скриптах и нашел - использование такого метода в логике inventory_box.

Создал квестовый предмет (бумажный сверток):

[calendar_0_info]:device_pda


$spawn                 = "quest_items\calendar_0_info"
visual                = dynamics\new_dynamics\roll\calendar_0.ogf
inv_weight            = 0.01
inv_grid_width        = 1
inv_grid_height        = 1
inv_grid_x            = 19
inv_grid_y            = 4
description            = calendar_0_info_desc
inv_name            = calendar_0_info
inv_name_short            = calendar_0_info
can_trade            = false
cost                 = 0
quest_item                 = true
story_id             = calendar_0_info

 

Разместил на локации в SDK:

3034142.jpg

 

Прописал логику квестовому предмету:

[logic]
active = ph_idle@notup

[ph_idle@notup]
nonscript_usable = false
on_info = {+calendar_find_enable} ph_idle@up

[ph_idle@up]
nonscript_usable = true

 

Т.е. по задумке пока не получен инфопоршень calendar_find_enable предмет нельзя подобрать и он себя "никак не выдает" (нет надписей-подсказок). Но что-то не так и сверток подбирается. Может кто подсказать что не так?

Заранее спасибо!

С#Н#Т#Р# (CoP 1.6.02)

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

И так и так пробовал - не помогает... :(

Если я не ошибаюсь, в ЗП предметы (объекты), которые ГГ может поднять в рюкзак, не могут иметь логики.

Можно сделать( как обычно и делали разрабы сталкера)  подмену объекта.

 

Например вот так

 

Для этого на локации в начале игры проспавните объект вот с такой секцией

 

[calendar_fake_info]:inventory_box
visual                = dynamics\new_dynamics\roll\calendar_0.ogf
custom_data = scripts\calendar_fake_info.ltx
 
Секцию пропишите в devices.ltx ниже секции [inventory_box]
 
Далее в файле calendar_fake_info.ltx
пропишите логику вот такую
 
[logic]
active = ph_idle@notup
 
[ph_idle@notup]
nonscript_usable = false
on_info = {+calendar_find_enable} ph_idle@nil %=destroy_and_spawn_new_object(calendar_0_info)%
 
[ph_idle@nil]
 
Добавьте в файл xr_effects.script следующую функцию
 
function destroy_and_spawn_new_object(actor, obj, p)
 
if p and p[ 1 ] then
local section = tostring( p[ 1 ] )
local s_obj = alife():object( obj:id() )
if s_obj then
local position, lv_id, gv_id = s_obj.position, s_obj.m_level_vertex_id, s_obj.m_game_vertex_id
alife():create( section, position, lv_id, gv_id )
alife():release( s_obj, true )
end
end
 
end
 
Ну и соответственно в файле quest_items.ltx должна быть прописана секция calendar_0_info
 
После выдачи инфопоршня фейковый объект удалится и проспавнится новый, который ГГ сможет поднять в рюкзак

 

 

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

@makdm, спасибо за помощь - все работает как надо!!! Только не понял зачем прописывать в devices.ltx? Я этого не делал и так все работает :)  Но теперь новая проблема - лист календаря (который надо как бы сорвать со стены) не появляется на стене, а падает. Т.е. фейковый висит как надо, а после подмены квестовый предмет "не хочет висеть где надо" и падает на землю. Как его зафиксировать?

P.S. Вообще, заметил, что у квестовых предметов нет опции "зафиксировать кость".

С#Н#Т#Р# (CoP 1.6.02)

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

 

 

Вообще, заметил, что у квестовых предметов нет опции "зафиксировать кость".

Наличие костей в модели не зависит от того квестовый он или нет. Если используешь для фейкового и нормального предметов одну и ту-же модель - просто добавь fixed_bone нормальному и будет тебе счастье...

Ссылка на комментарий
Наличие костей в модели не зависит от того квестовый он или нет

Не корректное замечание. Речь не шла о наличии или отсутствии костей. Извините, ёжику понятно что все физические объекты имеют кости. Просто у обычного физического объекта установленного на локацию как physic_object в свойствах есть опция "зафиксировать кость", а если этот же объект установить как quest_items, то у него уже такой опции нет. Вот и спросил - как его зафиксировать чтобы он не падал.

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

С#Н#Т#Р# (CoP 1.6.02)

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

Насколько я понимаю, понятие "опция "зафиксировать кость"" это из SDK. Если ты предмет спавнишь скриптом - как с ним можно в SDK работать ?

 

 

 

Вот и спросил - как его зафиксировать чтобы он не падал

Как всегда - через кость:

 local pshell = obj:get_physics_shell()
 if pshell then
  local element = pshell:get_element_by_bone_name("link")
  if element then
   element:fix()
  end
 end
Ссылка на комментарий

@AndreySol, да, в свойствах объекта из SDK. Фейковый объект установлен изначально мной в SDK. Квестовый, получается, спавнится скриптом, вы правы. Куда нужно "встроить" написанное вами?

С#Н#Т#Р# (CoP 1.6.02)

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

@Jeka81, еще можно сразу в секции итема указать, вот как-то так:



[jup_b219_gate]:physic_object
$spawn                        = "dynamic_objects\scene_objects\jup_b219_gate"
visual                        = dynamics\door\door_katakomb_big_4.ogf
story_id 					= jup_b219_gate_id
fixed_bones					  = link
custom_data 		      = models\objects\ignore_static.ltx
  • Спасибо 1
Ссылка на комментарий

@Jeka81,

Насчет указания фиксации кости в секции объекта - ничего сказать не могу, не проверял. Но проверю, интересная вещь...

 

В скрипте можно сделать двумя способами:

1). Фиксация на клиентской стороне - создать объект, и после выхода его в он-лайн зафиксировать вышеприведенным кодом.

 

2). Фиксация на серверной стороне, с внесением изменений в нет-пакет объекта (пример с использованием модуля нет-пакетов от Artos):

  local ser_obj = alife():create(.....наш объект.....)
  if ser_obj then
   ----- фиксируем объект после создания -----
   local pk = m_netpk.get(ser_obj) -- запрос нет-пакета
   if pk and pk:isOk() then
    local data = pk:get() -- читаем данные из нет-пакета
    if data then
     data.fixed_bones = "link"
     pk:set(data) -- сохраняем данные в нет-пакет
    end
   end
  end

Второй способ проще, на мой взгляд...

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

@AndreySol, к сожалению, я новичек в скриптовании и эти два способа только больше меня запутали ^_^ Не знаю что такое клиентская сторона и серверная сторона. Но это пол беды. Во время тестов фейковый объект располагал "как есть" - не вращал его в редакторе. После подмены "правильный" предмет спавнился на месте фейкового. Сейчас фейк повернул (0,90,0)  и обнаружилось, что квестовый спавнится не наследуя поворот фейкового, т.е. его поворот (0,0,0)! Новая проблема!

С#Н#Т#Р# (CoP 1.6.02)

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

 

 

и обнаружилось, что квестовый спавнится не наследуя поворот фейкового

Ну так и должно быть - заспавненный скриптом объект не имеет никакого отношения к расстановке объектов в SDK...

 

Насчет ориентации предмета - тот-же нет-пакет:

data.direction = vector():set(0,90,0)

 

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

опять-же, к сожалению, но модострой только посредством ковыряния в SDK и конфигах - однозначно не полноценный. Осваивайте скриптование...

Ссылка на комментарий
Новая проблема!

Что мешает развернуть серверный объект на 90 градусов против часовой стрелки вокруг оси Y до его вывода в онлайн?

 

Попробуй так

 

local s_obj = alife():create( spawn_section,  position,  level_vertex_id,  game_vertex_id )

s_obj:set_yaw( 90 * math.pi  /  180 )

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

Как я понимаю, событие actor_binder:on_item_take (obj) отрабатывает и при загрузке сейва, и при взятии предмета во время игры.

Можно ли отследить в какой момент оно вызывается?

Наверное есть или инфопоршень, или флаг. Пробовал просто отслеживать состояние объекта в онлайне, но  нужного эффекта не получил.

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

Можно попробовать в actor_binder:update сделать:

if device().precache_frame <= 1 then

...

end

Эта проверка сработает после пропуска некоего кол-ва апдейтов от начала загрузки, и соответственно всю загрузку лута в инвентарь. Соответственно можно использовать флаг, который установить по факту precache_frame <= 1 и проверять его в on_item_take.

  • Спасибо 1
Ссылка на комментарий

 

 

отрабатывает и при загрузке сейва, и при взятии предмета во время игры.

Абсолютно верно.

 

 

 

Можно ли отследить в какой момент оно вызывается?

У объекта меняется его parent_id. Можете поставить колбэк и отследить этот параметр.

Вопрос  - зачем это нужно? Сам колбэк on_item_take и есть обработка события.

  • Спасибо 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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