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