コード例 #1
0
        public bool ApplyPhysicsNetworkData(byte[] dat)
        {
            if (dat.Length < PhysicsNetworkDataLength)
            {
                return(false);
            }
            SetMass(Utilities.BytesToFloat(Utilities.BytesPartial(dat, 0, 4)));
            SetPosition(Location.FromDoubleBytes(dat, 4));
            SetVelocity(Location.FromDoubleBytes(dat, 4 + 24));
            SetOrientation(Utilities.BytesToQuaternion(dat, 4 + 24 + 24));
            SetAngularVelocity(Location.FromDoubleBytes(dat, 4 + 24 + 24 + 16));
            SetFriction(Utilities.BytesToFloat(Utilities.BytesPartial(dat, 4 + 24 + 24 + 16 + 24, 4)));
            SetBounciness(Utilities.BytesToFloat(Utilities.BytesPartial(dat, 4 + 24 + 24 + 16 + 24 + 4, 4)));
            // TODO: Proper flags thingy here?
            byte fl = dat[4 + 24 + 24 + 16 + 24 + 4 + 4];

            Visible           = (fl & 1) == 1;
            GenBlockShadows   = (fl & 2) == 2;
            CanDistanceRender = GenBlockShadows;
            byte cg = dat[4 + 24 + 24 + 16 + 24 + 4 + 4 + 1];

            if (cg == 2)
            {
                CGroup = CollisionUtil.Solid;
            }
            else if (cg == 4)
            {
                CGroup = CollisionUtil.NonSolid;
            }
            else if (cg == (2 | 4))
            {
                CGroup = CollisionUtil.Item;
            }
            else if (cg == 8)
            {
                CGroup = CollisionUtil.Player;
            }
            else if (cg == (2 | 8))
            {
                CGroup = CollisionUtil.Water;
            }
            else if (cg == (2 | 4 | 8))
            {
                CGroup = CollisionUtil.WorldSolid;
            }
            else // if (cg == 16)
            {
                CGroup = CollisionUtil.Player;
            }
            const int coord = 4 + 24 + 24 + 16 + 24 + 4 + 4 + 1 + 1;

            AutoGravityScale = Utilities.BytesToDouble(Utilities.BytesPartial(dat, coord, 8));// TODO: non-entity property
            TheClient.Player.AutoGravityScale = AutoGravityScale;
            LocalPositionOffset = Location.FromDoubleBytes(dat, coord + 8);
            if (Body != null)
            {
                Body.CollisionInformation.LocalPosition = LocalPositionOffset.ToBVector();
            }
            return(true);
        }
コード例 #2
0
 /// <summary>
 /// Builds and spawns the body into the world.
 /// </summary>
 public virtual void SpawnBody()
 {
     if (Body != null)
     {
         DestroyBody();
     }
     Body = new BEPUphysics.Entities.Entity(Shape, Mass);
     Body.CollisionInformation.CollisionRules.Group = CGroup;
     InternalOffset          = new Location(Body.Position);
     Body.AngularVelocity    = new Vector3((float)AVel.X, (float)AVel.Y, (float)AVel.Z);
     Body.LinearVelocity     = new Vector3((float)LVel.X, (float)LVel.Y, (float)LVel.Z);
     Body.WorldTransform     = WorldTransform; // TODO: Position + Quaternion
     Body.PositionUpdateMode = BEPUphysics.PositionUpdating.PositionUpdateMode.Passive;
     Body.CollisionInformation.LocalPosition = LocalPositionOffset.ToBVector();
     if (!CanRotate)
     {
         Body.AngularDamping = 1;
     }
     Body.LinearDamping = 0;
     // TODO: Other settings
     // TODO: Gravity
     Body.Tag = this;
     SetFriction(Friction);
     SetBounciness(Bounciness);
     TheRegion.PhysicsWorld.Add(Body);
     for (int i = 0; i < Joints.Count; i++)
     {
         if (Joints[i] is BaseJoint joint)
         {
             joint.CurrentJoint = joint.GetBaseJoint();
             TheRegion.PhysicsWorld.Add(joint.CurrentJoint);
         }
     }
     ShadowCastShape = Shape.GetCollidableInstance().BoundingBox;
     ShadowMainDupe  = Shape.GetCollidableInstance().BoundingBox;
     ShadowCenter    = GetPosition();
 }