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; }
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; }
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; }
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); }
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; }
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); }
/// <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); }
//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); }
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); }
// 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); } }
// 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(); } }
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; }
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); }
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; } } }
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); }
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; }
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; }
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(); } } } } } }
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); }
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)); }
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); }
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)); }
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(); }
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); }
/// <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); } }
// 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; }