Пример #1
0
        public CustomItem(string name, string nameToken,
                          string descriptionToken, string loreToken,
                          string pickupToken,
                          Sprite pickupIconSprite, GameObject pickupModelPrefab,
                          ItemTier tier, ItemTag[] tags,
                          bool canRemove,
                          bool hidden,
                          UnlockableDef unlockableDef          = null,
                          ItemDisplayRuleDict?itemDisplayRules = null)
        {
            ItemDef                   = ScriptableObject.CreateInstance <ItemDef>();
            ItemDef.canRemove         = canRemove;
            ItemDef.descriptionToken  = descriptionToken;
            ItemDef.hidden            = hidden;
            ItemDef.loreToken         = loreToken;
            ItemDef.name              = name;
            ItemDef.nameToken         = nameToken;
            ItemDef.pickupIconSprite  = pickupIconSprite;
            ItemDef.pickupModelPrefab = pickupModelPrefab;
            ItemDef.pickupToken       = pickupToken;
            ItemDef.tags              = tags;
            ItemDef.tier              = tier;
            ItemDef.unlockableDef     = unlockableDef;

            ItemDisplayRules = itemDisplayRules;
        }
Пример #2
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            speedBuff            = ScriptableObject.CreateInstance <BuffDef>();
            speedBuff.buffColor  = Color.white;
            speedBuff.canStack   = true;
            speedBuff.isDebuff   = false;
            speedBuff.name       = "TKSATSkeinSpeed";
            speedBuff.iconSprite = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/MiscIcons/skeinSpeedBuffIcon.png");
            ContentAddition.AddBuffDef(speedBuff);

            resistBuff            = ScriptableObject.CreateInstance <BuffDef>();
            resistBuff.buffColor  = Color.white;
            resistBuff.canStack   = true;
            resistBuff.isDebuff   = false;
            resistBuff.name       = "TKSATSkeinResist";
            resistBuff.iconSprite = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/MiscIcons/skeinResistBuffIcon.png");
            ContentAddition.AddBuffDef(resistBuff);

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/skeinIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "Phenomenal Cosmic Power");
            LanguageAPI.Add(achiDescToken, "Complete all 4 Item Set achievements from Tinker's Satchel.");
            itemDef.unlockableDef = unlockable;
        }
Пример #3
0
        public CustomEquipment(string name, string nameToken,
                               string descriptionToken, string loreToken,
                               string pickupToken,
                               Sprite pickupIconSprite, GameObject pickupModelPrefab,
                               float cooldown,
                               bool canDrop,
                               bool enigmaCompatible,
                               bool isBoss, bool isLunar,
                               BuffDef passiveBuffDef,
                               UnlockableDef unlockableDef,
                               ColorCatalog.ColorIndex colorIndex   = ColorCatalog.ColorIndex.Equipment,
                               bool appearsInMultiPlayer            = true, bool appearsInSinglePlayer = true,
                               ItemDisplayRuleDict?itemDisplayRules = null)
        {
            EquipmentDef = ScriptableObject.CreateInstance <EquipmentDef>();
            EquipmentDef.appearsInMultiPlayer  = appearsInMultiPlayer;
            EquipmentDef.appearsInSinglePlayer = appearsInSinglePlayer;
            EquipmentDef.canDrop           = canDrop;
            EquipmentDef.colorIndex        = colorIndex;
            EquipmentDef.cooldown          = cooldown;
            EquipmentDef.descriptionToken  = descriptionToken;
            EquipmentDef.enigmaCompatible  = enigmaCompatible;
            EquipmentDef.isBoss            = isBoss;
            EquipmentDef.isLunar           = isLunar;
            EquipmentDef.loreToken         = loreToken;
            EquipmentDef.name              = name;
            EquipmentDef.nameToken         = nameToken;
            EquipmentDef.passiveBuffDef    = passiveBuffDef;
            EquipmentDef.pickupIconSprite  = pickupIconSprite;
            EquipmentDef.pickupModelPrefab = pickupModelPrefab;
            EquipmentDef.pickupToken       = pickupToken;
            EquipmentDef.unlockableDef     = unlockableDef;

            ItemDisplayRules = itemDisplayRules;
        }
