예제 #1
0
        public static ReusableList <IUserCmd> FromProtoBuf(UserCmdMessage message)
        {
            ReusableList <IUserCmd> list = ReusableList <IUserCmd> .Allocate();

            var count = message.UserCmdList.Count;

            for (int i = 0; i < count; i++)
            {
                var     item = message.UserCmdList[i];
                UserCmd cmd  = UserCmd.Allocate();
                cmd.RenderTime     = item.RenderTime;
                cmd.FrameInterval  = item.FrameInterval;
                cmd.MoveHorizontal = item.MoveHorizontal;
                cmd.MoveVertical   = item.MoveVertical;
                cmd.MoveUpDown     = item.MoveUpDown;
                cmd.Seq            = item.Seq;
                cmd.DeltaPitch     = item.DeltaPitch;
                cmd.DeltaYaw       = item.DeltaYaw;
                cmd.Buttons        = item.Buttons;
                cmd.BeState        = item.BeState;
                cmd.SwitchNumber   = item.SwitchNumber;
                cmd.ChangedSeat    = item.ChangedSeat;
                cmd.ChangeChannel  = item.ChangeChannel;
                cmd.SnapshotId     = item.SnapshotId;
                cmd.CurWeapon      = item.CurWeapon;
                cmd.PickUpEquip    = item.PickUpEquip;
                cmd.UseEntityId    = item.UseVehicleId;
                cmd.UseVehicleSeat = item.UseVehicleSeat;
                cmd.UseType        = item.UseType;
                cmd.BagIndex       = item.BagIndex;
                list.Value.Add(cmd);
            }
            return(list);
        }
예제 #2
0
        public object Deserialize(Stream inStream)
        {
            ReusableList <UpdateLatestPacakge> list = ReusableList <UpdateLatestPacakge> .Allocate();

            BinaryReader binaryReader = new BinaryReader(inStream);
            int          count        = binaryReader.ReadByte();

            for (int i = 0; i < count; i++)
            {
                UpdateLatestPacakge pacakge = UpdateLatestPacakge.Allocate();

                pacakge.Head.Deserialize(binaryReader);
                var seq        = pacakge.Head.UserCmdSeq;
                var bodyLenght = pacakge.Head.BodyLength;
                if (MessagePool.GetPackageBySeq(seq) == null)
                {
                    var baseSeq = pacakge.Head.BaseUserCmdSeq;
                    var old     = MessagePool.GetPackageBySeq(baseSeq);
                    if (old != null)
                    {
                        pacakge.CopyUpdateComponentsFrom(old.UpdateComponents);
                    }



                    for (int c = 0; c < pacakge.Head.ComponentCount; c++)
                    {
                        var opType = (ComponentReplicateOperationType)binaryReader.ReadByte();

                        var patch = CreateEmptyComponentPatch(opType);
                        patch.DeSerialize(binaryReader, _componentSerializerManager);
                        ApplyPatchTo(patch, pacakge.UpdateComponents);

                        patch.ReleaseReference();
                    }

                    if (pacakge.Head.ComponentCount == pacakge.UpdateComponents.Count)
                    {
                        MessagePool.AddMessage(pacakge);
                        pacakge.AcquireReference();
                        list.Value.Add(pacakge);
                    }
                    else
                    {
                        _logger.WarnFormat("Skip package {0} with length {1} baseSeq;{2}", pacakge.Head.UserCmdSeq, pacakge.Head.BodyLength, pacakge.Head.BaseUserCmdSeq);
                    }
                }
                else
                {
                    _logger.DebugFormat("Skip package {0} with length {1}", pacakge.Head.UserCmdSeq, pacakge.Head.BodyLength);
                    binaryReader.BaseStream.Seek(bodyLenght, SeekOrigin.Current);
                }


                pacakge.ReleaseReference();
            }

            return(list);
        }
예제 #3
0
        // a list of latest 'SendCount' item, from newest to oldest
        public ReusableList <TCmd> CreateLatestList()
        {
            var rc = ReusableList <TCmd> .Allocate();

            int count = 0;

            foreach (var cmd in _userCmdList)
            {
                rc.Value.Add(cmd);
                count++;
                if (count >= SendCount)
                {
                    break;
                }
            }
            return(rc);
        }
