public float Seconds(NWCreature user, NWItem item, NWObject target, Location targetLocation, CustomData customData) { NWPlayer userPlayer = (user.Object); NWItem targetItem = (target.Object); float perkBonus = 0.0f; if (ArmorBaseItemTypes.Contains(targetItem.BaseItemType)) { perkBonus = PerkService.GetPCPerkLevel(userPlayer, PerkType.SpeedyArmorsmith) * 0.1f; } else if (WeaponsmithBaseItemTypes.Contains(targetItem.BaseItemType)) { perkBonus = PerkService.GetPCPerkLevel(userPlayer, PerkType.SpeedyWeaponsmith) * 0.1f; } else if (EngineeringBaseItemTypes.Contains(targetItem.BaseItemType)) { perkBonus = PerkService.GetPCPerkLevel(userPlayer, PerkType.SpeedyEngineering) * 0.1f; } float seconds = 18.0f - (18.0f * perkBonus); if (seconds <= 0.1f) { seconds = 0.1f; } return(seconds); }
public void ApplyEffects(NWCreature user, NWItem modItem, NWObject target, Location targetLocation, CustomData customData) { NWPlayer player = (user.Object); NWItem targetItem = (target.Object); ModSlots slots = ModService.GetModSlots(targetItem); CustomItemPropertyType modType = ModService.GetModType(modItem); int modID = modItem.GetLocalInt("RUNE_ID"); string[] modArgs = modItem.GetLocalString("RUNE_VALUE").Split(','); int modLevel = modItem.RecommendedLevel; int levelIncrease = modItem.LevelIncrease; var mod = ModService.GetModHandler(modID); mod.Apply(player, targetItem, modArgs); string description = mod.Description(player, targetItem, modArgs); bool usePrismatic = false; switch (modType) { case CustomItemPropertyType.RedMod: if (slots.FilledRedSlots < slots.RedSlots) { targetItem.SetLocalInt("MOD_SLOT_RED_" + (slots.FilledRedSlots + 1), modID); targetItem.SetLocalString("MOD_SLOT_RED_DESC_" + (slots.FilledRedSlots + 1), description); player.SendMessage("Mod installed into " + ColorTokenService.Red("red") + " slot #" + (slots.FilledRedSlots + 1)); } else { usePrismatic = true; } break; case CustomItemPropertyType.BlueMod: if (slots.FilledBlueSlots < slots.BlueSlots) { targetItem.SetLocalInt("MOD_SLOT_BLUE_" + (slots.FilledBlueSlots + 1), modID); targetItem.SetLocalString("MOD_SLOT_BLUE_DESC_" + (slots.FilledBlueSlots + 1), description); player.SendMessage("Mod installed into " + ColorTokenService.Blue("blue") + " slot #" + (slots.FilledBlueSlots + 1)); } else { usePrismatic = true; } break; case CustomItemPropertyType.GreenMod: if (slots.FilledBlueSlots < slots.GreenSlots) { targetItem.SetLocalInt("MOD_SLOT_GREEN_" + (slots.FilledGreenSlots + 1), modID); targetItem.SetLocalString("MOD_SLOT_GREEN_DESC_" + (slots.FilledGreenSlots + 1), description); player.SendMessage("Mod installed into " + ColorTokenService.Green("green") + " slot #" + (slots.FilledGreenSlots + 1)); } else { usePrismatic = true; } break; case CustomItemPropertyType.YellowMod: if (slots.FilledBlueSlots < slots.YellowSlots) { targetItem.SetLocalInt("MOD_SLOT_YELLOW_" + (slots.FilledYellowSlots + 1), modID); targetItem.SetLocalString("MOD_SLOT_YELLOW_DESC_" + (slots.FilledYellowSlots + 1), description); player.SendMessage("Mod installed into " + ColorTokenService.Yellow("yellow") + " slot #" + (slots.FilledYellowSlots + 1)); } else { usePrismatic = true; } break; } if (usePrismatic) { string prismaticText = ModService.PrismaticString(); targetItem.SetLocalInt("MOD_SLOT_PRISMATIC_" + (slots.FilledPrismaticSlots + 1), modID); targetItem.SetLocalString("MOD_SLOT_PRISMATIC_DESC_" + (slots.FilledPrismaticSlots + 1), description); player.SendMessage("Mod installed into " + prismaticText + " slot #" + (slots.FilledPrismaticSlots + 1)); } targetItem.RecommendedLevel += levelIncrease; modItem.Destroy(); SkillType skillType; if (ArmorBaseItemTypes.Contains(targetItem.BaseItemType)) { skillType = SkillType.Armorsmith; } else if (WeaponsmithBaseItemTypes.Contains(targetItem.BaseItemType)) { skillType = SkillType.Weaponsmith; } else if (EngineeringBaseItemTypes.Contains(targetItem.BaseItemType)) { skillType = SkillType.Engineering; } else { return; } int rank = SkillService.GetPCSkillRank(player, skillType); int xp = (int)SkillService.CalculateRegisteredSkillLevelAdjustedXP(400, modLevel, rank); SkillService.GiveSkillXP(player, skillType, xp); }
public string IsValidTarget(NWCreature user, NWItem mod, NWObject target, Location targetLocation) { if (target.ObjectType != OBJECT_TYPE_ITEM) { return("Only items may be targeted by mods."); } if (!user.IsPlayer) { return("Only players may use mods."); } NWPlayer player = (user.Object); NWItem targetItem = (target.Object); int modLevel = mod.RecommendedLevel; int itemLevel = targetItem.RecommendedLevel; int requiredPerkLevel = modLevel / 5; if (requiredPerkLevel <= 0) { requiredPerkLevel = 1; } int perkLevel = 0; CustomItemPropertyType modType = ModService.GetModType(mod); ModSlots modSlots = ModService.GetModSlots(targetItem); int modID = mod.GetLocalInt("RUNE_ID"); string[] modArgs = mod.GetLocalString("RUNE_VALUE").Split(','); // Check for a misconfigured mod item. if (modType == CustomItemPropertyType.Unknown) { return("Mod color couldn't be found. Notify an admin that this mod item is not set up properly."); } if (modID <= 0) { return("Mod ID couldn't be found. Notify an admin that this mod item is not set up properly."); } if (modArgs.Length <= 0) { return("Mod value couldn't be found. Notify an admin that this mod item is not set up properly."); } // No available slots on target item if (modType == CustomItemPropertyType.RedMod && !modSlots.CanRedModBeAdded) { return("That item has no available red mod slots."); } if (modType == CustomItemPropertyType.BlueMod && !modSlots.CanBlueModBeAdded) { return("That item has no available blue mod slots."); } if (modType == CustomItemPropertyType.GreenMod && !modSlots.CanGreenModBeAdded) { return("That item has no available green mod slots."); } if (modType == CustomItemPropertyType.YellowMod && !modSlots.CanYellowModBeAdded) { return("That item has no available yellow mod slots."); } // Get the perk level based on target item type and mod type. if (WeaponsmithBaseItemTypes.Contains(targetItem.BaseItemType)) { switch (modType) { case CustomItemPropertyType.RedMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.CombatModInstallationWeapons); break; case CustomItemPropertyType.BlueMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.ForceModInstallationWeapons); break; case CustomItemPropertyType.GreenMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.CraftingModInstallationWeapons); break; case CustomItemPropertyType.YellowMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.SpecialModInstallationWeapons); break; default: perkLevel = 0; break; } } else if (ArmorBaseItemTypes.Contains(targetItem.BaseItemType)) { switch (modType) { case CustomItemPropertyType.RedMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.CombatModInstallationArmors); break; case CustomItemPropertyType.BlueMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.ForceModInstallationArmors); break; case CustomItemPropertyType.GreenMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.CraftingModInstallationArmors); break; case CustomItemPropertyType.YellowMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.SpecialModInstallationArmors); break; default: perkLevel = 0; break; } } else if (EngineeringBaseItemTypes.Contains(targetItem.BaseItemType)) { switch (modType) { case CustomItemPropertyType.RedMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.CombatModInstallationEngineering); break; case CustomItemPropertyType.BlueMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.ForceModInstallationEngineering); break; case CustomItemPropertyType.GreenMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.CraftingModInstallationEngineering); break; case CustomItemPropertyType.YellowMod: perkLevel = PerkService.GetPCPerkLevel(player, PerkType.SpecialModInstallationEngineering); break; default: perkLevel = 0; break; } } // Ensure item isn't equipped. for (int slot = 0; slot < NUM_INVENTORY_SLOTS; slot++) { if (_.GetItemInSlot(slot, user.Object) == targetItem.Object) { return("Targeted item must be unequipped before installing a mod."); } } // Check for perk level requirement if (perkLevel < requiredPerkLevel) { return("You do not have the necessary perk rank required. (Required: " + requiredPerkLevel + ", Your level: " + perkLevel + ")"); } // Can't modify items above perk level * 10 if (itemLevel > perkLevel * 10) { return("Your current perks allow you to add mods to items up to level " + perkLevel * 10 + ". This item is level " + itemLevel + " so you can't install a mod into it."); } // Item must be in the user's inventory. if (!targetItem.Possessor.Equals(player)) { return("Targeted item must be in your inventory."); } var handler = ModService.GetModHandler(modID); // Run the individual mod's rules for application. Will return the error message or a null. return(handler.CanApply(player, targetItem, modArgs)); }
public static string OnModuleExamine(string existingDescription, NWObject examinedObject) { if (examinedObject.ObjectType != OBJECT_TYPE_ITEM) { return(existingDescription); } NWItem examinedItem = (examinedObject.Object); string description = ""; if (examinedItem.RecommendedLevel > 0) { description += ColorTokenService.Orange("Recommended Level: ") + examinedItem.RecommendedLevel + "\n"; } if (examinedItem.LevelIncrease > 0) { description += ColorTokenService.Orange("Level Increase: ") + examinedItem.LevelIncrease + "\n"; } if (examinedItem.AssociatedSkillType > 0) { Skill skill = DataService.Skill.GetByID((int)examinedItem.AssociatedSkillType); description += ColorTokenService.Orange("Associated Skill: ") + skill.Name + "\n"; } if (examinedItem.CustomAC > 0) { if (ShieldBaseItemTypes.Contains(examinedItem.BaseItemType)) { description += ColorTokenService.Orange("Damage Immunity: ") + (10 + examinedItem.CustomAC / 3) + "\n"; } else if (ArmorBaseItemTypes.Contains(examinedItem.BaseItemType)) { description += ColorTokenService.Orange("AC: ") + examinedItem.CustomAC + "\n"; } else { description += ColorTokenService.Red("AC (ignored due to item type): ") + examinedItem.CustomAC + "\n"; } } if (examinedItem.HPBonus > 0) { description += ColorTokenService.Orange("HP Bonus: ") + examinedItem.HPBonus + "\n"; } if (examinedItem.FPBonus > 0) { description += ColorTokenService.Orange("FP Bonus: ") + examinedItem.FPBonus + "\n"; } if (examinedItem.StructureBonus > 0) { description += ColorTokenService.Orange("Structure Bonus: ") + examinedItem.StructureBonus + "\n"; } if (examinedItem.StrengthBonus > 0) { description += ColorTokenService.Orange("Strength Bonus: ") + examinedItem.StrengthBonus + "\n"; } if (examinedItem.DexterityBonus > 0) { description += ColorTokenService.Orange("Dexterity Bonus: ") + examinedItem.DexterityBonus + "\n"; } if (examinedItem.ConstitutionBonus > 0) { description += ColorTokenService.Orange("Constitution Bonus: ") + examinedItem.ConstitutionBonus + "\n"; } if (examinedItem.WisdomBonus > 0) { description += ColorTokenService.Orange("Wisdom Bonus: ") + examinedItem.WisdomBonus + "\n"; } if (examinedItem.IntelligenceBonus > 0) { description += ColorTokenService.Orange("Intelligence Bonus: ") + examinedItem.IntelligenceBonus + "\n"; } if (examinedItem.CharismaBonus > 0) { description += ColorTokenService.Orange("Charisma Bonus: ") + examinedItem.CharismaBonus + "\n"; } if (examinedItem.CooldownRecovery > 0) { description += ColorTokenService.Orange("Cooldown Recovery: +") + examinedItem.CooldownRecovery + "%\n"; } else if (examinedItem.CooldownRecovery < 0) { description += ColorTokenService.Orange("Cooldown Recovery: -") + examinedItem.CooldownRecovery + "%\n"; } if (examinedItem.HarvestingBonus > 0) { description += ColorTokenService.Orange("Harvesting Bonus: ") + examinedItem.HarvestingBonus + "\n"; } if (examinedItem.CraftBonusArmorsmith > 0) { description += ColorTokenService.Orange("Armorsmith Bonus: ") + examinedItem.CraftBonusArmorsmith + "\n"; } if (examinedItem.CraftBonusEngineering > 0) { description += ColorTokenService.Orange("Engineering Bonus: ") + examinedItem.CraftBonusEngineering + "\n"; } if (examinedItem.CraftBonusFabrication > 0) { description += ColorTokenService.Orange("Fabrication Bonus: ") + examinedItem.CraftBonusFabrication + "\n"; } if (examinedItem.CraftBonusWeaponsmith > 0) { description += ColorTokenService.Orange("Weaponsmith Bonus: ") + examinedItem.CraftBonusWeaponsmith + "\n"; } if (examinedItem.CraftBonusCooking > 0) { description += ColorTokenService.Orange("Cooking Bonus: ") + examinedItem.CraftBonusCooking + "\n"; } if (examinedItem.CraftTierLevel > 0) { description += ColorTokenService.Orange("Tool Level: ") + examinedItem.CraftTierLevel + "\n"; } if (examinedItem.EnmityRate != 0) { description += ColorTokenService.Orange("Enmity: ") + examinedItem.EnmityRate + "%\n"; } if (examinedItem.LuckBonus > 0) { description += ColorTokenService.Orange("Luck Bonus: ") + examinedItem.LuckBonus + "\n"; } if (examinedItem.MeditateBonus > 0) { description += ColorTokenService.Orange("Meditate Bonus: ") + examinedItem.MeditateBonus + "\n"; } if (examinedItem.RestBonus > 0) { description += ColorTokenService.Orange("Rest Bonus: ") + examinedItem.RestBonus + "\n"; } if (examinedItem.ScanningBonus > 0) { description += ColorTokenService.Orange("Scanning Bonus: ") + examinedItem.ScanningBonus + "\n"; } if (examinedItem.ScavengingBonus > 0) { description += ColorTokenService.Orange("Scavenging Bonus: ") + examinedItem.ScavengingBonus + "\n"; } if (examinedItem.MedicineBonus > 0) { description += ColorTokenService.Orange("Medicine Bonus: ") + examinedItem.MedicineBonus + "\n"; } if (examinedItem.HPRegenBonus > 0) { description += ColorTokenService.Orange("HP Regen Bonus: ") + examinedItem.HPRegenBonus + "\n"; } if (examinedItem.FPRegenBonus > 0) { description += ColorTokenService.Orange("FP Regen Bonus: ") + examinedItem.FPRegenBonus + "\n"; } if (examinedItem.PilotingBonus > 0) { description += ColorTokenService.Orange("Piloting Bonus: ") + examinedItem.PilotingBonus + "\n"; } if (examinedItem.BaseAttackBonus > 0) { if (WeaponBaseItemTypes.Contains(examinedItem.BaseItemType)) { description += ColorTokenService.Orange("Base Attack Bonus: ") + examinedItem.BaseAttackBonus + "\n"; } else { description += ColorTokenService.Red("Base Attack Bonus (ignored due to item type): ") + examinedItem.BaseAttackBonus + "\n"; } } if (examinedItem.SneakAttackBonus > 0) { description += ColorTokenService.Orange("Sneak Attack Bonus: ") + examinedItem.SneakAttackBonus + "\n"; } if (examinedItem.DamageBonus > 0) { if (WeaponBaseItemTypes.Contains(examinedItem.BaseItemType)) { description += ColorTokenService.Orange("Damage Bonus: ") + examinedItem.DamageBonus + "\n"; } else { description += ColorTokenService.Red("Damage Bonus (ignored due to item type): ") + examinedItem.DamageBonus + "\n"; } } if (examinedItem.CustomItemType != CustomItemType.None) { string itemTypeProper = string.Concat(examinedItem.CustomItemType.ToString().Select(x => char.IsUpper(x) ? " " + x : x.ToString())).TrimStart(' '); description += ColorTokenService.Orange("Item Type: ") + itemTypeProper + "\n"; } // Check for properties that can only be applied to limited things, and flag them here. // Attack bonus, damage, base attack bonus: weapons only // AC - armor items only. ItemProperty ip = _.GetFirstItemProperty(examinedItem); while (_.GetIsItemPropertyValid(ip) == TRUE) { if (_.GetItemPropertyType(ip) == (int)CustomItemPropertyType.ComponentBonus) { switch (_.GetItemPropertySubType(ip)) { case (int)ComponentBonusType.ACUp: { description += ColorTokenService.Cyan("AC can only be applied to Shields, Armor and Helmets. On other items, it will be ignored.\n"); break; } case (int)ComponentBonusType.DamageUp: case (int)ComponentBonusType.AttackBonusUp: case (int)ComponentBonusType.BaseAttackBonusUp: { description += ColorTokenService.Cyan("Damage Up, Attack Bonus Up and Base Attack Bonus Up can only be applied to weapons (including gloves). On other items, it will be ignored.\n"); break; } } } ip = _.GetNextItemProperty(examinedItem); } return(existingDescription + "\n" + description); }
public string IsValidTarget(NWCreature user, NWItem mod, NWObject target, Location targetLocation) { if (target.ObjectType != ObjectType.Item) { return("Only items may be targeted by mods."); } if (!user.IsPlayer && !user.IsDM) { return("Only players may use mods."); } NWPlayer player = (user.Object); NWItem targetItem = (target.Object); int modLevel = mod.RecommendedLevel; int itemLevel = targetItem.RecommendedLevel; int requiredPerkLevel = modLevel / 5; if (requiredPerkLevel <= 0) { requiredPerkLevel = 1; } int perkLevel = 0; ItemPropertyType modType = ModService.GetModType(mod); ModSlots modSlots = ModService.GetModSlots(targetItem); int modID = mod.GetLocalInt("RUNE_ID"); string[] modArgs = mod.GetLocalString("RUNE_VALUE").Split(','); // Check for a misconfigured mod item. if (modType == ItemPropertyType.Invalid) { return("Mod color couldn't be found. Notify an admin that this mod item is not set up properly."); } if (modID <= 0) { return("Mod ID couldn't be found. Notify an admin that this mod item is not set up properly."); } if (modArgs.Length <= 0) { return("Mod value couldn't be found. Notify an admin that this mod item is not set up properly."); } // No available slots on target item if (modType == ItemPropertyType.RedMod && !modSlots.CanRedModBeAdded) { return("That item has no available red mod slots."); } if (modType == ItemPropertyType.BlueMod && !modSlots.CanBlueModBeAdded) { return("That item has no available blue mod slots."); } if (modType == ItemPropertyType.GreenMod && !modSlots.CanGreenModBeAdded) { return("That item has no available green mod slots."); } if (modType == ItemPropertyType.YellowMod && !modSlots.CanYellowModBeAdded) { return("That item has no available yellow mod slots."); } // Get the perk level based on target item type and mod type. if (GetLocalBool(targetItem, "LIGHTSABER") == false && WeaponsmithBaseItemTypes.Contains(targetItem.BaseItemType)) { perkLevel = PerkService.GetCreaturePerkLevel(player, PerkType.WeaponModInstallation); } else if (ArmorBaseItemTypes.Contains(targetItem.BaseItemType)) { perkLevel = PerkService.GetCreaturePerkLevel(player, PerkType.ArmorModInstallation); } else if (GetLocalBool(targetItem, "LIGHTSABER") == true || EngineeringBaseItemTypes.Contains(targetItem.BaseItemType)) { perkLevel = PerkService.GetCreaturePerkLevel(player, PerkType.EngineeringModInstallation); } // Ensure item isn't equipped. for (int slot = 0; slot < NumberOfInventorySlots; slot++) { if (_.GetItemInSlot((InventorySlot)slot, user.Object) == targetItem.Object) { return("Targeted item must be unequipped before installing a mod."); } } // Check for perk level requirement if (perkLevel < requiredPerkLevel && !player.IsDM) { return("You do not have the necessary perk rank required. (Required: " + requiredPerkLevel + ", Your level: " + perkLevel + ")"); } // Can't modify items above perk level * 10 if (itemLevel > perkLevel * 10 && !player.IsDM) { return("Your current perks allow you to add mods to items up to level " + perkLevel * 10 + ". This item is level " + itemLevel + " so you can't install a mod into it."); } // Item must be in the user's inventory. if (!targetItem.Possessor.Equals(player)) { return("Targeted item must be in your inventory."); } // It's possible that this mod is no longer usable. Notify the player if we can't find one registered. if (!ModService.IsModHandlerRegistered(modID)) { return("Unfortunately, this mod can no longer be used."); } var handler = ModService.GetModHandler(modID); // Run the individual mod's rules for application. Will return the error message or a null. return(handler.CanApply(player, targetItem, modArgs)); }