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); }
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); }
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); }
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); } }
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); }
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)); }
public static void Set(CharacterDrop.Drop drop, CharacterDropItemConfiguration config) { DropTable.GetOrCreateValue(drop).Config = config; }