Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
aimlock

Регистрация анимации предметов в руках

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

Всем привет, я заметил что некоторые люди не до конца понимают что такое регистрация анимаций для предметов в руках, как ее правильно делать и для чего она нужна?

Для чего это нужно? Допустим вы добавляете предмет в игру и не привязываете его ни к какому объекту (создаете полностью с нуля, задаете свойства) и сталкиваетесь с тем что ваш объект без привязки не имеет должной анимации. А имеет стандартную анимацию банки консервы (в том числе и для предметов которые должны держаться в 2 руках), ну или вовсе предмет находиться в ногах у персонажа (примеры прикрепил скриншоты). Именно для этого и нужно привязывать анимацию положения объекта в руках через скрипт.

На момент написания этого поста я знаю 3 вида регистрации анимаций для предметов в руках:
1. PlayerBase
2. JMAnimRegister
3. ModItemRegisterCallbacks

До создания последних 2 способов все использовали PlayerBase :
 

modded class PlayerBase
{
    override void Init()
    {            
        DayzPlayerItemBehaviorCfg     fireArmsItemBehaviour = new DayzPlayerItemBehaviorCfg;        
        fireArmsItemBehaviour.SetFirearms();
        
        GetDayZPlayerType().AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", fireArmsItemBehaviour, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");        
        super.Init();     
    }
}

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

DayZPlayerTypeRegisterItems(DayZPlayerType Type) вот наше спасение, но тут тоже не все так просто, полумолчание это функция внутри класса, а для поставленной задачи (иметь возможность безопасно  и стабильно вносить новую регистрацию предметов) это не подходит. Тогда разработчики мода CF создали кастомный класс с использованием схожих функций для регистрации анимаций положений предметов в руках. Этим классом является JMAnimRegister. Стабильная и оптимизированная функция, которой очень просто пользоваться. Разумеется использовать вы сможете этот класс только при наличии в своей сборке CF . Как им пользоваться?
 

modded class JMAnimRegister
{
  override void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior )
  {
    super.OnRegisterFireArms( pType, pBehavior );
    pType..AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");    
  }
};

Как самый простой пример. И так можно задавать любому количеству предметов положение в руках :
 

modded class JMAnimRegister
{
  override void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior )
  {
    super.OnRegisterFireArms( pType, pBehavior );
    pType..AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");

   pType..AddItemInHandsProfileIK("MyModdedWeapon2", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm");      
  }
};

Прошу обратить внимание, что мы используем modded, мы модифицируем уже существующий класс внутри

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

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


Ссылка на сообщение
Поделиться на других сайтах
MagicByte MagicByte MagicByte

Отличная тема, думаю многие не знали зачем нужна вообще регистрации анимаций, теперь будут знать. Я лично использую последний способ ModItemRegisterCallbacks. Он понятен очень и заморачиваться не нужно

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


Ссылка на сообщение
Поделиться на других сайтах

На самом деле это одна из самых важных тем на этом форуме, но многие этого не поняли.

Если у вас дофига модов и игроков, то вы почти наверняка ловите краши сервера LOAD EXISTING CHAR. Потому что во многих модах до сих пор остается регистрация через PlayerBase.

У некоторых количество крашей снижается с десятков за сутки до одного-двух после внесения правок или перехода на моды, в которых все зависимости сделаны сразу в config.cpp. Конечно же, речь идет в основном об оружейных паках.

