public void AddModifier(Attribute <T> attribute, AttributeCondition <T> modifier = null) { if (!ModApplicationCanBeAccepted(attribute, modifier)) { return; } Modifiers.Add(attribute); OnAttributeModAdd?.Invoke(attribute); }
/// Checks whether the mod can be applied to the target entity public bool ModApplicationCanBeAccepted(Attribute <T> attribute, AttributeCondition <T> modifier = null) { if (modifier == null) { modifier = attribute.TargetAttributeModifier.Find(item => item.TargetAttributeID.Equals(Config.ID)); } if (modifier != null) { Attribute <T> currentAttribute = null; for (int i = 0; i < modifier.ModApplicationConditions.Count; i++) { currentAttribute = Parent.GetAttributeByID(modifier.ModApplicationConditions[i].AttributeName); switch (modifier.ModApplicationConditions[i].Operator) { case AttributeModOperator.Equals: if (!(currentAttribute.Value == modifier.ModApplicationConditions[i].Value)) { return(false); } break; case AttributeModOperator.Greater: if (!(currentAttribute.Value > modifier.ModApplicationConditions[i].Value)) { return(false); } break; case AttributeModOperator.Less: if (!(currentAttribute.Value < modifier.ModApplicationConditions[i].Value)) { return(false); } break; case AttributeModOperator.GreaterOrEquals: if (!(currentAttribute.Value >= modifier.ModApplicationConditions[i].Value)) { return(false); } break; case AttributeModOperator.LessOrEquals: if (!(currentAttribute.Value <= modifier.ModApplicationConditions[i].Value)) { return(false); } break; case AttributeModOperator.NotEquals: if (!(currentAttribute.Value != modifier.ModApplicationConditions[i].Value)) { return(false); } break; case AttributeModOperator.ContainsFlag: if (!FlagUtil.Has(currentAttribute.Value, modifier.ModApplicationConditions[i].Value)) { return(false); } break; case AttributeModOperator.NotContainsFlag: if (FlagUtil.Has(currentAttribute.Value, modifier.ModApplicationConditions[i].Value)) { return(false); } break; } } return(true); } return(false); }