using System.Collections.Generic; using System.Diagnostics; using NetworkLib; namespace NetworkSample { public class PhysClient : ReadWriteClient { #region CommandType enum public enum CommandType { CameraCoords, CameraAngularCoords, Fire, NewId, } #endregion private readonly DataController _dataController; public PhysClient(DataController dataController) { _dataController = dataController; Initialize("PhysClient", _dataController.DataSchemaController); } protected override void SetFilter(SendData sendData) { var list = new List { NetworkLib.CommandType.NEW_OBJECT_ID, _dataController.MoveCameraCommand, _dataController.RotateCameraCommand, _dataController.FireCommad }; sendData.AddCommandFilter(list.ToArray()); } protected override void ParseData(ReceivedData receivedData, CommandBuffer readBuffer) { for (var i = 0; i < receivedData.CommandCount; i++) { var commandInfos = receivedData.CommandInfos; if (commandInfos[i].CustomCommand == _dataController.MoveCameraCommand) { readBuffer.AddCameraCommand(CommandType.CameraCoords, commandInfos[i].ReadVector()); } else if (commandInfos[i].CustomCommand == _dataController.RotateCameraCommand) { readBuffer.AddCameraCommand(CommandType.CameraAngularCoords, commandInfos[i].ReadVector()); } else if (commandInfos[i].CustomCommand == _dataController.FireCommad) { readBuffer.AddFireCommand(); } else if (commandInfos[i].CommandType == NetworkLib.CommandType.NEW_OBJECT_ID) { readBuffer.AddNewIdCommand(commandInfos[i].ObjId); } } } protected override void WriteData(SendData sendData, ViewClientBuffer buffer) { SendCameraData(sendData, buffer); SendBulletsData(sendData, buffer.BulletBuffer); buffer.BeamBuffer.Send(sendData, _dataController.BeamsDataObjectId); } private void SendBulletsData(SendData sendData, BulletBuffer bulletBuffer) { for (var i = 0; i < bulletBuffer.Count; i++) { if (bulletBuffer.BulletInfos[i].Id == IdManager.NONE_ID) { sendData.AddCreateObjectCommand(_dataController.BulletCoordsType, DataType.VECTOR, bulletBuffer.BulletInfos[i].Pos); } else { sendData.AddChangeObjectCommand(bulletBuffer.BulletInfos[i].Id, _dataController.BulletCoordsType, DataType.VECTOR, bulletBuffer.BulletInfos[i].Pos); } } } private void SendCameraData(SendData sendData, ViewClientBuffer buffer) { if (!buffer.CameraCoords.IsNaN) sendData.AddChangeObjectCommand(_dataController.CameraCoordsObjectId, buffer.CameraCoords); if (!buffer.CameraAngularCoords.IsNaN) sendData.AddChangeObjectCommand(_dataController.CameraAngularCoordsObjectId, buffer.CameraAngularCoords); } #region Nested type: Command public struct Command { public CommandType CommandType; public Vector3 Coords; public int Id; } #endregion #region Nested type: CommandBuffer public class CommandBuffer : IBuffer { public readonly Command[] Commands = new Command[10000]; private int _commandCount; public int CommandCount { get { return _commandCount; } } #region IBuffer Members public void Clear() { _commandCount = 0; } #endregion public void AddCameraCommand(CommandType commandType, Vector3 coords) { Commands[_commandCount].Coords = coords; Commands[_commandCount].CommandType = commandType; IncCommandCount(); } private void IncCommandCount() { _commandCount++; if (_commandCount == Commands.Length) { Clear(); Logger.WriteError("Переполнение буфера команда"); } } public void AddFireCommand() { Commands[_commandCount].CommandType = CommandType.Fire; IncCommandCount(); } public void AddNewIdCommand(int id) { Commands[_commandCount].CommandType = CommandType.NewId; Commands[_commandCount].Id = id; IncCommandCount(); } } #endregion } }