private static Item NewHellstone(int baseItemID, int newItemId, String name, String desc) { int totalWeight = CurrencyEffects.ALL[newItemId].Sum(x => x.GetWeight()); desc += "\n"; CurrencyEffects.ALL[newItemId].ForEach(x => { float chance = (float)x.GetWeight() / (float)totalWeight * 100; desc += "\n" + chance + "% to: " + x.Get().GetDescription() + "\n"; }); desc += "\n Use when your desired gear is in your pouch (and no other gear there)."; if (HELLSTONE_OF_ARCANA_ID != newItemId) // this hellstone is used on non magical items, unlike others { desc += "\n Only works on Magical items."; } else { desc += "\n Only works on Non Magical items."; } var template = new SL_Item() { Name = name, Description = desc, Target_ItemID = baseItemID, New_ItemID = newItemId, Tags = new string[] { TagSourceManager.Valuable.TagName }, IsUsable = true }; var item = CustomItems.CreateCustomItem(template); var effects = item.transform.Find("Effects"); if (effects == null) { // If the item doesn't have "Effects", just add it. effects = new GameObject("Effects").transform; effects.transform.parent = item.transform; // If you didn't use CreateCustomItem, you'd need to call DontDestroyOnLoad(gaberries.gameObject); } CurrencyEffectComponent eff = effects.gameObject.AddComponent <CurrencyEffectComponent>(); UnityEngine.Object.DontDestroyOnLoad(eff); var png = CustomTextures.LoadTexture(@"BepInEx\plugins\Grindward\Icons\" + newItemId + ".png", false, false); var sprite = CustomTextures.CreateSprite(png, CustomTextures.SpriteBorderTypes.ItemIcon); CustomItemVisuals.SetSpriteLink(item, sprite); At.SetValue(sprite, typeof(Item), item, "m_itemIcon"); return(item); }
private void ConstructGenerator(GameObject leftPane) { m_generateObj = UIFactory.CreateVerticalGroup(leftPane, new Color(0.1f, 0.1f, 0.1f)); var genLabelObj = UIFactory.CreateLabel(m_generateObj, TextAnchor.MiddleLeft); m_generatorTitle = genLabelObj.GetComponent <Text>(); m_generatorTitle.text = "Template Generator"; m_generatorTitle.fontSize = 16; // Generator dropdown type // (callback added below) var genDropObj = UIFactory.CreateDropdown(m_generateObj, out m_genDropdown); var genDropLayout = genDropObj.AddComponent <LayoutElement>(); genDropLayout.minHeight = 25; var genGroupLayout = m_generateObj.AddComponent <LayoutElement>(); genGroupLayout.minHeight = 50; genGroupLayout.flexibleWidth = 9999; var genGroup = m_generateObj.GetComponent <VerticalLayoutGroup>(); genGroup.childForceExpandHeight = true; genGroup.childForceExpandWidth = true; genGroup.padding = new RectOffset(3, 3, 3, 3); genGroup.spacing = 5; // Generator input field for target var targetInputFieldObj = UIFactory.CreateInputField(m_generateObj, 14, 3, 0, typeof(AutoCompleteInputField)); targetInputFieldObj.name = "AutoCompleterInput"; m_generatorTargetInput = targetInputFieldObj.GetComponent <AutoCompleteInputField>(); (m_generatorTargetInput.placeholder as Text).text = "Clone target ID"; var genTargetLayout = m_generatorTargetInput.gameObject.AddComponent <LayoutElement>(); genTargetLayout.minHeight = 25; m_generatorTargetInput.onValueChanged.AddListener((string val) => { UpdateAutocompletes(); }); // subfolder input field var subfolderInputObj = UIFactory.CreateInputField(m_generateObj); var subfolderLayout = subfolderInputObj.AddComponent <LayoutElement>(); subfolderLayout.minHeight = 25; var subfolderInput = subfolderInputObj.GetComponent <InputField>(); (subfolderInput.placeholder as Text).text = "Subfolder (blank for auto)"; // add this generator callback now that subfolder has been declared m_genDropdown.onValueChanged.AddListener((int val) => { m_currentGeneratorType = s_currentTemplateTypes[val]; targetInputFieldObj.SetActive(CanSelectedTypeCloneFromTarget()); subfolderInputObj.SetActive(CanSelectedTypeBeInSubfolder()); }); // name input var nameInputObj = UIFactory.CreateInputField(m_generateObj); var nameLayout = nameInputObj.AddComponent <LayoutElement>(); nameLayout.minHeight = 25; var nameInput = nameInputObj.GetComponent <InputField>(); (nameInput.placeholder as Text).text = "Filename (blank for auto)"; bool exportIconsWanted = true; bool exportTexturesWanted = true; var toggleIconObj = UIFactory.CreateToggle(m_generateObj, out Toggle toggleIcon, out Text toggleIconTxt); var iconLayout = toggleIconObj.AddComponent <LayoutElement>(); iconLayout.minHeight = 25; toggleIconTxt.text = "Export Icons if possible?"; toggleIcon.onValueChanged.AddListener((bool val) => { exportIconsWanted = val; }); var toggleTexObj = UIFactory.CreateToggle(m_generateObj, out Toggle toggleTex, out Text toggleTexText); var toggleTexLayout = toggleTexObj.AddComponent <LayoutElement>(); toggleTexLayout.minHeight = 25; toggleTexText.text = "Export Textures if possible?"; toggleTex.onValueChanged.AddListener((bool val) => { exportTexturesWanted = val; }); // generate button var genBtnObj = UIFactory.CreateButton(m_generateObj, new Color(0.15f, 0.45f, 0.15f)); var genBtnLayout = genBtnObj.AddComponent <LayoutElement>(); genBtnLayout.minHeight = 25; var genBtn = genBtnObj.GetComponent <Button>(); genBtn.onClick.AddListener(() => { if (m_currentPack == null) { SL.LogWarning("Cannot generate a template without an inspected SLPack!"); return; } var newTemplate = (ContentTemplate)Activator.CreateInstance(this.m_currentGeneratorType); if (newTemplate.CanParseContent) { var content = newTemplate.GetContentFromID(m_generatorTargetInput.text); if (content != null && newTemplate.ParseToTemplate(content) is ContentTemplate parsed) { newTemplate = parsed; } else if (!newTemplate.DoesTargetExist) { SL.LogWarning("Could not find any content from target ID '" + m_generatorTargetInput.text + "'"); newTemplate = null; } } if (newTemplate != null) { if (!CheckTemplateName(newTemplate, subfolderInput, nameInput)) { SL.LogWarning("A folder/filename already exists with that name, try again"); return; } // EXPORT ICONS/TEXTURES IF ITEM/STATUS/IMBUE if (exportIconsWanted || exportTexturesWanted) { if (newTemplate is SL_Item slitem) { if (string.IsNullOrEmpty(slitem.SerializedSubfolderName)) { SL.LogWarning("You need to set a subfolder name to export icons/textures!"); return; } var item = ResourcesPrefabManager.Instance.GetItemPrefab(slitem.Target_ItemID); var dir = m_currentPack.GetPathForCategory <ItemCategory>(); dir += $@"\{slitem.SerializedSubfolderName}\Textures"; if (exportIconsWanted) { SL_Item.SaveItemIcons(item, dir); } if (exportTexturesWanted) { SL_Item.SaveItemTextures(item, dir, out slitem.m_serializedMaterials); } } else if (exportIconsWanted && newTemplate is SL_StatusBase slstatus) { var template = slstatus as ContentTemplate; if (string.IsNullOrEmpty(template.SerializedSubfolderName)) { SL.LogWarning("You need to set a subfolder name to export icons!"); return; } var dir = m_currentPack.GetPathForCategory <StatusCategory>(); dir += $@"\{template.SerializedSubfolderName}"; Component comp; if (template is SL_StatusEffect sl_Status) { comp = ResourcesPrefabManager.Instance.GetStatusEffectPrefab(sl_Status.TargetStatusIdentifier); } else { comp = ResourcesPrefabManager.Instance.GetEffectPreset((template as SL_ImbueEffect).TargetStatusID) as ImbueEffectPreset; } slstatus.ExportIcons(comp, dir); } } var inspector = InspectorManager.Instance.Inspect(newTemplate, m_currentPack); (inspector as TemplateInspector).Save(); } }); var genBtnText = genBtnObj.GetComponentInChildren <Text>(); genBtnText.text = "Create Template"; }