예제 #1
0
    public static bool GetFallbackAnim(ref EncodedAnimId animId)
    {
        if (animId.IsBardInstrumentAnim())
        {
            // There are no fallback animations for bard instruments.
            // Apparently there was a table, but no instrument had a fallback in there
            return(false);
        }

        if (animId.IsWeaponAnim())
        {
            var leftHand  = animId.GetWeaponLeftHand();
            var rightHand = animId.GetWeaponRightHand();

            // Possibly the weapons in either hand need to fallback together
            if (IsWeapon2hFallback(leftHand) || IsWeapon2hFallback(rightHand))
            {
                var leftHandFallback  = GetWeaponFallback(leftHand);
                var rightHandFallback = GetWeaponFallback(rightHand);

                if (leftHandFallback != leftHand && rightHandFallback != rightHand)
                {
                    animId = new EncodedAnimId(animId.GetWeaponAnim(), leftHandFallback, rightHandFallback);
                    return(true);
                }
            }
            else
            {
                var rightHandFallback = GetWeaponFallback(rightHand);
                if (rightHandFallback != rightHand)
                {
                    animId = new EncodedAnimId(animId.GetWeaponAnim(), leftHand, rightHandFallback);
                    return(true);
                }

                var leftHandFallback = GetWeaponFallback(leftHand);
                if (leftHandFallback != leftHand)
                {
                    animId = new EncodedAnimId(animId.GetWeaponAnim(), leftHandFallback, rightHand);
                    return(true);
                }
            }

            var weaponAnimFallback = GetWeaponAnimFallback(animId.GetWeaponAnim());
            if (weaponAnimFallback == WeaponAnim.None)
            {
                return(false);
            }

            animId = new EncodedAnimId(weaponAnimFallback, leftHand, rightHand);
            return(true);
        }

        // Normal animations can fall back to weapon animations, so it's not just a lookup table here
        return(GetNormalAnimFallback(animId.GetNormalAnimType(), ref animId));
    }
예제 #2
0
    public static void SetAnimId(this GameObject obj, EncodedAnimId animId)
    {
        // Propagate animations to main/off hand equipment for critters
        if (obj.IsCritter())
        {
            var mainHand = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponPrimary);
            var offHand  = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponSecondary);
            if (offHand == null)
            {
                offHand = GameSystems.Critter.GetWornItem(obj, EquipSlot.Shield);
            }

            // Apparently certain anim IDs cause weapons to disappear,
            // possibly skill use/casting?
            int opacity = 0;
            if (animId.IsSpecialAnim())
            {
                opacity = 255;
            }

            if (mainHand != null)
            {
                GameSystems.ObjFade.FadeTo(mainHand, opacity, 10, 16, 0);
                SetAnimId(mainHand, animId);
            }

            if (offHand != null)
            {
                GameSystems.ObjFade.FadeTo(offHand, opacity, 10, 16, 0);
                SetAnimId(offHand, animId);
            }
        }

        var model = obj.GetOrCreateAnimHandle();

        model.SetAnimId(animId);
    }
