private void ApplyComponentBonus(NWItem product, ComponentBonusType bonus) { ItemProperty prop = null; string sourceTag = string.Empty; switch (bonus) { case ComponentBonusType.RunicSocketRed: sourceTag = "rslot_red"; break; case ComponentBonusType.RunicSocketBlue: sourceTag = "rslot_blue"; break; case ComponentBonusType.RunicSocketGreen: sourceTag = "rslot_green"; break; case ComponentBonusType.RunicSocketYellow: sourceTag = "rslot_yellow"; break; case ComponentBonusType.RunicSocketPrismatic: sourceTag = "rslot_prismatic"; break; } if (!string.IsNullOrWhiteSpace(sourceTag)) { prop = _item.GetCustomItemPropertyByItemTag(sourceTag); } if (prop == null) { return; } _biowareXP2.IPSafeAddItemProperty(product, prop, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); }
public bool Run(params object[] args) { NWPlayer player = (NWPlayer)args[0]; string oreResref = (string)args[1]; List <ItemProperty> itemProperties = (List <ItemProperty>)args[2]; player.IsBusy = false; int rank = _skill.GetPCSkillRank(player, SkillType.Engineering); int level = _craft.GetIngotLevel(oreResref); string ingotResref = _craft.GetIngotResref(oreResref); if (level < 0 || string.IsNullOrWhiteSpace(ingotResref)) { return(false); } int delta = rank - level; int count = 2; if (delta > 2) { count = delta; } if (count > 4) { count = 4; } if (_random.Random(100) + 1 <= _perk.GetPCPerkLevel(player, PerkType.Lucky)) { count++; } if (_random.Random(100) + 1 <= _perk.GetPCPerkLevel(player, PerkType.ProcessingEfficiency) * 10) { count++; } for (int x = 1; x <= count; x++) { var item = (_.CreateItemOnObject(ingotResref, player.Object)); foreach (var ip in itemProperties) { _biowareXP2.IPSafeAddItemProperty(item, ip, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); } } var effectiveStats = _playerStat.GetPlayerItemEffectiveStats(player); int stronidiumAmount = 2 + effectiveStats.Harvesting; _.CreateItemOnObject("stronidium", player.Object, stronidiumAmount); int xp = (int)_skill.CalculateRegisteredSkillLevelAdjustedXP(100, level, rank); _skill.GiveSkillXP(player, SkillType.Engineering, xp); return(true); }
public void OnPurchased(NWPlayer oPC, int newLevel) { // Party members become targetable at level 2. if (newLevel >= 2) { NWItem item = NWItem.Wrap(_.GetItemPossessedBy(oPC.Object, "perk_gate")); _item.StripAllItemProperties(item); ItemProperty ip = _.ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER, IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE); _biowareXP2.IPSafeAddItemProperty(item, ip, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); } }
private Tuple <int, float> RunComponentBonusAttempt(NWPlayer player, NWItem component, float equipmentBonus, float chance, List <NWItem> itemSet) { int successAmount = 0; foreach (var ip in component.ItemProperties) { int ipType = _.GetItemPropertyType(ip); if (ipType != (int)CustomItemPropertyType.ComponentBonus) { continue; } int bonusTypeID = _.GetItemPropertySubType(ip); int tlkID = Convert.ToInt32(_.Get2DAString("iprp_compbon", "Name", bonusTypeID)); int amount = _.GetItemPropertyCostTableValue(ip); string bonusName = _.GetStringByStrRef(tlkID) + " " + amount; float random = _random.RandomFloat() * 100.0f; float modifiedEquipmentBonus = equipmentBonus * 0.25f; if (random <= chance + modifiedEquipmentBonus) { foreach (var item in itemSet) { // If the target item is a component itself, we want to add the component bonuses instead of the // actual item property bonuses. // In other words, we want the custom item property "Component Bonus: AC UP" instead of the "AC Bonus" item property. var componentIP = item.ItemProperties.FirstOrDefault(x => _.GetItemPropertyType(x) == (int)CustomItemPropertyType.ComponentType); if (componentIP == null) { _componentBonus.ApplyComponentBonus(item, ip); } else { _biowareXP2.IPSafeAddItemProperty(item, ip, 0.0f, AddItemPropertyPolicy.IgnoreExisting, false, false); } } player.SendMessage(_color.Green("Successfully applied component property: " + bonusName)); chance -= _random.Random(1, 8); if (chance < 1) { chance = 1; } successAmount++; } else { player.SendMessage(_color.Red("Failed to apply component property: " + bonusName)); } } return(new Tuple <int, float>(successAmount, chance)); }
private void AddOnHitProperty(NWItem oItem) { foreach (ItemProperty ip in oItem.ItemProperties) { if (_.GetItemPropertyType(ip) == ITEM_PROPERTY_ONHITCASTSPELL) { if (_.GetItemPropertySubType(ip) == IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER) { return; } } } // No item property found. Add it to the item. _xp2.IPSafeAddItemProperty(oItem, _.ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 40), 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); }
public void Apply(NWPlayer player, NWItem target, params string[] args) { int additionalAB = Convert.ToInt32(args[0]); int existingAB = GetExistingAB(target); int newValue = existingAB + additionalAB; if (newValue > 20) { newValue = 20; } ItemProperty ip = _.ItemPropertyAttackBonus(newValue); ip = _.TagItemProperty(ip, "RUNE_IP"); _biowareXP2.IPSafeAddItemProperty(target, ip, 0.0f, AddItemPropertyPolicy.ReplaceExisting, true, false); }
public void Run(NWObject target, params object[] args) { int retrievalRating = (int)args[0]; int highQualityChance = 10 * retrievalRating; int veryHighQualityChance = 2 * retrievalRating; int roll = _random.Random(0, 100); ResourceQuality quality = ResourceQuality.Normal; if (roll <= veryHighQualityChance) { quality = ResourceQuality.VeryHigh; } else if (roll <= highQualityChance) { quality = ResourceQuality.High; } var ip = _resource.GetRandomComponentBonusIP(quality); _biowareXP2.IPSafeAddItemProperty(target.Object, ip.Item1, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); switch (ip.Item2) { case 0: target.Name = _color.Green(target.Name); break; case 1: target.Name = _color.Blue(target.Name); break; case 2: target.Name = _color.Purple(target.Name); break; case 3: target.Name = _color.Orange(target.Name); break; } }
public void Apply(NWPlayer player, NWItem target, params string[] args) { var data = ParseData(args); if (data.Item1 < 0) { return; } var existingValues = GetExistingIPInfo(target, data.Item1); int newValue = data.Item2 + existingValues.Item2; if (newValue > 12) { newValue = 12; } ItemProperty ip = _.ItemPropertyAbilityBonus(data.Item1, newValue); ip = _.TagItemProperty(ip, "RUNE_IP"); _biowareXP2.IPSafeAddItemProperty(target, ip, 0.0f, AddItemPropertyPolicy.ReplaceExisting, true, false); }
public void ApplyEffects(NWCreature user, NWItem item, NWObject target, Location targetLocation, CustomData customData) { NWPlayer player = user.Object; ResourceQuality quality = (ResourceQuality)target.GetLocalInt("RESOURCE_QUALITY"); int tier = target.GetLocalInt("RESOURCE_TIER"); int remaining = target.GetLocalInt("RESOURCE_COUNT") - 1; string itemResref = target.GetLocalString("RESOURCE_RESREF"); int ipBonusChance = _resource.CalculateChanceForComponentBonus(player, tier, quality); int roll = _random.Random(1, 100); int rank = _skill.GetPCSkillRank(player, SkillType.Harvesting); if (item.RecommendedLevel < rank) { rank = item.RecommendedLevel; } int difficulty = (tier - 1) * 10 + _resource.GetDifficultyAdjustment(quality); int delta = difficulty - rank; int baseXP = 0; 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; } int itemHarvestBonus = item.HarvestingBonus; int scanningBonus = user.GetLocalInt(target.GlobalID.ToString()); ipBonusChance += itemHarvestBonus * 2 + scanningBonus * 2; baseXP = baseXP + scanningBonus * 5; NWItem resource = _.CreateItemOnObject(itemResref, player.Object); if (roll <= ipBonusChance) { var ip = _resource.GetRandomComponentBonusIP(quality); _biowareXP2.IPSafeAddItemProperty(resource, ip.Item1, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); switch (ip.Item2) { case 0: resource.Name = _color.Green(resource.Name); break; case 1: resource.Name = _color.Blue(resource.Name); break; case 2: resource.Name = _color.Purple(resource.Name); break; case 3: resource.Name = _color.Orange(resource.Name); break; } } float decayMinimum = 0.03f; float decayMaximum = 0.07f; if (delta > 0) { decayMinimum += delta * 0.1f; decayMaximum += delta * 0.1f; } user.SendMessage("You harvest " + resource.Name + "."); _durability.RunItemDecay(player, item, _random.RandomFloat(decayMinimum, decayMaximum)); int xp = baseXP; _skill.GiveSkillXP(player, SkillType.Harvesting, xp); if (remaining <= 0) { NWPlaceable prop = target.GetLocalObject("RESOURCE_PROP_OBJ"); if (prop.IsValid) { prop.Destroy(); } target.Destroy(); user.DeleteLocalInt(target.GlobalID.ToString()); } else { target.SetLocalInt("RESOURCE_COUNT", remaining); } _.ApplyEffectAtLocation(DURATION_TYPE_INSTANT, _.EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), target.Location); }
private void ApplyWeaponPenalties(NWPlayer oPC, NWItem oItem) { SkillType skillType = _item.GetSkillTypeForItem(oItem); if (skillType == SkillType.Unknown || skillType == SkillType.HeavyArmor || skillType == SkillType.LightArmor || skillType == SkillType.ForceArmor || skillType == SkillType.Shields) { return; } int skillID = (int)skillType; int rank = GetPCSkillRank(oPC, skillID); int recommendedRank = oItem.RecommendedLevel; if (rank >= recommendedRank) { return; } int delta = rank - recommendedRank; int penalty; if (delta <= -20) { penalty = 99; } else if (delta <= -16) { penalty = 5; } else if (delta <= -12) { penalty = 4; } else if (delta <= -8) { penalty = 3; } else if (delta <= -4) { penalty = 2; } else if (delta <= 0) { penalty = 1; } else { penalty = 99; } // No combat damage penalty if (penalty == 99) { ItemProperty noDamage = _.ItemPropertyNoDamage(); noDamage = _.TagItemProperty(noDamage, IPWeaponPenaltyTag); _biowareXP2.IPSafeAddItemProperty(oItem, noDamage, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); penalty = 5; // Reset to 5 so that the following penalties apply. } // Decreased attack penalty ItemProperty ipPenalty = _.ItemPropertyAttackPenalty(penalty); ipPenalty = _.TagItemProperty(ipPenalty, IPWeaponPenaltyTag); _biowareXP2.IPSafeAddItemProperty(oItem, ipPenalty, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); // Decreased damage penalty ipPenalty = _.ItemPropertyDamagePenalty(penalty); ipPenalty = _.TagItemProperty(ipPenalty, IPWeaponPenaltyTag); _biowareXP2.IPSafeAddItemProperty(oItem, ipPenalty, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); // Decreased enhancement bonus penalty ipPenalty = _.ItemPropertyEnhancementPenalty(penalty); ipPenalty = _.TagItemProperty(ipPenalty, IPWeaponPenaltyTag); _biowareXP2.IPSafeAddItemProperty(oItem, ipPenalty, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); oPC.SendMessage("A penalty has been applied to your weapon '" + oItem.Name + "' due to your skill being under the recommended level."); }
public void DoPerkUpgrade(NWPlayer oPC, int perkID) { Data.Entities.Perk perk = _db.Perks.Single(x => x.PerkID == perkID); PCPerk pcPerk = _db.PCPerks.SingleOrDefault(x => x.PlayerID == oPC.GlobalID && x.PerkID == perkID); PlayerCharacter player = _db.PlayerCharacters.Single(x => x.PlayerID == oPC.GlobalID); if (CanPerkBeUpgraded(perk, pcPerk, player)) { if (pcPerk == null) { pcPerk = new PCPerk(); DateTime dt = DateTime.UtcNow; pcPerk.AcquiredDate = dt; pcPerk.PerkID = perk.PerkID; pcPerk.PlayerID = oPC.GlobalID; pcPerk.PerkLevel = 0; _db.PCPerks.Add(pcPerk); } PerkLevel nextPerkLevel = FindPerkLevel(perk.PerkLevels, pcPerk.PerkLevel + 1); if (nextPerkLevel == null) { return; } pcPerk.PerkLevel++; player.UnallocatedSP -= nextPerkLevel.Price; _db.SaveChanges(); // If a perk is activatable, create the item on the PC. // Remove any existing cast spell unique power properties and add the correct one based on the DB flag. if (!string.IsNullOrWhiteSpace(perk.ItemResref)) { if (_.GetIsObjectValid(_.GetItemPossessedBy(oPC.Object, perk.ItemResref)) == FALSE) { NWItem spellItem = NWItem.Wrap(_.CreateItemOnObject(perk.ItemResref, oPC.Object)); spellItem.IsCursed = true; spellItem.SetLocalInt("ACTIVATION_PERK_ID", perk.PerkID); foreach (ItemProperty ipCur in spellItem.ItemProperties) { int ipType = _.GetItemPropertyType(ipCur); int ipSubType = _.GetItemPropertySubType(ipCur); if (ipType == ITEM_PROPERTY_CAST_SPELL && (ipSubType == IP_CONST_CASTSPELL_UNIQUE_POWER || ipSubType == IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY || ipSubType == IP_CONST_CASTSPELL_ACTIVATE_ITEM)) { _.RemoveItemProperty(spellItem.Object, ipCur); } } ItemProperty ip; if (perk.IsTargetSelfOnly) { ip = _.ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY, IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE); } else { ip = _.ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER, IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE); } _biowareXP2.IPSafeAddItemProperty(spellItem, ip, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); } _.SetName(_.GetItemPossessedBy(oPC.Object, perk.ItemResref), perk.Name + " (Lvl. " + pcPerk.PerkLevel + ")"); } oPC.SendMessage(_color.Green("Perk Purchased: " + perk.Name + " (Lvl. " + pcPerk.PerkLevel + ")")); IPerk perkScript = App.ResolveByInterface <IPerk>("Perk." + perk.JavaScriptName); if (perkScript == null) { return; } perkScript.OnPurchased(oPC, pcPerk.PerkLevel); } else { oPC.FloatingText(_color.Red("You cannot purchase the perk at this time.")); } }
public void DoPerkUpgrade(NWPlayer oPC, int perkID, bool freeUpgrade = false) { var perk = _data.Single <Data.Entity.Perk>(x => x.ID == perkID); var perkLevels = _data.Where <PerkLevel>(x => x.PerkID == perkID); var pcPerk = _data.SingleOrDefault <PCPerk>(x => x.PlayerID == oPC.GlobalID && x.PerkID == perkID); var player = _data.Single <Player>(x => x.ID == oPC.GlobalID); if (freeUpgrade || CanPerkBeUpgraded(oPC, perkID)) { DatabaseActionType action = DatabaseActionType.Update; if (pcPerk == null) { pcPerk = new PCPerk(); DateTime dt = DateTime.UtcNow; pcPerk.AcquiredDate = dt; pcPerk.PerkID = perk.ID; pcPerk.PlayerID = oPC.GlobalID; pcPerk.PerkLevel = 0; action = DatabaseActionType.Insert; } PerkLevel nextPerkLevel = FindPerkLevel(perkLevels, pcPerk.PerkLevel + 1); if (nextPerkLevel == null) { return; } pcPerk.PerkLevel++; _data.SubmitDataChange(pcPerk, action); if (!freeUpgrade) { player.UnallocatedSP -= nextPerkLevel.Price; _data.SubmitDataChange(player, DatabaseActionType.Update); } // If a perk is activatable, create the item on the PC. // Remove any existing cast spell unique power properties and add the correct one based on the DB flag. if (!string.IsNullOrWhiteSpace(perk.ItemResref)) { if (_.GetIsObjectValid(_.GetItemPossessedBy(oPC.Object, perk.ItemResref)) == FALSE) { NWItem spellItem = (_.CreateItemOnObject(perk.ItemResref, oPC.Object)); spellItem.IsCursed = true; spellItem.SetLocalInt("ACTIVATION_PERK_ID", perk.ID); foreach (ItemProperty ipCur in spellItem.ItemProperties) { int ipType = _.GetItemPropertyType(ipCur); int ipSubType = _.GetItemPropertySubType(ipCur); if (ipType == ITEM_PROPERTY_CAST_SPELL && (ipSubType == IP_CONST_CASTSPELL_UNIQUE_POWER || ipSubType == IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY || ipSubType == IP_CONST_CASTSPELL_ACTIVATE_ITEM)) { _.RemoveItemProperty(spellItem.Object, ipCur); } } ItemProperty ip; if (perk.IsTargetSelfOnly) { ip = _.ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY, IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE); } else { ip = _.ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER, IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE); } _biowareXP2.IPSafeAddItemProperty(spellItem, ip, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); } _.SetName(_.GetItemPossessedBy(oPC.Object, perk.ItemResref), perk.Name + " (Lvl. " + pcPerk.PerkLevel + ")"); } // If a feat ID is assigned, add the feat to the player if it doesn't exist yet. else if (perk.FeatID != null && perk.FeatID > 0 && _.GetHasFeat((int)perk.FeatID, oPC.Object) == FALSE) { _nwnxCreature.AddFeatByLevel(oPC, (int)perk.FeatID, 1); var qbs = _nwnxQBS.UseFeat((int)perk.FeatID); // Try to add the new feat to the player's hotbar. if (_nwnxPlayer.GetQuickBarSlot(oPC, 0).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 0, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 1).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 1, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 2).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 2, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 3).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 3, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 4).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 4, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 5).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 5, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 6).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 6, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 7).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 7, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 8).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 8, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 9).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 9, qbs); } else if (_nwnxPlayer.GetQuickBarSlot(oPC, 10).ObjectType == QuickBarSlotType.Empty) { _nwnxPlayer.SetQuickBarSlot(oPC, 10, qbs); } } oPC.SendMessage(_color.Green("Perk Purchased: " + perk.Name + " (Lvl. " + pcPerk.PerkLevel + ")")); App.ResolveByInterface <IPerk>("Perk." + perk.ScriptName, (perkScript) => { if (perkScript == null) { return; } perkScript.OnPurchased(oPC, pcPerk.PerkLevel); }); } else { oPC.FloatingText(_color.Red("You cannot purchase the perk at this time.")); } }
public void OnModuleEquipItem() { int[] validItemTypes = { BASE_ITEM_ARMOR, BASE_ITEM_ARROW, BASE_ITEM_BASTARDSWORD, BASE_ITEM_BATTLEAXE, BASE_ITEM_BELT, BASE_ITEM_BOLT, BASE_ITEM_BOOTS, BASE_ITEM_BRACER, BASE_ITEM_BULLET, BASE_ITEM_CLOAK, BASE_ITEM_CLUB, BASE_ITEM_DAGGER, BASE_ITEM_DART, BASE_ITEM_DIREMACE, BASE_ITEM_DOUBLEAXE, BASE_ITEM_DWARVENWARAXE, BASE_ITEM_GLOVES, BASE_ITEM_GREATAXE, BASE_ITEM_GREATSWORD, BASE_ITEM_GRENADE, BASE_ITEM_HALBERD, BASE_ITEM_HANDAXE, BASE_ITEM_HEAVYCROSSBOW, BASE_ITEM_HEAVYFLAIL, BASE_ITEM_HELMET, BASE_ITEM_KAMA, BASE_ITEM_KATANA, BASE_ITEM_KUKRI, BASE_ITEM_LARGESHIELD, BASE_ITEM_LIGHTCROSSBOW, BASE_ITEM_LIGHTFLAIL, BASE_ITEM_LIGHTHAMMER, BASE_ITEM_LIGHTMACE, BASE_ITEM_LONGBOW, BASE_ITEM_LONGSWORD, BASE_ITEM_MORNINGSTAR, BASE_ITEM_QUARTERSTAFF, BASE_ITEM_RAPIER, BASE_ITEM_SCIMITAR, BASE_ITEM_SCYTHE, BASE_ITEM_SHORTBOW, BASE_ITEM_SHORTSPEAR, BASE_ITEM_SHORTSWORD, BASE_ITEM_SHURIKEN, BASE_ITEM_SICKLE, BASE_ITEM_SLING, BASE_ITEM_SMALLSHIELD, BASE_ITEM_THROWINGAXE, BASE_ITEM_TOWERSHIELD, BASE_ITEM_TRIDENT, BASE_ITEM_TWOBLADEDSWORD, BASE_ITEM_WARHAMMER, BASE_ITEM_WHIP }; NWItem oItem = NWItem.Wrap(_.GetPCItemLastEquipped()); int baseItemType = oItem.BaseItemType; if (!validItemTypes.Contains(baseItemType)) { return; } foreach (ItemProperty ip in oItem.ItemProperties) { if (_.GetItemPropertyType(ip) == ITEM_PROPERTY_ONHITCASTSPELL) { if (_.GetItemPropertySubType(ip) == IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER) { return; } } } // No item property found. Add it to the item. _xp2.IPSafeAddItemProperty(oItem, _.ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 40), 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); if (baseItemType == BASE_ITEM_TORCH) { int charges = oItem.ReduceCharges(); if (charges <= 0) { oItem.Destroy(); } } }
public void ApplyComponentBonus(NWItem product, ItemProperty sourceIP) { ComponentBonusType bonusType = (ComponentBonusType)_.GetItemPropertySubType(sourceIP); int amount = _.GetItemPropertyCostTableValue(sourceIP); ItemProperty prop = null; string sourceTag = string.Empty; // A note about the sourceTags: // It's not currently possible to create custom item properties on items. To get around this, // we look in an inaccessible container which holds the custom item properties. Then, we get the // item that has the item property we want. From there we take that item property and copy it to // the crafted item. // This is a really roundabout way to do it, but it's the only option for now. Hopefully a feature to // directly add the item properties comes in to NWNX in the future. for (int x = 1; x <= amount; x++) { switch (bonusType) { case ComponentBonusType.ModSocketRed: sourceTag = "rslot_red"; break; case ComponentBonusType.ModSocketBlue: sourceTag = "rslot_blue"; break; case ComponentBonusType.ModSocketGreen: sourceTag = "rslot_green"; break; case ComponentBonusType.ModSocketYellow: sourceTag = "rslot_yellow"; break; case ComponentBonusType.ModSocketPrismatic: sourceTag = "rslot_prismatic"; break; case ComponentBonusType.DurabilityUp: var maxDur = _durability.GetMaxDurability(product) + amount; _durability.SetMaxDurability(product, maxDur); _durability.SetDurability(product, maxDur); break; case ComponentBonusType.ChargesUp: product.Charges += amount; break; case ComponentBonusType.ACUp: product.CustomAC += amount; break; case ComponentBonusType.HarvestingUp: product.HarvestingBonus += amount; break; case ComponentBonusType.CastingSpeedUp: product.CastingSpeed += amount; break; case ComponentBonusType.ArmorsmithUp: product.CraftBonusArmorsmith += amount; break; case ComponentBonusType.WeaponsmithUp: product.CraftBonusWeaponsmith += amount; break; case ComponentBonusType.CookingUp: product.CraftBonusCooking += amount; break; case ComponentBonusType.EngineeringUp: product.CraftBonusEngineering += amount; break; case ComponentBonusType.FabricationUp: product.CraftBonusFabrication += amount; break; case ComponentBonusType.HPUp: product.HPBonus += amount; break; case ComponentBonusType.FPUp: product.FPBonus += amount; break; case ComponentBonusType.EnmityUp: product.EnmityRate += amount; break; case ComponentBonusType.EnmityDown: product.EnmityRate -= amount; break; case ComponentBonusType.DarkAbilityUp: product.DarkAbilityBonus += amount; break; case ComponentBonusType.LightAbilityUp: product.LightAbilityBonus += amount; break; case ComponentBonusType.LuckUp: product.LuckBonus += amount; break; case ComponentBonusType.MeditateUp: product.MeditateBonus += amount; break; case ComponentBonusType.RestUp: product.RestBonus += amount; break; case ComponentBonusType.MedicineUp: product.MedicineBonus += amount; break; case ComponentBonusType.HPRegenUp: product.HPRegenBonus += amount; break; case ComponentBonusType.FPRegenUp: product.FPRegenBonus += amount; break; case ComponentBonusType.BaseAttackBonusUp: product.BaseAttackBonus += amount; break; case ComponentBonusType.SneakAttackUp: product.SneakAttackBonus += amount; break; case ComponentBonusType.DamageUp: product.DamageBonus += amount; break; case ComponentBonusType.DarkAbilityDown: product.DarkAbilityBonus -= amount; break; case ComponentBonusType.LightAbilityDown: product.LightAbilityBonus -= amount; break; case ComponentBonusType.StructureBonusUp: product.StructureBonus += amount; break; case ComponentBonusType.StrengthUp: product.StrengthBonus += amount; break; case ComponentBonusType.DexterityUp: product.DexterityBonus += amount; break; case ComponentBonusType.ConstitutionUp: product.ConstitutionBonus += amount; break; case ComponentBonusType.WisdomUp: product.WisdomBonus += amount; break; case ComponentBonusType.IntelligenceUp: product.IntelligenceBonus += amount; break; case ComponentBonusType.CharismaUp: product.CharismaBonus += amount; break; case ComponentBonusType.AttackBonusUp: prop = _.ItemPropertyAttackBonus(amount); break; case ComponentBonusType.DurationUp: product.DurationBonus += amount; break; case ComponentBonusType.ScanningUp: product.ScanningBonus += amount; break; default: throw new ArgumentOutOfRangeException(); } if (!string.IsNullOrWhiteSpace(sourceTag)) { prop = _item.GetCustomItemPropertyByItemTag(sourceTag); } if (prop == null) { return; } _biowareXP2.IPSafeAddItemProperty(product, prop, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); } }