public static Dictionary <DamageElement, MinMaxFloat> GetAdditionalDamageAmounts(this Skill skill, short level) { if (!skill.IsAttack()) { return(new Dictionary <DamageElement, MinMaxFloat>()); } level = skill.GetAdjustedLevel(level); return(GameDataHelpers.CombineDamages(skill.additionalDamageAmounts, new Dictionary <DamageElement, MinMaxFloat>(), level, 1f)); }
public static Dictionary <DamageElement, MinMaxFloat> GetIncreaseDamages(this Item equipmentItem, short level, float rate) { Dictionary <DamageElement, MinMaxFloat> result = new Dictionary <DamageElement, MinMaxFloat>(); if (equipmentItem != null && equipmentItem.IsEquipment()) { result = GameDataHelpers.CombineDamages(equipmentItem.increaseDamages, result, level, rate); } return(result); }
public virtual void GetAttackingData( ref bool isLeftHand, out AnimActionType animActionType, out int dataId, 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; dataId = 0; animationIndex = 0; weapon = this.GetAvailableWeapon(ref isLeftHand); triggerDuration = 0f; totalDuration = 0f; damageInfo = null; allDamageAmounts = new Dictionary <DamageElement, MinMaxFloat>(); // Prepare weapon data Item weaponItem = weapon.GetWeaponItem(); WeaponType weaponType = weaponItem.WeaponType; // Assign data id dataId = weaponType.DataId; // Assign animation action type animActionType = !isLeftHand ? AnimActionType.AttackRightHand : AnimActionType.AttackLeftHand; // Random animation if (!isLeftHand) { CharacterModel.GetRandomRightHandAttackAnimation(dataId, out animationIndex, out triggerDuration, out totalDuration); } else { CharacterModel.GetRandomLeftHandAttackAnimation(dataId, out animationIndex, out triggerDuration, out totalDuration); } // Assign damage data damageInfo = weaponType.damageInfo; // Calculate all damages allDamageAmounts = GameDataHelpers.CombineDamages( allDamageAmounts, weaponItem.GetDamageAmount(weapon.level, weapon.GetEquipmentBonusRate(), this)); allDamageAmounts = GameDataHelpers.CombineDamages( allDamageAmounts, CacheIncreaseDamages); }
public static Dictionary <DamageElement, MinMaxFloat> GetDamageOverTimes(this Buff buff, short level) { return(GameDataHelpers.CombineDamages(buff.damageOverTimes, new Dictionary <DamageElement, MinMaxFloat>(), level, 1f)); }
protected override void UpdateData() { if (Level <= 0) { onSetLevelZeroData.Invoke(); } else { onSetNonLevelZeroData.Invoke(); } if (InventoryType != InventoryType.StorageItems) { if (EquipmentItem != null) { if (InventoryType != InventoryType.NonEquipItems) { onSetEquippedData.Invoke(); } else { onSetUnEquippedData.Invoke(); } } else { onSetUnEquippableData.Invoke(); } } else { onSetStorageItemData.Invoke(); } if (uiTextTitle != null) { string str = string.Format( LanguageManager.GetText(formatKeyTitle), Item == null ? LanguageManager.GetUnknowTitle() : Item.Title); if (!dontAppendRefineLevelToTitle && EquipmentItem != null && Level > 1) { str = string.Format( LanguageManager.GetText(formatKeyTitleWithRefineLevel), (Level - 1).ToString("N0")); } uiTextTitle.text = str; } if (uiTextDescription != null) { uiTextDescription.text = string.Format( LanguageManager.GetText(formatKeyDescription), Item == null ? LanguageManager.GetUnknowDescription() : Item.Description); } if (uiTextRarity != null) { uiTextRarity.text = string.Format( LanguageManager.GetText(formatKeyRarityTitle), Item == null ? LanguageManager.GetUnknowTitle() : Item.RarityTitle); } if (uiTextLevel != null) { if (EquipmentItem != null) { if (showLevelAsDefault) { uiTextLevel.text = string.Format( LanguageManager.GetText(formatKeyLevel), Level.ToString("N0")); } else { uiTextLevel.text = string.Format( LanguageManager.GetText(formatKeyRefineLevel), (Level - 1).ToString("N0")); } } else if (PetItem != null) { uiTextLevel.text = string.Format( LanguageManager.GetText(formatKeyLevel), Level.ToString("N0")); } uiTextLevel.gameObject.SetActive(EquipmentItem != null || PetItem != null); } if (imageIcon != null) { Sprite iconSprite = Item == null ? null : Item.icon; imageIcon.gameObject.SetActive(iconSprite != null); imageIcon.sprite = iconSprite; } if (uiTextItemType != null) { if (Item != null) { switch (Item.itemType) { case ItemType.Junk: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), LanguageManager.GetText(UILocaleKeys.UI_ITEM_TYPE_JUNK.ToString())); break; case ItemType.Armor: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), ArmorItem.ArmorType.Title); break; case ItemType.Weapon: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), WeaponItem.WeaponType.Title); break; case ItemType.Shield: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), LanguageManager.GetText(UILocaleKeys.UI_ITEM_TYPE_SHIELD.ToString())); break; case ItemType.Potion: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), LanguageManager.GetText(UILocaleKeys.UI_ITEM_TYPE_POTION.ToString())); break; case ItemType.Ammo: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), LanguageManager.GetText(UILocaleKeys.UI_ITEM_TYPE_AMMO.ToString())); break; case ItemType.Building: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), LanguageManager.GetText(UILocaleKeys.UI_ITEM_TYPE_BUILDING.ToString())); break; case ItemType.Pet: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), LanguageManager.GetText(UILocaleKeys.UI_ITEM_TYPE_PET.ToString())); break; case ItemType.SocketEnhancer: uiTextItemType.text = string.Format( LanguageManager.GetText(formatKeyItemType), LanguageManager.GetText(UILocaleKeys.UI_ITEM_TYPE_SOCKET_ENHANCER.ToString())); break; } } } if (uiTextSellPrice != null) { uiTextSellPrice.text = string.Format( LanguageManager.GetText(formatKeySellPrice), Item == null ? "0" : Item.sellPrice.ToString("N0")); } if (uiTextStack != null) { string stackString = ""; if (Item == null) { stackString = string.Format( LanguageManager.GetText(formatKeyStack), "0", "0"); } else { stackString = string.Format( LanguageManager.GetText(formatKeyStack), CharacterItem.amount.ToString("N0"), Item.maxStack); } uiTextStack.text = stackString; uiTextStack.gameObject.SetActive(showAmountWhenMaxIsOne || (Item != null && Item.maxStack > 1)); } if (uiTextDurability != null) { string durabilityString = ""; if (Item == null) { durabilityString = string.Format( LanguageManager.GetText(formatKeyDurability), "0", "0"); } else { durabilityString = string.Format( LanguageManager.GetText(formatKeyDurability), CharacterItem.durability.ToString("N0"), Item.maxDurability); } uiTextDurability.text = durabilityString; uiTextDurability.gameObject.SetActive(EquipmentItem != null && Item.maxDurability > 0); } if (uiTextWeight != null) { uiTextWeight.text = string.Format( LanguageManager.GetText(formatKeyWeight), Item == null ? "0" : Item.weight.ToString("N2")); } if (uiRequirement != null) { if (EquipmentItem == null || (EquipmentItem.requirement.level == 0 && EquipmentItem.requirement.character == null && EquipmentItem.CacheRequireAttributeAmounts.Count == 0)) { uiRequirement.Hide(); } else { uiRequirement.Show(); uiRequirement.Data = EquipmentItem; } } if (uiStats != null) { CharacterStats stats = CharacterStats.Empty; if (EquipmentItem != null) { stats = EquipmentItem.GetIncreaseStats(Level, CharacterItem.GetEquipmentBonusRate()); } else if (SocketEnhancerItem != null) { stats = SocketEnhancerItem.socketEnhanceEffect.stats; } if (stats.IsEmpty()) { // Hide ui if stats is empty uiStats.Hide(); } else { uiStats.Show(); uiStats.Data = stats; } } if (uiIncreaseAttributes != null) { Dictionary <Attribute, short> attributes = null; if (EquipmentItem != null) { attributes = EquipmentItem.GetIncreaseAttributes(Level, CharacterItem.GetEquipmentBonusRate()); } else if (SocketEnhancerItem != null) { attributes = GameDataHelpers.CombineAttributes(SocketEnhancerItem.socketEnhanceEffect.attributes, attributes, 1f); } if (attributes == null || attributes.Count == 0) { // Hide ui if attributes is empty uiIncreaseAttributes.Hide(); } else { uiIncreaseAttributes.Show(); uiIncreaseAttributes.Data = attributes; } } if (uiIncreaseResistances != null) { Dictionary <DamageElement, float> resistances = null; if (EquipmentItem != null) { resistances = EquipmentItem.GetIncreaseResistances(Level, CharacterItem.GetEquipmentBonusRate()); } else if (SocketEnhancerItem != null) { resistances = GameDataHelpers.CombineResistances(SocketEnhancerItem.socketEnhanceEffect.resistances, resistances, 1f); } if (resistances == null || resistances.Count == 0) { // Hide ui if resistances is empty uiIncreaseResistances.Hide(); } else { uiIncreaseResistances.Show(); uiIncreaseResistances.Data = resistances; } } if (uiIncreaseDamageAmounts != null) { Dictionary <DamageElement, MinMaxFloat> damageAmounts = null; if (EquipmentItem != null) { damageAmounts = EquipmentItem.GetIncreaseDamages(Level, CharacterItem.GetEquipmentBonusRate()); } else if (SocketEnhancerItem != null) { damageAmounts = GameDataHelpers.CombineDamages(SocketEnhancerItem.socketEnhanceEffect.damages, damageAmounts, 1f); } if (damageAmounts == null || damageAmounts.Count == 0) { // Hide ui if damage amounts is empty uiIncreaseDamageAmounts.Hide(); } else { uiIncreaseDamageAmounts.Show(); uiIncreaseDamageAmounts.Data = damageAmounts; } } if (uiIncreaseSkillLevels != null) { Dictionary <Skill, short> skillLevels = null; if (EquipmentItem != null) { skillLevels = EquipmentItem.GetIncreaseSkills(); } else if (SocketEnhancerItem != null) { skillLevels = GameDataHelpers.CombineSkills(SocketEnhancerItem.socketEnhanceEffect.skills, skillLevels); } if (skillLevels == null || skillLevels.Count == 0) { // Hide ui if skill levels is empty uiIncreaseSkillLevels.Hide(); } else { uiIncreaseSkillLevels.Show(); uiIncreaseSkillLevels.Data = skillLevels; } } if (uiEquipmentSet != null) { if (EquipmentItem == null || EquipmentItem.equipmentSet == null || EquipmentItem.equipmentSet.effects.Length == 0) { // Only equipment item has equipment set data uiEquipmentSet.Hide(); } else { uiEquipmentSet.Show(); int equippedCount = 0; Character.CacheEquipmentSets.TryGetValue(EquipmentItem.equipmentSet, out equippedCount); uiEquipmentSet.Data = new EquipmentSetWithEquippedCountTuple(EquipmentItem.equipmentSet, equippedCount); } } if (uiEquipmentSockets != null) { if (EquipmentItem == null || EquipmentItem.maxSocket <= 0) { uiEquipmentSockets.Hide(); } else { uiEquipmentSockets.Show(); uiEquipmentSockets.Data = new EnhancedSocketsWithMaxSocketTuple(CharacterItem.Sockets, EquipmentItem.maxSocket); } } if (uiDamageAmounts != null) { if (WeaponItem == null) { uiDamageAmounts.Hide(); } else { uiDamageAmounts.Show(); KeyValuePair <DamageElement, MinMaxFloat> keyValuePair = WeaponItem.GetDamageAmount(Level, CharacterItem.GetEquipmentBonusRate(), null); uiDamageAmounts.Data = new DamageElementAmountTuple(keyValuePair.Key, keyValuePair.Value); } } if (PetItem != null && PetItem.petEntity != null) { int[] expTree = GameInstance.Singleton.ExpTree; int currentExp = 0; int nextLevelExp = 0; if (CharacterItem.GetNextLevelExp() > 0) { currentExp = CharacterItem.exp; nextLevelExp = CharacterItem.GetNextLevelExp(); } else if (Level - 2 > 0 && Level - 2 < expTree.Length) { int maxExp = expTree[Level - 2]; currentExp = maxExp; nextLevelExp = maxExp; } if (uiTextExp != null) { uiTextExp.text = string.Format( LanguageManager.GetText(formatKeyExp), currentExp.ToString("N0"), nextLevelExp.ToString("N0")); uiTextExp.gameObject.SetActive(true); } } else { if (uiTextExp != null) { uiTextExp.gameObject.SetActive(false); } } if (clones != null && clones.Length > 0) { for (int i = 0; i < clones.Length; ++i) { if (clones[i] == null) { continue; } clones[i].Data = Data; } } if (uiNextLevelItem != null) { if (Level + 1 > Item.MaxLevel) { uiNextLevelItem.Hide(); } else { uiNextLevelItem.Setup(new CharacterItemTuple(CharacterItem, (short)(Level + 1), InventoryType), Character, IndexOfData); uiNextLevelItem.Show(); } } UpdateShopUIVisibility(true); UpdateRefineUIVisibility(true); UpdateEnhanceSocketUIVisibility(true); UpdateStorageUIVisibility(true); UpdateDealingState(true); }
protected override void UpdateData() { cacheStats = showStatsWithBuffs ? Data.GetStats() : Data.GetStats(true, false); cacheAttributes = showAttributeWithBuffs ? Data.GetAttributes() : Data.GetAttributes(true, false); cacheResistances = showResistanceWithBuffs ? Data.GetResistances() : Data.GetResistances(true, false); cacheIncreaseDamages = showDamageWithBuffs ? Data.GetIncreaseDamages() : Data.GetIncreaseDamages(true, false); cacheWeightLimit = cacheStats.weightLimit; if (!showStatsWithBuffs) { // Always increase weight limit by buff bonus because it should always show real weight limit in UIs cacheWeightLimit += Data.GetBuffStats().weightLimit; } if (bonusAttributes == null) { bonusAttributes = new Dictionary <Attribute, short>(); } if (bonusResistances == null) { bonusResistances = new Dictionary <DamageElement, float>(); } if (bonusIncreaseDamages == null) { bonusIncreaseDamages = new Dictionary <DamageElement, MinMaxFloat>(); } if (bonusSkills == null) { bonusSkills = new Dictionary <Skill, short>(); } if (cacheEquipmentSets == null) { cacheEquipmentSets = new Dictionary <EquipmentSet, int>(); } Data.GetEquipmentSetBonus(out bonusStats, bonusAttributes, bonusResistances, bonusIncreaseDamages, bonusSkills, cacheEquipmentSets); // Increase stats by equipment set bonus cacheStats += bonusStats; cacheAttributes = GameDataHelpers.CombineAttributes(cacheAttributes, bonusAttributes); cacheResistances = GameDataHelpers.CombineResistances(cacheResistances, bonusResistances); cacheIncreaseDamages = GameDataHelpers.CombineDamages(cacheIncreaseDamages, bonusIncreaseDamages); cacheWeightLimit += bonusStats.weightLimit; if (uiTextWeightLimit != null) { uiTextWeightLimit.text = string.Format( LanguageManager.GetText(formatKeyWeightLimitStats), GameInstance.Singleton.GameplayRule.GetTotalWeight(Data).ToString("N2"), cacheWeightLimit.ToString("N2")); } CharacterItem rightHandItem = Data.EquipWeapons.rightHand; CharacterItem leftHandItem = Data.EquipWeapons.leftHand; Item rightHandWeapon = rightHandItem.GetWeaponItem(); Item leftHandWeapon = leftHandItem.GetWeaponItem(); Dictionary <DamageElement, MinMaxFloat> rightHandDamages = rightHandWeapon != null?GameDataHelpers.CombineDamages(cacheIncreaseDamages, rightHandWeapon.GetDamageAmount(rightHandItem.level, rightHandItem.GetEquipmentBonusRate(), Data)) : null; Dictionary <DamageElement, MinMaxFloat> leftHandDamages = leftHandWeapon != null?GameDataHelpers.CombineDamages(cacheIncreaseDamages, leftHandWeapon.GetDamageAmount(leftHandItem.level, leftHandItem.GetEquipmentBonusRate(), Data)) : null; if (uiTextWeaponDamages != null) { string textDamages = ""; if (rightHandWeapon != null) { MinMaxFloat sumDamages = GameDataHelpers.GetSumDamages(rightHandDamages); if (!string.IsNullOrEmpty(textDamages)) { textDamages += "\n"; } textDamages += string.Format( LanguageManager.GetText(formatKeyWeaponDamage), sumDamages.min.ToString("N0"), sumDamages.max.ToString("N0")); } if (leftHandWeapon != null) { MinMaxFloat sumDamages = GameDataHelpers.GetSumDamages(leftHandDamages); if (!string.IsNullOrEmpty(textDamages)) { textDamages += "\n"; } textDamages += string.Format( LanguageManager.GetText(formatKeyWeaponDamage), sumDamages.min.ToString("N0"), sumDamages.max.ToString("N0")); } if (rightHandWeapon == null && leftHandWeapon == null) { Item defaultWeaponItem = GameInstance.Singleton.DefaultWeaponItem; WeaponItemEquipType defaultWeaponItemType = defaultWeaponItem.EquipType; KeyValuePair <DamageElement, MinMaxFloat> damageAmount = defaultWeaponItem.GetDamageAmount(1, 1f, Data); textDamages = string.Format( LanguageManager.GetText(formatKeyWeaponDamage), damageAmount.Value.min.ToString("N0"), damageAmount.Value.max.ToString("N0")); } uiTextWeaponDamages.text = textDamages; } if (uiRightHandDamages != null) { if (rightHandWeapon == null) { uiRightHandDamages.Hide(); } else { uiRightHandDamages.Show(); uiRightHandDamages.Data = rightHandDamages; } } if (uiLeftHandDamages != null) { if (leftHandWeapon == null) { uiLeftHandDamages.Hide(); } else { uiLeftHandDamages.Show(); uiLeftHandDamages.Data = leftHandDamages; } } if (uiCharacterStats != null) { uiCharacterStats.Data = cacheStats; } if (uiCharacterResistances != null) { uiCharacterResistances.Data = cacheResistances; } if (CacheUICharacterAttributes.Count > 0 && Data != null) { CharacterAttribute tempCharacterAttribute; Attribute tempAttribute; short tempAmount; IList <CharacterAttribute> characterAttributes = Data.Attributes; for (int indexOfData = 0; indexOfData < characterAttributes.Count; ++indexOfData) { tempCharacterAttribute = characterAttributes[indexOfData]; tempAttribute = tempCharacterAttribute.GetAttribute(); UICharacterAttribute cacheUICharacterAttribute; tempAmount = 0; if (CacheUICharacterAttributes.TryGetValue(tempAttribute, out cacheUICharacterAttribute)) { if (cacheAttributes.ContainsKey(tempAttribute)) { tempAmount = cacheAttributes[tempAttribute]; } cacheUICharacterAttribute.Setup(new CharacterAttributeTuple(tempCharacterAttribute, tempAmount), Data, indexOfData); cacheUICharacterAttribute.Show(); } } } if (uiCharacterBuffs != null) { uiCharacterBuffs.UpdateData(Data); } }
protected override void UpdateData() { if (uiTextDuration != null) { float duration = Buff.GetDuration(Level); uiTextDuration.gameObject.SetActive(duration != 0); uiTextDuration.text = string.Format( LanguageManager.GetText(formatKeyDuration), duration.ToString("N0")); } if (uiTextRecoveryHp != null) { int recoveryHp = Buff.GetRecoveryHp(Level); uiTextRecoveryHp.gameObject.SetActive(recoveryHp != 0); uiTextRecoveryHp.text = string.Format( LanguageManager.GetText(formatKeyRecoveryHp), recoveryHp.ToString("N0")); } if (uiTextRecoveryMp != null) { int recoveryMp = Buff.GetRecoveryMp(Level); uiTextRecoveryMp.gameObject.SetActive(recoveryMp != 0); uiTextRecoveryMp.text = string.Format( LanguageManager.GetText(formatKeyRecoveryMp), recoveryMp.ToString("N0")); } if (uiTextRecoveryStamina != null) { int recoveryStamina = Buff.GetRecoveryStamina(Level); uiTextRecoveryStamina.gameObject.SetActive(recoveryStamina != 0); uiTextRecoveryStamina.text = string.Format( LanguageManager.GetText(formatKeyRecoveryStamina), recoveryStamina.ToString("N0")); } if (uiTextRecoveryFood != null) { int recoveryFood = Buff.GetRecoveryFood(Level); uiTextRecoveryFood.gameObject.SetActive(recoveryFood != 0); uiTextRecoveryFood.text = string.Format( LanguageManager.GetText(formatKeyRecoveryFood), recoveryFood.ToString("N0")); } if (uiTextRecoveryWater != null) { int recoveryWater = Buff.GetRecoveryWater(Level); uiTextRecoveryWater.gameObject.SetActive(recoveryWater != 0); uiTextRecoveryWater.text = string.Format( LanguageManager.GetText(formatKeyRecoveryWater), recoveryWater.ToString("N0")); } if (uiBuffStats != null) { uiBuffStats.Data = Buff.GetIncreaseStats(Level); } if (uiBuffAttributes != null) { uiBuffAttributes.Data = GameDataHelpers.CombineAttributes(Buff.increaseAttributes, new Dictionary <Attribute, short>(), Level, 1f); } if (uiBuffResistances != null) { uiBuffResistances.Data = GameDataHelpers.CombineResistances(Buff.increaseResistances, new Dictionary <DamageElement, float>(), Level, 1f); } if (uiBuffDamages != null) { uiBuffDamages.Data = GameDataHelpers.CombineDamages(Buff.increaseDamages, new Dictionary <DamageElement, MinMaxFloat>(), Level, 1f); } }
private IEnumerator UseSkillRoutine( Skill skill, short level, AnimActionType animActionType, int skillOrWeaponTypeDataId, int animationIndex, float triggerDuration, float totalDuration, bool isLeftHand, CharacterItem weapon, DamageInfo damageInfo, Dictionary <DamageElement, MinMaxFloat> allDamageAmounts, bool hasAimPosition, Vector3 aimPosition) { if (onUseSkillRoutine != null) { onUseSkillRoutine.Invoke(skill, level, animActionType, skillOrWeaponTypeDataId, animationIndex, triggerDuration, totalDuration, isLeftHand, weapon, damageInfo, allDamageAmounts, hasAimPosition, aimPosition); } // Set doing action data isCastingSkillCanBeInterrupted = skill.canBeInterruptedWhileCasting; isCastingSkillInterrupted = false; float castDuration = skill.GetCastDuration(level); if (castDuration > 0f) { // Play casting effects on clients RequestPlayEffect(skill.castEffects.Id); // Tell clients that character is casting RequestSkillCasting(skill.DataId, castDuration); yield return(new WaitForSecondsRealtime(castDuration)); } // If skill casting not interrupted, continue doing action if (!isCastingSkillInterrupted || !isCastingSkillCanBeInterrupted) { // Play animation on clients RequestPlayActionAnimation(animActionType, skillOrWeaponTypeDataId, (byte)animationIndex); // Update skill usage states CharacterSkillUsage newSkillUsage = CharacterSkillUsage.Create(SkillUsageType.Skill, skill.DataId); newSkillUsage.Use(this, level); skillUsages.Add(newSkillUsage); yield return(new WaitForSecondsRealtime(triggerDuration)); // Reduce ammo amount if (skill.skillAttackType != SkillAttackType.None) { Dictionary <DamageElement, MinMaxFloat> increaseDamages; ReduceAmmo(weapon, isLeftHand, out increaseDamages); if (increaseDamages != null) { allDamageAmounts = GameDataHelpers.CombineDamages(allDamageAmounts, increaseDamages); } } ApplySkill(skill, level, isLeftHand, weapon, damageInfo, allDamageAmounts, hasAimPosition, aimPosition); yield return(new WaitForSecondsRealtime(totalDuration - triggerDuration)); } isAttackingOrUsingSkill = false; }
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); } }
private IEnumerator AttackRoutine( AnimActionType animActionType, int weaponTypeDataId, int animationIndex, float triggerDuration, float totalDuration, bool isLeftHand, CharacterItem weapon, DamageInfo damageInfo, Dictionary <DamageElement, MinMaxFloat> allDamageAmounts, bool hasAimPosition, Vector3 aimPosition) { if (onAttackRoutine != null) { onAttackRoutine.Invoke(animActionType, weaponTypeDataId, animationIndex, triggerDuration, totalDuration, isLeftHand, weapon, damageInfo, allDamageAmounts); } // Play animation on clients RequestPlayActionAnimation(animActionType, weaponTypeDataId, (byte)animationIndex); yield return(new WaitForSecondsRealtime(triggerDuration)); // Reduce ammo amount Dictionary <DamageElement, MinMaxFloat> increaseDamages; ReduceAmmo(weapon, isLeftHand, out increaseDamages); if (increaseDamages != null) { allDamageAmounts = GameDataHelpers.CombineDamages(allDamageAmounts, increaseDamages); } // If no aim position set with attack function get aim position which set from client-controller if existed if (!hasAimPosition && HasAimPosition) { hasAimPosition = true; aimPosition = AimPosition; } byte fireSpread = 0; Vector3 fireStagger = Vector3.zero; if (weapon != null && weapon.GetWeaponItem() != null) { Item weaponItem = weapon.GetWeaponItem(); // For monsters, their weapon can be null so have to avoid null exception fireSpread = weaponItem.fireSpread; fireStagger = weaponItem.fireStagger; } Vector3 stagger; for (int i = 0; i < fireSpread + 1; ++i) { stagger = new Vector3(Random.Range(-fireStagger.x, fireStagger.x), Random.Range(-fireStagger.y, fireStagger.y)); LaunchDamageEntity( isLeftHand, weapon, damageInfo, allDamageAmounts, CharacterBuff.Empty, 0, hasAimPosition, aimPosition, stagger); } RequestPlayWeaponLaunchEffect(isLeftHand); yield return(new WaitForSecondsRealtime(totalDuration - triggerDuration)); isAttackingOrUsingSkill = false; }