예제 #3
0
 // Originally @ 0x102641B0
 public AasHandle CreateModelFromIds(
     int meshId,
     int skeletonId,
     EncodedAnimId idleAnimId,
     in AasAnimParams animParams
예제 #4
0
    public override void Render(IGameViewport viewport, PartSysEmitter emitter)
    {
        var it = emitter.NewIterator();

        var animParams = AnimatedModelParams.Default;

        animParams.rotation3d = true;

        // Lazily initialize render state
        if (!emitter.HasRenderState())
        {
            // Resolve the mesh filename
            var baseName = ResolveBasename(emitter.GetSpec().GetMeshName());
            var skmName  = baseName + ".skm";
            var skaName  = baseName + ".ska";

            try
            {
                var animId = new EncodedAnimId(NormalAnimType.ItemIdle); // This seems to be item_idle
                var model  = _modelFactory.FromFilenames(skmName, skaName, animId, animParams);

                emitter.SetRenderState(
                    new ModelEmitterRenderState(model)
                    );
            }
            catch (Exception e)
            {
                Logger.Error("Unable to load model {0} for particle system {1}: {2}",
                             baseName, emitter.GetSpec().GetParent().GetName(), e);

                emitter.SetRenderState(new ModelEmitterRenderState(null));
            }
        }

        var renderState = (ModelEmitterRenderState)emitter.GetRenderState();

        if (renderState.Model == null)
        {
            return; // The loader above was unable to load the model for this emitter
        }

        var overrides = new MdfRenderOverrides
        {
            ignoreLighting  = true,
            overrideDiffuse = true
        };

        var yaw   = emitter.GetParamState(PartSysParamId.part_yaw);
        var pitch = emitter.GetParamState(PartSysParamId.part_pitch);
        var roll  = emitter.GetParamState(PartSysParamId.part_roll);

        while (it.HasNext())
        {
            var particleIdx = it.Next();
            var age         = emitter.GetParticleAge(particleIdx);

            overrides.overrideColor = GeneralEmitterRenderState.GetParticleColor(emitter, particleIdx);

            // Yes, this is *actually* swapped for Y / Z
            var particleState = emitter.GetParticleState();
            animParams.offsetX = particleState.GetState(ParticleStateField.PSF_POS_VAR_X, particleIdx);
            animParams.offsetY = particleState.GetState(ParticleStateField.PSF_POS_VAR_Z, particleIdx);
            animParams.offsetZ = particleState.GetState(ParticleStateField.PSF_POS_VAR_Y, particleIdx);

            if (yaw != null)
            {
                animParams.rotationYaw = Angles.ToRadians(yaw.GetValue(emitter, particleIdx, age));
            }

            if (pitch != null)
            {
                animParams.rotationPitch = Angles.ToRadians(pitch.GetValue(emitter, particleIdx, age));
            }

            if (roll != null)
            {
                animParams.rotationRoll = Angles.ToRadians(roll.GetValue(emitter, particleIdx, age));
            }

            renderState.Model.SetTime(animParams, age);

            _modelRenderer.Render(viewport, renderState.Model, animParams, new List <Light3d>(), overrides);
        }
    }
 public IAnimatedModel FromIds(int meshId, int skeletonId, EncodedAnimId idleAnimId,
                               in AnimatedModelParams animParams,
예제 #6
0
    private static bool GetNormalAnimFallback(NormalAnimType anim, ref EncodedAnimId animId)
    {
        switch (anim)
        {
        case NormalAnimType.ProneIdle:
            animId = new EncodedAnimId(NormalAnimType.DeadIdle);
            return(true);

        case NormalAnimType.ProneFidget:
            animId = new EncodedAnimId(NormalAnimType.ProneIdle);
            return(true);

        case NormalAnimType.Getup:
            animId = new EncodedAnimId(WeaponAnim.CombatFidget);
            return(true);

        case NormalAnimType.Magichands:
            animId = new EncodedAnimId(WeaponAnim.RightAttack);
            return(true);

        case NormalAnimType.Picklock:
            animId = new EncodedAnimId(NormalAnimType.Magichands);
            return(true);

        case NormalAnimType.PicklockConcentrated:
            animId = new EncodedAnimId(NormalAnimType.Picklock);
            return(true);

        case NormalAnimType.Examine:
            animId = new EncodedAnimId(NormalAnimType.Magichands);
            return(true);

        case NormalAnimType.Throw:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        case NormalAnimType.Death:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        case NormalAnimType.Death2:
            animId = new EncodedAnimId(NormalAnimType.Death);
            return(true);

        case NormalAnimType.Death3:
            animId = new EncodedAnimId(NormalAnimType.Death2);
            return(true);

        case NormalAnimType.DeadIdle:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        case NormalAnimType.DeadFidget:
            animId = new EncodedAnimId(NormalAnimType.DeadIdle);
            return(true);

        case NormalAnimType.DeathProneIdle:
            animId = new EncodedAnimId(NormalAnimType.DeadIdle);
            return(true);

        case NormalAnimType.DeathProneFidget:
            animId = new EncodedAnimId(NormalAnimType.DeathProneIdle);
            return(true);

        case NormalAnimType.AbjurationCasting:
        case NormalAnimType.AbjurationConjuring:
            animId = new EncodedAnimId(WeaponAnim.RightAttack);
            return(true);

        case NormalAnimType.ConjurationCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.ConjurationConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.DivinationCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.DivinationConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.EnchantmentCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.EnchantmentConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.EvocationCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.EvocationConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.IllusionCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.IllusionConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.NecromancyCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.NecromancyConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.TransmutationCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.TransmutationConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.Conceal:
            animId = new EncodedAnimId(WeaponAnim.RightAttack);
            return(true);

        case NormalAnimType.ConcealIdle:
            animId = new EncodedAnimId(WeaponAnim.Idle);
            return(true);

        case NormalAnimType.Unconceal:
            animId = new EncodedAnimId(NormalAnimType.Getup);
            return(true);

        case NormalAnimType.ItemFidget:
        case NormalAnimType.Open:
        case NormalAnimType.Close:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        case NormalAnimType.SkillAnimalEmpathy:
        case NormalAnimType.SkillDisableDevice:
        case NormalAnimType.SkillHeal:
            animId = new EncodedAnimId(NormalAnimType.Magichands);
            return(true);

        case NormalAnimType.SkillHealConcentrated:
            animId = new EncodedAnimId(NormalAnimType.SkillHeal);
            return(true);

        case NormalAnimType.SkillHide:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        case NormalAnimType.SkillHideIdle:
            animId = new EncodedAnimId(WeaponAnim.Idle);
            return(true);

        case NormalAnimType.SkillHideFidget:
            animId = new EncodedAnimId(WeaponAnim.CombatFidget);
            return(true);

        case NormalAnimType.SkillUnhide:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        case NormalAnimType.SkillPickpocket:
        case NormalAnimType.SkillSearch:
        case NormalAnimType.SkillSpot:
        case NormalAnimType.FeatTrack:
        case NormalAnimType.Trip:
        case NormalAnimType.Bullrush:
        case NormalAnimType.Flurry:
        case NormalAnimType.Kistrike:
        case NormalAnimType.Tumble:
            animId = new EncodedAnimId(NormalAnimType.Magichands);
            return(true);

        case NormalAnimType.Special1:
        case NormalAnimType.Special2:
        case NormalAnimType.Special3:
        case NormalAnimType.Special4:
        case NormalAnimType.Throw2:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        case NormalAnimType.WandAbjurationCasting:
            animId = new EncodedAnimId(NormalAnimType.AbjurationCasting);
            return(true);

        case NormalAnimType.WandAbjurationConjuring:
            animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring);
            return(true);

        case NormalAnimType.WandConjurationCasting:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting);
            return(true);

        case NormalAnimType.WandConjurationConjuring:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring);
            return(true);

        case NormalAnimType.WandDivinationCasting:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting);
            return(true);

        case NormalAnimType.WandDivinationConjuring:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring);
            return(true);

        case NormalAnimType.WandEnchantmentCasting:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting);
            return(true);

        case NormalAnimType.WandEnchantmentConjuring:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring);
            return(true);

        case NormalAnimType.WandEvocationCasting:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting);
            return(true);

        case NormalAnimType.WandEvocationConjuring:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring);
            return(true);

        case NormalAnimType.WandIllusionCasting:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting);
            return(true);

        case NormalAnimType.WandIllusionConjuring:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring);
            return(true);

        case NormalAnimType.WandNecromancyCasting:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting);
            return(true);

        case NormalAnimType.WandNecromancyConjuring:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring);
            return(true);

        case NormalAnimType.WandTransmutationCasting:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting);
            return(true);

        case NormalAnimType.WandTransmutationConjuring:
            animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring);
            return(true);

        case NormalAnimType.SkillBarbarianRage:
            animId = new EncodedAnimId(WeaponAnim.RightAttack);
            return(true);

        case NormalAnimType.OpenIdle:
            animId = new EncodedAnimId(NormalAnimType.ItemIdle);
            return(true);

        default:
            return(false);
        }
    }
