private UIPanel makeMainPanel() { UIPanel mainPanel = new UIPanel(); mainPanel.BackgroundColor = Color.Green * 0.7f; int top = 0; var uiRanges = new List <UIElement>(); damageData = new UIIntRangedDataValue("Damage:", 0, 0, 200); damageData.DataGetter = () => Main.LocalPlayer.HeldItem.damage; damageData.DataSetter = (value) => Main.LocalPlayer.HeldItem.damage = value; uiRanges.Add(new UIRange <int>(damageData)); //var data = new UIIntRangedDataValue("Width:", 0, 60); //data.DataGetter = () => Main.LocalPlayer.HeldItem.width; //data.DataSetter = (value) => Main.LocalPlayer.HeldItem.width = value; //uiRanges.Add(new UIRange<int>(data)); //data = new UIIntRangedDataValue("Height:", 0, 60); //data.DataGetter = () => Main.LocalPlayer.HeldItem.height; //data.DataSetter = (value) => Main.LocalPlayer.HeldItem.height = value; //uiRanges.Add(new UIRange<int>(data)); var data = new UIIntRangedDataValue("UseStyle:", 0, 0, 6); data.DataGetter = () => Main.LocalPlayer.HeldItem.useStyle; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.useStyle = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("UseTime:", 2, 2, 80); data.DataGetter = () => Main.LocalPlayer.HeldItem.useTime; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.useTime = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("UseAnimation:", 2, 2, 80); data.DataGetter = () => Main.LocalPlayer.HeldItem.useAnimation; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.useAnimation = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("ReuseDelay:", 2, 2, 80); data.DataGetter = () => Main.LocalPlayer.HeldItem.reuseDelay; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.reuseDelay = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("Pick:", 0, 0, 300); data.DataGetter = () => Main.LocalPlayer.HeldItem.pick; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.pick = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("Axe:", 0, 0, 60); data.DataGetter = () => Main.LocalPlayer.HeldItem.axe; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.axe = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("Hammer:", 0, 0, 150); data.DataGetter = () => Main.LocalPlayer.HeldItem.hammer; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.hammer = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("Shoot:", 0, 0, TextureAssets.Projectile.Length - 1); data.DataGetter = () => Main.LocalPlayer.HeldItem.shoot; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.shoot = value; uiRanges.Add(new UIRange <int>(data)); var floatdata = new UIFloatRangedDataValue("ShootSpeed:", 0, 0, 32f); floatdata.DataGetter = () => Main.LocalPlayer.HeldItem.shootSpeed; floatdata.DataSetter = (value) => Main.LocalPlayer.HeldItem.shootSpeed = value; uiRanges.Add(new UIRange <float>(floatdata)); floatdata = new UIFloatRangedDataValue("KnockBack:", 0, 0, 12f); floatdata.DataGetter = () => Main.LocalPlayer.HeldItem.knockBack; floatdata.DataSetter = (value) => Main.LocalPlayer.HeldItem.knockBack = value; uiRanges.Add(new UIRange <float>(floatdata)); data = new UIIntRangedDataValue("UseAmmo:", 0, 0, Main.itemAnimations.Length - 1); data.DataGetter = () => Main.LocalPlayer.HeldItem.useAmmo; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.useAmmo = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("Crit:", 0, 0, 100); data.DataGetter = () => Main.LocalPlayer.HeldItem.crit; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.crit = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("Rare:", 0, 0, 11); data.DataGetter = () => Main.LocalPlayer.HeldItem.rare; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.rare = value; uiRanges.Add(new UIRange <int>(data)); data = new UIIntRangedDataValue("Value:", 0, 0, 1000000); data.DataGetter = () => Main.LocalPlayer.HeldItem.value; data.DataSetter = (value) => Main.LocalPlayer.HeldItem.value = value; uiRanges.Add(new UIRange <int>(data)); var check = new UIBoolDataValue("AutoReuse"); check.DataGetter = () => Main.LocalPlayer.HeldItem.autoReuse; check.DataSetter = (value) => Main.LocalPlayer.HeldItem.autoReuse = value; uiRanges.Add(new UICheckbox2(check)); check = new UIBoolDataValue("UseTurn"); check.DataGetter = () => Main.LocalPlayer.HeldItem.useTurn; check.DataSetter = (value) => Main.LocalPlayer.HeldItem.useTurn = value; uiRanges.Add(new UICheckbox2(check)); foreach (var uiRange in uiRanges) { uiRange.Top.Set(top, 0f); uiRange.Width.Set(0, 1f); mainPanel.Append(uiRange); top += 22; } UITextPanel <string> setDefaultsButton = new UITextPanel <string>("SetDefaults"); setDefaultsButton.SetPadding(4); setDefaultsButton.Width.Set(-10, 0.5f); //setDefaultsButton.HAlign = 0.5f; setDefaultsButton.Top.Set(top, 0f); setDefaultsButton.OnClick += SetDefaultsButton_OnClick; mainPanel.Append(setDefaultsButton); UITextPanel <string> prefixButton = new UITextPanel <string>("Prefix"); prefixButton.SetPadding(4); prefixButton.Width.Set(-10, 0.5f); //prefixButton.Left.Set(0, 0.5f); prefixButton.HAlign = 1f; prefixButton.Top.Set(top, 0f); prefixButton.OnClick += PrefixButton_OnClick; mainPanel.Append(prefixButton); return(mainPanel); }
internal void UpdateList() { if (!updateNeeded) { return; } updateNeeded = false; BindingFlags bindingFlags = QuickTweakTool.showPrivateFields ? BindingFlags.Public | BindingFlags.NonPublic : BindingFlags.Public; tweakList.Clear(); foreach (var tweakEntry in QuickTweakTool.tweaks) { object tweakItem = tweakEntry.item; string label = tweakEntry.label; List <(object, FieldInfo)> FieldsToDisplay = new List <(object, FieldInfo)>(); if (tweakItem is Type type) { foreach (var field in type.GetFields(bindingFlags | BindingFlags.Static)) { FieldsToDisplay.Add((null, field)); } } else if (tweakItem is FieldInfo FieldInfo) { FieldsToDisplay.Add((null, FieldInfo)); } else if (tweakItem is ValueTuple <object, FieldInfo> tuple) { FieldsToDisplay.Add(((object, FieldInfo))tweakItem); //instance = tuple.Item1; //item = tuple.Item2; } else if (tweakItem is ValueTuple <object, string> stringtuple) { FieldInfo fieldInfo = stringtuple.Item1.GetType().GetField(stringtuple.Item2, bindingFlags | BindingFlags.Instance); if (fieldInfo != null) { FieldsToDisplay.Add(((object, FieldInfo))(stringtuple.Item1, fieldInfo)); } else { Main.NewText($"Field not found: {stringtuple.Item2} in {stringtuple.Item1.GetType().Name}"); } } else if (tweakItem is object) { foreach (FieldInfo field in tweakItem.GetType().GetFields(bindingFlags | BindingFlags.Instance)) { FieldsToDisplay.Add((tweakItem, field)); } } // Pass in "additionalOnChanged" probably, to handle UI updates? // CreateUIElementFromObjectAndField(instance, item); // -> object will do recursion. // place element on Panel or in List. // Need dictionary of expected/known ranges for various field names? var panel = new UIPanel(); panel.SetPadding(6); panel.BackgroundColor = Color.LightCoral * 0.7f; int top = 0; var header = new UIText(label != "" ? label : tweakItem.ToString()); panel.Append(header); UIImageButton removeButton = new UIHoverImageButton(ModContent.GetTexture("Terraria/UI/ButtonDelete"), "Remove"); removeButton.OnClick += (a, b) => { QuickTweakTool.tweaks.Remove(tweakEntry); updateNeeded = true; }; removeButton.Top.Set(top, 0f); removeButton.Left.Set(-22, 1f); panel.Append(removeButton); top += 20; foreach (var fieldToDisplay in FieldsToDisplay) { object instance = fieldToDisplay.Item1; FieldInfo fieldInfo = fieldToDisplay.Item2; if (fieldInfo.FieldType == typeof(bool)) { var dataElement = new UIBoolDataValue(fieldInfo.Name); dataElement.DataGetter = () => (bool)fieldInfo.GetValue(instance); dataElement.DataSetter = (value) => fieldInfo.SetValue(instance, value); AppendToAndIncrement(panel, new UICheckbox2(dataElement), ref top); } else if (fieldInfo.FieldType == typeof(int)) { RangeAttribute rangeAttribute = (RangeAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(RangeAttribute)); int min = 0; int max = 100; if (rangeAttribute != null && rangeAttribute.min is int && rangeAttribute.max is int) { min = (int)rangeAttribute.min; max = (int)rangeAttribute.max; } var dataElement = new UIIntRangedDataValue(fieldInfo.Name, min: min, max: max); dataElement.DataGetter = () => (int)fieldInfo.GetValue(instance); dataElement.DataSetter = (value) => fieldInfo.SetValue(instance, value); AppendToAndIncrement(panel, new UIRange <int>(dataElement), ref top); } else if (fieldInfo.FieldType == typeof(float)) { RangeAttribute rangeAttribute = (RangeAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(RangeAttribute)); float min = -1f; float max = 1f; if (rangeAttribute != null && rangeAttribute.min is float && rangeAttribute.max is float) { max = (float)rangeAttribute.max; min = (float)rangeAttribute.min; } if (rangeAttribute != null && rangeAttribute.min is int && rangeAttribute.max is int) { min = (int)rangeAttribute.min; max = (int)rangeAttribute.max; } var dataElement = new UIFloatRangedDataValue(fieldInfo.Name, .4f, min, max); dataElement.DataGetter = () => (float)fieldInfo.GetValue(instance); dataElement.DataSetter = (value) => fieldInfo.SetValue(instance, value); AppendToAndIncrement(panel, new UIRange <float>(dataElement), ref top); } } panel.Height.Set(top + panel.PaddingBottom + PaddingTop, 0f); panel.Width.Set(0, 1f); tweakList.Add(panel); } }