GTA San Andreas > Программирование

GTA SA - опкоды анимации

(1/1)

DK:
По порядку.

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++ ---case COMMAND_SET_CHAR_ANIM_SPEED:    this->CollectParameters(1);    CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);    this->ReadTextLabelFromScript(text, 24);    CAnimBlendAssociation *assoc = RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text);    this->CollectParameters(1);    if ( assoc )        assoc->m_fSpeed = ScriptParams[0].f;    return OR_CONTINUE;
04ED | REQUEST_ANIMATION

Описание

--- Код: ---04ED: request_animation "LOWRIDER"
REQUEST_ANIMATION
--- Конец кода ---

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

Код опкода

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

Описание

--- Код: ---04EE: has_animation_loaded "LOWRIDER"
HAS_ANIMATION_LOADED
--- Конец кода ---

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

Код опкода

--- Код: C++ ---case COMMAND_HAS_ANIMATION_LOADED:    this->ReadTextLabelFromScript(text, 16);    if ( CAnimManager::GetAnimationBlock(text)->bLoaded != 1 )        this->UpdateCompareFlag(false);    else        this->UpdateCompareFlag(true);    return OR_CONTINUE;
04EF | REMOVE_ANIMATION

Описание

--- Код: ---04EF: remove_animation "LOWRIDER"
REMOVE_ANIMATION
--- Конец кода ---

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

Код опкода

--- Код: C++ ---case COMMAND_REMOVE_ANIMATION:    this->ReadTextLabelFromScript(text, 16);    animResourceIndex = CAnimManager::GetAnimationBlockIndex(text);    if (!CTheScripts::ScriptResourceManager->RemoveFromResourceManager(animResourceIndex, 1, this))        return OR_CONTINUE;    CStreaming::SetMissionDoesntRequireAnim(animResourceIndex); // вызывает CStreaming::SetMissionDoesntRequireModel(animResourceIndex + 25575)    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++ ---case COMMAND_IS_CHAR_PLAYING_ANIM:    this->CollectParameters(1);    CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);    this->ReadTextLabelFromScript(text, 24);    if (RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text))        this->UpdateCompareFlag(true);    else        this->UpdateCompareFlag(false);    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++ ---case COMMAND_SET_CHAR_ANIM_PLAYING_FLAG:    this->CollectParameters(1);    CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);    this->ReadTextLabelFromScript(text, 24);    CAnimBlendAssociation *assoc = RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text);    this->CollectParameters(1);    if (assoc) {        if (ScriptParams[0].s)            assoc->m_clumpAssoc.m_nFlags.bPlaying = true;        else            assoc->m_clumpAssoc.m_nFlags.bPlaying = false;    }    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++ ---this->PlayAnimScriptCommand(opcodeId);return OR_CONTINUE;

--- Код: C++ ---void CRunningScript::PlayAnimScriptCommand(int opcodeId) {        char animName[24];    char fileName[16];    bool lockZ = false;    bool interruptable = true;        this->CollectParameters(1);    int pedHandle = ScriptParams[0].i;    this->ReadTextLabelFromScript(animName, 24);    this->ReadTextLabelFromScript(fileName, 16);    switch (opcodeId) {        case COMMAND_TASK_PLAY_ANIM:        case COMMAND_TASK_PLAY_ANIM_SECONDARY:            this->CollectParameters(6);            break;        case COMMAND_TASK_PLAY_ANIM_NON_INTERRUPTABLE:            interruptable = false;            this->CollectParameters(6);            break;        case COMMAND_TASK_PLAY_ANIM_WITH_FLAGS:            this->CollectParameters(8);            interruptable = ScriptParams[6].i != 0;            lockZ = ScriptParams[7].i != 0;            break;    }        float frameDelta = ScriptParams[0].f;    int loop = ScriptParams[1].i;    int lockLastX = ScriptParams[2].i;    int lockLastY = ScriptParams[3].i;    int lockLastFrame = ScriptParams[4].i;    int time = ScriptParams[5].i;        int flags = 0x10;    if (loop || time > 0 && !lockLastFrame)        flags = 0x12;    if (lockLastX)        flags |= 0x40;    if (lockLastY)        flags |= 0x80;    if (!lockLastFrame)        flags |= 8;    if (opcodeId == COMMAND_TASK_PLAY_ANIM_SECONDARY)        flags |= 0x400;        bool isActiveSequence = false;    if (CTaskSequences::ms_iActiveSequence >= 0)        isActiveSequence = true;        CTaskSimpleRunNamedAnim *taskAnim = new CTaskSimpleRunNamedAnim(animName, fileName, flags, frameDelta, time, !interruptable, isActiveSequence, lockZ, 0);        if (opcodeId == COMMAND_TASK_PLAY_ANIM_SECONDARY) {        CTaskSimpleAffectSecondaryBehaviour *affectSecondaryBehaviour = new CTaskSimpleAffectSecondaryBehaviour(1, 4, taskAnim);            this->GivePedScriptedTask(pedHandle, taskAnim, opcodeId);}

Навигация

[0] Главная страница сообщений

Перейти к полной версии