Пример #4
0
 public InteractableTemplate(GameObject interactablePrefab, Category interactableCategory, int selectionWeight = 3, bool sendOverNetwork = true, HullClassification hullSize = HullClassification.Golem, MapNodeGroup.GraphType nodeGraphType = MapNodeGroup.GraphType.Ground, int directorCreditCost = 15, bool occupyPosition = true, SpawnCard.EliteRules eliteRules = SpawnCard.EliteRules.Default, bool orientToFloor = true, bool slightlyRandomizeOrientation = false, bool skipSpawnWhenSacrificeArtifactEnabled = false, NodeFlags requiredFlags = NodeFlags.None, NodeFlags forbiddenFlags = NodeFlags.None, DirectorCore.MonsterSpawnDistance spawnDistance = DirectorCore.MonsterSpawnDistance.Standard, bool allowAmbushSpawn = true, bool preventOverhead = false, int minimumStageCompletions = 0, UnlockableDef requiredUnlockableDef = null, UnlockableDef forbiddenUnlockableDef = null, bool multiplayerOnly = false, int minimumCount = 0)
 {
     this.interactablePrefab                    = interactablePrefab;
     this.interactableCategory                  = interactableCategory;
     this.selectionWeight                       = selectionWeight;
     this.minimumCount                          = minimumCount;
     this.sendOverNetwork                       = sendOverNetwork;
     this.hullSize                              = hullSize;
     this.nodeGraphType                         = nodeGraphType;
     this.directorCreditCost                    = directorCreditCost;
     this.occupyPosition                        = occupyPosition;
     this.eliteRules                            = eliteRules;
     this.orientToFloor                         = orientToFloor;
     this.slightlyRandomizeOrientation          = slightlyRandomizeOrientation;
     this.skipSpawnWhenSacrificeArtifactEnabled = skipSpawnWhenSacrificeArtifactEnabled;
     this.requiredFlags                         = requiredFlags;
     this.forbiddenFlags                        = forbiddenFlags;
     this.spawnDistance                         = spawnDistance;
     this.allowAmbushSpawn                      = allowAmbushSpawn;
     this.preventOverhead                       = preventOverhead;
     this.minimumStageCompletions               = minimumStageCompletions;
     this.requiredUnlockableDef                 = requiredUnlockableDef;
     this.forbiddenUnlockableDef                = forbiddenUnlockableDef;
     this.multiplayerOnly                       = multiplayerOnly;
 }
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/deadManSwitchIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "Nine Lives");
            LanguageAPI.Add(achiDescToken, "Survive falling to low health 9 times in the same run (must return to above 50% health each time).");
            itemDef.unlockableDef = unlockable;

            deadManSwitchBuff            = ScriptableObject.CreateInstance <BuffDef>();
            deadManSwitchBuff.buffColor  = Color.red;
            deadManSwitchBuff.canStack   = false;
            deadManSwitchBuff.isDebuff   = false;
            deadManSwitchBuff.isCooldown = true;
            deadManSwitchBuff.name       = "TKSATDeadManSwitch";
            deadManSwitchBuff.iconSprite = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/MiscIcons/deadManSwitchBuff.png");
            ContentAddition.AddBuffDef(deadManSwitchBuff);
        }
Пример #6
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            headsetBuff            = ScriptableObject.CreateInstance <BuffDef>();
            headsetBuff.buffColor  = new Color(0.5f, 0.575f, 0.95f);
            headsetBuff.canStack   = true;
            headsetBuff.isDebuff   = false;
            headsetBuff.name       = "TKSATHeadset";
            headsetBuff.iconSprite = Addressables.LoadAssetAsync <Sprite>("RoR2/Base/ShockNearby/texBuffTeslaIcon.tif")
                                     .WaitForCompletion();
            ContentAddition.AddBuffDef(headsetBuff);

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/headsetIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "You Broke It");
            LanguageAPI.Add(achiDescToken, "Kill a boss with a maximum damage H3AD-5T v2 explosion.");
            itemDef.unlockableDef = unlockable;
        }
