public virtual void GetUsingSkillData( Skill skill, short level, ref bool isLeftHand, out AnimActionType animActionType, out int skillOrWeaponTypeDataId, out int animationIndex, out CharacterItem weapon, out float triggerDuration, out float totalDuration, out DamageInfo damageInfo, out Dictionary <DamageElement, MinMaxFloat> allDamageAmounts) { // Initialize data animActionType = AnimActionType.None; skillOrWeaponTypeDataId = 0; animationIndex = 0; weapon = this.GetAvailableWeapon(ref isLeftHand); triggerDuration = 0f; totalDuration = 0f; damageInfo = null; allDamageAmounts = new Dictionary <DamageElement, MinMaxFloat>(); // Prepare skill data if (skill == null) { return; } // Prepare weapon data Item weaponItem = weapon.GetWeaponItem(); WeaponType weaponType = weaponItem.WeaponType; SkillActivateAnimationType useSkillActivateAnimationType = CharacterModel.UseSkillActivateAnimationType(skill); // Prepare animation if (useSkillActivateAnimationType == SkillActivateAnimationType.UseAttackAnimation && skill.skillAttackType != SkillAttackType.None) { // If there is no cast animations // Assign data id skillOrWeaponTypeDataId = weaponType.DataId; // Assign animation action type animActionType = !isLeftHand ? AnimActionType.AttackRightHand : AnimActionType.AttackLeftHand; // Random animation if (!isLeftHand) { CharacterModel.GetRandomRightHandAttackAnimation(skillOrWeaponTypeDataId, out animationIndex, out triggerDuration, out totalDuration); } else { CharacterModel.GetRandomLeftHandAttackAnimation(skillOrWeaponTypeDataId, out animationIndex, out triggerDuration, out totalDuration); } } else if (useSkillActivateAnimationType == SkillActivateAnimationType.UseActivateAnimation) { // Assign data id skillOrWeaponTypeDataId = skill.DataId; // Assign animation action type animActionType = AnimActionType.Skill; // Random animation CharacterModel.GetSkillActivateAnimation(skillOrWeaponTypeDataId, out triggerDuration, out totalDuration); } // If it is attack skill if (skill.skillAttackType != SkillAttackType.None) { switch (skill.skillAttackType) { case SkillAttackType.Normal: // Assign damage data damageInfo = skill.damageInfo; // Calculate all damages allDamageAmounts = weaponItem.GetDamageAmountWithInflictions(weapon.level, weapon.GetEquipmentBonusRate(), this, skill.GetWeaponDamageInflictions(level)); // Sum damage with additional damage amounts allDamageAmounts = GameDataHelpers.CombineDamages( allDamageAmounts, skill.GetDamageAmount(level, this)); // Sum damage with skill damage allDamageAmounts = GameDataHelpers.CombineDamages( allDamageAmounts, skill.GetAdditionalDamageAmounts(level)); break; case SkillAttackType.BasedOnWeapon: // Assign damage data damageInfo = weaponType.damageInfo; // Calculate all damages allDamageAmounts = weaponItem.GetDamageAmountWithInflictions(weapon.level, weapon.GetEquipmentBonusRate(), this, skill.GetWeaponDamageInflictions(level)); // Sum damage with additional damage amounts allDamageAmounts = GameDataHelpers.CombineDamages( allDamageAmounts, skill.GetAdditionalDamageAmounts(level)); break; } allDamageAmounts = GameDataHelpers.CombineDamages( allDamageAmounts, CacheIncreaseDamages); } }
protected override void UpdateData() { if (Level <= 0) { onSetLevelZeroData.Invoke(); } else { onSetNonLevelZeroData.Invoke(); } if (uiTextTitle != null) { uiTextTitle.text = string.Format(titleFormat, Skill == null ? "Unknow" : Skill.title); } if (uiTextDescription != null) { uiTextDescription.text = string.Format(descriptionFormat, Skill == null ? "N/A" : Skill.description); } if (uiTextLevel != null) { uiTextLevel.text = string.Format(levelFormat, Level.ToString("N0")); } if (imageIcon != null) { var iconSprite = Skill == null ? null : Skill.icon; imageIcon.gameObject.SetActive(iconSprite != null); imageIcon.sprite = iconSprite; } if (uiTextSkillType != null) { switch (Skill.skillType) { case SkillType.Active: uiTextSkillType.text = string.Format(skillTypeFormat, activeSkillType); break; case SkillType.Passive: uiTextSkillType.text = string.Format(skillTypeFormat, passiveSkillType); break; case SkillType.CraftItem: uiTextSkillType.text = string.Format(skillTypeFormat, craftItemSkillType); break; } } if (uiTextAvailableWeapons != null) { if (Skill.availableWeapons == null || Skill.availableWeapons.Length == 0) { uiTextAvailableWeapons.gameObject.SetActive(false); } else { var str = string.Empty; foreach (var availableWeapon in Skill.availableWeapons) { if (!string.IsNullOrEmpty(str)) { str += "/"; } str += availableWeapon.title; } uiTextAvailableWeapons.text = string.Format(availableWeaponsFormat, str); uiTextAvailableWeapons.gameObject.SetActive(true); } } if (uiTextConsumeMp != null) { uiTextConsumeMp.text = string.Format(consumeMpFormat, Skill == null || Level <= 0 ? "N/A" : Skill.GetConsumeMp(Level).ToString("N0")); } if (uiRequirement != null) { if (Skill == null || (Skill.GetRequireCharacterLevel(Level) == 0 && Skill.CacheRequireSkillLevels.Count == 0)) { uiRequirement.Hide(); } else { uiRequirement.Show(); uiRequirement.Data = new SkillTuple(Skill, Level); } } if (uiCraftItem != null) { if (Skill == null || Skill.skillType != SkillType.CraftItem) { uiCraftItem.Hide(); } else { uiCraftItem.Show(); uiCraftItem.Data = Skill.itemCraft; } } var isAttack = Skill != null && Skill.IsAttack(); var isOverrideWeaponDamage = isAttack && Skill.skillAttackType == SkillAttackType.Normal; if (uiDamageAmount != null) { if (!isOverrideWeaponDamage) { uiDamageAmount.Hide(); } else { uiDamageAmount.Show(); var keyValuePair = Skill.GetDamageAmount(Level, null); uiDamageAmount.Data = new DamageElementAmountTuple(keyValuePair.Key, keyValuePair.Value); } } if (uiDamageInflictions != null) { var damageInflictionRates = Skill.GetWeaponDamageInflictions(Level); if (!isAttack || damageInflictionRates == null || damageInflictionRates.Count == 0) { uiDamageInflictions.Hide(); } else { uiDamageInflictions.Show(); uiDamageInflictions.Data = damageInflictionRates; } } if (uiAdditionalDamageAmounts != null) { var additionalDamageAmounts = Skill.GetAdditionalDamageAmounts(Level); if (!isAttack || additionalDamageAmounts == null || additionalDamageAmounts.Count == 0) { uiAdditionalDamageAmounts.Hide(); } else { uiAdditionalDamageAmounts.Show(); uiAdditionalDamageAmounts.Data = additionalDamageAmounts; } } if (uiSkillBuff != null) { if (!Skill.IsBuff()) { uiSkillBuff.Hide(); } else { uiSkillBuff.Show(); uiSkillBuff.Data = new BuffTuple(Skill.buff, Level); } } if (uiSkillDebuff != null) { if (!Skill.IsDebuff()) { uiSkillDebuff.Hide(); } else { uiSkillDebuff.Show(); uiSkillDebuff.Data = new BuffTuple(Skill.debuff, Level); } } if (uiNextLevelSkill != null) { if (Level + 1 > Skill.maxLevel) { uiNextLevelSkill.Hide(); } else { uiNextLevelSkill.Setup(new SkillTuple(Skill, (short)(Level + 1)), character, indexOfData); uiNextLevelSkill.Show(); } } }