예제 #7
0
    /**
     * If this animation is a conjuration animation, returns the corresponding casting animation.
     */
    public bool ToCastingAnim(out EncodedAnimId animId)
    {
        if (IsSpecialAnim())
        {
            animId = default;
            return(false);
        }

        var normalAnim = GetNormalAnimType();

        switch (normalAnim)
        {
        case NormalAnimType.AbjurationConjuring:
            normalAnim = NormalAnimType.AbjurationCasting;
            break;

        case NormalAnimType.ConjurationConjuring:
            normalAnim = NormalAnimType.ConjurationCasting;
            break;

        case NormalAnimType.DivinationConjuring:
            normalAnim = NormalAnimType.DivinationCasting;
            break;

        case NormalAnimType.EnchantmentConjuring:
            normalAnim = NormalAnimType.EnchantmentCasting;
            break;

        case NormalAnimType.EvocationConjuring:
            normalAnim = NormalAnimType.EvocationCasting;
            break;

        case NormalAnimType.IllusionConjuring:
            normalAnim = NormalAnimType.IllusionCasting;
            break;

        case NormalAnimType.NecromancyConjuring:
            normalAnim = NormalAnimType.NecromancyCasting;
            break;

        case NormalAnimType.TransmutationConjuring:
            normalAnim = NormalAnimType.TransmutationCasting;
            break;

        case NormalAnimType.WandAbjurationConjuring:
            normalAnim = NormalAnimType.WandAbjurationCasting;
            break;

        case NormalAnimType.WandConjurationConjuring:
            normalAnim = NormalAnimType.WandConjurationCasting;
            break;

        case NormalAnimType.WandDivinationConjuring:
            normalAnim = NormalAnimType.WandDivinationCasting;
            break;

        case NormalAnimType.WandEnchantmentConjuring:
            normalAnim = NormalAnimType.WandEnchantmentCasting;
            break;

        case NormalAnimType.WandEvocationConjuring:
            normalAnim = NormalAnimType.WandEvocationCasting;
            break;

        case NormalAnimType.WandIllusionConjuring:
            normalAnim = NormalAnimType.WandIllusionCasting;
            break;

        case NormalAnimType.WandNecromancyConjuring:
            normalAnim = NormalAnimType.WandNecromancyCasting;
            break;

        case NormalAnimType.WandTransmutationConjuring:
            normalAnim = NormalAnimType.WandTransmutationCasting;
            break;

        default:
            animId = default;
            return(false);
        }

        animId = new EncodedAnimId(normalAnim);
        return(true);
    }