Пример #7
0
 public static UnlockableDef Add(UnlockableDef unlockableDef, String contentPackIdentifier = null)
 {
     contentPackIdentifier = contentPackIdentifier ?? Assembly.GetCallingAssembly().GetName().Name;
     if (!ContentPacks.assemblyDict.ContainsKey(contentPackIdentifier))
     {
         ContentPacks.assemblyDict[contentPackIdentifier] = Assembly.GetCallingAssembly();
     }
     ContentPacks.Packs[contentPackIdentifier].unlockableDefs.Add(unlockableDef);
     return(unlockableDef);
 }
Пример #8
0
 /// <summary>
 /// Registers a UnlockableDef to the UnlockableCatalog
 /// </summary>
 /// <param name="unlockableDef">The UnlockableDef to register.</param>
 public static void RegisterUnlockableDef(UnlockableDef unlockableDef)
 {
     //Check if the SurvivorDef has already been registered.
     if (UnlockableDefDefinitions.Contains(unlockableDef))
     {
         LogCore.LogE(unlockableDef + " has already been registered to the UnlockableDef Catalog, please do not register the same  UnlockableDef twice.");
         return;
     }
     //If not, add it to our SurvivorDefinitions
     UnlockableDefDefinitions.Add(unlockableDef);
 }
Пример #9
0
        //UnlockableDefs should be added by UnlockableAPI, despite this, players could make new unlockableDefs for usage with DirectorCards (such as forbidden unlockables) or for Log entries, which also require unlockableDefs.
        /// <summary>
        /// Adds an UnlockableDef to your Mod's ContentPack
        /// <para>If you want the unlockable to be tied to an achievement, use UnlockableAPI instead.</para>
        /// </summary>
        /// <param name="unlockableDef">The UnlockableDef to Add</param>
        /// <returns>true if valid and added, false if one of the requirements is not met</returns>
        public static bool AddUnlockableDef(UnlockableDef unlockableDef)
        {
            var asm = Assembly.GetCallingAssembly();

            if (CatalogBlockers.GetAvailability <UnlockableDef>())
            {
                R2APIContentManager.HandleContentAddition(asm, unlockableDef);
                return(true);
            }
            RejectContent(unlockableDef, asm, "UnlockableDef", "but the UnlockableCatalog has already initialized");
            return(false);
        }
Пример #10
0
 public CustomItem(string name, string nameToken,
                   string descriptionToken, string loreToken,
                   string pickupToken,
                   Sprite pickupIconSprite, GameObject pickupModelPrefab,
                   ItemTier tier, ItemTag[] tags,
                   bool canRemove,
                   bool hidden,
                   UnlockableDef unlockableDef          = null,
                   ItemDisplayRuleDict?itemDisplayRules = null)
 {
     SetupItem(name, nameToken, descriptionToken, loreToken, pickupToken, pickupIconSprite, pickupModelPrefab, tier, tags, canRemove, hidden, unlockableDef, itemDisplayRules);
 }
Пример #11
0
 // Token: 0x060025CC RID: 9676 RVA: 0x000B17C0 File Offset: 0x000AF9C0
 public virtual void OnGranted()
 {
     if (!string.IsNullOrEmpty(this.achievementDef.unlockableRewardIdentifier))
     {
         if (this.localUser.currentNetworkUser)
         {
             UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(this.achievementDef.unlockableRewardIdentifier);
             this.localUser.currentNetworkUser.CallCmdReportUnlock(unlockableDef.index);
         }
         this.userProfile.AddUnlockToken(this.achievementDef.unlockableRewardIdentifier);
     }
 }
