public CustomItemPropertyType GetRuneType(NWItem item)
        {
            CustomItemPropertyType ipType = CustomItemPropertyType.Unknown;

            foreach (var ip in item.ItemProperties)
            {
                int type = _.GetItemPropertyType(ip);
                if (type == (int)CustomItemPropertyType.RedRune ||
                    type == (int)CustomItemPropertyType.BlueRune ||
                    type == (int)CustomItemPropertyType.GreenRune ||
                    type == (int)CustomItemPropertyType.YellowRune)
                {
                    ipType = (CustomItemPropertyType)type;
                    break;
                }
            }

            return(ipType);
        }
Beispiel #2
0
        public static CustomItemPropertyType GetModType(NWItem item)
        {
            CustomItemPropertyType ipType = CustomItemPropertyType.Unknown;

            foreach (var ip in item.ItemProperties)
            {
                int type = _.GetItemPropertyType(ip);
                if (type == (int)CustomItemPropertyType.RedMod ||
                    type == (int)CustomItemPropertyType.BlueMod ||
                    type == (int)CustomItemPropertyType.GreenMod ||
                    type == (int)CustomItemPropertyType.YellowMod)
                {
                    ipType = (CustomItemPropertyType)type;
                    break;
                }
            }

            return(ipType);
        }
Beispiel #3
0
        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);
            });
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        public void ApplyEffects(NWCreature user, NWItem runeItem, NWObject target, Location targetLocation, CustomData customData)
        {
            NWPlayer  player                = NWPlayer.Wrap(user.Object);
            NWItem    targetItem            = NWItem.Wrap(target.Object);
            RuneSlots slots                 = _rune.GetRuneSlots(targetItem);
            CustomItemPropertyType runeType = _rune.GetRuneType(runeItem);
            int runeID = runeItem.GetLocalInt("RUNE_ID");

            string[] runeArgs      = runeItem.GetLocalString("RUNE_VALUE").Split(',');
            int      runeLevel     = runeItem.RecommendedLevel;
            int      levelIncrease = runeItem.LevelIncrease;

            var   dbRune = _db.Runes.Single(x => x.RuneID == runeID && x.IsActive);
            IRune rune   = App.ResolveByInterface <IRune>("Rune." + dbRune.Script);

            rune.Apply(player, targetItem, runeArgs);

            string description  = rune.Description(player, targetItem, runeArgs);
            bool   usePrismatic = false;

            switch (runeType)
            {
            case CustomItemPropertyType.RedRune:
                if (slots.FilledRedSlots < slots.RedSlots)
                {
                    targetItem.SetLocalInt("RUNIC_SLOT_RED_" + (slots.FilledRedSlots + 1), runeID);
                    targetItem.SetLocalString("RUNIC_SLOT_RED_DESC_" + (slots.FilledRedSlots + 1), description);
                    player.SendMessage("Rune installed into " + _color.Red("red") + " slot #" + (slots.FilledRedSlots + 1));
                }
                else
                {
                    usePrismatic = true;
                }
                break;

            case CustomItemPropertyType.BlueRune:
                if (slots.FilledBlueSlots < slots.BlueSlots)
                {
                    targetItem.SetLocalInt("RUNIC_SLOT_BLUE_" + (slots.FilledBlueSlots + 1), runeID);
                    targetItem.SetLocalString("RUNIC_SLOT_BLUE_DESC_" + (slots.FilledBlueSlots + 1), description);
                    player.SendMessage("Rune installed into " + _color.Blue("blue") + " slot #" + (slots.FilledBlueSlots + 1));
                }
                else
                {
                    usePrismatic = true;
                }
                break;

            case CustomItemPropertyType.GreenRune:
                if (slots.FilledBlueSlots < slots.GreenSlots)
                {
                    targetItem.SetLocalInt("RUNIC_SLOT_GREEN_" + (slots.FilledGreenSlots + 1), runeID);
                    targetItem.SetLocalString("RUNIC_SLOT_GREEN_DESC_" + (slots.FilledGreenSlots + 1), description);
                    player.SendMessage("Rune installed into " + _color.Green("green") + " slot #" + (slots.FilledGreenSlots + 1));
                }
                else
                {
                    usePrismatic = true;
                }
                break;

            case CustomItemPropertyType.YellowRune:
                if (slots.FilledBlueSlots < slots.YellowSlots)
                {
                    targetItem.SetLocalInt("RUNIC_SLOT_YELLOW_" + (slots.FilledYellowSlots + 1), runeID);
                    targetItem.SetLocalString("RUNIC_SLOT_YELLOW_DESC_" + (slots.FilledYellowSlots + 1), description);
                    player.SendMessage("Rune installed into " + _color.Yellow("yellow") + " slot #" + (slots.FilledYellowSlots + 1));
                }
                else
                {
                    usePrismatic = true;
                }
                break;
            }

            if (usePrismatic)
            {
                string prismaticText = _rune.PrismaticString();
                targetItem.SetLocalInt("RUNIC_SLOT_PRISMATIC_" + (slots.FilledPrismaticSlots + 1), runeID);
                targetItem.SetLocalString("RUNIC_SLOT_PRISMATIC_DESC_" + (slots.FilledPrismaticSlots + 1), description);
                player.SendMessage("Rune installed into " + prismaticText + " slot #" + (slots.FilledPrismaticSlots + 1));
            }

            targetItem.RecommendedLevel += levelIncrease;
            runeItem.Destroy();

            SkillType skillType;

            if (_item.ArmorBaseItemTypes.Contains(targetItem.BaseItemType))
            {
                skillType = SkillType.Armorsmith;
            }
            else if (_item.WeaponBaseItemTypes.Contains(targetItem.BaseItemType))
            {
                skillType = SkillType.Weaponsmith;
            }
            else
            {
                return;
            }

            PCSkill pcSkill = _skill.GetPCSkill(player, skillType);
            int     xp      = (int)_skill.CalculateRegisteredSkillLevelAdjustedXP(400, runeLevel, pcSkill.Rank);

            _skill.GiveSkillXP(player, skillType, xp);
        }