예제 #4
0
        public static ReusableList <IVehicleCmd> FromProtoBuf(VehicleCmdMessage message)
        {
            ReusableList <IVehicleCmd> list = ReusableList <IVehicleCmd> .Allocate();

            var count = message.VehicleCmdList.Count;

            for (int i = 0; i < count; ++i)
            {
                var item = message.VehicleCmdList[i];

                var cmd = VehicleCmd.Allocate();
                {
                    cmd.Seq            = item.Seq;
                    cmd.PlayerId       = item.PlayerId;
                    cmd.VehicleId      = item.VehicleId;
                    cmd.MoveHorizontal = item.MoveHorizontal;
                    cmd.MoveVertical   = item.MoveVertical;
                    cmd.IsSpeedup      = item.IsSpeedup;
                    cmd.IsHandbrake    = item.IsHandbrake;
                    cmd.IsHornOn       = item.IsHornOn;
                    cmd.IsStunt        = item.IsStunt;
                    cmd.IsLeftShift    = item.IsLeftShift;
                    cmd.IsRightShift   = item.IsRightShift;

                    cmd.ExecuteTime = item.ExecuteTime;

                    cmd.CmdSeq = item.CmdSeq;

                    cmd.Body.Position = Vector3Converter.ProtobufToUnityVector3(item.Body.Position).ShiftedToFixedVector3();
                    cmd.Body.Rotation = Vector3Converter.ProtobufToUnityQuaternion(item.Body.Rotation);
//                    cmd.Body.Body2WorldPosition = Vector3Converter.ProtobufToUnityVector3(item.Body.Body2WorldPosition);
//                    cmd.Body.Body2WorldRotation = Vector3Converter.ProtobufToUnityQuaternion(item.Body.Body2WorldRotation);
                    cmd.Body.LinearVelocity  = Vector3Converter.ProtobufToUnityVector3(item.Body.LinearVelocity);
                    cmd.Body.AngularVelocity = Vector3Converter.ProtobufToUnityVector3(item.Body.AngularVelocity);
                    //                   cmd.Body.ContactCount = item.Body.ContactCount;
                    cmd.Body.Crashed    = item.Body.Crashed;
                    cmd.Body.IsSleeping = item.Body.IsSleeping;

                    var carSteerableCount = item.CarSteerables.Count;
                    for (int j = 0; j < carSteerableCount; ++j)
                    {
                        var steerable     = cmd.Steerables[j].Car;
                        var steerableItem = item.CarSteerables[j];
                        steerable.Position = Vector3Converter.ProtobufToUnityVector3(steerableItem.Position);
                        steerable.Rotation = Vector3Converter.ProtobufToUnityQuaternion(steerableItem.Rotation);
                        steerable.Angle    = steerableItem.Angle;
//                        steerable.Grounded = steerableItem.Grounded;
//                        steerable.GroundedOnTerrain = steerableItem.GroundedOnTerrain;

//                        steerable.ColliderSteerAngle = steerableItem.ColliderSteerAngle;
//                        steerable.SteerAngle = steerableItem.SteerAngle;
//                        steerable.MotorTorque = steerableItem.MotorTorque;
//
//                        steerable.SuspensionDistance = steerableItem.SuspensionDistance;
//                        steerable.SuspensionSpring = steerableItem.SuspensionSpring;
//                        steerable.SuspensionTargetPosition = steerableItem.SuspensionTargetPosition;
//
//                        steerable.SprungMass = steerableItem.SprungMass;
//                        steerable.ForceDistance = steerableItem.ForceDistance;
//
//                        steerable.AngularVelocity = steerableItem.AngularVelocity;
//                        steerable.AngularPosition = steerableItem.AngularPosition;
//                        steerable.RotationAngle = steerableItem.RotationAngle;
//
//                        steerable.RotationSpeed = steerableItem.RotationSpeed;
//                        steerable.CorrectedRotationSpeed = steerableItem.CorrectedRotationSpeed;
//                        steerable.Jounce = steerableItem.Jounce;
//
//                        steerable.TireLowSideSpeedTimers = steerableItem.TireLowSideSpeedTimers;
//                        steerable.TireLowforwardSpeedTimers = steerableItem.TireLowforwardSpeedTimers;
//
//                        steerable.Grounded = steerableItem.Grounded;
//                        steerable.Point = Vector3Converter.ProtobufToUnityVector3(steerableItem.Point);
//                        steerable.Normal = Vector3Converter.ProtobufToUnityVector3(steerableItem.Normal);
//                        steerable.ForwardDir = Vector3Converter.ProtobufToUnityVector3(steerableItem.ForwardDir);
//                        steerable.SidewaysDir = Vector3Converter.ProtobufToUnityVector3(steerableItem.SidewaysDir);
//                        steerable.Force = steerableItem.Force;
//
//                        steerable.ForwardSlip = steerableItem.ForwardSlip;
//                        steerable.SidewaysSlip = steerableItem.SidewaysSlip;

                        cmd.Steerables[j].Car = steerable;
                    }

                    var shipSteerableCount = item.ShipSteerables.Count;
                    for (int j = 0; j < shipSteerableCount; ++j)
                    {
                        var steerable     = cmd.Steerables[j].Ship;
                        var steerableItem = item.ShipSteerables[j];

                        steerable.Angle = steerableItem.Angle;
//                        steerableItem.Rpm = steerableItem.Rpm;
//                        steerableItem.SpinVelocity = steerableItem.SpinVelocity;
//                        steerableItem.Submerged = steerableItem.Submerged;

                        cmd.Steerables[j].Ship = steerable;
                    }

                    if (carSteerableCount > shipSteerableCount)
                    {
                        cmd.VehicleType    = (int)EVehicleType.Car;
                        cmd.SteerableCount = carSteerableCount;
                    }
                    else
                    {
                        cmd.VehicleType    = (int)EVehicleType.Ship;
                        cmd.SteerableCount = shipSteerableCount;
                    }
                };

                list.Value.Add(cmd);
            }


            return(list);
        }