Пример #12
0
        // Token: 0x06002821 RID: 10273 RVA: 0x000ABB68 File Offset: 0x000A9D68
        private void OnUnlockCheck(UserProfile userProfile, string unlockableToken)
        {
            UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(unlockableToken);

            if (unlockableDef == null)
            {
                return;
            }
            if (userProfile == base.userProfile && LogCollectorAchievement.IsUnlockableMonsterLog(unlockableDef))
            {
                this.Check();
            }
        }
        // Token: 0x06002644 RID: 9796 RVA: 0x000B1E04 File Offset: 0x000B0004
        private void OnUnlockCheck(UserProfile userProfile, string unlockableToken)
        {
            UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(unlockableToken);

            if (unlockableDef == null)
            {
                return;
            }
            if (userProfile == this.userProfile && FindUniqueNewtStatues.IsUnlockableNewtStatue(unlockableDef))
            {
                this.Check();
            }
        }
Пример #14
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            var tempPfb = LegacyResourcesAPI.Load <GameObject>("Prefabs/Projectiles/GravSphere").InstantiateClone("temporary setup prefab", false);
            var proj    = tempPfb.GetComponent <RoR2.Projectile.ProjectileSimple>();

            proj.desiredForwardSpeed = 0;
            proj.lifetime            = PULL_VFX_DURATION;
            var projCtrl = tempPfb.GetComponent <RoR2.Projectile.ProjectileController>();

            projCtrl.procCoefficient = 0;
            var dmg = proj.GetComponent <RoR2.Projectile.ProjectileDamage>();

            dmg.damage  = 0f;
            dmg.enabled = false;
            var force = tempPfb.GetComponent <RadialForce>();

            force.enabled = false;

            var sph = tempPfb.transform.Find("Sphere");

            sph.gameObject.SetActive(false);

            var sps     = tempPfb.transform.Find("Sparks");
            var spsPart = sps.GetComponent <ParticleSystem>();
            var spsMain = spsPart.main;

            spsMain.startSpeed = new ParticleSystem.MinMaxCurve(10f, 30f);
            var spsShape = spsPart.shape;

            spsShape.radius = 4f;

            blackHolePrefab = tempPfb.InstantiateClone("KleinBottleProcPrefab", true);
            UnityEngine.Object.Destroy(tempPfb);

            ContentAddition.AddProjectile(blackHolePrefab);

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/kleinBottleIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "Can't Touch This");
            LanguageAPI.Add(achiDescToken, "Block, or take 1 or less points of damage from, 3 attacks in a row.");
            itemDef.unlockableDef = unlockable;
        }