Beispiel #6
0
        public string IsValidTarget(NWCreature user, NWItem rune, NWObject target, Location targetLocation)
        {
            if (target.ObjectType != OBJECT_TYPE_ITEM)
            {
                return("Only items may be targeted by Runes.");
            }
            if (!user.IsPlayer)
            {
                return("Only players may use runes.");
            }
            NWPlayer player     = NWPlayer.Wrap(user.Object);
            NWItem   targetItem = NWItem.Wrap(target.Object);

            int runeLevel         = rune.RecommendedLevel;
            int itemLevel         = targetItem.RecommendedLevel;
            int requiredPerkLevel = runeLevel / 5;

            if (requiredPerkLevel <= 0)
            {
                requiredPerkLevel = 1;
            }
            int perkLevel = 0;
            CustomItemPropertyType runeType = _rune.GetRuneType(rune);
            RuneSlots runeSlots             = _rune.GetRuneSlots(targetItem);
            int       runeID = rune.GetLocalInt("RUNE_ID");

            string[] runeArgs = rune.GetLocalString("RUNE_VALUE").Split(',');

            // Check for a misconfigured rune item.
            if (runeType == CustomItemPropertyType.Unknown)
            {
                return("Rune color couldn't be found. Notify an admin that this rune item is not set up properly.");
            }
            if (runeID <= 0)
            {
                return("Rune ID couldn't be found. Notify an admin that this rune item is not set up properly.");
            }
            if (runeArgs.Length <= 0)
            {
                return("Rune value couldn't be found. Notify an admin that this rune item is not set up properly.");
            }

            // No available slots on target item
            if (runeType == CustomItemPropertyType.RedRune && !runeSlots.CanRedRuneBeAdded)
            {
                return("That item has no available red runic slots.");
            }
            if (runeType == CustomItemPropertyType.BlueRune && !runeSlots.CanBlueRuneBeAdded)
            {
                return("That item has no available blue runic slots.");
            }
            if (runeType == CustomItemPropertyType.GreenRune && !runeSlots.CanGreenRuneBeAdded)
            {
                return("That item has no available green runic slots.");
            }
            if (runeType == CustomItemPropertyType.YellowRune && !runeSlots.CanYellowRuneBeAdded)
            {
                return("That item has no available yellow runic slots.");
            }

            // Get the perk level based on target item type and rune type.
            if (_item.WeaponBaseItemTypes.Contains(targetItem.BaseItemType))
            {
                switch (runeType)
                {
                case CustomItemPropertyType.RedRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.CombatRuneInstallationWeapons);
                    break;

                case CustomItemPropertyType.BlueRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.MagicRuneInstallationWeapons);
                    break;

                case CustomItemPropertyType.GreenRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.CraftingRuneInstallationWeapons);
                    break;

                case CustomItemPropertyType.YellowRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.SpecialRuneInstallationWeapons);
                    break;

                default:
                    perkLevel = 0;
                    break;
                }
            }
            else if (_item.ArmorBaseItemTypes.Contains(targetItem.BaseItemType))
            {
                switch (runeType)
                {
                case CustomItemPropertyType.RedRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.CombatRuneInstallationArmors);
                    break;

                case CustomItemPropertyType.BlueRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.MagicRuneInstallationArmors);
                    break;

                case CustomItemPropertyType.GreenRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.CraftingRuneInstallationArmors);
                    break;

                case CustomItemPropertyType.YellowRune:
                    perkLevel = _perk.GetPCPerkLevel(player, PerkType.SpecialRuneInstallationArmors);
                    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 rune.");
                }
            }

            // 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 runes to items up to level " + perkLevel * 10 + ". This item is level " + itemLevel + " so you can't install a rune 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 rune type.
            var dbRune = _db.Runes.SingleOrDefault(x => x.RuneID == runeID && x.IsActive);

            if (dbRune == null)
            {
                return("Couldn't find a matching rune ID in the database. Inform an admin of this issue.");
            }

            // Run the individual rune's rules for application. Will return the error message or a null.
            IRune runeRules = App.ResolveByInterface <IRune>("Rune." + dbRune.Script);

            return(runeRules.CanApply(player, targetItem, runeArgs));
        }
Beispiel #7
0
        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));
        }