Beispiel #1
0
        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);
            }
        }