Пример #15
0
        private bool EveryoneCanPlay()
        {
            UnlockableDef def = UnlockableCatalog.GetUnlockableDef("COMPLETE_MAINENDING_DILUVIAN_UNLOCKABLE");
            ReadOnlyCollection <NetworkUser> onlyInstancesList = NetworkUser.readOnlyInstancesList;

            for (int index = 0; index < onlyInstancesList.Count; ++index)
            {
                if (!onlyInstancesList[index].unlockables.Contains(def))
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #16
0
        private void SetupItem(string name, string nameToken,
                               string descriptionToken, string loreToken,
                               string pickupToken,
                               Sprite pickupIconSprite, GameObject pickupModelPrefab,
                               ItemTier tier, ItemTag[] tags,
                               bool canRemove,
                               bool hidden,
                               UnlockableDef unlockableDef          = null,
                               ItemDisplayRuleDict?itemDisplayRules = null,
                               ItemTierDef itemTierDef = null)
        {
            ItemDef                   = ScriptableObject.CreateInstance <ItemDef>();
            ItemDef.canRemove         = canRemove;
            ItemDef.descriptionToken  = descriptionToken;
            ItemDef.hidden            = hidden;
            ItemDef.loreToken         = loreToken;
            ItemDef.name              = name;
            ItemDef.nameToken         = nameToken;
            ItemDef.pickupIconSprite  = pickupIconSprite;
            ItemDef.pickupModelPrefab = pickupModelPrefab;
            ItemDef.pickupToken       = pickupToken;
            ItemDef.tags              = tags;
            ItemDef.unlockableDef     = unlockableDef;
            ItemDisplayRules          = itemDisplayRules;

            //If the tier isnt assigned at runtime, load tier from addressables, this should make it so mods that add items dont break.
            //We dont want to set the .tier directly, because that'll attempt to load the itemTierDef via the itemTierCatalog, and we cant
            //Guarantee said catalog has been initialized at that point
            if (tier != ItemTier.AssignedAtRuntime)
            {
                ItemDef._itemTierDef = LoadTierFromAddress(tier);
                return;
            }
            else
            {
                //If the itemTier is AssignedAtRuntime, but an itemTierDef is not assigned, default to noTier and warn the user
                if (!itemTierDef)
                {
                    ItemDef._itemTierDef = null;
                    R2API.Logger.LogWarning($"Trying to create an itemDef ({name}), but the \"tier\" argument is set to {nameof(ItemTier.AssignedAtRuntime)}" +
                                            $"And the argument \"itemTierDef\" is null! Resorting to setting tier to NoTier");
                }
                else
                {
                    ItemDef._itemTierDef = itemTierDef;
                }
            }
        }
Пример #17
0
        public static void AddUnlockable <TUnlockable>(Boolean serverTracked, Boolean achievement = true)
            where TUnlockable : BaseAchievement, IModdedUnlockableDataProvider, new()
        {
            if (!loaded)
            {
                throw new CoreNotLoadedException(nameof(UnlocksCore));
            }
            if (!ableToAdd)
            {
                throw new InvalidOperationException("Too late to add unlocks. Must be done during awake.");
            }

            var instance             = new TUnlockable();
            var unlockableIdentifier = instance.unlockableIdentifier;
            var identifier           = instance.achievementIdentifier;

            if (!usedRewardIds.Add(unlockableIdentifier))
            {
                throw new InvalidOperationException($"The unlockable identifier '{unlockableIdentifier}' is already used by another mod or the base game.");
            }

            AchievementDef ach = null;

            if (achievement)
            {
                ach = new AchievementDef
                {
                    identifier = instance.achievementIdentifier,
                    unlockableRewardIdentifier        = instance.unlockableIdentifier,
                    prerequisiteAchievementIdentifier = instance.prerequisiteUnlockableIdentifier,
                    nameToken         = instance.achievementNameToken,
                    descriptionToken  = instance.achievementDescToken,
                    iconPath          = instance.spritePath,
                    type              = instance.GetType(),
                    serverTrackerType = serverTracked ? instance.GetType() : null,
                };
            }

            var unl = new UnlockableDef
            {
                nameToken            = instance.unlockableNameToken,
                getHowToUnlockString = instance.GetHowToUnlock,
                getUnlockedString    = instance.GetUnlocked,
            };

            moddedUnlocks.Add((ach, unl, instance.unlockableIdentifier));
            added.Add(unl);
        }
Пример #18
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/triBroochIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "Rasputin");
            LanguageAPI.Add(achiDescToken, "As a team: stun, then freeze, then ignite the same enemy within 3 seconds.");
            itemDef.unlockableDef = unlockable;
        }
Пример #19
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/kintsugiIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "Planned Obsolescence");
            LanguageAPI.Add(achiDescToken, "Have at least 20 items, at least half of which are broken/consumed/scrapped.");
            itemDef.unlockableDef = unlockable;
        }