Изменено пользователем Moonny (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Moonny сказал:

На самом деле это одна из самых важных тем на этом форуме, но многие этого не поняли.

Если у вас дофига модов и игроков, то вы почти наверняка ловите краши сервера LOAD EXISTING CHAR. Потому что во многих модах до сих пор остается регистрация через PlayerBase.

У некоторых количество крашей снижается с десятков за сутки до одного-двух после внесения правок или перехода на моды, в которых все зависимости сделаны сразу в config.cpp. Конечно же, речь идет в основном об оружейных паках.

Ну как поподробней про регистрацию анимаций в config.cpp ???

Штатная регистрация тут

4_World\Entities\ManBase\DayZPlayer\DayZPlayerCfgBase.c

 

функция в глобальном клссе

DayZPlayerTypeRegisterItems
 

а для модовых

 

class ModItemRegisterCallbacks

и функции для оверрайда

 

пример

 

modded class ModItemRegisterCallbacks
{
    override void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior)
    {
        super.RegisterOneHanded(pType, pBehavior);
		pType.AddItemInHandsProfileIK("EarPlugsBase", "dz/anims/workspaces/player/player_main/player_main_1h.asi", pBehavior, "dz/anims/anm/player/ik/vehicles/sparkplug.anm");
    };
};

 

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


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за тему. 
Гуглил по тэгу - сразу на форум кинуло..

pType.AddItemInHandsProfileIK

Не работал спавн кастомных предметов, а оказывается всё просто ? 

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


Ссылка на сообщение
Поделиться на других сайтах
05.08.2021 в 15:11, BorizzK сказал:

Ну как поподробней про регистрацию анимаций в config.cpp ???

Штатная регистрация тут

4_World\Entities\ManBase\DayZPlayer\DayZPlayerCfgBase.c

 

функция в глобальном клссе

DayZPlayerTypeRegisterItems
 

а для модовых

 

class ModItemRegisterCallbacks

и функции для оверрайда

 

пример

 

modded class ModItemRegisterCallbacks { override void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior) { super.RegisterOneHanded(pType, pBehavior); pType.AddItemInHandsProfileIK("EarPlugsBase", "dz/anims/workspaces/player/player_main/player_main_1h.asi", pBehavior, "dz/anims/anm/player/ik/vehicles/sparkplug.anm"); }; };


modded class ModItemRegisterCallbacks
{
    override void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior)
    {
        super.RegisterOneHanded(pType, pBehavior);
		pType.AddItemInHandsProfileIK("EarPlugsBase", "dz/anims/workspaces/player/player_main/player_main_1h.asi", pBehavior, "dz/anims/anm/player/ik/vehicles/sparkplug.anm");
    };
};

Спасибо! Можно для новичка более конкретный ответ получить ? 
Я добавил новый предмет (консервный нож). В игре, при взятии этого ножа в руку, персонаж не сжимает руку, как в случае с оригиналом. 
 Структура папки с модом такова:
 - папка (название мода):
   - data (текстуры)
   - config.cpp
   - model.cfg

   - "мой новый предмет".p3d
   - 4_World: Entities : ManBase : DayZPlayer: DayZPlayerCfgBase.c      ?

И главный вопрос : как должен выглядеть файл DayZPlayerCfgBase.c внутри, для одного нового предмета, добавленного в игру ?
Все удалить и оставить только
modded class ModItemRegisterCallbacks { override void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior) { super.RegisterOneHanded(pType, pBehavior); pType.AddItemInHandsProfileIK("EarPlugsBase", "dz/anims/workspaces/player/player_main/player_main_1h.asi", pBehavior, "dz/anims/anm/player/ik/vehicles/sparkplug.anm"); }; }; ?

 

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


Ссылка на сообщение
Поделиться на других сайтах

А как изменить анимацию для уже имеющегося предмета? К примеру, я пытался отучить перса бегать с грузовым аккумом, переназначив его на RegisterHeavy и установив itemBehaviour=0 в конфиге, но это работает только если я создаю новый класс на базе ванильного.

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


Ссылка на сообщение
Поделиться на других сайтах

И вот ещё один момент. Когда меняешь анимацию из другого мода, то нужно ставить строку super в конец функции, а не в начало, как в первом посте. Иначе изменение не будет работать.

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


Ссылка на сообщение
Поделиться на других сайтах

Почему при регистрации анимации у меня пропадает отображение предмета? т.е. он есть, анимация работает, сам предмет работает, но его не видно. Как будто текстуры слетели. Убираю папку Scripts все нормально.

