csharp/ACEmulator/ACE/Source/ACE.Server/Physics/PhysicsEngine.cs

PhysicsEngine.cs
using System;
using System.Collections.Generic;
using ACE.Server.Physics.Common;

namespace ACE.Server.Physics
{
    [Flags]
    public enum TransientStateFlags
    {
        Contact = 0x1,
        OnWalkable = 0x2,
        Sliding = 0x4,
        WaterContact = 0x8,
        StationaryFall = 0x10,
        StationaryStop = 0x20,
        StationaryStuck = 0x40,
        StationaryComplete = StationaryStuck | StationaryStop | StationaryFall,
        Active = 0x80,
        CheckEthereal = 0x100
    };

    public enum PhysicsTimeStamp
    {
        Position = 0x0,
        Movement = 0x1,
        State = 0x2,
        Vector = 0x3,
        Teleport = 0x4,
        ServerControlledMove = 0x5,
        ForcePosition = 0x6,
        ObjDesc = 0x7,
        Instance = 0x8,
        NumPhysics = 0x9
    };

    public clast PhysicsEngine
    {
        public ObjectMaint ObjMaint;
        public SmartBox SmartBox;
        public PhysicsObj Player;
        public List Iter;

        public static PhysicsEngine Instance;
        public bool Server;

        //public static List StaticAnimatingObjects; // This is not used
        public static double LastUpdate;

        static PhysicsEngine()
        {
            //StaticAnimatingObjects = new List();
        }

        public PhysicsEngine(ObjectMaint objMaint, SmartBox smartBox)
        {
            ObjMaint = objMaint;
            SmartBox = smartBox;

            SmartBox.Physics = this;
            Instance = this;
        }

        /*public static void AddStaticAnimatingObject(PhysicsObj obj) // Was used in PhysicsObj.InitDefaults
        {
            StaticAnimatingObjects.Add(obj);
        }*/

        /*public static void RemoveStaticAnimatingObject(PhysicsObj obj) // Was used in PhysicsObj.Destroy
        {
            StaticAnimatingObjects.Remove(obj);
        }*/

        public static bool SetObjectMovement(PhysicsObj obj, object buffer, int size, int movementTimestamp, int serverControlTimestamp, bool autonomous)
        {
            var checkTime = false;
            var lastMoveTime = obj.UpdateTimes[1];
            if (Math.Abs(movementTimestamp - lastMoveTime) > Int16.MaxValue)
                checkTime = movementTimestamp < lastMoveTime;
            else
                checkTime = lastMoveTime < movementTimestamp;
            if (checkTime)
                obj.UpdateTimes[1] = movementTimestamp;
            else
                return false;

            var lastServerTime = obj.UpdateTimes[5];
            if (Math.Abs(serverControlTimestamp - lastServerTime) > Int16.MaxValue)
                checkTime = serverControlTimestamp < lastServerTime;
            else
                checkTime = lastServerTime < serverControlTimestamp;
            if (checkTime)
                obj.UpdateTimes[5] = serverControlTimestamp;
            else
                return false;

            var isPlayer = obj.WeenieObj != null && !obj.WeenieObj.IsPlayer();
            if (!isPlayer || !autonomous)
            {
                obj.LastMoveWasAutonomous = autonomous;
                if (isPlayer) return true;
            }
            return false;
        }

        public void SetPlayer(PhysicsObj player)
        {
            Player = player;
        }

        public void UseTime()
        {
            var deltaTime = PhysicsTimer.CurrentTime - LastUpdate;
            if (deltaTime < 0.0f)
            {
                LastUpdate = PhysicsTimer.CurrentTime;
                return;
            }
            if (deltaTime < PhysicsGlobals.MinQuantum) return;

            foreach (var obj in Iter)
            {
                obj.update_object();
                if (Player.Equals(obj))
                    SmartBox.PlayerPhysicsUpdatedCallback();
            }
            //foreach (var obj in StaticAnimatingObjects)
            //    obj.animate_static_object();

            LastUpdate = PhysicsTimer.CurrentTime;
        }
    }
}