Пример #20
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/defibIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "Medic!");
            LanguageAPI.Add(achiDescToken, "Item Set: Shareable healing. Have 4 or more (of 7) at once.");
            itemDef.unlockableDef = unlockable;
        }
        // Token: 0x0600259A RID: 9626 RVA: 0x000A39F4 File Offset: 0x000A1BF4
        private void Rebuild()
        {
            SurvivorDef survivorDef = SurvivorCatalog.GetSurvivorDef(this.survivorIndex);

            if (survivorDef != null)
            {
                GameObject bodyPrefab = survivorDef.bodyPrefab;
                if (bodyPrefab)
                {
                    CharacterBody component = bodyPrefab.GetComponent <CharacterBody>();
                    if (component)
                    {
                        if (this.survivorIcon)
                        {
                            this.survivorIcon.texture = component.portraitIcon;
                        }
                        string viewableName = string.Format(CultureInfo.InvariantCulture, "/Survivors/{0}", this.survivorIndex.ToString());
                        if (this.viewableTag)
                        {
                            this.viewableTag.viewableName = viewableName;
                            this.viewableTag.Refresh();
                        }
                        if (this.loadoutViewableTag)
                        {
                            this.loadoutViewableTag.viewableName = string.Format(CultureInfo.InvariantCulture, "/Loadout/Bodies/{0}/", BodyCatalog.GetBodyName(SurvivorCatalog.GetBodyIndexFromSurvivorIndex(this.survivorIndex)));
                            this.loadoutViewableTag.Refresh();
                        }
                        if (this.viewableTrigger)
                        {
                            this.viewableTrigger.viewableName = viewableName;
                        }
                        if (this.tooltipProvider)
                        {
                            UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(survivorDef.unlockableName);
                            if (unlockableDef != null)
                            {
                                this.tooltipProvider.titleToken       = "UNIDENTIFIED";
                                this.tooltipProvider.titleColor       = Color.gray;
                                this.tooltipProvider.overrideBodyText = unlockableDef.getHowToUnlockString();
                            }
                        }
                    }
                }
            }
        }
Пример #22
0
        public static bool Prefix(ref Dictionary <string, UnlockableDef> ___nameToDefTable)
        {
            //Set up logging
            var unlockableLogger = new ManualLogSource("AchievementLoader.Unlock");

            BepInEx.Logging.Logger.Sources.Add(unlockableLogger);
            unlockableLogger.LogMessage("__== Unlock Loader ==__");

            unlockableLogger.LogInfo("Searching for custom unlockables...");

            var customUnlockableDefs =
                from t in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.GetName().Name != "ConfigurationManager").SelectMany(a => { unlockableLogger.LogDebug(String.Format("Scanning assembly {0} for unlockable defs", a.FullName)); try { return(a.GetTypes()); } catch { unlockableLogger.LogError(String.Format("Unable to scan {0} for types", a.FullName)); return(new Type[0]); } })
                let attributes = t.GetCustomAttributes(typeof(CustomUnlockable), true)
                                 where attributes != null && attributes.Length > 0
                                 select(attributes.Cast <CustomUnlockable>().ToArray()[0]);

            if (customUnlockableDefs.Count() > 0)
            {
                unlockableLogger.LogInfo(string.Format("Found {0} custom unlock(s) to add to catalog", customUnlockableDefs.Count()));

                //Iterate through each custom unlock and add them to the unlock catalog

                foreach (CustomUnlockable customUnlock in customUnlockableDefs)
                {
                    //Create new unlock def
                    UnlockableDef newUnlock = customUnlock.GetUnlockableDef();

                    //Set the index of the unlock def
                    newUnlock.index = new UnlockableIndex(___nameToDefTable.Count);

                    //Add the def to the unlock table
                    ___nameToDefTable.Add(newUnlock.name, newUnlock);

                    unlockableLogger.LogDebug(string.Format("Added Custom Unlock {0}", newUnlock.name));
                }
            }
            else
            {
                unlockableLogger.LogInfo("Found no custom unlocks to add");
            }
            unlockableLogger.LogInfo("Done!");

            //Continue on the the original unlock catalog
            return(true);
        }
