Ejemplo n.º 1
0
        internal static void Postfix(RulesetItem __instance,
                                     IAttributeValueProvider attributeValueProvider, List <RulesetItemProperty> ___dynamicItemProperties, ref int __result)
        {
            // __result contains currently computed ACM
            Main.Log($"RulesetItem_ComputeAttackHitEnhancement: AHE={__result}");

            __result += AttackEnhancementHelper.GetEnhancement(__instance, attributeValueProvider, ___dynamicItemProperties, "AHE");
        }
Ejemplo n.º 2
0
        internal static int GetEnhancement(RulesetItem __instance,
                                           IAttributeValueProvider attributeValueProvider, List <RulesetItemProperty> ___dynamicItemProperties, string type)
        {
            using (new MethodLogger($"AttackEnhancementHelper:{type}"))
            {
                // TODO: is the RulesetItem for your scaling weapon?
                // if( __instance.ItemDefinition.Name != "...." ) // something like that

                var gameManager = ServiceRepository.GetService <IGameService>();

                if (gameManager != null)
                {
                    Main.Log($"AttackEnhancementHelper: Got game manager");

                    var hero = gameManager.EnumerateHeroes()?.FirstOrDefault(h => h.Guid == __instance.BearerGuid);

                    if (hero?.ClassesAndLevels != null)
                    {
                        // get bearer level for our target class (PsiWarrior)
                        var level = hero?.ClassesAndLevels
                                    //.Where(kvp => kvp.Key.Name == "Fighter") // TODO
                                    .Select(kvp => (int?)kvp.Value).SingleOrDefault() ?? 0;

                        Main.Log($"AttackEnhancementHelper: Hero={hero.Name}, Level={level}");

                        if (level > 0)
                        {
                            // It may possible to modify behaviour using FeatureDefinitionAttackModifier
                            //if (___dynamicItemProperties != null)
                            //{
                            //    var enhancement = ___dynamicItemProperties
                            //        .OfType<IAttackModificationProvider>()
                            //        .Where(p => p.AttackRollModifierMethod == (RuleDefinitions.AttackModifierMethod)1000) // (your AttackModifierMethod)
                            //        .Select(p => attributeValueProvider.TryGetAttributeValue($"{type}:{level}"))
                            //        .SingleOrDefault();

                            //    Main.Log($"AttackEnhancementHelper: Enhancement={enhancement}");
                            //    return enhancement + level;
                            //}

                            // But just taking a simple approach.  Try to get the enhancement using attributeValueProvider.
                            // If the IAttributeValueProvider is your RulesetCharacterHero, then you can possibly add and register additional attributes
                            // for your hero.  Or just patch TryGetAttributeValue as below.
                            int enhancement = attributeValueProvider.TryGetAttributeValue($"{type}:{level}");
                            Main.Log($"AttackEnhancementHelper: Enhancement={enhancement}");
                            return(enhancement);
                        }
                    }
                }

                return(0);
            }
        }
 public static T Set <T, TV>(this T entity, Expression <Func <T, TV> > attribute, IAttributeValueProvider valueProvider)
     where T : Entity => Set(entity, attribute, (TV)valueProvider.GetValueFor(Name <T>(), Name(attribute)));
 public static T Set <T, TV>(this T entity, Expression <Func <T, TV> > attribute, IAttributeValueProvider <T, TV> attributeValueProvider)
     where T : Entity => Set(entity, attribute, attributeValueProvider.GetValueFor(attribute));
 public static Entity Set(this Entity entity, string attributeName, IAttributeValueProvider attributeValueProvider)
 => Set(entity, attributeName, attributeValueProvider.GetValueFor(entity.LogicalName, attributeName));
 public virtual void Set(string attributeName, IAttributeValueProvider attributeValueProvider)
 => Entity.Set(attributeName, attributeValueProvider);
 public void AddValueProvider(IAttributeValueProvider valueProvider)
 {
     _valueProviders.Add(valueProvider);
 }
 public virtual void Set(string attributeName, IAttributeValueProvider attributeValueProvider)
 => _accessor.Set(attributeName, attributeValueProvider);
 public void Set(string attributeName, IAttributeValueProvider attributeValueProvider) => Target.Set(attributeName, attributeValueProvider);
Ejemplo n.º 10
0
 public static void Set <T, TV>(this IEntitySetter <T> accessor, Expression <Func <T, TV> > attribute, IAttributeValueProvider <T, TV> attributeValueProvider)
     where T : Entity => accessor.Set(Name(attribute), attributeValueProvider.GetValueFor(attribute));