private static void InitializeDurability(NWItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } SetLocalBool(item, "DURABILITY_OVERRIDE", true); if (item.GetLocalInt("DURABILITY_INITIALIZE") <= 0 && item.GetLocalFloat("DURABILITY_CURRENT") <= 0.0f) { float durability = GetMaxDurability(item) <= 0 ? DefaultDurability : GetMaxDurability(item); item.SetLocalFloat("DURABILITY_CURRENT", durability); if (item.GetLocalFloat("DURABILITY_MAX") <= 0.0f) { float maxDurability = DefaultDurability; foreach (var ip in item.ItemProperties) { if (GetItemPropertyType(ip) == ItemPropertyType.MaxDurability) { maxDurability = GetItemPropertyCostTableValue(ip); break; } } item.SetLocalFloat("DURABILITY_MAX", maxDurability); } } item.SetLocalInt("DURABILITY_INITIALIZED", 1); }
public static string OnModuleExamine(string existingDescription, NWObject examinedObject) { if (examinedObject.ObjectType != ObjectType.Item) { return(existingDescription); } NWItem examinedItem = (examinedObject.Object); if (examinedItem.GetLocalFloat("DURABILITY_MAX") <= 0f) { return(existingDescription); } string description = ColorTokenService.Orange("Durability: "); float durability = GetDurability(examinedItem); if (durability <= 0.0f) { description += ColorTokenService.Red(Convert.ToString(durability)); } else { description += ColorTokenService.White(FormatDurability(durability)); } description += ColorTokenService.White(" / " + FormatDurability(GetMaxDurability(examinedItem))); return(existingDescription + "\n\n" + description); }
public static float GetMaxDurability(NWItem item) { int maxDurability = item.GetItemPropertyValueAndRemove(ItemPropertyType.MaxDurability); if (maxDurability <= -1) { return(item.GetLocalFloat("DURABILITY_MAX") <= 0 ? DefaultDurability : item.GetLocalFloat("DURABILITY_MAX")); } SetMaxDurability(item, maxDurability); return(maxDurability); }
public void DurabilityService_GetDurability_ShouldReturn6Point23() { INWScript script = Substitute.For <INWScript>(); IColorTokenService color = Substitute.For <IColorTokenService>(); DurabilityService service = new DurabilityService(script, color); NWItem item = Substitute.For <NWItem>(script, service); item.BaseItemType.Returns(x => BASE_ITEM_LONGSWORD); item.GetLocalFloat(Arg.Any <string>()).Returns(6.23f); float result = service.GetDurability(item); Assert.AreEqual(6.23f, result); }
public float GetDurability(NWItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } if (!IsValidDurabilityType(item)) { return(-1.0f); } InitializeDurability(item); return(item.GetLocalFloat("DURABILITY_CURRENT")); }
public static float GetMaxDurability(NWItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } int maxDurability = item.GetItemPropertyValueAndRemove((int)CustomItemPropertyType.MaxDurability); if (maxDurability <= -1) { return(item.GetLocalFloat("DURABILITY_MAX") <= 0 ? DefaultDurability : item.GetLocalFloat("DURABILITY_MAX")); } SetMaxDurability(item, maxDurability); return(maxDurability); }
public static float GetDurability(NWItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } int durability = item.GetItemPropertyValueAndRemove(ItemPropertyType.Durability); if (durability <= -1) { InitializeDurability(item); return(item.GetLocalFloat("DURABILITY_CURRENT")); } SetDurability(item, durability); return(durability); }
private void InitializeDurability(NWItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } if (!IsValidDurabilityType(item)) { return; } if (item.GetLocalInt("DURABILITY_INITIALIZE") <= 0 && item.GetLocalFloat("DURABILITY_CURRENT") <= 0.0f) { float durability = GetMaxDurability(item) <= 0 ? DefaultDurability : GetMaxDurability(item); item.SetLocalFloat("DURABILITY_CURRENT", durability); } item.SetLocalInt("DURABILITY_INITIALIZED", 1); }
public void ApplyEffects(NWCreature user, NWItem item, NWObject target, Location targetLocation, CustomData customData) { SkillType skillType = GetSkillType(item); int tech = item.GetLocalInt("TECH_LEVEL"); float maxDurabilityReductionPenalty = item.GetLocalFloat("MAX_DURABILITY_REDUCTION_PENALTY"); int repairAmount = tech * 2; if (skillType == SkillType.Armorsmith) { repairAmount += item.CraftBonusArmorsmith; } else if (skillType == SkillType.Weaponsmith) { repairAmount += item.CraftBonusWeaponsmith; } float minReduction = 0.05f * tech; float maxReduction = 0.15f * tech; float reductionAmount = _random.RandomFloat(minReduction, maxReduction); _durability.RunItemRepair(user.Object, target.Object, repairAmount, reductionAmount + maxDurabilityReductionPenalty); }
public void ApplyEffects(NWCreature user, NWItem item, NWObject target, Location targetLocation, CustomData customData) { SkillType skillType = GetSkillType(item); NWItem targetitem = (target.Object); int tech = item.GetLocalInt("TECH_LEVEL"); float maxDurabilityReductionPenalty = item.GetLocalFloat("MAX_DURABILITY_REDUCTION_PENALTY"); int repairAmount = tech * 2; int skillRank; int level = targetitem.RecommendedLevel; int delta = 0; int baseXP = 0; if (skillType == SkillType.Armorsmith) { skillRank = (SkillService.GetPCSkillRank(user.Object, skillType)); repairAmount += item.CraftBonusArmorsmith + (PerkService.GetPCPerkLevel(user.Object, PerkType.ArmorRepair) * 2); delta = level - skillRank; } else if (skillType == SkillType.Weaponsmith) { skillRank = (SkillService.GetPCSkillRank(user.Object, skillType)); repairAmount += item.CraftBonusWeaponsmith + (PerkService.GetPCPerkLevel(user.Object, PerkType.WeaponRepair) * 2); delta = level - skillRank; } else if (skillType == SkillType.Engineering) { skillRank = (SkillService.GetPCSkillRank(user.Object, skillType)); repairAmount += item.CraftBonusEngineering + (PerkService.GetPCPerkLevel(user.Object, PerkType.ElectronicRepair) * 2); delta = level - skillRank; } float minReduction = 0.05f * tech; float maxReduction = 0.15f * tech; float reductionAmount = RandomService.RandomFloat(minReduction, maxReduction); if (delta >= 6) { baseXP = 400; } else if (delta == 5) { baseXP = 350; } else if (delta == 4) { baseXP = 325; } else if (delta == 3) { baseXP = 300; } else if (delta == 2) { baseXP = 250; } else if (delta == 1) { baseXP = 225; } else if (delta == 0) { baseXP = 200; } else if (delta == -1) { baseXP = 150; } else if (delta == -2) { baseXP = 100; } else if (delta == -3) { baseXP = 50; } else if (delta == -4) { baseXP = 25; } SkillService.GiveSkillXP(user.Object, skillType, baseXP); DurabilityService.RunItemRepair(user.Object, target.Object, repairAmount, reductionAmount + maxDurabilityReductionPenalty); }
public static EffectiveItemStats GetPlayerItemEffectiveStats(NWPlayer player, NWItem ignoreItem = null) { int heavyRank = DataService.PCSkill.GetByPlayerIDAndSkillID(player.GlobalID, (int)SkillType.HeavyArmor).Rank; int lightRank = DataService.PCSkill.GetByPlayerIDAndSkillID(player.GlobalID, (int)SkillType.LightArmor).Rank; int forceRank = DataService.PCSkill.GetByPlayerIDAndSkillID(player.GlobalID, (int)SkillType.ForceArmor).Rank; int martialRank = DataService.PCSkill.GetByPlayerIDAndSkillID(player.GlobalID, (int)SkillType.MartialArts).Rank; EffectiveItemStats stats = new EffectiveItemStats(); stats.EnmityRate = 1.0f; HashSet <NWItem> processed = new HashSet <NWItem>(); for (int itemSlot = 0; itemSlot < NumberOfInventorySlots; itemSlot++) { NWItem item = _.GetItemInSlot((InventorySlot)itemSlot, player); if (!item.IsValid || item.Equals(ignoreItem)) { continue; } // Have we already processed this particular item? Skip over it. // NWN likes to include the same weapon in multiple slots for some reasons, so this works around that. // If someone has a better solution to this please feel free to change it. if (processed.Contains(item)) { continue; } processed.Add(item); SkillType skill = ItemService.GetSkillTypeForItem(item); var rank = DataService.PCSkill.GetByPlayerIDAndSkillID(player.GlobalID, (int)skill).Rank; stats.CooldownRecovery += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_COOLDOWN_RECOVERY"); stats.EnmityRate += item.GetLocalFloat("STAT_EFFECTIVE_LEVEL_ENMITY_RATE"); stats.Luck += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_LUCK_BONUS"); stats.Meditate += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_MEDITATE_BONUS"); stats.Rest += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_REST_BONUS"); stats.Medicine += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_MEDICINE_BONUS"); stats.HPRegen += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_HP_REGEN_BONUS"); stats.FPRegen += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_FP_REGEN_BONUS"); stats.Weaponsmith += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_WEAPONSMITH_BONUS"); stats.Cooking += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_COOKING_BONUS"); stats.Engineering += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_ENGINEERING_BONUS"); stats.Fabrication += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_FABRICATION_BONUS"); stats.Armorsmith += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_ARMORSMITH_BONUS"); stats.Harvesting += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_HARVESTING_BONUS"); stats.Piloting += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_PILOTING_BONUS"); stats.Scavenging += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_SCAVENGING_BONUS"); stats.SneakAttack += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_SNEAK_ATTACK_BONUS"); stats.Strength += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_STRENGTH_BONUS"); stats.Dexterity += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_DEXTERITY_BONUS"); stats.Constitution += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_CONSTITUTION_BONUS"); stats.Wisdom += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_WISDOM_BONUS"); stats.Intelligence += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_INTELLIGENCE_BONUS"); stats.Charisma += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_CHARISMA_BONUS"); stats.HP += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_HP_BONUS"); stats.FP += item.GetLocalInt("STAT_EFFECTIVE_LEVEL_FP_BONUS"); // Calculate base attack bonus if (ItemService.WeaponBaseItemTypes.Contains(item.BaseItemType)) { int itemLevel = item.RecommendedLevel; int delta = itemLevel - rank; int itemBAB = item.BaseAttackBonus; if (delta >= 1) { itemBAB--; } if (delta > 0) { itemBAB = itemBAB - delta / 5; } if (itemBAB <= 0) { itemBAB = 0; } stats.BAB += itemBAB; } // Calculate AC if (ItemService.ArmorBaseItemTypes.Contains(item.BaseItemType)) { int skillRankToUse; int maxAC = 0; if (item.CustomItemType == CustomItemType.HeavyArmor) { skillRankToUse = heavyRank; maxAC = 10; } else if (item.CustomItemType == CustomItemType.LightArmor) { skillRankToUse = lightRank; maxAC = 13; } else if (item.CustomItemType == CustomItemType.ForceArmor) { skillRankToUse = forceRank; maxAC = 11; } else if (item.CustomItemType == CustomItemType.MartialArtWeapon) { skillRankToUse = martialRank; } else { continue; } int itemAC = item.CustomAC; itemAC = CalculateAdjustedValue(itemAC, item.RecommendedLevel, skillRankToUse, 0); if (itemAC > maxAC) { item.CustomAC = maxAC; } stats.AC += itemAC; } } // Final casting speed adjustments if (stats.CooldownRecovery < -99) { stats.CooldownRecovery = -99; } else if (stats.CooldownRecovery > 99) { stats.CooldownRecovery = 99; } // Final enmity adjustments if (stats.EnmityRate < 0.5f) { stats.EnmityRate = 0.5f; } else if (stats.EnmityRate > 1.5f) { stats.EnmityRate = 1.5f; } var stance = CustomEffectService.GetCurrentStanceType(player); if (stance == CustomEffectType.ShieldOath) { stats.EnmityRate = stats.EnmityRate + 0.2f; } return(stats); }