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(); }
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(); }
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(); }