예제 #1
0
        protected override void Interpolate(Vec3f newPos, Angles newAng)
        {
            // gothic is already setting positions through animations, gravity etc.
            // so we just set the position because it would look twitchy otherwise
            SetPosition(newPos);

            Angles oldAng = this.ang;
            Angles curAng = Angles;

            if (Movement == NPCMovement.Stand &&
                !newAng.DifferenceIsBigger(curAng, Angles.PI / 2f) && // don't interpolate > 90 degree turns
                newAng.DifferenceIsBigger(curAng, 0.00001f))    // don't interpolate infinitesimal turns
            {
                iAngStart   = curAng;
                iAngEnd     = newAng;
                iAngEndTime = GameTime.Ticks + InterpolationTimeAng;

                float diff;
                if (!this.Model.IsInAnimation() && Math.Abs(diff = Angles.Difference(newAng.Yaw, curAng.Yaw)) > MinYawDiffToAnimate)
                {
                    StartTurnAni(diff < 0);
                    return;
                }
            }
            else
            {
                SetAngles(newAng);
                iAngEndTime = 0;
            }
            StopTurnAni();
        }
예제 #2
0
        protected virtual void UpdateGuidePos(long now)
        {
            if (now < guidedNextUpdate)
            {
                return;
            }

            Vec3f          pos = this.Position;
            Angles         ang = this.Angles;
            VobEnvironment env = this.Environment;

            if (now - guidedNextUpdate < TimeSpan.TicksPerSecond)
            {
                // nothing really changed, only update every second
                if (pos.GetDistance(guidedLastPos) < MinPositionDistance &&
                    !ang.DifferenceIsBigger(guidedLastAng, MinAnglesDifference) &&
                    env == guidedLastEnv)
                {
                    return;
                }
            }

            guidedLastPos = pos;
            guidedLastAng = ang;
            guidedLastEnv = env;

            Messages.WritePosDirMessage(this, pos, ang, env);

            guidedNextUpdate = now + PosUpdateInterval;

            //this.ScriptObject.OnPosChanged();
        }
예제 #3
0
        void UpdateGuidedNPCPosition(long now, long interval, float minPosDist, float minAngDist)
        {
            if (now < guidedNextUpdate)
            {
                return;
            }

            Vec3f          pos = this.Position;
            Angles         ang = this.Angles;
            VobEnvironment env = this.Environment;

            if (now - guidedNextUpdate < TimeSpan.TicksPerSecond)
            {
                // nothing really changed, only update every second
                if (guidedLastMovement == this.movement &&
                    pos.GetDistance(guidedLastPos) < minPosDist &&
                    !ang.DifferenceIsBigger(guidedLastAng, minAngDist) &&
                    env == guidedLastEnv)
                {
                    return;
                }
            }

            guidedLastMovement = this.movement;
            guidedLastPos      = pos;
            guidedLastAng      = ang;
            guidedLastEnv      = env;

            Messages.WritePosAngMessage(this, pos, ang, env);

            guidedNextUpdate = now + interval;

            //this.ScriptObject.OnPosChanged();
        }