Пример #23
0
 private static TooltipContent LogBookControllerOnGetPickupTooltipContent(On.RoR2.UI.LogBook.LogBookController.orig_GetPickupTooltipContent orig, UserProfile userProfile, Entry entry, EntryStatus status)
 {
     if (IsCustomItemOrEquipment((PickupIndex)entry.extraData))
     {
         UnlockableDef  unlockableDef = UnlockableCatalog.GetUnlockableDef(((PickupIndex)entry.extraData).GetUnlockableName());
         TooltipContent result        = default;
         result.titleToken = entry.nameToken;
         result.titleColor = entry.color;
         if (unlockableDef != null)
         {
             result.overrideBodyText = unlockableDef.getUnlockedString();
         }
         result.bodyToken = "LOGBOOK_CATEGORY_ITEM";
         result.bodyColor = ColorCatalog.GetColor(ColorCatalog.ColorIndex.Unlockable);
         return(result);
     }
     return(orig(userProfile, entry, status));
 }
Пример #24
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/mugIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "...So I Fired Again");
            LanguageAPI.Add(achiDescToken, "Miss 1,000 TOTAL projectile attacks.");
            itemDef.unlockableDef = unlockable;

            whiffsStatDef = RoR2.Stats.StatDef.Register("tksatMugAchievementProgress", RoR2.Stats.StatRecordType.Sum, RoR2.Stats.StatDataType.ULong, 0);
        }
Пример #25
0
        public static UnlockableDef Add(UnlockableTemplate unlockableTemplate, String contentPackIdentifier = null)
        {
            contentPackIdentifier = contentPackIdentifier ?? Assembly.GetCallingAssembly().GetName().Name;
            if (!ContentPacks.assemblyDict.ContainsKey(contentPackIdentifier))
            {
                ContentPacks.assemblyDict[contentPackIdentifier] = Assembly.GetCallingAssembly();
            }
            UnlockableDef unlockableDef = ScriptableObject.CreateInstance <UnlockableDef>();

            unlockableDef.cachedName         = unlockableTemplate.internalName;
            unlockableDef.hidden             = unlockableTemplate.hidden;
            unlockableDef.displayModelPrefab = unlockableTemplate.displayModelPrefab;
            unlockableDef.nameToken          = $"ITEM_{unlockableTemplate.internalName.ToUpper()}_NAME";

            Languages.AddTokenString(unlockableDef.nameToken, unlockableTemplate.name);

            return(Add(unlockableDef, contentPackIdentifier));
        }
Пример #26
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            var achiNameToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_NAME";
            var achiDescToken = $"ACHIEVEMENT_TKSAT_{name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)}_DESCRIPTION";

            unlockable                 = ScriptableObject.CreateInstance <UnlockableDef>();
            unlockable.cachedName      = $"TkSat_{name}Unlockable";
            unlockable.sortScore       = 200;
            unlockable.achievementIcon = TinkersSatchelPlugin.resources.LoadAsset <Sprite>("Assets/TinkersSatchel/Textures/UnlockIcons/shootToHealIcon.png");
            ContentAddition.AddUnlockableDef(unlockable);
            LanguageAPI.Add(achiNameToken, "One-Man Band");
            LanguageAPI.Add(achiDescToken, "Item Set: Musical instruments. Have 3 or more (of 5) at once.");
            itemDef.unlockableDef = unlockable;

            R2API.Networking.NetworkingAPI.RegisterMessageType <MsgHealTargetAndSelf>();
        }
        private void UnlockableCatalog_Init(On.RoR2.UnlockableCatalog.orig_Init orig)
        {
            MethodInfo RegisterUnlockable = typeof(UnlockableCatalog).GetMethod("RegisterUnlockable", BindingFlags.NonPublic | BindingFlags.Static);

            foreach (Assembly assembly in toScan)
            {
                foreach (Type t in assembly.GetTypes())
                {
                    var attr = t.GetCustomAttributes(typeof(CustomUnlockable), true).Cast <CustomUnlockable>().ToArray();
                    if (attr.Length > 0)
                    {
                        UnlockableDef uDef = attr[0].GetUnlockableDef();
                        RegisterUnlockable.Invoke(null, new object[] { uDef.name, uDef });
                    }
                }
            }
            orig();
        }
