Автор Тема: GTA SA - опкоды анимации  (Прочитано 5061 раз)

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
GTA SA - опкоды анимации
« : Октябрь 09, 2016, 12:11:52 pm »
По порядку.

0393 | COMMAND_SET_CHAR_ANIM_SPEED

Описание
0393: set_char_anim_speed 215@ anim "POOL_SHORT_SHOT" to 248@
COMMAND_SET_CHAR_ANIM_SPEED

Порядок действий
Находим в клампе анимацию (CAnimBlendAssociation) по заданому имени. Если нашли - устанавливаем нужную скорость.

Код опкода
Код: C++
  1. case COMMAND_SET_CHAR_ANIM_SPEED:
  2.     this->CollectParameters(1);
  3.     CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);
  4.     this->ReadTextLabelFromScript(text, 24);
  5.     CAnimBlendAssociation *assoc = RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text);
  6.     this->CollectParameters(1);
  7.     if ( assoc )
  8.         assoc->m_fSpeed = ScriptParams[0].f;
  9.     return OR_CONTINUE;

04ED | REQUEST_ANIMATION

Описание
04ED: request_animation "LOWRIDER"
REQUEST_ANIMATION

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

Код опкода
Код: C++
  1. case COMMAND_REQUEST_ANIMATION:
  2.     this->ReadTextLabelFromScript(text, 16);
  3.     animResourceIndex = CAnimManager::GetAnimationBlockIndex(text);
  4.     CStreaming::RequestModel(animResourceIndex + 25575, 4); // 25575 - базовый индекс для файлов анимаций, 4 = MISSION_REQUIRED
  5.     CTheScripts::ScriptResourceManager->AddToResourceManager(animResourceIndex, 1, this);
  6.     return OR_CONTINUE;

04EE | HAS_ANIMATION_LOADED

Описание
04EE: has_animation_loaded "LOWRIDER"
HAS_ANIMATION_LOADED

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

Код опкода
Код: C++
  1. case COMMAND_HAS_ANIMATION_LOADED:
  2.     this->ReadTextLabelFromScript(text, 16);
  3.     if ( CAnimManager::GetAnimationBlock(text)->bLoaded != 1 )
  4.         this->UpdateCompareFlag(false);
  5.     else
  6.         this->UpdateCompareFlag(true);
  7.     return OR_CONTINUE;

04EF | REMOVE_ANIMATION

Описание
04EF: remove_animation "LOWRIDER"
REMOVE_ANIMATION

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

Код опкода
Код: C++
  1. case COMMAND_REMOVE_ANIMATION:
  2.     this->ReadTextLabelFromScript(text, 16);
  3.     animResourceIndex = CAnimManager::GetAnimationBlockIndex(text);
  4.     if (!CTheScripts::ScriptResourceManager->RemoveFromResourceManager(animResourceIndex, 1, this))
  5.         return OR_CONTINUE;
  6.     CStreaming::SetMissionDoesntRequireAnim(animResourceIndex); // вызывает CStreaming::SetMissionDoesntRequireModel(animResourceIndex + 25575)
  7.     return OR_CONTINUE;

0611 | IS_CHAR_PLAYING_ANIM

Описание
0611:   is_char_playing_anim 2@ anim "LRGIRL_IDLE_TO_L0"
IS_CHAR_PLAYING_ANIM

Порядок действий
Проверяем наличие в клампе анимации (CAnimBlendAssociation) с заданым именем.

Код опкода
Код: C++
  1. case COMMAND_IS_CHAR_PLAYING_ANIM:
  2.     this->CollectParameters(1);
  3.     CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);
  4.     this->ReadTextLabelFromScript(text, 24);
  5.     if (RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text))
  6.         this->UpdateCompareFlag(true);
  7.     else
  8.         this->UpdateCompareFlag(false);
  9.     return OR_CONTINUE;

0612 | SET_CHAR_ANIM_PLAYING_FLAG

Описание
0612: set_char_anim_playing_flag 66@ anim "SHP_HANDSUP_SCR" to 0
SET_CHAR_ANIM_PLAYING_FLAG

Порядок действий
Получаем в клампе анимацию (CAnimBlendAssociation) с заданым именем, устанавливаем или убираем флаг проигрывания.

Код опкода
Код: C++
  1. case COMMAND_SET_CHAR_ANIM_PLAYING_FLAG:
  2.     this->CollectParameters(1);
  3.     CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);
  4.     this->ReadTextLabelFromScript(text, 24);
  5.     CAnimBlendAssociation *assoc = RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text);
  6.     this->CollectParameters(1);
  7.     if (assoc) {
  8.         if (ScriptParams[0].s)
  9.             assoc->m_clumpAssoc.m_nFlags.bPlaying = true;
  10.         else
  11.             assoc->m_clumpAssoc.m_nFlags.bPlaying = false;
  12.     }
  13.     return OR_CONTINUE;

