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

Справочник по функциям и классам


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

Касательно level.physics_world() для ЗП. Целиком рабочая. Использую эту функцию для джетпака:

function set_gravity(val) --/установка гравитации.
   if string.find(tostring(val),"+") then
      local val=level.physics_world():gravity()+tonumber(string.sub(val,2))
      level.physics_world():set_gravity(val)
   elseif string.find(tostring(val),"-") then
      local val=level.physics_world():gravity()-tonumber(string.sub(val,2))
      level.physics_world():set_gravity(val)
   else
      level.physics_world():set_gravity(val)
   end
end
function restore_gravity() --/восстановление обычной гравитации.
   local defv=19.620
   level.physics_world():set_gravity(defv)
end
 
P.S. Для своего джетпака юзаю таймер, по истечении которого restore_gravity().

 

19.620 - значение гравитации по умолчанию. Может иметь значение со знаком минус. В этом случае гравитация вверх-тормашками, и табор уходит в небо.

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

В дополнение к этому посту по поводу функции global_transform(), по крайнем мере в ЗП она рабочая, и при вызове возвращает матрицу, (class matrix)

которая хранит координаты кости, а также направление этой кости (или нечто похожее, я как раз разбираюсь)

 

local ph_shell = door:get_physics_shell()

local ph_element = ph_shell:get_element_by_bone_name("door")
if ph_element ~= nil then
  local m = ph_element:global_transform()

end

C.X = 355.5                C.Y = 56.6                  C.Z = 763.6
I.X = 1                    I.Y = -5.4984565167615e-007 I.Z = -2.3666775632591e-006
J.X = 5.4984121788948e-007 J.Y = 1                     J.Z = -1.8957925931318e-006
K.X = 2.3666784727538e-006 K.Y = 1.8957912288897e-006  K.Z = 1

 

Направление кости в виде углов эйлера (которые в СДК используются) можно по идее получить матричной функцией getHPB(), но т.к у меня она вызывала вылет, я для этого использую функцию из Zones Editor - extract_euler_xzy(m) 

 

Плохо только то, что ph_shell:get_element_by_bone_name("door") работает не для всех костей (а судя по всему только для костей с типом joint), а сам ph_shell есть тока у неживых объектов (у живого сталкера он отсутствует) 

 

PS: На правах оффтопа, malandrinus - подскажи пож-ста по поводу функции extract_euler_xzy(m), она возвращает x z y, а если соотнести их с HPB (такие обозначения используются в сталкере), то что чему равно? B это наклон, H кажется горизонталь, P вертикаль.

*******************************************************************************

По поводу вопроса разобрался:HPB идут в таком порядке.

local p,b,h = extract_euler_xzy(m)

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

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

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

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

 

 


[level_script] script= <имя модуля 1>,<имя модуля 2>,<имя модуля 3>
имя модуля это имена скрипт файлов? Если да, то расширение *.script  указывать?
Ссылка на комментарий

Дабы закрыть вопрос с [level_script]. Походу эта фишка больше не работает. Я как-то очень давно её тестировал, возможно на каком-то раннем патче. Уже и не помню, на каком именно, но скорее всего на четвёртом. Вот пример того, как это использовалось в билде 1946, где кабаны играют в футбол тушкой сталкера.
Файл levels\script_test\level.ltx

[level_scripts]
script = futbol

Файл futbol.script (с сокращениями)

class "CPlayer"
function CPlayer:__init(obj, bool)
end

function CPlayer:update()
end


function main()
    local command    = {}
    local bool        = get_level_object("bool")
    table.insert(command, CPlayer(get_level_object("boar1"), bool))
    table.insert(command, CPlayer(get_level_object("boar2"), bool))
    
    while(true) do
        for i = 1, table.getn(command) do
            command[i]:update()
        end
        
        wait()
    end
end

Т.е. мы видим, что в функции main, которая должна выполниться при загрузке уровня script_test, создаётся два объекта схем управления кабанами (класс приведён с сокращениями). Затем запускается бесконечный цикл, а в цикле эти схемы дёргают кабанов. Кому интересно, скачайте этот билд здесь и гляньте сами. Вкратце, там просто кабаны направляются скриптом к целевому объекту (тушке сталкера), а при расстоянии меньше заданного тушке наносится хит, чтобы отбросить.

 

Мне не удалось вызвать выполнение функции main из аналогичным образом прописанного файла на шестом патче. Скорее всего это уже не работает, так что забудьте об этой фишке. Тем более, что её использование подразумевалось совместно с потоками Lua, что в целом лишено смысла в финальной версии игры. Кроме того, чтобы ни подразумевалось делать на этом механизме, можно сделать с тем, что есть и работает: биндеры, родная логика, скриптовые таймеры и т.п.

  • Нравится 1
 

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

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

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

 

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

 

что тегов class может быть несколько

 

Может то может, только юзатся будет всегда первый, другие будут игнорироваться, посему присваивать два и более класса одному specific_character бессмысленно.

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

Народ! Я сейчас не плохое открытие сделал  :crazy:

В общем про биндер, функция net_Relcase переводится как разрыв сети, и вызывается она когда объекты в онлайне удаляются, не забываем что движок основан на мультиплеере, т.е. разъединяются.

 







function mybinder_binder:net_Relcase(obj)
if obj then
   log("mashalat_binder:net_Relcase(objid-"..obj:id()..")name-("..obj:name()..")section-("..obj:section()..")time-("..time_global()..")")
end
return false
end

 

 

 