Изменено пользователем Denis1979 (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

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

Зарегистрируйтесь для получения аккаунта. Это просто!

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

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: Troy1
      Всем привет. пишу мод и столкнулся с проблемой в реализации.
      Суть: Пытаюсь сделать проверку, если игрок стоит прям у окна или у дверного проёма он должен получать урон.
      Делал вот так.
      int wallHits = 0; float d = 2.2; // Дистанция до стены. Если стена дальше — считаем, что там окно или проем. // 8 направлений "снежинкой" для проверки стен вокруг игрока // Используем Vector(x, y, z) для точности ref array<vector> checkDirs = { Vector(d,0,0), Vector(-d,0,0), Vector(0,0,d), Vector(0,0,-d), Vector(d,0,d), Vector(-d,0,-d), Vector(d,0,-d), Vector(-d,0,d) }; foreach (vector dir : checkDirs) { // Пускаем горизонтальные лучи от позиции игрока (from) if (DayZPhysics.RayCastBullet(from, from + dir, collisionLayerMask, this, hitObject, hitPosition, hitNormal, hitFraction)) { // ПРОВЕРКА: Это должна быть вертикальная стена (Y нормали < 0.5) // Чтобы не засчитать низкий потолок за стену if (Math.AbsFloat(hitNormal[1]) < 0.5) { wallHits++; } } } // УСЛОВИЕ БЕЗОПАСНОСТИ: // В комнате wallHits будет 6-8. У окна или в проеме — 1-4. if (wallHits < 5) { hasSafeCeiling = false; // Слишком открытое пространство (окно/дверь) } Пытался менять дистанции, но всё ровно не как не хочет работать.
      Что я делаю не так, или я вообще делаю не то?
      Мне нужно проверять игрока, в укрытии он или нет.
      С высотой я разобрался, а вот с боковыми лучами у меня траблы и не во всех помещениях работает как нужно.
      В некоторых помещениях вообще не работает, удаляешь строки проверки, начинает работать и то по высоте.
      Просто забегаешь по навес и игрок под защитой, так не должно быть.
      Помогите пожалуйста  решить задачу.
    • Автор: Troy1
      Всем привет. Суть в чём, пишу мод на событие и когда происходит событие, параллельно должна меняться скорость ветра, не могу понять как заставить скрипт управлять силой ветра. Понижать силу ветра получилось сделать, а вот повышать не как. Только после перезагрузки сервера сила ветра задаётся в нужном значение.
      Как сделать, что бы по вызову функции менялась сила ветра в большую или в меньшую сторону?
      protected void SetWind(float wind, float time) { if (!g_Game) return; Weather m_Weather = g_Game.GetWeather(); if (!m_Weather) return; m_Weather.SetWindMaximumSpeed(wind); m_Weather.SetWind(Vector(1/Math.Sqrt(3), 1/Math.Sqrt(3), 1/Math.Sqrt(3)) * wind); m_Weather.SetWindSpeed(wind); m_Weather.SetWindFunctionParams(1.0, 1.0, -1); } Это скрипт на понижение силы ветра.
      Работает понижение силы ветра в том случае, если до этого сила ветра была выше.
      Пример:
      Изначально на сервере сила ветра = 20 m/s А нужно понизить до 10 m/s
      Только в этом случае сработает скрипт который я приложил выше.
      Помогите пожалуйста решить этот вопрос.
      За ранние благодарю.
    • Автор: KaLiBR
      Всех приветствую!
      Господа, подскажите пожалуйста, хочу исправить некоторые ошибки
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • Автор: Troy1
      Пока ждал помощи, решил вопрос!
      Тема закрыта!!!
    • Автор: magliner
      Привет ! Ну вот моя история с вопросом в конце.. Я фанат Дэйз ванилы черноруси, заколебало сидеть на бездушных серверах со слабой админкой и терять лут от софтеров, решил создать под свои скромные запросы около ванильный сервер.. Нашел хорошего исполнителя, быстро и четко запустили отладили и ВОТ я имею СВОЙ сервер.. клас! вечер восторга и изучения
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
  • Наш выбор

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

Важная информация

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