/// <summary> /// Creates the struct packet property. /// </summary> /// <param name="structType">Type of the struct.</param> public StructPacketProperty(Type structType) { // Add the packet information. if (structType.GetCustomAttribute(typeof(PacketStructAttribute)) is PacketStructAttribute packetStruct) { this.Properties.Add(new PacketInformation(packetStruct.MessageIdentifier, packetStruct.RemoteConnectionType, packetStruct.PacketId)); } // Convert the properties to PacketProperties. foreach (var property in structType?.GetProperties()) { // Create the base packet property. IPacketProperty packetProperty = null; if (property.PropertyType == typeof(string)) { packetProperty = new StringPacketProperty(property); } else if (property.PropertyType == typeof(Quaternion) && property.GetCustomAttribute <NiQuaternionAttribute>() != null) { packetProperty = new NiQuaternionProperty(property); } else if (property.PropertyType.IsValueType && property.PropertyType.GetCustomAttribute <StructAttribute>() != null) { packetProperty = new StructPacketProperty(property); } else { packetProperty = new PacketProperty(property); } if ((property.GetCustomAttribute(typeof(DefaultAttribute)) is DefaultAttribute defaultAttribute)) { packetProperty = new FlagPacketProperty(packetProperty, defaultAttribute.ValueToIgnore); } // Wrap the required properties. var requiredProperties = new Dictionary <string, RequiredPacketProperty>(); foreach (var requiredAttribute in property.GetCustomAttributes <RequiresAttribute>()) { if (!requiredProperties.ContainsKey(requiredAttribute.PropertyName)) { var requiredPacketProperty = new RequiredPacketProperty(packetProperty, requiredAttribute.PropertyName); requiredProperties.Add(requiredAttribute.PropertyName, requiredPacketProperty); packetProperty = requiredPacketProperty; } requiredProperties[requiredAttribute.PropertyName].RequiredValues.Add(requiredAttribute.ValueToRequire); } // Add the packet property. this.Properties.Add(packetProperty); } }
/// <summary> /// Creates the flag packet property. /// </summary> /// <param name="packetProperty">Packet property to wrap.</param> /// <param name="valueToIgnore">Value that results in the flag being read/written as false.</param> public FlagPacketProperty(IPacketProperty packetProperty, object valueToIgnore) : base(packetProperty) { this._valueToIgnore = valueToIgnore; this._defaultValue = this.StructProperty.PropertyType.IsValueType ? Activator.CreateInstance(this.StructProperty.PropertyType) : null; }
/// <summary> /// Creates the wrapped packet property. /// </summary> /// <param name="packetProperty">Packet property to wrap.</param> public WrappedPacketProperty(IPacketProperty packetProperty) { this.WrappedProperty = packetProperty; }
/// <summary> /// Creates the required packet property. /// </summary> /// <param name="packetProperty">Packet property to wrap.</param> /// <param name="propertyToCheck">Property that is checked.</param> public RequiredPacketProperty(IPacketProperty packetProperty, string propertyToCheck) : base(packetProperty) { this._propertyToCheck = propertyToCheck; }