Опкоды 0605, 0812, 088A, 0A1A проигрывают анимацию.

0605 | TASK_PLAY_ANIM

Описание
0605: task_play_anim -1 anim "M_SMKLEAN_LOOP" ifp "LOWRIDER" framedelta 4.0 loop 1 lockX 0 lockY 0 lockF 0 time -1
TASK_PLAY_ANIM

0812 | TASK_PLAY_ANIM_NON_INTERRUPTABLE Анимация не может быть прервана

Описание
0812: task_play_anim_non_interruptable -1 anim "LRGIRL_IDLELOOP" ifp "LOWRIDER" framedelta 4.0 loop 0 lockX 0 lockY 0 lockF 0 time -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE

088A | TASK_PLAY_ANIM_WITH_FLAGS Дополнительные настройки для анимации

Описание
088A: task_play_anim_with_flags 34@ anim "RAIL_FALL" ifp "SWAT" framedelta 8.0 loop 0 lockX 0 lockY 0 lockF 1 time -1 disable_force 0 disable_lockZ 1
TASK_PLAY_ANIM_WITH_FLAGS

0A1A | TASK_PLAY_ANIM_SECONDARY Анимация верхних частей тела

Описание
0A1A: task_play_anim_secondary 88@ anim "HIKER_POSE_L" ifp "MISC" framedelta 4.0 loop 0 lockX 0 lockY 0 lockF 1 time -1
TASK_PLAY_ANIM_SECONDARY

Все опкоды вызывают специальную, "общую" функцию PlayAnimScriptCommand.
Код: C++
  1. this->PlayAnimScriptCommand(opcodeId);
  2. return OR_CONTINUE;

Код: C++
  1. void CRunningScript::PlayAnimScriptCommand(int opcodeId) {
  2.    
  3.     char animName[24];
  4.     char fileName[16];
  5.     bool lockZ = false;
  6.     bool interruptable = true;
  7.    
  8.     this->CollectParameters(1);
  9.     int pedHandle = ScriptParams[0].i;
  10.     this->ReadTextLabelFromScript(animName, 24);
  11.     this->ReadTextLabelFromScript(fileName, 16);
  12.     switch (opcodeId) {
  13.         case COMMAND_TASK_PLAY_ANIM:
  14.         case COMMAND_TASK_PLAY_ANIM_SECONDARY:
  15.             this->CollectParameters(6);
  16.             break;
  17.         case COMMAND_TASK_PLAY_ANIM_NON_INTERRUPTABLE:
  18.             interruptable = false;
  19.             this->CollectParameters(6);
  20.             break;
  21.         case COMMAND_TASK_PLAY_ANIM_WITH_FLAGS:
  22.             this->CollectParameters(8);
  23.             interruptable = ScriptParams[6].i != 0;
  24.             lockZ = ScriptParams[7].i != 0;
  25.             break;
  26.     }
  27.    
  28.     float frameDelta = ScriptParams[0].f;
  29.     int loop = ScriptParams[1].i;
  30.     int lockLastX = ScriptParams[2].i;
  31.     int lockLastY = ScriptParams[3].i;
  32.     int lockLastFrame = ScriptParams[4].i;
  33.     int time = ScriptParams[5].i;
  34.    
  35.     int flags = 0x10;
  36.     if (loop || time > 0 && !lockLastFrame)
  37.         flags = 0x12;
  38.     if (lockLastX)
  39.         flags |= 0x40;
  40.     if (lockLastY)
  41.         flags |= 0x80;
  42.     if (!lockLastFrame)
  43.         flags |= 8;
  44.     if (opcodeId == COMMAND_TASK_PLAY_ANIM_SECONDARY)
  45.         flags |= 0x400;
  46.    
  47.     bool isActiveSequence = false;
  48.     if (CTaskSequences::ms_iActiveSequence >= 0)
  49.         isActiveSequence = true;
  50.    
  51.     CTaskSimpleRunNamedAnim *taskAnim = new CTaskSimpleRunNamedAnim(animName, fileName, flags, frameDelta, time, !interruptable, isActiveSequence, lockZ, 0);
  52.    
  53.     if (opcodeId == COMMAND_TASK_PLAY_ANIM_SECONDARY) {
  54.         CTaskSimpleAffectSecondaryBehaviour *affectSecondaryBehaviour = new CTaskSimpleAffectSecondaryBehaviour(1, 4, taskAnim);
  55.        
  56.     this->GivePedScriptedTask(pedHandle, taskAnim, opcodeId);
  57. }
« Последнее редактирование: Октябрь 09, 2016, 02:50:02 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv