Пример #1
0
        public bool IsValid(CharacterDrop.Drop drop, CharacterDropItemConfiguration config, Character character)
        {
            if (config.ConditionKilledWithStatus.Value.Length > 0)
            {
                var statuses = config.ConditionKilledWithStatus.Value.SplitByComma();

                if (statuses.Count == 0)
                {
                    //Skip if we have no states to check. This indicates all are allowed.
                    return(true);
                }

                var lastStatusRecord = RecordLastStatus.GetLastStatus(character);

                if (lastStatusRecord is null)
                {
                    Log.LogTrace($"{nameof(ConditionKilledWithStatus)}: Disabling drop {drop.m_prefab.name} due to not finding any last status data.");
                    return(false);
                }

#if DEBUG
                Log.LogTrace($"Looking for statuses '{config.ConditionKilledWithStatus}' among '{lastStatusRecord.Statuses.Join()}'");
#endif

                if (statuses.Any(x => lastStatusRecord.HasStatus(x)))
                {
                    return(true);
                }

                Log.LogTrace($"{nameof(ConditionKilledWithStatus)}: Disabling drop {drop.m_prefab.name} due to not finding any of the required statuses in last hit.");
                return(false);
            }

            return(true);
        }
Пример #2
0
        public bool ValidConditionKilledBySkillType(CharacterDrop.Drop drop, CharacterDropItemConfiguration config, Character character)
        {
            if (config.ConditionKilledBySkillType.Value.Length > 0)
            {
                var skillTypes = config.ConditionKilledBySkillType.Value.SplitByComma();

                if (skillTypes.Count == 0)
                {
                    //Skip if we have no states to check. This indicates all are allowed.
                    return(true);
                }

                var lastHit = RecordLastHit.GetLastHit(character);

                if (lastHit is null)
                {
                    Log.LogTrace($"{nameof(ConditionKilledBySkillType)}: Disabling drop {drop.m_prefab.name} due to not finding any last hit data.");
                    return(false);
                }

                var convertedSkills = ConvertToSkillType(skillTypes);

#if DEBUG
                Log.LogTrace($"Searching for skill type '{lastHit.SkillType}' among required types '{config.ConditionKilledBySkillType.Value}'");
#endif

                if (!convertedSkills.Any(x => x == lastHit.SkillType))
                {
                    Log.LogTrace($"{nameof(ConditionKilledBySkillType)}: Disabling drop {drop.m_prefab.name} due to not finding any of the required skill types in last hit.");
                    return(false);
                }
            }

            return(true);
        }
Пример #3
0
        public bool ValidConditionKilledByDamageType(CharacterDrop.Drop drop, CharacterDropItemConfiguration config, Character character)
        {
            if (config.ConditionKilledByDamageType.Value.Length > 0)
            {
                var causes = config.ConditionKilledByDamageType.Value.SplitByComma();

                if (causes.Count == 0)
                {
                    //Skip if we have no states to check. This indicates all are allowed.
                    return(true);
                }

                var lastHit = RecordLastHit.GetLastHit(character);

                if (lastHit is null)
                {
                    Log.LogTrace($"{nameof(config.ConditionKilledByDamageType)}: Disabling drop {drop.m_prefab.name} due to not finding any last hit data.");
                    return(false);
                }

                var causesDamageType = ConvertToBitmask(causes);

#if DEBUG
                Log.LogTrace($"Searching for damage types '{causes}' as {causesDamageType} among '{lastHit.DamageType}' with result '{causesDamageType & lastHit.DamageType}'");
#endif

                if ((causesDamageType & lastHit.DamageType) == 0)
                {
                    Log.LogTrace($"{nameof(config.ConditionKilledByDamageType)}: Disabling drop {drop.m_prefab.name} due to not finding any of the required damage types in last hit.");
                    return(false);
                }
            }

            return(true);
        }
        private static void InsertDrops(CharacterDrop instance, CharacterDropItemConfiguration dropConfig)
        {
            //Sanity checks
            if (!dropConfig.IsValid())
            {
#if DEBUG
                Log.LogDebug($"Drop config {dropConfig.SectionKey} is not valid or enabled.");
#endif
                return;
            }

            GameObject item = ObjectDB.instance.GetItemPrefab(dropConfig.PrefabName?.Value);

            if (item.IsNull())
            {
                item = ZNetScene.instance.GetPrefab(dropConfig.PrefabName.Value);
            }

            if (item.IsNull())
            {
                Log.LogWarning($"[{dropConfig.SectionKey}]: No item '{dropConfig.PrefabName}' exists");
                return;
            }

            CharacterDrop.Drop newDrop = new CharacterDrop.Drop
            {
                m_prefab          = item,
                m_amountMax       = dropConfig.SetAmountMax.Value,
                m_amountMin       = dropConfig.SetAmountMin.Value,
                m_chance          = dropConfig.SetChanceToDrop.Value / 100,
                m_levelMultiplier = dropConfig.SetScaleByLevel.Value,
                m_onePerPlayer    = dropConfig.SetDropOnePerPlayer.Value,
            };

            DropExtended.Set(newDrop, dropConfig);

            if (!GeneralConfig.AlwaysAppendCharacterDrops.Value)
            {
                int index = dropConfig.Index;

                if (instance.m_drops.Count > index)
                {
                    Log.LogDebug($"[{dropConfig.SectionKey}]: Removing overriden item '{instance.m_drops[index].m_prefab.name}' at index '{index}'.");

                    instance.m_drops.RemoveAt(index);
                }
            }

            Insert(instance, dropConfig, newDrop);
        }
Пример #5
0
        public bool IsValid(Vector3 position, CharacterDropItemConfiguration config)
        {
            var distance = position.magnitude;

            if (distance < config.ConditionDistanceToCenterMin.Value)
            {
                return(false);
            }

            if (config.ConditionDistanceToCenterMax.Value > 0 && distance > config.ConditionDistanceToCenterMax.Value)
            {
                return(false);
            }

            return(true);
        }
        private static void Insert(CharacterDrop __instance, CharacterDropItemConfiguration config, CharacterDrop.Drop drop)
        {
            int index = config.Index;

            if (index >= 0 && __instance.m_drops.Count >= index && !ConfigurationManager.GeneralConfig.AlwaysAppendCharacterDrops.Value)
            {
                Log.LogDebug($"[{__instance.gameObject.name}]: Inserting drop {config.PrefabName.Value} at index '{index}'.");

                __instance.m_drops.Insert(index, drop);
            }
            else
            {
                Log.LogDebug($"[{__instance.gameObject.name}]: Adding item {config.PrefabName.Value}.");
                __instance.m_drops.Add(drop);
            }
        }
Пример #7
0
        public bool IsValid(CharacterDropItemConfiguration itemConfig)
        {
            if (itemConfig is null)
            {
                return(true);
            }

            if (itemConfig.TryGet(CharacterDropModConfigCLLC.ModName, out var modConfig) && modConfig is CharacterDropModConfigCLLC config)
            {
                int worldLevel = API.GetWorldLevel();

                if (worldLevel < config.ConditionWorldLevelMin)
                {
                    return(false);
                }

                if (config.ConditionWorldLevelMax > 0 && worldLevel > config.ConditionWorldLevelMax)
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #8
0
        public bool IsValid(Character character, CharacterDropItemConfiguration config)
        {
            if (character is null)
            {
#if DEBUG
                Log.LogTrace("[ConditionKilledByEntityType] No character found.");
#endif
                return(true);
            }

            if (string.IsNullOrWhiteSpace(config.ConditionKilledByEntityType.Value))
            {
                return(true);
            }

            var requiredEntityTypes = ConvertToEnum(config.ConditionKilledByEntityType.Value.SplitByComma());

            if (requiredEntityTypes.Count == 0)
            {
#if DEBUG
                Log.LogTrace("[ConditionKilledByEntityType] No valid requirements found.");
#endif

                return(true);
            }

            var lastHit = RecordLastHit.GetLastHit(character);

            if (lastHit is null)
            {
#if DEBUG
                Log.LogTrace($"{nameof(config.ConditionKilledByDamageType)}: Disabling drop {config.SectionKey} due to not finding any last hit data.");
#endif
                return(false);
            }

            EntityType killedBy = EntityType.Other;

            if (lastHit.Hit.HaveAttacker())
            {
                GameObject attacker = ZNetScene.instance.FindInstance(lastHit.Hit.m_attacker);

                var attackerCharacter = ComponentCache.GetComponent <Character>(attacker);

                if (attackerCharacter is not null)
                {
                    if (attackerCharacter.IsPlayer())
                    {
                        killedBy = EntityType.Player;
                    }
                    else
                    {
                        killedBy = EntityType.Creature;
                    }
                }
            }

#if DEBUG
            Log.LogTrace($"[ConditionKilledByEntityType] Killed by '{killedBy}'");
#endif


            return(requiredEntityTypes.Any(x => x == killedBy));
        }
Пример #9
0
 public static void Set(CharacterDrop.Drop drop, CharacterDropItemConfiguration config)
 {
     DropTable.GetOrCreateValue(drop).Config = config;
 }