Пример #28
0
 internal static void AddUnlockableOnly(String name, UnlockableDef def)
 {
     if (!loaded)
     {
         throw new CoreNotLoadedException(nameof(UnlocksCore));
     }
     if (!ableToAdd)
     {
         throw new InvalidOperationException("Too late to add unlocks. Must be done during awake.");
     }
     if (def is null)
     {
         throw new ArgumentNullException(nameof(def));
     }
     //Log.Message($"Adding unlockable only {name} {def.cachedName}");
     moddedUnlocks.Add((null, def, name));
     added.Add(def);
 }
Пример #29
0
        /// <summary>
        /// Gets array of availible surviors to join as for a player, based on run unlocks.
        ///
        /// Code inspired by the <see cref="RoR2.CharacterMaster.PickRandomSurvivorBodyPrefab"/> method
        /// </summary>
        /// <param name="player">Player to get availble survivors for</param>
        /// <returns>Array of availble survivors</returns>
        public SurvivorDef[] GetAvailibleSurvivorsForPlayer(NetworkUser player)
        {
            return(SurvivorCatalog.allSurvivorDefs.Where(SurvivorIsUnlockedAndAvailable).ToArray());

            bool SurvivorIsUnlockedAndAvailable(SurvivorDef survivorDef)
            {
                if (_config.AllowJoinAsHiddenSurvivors.Value || !survivorDef.hidden)
                {
                    if (!survivorDef.CheckRequiredExpansionEnabled())
                    {
                        return(false);
                    }
                    UnlockableDef unlockableDef = survivorDef.unlockableDef;
                    return(unlockableDef != null && _run.IsUnlockableUnlocked(unlockableDef));
                }
                return(false);
            }
        }
Пример #30
0
        // Token: 0x060021AC RID: 8620 RVA: 0x0009EB90 File Offset: 0x0009CD90
        private void AssignUnlockToStrip(UnlockableDef unlockableDef, GameObject destUnlockableStrip)
        {
            AchievementDef achievementDefFromUnlockable = AchievementManager.GetAchievementDefFromUnlockable(unlockableDef.name);
            Texture        texture = null;
            string         @string = Language.GetString("TOOLTIP_UNLOCK_GENERIC_NAME");
            string         string2 = Language.GetString("TOOLTIP_UNLOCK_GENERIC_NAME");

            if (unlockableDef.name.Contains("Items."))
            {
                @string = Language.GetString("TOOLTIP_UNLOCK_ITEM_NAME");
                string2 = Language.GetString("TOOLTIP_UNLOCK_ITEM_DESCRIPTION");
            }
            else if (unlockableDef.name.Contains("Logs."))
            {
                @string = Language.GetString("TOOLTIP_UNLOCK_LOG_NAME");
                string2 = Language.GetString("TOOLTIP_UNLOCK_LOG_DESCRIPTION");
            }
            else if (unlockableDef.name.Contains("Characters."))
            {
                @string = Language.GetString("TOOLTIP_UNLOCK_SURVIVOR_NAME");
                string2 = Language.GetString("TOOLTIP_UNLOCK_SURVIVOR_DESCRIPTION");
            }
            string string3;

            if (achievementDefFromUnlockable != null)
            {
                texture = Resources.Load <Texture>(achievementDefFromUnlockable.iconPath);
                string3 = Language.GetString(achievementDefFromUnlockable.nameToken);
            }
            else
            {
                string3 = Language.GetString(unlockableDef.nameToken);
            }
            if (texture != null)
            {
                destUnlockableStrip.transform.Find("IconImage").GetComponent <RawImage>().texture = texture;
            }
            destUnlockableStrip.transform.Find("NameLabel").GetComponent <TextMeshProUGUI>().text = string3;
            destUnlockableStrip.GetComponent <TooltipProvider>().overrideTitleText = @string;
            destUnlockableStrip.GetComponent <TooltipProvider>().overrideBodyText  = string2;
        }