Как это может использоваться, да как уходно, например фейковые ножи, эта функция запускается, проверяем обж если это то, то спавним в ножевой слот ножик, и т.к. далее...

В общем, можно добавить куда надо эту инфу, скриптерам пригодится. Ещё надо проверить парент удаляемых объектов, по поже отпишусь...

PS

Эта функция срабатывает так же и при уходе в оффлайн, парент равен нил, ну это и понятно, объекты то удаляются.

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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Ссылка на комментарий
function bone_position(string) const [скрыть]
vector bone_position(string bone_name) const

возвращает координаты кости. Принимает один аргумент - имя кости. Может быть применен к любому объекту, но модель объекта при этом должна иметь тип MT_SKELETON_ANIM или MT_SKELETON_RIGID, короче, иметь эти самые кости

 

 

Допустим я прочитал из нет-пакета объекта его визуал, узнал что за модель. Чтобы применять этот метод - как мне узнать имена всех имеющихся в данной модели костей?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Ещё по поводу метода bone_position - если видимость кости, для которой спрашиваем координаты, выключена, тогда координаты эти будут равны позиции спавна физ. объекта (т.е. тоже самое, что возвращает метод position).

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

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

 

 

Собственно создает конфиг-файл. После чего, с ним можно работать как и с обычным конфигом:

Я так понимаю, создает не на диске юзера, а в памяти движка, верно?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Тут прикололся что в артикл колбек передается 4 параметр, а именно тип:

function actor_binder:article_callback(npc, group, name, _type)

Я себе так сделал. Короче это числовой параметр, возвращает цифру от 0 до 3, что означает:

 

0 - добавлено в энциклопедию

1 - добавлено в журнал 

2 - добавлено в инфо -- не работает вроде (позже если выловлю - отпишусь)

3 - добавлено в задания -- не работает вроде

 

Занавес.

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

Может то может, только юзатся будет всегда первый, другие будут игнорироваться, посему присваивать два и более класса одному specific_character бессмысленно.

Это не так. Читаются все. Могу показать фрагмент этого кода.

как мне узнать имена всех имеющихся в данной модели костей?

По-простому никак. Названия костей надо просто знать заранее.
 

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

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

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

 

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

 

 

Это не так. Читаются все. Могу показать фрагмент этого кода.

Давай. Лично я сам присваивал несколько классов в один профиль, и читался только первый, возможно что-то не так делал, не отрицаю, давно было.

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

@Карлан, два файла. В первом (specific_character.cpp) читаются все классы в массив m_Classes.

void CSpecificCharacter::load_shared    (LPCSTR)
{
//...
    data()->m_Classes.clear            ();
    int classes_num                    = pXML->GetNodesNum (pXML->GetLocalRoot(), "class");
    for(int i=0; i<classes_num; i++)
    {
        LPCSTR char_class            = pXML->Read    ("class", 0, "");
        if(char_class)
        {
            char* buf_str            = xr_strdup(char_class);
            xr_strlwr                (buf_str);
            data()->m_Classes.push_back(buf_str);
            xr_free                    (buf_str);
        }
    }
//...

Второй фрагмент, где среди прочитанных классов ищется нужный. Файл xrServer_Objects_ALife_Monsters.cpp :

shared_str CSE_ALifeTraderAbstract::specific_character()
{
//...
            bool class_found = false; // пока не нашли
            for(std::size_t j=0; j<spec_char.data()->m_Classes.size(); j++) // цикл по всем классам профайла
            {
                if(char_info.data()->m_Class == spec_char.data()->m_Classes[j])
                {
                    class_found = true;
                    break;
                }
            }
 

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

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

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

 

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

@Malandrinus, вчера не точно видно выразился. В процитированном тобою посте точно. Читаются все, используется первый найденный, поэтому и указывать несколько классов на один профиль бессмысленно (они прочитаются, но не используются, используется только первый (сейчас еще раз проверил в игре)). Если у тебя есть готовый код для игры, где используются несколько классов одним профилем, то покажи, мне действительно интересно увидеть где я не прав. Пока остаюсь при своем.

По коду движка я не спорю что ты прав, сам вижу:

#ifdef XRGAME_EXPORTS
if(m_CheckedCharacters.empty())
char_info.m_SpecificCharacterId = m_DefaultCharacters[Random.randI(m_DefaultCharacters.size())];
else
char_info.m_SpecificCharacterId = m_CheckedCharacters[Random.randI(m_CheckedCharacters.size())];
#else
char_info.m_SpecificCharacterId = m_DefaultCharacters[Random.randI(m_DefaultCharacters.size())];
#endif

set_specific_character(char_info.m_SpecificCharacterId);
return m_SpecificCharacter;

Но как это применить в игре я не соображу, на практике у меня не работает.

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

Что-то я тебя не понимаю. Допустим, у меня есть specific_character с классами stalker1 и bandit1. Тогда я могу сослаться из двух разных профайлов на этот конкретный specific_character по этим разным классам. Из одного профайла будет искать по одному классу, из другого по другому, но в обоих случаях будет найден этот specific_character. Не вижу, что здесь может не работать.

 

Где это использовать? Ну не знаю. Есть допустим некий уникальный непись со своим визуалом. Допустим, он может перейти по сюжету из одной группировки в другую. Я создаю для него два профайла с разными классами для разных группировок, и из обоих ссылаюсь на один и тот же specific_character, где прописаны оба класса. Хотя наверное это можно сделать и иначе, но просто как иллюстрация.

 

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

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

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

 

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

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

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

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

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

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

Войти

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

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

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

×
×
  • Создать...