@@ -24,7 +24,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// </summary> | |||
public event EventHandler<bool> OnClick; | |||
public void OnGUI() | |||
public override void OnGUI() | |||
{ | |||
if (automaticLayout) | |||
{ | |||
@@ -42,34 +42,15 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
} | |||
} | |||
/// <summary> | |||
/// The button's unique name. | |||
/// </summary> | |||
public string Name { get; private set; } | |||
/// <summary> | |||
/// Whether to display the button. | |||
/// </summary> | |||
public bool Enabled { get; set; } = true; | |||
/// <summary> | |||
/// Initialize a new button with automatic layout. | |||
/// </summary> | |||
/// <param name="text">The text to display on the button.</param> | |||
/// <param name="name">The button's name.</param> | |||
public Button(string text, string name = null) | |||
public Button(string text, string name = null) : base(text, name) | |||
{ | |||
automaticLayout = true; | |||
this.text = text; | |||
if (name == null) | |||
{ | |||
this.Name = typeof(Button).FullName + "::" + text; | |||
} | |||
else | |||
{ | |||
this.Name = name; | |||
} | |||
IMGUIManager.AddElement(this); | |||
} | |||
/// <summary> | |||
@@ -83,10 +64,5 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
automaticLayout = false; | |||
this.Box = box; | |||
} | |||
~Button() | |||
{ | |||
IMGUIManager.RemoveElement(this); | |||
} | |||
} | |||
} |
@@ -20,7 +20,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// </summary> | |||
public Rect Box { get; set; } | |||
public void OnGUI() | |||
public override void OnGUI() | |||
{ | |||
/*if (Constants.Default == null) return; | |||
if (Constants.Default.box == null) return;*/ | |||
@@ -60,16 +60,6 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
GUI.EndGroup(); | |||
} | |||
} | |||
/// <summary> | |||
/// The group's unique name. | |||
/// </summary> | |||
public string Name { get; } | |||
/// <summary> | |||
/// Whether to display the group and everything in it. | |||
/// </summary> | |||
public bool Enabled { set; get; } = true; | |||
/// <summary> | |||
/// The amount of elements in the group. | |||
@@ -85,19 +75,10 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// <param name="box">The rectangular area to use in the window.</param> | |||
/// <param name="name">Name of the group.</param> | |||
/// <param name="automaticLayout">Whether to use automatic UI layout.</param> | |||
public Group(Rect box, string name = null, bool automaticLayout = false) | |||
public Group(Rect box, string name = null, bool automaticLayout = false) : base(box.ToString().Replace(" ", ""), name) | |||
{ | |||
Box = box; | |||
if (name == null) | |||
{ | |||
this.Name = typeof(Group).FullName + "::" + box.ToString().Replace(" ", ""); | |||
} | |||
else | |||
{ | |||
this.Name = name; | |||
} | |||
this.automaticLayout = automaticLayout; | |||
IMGUIManager.AddElement(this); | |||
} | |||
/// <summary> | |||
@@ -2,6 +2,7 @@ using System.Collections.Generic; | |||
using Svelto.Tasks; | |||
using Svelto.Tasks.ExtraLean; | |||
using TechbloxModdingAPI.Tasks; | |||
using TechbloxModdingAPI.Utility; | |||
using UnityEngine; | |||
namespace TechbloxModdingAPI.Interface.IMGUI | |||
@@ -14,9 +15,9 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// </summary> | |||
public static class IMGUIManager | |||
{ | |||
internal static OnGuiRunner ImguiScheduler = new OnGuiRunner("TechbloxModdingAPI_IMGUIScheduler"); | |||
private static Dictionary<string, UIElement> _activeElements = new Dictionary<string,UIElement>(); | |||
internal static OnGuiRunner ImguiScheduler = new("TechbloxModdingAPI_IMGUIScheduler"); | |||
private static readonly WeakDictionary<string, UIElement> _activeElements = new(); | |||
/// <summary> | |||
/// Add an UIElement instance to be managed by IMGUIManager. | |||
@@ -20,7 +20,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// </summary> | |||
public Rect Box { get; set; } = Rect.zero; | |||
public void OnGUI() | |||
public override void OnGUI() | |||
{ | |||
//if (Texture == null) return; | |||
if (automaticLayout) | |||
@@ -32,43 +32,16 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
GUI.Label(Box, Texture, Constants.Default.label); | |||
} | |||
} | |||
/// <summary> | |||
/// The image element's unique name. | |||
/// </summary> | |||
public string Name { get; } | |||
/// <summary> | |||
/// Whether to display the image and everything in it. | |||
/// </summary> | |||
public bool Enabled { set; get; } = true; | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="T:TechbloxModdingAPI.Interface.IMGUI.Image"/> class with automatic layout. | |||
/// </summary> | |||
/// <param name="texture">Image to display.</param> | |||
/// <param name="name">The element's name.</param> | |||
public Image(Texture texture = null, string name = null) | |||
public Image(Texture texture = null, string name = null) : base(texture == null ? "" : $"{texture.name}({texture.width}x{texture.height})", name) | |||
{ | |||
automaticLayout = true; | |||
Texture = texture; | |||
if (name == null) | |||
{ | |||
if (texture == null) | |||
{ | |||
this.Name = typeof(Image).FullName + "::" + texture; | |||
} | |||
else | |||
{ | |||
this.Name = typeof(Image).FullName + "::" + texture.name + "(" + texture.width + "x" + texture.height + ")"; | |||
} | |||
} | |||
else | |||
{ | |||
this.Name = name; | |||
} | |||
IMGUIManager.AddElement(this); | |||
} | |||
/// <summary> | |||
@@ -20,7 +20,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// </summary> | |||
public Rect Box { get; set; } = Rect.zero; | |||
public void OnGUI() | |||
public override void OnGUI() | |||
{ | |||
if (automaticLayout) | |||
{ | |||
@@ -32,34 +32,15 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
} | |||
} | |||
/// <summary> | |||
/// The label's unique name. | |||
/// </summary> | |||
public string Name { get; } | |||
/// <summary> | |||
/// Whether to display the label. | |||
/// </summary> | |||
public bool Enabled { set; get; } = true; | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="T:TechbloxModdingAPI.Interface.IMGUI.Label"/> class with automatic layout. | |||
/// </summary> | |||
/// <param name="initialText">Initial string to display on the label.</param> | |||
/// <param name="name">The element's name.</param> | |||
public Label(string initialText = null, string name = null) | |||
public Label(string initialText = null, string name = null) : base(initialText, name) | |||
{ | |||
automaticLayout = true; | |||
Text = initialText; | |||
if (name == null) | |||
{ | |||
this.Name = typeof(Label).FullName + "::" + initialText; | |||
} | |||
else | |||
{ | |||
this.Name = name; | |||
} | |||
IMGUIManager.AddElement(this); | |||
} | |||
/// <summary> | |||
@@ -28,7 +28,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// </summary> | |||
public event EventHandler<string> OnEdit; | |||
public void OnGUI() | |||
public override void OnGUI() | |||
{ | |||
string editedText = null; | |||
if (automaticLayout) | |||
@@ -61,36 +61,17 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
} | |||
} | |||
/// <summary> | |||
/// The text field's unique name. | |||
/// </summary> | |||
public string Name { get; } | |||
/// <summary> | |||
/// Whether to display the text field. | |||
/// </summary> | |||
public bool Enabled { set; get; } = true; | |||
/// <summary> | |||
/// Initialize the text input field with automatic layout. | |||
/// </summary> | |||
/// <param name="initialText">Initial text in the input field.</param> | |||
/// <param name="name">The text field's name.</param> | |||
/// <param name="multiline">Allow multiple lines?</param> | |||
public Text(string initialText = null, string name = null, bool multiline = false) | |||
public Text(string initialText = null, string name = null, bool multiline = false) : base(initialText, name) | |||
{ | |||
this.Multiline = multiline; | |||
automaticLayout = true; | |||
text = initialText ?? ""; | |||
if (name == null) | |||
{ | |||
this.Name = typeof(Text).FullName + "::" + text; | |||
} | |||
else | |||
{ | |||
this.Name = name; | |||
} | |||
IMGUIManager.AddElement(this); | |||
} | |||
/// <summary> | |||
@@ -6,23 +6,34 @@ namespace TechbloxModdingAPI.Interface.IMGUI | |||
/// GUI Element like a text field, button or picture. | |||
/// This interface is used to wrap many elements from Unity's IMGUI system. | |||
/// </summary> | |||
public interface UIElement | |||
public abstract class UIElement | |||
{ | |||
protected UIElement(string text, string name) | |||
{ | |||
Name = name ?? GetType().FullName + "::" + text; | |||
IMGUIManager.AddElement(this); | |||
} | |||
~UIElement() | |||
{ | |||
IMGUIManager.RemoveElement(this); | |||
} | |||
/// <summary> | |||
/// GUI operations to perform in the OnGUI scope. | |||
/// This is basically equivalent to a MonoBehaviour's OnGUI method. | |||
/// </summary> | |||
void OnGUI(); | |||
public abstract void OnGUI(); | |||
/// <summary> | |||
/// The element's name. | |||
/// This should be unique for every instance of the class. | |||
/// </summary> | |||
string Name { get; } | |||
public string Name { get; } | |||
/// <summary> | |||
/// Whether to display the UI element or not. | |||
/// </summary> | |||
bool Enabled { get; } | |||
public bool Enabled { get; set; } = true; | |||
} | |||
} |
@@ -195,8 +195,8 @@ namespace TechbloxModdingAPI | |||
/// The player's mass. | |||
/// </summary> | |||
/// <value>The mass.</value> | |||
public float Mass => | |||
1f / playerEngine.GetCharacterStruct<RigidBodyEntityStruct>(Id).Get().physicsMass.InverseMass; | |||
[Obsolete] // We cannot get it clientside or something | |||
public float Mass => 0; | |||
/// <summary> | |||
/// The player's latest network ping time. | |||
@@ -139,7 +139,7 @@ namespace TechbloxModdingAPI.Players | |||
group = default; | |||
if (GameState.IsBuildMode()) | |||
return entitiesDB.QueryEntityOptional<T>(new EGID(playerId, LocalBuildingDrone.BuildGroup)); | |||
var characterGroups = CharacterExclusiveGroups.AllCharacters; | |||
for (int i = 0; i < characterGroups.count; i++) | |||
{ | |||
@@ -73,9 +73,10 @@ namespace TechbloxModdingAPI | |||
} | |||
} | |||
[Obsolete] //Cannot get mass even from UECS | |||
public float Mass | |||
{ | |||
get => 0f; //TODO: Get mass from UECS entity | |||
get => 0f; | |||
//set => GetStruct().physicsMass.InverseMass = math.rcp(value); | |||
} | |||
@@ -261,7 +261,7 @@ namespace TechbloxModdingAPI.Tests | |||
/*((FasterList<GuiInputMap.GuiInputMapElement>)AccessTools.Property(typeof(GuiInputMap), "GuiInputsButtonDown").GetValue(null)) | |||
.Add(new GuiInputMap.GuiInputMapElement(RewiredConsts.Action.ToggleCommandLine, GuiIn))*/ | |||
Game.Enter += (sender, e) => | |||
/*Game.Enter += (sender, e) => | |||
{ | |||
ushort lastKey = ushort.MaxValue; | |||
foreach (var kv in FullGameFields._dataDb.GetValues<CubeListData>() | |||
@@ -299,7 +299,7 @@ namespace TechbloxModdingAPI.Tests | |||
return result; | |||
}) | |||
.Aggregate((a, b) => a + "\n" + b)); | |||
}; | |||
};*/ | |||
CommandBuilder.Builder("takeScreenshot", "Enables the screenshot taker") | |||
.Action(() => | |||
@@ -368,7 +368,7 @@ namespace TechbloxModdingAPI.Tests | |||
}, () => shouldTestGhostBlock)); | |||
Logging.CommandLog("Test enabled"); | |||
}).Build(); | |||
Client.EnterMenu += (sender, args) => Scheduler.Schedule(new Once(() => Client.Instance.CloseBetaPopup())); | |||
Game.Enter += (sender, args) => | |||