public static string OnModuleExamine(string existingDescription, NWPlayer examiner, NWObject examinedObject) { if (examinedObject.ObjectType != _.OBJECT_TYPE_ITEM) { return(existingDescription); } NWItem examinedItem = (examinedObject.Object); string description = string.Empty; ModSlots slot = GetModSlots(examinedItem); for (int red = 1; red <= slot.FilledRedSlots; red++) { description += ColorTokenService.Red("Red Slot #" + red + ": ") + examinedItem.GetLocalString("MOD_SLOT_RED_DESC_" + red) + "\n"; } for (int blue = 1; blue <= slot.FilledBlueSlots; blue++) { description += ColorTokenService.Red("Blue Slot #" + blue + ": ") + examinedItem.GetLocalString("MOD_SLOT_BLUE_DESC_" + blue) + "\n"; } for (int green = 1; green <= slot.FilledGreenSlots; green++) { description += ColorTokenService.Red("Green Slot #" + green + ": ") + examinedItem.GetLocalString("MOD_SLOT_GREEN_DESC_" + green) + "\n"; } for (int yellow = 1; yellow <= slot.FilledYellowSlots; yellow++) { description += ColorTokenService.Red("Yellow Slot #" + yellow + ": ") + examinedItem.GetLocalString("MOD_SLOT_YELLOW_DESC_" + yellow) + "\n"; } for (int prismatic = 1; prismatic <= slot.FilledPrismaticSlots; prismatic++) { description += PrismaticString() + " Slot #" + prismatic + ": " + examinedItem.GetLocalString("MOD_SLOT_PRISMATIC_DESC_" + prismatic) + "\n"; } return(existingDescription + "\n" + description); }
public static ModSlots GetModSlots(NWItem item) { ModSlots modSlots = new ModSlots(); foreach (var ip in item.ItemProperties) { int type = _.GetItemPropertyType(ip); switch (type) { case (int)CustomItemPropertyType.ModSlotRed: modSlots.RedSlots++; break; case (int)CustomItemPropertyType.ModSlotBlue: modSlots.BlueSlots++; break; case (int)CustomItemPropertyType.ModSlotGreen: modSlots.GreenSlots++; break; case (int)CustomItemPropertyType.ModSlotYellow: modSlots.YellowSlots++; break; case (int)CustomItemPropertyType.ModSlotPrismatic: modSlots.PrismaticSlots++; break; } } for (int red = 1; red <= modSlots.RedSlots; red++) { int modID = item.GetLocalInt("MOD_SLOT_RED_" + red); if (modID > 0) { modSlots.FilledRedSlots++; } } for (int blue = 1; blue <= modSlots.BlueSlots; blue++) { int modID = item.GetLocalInt("MOD_SLOT_BLUE_" + blue); if (modID > 0) { modSlots.FilledBlueSlots++; } } for (int green = 1; green <= modSlots.GreenSlots; green++) { int modID = item.GetLocalInt("MOD_SLOT_GREEN_" + green); if (modID > 0) { modSlots.FilledGreenSlots++; } } for (int yellow = 1; yellow <= modSlots.YellowSlots; yellow++) { int modID = item.GetLocalInt("MOD_SLOT_YELLOW_" + yellow); if (modID > 0) { modSlots.FilledYellowSlots++; } } for (int prismatic = 1; prismatic <= modSlots.PrismaticSlots; prismatic++) { int modID = item.GetLocalInt("MOD_SLOT_PRISMATIC_" + prismatic); if (modID > 0) { modSlots.FilledPrismaticSlots++; } } return(modSlots); }
public void ApplyEffects(NWCreature user, NWItem modItem, NWObject target, Location targetLocation, CustomData customData) { NWPlayer player = (user.Object); NWItem targetItem = (target.Object); ModSlots slots = _mod.GetModSlots(targetItem); CustomItemPropertyType modType = _mod.GetModType(modItem); int modID = modItem.GetLocalInt("RUNE_ID"); string[] modArgs = modItem.GetLocalString("RUNE_VALUE").Split(','); int modLevel = modItem.RecommendedLevel; int levelIncrease = modItem.LevelIncrease; var dbMod = _data.Single <Data.Entity.Mod>(x => x.ID == modID && x.IsActive); App.ResolveByInterface <IMod>("Mod." + dbMod.Script, mod => { 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 " + _color.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 " + _color.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 " + _color.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 " + _color.Yellow("yellow") + " slot #" + (slots.FilledYellowSlots + 1)); } else { usePrismatic = true; } break; } if (usePrismatic) { string prismaticText = _mod.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 (ItemService.ArmorBaseItemTypes.Contains(targetItem.BaseItemType)) { skillType = SkillType.Armorsmith; } else if (ItemService.WeaponBaseItemTypes.Contains(targetItem.BaseItemType)) { skillType = SkillType.Weaponsmith; } else { return; } int rank = _skill.GetPCSkillRank(player, skillType); int xp = (int)_skill.CalculateRegisteredSkillLevelAdjustedXP(400, modLevel, rank); _skill.GiveSkillXP(player, skillType, xp); }); }
public string IsValidTarget(NWCreature user, NWItem mod, NWObject target, Location targetLocation) { if (target.ObjectType != NWScript.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 = _mod.GetModType(mod); ModSlots modSlots = _mod.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 (ItemService.WeaponBaseItemTypes.Contains(targetItem.BaseItemType)) { switch (modType) { case CustomItemPropertyType.RedMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.CombatModInstallationWeapons); break; case CustomItemPropertyType.BlueMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.MagicModInstallationWeapons); break; case CustomItemPropertyType.GreenMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.CraftingModInstallationWeapons); break; case CustomItemPropertyType.YellowMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.SpecialModInstallationWeapons); break; default: perkLevel = 0; break; } } else if (ItemService.ArmorBaseItemTypes.Contains(targetItem.BaseItemType)) { switch (modType) { case CustomItemPropertyType.RedMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.CombatModInstallationArmors); break; case CustomItemPropertyType.BlueMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.MagicModInstallationArmors); break; case CustomItemPropertyType.GreenMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.CraftingModInstallationArmors); break; case CustomItemPropertyType.YellowMod: perkLevel = _perk.GetPCPerkLevel(player, PerkType.SpecialModInstallationArmors); break; default: perkLevel = 0; break; } } // Ensure item isn't equipped. for (int slot = 0; slot < NWScript.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 + ")"); } // 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."); } // Look for a database entry for this mod type. var dbMod = _data.SingleOrDefault <Data.Entity.Mod>(x => x.ID == modID && x.IsActive); if (dbMod == null) { return("Couldn't find a matching mod ID in the database. Inform an admin of this issue."); } // Run the individual mod's rules for application. Will return the error message or a null. string canApply = App.ResolveByInterface <IMod, string>("Mod." + dbMod.Script, (modRules) => modRules.CanApply(player, targetItem, modArgs)); return(canApply); }
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)); }
private static string GetModImg(ModSets set, ModSlots slot) { switch (set) { case ModSets.Health: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/health-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/health-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/health-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/health-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/health-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/health-cross.png"); default: return("/Content/Images/Mods/health-square.png"); } case ModSets.Offense: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/offense-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/offense-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/offense-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/offense-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/offense-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/offense-cross.png"); default: return("/Content/Images/Mods/offense-square.png"); } case ModSets.Defense: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/defense-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/defense-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/defense-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/defense-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/defense-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/defense-cross.png"); default: return("/Content/Images/Mods/defense-square.png"); } case ModSets.Speed: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/speed-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/speed-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/speed-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/speed-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/speed-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/speed-cross.png"); default: return("/Content/Images/Mods/speed-square.png"); } case ModSets.Crit_Chance: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/cc-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/cc-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/cc-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/cc-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/cc-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/cc-cross.png"); default: return("/Content/Images/Mods/cc-square.png"); } case ModSets.Crit_Damage: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/cd-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/cd-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/cd-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/cd-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/cd-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/cd-cross.png"); default: return("/Content/Images/Mods/cd-square.png"); } case ModSets.Potency: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/potency-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/potency-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/potency-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/potency-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/potency-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/potency-cross.png"); default: return("/Content/Images/Mods/potency-square.png"); } case ModSets.Tenacity: switch (slot) { case ModSlots.Square: return("/Content/Images/Mods/tenacity-square.png"); case ModSlots.Arrow: return("/Content/Images/Mods/tenacity-arrow.png"); case ModSlots.Diamond: return("/Content/Images/Mods/tenacity-diamond.png"); case ModSlots.Triangle: return("/Content/Images/Mods/tenacity-triangle.png"); case ModSlots.Circle: return("/Content/Images/Mods/tenacity-circle.png"); case ModSlots.Cross: return("/Content/Images/Mods/tenacity-cross.png"); default: return("/Content/Images/Mods/tenacity-square.png"); } default: return("/Content/Images/Mods/health-square.png"); } }
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); ItemPropertyType 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 ItemPropertyType.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 ItemPropertyType.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 ItemPropertyType.GreenMod: if (slots.FilledGreenSlots < 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 ItemPropertyType.YellowMod: if (slots.FilledYellowSlots < 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 (GetLocalBool(targetItem, "LIGHTSABER") == true) { skillType = SkillType.Engineering; } else 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 != 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)); }