/// <summary> /// Create a new piece of GameData from a byte array representation. /// </summary> /// <param name="byteArray">A byte array to create a GameData packet from.</param> public GameData(byte[] byteArray) { using (MemoryStream memoryStream = new MemoryStream(byteArray)) { using (BinaryReader binaryReader = new BinaryReader(memoryStream)) { Type = (GameDataType)binaryReader.ReadByte(); PlayerID = (int)binaryReader.ReadByte(); EventDetail = (int)binaryReader.ReadByte(); byte[] subData = new byte[byteArray.Length - 3]; Array.ConstrainedCopy(byteArray, 3, subData, 0, byteArray.Length - 3); if (Type == GameDataType.Movement) { TransformData = new TransformData(subData); } else if (Type == GameDataType.NewEntity) { EntityData = new EntityData(subData); } else if (Type == GameDataType.EntityStateChange) { EntityStateData = new EntityStateData(subData); } } } return; }
/// <summary> /// Send out state change information /// </summary> /// <param name="entity">The entity to update.</param> public virtual void OnEntityStateChange(Entity entity) { EntityStateData stateData; // Invoke class-specific constructors, to avoid sending extra information if (entity is MobileEntity) { stateData = new EntityStateData((MobileEntity)entity); } else { stateData = new EntityStateData(entity); } GameData gameData = new GameData(GameData.GameDataType.EntityStateChange, LocalPlayer.PlayerID, 0); gameData.EventDetail = entity.id; gameData.EntityStateData = stateData; lock (gameStatesToSend) { gameStatesToSend.Add(gameData); } return; }