Exemple #1
0
 public Animation AnimationByKey(string key)
 {
     if (AnimationLookup.ContainsKey(key))
     {
         int index = AnimationLookup[key];
         return(Animations[index]);
     }
     return(null);
 }
Exemple #2
0
        private AnimationLookup[] ReadAnimationLookup(uint nAnimationLookup, uint ofsAnimationLookup, BinaryReader bin)
        {
            bin.BaseStream.Position = ofsAnimationLookup;
            var animationlookup = new AnimationLookup[nAnimationLookup];

            for (var i = 0; i < nAnimationLookup; i++)
            {
                animationlookup[i] = bin.Read <AnimationLookup>();
            }
            return(animationlookup);
        }
Exemple #3
0
        internal void EventTriggerStateChanged(EventTriggers state, bool active, HashSet <string> muzzles = null)
        {
            var session = Comp.Session;
            var canPlay = !session.DedicatedServer && session.SyncBufferedDistSqr >= Vector3D.DistanceSquared(session.CameraPos, MyPivotPos);

            switch (state)
            {
            case EventTriggers.StopFiring:
            case EventTriggers.PreFire:
            case EventTriggers.Firing:
                if (AnimationsSet.ContainsKey(state))
                {
                    var  addToFiring = AnimationsSet.ContainsKey(EventTriggers.StopFiring) && state == EventTriggers.Firing;
                    uint delay       = 0;
                    if (active)
                    {
                        if (state == EventTriggers.StopFiring)
                        {
                            // Fix this properly
                            var stopLen = 0u;
                            System.WeaponAnimationLengths.TryGetValue(EventTriggers.StopFiring, out stopLen);
                            Timings.ShootDelayTick = stopLen + session.Tick;
                            if (LastEvent == EventTriggers.Firing || LastEvent == EventTriggers.PreFire)
                            {
                                if (CurLgstAnimPlaying != null && CurLgstAnimPlaying.Running)
                                {
                                    delay = CurLgstAnimPlaying.Reverse ? (uint)CurLgstAnimPlaying.CurrentMove : (uint)((CurLgstAnimPlaying.NumberOfMoves - 1) - CurLgstAnimPlaying.CurrentMove);
                                    Timings.ShootDelayTick += delay;
                                }
                            }
                        }
                    }

                    for (int i = 0; i < AnimationsSet[state].Length; i++)
                    {
                        var animation = AnimationsSet[state][i];

                        if (active && !animation.Running && (animation.Muzzle == "Any" || (muzzles != null && muzzles.Contains(animation.Muzzle))))
                        {
                            if (animation.TriggerOnce && animation.Triggered)
                            {
                                continue;
                            }
                            animation.Triggered = true;

                            if (CurLgstAnimPlaying == null || CurLgstAnimPlaying.EventTrigger != state || animation.NumberOfMoves > CurLgstAnimPlaying.NumberOfMoves)
                            {
                                CurLgstAnimPlaying = animation;
                            }

                            if (animation.Muzzle != "Any" && addToFiring)
                            {
                                _muzzlesFiring.Add(animation.Muzzle);
                            }

                            animation.StartTick = session.Tick + animation.MotionDelay + delay;
                            Comp.Session.AnimationsToProcess.Add(animation);
                            animation.Running = true;
                            //animation.Paused = Comp.ResettingSubparts;
                            animation.CanPlay = canPlay;

                            if (animation.DoesLoop)
                            {
                                animation.Looping = true;
                            }
                        }
                        else if (active && animation.DoesLoop)
                        {
                            animation.Looping = true;
                        }
                        else if (!active)
                        {
                            animation.Looping   = false;
                            animation.Triggered = false;
                        }
                    }
                    if (active && state == EventTriggers.StopFiring)
                    {
                        _muzzlesFiring.Clear();
                    }
                }
                break;

            case EventTriggers.StopTracking:
            case EventTriggers.Tracking:
                if (AnimationsSet.ContainsKey(state))
                {
                    var oppositeEvnt = state == EventTriggers.Tracking ? EventTriggers.StopTracking : EventTriggers.Tracking;
                    //if (active) LastEvent = state;
                    for (int i = 0; i < AnimationsSet[state].Length; i++)
                    {
                        var animation = AnimationsSet[state][i];
                        if (active && !animation.Running)
                        {
                            if (animation.TriggerOnce && animation.Triggered)
                            {
                                continue;
                            }
                            animation.Triggered = true;

                            if (CurLgstAnimPlaying == null || CurLgstAnimPlaying.EventTrigger != state || animation.NumberOfMoves > CurLgstAnimPlaying.NumberOfMoves)
                            {
                                CurLgstAnimPlaying = animation;
                            }

                            PartAnimation animCheck;
                            animation.Running = true;
                            //animation.Paused = Comp.ResettingSubparts;
                            animation.CanPlay = canPlay;
                            string opEvent = "";
                            if (animation.EventIdLookup.TryGetValue(oppositeEvnt, out opEvent) && AnimationLookup.TryGetValue(opEvent, out animCheck) && animCheck.Running)
                            {
                                animCheck.Reverse = true;

                                if (!animation.DoesLoop)
                                {
                                    animation.Running = false;
                                }
                                else
                                {
                                    animation.StartTick = Comp.Session.Tick + (uint)animCheck.CurrentMove + animation.MotionDelay;
                                    Comp.Session.AnimationsToProcess.Add(animation);
                                }
                            }
                            else
                            {
                                Comp.Session.AnimationsToProcess.Add(animation);
                                animation.StartTick = session.Tick + animation.MotionDelay;
                            }

                            if (animation.DoesLoop)
                            {
                                animation.Looping = true;
                            }
                        }
                        else if (active && animation.DoesLoop)
                        {
                            animation.Looping = true;
                        }
                        else if (!active)
                        {
                            animation.Looping   = false;
                            animation.Triggered = false;
                        }
                    }
                }
                break;

            case EventTriggers.TurnOn:
            case EventTriggers.TurnOff:
                if (active && AnimationsSet.ContainsKey(state))
                {
                    var oppositeEvnt = state == EventTriggers.TurnOff ? EventTriggers.TurnOn : EventTriggers.TurnOff;

                    if ((state == EventTriggers.TurnOn && !Comp.State.Value.Online) || state == EventTriggers.TurnOff && Comp.State.Value.Online)
                    {
                        return;
                    }

                    //LastEvent = state;
                    for (int i = 0; i < AnimationsSet[state].Length; i++)
                    {
                        var animation = AnimationsSet[state][i];
                        if (!animation.Running)
                        {
                            if (CurLgstAnimPlaying == null || CurLgstAnimPlaying.EventTrigger != state || animation.NumberOfMoves > CurLgstAnimPlaying.NumberOfMoves)
                            {
                                CurLgstAnimPlaying = animation;
                            }

                            PartAnimation animCheck;
                            animation.Running = true;
                            animation.CanPlay = true;
                            //animation.Paused = Comp.ResettingSubparts;
                            string eventName;
                            if (animation.EventIdLookup.TryGetValue(oppositeEvnt, out eventName) && AnimationLookup.TryGetValue(eventName, out animCheck))
                            {
                                if (animCheck.Running)
                                {
                                    animCheck.Reverse = true;
                                    animation.Running = false;
                                }
                                else
                                {
                                    session.ThreadedAnimations.Enqueue(animation);
                                }
                            }
                            else
                            {
                                session.ThreadedAnimations.Enqueue(animation);
                            }

                            animation.StartTick = session.Tick + animation.MotionDelay;
                            if (state == EventTriggers.TurnOff)
                            {
                                animation.StartTick += Timings.OffDelay;
                            }
                        }
                        else
                        {
                            animation.Reverse = false;
                        }
                    }
                }
                break;

            case EventTriggers.EmptyOnGameLoad:
            case EventTriggers.Overheated:
            case EventTriggers.OutOfAmmo:
            case EventTriggers.BurstReload:
            case EventTriggers.Reloading:
                if (AnimationsSet.ContainsKey(state))
                {
                    //if (active) LastEvent = state;
                    for (int i = 0; i < AnimationsSet[state].Length; i++)
                    {
                        var animation = AnimationsSet[state][i];
                        if (active && !animation.Running)
                        {
                            if (animation.TriggerOnce && animation.Triggered)
                            {
                                continue;
                            }
                            animation.Triggered = true;

                            if (CurLgstAnimPlaying == null || CurLgstAnimPlaying.EventTrigger != state || animation.NumberOfMoves > CurLgstAnimPlaying.NumberOfMoves)
                            {
                                CurLgstAnimPlaying = animation;
                            }

                            animation.StartTick = session.Tick + animation.MotionDelay;
                            session.ThreadedAnimations.Enqueue(animation);

                            animation.Running = true;
                            animation.CanPlay = canPlay;
                            //animation.Paused = Comp.ResettingSubparts;

                            if (animation.DoesLoop)
                            {
                                animation.Looping = true;
                            }
                        }
                        else if (active && animation.DoesLoop)
                        {
                            animation.Looping = true;
                        }
                        else if (!active)
                        {
                            animation.Looping   = false;
                            animation.Triggered = false;
                        }
                    }
                }
                break;
            }
            if (active)
            {
                LastEvent = state;
            }
        }
Exemple #4
0
 public void AddAnimation(string key, Animation newAnim)
 {
     AnimationLookup.Add(key, Animations.Count);
     Animations.Add(newAnim);
 }